diff options
Diffstat (limited to 'slick.groupitemmetadataprovider.js')
-rw-r--r-- | slick.groupitemmetadataprovider.js | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/slick.groupitemmetadataprovider.js b/slick.groupitemmetadataprovider.js new file mode 100644 index 0000000..68430eb --- /dev/null +++ b/slick.groupitemmetadataprovider.js @@ -0,0 +1,140 @@ +(function($) { + $.extend(true, window, { + Slick: { + Data: { + GroupItemMetadataProvider: GroupItemMetadataProvider + } + } + }); + + + /*** + * Provides item metadata for group (Slick.Group) and totals (Slick.Totals) rows produced by the DataView. + * This metadata overrides the default behavior and formatting of those rows so that they appear and function + * correctly when processed by the grid. + * + * This class also acts as a grid plugin providing event handlers to expand & collapse groups. + * If "grid.registerPlugin(...)" is not called, expand & collapse will not work. + * + * @class GroupItemMetadataProvider + * @module Data + * @namespace Slick.Data + * @constructor + * @param options + */ + function GroupItemMetadataProvider(options) { + var _grid; + var _defaults = { + groupCssClass: "slick-group", + totalsCssClass: "slick-group-totals", + groupFocusable: true, + totalsFocusable: false, + toggleCssClass: "slick-group-toggle", + toggleExpandedCssClass: "expanded", + toggleCollapsedCssClass: "collapsed", + enableExpandCollapse: true + }; + + options = $.extend(true, {}, _defaults, options); + + + function defaultGroupCellFormatter(row, cell, value, columnDef, item) { + if (!options.enableExpandCollapse) { + return item.title; + } + + return "<span class='" + options.toggleCssClass + " " + + (item.collapsed ? options.toggleCollapsedCssClass : options.toggleExpandedCssClass) + + "'></span>" + item.title; + } + + function defaultTotalsCellFormatter(row, cell, value, columnDef, item) { + return (columnDef.groupTotalsFormatter && columnDef.groupTotalsFormatter(item, columnDef)) || ""; + } + + + function init(grid) { + _grid = grid; + _grid.onClick.subscribe(handleGridClick); + _grid.onKeyDown.subscribe(handleGridKeyDown); + + } + + function destroy() { + if (_grid) { + _grid.onClick.unsubscribe(handleGridClick); + _grid.onKeyDown.unsubscribe(handleGridKeyDown); + } + } + + function handleGridClick(e, args) { + var item = this.getDataItem(args.row); + if (item && item instanceof Slick.Group && $(e.target).hasClass(options.toggleCssClass)) { + if (item.collapsed) { + this.getData().expandGroup(item.value); + } + else { + this.getData().collapseGroup(item.value); + } + + e.stopImmediatePropagation(); + e.preventDefault(); + } + } + + // TODO: add -/+ handling + function handleGridKeyDown(e, args) { + if (options.enableExpandCollapse && (e.which == $.ui.keyCode.SPACE)) { + var activeCell = this.getActiveCell(); + if (activeCell) { + var item = this.getDataItem(activeCell.row); + if (item && item instanceof Slick.Group) { + if (item.collapsed) { + this.getData().expandGroup(item.value); + } + else { + this.getData().collapseGroup(item.value); + } + + e.stopImmediatePropagation(); + e.preventDefault(); + } + } + } + } + + function getGroupRowMetadata(item) { + return { + selectable: false, + focusable: options.groupFocusable, + cssClasses: options.groupCssClass, + columns: { + 0: { + colspan: "*", + formatter: defaultGroupCellFormatter, + editor: null + } + } + }; + } + + function getTotalsRowMetadata(item) { + return { + selectable: false, + focusable: options.totalsFocusable, + cssClasses: options.totalsCssClass, + formatter: defaultTotalsCellFormatter, + editor: null + }; + } + + + + return { + "init": init, + "destroy": destroy, + "getGroupRowMetadata": getGroupRowMetadata, + "getTotalsRowMetadata": getTotalsRowMetadata + }; + } +})(jQuery);
\ No newline at end of file |