tabulator-tables 5.4.2 → 5.4.4

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 (253) hide show
  1. package/.babelrc.json +3 -3
  2. package/.editorconfig +6 -6
  3. package/.eslintignore +3 -3
  4. package/.eslintrc.js +28 -28
  5. package/.github/ISSUE_TEMPLATE/bug_report.md +58 -58
  6. package/.github/ISSUE_TEMPLATE/documentation.md +14 -14
  7. package/.github/ISSUE_TEMPLATE/feature_request.md +24 -24
  8. package/.github/ISSUE_TEMPLATE/question.md +12 -12
  9. package/.github/workflows/bad-files-check.yml +39 -39
  10. package/.github/workflows/lint-and-test.yml +30 -30
  11. package/CODE_OF_CONDUCT.md +46 -46
  12. package/CONTRIBUTING.md +22 -22
  13. package/LICENSE +20 -20
  14. package/README.md +76 -76
  15. package/bower.json +40 -40
  16. package/build/Bundler.js +185 -185
  17. package/build/rollup.js +6 -6
  18. package/dist/css/tabulator.css +1 -5
  19. package/dist/css/tabulator.css.map +1 -1
  20. package/dist/css/tabulator.min.css +1 -1
  21. package/dist/css/tabulator.min.css.map +1 -1
  22. package/dist/css/tabulator_bootstrap3.css +1 -5
  23. package/dist/css/tabulator_bootstrap3.css.map +1 -1
  24. package/dist/css/tabulator_bootstrap3.min.css +1 -1
  25. package/dist/css/tabulator_bootstrap3.min.css.map +1 -1
  26. package/dist/css/tabulator_bootstrap4.css +1 -5
  27. package/dist/css/tabulator_bootstrap4.css.map +1 -1
  28. package/dist/css/tabulator_bootstrap4.min.css +1 -1
  29. package/dist/css/tabulator_bootstrap4.min.css.map +1 -1
  30. package/dist/css/tabulator_bootstrap5.css +1 -5
  31. package/dist/css/tabulator_bootstrap5.css.map +1 -1
  32. package/dist/css/tabulator_bootstrap5.min.css +1 -1
  33. package/dist/css/tabulator_bootstrap5.min.css.map +1 -1
  34. package/dist/css/tabulator_bulma.css +1 -5
  35. package/dist/css/tabulator_bulma.css.map +1 -1
  36. package/dist/css/tabulator_bulma.min.css +1 -1
  37. package/dist/css/tabulator_bulma.min.css.map +1 -1
  38. package/dist/css/tabulator_materialize.css +1 -5
  39. package/dist/css/tabulator_materialize.css.map +1 -1
  40. package/dist/css/tabulator_materialize.min.css +1 -1
  41. package/dist/css/tabulator_materialize.min.css.map +1 -1
  42. package/dist/css/tabulator_midnight.css +1 -5
  43. package/dist/css/tabulator_midnight.css.map +1 -1
  44. package/dist/css/tabulator_midnight.min.css +1 -1
  45. package/dist/css/tabulator_midnight.min.css.map +1 -1
  46. package/dist/css/tabulator_modern.css +1 -5
  47. package/dist/css/tabulator_modern.css.map +1 -1
  48. package/dist/css/tabulator_modern.min.css +1 -1
  49. package/dist/css/tabulator_modern.min.css.map +1 -1
  50. package/dist/css/tabulator_semanticui.css +103 -107
  51. package/dist/css/tabulator_semanticui.css.map +1 -1
  52. package/dist/css/tabulator_semanticui.min.css +1 -1
  53. package/dist/css/tabulator_semanticui.min.css.map +1 -1
  54. package/dist/css/tabulator_simple.css +1 -5
  55. package/dist/css/tabulator_simple.css.map +1 -1
  56. package/dist/css/tabulator_simple.min.css +1 -1
  57. package/dist/css/tabulator_simple.min.css.map +1 -1
  58. package/dist/css/tabulator_site.css +1 -5
  59. package/dist/css/tabulator_site.css.map +1 -1
  60. package/dist/css/tabulator_site.min.css +1 -1
  61. package/dist/css/tabulator_site.min.css.map +1 -1
  62. package/dist/js/jquery_wrapper.js +55 -55
  63. package/dist/js/tabulator.js +25847 -25653
  64. package/dist/js/tabulator.js.map +1 -1
  65. package/dist/js/tabulator.min.js +2 -2
  66. package/dist/js/tabulator.min.js.map +1 -1
  67. package/dist/js/tabulator_esm.js +25926 -25732
  68. package/dist/js/tabulator_esm.js.map +1 -1
  69. package/dist/js/tabulator_esm.min.js +2 -2
  70. package/dist/js/tabulator_esm.min.js.map +1 -1
  71. package/package.json +65 -65
  72. package/src/js/builds/esm.js +14 -14
  73. package/src/js/builds/jquery_wrapper.js +55 -55
  74. package/src/js/core/ColumnManager.js +730 -730
  75. package/src/js/core/CoreFeature.js +138 -138
  76. package/src/js/core/FooterManager.js +101 -101
  77. package/src/js/core/Module.js +141 -141
  78. package/src/js/core/RowManager.js +1112 -1082
  79. package/src/js/core/Tabulator.js +895 -893
  80. package/src/js/core/TabulatorFull.js +10 -10
  81. package/src/js/core/cell/Cell.js +295 -295
  82. package/src/js/core/cell/CellComponent.js +76 -76
  83. package/src/js/core/column/Column.js +949 -949
  84. package/src/js/core/column/ColumnComponent.js +152 -152
  85. package/src/js/core/column/defaults/options.js +17 -17
  86. package/src/js/core/defaults/options.js +65 -65
  87. package/src/js/core/modules/core.js +2 -2
  88. package/src/js/core/modules/optional.js +34 -34
  89. package/src/js/core/rendering/Renderer.js +203 -203
  90. package/src/js/core/rendering/renderers/BasicHorizontal.js +19 -19
  91. package/src/js/core/rendering/renderers/BasicVertical.js +79 -78
  92. package/src/js/core/rendering/renderers/VirtualDomHorizontal.js +577 -577
  93. package/src/js/core/rendering/renderers/VirtualDomVertical.js +579 -579
  94. package/src/js/core/row/PseudoRow.js +44 -44
  95. package/src/js/core/row/Row.js +457 -457
  96. package/src/js/core/row/RowComponent.js +93 -93
  97. package/src/js/core/tools/Alert.js +61 -61
  98. package/src/js/core/tools/ComponentFunctionBinder.js +32 -32
  99. package/src/js/core/tools/DataLoader.js +119 -119
  100. package/src/js/core/tools/DeprecationAdvisor.js +46 -46
  101. package/src/js/core/tools/ExternalEventBus.js +104 -104
  102. package/src/js/core/tools/Helpers.js +46 -46
  103. package/src/js/core/tools/InteractionMonitor.js +321 -321
  104. package/src/js/core/tools/InternalEventBus.js +161 -161
  105. package/src/js/core/tools/ModuleBinder.js +104 -104
  106. package/src/js/core/tools/OptionsList.js +44 -40
  107. package/src/js/core/tools/Popup.js +304 -304
  108. package/src/js/core/tools/TableRegistry.js +61 -61
  109. package/src/js/modules/Accessor/Accessor.js +115 -115
  110. package/src/js/modules/Ajax/Ajax.js +143 -143
  111. package/src/js/modules/Ajax/defaults/config.js +2 -2
  112. package/src/js/modules/Ajax/defaults/contentTypeFormatters.js +44 -44
  113. package/src/js/modules/Ajax/defaults/loaderPromise.js +86 -86
  114. package/src/js/modules/Ajax/defaults/urlGenerator.js +43 -43
  115. package/src/js/modules/Clipboard/Clipboard.js +279 -279
  116. package/src/js/modules/Clipboard/defaults/pasteActions.js +10 -10
  117. package/src/js/modules/Clipboard/defaults/pasteParsers.js +74 -74
  118. package/src/js/modules/ColumnCalcs/CalcComponent.js +47 -47
  119. package/src/js/modules/ColumnCalcs/ColumnCalcs.js +581 -568
  120. package/src/js/modules/ColumnCalcs/defaults/calculations.js +85 -85
  121. package/src/js/modules/Comms/Comms.js +51 -51
  122. package/src/js/modules/DataTree/DataTree.js +603 -603
  123. package/src/js/modules/Download/Download.js +148 -148
  124. package/src/js/modules/Download/defaults/downloaders/csv.js +61 -61
  125. package/src/js/modules/Download/defaults/downloaders/html.js +4 -4
  126. package/src/js/modules/Download/defaults/downloaders/json.js +33 -33
  127. package/src/js/modules/Download/defaults/downloaders/jsonLines.js +31 -31
  128. package/src/js/modules/Download/defaults/downloaders/pdf.js +111 -111
  129. package/src/js/modules/Download/defaults/downloaders/xlsx.js +98 -98
  130. package/src/js/modules/Download/defaults/downloaders.js +14 -14
  131. package/src/js/modules/Edit/Edit.js +735 -736
  132. package/src/js/modules/Edit/List.js +1037 -1033
  133. package/src/js/modules/Edit/defaults/editors/autocomplete.js +11 -11
  134. package/src/js/modules/Edit/defaults/editors/date.js +138 -110
  135. package/src/js/modules/Edit/defaults/editors/datetime.js +125 -97
  136. package/src/js/modules/Edit/defaults/editors/input.js +76 -74
  137. package/src/js/modules/Edit/defaults/editors/list.js +6 -6
  138. package/src/js/modules/Edit/defaults/editors/number.js +109 -107
  139. package/src/js/modules/Edit/defaults/editors/progress.js +126 -126
  140. package/src/js/modules/Edit/defaults/editors/range.js +80 -78
  141. package/src/js/modules/Edit/defaults/editors/select.js +9 -9
  142. package/src/js/modules/Edit/defaults/editors/star.js +145 -145
  143. package/src/js/modules/Edit/defaults/editors/textarea.js +122 -120
  144. package/src/js/modules/Edit/defaults/editors/tickCross.js +94 -96
  145. package/src/js/modules/Edit/defaults/editors/time.js +126 -98
  146. package/src/js/modules/Edit/defaults/editors.js +28 -28
  147. package/src/js/modules/Edit/inputMask.js +73 -73
  148. package/src/js/modules/Export/Export.js +623 -617
  149. package/src/js/modules/Export/ExportColumn.js +10 -10
  150. package/src/js/modules/Export/ExportRow.js +9 -9
  151. package/src/js/modules/Filter/Filter.js +892 -889
  152. package/src/js/modules/Filter/defaults/filters.js +107 -107
  153. package/src/js/modules/Format/Format.js +212 -212
  154. package/src/js/modules/Format/defaults/formatters/buttonCross.js +2 -2
  155. package/src/js/modules/Format/defaults/formatters/buttonTick.js +2 -2
  156. package/src/js/modules/Format/defaults/formatters/color.js +3 -3
  157. package/src/js/modules/Format/defaults/formatters/datetime.js +36 -36
  158. package/src/js/modules/Format/defaults/formatters/datetimediff.js +40 -40
  159. package/src/js/modules/Format/defaults/formatters/handle.js +3 -3
  160. package/src/js/modules/Format/defaults/formatters/html.js +2 -2
  161. package/src/js/modules/Format/defaults/formatters/image.js +39 -39
  162. package/src/js/modules/Format/defaults/formatters/link.js +77 -77
  163. package/src/js/modules/Format/defaults/formatters/lookup.js +9 -9
  164. package/src/js/modules/Format/defaults/formatters/money.js +36 -36
  165. package/src/js/modules/Format/defaults/formatters/plaintext.js +2 -2
  166. package/src/js/modules/Format/defaults/formatters/progress.js +132 -132
  167. package/src/js/modules/Format/defaults/formatters/responsiveCollapse.js +43 -43
  168. package/src/js/modules/Format/defaults/formatters/rowSelection.js +59 -59
  169. package/src/js/modules/Format/defaults/formatters/rownum.js +9 -9
  170. package/src/js/modules/Format/defaults/formatters/star.js +37 -37
  171. package/src/js/modules/Format/defaults/formatters/textarea.js +3 -3
  172. package/src/js/modules/Format/defaults/formatters/tickCross.js +21 -21
  173. package/src/js/modules/Format/defaults/formatters/traffic.js +46 -46
  174. package/src/js/modules/Format/defaults/formatters.js +42 -42
  175. package/src/js/modules/FrozenColumns/FrozenColumns.js +299 -299
  176. package/src/js/modules/FrozenRows/FrozenRows.js +169 -159
  177. package/src/js/modules/GroupRows/Group.js +597 -595
  178. package/src/js/modules/GroupRows/GroupComponent.js +66 -66
  179. package/src/js/modules/GroupRows/GroupRows.js +639 -623
  180. package/src/js/modules/History/History.js +171 -171
  181. package/src/js/modules/History/defaults/redoers.js +24 -24
  182. package/src/js/modules/History/defaults/undoers.js +24 -24
  183. package/src/js/modules/HtmlTableImport/HtmlTableImport.js +181 -181
  184. package/src/js/modules/Import/Import.js +193 -193
  185. package/src/js/modules/Import/defaults/importers/array.js +4 -4
  186. package/src/js/modules/Import/defaults/importers/csv.js +62 -62
  187. package/src/js/modules/Import/defaults/importers/json.js +7 -7
  188. package/src/js/modules/Import/defaults/importers.js +8 -8
  189. package/src/js/modules/Interaction/Interaction.js +325 -325
  190. package/src/js/modules/Keybindings/Keybindings.js +172 -172
  191. package/src/js/modules/Keybindings/defaults/actions.js +118 -118
  192. package/src/js/modules/Keybindings/defaults/bindings.js +12 -12
  193. package/src/js/modules/Layout/Layout.js +49 -49
  194. package/src/js/modules/Layout/defaults/modes/fitColumns.js +171 -171
  195. package/src/js/modules/Layout/defaults/modes/fitData.js +9 -9
  196. package/src/js/modules/Layout/defaults/modes/fitDataGeneral.js +9 -9
  197. package/src/js/modules/Layout/defaults/modes/fitDataStretch.js +39 -39
  198. package/src/js/modules/Layout/defaults/modes.js +11 -11
  199. package/src/js/modules/Localize/Localize.js +185 -194
  200. package/src/js/modules/Localize/defaults/langs.js +36 -36
  201. package/src/js/modules/Menu/Menu.js +302 -302
  202. package/src/js/modules/MoveColumns/MoveColumns.js +299 -299
  203. package/src/js/modules/MoveRows/MoveRows.js +635 -635
  204. package/src/js/modules/Mutator/Mutator.js +161 -161
  205. package/src/js/modules/Page/Page.js +881 -881
  206. package/src/js/modules/Page/defaults/pageCounters/pages.js +32 -32
  207. package/src/js/modules/Page/defaults/pageCounters/rows.js +39 -39
  208. package/src/js/modules/Page/defaults/pageCounters.js +7 -7
  209. package/src/js/modules/Persistence/Persistence.js +458 -458
  210. package/src/js/modules/Persistence/defaults/readers.js +29 -29
  211. package/src/js/modules/Persistence/defaults/writers.js +12 -12
  212. package/src/js/modules/Popup/Popup.js +231 -231
  213. package/src/js/modules/Print/Print.js +137 -124
  214. package/src/js/modules/ReactiveData/ReactiveData.js +408 -408
  215. package/src/js/modules/ResizeColumns/ResizeColumns.js +309 -309
  216. package/src/js/modules/ResizeRows/ResizeRows.js +111 -111
  217. package/src/js/modules/ResizeTable/ResizeTable.js +159 -159
  218. package/src/js/modules/ResponsiveLayout/ResponsiveLayout.js +345 -345
  219. package/src/js/modules/SelectRow/SelectRow.js +446 -436
  220. package/src/js/modules/Sort/Sort.js +470 -470
  221. package/src/js/modules/Sort/defaults/sorters/alphanum.js +43 -43
  222. package/src/js/modules/Sort/defaults/sorters/array.js +53 -53
  223. package/src/js/modules/Sort/defaults/sorters/boolean.js +6 -6
  224. package/src/js/modules/Sort/defaults/sorters/date.js +9 -9
  225. package/src/js/modules/Sort/defaults/sorters/datetime.js +43 -43
  226. package/src/js/modules/Sort/defaults/sorters/exists.js +6 -6
  227. package/src/js/modules/Sort/defaults/sorters/number.js +39 -39
  228. package/src/js/modules/Sort/defaults/sorters/string.js +33 -33
  229. package/src/js/modules/Sort/defaults/sorters/time.js +9 -9
  230. package/src/js/modules/Sort/defaults/sorters.js +20 -20
  231. package/src/js/modules/Tooltip/Tooltip.js +130 -130
  232. package/src/js/modules/Validate/Validate.js +305 -305
  233. package/src/js/modules/Validate/defaults/validators.js +138 -138
  234. package/src/scss/tabulator.scss +1464 -1466
  235. package/src/scss/themes/bootstrap/functions4.scss +118 -118
  236. package/src/scss/themes/bootstrap/functions5.scss +302 -302
  237. package/src/scss/themes/bootstrap/tabulator_bootstrap3.scss +284 -284
  238. package/src/scss/themes/bootstrap/tabulator_bootstrap4.scss +544 -544
  239. package/src/scss/themes/bootstrap/tabulator_bootstrap5.scss +574 -574
  240. package/src/scss/themes/bootstrap/variables3.scss +870 -870
  241. package/src/scss/themes/bootstrap/variables4.scss +930 -930
  242. package/src/scss/themes/bootstrap/variables5.scss +1641 -1641
  243. package/src/scss/themes/bulma/tabulator_bulma.scss +252 -252
  244. package/src/scss/themes/bulma/variables.scss +197 -197
  245. package/src/scss/themes/materialize/tabulator_materialize.scss +265 -265
  246. package/src/scss/themes/materialize/variables.scss +70 -70
  247. package/src/scss/themes/semanticui/tabulator_semanticui.scss +561 -561
  248. package/src/scss/themes/semanticui/variables.scss +839 -839
  249. package/src/scss/themes/semanticui/variables_table.scss +247 -247
  250. package/src/scss/themes/tabulator_midnight.scss +158 -158
  251. package/src/scss/themes/tabulator_modern.scss +231 -231
  252. package/src/scss/themes/tabulator_simple.scss +102 -102
  253. package/src/scss/themes/tabulator_site.scss +189 -189
