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.
- checksums.yaml +4 -4
- data/slickgrid.gemspec +1 -1
- data/vendor/assets/javascripts/slickgrid/controls/columnpicker.js +49 -34
- data/vendor/assets/javascripts/slickgrid/controls/gridmenu.js +32 -13
- data/vendor/assets/javascripts/slickgrid/core.js +174 -0
- data/vendor/assets/javascripts/slickgrid/dataview.js +47 -18
- data/vendor/assets/javascripts/slickgrid/editors.js +49 -27
- data/vendor/assets/javascripts/slickgrid/grid.js +5357 -3990
- data/vendor/assets/javascripts/slickgrid/groupitemmetadataprovider.js +4 -4
- data/vendor/assets/javascripts/slickgrid/plugins/autotooltips.js +2 -1
- data/vendor/assets/javascripts/slickgrid/plugins/cellcopymanager.js +2 -0
- data/vendor/assets/javascripts/slickgrid/plugins/cellexternalcopymanager.js +29 -9
- data/vendor/assets/javascripts/slickgrid/plugins/cellrangedecorator.js +2 -1
- data/vendor/assets/javascripts/slickgrid/plugins/cellrangeselector.js +70 -9
- data/vendor/assets/javascripts/slickgrid/plugins/cellselectionmodel.js +27 -5
- data/vendor/assets/javascripts/slickgrid/plugins/checkboxselectcolumn.js +157 -26
- data/vendor/assets/javascripts/slickgrid/plugins/draggablegrouping.js +145 -19
- data/vendor/assets/javascripts/slickgrid/plugins/headerbuttons.js +1 -0
- data/vendor/assets/javascripts/slickgrid/plugins/headermenu.js +8 -2
- data/vendor/assets/javascripts/slickgrid/plugins/rowdetailview.js +542 -231
- data/vendor/assets/javascripts/slickgrid/plugins/rowmovemanager.js +2 -1
- data/vendor/assets/javascripts/slickgrid/plugins/rowselectionmodel.js +1 -0
- data/vendor/assets/stylesheets/slickgrid/controls/draggablegrouping.scss +52 -0
- data/vendor/assets/stylesheets/slickgrid/controls/gridmenu.css +17 -3
- data/vendor/assets/stylesheets/slickgrid/grid.scss +54 -5
- data/vendor/assets/stylesheets/slickgrid/plugins/headermenu.scss +14 -0
- data/vendor/assets/stylesheets/slickgrid/plugins/rowdetailview.scss +9 -11
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ff99f00455831f57630e3801f3f876efbb7b7ee
|
4
|
+
data.tar.gz: 1ffe1c0bfad0c20f25f18d0e9ecf99adacaf3759
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cde211d3104b85d486afa9dab9260787529aff8ab7514c2ea1e39b8eb048b30a16732964b3ee8c37e64bcffd8c6acd0e96f8fe7ef86cb3e29dac22ed6fb88b30
|
7
|
+
data.tar.gz: d6f02024be59b054c070c4e567be992333c26f73b72a6851de8d77844570b857008247d57e3ad890048b91a6f20125176ca49cabf213eaedddd7f69eb7915f85
|
data/slickgrid.gemspec
CHANGED
@@ -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
|
-
|
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'>×</span></button>").appendTo($menu);
|
53
60
|
|
54
61
|
// user could pass a title on top of the columns list
|
55
|
-
if(
|
56
|
-
var 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
|
-
|
73
|
-
|
79
|
+
_grid.onHeaderContextMenu.unsubscribe(handleHeaderContextMenu);
|
80
|
+
_grid.onColumnsReordered.unsubscribe(updateColumnOrder);
|
74
81
|
$(document.body).off("mousedown", handleBodyMouseDown);
|
75
|
-
$("div.slick-columnpicker").hide(
|
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(
|
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 (
|
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
|
-
|
103
|
-
|
104
|
-
|
116
|
+
.html(columnLabel)
|
117
|
+
.prepend($input)
|
118
|
+
.appendTo($li);
|
105
119
|
}
|
106
120
|
|
107
|
-
if (
|
121
|
+
if (_options.columnPicker && (!_options.columnPicker.hideForceFitButton || !_options.columnPicker.hideSyncResizeButton)) {
|
108
122
|
$("<hr/>").appendTo($list);
|
109
123
|
}
|
110
124
|
|
111
|
-
if (!(
|
112
|
-
var 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 (
|
133
|
+
if (_grid.getOptions().forceFitColumns) {
|
120
134
|
$input.attr("checked", "checked");
|
121
135
|
}
|
122
136
|
}
|
123
137
|
|
124
|
-
if (!(
|
125
|
-
var 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 (
|
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(
|
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 =
|
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 (
|
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
|
-
|
172
|
-
|
185
|
+
_grid.setOptions({forceFitColumns:true});
|
186
|
+
_grid.autosizeColumns();
|
173
187
|
} else {
|
174
|
-
|
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
|
-
|
195
|
+
_grid.setOptions({syncColumnCellResize:true});
|
182
196
|
} else {
|
183
|
-
|
197
|
+
_grid.setOptions({syncColumnCellResize:false});
|
184
198
|
}
|
185
199
|
return;
|
186
200
|
}
|
@@ -198,8 +212,8 @@
|
|
198
212
|
return;
|
199
213
|
}
|
200
214
|
|
201
|
-
|
202
|
-
onColumnsChanged.notify({columns: visibleColumns, 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:
|
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
|
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
|
-
|
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">×</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
|
-
|
167
|
-
$(
|
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
|
|