Files
andors-trail/AndorsTrailEdit/js/datastore.js

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 || {}, _);