jsl-ui 9.28.2 → 9.28.3

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 (170) hide show
  1. package/lib/components/IntervalComponent.d.ts +17 -17
  2. package/lib/components/IntervalComponent.js +65 -68
  3. package/lib/components/auto-suggest/AutoSuggestComponent.d.ts +22 -22
  4. package/lib/components/auto-suggest/AutoSuggestComponent.js +47 -49
  5. package/lib/components/button/ButtonComponent.d.ts +18 -18
  6. package/lib/components/button/ButtonComponent.js +29 -46
  7. package/lib/components/checkbox/CheckBoxComponent.d.ts +28 -28
  8. package/lib/components/checkbox/CheckBoxComponent.js +81 -98
  9. package/lib/components/date/DateComponent.d.ts +32 -32
  10. package/lib/components/date/DateComponent.js +89 -106
  11. package/lib/components/date-range/DateRangeComponent.d.ts +35 -35
  12. package/lib/components/date-range/DateRangeComponent.js +123 -136
  13. package/lib/components/date-time/DateTimeComponent.d.ts +15 -15
  14. package/lib/components/date-time/DateTimeComponent.js +39 -53
  15. package/lib/components/dialog/DialogComponent.d.ts +67 -67
  16. package/lib/components/dialog/DialogComponent.js +198 -251
  17. package/lib/components/drop-down/DropDownComponent.d.ts +27 -27
  18. package/lib/components/drop-down/DropDownComponent.js +60 -74
  19. package/lib/components/expander/ExpanderComponent.d.ts +27 -27
  20. package/lib/components/expander/ExpanderComponent.js +89 -90
  21. package/lib/components/form-field/FormComponent.d.ts +12 -12
  22. package/lib/components/form-field/FormComponent.js +23 -26
  23. package/lib/components/form-field/FormFieldComponent.d.ts +39 -39
  24. package/lib/components/form-field/FormFieldComponent.js +138 -140
  25. package/lib/components/grid/GridComponent.d.ts +26 -26
  26. package/lib/components/grid/GridComponent.js +110 -116
  27. package/lib/components/input/InputComponent.d.ts +33 -33
  28. package/lib/components/input/InputComponent.js +126 -147
  29. package/lib/components/loading/LoadingComponent.d.ts +8 -8
  30. package/lib/components/loading/LoadingComponent.js +20 -22
  31. package/lib/components/navigation/NavigationComponent.d.ts +34 -34
  32. package/lib/components/navigation/NavigationComponent.js +45 -70
  33. package/lib/components/notification/Notification.d.ts +19 -19
  34. package/lib/components/notification/Notification.js +65 -69
  35. package/lib/components/number/NumberComponent.d.ts +26 -26
  36. package/lib/components/number/NumberComponent.js +80 -98
  37. package/lib/components/overlay/OverlayComponent.d.ts +27 -27
  38. package/lib/components/overlay/OverlayComponent.js +137 -149
  39. package/lib/components/progress/ProgressComponent.d.ts +18 -18
  40. package/lib/components/progress/ProgressComponent.js +40 -42
  41. package/lib/components/ribbon-menu/RibbonMenuComponent.d.ts +12 -12
  42. package/lib/components/ribbon-menu/RibbonMenuComponent.js +23 -34
  43. package/lib/components/select/SelectComponent.d.ts +79 -79
  44. package/lib/components/select/SelectComponent.js +356 -369
  45. package/lib/components/select/SelectDDAreaComponent.d.ts +32 -32
  46. package/lib/components/select/SelectDDAreaComponent.js +303 -317
  47. package/lib/components/slider/nouislider.d.ts +44 -44
  48. package/lib/components/slider/nouislider.js +2158 -2158
  49. package/lib/components/stack-panel/SplitterComponent.d.ts +21 -21
  50. package/lib/components/stack-panel/SplitterComponent.js +124 -126
  51. package/lib/components/stack-panel/StackPanelComponent.d.ts +20 -20
  52. package/lib/components/stack-panel/StackPanelComponent.js +50 -64
  53. package/lib/components/tabs/TabsComponent.d.ts +40 -40
  54. package/lib/components/tabs/TabsComponent.js +200 -204
  55. package/lib/components/time/TimeComponent.d.ts +29 -29
  56. package/lib/components/time/TimeComponent.js +104 -113
  57. package/lib/components/tree-view/TreeViewComponent.d.ts +23 -23
  58. package/lib/components/tree-view/TreeViewComponent.js +43 -45
  59. package/lib/components/virtual-render/VirtualRenderComponent.d.ts +30 -30
  60. package/lib/components/virtual-render/VirtualRenderComponent.js +92 -104
  61. package/lib/core/culture.d.ts +5 -5
  62. package/lib/core/culture.js +385 -385
  63. package/lib/core/date.d.ts +14 -14
  64. package/lib/core/date.js +346 -350
  65. package/lib/core/helper.d.ts +13 -13
  66. package/lib/core/helper.js +100 -104
  67. package/lib/core/jq.d.ts +37 -37
  68. package/lib/core/jq.js +362 -371
  69. package/lib/core/lang.d.ts +24 -24
  70. package/lib/core/lang.js +24 -28
  71. package/lib/core/numeric.d.ts +7 -7
  72. package/lib/core/numeric.js +139 -143
  73. package/lib/core/polyfills.js +22 -22
  74. package/lib/core.d.ts +6 -6
  75. package/lib/core.js +6 -6
  76. package/lib/grid/filterDialogs/dateRangeFilter.d.ts +7 -7
  77. package/lib/grid/filterDialogs/dateRangeFilter.js +106 -156
  78. package/lib/grid/filterDialogs/excelFilter.d.ts +9 -9
  79. package/lib/grid/filterDialogs/excelFilter.js +250 -316
  80. package/lib/grid/plugins/ext.overlay.d.ts +2 -2
  81. package/lib/grid/plugins/ext.overlay.js +295 -295
  82. package/lib/grid/plugins/slick.cellrangedecorator.d.ts +12 -12
  83. package/lib/grid/plugins/slick.cellrangedecorator.js +68 -68
  84. package/lib/grid/plugins/slick.cellrangeselector.d.ts +1 -1
  85. package/lib/grid/plugins/slick.cellrangeselector.js +144 -144
  86. package/lib/grid/plugins/slick.cellselectionmodel.d.ts +1 -1
  87. package/lib/grid/plugins/slick.cellselectionmodel.js +194 -194
  88. package/lib/grid/plugins/slick.headerbuttons.d.ts +55 -55
  89. package/lib/grid/plugins/slick.headerbuttons.js +156 -156
  90. package/lib/grid/plugins/slick.headermenu.d.ts +74 -74
  91. package/lib/grid/plugins/slick.headermenu.js +260 -260
  92. package/lib/grid/plugins/slick.rowmovemanager.d.ts +18 -18
  93. package/lib/grid/plugins/slick.rowmovemanager.js +249 -249
  94. package/lib/grid/plugins/slick.rowselectionmodel.d.ts +1 -1
  95. package/lib/grid/plugins/slick.rowselectionmodel.js +167 -167
  96. package/lib/grid/slick.core.d.ts +91 -91
  97. package/lib/grid/slick.core.js +574 -574
  98. package/lib/grid/slick.creator.d.ts +81 -81
  99. package/lib/grid/slick.creator.js +726 -726
  100. package/lib/grid/slick.dataview.d.ts +71 -71
  101. package/lib/grid/slick.dataview.js +1069 -1080
  102. package/lib/grid/slick.editors.core.d.ts +4 -4
  103. package/lib/grid/slick.editors.core.js +235 -235
  104. package/lib/grid/slick.editors.date.d.ts +2 -2
  105. package/lib/grid/slick.editors.date.js +125 -125
  106. package/lib/grid/slick.editors.lookup.d.ts +14 -14
  107. package/lib/grid/slick.editors.lookup.js +352 -353
  108. package/lib/grid/slick.editors.nav.d.ts +6 -6
  109. package/lib/grid/slick.editors.nav.js +22 -22
  110. package/lib/grid/slick.formatters.d.ts +17 -17
  111. package/lib/grid/slick.formatters.js +144 -144
  112. package/lib/grid/slick.grid.d.ts +285 -285
  113. package/lib/grid/slick.grid.js +5409 -5412
  114. package/lib/grid/slick.groupitemmetadataprovider.d.ts +39 -39
  115. package/lib/grid/slick.groupitemmetadataprovider.js +165 -165
  116. package/lib/grid/slick.tree.d.ts +33 -33
  117. package/lib/grid/slick.tree.js +208 -220
  118. package/lib/grid.css +1 -705
  119. package/lib/grid.d.ts +13 -13
  120. package/lib/grid.js +13 -13
  121. package/lib/index.css +8 -2195
  122. package/lib/index.css.map +1 -1
  123. package/lib/index.d.ts +56 -55
  124. package/lib/index.js +61 -61
  125. package/lib/index.js.map +1 -1
  126. package/lib/interaction/dataconverter.d.ts +4 -4
  127. package/lib/interaction/dataconverter.js +0 -1
  128. package/lib/interaction/eventhandler.d.ts +13 -13
  129. package/lib/interaction/eventhandler.js +39 -42
  130. package/lib/interaction/moveable.d.ts +39 -39
  131. package/lib/interaction/moveable.js +160 -174
  132. package/lib/interaction/resizable.d.ts +37 -37
  133. package/lib/interaction/resizable.js +109 -123
  134. package/lib/ui/auto.suggest.d.ts +18 -18
  135. package/lib/ui/auto.suggest.js +244 -259
  136. package/lib/ui/date.picker/date-picker-options.d.ts +11 -11
  137. package/lib/ui/date.picker/date-picker-options.js +76 -76
  138. package/lib/ui/date.picker/lib/date-manip.d.ts +74 -74
  139. package/lib/ui/date.picker/lib/date-manip.js +120 -120
  140. package/lib/ui/date.picker/lib/dom.d.ts +23 -23
  141. package/lib/ui/date.picker/lib/dom.js +28 -28
  142. package/lib/ui/date.picker/lib/emitter.d.ts +13 -13
  143. package/lib/ui/date.picker/lib/emitter.js +49 -49
  144. package/lib/ui/date.picker/lib/fns.d.ts +23 -23
  145. package/lib/ui/date.picker/lib/fns.js +39 -43
  146. package/lib/ui/date.picker/mode/base-mode.d.ts +26 -26
  147. package/lib/ui/date.picker/mode/base-mode.js +248 -248
  148. package/lib/ui/date.picker/mode/dropdown-mode.d.ts +28 -28
  149. package/lib/ui/date.picker/mode/dropdown-mode.js +50 -50
  150. package/lib/ui/date.picker/mode/index.d.ts +28 -28
  151. package/lib/ui/date.picker/mode/index.js +18 -18
  152. package/lib/ui/date.picker/mode/modal-mode.d.ts +25 -25
  153. package/lib/ui/date.picker/mode/modal-mode.js +17 -17
  154. package/lib/ui/date.picker/mode/permanent-mode.d.ts +29 -29
  155. package/lib/ui/date.picker/mode/permanent-mode.js +19 -19
  156. package/lib/ui/date.picker/views/day-picker.d.ts +40 -40
  157. package/lib/ui/date.picker/views/day-picker.js +155 -155
  158. package/lib/ui/date.picker/views/month-picker.d.ts +26 -26
  159. package/lib/ui/date.picker/views/month-picker.js +65 -65
  160. package/lib/ui/date.picker/views/year-picker.d.ts +20 -20
  161. package/lib/ui/date.picker/views/year-picker.js +66 -66
  162. package/lib/ui/date.picker.d.ts +66 -66
  163. package/lib/ui/date.picker.js +32 -32
  164. package/lib/ui/dialog.d.ts +22 -22
  165. package/lib/ui/dialog.js +98 -113
  166. package/lib/ui/drop.down.d.ts +52 -52
  167. package/lib/ui/drop.down.js +2112 -2112
  168. package/lib/ui/number.input.d.ts +13 -13
  169. package/lib/ui/number.input.js +56 -67
  170. package/package.json +1 -1
