blob: 45982752d80c6ca4ff152760440e05b611115906 [file] [log] [blame]
/**
* Create virtual collections with a visual user interface.
*
* @author Nils Diewald
*/
/*
* Replaces a previous version written by Mengfei Zhou
*/
/*
TODO: Implement a working localization solution!
TODO: Disable "and" or "or" in case it's followed
by an unspecified document
TODO: Implement "persistance"-Option,
injecting the current creation date stamp
Error codes:
701: "JSON-LD group has no @type attribute"
704: "Operation needs operand list"
802: "Match type is not supported by value type"
804: "Unknown value type"
805: "Value is invalid"
806: "Value is not a valid date string"
807: "Value is not a valid regular expression"
810: "Unknown document group operation" (like 711)
811: "Document group expects operation" (like 703)
812: "Operand not supported in document group" (like 744)
813: "Collection type is not supported" (like 713)
814: "Unknown rewrite operation"
815: "Rewrite expects source"
*/
define([
'vc/unspecified',
'vc/doc',
'vc/docgroup',
'util'
], function (unspecDocClass, docClass, docGroupClass) {
"use strict";
// ???
KorAP._validStringMatchRE = new RegExp("^(?:eq|ne|contains|excludes)$");
KorAP._validDateMatchRE = new RegExp("^[lg]?eq$");
KorAP._validDateRE = new RegExp("^(?:\\d{4})(?:-\\d\\d(?:-\\d\\d)?)?$");
KorAP._overrideStyles = false;
var loc = KorAP.Locale;
/**
* Virtual Collection
*/
return {
ldType : function () {
return null;
},
_init : function () {
if (!KorAP._overrideStyles) {
var sheet = KorAP.newStyleSheet();
// Add css rule for OR operations
sheet.insertRule(
'.vc .docGroup[data-operation=or] > .doc::before,' +
'.vc .docGroup[data-operation=or] > .docGroup::before ' +
'{ content: "' + loc.OR + '" }',
0
);
// Add css rule for AND operations
sheet.insertRule(
'.vc .docGroup[data-operation=and] > .doc::before,' +
'.vc .docGroup[data-operation=and] > .docGroup::before ' +
'{ content: "' + loc.AND + '" }',
1
);
console.log(sheet);
KorAP._overrideStyles = true;
};
return this;
},
create : function () {
return Object.create(this)._init();
},
clean : function () {
if (this._root.ldType() !== "non") {
this._root.destroy();
this.root(unspecDocClass.create(this));
};
return this;
},
render : function (json) {
var obj = Object.create(this)._init();
if (json !== undefined) {
// Root object
if (json['@type'] == 'koral:doc') {
obj._root = docClass.create(obj, json);
}
else if (json['@type'] == 'koral:docGroup') {
obj._root = docGroupClass.create(obj, json);
}
else {
KorAP.log(813, "Collection type is not supported");
return;
};
}
else {
// Add unspecified object
obj._root = unspecDocClass.create(obj);
};
// Init element and update
obj.update();
return obj;
},
root : function (obj) {
if (arguments.length === 1) {
var e = this.element();
if (e.firstChild !== null) {
if (e.firstChild !== obj.element()) {
e.replaceChild(obj.element(), e.firstChild);
};
}
// Append root element
else {
e.appendChild(obj.element());
};
// Update parent child relations
this._root = obj;
obj.parent(this);
this.update();
};
return this._root;
},
element : function () {
if (this._element !== undefined)
return this._element;
this._element = document.createElement('div');
this._element.setAttribute('class', 'vc');
// Initialize root
this._element.appendChild(this._root.element());
return this._element;
},
update : function () {
this._root.update();
return this;
},
toJson : function () {
return this._root.toJson();
},
toQuery : function () {
return this._root.toQuery();
}
};
});