slickgrid 2.3.16.1 → 2.4.5

Sign up to get free protection for your applications and to get access to all the features.
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