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
@@ -24,6 +24,8 @@ class Edit extends Module{
24
24
  this.registerColumnOption("cellEdited");
25
25
  this.registerColumnOption("cellEditCancelled");
26
26
 
27
+ this.registerTableOption("editTriggerEvent", "focus");
28
+
27
29
  this.registerTableFunction("getEditedCells", this.getEditedCells.bind(this));
28
30
  this.registerTableFunction("clearCellEdited", this.clearCellEdited.bind(this));
29
31
  this.registerTableFunction("navigatePrev", this.navigatePrev.bind(this));
@@ -55,16 +57,30 @@ class Edit extends Module{
55
57
  this.subscribe("row-deleting", this.rowDeleteCheck.bind(this));
56
58
  this.subscribe("row-layout", this.rowEditableCheck.bind(this));
57
59
  this.subscribe("data-refreshing", this.cancelEdit.bind(this));
60
+ this.subscribe("clipboard-paste", this.pasteBlocker.bind(this));
58
61
 
59
62
  this.subscribe("keybinding-nav-prev", this.navigatePrev.bind(this, undefined));
60
63
  this.subscribe("keybinding-nav-next", this.keybindingNavigateNext.bind(this));
61
- this.subscribe("keybinding-nav-left", this.navigateLeft.bind(this, undefined));
62
- this.subscribe("keybinding-nav-right", this.navigateRight.bind(this, undefined));
64
+
65
+
66
+ // this.subscribe("keybinding-nav-left", this.navigateLeft.bind(this, undefined));
67
+ // this.subscribe("keybinding-nav-right", this.navigateRight.bind(this, undefined));
63
68
  this.subscribe("keybinding-nav-up", this.navigateUp.bind(this, undefined));
64
69
  this.subscribe("keybinding-nav-down", this.navigateDown.bind(this, undefined));
65
70
  }
66
71
 
67
72
 
73
+ ///////////////////////////////////
74
+ ///////// Paste Negation //////////
75
+ ///////////////////////////////////
76
+
77
+ pasteBlocker(e){
78
+ if(this.currentCell){
79
+ return true;
80
+ }
81
+ }
82
+
83
+
68
84
  ///////////////////////////////////
69
85
  ////// Keybinding Functions ///////
70
86
  ///////////////////////////////////
@@ -72,7 +88,7 @@ class Edit extends Module{
72
88
  keybindingNavigateNext(e){
73
89
  var cell = this.currentCell,
74
90
  newRow = this.options("tabEndNewRow");
75
-
91
+
76
92
  if(cell){
77
93
  if(!this.navigateNext(cell, e)){
78
94
  if(newRow){
@@ -461,12 +477,6 @@ class Edit extends Module{
461
477
  this.updateCellClass(cell);
462
478
  element.setAttribute("tabindex", 0);
463
479
 
464
- element.addEventListener("click", function(e){
465
- if(!element.classList.contains("tabulator-editing")){
466
- element.focus({preventScroll: true});
467
- }
468
- });
469
-
470
480
  element.addEventListener("mousedown", function(e){
471
481
  if (e.button === 2) {
472
482
  e.preventDefault();
@@ -474,12 +484,33 @@ class Edit extends Module{
474
484
  self.mouseClick = true;
475
485
  }
476
486
  });
487
+
488
+ if(this.options("editTriggerEvent") === "dblclick"){
489
+ element.addEventListener("dblclick", function(e){
490
+ if(!element.classList.contains("tabulator-editing")){
491
+ element.focus({preventScroll: true});
492
+ self.edit(cell, e, false);
493
+ }
494
+ });
495
+ }
477
496
 
478
- element.addEventListener("focus", function(e){
479
- if(!self.recursionBlock){
480
- self.edit(cell, e, false);
481
- }
482
- });
497
+
498
+ if(this.options("editTriggerEvent") === "focus" || this.options("editTriggerEvent") === "click"){
499
+ element.addEventListener("click", function(e){
500
+ if(!element.classList.contains("tabulator-editing")){
501
+ element.focus({preventScroll: true});
502
+ self.edit(cell, e, false);
503
+ }
504
+ });
505
+ }
506
+
507
+ if(this.options("editTriggerEvent") === "focus"){
508
+ element.addEventListener("focus", function(e){
509
+ if(!self.recursionBlock){
510
+ self.edit(cell, e, false);
511
+ }
512
+ });
513
+ }
483
514
  }
484
515
  }
485
516
 
@@ -565,8 +596,9 @@ class Edit extends Module{
565
596
  allowEdit = true,
566
597
  rendered = function(){},
567
598
  element = cell.getElement(),
599
+ editFinished = false,
568
600
  cellEditor, component, params;
569
-
601
+
570
602
  //prevent editing if another cell is refusing to leave focus (eg. validation fail)
571
603
 
572
604
  if(this.currentCell){
@@ -578,13 +610,15 @@ class Edit extends Module{
578
610
 
579
611
  //handle successful value change
580
612
  function success(value){
581
- if(self.currentCell === cell){
613
+ if(self.currentCell === cell && !editFinished){
582
614
  var valid = self.chain("edit-success", [cell, value], true, true);
583
-
615
+
584
616
  if(valid === true || self.table.options.validationMode === "highlight"){
617
+
618
+ editFinished = true;
619
+
585
620
  self.clearEditor();
586
621
 
587
-
588
622
  if(!cell.modules.edit){
589
623
  cell.modules.edit = {};
590
624
  }
@@ -596,12 +630,17 @@ class Edit extends Module{
596
630
  }
597
631
 
598
632
  cell.setValue(value, true);
599
-
633
+
600
634
  return valid === true;
601
635
  }else{
636
+ editFinished = true;
602
637
  self.invalidEdit = true;
603
638
  self.focusCellNoEvent(cell, true);
604
639
  rendered();
640
+
641
+ setTimeout(() => {
642
+ editFinished = false;
643
+ }, 10);
605
644
  return false;
606
645
  }
607
646
  }else{
@@ -611,7 +650,9 @@ class Edit extends Module{
611
650
 
612
651
  //handle aborted edit
613
652
  function cancel(){
614
- if(self.currentCell === cell){
653
+ // editFinished = true;
654
+
655
+ if(self.currentCell === cell && !editFinished){
615
656
  self.cancelEdit();
616
657
  }else{
617
658
  // console.warn("Edit Success Error - cannot call cancel on a cell that is no longer being edited");
@@ -630,7 +671,6 @@ class Edit extends Module{
630
671
  allowEdit = this.allowEdit(cell);
631
672
 
632
673
  if(allowEdit || forceEdit){
633
-
634
674
  self.cancelEdit();
635
675
 
636
676
  self.currentCell = cell;
@@ -680,27 +720,33 @@ class Edit extends Module{
680
720
  }
681
721
  }else{
682
722
  console.warn("Edit Error - Editor should return an instance of Node, the editor returned:", cellEditor);
683
- element.blur();
723
+ this.blur(element);
684
724
  return false;
685
725
  }
686
726
  }else{
687
- element.blur();
727
+ this.blur(element);
688
728
  return false;
689
729
  }
690
730
 
691
731
  return true;
692
732
  }else{
693
733
  this.mouseClick = false;
694
- element.blur();
734
+ this.blur(element);
695
735
  return false;
696
736
  }
697
737
  }else{
698
738
  this.mouseClick = false;
699
- element.blur();
739
+ this.blur(element);
700
740
  return false;
701
741
  }
702
742
  }
703
743
 
744
+ blur(element){
745
+ if(!this.confirm("edit-blur", [element]) ){
746
+ element.blur();
747
+ }
748
+ }
749
+
704
750
  getEditedCells(){
705
751
  var output = [];
706
752
 
@@ -37,7 +37,7 @@ export default function(cell, onRendered, success, cancel, editorParams){
37
37
  newDatetime = DT.fromFormat(String(cellValue), inputFormat);
38
38
  }
39
39
 
40
- cellValue = newDatetime.toFormat("yyyy-MM-dd") + "T" + newDatetime.toFormat("hh:mm");
40
+ cellValue = newDatetime.toFormat("yyyy-MM-dd") + "T" + newDatetime.toFormat("HH:mm");
41
41
  }else{
42
42
  console.error("Editor Error - 'date' editor 'format' param is dependant on luxon.js");
43
43
  }
@@ -37,12 +37,14 @@ export default function(cell, onRendered, success, cancel, editorParams){
37
37
  newDatetime = DT.fromFormat(String(cellValue), inputFormat);
38
38
  }
39
39
 
40
- cellValue = newDatetime.toFormat("hh:mm");
40
+ cellValue = newDatetime.toFormat("HH:mm");
41
41
 
42
42
  }else{
43
43
  console.error("Editor Error - 'date' editor 'format' param is dependant on luxon.js");
44
44
  }
45
45
  }
46
+
47
+ console.log("val", cellValue);
46
48
 
47
49
  input.value = cellValue;
48
50
 
@@ -35,10 +35,20 @@ class Export extends Module{
35
35
  this.cloneTableStyle = style;
36
36
  this.config = config || {};
37
37
  this.colVisProp = colVisProp;
38
-
39
- var headers = this.config.columnHeaders !== false ? this.headersToExportRows(this.generateColumnGroupHeaders()) : [];
40
- var body = this.bodyToExportRows(this.rowLookup(range));
41
-
38
+
39
+ var headers, body;
40
+
41
+ if (range === 'range') {
42
+ var columns = this.table.modules.selectRange.selectedColumns();
43
+ headers = this.config.columnHeaders !== false
44
+ ? this.headersToExportRows(this.generateColumnGroupHeaders(columns))
45
+ : [];
46
+ body = this.bodyToExportRows(this.rowLookup(range), this.table.modules.selectRange.selectedColumns(true));
47
+ } else {
48
+ headers = this.config.columnHeaders !== false ? this.headersToExportRows(this.generateColumnGroupHeaders()) : [];
49
+ body = this.bodyToExportRows(this.rowLookup(range));
50
+ }
51
+
42
52
  return headers.concat(body);
43
53
  }
44
54
 
@@ -73,7 +83,11 @@ class Export extends Module{
73
83
  case "selected":
74
84
  rows = this.table.modules.selectRow.selectedRows;
75
85
  break;
76
-
86
+
87
+ case "range":
88
+ rows = this.table.modules.selectRange.selectedRows();
89
+ break;
90
+
77
91
  case "active":
78
92
  default:
79
93
  if(this.table.options.pagination){
@@ -87,10 +101,12 @@ class Export extends Module{
87
101
  return Object.assign([], rows);
88
102
  }
89
103
 
90
- generateColumnGroupHeaders(){
104
+ generateColumnGroupHeaders(columns){
91
105
  var output = [];
92
106
 
93
- var columns = this.config.columnGroups !== false ? this.table.columnManager.columns : this.table.columnManager.columnsByIndex;
107
+ if (!columns) {
108
+ columns = this.config.columnGroups !== false ? this.table.columnManager.columns : this.table.columnManager.columnsByIndex;
109
+ }
94
110
 
95
111
  columns.forEach((column) => {
96
112
  var colData = this.processColumnGroup(column);
@@ -99,7 +115,7 @@ class Export extends Module{
99
115
  output.push(colData);
100
116
  }
101
117
  });
102
-
118
+
103
119
  return output;
104
120
  }
105
121
 
@@ -227,16 +243,16 @@ class Export extends Module{
227
243
  return exportRows;
228
244
  }
229
245
 
230
- bodyToExportRows(rows){
231
-
232
- var columns = [];
246
+ bodyToExportRows(rows, columns = []){
233
247
  var exportRows = [];
234
248
 
235
- this.table.columnManager.columnsByIndex.forEach((column) => {
236
- if (this.columnVisCheck(column)) {
237
- columns.push(column.getComponent());
238
- }
239
- });
249
+ if (columns.length === 0) {
250
+ this.table.columnManager.columnsByIndex.forEach((column) => {
251
+ if (this.columnVisCheck(column)) {
252
+ columns.push(column.getComponent());
253
+ }
254
+ });
255
+ }
240
256
 
241
257
  if(this.config.columnCalcs !== false && this.table.modExists("columnCalcs")){
242
258
  if(this.table.modules.columnCalcs.topInitialized){
@@ -247,7 +263,7 @@ class Export extends Module{
247
263
  rows.push(this.table.modules.columnCalcs.botRow);
248
264
  }
249
265
  }
250
-
266
+
251
267
  rows = rows.filter((row) => {
252
268
  switch(row.type){
253
269
  case "group":
@@ -474,7 +490,8 @@ class Export extends Module{
474
490
  if(col){
475
491
  var cellEl = document.createElement("td"),
476
492
  column = col.component._column,
477
- index = this.table.columnManager.findColumnIndex(column),
493
+ table = this.table,
494
+ index = table.columnManager.findColumnIndex(column),
478
495
  value = col.value,
479
496
  cellStyle;
480
497
 
@@ -501,6 +518,9 @@ class Export extends Module{
501
518
  getRow:function(){
502
519
  return row.component;
503
520
  },
521
+ getTable:function(){
522
+ return table;
523
+ },
504
524
  getComponent:function(){
505
525
  return cellWrapper;
506
526
  },
@@ -20,7 +20,7 @@ export default function(cell, formatterParams, onRendered){
20
20
  if(row instanceof RowComponent){
21
21
 
22
22
  checkbox.addEventListener("change", (e) => {
23
- if(this.table.options.selectableRangeMode === "click"){
23
+ if(this.table.options.selectableRowsRangeMode === "click"){
24
24
  if(!blocked){
25
25
  row.toggleSelect();
26
26
  }else{
@@ -31,7 +31,7 @@ export default function(cell, formatterParams, onRendered){
31
31
  }
32
32
  });
33
33
 
34
- if(this.table.options.selectableRangeMode === "click"){
34
+ if(this.table.options.selectableRowsRangeMode === "click"){
35
35
  checkbox.addEventListener("click", (e) => {
36
36
  blocked = true;
37
37
  this.table.modules.selectRow.handleComplexRowClick(row._row, e);
@@ -1,10 +1,14 @@
1
1
  export default function(cell, formatterParams, onRendered){
2
2
  var content = document.createElement("span");
3
3
  var row = cell.getRow();
4
+ var table = cell.getTable();
4
5
 
5
6
  row.watchPosition((position) => {
7
+ if (formatterParams.relativeToPage) {
8
+ position += table.modules.page.getPageSize() * (table.modules.page.getPage() - 1);
9
+ }
6
10
  content.innerText = position;
7
11
  });
8
12
 
9
13
  return content;
10
- }
14
+ }
@@ -31,7 +31,10 @@ class FrozenColumns extends Module{
31
31
  this.subscribe("columns-loading", this.reset.bind(this));
32
32
 
33
33
  this.subscribe("column-add", this.reinitializeColumns.bind(this));
34
- this.subscribe("column-delete", this.reinitializeColumns.bind(this));
34
+ this.subscribe("column-deleted", this.reinitializeColumns.bind(this));
35
+ this.subscribe("column-hide", this.reinitializeColumns.bind(this));
36
+ this.subscribe("column-show", this.reinitializeColumns.bind(this));
37
+ this.subscribe("columns-loaded", this.reinitializeColumns.bind(this));
35
38
 
36
39
  this.subscribe("table-redraw", this.layout.bind(this));
37
40
  this.subscribe("layout-refreshing", this.blockLayout.bind(this));
@@ -57,16 +60,16 @@ class FrozenColumns extends Module{
57
60
  this.table.columnManager.columnsByIndex.forEach((column) => {
58
61
  this.initializeColumn(column);
59
62
  });
63
+
64
+ this.layout();
60
65
  }
61
66
 
62
67
  //initialize specific column
63
68
  initializeColumn(column){
64
69
  var config = {margin:0, edge:false};
65
70
 
66
- if(!column.isGroup){
67
-
71
+ if(!column.isGroup){
68
72
  if(this.frozenCheck(column)){
69
-
70
73
  config.position = this.initializationMode;
71
74
 
72
75
  if(this.initializationMode == "left"){
@@ -157,9 +160,8 @@ class FrozenColumns extends Module{
157
160
  leftParents.push(parentEl);
158
161
  }
159
162
 
160
- if(column.modules.frozen.edge){
161
- parentEl.classList.add("tabulator-frozen-" + column.modules.frozen.position);
162
- }
163
+ parentEl.classList.toggle("tabulator-frozen-left", column.modules.frozen.edge && column.modules.frozen.position === "left");
164
+ parentEl.classList.toggle("tabulator-frozen-right", column.modules.frozen.edge && column.modules.frozen.position === "right");
163
165
  }else{
164
166
  this.layoutElement(column.getElement(), column);
165
167
  }
@@ -207,7 +209,6 @@ class FrozenColumns extends Module{
207
209
  //layout columns appropriately
208
210
  layout(){
209
211
  if(this.active && !this.blocked){
210
-
211
212
  //calculate left columns
212
213
  this.layoutColumnPosition();
213
214
 
@@ -270,9 +271,8 @@ class FrozenColumns extends Module{
270
271
 
271
272
  element.classList.add("tabulator-frozen");
272
273
 
273
- if(column.modules.frozen.edge){
274
- element.classList.add("tabulator-frozen-" + column.modules.frozen.position);
275
- }
274
+ element.classList.toggle("tabulator-frozen-left", column.modules.frozen.edge && column.modules.frozen.position === "left");
275
+ element.classList.toggle("tabulator-frozen-right", column.modules.frozen.edge && column.modules.frozen.position === "right");
276
276
  }
277
277
  }
278
278
 
@@ -19,12 +19,17 @@ class FrozenRows extends Module{
19
19
  }
20
20
 
21
21
  initialize(){
22
+ var fragment = document.createDocumentFragment();
23
+
22
24
  this.rows = [];
23
25
 
24
26
  this.topElement.classList.add("tabulator-frozen-rows-holder");
27
+
28
+ fragment.appendChild(document.createElement("br"));
29
+ fragment.appendChild(this.topElement);
25
30
 
26
31
  // this.table.columnManager.element.append(this.topElement);
27
- this.table.columnManager.getContentsElement().insertBefore(this.topElement, this.table.columnManager.headersElement.nextSibling);
32
+ this.table.columnManager.getContentsElement().insertBefore(fragment, this.table.columnManager.headersElement.nextSibling);
28
33
 
29
34
  this.subscribe("row-deleting", this.detachRow.bind(this));
30
35
  this.subscribe("rows-visible", this.visibleRows.bind(this));
@@ -119,7 +119,7 @@ class History extends Module{
119
119
 
120
120
  return true;
121
121
  }else{
122
- console.warn("History Undo Error - No more history to undo");
122
+ console.warn(this.options("history") ? "History Undo Error - No more history to undo" : "History module not enabled");
123
123
  return false;
124
124
  }
125
125
  }
@@ -137,7 +137,7 @@ class History extends Module{
137
137
 
138
138
  return true;
139
139
  }else{
140
- console.warn("History Redo Error - No more history to redo");
140
+ console.warn(this.options("history") ? "History Redo Error - No more history to redo" : "History module not enabled");
141
141
  return false;
142
142
  }
143
143
  }
@@ -12,10 +12,14 @@ export default {
12
12
  }
13
13
 
14
14
  this._rebindRow(action.component, newRow);
15
+
16
+ this.table.rowManager.checkPlaceholder();
15
17
  },
16
18
 
17
19
  rowDelete:function(action){
18
20
  action.component.deleteActual();
21
+
22
+ this.table.rowManager.checkPlaceholder();
19
23
  },
20
24
 
21
25
  rowMove: function(action){
@@ -6,6 +6,8 @@ export default {
6
6
 
7
7
  rowAdd: function(action){
8
8
  action.component.deleteActual();
9
+
10
+ this.table.rowManager.checkPlaceholder();
9
11
  },
10
12
 
11
13
  rowDelete: function(action){
@@ -16,6 +18,8 @@ export default {
16
18
  }
17
19
 
18
20
  this._rebindRow(action.component, newRow);
21
+
22
+ this.table.rowManager.checkPlaceholder();
19
23
  },
20
24
 
21
25
  rowMove: function(action){
@@ -83,6 +83,43 @@ export default {
83
83
  this.dispatch("keybinding-nav-down", e);
84
84
  },
85
85
 
86
+ rangeJumpLeft: function(e){
87
+ this.dispatch("keybinding-nav-range", e, "left", true, false);
88
+ },
89
+ rangeJumpRight: function(e){
90
+ this.dispatch("keybinding-nav-range", e, "right", true, false);
91
+ },
92
+ rangeJumpUp: function(e){
93
+ this.dispatch("keybinding-nav-range", e, "up", true, false);
94
+ },
95
+ rangeJumpDown: function(e){
96
+ this.dispatch("keybinding-nav-range", e, "down", true, false);
97
+ },
98
+ rangeExpandLeft: function(e){
99
+ this.dispatch("keybinding-nav-range", e, "left", false, true);
100
+ },
101
+ rangeExpandRight: function(e){
102
+ this.dispatch("keybinding-nav-range", e, "right", false, true);
103
+ },
104
+ rangeExpandUp: function(e){
105
+ this.dispatch("keybinding-nav-range", e, "up", false, true);
106
+ },
107
+ rangeExpandDown: function(e){
108
+ this.dispatch("keybinding-nav-range", e, "down", false, true);
109
+ },
110
+ rangeExpandJumpLeft: function(e){
111
+ this.dispatch("keybinding-nav-range", e, "left", true, true);
112
+ },
113
+ rangeExpandJumpRight: function(e){
114
+ this.dispatch("keybinding-nav-range", e, "right", true, true);
115
+ },
116
+ rangeExpandJumpUp: function(e){
117
+ this.dispatch("keybinding-nav-range", e, "up", true, true);
118
+ },
119
+ rangeExpandJumpDown: function(e){
120
+ this.dispatch("keybinding-nav-range", e, "down", true, true);
121
+ },
122
+
86
123
  undo:function(e){
87
124
  var cell = false;
88
125
  if(this.table.options.history && this.table.modExists("history") && this.table.modExists("edit")){
@@ -116,4 +153,4 @@ export default {
116
153
  }
117
154
  }
118
155
  },
119
- };
156
+ };
@@ -3,6 +3,8 @@ export default {
3
3
  navNext:9,
4
4
  navUp:38,
5
5
  navDown:40,
6
+ navLeft:37,
7
+ navRight:39,
6
8
  scrollPageUp:33,
7
9
  scrollPageDown:34,
8
10
  scrollToStart:36,
@@ -10,4 +12,17 @@ export default {
10
12
  undo:["ctrl + 90", "meta + 90"],
11
13
  redo:["ctrl + 89", "meta + 89"],
12
14
  copyToClipboard:["ctrl + 67", "meta + 67"],
13
- };
15
+
16
+ rangeJumpUp:["ctrl + 38", "meta + 38"],
17
+ rangeJumpDown:["ctrl + 40", "meta + 40"],
18
+ rangeJumpLeft:["ctrl + 37", "meta + 37"],
19
+ rangeJumpRight:["ctrl + 39", "meta + 39"],
20
+ rangeExpandUp:"shift + 38",
21
+ rangeExpandDown:"shift + 40",
22
+ rangeExpandLeft:"shift + 37",
23
+ rangeExpandRight:"shift + 39",
24
+ rangeExpandJumpUp:["ctrl + shift + 38", "meta + shift + 38"],
25
+ rangeExpandJumpDown:["ctrl + shift + 40", "meta + shift + 40"],
26
+ rangeExpandJumpLeft:["ctrl + shift + 37", "meta + shift + 37"],
27
+ rangeExpandJumpRight:["ctrl + shift + 39", "meta + shift + 39"],
28
+ };
@@ -76,7 +76,7 @@ class Menu extends Module{
76
76
  this.subscribe("group-dblclick", this.loadMenuEvent.bind(this, this.table.options.groupDblClickMenu));
77
77
  }
78
78
  }
79
-
79
+
80
80
  initializeColumn(column){
81
81
  var def = column.definition;
82
82
 
@@ -285,6 +285,7 @@ class Menu extends Module{
285
285
  this.rootPopup = null;
286
286
 
287
287
  if(this.currentComponent){
288
+ this.dispatch("menu-closed", menu, popup);
288
289
  this.dispatchExternal("menuClosed", this.currentComponent.getComponent());
289
290
  this.currentComponent = null;
290
291
  }
@@ -292,6 +293,7 @@ class Menu extends Module{
292
293
 
293
294
  this.currentComponent = component;
294
295
 
296
+ this.dispatch("menu-opened", menu, popup);
295
297
  this.dispatchExternal("menuOpened", component.getComponent());
296
298
  }
297
299
  }
@@ -37,8 +37,13 @@ class MoveColumns extends Module{
37
37
  initialize(){
38
38
  if(this.table.options.movableColumns){
39
39
  this.subscribe("column-init", this.initializeColumn.bind(this));
40
+ this.subscribe("alert-show", this.abortMove.bind(this));
40
41
  }
41
42
  }
43
+
44
+ abortMove(){
45
+ clearTimeout(this.checkTimeout);
46
+ }
42
47
 
43
48
  initializeColumn(column){
44
49
  var self = this,
@@ -70,7 +70,7 @@ class Popup extends Module{
70
70
  this.subscribe("group-dblclick", this.loadPopupEvent.bind(this, this.table.options.groupDblClickPopup));
71
71
  }
72
72
  }
73
-
73
+
74
74
  initializeColumn(column){
75
75
  var def = column.definition;
76
76
 
@@ -45,7 +45,7 @@ class ResizeTable extends Module{
45
45
  this.autoResize = true;
46
46
 
47
47
  this.resizeObserver = new ResizeObserver((entry) => {
48
- if(!table.browserMobile || (table.browserMobile &&!table.modules.edit.currentCell)){
48
+ if(!table.browserMobile || (table.browserMobile && (!table.modules.edit || (table.modules.edit && !table.modules.edit.currentCell)))){
49
49
 
50
50
  var nodeHeight = Math.floor(entry[0].contentRect.height);
51
51
  var nodeWidth = Math.floor(entry[0].contentRect.width);
@@ -71,7 +71,7 @@ class ResizeTable extends Module{
71
71
  if(this.table.element.parentNode && !this.table.rowManager.fixedHeight && (tableStyle.getPropertyValue("max-height") || tableStyle.getPropertyValue("min-height"))){
72
72
 
73
73
  this.containerObserver = new ResizeObserver((entry) => {
74
- if(!table.browserMobile || (table.browserMobile &&!table.modules.edit.currentCell)){
74
+ if(!table.browserMobile || (table.browserMobile && (!table.modules.edit || (table.modules.edit && !table.modules.edit.currentCell)))){
75
75
 
76
76
  var nodeHeight = Math.floor(entry[0].contentRect.height);
77
77
  var nodeWidth = Math.floor(entry[0].contentRect.width);
@@ -94,7 +94,7 @@ class ResizeTable extends Module{
94
94
 
95
95
  }else{
96
96
  this.binding = function(){
97
- if(!table.browserMobile || (table.browserMobile && !table.modules.edit.currentCell)){
97
+ if(!table.browserMobile || (table.browserMobile && (!table.modules.edit || (table.modules.edit && !table.modules.edit.currentCell)))){
98
98
  table.columnManager.rerenderColumns(true);
99
99
  table.redraw();
100
100
  }