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,893 +1,895 @@
1
- 'use strict';
2
-
3
- import defaultOptions from './defaults/options.js';
4
-
5
- import ColumnManager from './ColumnManager.js';
6
- import RowManager from './RowManager.js';
7
- import FooterManager from './FooterManager.js';
8
-
9
- import InteractionMonitor from './tools/InteractionMonitor.js';
10
- import ComponentFunctionBinder from './tools/ComponentFunctionBinder.js';
11
- import DataLoader from './tools/DataLoader.js';
12
-
13
- import ExternalEventBus from './tools/ExternalEventBus.js';
14
- import InternalEventBus from './tools/InternalEventBus.js';
15
-
16
- import DeprecationAdvisor from './tools/DeprecationAdvisor.js';
17
-
18
- import TableRegistry from './tools/TableRegistry.js';
19
- import ModuleBinder from './tools/ModuleBinder.js';
20
-
21
- import OptionsList from './tools/OptionsList.js';
22
-
23
- import Alert from './tools/Alert.js';
24
-
25
- class Tabulator {
26
-
27
- constructor(element, options){
28
-
29
- this.options = {};
30
-
31
- this.columnManager = null; // hold Column Manager
32
- this.rowManager = null; //hold Row Manager
33
- this.footerManager = null; //holder Footer Manager
34
- this.alertManager = null; //hold Alert Manager
35
- this.vdomHoz = null; //holder horizontal virtual dom
36
- this.externalEvents = null; //handle external event messaging
37
- this.eventBus = null; //handle internal event messaging
38
- this.interactionMonitor = false; //track user interaction
39
- this.browser = ""; //hold current browser type
40
- this.browserSlow = false; //handle reduced functionality for slower browsers
41
- this.browserMobile = false; //check if running on mobile, prevent resize cancelling edit on keyboard appearance
42
- this.rtl = false; //check if the table is in RTL mode
43
- this.originalElement = null; //hold original table element if it has been replaced
44
-
45
- this.componentFunctionBinder = new ComponentFunctionBinder(this); //bind component functions
46
- this.dataLoader = false; //bind component functions
47
-
48
- this.modules = {}; //hold all modules bound to this table
49
- this.modulesCore = []; //hold core modules bound to this table (for initialization purposes)
50
- this.modulesRegular = []; //hold regular modules bound to this table (for initialization purposes)
51
-
52
- this.deprecationAdvisor = new DeprecationAdvisor(this);
53
- this.optionsList = new OptionsList(this, "table constructor");
54
-
55
- this.initialized = false;
56
- this.destroyed = false;
57
-
58
- if(this.initializeElement(element)){
59
-
60
- this.initializeCoreSystems(options);
61
-
62
- //delay table creation to allow event bindings immediately after the constructor
63
- setTimeout(() => {
64
- this._create();
65
- });
66
- }
67
-
68
- TableRegistry.register(this); //register table for inter-device communication
69
- }
70
-
71
- initializeElement(element){
72
- if(typeof HTMLElement !== "undefined" && element instanceof HTMLElement){
73
- this.element = element;
74
- return true;
75
- }else if(typeof element === "string"){
76
- this.element = document.querySelector(element);
77
-
78
- if(this.element){
79
- return true;
80
- }else{
81
- console.error("Tabulator Creation Error - no element found matching selector: ", element);
82
- return false;
83
- }
84
- }else{
85
- console.error("Tabulator Creation Error - Invalid element provided:", element);
86
- return false;
87
- }
88
- }
89
-
90
- initializeCoreSystems(options){
91
- this.columnManager = new ColumnManager(this);
92
- this.rowManager = new RowManager(this);
93
- this.footerManager = new FooterManager(this);
94
- this.dataLoader = new DataLoader(this);
95
- this.alertManager = new Alert(this);
96
-
97
- this.bindModules();
98
-
99
- this.options = this.optionsList.generate(Tabulator.defaultOptions, options);
100
-
101
- this._clearObjectPointers();
102
-
103
- this._mapDeprecatedFunctionality();
104
-
105
- this.externalEvents = new ExternalEventBus(this, this.options, this.options.debugEventsExternal);
106
- this.eventBus = new InternalEventBus(this.options.debugEventsInternal);
107
-
108
- this.interactionMonitor = new InteractionMonitor(this);
109
-
110
- this.dataLoader.initialize();
111
- // this.columnManager.initialize();
112
- // this.rowManager.initialize();
113
- this.footerManager.initialize();
114
- }
115
-
116
- //convert deprecated functionality to new functions
117
- _mapDeprecatedFunctionality(){
118
- //all previously deprecated functionality removed in the 5.0 release
119
- }
120
-
121
- _clearSelection(){
122
-
123
- this.element.classList.add("tabulator-block-select");
124
-
125
- if (window.getSelection) {
126
- if (window.getSelection().empty) { // Chrome
127
- window.getSelection().empty();
128
- } else if (window.getSelection().removeAllRanges) { // Firefox
129
- window.getSelection().removeAllRanges();
130
- }
131
- } else if (document.selection) { // IE?
132
- document.selection.empty();
133
- }
134
-
135
- this.element.classList.remove("tabulator-block-select");
136
- }
137
-
138
- //create table
139
- _create(){
140
- this.externalEvents.dispatch("tableBuilding");
141
- this.eventBus.dispatch("table-building");
142
-
143
- this._rtlCheck();
144
-
145
- this._buildElement();
146
-
147
- this._initializeTable();
148
-
149
- this._loadInitialData();
150
-
151
- this.initialized = true;
152
-
153
- this.externalEvents.dispatch("tableBuilt");
154
- }
155
-
156
- _rtlCheck(){
157
- var style = window.getComputedStyle(this.element);
158
-
159
- switch(this.options.textDirection){
160
- case"auto":
161
- if(style.direction !== "rtl"){
162
- break;
163
- }
164
-
165
- case "rtl":
166
- this.element.classList.add("tabulator-rtl");
167
- this.rtl = true;
168
- break;
169
-
170
- case "ltr":
171
- this.element.classList.add("tabulator-ltr");
172
-
173
- default:
174
- this.rtl = false;
175
- }
176
- }
177
-
178
- //clear pointers to objects in default config object
179
- _clearObjectPointers(){
180
- this.options.columns = this.options.columns.slice(0);
181
-
182
- if(Array.isArray(this.options.data) && !this.options.reactiveData){
183
- this.options.data = this.options.data.slice(0);
184
- }
185
- }
186
-
187
- //build tabulator element
188
- _buildElement(){
189
- var element = this.element,
190
- options = this.options,
191
- newElement;
192
-
193
- if(element.tagName === "TABLE"){
194
- this.originalElement = this.element;
195
- newElement = document.createElement("div");
196
-
197
- //transfer attributes to new element
198
- var attributes = element.attributes;
199
-
200
- // loop through attributes and apply them on div
201
- for(var i in attributes){
202
- if(typeof attributes[i] == "object"){
203
- newElement.setAttribute(attributes[i].name, attributes[i].value);
204
- }
205
- }
206
-
207
- // replace table with div element
208
- element.parentNode.replaceChild(newElement, element);
209
-
210
- this.element = element = newElement;
211
- }
212
-
213
- element.classList.add("tabulator");
214
- element.setAttribute("role", "grid");
215
-
216
- //empty element
217
- while(element.firstChild) element.removeChild(element.firstChild);
218
-
219
- //set table height
220
- if(options.height){
221
- options.height = isNaN(options.height) ? options.height : options.height + "px";
222
- element.style.height = options.height;
223
- }
224
-
225
- //set table min height
226
- if(options.minHeight !== false){
227
- options.minHeight = isNaN(options.minHeight) ? options.minHeight : options.minHeight + "px";
228
- element.style.minHeight = options.minHeight;
229
- }
230
-
231
- //set table maxHeight
232
- if(options.maxHeight !== false){
233
- options.maxHeight = isNaN(options.maxHeight) ? options.maxHeight : options.maxHeight + "px";
234
- element.style.maxHeight = options.maxHeight;
235
- }
236
- }
237
-
238
- //initialize core systems and modules
239
- _initializeTable(){
240
- var element = this.element,
241
- options = this.options;
242
-
243
- this.interactionMonitor.initialize();
244
-
245
- this.columnManager.initialize();
246
- this.rowManager.initialize();
247
-
248
- this._detectBrowser();
249
-
250
- //initialize core modules
251
- this.modulesCore.forEach((mod) => {
252
- mod.initialize();
253
- });
254
-
255
- //build table elements
256
- element.appendChild(this.columnManager.getElement());
257
- element.appendChild(this.rowManager.getElement());
258
-
259
- if(options.footerElement){
260
- this.footerManager.activate();
261
- }
262
-
263
- if(options.autoColumns && options.data){
264
-
265
- this.columnManager.generateColumnsFromRowData(this.options.data);
266
- }
267
-
268
- //initialize regular modules
269
- this.modulesRegular.forEach((mod) => {
270
- mod.initialize();
271
- });
272
-
273
- this.columnManager.setColumns(options.columns);
274
-
275
- this.eventBus.dispatch("table-built");
276
- }
277
-
278
- _loadInitialData(){
279
- this.dataLoader.load(this.options.data);
280
- }
281
-
282
- //deconstructor
283
- destroy(){
284
- var element = this.element;
285
-
286
- this.destroyed = true;
287
-
288
- TableRegistry.deregister(this); //deregister table from inter-device communication
289
-
290
- this.eventBus.dispatch("table-destroy");
291
-
292
- //clear row data
293
- this.rowManager.rows.forEach(function(row){
294
- row.wipe();
295
- });
296
-
297
- this.rowManager.rows = [];
298
- this.rowManager.activeRows = [];
299
- this.rowManager.displayRows = [];
300
-
301
- //clear DOM
302
- while(element.firstChild) element.removeChild(element.firstChild);
303
- element.classList.remove("tabulator");
304
-
305
- this.externalEvents.dispatch("tableDestroyed");
306
- }
307
-
308
- _detectBrowser(){
309
- var ua = navigator.userAgent||navigator.vendor||window.opera;
310
-
311
- if(ua.indexOf("Trident") > -1){
312
- this.browser = "ie";
313
- this.browserSlow = true;
314
- }else if(ua.indexOf("Edge") > -1){
315
- this.browser = "edge";
316
- this.browserSlow = true;
317
- }else if(ua.indexOf("Firefox") > -1){
318
- this.browser = "firefox";
319
- this.browserSlow = false;
320
- }else{
321
- this.browser = "other";
322
- this.browserSlow = false;
323
- }
324
-
325
- this.browserMobile = /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(ua)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(ua.slice(0,4));
326
- }
327
-
328
- initGuard(func, msg){
329
- var stack, line;
330
-
331
- if(this.options.debugInitialization && !this.initialized){
332
- if(!func){
333
- stack = new Error().stack.split("\n");
334
-
335
- line = stack[0] == "Error" ? stack[2] : stack[1];
336
-
337
- if(line[0] == " "){
338
- func = line.trim().split(" ")[1].split(".")[1];
339
- }else{
340
- func = line.trim().split("@")[0];
341
- }
342
- }
343
-
344
- console.warn("Table Not Initialized - Calling the " + func + " function before the table is initialized may result in inconsistent behavior, Please wait for the `tableBuilt` event before calling this function." + (msg ? " " + msg : ""));
345
- }
346
-
347
- return this.initialized;
348
- }
349
-
350
- ////////////////// Data Handling //////////////////
351
- //block table redrawing
352
- blockRedraw(){
353
- this.initGuard();
354
-
355
- this.eventBus.dispatch("redraw-blocking");
356
-
357
- this.rowManager.blockRedraw();
358
- this.columnManager.blockRedraw();
359
-
360
- this.eventBus.dispatch("redraw-blocked");
361
- }
362
-
363
- //restore table redrawing
364
- restoreRedraw(){
365
- this.initGuard();
366
-
367
- this.eventBus.dispatch("redraw-restoring");
368
-
369
- this.rowManager.restoreRedraw();
370
- this.columnManager.restoreRedraw();
371
-
372
- this.eventBus.dispatch("redraw-restored");
373
- }
374
-
375
- //load data
376
- setData(data, params, config){
377
- this.initGuard(false, "To set initial data please use the 'data' property in the table constructor.");
378
-
379
- return this.dataLoader.load(data, params, config, false);
380
- }
381
-
382
- //clear data
383
- clearData(){
384
- this.initGuard();
385
-
386
- this.dataLoader.blockActiveLoad();
387
- this.rowManager.clearData();
388
- }
389
-
390
- //get table data array
391
- getData(active){
392
- return this.rowManager.getData(active);
393
- }
394
-
395
- //get table data array count
396
- getDataCount(active){
397
- return this.rowManager.getDataCount(active);
398
- }
399
-
400
- //replace data, keeping table in position with same sort
401
- replaceData(data, params, config){
402
- this.initGuard();
403
-
404
- return this.dataLoader.load(data, params, config, true, true);
405
- }
406
-
407
- //update table data
408
- updateData(data){
409
- var responses = 0;
410
-
411
- this.initGuard();
412
-
413
- return new Promise((resolve, reject) => {
414
- this.dataLoader.blockActiveLoad();
415
-
416
- if(typeof data === "string"){
417
- data = JSON.parse(data);
418
- }
419
-
420
- if(data && data.length > 0){
421
- data.forEach((item) => {
422
- var row = this.rowManager.findRow(item[this.options.index]);
423
-
424
- if(row){
425
- responses++;
426
-
427
- row.updateData(item)
428
- .then(()=>{
429
- responses--;
430
-
431
- if(!responses){
432
- resolve();
433
- }
434
- });
435
- }
436
- });
437
- }else{
438
- console.warn("Update Error - No data provided");
439
- reject("Update Error - No data provided");
440
- }
441
- });
442
- }
443
-
444
- addData(data, pos, index){
445
- this.initGuard();
446
-
447
- return new Promise((resolve, reject) => {
448
- this.dataLoader.blockActiveLoad();
449
-
450
- if(typeof data === "string"){
451
- data = JSON.parse(data);
452
- }
453
-
454
- if(data){
455
- this.rowManager.addRows(data, pos, index)
456
- .then((rows) => {
457
- var output = [];
458
-
459
- rows.forEach(function(row){
460
- output.push(row.getComponent());
461
- });
462
-
463
- resolve(output);
464
- });
465
- }else{
466
- console.warn("Update Error - No data provided");
467
- reject("Update Error - No data provided");
468
- }
469
- });
470
- }
471
-
472
- //update table data
473
- updateOrAddData(data){
474
- var rows = [],
475
- responses = 0;
476
-
477
- this.initGuard();
478
-
479
- return new Promise((resolve, reject) => {
480
- this.dataLoader.blockActiveLoad();
481
-
482
- if(typeof data === "string"){
483
- data = JSON.parse(data);
484
- }
485
-
486
- if(data && data.length > 0){
487
- data.forEach((item) => {
488
- var row = this.rowManager.findRow(item[this.options.index]);
489
-
490
- responses++;
491
-
492
- if(row){
493
- row.updateData(item)
494
- .then(()=>{
495
- responses--;
496
- rows.push(row.getComponent());
497
-
498
- if(!responses){
499
- resolve(rows);
500
- }
501
- });
502
- }else{
503
- this.rowManager.addRows(item)
504
- .then((newRows)=>{
505
- responses--;
506
- rows.push(newRows[0].getComponent());
507
-
508
- if(!responses){
509
- resolve(rows);
510
- }
511
- });
512
- }
513
- });
514
- }else{
515
- console.warn("Update Error - No data provided");
516
- reject("Update Error - No data provided");
517
- }
518
- });
519
- }
520
-
521
- //get row object
522
- getRow(index){
523
- var row = this.rowManager.findRow(index);
524
-
525
- if(row){
526
- return row.getComponent();
527
- }else{
528
- console.warn("Find Error - No matching row found:", index);
529
- return false;
530
- }
531
- }
532
-
533
- //get row object
534
- getRowFromPosition(position){
535
- var row = this.rowManager.getRowFromPosition(position);
536
-
537
- if(row){
538
- return row.getComponent();
539
- }else{
540
- console.warn("Find Error - No matching row found:", position);
541
- return false;
542
- }
543
- }
544
-
545
- //delete row from table
546
- deleteRow(index){
547
- var foundRows = [];
548
-
549
- this.initGuard();
550
-
551
- if(!Array.isArray(index)){
552
- index = [index];
553
- }
554
-
555
- //find matching rows
556
- for(let item of index){
557
- let row = this.rowManager.findRow(item, true);
558
-
559
- if(row){
560
- foundRows.push(row);
561
- }else{
562
- console.error("Delete Error - No matching row found:", item);
563
- return Promise.reject("Delete Error - No matching row found");
564
- }
565
- }
566
-
567
- //sort rows into correct order to ensure smooth delete from table
568
- foundRows.sort((a, b) => {
569
- return this.rowManager.rows.indexOf(a) > this.rowManager.rows.indexOf(b) ? 1 : -1;
570
- });
571
-
572
- //delete rows
573
- foundRows.forEach((row) =>{
574
- row.delete();
575
- });
576
-
577
- this.rowManager.reRenderInPosition();
578
-
579
- return Promise.resolve();
580
- }
581
-
582
- //add row to table
583
- addRow(data, pos, index){
584
- this.initGuard();
585
-
586
- if(typeof data === "string"){
587
- data = JSON.parse(data);
588
- }
589
-
590
- return this.rowManager.addRows(data, pos, index)
591
- .then((rows)=>{
592
- return rows[0].getComponent();
593
- });
594
- }
595
-
596
- //update a row if it exists otherwise create it
597
- updateOrAddRow(index, data){
598
- var row = this.rowManager.findRow(index);
599
-
600
- this.initGuard();
601
-
602
- if(typeof data === "string"){
603
- data = JSON.parse(data);
604
- }
605
-
606
- if(row){
607
- return row.updateData(data)
608
- .then(()=>{
609
- return row.getComponent();
610
- });
611
- }else{
612
- return this.rowManager.addRows(data)
613
- .then((rows)=>{
614
- return rows[0].getComponent();
615
- });
616
- }
617
- }
618
-
619
- //update row data
620
- updateRow(index, data){
621
- var row = this.rowManager.findRow(index);
622
-
623
- this.initGuard();
624
-
625
- if(typeof data === "string"){
626
- data = JSON.parse(data);
627
- }
628
-
629
- if(row){
630
- return row.updateData(data)
631
- .then(()=>{
632
- return Promise.resolve(row.getComponent());
633
- });
634
- }else{
635
- console.warn("Update Error - No matching row found:", index);
636
- return Promise.reject("Update Error - No matching row found");
637
- }
638
- }
639
-
640
- //scroll to row in DOM
641
- scrollToRow(index, position, ifVisible){
642
- var row = this.rowManager.findRow(index);
643
-
644
- if(row){
645
- return this.rowManager.scrollToRow(row, position, ifVisible);
646
- }else{
647
- console.warn("Scroll Error - No matching row found:", index);
648
- return Promise.reject("Scroll Error - No matching row found");
649
- }
650
- }
651
-
652
- moveRow(from, to, after){
653
- var fromRow = this.rowManager.findRow(from);
654
-
655
- this.initGuard();
656
-
657
- if(fromRow){
658
- fromRow.moveToRow(to, after);
659
- }else{
660
- console.warn("Move Error - No matching row found:", from);
661
- }
662
- }
663
-
664
- getRows(active){
665
- return this.rowManager.getComponents(active);
666
- }
667
-
668
- //get position of row in table
669
- getRowPosition(index){
670
- var row = this.rowManager.findRow(index);
671
-
672
- if(row){
673
- return row.getPosition();
674
- }else{
675
- console.warn("Position Error - No matching row found:", index);
676
- return false;
677
- }
678
- }
679
-
680
- /////////////// Column Functions ///////////////
681
- setColumns(definition){
682
- this.initGuard(false, "To set initial columns please use the 'columns' property in the table constructor");
683
-
684
- this.columnManager.setColumns(definition);
685
- }
686
-
687
- getColumns(structured){
688
- return this.columnManager.getComponents(structured);
689
- }
690
-
691
- getColumn(field){
692
- var column = this.columnManager.findColumn(field);
693
-
694
- if(column){
695
- return column.getComponent();
696
- }else{
697
- console.warn("Find Error - No matching column found:", field);
698
- return false;
699
- }
700
- }
701
-
702
- getColumnDefinitions(){
703
- return this.columnManager.getDefinitionTree();
704
- }
705
-
706
- showColumn(field){
707
- var column = this.columnManager.findColumn(field);
708
-
709
- this.initGuard();
710
-
711
- if(column){
712
- column.show();
713
- }else{
714
- console.warn("Column Show Error - No matching column found:", field);
715
- return false;
716
- }
717
- }
718
-
719
- hideColumn(field){
720
- var column = this.columnManager.findColumn(field);
721
-
722
- this.initGuard();
723
-
724
- if(column){
725
- column.hide();
726
- }else{
727
- console.warn("Column Hide Error - No matching column found:", field);
728
- return false;
729
- }
730
- }
731
-
732
- toggleColumn(field){
733
- var column = this.columnManager.findColumn(field);
734
-
735
- this.initGuard();
736
-
737
- if(column){
738
- if(column.visible){
739
- column.hide();
740
- }else{
741
- column.show();
742
- }
743
- }else{
744
- console.warn("Column Visibility Toggle Error - No matching column found:", field);
745
- return false;
746
- }
747
- }
748
-
749
- addColumn(definition, before, field){
750
- var column = this.columnManager.findColumn(field);
751
-
752
- this.initGuard();
753
-
754
- return this.columnManager.addColumn(definition, before, column)
755
- .then((column) => {
756
- return column.getComponent();
757
- });
758
- }
759
-
760
- deleteColumn(field){
761
- var column = this.columnManager.findColumn(field);
762
-
763
- this.initGuard();
764
-
765
- if(column){
766
- return column.delete();
767
- }else{
768
- console.warn("Column Delete Error - No matching column found:", field);
769
- return Promise.reject();
770
- }
771
- }
772
-
773
- updateColumnDefinition(field, definition){
774
- var column = this.columnManager.findColumn(field);
775
-
776
- this.initGuard();
777
-
778
- if(column){
779
- return column.updateDefinition(definition);
780
- }else{
781
- console.warn("Column Update Error - No matching column found:", field);
782
- return Promise.reject();
783
- }
784
- }
785
-
786
- moveColumn(from, to, after){
787
- var fromColumn = this.columnManager.findColumn(from),
788
- toColumn = this.columnManager.findColumn(to);
789
-
790
- this.initGuard();
791
-
792
- if(fromColumn){
793
- if(toColumn){
794
- this.columnManager.moveColumn(fromColumn, toColumn, after);
795
- }else{
796
- console.warn("Move Error - No matching column found:", toColumn);
797
- }
798
- }else{
799
- console.warn("Move Error - No matching column found:", from);
800
- }
801
- }
802
-
803
- //scroll to column in DOM
804
- scrollToColumn(field, position, ifVisible){
805
- return new Promise((resolve, reject) => {
806
- var column = this.columnManager.findColumn(field);
807
-
808
- if(column){
809
- return this.columnManager.scrollToColumn(column, position, ifVisible);
810
- }else{
811
- console.warn("Scroll Error - No matching column found:", field);
812
- return Promise.reject("Scroll Error - No matching column found");
813
- }
814
- });
815
- }
816
-
817
- //////////// General Public Functions ////////////
818
- //redraw list without updating data
819
- redraw(force){
820
- this.initGuard();
821
-
822
- this.columnManager.redraw(force);
823
- this.rowManager.redraw(force);
824
- }
825
-
826
- setHeight(height){
827
- this.options.height = isNaN(height) ? height : height + "px";
828
- this.element.style.height = this.options.height;
829
- this.rowManager.initializeRenderer();
830
- this.rowManager.redraw();
831
- }
832
-
833
- //////////////////// Event Bus ///////////////////
834
-
835
- on(key, callback){
836
- this.externalEvents.subscribe(key, callback);
837
- }
838
-
839
- off(key, callback){
840
- this.externalEvents.unsubscribe(key, callback);
841
- }
842
-
843
- dispatchEvent(){
844
- var args = Array.from(arguments);
845
- args.shift();
846
-
847
- this.externalEvents.dispatch(...arguments);
848
- }
849
-
850
- //////////////////// Alerts ///////////////////
851
-
852
- alert(contents, type){
853
- this.initGuard();
854
-
855
- this.alertManager.alert(contents, type);
856
- }
857
-
858
- clearAlert(){
859
- this.initGuard();
860
-
861
- this.alertManager.clear();
862
- }
863
-
864
- ////////////// Extension Management //////////////
865
- modExists(plugin, required){
866
- if(this.modules[plugin]){
867
- return true;
868
- }else{
869
- if(required){
870
- console.error("Tabulator Module Not Installed: " + plugin);
871
- }
872
- return false;
873
- }
874
- }
875
-
876
- module(key){
877
- var mod = this.modules[key];
878
-
879
- if(!mod){
880
- console.error("Tabulator module not installed: " + key);
881
- }
882
-
883
- return mod;
884
- }
885
- }
886
-
887
- //default setup options
888
- Tabulator.defaultOptions = defaultOptions;
889
-
890
- //bind modules and static functionality
891
- new ModuleBinder(Tabulator);
892
-
893
- export default Tabulator;
1
+ 'use strict';
2
+
3
+ import defaultOptions from './defaults/options.js';
4
+
5
+ import ColumnManager from './ColumnManager.js';
6
+ import RowManager from './RowManager.js';
7
+ import FooterManager from './FooterManager.js';
8
+
9
+ import InteractionMonitor from './tools/InteractionMonitor.js';
10
+ import ComponentFunctionBinder from './tools/ComponentFunctionBinder.js';
11
+ import DataLoader from './tools/DataLoader.js';
12
+
13
+ import ExternalEventBus from './tools/ExternalEventBus.js';
14
+ import InternalEventBus from './tools/InternalEventBus.js';
15
+
16
+ import DeprecationAdvisor from './tools/DeprecationAdvisor.js';
17
+
18
+ import TableRegistry from './tools/TableRegistry.js';
19
+ import ModuleBinder from './tools/ModuleBinder.js';
20
+
21
+ import OptionsList from './tools/OptionsList.js';
22
+
23
+ import Alert from './tools/Alert.js';
24
+
25
+ class Tabulator {
26
+
27
+ constructor(element, options){
28
+
29
+ this.options = {};
30
+
31
+ this.columnManager = null; // hold Column Manager
32
+ this.rowManager = null; //hold Row Manager
33
+ this.footerManager = null; //holder Footer Manager
34
+ this.alertManager = null; //hold Alert Manager
35
+ this.vdomHoz = null; //holder horizontal virtual dom
36
+ this.externalEvents = null; //handle external event messaging
37
+ this.eventBus = null; //handle internal event messaging
38
+ this.interactionMonitor = false; //track user interaction
39
+ this.browser = ""; //hold current browser type
40
+ this.browserSlow = false; //handle reduced functionality for slower browsers
41
+ this.browserMobile = false; //check if running on mobile, prevent resize cancelling edit on keyboard appearance
42
+ this.rtl = false; //check if the table is in RTL mode
43
+ this.originalElement = null; //hold original table element if it has been replaced
44
+
45
+ this.componentFunctionBinder = new ComponentFunctionBinder(this); //bind component functions
46
+ this.dataLoader = false; //bind component functions
47
+
48
+ this.modules = {}; //hold all modules bound to this table
49
+ this.modulesCore = []; //hold core modules bound to this table (for initialization purposes)
50
+ this.modulesRegular = []; //hold regular modules bound to this table (for initialization purposes)
51
+
52
+ this.deprecationAdvisor = new DeprecationAdvisor(this);
53
+ this.optionsList = new OptionsList(this, "table constructor");
54
+
55
+ this.initialized = false;
56
+ this.destroyed = false;
57
+
58
+ if(this.initializeElement(element)){
59
+
60
+ this.initializeCoreSystems(options);
61
+
62
+ //delay table creation to allow event bindings immediately after the constructor
63
+ setTimeout(() => {
64
+ this._create();
65
+ });
66
+ }
67
+
68
+ TableRegistry.register(this); //register table for inter-device communication
69
+ }
70
+
71
+ initializeElement(element){
72
+ if(typeof HTMLElement !== "undefined" && element instanceof HTMLElement){
73
+ this.element = element;
74
+ return true;
75
+ }else if(typeof element === "string"){
76
+ this.element = document.querySelector(element);
77
+
78
+ if(this.element){
79
+ return true;
80
+ }else{
81
+ console.error("Tabulator Creation Error - no element found matching selector: ", element);
82
+ return false;
83
+ }
84
+ }else{
85
+ console.error("Tabulator Creation Error - Invalid element provided:", element);
86
+ return false;
87
+ }
88
+ }
89
+
90
+ initializeCoreSystems(options){
91
+ this.columnManager = new ColumnManager(this);
92
+ this.rowManager = new RowManager(this);
93
+ this.footerManager = new FooterManager(this);
94
+ this.dataLoader = new DataLoader(this);
95
+ this.alertManager = new Alert(this);
96
+
97
+ this.bindModules();
98
+
99
+ this.options = this.optionsList.generate(Tabulator.defaultOptions, options);
100
+
101
+ this._clearObjectPointers();
102
+
103
+ this._mapDeprecatedFunctionality();
104
+
105
+ this.externalEvents = new ExternalEventBus(this, this.options, this.options.debugEventsExternal);
106
+ this.eventBus = new InternalEventBus(this.options.debugEventsInternal);
107
+
108
+ this.interactionMonitor = new InteractionMonitor(this);
109
+
110
+ this.dataLoader.initialize();
111
+ // this.columnManager.initialize();
112
+ // this.rowManager.initialize();
113
+ this.footerManager.initialize();
114
+ }
115
+
116
+ //convert deprecated functionality to new functions
117
+ _mapDeprecatedFunctionality(){
118
+ //all previously deprecated functionality removed in the 5.0 release
119
+ }
120
+
121
+ _clearSelection(){
122
+
123
+ this.element.classList.add("tabulator-block-select");
124
+
125
+ if (window.getSelection) {
126
+ if (window.getSelection().empty) { // Chrome
127
+ window.getSelection().empty();
128
+ } else if (window.getSelection().removeAllRanges) { // Firefox
129
+ window.getSelection().removeAllRanges();
130
+ }
131
+ } else if (document.selection) { // IE?
132
+ document.selection.empty();
133
+ }
134
+
135
+ this.element.classList.remove("tabulator-block-select");
136
+ }
137
+
138
+ //create table
139
+ _create(){
140
+ this.externalEvents.dispatch("tableBuilding");
141
+ this.eventBus.dispatch("table-building");
142
+
143
+ this._rtlCheck();
144
+
145
+ this._buildElement();
146
+
147
+ this._initializeTable();
148
+
149
+ this._loadInitialData();
150
+
151
+ this.initialized = true;
152
+
153
+ this.externalEvents.dispatch("tableBuilt");
154
+ }
155
+
156
+ _rtlCheck(){
157
+ var style = window.getComputedStyle(this.element);
158
+
159
+ switch(this.options.textDirection){
160
+ case"auto":
161
+ if(style.direction !== "rtl"){
162
+ break;
163
+ }
164
+
165
+ case "rtl":
166
+ this.element.classList.add("tabulator-rtl");
167
+ this.rtl = true;
168
+ break;
169
+
170
+ case "ltr":
171
+ this.element.classList.add("tabulator-ltr");
172
+
173
+ default:
174
+ this.rtl = false;
175
+ }
176
+ }
177
+
178
+ //clear pointers to objects in default config object
179
+ _clearObjectPointers(){
180
+ this.options.columns = this.options.columns.slice(0);
181
+
182
+ if(Array.isArray(this.options.data) && !this.options.reactiveData){
183
+ this.options.data = this.options.data.slice(0);
184
+ }
185
+ }
186
+
187
+ //build tabulator element
188
+ _buildElement(){
189
+ var element = this.element,
190
+ options = this.options,
191
+ newElement;
192
+
193
+ if(element.tagName === "TABLE"){
194
+ this.originalElement = this.element;
195
+ newElement = document.createElement("div");
196
+
197
+ //transfer attributes to new element
198
+ var attributes = element.attributes;
199
+
200
+ // loop through attributes and apply them on div
201
+ for(var i in attributes){
202
+ if(typeof attributes[i] == "object"){
203
+ newElement.setAttribute(attributes[i].name, attributes[i].value);
204
+ }
205
+ }
206
+
207
+ // replace table with div element
208
+ element.parentNode.replaceChild(newElement, element);
209
+
210
+ this.element = element = newElement;
211
+ }
212
+
213
+ element.classList.add("tabulator");
214
+ element.setAttribute("role", "grid");
215
+
216
+ //empty element
217
+ while(element.firstChild) element.removeChild(element.firstChild);
218
+
219
+ //set table height
220
+ if(options.height){
221
+ options.height = isNaN(options.height) ? options.height : options.height + "px";
222
+ element.style.height = options.height;
223
+ }
224
+
225
+ //set table min height
226
+ if(options.minHeight !== false){
227
+ options.minHeight = isNaN(options.minHeight) ? options.minHeight : options.minHeight + "px";
228
+ element.style.minHeight = options.minHeight;
229
+ }
230
+
231
+ //set table maxHeight
232
+ if(options.maxHeight !== false){
233
+ options.maxHeight = isNaN(options.maxHeight) ? options.maxHeight : options.maxHeight + "px";
234
+ element.style.maxHeight = options.maxHeight;
235
+ }
236
+ }
237
+
238
+ //initialize core systems and modules
239
+ _initializeTable(){
240
+ var element = this.element,
241
+ options = this.options;
242
+
243
+ this.interactionMonitor.initialize();
244
+
245
+ this.columnManager.initialize();
246
+ this.rowManager.initialize();
247
+
248
+ this._detectBrowser();
249
+
250
+ //initialize core modules
251
+ this.modulesCore.forEach((mod) => {
252
+ mod.initialize();
253
+ });
254
+
255
+ //build table elements
256
+ element.appendChild(this.columnManager.getElement());
257
+ element.appendChild(this.rowManager.getElement());
258
+
259
+ if(options.footerElement){
260
+ this.footerManager.activate();
261
+ }
262
+
263
+ if(options.autoColumns && options.data){
264
+
265
+ this.columnManager.generateColumnsFromRowData(this.options.data);
266
+ }
267
+
268
+ //initialize regular modules
269
+ this.modulesRegular.forEach((mod) => {
270
+ mod.initialize();
271
+ });
272
+
273
+ this.columnManager.setColumns(options.columns);
274
+
275
+ this.eventBus.dispatch("table-built");
276
+ }
277
+
278
+ _loadInitialData(){
279
+ this.dataLoader.load(this.options.data);
280
+ }
281
+
282
+ //deconstructor
283
+ destroy(){
284
+ var element = this.element;
285
+
286
+ this.destroyed = true;
287
+
288
+ TableRegistry.deregister(this); //deregister table from inter-device communication
289
+
290
+ this.eventBus.dispatch("table-destroy");
291
+
292
+ //clear row data
293
+ this.rowManager.destroy();
294
+
295
+ //clear DOM
296
+ while(element.firstChild) element.removeChild(element.firstChild);
297
+ element.classList.remove("tabulator");
298
+
299
+ this.externalEvents.dispatch("tableDestroyed");
300
+ }
301
+
302
+ _detectBrowser(){
303
+ var ua = navigator.userAgent||navigator.vendor||window.opera;
304
+
305
+ if(ua.indexOf("Trident") > -1){
306
+ this.browser = "ie";
307
+ this.browserSlow = true;
308
+ }else if(ua.indexOf("Edge") > -1){
309
+ this.browser = "edge";
310
+ this.browserSlow = true;
311
+ }else if(ua.indexOf("Firefox") > -1){
312
+ this.browser = "firefox";
313
+ this.browserSlow = false;
314
+ }else if(ua.indexOf("Mac OS") > -1){
315
+ this.browser = "safari";
316
+ this.browserSlow = false;
317
+ }else{
318
+ this.browser = "other";
319
+ this.browserSlow = false;
320
+ }
321
+
322
+ this.browserMobile = /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(ua)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(ua.slice(0,4));
323
+ }
324
+
325
+ initGuard(func, msg){
326
+ var stack, line;
327
+
328
+ if(this.options.debugInitialization && !this.initialized){
329
+ if(!func){
330
+ stack = new Error().stack.split("\n");
331
+
332
+ line = stack[0] == "Error" ? stack[2] : stack[1];
333
+
334
+ if(line[0] == " "){
335
+ func = line.trim().split(" ")[1].split(".")[1];
336
+ }else{
337
+ func = line.trim().split("@")[0];
338
+ }
339
+ }
340
+
341
+ console.warn("Table Not Initialized - Calling the " + func + " function before the table is initialized may result in inconsistent behavior, Please wait for the `tableBuilt` event before calling this function." + (msg ? " " + msg : ""));
342
+ }
343
+
344
+ return this.initialized;
345
+ }
346
+
347
+ ////////////////// Data Handling //////////////////
348
+ //block table redrawing
349
+ blockRedraw(){
350
+ this.initGuard();
351
+
352
+ this.eventBus.dispatch("redraw-blocking");
353
+
354
+ this.rowManager.blockRedraw();
355
+ this.columnManager.blockRedraw();
356
+
357
+ this.eventBus.dispatch("redraw-blocked");
358
+ }
359
+
360
+ //restore table redrawing
361
+ restoreRedraw(){
362
+ this.initGuard();
363
+
364
+ this.eventBus.dispatch("redraw-restoring");
365
+
366
+ this.rowManager.restoreRedraw();
367
+ this.columnManager.restoreRedraw();
368
+
369
+ this.eventBus.dispatch("redraw-restored");
370
+ }
371
+
372
+ //load data
373
+ setData(data, params, config){
374
+ this.initGuard(false, "To set initial data please use the 'data' property in the table constructor.");
375
+
376
+ return this.dataLoader.load(data, params, config, false);
377
+ }
378
+
379
+ //clear data
380
+ clearData(){
381
+ this.initGuard();
382
+
383
+ this.dataLoader.blockActiveLoad();
384
+ this.rowManager.clearData();
385
+ }
386
+
387
+ //get table data array
388
+ getData(active){
389
+ return this.rowManager.getData(active);
390
+ }
391
+
392
+ //get table data array count
393
+ getDataCount(active){
394
+ return this.rowManager.getDataCount(active);
395
+ }
396
+
397
+ //replace data, keeping table in position with same sort
398
+ replaceData(data, params, config){
399
+ this.initGuard();
400
+
401
+ return this.dataLoader.load(data, params, config, true, true);
402
+ }
403
+
404
+ //update table data
405
+ updateData(data){
406
+ var responses = 0;
407
+
408
+ this.initGuard();
409
+
410
+ return new Promise((resolve, reject) => {
411
+ this.dataLoader.blockActiveLoad();
412
+
413
+ if(typeof data === "string"){
414
+ data = JSON.parse(data);
415
+ }
416
+
417
+ if(data && data.length > 0){
418
+ data.forEach((item) => {
419
+ var row = this.rowManager.findRow(item[this.options.index]);
420
+
421
+ if(row){
422
+ responses++;
423
+
424
+ row.updateData(item)
425
+ .then(()=>{
426
+ responses--;
427
+
428
+ if(!responses){
429
+ resolve();
430
+ }
431
+ })
432
+ .catch((e) => {
433
+ reject("Update Error - Unable to update row", item, e);
434
+ });
435
+ }else{
436
+ reject("Update Error - Unable to find row", item);
437
+ }
438
+ });
439
+ }else{
440
+ console.warn("Update Error - No data provided");
441
+ reject("Update Error - No data provided");
442
+ }
443
+ });
444
+ }
445
+
446
+ addData(data, pos, index){
447
+ this.initGuard();
448
+
449
+ return new Promise((resolve, reject) => {
450
+ this.dataLoader.blockActiveLoad();
451
+
452
+ if(typeof data === "string"){
453
+ data = JSON.parse(data);
454
+ }
455
+
456
+ if(data){
457
+ this.rowManager.addRows(data, pos, index)
458
+ .then((rows) => {
459
+ var output = [];
460
+
461
+ rows.forEach(function(row){
462
+ output.push(row.getComponent());
463
+ });
464
+
465
+ resolve(output);
466
+ });
467
+ }else{
468
+ console.warn("Update Error - No data provided");
469
+ reject("Update Error - No data provided");
470
+ }
471
+ });
472
+ }
473
+
474
+ //update table data
475
+ updateOrAddData(data){
476
+ var rows = [],
477
+ responses = 0;
478
+
479
+ this.initGuard();
480
+
481
+ return new Promise((resolve, reject) => {
482
+ this.dataLoader.blockActiveLoad();
483
+
484
+ if(typeof data === "string"){
485
+ data = JSON.parse(data);
486
+ }
487
+
488
+ if(data && data.length > 0){
489
+ data.forEach((item) => {
490
+ var row = this.rowManager.findRow(item[this.options.index]);
491
+
492
+ responses++;
493
+
494
+ if(row){
495
+ row.updateData(item)
496
+ .then(()=>{
497
+ responses--;
498
+ rows.push(row.getComponent());
499
+
500
+ if(!responses){
501
+ resolve(rows);
502
+ }
503
+ });
504
+ }else{
505
+ this.rowManager.addRows(item)
506
+ .then((newRows)=>{
507
+ responses--;
508
+ rows.push(newRows[0].getComponent());
509
+
510
+ if(!responses){
511
+ resolve(rows);
512
+ }
513
+ });
514
+ }
515
+ });
516
+ }else{
517
+ console.warn("Update Error - No data provided");
518
+ reject("Update Error - No data provided");
519
+ }
520
+ });
521
+ }
522
+
523
+ //get row object
524
+ getRow(index){
525
+ var row = this.rowManager.findRow(index);
526
+
527
+ if(row){
528
+ return row.getComponent();
529
+ }else{
530
+ console.warn("Find Error - No matching row found:", index);
531
+ return false;
532
+ }
533
+ }
534
+
535
+ //get row object
536
+ getRowFromPosition(position){
537
+ var row = this.rowManager.getRowFromPosition(position);
538
+
539
+ if(row){
540
+ return row.getComponent();
541
+ }else{
542
+ console.warn("Find Error - No matching row found:", position);
543
+ return false;
544
+ }
545
+ }
546
+
547
+ //delete row from table
548
+ deleteRow(index){
549
+ var foundRows = [];
550
+
551
+ this.initGuard();
552
+
553
+ if(!Array.isArray(index)){
554
+ index = [index];
555
+ }
556
+
557
+ //find matching rows
558
+ for(let item of index){
559
+ let row = this.rowManager.findRow(item, true);
560
+
561
+ if(row){
562
+ foundRows.push(row);
563
+ }else{
564
+ console.error("Delete Error - No matching row found:", item);
565
+ return Promise.reject("Delete Error - No matching row found");
566
+ }
567
+ }
568
+
569
+ //sort rows into correct order to ensure smooth delete from table
570
+ foundRows.sort((a, b) => {
571
+ return this.rowManager.rows.indexOf(a) > this.rowManager.rows.indexOf(b) ? 1 : -1;
572
+ });
573
+
574
+ //delete rows
575
+ foundRows.forEach((row) =>{
576
+ row.delete();
577
+ });
578
+
579
+ this.rowManager.reRenderInPosition();
580
+
581
+ return Promise.resolve();
582
+ }
583
+
584
+ //add row to table
585
+ addRow(data, pos, index){
586
+ this.initGuard();
587
+
588
+ if(typeof data === "string"){
589
+ data = JSON.parse(data);
590
+ }
591
+
592
+ return this.rowManager.addRows(data, pos, index, true)
593
+ .then((rows)=>{
594
+ return rows[0].getComponent();
595
+ });
596
+ }
597
+
598
+ //update a row if it exists otherwise create it
599
+ updateOrAddRow(index, data){
600
+ var row = this.rowManager.findRow(index);
601
+
602
+ this.initGuard();
603
+
604
+ if(typeof data === "string"){
605
+ data = JSON.parse(data);
606
+ }
607
+
608
+ if(row){
609
+ return row.updateData(data)
610
+ .then(()=>{
611
+ return row.getComponent();
612
+ });
613
+ }else{
614
+ return this.rowManager.addRows(data)
615
+ .then((rows)=>{
616
+ return rows[0].getComponent();
617
+ });
618
+ }
619
+ }
620
+
621
+ //update row data
622
+ updateRow(index, data){
623
+ var row = this.rowManager.findRow(index);
624
+
625
+ this.initGuard();
626
+
627
+ if(typeof data === "string"){
628
+ data = JSON.parse(data);
629
+ }
630
+
631
+ if(row){
632
+ return row.updateData(data)
633
+ .then(()=>{
634
+ return Promise.resolve(row.getComponent());
635
+ });
636
+ }else{
637
+ console.warn("Update Error - No matching row found:", index);
638
+ return Promise.reject("Update Error - No matching row found");
639
+ }
640
+ }
641
+
642
+ //scroll to row in DOM
643
+ scrollToRow(index, position, ifVisible){
644
+ var row = this.rowManager.findRow(index);
645
+
646
+ if(row){
647
+ return this.rowManager.scrollToRow(row, position, ifVisible);
648
+ }else{
649
+ console.warn("Scroll Error - No matching row found:", index);
650
+ return Promise.reject("Scroll Error - No matching row found");
651
+ }
652
+ }
653
+
654
+ moveRow(from, to, after){
655
+ var fromRow = this.rowManager.findRow(from);
656
+
657
+ this.initGuard();
658
+
659
+ if(fromRow){
660
+ fromRow.moveToRow(to, after);
661
+ }else{
662
+ console.warn("Move Error - No matching row found:", from);
663
+ }
664
+ }
665
+
666
+ getRows(active){
667
+ return this.rowManager.getComponents(active);
668
+ }
669
+
670
+ //get position of row in table
671
+ getRowPosition(index){
672
+ var row = this.rowManager.findRow(index);
673
+
674
+ if(row){
675
+ return row.getPosition();
676
+ }else{
677
+ console.warn("Position Error - No matching row found:", index);
678
+ return false;
679
+ }
680
+ }
681
+
682
+ /////////////// Column Functions ///////////////
683
+ setColumns(definition){
684
+ this.initGuard(false, "To set initial columns please use the 'columns' property in the table constructor");
685
+
686
+ this.columnManager.setColumns(definition);
687
+ }
688
+
689
+ getColumns(structured){
690
+ return this.columnManager.getComponents(structured);
691
+ }
692
+
693
+ getColumn(field){
694
+ var column = this.columnManager.findColumn(field);
695
+
696
+ if(column){
697
+ return column.getComponent();
698
+ }else{
699
+ console.warn("Find Error - No matching column found:", field);
700
+ return false;
701
+ }
702
+ }
703
+
704
+ getColumnDefinitions(){
705
+ return this.columnManager.getDefinitionTree();
706
+ }
707
+
708
+ showColumn(field){
709
+ var column = this.columnManager.findColumn(field);
710
+
711
+ this.initGuard();
712
+
713
+ if(column){
714
+ column.show();
715
+ }else{
716
+ console.warn("Column Show Error - No matching column found:", field);
717
+ return false;
718
+ }
719
+ }
720
+
721
+ hideColumn(field){
722
+ var column = this.columnManager.findColumn(field);
723
+
724
+ this.initGuard();
725
+
726
+ if(column){
727
+ column.hide();
728
+ }else{
729
+ console.warn("Column Hide Error - No matching column found:", field);
730
+ return false;
731
+ }
732
+ }
733
+
734
+ toggleColumn(field){
735
+ var column = this.columnManager.findColumn(field);
736
+
737
+ this.initGuard();
738
+
739
+ if(column){
740
+ if(column.visible){
741
+ column.hide();
742
+ }else{
743
+ column.show();
744
+ }
745
+ }else{
746
+ console.warn("Column Visibility Toggle Error - No matching column found:", field);
747
+ return false;
748
+ }
749
+ }
750
+
751
+ addColumn(definition, before, field){
752
+ var column = this.columnManager.findColumn(field);
753
+
754
+ this.initGuard();
755
+
756
+ return this.columnManager.addColumn(definition, before, column)
757
+ .then((column) => {
758
+ return column.getComponent();
759
+ });
760
+ }
761
+
762
+ deleteColumn(field){
763
+ var column = this.columnManager.findColumn(field);
764
+
765
+ this.initGuard();
766
+
767
+ if(column){
768
+ return column.delete();
769
+ }else{
770
+ console.warn("Column Delete Error - No matching column found:", field);
771
+ return Promise.reject();
772
+ }
773
+ }
774
+
775
+ updateColumnDefinition(field, definition){
776
+ var column = this.columnManager.findColumn(field);
777
+
778
+ this.initGuard();
779
+
780
+ if(column){
781
+ return column.updateDefinition(definition);
782
+ }else{
783
+ console.warn("Column Update Error - No matching column found:", field);
784
+ return Promise.reject();
785
+ }
786
+ }
787
+
788
+ moveColumn(from, to, after){
789
+ var fromColumn = this.columnManager.findColumn(from),
790
+ toColumn = this.columnManager.findColumn(to);
791
+
792
+ this.initGuard();
793
+
794
+ if(fromColumn){
795
+ if(toColumn){
796
+ this.columnManager.moveColumn(fromColumn, toColumn, after);
797
+ }else{
798
+ console.warn("Move Error - No matching column found:", toColumn);
799
+ }
800
+ }else{
801
+ console.warn("Move Error - No matching column found:", from);
802
+ }
803
+ }
804
+
805
+ //scroll to column in DOM
806
+ scrollToColumn(field, position, ifVisible){
807
+ return new Promise((resolve, reject) => {
808
+ var column = this.columnManager.findColumn(field);
809
+
810
+ if(column){
811
+ return this.columnManager.scrollToColumn(column, position, ifVisible);
812
+ }else{
813
+ console.warn("Scroll Error - No matching column found:", field);
814
+ return Promise.reject("Scroll Error - No matching column found");
815
+ }
816
+ });
817
+ }
818
+
819
+ //////////// General Public Functions ////////////
820
+ //redraw list without updating data
821
+ redraw(force){
822
+ this.initGuard();
823
+
824
+ this.columnManager.redraw(force);
825
+ this.rowManager.redraw(force);
826
+ }
827
+
828
+ setHeight(height){
829
+ this.options.height = isNaN(height) ? height : height + "px";
830
+ this.element.style.height = this.options.height;
831
+ this.rowManager.initializeRenderer();
832
+ this.rowManager.redraw();
833
+ }
834
+
835
+ //////////////////// Event Bus ///////////////////
836
+
837
+ on(key, callback){
838
+ this.externalEvents.subscribe(key, callback);
839
+ }
840
+
841
+ off(key, callback){
842
+ this.externalEvents.unsubscribe(key, callback);
843
+ }
844
+
845
+ dispatchEvent(){
846
+ var args = Array.from(arguments);
847
+ args.shift();
848
+
849
+ this.externalEvents.dispatch(...arguments);
850
+ }
851
+
852
+ //////////////////// Alerts ///////////////////
853
+
854
+ alert(contents, type){
855
+ this.initGuard();
856
+
857
+ this.alertManager.alert(contents, type);
858
+ }
859
+
860
+ clearAlert(){
861
+ this.initGuard();
862
+
863
+ this.alertManager.clear();
864
+ }
865
+
866
+ ////////////// Extension Management //////////////
867
+ modExists(plugin, required){
868
+ if(this.modules[plugin]){
869
+ return true;
870
+ }else{
871
+ if(required){
872
+ console.error("Tabulator Module Not Installed: " + plugin);
873
+ }
874
+ return false;
875
+ }
876
+ }
877
+
878
+ module(key){
879
+ var mod = this.modules[key];
880
+
881
+ if(!mod){
882
+ console.error("Tabulator module not installed: " + key);
883
+ }
884
+
885
+ return mod;
886
+ }
887
+ }
888
+
889
+ //default setup options
890
+ Tabulator.defaultOptions = defaultOptions;
891
+
892
+ //bind modules and static functionality
893
+ new ModuleBinder(Tabulator);
894
+
895
+ export default Tabulator;