--- /dev/null
+(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",
+ groupTitleCssClass: "slick-group-title",
+ 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;
+ }
+
+ var indentation = item.level * 15 + "px";
+
+ return "<span class='" + options.toggleCssClass + " " +
+ (item.collapsed ? options.toggleCollapsedCssClass : options.toggleExpandedCssClass) +
+ "' style='margin-left:" + indentation +"'>" +
+ "</span>" +
+ "<span class='" + options.groupTitleCssClass + "' level='" + item.level + "'>" +
+ item.title +
+ "</span>";
+ }
+
+ 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.groupingKey);
+ } else {
+ this.getData().collapseGroup(item.groupingKey);
+ }
+
+ 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.groupingKey);
+ } else {
+ this.getData().collapseGroup(item.groupingKey);
+ }
+
+ 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);