tabulator-tables 5.4.3 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +80 -53
  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 +89 -58
  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 +106 -73
  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 +110 -75
  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 +95 -62
  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 +93 -63
  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 +90 -59
  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 +96 -62
  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 +233 -182
  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 +80 -53
  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 +88 -57
  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 +26054 -25713
  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 +26131 -25790
  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 +745 -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 +1128 -1101
  79. package/src/js/core/Tabulator.js +895 -892
  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 +78 -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 +24 -19
  91. package/src/js/core/rendering/renderers/BasicVertical.js +83 -79
  92. package/src/js/core/rendering/renderers/VirtualDomHorizontal.js +582 -577
  93. package/src/js/core/rendering/renderers/VirtualDomVertical.js +634 -580
  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 +92 -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 +102 -99
  130. package/src/js/modules/Download/defaults/downloaders.js +14 -14
  131. package/src/js/modules/Edit/Edit.js +734 -736
  132. package/src/js/modules/Edit/List.js +1048 -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 +626 -623
  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 +903 -892
  152. package/src/js/modules/Filter/defaults/filters.js +107 -107
  153. package/src/js/modules/Format/Format.js +215 -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 +43 -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 -598
  178. package/src/js/modules/GroupRows/GroupComponent.js +70 -66
  179. package/src/js/modules/GroupRows/GroupRows.js +639 -639
  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 +337 -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 -185
  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 +472 -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 -137
  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 +348 -345
  219. package/src/js/modules/SelectRow/SelectRow.js +474 -444
  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 +1496 -1467
  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 +288 -284
  238. package/src/scss/themes/bootstrap/tabulator_bootstrap4.scss +552 -544
  239. package/src/scss/themes/bootstrap/tabulator_bootstrap5.scss +584 -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 +258 -252
  244. package/src/scss/themes/bulma/variables.scss +197 -197
  245. package/src/scss/themes/materialize/tabulator_materialize.scss +269 -265
  246. package/src/scss/themes/materialize/variables.scss +70 -70
  247. package/src/scss/themes/semanticui/tabulator_semanticui.scss +586 -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 +162 -158
  251. package/src/scss/themes/tabulator_modern.scss +239 -231
  252. package/src/scss/themes/tabulator_simple.scss +102 -102
  253. package/src/scss/themes/tabulator_site.scss +193 -189
