tabulator-tables 5.5.3 → 5.6.0

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/LICENSE +1 -1
  2. package/bower.json +1 -1
  3. package/dist/css/tabulator.css +72 -2
  4. package/dist/css/tabulator.css.map +1 -1
  5. package/dist/css/tabulator.min.css +1 -1
  6. package/dist/css/tabulator.min.css.map +1 -1
  7. package/dist/css/tabulator_bootstrap3.css +72 -2
  8. package/dist/css/tabulator_bootstrap3.css.map +1 -1
  9. package/dist/css/tabulator_bootstrap3.min.css +1 -1
  10. package/dist/css/tabulator_bootstrap3.min.css.map +1 -1
  11. package/dist/css/tabulator_bootstrap4.css +72 -2
  12. package/dist/css/tabulator_bootstrap4.css.map +1 -1
  13. package/dist/css/tabulator_bootstrap4.min.css +1 -1
  14. package/dist/css/tabulator_bootstrap4.min.css.map +1 -1
  15. package/dist/css/tabulator_bootstrap5.css +72 -2
  16. package/dist/css/tabulator_bootstrap5.css.map +1 -1
  17. package/dist/css/tabulator_bootstrap5.min.css +1 -1
  18. package/dist/css/tabulator_bootstrap5.min.css.map +1 -1
  19. package/dist/css/tabulator_bulma.css +72 -2
  20. package/dist/css/tabulator_bulma.css.map +1 -1
  21. package/dist/css/tabulator_bulma.min.css +1 -1
  22. package/dist/css/tabulator_bulma.min.css.map +1 -1
  23. package/dist/css/tabulator_materialize.css +72 -2
  24. package/dist/css/tabulator_materialize.css.map +1 -1
  25. package/dist/css/tabulator_materialize.min.css +1 -1
  26. package/dist/css/tabulator_materialize.min.css.map +1 -1
  27. package/dist/css/tabulator_midnight.css +72 -2
  28. package/dist/css/tabulator_midnight.css.map +1 -1
  29. package/dist/css/tabulator_midnight.min.css +1 -1
  30. package/dist/css/tabulator_midnight.min.css.map +1 -1
  31. package/dist/css/tabulator_modern.css +72 -2
  32. package/dist/css/tabulator_modern.css.map +1 -1
  33. package/dist/css/tabulator_modern.min.css +1 -1
  34. package/dist/css/tabulator_modern.min.css.map +1 -1
  35. package/dist/css/tabulator_semanticui.css +72 -2
  36. package/dist/css/tabulator_semanticui.css.map +1 -1
  37. package/dist/css/tabulator_semanticui.min.css +1 -1
  38. package/dist/css/tabulator_semanticui.min.css.map +1 -1
  39. package/dist/css/tabulator_simple.css +72 -2
  40. package/dist/css/tabulator_simple.css.map +1 -1
  41. package/dist/css/tabulator_simple.min.css +1 -1
  42. package/dist/css/tabulator_simple.min.css.map +1 -1
  43. package/dist/css/tabulator_site.css +74 -4
  44. package/dist/css/tabulator_site.css.map +1 -1
  45. package/dist/css/tabulator_site.min.css +1 -1
  46. package/dist/css/tabulator_site.min.css.map +1 -1
  47. package/dist/js/tabulator.js +1830 -244
  48. package/dist/js/tabulator.js.map +1 -1
  49. package/dist/js/tabulator.min.js +2 -2
  50. package/dist/js/tabulator.min.js.map +1 -1
  51. package/dist/js/tabulator_esm.js +1900 -312
  52. package/dist/js/tabulator_esm.js.map +1 -1
  53. package/dist/js/tabulator_esm.min.js +2 -2
  54. package/dist/js/tabulator_esm.min.js.map +1 -1
  55. package/package.json +3 -5
  56. package/src/js/core/ColumnManager.js +4 -0
  57. package/src/js/core/CoreFeature.js +2 -2
  58. package/src/js/core/RowManager.js +9 -1
  59. package/src/js/core/Tabulator.js +1 -0
  60. package/src/js/core/TabulatorFull.js +1 -1
  61. package/src/js/core/column/Column.js +6 -0
  62. package/src/js/core/modules/optional.js +2 -1
  63. package/src/js/core/rendering/renderers/BasicVertical.js +4 -2
  64. package/src/js/core/rendering/renderers/VirtualDomHorizontal.js +1 -1
  65. package/src/js/core/row/PseudoRow.js +2 -0
  66. package/src/js/core/tools/Alert.js +4 -0
  67. package/src/js/core/tools/DeprecationAdvisor.js +5 -1
  68. package/src/js/core/tools/Helpers.js +1 -1
  69. package/src/js/core/tools/InteractionMonitor.js +3 -3
  70. package/src/js/modules/Clipboard/Clipboard.js +5 -3
  71. package/src/js/modules/Clipboard/defaults/pasteActions.js +49 -6
  72. package/src/js/modules/Clipboard/defaults/pasteParsers.js +69 -14
  73. package/src/js/modules/ColumnCalcs/ColumnCalcs.js +7 -1
  74. package/src/js/modules/Edit/Edit.js +55 -19
  75. package/src/js/modules/Export/Export.js +38 -18
  76. package/src/js/modules/Format/defaults/formatters/rowSelection.js +2 -2
  77. package/src/js/modules/Format/defaults/formatters/rownum.js +5 -1
  78. package/src/js/modules/FrozenColumns/FrozenColumns.js +10 -11
  79. package/src/js/modules/FrozenRows/FrozenRows.js +6 -1
  80. package/src/js/modules/History/History.js +2 -2
  81. package/src/js/modules/History/defaults/redoers.js +4 -0
  82. package/src/js/modules/History/defaults/undoers.js +4 -0
  83. package/src/js/modules/Keybindings/defaults/actions.js +38 -1
  84. package/src/js/modules/Keybindings/defaults/bindings.js +16 -1
  85. package/src/js/modules/Menu/Menu.js +3 -1
  86. package/src/js/modules/MoveColumns/MoveColumns.js +5 -0
  87. package/src/js/modules/Popup/Popup.js +1 -1
  88. package/src/js/modules/ResizeTable/ResizeTable.js +3 -3
  89. package/src/js/modules/SelectRange/Range.js +347 -0
  90. package/src/js/modules/SelectRange/RangeComponent.js +93 -0
  91. package/src/js/modules/SelectRange/SelectRange.js +855 -0
  92. package/src/js/modules/SelectRow/SelectRow.js +46 -26
  93. package/src/js/modules/Sort/Sort.js +111 -105
  94. package/src/js/modules/Validate/defaults/validators.js +11 -0
  95. package/src/scss/tabulator.scss +95 -13
  96. package/src/scss/themes/bulma/tabulator_bulma.scss +7 -0
  97. package/src/scss/themes/materialize/tabulator_materialize.scss +7 -1
  98. package/src/scss/themes/tabulator_midnight.scss +13 -0
  99. package/src/scss/themes/tabulator_modern.scss +9 -0
  100. package/src/scss/themes/tabulator_site.scss +13 -2
