slickgrid 2.3.16.1 → 2.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/slickgrid.gemspec +1 -1
  3. data/vendor/assets/javascripts/slickgrid/controls/columnpicker.js +49 -34
  4. data/vendor/assets/javascripts/slickgrid/controls/gridmenu.js +32 -13
  5. data/vendor/assets/javascripts/slickgrid/core.js +174 -0
  6. data/vendor/assets/javascripts/slickgrid/dataview.js +47 -18
  7. data/vendor/assets/javascripts/slickgrid/editors.js +49 -27
  8. data/vendor/assets/javascripts/slickgrid/grid.js +5357 -3990
  9. data/vendor/assets/javascripts/slickgrid/groupitemmetadataprovider.js +4 -4
  10. data/vendor/assets/javascripts/slickgrid/plugins/autotooltips.js +2 -1
  11. data/vendor/assets/javascripts/slickgrid/plugins/cellcopymanager.js +2 -0
  12. data/vendor/assets/javascripts/slickgrid/plugins/cellexternalcopymanager.js +29 -9
  13. data/vendor/assets/javascripts/slickgrid/plugins/cellrangedecorator.js +2 -1
  14. data/vendor/assets/javascripts/slickgrid/plugins/cellrangeselector.js +70 -9
  15. data/vendor/assets/javascripts/slickgrid/plugins/cellselectionmodel.js +27 -5
  16. data/vendor/assets/javascripts/slickgrid/plugins/checkboxselectcolumn.js +157 -26
  17. data/vendor/assets/javascripts/slickgrid/plugins/draggablegrouping.js +145 -19
  18. data/vendor/assets/javascripts/slickgrid/plugins/headerbuttons.js +1 -0
  19. data/vendor/assets/javascripts/slickgrid/plugins/headermenu.js +8 -2
  20. data/vendor/assets/javascripts/slickgrid/plugins/rowdetailview.js +542 -231
  21. data/vendor/assets/javascripts/slickgrid/plugins/rowmovemanager.js +2 -1
  22. data/vendor/assets/javascripts/slickgrid/plugins/rowselectionmodel.js +1 -0
  23. data/vendor/assets/stylesheets/slickgrid/controls/draggablegrouping.scss +52 -0
  24. data/vendor/assets/stylesheets/slickgrid/controls/gridmenu.css +17 -3
  25. data/vendor/assets/stylesheets/slickgrid/grid.scss +54 -5
  26. data/vendor/assets/stylesheets/slickgrid/plugins/headermenu.scss +14 -0
  27. data/vendor/assets/stylesheets/slickgrid/plugins/rowdetailview.scss +9 -11
  28. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3360874f91b169a5d76cb3bbde2a912faccb7aa7
4
- data.tar.gz: fba577ccae5cd74f75019948f8bd9fcc93ede240
3
+ metadata.gz: 9ff99f00455831f57630e3801f3f876efbb7b7ee
4
+ data.tar.gz: 1ffe1c0bfad0c20f25f18d0e9ecf99adacaf3759
5
5
  SHA512:
6
- metadata.gz: 797578e85b23c2639ff40232f2731b0b0d2f4f3aa869998e375ca7ce56e3aa86b58e2af1830f6b46d6838bd0b65f2336a02fb3cc1d49d92b2dc415afc0448d6a
7
- data.tar.gz: 9da6cd5d435bb8fba3ccf6722780a6507d115220cd505240e040b1ca6b83bdc9a26ac864e93c6cf180f1712842ff11e44436218bb9da7added901a9e42f7e373
6
+ metadata.gz: cde211d3104b85d486afa9dab9260787529aff8ab7514c2ea1e39b8eb048b30a16732964b3ee8c37e64bcffd8c6acd0e96f8fe7ef86cb3e29dac22ed6fb88b30
7
+ data.tar.gz: d6f02024be59b054c070c4e567be992333c26f73b72a6851de8d77844570b857008247d57e3ad890048b91a6f20125176ca49cabf213eaedddd7f69eb7915f85
data/slickgrid.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |gem|
2
2
  gem.name = "slickgrid"
