123 lines
2.6 KiB
JavaScript
Executable File
123 lines
2.6 KiB
JavaScript
Executable File
var Backbone = require('backbone');
|
|
var CustomListItemModel = require('./custom-list-item-model');
|
|
var _ = require('underscore');
|
|
|
|
/*
|
|
* Custom list collection, it parses pairs like:
|
|
*
|
|
* [{ val, label }]
|
|
* ["string"]
|
|
*/
|
|
|
|
module.exports = Backbone.Collection.extend({
|
|
sort_key: 'id', // default sort key
|
|
|
|
initialize: function (models, options) {
|
|
this.options = _.extend({ silent: true }, options);
|
|
this._initBinds();
|
|
},
|
|
|
|
comparator: function (item) {
|
|
var name = item.get(this.sort_key);
|
|
|
|
return this._nameToLowerCase(name);
|
|
},
|
|
|
|
model: function (attrs, opts) {
|
|
var d = {};
|
|
if (typeof attrs === 'string') {
|
|
d.val = attrs;
|
|
} else {
|
|
d = attrs;
|
|
}
|
|
return new CustomListItemModel(d, opts);
|
|
},
|
|
|
|
sortByKey: function (key) {
|
|
this.sort_key = key;
|
|
this.sort();
|
|
},
|
|
|
|
_initBinds: function () {
|
|
this.bind('change:selected', this._onSelectedChange, this);
|
|
},
|
|
|
|
_nameToLowerCase: function (name) {
|
|
/*
|
|
* It could still be evaluated like true if it is a boolean/number
|
|
* in that case, we convert it to a string
|
|
*/
|
|
|
|
if (_.isUndefined(name) || _.isNull(name)) return name;
|
|
|
|
return _.isString(name) ? name.toLowerCase() : name.toString().toLowerCase();
|
|
},
|
|
|
|
search: function (query) {
|
|
if (!query) return this;
|
|
query = query.toLowerCase();
|
|
|
|
return _(this.filter(function (model) {
|
|
var name = model.getName();
|
|
var val = this._nameToLowerCase(name);
|
|
|
|
return val ? ~val.indexOf(query) : -1;
|
|
}, this));
|
|
},
|
|
|
|
_onSelectedChange: function (changedModel, isSelected) {
|
|
if (isSelected) {
|
|
this.each(function (m) {
|
|
if (m.cid !== changedModel.cid) {
|
|
m.set({
|
|
selected: false
|
|
}, {
|
|
silent: this.options.silent
|
|
});
|
|
}
|
|
}, this);
|
|
}
|
|
},
|
|
|
|
getSelectedItem: function () {
|
|
return this.findWhere({ selected: true });
|
|
},
|
|
|
|
containsValue: function (value) {
|
|
return this.find(function (mdl) {
|
|
return mdl.getValue() === value;
|
|
});
|
|
},
|
|
|
|
setSelected: function (value) {
|
|
var selectedModel;
|
|
var silent = { silent: this.options.silent };
|
|
|
|
this.each(function (mdl) {
|
|
if (mdl.getValue() === value) {
|
|
mdl.set({
|
|
selected: true
|
|
}, silent);
|
|
selectedModel = mdl;
|
|
} else {
|
|
mdl.set({
|
|
selected: false
|
|
}, silent);
|
|
}
|
|
});
|
|
return selectedModel;
|
|
},
|
|
|
|
removeSelected: function () {
|
|
this.each(function (mdl) {
|
|
mdl.set({
|
|
selected: false
|
|
});
|
|
});
|
|
},
|
|
|
|
isAsync: function () {
|
|
return false;
|
|
}
|
|
});
|