mirror of
https://github.com/OMGeeky/andors-trail.git
synced 2026-01-01 01:10:00 +01:00
99 lines
2.4 KiB
JavaScript
99 lines
2.4 KiB
JavaScript
var ATEditor = (function(ATEditor, _) {
|
|
|
|
ATEditor.DataStore = function(options) {
|
|
var defaultOptions = {
|
|
nameField: 'name'
|
|
,idField: 'id'
|
|
};
|
|
_.defaults(options, defaultOptions);
|
|
|
|
var items = [];
|
|
this.items = items;
|
|
|
|
this.name = options.name;
|
|
this.id = options.id;
|
|
|
|
this.findById = function(id) {
|
|
return _.find(this.items, function(obj) { return obj[options.idField] === id; });
|
|
};
|
|
this.hasObjectWithId = function(id) {
|
|
return _.some(this.items, function(obj) { return obj[options.idField] === id; });
|
|
};
|
|
this.hasIcon = function() { return _.toBool(options.iconIDField); };
|
|
this.getIcon = function(obj) { return obj[options.iconIDField]; };
|
|
this.getId = function(obj) { return obj[options.idField]; };
|
|
this.getName = function(obj) {
|
|
return obj[options.nameField];
|
|
};
|
|
this.addNew = function(suggestedId) {
|
|
var obj = { };
|
|
if (!suggestedId) { suggestedId = 'new_' + options.id; }
|
|
obj[options.idField] = suggestedId;
|
|
if (options.idField != options.nameField) {
|
|
obj[options.nameField] = 'New ' + options.id;
|
|
}
|
|
this.ensureUniqueId(obj);
|
|
items.push(obj);
|
|
return obj;
|
|
};
|
|
this.add = function(o) {
|
|
items.push(o);
|
|
};
|
|
this.clone = function(o) {
|
|
var obj = ATEditor.utils.deepClone(o);
|
|
this.ensureUniqueId(obj);
|
|
obj[options.nameField] = 'Copy of ' + obj[options.nameField];
|
|
items.push(obj);
|
|
return obj;
|
|
};
|
|
this.remove = function(o) {
|
|
var idx = items.indexOf(o);
|
|
if (idx >= 0) {
|
|
items.splice(idx, 1);
|
|
}
|
|
};
|
|
this.clear = function() {
|
|
items = [];
|
|
this.items = items;
|
|
};
|
|
|
|
this.findFirstFreeId = function(id) {
|
|
if(!this.hasObjectWithId(id)) {
|
|
return id;
|
|
}
|
|
|
|
var prefix;
|
|
var n = 1;
|
|
|
|
var match = (/^(.*\D)(\d+)$/g).exec(id);
|
|
if (match) {
|
|
prefix = match[1];
|
|
n = parseInt(match[2]) + 1;
|
|
} else {
|
|
prefix = id + "_";
|
|
}
|
|
|
|
var result = prefix + n;
|
|
while(this.hasObjectWithId(result)) {
|
|
n = n + 1;
|
|
result = prefix + n;
|
|
}
|
|
return result;
|
|
};
|
|
this.ensureUniqueId = function(obj) {
|
|
obj[options.idField] = this.findFirstFreeId(obj[options.idField]);
|
|
};
|
|
this.findByIndexOffset = function(obj, offset) {
|
|
if (_.isEmpty(this.items)) { return; }
|
|
|
|
var idx = _.indexOf(this.items, obj);
|
|
idx = idx + offset;
|
|
if (idx < 0) { idx = this.items.length - 1; }
|
|
if (idx >= this.items.length) { idx = 0; }
|
|
return this.items[idx];
|
|
};
|
|
};
|
|
|
|
return ATEditor;
|
|
})(ATEditor || {}, _);
|