@@ -1,4 +1,4 @@
1
- /* Tabulator v5.5.3 (c) Oliver Folkerd 2024 */
1
+ /* Tabulator v5.6.0 (c) Oliver Folkerd 2024 */
2
2
  class CoreFeature{
3
3
 
4
4
  constructor(table){
@@ -119,8 +119,8 @@ class CoreFeature{
119
119
  /////////// Deprecation Checks ///////////
120
120
  //////////////////////////////////////////
121
121
 
122
- deprecationCheck(oldOption, newOption){
123
- return this.table.deprecationAdvisor.check(oldOption, newOption);
122
+ deprecationCheck(oldOption, newOption, convert){
123
+ return this.table.deprecationAdvisor.check(oldOption, newOption, convert);
124
124
  }
125
125
 
126
126
  deprecationCheckMsg(oldOption, msg){
@@ -1079,15 +1079,58 @@ Ajax.defaultLoaderPromise = defaultLoaderPromise;
1079
1079
  Ajax.contentTypeFormatters = defaultContentTypeFormatters;
1080
1080
 
1081
1081
  var defaultPasteActions = {
1082
- replace:function(rows){
1083
- return this.table.setData(rows);
1082
+ replace:function(data){
1083
+ return this.table.setData(data);
1084
1084
  },
1085
- update:function(rows){
1086
- return this.table.updateOrAddData(rows);
1085
+ update:function(data){
1086
+ return this.table.updateOrAddData(data);
1087
1087
  },
1088
- insert:function(rows){
1089
- return this.table.addData(rows);
1088
+ insert:function(data){
1089
+ return this.table.addData(data);
1090
1090
  },
1091
+ range:function(data){
1092
+ var rows = [],
1093
+ range = this.table.modules.selectRange.activeRange,
1094
+ singleCell = false,
1095
+ bounds, startCell, startRow, rowWidth, dataLength;
1096
+
1097
+ dataLength = data.length;
1098
+
1099
+ if(range){
1100
+ bounds = range.getBounds();
1101
+ startCell = bounds.start;
1102
+
1103
+ if(bounds.start === bounds.end){
1104
+ singleCell = true;
1105
+ }
1106
+
1107
+ if(startCell){
1108
+ rows = this.table.rowManager.activeRows.slice();
1109
+ startRow = rows.indexOf(startCell.row);
1110
+
1111
+ if(singleCell){
1112
+ rowWidth = data.length;
1113
+ }else {
1114
+ rowWidth = (rows.indexOf(bounds.end.row) - startRow) + 1;
1115
+ }
1116
+
1117
+
1118
+ if(startRow >-1){
1119
+ this.table.blockRedraw();
1120
+
1121
+ rows = rows.slice(startRow, startRow + rowWidth);
1122
+
1123
+ rows.forEach((row, i) => {
1124
+ row.updateData(data[i % dataLength]);
1125
+ });
1126
+
1127
+ this.table.restoreRedraw();
1128
+ }
1129
+ }
1130
+ }
1131
+
1132
+ return rows;
1133
+ }
1091
1134
  };
1092
1135
 
1093
1136
  var defaultPasteParsers = {
@@ -1097,72 +1140,127 @@ var defaultPasteParsers = {
1097
1140
  columns = this.table.columnManager.columns,
1098
1141
  columnMap = [],
1099
1142
  rows = [];
1100
-
1143
+
1101
1144
  //get data from clipboard into array of columns and rows.
1102
1145
  clipboard = clipboard.split("\n");
1103
-
1146
+
1104
1147
  clipboard.forEach(function(row){
1105
1148
  data.push(row.split("\t"));
1106
1149
  });
1107
-
1150
+
1108
1151
  if(data.length && !(data.length === 1 && data[0].length < 2)){
1109
-
1152
+
1110
1153
  //check if headers are present by title
1111
1154
  data[0].forEach(function(value){
1112
1155
  var column = columns.find(function(column){
1113
1156
  return value && column.definition.title && value.trim() && column.definition.title.trim() === value.trim();
1114
1157
  });
1115
-
1158
+
1116
1159
  if(column){
1117
1160
  columnMap.push(column);
1118
1161
  }else {
1119
1162
  headerFindSuccess = false;
1120
1163
  }
1121
1164
  });
1122
-
1165
+
1123
1166
  //check if column headers are present by field
1124
1167
  if(!headerFindSuccess){
1125
1168
  headerFindSuccess = true;
1126
1169
  columnMap = [];
1127
-
1170
+
1128
1171
  data[0].forEach(function(value){
1129
1172
  var column = columns.find(function(column){
1130
1173
  return value && column.field && value.trim() && column.field.trim() === value.trim();
1131
1174
  });
1132
-
1175
+
1133
1176
  if(column){
1134
1177
  columnMap.push(column);
1135
1178
  }else {
1136
1179
  headerFindSuccess = false;
1137
1180
  }
1138
1181
  });
1139
-
1182
+
1140
1183
  if(!headerFindSuccess){
1141
1184
  columnMap = this.table.columnManager.columnsByIndex;
1142
1185
  }
1143
1186
  }
1144
-
1187
+
1145
1188
  //remove header row if found
1146
1189
  if(headerFindSuccess){
1147
1190
  data.shift();
1148
1191
  }
1149
-
1192
+
1150
1193
  data.forEach(function(item){
1151
1194
  var row = {};
1152
-
1195
+
1153
1196
  item.forEach(function(value, i){
1154
1197
  if(columnMap[i]){
1155
1198
  row[columnMap[i].field] = value;
1156
1199
  }
1157
1200
  });
1158
-
1201
+
1159
1202
  rows.push(row);
1160
1203
  });
1161
-
1204
+
1162
1205
  return rows;
1163
1206
  }else {
1164
1207
  return false;
1165
1208
  }
1209
+ },
1210
+ range:function(clipboard){
1211
+ var data = [],
1212
+ rows = [],
1213
+ range = this.table.modules.selectRange.activeRange,
1214
+ singleCell = false,
1215
+ bounds, startCell, colWidth, columnMap, startCol;
1216
+
1217
+ if(range){
1218
+ bounds = range.getBounds();
1219
+ startCell = bounds.start;
1220
+
1221
+ if(bounds.start === bounds.end){
1222
+ singleCell = true;
1223
+ }
1224
+
1225
+ if(startCell){
1226
+ //get data from clipboard into array of columns and rows.
1227
+ clipboard = clipboard.split("\n");
1228
+
1229
+ clipboard.forEach(function(row){
1230
+ data.push(row.split("\t"));
1231
+ });
1232
+
1233
+ if(data.length){
1234
+ columnMap = this.table.columnManager.getVisibleColumnsByIndex();
1235
+ startCol = columnMap.indexOf(startCell.column);
1236
+
1237
+ if(startCol > -1){
1238
+ if(singleCell){
1239
+ colWidth = data[0].length;
1240
+ }else {
1241
+ colWidth = (columnMap.indexOf(bounds.end.column) - startCol) + 1;
1242
+ }
1243
+
1244
+ columnMap = columnMap.slice(startCol, startCol + colWidth);
1245
+
1246
+ data.forEach((item) => {
1247
+ var row = {};
1248
+ var itemLength = item.length;
1249
+
1250
+ columnMap.forEach(function(col, i){
1251
+ row[col.field] = item[i % itemLength];
1252
+ });
1253
+
1254
+ rows.push(row);
1255
+ });
1256
+
1257
+ return rows;
1258
+ }
1259
+ }
1260
+ }
1261
+ }
1262
+
1263
+ return false;
1166
1264
  }
1167
1265
  };
1168
1266
 
@@ -1305,6 +1403,7 @@ class Clipboard extends Module{
1305
1403
  var sel, textRange;
1306
1404
  this.blocked = false;
1307
1405
  this.customSelection = false;
1406
+
1308
1407
 
1309
1408
  if (this.mode === true || this.mode === "copy") {
1310
1409
 
@@ -1372,7 +1471,7 @@ class Clipboard extends Module{
1372
1471
  paste(e){
1373
1472
  var data, rowData, rows;
1374
1473
 
1375
- if(this.checkPaseOrigin(e)){
1474
+ if(this.checkPasteOrigin(e)){
1376
1475
 
1377
1476
  data = this.getPasteData(e);
1378
1477
 
@@ -1409,10 +1508,11 @@ class Clipboard extends Module{
1409
1508
  }
1410
1509
 
1411
1510
 
1412
- checkPaseOrigin(e){
1511
+ checkPasteOrigin(e){
1413
1512
  var valid = true;
1513
+ var blocked = this.confirm("clipboard-paste", [e]);
1414
1514
 
1415
- if(e.target.tagName != "DIV" || this.table.modules.edit.currentCell){
1515
+ if(blocked || !["DIV", "SPAN"].includes(e.target.tagName)){
1416
1516
  valid = false;
1417
1517
  }
1418
1518
 
@@ -2829,6 +2929,8 @@ class Column extends CoreFeature{
2829
2929
 
2830
2930
  this.table.columnManager.rerenderColumns(true);
2831
2931
 
2932
+ this.dispatch("column-deleted", this);
2933
+
2832
2934
  resolve();
2833
2935
  });
2834
2936
  }
@@ -2969,6 +3071,10 @@ class Column extends CoreFeature{
2969
3071
 
2970
3072
  return this.component;
2971
3073
  }
3074
+
3075
+ getPosition(){
3076
+ return this.table.columnManager.getVisibleColumnsByIndex().indexOf(this) + 1;
3077
+ }
2972
3078
  }
2973
3079
 
2974
3080
  Column.defaultOptionList = defaultColumnOptions;
@@ -3888,8 +3994,14 @@ class ColumnCalcs extends Module{
3888
3994
  }
3889
3995
 
3890
3996
  initializeTopRow(){
3997
+ var fragment = document.createDocumentFragment();
3998
+
3891
3999
  if(!this.topInitialized){
3892
- this.table.columnManager.getContentsElement().insertBefore(this.topElement, this.table.columnManager.headersElement.nextSibling);
4000
+
4001
+ fragment.appendChild(document.createElement("br"));
4002
+ fragment.appendChild(this.topElement);
4003
+
4004
+ this.table.columnManager.getContentsElement().insertBefore(fragment, this.table.columnManager.headersElement.nextSibling);
3893
4005
  this.topInitialized = true;
3894
4006
  }
3895
4007
  }
@@ -7631,6 +7743,8 @@ class Edit$1 extends Module{
7631
7743
  this.registerColumnOption("cellEdited");
7632
7744
  this.registerColumnOption("cellEditCancelled");
7633
7745
 
7746
+ this.registerTableOption("editTriggerEvent", "focus");
7747
+
7634
7748
  this.registerTableFunction("getEditedCells", this.getEditedCells.bind(this));
7635
7749
  this.registerTableFunction("clearCellEdited", this.clearCellEdited.bind(this));
7636
7750
  this.registerTableFunction("navigatePrev", this.navigatePrev.bind(this));
@@ -7662,16 +7776,30 @@ class Edit$1 extends Module{
7662
7776
  this.subscribe("row-deleting", this.rowDeleteCheck.bind(this));
7663
7777
  this.subscribe("row-layout", this.rowEditableCheck.bind(this));
7664
7778
  this.subscribe("data-refreshing", this.cancelEdit.bind(this));
7779
+ this.subscribe("clipboard-paste", this.pasteBlocker.bind(this));
7665
7780
 
7666
7781
  this.subscribe("keybinding-nav-prev", this.navigatePrev.bind(this, undefined));
7667
7782
  this.subscribe("keybinding-nav-next", this.keybindingNavigateNext.bind(this));
7668
- this.subscribe("keybinding-nav-left", this.navigateLeft.bind(this, undefined));
7669
- this.subscribe("keybinding-nav-right", this.navigateRight.bind(this, undefined));
7783
+
7784
+
7785
+ // this.subscribe("keybinding-nav-left", this.navigateLeft.bind(this, undefined));
7786
+ // this.subscribe("keybinding-nav-right", this.navigateRight.bind(this, undefined));
7670
7787
  this.subscribe("keybinding-nav-up", this.navigateUp.bind(this, undefined));
7671
7788
  this.subscribe("keybinding-nav-down", this.navigateDown.bind(this, undefined));
7672
7789
  }
7673
7790
 
7674
7791
 
7792
+ ///////////////////////////////////
7793
+ ///////// Paste Negation //////////
7794
+ ///////////////////////////////////
7795
+
7796
+ pasteBlocker(e){
7797
+ if(this.currentCell){
7798
+ return true;
7799
+ }
7800
+ }
7801
+
7802
+
7675
7803
  ///////////////////////////////////
7676
7804
  ////// Keybinding Functions ///////
7677
7805
  ///////////////////////////////////
@@ -7679,7 +7807,7 @@ class Edit$1 extends Module{
7679
7807
  keybindingNavigateNext(e){
7680
7808
  var cell = this.currentCell,
7681
7809
  newRow = this.options("tabEndNewRow");
7682
-
7810
+
7683
7811
  if(cell){
7684
7812
  if(!this.navigateNext(cell, e)){
7685
7813
  if(newRow){
@@ -8068,12 +8196,6 @@ class Edit$1 extends Module{
8068
8196
  this.updateCellClass(cell);
8069
8197
  element.setAttribute("tabindex", 0);
8070
8198
 
8071
- element.addEventListener("click", function(e){
8072
- if(!element.classList.contains("tabulator-editing")){
8073
- element.focus({preventScroll: true});
8074
- }
8075
- });
8076
-
8077
8199
  element.addEventListener("mousedown", function(e){
8078
8200
  if (e.button === 2) {
8079
8201
  e.preventDefault();
@@ -8081,12 +8203,33 @@ class Edit$1 extends Module{
8081
8203
  self.mouseClick = true;
8082
8204
  }
8083
8205
  });
8206
+
8207
+ if(this.options("editTriggerEvent") === "dblclick"){
8208
+ element.addEventListener("dblclick", function(e){
8209
+ if(!element.classList.contains("tabulator-editing")){
8210
+ element.focus({preventScroll: true});
8211
+ self.edit(cell, e, false);
8212
+ }
8213
+ });
8214
+ }
8084
8215
 
8085
- element.addEventListener("focus", function(e){
8086
- if(!self.recursionBlock){
8087
- self.edit(cell, e, false);
8088
- }
8089
- });
8216
+
8217
+ if(this.options("editTriggerEvent") === "focus" || this.options("editTriggerEvent") === "click"){
8218
+ element.addEventListener("click", function(e){
8219
+ if(!element.classList.contains("tabulator-editing")){
8220
+ element.focus({preventScroll: true});
8221
+ self.edit(cell, e, false);
8222
+ }
8223
+ });
8224
+ }
8225
+
8226
+ if(this.options("editTriggerEvent") === "focus"){
8227
+ element.addEventListener("focus", function(e){
8228
+ if(!self.recursionBlock){
8229
+ self.edit(cell, e, false);
8230
+ }
8231
+ });
8232
+ }
8090
8233
  }
8091
8234
  }
8092
8235
 
@@ -8233,7 +8376,6 @@ class Edit$1 extends Module{
8233
8376
  allowEdit = this.allowEdit(cell);
8234
8377
 
8235
8378
  if(allowEdit || forceEdit){
8236
-
8237
8379
  self.cancelEdit();
8238
8380
 
8239
8381
  self.currentCell = cell;
@@ -8283,27 +8425,33 @@ class Edit$1 extends Module{
8283
8425
  }
8284
8426
  }else {
8285
8427
  console.warn("Edit Error - Editor should return an instance of Node, the editor returned:", cellEditor);
8286
- element.blur();
8428
+ this.blur(element);
8287
8429
  return false;
8288
8430
  }
8289
8431
  }else {
8290
- element.blur();
8432
+ this.blur(element);
8291
8433
  return false;
8292
8434
  }
8293
8435
 
8294
8436
  return true;
8295
8437
  }else {
8296
8438
  this.mouseClick = false;
8297
- element.blur();
8439
+ this.blur(element);
8298
8440
  return false;
8299
8441
  }
8300
8442
  }else {
8301
8443
  this.mouseClick = false;
8302
- element.blur();
8444
+ this.blur(element);
8303
8445
  return false;
8304
8446
  }
8305
8447
  }
8306
8448
 
8449
+ blur(element){
8450
+ if(!this.confirm("edit-blur", [element]) ){
8451
+ element.blur();
8452
+ }
8453
+ }
8454
+
8307
8455
  getEditedCells(){
8308
8456
  var output = [];
8309
8457
 
@@ -8387,10 +8535,20 @@ class Export extends Module{
8387
8535
  this.cloneTableStyle = style;
8388
8536
  this.config = config || {};
8389
8537
  this.colVisProp = colVisProp;
8538
+
8539
+ var headers, body;
8390
8540
 
8391
- var headers = this.config.columnHeaders !== false ? this.headersToExportRows(this.generateColumnGroupHeaders()) : [];
8392
- var body = this.bodyToExportRows(this.rowLookup(range));
8393
-
8541
+ if (range === 'range') {
8542
+ var columns = this.table.modules.selectRange.selectedColumns();
8543
+ headers = this.config.columnHeaders !== false
8544
+ ? this.headersToExportRows(this.generateColumnGroupHeaders(columns))
8545
+ : [];
8546
+ body = this.bodyToExportRows(this.rowLookup(range), this.table.modules.selectRange.selectedColumns(true));
8547
+ } else {
8548
+ headers = this.config.columnHeaders !== false ? this.headersToExportRows(this.generateColumnGroupHeaders()) : [];
8549
+ body = this.bodyToExportRows(this.rowLookup(range));
8550
+ }
8551
+
8394
8552
  return headers.concat(body);
8395
8553
  }
8396
8554
 
@@ -8425,7 +8583,11 @@ class Export extends Module{
8425
8583
  case "selected":
8426
8584
  rows = this.table.modules.selectRow.selectedRows;
8427
8585
  break;
8428
-
8586
+
8587
+ case "range":
8588
+ rows = this.table.modules.selectRange.selectedRows();
8589
+ break;
8590
+
8429
8591
  case "active":
8430
8592
  default:
8431
8593
  if(this.table.options.pagination){
@@ -8439,10 +8601,12 @@ class Export extends Module{
8439
8601
  return Object.assign([], rows);
8440
8602
  }
8441
8603
 
8442
- generateColumnGroupHeaders(){
8604
+ generateColumnGroupHeaders(columns){
8443
8605
  var output = [];
8444
8606
 
8445
- var columns = this.config.columnGroups !== false ? this.table.columnManager.columns : this.table.columnManager.columnsByIndex;
8607
+ if (!columns) {
8608
+ columns = this.config.columnGroups !== false ? this.table.columnManager.columns : this.table.columnManager.columnsByIndex;
8609
+ }
8446
8610
 
8447
8611
  columns.forEach((column) => {
8448
8612
  var colData = this.processColumnGroup(column);
@@ -8451,7 +8615,7 @@ class Export extends Module{
8451
8615
  output.push(colData);
8452
8616
  }
8453
8617
  });
8454
-
8618
+
8455
8619
  return output;
8456
8620
  }
8457
8621
 
@@ -8579,16 +8743,16 @@ class Export extends Module{
8579
8743
  return exportRows;
8580
8744
  }
8581
8745
 
8582
- bodyToExportRows(rows){
8583
-
8584
- var columns = [];
8746
+ bodyToExportRows(rows, columns = []){
8585
8747
  var exportRows = [];
8586
8748
 
8587
- this.table.columnManager.columnsByIndex.forEach((column) => {
8588
- if (this.columnVisCheck(column)) {
8589
- columns.push(column.getComponent());
8590
- }
8591
- });
8749
+ if (columns.length === 0) {
8750
+ this.table.columnManager.columnsByIndex.forEach((column) => {
8751
+ if (this.columnVisCheck(column)) {
8752
+ columns.push(column.getComponent());
8753
+ }
8754
+ });
8755
+ }
8592
8756
 
8593
8757
  if(this.config.columnCalcs !== false && this.table.modExists("columnCalcs")){
8594
8758
  if(this.table.modules.columnCalcs.topInitialized){
@@ -8599,7 +8763,7 @@ class Export extends Module{
8599
8763
  rows.push(this.table.modules.columnCalcs.botRow);
8600
8764
  }
8601
8765
  }
8602
-
8766
+
8603
8767
  rows = rows.filter((row) => {
8604
8768
  switch(row.type){
8605
8769
  case "group":
@@ -8826,7 +8990,8 @@ class Export extends Module{
8826
8990
  if(col){
8827
8991
  var cellEl = document.createElement("td"),
8828
8992
  column = col.component._column,
8829
- index = this.table.columnManager.findColumnIndex(column),
8993
+ table = this.table,
8994
+ index = table.columnManager.findColumnIndex(column),
8830
8995
  value = col.value,
8831
8996
  cellStyle;
8832
8997
 
@@ -8853,6 +9018,9 @@ class Export extends Module{
8853
9018
  getRow:function(){
8854
9019
  return row.component;
8855
9020
  },
9021
+ getTable:function(){
9022
+ return table;
9023
+ },
8856
9024
  getComponent:function(){
8857
9025
  return cellWrapper;
8858
9026
  },
@@ -10511,8 +10679,12 @@ function buttonCross(cell, formatterParams, onRendered){
10511
10679
  function rownum(cell, formatterParams, onRendered){
10512
10680
  var content = document.createElement("span");
10513
10681
  var row = cell.getRow();
10682
+ var table = cell.getTable();
10514
10683
 
10515
10684
  row.watchPosition((position) => {
10685
+ if (formatterParams.relativeToPage) {
10686
+ position += table.modules.page.getPageSize() * (table.modules.page.getPage() - 1);
10687
+ }
10516
10688
  content.innerText = position;
10517
10689
  });
10518
10690
 
@@ -10589,7 +10761,7 @@ function rowSelection(cell, formatterParams, onRendered){
10589
10761
  if(row instanceof RowComponent){
10590
10762
 
10591
10763
  checkbox.addEventListener("change", (e) => {
10592
- if(this.table.options.selectableRangeMode === "click"){
10764
+ if(this.table.options.selectableRowsRangeMode === "click"){
10593
10765
  if(!blocked){
10594
10766
  row.toggleSelect();
10595
10767
  }else {
@@ -10600,7 +10772,7 @@ function rowSelection(cell, formatterParams, onRendered){
10600
10772
  }
10601
10773
  });
10602
10774
 
10603
- if(this.table.options.selectableRangeMode === "click"){
10775
+ if(this.table.options.selectableRowsRangeMode === "click"){
10604
10776
  checkbox.addEventListener("click", (e) => {
10605
10777
  blocked = true;
10606
10778
  this.table.modules.selectRow.handleComplexRowClick(row._row, e);
@@ -10893,7 +11065,9 @@ class FrozenColumns extends Module{
10893
11065
  this.subscribe("columns-loading", this.reset.bind(this));
10894
11066
 
10895
11067
  this.subscribe("column-add", this.reinitializeColumns.bind(this));
10896
- this.subscribe("column-delete", this.reinitializeColumns.bind(this));
11068
+ this.subscribe("column-deleted", this.reinitializeColumns.bind(this));
11069
+ this.subscribe("column-hide", this.reinitializeColumns.bind(this));
11070
+ this.subscribe("column-show", this.reinitializeColumns.bind(this));
10897
11071
 
10898
11072
  this.subscribe("table-redraw", this.layout.bind(this));
10899
11073
  this.subscribe("layout-refreshing", this.blockLayout.bind(this));
@@ -10919,16 +11093,16 @@ class FrozenColumns extends Module{
10919
11093
  this.table.columnManager.columnsByIndex.forEach((column) => {
10920
11094
  this.initializeColumn(column);
10921
11095
  });
11096
+
11097
+ this.layout();
10922
11098
  }
10923
11099
 
10924
11100
  //initialize specific column
10925
11101
  initializeColumn(column){
10926
11102
  var config = {margin:0, edge:false};
10927
11103
 
10928
- if(!column.isGroup){
10929
-
11104
+ if(!column.isGroup){
10930
11105
  if(this.frozenCheck(column)){
10931
-
10932
11106
  config.position = this.initializationMode;
10933
11107
 
10934
11108
  if(this.initializationMode == "left"){
@@ -11019,9 +11193,8 @@ class FrozenColumns extends Module{
11019
11193
  leftParents.push(parentEl);
11020
11194
  }
11021
11195
 
11022
- if(column.modules.frozen.edge){
11023
- parentEl.classList.add("tabulator-frozen-" + column.modules.frozen.position);
11024
- }
11196
+ parentEl.classList.toggle("tabulator-frozen-left", column.modules.frozen.edge && column.modules.frozen.position === "left");
11197
+ parentEl.classList.toggle("tabulator-frozen-right", column.modules.frozen.edge && column.modules.frozen.position === "right");
11025
11198
  }else {
11026
11199
  this.layoutElement(column.getElement(), column);
11027
11200
  }
@@ -11069,7 +11242,6 @@ class FrozenColumns extends Module{
11069
11242
  //layout columns appropriately
11070
11243
  layout(){
11071
11244
  if(this.active && !this.blocked){
11072
-
11073
11245
  //calculate left columns
11074
11246
  this.layoutColumnPosition();
11075
11247
 
@@ -11132,9 +11304,8 @@ class FrozenColumns extends Module{
11132
11304
 
11133
11305
  element.classList.add("tabulator-frozen");
11134
11306
 
11135
- if(column.modules.frozen.edge){
11136
- element.classList.add("tabulator-frozen-" + column.modules.frozen.position);
11137
- }
11307
+ element.classList.toggle("tabulator-frozen-left", column.modules.frozen.edge && column.modules.frozen.position === "left");
11308
+ element.classList.toggle("tabulator-frozen-right", column.modules.frozen.edge && column.modules.frozen.position === "right");
11138
11309
  }
11139
11310
  }
11140
11311
 
@@ -11178,12 +11349,17 @@ class FrozenRows extends Module{
11178
11349
  }
11179
11350
 
11180
11351
  initialize(){
11352
+ var fragment = document.createDocumentFragment();
11353
+
11181
11354
  this.rows = [];
11182
11355
 
11183
11356
  this.topElement.classList.add("tabulator-frozen-rows-holder");
11357
+
11358
+ fragment.appendChild(document.createElement("br"));
11359
+ fragment.appendChild(this.topElement);
11184
11360
 
11185
11361
  // this.table.columnManager.element.append(this.topElement);
11186
- this.table.columnManager.getContentsElement().insertBefore(this.topElement, this.table.columnManager.headersElement.nextSibling);
11362
+ this.table.columnManager.getContentsElement().insertBefore(fragment, this.table.columnManager.headersElement.nextSibling);
11187
11363
 
11188
11364
  this.subscribe("row-deleting", this.detachRow.bind(this));
11189
11365
  this.subscribe("rows-visible", this.visibleRows.bind(this));
@@ -12649,6 +12825,8 @@ var defaultUndoers = {
12649
12825
 
12650
12826
  rowAdd: function(action){
12651
12827
  action.component.deleteActual();
12828
+
12829
+ this.table.rowManager.checkPlaceholder();
12652
12830
  },
12653
12831
 
12654
12832
  rowDelete: function(action){
@@ -12659,6 +12837,8 @@ var defaultUndoers = {
12659
12837
  }
12660
12838
 
12661
12839
  this._rebindRow(action.component, newRow);
12840
+
12841
+ this.table.rowManager.checkPlaceholder();
12662
12842
  },
12663
12843
 
12664
12844
  rowMove: function(action){
@@ -12685,10 +12865,14 @@ var defaultRedoers = {
12685
12865
  }
12686
12866
 
12687
12867
  this._rebindRow(action.component, newRow);
12868
+
12869
+ this.table.rowManager.checkPlaceholder();
12688
12870
  },
12689
12871
 
12690
12872
  rowDelete:function(action){
12691
12873
  action.component.deleteActual();
12874
+
12875
+ this.table.rowManager.checkPlaceholder();
12692
12876
  },
12693
12877
 
12694
12878
  rowMove: function(action){
@@ -12813,7 +12997,7 @@ class History extends Module{
12813
12997
 
12814
12998
  return true;
12815
12999
  }else {
12816
- console.warn("History Undo Error - No more history to undo");
13000
+ console.warn(this.options("history") ? "History Undo Error - No more history to undo" : "History module not enabled");
12817
13001
  return false;
12818
13002
  }
12819
13003
  }
@@ -12831,7 +13015,7 @@ class History extends Module{
12831
13015
 
12832
13016
  return true;
12833
13017
  }else {
12834
- console.warn("History Redo Error - No more history to redo");
13018
+ console.warn(this.options("history") ? "History Redo Error - No more history to redo" : "History module not enabled");
12835
13019
  return false;
12836
13020
  }
12837
13021
  }
@@ -13648,6 +13832,8 @@ var defaultBindings = {
13648
13832
  navNext:9,
13649
13833
  navUp:38,
13650
13834
  navDown:40,
13835
+ navLeft:37,
13836
+ navRight:39,
13651
13837
  scrollPageUp:33,
13652
13838
  scrollPageDown:34,
13653
13839
  scrollToStart:36,
@@ -13655,6 +13841,19 @@ var defaultBindings = {
13655
13841
  undo:["ctrl + 90", "meta + 90"],
13656
13842
  redo:["ctrl + 89", "meta + 89"],
13657
13843
  copyToClipboard:["ctrl + 67", "meta + 67"],
13844
+
13845
+ rangeJumpUp:["ctrl + 38", "meta + 38"],
13846
+ rangeJumpDown:["ctrl + 40", "meta + 40"],
13847
+ rangeJumpLeft:["ctrl + 37", "meta + 37"],
13848
+ rangeJumpRight:["ctrl + 39", "meta + 39"],
13849
+ rangeExpandUp:"shift + 38",
13850
+ rangeExpandDown:"shift + 40",
13851
+ rangeExpandLeft:"shift + 37",
13852
+ rangeExpandRight:"shift + 39",
13853
+ rangeExpandJumpUp:["ctrl + shift + 38", "meta + shift + 38"],
13854
+ rangeExpandJumpDown:["ctrl + shift + 40", "meta + shift + 40"],
13855
+ rangeExpandJumpLeft:["ctrl + shift + 37", "meta + shift + 37"],
13856
+ rangeExpandJumpRight:["ctrl + shift + 39", "meta + shift + 39"],
13658
13857
  };
13659
13858
 
13660
13859
  var defaultActions = {
@@ -13742,6 +13941,43 @@ var defaultActions = {
13742
13941
  this.dispatch("keybinding-nav-down", e);
13743
13942
  },
13744
13943
 
13944
+ rangeJumpLeft: function(e){
13945
+ this.dispatch("keybinding-nav-range", e, "left", true, false);
13946
+ },
13947
+ rangeJumpRight: function(e){
13948
+ this.dispatch("keybinding-nav-range", e, "right", true, false);
13949
+ },
13950
+ rangeJumpUp: function(e){
13951
+ this.dispatch("keybinding-nav-range", e, "up", true, false);
13952
+ },
13953
+ rangeJumpDown: function(e){
13954
+ this.dispatch("keybinding-nav-range", e, "down", true, false);
13955
+ },
13956
+ rangeExpandLeft: function(e){
13957
+ this.dispatch("keybinding-nav-range", e, "left", false, true);
13958
+ },
13959
+ rangeExpandRight: function(e){
13960
+ this.dispatch("keybinding-nav-range", e, "right", false, true);
13961
+ },
13962
+ rangeExpandUp: function(e){
13963
+ this.dispatch("keybinding-nav-range", e, "up", false, true);
13964
+ },
13965
+ rangeExpandDown: function(e){
13966
+ this.dispatch("keybinding-nav-range", e, "down", false, true);
13967
+ },
13968
+ rangeExpandJumpLeft: function(e){
13969
+ this.dispatch("keybinding-nav-range", e, "left", true, true);
13970
+ },
13971
+ rangeExpandJumpRight: function(e){
13972
+ this.dispatch("keybinding-nav-range", e, "right", true, true);
13973
+ },
13974
+ rangeExpandJumpUp: function(e){
13975
+ this.dispatch("keybinding-nav-range", e, "up", true, true);
13976
+ },
13977
+ rangeExpandJumpDown: function(e){
13978
+ this.dispatch("keybinding-nav-range", e, "down", true, true);
13979
+ },
13980
+
13745
13981
  undo:function(e){
13746
13982
  var cell = false;
13747
13983
  if(this.table.options.history && this.table.modExists("history") && this.table.modExists("edit")){
@@ -14020,7 +14256,7 @@ class Menu extends Module{
14020
14256
  this.subscribe("group-dblclick", this.loadMenuEvent.bind(this, this.table.options.groupDblClickMenu));
14021
14257
  }
14022
14258
  }
14023
-
14259
+
14024
14260
  initializeColumn(column){
14025
14261
  var def = column.definition;
14026
14262
 
@@ -14229,6 +14465,7 @@ class Menu extends Module{
14229
14465
  this.rootPopup = null;
14230
14466
 
14231
14467
  if(this.currentComponent){
14468
+ this.dispatch("menu-closed", menu, popup);
14232
14469
  this.dispatchExternal("menuClosed", this.currentComponent.getComponent());
14233
14470
  this.currentComponent = null;
14234
14471
  }
@@ -14236,6 +14473,7 @@ class Menu extends Module{
14236
14473
 
14237
14474
  this.currentComponent = component;
14238
14475
 
14476
+ this.dispatch("menu-opened", menu, popup);
14239
14477
  this.dispatchExternal("menuOpened", component.getComponent());
14240
14478
  }
14241
14479
  }
@@ -14279,8 +14517,13 @@ class MoveColumns extends Module{
14279
14517
  initialize(){
14280
14518
  if(this.table.options.movableColumns){
14281
14519
  this.subscribe("column-init", this.initializeColumn.bind(this));
14520
+ this.subscribe("alert-show", this.abortMove.bind(this));
14282
14521
  }
14283
14522
  }
14523
+
14524
+ abortMove(){
14525
+ clearTimeout(this.checkTimeout);
14526
+ }
14284
14527
 
14285
14528
  initializeColumn(column){
14286
14529
  var self = this,
@@ -16866,7 +17109,7 @@ class Popup$1 extends Module{
16866
17109
  this.subscribe("group-dblclick", this.loadPopupEvent.bind(this, this.table.options.groupDblClickPopup));
16867
17110
  }
16868
17111
  }
16869
-
17112
+
16870
17113
  initializeColumn(column){
16871
17114
  var def = column.definition;
16872
17115
 
@@ -18023,7 +18266,7 @@ class ResizeTable extends Module{
18023
18266
  this.autoResize = true;
18024
18267
 
18025
18268
  this.resizeObserver = new ResizeObserver((entry) => {
18026
- if(!table.browserMobile || (table.browserMobile &&!table.modules.edit.currentCell)){
18269
+ if(!table.browserMobile || (table.browserMobile && (!table.modules.edit || (table.modules.edit && !table.modules.edit.currentCell)))){
18027
18270
 
18028
18271
  var nodeHeight = Math.floor(entry[0].contentRect.height);
18029
18272
  var nodeWidth = Math.floor(entry[0].contentRect.width);
@@ -18049,7 +18292,7 @@ class ResizeTable extends Module{
18049
18292
  if(this.table.element.parentNode && !this.table.rowManager.fixedHeight && (tableStyle.getPropertyValue("max-height") || tableStyle.getPropertyValue("min-height"))){
18050
18293
 
18051
18294
  this.containerObserver = new ResizeObserver((entry) => {
18052
- if(!table.browserMobile || (table.browserMobile &&!table.modules.edit.currentCell)){
18295
+ if(!table.browserMobile || (table.browserMobile && (!table.modules.edit || (table.modules.edit && !table.modules.edit.currentCell)))){
18053
18296
 
18054
18297
  var nodeHeight = Math.floor(entry[0].contentRect.height);
18055
18298
  var nodeWidth = Math.floor(entry[0].contentRect.width);
@@ -18072,7 +18315,7 @@ class ResizeTable extends Module{
18072
18315
 
18073
18316
  }else {
18074
18317
  this.binding = function(){
18075
- if(!table.browserMobile || (table.browserMobile && !table.modules.edit.currentCell)){
18318
+ if(!table.browserMobile || (table.browserMobile && (!table.modules.edit || (table.modules.edit && !table.modules.edit.currentCell)))){
18076
18319
  table.columnManager.rerenderColumns(true);
18077
18320
  table.redraw();
18078
18321
  }
@@ -18491,11 +18734,11 @@ class SelectRow extends Module{
18491
18734
  this.selectedRows = []; //hold selected rows
18492
18735
  this.headerCheckboxElement = null; // hold header select element
18493
18736
 
18494
- this.registerTableOption("selectable", "highlight"); //highlight rows on hover
18495
- this.registerTableOption("selectableRangeMode", "drag"); //highlight rows on hover
18496
- this.registerTableOption("selectableRollingSelection", true); //roll selection once maximum number of selectable rows is reached
18497
- this.registerTableOption("selectablePersistence", true); // maintain selection when table view is updated
18498
- this.registerTableOption("selectableCheck", function(data, row){return true;}); //check whether row is selectable
18737
+ this.registerTableOption("selectableRows", "highlight"); //highlight rows on hover
18738
+ this.registerTableOption("selectableRowsRangeMode", "drag"); //highlight rows on hover
18739
+ this.registerTableOption("selectableRowsRollingSelection", true); //roll selection once maximum number of selectable rows is reached
18740
+ this.registerTableOption("selectableRowsPersistence", true); // maintain selection when table view is updated
18741
+ this.registerTableOption("selectableRowsCheck", function(data, row){return true;}); //check whether row is selectable
18499
18742
 
18500
18743
  this.registerTableFunction("selectRow", this.selectRows.bind(this));
18501
18744
  this.registerTableFunction("deselectRow", this.deselectRows.bind(this));
@@ -18511,17 +18754,32 @@ class SelectRow extends Module{
18511
18754
  }
18512
18755
 
18513
18756
  initialize(){
18514
- if(this.table.options.selectable !== false){
18757
+
18758
+ this.deprecatedOptionsCheck();
18759
+
18760
+ if(this.table.options.selectableRows === "highlight" && this.table.options.selectableRange){
18761
+ this.table.options.selectableRows = false;
18762
+ }
18763
+
18764
+ if(this.table.options.selectableRows !== false){
18515
18765
  this.subscribe("row-init", this.initializeRow.bind(this));
18516
18766
  this.subscribe("row-deleting", this.rowDeleted.bind(this));
18517
18767
  this.subscribe("rows-wipe", this.clearSelectionData.bind(this));
18518
18768
  this.subscribe("rows-retrieve", this.rowRetrieve.bind(this));
18519
18769
 
18520
- if(this.table.options.selectable && !this.table.options.selectablePersistence){
18770
+ if(this.table.options.selectableRows && !this.table.options.selectableRowsPersistence){
18521
18771
  this.subscribe("data-refreshing", this.deselectRows.bind(this));
18522
18772
  }
18523
18773
  }
18524
18774
  }
18775
+
18776
+ deprecatedOptionsCheck(){
18777
+ this.deprecationCheck("selectable", "selectableRows", true);
18778
+ this.deprecationCheck("selectableRollingSelection", "selectableRowsRollingSelection", true);
18779
+ this.deprecationCheck("selectableRangeMode", "selectableRowsRangeMode", true);
18780
+ this.deprecationCheck("selectablePersistence", "selectableRowsPersistence", true);
18781
+ this.deprecationCheck("selectableCheck", "selectableRowsCheck", true);
18782
+ }
18525
18783
 
18526
18784
  rowRetrieve(type, prevValue){
18527
18785
  return type === "selected" ? this.selectedRows : prevValue;
@@ -18546,6 +18804,7 @@ class SelectRow extends Module{
18546
18804
 
18547
18805
  initializeRow(row){
18548
18806
  var self = this,
18807
+ selectable = self.checkRowSelectability(row),
18549
18808
  element = row.getElement();
18550
18809
 
18551
18810
  // trigger end of row selection
@@ -18559,14 +18818,14 @@ class SelectRow extends Module{
18559
18818
  };
18560
18819
 
18561
18820
  row.modules.select = {selected:false};
18821
+
18822
+ element.classList.toggle("tabulator-selectable", selectable);
18823
+ element.classList.toggle("tabulator-unselectable", !selectable);
18562
18824
 
18563
18825
  //set row selection class
18564
- if(self.checkRowSelectability(row)){
18565
- element.classList.add("tabulator-selectable");
18566
- element.classList.remove("tabulator-unselectable");
18567
-
18568
- if(self.table.options.selectable && self.table.options.selectable != "highlight"){
18569
- if(self.table.options.selectableRangeMode === "click"){
18826
+ if(self.checkRowSelectability(row)){
18827
+ if(self.table.options.selectableRows && self.table.options.selectableRows != "highlight"){
18828
+ if(self.table.options.selectableRowsRangeMode === "click"){
18570
18829
  element.addEventListener("click", this.handleComplexRowClick.bind(this, row));
18571
18830
  }else {
18572
18831
  element.addEventListener("click", function(e){
@@ -18615,10 +18874,6 @@ class SelectRow extends Module{
18615
18874
  });
18616
18875
  }
18617
18876
  }
18618
-
18619
- }else {
18620
- element.classList.add("tabulator-unselectable");
18621
- element.classList.remove("tabulator-selectable");
18622
18877
  }
18623
18878
  }
18624
18879
 
@@ -18640,8 +18895,8 @@ class SelectRow extends Module{
18640
18895
  toggledRows.forEach((toggledRow)=>{
18641
18896
  if(toggledRow !== this.lastClickedRow){
18642
18897
 
18643
- if(this.table.options.selectable !== true && !this.isRowSelected(row)){
18644
- if(this.selectedRows.length < this.table.options.selectable){
18898
+ if(this.table.options.selectableRows !== true && !this.isRowSelected(row)){
18899
+ if(this.selectedRows.length < this.table.options.selectableRows){
18645
18900
  this.toggleRow(toggledRow);
18646
18901
  }
18647
18902
  }else {
@@ -18653,9 +18908,9 @@ class SelectRow extends Module{
18653
18908
  }else {
18654
18909
  this.deselectRows(undefined, true);
18655
18910
 
18656
- if(this.table.options.selectable !== true){
18657
- if(toggledRows.length > this.table.options.selectable){
18658
- toggledRows = toggledRows.slice(0, this.table.options.selectable);
18911
+ if(this.table.options.selectableRows !== true){
18912
+ if(toggledRows.length > this.table.options.selectableRows){
18913
+ toggledRows = toggledRows.slice(0, this.table.options.selectableRows);
18659
18914
  }
18660
18915
  }
18661
18916
 
@@ -18675,7 +18930,7 @@ class SelectRow extends Module{
18675
18930
 
18676
18931
  checkRowSelectability(row){
18677
18932
  if(row && row.type === "row"){
18678
- return this.table.options.selectableCheck.call(this.table, row.getComponent());
18933
+ return this.table.options.selectableRowsCheck.call(this.table, row.getComponent());
18679
18934
  }
18680
18935
 
18681
18936
  return false;
@@ -18702,6 +18957,10 @@ class SelectRow extends Module{
18702
18957
  rowMatch = this.table.rowManager.rows;
18703
18958
  break;
18704
18959
 
18960
+ case "number":
18961
+ rowMatch = this.table.rowManager.findRow(rows);
18962
+ break;
18963
+
18705
18964
  case "string":
18706
18965
  rowMatch = this.table.rowManager.findRow(rows);
18707
18966
 
@@ -18737,9 +18996,9 @@ class SelectRow extends Module{
18737
18996
  //select an individual row
18738
18997
  _selectRow(rowInfo, silent, force){
18739
18998
  //handle max row count
18740
- if(!isNaN(this.table.options.selectable) && this.table.options.selectable !== true && !force){
18741
- if(this.selectedRows.length >= this.table.options.selectable){
18742
- if(this.table.options.selectableRollingSelection){
18999
+ if(!isNaN(this.table.options.selectableRows) && this.table.options.selectableRows !== true && !force){
19000
+ if(this.selectedRows.length >= this.table.options.selectableRows){
19001
+ if(this.table.options.selectableRowsRollingSelection){
18743
19002
  this._deselectRow(this.selectedRows[0]);
18744
19003
  }else {
18745
19004
  return false;
@@ -18793,6 +19052,10 @@ class SelectRow extends Module{
18793
19052
  case "undefined":
18794
19053
  rowMatch = Object.assign([], this.selectedRows);
18795
19054
  break;
19055
+
19056
+ case "number":
19057
+ rowMatch = this.table.rowManager.findRow(rows);
19058
+ break;
18796
19059
 
18797
19060
  case "string":
18798
19061
  rowMatch = this.table.rowManager.findRow(rows);
@@ -19220,90 +19483,90 @@ var defaultSorters = {
19220
19483
  };
19221
19484
 
19222
19485
  class Sort extends Module{
19223
-
19486
+
19224
19487
  constructor(table){
19225
19488
  super(table);
19226
-
19489
+
19227
19490
  this.sortList = []; //holder current sort
19228
19491
  this.changed = false; //has the sort changed since last render
19229
-
19492
+
19230
19493
  this.registerTableOption("sortMode", "local"); //local or remote sorting
19231
-
19494
+
19232
19495
  this.registerTableOption("initialSort", false); //initial sorting criteria
19233
19496
  this.registerTableOption("columnHeaderSortMulti", true); //multiple or single column sorting
19234
19497
  this.registerTableOption("sortOrderReverse", false); //reverse internal sort ordering
19235
19498
  this.registerTableOption("headerSortElement", "<div class='tabulator-arrow'></div>"); //header sort element
19236
19499
  this.registerTableOption("headerSortClickElement", "header"); //element which triggers sort when clicked
19237
-
19500
+
19238
19501
  this.registerColumnOption("sorter");
19239
19502
  this.registerColumnOption("sorterParams");
19240
-
19503
+
19241
19504
  this.registerColumnOption("headerSort", true);
19242
19505
  this.registerColumnOption("headerSortStartingDir");
19243
19506
  this.registerColumnOption("headerSortTristate");
19244
-
19507
+
19245
19508
  }
19246
-
19509
+
19247
19510
  initialize(){
19248
19511
  this.subscribe("column-layout", this.initializeColumn.bind(this));
19249
19512
  this.subscribe("table-built", this.tableBuilt.bind(this));
19250
19513
  this.registerDataHandler(this.sort.bind(this), 20);
19251
-
19514
+
19252
19515
  this.registerTableFunction("setSort", this.userSetSort.bind(this));
19253
19516
  this.registerTableFunction("getSorters", this.getSort.bind(this));
19254
19517
  this.registerTableFunction("clearSort", this.clearSort.bind(this));
19255
-
19518
+
19256
19519
  if(this.table.options.sortMode === "remote"){
19257
19520
  this.subscribe("data-params", this.remoteSortParams.bind(this));
19258
19521
  }
19259
19522
  }
19260
-
19523
+
19261
19524
  tableBuilt(){
19262
19525
  if(this.table.options.initialSort){
19263
19526
  this.setSort(this.table.options.initialSort);
19264
19527
  }
19265
19528
  }
19266
-
19529
+
19267
19530
  remoteSortParams(data, config, silent, params){
19268
19531
  var sorters = this.getSort();
19269
-
19532
+
19270
19533
  sorters.forEach((item) => {
19271
19534
  delete item.column;
19272
19535
  });
19273
-
19536
+
19274
19537
  params.sort = sorters;
19275
-
19538
+
19276
19539
  return params;
19277
19540
  }
19278
-
19279
-
19541
+
19542
+
19280
19543
  ///////////////////////////////////
19281
19544
  ///////// Table Functions /////////
19282
19545
  ///////////////////////////////////
19283
-
19546
+
19284
19547
  userSetSort(sortList, dir){
19285
19548
  this.setSort(sortList, dir);
19286
19549
  // this.table.rowManager.sorterRefresh();
19287
19550
  this.refreshSort();
19288
19551
  }
19289
-
19552
+
19290
19553
  clearSort(){
19291
19554
  this.clear();
19292
19555
  // this.table.rowManager.sorterRefresh();
19293
19556
  this.refreshSort();
19294
19557
  }
19295
-
19296
-
19558
+
19559
+
19297
19560
  ///////////////////////////////////
19298
19561
  ///////// Internal Logic //////////
19299
19562
  ///////////////////////////////////
19300
-
19563
+
19301
19564
  //initialize column header for sorting
19302
19565
  initializeColumn(column){
19303
19566
  var sorter = false,
19304
19567
  colEl,
19305
19568
  arrowEl;
19306
-
19569
+
19307
19570
  switch(typeof column.definition.sorter){
19308
19571
  case "string":
19309
19572
  if(Sort.sorters[column.definition.sorter]){
@@ -19312,28 +19575,28 @@ class Sort extends Module{
19312
19575
  console.warn("Sort Error - No such sorter found: ", column.definition.sorter);
19313
19576
  }
19314
19577
  break;
19315
-
19578
+
19316
19579
  case "function":
19317
19580
  sorter = column.definition.sorter;
19318
19581
  break;
19319
19582
  }
19320
-
19583
+
19321
19584
  column.modules.sort = {
19322
19585
  sorter:sorter, dir:"none",
19323
19586
  params:column.definition.sorterParams || {},
19324
19587
  startingDir:column.definition.headerSortStartingDir || "asc",
19325
19588
  tristate: column.definition.headerSortTristate,
19326
19589
  };
19327
-
19590
+
19328
19591
  if(column.definition.headerSort !== false){
19329
-
19592
+
19330
19593
  colEl = column.getElement();
19331
-
19594
+
19332
19595
  colEl.classList.add("tabulator-sortable");
19333
-
19596
+
19334
19597
  arrowEl = document.createElement("div");
19335
19598
  arrowEl.classList.add("tabulator-col-sorter");
19336
-
19599
+
19337
19600
  switch(this.table.options.headerSortClickElement){
19338
19601
  case "icon":
19339
19602
  arrowEl.classList.add("tabulator-col-sorter-element");
@@ -19345,33 +19608,39 @@ class Sort extends Module{
19345
19608
  colEl.classList.add("tabulator-col-sorter-element");
19346
19609
  break;
19347
19610
  }
19348
-
19611
+
19349
19612
  switch(this.table.options.headerSortElement){
19350
19613
  case "function":
19351
- //do nothing
19614
+ //do nothing
19352
19615
  break;
19353
-
19616
+
19354
19617
  case "object":
19355
19618
  arrowEl.appendChild(this.table.options.headerSortElement);
19356
19619
  break;
19357
-
19620
+
19358
19621
  default:
19359
19622
  arrowEl.innerHTML = this.table.options.headerSortElement;
19360
19623
  }
19361
-
19624
+
19362
19625
  //create sorter arrow
19363
19626
  column.titleHolderElement.appendChild(arrowEl);
19364
-
19627
+
19365
19628
  column.modules.sort.element = arrowEl;
19366
-
19629
+
19367
19630
  this.setColumnHeaderSortIcon(column, "none");
19368
-
19631
+
19632
+ if(this.table.options.headerSortClickElement === "icon"){
19633
+ arrowEl.addEventListener("mousedown", (e) => {
19634
+ e.stopPropagation();
19635
+ });
19636
+ }
19637
+
19369
19638
  //sort on click
19370
19639
  (this.table.options.headerSortClickElement === "icon" ? arrowEl : colEl).addEventListener("click", (e) => {
19371
19640
  var dir = "",
19372
19641
  sorters=[],
19373
19642
  match = false;
19374
-
19643
+
19375
19644
  if(column.modules.sort){
19376
19645
  if(column.modules.sort.tristate){
19377
19646
  if(column.modules.sort.dir == "none"){
@@ -19388,26 +19657,26 @@ class Sort extends Module{
19388
19657
  case "asc":
19389
19658
  dir = "desc";
19390
19659
  break;
19391
-
19660
+
19392
19661
  case "desc":
19393
19662
  dir = "asc";
19394
19663
  break;
19395
-
19664
+
19396
19665
  default:
19397
19666
  dir = column.modules.sort.startingDir;
19398
19667
  }
19399
19668
  }
19400
-
19669
+
19401
19670
  if (this.table.options.columnHeaderSortMulti && (e.shiftKey || e.ctrlKey)) {
19402
19671
  sorters = this.getSort();
19403
-
19672
+
19404
19673
  match = sorters.findIndex((sorter) => {
19405
19674
  return sorter.field === column.getField();
19406
19675
  });
19407
-
19676
+
19408
19677
  if(match > -1){
19409
19678
  sorters[match].dir = dir;
19410
-
19679
+
19411
19680
  match = sorters.splice(match, 1)[0];
19412
19681
  if(dir != "none"){
19413
19682
  sorters.push(match);
@@ -19417,7 +19686,7 @@ class Sort extends Module{
19417
19686
  sorters.push({column:column, dir:dir});
19418
19687
  }
19419
19688
  }
19420
-
19689
+
19421
19690
  //add to existing sort
19422
19691
  this.setSort(sorters);
19423
19692
  }else {
@@ -19427,63 +19696,63 @@ class Sort extends Module{
19427
19696
  //sort by column only
19428
19697
  this.setSort(column, dir);
19429
19698
  }
19430
-
19699
+
19431
19700
  }
19432
-
19701
+
19433
19702
  // this.table.rowManager.sorterRefresh(!this.sortList.length);
19434
19703
  this.refreshSort();
19435
19704
  }
19436
19705
  });
19437
19706
  }
19438
19707
  }
19439
-
19708
+
19440
19709
  refreshSort(){
19441
19710
  if(this.table.options.sortMode === "remote"){
19442
19711
  this.reloadData(null, false, false);
19443
19712
  }else {
19444
19713
  this.refreshData(true);
19445
19714
  }
19446
-
19715
+
19447
19716
  //TODO - Persist left position of row manager
19448
19717
  // left = this.scrollLeft;
19449
19718
  // this.scrollHorizontal(left);
19450
19719
  }
19451
-
19720
+
19452
19721
  //check if the sorters have changed since last use
19453
19722
  hasChanged(){
19454
19723
  var changed = this.changed;
19455
19724
  this.changed = false;
19456
19725
  return changed;
19457
19726
  }
19458
-
19727
+
19459
19728
  //return current sorters
19460
19729
  getSort(){
19461
19730
  var self = this,
19462
19731
  sorters = [];
19463
-
19732
+
19464
19733
  self.sortList.forEach(function(item){
19465
19734
  if(item.column){
19466
19735
  sorters.push({column:item.column.getComponent(), field:item.column.getField(), dir:item.dir});
19467
19736
  }
19468
19737
  });
19469
-
19738
+
19470
19739
  return sorters;
19471
19740
  }
19472
-
19741
+
19473
19742
  //change sort list and trigger sort
19474
19743
  setSort(sortList, dir){
19475
19744
  var self = this,
19476
19745
  newSortList = [];
19477
-
19746
+
19478
19747
  if(!Array.isArray(sortList)){
19479
19748
  sortList = [{column: sortList, dir:dir}];
19480
19749
  }
19481
-
19750
+
19482
19751
  sortList.forEach(function(item){
19483
19752
  var column;
19484
-
19753
+
19485
19754
  column = self.table.columnManager.findColumn(item.column);
19486
-
19755
+
19487
19756
  if(column){
19488
19757
  item.column = column;
19489
19758
  newSortList.push(item);
@@ -19491,42 +19760,42 @@ class Sort extends Module{
19491
19760
  }else {
19492
19761
  console.warn("Sort Warning - Sort field does not exist and is being ignored: ", item.column);
19493
19762
  }
19494
-
19763
+
19495
19764
  });
19496
-
19765
+
19497
19766
  self.sortList = newSortList;
19498
-
19767
+
19499
19768
  this.dispatch("sort-changed");
19500
19769
  }
19501
-
19770
+
19502
19771
  //clear sorters
19503
19772
  clear(){
19504
19773
  this.setSort([]);
19505
19774
  }
19506
-
19775
+
19507
19776
  //find appropriate sorter for column
19508
19777
  findSorter(column){
19509
19778
  var row = this.table.rowManager.activeRows[0],
19510
19779
  sorter = "string",
19511
19780
  field, value;
19512
-
19781
+
19513
19782
  if(row){
19514
19783
  row = row.getData();
19515
19784
  field = column.getField();
19516
-
19785
+
19517
19786
  if(field){
19518
-
19787
+
19519
19788
  value = column.getFieldValue(row);
19520
-
19789
+
19521
19790
  switch(typeof value){
19522
19791
  case "undefined":
19523
19792
  sorter = "string";
19524
19793
  break;
19525
-
19794
+
19526
19795
  case "boolean":
19527
19796
  sorter = "boolean";
19528
19797
  break;
19529
-
19798
+
19530
19799
  default:
19531
19800
  if(!isNaN(value) && value !== ""){
19532
19801
  sorter = "number";
@@ -19539,151 +19808,1433 @@ class Sort extends Module{
19539
19808
  }
19540
19809
  }
19541
19810
  }
19542
-
19543
- return Sort.sorters[sorter];
19811
+
19812
+ return Sort.sorters[sorter];
19813
+ }
19814
+
19815
+ //work through sort list sorting data
19816
+ sort(data){
19817
+ var self = this,
19818
+ sortList = this.table.options.sortOrderReverse ? self.sortList.slice().reverse() : self.sortList,
19819
+ sortListActual = [],
19820
+ rowComponents = [];
19821
+
19822
+ if(this.subscribedExternal("dataSorting")){
19823
+ this.dispatchExternal("dataSorting", self.getSort());
19824
+ }
19825
+
19826
+ self.clearColumnHeaders();
19827
+
19828
+ if(this.table.options.sortMode !== "remote"){
19829
+
19830
+ //build list of valid sorters and trigger column specific callbacks before sort begins
19831
+ sortList.forEach(function(item, i){
19832
+ var sortObj;
19833
+
19834
+ if(item.column){
19835
+ sortObj = item.column.modules.sort;
19836
+
19837
+ if(sortObj){
19838
+
19839
+ //if no sorter has been defined, take a guess
19840
+ if(!sortObj.sorter){
19841
+ sortObj.sorter = self.findSorter(item.column);
19842
+ }
19843
+
19844
+ item.params = typeof sortObj.params === "function" ? sortObj.params(item.column.getComponent(), item.dir) : sortObj.params;
19845
+
19846
+ sortListActual.push(item);
19847
+ }
19848
+
19849
+ self.setColumnHeader(item.column, item.dir);
19850
+ }
19851
+ });
19852
+
19853
+ //sort data
19854
+ if (sortListActual.length) {
19855
+ self._sortItems(data, sortListActual);
19856
+ }
19857
+
19858
+ }else {
19859
+ sortList.forEach(function(item, i){
19860
+ self.setColumnHeader(item.column, item.dir);
19861
+ });
19862
+ }
19863
+
19864
+ if(this.subscribedExternal("dataSorted")){
19865
+ data.forEach((row) => {
19866
+ rowComponents.push(row.getComponent());
19867
+ });
19868
+
19869
+ this.dispatchExternal("dataSorted", self.getSort(), rowComponents);
19870
+ }
19871
+
19872
+ return data;
19873
+ }
19874
+
19875
+ //clear sort arrows on columns
19876
+ clearColumnHeaders(){
19877
+ this.table.columnManager.getRealColumns().forEach((column) => {
19878
+ if(column.modules.sort){
19879
+ column.modules.sort.dir = "none";
19880
+ column.getElement().setAttribute("aria-sort", "none");
19881
+ this.setColumnHeaderSortIcon(column, "none");
19882
+ }
19883
+ });
19884
+ }
19885
+
19886
+ //set the column header sort direction
19887
+ setColumnHeader(column, dir){
19888
+ column.modules.sort.dir = dir;
19889
+ column.getElement().setAttribute("aria-sort", dir === "asc" ? "ascending" : "descending");
19890
+ this.setColumnHeaderSortIcon(column, dir);
19891
+ }
19892
+
19893
+ setColumnHeaderSortIcon(column, dir){
19894
+ var sortEl = column.modules.sort.element,
19895
+ arrowEl;
19896
+
19897
+ if(column.definition.headerSort && typeof this.table.options.headerSortElement === "function"){
19898
+ while(sortEl.firstChild) sortEl.removeChild(sortEl.firstChild);
19899
+
19900
+ arrowEl = this.table.options.headerSortElement.call(this.table, column.getComponent(), dir);
19901
+
19902
+ if(typeof arrowEl === "object"){
19903
+ sortEl.appendChild(arrowEl);
19904
+ }else {
19905
+ sortEl.innerHTML = arrowEl;
19906
+ }
19907
+ }
19908
+ }
19909
+
19910
+ //sort each item in sort list
19911
+ _sortItems(data, sortList){
19912
+ var sorterCount = sortList.length - 1;
19913
+
19914
+ data.sort((a, b) => {
19915
+ var result;
19916
+
19917
+ for(var i = sorterCount; i>= 0; i--){
19918
+ let sortItem = sortList[i];
19919
+
19920
+ result = this._sortRow(a, b, sortItem.column, sortItem.dir, sortItem.params);
19921
+
19922
+ if(result !== 0){
19923
+ break;
19924
+ }
19925
+ }
19926
+
19927
+ return result;
19928
+ });
19929
+ }
19930
+
19931
+ //process individual rows for a sort function on active data
19932
+ _sortRow(a, b, column, dir, params){
19933
+ var el1Comp, el2Comp;
19934
+
19935
+ //switch elements depending on search direction
19936
+ var el1 = dir == "asc" ? a : b;
19937
+ var el2 = dir == "asc" ? b : a;
19938
+
19939
+ a = column.getFieldValue(el1.getData());
19940
+ b = column.getFieldValue(el2.getData());
19941
+
19942
+ a = typeof a !== "undefined" ? a : "";
19943
+ b = typeof b !== "undefined" ? b : "";
19944
+
19945
+ el1Comp = el1.getComponent();
19946
+ el2Comp = el2.getComponent();
19947
+
19948
+ return column.modules.sort.sorter.call(this, a, b, el1Comp, el2Comp, column.getComponent(), dir, params);
19949
+ }
19950
+ }
19951
+
19952
+ Sort.moduleName = "sort";
19953
+
19954
+ //load defaults
19955
+ Sort.sorters = defaultSorters;
19956
+
19957
+ class RangeComponent {
19958
+ constructor(range) {
19959
+ this._range = range;
19960
+
19961
+ return new Proxy(this, {
19962
+ get: function (target, name, receiver) {
19963
+ if (typeof target[name] !== "undefined") {
19964
+ return target[name];
19965
+ } else {
19966
+ return target._range.table.componentFunctionBinder.handle("range", target._range, name);
19967
+ }
19968
+ },
19969
+ });
19970
+ }
19971
+
19972
+ getElement() {
19973
+ return this._range.element;
19974
+ }
19975
+
19976
+ getData() {
19977
+ return this._range.getData();
19978
+ }
19979
+
19980
+ getCells() {
19981
+ return this._range.getCells(true);
19982
+ }
19983
+
19984
+ getStructuredCells() {
19985
+ return this._range.getStructuredCells();
19986
+ }
19987
+
19988
+ getRows() {
19989
+ return this._range.getRows().map((row) => row.getComponent());
19990
+ }
19991
+
19992
+ getColumns() {
19993
+ return this._range.getColumns().map((column) => column.getComponent());
19994
+ }
19995
+
19996
+ getBounds() {
19997
+ return this._range.getBounds();
19998
+ }
19999
+
20000
+ getTopEdge() {
20001
+ return this._range.top;
20002
+ }
20003
+
20004
+ getBottomEdge() {
20005
+ return this._range.bottom;
20006
+ }
20007
+
20008
+ getLeftEdge() {
20009
+ return this._range.left;
20010
+ }
20011
+
20012
+ getRightEdge() {
20013
+ return this._range.right;
20014
+ }
20015
+
20016
+ setBounds(start, end){
20017
+ if(this._range.destroyedGuard("setBounds")){
20018
+ this._range.setBounds(start ? start._cell : start, end ? end._cell : end);
20019
+ }
20020
+ }
20021
+
20022
+ setStartBound(start){
20023
+ if(this._range.destroyedGuard("setStartBound")){
20024
+ this._range.setEndBound(start ? start._cell : start);
20025
+ this._range.rangeManager.layoutElement();
20026
+ }
20027
+ }
20028
+
20029
+ setEndBound(end){
20030
+ if(this._range.destroyedGuard("setEndBound")){
20031
+ this._range.setEndBound(end ? end._cell : end);
20032
+ this._range.rangeManager.layoutElement();
20033
+ }
20034
+ }
20035
+
20036
+ clearValues(){
20037
+ if(this._range.destroyedGuard("clearValues")){
20038
+ this._range.clearValues();
20039
+ }
20040
+ }
20041
+
20042
+ remove(){
20043
+ if(this._range.destroyedGuard("remove")){
20044
+ this._range.destroy(true);
20045
+ }
20046
+ }
20047
+ }
20048
+
20049
+ class Range extends CoreFeature{
20050
+ constructor(table, rangeManager, start, end) {
20051
+ super(table);
20052
+
20053
+ this.rangeManager = rangeManager;
20054
+ this.element = null;
20055
+ this.initialized = false;
20056
+ this.initializing = {
20057
+ start:false,
20058
+ end:false,
20059
+ };
20060
+ this.destroyed = false;
20061
+
20062
+ this.top = 0;
20063
+ this.bottom = 0;
20064
+ this.left = 0;
20065
+ this.right = 0;
20066
+
20067
+ this.table = table;
20068
+ this.start = {row:0, col:0};
20069
+ this.end = {row:0, col:0};
20070
+
20071
+ this.initElement();
20072
+
20073
+ setTimeout(() => {
20074
+ this.initBounds(start, end);
20075
+ });
20076
+ }
20077
+
20078
+ initElement(){
20079
+ this.element = document.createElement("div");
20080
+ this.element.classList.add("tabulator-range");
20081
+ }
20082
+
20083
+ initBounds(start, end){
20084
+ this._updateMinMax();
20085
+
20086
+ if(start){
20087
+ this.setBounds(start, end || start);
20088
+ }
20089
+ }
20090
+
20091
+ ///////////////////////////////////
20092
+ /////// Boundary Setup ///////
20093
+ ///////////////////////////////////
20094
+
20095
+ setStart(row, col) {
20096
+ if(this.start.row !== row || this.start.col !== col){
20097
+ this.start.row = row;
20098
+ this.start.col = col;
20099
+
20100
+ this.initializing.start = true;
20101
+ this._updateMinMax();
20102
+ }
20103
+ }
20104
+
20105
+ setEnd(row, col) {
20106
+ if(this.end.row !== row || this.end.col !== col){
20107
+ this.end.row = row;
20108
+ this.end.col = col;
20109
+
20110
+ this.initializing.end = true;
20111
+ this._updateMinMax();
20112
+ }
20113
+ }
20114
+
20115
+ setBounds(start, end, visibleRows){
20116
+ if(start){
20117
+ this.setStartBound(start);
20118
+ }
20119
+
20120
+ this.setEndBound(end || start);
20121
+ this.rangeManager.layoutElement(visibleRows);
20122
+ }
20123
+
20124
+ setStartBound(element){
20125
+ var row, col;
20126
+
20127
+ if (element.type === "column") {
20128
+ if(this.rangeManager.columnSelection){
20129
+ this.setStart(0, element.getPosition() - 2);
20130
+ }
20131
+ }else {
20132
+ row = element.row.position - 1;
20133
+ col = element.column.getPosition() - 2;
20134
+
20135
+ if (element.column === this.rangeManager.rowHeader) {
20136
+ this.setStart(row, 0);
20137
+ } else {
20138
+ this.setStart(row, col);
20139
+ }
20140
+ }
20141
+ }
20142
+
20143
+ setEndBound(element){
20144
+ var rowsCount = this._getTableRows().length,
20145
+ row, col, isRowHeader;
20146
+
20147
+ if (element.type === "column") {
20148
+ if(this.rangeManager.columnSelection){
20149
+ if (this.rangeManager.selecting === "column") {
20150
+ this.setEnd(rowsCount - 1, element.getPosition() - 2);
20151
+ } else if (this.rangeManager.selecting === "cell") {
20152
+ this.setEnd(0, element.getPosition() - 2);
20153
+ }
20154
+ }
20155
+ }else {
20156
+ row = element.row.position - 1;
20157
+ col = element.column.getPosition() - 2;
20158
+ isRowHeader = element.column === this.rangeManager.rowHeader;
20159
+
20160
+ if (this.rangeManager.selecting === "row") {
20161
+ this.setEnd(row, this._getTableColumns().length - 2);
20162
+ } else if (this.rangeManager.selecting !== "row" && isRowHeader) {
20163
+ this.setEnd(row, 0);
20164
+ } else if (this.rangeManager.selecting === "column") {
20165
+ this.setEnd(rowsCount - 1, col);
20166
+ } else {
20167
+ this.setEnd(row, col);
20168
+ }
20169
+ }
20170
+ }
20171
+
20172
+ _updateMinMax() {
20173
+ this.top = Math.min(this.start.row, this.end.row);
20174
+ this.bottom = Math.max(this.start.row, this.end.row);
20175
+ this.left = Math.min(this.start.col, this.end.col);
20176
+ this.right = Math.max(this.start.col, this.end.col);
20177
+
20178
+ if(this.initialized){
20179
+ this.dispatchExternal("rangeChanged", this.getComponent());
20180
+ }else {
20181
+ if(this.initializing.start && this.initializing.end){
20182
+ this.initialized = true;
20183
+ this.dispatchExternal("rangeAdded", this.getComponent());
20184
+ }
20185
+ }
20186
+ }
20187
+
20188
+ _getTableColumns() {
20189
+ return this.table.columnManager.getVisibleColumnsByIndex();
20190
+ }
20191
+
20192
+ _getTableRows() {
20193
+ return this.table.rowManager.getDisplayRows();
20194
+ }
20195
+
20196
+ ///////////////////////////////////
20197
+ /////// Rendering ///////
20198
+ ///////////////////////////////////
20199
+
20200
+ layout() {
20201
+ var _vDomTop = this.table.rowManager.renderer.vDomTop,
20202
+ _vDomBottom = this.table.rowManager.renderer.vDomBottom,
20203
+ _vDomLeft = this.table.columnManager.renderer.leftCol,
20204
+ _vDomRight = this.table.columnManager.renderer.rightCol,
20205
+ top, bottom, left, right, topLeftCell, bottomRightCell;
20206
+
20207
+ if (_vDomTop == null) {
20208
+ _vDomTop = 0;
20209
+ }
20210
+
20211
+ if (_vDomBottom == null) {
20212
+ _vDomBottom = Infinity;
20213
+ }
20214
+
20215
+ if (_vDomLeft == null) {
20216
+ _vDomLeft = 0;
20217
+ }
20218
+
20219
+ if (_vDomRight == null) {
20220
+ _vDomRight = Infinity;
20221
+ }
20222
+
20223
+ if (this.overlaps(_vDomLeft, _vDomTop, _vDomRight, _vDomBottom)) {
20224
+ top = Math.max(this.top, _vDomTop);
20225
+ bottom = Math.min(this.bottom, _vDomBottom);
20226
+ left = Math.max(this.left, _vDomLeft);
20227
+ right = Math.min(this.right, _vDomRight);
20228
+
20229
+ topLeftCell = this.rangeManager.getCell(top, left);
20230
+ bottomRightCell = this.rangeManager.getCell(bottom, right);
20231
+
20232
+ this.element.classList.add("tabulator-range-active");
20233
+ // this.element.classList.toggle("tabulator-range-active", this === this.rangeManager.activeRange);
20234
+
20235
+ this.element.style.left = topLeftCell.row.getElement().offsetLeft + topLeftCell.getElement().offsetLeft + "px";
20236
+ this.element.style.top = topLeftCell.row.getElement().offsetTop + "px";
20237
+ this.element.style.width = bottomRightCell.getElement().offsetLeft + bottomRightCell.getElement().offsetWidth - topLeftCell.getElement().offsetLeft + "px";
20238
+ this.element.style.height = bottomRightCell.row.getElement().offsetTop + bottomRightCell.row.getElement().offsetHeight - topLeftCell.row.getElement().offsetTop + "px";
20239
+ }
20240
+ }
20241
+
20242
+ atTopLeft(cell) {
20243
+ return cell.row.position - 1 === this.top && cell.column.getPosition() - 2 === this.left;
20244
+ }
20245
+
20246
+ atBottomRight(cell) {
20247
+ return cell.row.position - 1 === this.bottom && cell.column.getPosition() - 2 === this.right;
20248
+ }
20249
+
20250
+ occupies(cell) {
20251
+ return this.occupiesRow(cell.row) && this.occupiesColumn(cell.column);
20252
+ }
20253
+
20254
+ occupiesRow(row) {
20255
+ return this.top <= row.position - 1 && row.position - 1 <= this.bottom;
20256
+ }
20257
+
20258
+ occupiesColumn(col) {
20259
+ return this.left <= col.getPosition() - 2 && col.getPosition() - 2 <= this.right;
20260
+ }
20261
+
20262
+ overlaps(left, top, right, bottom) {
20263
+ if ((this.left > right || left > this.right) || (this.top > bottom || top > this.bottom)){
20264
+ return false;
20265
+ }
20266
+
20267
+ return true;
20268
+ }
20269
+
20270
+ getData() {
20271
+ var data = [],
20272
+ rows = this.getRows(),
20273
+ columns = this.getColumns();
20274
+
20275
+ rows.forEach((row) => {
20276
+ var rowData = row.getData(),
20277
+ result = {};
20278
+
20279
+ columns.forEach((column) => {
20280
+ result[column.field] = rowData[column.field];
20281
+ });
20282
+
20283
+ data.push(result);
20284
+ });
20285
+
20286
+ return data;
20287
+ }
20288
+
20289
+ getCells(structured, component) {
20290
+ var cells = [],
20291
+ rows = this.getRows(),
20292
+ columns = this.getColumns();
20293
+
20294
+ if (structured) {
20295
+ cells = rows.map((row) => {
20296
+ var arr = [];
20297
+
20298
+ row.getCells().forEach((cell) => {
20299
+ if (columns.includes(cell.column)) {
20300
+ arr.push(component ? cell.getComponent() : cell);
20301
+ }
20302
+ });
20303
+
20304
+ return arr;
20305
+ });
20306
+ } else {
20307
+ rows.forEach((row) => {
20308
+ row.getCells().forEach((cell) => {
20309
+ if (columns.includes(cell.column)) {
20310
+ cells.push(component ? cell.getComponent() : cell);
20311
+ }
20312
+ });
20313
+ });
20314
+ }
20315
+
20316
+ return cells;
20317
+ }
20318
+
20319
+ getStructuredCells() {
20320
+ return this.getCells(true, true);
20321
+ }
20322
+
20323
+ getRows() {
20324
+ return this._getTableRows().slice(this.top, this.bottom + 1);
20325
+ }
20326
+
20327
+ getColumns() {
20328
+ return this._getTableColumns().slice(this.left + 1, this.right + 2);
20329
+ }
20330
+
20331
+ clearValues(){
20332
+ var cells = this.getCells();
20333
+ var clearValue = this.table.options.selectableRangeClearCellsValue;
20334
+
20335
+ this.table.blockRedraw();
20336
+
20337
+ cells.forEach((cell) => {
20338
+ cell.setValue(clearValue);
20339
+ });
20340
+
20341
+ this.table.restoreRedraw();
20342
+
20343
+ }
20344
+
20345
+ getBounds(component){
20346
+ var cells = this.getCells(false, component),
20347
+ output = {
20348
+ start:null,
20349
+ end:null,
20350
+ };
20351
+
20352
+ if(cells.length){
20353
+ output.start = cells[0];
20354
+ output.end = cells[cells.length - 1];
20355
+ }else {
20356
+ console.warn("No bounds defined on range");
20357
+ }
20358
+
20359
+ return output;
20360
+ }
20361
+
20362
+ getComponent() {
20363
+ if (!this.component) {
20364
+ this.component = new RangeComponent(this);
20365
+ }
20366
+ return this.component;
20367
+ }
20368
+
20369
+ destroy(notify) {
20370
+ this.destroyed = true;
20371
+
20372
+ this.element.remove();
20373
+
20374
+ if(notify){
20375
+ this.rangeManager.rangeRemoved(this);
20376
+ }
20377
+
20378
+ if(this.initialized){
20379
+ this.dispatchExternal("rangeRemoved", this.getComponent());
20380
+ }
20381
+ }
20382
+
20383
+ destroyedGuard(func){
20384
+ if(this.destroyed){
20385
+ console.warn("You cannot call the " + func + " function on a destroyed range");
20386
+ }
20387
+
20388
+ return !this.destroyed;
20389
+ }
20390
+ }
20391
+
20392
+ class SelectRange extends Module {
20393
+ constructor(table) {
20394
+ super(table);
20395
+
20396
+ this.selecting = "cell";
20397
+ this.mousedown = false;
20398
+ this.ranges = [];
20399
+ this.overlay = null;
20400
+ this.rowHeader = null;
20401
+ this.layoutChangeTimeout = null;
20402
+ this.columnSelection = false;
20403
+ this.rowSelection = false;
20404
+ this.maxRanges = 0;
20405
+ this.activeRange = false;
20406
+ this.blockKeydown = false;
20407
+
20408
+ this.keyDownEvent = this._handleKeyDown.bind(this);
20409
+ this.mouseUpEvent = this._handleMouseUp.bind(this);
20410
+
20411
+ this.registerTableOption("selectableRange", false); //enable selectable range
20412
+ this.registerTableOption("selectableRangeColumns", false); //enable selectable range
20413
+ this.registerTableOption("selectableRangeRows", false); //enable selectable range
20414
+ this.registerTableOption("selectableRangeClearCells", false); //allow clearing of active range
20415
+ this.registerTableOption("selectableRangeClearCellsValue", undefined); //value for cleared active range
20416
+
20417
+ this.registerTableFunction("getRangesData", this.getRangesData.bind(this));
20418
+ this.registerTableFunction("getRanges", this.getRanges.bind(this));
20419
+ this.registerTableFunction("addRange", this.addRangeFromComponent.bind(this));
20420
+
20421
+ this.registerComponentFunction("cell", "getRanges", this.cellGetRanges.bind(this));
20422
+ this.registerComponentFunction("row", "getRanges", this.rowGetRanges.bind(this));
20423
+ this.registerComponentFunction("column", "getRanges", this.colGetRanges.bind(this));
20424
+ }
20425
+
20426
+ ///////////////////////////////////
20427
+ /////// Initialization ///////
20428
+ ///////////////////////////////////
20429
+
20430
+ initialize() {
20431
+ if (this.options("selectableRange")) {
20432
+ if(!this.options("selectableRows")){
20433
+
20434
+ this.maxRanges = this.options("selectableRange");
20435
+
20436
+ this.initializeTable();
20437
+ this.initializeWatchers();
20438
+ }else {
20439
+ console.warn("SelectRange functionality cannot be used in conjunction with row selection");
20440
+ }
20441
+ }
20442
+ }
20443
+
20444
+
20445
+ initializeTable() {
20446
+ this.overlay = document.createElement("div");
20447
+ this.overlay.classList.add("tabulator-range-overlay");
20448
+
20449
+ this.rangeContainer = document.createElement("div");
20450
+ this.rangeContainer.classList.add("tabulator-range-container");
20451
+
20452
+ this.activeRangeCellElement = document.createElement("div");
20453
+ this.activeRangeCellElement.classList.add("tabulator-range-cell-active");
20454
+
20455
+ this.overlay.appendChild(this.rangeContainer);
20456
+ this.overlay.appendChild(this.activeRangeCellElement);
20457
+
20458
+ this.table.rowManager.element.addEventListener("keydown", this.keyDownEvent);
20459
+
20460
+ this.resetRanges();
20461
+
20462
+ this.table.rowManager.element.appendChild(this.overlay);
20463
+ this.table.columnManager.element.setAttribute("tabindex", 0);
20464
+ this.table.element.classList.add("tabulator-ranges");
20465
+ }
20466
+
20467
+ initializeWatchers() {
20468
+ this.columnSelection = this.options("selectableRangeColumns");
20469
+ this.rowSelection = this.options("selectableRangeRows");
20470
+
20471
+ this.subscribe("column-init", this.initializeColumn.bind(this));
20472
+ this.subscribe("column-mousedown", this.handleColumnMouseDown.bind(this));
20473
+ this.subscribe("column-mousemove", this.handleColumnMouseMove.bind(this));
20474
+ this.subscribe("column-resized", this.handleColumnResized.bind(this));
20475
+ this.subscribe("column-width", this.layoutChange.bind(this));
20476
+ this.subscribe("column-height", this.layoutChange.bind(this));
20477
+ this.subscribe("column-resized", this.layoutChange.bind(this));
20478
+ this.subscribe("columns-loaded", this.updateHeaderColumn.bind(this));
20479
+
20480
+ this.subscribe("cell-height", this.layoutChange.bind(this));
20481
+ this.subscribe("cell-rendered", this.renderCell.bind(this));
20482
+ this.subscribe("cell-mousedown", this.handleCellMouseDown.bind(this));
20483
+ this.subscribe("cell-mousemove", this.handleCellMouseMove.bind(this));
20484
+ this.subscribe("cell-click", this.handleCellClick.bind(this));
20485
+ this.subscribe("cell-editing", this.handleEditingCell.bind(this));
20486
+
20487
+ this.subscribe("page-changed", this.redraw.bind(this));
20488
+
20489
+ this.subscribe("scroll-vertical", this.layoutChange.bind(this));
20490
+ this.subscribe("scroll-horizontal", this.layoutChange.bind(this));
20491
+
20492
+ this.subscribe("data-destroy", this.tableDestroyed.bind(this));
20493
+ this.subscribe("data-processed", this.resetRanges.bind(this));
20494
+
20495
+ this.subscribe("table-layout", this.layoutElement.bind(this));
20496
+ this.subscribe("table-redraw", this.redraw.bind(this));
20497
+ this.subscribe("table-destroy", this.tableDestroyed.bind(this));
20498
+
20499
+ this.subscribe("edit-editor-clear", this.finishEditingCell.bind(this));
20500
+ this.subscribe("edit-blur", this.restoreFocus.bind(this));
20501
+
20502
+ this.subscribe("keybinding-nav-prev", this.keyNavigate.bind(this, "left"));
20503
+ this.subscribe("keybinding-nav-next", this.keyNavigate.bind(this, "right"));
20504
+ this.subscribe("keybinding-nav-left", this.keyNavigate.bind(this, "left"));
20505
+ this.subscribe("keybinding-nav-right", this.keyNavigate.bind(this, "right"));
20506
+ this.subscribe("keybinding-nav-up", this.keyNavigate.bind(this, "up"));
20507
+ this.subscribe("keybinding-nav-down", this.keyNavigate.bind(this, "down"));
20508
+ this.subscribe("keybinding-nav-range", this.keyNavigateRange.bind(this));
20509
+ }
20510
+
20511
+
20512
+ initializeColumn(column) {
20513
+ if(this.columnSelection && column.definition.headerSort && this.options("headerSortClickElement") !== "icon"){
20514
+ console.warn("Using column headerSort with selectableRangeColumns option may result in unpredictable behavior");
20515
+ }
20516
+
20517
+ if (column.modules.edit) ;
20518
+ }
20519
+
20520
+ updateHeaderColumn(){
20521
+ if(this.rowSelection){
20522
+ this.rowHeader = this.table.columnManager.getVisibleColumnsByIndex()[0];
20523
+
20524
+ if(this.rowHeader){
20525
+ this.rowHeader.definition.cssClass = this.rowHeader.definition.cssClass + " tabulator-range-row-header";
20526
+
20527
+ if(this.rowHeader.definition.headerSort){
20528
+ console.warn("Using column headerSort with selectableRangeRows option may result in unpredictable behavior");
20529
+ }
20530
+
20531
+ if(this.rowHeader.definition.editor){
20532
+ console.warn("Using column editor with selectableRangeRows option may result in unpredictable behavior");
20533
+ }
20534
+ }
20535
+ }
20536
+ }
20537
+
20538
+ ///////////////////////////////////
20539
+ /////// Table Functions ///////
20540
+ ///////////////////////////////////
20541
+
20542
+ getRanges(){
20543
+ return this.ranges.map((range) => range.getComponent());
20544
+ }
20545
+
20546
+ getRangesData() {
20547
+ return this.ranges.map((range) => range.getData());
20548
+ }
20549
+
20550
+ addRangeFromComponent(start, end){
20551
+ start = start ? start._cell : null;
20552
+ end = end ? end._cell : null;
20553
+
20554
+ return this.addRange(start, end);
20555
+ }
20556
+
20557
+ ///////////////////////////////////
20558
+ /////// Component Functions ///////
20559
+ ///////////////////////////////////
20560
+
20561
+ cellGetRanges(cell){
20562
+ var ranges = [];
20563
+
20564
+ if (cell.column === this.rowHeader) {
20565
+ ranges = this.ranges.filter((range) => range.occupiesRow(cell.row));
20566
+ } else {
20567
+ ranges = this.ranges.filter((range) => range.occupies(cell));
20568
+ }
20569
+
20570
+ return ranges.map((range) => range.getComponent());
20571
+ }
20572
+
20573
+ rowGetRanges(row){
20574
+ var ranges = this.ranges.filter((range) => range.occupiesRow(row));
20575
+
20576
+ return ranges.map((range) => range.getComponent());
20577
+ }
20578
+
20579
+ colGetRanges(col){
20580
+ var ranges = this.ranges.filter((range) => range.occupiesColumn(col));
20581
+
20582
+ return ranges.map((range) => range.getComponent());
20583
+ }
20584
+
20585
+ ///////////////////////////////////
20586
+ ////////// Event Handlers /////////
20587
+ ///////////////////////////////////
20588
+
20589
+ _handleMouseUp(e){
20590
+ this.mousedown = false;
20591
+ document.removeEventListener("mouseup", this.mouseUpEvent);
20592
+ }
20593
+
20594
+ _handleKeyDown(e) {
20595
+ if (!this.blockKeydown && (!this.table.modules.edit || (this.table.modules.edit && !this.table.modules.edit.currentCell))) {
20596
+ if (e.key === "Enter") {
20597
+ // is editing a cell?
20598
+ if (this.table.modules.edit && this.table.modules.edit.currentCell) {
20599
+ return;
20600
+ }
20601
+
20602
+ this.table.modules.edit.editCell(this.getActiveCell());
20603
+
20604
+ e.preventDefault();
20605
+ }
20606
+
20607
+ if ((e.key === "Backspace" || e.key === "Delete") && this.options("selectableRangeClearCells")) {
20608
+ if(this.activeRange){
20609
+ this.activeRange.clearValues();
20610
+ }
20611
+ }
20612
+ }
20613
+ }
20614
+
20615
+ initializeFocus(cell){
20616
+ var range;
20617
+
20618
+ try{
20619
+ if (document.selection) { // IE
20620
+ range = document.body.createTextRange();
20621
+ range.moveToElementText(cell.getElement());
20622
+ range.select();
20623
+ } else if (window.getSelection) {
20624
+ range = document.createRange();
20625
+ range.selectNode(cell.getElement());
20626
+ window.getSelection().removeAllRanges();
20627
+ window.getSelection().addRange(range);
20628
+ }
20629
+ }catch(e){}
20630
+ }
20631
+
20632
+ restoreFocus(element){
20633
+ this.table.rowManager.element.focus();
20634
+
20635
+ return true;
20636
+ }
20637
+
20638
+ ///////////////////////////////////
20639
+ ////// Column Functionality ///////
20640
+ ///////////////////////////////////
20641
+
20642
+ handleColumnResized(column) {
20643
+ var selected;
20644
+
20645
+ if (this.selecting !== "column" && this.selecting !== "all") {
20646
+ return;
20647
+ }
20648
+
20649
+ selected = this.ranges.some((range) => range.occupiesColumn(column));
20650
+
20651
+ if (!selected) {
20652
+ return;
20653
+ }
20654
+
20655
+ this.ranges.forEach((range) => {
20656
+ var selectedColumns = range.getColumns(true);
20657
+
20658
+ selectedColumns.forEach((selectedColumn) => {
20659
+ if (selectedColumn !== column) {
20660
+ selectedColumn.setWidth(column.width);
20661
+ }
20662
+ });
20663
+ });
20664
+ }
20665
+
20666
+ handleColumnMouseDown(event, column) {
20667
+ if (event.button === 2 && (this.selecting === "column" || this.selecting === "all") && this.activeRange.occupiesColumn(column)) {
20668
+ return;
20669
+ }
20670
+
20671
+ this.mousedown = true;
20672
+
20673
+ document.addEventListener("mouseup", this.mouseUpEvent);
20674
+
20675
+ this.newSelection(event, column);
20676
+ }
20677
+
20678
+ handleColumnMouseMove(e, column) {
20679
+ if (column === this.rowHeader || !this.mousedown || this.selecting === 'all') {
20680
+ return;
20681
+ }
20682
+
20683
+ this.activeRange.setBounds(false, column, true);
20684
+ }
20685
+
20686
+ ///////////////////////////////////
20687
+ //////// Cell Functionality ///////
20688
+ ///////////////////////////////////
20689
+
20690
+ renderCell(cell) {
20691
+ var el = cell.getElement(),
20692
+ rangeIdx = this.ranges.findIndex((range) => range.occupies(cell));
20693
+
20694
+ el.classList.toggle("tabulator-range-selected", rangeIdx !== -1);
20695
+ el.classList.toggle("tabulator-range-only-cell-selected", this.ranges.length === 1 && this.ranges[0].atTopLeft(cell) && this.ranges[0].atBottomRight(cell));
20696
+
20697
+ el.dataset.range = rangeIdx;
20698
+ }
20699
+
20700
+ handleCellMouseDown(event, cell) {
20701
+ if (event.button === 2 && (this.activeRange.occupies(cell) || ((this.selecting === "row" || this.selecting === "all") && this.activeRange.occupiesRow(cell.row)))) {
20702
+ return;
20703
+ }
20704
+
20705
+ this.mousedown = true;
20706
+
20707
+ document.addEventListener("mouseup", this.mouseUpEvent);
20708
+
20709
+ this.newSelection(event, cell);
20710
+ }
20711
+
20712
+ handleCellMouseMove(e, cell) {
20713
+ if (!this.mousedown || this.selecting === "all") {
20714
+ return;
20715
+ }
20716
+
20717
+ this.activeRange.setBounds(false, cell, true);
20718
+ }
20719
+
20720
+ handleCellClick(e, cell){
20721
+ this.initializeFocus(cell);
20722
+ }
20723
+
20724
+ handleEditingCell(cell) {
20725
+ if(this.activeRange){
20726
+ this.activeRange.setBounds(cell);
20727
+ }
20728
+ }
20729
+
20730
+ finishEditingCell() {
20731
+ this.blockKeydown = true;
20732
+ this.table.rowManager.element.focus();
20733
+
20734
+ setTimeout(() => {
20735
+ this.blockKeydown = false;
20736
+ }, 10);
20737
+ }
20738
+
20739
+ ///////////////////////////////////
20740
+ /////// Navigation ///////
20741
+ ///////////////////////////////////
20742
+
20743
+ keyNavigate(dir, e){
20744
+ if(this.navigate(false, false, dir)){
20745
+ e.preventDefault();
20746
+ }
20747
+ }
20748
+
20749
+ keyNavigateRange(e, dir, jump, expand){
20750
+ if(this.navigate(jump, expand, dir)){
20751
+ e.preventDefault();
20752
+ }
20753
+ }
20754
+
20755
+ navigate(jump, expand, dir) {
20756
+ var moved = false,
20757
+ range, rangeEdge, nextRow, nextCol, row, column;
20758
+
20759
+ // Don't navigate while editing
20760
+ if (this.table.modules.edit && this.table.modules.edit.currentCell) {
20761
+ return false;
20762
+ }
20763
+
20764
+ // If there are more than 1 range, use the active range and destroy the others
20765
+ if (this.ranges.length > 1) {
20766
+ this.ranges = this.ranges.filter((range) => {
20767
+ if (range === this.activeRange) {
20768
+ range.setEnd(range.start.row, range.start.col);
20769
+ return true;
20770
+ }
20771
+ range.destroy();
20772
+ return false;
20773
+ });
20774
+ }
20775
+
20776
+ range = this.activeRange;
20777
+
20778
+ rangeEdge = expand ? range.end : range.start;
20779
+ nextRow = rangeEdge.row;
20780
+ nextCol = rangeEdge.col;
20781
+
20782
+ if(jump){
20783
+ switch(dir){
20784
+ case "left":
20785
+ nextCol = this.findJumpCellLeft(range.start.row, rangeEdge.col);
20786
+ break;
20787
+ case "right":
20788
+ nextCol = this.findJumpCellRight(range.start.row, rangeEdge.col);
20789
+ break;
20790
+ case "up":
20791
+ nextRow = this.findJumpCellUp(rangeEdge.row, range.start.col);
20792
+ break;
20793
+ case "down":
20794
+ nextRow = this.findJumpCellDown(rangeEdge.row, range.start.col);
20795
+ break;
20796
+ }
20797
+ }else {
20798
+ if(expand){
20799
+ if ((this.selecting === 'row' && (dir === 'left' || dir === 'right')) || (this.selecting === 'column' && (dir === 'up' || dir === 'down'))) {
20800
+ return;
20801
+ }
20802
+ }
20803
+
20804
+ switch(dir){
20805
+ case "left":
20806
+ nextCol = Math.max(nextCol - 1, 0);
20807
+ break;
20808
+ case "right":
20809
+ nextCol = Math.min(nextCol + 1, this.getTableColumns().length - 2);
20810
+ break;
20811
+ case "up":
20812
+ nextRow = Math.max(nextRow - 1, 0);
20813
+ break;
20814
+ case "down":
20815
+ nextRow = Math.min(nextRow + 1, this.getTableRows().length - 1);
20816
+ break;
20817
+ }
20818
+ }
20819
+
20820
+ moved = nextCol !== rangeEdge.col || nextRow !== rangeEdge.row;
20821
+
20822
+ if(!expand){
20823
+ range.setStart(nextRow, nextCol);
20824
+ }
20825
+
20826
+ range.setEnd(nextRow, nextCol);
20827
+
20828
+ if(!expand){
20829
+ this.selecting = "cell";
20830
+ }
20831
+
20832
+ if (moved) {
20833
+ row = this.getRowByRangePos(range.end.row);
20834
+ column = this.getColumnByRangePos(range.end.col);
20835
+
20836
+ if ((dir === 'left' || dir === 'right') && column.getElement().parentNode === null) {
20837
+ column.getComponent().scrollTo(undefined, false);
20838
+ } else if ((dir === 'up' || dir === 'down') && row.getElement().parentNode === null) {
20839
+ row.getComponent().scrollTo(undefined, false);
20840
+ } else {
20841
+ // Use faster autoScroll when the elements are on the DOM
20842
+ this.autoScroll(range, row.getElement(), column.getElement());
20843
+ }
20844
+
20845
+ this.layoutElement();
20846
+
20847
+ return true;
20848
+ }
20849
+ }
20850
+
20851
+ rangeRemoved(removed){
20852
+ this.ranges = this.ranges.filter((range) => range !== removed);
20853
+
20854
+ if(this.activeRange === removed){
20855
+ if(this.ranges.length){
20856
+ this.activeRange = this.ranges[this.ranges.length - 1];
20857
+ }else {
20858
+ this.addRange();
20859
+ }
20860
+ }
20861
+
20862
+ this.layoutElement();
20863
+ }
20864
+
20865
+ findJumpCell(cells, reverse, emptyStart, emptySide){
20866
+ var nextCell;
20867
+
20868
+ if(reverse){
20869
+ cells = cells.reverse();
20870
+ }
20871
+
20872
+ for(let currentCell of cells){
20873
+ let currentValue = currentCell.getValue();
20874
+
20875
+ if(emptyStart){
20876
+ nextCell = currentCell;
20877
+ if(currentValue){
20878
+ break;
20879
+ }
20880
+ }else {
20881
+ if(emptySide){
20882
+ nextCell = currentCell;
20883
+
20884
+ if(currentValue){
20885
+ break;
20886
+ }
20887
+ }else {
20888
+ if(currentValue){
20889
+ nextCell = currentCell;
20890
+ }else {
20891
+ break;
20892
+ }
20893
+ }
20894
+ }
20895
+ }
20896
+
20897
+ return nextCell;
20898
+ }
20899
+
20900
+ findJumpCellLeft(rowPos, colPos){
20901
+ var row = this.getRowByRangePos(rowPos),
20902
+ cells = row.cells.filter((cell) => cell.column.visible),
20903
+ isStartingCellEmpty = !cells[colPos + 1].getValue(),
20904
+ isLeftOfStartingCellEmpty = cells[colPos] ? !cells[colPos].getValue() : false,
20905
+ jumpCol = colPos,
20906
+ nextCell = this.findJumpCell(cells.slice(0, colPos), true, isStartingCellEmpty, isLeftOfStartingCellEmpty);
20907
+
20908
+ if(nextCell){
20909
+ jumpCol = nextCell.column.getPosition() - 2;
20910
+ }
20911
+
20912
+ return jumpCol;
20913
+ }
20914
+
20915
+ findJumpCellRight(rowPos, colPos){
20916
+ var row = this.getRowByRangePos(rowPos),
20917
+ cells = row.cells.filter((cell) => cell.column.visible),
20918
+ isStartingCellEmpty = !cells[colPos + 1].getValue(),
20919
+ isRightOfStartingCellEmpty = cells[colPos + 2] ? !cells[colPos + 2].getValue() : false,
20920
+ jumpCol = colPos,
20921
+ nextCell = this.findJumpCell(cells.slice(colPos + 2, cells.length), false, isStartingCellEmpty, isRightOfStartingCellEmpty);
20922
+
20923
+ if(nextCell){
20924
+ jumpCol = nextCell.column.getPosition() - 2;
20925
+ }
20926
+
20927
+ return jumpCol;
20928
+ }
20929
+
20930
+ findJumpCellUp(rowPos, colPos) {
20931
+ var column = this.getColumnByRangePos(colPos),
20932
+ cells = column.cells.filter((cell) => this.table.rowManager.activeRows.includes(cell.row)),
20933
+ isStartingCellEmpty = !cells[rowPos].getValue(),
20934
+ isTopOfStartingCellEmpty = cells[rowPos - 1] ? !cells[rowPos - 1].getValue() : false,
20935
+ jumpRow = rowPos,
20936
+ nextCell = this.findJumpCell(cells.slice(0, jumpRow), true, isStartingCellEmpty, isTopOfStartingCellEmpty);
20937
+
20938
+ if(nextCell){
20939
+ jumpRow = nextCell.row.position - 1;
20940
+ }
20941
+
20942
+ return jumpRow;
20943
+ }
20944
+
20945
+ findJumpCellDown(rowPos, colPos) {
20946
+ var column = this.getColumnByRangePos(colPos),
20947
+ cells = column.cells.filter((cell) => this.table.rowManager.activeRows.includes(cell.row)),
20948
+ isStartingCellEmpty = !cells[rowPos].getValue(),
20949
+ isBottomOfStartingCellEmpty = cells[rowPos + 1] ? !cells[rowPos + 1].getValue() : false,
20950
+ jumpRow = rowPos,
20951
+ nextCell = this.findJumpCell(cells.slice(jumpRow + 1, cells.length), false, isStartingCellEmpty, isBottomOfStartingCellEmpty);
20952
+
20953
+ if(nextCell){
20954
+ jumpRow = nextCell.row.position - 1;
20955
+ }
20956
+
20957
+ return jumpRow;
20958
+ }
20959
+
20960
+ ///////////////////////////////////
20961
+ /////// Selection ///////
20962
+ ///////////////////////////////////
20963
+ newSelection(event, element) {
20964
+ var range;
20965
+
20966
+ if (element.type === "column") {
20967
+ if(!this.columnSelection){
20968
+ return;
20969
+ }
20970
+
20971
+ if (element === this.rowHeader) {
20972
+ range = this.resetRanges();
20973
+ this.selecting = "all";
20974
+
20975
+ const topLeftCell = this.getCell(0, 0);
20976
+ const bottomRightCell = this.getCell(-1, -1);
20977
+
20978
+ range.setBounds(topLeftCell, bottomRightCell);
20979
+ return;
20980
+ } else {
20981
+ this.selecting = "column";
20982
+ }
20983
+ } else if (element.column === this.rowHeader) {
20984
+ this.selecting = "row";
20985
+ } else {
20986
+ this.selecting = "cell";
20987
+ }
20988
+
20989
+ if (event.shiftKey) {
20990
+ this.activeRange.setBounds(false, element);
20991
+ } else if (event.ctrlKey) {
20992
+ this.addRange().setBounds(element);
20993
+ } else {
20994
+ this.resetRanges().setBounds(element);
20995
+ }
19544
20996
  }
19545
-
19546
- //work through sort list sorting data
19547
- sort(data){
19548
- var self = this,
19549
- sortList = this.table.options.sortOrderReverse ? self.sortList.slice().reverse() : self.sortList,
19550
- sortListActual = [],
19551
- rowComponents = [];
19552
-
19553
- if(this.subscribedExternal("dataSorting")){
19554
- this.dispatchExternal("dataSorting", self.getSort());
20997
+
20998
+ autoScroll(range, row, column) {
20999
+ var tableHolder = this.table.rowManager.element,
21000
+ rowHeader = this.rowHeader.getElement(),
21001
+ rect, view, withinHorizontalView, withinVerticalView;
21002
+
21003
+ if (typeof row === 'undefined') {
21004
+ row = this.getRowByRangePos(range.end.row).getElement();
19555
21005
  }
19556
-
19557
- self.clearColumnHeaders();
19558
-
19559
- if(this.table.options.sortMode !== "remote"){
19560
-
19561
- //build list of valid sorters and trigger column specific callbacks before sort begins
19562
- sortList.forEach(function(item, i){
19563
- var sortObj;
19564
-
19565
- if(item.column){
19566
- sortObj = item.column.modules.sort;
19567
-
19568
- if(sortObj){
19569
-
19570
- //if no sorter has been defined, take a guess
19571
- if(!sortObj.sorter){
19572
- sortObj.sorter = self.findSorter(item.column);
19573
- }
19574
-
19575
- item.params = typeof sortObj.params === "function" ? sortObj.params(item.column.getComponent(), item.dir) : sortObj.params;
19576
-
19577
- sortListActual.push(item);
19578
- }
19579
-
19580
- self.setColumnHeader(item.column, item.dir);
19581
- }
19582
- });
19583
-
19584
- //sort data
19585
- if (sortListActual.length) {
19586
- self._sortItems(data, sortListActual);
21006
+
21007
+ if (typeof column === 'undefined') {
21008
+ column = this.getColumnByRangePos(range.end.col).getElement();
21009
+ }
21010
+
21011
+ rect = {
21012
+ left: column.offsetLeft,
21013
+ right: column.offsetLeft + column.offsetWidth,
21014
+ top: row.offsetTop,
21015
+ bottom: row.offsetTop + row.offsetHeight,
21016
+ };
21017
+
21018
+ view = {
21019
+ left: tableHolder.scrollLeft + rowHeader.offsetWidth,
21020
+ right: Math.ceil(tableHolder.scrollLeft + tableHolder.clientWidth),
21021
+ top: tableHolder.scrollTop,
21022
+ bottom: tableHolder.scrollTop + tableHolder.offsetHeight - this.table.rowManager.scrollbarWidth,
21023
+ };
21024
+
21025
+ withinHorizontalView = view.left < rect.left && rect.left < view.right && view.left < rect.right && rect.right < view.right;
21026
+
21027
+ withinVerticalView = view.top < rect.top && rect.top < view.bottom && view.top < rect.bottom && rect.bottom < view.bottom;
21028
+
21029
+ if (!withinHorizontalView) {
21030
+ if (rect.left < view.left) {
21031
+ tableHolder.scrollLeft = rect.left - rowHeader.offsetWidth;
21032
+ } else if (rect.right > view.right) {
21033
+ tableHolder.scrollLeft = rect.right - tableHolder.clientWidth;
19587
21034
  }
19588
-
19589
- }else {
19590
- sortList.forEach(function(item, i){
19591
- self.setColumnHeader(item.column, item.dir);
19592
- });
19593
21035
  }
19594
-
19595
- if(this.subscribedExternal("dataSorted")){
19596
- data.forEach((row) => {
19597
- rowComponents.push(row.getComponent());
19598
- });
19599
-
19600
- this.dispatchExternal("dataSorted", self.getSort(), rowComponents);
21036
+
21037
+ if (!withinVerticalView) {
21038
+ if (rect.top < view.top) {
21039
+ tableHolder.scrollTop = rect.top;
21040
+ } else if (rect.bottom > view.bottom) {
21041
+ tableHolder.scrollTop = rect.bottom - tableHolder.clientHeight;
21042
+ }
19601
21043
  }
19602
-
19603
- return data;
19604
21044
  }
19605
-
19606
- //clear sort arrows on columns
19607
- clearColumnHeaders(){
19608
- this.table.columnManager.getRealColumns().forEach((column) => {
19609
- if(column.modules.sort){
19610
- column.modules.sort.dir = "none";
19611
- column.getElement().setAttribute("aria-sort", "none");
19612
- this.setColumnHeaderSortIcon(column, "none");
21045
+
21046
+
21047
+ ///////////////////////////////////
21048
+ /////// Layout ///////
21049
+ ///////////////////////////////////
21050
+
21051
+ layoutChange(){
21052
+ this.overlay.style.visibility = "hidden";
21053
+ clearTimeout(this.layoutChangeTimeout);
21054
+ this.layoutChangeTimeout = setTimeout(this.layoutRanges.bind(this), 200);
21055
+ }
21056
+
21057
+ redraw(force) {
21058
+ if (force) {
21059
+ this.selecting = 'cell';
21060
+ this.resetRanges();
21061
+ this.layoutElement();
21062
+ }
21063
+ }
21064
+
21065
+ layoutElement(visibleRows) {
21066
+ var rows;
21067
+
21068
+ if (visibleRows) {
21069
+ rows = this.table.rowManager.getVisibleRows(true);
21070
+ } else {
21071
+ rows = this.table.rowManager.getRows();
21072
+ }
21073
+
21074
+ rows.forEach((row) => {
21075
+ if (row.type === "row") {
21076
+ this.layoutRow(row);
21077
+ row.cells.forEach((cell) => this.renderCell(cell));
19613
21078
  }
19614
21079
  });
21080
+
21081
+ this.getTableColumns().forEach((column) => {
21082
+ this.layoutColumn(column);
21083
+ });
21084
+
21085
+ this.layoutRanges();
19615
21086
  }
19616
-
19617
- //set the column header sort direction
19618
- setColumnHeader(column, dir){
19619
- column.modules.sort.dir = dir;
19620
- column.getElement().setAttribute("aria-sort", dir === "asc" ? "ascending" : "descending");
19621
- this.setColumnHeaderSortIcon(column, dir);
21087
+
21088
+ layoutRow(row) {
21089
+ var el = row.getElement(),
21090
+ selected = false,
21091
+ occupied = this.ranges.some((range) => range.occupiesRow(row));
21092
+
21093
+ if (this.selecting === "row") {
21094
+ selected = occupied;
21095
+ } else if (this.selecting === "all") {
21096
+ selected = true;
21097
+ }
21098
+
21099
+ el.classList.toggle("tabulator-range-selected", selected);
21100
+ el.classList.toggle("tabulator-range-highlight", occupied);
19622
21101
  }
19623
-
19624
- setColumnHeaderSortIcon(column, dir){
19625
- var sortEl = column.modules.sort.element,
19626
- arrowEl;
19627
-
19628
- if(column.definition.headerSort && typeof this.table.options.headerSortElement === "function"){
19629
- while(sortEl.firstChild) sortEl.removeChild(sortEl.firstChild);
19630
-
19631
- arrowEl = this.table.options.headerSortElement.call(this.table, column.getComponent(), dir);
21102
+
21103
+ layoutColumn(column) {
21104
+ var el = column.getElement(),
21105
+ selected = false,
21106
+ occupied = this.ranges.some((range) => range.occupiesColumn(column));
21107
+
21108
+ if (this.selecting === "column") {
21109
+ selected = occupied;
21110
+ } else if (this.selecting === "all") {
21111
+ selected = true;
21112
+ }
21113
+
21114
+ el.classList.toggle("tabulator-range-selected", selected);
21115
+ el.classList.toggle("tabulator-range-highlight", occupied);
21116
+ }
21117
+
21118
+ layoutRanges() {
21119
+ var activeCell;
21120
+
21121
+ if (!this.table.initialized) {
21122
+ return;
21123
+ }
21124
+
21125
+ activeCell = this.getActiveCell();
21126
+
21127
+ if (!activeCell) {
21128
+ return;
21129
+ }
21130
+
21131
+ this.activeRangeCellElement.style.left = activeCell.row.getElement().offsetLeft + activeCell.getElement().offsetLeft + "px";
21132
+ this.activeRangeCellElement.style.top = activeCell.row.getElement().offsetTop + "px";
21133
+ this.activeRangeCellElement.style.width = activeCell.getElement().offsetLeft + activeCell.getElement().offsetWidth - activeCell.getElement().offsetLeft + "px";
21134
+ this.activeRangeCellElement.style.height = activeCell.row.getElement().offsetTop + activeCell.row.getElement().offsetHeight - activeCell.row.getElement().offsetTop + "px";
21135
+
21136
+ this.ranges.forEach((range) => range.layout());
21137
+
21138
+ this.overlay.style.visibility = "visible";
21139
+ }
21140
+
21141
+
21142
+ ///////////////////////////////////
21143
+ /////// Helper Functions ///////
21144
+ ///////////////////////////////////
21145
+
21146
+ getCell(rowIdx, colIdx) {
21147
+ var row;
21148
+
21149
+ if (colIdx < 0) {
21150
+ colIdx = this.getTableColumns().length + colIdx - 1;
19632
21151
 
19633
- if(typeof arrowEl === "object"){
19634
- sortEl.appendChild(arrowEl);
19635
- }else {
19636
- sortEl.innerHTML = arrowEl;
21152
+ if (colIdx < 0) {
21153
+ return null;
19637
21154
  }
19638
21155
  }
21156
+
21157
+ if (rowIdx < 0) {
21158
+ rowIdx = this.getTableRows().length + rowIdx;
21159
+ }
21160
+
21161
+ row = this.table.rowManager.getRowFromPosition(rowIdx + 1);
21162
+
21163
+ return row ? row.getCells(false, true).filter((cell) => cell.column.visible)[colIdx + 1] : null;
19639
21164
  }
21165
+
21166
+
21167
+ getActiveCell() {
21168
+ return this.getCell(this.activeRange.start.row, this.activeRange.start.col);
21169
+ }
21170
+
21171
+ getRowByRangePos(pos) {
21172
+ return this.getTableRows()[pos];
21173
+ }
21174
+
21175
+ getColumnByRangePos(pos) {
21176
+ return this.getTableColumns()[pos + 1];
21177
+ }
21178
+
21179
+ getTableRows() {
21180
+ return this.table.rowManager.getDisplayRows();
21181
+ }
21182
+
21183
+ getTableColumns() {
21184
+ return this.table.columnManager.getVisibleColumnsByIndex();
21185
+ }
21186
+
21187
+ addRange(start, end) {
21188
+ var range;
21189
+
21190
+ if(this.maxRanges !== true && this.ranges.length >= this.maxRanges){
21191
+ this.ranges.shift().destroy();
21192
+ }
21193
+
21194
+ range = new Range(this.table, this, start, end);
21195
+
21196
+ this.activeRange = range;
21197
+ this.ranges.push(range);
21198
+ this.rangeContainer.appendChild(range.element);
21199
+
21200
+ return range;
21201
+ }
21202
+
21203
+ resetRanges() {
21204
+ var range, cell;
21205
+
21206
+ this.ranges.forEach((range) => range.destroy());
21207
+ this.ranges = [];
21208
+
21209
+ range = this.addRange();
21210
+
21211
+ if(this.table.rowManager.activeRows.length){
21212
+ cell = this.table.rowManager.activeRows[0].cells[this.rowHeader ? 1 : 0];
19640
21213
 
19641
- //sort each item in sort list
19642
- _sortItems(data, sortList){
19643
- var sorterCount = sortList.length - 1;
19644
-
19645
- data.sort((a, b) => {
19646
- var result;
19647
-
19648
- for(var i = sorterCount; i>= 0; i--){
19649
- let sortItem = sortList[i];
19650
-
19651
- result = this._sortRow(a, b, sortItem.column, sortItem.dir, sortItem.params);
19652
-
19653
- if(result !== 0){
19654
- break;
19655
- }
21214
+ if(cell){
21215
+ range.setBounds(cell);
21216
+ this.initializeFocus(cell);
19656
21217
  }
19657
-
19658
- return result;
19659
- });
21218
+ }
21219
+
21220
+ return range;
19660
21221
  }
19661
-
19662
- //process individual rows for a sort function on active data
19663
- _sortRow(a, b, column, dir, params){
19664
- var el1Comp, el2Comp;
19665
-
19666
- //switch elements depending on search direction
19667
- var el1 = dir == "asc" ? a : b;
19668
- var el2 = dir == "asc" ? b : a;
19669
-
19670
- a = column.getFieldValue(el1.getData());
19671
- b = column.getFieldValue(el2.getData());
19672
-
19673
- a = typeof a !== "undefined" ? a : "";
19674
- b = typeof b !== "undefined" ? b : "";
19675
-
19676
- el1Comp = el1.getComponent();
19677
- el2Comp = el2.getComponent();
19678
-
19679
- return column.modules.sort.sorter.call(this, a, b, el1Comp, el2Comp, column.getComponent(), dir, params);
21222
+
21223
+ tableDestroyed(){
21224
+ document.removeEventListener("mouseup", this.mouseUpEvent);
21225
+ this.table.rowManager.element.removeEventListener("keydown", this.keyDownEvent);
21226
+ }
21227
+
21228
+ selectedRows(component) {
21229
+ return component ? this.activeRange.getRows().map((row) => row.getComponent()) : this.activeRange.getRows();
21230
+ }
21231
+
21232
+ selectedColumns(component) {
21233
+ return component ? this.activeRange.getColumns().map((col) => col.getComponent()) : this.activeRange.getColumns();
19680
21234
  }
19681
21235
  }
19682
21236
 
19683
- Sort.moduleName = "sort";
19684
-
19685
- //load defaults
19686
- Sort.sorters = defaultSorters;
21237
+ SelectRange.moduleName = "selectRange";
19687
21238
 
19688
21239
  class Tooltip extends Module{
19689
21240
 
@@ -19850,6 +21401,17 @@ var defaultValidators = {
19850
21401
  return isNaN(value);
19851
21402
  },
19852
21403
 
21404
+ //must be alphanumeric
21405
+ alphanumeric: function(cell, value, parameters){
21406
+ if(value === "" || value === null || typeof value === "undefined"){
21407
+ return true;
21408
+ }
21409
+
21410
+ var reg = new RegExp(/^[a-z0-9]+$/i);
21411
+
21412
+ return reg.test(value);
21413
+ },
21414
+
19853
21415
  //maximum value
19854
21416
  max: function(cell, value, parameters){
19855
21417
  if(value === "" || value === null || typeof value === "undefined"){
@@ -20286,6 +21848,7 @@ var modules = /*#__PURE__*/Object.freeze({
20286
21848
  ResponsiveLayoutModule: ResponsiveLayout,
20287
21849
  SelectRowModule: SelectRow,
20288
21850
  SortModule: Sort,
21851
+ SelectRangeModule: SelectRange,
20289
21852
  TooltipModule: Tooltip,
20290
21853
  ValidateModule: Validate
20291
21854
  });
@@ -21610,6 +23173,10 @@ class ColumnManager extends CoreFeature {
21610
23173
 
21611
23174
  return index > -1 ? this.columnsByIndex[index] : false;
21612
23175
  }
23176
+
23177
+ getVisibleColumnsByIndex() {
23178
+ return this.columnsByIndex.filter((col) => col.visible);
23179
+ }
21613
23180
 
21614
23181
  getColumns(){
21615
23182
  return this.columns;
@@ -22009,8 +23576,6 @@ class BasicVertical extends Renderer{
22009
23576
  }
22010
23577
  });
22011
23578
 
22012
-
22013
-
22014
23579
  if(onlyGroupHeaders){
22015
23580
  element.style.minWidth = this.table.columnManager.getWidth() + "px";
22016
23581
  }else {
@@ -22027,6 +23592,10 @@ class BasicVertical extends Renderer{
22027
23592
  }
22028
23593
 
22029
23594
  this.renderRows();
23595
+
23596
+ if(!this.rows().length){
23597
+ this.table.rowManager.tableEmpty();
23598
+ }
22030
23599
  }
22031
23600
 
22032
23601
  scrollToRowNearestTop(row){
@@ -23020,7 +24589,7 @@ class RowManager extends CoreFeature{
23020
24589
 
23021
24590
  this.regenerateRowPositions();
23022
24591
 
23023
- if(rows.length){
24592
+ if(this.displayRowsCount){
23024
24593
  this._clearPlaceholder();
23025
24594
  }
23026
24595
 
@@ -23649,6 +25218,14 @@ class RowManager extends CoreFeature{
23649
25218
  this.renderEmptyScroll();
23650
25219
  this._showPlaceholder();
23651
25220
  }
25221
+
25222
+ checkPlaceholder(){
25223
+ if(this.displayRowsCount){
25224
+ this._clearPlaceholder();
25225
+ }else {
25226
+ this.tableEmpty();
25227
+ }
25228
+ }
23652
25229
 
23653
25230
  _showPlaceholder(){
23654
25231
  if(this.placeholder){
@@ -24130,11 +25707,11 @@ class InteractionManager extends CoreFeature {
24130
25707
  }
24131
25708
  }
24132
25709
  }
24133
-
25710
+
24134
25711
  if(targets.group && targets.group === targets.row){
24135
25712
  delete targets.row;
24136
25713
  }
24137
-
25714
+
24138
25715
  return targets;
24139
25716
  }
24140
25717
 
@@ -24666,7 +26243,7 @@ class DeprecationAdvisor extends CoreFeature{
24666
26243
  }
24667
26244
  }
24668
26245
 
24669
- check(oldOption, newOption){
26246
+ check(oldOption, newOption, convert){
24670
26247
  var msg = "";
24671
26248
 
24672
26249
  if(typeof this.options(oldOption) !== "undefined"){
@@ -24675,6 +26252,10 @@ class DeprecationAdvisor extends CoreFeature{
24675
26252
  if(newOption){
24676
26253
  msg = msg + ", Please use the %c" + newOption + "%c option instead";
24677
26254
  this._warnUser(msg, 'font-weight: bold;', 'font-weight: normal;', 'font-weight: bold;', 'font-weight: normal;');
26255
+
26256
+ if(convert){
26257
+ this.table.options[newOption] = this.table.options[oldOption];
26258
+ }
24678
26259
  }else {
24679
26260
  this._warnUser(msg, 'font-weight: bold;', 'font-weight: normal;');
24680
26261
  }
@@ -25463,6 +27044,8 @@ class Alert extends CoreFeature{
25463
27044
  alert(content, type = "msg"){
25464
27045
  if(content){
25465
27046
  this.clear();
27047
+
27048
+ this.dispatch("alert-show", type);
25466
27049
 
25467
27050
  this.type = type;
25468
27051
 
@@ -25485,6 +27068,8 @@ class Alert extends CoreFeature{
25485
27068
  }
25486
27069
 
25487
27070
  clear(){
27071
+ this.dispatch("alert-hide", this.type);
27072
+
25488
27073
  if(this.element.parentNode){
25489
27074
  this.element.parentNode.removeChild(this.element);
25490
27075
  }
@@ -25748,6 +27333,7 @@ class Tabulator {
25748
27333
 
25749
27334
  _loadInitialData(){
25750
27335
  this.dataLoader.load(this.options.data);
27336
+ this.columnManager.verticalAlignHeaders();
25751
27337
  }
25752
27338
 
25753
27339
  //deconstructor
@@ -26414,7 +28000,9 @@ class PseudoRow {
26414
28000
  setCellHeight(){}
26415
28001
 
26416
28002
  clearCellHeight(){}
28003
+
28004
+ rendered(){}
26417
28005
  }
26418
28006
 
26419
- export { Accessor as AccessorModule, Ajax as AjaxModule, CalcComponent, CellComponent, Clipboard as ClipboardModule, ColumnCalcs as ColumnCalcsModule, ColumnComponent, DataTree as DataTreeModule, Download as DownloadModule, Edit$1 as EditModule, Export as ExportModule, Filter as FilterModule, Format as FormatModule, FrozenColumns as FrozenColumnsModule, FrozenRows as FrozenRowsModule, GroupComponent, GroupRows as GroupRowsModule, History as HistoryModule, HtmlTableImport as HtmlTableImportModule, Import as ImportModule, Interaction as InteractionModule, Keybindings as KeybindingsModule, Menu as MenuModule, Module, MoveColumns as MoveColumnsModule, MoveRows as MoveRowsModule, Mutator as MutatorModule, Page as PageModule, Persistence as PersistenceModule, Popup$1 as PopupModule, Print as PrintModule, PseudoRow, ReactiveData as ReactiveDataModule, Renderer, ResizeColumns as ResizeColumnsModule, ResizeRows as ResizeRowsModule, ResizeTable as ResizeTableModule, ResponsiveLayout as ResponsiveLayoutModule, RowComponent, SelectRow as SelectRowModule, Sort as SortModule, Tabulator, TabulatorFull, Tooltip as TooltipModule, Validate as ValidateModule };
28007
+ export { Accessor as AccessorModule, Ajax as AjaxModule, CalcComponent, CellComponent, Clipboard as ClipboardModule, ColumnCalcs as ColumnCalcsModule, ColumnComponent, DataTree as DataTreeModule, Download as DownloadModule, Edit$1 as EditModule, Export as ExportModule, Filter as FilterModule, Format as FormatModule, FrozenColumns as FrozenColumnsModule, FrozenRows as FrozenRowsModule, GroupComponent, GroupRows as GroupRowsModule, History as HistoryModule, HtmlTableImport as HtmlTableImportModule, Import as ImportModule, Interaction as InteractionModule, Keybindings as KeybindingsModule, Menu as MenuModule, Module, MoveColumns as MoveColumnsModule, MoveRows as MoveRowsModule, Mutator as MutatorModule, Page as PageModule, Persistence as PersistenceModule, Popup$1 as PopupModule, Print as PrintModule, PseudoRow, ReactiveData as ReactiveDataModule, Renderer, ResizeColumns as ResizeColumnsModule, ResizeRows as ResizeRowsModule, ResizeTable as ResizeTableModule, ResponsiveLayout as ResponsiveLayoutModule, RowComponent, SelectRange as SelectRangeModule, SelectRow as SelectRowModule, Sort as SortModule, Tabulator, TabulatorFull, Tooltip as TooltipModule, Validate as ValidateModule };
26420
28008
  //# sourceMappingURL=tabulator_esm.js.map