tabulator-tables 5.2.6 → 5.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/.eslintignore +3 -0
  2. package/.eslintrc.js +28 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -0
  4. package/.github/workflows/bad-files-check.yml +39 -0
  5. package/.github/workflows/lint-and-test.yml +31 -0
  6. package/README.md +18 -6
  7. package/bower.json +1 -1
  8. package/build/Bundler.js +77 -77
  9. package/dist/css/tabulator.css +12 -7
  10. package/dist/css/tabulator.css.map +1 -1
  11. package/dist/css/tabulator.min.css +1 -1
  12. package/dist/css/tabulator.min.css.map +1 -1
  13. package/dist/css/tabulator_bootstrap3.css +12 -7
  14. package/dist/css/tabulator_bootstrap3.css.map +1 -1
  15. package/dist/css/tabulator_bootstrap3.min.css +1 -1
  16. package/dist/css/tabulator_bootstrap3.min.css.map +1 -1
  17. package/dist/css/tabulator_bootstrap4.css +12 -7
  18. package/dist/css/tabulator_bootstrap4.css.map +1 -1
  19. package/dist/css/tabulator_bootstrap4.min.css +1 -1
  20. package/dist/css/tabulator_bootstrap4.min.css.map +1 -1
  21. package/dist/css/tabulator_bootstrap5.css +51 -46
  22. package/dist/css/tabulator_bootstrap5.css.map +1 -1
  23. package/dist/css/tabulator_bootstrap5.min.css +1 -1
  24. package/dist/css/tabulator_bootstrap5.min.css.map +1 -1
  25. package/dist/css/tabulator_bulma.css +12 -7
  26. package/dist/css/tabulator_bulma.css.map +1 -1
  27. package/dist/css/tabulator_bulma.min.css +1 -1
  28. package/dist/css/tabulator_bulma.min.css.map +1 -1
  29. package/dist/css/tabulator_materialize.css +12 -7
  30. package/dist/css/tabulator_materialize.css.map +1 -1
  31. package/dist/css/tabulator_materialize.min.css +1 -1
  32. package/dist/css/tabulator_materialize.min.css.map +1 -1
  33. package/dist/css/tabulator_midnight.css +12 -7
  34. package/dist/css/tabulator_midnight.css.map +1 -1
  35. package/dist/css/tabulator_midnight.min.css +1 -1
  36. package/dist/css/tabulator_midnight.min.css.map +1 -1
  37. package/dist/css/tabulator_modern.css +12 -7
  38. package/dist/css/tabulator_modern.css.map +1 -1
  39. package/dist/css/tabulator_modern.min.css +1 -1
  40. package/dist/css/tabulator_modern.min.css.map +1 -1
  41. package/dist/css/tabulator_semanticui.css +12 -7
  42. package/dist/css/tabulator_semanticui.css.map +1 -1
  43. package/dist/css/tabulator_semanticui.min.css +1 -1
  44. package/dist/css/tabulator_semanticui.min.css.map +1 -1
  45. package/dist/css/tabulator_simple.css +12 -7
  46. package/dist/css/tabulator_simple.css.map +1 -1
  47. package/dist/css/tabulator_simple.min.css +1 -1
  48. package/dist/css/tabulator_simple.min.css.map +1 -1
  49. package/dist/css/tabulator_site.css +12 -7
  50. package/dist/css/tabulator_site.css.map +1 -1
  51. package/dist/css/tabulator_site.min.css +1 -1
  52. package/dist/css/tabulator_site.min.css.map +1 -1
  53. package/dist/js/jquery_wrapper.js +37 -37
  54. package/dist/js/tabulator.js +1506 -706
  55. package/dist/js/tabulator.js.map +1 -1
  56. package/dist/js/tabulator.min.js +2 -2
  57. package/dist/js/tabulator.min.js.map +1 -1
  58. package/dist/js/tabulator_esm.js +4226 -3460
  59. package/dist/js/tabulator_esm.js.map +1 -1
  60. package/dist/js/tabulator_esm.min.js +2 -2
  61. package/dist/js/tabulator_esm.min.js.map +1 -1
  62. package/package.json +4 -1
  63. package/src/js/builds/jquery_wrapper.js +37 -37
  64. package/src/js/core/ColumnManager.js +270 -232
  65. package/src/js/core/CoreFeature.js +16 -2
  66. package/src/js/core/FooterManager.js +10 -10
  67. package/src/js/core/Module.js +8 -8
  68. package/src/js/core/RowManager.js +81 -88
  69. package/src/js/core/Tabulator.js +89 -72
  70. package/src/js/core/TabulatorFull.js +1 -1
  71. package/src/js/core/cell/Cell.js +15 -16
  72. package/src/js/core/cell/CellComponent.js +2 -2
  73. package/src/js/core/column/Column.js +81 -68
  74. package/src/js/core/column/ColumnComponent.js +4 -4
  75. package/src/js/core/column/defaults/options.js +1 -1
  76. package/src/js/core/defaults/options.js +4 -2
  77. package/src/js/core/rendering/Renderer.js +19 -19
  78. package/src/js/core/rendering/renderers/BasicHorizontal.js +1 -2
  79. package/src/js/core/rendering/renderers/BasicVertical.js +1 -1
  80. package/src/js/core/rendering/renderers/VirtualDomHorizontal.js +42 -58
  81. package/src/js/core/rendering/renderers/VirtualDomVertical.js +31 -22
  82. package/src/js/core/row/Row.js +32 -8
  83. package/src/js/core/row/RowComponent.js +8 -4
  84. package/src/js/core/tools/Alert.js +44 -45
  85. package/src/js/core/tools/ComponentFunctionBinder.js +4 -2
  86. package/src/js/core/tools/DataLoader.js +3 -3
  87. package/src/js/core/tools/DeprecationAdvisor.js +47 -0
  88. package/src/js/core/tools/ExternalEventBus.js +5 -5
  89. package/src/js/core/tools/InteractionMonitor.js +34 -33
  90. package/src/js/core/tools/InternalEventBus.js +5 -5
  91. package/src/js/core/tools/ModuleBinder.js +6 -6
  92. package/src/js/core/tools/OptionsList.js +4 -4
  93. package/src/js/core/tools/Popup.js +215 -189
  94. package/src/js/modules/Accessor/Accessor.js +16 -16
  95. package/src/js/modules/Accessor/defaults/accessors.js +1 -1
  96. package/src/js/modules/Ajax/Ajax.js +7 -7
  97. package/src/js/modules/Ajax/defaults/loaderPromise.js +19 -19
  98. package/src/js/modules/Ajax/defaults/urlGenerator.js +1 -1
  99. package/src/js/modules/Clipboard/Clipboard.js +23 -23
  100. package/src/js/modules/Clipboard/defaults/pasteParsers.js +0 -2
  101. package/src/js/modules/ColumnCalcs/CalcComponent.js +2 -2
  102. package/src/js/modules/ColumnCalcs/ColumnCalcs.js +55 -51
  103. package/src/js/modules/ColumnCalcs/defaults/calculations.js +1 -1
  104. package/src/js/modules/DataTree/DataTree.js +24 -15
  105. package/src/js/modules/Download/Download.js +15 -8
  106. package/src/js/modules/Download/defaults/downloaders/csv.js +28 -28
  107. package/src/js/modules/Download/defaults/downloaders/html.js +2 -2
  108. package/src/js/modules/Download/defaults/downloaders/json.js +14 -14
  109. package/src/js/modules/Download/defaults/downloaders/jsonLines.js +1 -1
  110. package/src/js/modules/Download/defaults/downloaders/pdf.js +17 -19
  111. package/src/js/modules/Download/defaults/downloaders/xlsx.js +2 -2
  112. package/src/js/modules/Edit/Edit.js +219 -201
  113. package/src/js/modules/Edit/List.js +1026 -991
  114. package/src/js/modules/Edit/defaults/editors/autocomplete.js +3 -3
  115. package/src/js/modules/Edit/defaults/editors/date.js +110 -0
  116. package/src/js/modules/Edit/defaults/editors/datetime.js +97 -0
  117. package/src/js/modules/Edit/defaults/editors/input.js +7 -7
  118. package/src/js/modules/Edit/defaults/editors/list.js +2 -2
  119. package/src/js/modules/Edit/defaults/editors/number.js +12 -12
  120. package/src/js/modules/Edit/defaults/editors/progress.js +11 -11
  121. package/src/js/modules/Edit/defaults/editors/range.js +5 -5
  122. package/src/js/modules/Edit/defaults/editors/select.js +3 -3
  123. package/src/js/modules/Edit/defaults/editors/star.js +9 -9
  124. package/src/js/modules/Edit/defaults/editors/textarea.js +97 -92
  125. package/src/js/modules/Edit/defaults/editors/tickCross.js +1 -3
  126. package/src/js/modules/Edit/defaults/editors/time.js +98 -0
  127. package/src/js/modules/Edit/defaults/editors.js +8 -2
  128. package/src/js/modules/Edit/inputMask.js +19 -26
  129. package/src/js/modules/Export/Export.js +69 -65
  130. package/src/js/modules/Filter/Filter.js +88 -95
  131. package/src/js/modules/Format/Format.js +24 -26
  132. package/src/js/modules/Format/defaults/formatters/buttonCross.js +1 -1
  133. package/src/js/modules/Format/defaults/formatters/buttonTick.js +1 -1
  134. package/src/js/modules/Format/defaults/formatters/color.js +1 -1
  135. package/src/js/modules/Format/defaults/formatters/datetime.js +7 -7
  136. package/src/js/modules/Format/defaults/formatters/datetimediff.js +7 -7
  137. package/src/js/modules/Format/defaults/formatters/handle.js +1 -1
  138. package/src/js/modules/Format/defaults/formatters/html.js +1 -1
  139. package/src/js/modules/Format/defaults/formatters/image.js +9 -9
  140. package/src/js/modules/Format/defaults/formatters/link.js +10 -10
  141. package/src/js/modules/Format/defaults/formatters/lookup.js +1 -1
  142. package/src/js/modules/Format/defaults/formatters/money.js +1 -1
  143. package/src/js/modules/Format/defaults/formatters/plaintext.js +1 -1
  144. package/src/js/modules/Format/defaults/formatters/progress.js +41 -42
  145. package/src/js/modules/Format/defaults/formatters/responsiveCollapse.js +3 -3
  146. package/src/js/modules/Format/defaults/formatters/rowSelection.js +1 -1
  147. package/src/js/modules/Format/defaults/formatters/rownum.js +9 -2
  148. package/src/js/modules/Format/defaults/formatters/star.js +1 -1
  149. package/src/js/modules/Format/defaults/formatters/textarea.js +1 -1
  150. package/src/js/modules/Format/defaults/formatters/tickCross.js +1 -1
  151. package/src/js/modules/Format/defaults/formatters/traffic.js +14 -14
  152. package/src/js/modules/FrozenColumns/FrozenColumns.js +6 -8
  153. package/src/js/modules/FrozenRows/FrozenRows.js +37 -7
  154. package/src/js/modules/GroupRows/Group.js +7 -7
  155. package/src/js/modules/GroupRows/GroupComponent.js +2 -2
  156. package/src/js/modules/GroupRows/GroupRows.js +34 -11
  157. package/src/js/modules/History/History.js +2 -2
  158. package/src/js/modules/HtmlTableImport/HtmlTableImport.js +3 -6
  159. package/src/js/modules/Import/Import.js +158 -159
  160. package/src/js/modules/Import/defaults/importers/array.js +5 -0
  161. package/src/js/modules/Import/defaults/importers/csv.js +49 -49
  162. package/src/js/modules/Import/defaults/importers/json.js +6 -6
  163. package/src/js/modules/Import/defaults/importers.js +2 -0
  164. package/src/js/modules/Interaction/Interaction.js +41 -42
  165. package/src/js/modules/Keybindings/Keybindings.js +14 -14
  166. package/src/js/modules/Keybindings/defaults/actions.js +1 -2
  167. package/src/js/modules/Layout/Layout.js +4 -5
  168. package/src/js/modules/Layout/defaults/modes/fitColumns.js +13 -16
  169. package/src/js/modules/Layout/defaults/modes/fitData.js +6 -4
  170. package/src/js/modules/Layout/defaults/modes/fitDataGeneral.js +2 -2
  171. package/src/js/modules/Layout/defaults/modes/fitDataStretch.js +2 -2
  172. package/src/js/modules/Localize/Localize.js +7 -7
  173. package/src/js/modules/Menu/Menu.js +8 -11
  174. package/src/js/modules/MoveColumns/MoveColumns.js +3 -6
  175. package/src/js/modules/MoveRows/MoveRows.js +30 -36
  176. package/src/js/modules/Mutator/Mutator.js +9 -9
  177. package/src/js/modules/Page/Page.js +73 -80
  178. package/src/js/modules/Page/defaults/pageCounters/pages.js +2 -2
  179. package/src/js/modules/Page/defaults/pageCounters/rows.js +1 -1
  180. package/src/js/modules/Persistence/Persistence.js +40 -44
  181. package/src/js/modules/Persistence/defaults/readers.js +1 -1
  182. package/src/js/modules/Popup/Popup.js +4 -5
  183. package/src/js/modules/Print/Print.js +2 -2
  184. package/src/js/modules/ReactiveData/ReactiveData.js +178 -115
  185. package/src/js/modules/ResizeColumns/ResizeColumns.js +3 -3
  186. package/src/js/modules/ResizeRows/ResizeRows.js +1 -1
  187. package/src/js/modules/ResizeTable/ResizeTable.js +77 -46
  188. package/src/js/modules/ResponsiveLayout/ResponsiveLayout.js +3 -5
  189. package/src/js/modules/SelectRow/SelectRow.js +26 -28
  190. package/src/js/modules/Sort/Sort.js +110 -79
  191. package/src/js/modules/Sort/defaults/sorters/alphanum.js +1 -1
  192. package/src/js/modules/Sort/defaults/sorters/array.js +24 -28
  193. package/src/js/modules/Sort/defaults/sorters/boolean.js +1 -1
  194. package/src/js/modules/Sort/defaults/sorters/date.js +1 -1
  195. package/src/js/modules/Sort/defaults/sorters/datetime.js +13 -13
  196. package/src/js/modules/Sort/defaults/sorters/exists.js +1 -1
  197. package/src/js/modules/Sort/defaults/sorters/number.js +1 -1
  198. package/src/js/modules/Sort/defaults/sorters/string.js +7 -7
  199. package/src/js/modules/Sort/defaults/sorters/time.js +1 -1
  200. package/src/js/modules/Tooltip/Tooltip.js +5 -7
  201. package/src/js/modules/Validate/Validate.js +10 -13
  202. package/src/js/modules/Validate/defaults/validators.js +8 -3
  203. package/src/scss/tabulator.scss +28 -17
  204. package/src/scss/themes/bootstrap/functions4.scss +1 -1
  205. package/src/scss/themes/bootstrap/tabulator_bootstrap3.scss +8 -8
  206. package/src/scss/themes/bootstrap/tabulator_bootstrap4.scss +8 -8
  207. package/src/scss/themes/bootstrap/tabulator_bootstrap5.scss +25 -25
  208. package/src/scss/themes/bootstrap/variables5.scss +4 -4
  209. package/src/scss/themes/bulma/tabulator_bulma.scss +7 -7
  210. package/src/scss/themes/materialize/tabulator_materialize.scss +6 -6
  211. package/src/scss/themes/materialize/variables.scss +1 -1
  212. package/src/scss/themes/semanticui/tabulator_semanticui.scss +7 -7
  213. package/src/scss/themes/tabulator_midnight.scss +7 -7
  214. package/src/scss/themes/tabulator_modern.scss +14 -14
  215. package/src/scss/themes/tabulator_simple.scss +8 -8
  216. package/src/scss/themes/tabulator_site.scss +15 -15
