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,408 +1,408 @@
1
- import Module from '../../core/Module.js';
2
-
3
- class ReactiveData extends Module{
4
-
5
- constructor(table){
6
- super(table);
7
-
8
- this.data = false;
9
- this.blocked = false; //block reactivity while performing update
10
- this.origFuncs = {}; // hold original data array functions to allow replacement after data is done with
11
- this.currentVersion = 0;
12
-
13
- this.registerTableOption("reactiveData", false); //enable data reactivity
14
- }
15
-
16
- initialize(){
17
- if(this.table.options.reactiveData){
18
- this.subscribe("cell-value-save-before", this.block.bind(this, "cellsave"));
19
- this.subscribe("cell-value-save-after", this.unblock.bind(this, "cellsave"));
20
- this.subscribe("row-data-save-before", this.block.bind(this, "rowsave"));
21
- this.subscribe("row-data-save-after", this.unblock.bind(this, "rowsave"));
22
- this.subscribe("row-data-init-after", this.watchRow.bind(this));
23
- this.subscribe("data-processing", this.watchData.bind(this));
24
- this.subscribe("table-destroy", this.unwatchData.bind(this));
25
- }
26
- }
27
-
28
- watchData(data){
29
- var self = this,
30
- version;
31
-
32
- this.currentVersion ++;
33
-
34
- version = this.currentVersion;
35
-
36
- this.unwatchData();
37
-
38
- this.data = data;
39
-
40
- //override array push function
41
- this.origFuncs.push = data.push;
42
-
43
- Object.defineProperty(this.data, "push", {
44
- enumerable: false,
45
- configurable: true,
46
- value: function(){
47
- var args = Array.from(arguments),
48
- result;
49
-
50
- if(!self.blocked && version === self.currentVersion){
51
- self.block("data-push");
52
-
53
- args.forEach((arg) => {
54
- self.table.rowManager.addRowActual(arg, false);
55
- });
56
-
57
- result = self.origFuncs.push.apply(data, arguments);
58
-
59
- self.unblock("data-push");
60
- }
61
-
62
- return result;
63
- }
64
- });
65
-
66
- //override array unshift function
67
- this.origFuncs.unshift = data.unshift;
68
-
69
- Object.defineProperty(this.data, "unshift", {
70
- enumerable: false,
71
- configurable: true,
72
- value: function(){
73
- var args = Array.from(arguments),
74
- result;
75
-
76
- if(!self.blocked && version === self.currentVersion){
77
- self.block("data-unshift");
78
-
79
- args.forEach((arg) => {
80
- self.table.rowManager.addRowActual(arg, true);
81
- });
82
-
83
- result = self.origFuncs.unshift.apply(data, arguments);
84
-
85
- self.unblock("data-unshift");
86
- }
87
-
88
- return result;
89
- }
90
- });
91
-
92
-
93
- //override array shift function
94
- this.origFuncs.shift = data.shift;
95
-
96
- Object.defineProperty(this.data, "shift", {
97
- enumerable: false,
98
- configurable: true,
99
- value: function(){
100
- var row, result;
101
-
102
- if(!self.blocked && version === self.currentVersion){
103
- self.block("data-shift");
104
-
105
- if(self.data.length){
106
- row = self.table.rowManager.getRowFromDataObject(self.data[0]);
107
-
108
- if(row){
109
- row.deleteActual();
110
- }
111
- }
112
-
113
- result = self.origFuncs.shift.call(data);
114
-
115
- self.unblock("data-shift");
116
- }
117
-
118
- return result;
119
- }
120
- });
121
-
122
- //override array pop function
123
- this.origFuncs.pop = data.pop;
124
-
125
- Object.defineProperty(this.data, "pop", {
126
- enumerable: false,
127
- configurable: true,
128
- value: function(){
129
- var row, result;
130
-
131
- if(!self.blocked && version === self.currentVersion){
132
- self.block("data-pop");
133
-
134
- if(self.data.length){
135
- row = self.table.rowManager.getRowFromDataObject(self.data[self.data.length - 1]);
136
-
137
- if(row){
138
- row.deleteActual();
139
- }
140
- }
141
-
142
- result = self.origFuncs.pop.call(data);
143
-
144
- self.unblock("data-pop");
145
- }
146
-
147
- return result;
148
- }
149
- });
150
-
151
-
152
- //override array splice function
153
- this.origFuncs.splice = data.splice;
154
-
155
- Object.defineProperty(this.data, "splice", {
156
- enumerable: false,
157
- configurable: true,
158
- value: function(){
159
- var args = Array.from(arguments),
160
- start = args[0] < 0 ? data.length + args[0] : args[0],
161
- end = args[1],
162
- newRows = args[2] ? args.slice(2) : false,
163
- startRow, result;
164
-
165
- if(!self.blocked && version === self.currentVersion){
166
- self.block("data-splice");
167
- //add new rows
168
- if(newRows){
169
- startRow = data[start] ? self.table.rowManager.getRowFromDataObject(data[start]) : false;
170
-
171
- if(startRow){
172
- newRows.forEach((rowData) => {
173
- self.table.rowManager.addRowActual(rowData, true, startRow, true);
174
- });
175
- }else{
176
- newRows = newRows.slice().reverse();
177
-
178
- newRows.forEach((rowData) => {
179
- self.table.rowManager.addRowActual(rowData, true, false, true);
180
- });
181
- }
182
- }
183
-
184
- //delete removed rows
185
- if(end !== 0){
186
- var oldRows = data.slice(start, typeof args[1] === "undefined" ? args[1] : start + end);
187
-
188
- oldRows.forEach((rowData, i) => {
189
- var row = self.table.rowManager.getRowFromDataObject(rowData);
190
-
191
- if(row){
192
- row.deleteActual(i !== oldRows.length - 1);
193
- }
194
- });
195
- }
196
-
197
- if(newRows || end !== 0){
198
- self.table.rowManager.reRenderInPosition();
199
- }
200
-
201
- result = self.origFuncs.splice.apply(data, arguments);
202
-
203
- self.unblock("data-splice");
204
- }
205
-
206
- return result ;
207
- }
208
- });
209
- }
210
-
211
- unwatchData(){
212
- if(this.data !== false){
213
- for(var key in this.origFuncs){
214
- Object.defineProperty(this.data, key, {
215
- enumerable: true,
216
- configurable:true,
217
- writable:true,
218
- value: this.origFuncs.key,
219
- });
220
- }
221
- }
222
- }
223
-
224
- watchRow(row){
225
- var data = row.getData();
226
-
227
- for(var key in data){
228
- this.watchKey(row, data, key);
229
- }
230
-
231
- if(this.table.options.dataTree){
232
- this.watchTreeChildren(row);
233
- }
234
- }
235
-
236
- watchTreeChildren (row){
237
- var self = this,
238
- childField = row.getData()[this.table.options.dataTreeChildField],
239
- origFuncs = {};
240
-
241
- if(childField){
242
-
243
- origFuncs.push = childField.push;
244
-
245
- Object.defineProperty(childField, "push", {
246
- enumerable: false,
247
- configurable: true,
248
- value: () => {
249
- if(!self.blocked){
250
- self.block("tree-push");
251
-
252
- var result = origFuncs.push.apply(childField, arguments);
253
- this.rebuildTree(row);
254
-
255
- self.unblock("tree-push");
256
- }
257
-
258
- return result;
259
- }
260
- });
261
-
262
- origFuncs.unshift = childField.unshift;
263
-
264
- Object.defineProperty(childField, "unshift", {
265
- enumerable: false,
266
- configurable: true,
267
- value: () => {
268
- if(!self.blocked){
269
- self.block("tree-unshift");
270
-
271
- var result = origFuncs.unshift.apply(childField, arguments);
272
- this.rebuildTree(row);
273
-
274
- self.unblock("tree-unshift");
275
- }
276
-
277
- return result;
278
- }
279
- });
280
-
281
- origFuncs.shift = childField.shift;
282
-
283
- Object.defineProperty(childField, "shift", {
284
- enumerable: false,
285
- configurable: true,
286
- value: () => {
287
- if(!self.blocked){
288
- self.block("tree-shift");
289
-
290
- var result = origFuncs.shift.call(childField);
291
- this.rebuildTree(row);
292
-
293
- self.unblock("tree-shift");
294
- }
295
-
296
- return result;
297
- }
298
- });
299
-
300
- origFuncs.pop = childField.pop;
301
-
302
- Object.defineProperty(childField, "pop", {
303
- enumerable: false,
304
- configurable: true,
305
- value: () => {
306
- if(!self.blocked){
307
- self.block("tree-pop");
308
-
309
- var result = origFuncs.pop.call(childField);
310
- this.rebuildTree(row);
311
-
312
- self.unblock("tree-pop");
313
- }
314
-
315
- return result;
316
- }
317
- });
318
-
319
- origFuncs.splice = childField.splice;
320
-
321
- Object.defineProperty(childField, "splice", {
322
- enumerable: false,
323
- configurable: true,
324
- value: () => {
325
- if(!self.blocked){
326
- self.block("tree-splice");
327
-
328
- var result = origFuncs.splice.apply(childField, arguments);
329
- this.rebuildTree(row);
330
-
331
- self.unblock("tree-splice");
332
- }
333
-
334
- return result;
335
- }
336
- });
337
- }
338
- }
339
-
340
- rebuildTree(row){
341
- this.table.modules.dataTree.initializeRow(row);
342
- this.table.modules.dataTree.layoutRow(row);
343
- this.table.rowManager.refreshActiveData("tree", false, true);
344
- }
345
-
346
- watchKey(row, data, key){
347
- var self = this,
348
- props = Object.getOwnPropertyDescriptor(data, key),
349
- value = data[key],
350
- version = this.currentVersion;
351
-
352
- Object.defineProperty(data, key, {
353
- set: (newValue) => {
354
- value = newValue;
355
- if(!self.blocked && version === self.currentVersion){
356
- self.block("key");
357
-
358
- var update = {};
359
- update[key] = newValue;
360
- row.updateData(update);
361
-
362
- self.unblock("key");
363
- }
364
-
365
- if(props.set){
366
- props.set(newValue);
367
- }
368
- },
369
- get:() => {
370
-
371
- if(props.get){
372
- props.get();
373
- }
374
-
375
- return value;
376
- }
377
- });
378
- }
379
-
380
- unwatchRow(row){
381
- var data = row.getData();
382
-
383
- for(var key in data){
384
- Object.defineProperty(data, key, {
385
- value:data[key],
386
- });
387
- }
388
- }
389
-
390
- block(key){
391
- if(!this.blocked){
392
- this.blocked = key;
393
- }
394
- }
395
-
396
- unblock(key){
397
- if(this.blocked === key){
398
- this.blocked = false;
399
- }
400
- }
401
- }
402
-
403
- ReactiveData.moduleName = "reactiveData";
404
-
405
- export default ReactiveData;
406
-
407
-
408
-
1
+ import Module from '../../core/Module.js';
2
+
3
+ class ReactiveData extends Module{
4
+
5
+ constructor(table){
6
+ super(table);
7
+
8
+ this.data = false;
9
+ this.blocked = false; //block reactivity while performing update
10
+ this.origFuncs = {}; // hold original data array functions to allow replacement after data is done with
11
+ this.currentVersion = 0;
12
+
13
+ this.registerTableOption("reactiveData", false); //enable data reactivity
14
+ }
15
+
16
+ initialize(){
17
+ if(this.table.options.reactiveData){
18
+ this.subscribe("cell-value-save-before", this.block.bind(this, "cellsave"));
19
+ this.subscribe("cell-value-save-after", this.unblock.bind(this, "cellsave"));
20
+ this.subscribe("row-data-save-before", this.block.bind(this, "rowsave"));
21
+ this.subscribe("row-data-save-after", this.unblock.bind(this, "rowsave"));
22
+ this.subscribe("row-data-init-after", this.watchRow.bind(this));
23
+ this.subscribe("data-processing", this.watchData.bind(this));
24
+ this.subscribe("table-destroy", this.unwatchData.bind(this));
25
+ }
26
+ }
27
+
28
+ watchData(data){
29
+ var self = this,
30
+ version;
31
+
32
+ this.currentVersion ++;
33
+
34
+ version = this.currentVersion;
35
+
36
+ this.unwatchData();
37
+
38
+ this.data = data;
39
+
40
+ //override array push function
41
+ this.origFuncs.push = data.push;
42
+
43
+ Object.defineProperty(this.data, "push", {
44
+ enumerable: false,
45
+ configurable: true,
46
+ value: function(){
47
+ var args = Array.from(arguments),
48
+ result;
49
+
50
+ if(!self.blocked && version === self.currentVersion){
51
+ self.block("data-push");
52
+
53
+ args.forEach((arg) => {
54
+ self.table.rowManager.addRowActual(arg, false);
55
+ });
56
+
57
+ result = self.origFuncs.push.apply(data, arguments);
58
+
59
+ self.unblock("data-push");
60
+ }
61
+
62
+ return result;
63
+ }
64
+ });
65
+
66
+ //override array unshift function
67
+ this.origFuncs.unshift = data.unshift;
68
+
69
+ Object.defineProperty(this.data, "unshift", {
70
+ enumerable: false,
71
+ configurable: true,
72
+ value: function(){
73
+ var args = Array.from(arguments),
74
+ result;
75
+
76
+ if(!self.blocked && version === self.currentVersion){
77
+ self.block("data-unshift");
78
+
79
+ args.forEach((arg) => {
80
+ self.table.rowManager.addRowActual(arg, true);
81
+ });
82
+
83
+ result = self.origFuncs.unshift.apply(data, arguments);
84
+
85
+ self.unblock("data-unshift");
86
+ }
87
+
88
+ return result;
89
+ }
90
+ });
91
+
92
+
93
+ //override array shift function
94
+ this.origFuncs.shift = data.shift;
95
+
96
+ Object.defineProperty(this.data, "shift", {
97
+ enumerable: false,
98
+ configurable: true,
99
+ value: function(){
100
+ var row, result;
101
+
102
+ if(!self.blocked && version === self.currentVersion){
103
+ self.block("data-shift");
104
+
105
+ if(self.data.length){
106
+ row = self.table.rowManager.getRowFromDataObject(self.data[0]);
107
+
108
+ if(row){
109
+ row.deleteActual();
110
+ }
111
+ }
112
+
113
+ result = self.origFuncs.shift.call(data);
114
+
115
+ self.unblock("data-shift");
116
+ }
117
+
118
+ return result;
119
+ }
120
+ });
121
+
122
+ //override array pop function
123
+ this.origFuncs.pop = data.pop;
124
+
125
+ Object.defineProperty(this.data, "pop", {
126
+ enumerable: false,
127
+ configurable: true,
128
+ value: function(){
129
+ var row, result;
130
+
131
+ if(!self.blocked && version === self.currentVersion){
132
+ self.block("data-pop");
133
+
134
+ if(self.data.length){
135
+ row = self.table.rowManager.getRowFromDataObject(self.data[self.data.length - 1]);
136
+
137
+ if(row){
138
+ row.deleteActual();
139
+ }
140
+ }
141
+
142
+ result = self.origFuncs.pop.call(data);
143
+
144
+ self.unblock("data-pop");
145
+ }
146
+
147
+ return result;
148
+ }
149
+ });
150
+
151
+
152
+ //override array splice function
153
+ this.origFuncs.splice = data.splice;
154
+
155
+ Object.defineProperty(this.data, "splice", {
156
+ enumerable: false,
157
+ configurable: true,
158
+ value: function(){
159
+ var args = Array.from(arguments),
160
+ start = args[0] < 0 ? data.length + args[0] : args[0],
161
+ end = args[1],
162
+ newRows = args[2] ? args.slice(2) : false,
163
+ startRow, result;
164
+
165
+ if(!self.blocked && version === self.currentVersion){
166
+ self.block("data-splice");
167
+ //add new rows
168
+ if(newRows){
169
+ startRow = data[start] ? self.table.rowManager.getRowFromDataObject(data[start]) : false;
170
+
171
+ if(startRow){
172
+ newRows.forEach((rowData) => {
173
+ self.table.rowManager.addRowActual(rowData, true, startRow, true);
174
+ });
175
+ }else{
176
+ newRows = newRows.slice().reverse();
177
+
178
+ newRows.forEach((rowData) => {
179
+ self.table.rowManager.addRowActual(rowData, true, false, true);
180
+ });
181
+ }
182
+ }
183
+
184
+ //delete removed rows
185
+ if(end !== 0){
186
+ var oldRows = data.slice(start, typeof args[1] === "undefined" ? args[1] : start + end);
187
+
188
+ oldRows.forEach((rowData, i) => {
189
+ var row = self.table.rowManager.getRowFromDataObject(rowData);
190
+
191
+ if(row){
192
+ row.deleteActual(i !== oldRows.length - 1);
193
+ }
194
+ });
195
+ }
196
+
197
+ if(newRows || end !== 0){
198
+ self.table.rowManager.reRenderInPosition();
199
+ }
200
+
201
+ result = self.origFuncs.splice.apply(data, arguments);
202
+
203
+ self.unblock("data-splice");
204
+ }
205
+
206
+ return result ;
207
+ }
208
+ });
209
+ }
210
+
211
+ unwatchData(){
212
+ if(this.data !== false){
213
+ for(var key in this.origFuncs){
214
+ Object.defineProperty(this.data, key, {
215
+ enumerable: true,
216
+ configurable:true,
217
+ writable:true,
218
+ value: this.origFuncs.key,
219
+ });
220
+ }
221
+ }
222
+ }
223
+
224
+ watchRow(row){
225
+ var data = row.getData();
226
+
227
+ for(var key in data){
228
+ this.watchKey(row, data, key);
229
+ }
230
+
231
+ if(this.table.options.dataTree){
232
+ this.watchTreeChildren(row);
233
+ }
234
+ }
235
+
236
+ watchTreeChildren (row){
237
+ var self = this,
238
+ childField = row.getData()[this.table.options.dataTreeChildField],
239
+ origFuncs = {};
240
+
241
+ if(childField){
242
+
243
+ origFuncs.push = childField.push;
244
+
245
+ Object.defineProperty(childField, "push", {
246
+ enumerable: false,
247
+ configurable: true,
248
+ value: () => {
249
+ if(!self.blocked){
250
+ self.block("tree-push");
251
+
252
+ var result = origFuncs.push.apply(childField, arguments);
253
+ this.rebuildTree(row);
254
+
255
+ self.unblock("tree-push");
256
+ }
257
+
258
+ return result;
259
+ }
260
+ });
261
+
262
+ origFuncs.unshift = childField.unshift;
263
+
264
+ Object.defineProperty(childField, "unshift", {
265
+ enumerable: false,
266
+ configurable: true,
267
+ value: () => {
268
+ if(!self.blocked){
269
+ self.block("tree-unshift");
270
+
271
+ var result = origFuncs.unshift.apply(childField, arguments);
272
+ this.rebuildTree(row);
273
+
274
+ self.unblock("tree-unshift");
275
+ }
276
+
277
+ return result;
278
+ }
279
+ });
280
+
281
+ origFuncs.shift = childField.shift;
282
+
283
+ Object.defineProperty(childField, "shift", {
284
+ enumerable: false,
285
+ configurable: true,
286
+ value: () => {
287
+ if(!self.blocked){
288
+ self.block("tree-shift");
289
+
290
+ var result = origFuncs.shift.call(childField);
291
+ this.rebuildTree(row);
292
+
293
+ self.unblock("tree-shift");
294
+ }
295
+
296
+ return result;
297
+ }
298
+ });
299
+
300
+ origFuncs.pop = childField.pop;
301
+
302
+ Object.defineProperty(childField, "pop", {
303
+ enumerable: false,
304
+ configurable: true,
305
+ value: () => {
306
+ if(!self.blocked){
307
+ self.block("tree-pop");
308
+
309
+ var result = origFuncs.pop.call(childField);
310
+ this.rebuildTree(row);
311
+
312
+ self.unblock("tree-pop");
313
+ }
314
+
315
+ return result;
316
+ }
317
+ });
318
+
319
+ origFuncs.splice = childField.splice;
320
+
321
+ Object.defineProperty(childField, "splice", {
322
+ enumerable: false,
323
+ configurable: true,
324
+ value: () => {
325
+ if(!self.blocked){
326
+ self.block("tree-splice");
327
+
328
+ var result = origFuncs.splice.apply(childField, arguments);
329
+ this.rebuildTree(row);
330
+
331
+ self.unblock("tree-splice");
332
+ }
333
+
334
+ return result;
335
+ }
336
+ });
337
+ }
338
+ }
339
+
340
+ rebuildTree(row){
341
+ this.table.modules.dataTree.initializeRow(row);
342
+ this.table.modules.dataTree.layoutRow(row);
343
+ this.table.rowManager.refreshActiveData("tree", false, true);
344
+ }
345
+
346
+ watchKey(row, data, key){
347
+ var self = this,
348
+ props = Object.getOwnPropertyDescriptor(data, key),
349
+ value = data[key],
350
+ version = this.currentVersion;
351
+
352
+ Object.defineProperty(data, key, {
353
+ set: (newValue) => {
354
+ value = newValue;
355
+ if(!self.blocked && version === self.currentVersion){
356
+ self.block("key");
357
+
358
+ var update = {};
359
+ update[key] = newValue;
360
+ row.updateData(update);
361
+
362
+ self.unblock("key");
363
+ }
364
+
365
+ if(props.set){
366
+ props.set(newValue);
367
+ }
368
+ },
369
+ get:() => {
370
+
371
+ if(props.get){
372
+ props.get();
373
+ }
374
+
375
+ return value;
376
+ }
377
+ });
378
+ }
379
+
380
+ unwatchRow(row){
381
+ var data = row.getData();
382
+
383
+ for(var key in data){
384
+ Object.defineProperty(data, key, {
385
+ value:data[key],
386
+ });
387
+ }
388
+ }
389
+
390
+ block(key){
391
+ if(!this.blocked){
392
+ this.blocked = key;
393
+ }
394
+ }
395
+
396
+ unblock(key){
397
+ if(this.blocked === key){
398
+ this.blocked = false;
399
+ }
400
+ }
401
+ }
402
+
403
+ ReactiveData.moduleName = "reactiveData";
404
+
405
+ export default ReactiveData;
406
+
407
+
408
+