tabulator-tables 5.5.4 → 5.6.1

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 (101) hide show
  1. package/bower.json +1 -1
  2. package/dist/css/tabulator.css +72 -2
  3. package/dist/css/tabulator.css.map +1 -1
  4. package/dist/css/tabulator.min.css +1 -1
  5. package/dist/css/tabulator.min.css.map +1 -1
  6. package/dist/css/tabulator_bootstrap3.css +72 -2
  7. package/dist/css/tabulator_bootstrap3.css.map +1 -1
  8. package/dist/css/tabulator_bootstrap3.min.css +1 -1
  9. package/dist/css/tabulator_bootstrap3.min.css.map +1 -1
  10. package/dist/css/tabulator_bootstrap4.css +72 -2
  11. package/dist/css/tabulator_bootstrap4.css.map +1 -1
  12. package/dist/css/tabulator_bootstrap4.min.css +1 -1
  13. package/dist/css/tabulator_bootstrap4.min.css.map +1 -1
  14. package/dist/css/tabulator_bootstrap5.css +72 -2
  15. package/dist/css/tabulator_bootstrap5.css.map +1 -1
  16. package/dist/css/tabulator_bootstrap5.min.css +1 -1
  17. package/dist/css/tabulator_bootstrap5.min.css.map +1 -1
  18. package/dist/css/tabulator_bulma.css +72 -2
  19. package/dist/css/tabulator_bulma.css.map +1 -1
  20. package/dist/css/tabulator_bulma.min.css +1 -1
  21. package/dist/css/tabulator_bulma.min.css.map +1 -1
  22. package/dist/css/tabulator_materialize.css +72 -2
  23. package/dist/css/tabulator_materialize.css.map +1 -1
  24. package/dist/css/tabulator_materialize.min.css +1 -1
  25. package/dist/css/tabulator_materialize.min.css.map +1 -1
  26. package/dist/css/tabulator_midnight.css +72 -2
  27. package/dist/css/tabulator_midnight.css.map +1 -1
  28. package/dist/css/tabulator_midnight.min.css +1 -1
  29. package/dist/css/tabulator_midnight.min.css.map +1 -1
  30. package/dist/css/tabulator_modern.css +72 -2
  31. package/dist/css/tabulator_modern.css.map +1 -1
  32. package/dist/css/tabulator_modern.min.css +1 -1
  33. package/dist/css/tabulator_modern.min.css.map +1 -1
  34. package/dist/css/tabulator_semanticui.css +72 -2
  35. package/dist/css/tabulator_semanticui.css.map +1 -1
  36. package/dist/css/tabulator_semanticui.min.css +1 -1
  37. package/dist/css/tabulator_semanticui.min.css.map +1 -1
  38. package/dist/css/tabulator_simple.css +72 -2
  39. package/dist/css/tabulator_simple.css.map +1 -1
  40. package/dist/css/tabulator_simple.min.css +1 -1
  41. package/dist/css/tabulator_simple.min.css.map +1 -1
  42. package/dist/css/tabulator_site.css +74 -4
  43. package/dist/css/tabulator_site.css.map +1 -1
  44. package/dist/css/tabulator_site.min.css +1 -1
  45. package/dist/css/tabulator_site.min.css.map +1 -1
  46. package/dist/js/tabulator.js +1868 -245
  47. package/dist/js/tabulator.js.map +1 -1
  48. package/dist/js/tabulator.min.js +2 -2
  49. package/dist/js/tabulator.min.js.map +1 -1
  50. package/dist/js/tabulator_esm.js +1948 -323
  51. package/dist/js/tabulator_esm.js.map +1 -1
  52. package/dist/js/tabulator_esm.min.js +2 -2
  53. package/dist/js/tabulator_esm.min.js.map +1 -1
  54. package/package.json +2 -2
  55. package/src/js/core/ColumnManager.js +4 -0
  56. package/src/js/core/CoreFeature.js +2 -2
  57. package/src/js/core/RowManager.js +12 -6
  58. package/src/js/core/Tabulator.js +2 -1
  59. package/src/js/core/TabulatorFull.js +1 -1
  60. package/src/js/core/column/Column.js +10 -0
  61. package/src/js/core/modules/optional.js +2 -1
  62. package/src/js/core/rendering/renderers/BasicVertical.js +4 -2
  63. package/src/js/core/rendering/renderers/VirtualDomHorizontal.js +1 -1
  64. package/src/js/core/row/PseudoRow.js +2 -0
  65. package/src/js/core/tools/Alert.js +4 -0
  66. package/src/js/core/tools/DeprecationAdvisor.js +5 -1
  67. package/src/js/core/tools/Helpers.js +1 -1
  68. package/src/js/core/tools/InteractionMonitor.js +3 -3
  69. package/src/js/modules/Clipboard/Clipboard.js +5 -3
  70. package/src/js/modules/Clipboard/defaults/pasteActions.js +49 -6
  71. package/src/js/modules/Clipboard/defaults/pasteParsers.js +69 -14
  72. package/src/js/modules/ColumnCalcs/ColumnCalcs.js +7 -1
  73. package/src/js/modules/Edit/Edit.js +71 -25
  74. package/src/js/modules/Edit/defaults/editors/datetime.js +1 -1
  75. package/src/js/modules/Edit/defaults/editors/time.js +3 -1
  76. package/src/js/modules/Export/Export.js +38 -18
  77. package/src/js/modules/Format/defaults/formatters/rowSelection.js +2 -2
  78. package/src/js/modules/Format/defaults/formatters/rownum.js +5 -1
  79. package/src/js/modules/FrozenColumns/FrozenColumns.js +11 -11
  80. package/src/js/modules/FrozenRows/FrozenRows.js +6 -1
  81. package/src/js/modules/History/History.js +2 -2
  82. package/src/js/modules/History/defaults/redoers.js +4 -0
  83. package/src/js/modules/History/defaults/undoers.js +4 -0
  84. package/src/js/modules/Keybindings/defaults/actions.js +38 -1
  85. package/src/js/modules/Keybindings/defaults/bindings.js +16 -1
  86. package/src/js/modules/Menu/Menu.js +3 -1
  87. package/src/js/modules/MoveColumns/MoveColumns.js +5 -0
  88. package/src/js/modules/Popup/Popup.js +1 -1
  89. package/src/js/modules/ResizeTable/ResizeTable.js +3 -3
  90. package/src/js/modules/SelectRange/Range.js +354 -0
  91. package/src/js/modules/SelectRange/RangeComponent.js +93 -0
  92. package/src/js/modules/SelectRange/SelectRange.js +870 -0
  93. package/src/js/modules/SelectRow/SelectRow.js +46 -26
  94. package/src/js/modules/Sort/Sort.js +111 -105
  95. package/src/js/modules/Validate/defaults/validators.js +11 -0
  96. package/src/scss/tabulator.scss +95 -13
  97. package/src/scss/themes/bulma/tabulator_bulma.scss +7 -0
  98. package/src/scss/themes/materialize/tabulator_materialize.scss +7 -1
  99. package/src/scss/themes/tabulator_midnight.scss +13 -0
  100. package/src/scss/themes/tabulator_modern.scss +9 -0
  101. package/src/scss/themes/tabulator_site.scss +13 -2
