Initial commit
This commit is contained in:
+122
@@ -0,0 +1,122 @@
|
||||
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;
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user