3
- gem.version = "2.3.16.1"
3
+ gem.version = "2.4.5"
4
4
  gem.authors = ["Erlingur Þorsteinsson"]
5
5
  gem.email = ["erlingur@rsf.is"]
6
6
  gem.description = %q{SlickGrid (6pac fork) gem for Rails}
@@ -13,9 +13,10 @@
13
13
  * columnTitle: "Columns", // default to empty string
14
14
  *
15
15
  * // the last 2 checkboxes titles
16
- * hideForceFitButton: false, // show/hide checkbox near the end "Force Fit Columns" (default:false)
17
- * hideSyncResizeButton: false, // show/hide checkbox near the end "Synchronous Resize" (default:false)
16
+ * hideForceFitButton: false, // show/hide checkbox near the end "Force Fit Columns" (default:false)
17
+ * hideSyncResizeButton: false, // show/hide checkbox near the end "Synchronous Resize" (default:false)
18
18
  * forceFitTitle: "Force fit columns", // default to "Force fit columns"
19
+ * headerColumnValueExtractor: "Extract the column label" // default to column.name
19
20
  * syncResizeTitle: "Synchronous resize", // default to "Synchronous resize"
20
21
  * }
21
22
  * };
@@ -28,6 +29,8 @@
28
29
 
29
30
  (function ($) {
30
31
  function SlickColumnPicker(columns, grid, options) {
32
+ var _grid = grid;
33
+ var _options = options;
31
34
  var $list;
32
35
  var $menu;
33
36
  var columnCheckboxes;
@@ -38,22 +41,26 @@
38
41
 
39
42
  // the last 2 checkboxes titles
40
43
  hideForceFitButton: false,
41
- hideSyncResizeButton: false,
44
+ hideSyncResizeButton: false,
42
45
  forceFitTitle: "Force fit columns",
43
- syncResizeTitle: "Synchronous resize"
46
+ syncResizeTitle: "Synchronous resize",
47
+ headerColumnValueExtractor:
48
+ function (columnDef) {
49
+ return columnDef.name;
50
+ }
44
51
  };
45
52
 
46
- function init() {
53
+ function init(grid) {
47
54
  grid.onHeaderContextMenu.subscribe(handleHeaderContextMenu);
48
55
  grid.onColumnsReordered.subscribe(updateColumnOrder);
49
- options = $.extend({}, defaults, options);
56
+ _options = $.extend({}, defaults, options);
50
57
 
51
58
  $menu = $("<div class='slick-columnpicker' style='display:none' />").appendTo(document.body);
52
59
  var $close = $("<button type='button' class='close' data-dismiss='slick-columnpicker' aria-label='Close'><span class='close' aria-hidden='true'>&times;</span></button>").appendTo($menu);
53
60
 
54
61
  // user could pass a title on top of the columns list
55
- if(options.columnPickerTitle || (options.columnPicker && options.columnPicker.columnTitle)) {
56
- var columnTitle = options.columnPickerTitle || options.columnPicker.columnTitle;
62
+ if(_options.columnPickerTitle || (_options.columnPicker && _options.columnPicker.columnTitle)) {
63
+ var columnTitle = _options.columnPickerTitle || _options.columnPicker.columnTitle;
57
64
  var $title = $("<div class='title'/>").append(columnTitle);
58
65
  $title.appendTo($menu);
59
66
  }
@@ -69,16 +76,16 @@
69
76
  }
70
77
 
71
78
  function destroy() {
72
- grid.onHeaderContextMenu.unsubscribe(handleHeaderContextMenu);
73
- grid.onColumnsReordered.unsubscribe(updateColumnOrder);
79
+ _grid.onHeaderContextMenu.unsubscribe(handleHeaderContextMenu);
80
+ _grid.onColumnsReordered.unsubscribe(updateColumnOrder);
74
81
  $(document.body).off("mousedown", handleBodyMouseDown);
75
- $("div.slick-columnpicker").hide(options.fadeSpeed);
82
+ $("div.slick-columnpicker").hide(_options.fadeSpeed);
76
83
  $menu.remove();
77
84
  }
78
85
 
79
86
  function handleBodyMouseDown(e) {
80
87
  if (($menu && $menu[0] != e.target && !$.contains($menu[0], e.target)) || e.target.className == "close") {
81
- $menu.hide(options.fadeSpeed);
88
+ $menu.hide(_options.fadeSpeed);
82
89
  }
83
90
  }
84
91
 
@@ -89,47 +96,54 @@
89
96
  columnCheckboxes = [];
90
97
 
91
98
  var $li, $input;
99
+ var columnLabel;
92
100
  for (var i = 0; i < columns.length; i++) {
93
101
  $li = $("<li />").appendTo($list);
94
102
  $input = $("<input type='checkbox' />").data("column-id", columns[i].id);
95
103
  columnCheckboxes.push($input);
96
104
 
97
- if (grid.getColumnIndex(columns[i].id) != null) {
105
+ if (_grid.getColumnIndex(columns[i].id) != null) {
98
106
  $input.attr("checked", "checked");
99
107
  }
100
108
 
109
+ if (_options && _options.columnPicker && _options.columnPicker.headerColumnValueExtractor) {
110
+ columnLabel = _options.columnPicker.headerColumnValueExtractor(columns[i]);
111
+ } else {
112
+ columnLabel = defaults.headerColumnValueExtractor(columns[i]);
113
+ }
114
+
101
115
  $("<label />")
102
- .html(columns[i].name)
103
- .prepend($input)
104
- .appendTo($li);
116
+ .html(columnLabel)
117
+ .prepend($input)
118
+ .appendTo($li);
105
119
  }
106
120
 
107
- if (options.columnPicker && (!options.columnPicker.hideForceFitButton || !options.columnPicker.hideSyncResizeButton)) {
121
+ if (_options.columnPicker && (!_options.columnPicker.hideForceFitButton || !_options.columnPicker.hideSyncResizeButton)) {
108
122
  $("<hr/>").appendTo($list);
109
123
  }
110
124
 
111
- if (!(options.columnPicker && options.columnPicker.hideForceFitButton)) {
112
- var forceFitTitle = (options.columnPicker && options.columnPicker.forceFitTitle) || options.forceFitTitle;
125
+ if (!(_options.columnPicker && _options.columnPicker.hideForceFitButton)) {
126
+ var forceFitTitle = (_options.columnPicker && _options.columnPicker.forceFitTitle) || _options.forceFitTitle;
113
127
  $li = $("<li />").appendTo($list);
114
128
  $input = $("<input type='checkbox' />").data("option", "autoresize");
115
129
  $("<label />")
116
130
  .text(forceFitTitle)
117
131
  .prepend($input)
118
132
  .appendTo($li);
119
- if (grid.getOptions().forceFitColumns) {
133
+ if (_grid.getOptions().forceFitColumns) {
120
134
  $input.attr("checked", "checked");
121
135
  }
122
136
  }
123
137
 
124
- if (!(options.columnPicker && options.columnPicker.hideSyncResizeButton)) {
125
- var syncResizeTitle = (options.columnPicker && options.columnPicker.syncResizeTitle) || options.syncResizeTitle;
138
+ if (!(_options.columnPicker && _options.columnPicker.hideSyncResizeButton)) {
139
+ var syncResizeTitle = (_options.columnPicker && _options.columnPicker.syncResizeTitle) || _options.syncResizeTitle;
126
140
  $li = $("<li />").appendTo($list);
127
141
  $input = $("<input type='checkbox' />").data("option", "syncresize");
128
142
  $("<label />")
129
143
  .text(syncResizeTitle)
130
144
  .prepend($input)
131
145
  .appendTo($li);
132
- if (grid.getOptions().syncColumnCellResize) {
146
+ if (_grid.getOptions().syncColumnCellResize) {
133
147
  $input.attr("checked", "checked");
134
148
  }
135
149
  }
@@ -138,7 +152,7 @@
138
152
  .css("top", e.pageY - 10)
139
153
  .css("left", e.pageX - 10)
140
154
  .css("max-height", $(window).height() - e.pageY -10)
141
- .fadeIn(options.fadeSpeed);
155
+ .fadeIn(_options.fadeSpeed);
142
156
 
143
157
  $list.appendTo($menu);
144
158
  }
@@ -150,10 +164,10 @@
150
164
  // We create a new `columns` structure by leaving currently-hidden
151
165
  // columns in their original ordinal position and interleaving the results
152
166
  // of the current column sort.
153
- var current = grid.getColumns().slice(0);
167
+ var current = _grid.getColumns().slice(0);
154
168
  var ordered = new Array(columns.length);
155
169
  for (var i = 0; i < ordered.length; i++) {
156
- if ( grid.getColumnIndex(columns[i].id) === undefined ) {
170
+ if ( _grid.getColumnIndex(columns[i].id) === undefined ) {
157
171
  // If the column doesn't return a value from getColumnIndex,
158
172
  // it is hidden. Leave it in this position.
159
173
  ordered[i] = columns[i];
@@ -168,19 +182,19 @@
168
182
  function updateColumn(e) {
169
183
  if ($(e.target).data("option") == "autoresize") {
170
184
  if (e.target.checked) {
171
- grid.setOptions({forceFitColumns:true});
172
- grid.autosizeColumns();
185
+ _grid.setOptions({forceFitColumns:true});
186
+ _grid.autosizeColumns();
173
187
  } else {
174
- grid.setOptions({forceFitColumns:false});
188
+ _grid.setOptions({forceFitColumns:false});
175
189
  }
176
190
  return;
177
191
  }
178
192
 
179
193
  if ($(e.target).data("option") == "syncresize") {
180
194
  if (e.target.checked) {
181
- grid.setOptions({syncColumnCellResize:true});
195
+ _grid.setOptions({syncColumnCellResize:true});
182
196
  } else {
183
- grid.setOptions({syncColumnCellResize:false});
197
+ _grid.setOptions({syncColumnCellResize:false});
184
198
  }
185
199
  return;
186
200
  }
@@ -198,8 +212,8 @@
198
212
  return;
199
213
  }
200
214
 
201
- grid.setColumns(visibleColumns);
202
- onColumnsChanged.notify({columns: visibleColumns, grid: grid});
215
+ _grid.setColumns(visibleColumns);
216
+ onColumnsChanged.notify({columns: visibleColumns, grid: _grid});
203
217
  }
204
218
  }
205
219
 
@@ -207,9 +221,10 @@
207
221
  return columns;
208
222
  }
209
223
 
210
- init();
224
+ init(_grid);
211
225
 
212
226
  return {
227
+ "init": init,
213
228
  "getAllColumns": getAllColumns,
214
229
  "destroy": destroy,
215
230
  "onColumnsChanged": onColumnsChanged
@@ -19,7 +19,7 @@
19
19
  * iconCssClass: "fa fa-bars", // you can provide iconImage OR iconCssClass
20
20
  * leaveOpen: false, // do we want to leave the Grid Menu open after a command execution? (false by default)
21
21
  * menuWidth: 18, // width that will be use to resize the column header container (18 by default)
22
- * resizeOnShowHeaderRow: true, // true by default
22
+ * resizeOnShowHeaderRow: false, // false by default
23
23
  *
24
24
  * // the last 2 checkboxes titles
25
25
  * hideForceFitButton: false, // show/hide checkbox near the end "Force Fit Columns"
@@ -41,6 +41,7 @@
41
41
  *
42
42
  * Available custom menu item options:
43
43
  * title: Menu item text.
44
+ * divider: Whether the current item is a divider, not an actual command.
44
45
  * disabled: Whether the item is disabled.
45
46
  * tooltip: Item tooltip.
46
47
  * command: A command identifier to be passed to the onCommand event handlers.
@@ -94,10 +95,13 @@
94
95
 
95
96
  function SlickGridMenu(columns, grid, options) {
96
97
  var _grid = grid;
98
+ var _gridOptions;
99
+ var _gridUid = (grid && grid.getUID) ? grid.getUID() : '';
97
100
  var _isMenuOpen = false;
98
101
  var _options = options;
99
102
  var _self = this;
100
103
  var $list;
104
+ var $button;
101
105
  var $menu;
102
106
  var columnCheckboxes;
103
107
  var _defaults = {
@@ -111,18 +115,27 @@
111
115
  };
112
116
 
113
117
  function init(grid) {
118
+ _gridOptions = grid.getOptions();
114
119
  var gridMenuWidth = (_options.gridMenu && _options.gridMenu.menuWidth) || _defaults.menuWidth;
115
- var $header = $('.slick-header');
120
+ var $header;
121
+ if (_gridOptions && _gridOptions.frozenColumn && _gridOptions.frozenColumn > 0 ) {
122
+ $header = $('.' + _gridUid + ' .slick-header-right');
123
+ } else {
124
+ $header = $('.' + _gridUid + ' .slick-header-left');
125
+ }
116
126
  $header.attr('style', 'width: calc(100% - ' + gridMenuWidth +'px)');
117
127
 
128
+ // subscribe to the grid, when it's destroyed, we should also destroy the Grid Menu
129
+ grid.onBeforeDestroy.subscribe(destroy);
130
+
118
131
  // if header row is enabled, we need to resize it's width also
119
132
  var enableResizeHeaderRow = (_options.gridMenu && _options.gridMenu.resizeOnShowHeaderRow != undefined) ? _options.gridMenu.resizeOnShowHeaderRow : _defaults.resizeOnShowHeaderRow;
120
- if(enableResizeHeaderRow) {
121
- var $headerrow = $('.slick-headerrow');
133
+ if(enableResizeHeaderRow && _options.showHeaderRow) {
134
+ var $headerrow = $('.' + _gridUid + '.slick-headerrow');
122
135
  $headerrow.attr('style', 'width: calc(100% - ' + gridMenuWidth +'px)');
123
136
  }
124
137
 
125
- var $button = $('<button class="slick-gridmenu-button"/>');
138
+ $button = $('<button class="slick-gridmenu-button"/>');
126
139
  if (_options.gridMenu && _options.gridMenu.iconCssClass) {
127
140
  $button.addClass(_options.gridMenu.iconCssClass);
128
141
  } else {
@@ -132,7 +145,7 @@
132
145
  }
133
146
  $button.insertBefore($header);
134
147
 
135
- $menu = $('<div class="slick-gridmenu" style="display: none" />').appendTo(document.body);
148
+ $menu = $('<div class="slick-gridmenu ' + _gridUid + '" style="display: none" />').appendTo(document.body);
136
149
  var $close = $('<button type="button" class="close" data-dismiss="slick-gridmenu" aria-label="Close"><span class="close" aria-hidden="true">&times;</span></button>').appendTo($menu);
137
150
 
138
151
  var $customMenu = $('<div class="slick-gridmenu-custom" />');
@@ -148,13 +161,13 @@
148
161
  populateColumnPicker();
149
162
 
150
163
  // Hide the menu on outside click.
151
- $(document.body).on("mousedown", handleBodyMouseDown);
164
+ $(document.body).on("mousedown." + _gridUid, handleBodyMouseDown);
152
165
 
153
166
  // destroy the picker if user leaves the page
154
167
  $(window).on("beforeunload", destroy);
155
168
 
156
169
  // add on click handler for the Grid Menu itself
157
- $button.on("click", showGridMenu);
170
+ $button.on("click." + _gridUid, showGridMenu);
158
171
  }
159
172
 
160
173
  function destroy() {
@@ -163,9 +176,11 @@
163
176
  _self.onCommand.unsubscribe();
164
177
  _self.onColumnsChanged.unsubscribe();
165
178
  _grid.onColumnsReordered.unsubscribe(updateColumnOrder);
166
- $(document.body).off("mousedown", handleBodyMouseDown);
167
- $("div.slick-gridmenu").hide(_options.fadeSpeed);
179
+ _grid.onBeforeDestroy.unsubscribe();
180
+ $(document.body).off("mousedown." + _gridUid, handleBodyMouseDown);
181
+ $("div.slick-gridmenu." + _gridUid).hide(_options.fadeSpeed);
168
182
  $menu.remove();
183
+ $button.remove();
169
184
  }
170
185
 
171
186
  function populateCustomMenus(options, $customMenu) {
@@ -186,6 +201,11 @@
186
201
  $li.addClass("slick-gridmenu-item-disabled");
187
202
  }
188
203
 
204
+ if (item.divider) {
205
+ $li.addClass("slick-gridmenu-item-divider");
206
+ continue;
207
+ }
208
+
189
209
  if (item.tooltip) {
190
210
  $li.attr("title", item.tooltip);
191
211
  }
@@ -295,13 +315,12 @@
295
315
  .fadeIn(_options.fadeSpeed);
296
316
 
297
317
  $list.appendTo($menu);
318
+ _isMenuOpen = true;
298
319
  }
299
320
 
300
321
  function handleBodyMouseDown(e) {
301
322
  if (($menu && $menu[0] != e.target && !$.contains($menu[0], e.target) && _isMenuOpen) || e.target.className == "close") {
302
323
  hideMenu(e);
303
- } else {
304
- _isMenuOpen = true;
305
324
  }
306
325
  }
307
326
 
@@ -309,7 +328,7 @@
309
328
  var command = $(this).data("command");
310
329
  var item = $(this).data("item");
311
330
 
312
- if (item.disabled) {
331
+ if (item.disabled || item.divider) {
313
332
  return;
314
333
  }
315
334
 
@@ -24,8 +24,10 @@
24
24
  * @constructor
25
25
  */
26
26
  "GlobalEditorLock": new EditorLock(),
27
+ "TreeColumns": TreeColumns,
27
28
 
28
29
  "keyCode": {
30
+ SPACE: 8,
29
31
  BACKSPACE: 8,
30
32
  DELETE: 46,
31
33
  DOWN: 40,
@@ -488,6 +490,178 @@
488
490
  return (activeEditController ? activeEditController.cancelCurrentEdit() : true);
489
491
  };
490
492
  }
493
+
494
+ /**
495
+ *
496
+ * @param {Array} treeColumns Array com levels of columns
497
+ * @returns {{hasDepth: 'hasDepth', getTreeColumns: 'getTreeColumns', extractColumns: 'extractColumns', getDepth: 'getDepth', getColumnsInDepth: 'getColumnsInDepth', getColumnsInGroup: 'getColumnsInGroup', visibleColumns: 'visibleColumns', filter: 'filter', reOrder: reOrder}}
498
+ * @constructor
499
+ */
500
+ function TreeColumns(treeColumns) {
501
+
502
+ var columnsById = {};
503
+
504
+ function init() {
505
+ mapToId(treeColumns);
506
+ }
507
+
508
+ function mapToId(columns) {
509
+ columns
510
+ .forEach(function (column) {
511
+ columnsById[column.id] = column;
512
+
513
+ if (column.columns)
514
+ mapToId(column.columns);
515
+ });
516
+ }
517
+
518
+ function filter(node, condition) {
519
+
520
+ return node.filter(function (column) {
521
+
522
+ var valid = condition.call(column);
523
+
524
+ if (valid && column.columns)
525
+ column.columns = filter(column.columns, condition);
526
+
527
+ return valid && (!column.columns || column.columns.length);
528
+ });
529
+
530
+ }
531
+
532
+ function sort(columns, grid) {
533
+ columns
534
+ .sort(function (a, b) {
535
+ var indexA = getOrDefault(grid.getColumnIndex(a.id)),
536
+ indexB = getOrDefault(grid.getColumnIndex(b.id));
537
+
538
+ return indexA - indexB;
539
+ })
540
+ .forEach(function (column) {
541
+ if (column.columns)
542
+ sort(column.columns, grid);
543
+ });
544
+ }
545
+
546
+ function getOrDefault(value) {
547
+ return typeof value === 'undefined' ? -1 : value;
548
+ }
549
+
550
+ function getDepth(node) {
551
+ if (node.length)
552
+ for (var i in node)
553
+ return getDepth(node[i]);
554
+ else if (node.columns)
555
+ return 1 + getDepth(node.columns);
556
+ else
557
+ return 1;
558
+ }
559
+
560
+ function getColumnsInDepth(node, depth, current) {
561
+ var columns = [];
562
+ current = current || 0;
563
+
564
+ if (depth == current) {
565
+
566
+ if (node.length)
567
+ node.forEach(function(n) {
568
+ if (n.columns)
569
+ n.extractColumns = function() {
570
+ return extractColumns(n);
571
+ };
572
+ });
573
+
574
+ return node;
575
+ } else
576
+ for (var i in node)
577
+ if (node[i].columns) {
578
+ columns = columns.concat(getColumnsInDepth(node[i].columns, depth, current + 1));
579
+ }
580
+
581
+ return columns;
582
+ }
583
+
584
+ function extractColumns(node) {
585
+ var result = [];
586
+
587
+ if (node.hasOwnProperty('length')) {
588
+
589
+ for (var i = 0; i < node.length; i++)
590
+ result = result.concat(extractColumns(node[i]));
591
+
592
+ } else {
593
+
594
+ if (node.hasOwnProperty('columns'))
595
+
596
+ result = result.concat(extractColumns(node.columns));
597
+
598
+ else
599
+ return node;
600
+
601
+ }
602
+
603
+ return result;
604
+ }
605
+
606
+ function cloneTreeColumns() {
607
+ return $.extend(true, [], treeColumns);
608
+ }
609
+
610
+ init();
611
+
612
+ this.hasDepth = function () {
613
+
614
+ for (var i in treeColumns)
615
+ if (treeColumns[i].hasOwnProperty('columns'))
616
+ return true;
617
+
618
+ return false;
619
+ };
620
+
621
+ this.getTreeColumns = function () {
622
+ return treeColumns;
623
+ };
624
+
625
+ this.extractColumns = function () {
626
+ return this.hasDepth()? extractColumns(treeColumns): treeColumns;
627
+ };
628
+
629
+ this.getDepth = function () {
630
+ return getDepth(treeColumns);
631
+ };
632
+
633
+ this.getColumnsInDepth = function (depth) {
634
+ return getColumnsInDepth(treeColumns, depth);
635
+ };
636
+
637
+ this.getColumnsInGroup = function (groups) {
638
+ return extractColumns(groups);
639
+ };
640
+
641
+ this.visibleColumns = function () {
642
+ return filter(cloneTreeColumns(), function () {
643
+ return this.visible;
644
+ });
645
+ };
646
+
647
+ this.filter = function (condition) {
648
+ return filter(cloneTreeColumns(), condition);
649
+ };
650
+
651
+ this.reOrder = function (grid) {
652
+ return sort(treeColumns, grid);
653
+ };
654
+
655
+ this.getById = function (id) {
656
+ return columnsById[id];
657
+ };
658
+
659
+ this.getInIds = function (ids) {
660
+ return ids.map(function (id) {
661
+ return columnsById[id];
662
+ });
663
+ }
664
+ }
491
665
  })(jQuery);
492
666
 
493
667