tabulator-tables 5.1.8 → 5.2.2

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 (100) hide show
  1. package/bower.json +1 -1
  2. package/dist/css/tabulator.css +64 -51
  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 +64 -51
  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 +64 -51
  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 +1580 -0
  15. package/dist/css/tabulator_bootstrap5.css.map +1 -0
  16. package/dist/css/tabulator_bootstrap5.min.css +2 -0
  17. package/dist/css/tabulator_bootstrap5.min.css.map +1 -0
  18. package/dist/css/tabulator_bulma.css +64 -51
  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 +64 -51
  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 +64 -51
  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 +64 -51
  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 +64 -51
  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 +64 -51
  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 +64 -51
  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 +2540 -1659
  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 +2743 -2067
  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 +1 -1
  55. package/src/js/core/FooterManager.js +6 -13
  56. package/src/js/core/Module.js +44 -2
  57. package/src/js/core/Tabulator.js +341 -289
  58. package/src/js/core/cell/Cell.js +9 -38
  59. package/src/js/core/column/Column.js +8 -44
  60. package/src/js/core/column/defaults/options.js +0 -2
  61. package/src/js/core/defaults/options.js +5 -2
  62. package/src/js/core/modules/optional.js +2 -0
  63. package/src/js/core/row/Row.js +127 -118
  64. package/src/js/core/tools/Alert.js +63 -0
  65. package/src/js/core/tools/DataLoader.js +12 -84
  66. package/src/js/core/tools/InteractionMonitor.js +1 -1
  67. package/src/js/core/tools/ModuleBinder.js +30 -23
  68. package/src/js/core/tools/Popup.js +251 -0
  69. package/src/js/modules/ColumnCalcs/ColumnCalcs.js +2 -2
  70. package/src/js/modules/Edit/Edit.js +5 -25
  71. package/src/js/modules/Edit/List.js +997 -0
  72. package/src/js/modules/Edit/defaults/editors/autocomplete.js +6 -446
  73. package/src/js/modules/Edit/defaults/editors/input.js +4 -0
  74. package/src/js/modules/Edit/defaults/editors/list.js +7 -0
  75. package/src/js/modules/Edit/defaults/editors/number.js +4 -0
  76. package/src/js/modules/Edit/defaults/editors/select.js +5 -585
  77. package/src/js/modules/Edit/defaults/editors/textarea.js +4 -0
  78. package/src/js/modules/Edit/defaults/editors/tickCross.js +17 -5
  79. package/src/js/modules/Edit/defaults/editors.js +2 -0
  80. package/src/js/modules/Filter/Filter.js +7 -4
  81. package/src/js/modules/Format/defaults/formatters/datetime.js +9 -1
  82. package/src/js/modules/Format/defaults/formatters/datetimediff.js +10 -3
  83. package/src/js/modules/Format/defaults/formatters/link.js +12 -1
  84. package/src/js/modules/Format/defaults/formatters/money.js +5 -3
  85. package/src/js/modules/Format/defaults/formatters/tickCross.js +2 -1
  86. package/src/js/modules/FrozenColumns/FrozenColumns.js +30 -8
  87. package/src/js/modules/HtmlTableImport/HtmlTableImport.js +5 -1
  88. package/src/js/modules/Menu/Menu.js +58 -158
  89. package/src/js/modules/Mutator/Mutator.js +20 -0
  90. package/src/js/modules/Page/Page.js +7 -3
  91. package/src/js/modules/Persistence/Persistence.js +1 -1
  92. package/src/js/modules/Popup/Popup.js +194 -0
  93. package/src/js/modules/ResizeColumns/ResizeColumns.js +139 -82
  94. package/src/js/modules/Sort/defaults/sorters/datetime.js +15 -2
  95. package/src/js/modules/Tooltip/Tooltip.js +132 -0
  96. package/src/js/modules/Validate/Validate.js +107 -71
  97. package/src/scss/tabulator.scss +354 -349
  98. package/src/scss/themes/bootstrap/functions5.scss +302 -0
  99. package/src/scss/themes/bootstrap/tabulator_bootstrap5.scss +546 -0
  100. package/src/scss/themes/bootstrap/variables5.scss +1641 -0
@@ -1,452 +1,12 @@
1
- import Helpers from '../../../../core/tools/Helpers.js';
2
- import maskInput from '../../inputMask.js';
1
+ import List from '../../List.js';
3
2
 