@@ -1,305 +1,305 @@
1
- import Module from '../../core/Module.js';
2
-
3
- import defaultValidators from './defaults/validators.js';
4
-
5
- class Validate extends Module{
6
-
7
- constructor(table){
8
- super(table);
9
-
10
- this.invalidCells = [];
11
-
12
- this.registerTableOption("validationMode", "blocking");
13
-
14
- this.registerColumnOption("validator");
15
-
16
- this.registerTableFunction("getInvalidCells", this.getInvalidCells.bind(this));
17
- this.registerTableFunction("clearCellValidation", this.userClearCellValidation.bind(this));
18
- this.registerTableFunction("validate", this.userValidate.bind(this));
19
-
20
- this.registerComponentFunction("cell", "isValid", this.cellIsValid.bind(this));
21
- this.registerComponentFunction("cell", "clearValidation", this.clearValidation.bind(this));
22
- this.registerComponentFunction("cell", "validate", this.cellValidate.bind(this));
23
-
24
- this.registerComponentFunction("column", "validate", this.columnValidate.bind(this));
25
- this.registerComponentFunction("row", "validate", this.rowValidate.bind(this));
26
- }
27
-
28
-
29
- initialize(){
30
- this.subscribe("cell-delete", this.clearValidation.bind(this));
31
- this.subscribe("column-layout", this.initializeColumnCheck.bind(this));
32
-
33
- this.subscribe("edit-success", this.editValidate.bind(this));
34
- this.subscribe("edit-editor-clear", this.editorClear.bind(this));
35
- this.subscribe("edit-edited-clear", this.editedClear.bind(this));
36
- }
37
-
38
- ///////////////////////////////////
39
- ///////// Event Handling //////////
40
- ///////////////////////////////////
41
-
42
- editValidate(cell, value, previousValue){
43
- var valid = this.table.options.validationMode !== "manual" ? this.validate(cell.column.modules.validate, cell, value) : true;
44
-
45
- // allow time for editor to make render changes then style cell
46
- if(valid !== true){
47
- setTimeout(() => {
48
- cell.getElement().classList.add("tabulator-validation-fail");
49
- this.dispatchExternal("validationFailed", cell.getComponent(), value, valid);
50
- });
51
- }
52
-
53
- return valid;
54
- }
55
-
56
- editorClear(cell, cancelled){
57
- if(cancelled){
58
- if(cell.column.modules.validate){
59
- this.cellValidate(cell);
60
- }
61
- }
62
-
63
- cell.getElement().classList.remove("tabulator-validation-fail");
64
- }
65
-
66
- editedClear(cell){
67
- if(cell.modules.validate){
68
- cell.modules.validate.invalid = false;
69
- }
70
- }
71
-
72
- ///////////////////////////////////
73
- ////////// Cell Functions /////////
74
- ///////////////////////////////////
75
-
76
- cellIsValid(cell){
77
- return cell.modules.validate ? (cell.modules.validate.invalid || true) : true;
78
- }
79
-
80
- cellValidate(cell){
81
- return this.validate(cell.column.modules.validate, cell, cell.getValue());
82
- }
83
-
84
- ///////////////////////////////////
85
- ///////// Column Functions ////////
86
- ///////////////////////////////////
87
-
88
- columnValidate(column){
89
- var invalid = [];
90
-
91
- column.cells.forEach((cell) => {
92
- if(this.cellValidate(cell) !== true){
93
- invalid.push(cell.getComponent());
94
- }
95
- });
96
-
97
- return invalid.length ? invalid : true;
98
- }
99
-
100
- ///////////////////////////////////
101
- ////////// Row Functions //////////
102
- ///////////////////////////////////
103
-
104
- rowValidate(row){
105
- var invalid = [];
106
-
107
- row.cells.forEach((cell) => {
108
- if(this.cellValidate(cell) !== true){
109
- invalid.push(cell.getComponent());
110
- }
111
- });
112
-
113
- return invalid.length ? invalid : true;
114
- }
115
-
116
- ///////////////////////////////////
117
- ///////// Table Functions /////////
118
- ///////////////////////////////////
119
-
120
-
121
- userClearCellValidation(cells){
122
- if(!cells){
123
- cells = this.getInvalidCells();
124
- }
125
-
126
- if(!Array.isArray(cells)){
127
- cells = [cells];
128
- }
129
-
130
- cells.forEach((cell) => {
131
- this.clearValidation(cell._getSelf());
132
- });
133
- }
134
-
135
- userValidate(cells){
136
- var output = [];
137
-
138
- //clear row data
139
- this.table.rowManager.rows.forEach((row) => {
140
- row = row.getComponent();
141
-
142
- var valid = row.validate();
143
-
144
- if(valid !== true){
145
- output = output.concat(valid);
146
- }
147
- });
148
-
149
- return output.length ? output : true;
150
- }
151
-
152
- ///////////////////////////////////
153
- ///////// Internal Logic //////////
154
- ///////////////////////////////////
155
-
156
- initializeColumnCheck(column){
157
- if(typeof column.definition.validator !== "undefined"){
158
- this.initializeColumn(column);
159
- }
160
- }
161
-
162
- //validate
163
- initializeColumn(column){
164
- var self = this,
165
- config = [],
166
- validator;
167
-
168
- if(column.definition.validator){
169
-
170
- if(Array.isArray(column.definition.validator)){
171
- column.definition.validator.forEach((item) => {
172
- validator = self._extractValidator(item);
173
-
174
- if(validator){
175
- config.push(validator);
176
- }
177
- });
178
-
179
- }else{
180
- validator = this._extractValidator(column.definition.validator);
181
-
182
- if(validator){
183
- config.push(validator);
184
- }
185
- }
186
-
187
- column.modules.validate = config.length ? config : false;
188
- }
189
- }
190
-
191
- _extractValidator(value){
192
- var type, params, pos;
193
-
194
- switch(typeof value){
195
- case "string":
196
- pos = value.indexOf(':');
197
-
198
- if(pos > -1){
199
- type = value.substring(0,pos);
200
- params = value.substring(pos+1);
201
- }else{
202
- type = value;
203
- }
204
-
205
- return this._buildValidator(type, params);
206
-
207
- case "function":
208
- return this._buildValidator(value);
209
-
210
- case "object":
211
- return this._buildValidator(value.type, value.parameters);
212
- }
213
- }
214
-
215
- _buildValidator(type, params){
216
-
217
- var func = typeof type == "function" ? type : Validate.validators[type];
218
-
219
- if(!func){
220
- console.warn("Validator Setup Error - No matching validator found:", type);
221
- return false;
222
- }else{
223
- return {
224
- type:typeof type == "function" ? "function" : type,
225
- func:func,
226
- params:params,
227
- };
228
- }
229
- }
230
-
231
- validate(validators, cell, value){
232
- var self = this,
233
- failedValidators = [],
234
- invalidIndex = this.invalidCells.indexOf(cell);
235
-
236
- if(validators){
237
- validators.forEach((item) => {
238
- if(!item.func.call(self, cell.getComponent(), value, item.params)){
239
- failedValidators.push({
240
- type:item.type,
241
- parameters:item.params
242
- });
243
- }
244
- });
245
- }
246
-
247
- if(!cell.modules.validate){
248
- cell.modules.validate = {};
249
- }
250
-
251
- if(!failedValidators.length){
252
- cell.modules.validate.invalid = false;
253
- cell.getElement().classList.remove("tabulator-validation-fail");
254
-
255
- if(invalidIndex > -1){
256
- this.invalidCells.splice(invalidIndex, 1);
257
- }
258
- }else{
259
- cell.modules.validate.invalid = failedValidators;
260
-
261
- if(this.table.options.validationMode !== "manual"){
262
- cell.getElement().classList.add("tabulator-validation-fail");
263
- }
264
-
265
- if(invalidIndex == -1){
266
- this.invalidCells.push(cell);
267
- }
268
- }
269
-
270
- return failedValidators.length ? failedValidators : true;
271
- }
272
-
273
- getInvalidCells(){
274
- var output = [];
275
-
276
- this.invalidCells.forEach((cell) => {
277
- output.push(cell.getComponent());
278
- });
279
-
280
- return output;
281
- }
282
-
283
- clearValidation(cell){
284
- var invalidIndex;
285
-
286
- if(cell.modules.validate && cell.modules.validate.invalid){
287
-
288
- cell.getElement().classList.remove("tabulator-validation-fail");
289
- cell.modules.validate.invalid = false;
290
-
291
- invalidIndex = this.invalidCells.indexOf(cell);
292
-
293
- if(invalidIndex > -1){
294
- this.invalidCells.splice(invalidIndex, 1);
295
- }
296
- }
297
- }
298
- }
299
-
300
- Validate.moduleName = "validate";
301
-
302
- //load defaults
303
- Validate.validators = defaultValidators;
304
-
305
- export default Validate;
1
+ import Module from '../../core/Module.js';
2
+
3
+ import defaultValidators from './defaults/validators.js';
4
+
5
+ class Validate extends Module{
6
+
7
+ constructor(table){
8
+ super(table);
9
+
10
+ this.invalidCells = [];
11
+
12
+ this.registerTableOption("validationMode", "blocking");
13
+
14
+ this.registerColumnOption("validator");
15
+
16
+ this.registerTableFunction("getInvalidCells", this.getInvalidCells.bind(this));
17
+ this.registerTableFunction("clearCellValidation", this.userClearCellValidation.bind(this));
18
+ this.registerTableFunction("validate", this.userValidate.bind(this));
19
+
20
+ this.registerComponentFunction("cell", "isValid", this.cellIsValid.bind(this));
21
+ this.registerComponentFunction("cell", "clearValidation", this.clearValidation.bind(this));
22
+ this.registerComponentFunction("cell", "validate", this.cellValidate.bind(this));
23
+
24
+ this.registerComponentFunction("column", "validate", this.columnValidate.bind(this));
25
+ this.registerComponentFunction("row", "validate", this.rowValidate.bind(this));
26
+ }
27
+
28
+
29
+ initialize(){
30
+ this.subscribe("cell-delete", this.clearValidation.bind(this));
31
+ this.subscribe("column-layout", this.initializeColumnCheck.bind(this));
32
+
33
+ this.subscribe("edit-success", this.editValidate.bind(this));
34
+ this.subscribe("edit-editor-clear", this.editorClear.bind(this));
35
+ this.subscribe("edit-edited-clear", this.editedClear.bind(this));
36
+ }
37
+
38
+ ///////////////////////////////////
39
+ ///////// Event Handling //////////
40
+ ///////////////////////////////////
41
+
42
+ editValidate(cell, value, previousValue){
43
+ var valid = this.table.options.validationMode !== "manual" ? this.validate(cell.column.modules.validate, cell, value) : true;
44
+
45
+ // allow time for editor to make render changes then style cell
46
+ if(valid !== true){
47
+ setTimeout(() => {
48
+ cell.getElement().classList.add("tabulator-validation-fail");
49
+ this.dispatchExternal("validationFailed", cell.getComponent(), value, valid);
50
+ });
51
+ }
52
+
53
+ return valid;
54
+ }
55
+
56
+ editorClear(cell, cancelled){
57
+ if(cancelled){
58
+ if(cell.column.modules.validate){
59
+ this.cellValidate(cell);
60
+ }
61
+ }
62
+
63
+ cell.getElement().classList.remove("tabulator-validation-fail");
64
+ }
65
+
66
+ editedClear(cell){
67
+ if(cell.modules.validate){
68
+ cell.modules.validate.invalid = false;
69
+ }
70
+ }
71
+
72
+ ///////////////////////////////////
73
+ ////////// Cell Functions /////////
74
+ ///////////////////////////////////
75
+
76
+ cellIsValid(cell){
77
+ return cell.modules.validate ? (cell.modules.validate.invalid || true) : true;
78
+ }
79
+
80
+ cellValidate(cell){
81
+ return this.validate(cell.column.modules.validate, cell, cell.getValue());
82
+ }
83
+
84
+ ///////////////////////////////////
85
+ ///////// Column Functions ////////
86
+ ///////////////////////////////////
87
+
88
+ columnValidate(column){
89
+ var invalid = [];
90
+
91
+ column.cells.forEach((cell) => {
92
+ if(this.cellValidate(cell) !== true){
93
+ invalid.push(cell.getComponent());
94
+ }
95
+ });
96
+
97
+ return invalid.length ? invalid : true;
98
+ }
99
+
100
+ ///////////////////////////////////
101
+ ////////// Row Functions //////////
102
+ ///////////////////////////////////
103
+
104
+ rowValidate(row){
105
+ var invalid = [];
106
+
107
+ row.cells.forEach((cell) => {
108
+ if(this.cellValidate(cell) !== true){
109
+ invalid.push(cell.getComponent());
110
+ }
111
+ });
112
+
113
+ return invalid.length ? invalid : true;
114
+ }
115
+
116
+ ///////////////////////////////////
117
+ ///////// Table Functions /////////
118
+ ///////////////////////////////////
119
+
120
+
121
+ userClearCellValidation(cells){
122
+ if(!cells){
123
+ cells = this.getInvalidCells();
124
+ }
125
+
126
+ if(!Array.isArray(cells)){
127
+ cells = [cells];
128
+ }
129
+
130
+ cells.forEach((cell) => {
131
+ this.clearValidation(cell._getSelf());
132
+ });
133
+ }
134
+
135
+ userValidate(cells){
136
+ var output = [];
137
+
138
+ //clear row data
139
+ this.table.rowManager.rows.forEach((row) => {
140
+ row = row.getComponent();
141
+
142
+ var valid = row.validate();
143
+
144
+ if(valid !== true){
145
+ output = output.concat(valid);
146
+ }
147
+ });
148
+
149
+ return output.length ? output : true;
150
+ }
151
+
152
+ ///////////////////////////////////
153
+ ///////// Internal Logic //////////
154
+ ///////////////////////////////////
155
+
156
+ initializeColumnCheck(column){
157
+ if(typeof column.definition.validator !== "undefined"){
158
+ this.initializeColumn(column);
159
+ }
160
+ }
161
+
162
+ //validate
163
+ initializeColumn(column){
164
+ var self = this,
165
+ config = [],
166
+ validator;
167
+
168
+ if(column.definition.validator){
169
+
170
+ if(Array.isArray(column.definition.validator)){
171
+ column.definition.validator.forEach((item) => {
172
+ validator = self._extractValidator(item);
173
+
174
+ if(validator){
175
+ config.push(validator);
176
+ }
177
+ });
178
+
179
+ }else{
180
+ validator = this._extractValidator(column.definition.validator);
181
+
182
+ if(validator){
183
+ config.push(validator);
184
+ }
185
+ }
186
+
187
+ column.modules.validate = config.length ? config : false;
188
+ }
189
+ }
190
+
191
+ _extractValidator(value){
192
+ var type, params, pos;
193
+
194
+ switch(typeof value){
195
+ case "string":
196
+ pos = value.indexOf(':');
197
+
198
+ if(pos > -1){
199
+ type = value.substring(0,pos);
200
+ params = value.substring(pos+1);
201
+ }else{
202
+ type = value;
203
+ }
204
+
205
+ return this._buildValidator(type, params);
206
+
207
+ case "function":
208
+ return this._buildValidator(value);
209
+
210
+ case "object":
211
+ return this._buildValidator(value.type, value.parameters);
212
+ }
213
+ }
214
+
215
+ _buildValidator(type, params){
216
+
217
+ var func = typeof type == "function" ? type : Validate.validators[type];
218
+
219
+ if(!func){
220
+ console.warn("Validator Setup Error - No matching validator found:", type);
221
+ return false;
222
+ }else{
223
+ return {
224
+ type:typeof type == "function" ? "function" : type,
225
+ func:func,
226
+ params:params,
227
+ };
228
+ }
229
+ }
230
+
231
+ validate(validators, cell, value){
232
+ var self = this,
233
+ failedValidators = [],
234
+ invalidIndex = this.invalidCells.indexOf(cell);
235
+
236
+ if(validators){
237
+ validators.forEach((item) => {
238
+ if(!item.func.call(self, cell.getComponent(), value, item.params)){
239
+ failedValidators.push({
240
+ type:item.type,
241
+ parameters:item.params
242
+ });
243
+ }
244
+ });
245
+ }
246
+
247
+ if(!cell.modules.validate){
248
+ cell.modules.validate = {};
249
+ }
250
+
251
+ if(!failedValidators.length){
252
+ cell.modules.validate.invalid = false;
253
+ cell.getElement().classList.remove("tabulator-validation-fail");
254
+
255
+ if(invalidIndex > -1){
256
+ this.invalidCells.splice(invalidIndex, 1);
257
+ }
258
+ }else{
259
+ cell.modules.validate.invalid = failedValidators;
260
+
261
+ if(this.table.options.validationMode !== "manual"){
262
+ cell.getElement().classList.add("tabulator-validation-fail");
263
+ }
264
+
265
+ if(invalidIndex == -1){
266
+ this.invalidCells.push(cell);
267
+ }
268
+ }
269
+
270
+ return failedValidators.length ? failedValidators : true;
271
+ }
272
+
273
+ getInvalidCells(){
274
+ var output = [];
275
+
276
+ this.invalidCells.forEach((cell) => {
277
+ output.push(cell.getComponent());
278
+ });
279
+
280
+ return output;
281
+ }
282
+
283
+ clearValidation(cell){
284
+ var invalidIndex;
285
+
286
+ if(cell.modules.validate && cell.modules.validate.invalid){
287
+
288
+ cell.getElement().classList.remove("tabulator-validation-fail");
289
+ cell.modules.validate.invalid = false;
290
+
291
+ invalidIndex = this.invalidCells.indexOf(cell);
292
+
293
+ if(invalidIndex > -1){
294
+ this.invalidCells.splice(invalidIndex, 1);
295
+ }
296
+ }
297
+ }
298
+ }
299
+
300
+ Validate.moduleName = "validate";
301
+
302
+ //load defaults
303
+ Validate.validators = defaultValidators;
304
+
305
+ export default Validate;