backgrid
Version:
Backgrid.js is a set of components for building semantic and easily stylable data grid widgets with Backbone.
230 lines (176 loc) • 7.78 kB
JavaScript
/*
backgrid
http://github.com/cloudflare/backgrid
Copyright (c) 2013-present Cloudflare, Inc. and contributors
Licensed under the MIT license.
*/
/**
A Column is a placeholder for column metadata.
You usually don't need to create an instance of this class yourself as a
collection of column instances will be created for you from a list of column
attributes in the Backgrid.js view class constructors.
@class Backgrid.Column
@extends Backbone.Model
*/
var Column = Backgrid.Column = Backbone.Model.extend({
/**
@cfg {Object} defaults Column defaults. To override any of these default
values, you can either change the prototype directly to override
Column.defaults globally or extend Column and supply the custom class to
Backgrid.Grid:
// Override Column defaults globally
Column.prototype.defaults.sortable = false;
// Override Column defaults locally
var MyColumn = Column.extend({
defaults: _.defaults({
editable: false
}, Column.prototype.defaults)
});
var grid = new Backgrid.Grid(columns: new Columns([{...}, {...}], {
model: MyColumn
}));
@cfg {string} [defaults.name] The default name of the model attribute.
@cfg {string} [defaults.label] The default label to show in the header.
@cfg {string|Backgrid.Cell} [defaults.cell] The default cell type. If this
is a string, the capitalized form will be used to look up a cell class in
Backbone, i.e.: string => StringCell. If a Cell subclass is supplied, it is
initialized with a hash of parameters. If a Cell instance is supplied, it
is used directly.
@cfg {string|Backgrid.HeaderCell} [defaults.headerCell] The default header
cell type.
@cfg {boolean|string|function(): boolean} [defaults.sortable=true] Whether
this column is sortable. If the value is a string, a method will the same
name will be looked up from the column instance to determine whether the
column should be sortable. The method's signature must be `function
(Backbone.Model): boolean`. The function's context is the column instance.
@cfg {boolean|string|function(): boolean} [defaults.editable=true] Whether
this column is editable. If the value is a string, a method will the same
name will be looked up from the column instance to determine whether the
column should be editable. The method's signature must be `function
(Backbone.Model): boolean`. The function's context is the column instance.
@cfg {boolean|string|function(): boolean} [defaults.renderable=true]
Whether this column is renderable. If the value is a string, a method will
the same name will be looked up from the column instance to determine
whether the column should be renderable. The method's signature must be
`function (Backbone.Model): boolean`. The function's context is the column
instance.
@cfg {Backgrid.CellFormatter | Object | string} [defaults.formatter] The
formatter to use to convert between raw model values and user input.
@cfg {"toggle"|"cycle"} [defaults.sortType="cycle"] Whether sorting will
toggle between ascending and descending order, or cycle between insertion
order, ascending and descending order.
@cfg {(function(Backbone.Model, string): *) | string} [defaults.sortValue]
The function to use to extract a value from the model for comparison during
sorting. If this value is a string, a method with the same name will be
looked up from the column instance.
@cfg {"ascending"|"descending"|null} [defaults.direction=null] The initial
sorting direction for this column. The default is ordered by
Backbone.Model.cid, which usually means the collection is ordered by
insertion order.
*/
defaults: {
name: undefined,
label: undefined,
sortable: true,
editable: true,
renderable: true,
formatter: undefined,
sortType: "cycle",
sortValue: undefined,
direction: null,
cell: undefined,
headerCell: undefined
},
/**
Initializes this Column instance.
@param {Object} attrs
@param {string} attrs.name The model attribute this column is responsible
for.
@param {string|Backgrid.Cell} attrs.cell The cell type to use to render
this column.
@param {string} [attrs.label]
@param {string|Backgrid.HeaderCell} [attrs.headerCell]
@param {boolean|string|function(): boolean} [attrs.sortable=true]
@param {boolean|string|function(): boolean} [attrs.editable=true]
@param {boolean|string|function(): boolean} [attrs.renderable=true]
@param {Backgrid.CellFormatter | Object | string} [attrs.formatter]
@param {"toggle"|"cycle"} [attrs.sortType="cycle"]
@param {(function(Backbone.Model, string): *) | string} [attrs.sortValue]
@throws {TypeError} If attrs.cell or attrs.options are not supplied.
@throws {ReferenceError} If formatter is a string but a formatter class of
said name cannot be found in the Backgrid module.
See:
- Backgrid.Column.defaults
- Backgrid.Cell
- Backgrid.CellFormatter
*/
initialize: function () {
if (!this.has("label")) {
this.set({ label: this.get("name") }, { silent: true });
}
var headerCell = Backgrid.resolveNameToClass(this.get("headerCell"), "HeaderCell");
var cell = Backgrid.resolveNameToClass(this.get("cell"), "Cell");
this.set({cell: cell, headerCell: headerCell}, { silent: true });
},
/**
Returns an appropriate value extraction function from a model for sorting.
If the column model contains an attribute `sortValue`, if it is a string, a
method from the column instance identifified by the `sortValue` string is
returned. If it is a function, it it returned as is. If `sortValue` isn't
found from the column model's attributes, a default value extraction
function is returned which will compare according to the natural order of
the value's type.
@return {function(Backbone.Model, string): *}
*/
sortValue: function () {
var sortValue = this.get("sortValue");
if (_.isString(sortValue)) return this[sortValue];
else if (_.isFunction(sortValue)) return sortValue;
return function (model, colName) {
return model.get(colName);
};
}
/**
If you cannot always determine whether a column should be sortable before
the grid get initialized, you can override this method.
@member Backgrid.Column
@protected
@method sortable
@return {function(Backbone.Model): boolean | boolean}
*/
/**
If you cannot always determine whether a column should be editable before
the grid get initialized, you can override this method.
@member Backgrid.Column
@protected
@method editable
@return {function(Backbone.Model): boolean | boolean}
*/
/**
If you cannot always determine whether a column should be renderable before
the grid get initialized, you can override this method.
@member Backgrid.Column
@protected
@method renderable
@return {function(Backbone.Model): boolean | boolean}
*/
});
_.each(["sortable", "renderable", "editable"], function (key) {
Column.prototype[key] = function () {
var value = this.get(key);
if (_.isString(value)) return this[value];
else if (_.isFunction(value)) return value;
return !!value;
};
});
/**
A Backbone collection of Column instances.
@class Backgrid.Columns
@extends Backbone.Collection
*/
var Columns = Backgrid.Columns = Backbone.Collection.extend({
/**
@property {Backgrid.Column} model
*/
model: Column
});