@@ -1,881 +1,881 @@
1
- import Module from '../../core/Module.js';
2
-
3
- import defaultPageCounters from './defaults/pageCounters.js';
4
-
5
- class Page extends Module{
6
-
7
- constructor(table){
8
- super(table);
9
-
10
- this.mode = "local";
11
- this.progressiveLoad = false;
12
-
13
- this.element = null;
14
- this.pageCounterElement = null;
15
- this.pageCounter = null;
16
-
17
- this.size = 0;
18
- this.page = 1;
19
- this.count = 5;
20
- this.max = 1;
21
-
22
- this.remoteRowCountEstimate = null;
23
-
24
- this.initialLoad = true;
25
- this.dataChanging = false; //flag to check if data is being changed by this module
26
-
27
- this.pageSizes = [];
28
-
29
- this.registerTableOption("pagination", false); //set pagination type
30
- this.registerTableOption("paginationMode", "local"); //local or remote pagination
31
- this.registerTableOption("paginationSize", false); //set number of rows to a page
32
- this.registerTableOption("paginationInitialPage", 1); //initial page to show on load
33
- this.registerTableOption("paginationCounter", false); // set pagination counter
34
- this.registerTableOption("paginationCounterElement", false); // set pagination counter
35
- this.registerTableOption("paginationButtonCount", 5); // set count of page button
36
- this.registerTableOption("paginationSizeSelector", false); //add pagination size selector element
37
- this.registerTableOption("paginationElement", false); //element to hold pagination numbers
38
- // this.registerTableOption("paginationDataSent", {}); //pagination data sent to the server
39
- // this.registerTableOption("paginationDataReceived", {}); //pagination data received from the server
40
- this.registerTableOption("paginationAddRow", "page"); //add rows on table or page
41
-
42
- this.registerTableOption("progressiveLoad", false); //progressive loading
43
- this.registerTableOption("progressiveLoadDelay", 0); //delay between requests
44
- this.registerTableOption("progressiveLoadScrollMargin", 0); //margin before scroll begins
45
-
46
- this.registerTableFunction("setMaxPage", this.setMaxPage.bind(this));
47
- this.registerTableFunction("setPage", this.setPage.bind(this));
48
- this.registerTableFunction("setPageToRow", this.userSetPageToRow.bind(this));
49
- this.registerTableFunction("setPageSize", this.userSetPageSize.bind(this));
50
- this.registerTableFunction("getPageSize", this.getPageSize.bind(this));
51
- this.registerTableFunction("previousPage", this.previousPage.bind(this));
52
- this.registerTableFunction("nextPage", this.nextPage.bind(this));
53
- this.registerTableFunction("getPage", this.getPage.bind(this));
54
- this.registerTableFunction("getPageMax", this.getPageMax.bind(this));
55
-
56
- //register component functions
57
- this.registerComponentFunction("row", "pageTo", this.setPageToRow.bind(this));
58
- }
59
-
60
- initialize(){
61
- if(this.table.options.pagination){
62
- this.subscribe("row-deleted", this.rowsUpdated.bind(this));
63
- this.subscribe("row-added", this.rowsUpdated.bind(this));
64
- this.subscribe("data-processed", this.initialLoadComplete.bind(this));
65
- this.subscribe("table-built", this.calculatePageSizes.bind(this));
66
- this.subscribe("footer-redraw", this.footerRedraw.bind(this));
67
-
68
- if(this.table.options.paginationAddRow == "page"){
69
- this.subscribe("row-adding-position", this.rowAddingPosition.bind(this));
70
- }
71
-
72
- if(this.table.options.paginationMode === "remote"){
73
- this.subscribe("data-params", this.remotePageParams.bind(this));
74
- this.subscribe("data-loaded", this._parseRemoteData.bind(this));
75
- }
76
-
77
- if(this.table.options.progressiveLoad){
78
- console.error("Progressive Load Error - Pagination and progressive load cannot be used at the same time");
79
- }
80
-
81
- this.registerDisplayHandler(this.restOnRenderBefore.bind(this), 40);
82
- this.registerDisplayHandler(this.getRows.bind(this), 50);
83
-
84
- this.createElements();
85
- this.initializePageCounter();
86
- this.initializePaginator();
87
- }else if(this.table.options.progressiveLoad){
88
- this.subscribe("data-params", this.remotePageParams.bind(this));
89
- this.subscribe("data-loaded", this._parseRemoteData.bind(this));
90
- this.subscribe("table-built", this.calculatePageSizes.bind(this));
91
- this.subscribe("data-processed", this.initialLoadComplete.bind(this));
92
-
93
- this.initializeProgressive(this.table.options.progressiveLoad);
94
-
95
- if(this.table.options.progressiveLoad === "scroll"){
96
- this.subscribe("scroll-vertical", this.scrollVertical.bind(this));
97
- }
98
- }
99
- }
100
-
101
- rowAddingPosition(row, top){
102
- var rowManager = this.table.rowManager,
103
- displayRows = rowManager.getDisplayRows(),
104
- index;
105
-
106
- if(top){
107
- if(displayRows.length){
108
- index = displayRows[0];
109
- }else{
110
- if(rowManager.activeRows.length){
111
- index = rowManager.activeRows[rowManager.activeRows.length-1];
112
- top = false;
113
- }
114
- }
115
- }else{
116
- if(displayRows.length){
117
- index = displayRows[displayRows.length - 1];
118
- top = displayRows.length < this.size ? false : true;
119
- }
120
- }
121
-
122
- return {index, top};
123
- }
124
-
125
- calculatePageSizes(){
126
- var testElRow, testElCell;
127
-
128
- if(this.table.options.paginationSize){
129
- this.size = this.table.options.paginationSize;
130
- }else{
131
- testElRow = document.createElement("div");
132
- testElRow.classList.add("tabulator-row");
133
- testElRow.style.visibility = "hidden";
134
-
135
- testElCell = document.createElement("div");
136
- testElCell.classList.add("tabulator-cell");
137
- testElCell.innerHTML = "Page Row Test";
138
-
139
- testElRow.appendChild(testElCell);
140
-
141
- this.table.rowManager.getTableElement().appendChild(testElRow);
142
-
143
- this.size = Math.floor(this.table.rowManager.getElement().clientHeight / testElRow.offsetHeight);
144
-
145
- this.table.rowManager.getTableElement().removeChild(testElRow);
146
- }
147
-
148
- this.dispatchExternal("pageSizeChanged", this.size);
149
-
150
- this.generatePageSizeSelectList();
151
- }
152
-
153
- initialLoadComplete(){
154
- this.initialLoad = false;
155
- }
156
-
157
- remotePageParams(data, config, silent, params){
158
- if(!this.initialLoad){
159
- if((this.progressiveLoad && !silent) || (!this.progressiveLoad && !this.dataChanging)){
160
- this.reset(true);
161
- }
162
- }
163
-
164
- //configure request params
165
- params.page = this.page;
166
-
167
- //set page size if defined
168
- if(this.size){
169
- params.size = this.size;
170
- }
171
-
172
- return params;
173
- }
174
-
175
- ///////////////////////////////////
176
- ///////// Table Functions /////////
177
- ///////////////////////////////////
178
-
179
- userSetPageToRow(row){
180
- if(this.table.options.pagination){
181
- row = this.rowManager.findRow(row);
182
-
183
- if(row){
184
- return this.setPageToRow(row);
185
- }
186
- }
187
-
188
- return Promise.reject();
189
- }
190
-
191
- userSetPageSize(size){
192
- if(this.table.options.pagination){
193
- this.setPageSize(size);
194
- return this.setPage(1);
195
- }else{
196
- return false;
197
- }
198
- }
199
- ///////////////////////////////////
200
- ///////// Internal Logic //////////
201
- ///////////////////////////////////
202
-
203
- scrollVertical(top, dir){
204
- var element, diff, margin;
205
- if(!dir && !this.table.dataLoader.loading){
206
- element = this.table.rowManager.getElement();
207
- diff = element.scrollHeight - element.clientHeight - top;
208
- margin = this.table.options.progressiveLoadScrollMargin || (element.clientHeight * 2);
209
-
210
- if(diff < margin){
211
- this.nextPage()
212
- .catch(() => {}); //consume the exception thrown when on the last page
213
- }
214
- }
215
- }
216
-
217
- restOnRenderBefore(rows, renderInPosition){
218
- if(!renderInPosition){
219
- if(this.mode === "local"){
220
- this.reset();
221
- }
222
- }
223
-
224
- return rows;
225
- }
226
-
227
- rowsUpdated(){
228
- this.refreshData(true, "all");
229
- }
230
-
231
- createElements(){
232
- var button;
233
-
234
- this.element = document.createElement("span");
235
- this.element.classList.add("tabulator-paginator");
236
-
237
- this.pagesElement = document.createElement("span");
238
- this.pagesElement.classList.add("tabulator-pages");
239
-
240
- button = document.createElement("button");
241
- button.classList.add("tabulator-page");
242
- button.setAttribute("type", "button");
243
- button.setAttribute("role", "button");
244
- button.setAttribute("aria-label", "");
245
- button.setAttribute("title", "");
246
-
247
- this.firstBut = button.cloneNode(true);
248
- this.firstBut.setAttribute("data-page", "first");
249
-
250
- this.prevBut = button.cloneNode(true);
251
- this.prevBut.setAttribute("data-page", "prev");
252
-
253
- this.nextBut = button.cloneNode(true);
254
- this.nextBut.setAttribute("data-page", "next");
255
-
256
- this.lastBut = button.cloneNode(true);
257
- this.lastBut.setAttribute("data-page", "last");
258
-
259
- if(this.table.options.paginationSizeSelector){
260
- this.pageSizeSelect = document.createElement("select");
261
- this.pageSizeSelect.classList.add("tabulator-page-size");
262
- }
263
- }
264
-
265
- generatePageSizeSelectList(){
266
- var pageSizes = [];
267
-
268
- if(this.pageSizeSelect){
269
-
270
- if(Array.isArray(this.table.options.paginationSizeSelector)){
271
- pageSizes = this.table.options.paginationSizeSelector;
272
- this.pageSizes = pageSizes;
273
-
274
- if(this.pageSizes.indexOf(this.size) == -1){
275
- pageSizes.unshift(this.size);
276
- }
277
- }else{
278
-
279
- if(this.pageSizes.indexOf(this.size) == -1){
280
- pageSizes = [];
281
-
282
- for (let i = 1; i < 5; i++){
283
- pageSizes.push(this.size * i);
284
- }
285
-
286
- this.pageSizes = pageSizes;
287
- }else{
288
- pageSizes = this.pageSizes;
289
- }
290
- }
291
-
292
- while(this.pageSizeSelect.firstChild) this.pageSizeSelect.removeChild(this.pageSizeSelect.firstChild);
293
-
294
- pageSizes.forEach((item) => {
295
- var itemEl = document.createElement("option");
296
- itemEl.value = item;
297
-
298
- if(item === true){
299
- this.langBind("pagination|all", function(value){
300
- itemEl.innerHTML = value;
301
- });
302
- }else{
303
- itemEl.innerHTML = item;
304
- }
305
-
306
-
307
-
308
- this.pageSizeSelect.appendChild(itemEl);
309
- });
310
-
311
- this.pageSizeSelect.value = this.size;
312
- }
313
- }
314
-
315
- initializePageCounter(){
316
- var counter = this.table.options.paginationCounter,
317
- pageCounter = null;
318
-
319
- if(counter){
320
- if(typeof counter === "function"){
321
- pageCounter = counter;
322
- }else{
323
- pageCounter = Page.pageCounters[counter];
324
- }
325
-
326
- if(pageCounter){
327
- this.pageCounter = pageCounter;
328
-
329
- this.pageCounterElement = document.createElement("span");
330
- this.pageCounterElement.classList.add("tabulator-page-counter");
331
- }else{
332
- console.warn("Pagination Error - No such page counter found: ", counter);
333
- }
334
- }
335
- }
336
-
337
- //setup pagination
338
- initializePaginator(hidden){
339
- var pageSelectLabel, paginationCounterHolder;
340
-
341
- if(!hidden){
342
- //build pagination element
343
-
344
- //bind localizations
345
- this.langBind("pagination|first", (value) => {
346
- this.firstBut.innerHTML = value;
347
- });
348
-
349
- this.langBind("pagination|first_title", (value) => {
350
- this.firstBut.setAttribute("aria-label", value);
351
- this.firstBut.setAttribute("title", value);
352
- });
353
-
354
- this.langBind("pagination|prev", (value) => {
355
- this.prevBut.innerHTML = value;
356
- });
357
-
358
- this.langBind("pagination|prev_title", (value) => {
359
- this.prevBut.setAttribute("aria-label", value);
360
- this.prevBut.setAttribute("title", value);
361
- });
362
-
363
- this.langBind("pagination|next", (value) => {
364
- this.nextBut.innerHTML = value;
365
- });
366
-
367
- this.langBind("pagination|next_title", (value) => {
368
- this.nextBut.setAttribute("aria-label", value);
369
- this.nextBut.setAttribute("title", value);
370
- });
371
-
372
- this.langBind("pagination|last", (value) => {
373
- this.lastBut.innerHTML = value;
374
- });
375
-
376
- this.langBind("pagination|last_title", (value) => {
377
- this.lastBut.setAttribute("aria-label", value);
378
- this.lastBut.setAttribute("title", value);
379
- });
380
-
381
- //click bindings
382
- this.firstBut.addEventListener("click", () => {
383
- this.setPage(1);
384
- });
385
-
386
- this.prevBut.addEventListener("click", () => {
387
- this.previousPage();
388
- });
389
-
390
- this.nextBut.addEventListener("click", () => {
391
- this.nextPage();
392
- });
393
-
394
- this.lastBut.addEventListener("click", () => {
395
- this.setPage(this.max);
396
- });
397
-
398
- if(this.table.options.paginationElement){
399
- this.element = this.table.options.paginationElement;
400
- }
401
-
402
- if(this.pageSizeSelect){
403
- pageSelectLabel = document.createElement("label");
404
-
405
- this.langBind("pagination|page_size", (value) => {
406
- this.pageSizeSelect.setAttribute("aria-label", value);
407
- this.pageSizeSelect.setAttribute("title", value);
408
- pageSelectLabel.innerHTML = value;
409
- });
410
-
411
- this.element.appendChild(pageSelectLabel);
412
- this.element.appendChild(this.pageSizeSelect);
413
-
414
- this.pageSizeSelect.addEventListener("change", (e) => {
415
- this.setPageSize(this.pageSizeSelect.value == "true" ? true : this.pageSizeSelect.value);
416
- this.setPage(1);
417
- });
418
- }
419
-
420
- //append to DOM
421
- this.element.appendChild(this.firstBut);
422
- this.element.appendChild(this.prevBut);
423
- this.element.appendChild(this.pagesElement);
424
- this.element.appendChild(this.nextBut);
425
- this.element.appendChild(this.lastBut);
426
-
427
- if(!this.table.options.paginationElement){
428
- if(this.table.options.paginationCounter){
429
-
430
- paginationCounterHolder;
431
-
432
- if(this.table.options.paginationCounterElement){
433
- if(this.table.options.paginationCounterElement instanceof HTMLElement){
434
- this.table.options.paginationCounterElement.appendChild(this.pageCounterElement);
435
- }else if(typeof this.table.options.paginationCounterElement === "string"){
436
- paginationCounterHolder = document.querySelector(this.table.options.paginationCounterElement);
437
-
438
- if(paginationCounterHolder){
439
- paginationCounterHolder.appendChild(this.pageCounterElement);
440
- }else{
441
- console.warn("Pagination Error - Unable to find element matching paginationCounterElement selector:", this.table.options.paginationCounterElement);
442
- }
443
- }
444
- }else{
445
- this.footerAppend(this.pageCounterElement);
446
- }
447
-
448
- }
449
-
450
- this.footerAppend(this.element);
451
- }
452
-
453
- this.page = this.table.options.paginationInitialPage;
454
- this.count = this.table.options.paginationButtonCount;
455
- }
456
-
457
- //set default values
458
- this.mode = this.table.options.paginationMode;
459
- }
460
-
461
- initializeProgressive(mode){
462
- this.initializePaginator(true);
463
- this.mode = "progressive_" + mode;
464
- this.progressiveLoad = true;
465
- }
466
-
467
- trackChanges(){
468
- this.dispatch("page-changed");
469
- }
470
-
471
- //calculate maximum page from number of rows
472
- setMaxRows(rowCount){
473
- if(!rowCount){
474
- this.max = 1;
475
- }else{
476
- this.max = this.size === true ? 1 : Math.ceil(rowCount/this.size);
477
- }
478
-
479
- if(this.page > this.max){
480
- this.page = this.max;
481
- }
482
- }
483
-
484
- //reset to first page without triggering action
485
- reset(force){
486
- if(!this.initialLoad){
487
- if(this.mode == "local" || force){
488
- this.page = 1;
489
- this.trackChanges();
490
- }
491
- }
492
- }
493
-
494
- //set the maximum page
495
- setMaxPage(max){
496
-
497
- max = parseInt(max);
498
-
499
- this.max = max || 1;
500
-
501
- if(this.page > this.max){
502
- this.page = this.max;
503
- this.trigger();
504
- }
505
- }
506
-
507
- //set current page number
508
- setPage(page){
509
- switch(page){
510
- case "first":
511
- return this.setPage(1);
512
-
513
- case "prev":
514
- return this.previousPage();
515
-
516
- case "next":
517
- return this.nextPage();
518
-
519
- case "last":
520
- return this.setPage(this.max);
521
- }
522
-
523
- page = parseInt(page);
524
-
525
- if((page > 0 && page <= this.max) || this.mode !== "local"){
526
- this.page = page;
527
-
528
- this.trackChanges();
529
-
530
- return this.trigger();
531
- }else{
532
- console.warn("Pagination Error - Requested page is out of range of 1 - " + this.max + ":", page);
533
- return Promise.reject();
534
- }
535
- }
536
-
537
- setPageToRow(row){
538
- var rows = this.displayRows(-1);
539
- var index = rows.indexOf(row);
540
-
541
- if(index > -1){
542
- var page = this.size === true ? 1 : Math.ceil((index + 1) / this.size);
543
-
544
- return this.setPage(page);
545
- }else{
546
- console.warn("Pagination Error - Requested row is not visible");
547
- return Promise.reject();
548
- }
549
- }
550
-
551
- setPageSize(size){
552
- if(size !== true){
553
- size = parseInt(size);
554
- }
555
-
556
- if(size > 0){
557
- this.size = size;
558
- this.dispatchExternal("pageSizeChanged", size);
559
- }
560
-
561
- if(this.pageSizeSelect){
562
- // this.pageSizeSelect.value = size;
563
- this.generatePageSizeSelectList();
564
- }
565
-
566
- this.trackChanges();
567
- }
568
-
569
- _setPageCounter(totalRows, size, currentRow){
570
- var content;
571
-
572
- if(this.pageCounter){
573
-
574
- if(this.mode === "remote"){
575
- size = this.size;
576
- currentRow = ((this.page - 1) * this.size) + 1;
577
- totalRows = this.remoteRowCountEstimate;
578
- }
579
-
580
- content = this.pageCounter.call(this, size, currentRow, this.page, totalRows, this.max);
581
-
582
- switch(typeof content){
583
- case "object":
584
- if(content instanceof Node){
585
-
586
- //clear previous cell contents
587
- while(this.pageCounterElement.firstChild) this.pageCounterElement.removeChild(this.pageCounterElement.firstChild);
588
-
589
- this.pageCounterElement.appendChild(content);
590
- }else{
591
- this.pageCounterElement.innerHTML = "";
592
-
593
- if(content != null){
594
- console.warn("Page Counter Error - Page Counter has returned a type of object, the only valid page counter object return is an instance of Node, the page counter returned:", content);
595
- }
596
- }
597
- break;
598
- case "undefined":
599
- this.pageCounterElement.innerHTML = "";
600
- break;
601
- default:
602
- this.pageCounterElement.innerHTML = content;
603
- }
604
- }
605
- }
606
-
607
- //setup the pagination buttons
608
- _setPageButtons(){
609
- let leftSize = Math.floor((this.count-1) / 2);
610
- let rightSize = Math.ceil((this.count-1) / 2);
611
- let min = this.max - this.page + leftSize + 1 < this.count ? this.max-this.count+1: Math.max(this.page-leftSize,1);
612
- let max = this.page <= rightSize? Math.min(this.count, this.max) :Math.min(this.page+rightSize, this.max);
613
-
614
- while(this.pagesElement.firstChild) this.pagesElement.removeChild(this.pagesElement.firstChild);
615
-
616
- if(this.page == 1){
617
- this.firstBut.disabled = true;
618
- this.prevBut.disabled = true;
619
- }else{
620
- this.firstBut.disabled = false;
621
- this.prevBut.disabled = false;
622
- }
623
-
624
- if(this.page == this.max){
625
- this.lastBut.disabled = true;
626
- this.nextBut.disabled = true;
627
- }else{
628
- this.lastBut.disabled = false;
629
- this.nextBut.disabled = false;
630
- }
631
-
632
- for(let i = min; i <= max; i++){
633
- if(i>0 && i <= this.max){
634
- this.pagesElement.appendChild(this._generatePageButton(i));
635
- }
636
- }
637
-
638
- this.footerRedraw();
639
- }
640
-
641
- _generatePageButton(page){
642
- var button = document.createElement("button");
643
-
644
- button.classList.add("tabulator-page");
645
- if(page == this.page){
646
- button.classList.add("active");
647
- }
648
-
649
- button.setAttribute("type", "button");
650
- button.setAttribute("role", "button");
651
-
652
- this.langBind("pagination|page_title", (value) => {
653
- button.setAttribute("aria-label", value + " " + page);
654
- button.setAttribute("title", value + " " + page);
655
- });
656
-
657
- button.setAttribute("data-page", page);
658
- button.textContent = page;
659
-
660
- button.addEventListener("click", (e) => {
661
- this.setPage(page);
662
- });
663
-
664
- return button;
665
- }
666
-
667
- //previous page
668
- previousPage(){
669
- if(this.page > 1){
670
- this.page--;
671
-
672
- this.trackChanges();
673
-
674
- return this.trigger();
675
-
676
- }else{
677
- console.warn("Pagination Error - Previous page would be less than page 1:", 0);
678
- return Promise.reject();
679
- }
680
- }
681
-
682
- //next page
683
- nextPage(){
684
- if(this.page < this.max){
685
- this.page++;
686
-
687
- this.trackChanges();
688
-
689
- return this.trigger();
690
-
691
- }else{
692
- if(!this.progressiveLoad){
693
- console.warn("Pagination Error - Next page would be greater than maximum page of " + this.max + ":", this.max + 1);
694
- }
695
- return Promise.reject();
696
- }
697
- }
698
-
699
- //return current page number
700
- getPage(){
701
- return this.page;
702
- }
703
-
704
- //return max page number
705
- getPageMax(){
706
- return this.max;
707
- }
708
-
709
- getPageSize(size){
710
- return this.size;
711
- }
712
-
713
- getMode(){
714
- return this.mode;
715
- }
716
-
717
- //return appropriate rows for current page
718
- getRows(data){
719
- var actualRowPageSize = 0,
720
- output, start, end, actualStartRow;
721
-
722
- var actualRows = data.filter((row) => {
723
- return row.type === "row";
724
- });
725
-
726
- if(this.mode == "local"){
727
- output = [];
728
-
729
- this.setMaxRows(data.length);
730
-
731
- if(this.size === true){
732
- start = 0;
733
- end = data.length;
734
- }else{
735
- start = this.size * (this.page - 1);
736
- end = start + parseInt(this.size);
737
- }
738
-
739
- this._setPageButtons();
740
-
741
- for(let i = start; i < end; i++){
742
- let row = data[i];
743
-
744
- if(row){
745
- output.push(row);
746
-
747
- if(row.type === "row"){
748
- if(!actualStartRow){
749
- actualStartRow = row;
750
- }
751
-
752
- actualRowPageSize++;
753
- }
754
- }
755
- }
756
-
757
- this._setPageCounter(actualRows.length, actualRowPageSize, actualStartRow ? (actualRows.indexOf(actualStartRow) + 1) : 0);
758
-
759
- return output;
760
- }else{
761
- this._setPageButtons();
762
- this._setPageCounter(actualRows.length);
763
-
764
- return data.slice(0);
765
- }
766
- }
767
-
768
- trigger(){
769
- var left;
770
-
771
- switch(this.mode){
772
- case "local":
773
- left = this.table.rowManager.scrollLeft;
774
-
775
- this.refreshData();
776
- this.table.rowManager.scrollHorizontal(left);
777
-
778
- this.dispatchExternal("pageLoaded", this.getPage());
779
-
780
- return Promise.resolve();
781
-
782
- case "remote":
783
- this.dataChanging = true;
784
- return this.reloadData(null)
785
- .finally(() => {
786
- this.dataChanging = false;
787
- });
788
-
789
- case "progressive_load":
790
- case "progressive_scroll":
791
- return this.reloadData(null, true);
792
-
793
- default:
794
- console.warn("Pagination Error - no such pagination mode:", this.mode);
795
- return Promise.reject();
796
- }
797
- }
798
-
799
- _parseRemoteData(data){
800
- var margin;
801
-
802
- if(typeof data.last_page === "undefined"){
803
- console.warn("Remote Pagination Error - Server response missing '" + (this.options("dataReceiveParams").last_page || "last_page") + "' property");
804
- }
805
-
806
- if(data.data){
807
- this.max = parseInt(data.last_page) || 1;
808
-
809
- this.remoteRowCountEstimate = typeof data.last_row !== "undefined" ? data.last_row : (data.last_page * this.size - (this.page == data.last_page ? (this.size - data.data.length) : 0));
810
-
811
- if(this.progressiveLoad){
812
- switch(this.mode){
813
- case "progressive_load":
814
-
815
- if(this.page == 1){
816
- this.table.rowManager.setData(data.data, false, this.page == 1);
817
- }else{
818
- this.table.rowManager.addRows(data.data);
819
- }
820
-
821
- if(this.page < this.max){
822
- setTimeout(() => {
823
- this.nextPage();
824
- }, this.table.options.progressiveLoadDelay);
825
- }
826
- break;
827
-
828
- case "progressive_scroll":
829
- data = this.page === 1 ? data.data : this.table.rowManager.getData().concat(data.data);
830
-
831
- this.table.rowManager.setData(data, this.page !== 1, this.page == 1);
832
-
833
- margin = this.table.options.progressiveLoadScrollMargin || (this.table.rowManager.element.clientHeight * 2);
834
-
835
- if(this.table.rowManager.element.scrollHeight <= (this.table.rowManager.element.clientHeight + margin)){
836
- if(this.page < this.max){
837
- setTimeout(() => {
838
- this.nextPage();
839
- });
840
- }
841
- }
842
- break;
843
- }
844
-
845
- return false;
846
- }else{
847
- // left = this.table.rowManager.scrollLeft;
848
- this.dispatchExternal("pageLoaded", this.getPage());
849
- // this.table.rowManager.scrollHorizontal(left);
850
- // this.table.columnManager.scrollHorizontal(left);
851
- }
852
-
853
- }else{
854
- console.warn("Remote Pagination Error - Server response missing '" + (this.options("dataReceiveParams").data || "data") + "' property");
855
- }
856
-
857
- return data.data;
858
- }
859
-
860
- //handle the footer element being redrawn
861
- footerRedraw(){
862
- var footer = this.table.footerManager.containerElement;
863
-
864
- if((Math.ceil(footer.clientWidth) - footer.scrollWidth) < 0){
865
- this.pagesElement.style.display = 'none';
866
- }else{
867
- this.pagesElement.style.display = '';
868
-
869
- if((Math.ceil(footer.clientWidth) - footer.scrollWidth) < 0){
870
- this.pagesElement.style.display = 'none';
871
- }
872
- }
873
- }
874
- }
875
-
876
- Page.moduleName = "page";
877
-
878
- //load defaults
879
- Page.pageCounters = defaultPageCounters;
880
-
881
- export default Page;
1
+ import Module from '../../core/Module.js';
2
+
3
+ import defaultPageCounters from './defaults/pageCounters.js';
4
+
5
+ class Page extends Module{
6
+
7
+ constructor(table){
8
+ super(table);
9
+
10
+ this.mode = "local";
11
+ this.progressiveLoad = false;
12
+
13
+ this.element = null;
14
+ this.pageCounterElement = null;
15
+ this.pageCounter = null;
16
+
17
+ this.size = 0;
18
+ this.page = 1;
19
+ this.count = 5;
20
+ this.max = 1;
21
+
22
+ this.remoteRowCountEstimate = null;
23
+
24
+ this.initialLoad = true;
25
+ this.dataChanging = false; //flag to check if data is being changed by this module
26
+
27
+ this.pageSizes = [];
28
+
29
+ this.registerTableOption("pagination", false); //set pagination type
30
+ this.registerTableOption("paginationMode", "local"); //local or remote pagination
31
+ this.registerTableOption("paginationSize", false); //set number of rows to a page
32
+ this.registerTableOption("paginationInitialPage", 1); //initial page to show on load
33
+ this.registerTableOption("paginationCounter", false); // set pagination counter
34
+ this.registerTableOption("paginationCounterElement", false); // set pagination counter
35
+ this.registerTableOption("paginationButtonCount", 5); // set count of page button
36
+ this.registerTableOption("paginationSizeSelector", false); //add pagination size selector element
37
+ this.registerTableOption("paginationElement", false); //element to hold pagination numbers
38
+ // this.registerTableOption("paginationDataSent", {}); //pagination data sent to the server
39
+ // this.registerTableOption("paginationDataReceived", {}); //pagination data received from the server
40
+ this.registerTableOption("paginationAddRow", "page"); //add rows on table or page
41
+
42
+ this.registerTableOption("progressiveLoad", false); //progressive loading
43
+ this.registerTableOption("progressiveLoadDelay", 0); //delay between requests
44
+ this.registerTableOption("progressiveLoadScrollMargin", 0); //margin before scroll begins
45
+
46
+ this.registerTableFunction("setMaxPage", this.setMaxPage.bind(this));
47
+ this.registerTableFunction("setPage", this.setPage.bind(this));
48
+ this.registerTableFunction("setPageToRow", this.userSetPageToRow.bind(this));
49
+ this.registerTableFunction("setPageSize", this.userSetPageSize.bind(this));
50
+ this.registerTableFunction("getPageSize", this.getPageSize.bind(this));
51
+ this.registerTableFunction("previousPage", this.previousPage.bind(this));
52
+ this.registerTableFunction("nextPage", this.nextPage.bind(this));
53
+ this.registerTableFunction("getPage", this.getPage.bind(this));
54
+ this.registerTableFunction("getPageMax", this.getPageMax.bind(this));
55
+
56
+ //register component functions
57
+ this.registerComponentFunction("row", "pageTo", this.setPageToRow.bind(this));
58
+ }
59
+
60
+ initialize(){
61
+ if(this.table.options.pagination){
62
+ this.subscribe("row-deleted", this.rowsUpdated.bind(this));
63
+ this.subscribe("row-added", this.rowsUpdated.bind(this));
64
+ this.subscribe("data-processed", this.initialLoadComplete.bind(this));
65
+ this.subscribe("table-built", this.calculatePageSizes.bind(this));
66
+ this.subscribe("footer-redraw", this.footerRedraw.bind(this));
67
+
68
+ if(this.table.options.paginationAddRow == "page"){
69
+ this.subscribe("row-adding-position", this.rowAddingPosition.bind(this));
70
+ }
71
+
72
+ if(this.table.options.paginationMode === "remote"){
73
+ this.subscribe("data-params", this.remotePageParams.bind(this));
74
+ this.subscribe("data-loaded", this._parseRemoteData.bind(this));
75
+ }
76
+
77
+ if(this.table.options.progressiveLoad){
78
+ console.error("Progressive Load Error - Pagination and progressive load cannot be used at the same time");
79
+ }
80
+
81
+ this.registerDisplayHandler(this.restOnRenderBefore.bind(this), 40);
82
+ this.registerDisplayHandler(this.getRows.bind(this), 50);
83
+
84
+ this.createElements();
85
+ this.initializePageCounter();
86
+ this.initializePaginator();
87
+ }else if(this.table.options.progressiveLoad){
88
+ this.subscribe("data-params", this.remotePageParams.bind(this));
89
+ this.subscribe("data-loaded", this._parseRemoteData.bind(this));
90
+ this.subscribe("table-built", this.calculatePageSizes.bind(this));
91
+ this.subscribe("data-processed", this.initialLoadComplete.bind(this));
92
+
93
+ this.initializeProgressive(this.table.options.progressiveLoad);
94
+
95
+ if(this.table.options.progressiveLoad === "scroll"){
96
+ this.subscribe("scroll-vertical", this.scrollVertical.bind(this));
97
+ }
98
+ }
99
+ }
100
+
101
+ rowAddingPosition(row, top){
102
+ var rowManager = this.table.rowManager,
103
+ displayRows = rowManager.getDisplayRows(),
104
+ index;
105
+
106
+ if(top){
107
+ if(displayRows.length){
108
+ index = displayRows[0];
109
+ }else{
110
+ if(rowManager.activeRows.length){
111
+ index = rowManager.activeRows[rowManager.activeRows.length-1];
112
+ top = false;
113
+ }
114
+ }
115
+ }else{
116
+ if(displayRows.length){
117
+ index = displayRows[displayRows.length - 1];
118
+ top = displayRows.length < this.size ? false : true;
119
+ }
120
+ }
121
+
122
+ return {index, top};
123
+ }
124
+
125
+ calculatePageSizes(){
126
+ var testElRow, testElCell;
127
+
128
+ if(this.table.options.paginationSize){
129
+ this.size = this.table.options.paginationSize;
130
+ }else{
131
+ testElRow = document.createElement("div");
132
+ testElRow.classList.add("tabulator-row");
133
+ testElRow.style.visibility = "hidden";
134
+
135
+ testElCell = document.createElement("div");
136
+ testElCell.classList.add("tabulator-cell");
137
+ testElCell.innerHTML = "Page Row Test";
138
+
139
+ testElRow.appendChild(testElCell);
140
+
141
+ this.table.rowManager.getTableElement().appendChild(testElRow);
142
+
143
+ this.size = Math.floor(this.table.rowManager.getElement().clientHeight / testElRow.offsetHeight);
144
+
145
+ this.table.rowManager.getTableElement().removeChild(testElRow);
146
+ }
147
+
148
+ this.dispatchExternal("pageSizeChanged", this.size);
149
+
150
+ this.generatePageSizeSelectList();
151
+ }
152
+
153
+ initialLoadComplete(){
154
+ this.initialLoad = false;
155
+ }
156
+
157
+ remotePageParams(data, config, silent, params){
158
+ if(!this.initialLoad){
159
+ if((this.progressiveLoad && !silent) || (!this.progressiveLoad && !this.dataChanging)){
160
+ this.reset(true);
161
+ }
162
+ }
163
+
164
+ //configure request params
165
+ params.page = this.page;
166
+
167
+ //set page size if defined
168
+ if(this.size){
169
+ params.size = this.size;
170
+ }
171
+
172
+ return params;
173
+ }
174
+
175
+ ///////////////////////////////////
176
+ ///////// Table Functions /////////
177
+ ///////////////////////////////////
178
+
179
+ userSetPageToRow(row){
180
+ if(this.table.options.pagination){
181
+ row = this.rowManager.findRow(row);
182
+
183
+ if(row){
184
+ return this.setPageToRow(row);
185
+ }
186
+ }
187
+
188
+ return Promise.reject();
189
+ }
190
+
191
+ userSetPageSize(size){
192
+ if(this.table.options.pagination){
193
+ this.setPageSize(size);
194
+ return this.setPage(1);
195
+ }else{
196
+ return false;
197
+ }
198
+ }
199
+ ///////////////////////////////////
200
+ ///////// Internal Logic //////////
201
+ ///////////////////////////////////
202
+
203
+ scrollVertical(top, dir){
204
+ var element, diff, margin;
205
+ if(!dir && !this.table.dataLoader.loading){
206
+ element = this.table.rowManager.getElement();
207
+ diff = element.scrollHeight - element.clientHeight - top;
208
+ margin = this.table.options.progressiveLoadScrollMargin || (element.clientHeight * 2);
209
+
210
+ if(diff < margin){
211
+ this.nextPage()
212
+ .catch(() => {}); //consume the exception thrown when on the last page
213
+ }
214
+ }
215
+ }
216
+
217
+ restOnRenderBefore(rows, renderInPosition){
218
+ if(!renderInPosition){
219
+ if(this.mode === "local"){
220
+ this.reset();
221
+ }
222
+ }
223
+
224
+ return rows;
225
+ }
226
+
227
+ rowsUpdated(){
228
+ this.refreshData(true, "all");
229
+ }
230
+
231
+ createElements(){
232
+ var button;
233
+
234
+ this.element = document.createElement("span");
235
+ this.element.classList.add("tabulator-paginator");
236
+
237
+ this.pagesElement = document.createElement("span");
238
+ this.pagesElement.classList.add("tabulator-pages");
239
+
240
+ button = document.createElement("button");
241
+ button.classList.add("tabulator-page");
242
+ button.setAttribute("type", "button");
243
+ button.setAttribute("role", "button");
244
+ button.setAttribute("aria-label", "");
245
+ button.setAttribute("title", "");
246
+
247
+ this.firstBut = button.cloneNode(true);
248
+ this.firstBut.setAttribute("data-page", "first");
249
+
250
+ this.prevBut = button.cloneNode(true);
251
+ this.prevBut.setAttribute("data-page", "prev");
252
+
253
+ this.nextBut = button.cloneNode(true);
254
+ this.nextBut.setAttribute("data-page", "next");
255
+
256
+ this.lastBut = button.cloneNode(true);
257
+ this.lastBut.setAttribute("data-page", "last");
258
+
259
+ if(this.table.options.paginationSizeSelector){
260
+ this.pageSizeSelect = document.createElement("select");
261
+ this.pageSizeSelect.classList.add("tabulator-page-size");
262
+ }
263
+ }
264
+
265
+ generatePageSizeSelectList(){
266
+ var pageSizes = [];
267
+
268
+ if(this.pageSizeSelect){
269
+
270
+ if(Array.isArray(this.table.options.paginationSizeSelector)){
271
+ pageSizes = this.table.options.paginationSizeSelector;
272
+ this.pageSizes = pageSizes;
273
+
274
+ if(this.pageSizes.indexOf(this.size) == -1){
275
+ pageSizes.unshift(this.size);
276
+ }
277
+ }else{
278
+
279
+ if(this.pageSizes.indexOf(this.size) == -1){
280
+ pageSizes = [];
281
+
282
+ for (let i = 1; i < 5; i++){
283
+ pageSizes.push(this.size * i);
284
+ }
285
+
286
+ this.pageSizes = pageSizes;
287
+ }else{
288
+ pageSizes = this.pageSizes;
289
+ }
290
+ }
291
+
292
+ while(this.pageSizeSelect.firstChild) this.pageSizeSelect.removeChild(this.pageSizeSelect.firstChild);
293
+
294
+ pageSizes.forEach((item) => {
295
+ var itemEl = document.createElement("option");
296
+ itemEl.value = item;
297
+
298
+ if(item === true){
299
+ this.langBind("pagination|all", function(value){
300
+ itemEl.innerHTML = value;
301
+ });
302
+ }else{
303
+ itemEl.innerHTML = item;
304
+ }
305
+
306
+
307
+
308
+ this.pageSizeSelect.appendChild(itemEl);
309
+ });
310
+
311
+ this.pageSizeSelect.value = this.size;
312
+ }
313
+ }
314
+
315
+ initializePageCounter(){
316
+ var counter = this.table.options.paginationCounter,
317
+ pageCounter = null;
318
+
319
+ if(counter){
320
+ if(typeof counter === "function"){
321
+ pageCounter = counter;
322
+ }else{
323
+ pageCounter = Page.pageCounters[counter];
324
+ }
325
+
326
+ if(pageCounter){
327
+ this.pageCounter = pageCounter;
328
+
329
+ this.pageCounterElement = document.createElement("span");
330
+ this.pageCounterElement.classList.add("tabulator-page-counter");
331
+ }else{
332
+ console.warn("Pagination Error - No such page counter found: ", counter);
333
+ }
334
+ }
335
+ }
336
+
337
+ //setup pagination
338
+ initializePaginator(hidden){
339
+ var pageSelectLabel, paginationCounterHolder;
340
+
341
+ if(!hidden){
342
+ //build pagination element
343
+
344
+ //bind localizations
345
+ this.langBind("pagination|first", (value) => {
346
+ this.firstBut.innerHTML = value;
347
+ });
348
+
349
+ this.langBind("pagination|first_title", (value) => {
350
+ this.firstBut.setAttribute("aria-label", value);
351
+ this.firstBut.setAttribute("title", value);
352
+ });
353
+
354
+ this.langBind("pagination|prev", (value) => {
355
+ this.prevBut.innerHTML = value;
356
+ });
357
+
358
+ this.langBind("pagination|prev_title", (value) => {
359
+ this.prevBut.setAttribute("aria-label", value);
360
+ this.prevBut.setAttribute("title", value);
361
+ });
362
+
363
+ this.langBind("pagination|next", (value) => {
364
+ this.nextBut.innerHTML = value;
365
+ });
366
+
367
+ this.langBind("pagination|next_title", (value) => {
368
+ this.nextBut.setAttribute("aria-label", value);
369
+ this.nextBut.setAttribute("title", value);
370
+ });
371
+
372
+ this.langBind("pagination|last", (value) => {
373
+ this.lastBut.innerHTML = value;
374
+ });
375
+
376
+ this.langBind("pagination|last_title", (value) => {
377
+ this.lastBut.setAttribute("aria-label", value);
378
+ this.lastBut.setAttribute("title", value);
379
+ });
380
+
381
+ //click bindings
382
+ this.firstBut.addEventListener("click", () => {
383
+ this.setPage(1);
384
+ });
385
+
386
+ this.prevBut.addEventListener("click", () => {
387
+ this.previousPage();
388
+ });
389
+
390
+ this.nextBut.addEventListener("click", () => {
391
+ this.nextPage();
392
+ });
393
+
394
+ this.lastBut.addEventListener("click", () => {
395
+ this.setPage(this.max);
396
+ });
397
+
398
+ if(this.table.options.paginationElement){
399
+ this.element = this.table.options.paginationElement;
400
+ }
401
+
402
+ if(this.pageSizeSelect){
403
+ pageSelectLabel = document.createElement("label");
404
+
405
+ this.langBind("pagination|page_size", (value) => {
406
+ this.pageSizeSelect.setAttribute("aria-label", value);
407
+ this.pageSizeSelect.setAttribute("title", value);
408
+ pageSelectLabel.innerHTML = value;
409
+ });
410
+
411
+ this.element.appendChild(pageSelectLabel);
412
+ this.element.appendChild(this.pageSizeSelect);
413
+
414
+ this.pageSizeSelect.addEventListener("change", (e) => {
415
+ this.setPageSize(this.pageSizeSelect.value == "true" ? true : this.pageSizeSelect.value);
416
+ this.setPage(1);
417
+ });
418
+ }
419
+
420
+ //append to DOM
421
+ this.element.appendChild(this.firstBut);
422
+ this.element.appendChild(this.prevBut);
423
+ this.element.appendChild(this.pagesElement);
424
+ this.element.appendChild(this.nextBut);
425
+ this.element.appendChild(this.lastBut);
426
+
427
+ if(!this.table.options.paginationElement){
428
+ if(this.table.options.paginationCounter){
429
+
430
+ paginationCounterHolder;
431
+
432
+ if(this.table.options.paginationCounterElement){
433
+ if(this.table.options.paginationCounterElement instanceof HTMLElement){
434
+ this.table.options.paginationCounterElement.appendChild(this.pageCounterElement);
435
+ }else if(typeof this.table.options.paginationCounterElement === "string"){
436
+ paginationCounterHolder = document.querySelector(this.table.options.paginationCounterElement);
437
+
438
+ if(paginationCounterHolder){
439
+ paginationCounterHolder.appendChild(this.pageCounterElement);
440
+ }else{
441
+ console.warn("Pagination Error - Unable to find element matching paginationCounterElement selector:", this.table.options.paginationCounterElement);
442
+ }
443
+ }
444
+ }else{
445
+ this.footerAppend(this.pageCounterElement);
446
+ }
447
+
448
+ }
449
+
450
+ this.footerAppend(this.element);
451
+ }
452
+
453
+ this.page = this.table.options.paginationInitialPage;
454
+ this.count = this.table.options.paginationButtonCount;
455
+ }
456
+
457
+ //set default values
458
+ this.mode = this.table.options.paginationMode;
459
+ }
460
+
461
+ initializeProgressive(mode){
462
+ this.initializePaginator(true);
463
+ this.mode = "progressive_" + mode;
464
+ this.progressiveLoad = true;
465
+ }
466
+
467
+ trackChanges(){
468
+ this.dispatch("page-changed");
469
+ }
470
+
471
+ //calculate maximum page from number of rows
472
+ setMaxRows(rowCount){
473
+ if(!rowCount){
474
+ this.max = 1;
475
+ }else{
476
+ this.max = this.size === true ? 1 : Math.ceil(rowCount/this.size);
477
+ }
478
+
479
+ if(this.page > this.max){
480
+ this.page = this.max;
481
+ }
482
+ }
483
+
484
+ //reset to first page without triggering action
485
+ reset(force){
486
+ if(!this.initialLoad){
487
+ if(this.mode == "local" || force){
488
+ this.page = 1;
489
+ this.trackChanges();
490
+ }
491
+ }
492
+ }
493
+
494
+ //set the maximum page
495
+ setMaxPage(max){
496
+
497
+ max = parseInt(max);
498
+
499
+ this.max = max || 1;
500
+
501
+ if(this.page > this.max){
502
+ this.page = this.max;
503
+ this.trigger();
504
+ }
505
+ }
506
+
507
+ //set current page number
508
+ setPage(page){
509
+ switch(page){
510
+ case "first":
511
+ return this.setPage(1);
512
+
513
+ case "prev":
514
+ return this.previousPage();
515
+
516
+ case "next":
517
+ return this.nextPage();
518
+
519
+ case "last":
520
+ return this.setPage(this.max);
521
+ }
522
+
523
+ page = parseInt(page);
524
+
525
+ if((page > 0 && page <= this.max) || this.mode !== "local"){
526
+ this.page = page;
527
+
528
+ this.trackChanges();
529
+
530
+ return this.trigger();
531
+ }else{
532
+ console.warn("Pagination Error - Requested page is out of range of 1 - " + this.max + ":", page);
533
+ return Promise.reject();
534
+ }
535
+ }
536
+
537
+ setPageToRow(row){
538
+ var rows = this.displayRows(-1);
539
+ var index = rows.indexOf(row);
540
+
541
+ if(index > -1){
542
+ var page = this.size === true ? 1 : Math.ceil((index + 1) / this.size);
543
+
544
+ return this.setPage(page);
545
+ }else{
546
+ console.warn("Pagination Error - Requested row is not visible");
547
+ return Promise.reject();
548
+ }
549
+ }
550
+
551
+ setPageSize(size){
552
+ if(size !== true){
553
+ size = parseInt(size);
554
+ }
555
+
556
+ if(size > 0){
557
+ this.size = size;
558
+ this.dispatchExternal("pageSizeChanged", size);
559
+ }
560
+
561
+ if(this.pageSizeSelect){
562
+ // this.pageSizeSelect.value = size;
563
+ this.generatePageSizeSelectList();
564
+ }
565
+
566
+ this.trackChanges();
567
+ }
568
+
569
+ _setPageCounter(totalRows, size, currentRow){
570
+ var content;
571
+
572
+ if(this.pageCounter){
573
+
574
+ if(this.mode === "remote"){
575
+ size = this.size;
576
+ currentRow = ((this.page - 1) * this.size) + 1;
577
+ totalRows = this.remoteRowCountEstimate;
578
+ }
579
+
580
+ content = this.pageCounter.call(this, size, currentRow, this.page, totalRows, this.max);
581
+
582
+ switch(typeof content){
583
+ case "object":
584
+ if(content instanceof Node){
585
+
586
+ //clear previous cell contents
587
+ while(this.pageCounterElement.firstChild) this.pageCounterElement.removeChild(this.pageCounterElement.firstChild);
588
+
589
+ this.pageCounterElement.appendChild(content);
590
+ }else{
591
+ this.pageCounterElement.innerHTML = "";
592
+
593
+ if(content != null){
594
+ console.warn("Page Counter Error - Page Counter has returned a type of object, the only valid page counter object return is an instance of Node, the page counter returned:", content);
595
+ }
596
+ }
597
+ break;
598
+ case "undefined":
599
+ this.pageCounterElement.innerHTML = "";
600
+ break;
601
+ default:
602
+ this.pageCounterElement.innerHTML = content;
603
+ }
604
+ }
605
+ }
606
+
607
+ //setup the pagination buttons
608
+ _setPageButtons(){
609
+ let leftSize = Math.floor((this.count-1) / 2);
610
+ let rightSize = Math.ceil((this.count-1) / 2);
611
+ let min = this.max - this.page + leftSize + 1 < this.count ? this.max-this.count+1: Math.max(this.page-leftSize,1);
612
+ let max = this.page <= rightSize? Math.min(this.count, this.max) :Math.min(this.page+rightSize, this.max);
613
+
614
+ while(this.pagesElement.firstChild) this.pagesElement.removeChild(this.pagesElement.firstChild);
615
+
616
+ if(this.page == 1){
617
+ this.firstBut.disabled = true;
618
+ this.prevBut.disabled = true;
619
+ }else{
620
+ this.firstBut.disabled = false;
621
+ this.prevBut.disabled = false;
622
+ }
623
+
624
+ if(this.page == this.max){
625
+ this.lastBut.disabled = true;
626
+ this.nextBut.disabled = true;
627
+ }else{
628
+ this.lastBut.disabled = false;
629
+ this.nextBut.disabled = false;
630
+ }
631
+
632
+ for(let i = min; i <= max; i++){
633
+ if(i>0 && i <= this.max){
634
+ this.pagesElement.appendChild(this._generatePageButton(i));
635
+ }
636
+ }
637
+
638
+ this.footerRedraw();
639
+ }
640
+
641
+ _generatePageButton(page){
642
+ var button = document.createElement("button");
643
+
644
+ button.classList.add("tabulator-page");
645
+ if(page == this.page){
646
+ button.classList.add("active");
647
+ }
648
+
649
+ button.setAttribute("type", "button");
650
+ button.setAttribute("role", "button");
651
+
652
+ this.langBind("pagination|page_title", (value) => {
653
+ button.setAttribute("aria-label", value + " " + page);
654
+ button.setAttribute("title", value + " " + page);
655
+ });
656
+
657
+ button.setAttribute("data-page", page);
658
+ button.textContent = page;
659
+
660
+ button.addEventListener("click", (e) => {
661
+ this.setPage(page);
662
+ });
663
+
664
+ return button;
665
+ }
666
+
667
+ //previous page
668
+ previousPage(){
669
+ if(this.page > 1){
670
+ this.page--;
671
+
672
+ this.trackChanges();
673
+
674
+ return this.trigger();
675
+
676
+ }else{
677
+ console.warn("Pagination Error - Previous page would be less than page 1:", 0);
678
+ return Promise.reject();
679
+ }
680
+ }
681
+
682
+ //next page
683
+ nextPage(){
684
+ if(this.page < this.max){
685
+ this.page++;
686
+
687
+ this.trackChanges();
688
+
689
+ return this.trigger();
690
+
691
+ }else{
692
+ if(!this.progressiveLoad){
693
+ console.warn("Pagination Error - Next page would be greater than maximum page of " + this.max + ":", this.max + 1);
694
+ }
695
+ return Promise.reject();
696
+ }
697
+ }
698
+
699
+ //return current page number
700
+ getPage(){
701
+ return this.page;
702
+ }
703
+
704
+ //return max page number
705
+ getPageMax(){
706
+ return this.max;
707
+ }
708
+
709
+ getPageSize(size){
710
+ return this.size;
711
+ }
712
+
713
+ getMode(){
714
+ return this.mode;
715
+ }
716
+
717
+ //return appropriate rows for current page
718
+ getRows(data){
719
+ var actualRowPageSize = 0,
720
+ output, start, end, actualStartRow;
721
+
722
+ var actualRows = data.filter((row) => {
723
+ return row.type === "row";
724
+ });
725
+
726
+ if(this.mode == "local"){
727
+ output = [];
728
+
729
+ this.setMaxRows(data.length);
730
+
731
+ if(this.size === true){
732
+ start = 0;
733
+ end = data.length;
734
+ }else{
735
+ start = this.size * (this.page - 1);
736
+ end = start + parseInt(this.size);
737
+ }
738
+
739
+ this._setPageButtons();
740
+
741
+ for(let i = start; i < end; i++){
742
+ let row = data[i];
743
+
744
+ if(row){
745
+ output.push(row);
746
+
747
+ if(row.type === "row"){
748
+ if(!actualStartRow){
749
+ actualStartRow = row;
750
+ }
751
+
752
+ actualRowPageSize++;
753
+ }
754
+ }
755
+ }
756
+
757
+ this._setPageCounter(actualRows.length, actualRowPageSize, actualStartRow ? (actualRows.indexOf(actualStartRow) + 1) : 0);
758
+
759
+ return output;
760
+ }else{
761
+ this._setPageButtons();
762
+ this._setPageCounter(actualRows.length);
763
+
764
+ return data.slice(0);
765
+ }
766
+ }
767
+
768
+ trigger(){
769
+ var left;
770
+
771
+ switch(this.mode){
772
+ case "local":
773
+ left = this.table.rowManager.scrollLeft;
774
+
775
+ this.refreshData();
776
+ this.table.rowManager.scrollHorizontal(left);
777
+
778
+ this.dispatchExternal("pageLoaded", this.getPage());
779
+
780
+ return Promise.resolve();
781
+
782
+ case "remote":
783
+ this.dataChanging = true;
784
+ return this.reloadData(null)
785
+ .finally(() => {
786
+ this.dataChanging = false;
787
+ });
788
+
789
+ case "progressive_load":
790
+ case "progressive_scroll":
791
+ return this.reloadData(null, true);
792
+
793
+ default:
794
+ console.warn("Pagination Error - no such pagination mode:", this.mode);
795
+ return Promise.reject();
796
+ }
797
+ }
798
+
799
+ _parseRemoteData(data){
800
+ var margin;
801
+
802
+ if(typeof data.last_page === "undefined"){
803
+ console.warn("Remote Pagination Error - Server response missing '" + (this.options("dataReceiveParams").last_page || "last_page") + "' property");
804
+ }
805
+
806
+ if(data.data){
807
+ this.max = parseInt(data.last_page) || 1;
808
+
809
+ this.remoteRowCountEstimate = typeof data.last_row !== "undefined" ? data.last_row : (data.last_page * this.size - (this.page == data.last_page ? (this.size - data.data.length) : 0));
810
+
811
+ if(this.progressiveLoad){
812
+ switch(this.mode){
813
+ case "progressive_load":
814
+
815
+ if(this.page == 1){
816
+ this.table.rowManager.setData(data.data, false, this.page == 1);
817
+ }else{
818
+ this.table.rowManager.addRows(data.data);
819
+ }
820
+
821
+ if(this.page < this.max){
822
+ setTimeout(() => {
823
+ this.nextPage();
824
+ }, this.table.options.progressiveLoadDelay);
825
+ }
826
+ break;
827
+
828
+ case "progressive_scroll":
829
+ data = this.page === 1 ? data.data : this.table.rowManager.getData().concat(data.data);
830
+
831
+ this.table.rowManager.setData(data, this.page !== 1, this.page == 1);
832
+
833
+ margin = this.table.options.progressiveLoadScrollMargin || (this.table.rowManager.element.clientHeight * 2);
834
+
835
+ if(this.table.rowManager.element.scrollHeight <= (this.table.rowManager.element.clientHeight + margin)){
836
+ if(this.page < this.max){
837
+ setTimeout(() => {
838
+ this.nextPage();
839
+ });
840
+ }
841
+ }
842
+ break;
843
+ }
844
+
845
+ return false;
846
+ }else{
847
+ // left = this.table.rowManager.scrollLeft;
848
+ this.dispatchExternal("pageLoaded", this.getPage());
849
+ // this.table.rowManager.scrollHorizontal(left);
850
+ // this.table.columnManager.scrollHorizontal(left);
851
+ }
852
+
853
+ }else{
854
+ console.warn("Remote Pagination Error - Server response missing '" + (this.options("dataReceiveParams").data || "data") + "' property");
855
+ }
856
+
857
+ return data.data;
858
+ }
859
+
860
+ //handle the footer element being redrawn
861
+ footerRedraw(){
862
+ var footer = this.table.footerManager.containerElement;
863
+
864
+ if((Math.ceil(footer.clientWidth) - footer.scrollWidth) < 0){
865
+ this.pagesElement.style.display = 'none';
866
+ }else{
867
+ this.pagesElement.style.display = '';
868
+
869
+ if((Math.ceil(footer.clientWidth) - footer.scrollWidth) < 0){
870
+ this.pagesElement.style.display = 'none';
871
+ }
872
+ }
873
+ }
874
+ }
875
+
876
+ Page.moduleName = "page";
877
+
878
+ //load defaults
879
+ Page.pageCounters = defaultPageCounters;
880
+
881
+ export default Page;