tabulator-tables 5.2.6 → 5.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/.eslintignore +3 -0
  2. package/.eslintrc.js +28 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -0
  4. package/.github/workflows/bad-files-check.yml +39 -0
  5. package/.github/workflows/lint-and-test.yml +31 -0
  6. package/README.md +18 -6
  7. package/bower.json +1 -1
  8. package/build/Bundler.js +77 -77
  9. package/dist/css/tabulator.css +12 -7
  10. package/dist/css/tabulator.css.map +1 -1
  11. package/dist/css/tabulator.min.css +1 -1
  12. package/dist/css/tabulator.min.css.map +1 -1
  13. package/dist/css/tabulator_bootstrap3.css +12 -7
  14. package/dist/css/tabulator_bootstrap3.css.map +1 -1
  15. package/dist/css/tabulator_bootstrap3.min.css +1 -1
  16. package/dist/css/tabulator_bootstrap3.min.css.map +1 -1
  17. package/dist/css/tabulator_bootstrap4.css +12 -7
  18. package/dist/css/tabulator_bootstrap4.css.map +1 -1
  19. package/dist/css/tabulator_bootstrap4.min.css +1 -1
  20. package/dist/css/tabulator_bootstrap4.min.css.map +1 -1
  21. package/dist/css/tabulator_bootstrap5.css +51 -46
  22. package/dist/css/tabulator_bootstrap5.css.map +1 -1
  23. package/dist/css/tabulator_bootstrap5.min.css +1 -1
  24. package/dist/css/tabulator_bootstrap5.min.css.map +1 -1
  25. package/dist/css/tabulator_bulma.css +12 -7
  26. package/dist/css/tabulator_bulma.css.map +1 -1
  27. package/dist/css/tabulator_bulma.min.css +1 -1
  28. package/dist/css/tabulator_bulma.min.css.map +1 -1
  29. package/dist/css/tabulator_materialize.css +12 -7
  30. package/dist/css/tabulator_materialize.css.map +1 -1
  31. package/dist/css/tabulator_materialize.min.css +1 -1
  32. package/dist/css/tabulator_materialize.min.css.map +1 -1
  33. package/dist/css/tabulator_midnight.css +12 -7
  34. package/dist/css/tabulator_midnight.css.map +1 -1
  35. package/dist/css/tabulator_midnight.min.css +1 -1
  36. package/dist/css/tabulator_midnight.min.css.map +1 -1
  37. package/dist/css/tabulator_modern.css +12 -7
  38. package/dist/css/tabulator_modern.css.map +1 -1
  39. package/dist/css/tabulator_modern.min.css +1 -1
  40. package/dist/css/tabulator_modern.min.css.map +1 -1
  41. package/dist/css/tabulator_semanticui.css +12 -7
  42. package/dist/css/tabulator_semanticui.css.map +1 -1
  43. package/dist/css/tabulator_semanticui.min.css +1 -1
  44. package/dist/css/tabulator_semanticui.min.css.map +1 -1
  45. package/dist/css/tabulator_simple.css +12 -7
  46. package/dist/css/tabulator_simple.css.map +1 -1
  47. package/dist/css/tabulator_simple.min.css +1 -1
  48. package/dist/css/tabulator_simple.min.css.map +1 -1
  49. package/dist/css/tabulator_site.css +12 -7
  50. package/dist/css/tabulator_site.css.map +1 -1
  51. package/dist/css/tabulator_site.min.css +1 -1
  52. package/dist/css/tabulator_site.min.css.map +1 -1
  53. package/dist/js/jquery_wrapper.js +37 -37
  54. package/dist/js/tabulator.js +1506 -706
  55. package/dist/js/tabulator.js.map +1 -1
  56. package/dist/js/tabulator.min.js +2 -2
  57. package/dist/js/tabulator.min.js.map +1 -1
  58. package/dist/js/tabulator_esm.js +4226 -3460
  59. package/dist/js/tabulator_esm.js.map +1 -1
  60. package/dist/js/tabulator_esm.min.js +2 -2
  61. package/dist/js/tabulator_esm.min.js.map +1 -1
  62. package/package.json +4 -1
  63. package/src/js/builds/jquery_wrapper.js +37 -37
  64. package/src/js/core/ColumnManager.js +270 -232
  65. package/src/js/core/CoreFeature.js +16 -2
  66. package/src/js/core/FooterManager.js +10 -10
  67. package/src/js/core/Module.js +8 -8
  68. package/src/js/core/RowManager.js +81 -88
  69. package/src/js/core/Tabulator.js +89 -72
  70. package/src/js/core/TabulatorFull.js +1 -1
  71. package/src/js/core/cell/Cell.js +15 -16
  72. package/src/js/core/cell/CellComponent.js +2 -2
  73. package/src/js/core/column/Column.js +81 -68
  74. package/src/js/core/column/ColumnComponent.js +4 -4
  75. package/src/js/core/column/defaults/options.js +1 -1
  76. package/src/js/core/defaults/options.js +4 -2
  77. package/src/js/core/rendering/Renderer.js +19 -19
  78. package/src/js/core/rendering/renderers/BasicHorizontal.js +1 -2
  79. package/src/js/core/rendering/renderers/BasicVertical.js +1 -1
  80. package/src/js/core/rendering/renderers/VirtualDomHorizontal.js +42 -58
  81. package/src/js/core/rendering/renderers/VirtualDomVertical.js +31 -22
  82. package/src/js/core/row/Row.js +32 -8
  83. package/src/js/core/row/RowComponent.js +8 -4
  84. package/src/js/core/tools/Alert.js +44 -45
  85. package/src/js/core/tools/ComponentFunctionBinder.js +4 -2
  86. package/src/js/core/tools/DataLoader.js +3 -3
  87. package/src/js/core/tools/DeprecationAdvisor.js +47 -0
  88. package/src/js/core/tools/ExternalEventBus.js +5 -5
  89. package/src/js/core/tools/InteractionMonitor.js +34 -33
  90. package/src/js/core/tools/InternalEventBus.js +5 -5
  91. package/src/js/core/tools/ModuleBinder.js +6 -6
  92. package/src/js/core/tools/OptionsList.js +4 -4
  93. package/src/js/core/tools/Popup.js +215 -189
  94. package/src/js/modules/Accessor/Accessor.js +16 -16
  95. package/src/js/modules/Accessor/defaults/accessors.js +1 -1
  96. package/src/js/modules/Ajax/Ajax.js +7 -7
  97. package/src/js/modules/Ajax/defaults/loaderPromise.js +19 -19
  98. package/src/js/modules/Ajax/defaults/urlGenerator.js +1 -1
  99. package/src/js/modules/Clipboard/Clipboard.js +23 -23
  100. package/src/js/modules/Clipboard/defaults/pasteParsers.js +0 -2
  101. package/src/js/modules/ColumnCalcs/CalcComponent.js +2 -2
  102. package/src/js/modules/ColumnCalcs/ColumnCalcs.js +55 -51
  103. package/src/js/modules/ColumnCalcs/defaults/calculations.js +1 -1
  104. package/src/js/modules/DataTree/DataTree.js +24 -15
  105. package/src/js/modules/Download/Download.js +15 -8
  106. package/src/js/modules/Download/defaults/downloaders/csv.js +28 -28
  107. package/src/js/modules/Download/defaults/downloaders/html.js +2 -2
  108. package/src/js/modules/Download/defaults/downloaders/json.js +14 -14
  109. package/src/js/modules/Download/defaults/downloaders/jsonLines.js +1 -1
  110. package/src/js/modules/Download/defaults/downloaders/pdf.js +17 -19
  111. package/src/js/modules/Download/defaults/downloaders/xlsx.js +2 -2
  112. package/src/js/modules/Edit/Edit.js +219 -201
  113. package/src/js/modules/Edit/List.js +1026 -991
  114. package/src/js/modules/Edit/defaults/editors/autocomplete.js +3 -3
  115. package/src/js/modules/Edit/defaults/editors/date.js +110 -0
  116. package/src/js/modules/Edit/defaults/editors/datetime.js +97 -0
  117. package/src/js/modules/Edit/defaults/editors/input.js +7 -7
  118. package/src/js/modules/Edit/defaults/editors/list.js +2 -2
  119. package/src/js/modules/Edit/defaults/editors/number.js +12 -12
  120. package/src/js/modules/Edit/defaults/editors/progress.js +11 -11
  121. package/src/js/modules/Edit/defaults/editors/range.js +5 -5
  122. package/src/js/modules/Edit/defaults/editors/select.js +3 -3
  123. package/src/js/modules/Edit/defaults/editors/star.js +9 -9
  124. package/src/js/modules/Edit/defaults/editors/textarea.js +97 -92
  125. package/src/js/modules/Edit/defaults/editors/tickCross.js +1 -3
  126. package/src/js/modules/Edit/defaults/editors/time.js +98 -0
  127. package/src/js/modules/Edit/defaults/editors.js +8 -2
  128. package/src/js/modules/Edit/inputMask.js +19 -26
  129. package/src/js/modules/Export/Export.js +69 -65
  130. package/src/js/modules/Filter/Filter.js +88 -95
  131. package/src/js/modules/Format/Format.js +24 -26
  132. package/src/js/modules/Format/defaults/formatters/buttonCross.js +1 -1
  133. package/src/js/modules/Format/defaults/formatters/buttonTick.js +1 -1
  134. package/src/js/modules/Format/defaults/formatters/color.js +1 -1
  135. package/src/js/modules/Format/defaults/formatters/datetime.js +7 -7
  136. package/src/js/modules/Format/defaults/formatters/datetimediff.js +7 -7
  137. package/src/js/modules/Format/defaults/formatters/handle.js +1 -1
  138. package/src/js/modules/Format/defaults/formatters/html.js +1 -1
  139. package/src/js/modules/Format/defaults/formatters/image.js +9 -9
  140. package/src/js/modules/Format/defaults/formatters/link.js +10 -10
  141. package/src/js/modules/Format/defaults/formatters/lookup.js +1 -1
  142. package/src/js/modules/Format/defaults/formatters/money.js +1 -1
  143. package/src/js/modules/Format/defaults/formatters/plaintext.js +1 -1
  144. package/src/js/modules/Format/defaults/formatters/progress.js +41 -42
  145. package/src/js/modules/Format/defaults/formatters/responsiveCollapse.js +3 -3
  146. package/src/js/modules/Format/defaults/formatters/rowSelection.js +1 -1
  147. package/src/js/modules/Format/defaults/formatters/rownum.js +9 -2
  148. package/src/js/modules/Format/defaults/formatters/star.js +1 -1
  149. package/src/js/modules/Format/defaults/formatters/textarea.js +1 -1
  150. package/src/js/modules/Format/defaults/formatters/tickCross.js +1 -1
  151. package/src/js/modules/Format/defaults/formatters/traffic.js +14 -14
  152. package/src/js/modules/FrozenColumns/FrozenColumns.js +6 -8
  153. package/src/js/modules/FrozenRows/FrozenRows.js +37 -7
  154. package/src/js/modules/GroupRows/Group.js +7 -7
  155. package/src/js/modules/GroupRows/GroupComponent.js +2 -2
  156. package/src/js/modules/GroupRows/GroupRows.js +34 -11
  157. package/src/js/modules/History/History.js +2 -2
  158. package/src/js/modules/HtmlTableImport/HtmlTableImport.js +3 -6
  159. package/src/js/modules/Import/Import.js +158 -159
  160. package/src/js/modules/Import/defaults/importers/array.js +5 -0
  161. package/src/js/modules/Import/defaults/importers/csv.js +49 -49
  162. package/src/js/modules/Import/defaults/importers/json.js +6 -6
  163. package/src/js/modules/Import/defaults/importers.js +2 -0
  164. package/src/js/modules/Interaction/Interaction.js +41 -42
  165. package/src/js/modules/Keybindings/Keybindings.js +14 -14
  166. package/src/js/modules/Keybindings/defaults/actions.js +1 -2
  167. package/src/js/modules/Layout/Layout.js +4 -5
  168. package/src/js/modules/Layout/defaults/modes/fitColumns.js +13 -16
  169. package/src/js/modules/Layout/defaults/modes/fitData.js +6 -4
  170. package/src/js/modules/Layout/defaults/modes/fitDataGeneral.js +2 -2
  171. package/src/js/modules/Layout/defaults/modes/fitDataStretch.js +2 -2
  172. package/src/js/modules/Localize/Localize.js +7 -7
  173. package/src/js/modules/Menu/Menu.js +8 -11
  174. package/src/js/modules/MoveColumns/MoveColumns.js +3 -6
  175. package/src/js/modules/MoveRows/MoveRows.js +30 -36
  176. package/src/js/modules/Mutator/Mutator.js +9 -9
  177. package/src/js/modules/Page/Page.js +73 -80
  178. package/src/js/modules/Page/defaults/pageCounters/pages.js +2 -2
  179. package/src/js/modules/Page/defaults/pageCounters/rows.js +1 -1
  180. package/src/js/modules/Persistence/Persistence.js +40 -44
  181. package/src/js/modules/Persistence/defaults/readers.js +1 -1
  182. package/src/js/modules/Popup/Popup.js +4 -5
  183. package/src/js/modules/Print/Print.js +2 -2
  184. package/src/js/modules/ReactiveData/ReactiveData.js +178 -115
  185. package/src/js/modules/ResizeColumns/ResizeColumns.js +3 -3
  186. package/src/js/modules/ResizeRows/ResizeRows.js +1 -1
  187. package/src/js/modules/ResizeTable/ResizeTable.js +77 -46
  188. package/src/js/modules/ResponsiveLayout/ResponsiveLayout.js +3 -5
  189. package/src/js/modules/SelectRow/SelectRow.js +26 -28
  190. package/src/js/modules/Sort/Sort.js +110 -79
  191. package/src/js/modules/Sort/defaults/sorters/alphanum.js +1 -1
  192. package/src/js/modules/Sort/defaults/sorters/array.js +24 -28
  193. package/src/js/modules/Sort/defaults/sorters/boolean.js +1 -1
  194. package/src/js/modules/Sort/defaults/sorters/date.js +1 -1
  195. package/src/js/modules/Sort/defaults/sorters/datetime.js +13 -13
  196. package/src/js/modules/Sort/defaults/sorters/exists.js +1 -1
  197. package/src/js/modules/Sort/defaults/sorters/number.js +1 -1
  198. package/src/js/modules/Sort/defaults/sorters/string.js +7 -7
  199. package/src/js/modules/Sort/defaults/sorters/time.js +1 -1
  200. package/src/js/modules/Tooltip/Tooltip.js +5 -7
  201. package/src/js/modules/Validate/Validate.js +10 -13
  202. package/src/js/modules/Validate/defaults/validators.js +8 -3
  203. package/src/scss/tabulator.scss +28 -17
  204. package/src/scss/themes/bootstrap/functions4.scss +1 -1
  205. package/src/scss/themes/bootstrap/tabulator_bootstrap3.scss +8 -8
  206. package/src/scss/themes/bootstrap/tabulator_bootstrap4.scss +8 -8
  207. package/src/scss/themes/bootstrap/tabulator_bootstrap5.scss +25 -25
  208. package/src/scss/themes/bootstrap/variables5.scss +4 -4
  209. package/src/scss/themes/bulma/tabulator_bulma.scss +7 -7
  210. package/src/scss/themes/materialize/tabulator_materialize.scss +6 -6
  211. package/src/scss/themes/materialize/variables.scss +1 -1
  212. package/src/scss/themes/semanticui/tabulator_semanticui.scss +7 -7
  213. package/src/scss/themes/tabulator_midnight.scss +7 -7
  214. package/src/scss/themes/tabulator_modern.scss +14 -14
  215. package/src/scss/themes/tabulator_simple.scss +8 -8
  216. package/src/scss/themes/tabulator_site.scss +15 -15
