142 lines
4.0 KiB
JavaScript
142 lines
4.0 KiB
JavaScript
"use strict";
|
|
|
|
var Controller = require("./controller");
|
|
var AbstractOrder = require("../wContainer/abstractorder");
|
|
|
|
var Uint64 = require("../wType/uint64");
|
|
var Vocabulary = require("../wType/vocabulary");
|
|
var Boolean = require("../wType/boolean");
|
|
var String = require("../wType/string");
|
|
|
|
var IdOrder = AbstractOrder.template(Uint64);
|
|
|
|
var Catalogue = Controller.inherit({
|
|
"className": "Catalogue",
|
|
"constructor": function(addr, options) {
|
|
Controller.fn.constructor.call(this, addr);
|
|
|
|
this._hasSorting = false;
|
|
this._hasFilter = false;
|
|
this._filter = undefined;
|
|
this.data = new IdOrder(true);
|
|
|
|
if (options.sorting) {
|
|
this._hasSorting = true;
|
|
this._sorting = new Vocabulary();
|
|
this._sorting.insert("ascending", new Boolean(options.sorting.ascending));
|
|
this._sorting.insert("field", new String(options.sorting.field));
|
|
}
|
|
if (options.filter) {
|
|
var filter = new Vocabulary();
|
|
for (var key in options.filter) {
|
|
if (options.filter.hasOwnProperty(key)) {
|
|
filter.insert(key, options.filter[key]);
|
|
}
|
|
}
|
|
if (filter.length()) {
|
|
this._filter = filter;
|
|
this._hasFilter = true;
|
|
} else {
|
|
filter.destructor();
|
|
}
|
|
}
|
|
|
|
this.addHandler("get");
|
|
this.addHandler("addElement");
|
|
this.addHandler("removeElement");
|
|
this.addHandler("moveElement");
|
|
this.addHandler("clear");
|
|
},
|
|
"destructor": function() {
|
|
this.data.destructor();
|
|
|
|
if (this._hasSorting) {
|
|
this._sorting.destructor();
|
|
}
|
|
if (this._hasFilter) {
|
|
this._filter.destructor();
|
|
}
|
|
|
|
Controller.fn.destructor.call(this);
|
|
},
|
|
"addElement": function(element, before) {
|
|
if (before === undefined) {
|
|
this.data.push_back(element);
|
|
} else {
|
|
this.data.insert(element, before);
|
|
}
|
|
|
|
this.trigger("addElement", element, before);
|
|
},
|
|
"clear": function() {
|
|
this.data.clear();
|
|
this.trigger("clear");
|
|
},
|
|
"_createSubscriptionVC": function() {
|
|
var vc = Controller.fn._createSubscriptionVC.call(this);
|
|
var p = new Vocabulary();
|
|
|
|
if (this._hasSorting) {
|
|
p.insert("sorting", this._sorting.clone());
|
|
}
|
|
if (this._hasFilter) {
|
|
p.insert("filter", this._filter.clone());
|
|
}
|
|
|
|
vc.insert("params", p);
|
|
return vc;
|
|
},
|
|
"_h_addElement": function(ev) {
|
|
var data = ev.getData();
|
|
var id = data.at("id").clone();
|
|
var before = undefined;
|
|
if (data.has("before")) {
|
|
before = data.at("before").clone();
|
|
}
|
|
|
|
this.addElement(id, before);
|
|
},
|
|
"_h_get": function(ev) {
|
|
this.clear();
|
|
|
|
var data = ev.getData().at("data");
|
|
var size = data.length();
|
|
for (var i = 0; i < size; ++i) {
|
|
this.addElement(data.at(i).clone());
|
|
}
|
|
this.initialized = true;
|
|
this.trigger("data");
|
|
},
|
|
"_h_moveElement": function(ev) {
|
|
var data = ev.getData();
|
|
var id = data.at("id").clone();
|
|
var before = undefined;
|
|
if (data.has("before")) {
|
|
before = data.at("before").clone();
|
|
}
|
|
|
|
this.data.erase(id);
|
|
if (before === undefined) {
|
|
this.data.push_back(element);
|
|
} else {
|
|
this.data.insert(element, before);
|
|
}
|
|
|
|
this.trigger("moveElement", id, before);
|
|
},
|
|
"_h_removeElement": function(ev) {
|
|
var data = ev.getData();
|
|
|
|
this.removeElement(data.at("id").clone());
|
|
},
|
|
"_h_clear": function(ev) {
|
|
this.clear();
|
|
},
|
|
"removeElement": function(id) {
|
|
this.data.erase(id);
|
|
this.trigger("removeElement", id);
|
|
}
|
|
});
|
|
|
|
module.exports = Catalogue;
|