@@ -1,726 +1,726 @@
1
- import { Slick } from "./slick.core";
2
- import { SlickGrid } from "./slick.grid";
3
- import { RowSelectionModel } from "./plugins/slick.rowselectionmodel";
4
- import { DataView } from "./slick.dataview";
5
- import { GroupItemMetadataProvider } from "./slick.groupitemmetadataprovider";
6
- import { jQueryReplacement } from "../core/jq";
7
- import { HeaderMenu } from "./plugins/slick.headermenu";
8
- import { HeaderButtons } from "./plugins/slick.headerbuttons";
9
- import { TextFormatter } from "./slick.formatters";
10
- import { ExcelFilter } from "./filterDialogs/excelFilter";
11
- import { UILang } from "../core/lang";
12
- import { RowMoveManager } from "./plugins/slick.rowmovemanager";
13
- import { Overlays } from "./plugins/ext.overlay";
14
- import { helper } from "../core/helper";
15
- var $ = jQueryReplacement;
16
- export function createJSLGrid(selector, data, columns, option) {
17
- var formulaObjects = [];
18
- var headerMenu;
19
- var headerButtons;
20
- var formulas = {};
21
- var container;
22
- var filters = [];
23
- var customCommandHandler;
24
- var grid;
25
- var dataView;
26
- var rowMoveManager;
27
- //let options: ISlickCreatorOptions;
28
- function createMe() {
29
- sanitizeColumns(columns);
30
- var options = $.shallowExtend({ explicitInitialization: true, mode: "client" }, option);
31
- container = typeof (selector) === "string" ?
32
- document.querySelector(selector) :
33
- selector;
34
- if (!container) {
35
- throw new Error("error: selector for SlickCreator is invalid");
36
- }
37
- if (options.showColumnGroups) {
38
- options.createPreHeaderPanel = true;
39
- options.showPreHeaderPanel = true;
40
- }
41
- customCommandHandler = option.editCommandHandler;
42
- options.editCommandHandler = function (a, b, c) { handleEditCommand(a, b, c); };
43
- var groupItemMetadataProvider = options.groupItemMetadataProvider || GroupItemMetadataProvider(options.groupItemOptions);
44
- if (options.dataView != null) {
45
- dataView = options.dataView;
46
- }
47
- else {
48
- dataView = new DataView({ inlineFilters: true, groupItemMetadataProvider: groupItemMetadataProvider });
49
- dataView.setItems(data, options.primaryKey);
50
- }
51
- grid = new SlickGrid(container, dataView, columns, options);
52
- grid.registerPlugin(groupItemMetadataProvider);
53
- grid.setSelectionModel(new RowSelectionModel());
54
- grid.onHeaderCellRendered.subscribe(function (e, args) {
55
- if (columnHasFilter(args.column.id)) {
56
- //this column is filtered
57
- args.node.classList.add("slick-filtered-header");
58
- }
59
- });
60
- addCustomEvents();
61
- setupDefaultSort();
62
- setupChangeEvents();
63
- if (options.showHeaderMenu) {
64
- setupHeaderMenu();
65
- }
66
- setupHeaderButtons();
67
- if (options.allowRowMove) {
68
- rowMoveManager = new RowMoveManager({
69
- cancelEditOnDrag: true,
70
- singleRowMove: true,
71
- disableRowSelection: true,
72
- hideRowMoveShadow: false, // defaults to true
73
- rowMoveShadowScale: 0.7, // defaults to 0.75
74
- rowMoveShadowOpacity: 0.9 // defaults to 0.95
75
- });
76
- grid.registerPlugin(rowMoveManager);
77
- rowMoveManager.onBeforeMoveRows.subscribe(function (e, args) {
78
- // debugger;
79
- });
80
- rowMoveManager.onMoveRows.subscribe(function (e, args) {
81
- var extractedRows = [], left, right;
82
- var rows = args.rows;
83
- var insertBefore = args.insertBefore;
84
- left = data.slice(0, insertBefore);
85
- right = data.slice(insertBefore, data.length);
86
- rows.sort(function (a, b) { return a - b; });
87
- for (var i = 0; i < rows.length; i++) {
88
- extractedRows.push(data[rows[i]]);
89
- }
90
- rows.reverse();
91
- for (var i = 0; i < rows.length; i++) {
92
- var row = rows[i];
93
- if (row < insertBefore) {
94
- left.splice(row, 1);
95
- }
96
- else {
97
- right.splice(row - insertBefore, 1);
98
- }
99
- }
100
- data = left.concat(extractedRows.concat(right));
101
- var selectedRows = [];
102
- for (var i = 0; i < rows.length; i++)
103
- selectedRows.push(left.length + i);
104
- // grid.resetActiveCell();
105
- dataView.beginUpdate();
106
- dataView.setItems(data);
107
- dataView.endUpdate();
108
- grid.render();
109
- });
110
- }
111
- var isTouch = helper.isTouchScreen();
112
- if (option.enableFillDown && !isTouch) {
113
- var overlayPlugin = new Overlays({});
114
- // Event fires when a range is selected
115
- overlayPlugin.onFillUpDown.subscribe(function (e, args) {
116
- var column = grid.getColumns()[args.range.fromCell];
117
- // Ensure the column is editable
118
- if (column.editor == null || column.readonly || !grid.getOptions().editable) {
119
- return;
120
- }
121
- // Find the initial value
122
- dataView.beginUpdate();
123
- var value;
124
- var items = [];
125
- if (args.direction === "down") {
126
- var item = dataView.getItem(args.range.fromRow);
127
- value = grid.getDataItemValueForColumn(item, column); // item[column.field];
128
- // Copy the value down
129
- for (var i = args.range.fromRow + 1; i <= args.range.toRow; i++) {
130
- if (grid.onBeforeEditCell.notify({ row: i, cell: args.range.fromCell, item: dataView.getItem(i), column: column }, e) !== false) {
131
- var currentItem = dataView.getItem(i);
132
- items.push(currentItem);
133
- // if (options.setDataItemValueForColumn != null) {
134
- // options.setDataItemValueForColumn(currentItem, column, value);
135
- // } else {
136
- // dataView.getItem(i)[column.field] = value;
137
- // }
138
- // grid.invalidateRow(i);
139
- // grid.onAfterEdit.notify({ grid, oldValue, newValue: value, column, item: dataView.getItem(i) }, e);
140
- }
141
- }
142
- }
143
- else {
144
- var item = dataView.getItem(args.range.toRow);
145
- items.push(item);
146
- value = grid.getDataItemValueForColumn(item, column); // item[column.field];
147
- // Copy the value up
148
- for (var i = args.range.fromRow; i <= args.range.toRow - 1; i++) {
149
- if (grid.onBeforeEditCell.notify({ row: i, cell: args.range.fromCell, item: dataView.getItem(i), column: column }, e) !== false) {
150
- var currentItem = dataView.getItem(i);
151
- items.push(currentItem);
152
- // if (options.setDataItemValueForColumn != null) {
153
- // options.setDataItemValueForColumn(currentItem, column, value);
154
- // } else {
155
- // dataView.getItem(i)[column.field] = value;
156
- // }
157
- // grid.invalidateRow(i);
158
- // grid.onAfterEdit.notify({ grid, oldValue, newValue: value, column, item: dataView.getItem(i) }, e);
159
- }
160
- }
161
- }
162
- grid.onAfterFillDown.notify({ grid: grid, value: value, column: column, direction: args.direction, range: args.range, items: items }, e);
163
- dataView.endUpdate();
164
- grid.render();
165
- });
166
- grid.registerPlugin(overlayPlugin);
167
- }
168
- if (!option.explicitInitialization) {
169
- grid.init();
170
- }
171
- if (options.showColumnGroups) {
172
- setTimeout(function () {
173
- // TODO -> find better solution then timeout
174
- grid.onColumnsResized.subscribe(function () {
175
- CreateColumnGroups();
176
- });
177
- CreateColumnGroups();
178
- }, 1);
179
- }
180
- if (options.saveColumnsKey) {
181
- grid.onColumnsResized.subscribe(function () {
182
- storeColumnSettings();
183
- });
184
- grid.onColumnsReordered.subscribe(function () {
185
- storeColumnSettings();
186
- });
187
- loadColumnSettings();
188
- }
189
- }
190
- function CreateColumnGroups() {
191
- var options = grid.getOptions();
192
- var columns = grid.getColumns();
193
- if (options.frozenColumn >= 0) {
194
- // Add column groups to left panel
195
- var $preHeaderPanel = $(grid.getPreHeaderPanel());
196
- renderHeaderGroups($preHeaderPanel, 0, options.frozenColumn + 1);
197
- // Add column groups to right panel
198
- $preHeaderPanel = $(grid.getPreHeaderPanelRight());
199
- renderHeaderGroups($preHeaderPanel, options.frozenColumn + 1, columns.length);
200
- }
201
- else {
202
- var $preHeaderPanel = $(grid.getPreHeaderPanel());
203
- renderHeaderGroups($preHeaderPanel, 0, columns.length);
204
- }
205
- function renderHeaderGroups(preHeaderPanel, start, end) {
206
- preHeaderPanel.empty()
207
- .addClass("slick-header-columns")
208
- .css("left", "-1000px")
209
- .width(grid.getHeadersWidth());
210
- preHeaderPanel[0].parentElement.classList.add("slick-header");
211
- var headerColumnWidthDiff = grid.getHeaderColumnWidthDiff();
212
- var header;
213
- var lastColumnGroup = "";
214
- var widthTotal = 0;
215
- for (var i = start; i < end; i++) {
216
- var m = columns[i];
217
- if (lastColumnGroup === m.columnGroup && i > start) {
218
- widthTotal += m.width;
219
- header.width(widthTotal - headerColumnWidthDiff);
220
- }
221
- else {
222
- widthTotal = m.width;
223
- header = $("<div class='ui-state-default slick-header-column' />")
224
- .html("<span class='slick-column-name'>" + (m.columnGroup || '') + "</span>")
225
- .width(m.width - headerColumnWidthDiff)
226
- .appendTo(preHeaderPanel);
227
- }
228
- lastColumnGroup = m.columnGroup;
229
- }
230
- }
231
- }
232
- function storeColumnSettings() {
233
- var cols = grid.getColumns();
234
- var options = grid.getOptions();
235
- var colSettings = cols.map(function (c) { return ({ id: c.id, width: c.width }); });
236
- if (window.localStorage) {
237
- localStorage.setItem("_grid_col_settings_" + options.saveColumnsKey, JSON.stringify(colSettings));
238
- }
239
- }
240
- function loadColumnSettings() {
241
- if (!window.localStorage) {
242
- return;
243
- }
244
- var options = grid.getOptions();
245
- var key = options.saveColumnsKey;
246
- if (key) {
247
- var cols = grid.getColumns();
248
- var colSettings = JSON.parse(localStorage.getItem("_grid_col_settings_" + key));
249
- if (!colSettings) {
250
- return;
251
- }
252
- for (var i = 0; i < colSettings.length; i++) {
253
- for (var j = 0; j < cols.length; j++) {
254
- if (cols[j].id === colSettings[i].id) {
255
- var c = cols[j];
256
- c.width = colSettings[i].width;
257
- if (i !== j) {
258
- cols.splice(j, 1);
259
- cols.splice(i, 0, c);
260
- }
261
- break;
262
- }
263
- }
264
- }
265
- grid.setColumns(cols);
266
- }
267
- }
268
- function sanitizeColumns(cols) {
269
- for (var i = 0; i < cols.length; i++) {
270
- var c = cols[i];
271
- if (c.field === undefined && c.id) {
272
- c.field = c.id;
273
- }
274
- }
275
- }
276
- function addCustomEvents() {
277
- grid.onAfterEdit = new Slick.Event();
278
- grid.onFiltersChanged = new Slick.Event();
279
- grid.onAfterFillDown = new Slick.Event();
280
- }
281
- function setupChangeEvents() {
282
- dataView.onRowsChanged.subscribe(function (e, args) {
283
- grid.invalidateRows(args.rows);
284
- grid.render();
285
- // for (let idx = 0; idx < args.rows.length; idx++) {
286
- // grid.updateRow(args.rows[idx]);
287
- // }
288
- // grid.invalidate();
289
- });
290
- dataView.onRowCountChanged.subscribe(function (e, args) {
291
- grid.updateRowCount();
292
- grid.render();
293
- });
294
- grid.onAddNewRow.subscribe(function (e, args) {
295
- var options = grid.getOptions();
296
- if (options.provideDefaultValues != null) {
297
- var result = options.provideDefaultValues(args.item);
298
- if (result === false) {
299
- return;
300
- }
301
- }
302
- dataView.addItem(args.item);
303
- grid.onAfterEdit.notify({
304
- grid: grid,
305
- oldValue: undefined,
306
- newValue: grid.getDataItemValueForColumn(args.item, args.column),
307
- column: args.column,
308
- item: args.item
309
- });
310
- });
311
- }
312
- function setupDefaultSort() {
313
- var options = grid.getOptions();
314
- if (options.mode === "client") {
315
- grid.onSort.subscribe(function (e, args) {
316
- sort(args.sortCol, args.sortAsc);
317
- });
318
- }
319
- // TODO: multi column sort
320
- }
321
- function setupHeaderButtons() {
322
- headerButtons = new HeaderButtons({});
323
- grid.registerPlugin(headerButtons);
324
- }
325
- function setupHeaderMenu() {
326
- headerMenu = new HeaderMenu({});
327
- grid.registerPlugin(headerMenu);
328
- headerMenu.onBeforeMenuShow.subscribe(function (e, args) {
329
- var column = args.column;
330
- var menu = args.menu;
331
- if (column.sortable) {
332
- menu.items.push({
333
- title: UILang.grid.Sort + " " + UILang.grid.Asc,
334
- command: "sort-asc"
335
- });
336
- menu.items.push({
337
- title: UILang.grid.Sort + " " + UILang.grid.Desc,
338
- command: "sort-desc"
339
- });
340
- }
341
- if (column.filterable) {
342
- menu.items.push({
343
- title: UILang.grid.Filter,
344
- command: "filter"
345
- });
346
- if (filters.filter(function (f) { return f.columnId === column.id; }).length > 0) {
347
- menu.items.push({
348
- title: UILang.grid.ClearFilter,
349
- command: "clear-filter"
350
- });
351
- }
352
- }
353
- });
354
- headerMenu.onCommand.subscribe(function (e, args) {
355
- if (args.command === "sort-asc" || args.command === "sort-desc") {
356
- grid.onSort.notify({
357
- sortAsc: args.command === "sort-asc",
358
- sortCol: args.column,
359
- columnId: args.column.id,
360
- sortCols: [{ columnId: args.column.id, sortCol: args.column, sortAsc: args.command === "sort-asc" }],
361
- multiColumnSort: false
362
- }, e);
363
- // sort(args.column, args.command === "sort-asc");
364
- }
365
- else if (args.command === "filter") {
366
- var options = grid.getOptions();
367
- if (options.showFilterDialog != null) {
368
- options.showFilterDialog(args.column, grid);
369
- }
370
- else {
371
- new ExcelFilter(grid).show(args.column);
372
- }
373
- }
374
- else if (args.command === "clear-filter") {
375
- clearFilter(args.column.id);
376
- }
377
- });
378
- }
379
- // refresh formulas depending on the given column
380
- function triggerFormula(column, item) {
381
- var options = grid.getOptions();
382
- var f = formulas[column];
383
- if (f) {
384
- for (var i = 0, l = f.length; i < l; i++) {
385
- if (options.setDataItemValueForColumn != null) {
386
- options.setDataItemValueForColumn(item, f[i].column, f[i].fnc(item, column));
387
- }
388
- else {
389
- item[f[i].column] = f[i].fnc(item, column);
390
- }
391
- }
392
- }
393
- }
394
- function handleEditCommand(item, column, editCommand) {
395
- var options = grid.getOptions();
396
- var oldVal = grid.getDataItemValueForColumn(item, column);
397
- if (customCommandHandler) {
398
- customCommandHandler(item, column, editCommand);
399
- }
400
- else {
401
- editCommand.execute();
402
- }
403
- triggerFormula(column.field, item);
404
- dataView.updateItem(item[options.primaryKey], item);
405
- var afterEditResult = grid.onAfterEdit.notify({
406
- grid: grid,
407
- oldValue: oldVal,
408
- newValue: grid.getDataItemValueForColumn(item, column),
409
- column: column,
410
- item: item
411
- });
412
- if (afterEditResult === false) {
413
- if (options.setDataItemValueForColumn != null) {
414
- options.setDataItemValueForColumn(item, column, oldVal);
415
- }
416
- else {
417
- item[column.field] = oldVal;
418
- }
419
- triggerFormula(column.field, item);
420
- dataView.updateItem(item[options.primaryKey], item);
421
- }
422
- }
423
- function setHeight(height) {
424
- $(container).height(height);
425
- grid.resizeCanvas();
426
- }
427
- function getHeight() {
428
- return $(container).height();
429
- }
430
- function sort(column, sortAsc) {
431
- function _comparer(a, b) {
432
- var x = grid.getDataItemValueForColumn(a, column);
433
- var y = grid.getDataItemValueForColumn(b, column);
434
- if (typeof x === "string" && typeof y === "string") {
435
- x = x.toLocaleLowerCase();
436
- y = y.toLocaleLowerCase();
437
- }
438
- if (x == null && y != null) {
439
- return -1;
440
- }
441
- else if (x != null && y == null) {
442
- return 1;
443
- }
444
- else {
445
- return (x === y ? 0 : (x > y ? 1 : -1));
446
- }
447
- }
448
- function _visibleComparer(a, b) {
449
- var x = column.formatter(0, 0, grid.getDataItemValueForColumn(a, column), column, a);
450
- var y = column.formatter(0, 0, grid.getDataItemValueForColumn(b, column), column, b);
451
- var xStr = (Object.prototype.toString.call(x) !== "[object Object]" ? x : x.text);
452
- var yStr = (Object.prototype.toString.call(y) !== "[object Object]" ? y : y.text);
453
- if (typeof x === "string" && typeof y === "string") {
454
- xStr = x.toLocaleLowerCase();
455
- yStr = y.toLocaleLowerCase();
456
- }
457
- return (xStr === yStr ? 0 : (xStr > yStr ? 1 : -1));
458
- }
459
- var comparer = column.comparer || (column.sortByVisibleValue ? _visibleComparer : _comparer);
460
- dataView.sort(comparer, sortAsc ? true : false);
461
- }
462
- function setData(newData) {
463
- data = newData;
464
- dataView.setItems(data);
465
- refresh();
466
- }
467
- function getData() {
468
- return data;
469
- }
470
- function refreshData() {
471
- // var selrows = self.getSelectedRows();
472
- dataView.setItems(data);
473
- // self.setSelectedRows(selrows);
474
- refresh();
475
- }
476
- function refresh() {
477
- grid.invalidate();
478
- }
479
- function addFormula(field, fnc, usedColumns) {
480
- formulaObjects.push({ fnc: fnc, column: field });
481
- for (var i = 0; i < usedColumns.length; i++) {
482
- if (!formulas[usedColumns[i]]) {
483
- formulas[usedColumns[i]] = [];
484
- }
485
- formulas[usedColumns[i]].push({ fnc: fnc, column: field });
486
- }
487
- }
488
- /**
489
- * returns the string representation of a value based on column settings
490
- */
491
- function getFormattedValue(column, value, item) {
492
- var formatter = column.formatter || TextFormatter;
493
- var formatterResult = formatter(0, 0, value, column, item, grid);
494
- return (Object.prototype.toString.call(formatterResult) !== "[object Object]" ?
495
- formatterResult :
496
- (formatterResult.text));
497
- }
498
- function getContentWidth(column, row) {
499
- var item = dataView.getItem(row);
500
- var html = getFormattedValue(column, grid.getDataItemValueForColumn(item, column), item);
501
- if (html.indexOf("<") >= 0) {
502
- return calcLengthInternal(html, true) + 12;
503
- }
504
- else {
505
- if (convertElement == null) {
506
- convertElement = document.createElement("span");
507
- }
508
- convertElement.innerHTML = html;
509
- return calcTextLength(convertElement.textContent) + 12;
510
- }
511
- }
512
- var measureElement;
513
- var convertElement;
514
- var charWidth = {};
515
- function calcTextLength(text) {
516
- var result = 0;
517
- for (var i = 0; i < text.length; i++) {
518
- var c = text[i];
519
- var w = charWidth[c];
520
- if (w == null) {
521
- charWidth[c] = w = calcLengthInternal(c, false);
522
- }
523
- result += w;
524
- }
525
- return result;
526
- }
527
- function calcLengthInternal(c, isHTML) {
528
- if (measureElement == null) {
529
- measureElement = document.createElement("span");
530
- measureElement.style.top = "-100000px";
531
- measureElement.style.position = "absolute";
532
- measureElement.style.whiteSpace = "pre";
533
- document.body.appendChild(measureElement);
534
- grid.onBeforeDestroy.subscribe(function () {
535
- if (measureElement.parentElement != null) {
536
- measureElement.parentElement.removeChild(measureElement);
537
- }
538
- });
539
- }
540
- if (isHTML) {
541
- measureElement.innerHTML = c;
542
- }
543
- else {
544
- measureElement.textContent = c;
545
- }
546
- return measureElement.getBoundingClientRect().width;
547
- }
548
- function fitToContent(column) {
549
- var width = 10;
550
- for (var idx = 0, len = grid.getDataLength(); idx < len; idx++) {
551
- //const d = grid.getDataItem(idx);
552
- width = Math.max(width, getContentWidth(column, idx));
553
- }
554
- column.width = width;
555
- grid.setColumns(grid.getColumns());
556
- // TODO: raise column resize event
557
- // TODO (2): find more performant way to refresh columns
558
- }
559
- function triggerAllFormulas() {
560
- if (formulaObjects.length === 0) {
561
- return;
562
- }
563
- for (var j = 0; j < formulaObjects.length; j++) {
564
- for (var i = 0; i < data.length; i++) {
565
- var val = formulaObjects[j].fnc(data[i], grid, formulaObjects[j].column);
566
- data[i][formulaObjects[j].column] = val;
567
- }
568
- }
569
- refreshData();
570
- }
571
- function columnHasFilter(columnId) {
572
- for (var i = 0, l = (filters ? filters.length : 0); i < l; i++) {
573
- if (filters[i].columnId === columnId) {
574
- return true;
575
- }
576
- }
577
- return false;
578
- }
579
- function refreshDataItem(item) {
580
- var options = grid.getOptions();
581
- dataView.updateItem(item[options.primaryKey], item);
582
- // formula refresh
583
- for (var f in formulas) {
584
- if (formulas.hasOwnProperty(f)) {
585
- triggerFormula(f, item);
586
- }
587
- }
588
- grid.updateRow(dataView.getRowByItem(item));
589
- }
590
- function addFilter(filter, dontrefresh) {
591
- var filterArray;
592
- if (Array.isArray(filter)) {
593
- filterArray = filter;
594
- }
595
- else {
596
- filterArray = [filter];
597
- }
598
- for (var idx = 0; idx < filterArray.length; idx++) {
599
- // add filter
600
- filters.push(filterArray[idx]);
601
- }
602
- if (!dontrefresh) {
603
- refreshFilters();
604
- }
605
- }
606
- function setFilters(f, dontrefresh) {
607
- filters = f;
608
- if (!dontrefresh) {
609
- refreshFilters();
610
- }
611
- }
612
- function getFilters() {
613
- return filters;
614
- }
615
- function clearFilter(columnId, dontrefresh) {
616
- if (columnId === undefined) { // clear all filters
617
- filters.length = 0;
618
- }
619
- else {
620
- for (var i = 0; i < filters.length; i++) {
621
- if (filters[i].columnId === columnId) {
622
- filters.splice(i, 1);
623
- i--;
624
- }
625
- }
626
- }
627
- if (!dontrefresh) {
628
- refreshFilters();
629
- }
630
- }
631
- function refreshFilters(noColumnHeaderRefresh) {
632
- var options = grid.getOptions();
633
- function client_filter(item, args) {
634
- var filterArray = args;
635
- // no filter present -> show all rows
636
- if (filterArray.length === 0) {
637
- return true;
638
- }
639
- if (filterArray.length === 1) {
640
- return filterArray[0].match.call(null, item, filterArray[0].field);
641
- }
642
- else {
643
- var result = true;
644
- var i = 0;
645
- while (i < filterArray.length) {
646
- var orResult = false;
647
- while (i < filterArray.length) { // combine or(s)
648
- if (orResult || filterArray[i].match.call(null, item, filterArray[i].field)) {
649
- orResult = true;
650
- }
651
- if (filterArray[i].combine !== "or") {
652
- break;
653
- }
654
- else {
655
- i++;
656
- }
657
- }
658
- if (!orResult) {
659
- result = false;
660
- break;
661
- }
662
- i++;
663
- }
664
- return result;
665
- }
666
- }
667
- if (options.mode === "client") {
668
- dataView.setFilterArgs(filters);
669
- dataView.setFilter(client_filter);
670
- }
671
- // redraw columns
672
- if (!noColumnHeaderRefresh) {
673
- grid.setColumns(grid.getColumns());
674
- }
675
- grid.onFiltersChanged.notify();
676
- }
677
- function getSelectedItems() {
678
- var selRows = grid.getSelectedRows();
679
- var rows = [];
680
- for (var i = 0; i < selRows.length; i++) {
681
- var rowIdx = selRows[i];
682
- var toPush = dataView.getItem(rowIdx);
683
- if (toPush !== undefined && !toPush.__group && !toPush.__groupTotals) {
684
- rows.push(toPush);
685
- }
686
- }
687
- return rows;
688
- }
689
- function getRowMoveManager() {
690
- return rowMoveManager;
691
- }
692
- function getHeaderMenu() {
693
- return headerMenu;
694
- }
695
- // function setHierachy(o: IGridTreeOptions): GridTree {
696
- // return new GridTree(this, o);
697
- // }
698
- createMe();
699
- return $.shallowExtend(grid, {
700
- dataView: dataView,
701
- setHeight: setHeight,
702
- getHeight: getHeight,
703
- sort: sort,
704
- refreshData: refreshData,
705
- setData: setData,
706
- getData: getData,
707
- refresh: refresh,
708
- addFormula: addFormula,
709
- getFormattedValue: getFormattedValue,
710
- getContentWidth: getContentWidth,
711
- fitToContent: fitToContent,
712
- triggerAllFormulas: triggerAllFormulas,
713
- columnHasFilter: columnHasFilter,
714
- refreshDataItem: refreshDataItem,
715
- addFilter: addFilter,
716
- setFilters: setFilters,
717
- getFilters: getFilters,
718
- clearFilter: clearFilter,
719
- refreshFilters: refreshFilters,
720
- getSelectedItems: getSelectedItems,
721
- getRowMoveManager: getRowMoveManager,
722
- getHeaderMenu: getHeaderMenu,
723
- refreshColumnGroups: CreateColumnGroups
724
- // setHierachy
725
- });
726
- }
1
+ import { Slick } from "./slick.core";
2
+ import { SlickGrid } from "./slick.grid";
3
+ import { RowSelectionModel } from "./plugins/slick.rowselectionmodel";
4
+ import { DataView } from "./slick.dataview";
5
+ import { GroupItemMetadataProvider } from "./slick.groupitemmetadataprovider";
6
+ import { jQueryReplacement } from "../core/jq";
7
+ import { HeaderMenu } from "./plugins/slick.headermenu";
8
+ import { HeaderButtons } from "./plugins/slick.headerbuttons";
9
+ import { TextFormatter } from "./slick.formatters";
10
+ import { ExcelFilter } from "./filterDialogs/excelFilter";
11
+ import { UILang } from "../core/lang";
12
+ import { RowMoveManager } from "./plugins/slick.rowmovemanager";
13
+ import { Overlays } from "./plugins/ext.overlay";
14
+ import { helper } from "../core/helper";
15
+ const $ = jQueryReplacement;
16
+ export function createJSLGrid(selector, data, columns, option) {
17
+ const formulaObjects = [];
18
+ let headerMenu;
19
+ let headerButtons;
20
+ const formulas = {};
21
+ let container;
22
+ let filters = [];
23
+ let customCommandHandler;
24
+ let grid;
25
+ let dataView;
26
+ let rowMoveManager;
27
+ //let options: ISlickCreatorOptions;
28
+ function createMe() {
29
+ sanitizeColumns(columns);
30
+ const options = $.shallowExtend({ explicitInitialization: true, mode: "client" }, option);
31
+ container = typeof (selector) === "string" ?
32
+ document.querySelector(selector) :
33
+ selector;
34
+ if (!container) {
35
+ throw new Error("error: selector for SlickCreator is invalid");
36
+ }
37
+ if (options.showColumnGroups) {
38
+ options.createPreHeaderPanel = true;
39
+ options.showPreHeaderPanel = true;
40
+ }
41
+ customCommandHandler = option.editCommandHandler;
42
+ options.editCommandHandler = (a, b, c) => { handleEditCommand(a, b, c); };
43
+ const groupItemMetadataProvider = options.groupItemMetadataProvider || GroupItemMetadataProvider(options.groupItemOptions);
44
+ if (options.dataView != null) {
45
+ dataView = options.dataView;
46
+ }
47
+ else {
48
+ dataView = new DataView({ inlineFilters: true, groupItemMetadataProvider });
49
+ dataView.setItems(data, options.primaryKey);
50
+ }
51
+ grid = new SlickGrid(container, dataView, columns, options);
52
+ grid.registerPlugin(groupItemMetadataProvider);
53
+ grid.setSelectionModel(new RowSelectionModel());
54
+ grid.onHeaderCellRendered.subscribe((e, args) => {
55
+ if (columnHasFilter(args.column.id)) {
56
+ //this column is filtered
57
+ args.node.classList.add("slick-filtered-header");
58
+ }
59
+ });
60
+ addCustomEvents();
61
+ setupDefaultSort();
62
+ setupChangeEvents();
63
+ if (options.showHeaderMenu) {
64
+ setupHeaderMenu();
65
+ }
66
+ setupHeaderButtons();
67
+ if (options.allowRowMove) {
68
+ rowMoveManager = new RowMoveManager({
69
+ cancelEditOnDrag: true,
70
+ singleRowMove: true,
71
+ disableRowSelection: true,
72
+ hideRowMoveShadow: false,
73
+ rowMoveShadowScale: 0.7,
74
+ rowMoveShadowOpacity: 0.9 // defaults to 0.95
75
+ });
76
+ grid.registerPlugin(rowMoveManager);
77
+ rowMoveManager.onBeforeMoveRows.subscribe(function (e, args) {
78
+ // debugger;
79
+ });
80
+ rowMoveManager.onMoveRows.subscribe(function (e, args) {
81
+ var extractedRows = [], left, right;
82
+ var rows = args.rows;
83
+ var insertBefore = args.insertBefore;
84
+ left = data.slice(0, insertBefore);
85
+ right = data.slice(insertBefore, data.length);
86
+ rows.sort(function (a, b) { return a - b; });
87
+ for (var i = 0; i < rows.length; i++) {
88
+ extractedRows.push(data[rows[i]]);
89
+ }
90
+ rows.reverse();
91
+ for (var i = 0; i < rows.length; i++) {
92
+ var row = rows[i];
93
+ if (row < insertBefore) {
94
+ left.splice(row, 1);
95
+ }
96
+ else {
97
+ right.splice(row - insertBefore, 1);
98
+ }
99
+ }
100
+ data = left.concat(extractedRows.concat(right));
101
+ var selectedRows = [];
102
+ for (var i = 0; i < rows.length; i++)
103
+ selectedRows.push(left.length + i);
104
+ // grid.resetActiveCell();
105
+ dataView.beginUpdate();
106
+ dataView.setItems(data);
107
+ dataView.endUpdate();
108
+ grid.render();
109
+ });
110
+ }
111
+ const isTouch = helper.isTouchScreen();
112
+ if (option.enableFillDown && !isTouch) {
113
+ var overlayPlugin = new Overlays({});
114
+ // Event fires when a range is selected
115
+ overlayPlugin.onFillUpDown.subscribe(function (e, args) {
116
+ const column = grid.getColumns()[args.range.fromCell];
117
+ // Ensure the column is editable
118
+ if (column.editor == null || column.readonly || !grid.getOptions().editable) {
119
+ return;
120
+ }
121
+ // Find the initial value
122
+ dataView.beginUpdate();
123
+ let value;
124
+ const items = [];
125
+ if (args.direction === "down") {
126
+ const item = dataView.getItem(args.range.fromRow);
127
+ value = grid.getDataItemValueForColumn(item, column); // item[column.field];
128
+ // Copy the value down
129
+ for (let i = args.range.fromRow + 1; i <= args.range.toRow; i++) {
130
+ if (grid.onBeforeEditCell.notify({ row: i, cell: args.range.fromCell, item: dataView.getItem(i), column }, e) !== false) {
131
+ const currentItem = dataView.getItem(i);
132
+ items.push(currentItem);
133
+ // if (options.setDataItemValueForColumn != null) {
134
+ // options.setDataItemValueForColumn(currentItem, column, value);
135
+ // } else {
136
+ // dataView.getItem(i)[column.field] = value;
137
+ // }
138
+ // grid.invalidateRow(i);
139
+ // grid.onAfterEdit.notify({ grid, oldValue, newValue: value, column, item: dataView.getItem(i) }, e);
140
+ }
141
+ }
142
+ }
143
+ else {
144
+ const item = dataView.getItem(args.range.toRow);
145
+ items.push(item);
146
+ value = grid.getDataItemValueForColumn(item, column); // item[column.field];
147
+ // Copy the value up
148
+ for (let i = args.range.fromRow; i <= args.range.toRow - 1; i++) {
149
+ if (grid.onBeforeEditCell.notify({ row: i, cell: args.range.fromCell, item: dataView.getItem(i), column }, e) !== false) {
150
+ const currentItem = dataView.getItem(i);
151
+ items.push(currentItem);
152
+ // if (options.setDataItemValueForColumn != null) {
153
+ // options.setDataItemValueForColumn(currentItem, column, value);
154
+ // } else {
155
+ // dataView.getItem(i)[column.field] = value;
156
+ // }
157
+ // grid.invalidateRow(i);
158
+ // grid.onAfterEdit.notify({ grid, oldValue, newValue: value, column, item: dataView.getItem(i) }, e);
159
+ }
160
+ }
161
+ }
162
+ grid.onAfterFillDown.notify({ grid, value, column, direction: args.direction, range: args.range, items: items }, e);
163
+ dataView.endUpdate();
164
+ grid.render();
165
+ });
166
+ grid.registerPlugin(overlayPlugin);
167
+ }
168
+ if (!option.explicitInitialization) {
169
+ grid.init();
170
+ }
171
+ if (options.showColumnGroups) {
172
+ setTimeout(() => {
173
+ // TODO -> find better solution then timeout
174
+ grid.onColumnsResized.subscribe(() => {
175
+ CreateColumnGroups();
176
+ });
177
+ CreateColumnGroups();
178
+ }, 1);
179
+ }
180
+ if (options.saveColumnsKey) {
181
+ grid.onColumnsResized.subscribe(() => {
182
+ storeColumnSettings();
183
+ });
184
+ grid.onColumnsReordered.subscribe(() => {
185
+ storeColumnSettings();
186
+ });
187
+ loadColumnSettings();
188
+ }
189
+ }
190
+ function CreateColumnGroups() {
191
+ const options = grid.getOptions();
192
+ const columns = grid.getColumns();
193
+ if (options.frozenColumn >= 0) {
194
+ // Add column groups to left panel
195
+ let $preHeaderPanel = $(grid.getPreHeaderPanel());
196
+ renderHeaderGroups($preHeaderPanel, 0, options.frozenColumn + 1);
197
+ // Add column groups to right panel
198
+ $preHeaderPanel = $(grid.getPreHeaderPanelRight());
199
+ renderHeaderGroups($preHeaderPanel, options.frozenColumn + 1, columns.length);
200
+ }
201
+ else {
202
+ const $preHeaderPanel = $(grid.getPreHeaderPanel());
203
+ renderHeaderGroups($preHeaderPanel, 0, columns.length);
204
+ }
205
+ function renderHeaderGroups(preHeaderPanel, start, end) {
206
+ preHeaderPanel.empty()
207
+ .addClass("slick-header-columns")
208
+ .css("left", "-1000px")
209
+ .width(grid.getHeadersWidth());
210
+ preHeaderPanel[0].parentElement.classList.add("slick-header");
211
+ const headerColumnWidthDiff = grid.getHeaderColumnWidthDiff();
212
+ let header;
213
+ let lastColumnGroup = "";
214
+ let widthTotal = 0;
215
+ for (let i = start; i < end; i++) {
216
+ const m = columns[i];
217
+ if (lastColumnGroup === m.columnGroup && i > start) {
218
+ widthTotal += m.width;
219
+ header.width(widthTotal - headerColumnWidthDiff);
220
+ }
221
+ else {
222
+ widthTotal = m.width;
223
+ header = $("<div class='ui-state-default slick-header-column' />")
224
+ .html("<span class='slick-column-name'>" + (m.columnGroup || '') + "</span>")
225
+ .width(m.width - headerColumnWidthDiff)
226
+ .appendTo(preHeaderPanel);
227
+ }
228
+ lastColumnGroup = m.columnGroup;
229
+ }
230
+ }
231
+ }
232
+ function storeColumnSettings() {
233
+ const cols = grid.getColumns();
234
+ const options = grid.getOptions();
235
+ const colSettings = cols.map((c) => ({ id: c.id, width: c.width }));
236
+ if (window.localStorage) {
237
+ localStorage.setItem("_grid_col_settings_" + options.saveColumnsKey, JSON.stringify(colSettings));
238
+ }
239
+ }
240
+ function loadColumnSettings() {
241
+ if (!window.localStorage) {
242
+ return;
243
+ }
244
+ const options = grid.getOptions();
245
+ const key = options.saveColumnsKey;
246
+ if (key) {
247
+ const cols = grid.getColumns();
248
+ const colSettings = JSON.parse(localStorage.getItem("_grid_col_settings_" + key));
249
+ if (!colSettings) {
250
+ return;
251
+ }
252
+ for (let i = 0; i < colSettings.length; i++) {
253
+ for (let j = 0; j < cols.length; j++) {
254
+ if (cols[j].id === colSettings[i].id) {
255
+ const c = cols[j];
256
+ c.width = colSettings[i].width;
257
+ if (i !== j) {
258
+ cols.splice(j, 1);
259
+ cols.splice(i, 0, c);
260
+ }
261
+ break;
262
+ }
263
+ }
264
+ }
265
+ grid.setColumns(cols);
266
+ }
267
+ }
268
+ function sanitizeColumns(cols) {
269
+ for (let i = 0; i < cols.length; i++) {
270
+ const c = cols[i];
271
+ if (c.field === undefined && c.id) {
272
+ c.field = c.id;
273
+ }
274
+ }
275
+ }
276
+ function addCustomEvents() {
277
+ grid.onAfterEdit = new Slick.Event();
278
+ grid.onFiltersChanged = new Slick.Event();
279
+ grid.onAfterFillDown = new Slick.Event();
280
+ }
281
+ function setupChangeEvents() {
282
+ dataView.onRowsChanged.subscribe((e, args) => {
283
+ grid.invalidateRows(args.rows);
284
+ grid.render();
285
+ // for (let idx = 0; idx < args.rows.length; idx++) {
286
+ // grid.updateRow(args.rows[idx]);
287
+ // }
288
+ // grid.invalidate();
289
+ });
290
+ dataView.onRowCountChanged.subscribe((e, args) => {
291
+ grid.updateRowCount();
292
+ grid.render();
293
+ });
294
+ grid.onAddNewRow.subscribe((e, args) => {
295
+ const options = grid.getOptions();
296
+ if (options.provideDefaultValues != null) {
297
+ const result = options.provideDefaultValues(args.item);
298
+ if (result === false) {
299
+ return;
300
+ }
301
+ }
302
+ dataView.addItem(args.item);
303
+ grid.onAfterEdit.notify({
304
+ grid,
305
+ oldValue: undefined,
306
+ newValue: grid.getDataItemValueForColumn(args.item, args.column),
307
+ column: args.column,
308
+ item: args.item
309
+ });
310
+ });
311
+ }
312
+ function setupDefaultSort() {
313
+ const options = grid.getOptions();
314
+ if (options.mode === "client") {
315
+ grid.onSort.subscribe((e, args) => {
316
+ sort(args.sortCol, args.sortAsc);
317
+ });
318
+ }
319
+ // TODO: multi column sort
320
+ }
321
+ function setupHeaderButtons() {
322
+ headerButtons = new HeaderButtons({});
323
+ grid.registerPlugin(headerButtons);
324
+ }
325
+ function setupHeaderMenu() {
326
+ headerMenu = new HeaderMenu({});
327
+ grid.registerPlugin(headerMenu);
328
+ headerMenu.onBeforeMenuShow.subscribe((e, args) => {
329
+ const column = args.column;
330
+ const menu = args.menu;
331
+ if (column.sortable) {
332
+ menu.items.push({
333
+ title: UILang.grid.Sort + " " + UILang.grid.Asc,
334
+ command: "sort-asc"
335
+ });
336
+ menu.items.push({
337
+ title: UILang.grid.Sort + " " + UILang.grid.Desc,
338
+ command: "sort-desc"
339
+ });
340
+ }
341
+ if (column.filterable) {
342
+ menu.items.push({
343
+ title: UILang.grid.Filter,
344
+ command: "filter"
345
+ });
346
+ if (filters.filter((f) => f.columnId === column.id).length > 0) {
347
+ menu.items.push({
348
+ title: UILang.grid.ClearFilter,
349
+ command: "clear-filter"
350
+ });
351
+ }
352
+ }
353
+ });
354
+ headerMenu.onCommand.subscribe((e, args) => {
355
+ if (args.command === "sort-asc" || args.command === "sort-desc") {
356
+ grid.onSort.notify({
357
+ sortAsc: args.command === "sort-asc",
358
+ sortCol: args.column,
359
+ columnId: args.column.id,
360
+ sortCols: [{ columnId: args.column.id, sortCol: args.column, sortAsc: args.command === "sort-asc" }],
361
+ multiColumnSort: false
362
+ }, e);
363
+ // sort(args.column, args.command === "sort-asc");
364
+ }
365
+ else if (args.command === "filter") {
366
+ const options = grid.getOptions();
367
+ if (options.showFilterDialog != null) {
368
+ options.showFilterDialog(args.column, grid);
369
+ }
370
+ else {
371
+ new ExcelFilter(grid).show(args.column);
372
+ }
373
+ }
374
+ else if (args.command === "clear-filter") {
375
+ clearFilter(args.column.id);
376
+ }
377
+ });
378
+ }
379
+ // refresh formulas depending on the given column
380
+ function triggerFormula(column, item) {
381
+ const options = grid.getOptions();
382
+ const f = formulas[column];
383
+ if (f) {
384
+ for (let i = 0, l = f.length; i < l; i++) {
385
+ if (options.setDataItemValueForColumn != null) {
386
+ options.setDataItemValueForColumn(item, f[i].column, f[i].fnc(item, column));
387
+ }
388
+ else {
389
+ item[f[i].column] = f[i].fnc(item, column);
390
+ }
391
+ }
392
+ }
393
+ }
394
+ function handleEditCommand(item, column, editCommand) {
395
+ const options = grid.getOptions();
396
+ const oldVal = grid.getDataItemValueForColumn(item, column);
397
+ if (customCommandHandler) {
398
+ customCommandHandler(item, column, editCommand);
399
+ }
400
+ else {
401
+ editCommand.execute();
402
+ }
403
+ triggerFormula(column.field, item);
404
+ dataView.updateItem(item[options.primaryKey], item);
405
+ const afterEditResult = grid.onAfterEdit.notify({
406
+ grid,
407
+ oldValue: oldVal,
408
+ newValue: grid.getDataItemValueForColumn(item, column),
409
+ column,
410
+ item
411
+ });
412
+ if (afterEditResult === false) {
413
+ if (options.setDataItemValueForColumn != null) {
414
+ options.setDataItemValueForColumn(item, column, oldVal);
415
+ }
416
+ else {
417
+ item[column.field] = oldVal;
418
+ }
419
+ triggerFormula(column.field, item);
420
+ dataView.updateItem(item[options.primaryKey], item);
421
+ }
422
+ }
423
+ function setHeight(height) {
424
+ $(container).height(height);
425
+ grid.resizeCanvas();
426
+ }
427
+ function getHeight() {
428
+ return $(container).height();
429
+ }
430
+ function sort(column, sortAsc) {
431
+ function _comparer(a, b) {
432
+ let x = grid.getDataItemValueForColumn(a, column);
433
+ let y = grid.getDataItemValueForColumn(b, column);
434
+ if (typeof x === "string" && typeof y === "string") {
435
+ x = x.toLocaleLowerCase();
436
+ y = y.toLocaleLowerCase();
437
+ }
438
+ if (x == null && y != null) {
439
+ return -1;
440
+ }
441
+ else if (x != null && y == null) {
442
+ return 1;
443
+ }
444
+ else {
445
+ return (x === y ? 0 : (x > y ? 1 : -1));
446
+ }
447
+ }
448
+ function _visibleComparer(a, b) {
449
+ const x = column.formatter(0, 0, grid.getDataItemValueForColumn(a, column), column, a);
450
+ const y = column.formatter(0, 0, grid.getDataItemValueForColumn(b, column), column, b);
451
+ let xStr = (Object.prototype.toString.call(x) !== "[object Object]" ? x : x.text);
452
+ let yStr = (Object.prototype.toString.call(y) !== "[object Object]" ? y : y.text);
453
+ if (typeof x === "string" && typeof y === "string") {
454
+ xStr = x.toLocaleLowerCase();
455
+ yStr = y.toLocaleLowerCase();
456
+ }
457
+ return (xStr === yStr ? 0 : (xStr > yStr ? 1 : -1));
458
+ }
459
+ const comparer = column.comparer || (column.sortByVisibleValue ? _visibleComparer : _comparer);
460
+ dataView.sort(comparer, sortAsc ? true : false);
461
+ }
462
+ function setData(newData) {
463
+ data = newData;
464
+ dataView.setItems(data);
465
+ refresh();
466
+ }
467
+ function getData() {
468
+ return data;
469
+ }
470
+ function refreshData() {
471
+ // var selrows = self.getSelectedRows();
472
+ dataView.setItems(data);
473
+ // self.setSelectedRows(selrows);
474
+ refresh();
475
+ }
476
+ function refresh() {
477
+ grid.invalidate();
478
+ }
479
+ function addFormula(field, fnc, usedColumns) {
480
+ formulaObjects.push({ fnc, column: field });
481
+ for (let i = 0; i < usedColumns.length; i++) {
482
+ if (!formulas[usedColumns[i]]) {
483
+ formulas[usedColumns[i]] = [];
484
+ }
485
+ formulas[usedColumns[i]].push({ fnc, column: field });
486
+ }
487
+ }
488
+ /**
489
+ * returns the string representation of a value based on column settings
490
+ */
491
+ function getFormattedValue(column, value, item) {
492
+ const formatter = column.formatter || TextFormatter;
493
+ const formatterResult = formatter(0, 0, value, column, item, grid);
494
+ return (Object.prototype.toString.call(formatterResult) !== "[object Object]" ?
495
+ formatterResult :
496
+ (formatterResult.text));
497
+ }
498
+ function getContentWidth(column, row) {
499
+ const item = dataView.getItem(row);
500
+ const html = getFormattedValue(column, grid.getDataItemValueForColumn(item, column), item);
501
+ if (html.indexOf("<") >= 0) {
502
+ return calcLengthInternal(html, true) + 12;
503
+ }
504
+ else {
505
+ if (convertElement == null) {
506
+ convertElement = document.createElement("span");
507
+ }
508
+ convertElement.innerHTML = html;
509
+ return calcTextLength(convertElement.textContent) + 12;
510
+ }
511
+ }
512
+ let measureElement;
513
+ let convertElement;
514
+ const charWidth = {};
515
+ function calcTextLength(text) {
516
+ let result = 0;
517
+ for (let i = 0; i < text.length; i++) {
518
+ const c = text[i];
519
+ let w = charWidth[c];
520
+ if (w == null) {
521
+ charWidth[c] = w = calcLengthInternal(c, false);
522
+ }
523
+ result += w;
524
+ }
525
+ return result;
526
+ }
527
+ function calcLengthInternal(c, isHTML) {
528
+ if (measureElement == null) {
529
+ measureElement = document.createElement("span");
530
+ measureElement.style.top = "-100000px";
531
+ measureElement.style.position = "absolute";
532
+ measureElement.style.whiteSpace = "pre";
533
+ document.body.appendChild(measureElement);
534
+ grid.onBeforeDestroy.subscribe(() => {
535
+ if (measureElement.parentElement != null) {
536
+ measureElement.parentElement.removeChild(measureElement);
537
+ }
538
+ });
539
+ }
540
+ if (isHTML) {
541
+ measureElement.innerHTML = c;
542
+ }
543
+ else {
544
+ measureElement.textContent = c;
545
+ }
546
+ return measureElement.getBoundingClientRect().width;
547
+ }
548
+ function fitToContent(column) {
549
+ let width = 10;
550
+ for (let idx = 0, len = grid.getDataLength(); idx < len; idx++) {
551
+ //const d = grid.getDataItem(idx);
552
+ width = Math.max(width, getContentWidth(column, idx));
553
+ }
554
+ column.width = width;
555
+ grid.setColumns(grid.getColumns());
556
+ // TODO: raise column resize event
557
+ // TODO (2): find more performant way to refresh columns
558
+ }
559
+ function triggerAllFormulas() {
560
+ if (formulaObjects.length === 0) {
561
+ return;
562
+ }
563
+ for (let j = 0; j < formulaObjects.length; j++) {
564
+ for (let i = 0; i < data.length; i++) {
565
+ const val = formulaObjects[j].fnc(data[i], grid, formulaObjects[j].column);
566
+ data[i][formulaObjects[j].column] = val;
567
+ }
568
+ }
569
+ refreshData();
570
+ }
571
+ function columnHasFilter(columnId) {
572
+ for (let i = 0, l = (filters ? filters.length : 0); i < l; i++) {
573
+ if (filters[i].columnId === columnId) {
574
+ return true;
575
+ }
576
+ }
577
+ return false;
578
+ }
579
+ function refreshDataItem(item) {
580
+ const options = grid.getOptions();
581
+ dataView.updateItem(item[options.primaryKey], item);
582
+ // formula refresh
583
+ for (const f in formulas) {
584
+ if (formulas.hasOwnProperty(f)) {
585
+ triggerFormula(f, item);
586
+ }
587
+ }
588
+ grid.updateRow(dataView.getRowByItem(item));
589
+ }
590
+ function addFilter(filter, dontrefresh) {
591
+ let filterArray;
592
+ if (Array.isArray(filter)) {
593
+ filterArray = filter;
594
+ }
595
+ else {
596
+ filterArray = [filter];
597
+ }
598
+ for (let idx = 0; idx < filterArray.length; idx++) {
599
+ // add filter
600
+ filters.push(filterArray[idx]);
601
+ }
602
+ if (!dontrefresh) {
603
+ refreshFilters();
604
+ }
605
+ }
606
+ function setFilters(f, dontrefresh) {
607
+ filters = f;
608
+ if (!dontrefresh) {
609
+ refreshFilters();
610
+ }
611
+ }
612
+ function getFilters() {
613
+ return filters;
614
+ }
615
+ function clearFilter(columnId, dontrefresh) {
616
+ if (columnId === undefined) { // clear all filters
617
+ filters.length = 0;
618
+ }
619
+ else {
620
+ for (let i = 0; i < filters.length; i++) {
621
+ if (filters[i].columnId === columnId) {
622
+ filters.splice(i, 1);
623
+ i--;
624
+ }
625
+ }
626
+ }
627
+ if (!dontrefresh) {
628
+ refreshFilters();
629
+ }
630
+ }
631
+ function refreshFilters(noColumnHeaderRefresh) {
632
+ const options = grid.getOptions();
633
+ function client_filter(item, args) {
634
+ const filterArray = args;
635
+ // no filter present -> show all rows
636
+ if (filterArray.length === 0) {
637
+ return true;
638
+ }
639
+ if (filterArray.length === 1) {
640
+ return filterArray[0].match.call(null, item, filterArray[0].field);
641
+ }
642
+ else {
643
+ let result = true;
644
+ let i = 0;
645
+ while (i < filterArray.length) {
646
+ let orResult = false;
647
+ while (i < filterArray.length) { // combine or(s)
648
+ if (orResult || filterArray[i].match.call(null, item, filterArray[i].field)) {
649
+ orResult = true;
650
+ }
651
+ if (filterArray[i].combine !== "or") {
652
+ break;
653
+ }
654
+ else {
655
+ i++;
656
+ }
657
+ }
658
+ if (!orResult) {
659
+ result = false;
660
+ break;
661
+ }
662
+ i++;
663
+ }
664
+ return result;
665
+ }
666
+ }
667
+ if (options.mode === "client") {
668
+ dataView.setFilterArgs(filters);
669
+ dataView.setFilter(client_filter);
670
+ }
671
+ // redraw columns
672
+ if (!noColumnHeaderRefresh) {
673
+ grid.setColumns(grid.getColumns());
674
+ }
675
+ grid.onFiltersChanged.notify();
676
+ }
677
+ function getSelectedItems() {
678
+ const selRows = grid.getSelectedRows();
679
+ const rows = [];
680
+ for (let i = 0; i < selRows.length; i++) {
681
+ const rowIdx = selRows[i];
682
+ const toPush = dataView.getItem(rowIdx);
683
+ if (toPush !== undefined && !toPush.__group && !toPush.__groupTotals) {
684
+ rows.push(toPush);
685
+ }
686
+ }
687
+ return rows;
688
+ }
689
+ function getRowMoveManager() {
690
+ return rowMoveManager;
691
+ }
692
+ function getHeaderMenu() {
693
+ return headerMenu;
694
+ }
695
+ // function setHierachy(o: IGridTreeOptions): GridTree {
696
+ // return new GridTree(this, o);
697
+ // }
698
+ createMe();
699
+ return $.shallowExtend(grid, {
700
+ dataView,
701
+ setHeight,
702
+ getHeight,
703
+ sort,
704
+ refreshData,
705
+ setData,
706
+ getData,
707
+ refresh,
708
+ addFormula,
709
+ getFormattedValue,
710
+ getContentWidth,
711
+ fitToContent,
712
+ triggerAllFormulas,
713
+ columnHasFilter,
714
+ refreshDataItem,
715
+ addFilter,
716
+ setFilters,
717
+ getFilters,
718
+ clearFilter,
719
+ refreshFilters,
720
+ getSelectedItems,
721
+ getRowMoveManager,
722
+ getHeaderMenu,
723
+ refreshColumnGroups: CreateColumnGroups
724
+ // setHierachy
725
+ });
726
+ }