@@ -3,90 +3,90 @@ import Module from '../../core/Module.js';
3
3
  import defaultSorters from './defaults/sorters.js';
4
4
 
5
5
  class Sort extends Module{
6
-
6
+
7
7
  constructor(table){
8
8
  super(table);
9
-
9
+
10
10
  this.sortList = []; //holder current sort
11
11
  this.changed = false; //has the sort changed since last render
12
-
12
+
13
13
  this.registerTableOption("sortMode", "local"); //local or remote sorting
14
-
14
+
15
15
  this.registerTableOption("initialSort", false); //initial sorting criteria
16
16
  this.registerTableOption("columnHeaderSortMulti", true); //multiple or single column sorting
17
17
  this.registerTableOption("sortOrderReverse", false); //reverse internal sort ordering
18
18
  this.registerTableOption("headerSortElement", "<div class='tabulator-arrow'></div>"); //header sort element
19
19
  this.registerTableOption("headerSortClickElement", "header"); //element which triggers sort when clicked
20
-
20
+
21
21
  this.registerColumnOption("sorter");
22
22
  this.registerColumnOption("sorterParams");
23
-
23
+
24
24
  this.registerColumnOption("headerSort", true);
25
25
  this.registerColumnOption("headerSortStartingDir");
26
26
  this.registerColumnOption("headerSortTristate");
27
-
27
+
28
28
  }
29
-
29
+
30
30
  initialize(){
31
31
  this.subscribe("column-layout", this.initializeColumn.bind(this));
32
32
  this.subscribe("table-built", this.tableBuilt.bind(this));
33
33
  this.registerDataHandler(this.sort.bind(this), 20);
34
-
34
+
35
35
  this.registerTableFunction("setSort", this.userSetSort.bind(this));
36
36
  this.registerTableFunction("getSorters", this.getSort.bind(this));
37
37
  this.registerTableFunction("clearSort", this.clearSort.bind(this));
38
-
38
+
39
39
  if(this.table.options.sortMode === "remote"){
40
40
  this.subscribe("data-params", this.remoteSortParams.bind(this));
41
41
  }
42
42
  }
43
-
43
+
44
44
  tableBuilt(){
45
45
  if(this.table.options.initialSort){
46
46
  this.setSort(this.table.options.initialSort);
47
47
  }
48
48
  }
49
-
49
+
50
50
  remoteSortParams(data, config, silent, params){
51
51
  var sorters = this.getSort();
52
-
52
+
53
53
  sorters.forEach((item) => {
54
54
  delete item.column;
55
55
  });
56
-
56
+
57
57
  params.sort = sorters;
58
-
58
+
59
59
  return params;
60
60
  }
61
-
62
-
61
+
62
+
63
63
  ///////////////////////////////////
64
64
  ///////// Table Functions /////////
65
65
  ///////////////////////////////////
66
-
66
+
67
67
  userSetSort(sortList, dir){
68
68
  this.setSort(sortList, dir);
69
69
  // this.table.rowManager.sorterRefresh();
70
70
  this.refreshSort();
71
71
  }
72
-
72
+
73
73
  clearSort(){
74
74
  this.clear();
75
75
  // this.table.rowManager.sorterRefresh();
76
76
  this.refreshSort();
77
77
  }
78
-
79
-
78
+
79
+
80
80
  ///////////////////////////////////
81
81
  ///////// Internal Logic //////////
82
82
  ///////////////////////////////////
83
-
83
+
84
84
  //initialize column header for sorting
85
85
  initializeColumn(column){
86
86
  var sorter = false,
87
87
  colEl,
88
88
  arrowEl;
89
-
89
+
90
90
  switch(typeof column.definition.sorter){
91
91
  case "string":
92
92
  if(Sort.sorters[column.definition.sorter]){
@@ -95,28 +95,28 @@ class Sort extends Module{
95
95
  console.warn("Sort Error - No such sorter found: ", column.definition.sorter);
96
96
  }
97
97
  break;
98
-
98
+
99
99
  case "function":
100
100
  sorter = column.definition.sorter;
101
101
  break;
102
102
  }
103
-
103
+
104
104
  column.modules.sort = {
105
105
  sorter:sorter, dir:"none",
106
106
  params:column.definition.sorterParams || {},
107
107
  startingDir:column.definition.headerSortStartingDir || "asc",
108
108
  tristate: column.definition.headerSortTristate,
109
109
  };
110
-
110
+
111
111
  if(column.definition.headerSort !== false){
112
-
112
+
113
113
  colEl = column.getElement();
114
-
114
+
115
115
  colEl.classList.add("tabulator-sortable");
116
-
116
+
117
117
  arrowEl = document.createElement("div");
118
118
  arrowEl.classList.add("tabulator-col-sorter");
119
-
119
+
120
120
  switch(this.table.options.headerSortClickElement){
121
121
  case "icon":
122
122
  arrowEl.classList.add("tabulator-col-sorter-element");
@@ -128,33 +128,39 @@ class Sort extends Module{
128
128
  colEl.classList.add("tabulator-col-sorter-element");
129
129
  break;
130
130
  }
131
-
131
+
132
132
  switch(this.table.options.headerSortElement){
133
133
  case "function":
134
- //do nothing
134
+ //do nothing
135
135
  break;
136
-
136
+
137
137
  case "object":
138
138
  arrowEl.appendChild(this.table.options.headerSortElement);
139
139
  break;
140
-
140
+
141
141
  default:
142
142
  arrowEl.innerHTML = this.table.options.headerSortElement;
143
143
  }
144
-
144
+
145
145
  //create sorter arrow
146
146
  column.titleHolderElement.appendChild(arrowEl);
147
-
147
+
148
148
  column.modules.sort.element = arrowEl;
149
-
149
+
150
150
  this.setColumnHeaderSortIcon(column, "none");
151
-
151
+
152
+ if(this.table.options.headerSortClickElement === "icon"){
153
+ arrowEl.addEventListener("mousedown", (e) => {
154
+ e.stopPropagation();
155
+ });
156
+ }
157
+
152
158
  //sort on click
153
159
  (this.table.options.headerSortClickElement === "icon" ? arrowEl : colEl).addEventListener("click", (e) => {
154
160
  var dir = "",
155
161
  sorters=[],
156
162
  match = false;
157
-
163
+
158
164
  if(column.modules.sort){
159
165
  if(column.modules.sort.tristate){
160
166
  if(column.modules.sort.dir == "none"){
@@ -171,26 +177,26 @@ class Sort extends Module{
171
177
  case "asc":
172
178
  dir = "desc";
173
179
  break;
174
-
180
+
175
181
  case "desc":
176
182
  dir = "asc";
177
183
  break;
178
-
184
+
179
185
  default:
180
186
  dir = column.modules.sort.startingDir;
181
187
  }
182
188
  }
183
-
189
+
184
190
  if (this.table.options.columnHeaderSortMulti && (e.shiftKey || e.ctrlKey)) {
185
191
  sorters = this.getSort();
186
-
192
+
187
193
  match = sorters.findIndex((sorter) => {
188
194
  return sorter.field === column.getField();
189
195
  });
190
-
196
+
191
197
  if(match > -1){
192
198
  sorters[match].dir = dir;
193
-
199
+
194
200
  match = sorters.splice(match, 1)[0];
195
201
  if(dir != "none"){
196
202
  sorters.push(match);
@@ -200,7 +206,7 @@ class Sort extends Module{
200
206
  sorters.push({column:column, dir:dir});
201
207
  }
202
208
  }
203
-
209
+
204
210
  //add to existing sort
205
211
  this.setSort(sorters);
206
212
  }else{
@@ -210,63 +216,63 @@ class Sort extends Module{
210
216
  //sort by column only
211
217
  this.setSort(column, dir);
212
218
  }
213
-
219
+
214
220
  }
215
-
221
+
216
222
  // this.table.rowManager.sorterRefresh(!this.sortList.length);
217
223
  this.refreshSort();
218
224
  }
219
225
  });
220
226
  }
221
227
  }
222
-
228
+
223
229
  refreshSort(){
224
230
  if(this.table.options.sortMode === "remote"){
225
231
  this.reloadData(null, false, false);
226
232
  }else{
227
233
  this.refreshData(true);
228
234
  }
229
-
235
+
230
236
  //TODO - Persist left position of row manager
231
237
  // left = this.scrollLeft;
232
238
  // this.scrollHorizontal(left);
233
239
  }
234
-
240
+
235
241
  //check if the sorters have changed since last use
236
242
  hasChanged(){
237
243
  var changed = this.changed;
238
244
  this.changed = false;
239
245
  return changed;
240
246
  }
241
-
247
+
242
248
  //return current sorters
243
249
  getSort(){
244
250
  var self = this,
245
251
  sorters = [];
246
-
252
+
247
253
  self.sortList.forEach(function(item){
248
254
  if(item.column){
249
255
  sorters.push({column:item.column.getComponent(), field:item.column.getField(), dir:item.dir});
250
256
  }
251
257
  });
252
-
258
+
253
259
  return sorters;
254
260
  }
255
-
261
+
256
262
  //change sort list and trigger sort
257
263
  setSort(sortList, dir){
258
264
  var self = this,
259
265
  newSortList = [];
260
-
266
+
261
267
  if(!Array.isArray(sortList)){
262
268
  sortList = [{column: sortList, dir:dir}];
263
269
  }
264
-
270
+
265
271
  sortList.forEach(function(item){
266
272
  var column;
267
-
273
+
268
274
  column = self.table.columnManager.findColumn(item.column);
269
-
275
+
270
276
  if(column){
271
277
  item.column = column;
272
278
  newSortList.push(item);
@@ -274,42 +280,42 @@ class Sort extends Module{
274
280
  }else{
275
281
  console.warn("Sort Warning - Sort field does not exist and is being ignored: ", item.column);
276
282
  }
277
-
283
+
278
284
  });
279
-
285
+
280
286
  self.sortList = newSortList;
281
-
287
+
282
288
  this.dispatch("sort-changed");
283
289
  }
284
-
290
+
285
291
  //clear sorters
286
292
  clear(){
287
293
  this.setSort([]);
288
294
  }
289
-
295
+
290
296
  //find appropriate sorter for column
291
297
  findSorter(column){
292
298
  var row = this.table.rowManager.activeRows[0],
293
299
  sorter = "string",
294
300
  field, value;
295
-
301
+
296
302
  if(row){
297
303
  row = row.getData();
298
304
  field = column.getField();
299
-
305
+
300
306
  if(field){
301
-
307
+
302
308
  value = column.getFieldValue(row);
303
-
309
+
304
310
  switch(typeof value){
305
311
  case "undefined":
306
312
  sorter = "string";
307
313
  break;
308
-
314
+
309
315
  case "boolean":
310
316
  sorter = "boolean";
311
317
  break;
312
-
318
+
313
319
  default:
314
320
  if(!isNaN(value) && value !== ""){
315
321
  sorter = "number";
@@ -322,70 +328,70 @@ class Sort extends Module{
322
328
  }
323
329
  }
324
330
  }
325
-
331
+
326
332
  return Sort.sorters[sorter];
327
333
  }
328
-
334
+
329
335
  //work through sort list sorting data
330
336
  sort(data){
331
337
  var self = this,
332
338
  sortList = this.table.options.sortOrderReverse ? self.sortList.slice().reverse() : self.sortList,
333
339
  sortListActual = [],
334
340
  rowComponents = [];
335
-
341
+
336
342
  if(this.subscribedExternal("dataSorting")){
337
343
  this.dispatchExternal("dataSorting", self.getSort());
338
344
  }
339
-
345
+
340
346
  self.clearColumnHeaders();
341
-
347
+
342
348
  if(this.table.options.sortMode !== "remote"){
343
-
349
+
344
350
  //build list of valid sorters and trigger column specific callbacks before sort begins
345
351
  sortList.forEach(function(item, i){
346
352
  var sortObj;
347
-
353
+
348
354
  if(item.column){
349
355
  sortObj = item.column.modules.sort;
350
-
356
+
351
357
  if(sortObj){
352
-
358
+
353
359
  //if no sorter has been defined, take a guess
354
360
  if(!sortObj.sorter){
355
361
  sortObj.sorter = self.findSorter(item.column);
356
362
  }
357
-
363
+
358
364
  item.params = typeof sortObj.params === "function" ? sortObj.params(item.column.getComponent(), item.dir) : sortObj.params;
359
-
365
+
360
366
  sortListActual.push(item);
361
367
  }
362
-
368
+
363
369
  self.setColumnHeader(item.column, item.dir);
364
370
  }
365
371
  });
366
-
372
+
367
373
  //sort data
368
374
  if (sortListActual.length) {
369
375
  self._sortItems(data, sortListActual);
370
376
  }
371
-
377
+
372
378
  }else{
373
379
  sortList.forEach(function(item, i){
374
380
  self.setColumnHeader(item.column, item.dir);
375
381
  });
376
382
  }
377
-
383
+
378
384
  if(this.subscribedExternal("dataSorted")){
379
385
  data.forEach((row) => {
380
386
  rowComponents.push(row.getComponent());
381
387
  });
382
-
388
+
383
389
  this.dispatchExternal("dataSorted", self.getSort(), rowComponents);
384
390
  }
385
-
391
+
386
392
  return data;
387
393
  }
388
-
394
+
389
395
  //clear sort arrows on columns
390
396
  clearColumnHeaders(){
391
397
  this.table.columnManager.getRealColumns().forEach((column) => {
@@ -396,21 +402,21 @@ class Sort extends Module{
396
402
  }
397
403
  });
398
404
  }
399
-
405
+
400
406
  //set the column header sort direction
401
407
  setColumnHeader(column, dir){
402
408
  column.modules.sort.dir = dir;
403
409
  column.getElement().setAttribute("aria-sort", dir === "asc" ? "ascending" : "descending");
404
410
  this.setColumnHeaderSortIcon(column, dir);
405
411
  }
406
-
412
+
407
413
  setColumnHeaderSortIcon(column, dir){
408
414
  var sortEl = column.modules.sort.element,
409
415
  arrowEl;
410
-
416
+
411
417
  if(column.definition.headerSort && typeof this.table.options.headerSortElement === "function"){
412
418
  while(sortEl.firstChild) sortEl.removeChild(sortEl.firstChild);
413
-
419
+
414
420
  arrowEl = this.table.options.headerSortElement.call(this.table, column.getComponent(), dir);
415
421
 
416
422
  if(typeof arrowEl === "object"){
@@ -420,45 +426,45 @@ class Sort extends Module{
420
426
  }
421
427
  }
422
428
  }
423
-
429
+
424
430
  //sort each item in sort list
425
431
  _sortItems(data, sortList){
426
432
  var sorterCount = sortList.length - 1;
427
-
433
+
428
434
  data.sort((a, b) => {
429
435
  var result;
430
-
436
+
431
437
  for(var i = sorterCount; i>= 0; i--){
432
438
  let sortItem = sortList[i];
433
-
439
+
434
440
  result = this._sortRow(a, b, sortItem.column, sortItem.dir, sortItem.params);
435
-
441
+
436
442
  if(result !== 0){
437
443
  break;
438
444
  }
439
445
  }
440
-
446
+
441
447
  return result;
442
448
  });
443
449
  }
444
-
450
+
445
451
  //process individual rows for a sort function on active data
446
452
  _sortRow(a, b, column, dir, params){
447
453
  var el1Comp, el2Comp;
448
-
454
+
449
455
  //switch elements depending on search direction
450
456
  var el1 = dir == "asc" ? a : b;
451
457
  var el2 = dir == "asc" ? b : a;
452
-
458
+
453
459
  a = column.getFieldValue(el1.getData());
454
460
  b = column.getFieldValue(el2.getData());
455
-
461
+
456
462
  a = typeof a !== "undefined" ? a : "";
457
463
  b = typeof b !== "undefined" ? b : "";
458
-
464
+
459
465
  el1Comp = el1.getComponent();
460
466
  el2Comp = el2.getComponent();
461
-
467
+
462
468
  return column.modules.sort.sorter.call(this, a, b, el1Comp, el2Comp, column.getComponent(), dir, params);
463
469
  }
464
470
  }
@@ -468,4 +474,4 @@ Sort.moduleName = "sort";
468
474
  //load defaults
469
475
  Sort.sorters = defaultSorters;
470
476
 
471
- export default Sort;
477
+ export default Sort;
@@ -37,6 +37,17 @@ export default {
37
37
  return isNaN(value);
38
38
  },
39
39
 
40
+ //must be alphanumeric
41
+ alphanumeric: function(cell, value, parameters){
42
+ if(value === "" || value === null || typeof value === "undefined"){
43
+ return true;
44
+ }
45
+
46
+ var reg = new RegExp(/^[a-z0-9]+$/i);
47
+
48
+ return reg.test(value);
49
+ },
50
+
40
51
  //maximum value
41
52
  max: function(cell, value, parameters){
42
53
  if(value === "" || value === null || typeof value === "undefined"){