4
- //autocomplete
5
3
  export default function(cell, onRendered, success, cancel, editorParams){
6
- var self = this,
7
- cellEl = cell.getElement(),
8
- initialValue = cell.getValue(),
9
- vertNav = editorParams.verticalNavigation || "editor",
10
- initialDisplayValue = typeof initialValue !== "undefined" || initialValue === null ? initialValue : (typeof editorParams.defaultValue !== "undefined" ? editorParams.defaultValue : ""),
11
- input = document.createElement("input"),
12
- listEl = document.createElement("div"),
13
- allItems = [],
14
- displayItems = [],
15
- values = [],
16
- currentItem = false,
17
- blurable = true,
18
- uniqueColumnValues = false;
19
4
 
20
- //style input
21
- input.setAttribute("type", "search");
5
+ console.warn("The autocomplete editor has been deprecated, please use the new list editor with the 'autocomplete' editorParam");
22
6
 
23
- input.style.padding = "4px";
24
- input.style.width = "100%";
25
- input.style.boxSizing = "border-box";
7
+ editorParams.autocomplete = true;
26
8
 
27
- if(editorParams.elementAttributes && typeof editorParams.elementAttributes == "object"){
28
- for (let key in editorParams.elementAttributes){
29
- if(key.charAt(0) == "+"){
30
- key = key.slice(1);
31
- input.setAttribute(key, input.getAttribute(key) + editorParams.elementAttributes["+" + key]);
32
- }else{
33
- input.setAttribute(key, editorParams.elementAttributes[key]);
34
- }
35
- }
36
- }
9
+ var list = new List(this, cell, onRendered, success, cancel, editorParams);
37
10
 
38
- //style list element
39
- listEl.classList.add("tabulator-edit-select-list");
40
-
41
- listEl.addEventListener("mousedown", function(e){
42
- blurable = false;
43
-
44
- setTimeout(function(){
45
- blurable = true;
46
- }, 10);
47
- });
48
-
49
-
50
- function genUniqueColumnValues(){
51
- if(editorParams.values === true){
52
- uniqueColumnValues = getUniqueColumnValues();
53
- }else if(typeof editorParams.values === "string"){
54
- uniqueColumnValues = getUniqueColumnValues(editorParams.values);
55
- }
56
- }
57
-
58
- function getUniqueColumnValues(field){
59
- var output = {},
60
- data = self.table.getData(),
61
- column;
62
-
63
- if(field){
64
- column = self.table.columnManager.getColumnByField(field);
65
- }else{
66
- column = cell.getColumn()._getSelf();
67
- }
68
-
69
- if(column){
70
- data.forEach(function(row){
71
- var val = column.getFieldValue(row);
72
-
73
- if(val !== null && typeof val !== "undefined" && val !== ""){
74
- output[val] = true;
75
- }
76
- });
77
-
78
- if(editorParams.sortValuesList){
79
- if(editorParams.sortValuesList == "asc"){
80
- output = Object.keys(output).sort();
81
- }else{
82
- output = Object.keys(output).sort().reverse();
83
- }
84
- }else{
85
- output = Object.keys(output);
86
- }
87
- }else{
88
- console.warn("unable to find matching column to create autocomplete lookup list:", field);
89
- }
90
-
91
-
92
- return output;
93
- }
94
-
95
- function filterList(term, intialLoad){
96
- var matches = [],
97
- values, items, searchEl;
98
-
99
- //lookup base values list
100
- if(uniqueColumnValues){
101
- values = uniqueColumnValues;
102
- }else{
103
- values = editorParams.values || [];
104
- }
105
-
106
- if(editorParams.searchFunc){
107
- matches = editorParams.searchFunc(term, values);
108
-
109
- if(matches instanceof Promise){
110
-
111
- addNotice(typeof editorParams.searchingPlaceholder !== "undefined" ? editorParams.searchingPlaceholder : "Searching...");
112
-
113
- matches.then((result) => {
114
- fillListIfNotEmpty(parseItems(result), intialLoad);
115
- }).catch((err) => {
116
- console.err("error in autocomplete search promise:", err);
117
- });
118
-
119
- }else{
120
- fillListIfNotEmpty(parseItems(matches), intialLoad);
121
- }
122
- }else{
123
- items = parseItems(values);
124
-
125
- if(term === ""){
126
- if(editorParams.showListOnEmpty){
127
- matches = items;
128
- }
129
- }else{
130
- items.forEach(function(item){
131
- if(item.value !== null || typeof item.value !== "undefined"){
132
- if(String(item.value).toLowerCase().indexOf(String(term).toLowerCase()) > -1 || String(item.title).toLowerCase().indexOf(String(term).toLowerCase()) > -1){
133
- matches.push(item);
134
- }
135
- }
136
- });
137
- }
138
-
139
- fillListIfNotEmpty(matches, intialLoad);
140
- }
141
- }
142
-
143
- function addNotice(notice){
144
- var searchEl = document.createElement("div");
145
-
146
- clearList();
147
-
148
- if(notice !== false){
149
- searchEl.classList.add("tabulator-edit-select-list-notice");
150
- searchEl.tabIndex = 0;
151
-
152
- if(notice instanceof Node){
153
- searchEl.appendChild(notice);
154
- }else{
155
- searchEl.innerHTML = notice;
156
- }
157
-
158
- listEl.appendChild(searchEl);
159
- }
160
- }
161
-
162
- function parseItems(inputValues){
163
- var itemList = [];
164
-
165
- if(Array.isArray(inputValues)){
166
- inputValues.forEach(function(value){
167
-
168
- var item = {};
169
-
170
- if(typeof value === "object"){
171
- item.title = editorParams.listItemFormatter ? editorParams.listItemFormatter(value.value, value.label) : value.label;
172
- item.value = value.value;
173
- }else{
174
- item.title = editorParams.listItemFormatter ? editorParams.listItemFormatter(value, value) : value;
175
- item.value = value;
176
- }
177
-
178
- itemList.push(item);
179
- });
180
- }else{
181
- for(var key in inputValues){
182
- var item = {
183
- title:editorParams.listItemFormatter ? editorParams.listItemFormatter(key, inputValues[key]) : inputValues[key],
184
- value:key,
185
- };
186
-
187
- itemList.push(item);
188
- }
189
- }
190
-
191
- return itemList;
192
- }
193
-
194
- function clearList(){
195
- while(listEl.firstChild) listEl.removeChild(listEl.firstChild);
196
- }
197
-
198
- function fillListIfNotEmpty(items, intialLoad){
199
- if(items.length){
200
- fillList(items, intialLoad);
201
- }else{
202
- if(editorParams.emptyPlaceholder){
203
- addNotice(editorParams.emptyPlaceholder);
204
- }
205
- }
206
- }
207
-
208
- function fillList(items, intialLoad){
209
- var current = false;
210
-
211
- clearList();
212
-
213
- displayItems = items;
214
-
215
- displayItems.forEach(function(item){
216
- var el = item.element;
217
-
218
- if(!el){
219
- el = document.createElement("div");
220
- el.classList.add("tabulator-edit-select-list-item");
221
- el.tabIndex = 0;
222
- el.innerHTML = item.title;
223
-
224
- el.addEventListener("click", function(e){
225
- setCurrentItem(item);
226
- chooseItem();
227
- });
228
-
229
- el.addEventListener("mousedown", function(e){
230
- blurable = false;
231
-
232
- setTimeout(function(){
233
- blurable = true;
234
- }, 10);
235
- });
236
-
237
- item.element = el;
238
-
239
- if(intialLoad && item.value == initialValue){
240
- input.value = item.title;
241
- item.element.classList.add("active");
242
- current = true;
243
- }
244
-
245
- if(item === currentItem){
246
- item.element.classList.add("active");
247
- current = true;
248
- }
249
- }
250
-
251
- listEl.appendChild(el);
252
- });
253
-
254
- if(!current){
255
- setCurrentItem(false);
256
- }
257
- }
258
-
259
- function chooseItem(){
260
- hideList();
261
-
262
- if(currentItem){
263
- if(initialValue !== currentItem.value){
264
- initialValue = currentItem.value;
265
- input.value = currentItem.title;
266
- success(currentItem.value);
267
- }else{
268
- cancel();
269
- }
270
- }else{
271
- if(editorParams.freetext){
272
- initialValue = input.value;
273
- success(input.value);
274
- }else{
275
- if(editorParams.allowEmpty && input.value === ""){
276
- initialValue = input.value;
277
- success(input.value);
278
- }else{
279
- cancel();
280
- }
281
- }
282
- }
283
- }
284
-
285
- function showList(){
286
- if(!listEl.parentNode){
287
- while(listEl.firstChild) listEl.removeChild(listEl.firstChild);
288
-
289
- var offset = Helpers.elOffset(cellEl);
290
-
291
- listEl.style.minWidth = cellEl.offsetWidth + "px";
292
-
293
- listEl.style.top = (offset.top + cellEl.offsetHeight) + "px";
294
- listEl.style.left = offset.left + "px";
295
- document.body.appendChild(listEl);
296
- }
297
- }
298
-
299
- function setCurrentItem(item, showInputValue){
300
- if(currentItem && currentItem.element){
301
- currentItem.element.classList.remove("active");
302
- }
303
-
304
- currentItem = item;
305
-
306
- if(item && item.element){
307
- item.element.classList.add("active");
308
- }
309
-
310
- if(item && item.element && item.element.scrollIntoView){
311
- item.element.scrollIntoView({behavior: 'smooth', block: 'nearest', inline: 'start'});
312
- }
313
- }
314
-
315
- function hideList(){
316
- if(listEl.parentNode){
317
- listEl.parentNode.removeChild(listEl);
318
- }
319
-
320
- removeScrollListener();
321
- }
322
-
323
-
324
- function cancelItem(){
325
- hideList();
326
- cancel();
327
- }
328
-
329
- function removeScrollListener() {
330
- self.table.rowManager.element.removeEventListener("scroll", cancelItem);
331
- }
332
-
333
- //allow key based navigation
334
- input.addEventListener("keydown", function(e){
335
- var index;
336
-
337
- switch(e.keyCode){
338
- case 38: //up arrow
339
- index = displayItems.indexOf(currentItem);
340
-
341
- if(vertNav == "editor" || (vertNav == "hybrid" && index)){
342
- e.stopImmediatePropagation();
343
- e.stopPropagation();
344
- e.preventDefault();
345
-
346
- if(index > 0){
347
- setCurrentItem(displayItems[index - 1]);
348
- }else{
349
- setCurrentItem(false);
350
- }
351
- }
352
- break;
353
-
354
- case 40: //down arrow
355
-
356
- index = displayItems.indexOf(currentItem);
357
-
358
- if(vertNav == "editor" || (vertNav == "hybrid" && index < displayItems.length - 1)){
359
-
360
- e.stopImmediatePropagation();
361
- e.stopPropagation();
362
- e.preventDefault();
363
-
364
- if(index < displayItems.length - 1){
365
- if(index == -1){
366
- setCurrentItem(displayItems[0]);
367
- }else{
368
- setCurrentItem(displayItems[index + 1]);
369
- }
370
- }
371
- }
372
- break;
373
-
374
-
375
- case 37: //left arrow
376
- case 39: //right arrow
377
- e.stopImmediatePropagation();
378
- e.stopPropagation();
379
- // e.preventDefault();
380
- break;
381
-
382
- case 13: //enter
383
- chooseItem();
384
- break;
385
-
386
- case 27: //escape
387
- cancelItem();
388
- break;
389
-
390
- case 36: //home
391
- case 35: //end
392
- //prevent table navigation while using input element
393
- e.stopImmediatePropagation();
394
- break;
395
- }
396
- });
397
-
398
- input.addEventListener("keyup", function(e){
399
-
400
- switch(e.keyCode){
401
- case 38: //up arrow
402
- case 37: //left arrow
403
- case 39: //up arrow
404
- case 40: //right arrow
405
- case 13: //enter
406
- case 27: //escape
407
- break;
408
-
409
- default:
410
- filterList(input.value);
411
- }
412
-
413
- });
414
-
415
- input.addEventListener("search", function(e){
416
- filterList(input.value);
417
- });
418
-
419
- input.addEventListener("blur", function(e){
420
- if(blurable){
421
- chooseItem();
422
- }
423
- });
424
-
425
- input.addEventListener("focus", function(e){
426
- var value = initialDisplayValue;
427
- genUniqueColumnValues();
428
- showList();
429
- input.value = value;
430
- filterList(value, true);
431
- });
432
-
433
-
434
- onRendered(function(){
435
- input.style.height = "100%";
436
- input.focus({preventScroll: true});
437
- });
438
-
439
- if(editorParams.mask){
440
- maskInput(input, editorParams);
441
- }
442
-
443
- setTimeout(() => {
444
- this.table.rowManager.element.addEventListener("scroll", cancelItem);
445
- }, 10);
446
-
447
- genUniqueColumnValues();
448
- input.value = initialDisplayValue;
449
- filterList(initialDisplayValue, true);
450
-
451
- return input;
452
- };
11
+ return list.input;
12
+ }
@@ -28,6 +28,10 @@ export default function(cell, onRendered, success, cancel, editorParams){
28
28
  onRendered(function(){
29
29
  input.focus({preventScroll: true});
30
30
  input.style.height = "100%";
31
+
32
+ if(editorParams.selectContents){
33
+ input.select();
34
+ }
31
35
  });
32
36
 
33
37
  function onChange(e){
@@ -0,0 +1,7 @@
1
+ import List from '../../List.js';
2
+
3
+ export default function(cell, onRendered, success, cancel, editorParams){
4
+ var list = new List(this, cell, onRendered, success, cancel, editorParams);
5
+
6
+ return list.input;
7
+ }
@@ -51,6 +51,10 @@ export default function(cell, onRendered, success, cancel, editorParams){
51
51
 
52
52
  //submit new value on blur
53
53
  input.addEventListener("blur", blurFunc);
54
+
55
+ if(editorParams.selectContents){
56
+ input.select();
57
+ }
54
58
  });
55
59
 
56
60
  function onChange(){