@@ -4,26 +4,26 @@ import Helpers from '../../core/tools/Helpers.js';
4
4
  import defaultEditors from './defaults/editors.js';
5
5
 
6
6
  class Edit extends Module{
7
-
7
+
8
8
  constructor(table){
9
9
  super(table);
10
-
10
+
11
11
  this.currentCell = false; //hold currently editing cell
12
- this.mouseClick = false; //hold mousedown state to prevent click binding being overriden by editor opening
12
+ this.mouseClick = false; //hold mousedown state to prevent click binding being overridden by editor opening
13
13
  this.recursionBlock = false; //prevent focus recursion
14
14
  this.invalidEdit = false;
15
15
  this.editedCells = [];
16
-
16
+
17
17
  this.editors = Edit.editors;
18
-
18
+
19
19
  this.registerColumnOption("editable");
20
20
  this.registerColumnOption("editor");
21
21
  this.registerColumnOption("editorParams");
22
-
22
+
23
23
  this.registerColumnOption("cellEditing");
24
24
  this.registerColumnOption("cellEdited");
25
25
  this.registerColumnOption("cellEditCancelled");
26
-
26
+
27
27
  this.registerTableFunction("getEditedCells", this.getEditedCells.bind(this));
28
28
  this.registerTableFunction("clearCellEdited", this.clearCellEdited.bind(this));
29
29
  this.registerTableFunction("navigatePrev", this.navigatePrev.bind(this));
@@ -32,12 +32,12 @@ class Edit extends Module{
32
32
  this.registerTableFunction("navigateRight", this.navigateRight.bind(this));
33
33
  this.registerTableFunction("navigateUp", this.navigateUp.bind(this));
34
34
  this.registerTableFunction("navigateDown", this.navigateDown.bind(this));
35
-
36
- this.registerComponentFunction("cell", "isEdited", this.cellisEdited.bind(this));
35
+
36
+ this.registerComponentFunction("cell", "isEdited", this.cellIsEdited.bind(this));
37
37
  this.registerComponentFunction("cell", "clearEdited", this.clearEdited.bind(this));
38
38
  this.registerComponentFunction("cell", "edit", this.editCell.bind(this));
39
39
  this.registerComponentFunction("cell", "cancelEdit", this.cellCancelEdit.bind(this));
40
-
40
+
41
41
  this.registerComponentFunction("cell", "navigatePrev", this.navigatePrev.bind(this));
42
42
  this.registerComponentFunction("cell", "navigateNext", this.navigateNext.bind(this));
43
43
  this.registerComponentFunction("cell", "navigateLeft", this.navigateLeft.bind(this));
@@ -45,15 +45,16 @@ class Edit extends Module{
45
45
  this.registerComponentFunction("cell", "navigateUp", this.navigateUp.bind(this));
46
46
  this.registerComponentFunction("cell", "navigateDown", this.navigateDown.bind(this));
47
47
  }
48
-
48
+
49
49
  initialize(){
50
50
  this.subscribe("cell-init", this.bindEditor.bind(this));
51
51
  this.subscribe("cell-delete", this.clearEdited.bind(this));
52
+ this.subscribe("cell-value-changed", this.updateCellClass.bind(this));
52
53
  this.subscribe("column-layout", this.initializeColumnCheck.bind(this));
53
54
  this.subscribe("column-delete", this.columnDeleteCheck.bind(this));
54
55
  this.subscribe("row-deleting", this.rowDeleteCheck.bind(this));
55
56
  this.subscribe("data-refreshing", this.cancelEdit.bind(this));
56
-
57
+
57
58
  this.subscribe("keybinding-nav-prev", this.navigatePrev.bind(this, undefined));
58
59
  this.subscribe("keybinding-nav-next", this.keybindingNavigateNext.bind(this));
59
60
  this.subscribe("keybinding-nav-left", this.navigateLeft.bind(this, undefined));
@@ -61,49 +62,49 @@ class Edit extends Module{
61
62
  this.subscribe("keybinding-nav-up", this.navigateUp.bind(this, undefined));
62
63
  this.subscribe("keybinding-nav-down", this.navigateDown.bind(this, undefined));
63
64
  }
64
-
65
-
65
+
66
+
66
67
  ///////////////////////////////////
67
68
  ////// Keybinding Functions ///////
68
69
  ///////////////////////////////////
69
-
70
+
70
71
  keybindingNavigateNext(e){
71
72
  var cell = this.currentCell,
72
73
  newRow = this.options("tabEndNewRow");
73
-
74
+
74
75
  if(cell){
75
76
  if(!this.navigateNext(cell, e)){
76
77
  if(newRow){
77
78
  cell.getElement().firstChild.blur();
78
-
79
+
79
80
  if(newRow === true){
80
- newRow = this.table.addRow({})
81
+ newRow = this.table.addRow({});
81
82
  }else{
82
83
  if(typeof newRow == "function"){
83
- newRow = this.table.addRow(newRow(cell.row.getComponent()))
84
+ newRow = this.table.addRow(newRow(cell.row.getComponent()));
84
85
  }else{
85
86
  newRow = this.table.addRow(Object.assign({}, newRow));
86
87
  }
87
88
  }
88
-
89
+
89
90
  newRow.then(() => {
90
91
  setTimeout(() => {
91
92
  cell.getComponent().navigateNext();
92
- })
93
+ });
93
94
  });
94
95
  }
95
96
  }
96
97
  }
97
98
  }
98
-
99
+
99
100
  ///////////////////////////////////
100
101
  ///////// Cell Functions //////////
101
102
  ///////////////////////////////////
102
-
103
- cellisEdited(cell){
103
+
104
+ cellIsEdited(cell){
104
105
  return !! cell.modules.edit && cell.modules.edit.edited;
105
106
  }
106
-
107
+
107
108
  cellCancelEdit(cell){
108
109
  if(cell === this.currentCell){
109
110
  this.table.modules.edit.cancelEdit();
@@ -111,44 +112,53 @@ class Edit extends Module{
111
112
  console.warn("Cancel Editor Error - This cell is not currently being edited ");
112
113
  }
113
114
  }
114
-
115
-
115
+
116
+
116
117
  ///////////////////////////////////
117
118
  ///////// Table Functions /////////
118
119
  ///////////////////////////////////
120
+ updateCellClass(cell){
121
+ if(this.allowEdit(cell)) {
122
+ cell.getElement().classList.add("tabulator-editable");
123
+ }
124
+ else {
125
+ cell.getElement().classList.remove("tabulator-editable");
126
+ }
127
+ }
128
+
119
129
  clearCellEdited(cells){
120
130
  if(!cells){
121
131
  cells = this.table.modules.edit.getEditedCells();
122
132
  }
123
-
133
+
124
134
  if(!Array.isArray(cells)){
125
135
  cells = [cells];
126
136
  }
127
-
137
+
128
138
  cells.forEach((cell) => {
129
139
  this.table.modules.edit.clearEdited(cell._getSelf());
130
140
  });
131
141
  }
132
-
142
+
133
143
  navigatePrev(cell = this.currentCell, e){
134
144
  var nextCell, prevRow;
135
-
145
+
136
146
  if(cell){
137
-
147
+
138
148
  if(e){
139
149
  e.preventDefault();
140
150
  }
141
-
151
+
142
152
  nextCell = this.navigateLeft();
143
-
153
+
144
154
  if(nextCell){
145
155
  return true;
146
156
  }else{
147
157
  prevRow = this.table.rowManager.prevDisplayRow(cell.row, true);
148
-
158
+
149
159
  if(prevRow){
150
160
  nextCell = this.findNextEditableCell(prevRow, prevRow.cells.length);
151
-
161
+
152
162
  if(nextCell){
153
163
  nextCell.getComponent().edit();
154
164
  return true;
@@ -156,29 +166,29 @@ class Edit extends Module{
156
166
  }
157
167
  }
158
168
  }
159
-
169
+
160
170
  return false;
161
171
  }
162
-
172
+
163
173
  navigateNext(cell = this.currentCell, e){
164
174
  var nextCell, nextRow;
165
-
175
+
166
176
  if(cell){
167
-
177
+
168
178
  if(e){
169
179
  e.preventDefault();
170
180
  }
171
-
181
+
172
182
  nextCell = this.navigateRight();
173
-
183
+
174
184
  if(nextCell){
175
185
  return true;
176
186
  }else{
177
187
  nextRow = this.table.rowManager.nextDisplayRow(cell.row, true);
178
-
188
+
179
189
  if(nextRow){
180
190
  nextCell = this.findNextEditableCell(nextRow, -1);
181
-
191
+
182
192
  if(nextCell){
183
193
  nextCell.getComponent().edit();
184
194
  return true;
@@ -186,108 +196,104 @@ class Edit extends Module{
186
196
  }
187
197
  }
188
198
  }
189
-
199
+
190
200
  return false;
191
201
  }
192
-
202
+
193
203
  navigateLeft(cell = this.currentCell, e){
194
204
  var index, nextCell;
195
-
205
+
196
206
  if(cell){
197
-
207
+
198
208
  if(e){
199
209
  e.preventDefault();
200
210
  }
201
-
211
+
202
212
  index = cell.getIndex();
203
213
  nextCell = this.findPrevEditableCell(cell.row, index);
204
-
214
+
205
215
  if(nextCell){
206
216
  nextCell.getComponent().edit();
207
217
  return true;
208
218
  }
209
219
  }
210
-
220
+
211
221
  return false;
212
222
  }
213
-
223
+
214
224
  navigateRight(cell = this.currentCell, e){
215
225
  var index, nextCell;
216
-
226
+
217
227
  if(cell){
218
-
228
+
219
229
  if(e){
220
230
  e.preventDefault();
221
231
  }
222
-
232
+
223
233
  index = cell.getIndex();
224
234
  nextCell = this.findNextEditableCell(cell.row, index);
225
-
235
+
226
236
  if(nextCell){
227
237
  nextCell.getComponent().edit();
228
238
  return true;
229
239
  }
230
240
  }
231
-
241
+
232
242
  return false;
233
243
  }
234
-
244
+
235
245
  navigateUp(cell = this.currentCell, e){
236
246
  var index, nextRow;
237
-
247
+
238
248
  if(cell){
239
-
249
+
240
250
  if(e){
241
251
  e.preventDefault();
242
252
  }
243
-
253
+
244
254
  index = cell.getIndex();
245
255
  nextRow = this.table.rowManager.prevDisplayRow(cell.row, true);
246
-
256
+
247
257
  if(nextRow){
248
258
  nextRow.cells[index].getComponent().edit();
249
259
  return true;
250
260
  }
251
261
  }
252
-
262
+
253
263
  return false;
254
264
  }
255
-
265
+
256
266
  navigateDown(cell = this.currentCell, e){
257
267
  var index, nextRow;
258
-
268
+
259
269
  if(cell){
260
-
270
+
261
271
  if(e){
262
272
  e.preventDefault();
263
273
  }
264
-
274
+
265
275
  index = cell.getIndex();
266
276
  nextRow = this.table.rowManager.nextDisplayRow(cell.row, true);
267
-
277
+
268
278
  if(nextRow){
269
279
  nextRow.cells[index].getComponent().edit();
270
280
  return true;
271
281
  }
272
282
  }
273
-
283
+
274
284
  return false;
275
285
  }
276
-
286
+
277
287
  findNextEditableCell(row, index){
278
288
  var nextCell = false;
279
-
289
+
280
290
  if(index < row.cells.length-1){
281
291
  for(var i = index+1; i < row.cells.length; i++){
282
292
  let cell = row.cells[i];
283
-
293
+
284
294
  if(cell.column.modules.edit && Helpers.elVisible(cell.getElement())){
285
- let allowEdit = true;
286
-
287
- if(typeof cell.column.modules.edit.check == "function"){
288
- allowEdit = cell.column.modules.edit.check(cell.getComponent());
289
- }
290
-
295
+ let allowEdit = this.allowEdit(cell);
296
+
291
297
  if(allowEdit){
292
298
  nextCell = cell;
293
299
  break;
@@ -295,23 +301,20 @@ class Edit extends Module{
295
301
  }
296
302
  }
297
303
  }
298
-
304
+
299
305
  return nextCell;
300
306
  }
301
-
307
+
302
308
  findPrevEditableCell(row, index){
303
309
  var prevCell = false;
304
-
310
+
305
311
  if(index > 0){
306
312
  for(var i = index-1; i >= 0; i--){
307
- let cell = row.cells[i],
308
- allowEdit = true;
309
-
313
+ let cell = row.cells[i];
314
+
310
315
  if(cell.column.modules.edit && Helpers.elVisible(cell.getElement())){
311
- if(typeof cell.column.modules.edit.check == "function"){
312
- allowEdit = cell.column.modules.edit.check(cell.getComponent());
313
- }
314
-
316
+ let allowEdit = this.allowEdit(cell);
317
+
315
318
  if(allowEdit){
316
319
  prevCell = cell;
317
320
  break;
@@ -319,137 +322,139 @@ class Edit extends Module{
319
322
  }
320
323
  }
321
324
  }
322
-
325
+
323
326
  return prevCell;
324
327
  }
325
-
328
+
326
329
  ///////////////////////////////////
327
330
  ///////// Internal Logic //////////
328
331
  ///////////////////////////////////
329
-
332
+
330
333
  initializeColumnCheck(column){
331
334
  if(typeof column.definition.editor !== "undefined"){
332
335
  this.initializeColumn(column);
333
336
  }
334
337
  }
335
-
338
+
336
339
  columnDeleteCheck(column){
337
340
  if(this.currentCell && this.currentCell.column === column){
338
341
  this.cancelEdit();
339
342
  }
340
343
  }
341
-
344
+
342
345
  rowDeleteCheck(row){
343
346
  if(this.currentCell && this.currentCell.row === row){
344
347
  this.cancelEdit();
345
348
  }
346
349
  }
347
-
350
+
348
351
  //initialize column editor
349
352
  initializeColumn(column){
350
- var self = this,
351
- config = {
353
+ var config = {
352
354
  editor:false,
353
355
  blocked:false,
354
356
  check:column.definition.editable,
355
357
  params:column.definition.editorParams || {}
356
358
  };
357
-
359
+
358
360
  //set column editor
359
361
  switch(typeof column.definition.editor){
360
362
  case "string":
361
- if(this.editors[column.definition.editor]){
362
- config.editor = this.editors[column.definition.editor];
363
- }else{
364
- console.warn("Editor Error - No such editor found: ", column.definition.editor);
365
- }
366
- break;
367
-
363
+ if(this.editors[column.definition.editor]){
364
+ config.editor = this.editors[column.definition.editor];
365
+ }else{
366
+ console.warn("Editor Error - No such editor found: ", column.definition.editor);
367
+ }
368
+ break;
369
+
368
370
  case "function":
369
- config.editor = column.definition.editor;
370
- break;
371
-
371
+ config.editor = column.definition.editor;
372
+ break;
373
+
372
374
  case "boolean":
373
- if(column.definition.editor === true){
374
- if(typeof column.definition.formatter !== "function"){
375
- if(this.editors[column.definition.formatter]){
376
- config.editor = this.editors[column.definition.formatter];
375
+ if(column.definition.editor === true){
376
+ if(typeof column.definition.formatter !== "function"){
377
+ if(this.editors[column.definition.formatter]){
378
+ config.editor = this.editors[column.definition.formatter];
379
+ }else{
380
+ config.editor = this.editors["input"];
381
+ }
377
382
  }else{
378
- config.editor = this.editors["input"];
383
+ console.warn("Editor Error - Cannot auto lookup editor for a custom formatter: ", column.definition.formatter);
379
384
  }
380
- }else{
381
- console.warn("Editor Error - Cannot auto lookup editor for a custom formatter: ", column.definition.formatter);
382
385
  }
383
- }
384
- break;
386
+ break;
385
387
  }
386
-
388
+
387
389
  if(config.editor){
388
390
  column.modules.edit = config;
389
391
  }
390
392
  }
391
-
393
+
392
394
  getCurrentCell(){
393
395
  return this.currentCell ? this.currentCell.getComponent() : false;
394
396
  }
395
-
397
+
396
398
  clearEditor(cancel){
397
399
  var cell = this.currentCell,
398
400
  cellEl;
399
-
401
+
400
402
  this.invalidEdit = false;
401
-
403
+
402
404
  if(cell){
403
405
  this.currentCell = false;
404
-
406
+
405
407
  cellEl = cell.getElement();
406
-
408
+
407
409
  this.dispatch("edit-editor-clear", cell, cancel);
408
-
410
+
409
411
  cellEl.classList.remove("tabulator-editing");
410
-
412
+
411
413
  while(cellEl.firstChild) cellEl.removeChild(cellEl.firstChild);
412
-
413
- cell.row.getElement().classList.remove("tabulator-row-editing");
414
+
415
+ cell.row.getElement().classList.remove("tabulator-editing");
416
+
417
+ cell.table.element.classList.remove("tabulator-editing");
414
418
  }
415
419
  }
416
-
420
+
417
421
  cancelEdit(){
418
422
  if(this.currentCell){
419
423
  var cell = this.currentCell;
420
424
  var component = this.currentCell.getComponent();
421
-
425
+
422
426
  this.clearEditor(true);
423
427
  cell.setValueActual(cell.getValue());
424
428
  cell.cellRendered();
425
-
429
+
426
430
  if(cell.column.definition.editor == "textarea" || cell.column.definition.variableHeight){
427
431
  cell.row.normalizeHeight(true);
428
432
  }
429
-
433
+
430
434
  if(cell.column.definition.cellEditCancelled){
431
435
  cell.column.definition.cellEditCancelled.call(this.table, component);
432
436
  }
433
-
437
+
434
438
  this.dispatch("edit-cancelled", cell);
435
439
  this.dispatchExternal("cellEditCancelled", component);
436
440
  }
437
441
  }
438
-
442
+
439
443
  //return a formatted value for a cell
440
444
  bindEditor(cell){
441
445
  if(cell.column.modules.edit){
442
446
  var self = this,
443
447
  element = cell.getElement(true);
444
-
448
+
449
+ this.updateCellClass(cell);
445
450
  element.setAttribute("tabindex", 0);
446
-
451
+
447
452
  element.addEventListener("click", function(e){
448
453
  if(!element.classList.contains("tabulator-editing")){
449
454
  element.focus({preventScroll: true});
450
455
  }
451
456
  });
452
-
457
+
453
458
  element.addEventListener("mousedown", function(e){
454
459
  if (e.button === 2) {
455
460
  e.preventDefault();
@@ -457,7 +462,7 @@ class Edit extends Module{
457
462
  self.mouseClick = true;
458
463
  }
459
464
  });
460
-
465
+
461
466
  element.addEventListener("focus", function(e){
462
467
  if(!self.recursionBlock){
463
468
  self.edit(cell, e, false);
@@ -465,29 +470,28 @@ class Edit extends Module{
465
470
  });
466
471
  }
467
472
  }
468
-
473
+
469
474
  focusCellNoEvent(cell, block){
470
475
  this.recursionBlock = true;
471
-
476
+
472
477
  if(!(block && this.table.browser === "ie")){
473
478
  cell.getElement().focus({preventScroll: true});
474
479
  }
475
-
480
+
476
481
  this.recursionBlock = false;
477
482
  }
478
-
483
+
479
484
  editCell(cell, forceEdit){
480
485
  this.focusCellNoEvent(cell);
481
486
  this.edit(cell, false, forceEdit);
482
487
  }
483
-
488
+
484
489
  focusScrollAdjust(cell){
485
490
  if(this.table.rowManager.getRenderMode() == "virtual"){
486
491
  var topEdge = this.table.rowManager.element.scrollTop,
487
492
  bottomEdge = this.table.rowManager.element.clientHeight + this.table.rowManager.element.scrollTop,
488
- rowEl = cell.row.getElement(),
489
- offset = rowEl.offsetTop;
490
-
493
+ rowEl = cell.row.getElement();
494
+
491
495
  if(rowEl.offsetTop < topEdge){
492
496
  this.table.rowManager.element.scrollTop -= (topEdge - rowEl.offsetTop);
493
497
  }else{
@@ -495,24 +499,23 @@ class Edit extends Module{
495
499
  this.table.rowManager.element.scrollTop += (rowEl.offsetTop + rowEl.offsetHeight - bottomEdge);
496
500
  }
497
501
  }
498
-
502
+
499
503
  var leftEdge = this.table.rowManager.element.scrollLeft,
500
504
  rightEdge = this.table.rowManager.element.clientWidth + this.table.rowManager.element.scrollLeft,
501
- cellEl = cell.getElement(),
502
- offset = cellEl.offsetLeft;
503
-
505
+ cellEl = cell.getElement();
506
+
504
507
  if(this.table.modExists("frozenColumns")){
505
508
  leftEdge += parseInt(this.table.modules.frozenColumns.leftMargin);
506
509
  rightEdge -= parseInt(this.table.modules.frozenColumns.rightMargin);
507
510
  }
508
-
511
+
509
512
  if(this.table.options.renderHorizontal === "virtual"){
510
513
  leftEdge -= parseInt(this.table.columnManager.renderer.vDomPadLeft);
511
514
  rightEdge -= parseInt(this.table.columnManager.renderer.vDomPadLeft);
512
515
  }
513
-
516
+
514
517
  if(cellEl.offsetLeft < leftEdge){
515
-
518
+
516
519
  this.table.rowManager.element.scrollLeft -= (leftEdge - cellEl.offsetLeft);
517
520
  }else{
518
521
  if(cellEl.offsetLeft + cellEl.offsetWidth > rightEdge){
@@ -521,14 +524,36 @@ class Edit extends Module{
521
524
  }
522
525
  }
523
526
  }
527
+
528
+ allowEdit(cell) {
529
+ var check = cell.column.modules.edit ? true : false;
530
+
531
+ if(cell.column.modules.edit){
532
+ switch(typeof cell.column.modules.edit.check){
533
+ case "function":
534
+ check = cell.column.modules.edit.check(cell.getComponent());
535
+ break;
536
+
537
+ case "string":
538
+ check = !!cell.row.data[cell.column.modules.edit.check];
539
+ break;
540
+
541
+ case "boolean":
542
+ check = cell.column.modules.edit.check;
543
+ break;
544
+ }
545
+ }
524
546
 
547
+ return check;
548
+ }
549
+
525
550
  edit(cell, e, forceEdit){
526
551
  var self = this,
527
552
  allowEdit = true,
528
553
  rendered = function(){},
529
554
  element = cell.getElement(),
530
555
  cellEditor, component, params;
531
-
556
+
532
557
  //prevent editing if another cell is refusing to leave focus (eg. validation fail)
533
558
  if(this.currentCell){
534
559
  if(!this.invalidEdit){
@@ -536,28 +561,28 @@ class Edit extends Module{
536
561
  }
537
562
  return;
538
563
  }
539
-
564
+
540
565
  //handle successful value change
541
566
  function success(value){
542
567
  if(self.currentCell === cell){
543
568
  var valid = self.chain("edit-success", [cell, value], true, true);
544
-
569
+
545
570
  if(valid === true || self.table.options.validationMode === "highlight"){
546
571
  self.clearEditor();
547
-
548
-
572
+
573
+
549
574
  if(!cell.modules.edit){
550
575
  cell.modules.edit = {};
551
576
  }
552
-
577
+
553
578
  cell.modules.edit.edited = true;
554
-
579
+
555
580
  if(self.editedCells.indexOf(cell) == -1){
556
581
  self.editedCells.push(cell);
557
582
  }
558
-
583
+
559
584
  cell.setValue(value, true);
560
-
585
+
561
586
  return valid === true;
562
587
  }else{
563
588
  self.invalidEdit = true;
@@ -569,7 +594,7 @@ class Edit extends Module{
569
594
  // console.warn("Edit Success Error - cannot call success on a cell that is no longer being edited");
570
595
  }
571
596
  }
572
-
597
+
573
598
  //handle aborted edit
574
599
  function cancel(){
575
600
  if(self.currentCell === cell){
@@ -578,70 +603,63 @@ class Edit extends Module{
578
603
  // console.warn("Edit Success Error - cannot call cancel on a cell that is no longer being edited");
579
604
  }
580
605
  }
581
-
606
+
582
607
  function onRendered(callback){
583
608
  rendered = callback;
584
609
  }
585
-
610
+
586
611
  if(!cell.column.modules.edit.blocked){
587
612
  if(e){
588
613
  e.stopPropagation();
589
614
  }
590
-
591
- switch(typeof cell.column.modules.edit.check){
592
- case "function":
593
- allowEdit = cell.column.modules.edit.check(cell.getComponent());
594
- break;
595
-
596
- case "boolean":
597
- allowEdit = cell.column.modules.edit.check;
598
- break;
599
- }
600
-
615
+
616
+ allowEdit = this.allowEdit(cell);
617
+
601
618
  if(allowEdit || forceEdit){
602
-
619
+
603
620
  self.cancelEdit();
604
-
621
+
605
622
  self.currentCell = cell;
606
-
623
+
607
624
  this.focusScrollAdjust(cell);
608
-
625
+
609
626
  component = cell.getComponent();
610
-
627
+
611
628
  if(this.mouseClick){
612
629
  this.mouseClick = false;
613
-
630
+
614
631
  if(cell.column.definition.cellClick){
615
632
  cell.column.definition.cellClick.call(this.table, e, component);
616
633
  }
617
634
  }
618
-
635
+
619
636
  if(cell.column.definition.cellEditing){
620
637
  cell.column.definition.cellEditing.call(this.table, component);
621
638
  }
622
-
639
+
623
640
  this.dispatch("cell-editing", cell);
624
641
  this.dispatchExternal("cellEditing", component);
625
-
642
+
626
643
  params = typeof cell.column.modules.edit.params === "function" ? cell.column.modules.edit.params(component) : cell.column.modules.edit.params;
627
-
644
+
628
645
  cellEditor = cell.column.modules.edit.editor.call(self, component, onRendered, success, cancel, params);
629
-
646
+
630
647
  //if editor returned, add to DOM, if false, abort edit
631
648
  if(cellEditor !== false){
632
-
649
+
633
650
  if(cellEditor instanceof Node){
634
651
  element.classList.add("tabulator-editing");
635
- cell.row.getElement().classList.add("tabulator-row-editing");
652
+ cell.row.getElement().classList.add("tabulator-editing");
653
+ cell.table.element.classList.add("tabulator-editing");
636
654
  while(element.firstChild) element.removeChild(element.firstChild);
637
655
  element.appendChild(cellEditor);
638
-
656
+
639
657
  //trigger onRendered Callback
640
658
  rendered();
641
-
659
+
642
660
  //prevent editing from triggering rowClick event
643
661
  var children = element.children;
644
-
662
+
645
663
  for (var i = 0; i < children.length; i++) {
646
664
  children[i].addEventListener("click", function(e){
647
665
  e.stopPropagation();
@@ -652,12 +670,12 @@ class Edit extends Module{
652
670
  element.blur();
653
671
  return false;
654
672
  }
655
-
673
+
656
674
  }else{
657
675
  element.blur();
658
676
  return false;
659
677
  }
660
-
678
+
661
679
  return true;
662
680
  }else{
663
681
  this.mouseClick = false;
@@ -670,28 +688,28 @@ class Edit extends Module{
670
688
  return false;
671
689
  }
672
690
  }
673
-
691
+
674
692
  getEditedCells(){
675
693
  var output = [];
676
-
694
+
677
695
  this.editedCells.forEach((cell) => {
678
696
  output.push(cell.getComponent());
679
697
  });
680
-
698
+
681
699
  return output;
682
700
  }
683
-
701
+
684
702
  clearEdited(cell){
685
703
  var editIndex;
686
-
704
+
687
705
  if(cell.modules.edit && cell.modules.edit.edited){
688
706
  cell.modules.edit.edited = false;
689
-
707
+
690
708
  this.dispatch("edit-edited-clear", cell);
691
709
  }
692
-
710
+
693
711
  editIndex = this.editedCells.indexOf(cell);
694
-
712
+
695
713
  if(editIndex > -1){
696
714
  this.editedCells.splice(editIndex, 1);
697
715
  }