@@ -1,124 +1,155 @@
1
1
  import Module from '../../core/Module.js';
2
2
 
3
3
  class ResizeTable extends Module{
4
-
4
+
5
5
  constructor(table){
6
6
  super(table);
7
-
7
+
8
8
  this.binding = false;
9
- this.observer = false;
9
+ this.visibilityObserver = false;
10
+ this.resizeObserver = false;
10
11
  this.containerObserver = false;
11
-
12
+
12
13
  this.tableHeight = 0;
13
14
  this.tableWidth = 0;
14
15
  this.containerHeight = 0;
15
16
  this.containerWidth = 0;
16
-
17
+
17
18
  this.autoResize = false;
18
-
19
+
20
+ this.visible = false;
21
+
22
+ this.initialized = false;
23
+ this.initialRedraw = false;
24
+
19
25
  this.registerTableOption("autoResize", true); //auto resize table
20
26
  }
21
-
27
+
22
28
  initialize(){
23
29
  if(this.table.options.autoResize){
24
30
  var table = this.table,
25
31
  tableStyle;
26
-
32
+
27
33
  this.tableHeight = table.element.clientHeight;
28
34
  this.tableWidth = table.element.clientWidth;
29
-
35
+
30
36
  if(table.element.parentNode){
31
37
  this.containerHeight = table.element.parentNode.clientHeight;
32
38
  this.containerWidth = table.element.parentNode.clientWidth;
33
39
  }
34
-
35
- if(typeof ResizeObserver !== "undefined" && table.rowManager.getRenderMode() === "virtual"){
36
-
40
+
41
+ if(typeof IntersectionObserver !== "undefined" && typeof ResizeObserver !== "undefined" && table.rowManager.getRenderMode() === "virtual"){
42
+
43
+ this.initializeVisibilityObserver();
44
+
37
45
  this.autoResize = true;
38
-
39
- this.observer = new ResizeObserver((entry) => {
46
+
47
+ this.resizeObserver = new ResizeObserver((entry) => {
40
48
  if(!table.browserMobile || (table.browserMobile &&!table.modules.edit.currentCell)){
41
-
49
+
42
50
  var nodeHeight = Math.floor(entry[0].contentRect.height);
43
51
  var nodeWidth = Math.floor(entry[0].contentRect.width);
44
-
52
+
45
53
  if(this.tableHeight != nodeHeight || this.tableWidth != nodeWidth){
46
54
  this.tableHeight = nodeHeight;
47
55
  this.tableWidth = nodeWidth;
48
-
56
+
49
57
  if(table.element.parentNode){
50
58
  this.containerHeight = table.element.parentNode.clientHeight;
51
59
  this.containerWidth = table.element.parentNode.clientWidth;
52
60
  }
53
-
54
- this.table.columnManager.renderer.rerenderColumns(true);
55
-
56
- table.redraw();
61
+
62
+ this.redrawTable();
57
63
  }
58
-
59
64
  }
60
65
  });
61
-
62
- this.observer.observe(table.element);
63
-
66
+
67
+ this.resizeObserver.observe(table.element);
68
+
64
69
  tableStyle = window.getComputedStyle(table.element);
65
-
70
+
66
71
  if(this.table.element.parentNode && !this.table.rowManager.fixedHeight && (tableStyle.getPropertyValue("max-height") || tableStyle.getPropertyValue("min-height"))){
67
-
72
+
68
73
  this.containerObserver = new ResizeObserver((entry) => {
69
74
  if(!table.browserMobile || (table.browserMobile &&!table.modules.edit.currentCell)){
70
-
75
+
71
76
  var nodeHeight = Math.floor(entry[0].contentRect.height);
72
77
  var nodeWidth = Math.floor(entry[0].contentRect.width);
73
-
78
+
74
79
  if(this.containerHeight != nodeHeight || this.containerWidth != nodeWidth){
75
80
  this.containerHeight = nodeHeight;
76
81
  this.containerWidth = nodeWidth;
77
82
  this.tableHeight = table.element.clientHeight;
78
83
  this.tableWidth = table.element.clientWidth;
79
84
  }
80
-
81
- table.columnManager.renderer.rerenderColumns(true);
82
-
83
- table.redraw();
85
+
86
+ this.redrawTable();
84
87
  }
85
88
  });
86
-
89
+
87
90
  this.containerObserver.observe(this.table.element.parentNode);
88
91
  }
89
-
92
+
90
93
  this.subscribe("table-resize", this.tableResized.bind(this));
91
-
94
+
92
95
  }else{
93
96
  this.binding = function(){
94
97
  if(!table.browserMobile || (table.browserMobile && !table.modules.edit.currentCell)){
95
-
96
- table.columnManager.renderer.rerenderColumns(true);
97
-
98
+ table.columnManager.rerenderColumns(true);
98
99
  table.redraw();
99
100
  }
100
101
  };
101
-
102
+
102
103
  window.addEventListener("resize", this.binding);
103
104
  }
104
-
105
+
105
106
  this.subscribe("table-destroy", this.clearBindings.bind(this));
106
107
  }
107
108
  }
109
+
110
+ initializeVisibilityObserver(){
111
+ this.visibilityObserver = new IntersectionObserver((entries) => {
112
+ this.visible = entries[0].isIntersecting;
113
+
114
+ if(!this.initialized){
115
+ this.initialized = true;
116
+ this.initialRedraw = !this.visible;
117
+ }
108
118
 
119
+ if(this.visible){
120
+ this.redrawTable(this.initialRedraw);
121
+ this.initialRedraw = false;
122
+ }
123
+
124
+ });
125
+
126
+ this.visibilityObserver.observe(this.table.element);
127
+ }
128
+
129
+ redrawTable(force){
130
+ if(this.initialized && this.visible){
131
+ this.table.columnManager.rerenderColumns(true);
132
+ this.table.redraw(force);
133
+ }
134
+ }
135
+
109
136
  tableResized(){
110
137
  this.table.rowManager.redraw();
111
138
  }
112
-
139
+
113
140
  clearBindings(){
114
141
  if(this.binding){
115
142
  window.removeEventListener("resize", this.binding);
116
143
  }
117
-
118
- if(this.observer){
119
- this.observer.unobserve(this.table.element);
144
+
145
+ if(this.resizeObserver){
146
+ this.resizeObserver.unobserve(this.table.element);
120
147
  }
121
-
148
+
149
+ if(this.visibilityObserver){
150
+ this.visibilityObserver.unobserve(this.table.element);
151
+ }
152
+
122
153
  if(this.containerObserver){
123
154
  this.containerObserver.unobserve(this.table.element.parentNode);
124
155
  }
@@ -23,9 +23,6 @@ class ResponsiveLayout extends Module{
23
23
 
24
24
  //generate responsive columns list
25
25
  initialize(){
26
- var self = this,
27
- columns = [];
28
-
29
26
  if(this.table.options.responsiveLayout){
30
27
  this.subscribe("column-layout", this.initializeColumn.bind(this));
31
28
  this.subscribe("column-show", this.updateColumnVisibility.bind(this));
@@ -36,8 +33,9 @@ class ResponsiveLayout extends Module{
36
33
  this.subscribe("column-delete", this.initializeResponsivity.bind(this));
37
34
 
38
35
  this.subscribe("table-redrawing", this.tableRedraw.bind(this));
39
-
36
+
40
37
  if(this.table.options.responsiveLayout === "collapse"){
38
+ this.subscribe("row-data-changed", this.generateCollapsedRowContent.bind(this));
41
39
  this.subscribe("row-init", this.initializeRow.bind(this));
42
40
  this.subscribe("row-layout", this.layoutRow.bind(this));
43
41
  }
@@ -344,4 +342,4 @@ class ResponsiveLayout extends Module{
344
342
 
345
343
  ResponsiveLayout.moduleName = "responsiveLayout";
346
344
 
347
- export default ResponsiveLayout;
345
+ export default ResponsiveLayout;
@@ -15,7 +15,7 @@ class SelectRow extends Module{
15
15
  this.registerTableOption("selectableRangeMode", "drag"); //highlight rows on hover
16
16
  this.registerTableOption("selectableRollingSelection", true); //roll selection once maximum number of selectable rows is reached
17
17
  this.registerTableOption("selectablePersistence", true); // maintain selection when table view is updated
18
- this.registerTableOption("selectableCheck", function(data, row){return true;}); //check wheather row is selectable
18
+ this.registerTableOption("selectableCheck", function(data, row){return true;}); //check whether row is selectable
19
19
 
20
20
  this.registerTableFunction("selectRow", this.selectRows.bind(this));
21
21
  this.registerTableFunction("deselectRow", this.deselectRows.bind(this));
@@ -173,7 +173,7 @@ class SelectRow extends Module{
173
173
 
174
174
  if(this.table.options.selectable !== true){
175
175
  if(toggledRows.length > this.table.options.selectable){
176
- toggledRows = toggledRows.slice(0, this.table.options.selectable)
176
+ toggledRows = toggledRows.slice(0, this.table.options.selectable);
177
177
  }
178
178
  }
179
179
 
@@ -208,46 +208,44 @@ class SelectRow extends Module{
208
208
 
209
209
  switch(typeof rows){
210
210
  case "undefined":
211
- this.table.rowManager.rows.forEach((row) => {
212
- this._selectRow(row, true, true);
213
- });
211
+ this.table.rowManager.rows.forEach((row) => {
212
+ this._selectRow(row, true, true);
213
+ });
214
214
 
215
- this._rowSelectionChanged();
216
- break;
215
+ this._rowSelectionChanged();
216
+ break;
217
217
 
218
218
  case "string":
219
219
 
220
- rowMatch = this.table.rowManager.findRow(rows);
220
+ rowMatch = this.table.rowManager.findRow(rows);
221
221
 
222
- if(rowMatch){
223
- this._selectRow(rowMatch, true, true);
224
- }else{
225
- this.table.rowManager.getRows(rows).forEach((row) => {
226
- this._selectRow(row, true, true);
227
- });
228
- }
222
+ if(rowMatch){
223
+ this._selectRow(rowMatch, true, true);
224
+ }else{
225
+ this.table.rowManager.getRows(rows).forEach((row) => {
226
+ this._selectRow(row, true, true);
227
+ });
228
+ }
229
229
 
230
- this._rowSelectionChanged();
231
- break;
230
+ this._rowSelectionChanged();
231
+ break;
232
232
 
233
233
  default:
234
- if(Array.isArray(rows)){
235
- rows.forEach((row) => {
236
- this._selectRow(row, true, true);
237
- });
234
+ if(Array.isArray(rows)){
235
+ rows.forEach((row) => {
236
+ this._selectRow(row, true, true);
237
+ });
238
238
 
239
- this._rowSelectionChanged();
240
- }else{
241
- this._selectRow(rows, false, true);
242
- }
243
- break;
239
+ this._rowSelectionChanged();
240
+ }else{
241
+ this._selectRow(rows, false, true);
242
+ }
243
+ break;
244
244
  }
245
245
  }
246
246
 
247
247
  //select an individual row
248
248
  _selectRow(rowInfo, silent, force){
249
- var index;
250
-
251
249
  //handle max row count
252
250
  if(!isNaN(this.table.options.selectable) && this.table.options.selectable !== true && !force){
253
251
  if(this.selectedRows.length >= this.table.options.selectable){
@@ -7,56 +7,56 @@ class Sort extends Module{
7
7
  constructor(table){
8
8
  super(table);
9
9
 
10
- this.sortList = []; //holder current sort
11
- this.changed = false; //has the sort changed since last render
10
+ this.sortList = []; //holder current sort
11
+ this.changed = false; //has the sort changed since last render
12
12
 
13
- this.registerTableOption("sortMode", "local"); //local or remote sorting
13
+ this.registerTableOption("sortMode", "local"); //local or remote sorting
14
14
 
15
- this.registerTableOption("initialSort", false); //initial sorting criteria
16
- this.registerTableOption("columnHeaderSortMulti", true); //multiple or single column sorting
17
- this.registerTableOption("sortOrderReverse", false); //reverse internal sort ordering
18
- this.registerTableOption("headerSortElement", "<div class='tabulator-arrow'></div>"); //header sort element
15
+ this.registerTableOption("initialSort", false); //initial sorting criteria
16
+ this.registerTableOption("columnHeaderSortMulti", true); //multiple or single column sorting
17
+ this.registerTableOption("sortOrderReverse", false); //reverse internal sort ordering
18
+ this.registerTableOption("headerSortElement", "<div class='tabulator-arrow'></div>"); //header sort element
19
19
 
20
- this.registerColumnOption("sorter");
21
- this.registerColumnOption("sorterParams");
20
+ this.registerColumnOption("sorter");
21
+ this.registerColumnOption("sorterParams");
22
22
 
23
- this.registerColumnOption("headerSort", true);
24
- this.registerColumnOption("headerSortStartingDir");
25
- this.registerColumnOption("headerSortTristate");
23
+ this.registerColumnOption("headerSort", true);
24
+ this.registerColumnOption("headerSortStartingDir");
25
+ this.registerColumnOption("headerSortTristate");
26
26
 
27
- }
27
+ }
28
28
 
29
- initialize(){
30
- this.subscribe("column-layout", this.initializeColumn.bind(this));
31
- this.subscribe("table-built", this.tableBuilt.bind(this));
32
- this.registerDataHandler(this.sort.bind(this), 20);
29
+ initialize(){
30
+ this.subscribe("column-layout", this.initializeColumn.bind(this));
31
+ this.subscribe("table-built", this.tableBuilt.bind(this));
32
+ this.registerDataHandler(this.sort.bind(this), 20);
33
33
 
34
- this.registerTableFunction("setSort", this.userSetSort.bind(this));
35
- this.registerTableFunction("getSorters", this.getSort.bind(this));
36
- this.registerTableFunction("clearSort", this.clearSort.bind(this));
34
+ this.registerTableFunction("setSort", this.userSetSort.bind(this));
35
+ this.registerTableFunction("getSorters", this.getSort.bind(this));
36
+ this.registerTableFunction("clearSort", this.clearSort.bind(this));
37
37
 
38
- if(this.table.options.sortMode === "remote"){
39
- this.subscribe("data-params", this.remoteSortParams.bind(this));
40
- }
41
- }
38
+ if(this.table.options.sortMode === "remote"){
39
+ this.subscribe("data-params", this.remoteSortParams.bind(this));
40
+ }
41
+ }
42
42
 
43
- tableBuilt(){
44
- if(this.table.options.initialSort){
45
- this.setSort(this.table.options.initialSort);
46
- }
47
- }
43
+ tableBuilt(){
44
+ if(this.table.options.initialSort){
45
+ this.setSort(this.table.options.initialSort);
46
+ }
47
+ }
48
48
 
49
- remoteSortParams(data, config, silent, params){
50
- var sorters = this.getSort();
49
+ remoteSortParams(data, config, silent, params){
50
+ var sorters = this.getSort();
51
51
 
52
- sorters.forEach((item) => {
53
- delete item.column;
54
- });
52
+ sorters.forEach((item) => {
53
+ delete item.column;
54
+ });
55
55
 
56
- params.sort = sorters;
56
+ params.sort = sorters;
57
57
 
58
- return params;
59
- }
58
+ return params;
59
+ }
60
60
 
61
61
 
62
62
  ///////////////////////////////////
@@ -88,16 +88,16 @@ class Sort extends Module{
88
88
 
89
89
  switch(typeof column.definition.sorter){
90
90
  case "string":
91
- if(Sort.sorters[column.definition.sorter]){
92
- sorter = Sort.sorters[column.definition.sorter];
93
- }else{
94
- console.warn("Sort Error - No such sorter found: ", column.definition.sorter);
95
- }
96
- break;
91
+ if(Sort.sorters[column.definition.sorter]){
92
+ sorter = Sort.sorters[column.definition.sorter];
93
+ }else{
94
+ console.warn("Sort Error - No such sorter found: ", column.definition.sorter);
95
+ }
96
+ break;
97
97
 
98
98
  case "function":
99
- sorter = column.definition.sorter;
100
- break;
99
+ sorter = column.definition.sorter;
100
+ break;
101
101
  }
102
102
 
103
103
  column.modules.sort = {
@@ -117,10 +117,17 @@ class Sort extends Module{
117
117
  arrowEl = document.createElement("div");
118
118
  arrowEl.classList.add("tabulator-col-sorter");
119
119
 
120
- if(typeof this.table.options.headerSortElement == "object"){
121
- arrowEl.appendChild(this.table.options.headerSortElement);
122
- }else{
123
- arrowEl.innerHTML = this.table.options.headerSortElement;
120
+ switch(this.table.options.headerSortElement){
121
+ case "function":
122
+ //do nothing
123
+ break;
124
+
125
+ case "object":
126
+ arrowEl.appendChild(this.table.options.headerSortElement);
127
+ break;
128
+
129
+ default:
130
+ arrowEl.innerHTML = this.table.options.headerSortElement;
124
131
  }
125
132
 
126
133
  //create sorter arrow
@@ -128,6 +135,8 @@ class Sort extends Module{
128
135
 
129
136
  column.modules.sort.element = arrowEl;
130
137
 
138
+ this.setColumnHeaderSortIcon(column, "none");
139
+
131
140
  //sort on click
132
141
  colEl.addEventListener("click", (e) => {
133
142
  var dir = "",
@@ -148,15 +157,15 @@ class Sort extends Module{
148
157
  }else{
149
158
  switch(column.modules.sort.dir){
150
159
  case "asc":
151
- dir = "desc";
152
- break;
160
+ dir = "desc";
161
+ break;
153
162
 
154
163
  case "desc":
155
- dir = "asc";
156
- break;
164
+ dir = "asc";
165
+ break;
157
166
 
158
167
  default:
159
- dir = column.modules.sort.startingDir;
168
+ dir = column.modules.sort.startingDir;
160
169
  }
161
170
  }
162
171
 
@@ -285,22 +294,22 @@ class Sort extends Module{
285
294
 
286
295
  switch(typeof value){
287
296
  case "undefined":
288
- sorter = "string";
289
- break;
297
+ sorter = "string";
298
+ break;
290
299
 
291
300
  case "boolean":
292
- sorter = "boolean";
293
- break;
301
+ sorter = "boolean";
302
+ break;
294
303
 
295
304
  default:
296
- if(!isNaN(value) && value !== ""){
297
- sorter = "number";
298
- }else{
299
- if(value.match(/((^[0-9]+[a-z]+)|(^[a-z]+[0-9]+))+$/i)){
300
- sorter = "alphanum";
305
+ if(!isNaN(value) && value !== ""){
306
+ sorter = "number";
307
+ }else{
308
+ if(value.match(/((^[0-9]+[a-z]+)|(^[a-z]+[0-9]+))+$/i)){
309
+ sorter = "alphanum";
310
+ }
301
311
  }
302
- }
303
- break;
312
+ break;
304
313
  }
305
314
  }
306
315
  }
@@ -313,8 +322,7 @@ class Sort extends Module{
313
322
  var self = this,
314
323
  sortList = this.table.options.sortOrderReverse ? self.sortList.slice().reverse() : self.sortList,
315
324
  sortListActual = [],
316
- rowComponents = [],
317
- lastSort;
325
+ rowComponents = [];
318
326
 
319
327
  if(this.subscribedExternal("dataSorting")){
320
328
  this.dispatchExternal("dataSorting", self.getSort());
@@ -326,21 +334,25 @@ class Sort extends Module{
326
334
 
327
335
  //build list of valid sorters and trigger column specific callbacks before sort begins
328
336
  sortList.forEach(function(item, i){
329
- var sortObj = item.column.modules.sort;
337
+ var sortObj;
330
338
 
331
- if(item.column && sortObj){
339
+ if(item.column){
340
+ sortObj = item.column.modules.sort;
332
341
 
333
- //if no sorter has been defined, take a guess
334
- if(!sortObj.sorter){
335
- sortObj.sorter = self.findSorter(item.column);
336
- }
342
+ if(sortObj){
337
343
 
338
- item.params = typeof sortObj.params === "function" ? sortObj.params(item.column.getComponent(), item.dir) : sortObj.params;
344
+ //if no sorter has been defined, take a guess
345
+ if(!sortObj.sorter){
346
+ sortObj.sorter = self.findSorter(item.column);
347
+ }
339
348
 
340
- sortListActual.push(item);
341
- }
349
+ item.params = typeof sortObj.params === "function" ? sortObj.params(item.column.getComponent(), item.dir) : sortObj.params;
342
350
 
343
- self.setColumnHeader(item.column, item.dir);
351
+ sortListActual.push(item);
352
+ }
353
+
354
+ self.setColumnHeader(item.column, item.dir);
355
+ }
344
356
  });
345
357
 
346
358
  //sort data
@@ -367,10 +379,11 @@ class Sort extends Module{
367
379
 
368
380
  //clear sort arrows on columns
369
381
  clearColumnHeaders(){
370
- this.table.columnManager.getRealColumns().forEach(function(column){
382
+ this.table.columnManager.getRealColumns().forEach((column) => {
371
383
  if(column.modules.sort){
372
384
  column.modules.sort.dir = "none";
373
385
  column.getElement().setAttribute("aria-sort", "none");
386
+ this.setColumnHeaderSortIcon(column, "none");
374
387
  }
375
388
  });
376
389
  }
@@ -379,6 +392,24 @@ class Sort extends Module{
379
392
  setColumnHeader(column, dir){
380
393
  column.modules.sort.dir = dir;
381
394
  column.getElement().setAttribute("aria-sort", dir === "asc" ? "ascending" : "descending");
395
+ this.setColumnHeaderSortIcon(column, dir);
396
+ }
397
+
398
+ setColumnHeaderSortIcon(column, dir){
399
+ var sortEl = column.modules.sort.element,
400
+ arrowEl;
401
+
402
+ if(typeof this.table.options.headerSortElement === "function"){
403
+ while(sortEl.firstChild) sortEl.removeChild(sortEl.firstChild);
404
+
405
+ arrowEl = this.table.options.headerSortElement.call(this.table, column.getComponent(), dir);
406
+
407
+ if(typeof arrowEl === "object"){
408
+ sortEl.appendChild(arrowEl);
409
+ }else{
410
+ sortEl.innerHTML = arrowEl;
411
+ }
412
+ }
382
413
  }
383
414
 
384
415
  //sort each item in sort list
@@ -404,7 +435,7 @@ class Sort extends Module{
404
435
 
405
436
  //process individual rows for a sort function on active data
406
437
  _sortRow(a, b, column, dir, params){
407
- var el1Comp, el2Comp, colComp;
438
+ var el1Comp, el2Comp;
408
439
 
409
440
  //switch elements depending on search direction
410
441
  var el1 = dir == "asc" ? a : b;
@@ -41,4 +41,4 @@ export default function(as, bs, aRow, bRow, column, dir, params){
41
41
  }
42
42
 
43
43
  return emptyAlign;
44
- };
44
+ }