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.
- 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
|
|