tabulator-tables 5.2.7 → 5.3.2

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 (214) hide show
  1. package/.eslintignore +3 -0
  2. package/.eslintrc.js +28 -0
  3. package/.github/workflows/bad-files-check.yml +39 -0
  4. package/.github/workflows/lint-and-test.yml +31 -0
  5. package/README.md +3 -3
  6. package/bower.json +1 -1
  7. package/build/Bundler.js +77 -77
  8. package/dist/css/tabulator.css +12 -7
  9. package/dist/css/tabulator.css.map +1 -1
  10. package/dist/css/tabulator.min.css +1 -1
  11. package/dist/css/tabulator.min.css.map +1 -1
  12. package/dist/css/tabulator_bootstrap3.css +12 -7
  13. package/dist/css/tabulator_bootstrap3.css.map +1 -1
  14. package/dist/css/tabulator_bootstrap3.min.css +1 -1
  15. package/dist/css/tabulator_bootstrap3.min.css.map +1 -1
  16. package/dist/css/tabulator_bootstrap4.css +12 -7
  17. package/dist/css/tabulator_bootstrap4.css.map +1 -1
  18. package/dist/css/tabulator_bootstrap4.min.css +1 -1
  19. package/dist/css/tabulator_bootstrap4.min.css.map +1 -1
  20. package/dist/css/tabulator_bootstrap5.css +12 -7
  21. package/dist/css/tabulator_bootstrap5.css.map +1 -1
  22. package/dist/css/tabulator_bootstrap5.min.css +1 -1
  23. package/dist/css/tabulator_bootstrap5.min.css.map +1 -1
  24. package/dist/css/tabulator_bulma.css +12 -7
  25. package/dist/css/tabulator_bulma.css.map +1 -1
  26. package/dist/css/tabulator_bulma.min.css +1 -1
  27. package/dist/css/tabulator_bulma.min.css.map +1 -1
  28. package/dist/css/tabulator_materialize.css +12 -7
  29. package/dist/css/tabulator_materialize.css.map +1 -1
  30. package/dist/css/tabulator_materialize.min.css +1 -1
  31. package/dist/css/tabulator_materialize.min.css.map +1 -1
  32. package/dist/css/tabulator_midnight.css +12 -7
  33. package/dist/css/tabulator_midnight.css.map +1 -1
  34. package/dist/css/tabulator_midnight.min.css +1 -1
  35. package/dist/css/tabulator_midnight.min.css.map +1 -1
  36. package/dist/css/tabulator_modern.css +12 -7
  37. package/dist/css/tabulator_modern.css.map +1 -1
  38. package/dist/css/tabulator_modern.min.css +1 -1
  39. package/dist/css/tabulator_modern.min.css.map +1 -1
  40. package/dist/css/tabulator_semanticui.css +12 -7
  41. package/dist/css/tabulator_semanticui.css.map +1 -1
  42. package/dist/css/tabulator_semanticui.min.css +1 -1
  43. package/dist/css/tabulator_semanticui.min.css.map +1 -1
  44. package/dist/css/tabulator_simple.css +12 -7
  45. package/dist/css/tabulator_simple.css.map +1 -1
  46. package/dist/css/tabulator_simple.min.css +1 -1
  47. package/dist/css/tabulator_simple.min.css.map +1 -1
  48. package/dist/css/tabulator_site.css +12 -7
  49. package/dist/css/tabulator_site.css.map +1 -1
  50. package/dist/css/tabulator_site.min.css +1 -1
  51. package/dist/css/tabulator_site.min.css.map +1 -1
  52. package/dist/js/jquery_wrapper.js +37 -37
  53. package/dist/js/tabulator.js +1551 -793
  54. package/dist/js/tabulator.js.map +1 -1
  55. package/dist/js/tabulator.min.js +2 -2
  56. package/dist/js/tabulator.min.js.map +1 -1
  57. package/dist/js/tabulator_esm.js +4300 -3581
  58. package/dist/js/tabulator_esm.js.map +1 -1
  59. package/dist/js/tabulator_esm.min.js +2 -2
  60. package/dist/js/tabulator_esm.min.js.map +1 -1
  61. package/package.json +4 -1
  62. package/src/js/builds/jquery_wrapper.js +37 -37
  63. package/src/js/core/ColumnManager.js +270 -232
  64. package/src/js/core/CoreFeature.js +16 -2
  65. package/src/js/core/FooterManager.js +10 -10
  66. package/src/js/core/Module.js +8 -8
  67. package/src/js/core/RowManager.js +139 -156
  68. package/src/js/core/Tabulator.js +88 -74
  69. package/src/js/core/TabulatorFull.js +1 -1
  70. package/src/js/core/cell/Cell.js +15 -16
  71. package/src/js/core/cell/CellComponent.js +2 -2
  72. package/src/js/core/column/Column.js +81 -68
  73. package/src/js/core/column/ColumnComponent.js +4 -4
  74. package/src/js/core/column/defaults/options.js +1 -1
  75. package/src/js/core/defaults/options.js +4 -2
  76. package/src/js/core/rendering/Renderer.js +19 -19
  77. package/src/js/core/rendering/renderers/BasicHorizontal.js +1 -2
  78. package/src/js/core/rendering/renderers/BasicVertical.js +1 -1
  79. package/src/js/core/rendering/renderers/VirtualDomHorizontal.js +42 -58
  80. package/src/js/core/rendering/renderers/VirtualDomVertical.js +31 -22
  81. package/src/js/core/row/Row.js +32 -8
  82. package/src/js/core/row/RowComponent.js +8 -4
  83. package/src/js/core/tools/Alert.js +44 -45
  84. package/src/js/core/tools/ComponentFunctionBinder.js +4 -2
  85. package/src/js/core/tools/DataLoader.js +3 -3
  86. package/src/js/core/tools/DeprecationAdvisor.js +47 -0
  87. package/src/js/core/tools/ExternalEventBus.js +5 -5
  88. package/src/js/core/tools/InteractionMonitor.js +41 -39
  89. package/src/js/core/tools/InternalEventBus.js +5 -5
  90. package/src/js/core/tools/ModuleBinder.js +6 -6
  91. package/src/js/core/tools/OptionsList.js +4 -4
  92. package/src/js/core/tools/Popup.js +211 -202
  93. package/src/js/modules/Accessor/Accessor.js +16 -16
  94. package/src/js/modules/Accessor/defaults/accessors.js +1 -1
  95. package/src/js/modules/Ajax/Ajax.js +7 -7
  96. package/src/js/modules/Ajax/defaults/loaderPromise.js +19 -19
  97. package/src/js/modules/Ajax/defaults/urlGenerator.js +1 -1
  98. package/src/js/modules/Clipboard/Clipboard.js +23 -23
  99. package/src/js/modules/Clipboard/defaults/pasteParsers.js +0 -2
  100. package/src/js/modules/ColumnCalcs/CalcComponent.js +2 -2
  101. package/src/js/modules/ColumnCalcs/ColumnCalcs.js +55 -51
  102. package/src/js/modules/ColumnCalcs/defaults/calculations.js +1 -1
  103. package/src/js/modules/DataTree/DataTree.js +24 -15
  104. package/src/js/modules/Download/Download.js +15 -8
  105. package/src/js/modules/Download/defaults/downloaders/csv.js +28 -28
  106. package/src/js/modules/Download/defaults/downloaders/html.js +2 -2
  107. package/src/js/modules/Download/defaults/downloaders/json.js +14 -14
  108. package/src/js/modules/Download/defaults/downloaders/jsonLines.js +1 -1
  109. package/src/js/modules/Download/defaults/downloaders/pdf.js +17 -19
  110. package/src/js/modules/Download/defaults/downloaders/xlsx.js +2 -2
  111. package/src/js/modules/Edit/Edit.js +219 -201
  112. package/src/js/modules/Edit/List.js +1026 -1006
  113. package/src/js/modules/Edit/defaults/editors/autocomplete.js +3 -3
  114. package/src/js/modules/Edit/defaults/editors/date.js +110 -0
  115. package/src/js/modules/Edit/defaults/editors/datetime.js +97 -0
  116. package/src/js/modules/Edit/defaults/editors/input.js +7 -7
  117. package/src/js/modules/Edit/defaults/editors/list.js +2 -2
  118. package/src/js/modules/Edit/defaults/editors/number.js +12 -12
  119. package/src/js/modules/Edit/defaults/editors/progress.js +11 -11
  120. package/src/js/modules/Edit/defaults/editors/range.js +5 -5
  121. package/src/js/modules/Edit/defaults/editors/select.js +3 -3
  122. package/src/js/modules/Edit/defaults/editors/star.js +9 -9
  123. package/src/js/modules/Edit/defaults/editors/textarea.js +97 -92
  124. package/src/js/modules/Edit/defaults/editors/tickCross.js +1 -3
  125. package/src/js/modules/Edit/defaults/editors/time.js +98 -0
  126. package/src/js/modules/Edit/defaults/editors.js +8 -2
  127. package/src/js/modules/Edit/inputMask.js +19 -26
  128. package/src/js/modules/Export/Export.js +69 -65
  129. package/src/js/modules/Filter/Filter.js +88 -95
  130. package/src/js/modules/Format/Format.js +24 -26
  131. package/src/js/modules/Format/defaults/formatters/buttonCross.js +1 -1
  132. package/src/js/modules/Format/defaults/formatters/buttonTick.js +1 -1
  133. package/src/js/modules/Format/defaults/formatters/color.js +1 -1
  134. package/src/js/modules/Format/defaults/formatters/datetime.js +7 -7
  135. package/src/js/modules/Format/defaults/formatters/datetimediff.js +7 -7
  136. package/src/js/modules/Format/defaults/formatters/handle.js +1 -1
  137. package/src/js/modules/Format/defaults/formatters/html.js +1 -1
  138. package/src/js/modules/Format/defaults/formatters/image.js +9 -9
  139. package/src/js/modules/Format/defaults/formatters/link.js +10 -10
  140. package/src/js/modules/Format/defaults/formatters/lookup.js +1 -1
  141. package/src/js/modules/Format/defaults/formatters/money.js +1 -1
  142. package/src/js/modules/Format/defaults/formatters/plaintext.js +1 -1
  143. package/src/js/modules/Format/defaults/formatters/progress.js +41 -42
  144. package/src/js/modules/Format/defaults/formatters/responsiveCollapse.js +3 -3
  145. package/src/js/modules/Format/defaults/formatters/rowSelection.js +1 -1
  146. package/src/js/modules/Format/defaults/formatters/rownum.js +9 -2
  147. package/src/js/modules/Format/defaults/formatters/star.js +1 -1
  148. package/src/js/modules/Format/defaults/formatters/textarea.js +1 -1
  149. package/src/js/modules/Format/defaults/formatters/tickCross.js +1 -1
  150. package/src/js/modules/Format/defaults/formatters/traffic.js +14 -14
  151. package/src/js/modules/FrozenColumns/FrozenColumns.js +6 -8
  152. package/src/js/modules/FrozenRows/FrozenRows.js +37 -7
  153. package/src/js/modules/GroupRows/Group.js +7 -7
  154. package/src/js/modules/GroupRows/GroupComponent.js +2 -2
  155. package/src/js/modules/GroupRows/GroupRows.js +34 -11
  156. package/src/js/modules/History/History.js +2 -2
  157. package/src/js/modules/HtmlTableImport/HtmlTableImport.js +3 -6
  158. package/src/js/modules/Import/Import.js +158 -159
  159. package/src/js/modules/Import/defaults/importers/array.js +5 -0
  160. package/src/js/modules/Import/defaults/importers/csv.js +49 -49
  161. package/src/js/modules/Import/defaults/importers/json.js +6 -6
  162. package/src/js/modules/Import/defaults/importers.js +2 -0
  163. package/src/js/modules/Interaction/Interaction.js +42 -43
  164. package/src/js/modules/Keybindings/Keybindings.js +14 -14
  165. package/src/js/modules/Keybindings/defaults/actions.js +1 -2
  166. package/src/js/modules/Layout/Layout.js +4 -5
  167. package/src/js/modules/Layout/defaults/modes/fitColumns.js +13 -16
  168. package/src/js/modules/Layout/defaults/modes/fitData.js +6 -4
  169. package/src/js/modules/Layout/defaults/modes/fitDataGeneral.js +2 -2
  170. package/src/js/modules/Layout/defaults/modes/fitDataStretch.js +2 -2
  171. package/src/js/modules/Localize/Localize.js +7 -7
  172. package/src/js/modules/Menu/Menu.js +8 -11
  173. package/src/js/modules/MoveColumns/MoveColumns.js +3 -6
  174. package/src/js/modules/MoveRows/MoveRows.js +30 -36
  175. package/src/js/modules/Mutator/Mutator.js +9 -9
  176. package/src/js/modules/Page/Page.js +73 -80
  177. package/src/js/modules/Page/defaults/pageCounters/pages.js +2 -2
  178. package/src/js/modules/Page/defaults/pageCounters/rows.js +1 -1
  179. package/src/js/modules/Persistence/Persistence.js +40 -44
  180. package/src/js/modules/Persistence/defaults/readers.js +1 -1
  181. package/src/js/modules/Popup/Popup.js +4 -5
  182. package/src/js/modules/Print/Print.js +2 -2
  183. package/src/js/modules/ReactiveData/ReactiveData.js +178 -115
  184. package/src/js/modules/ResizeColumns/ResizeColumns.js +3 -3
  185. package/src/js/modules/ResizeRows/ResizeRows.js +1 -1
  186. package/src/js/modules/ResizeTable/ResizeTable.js +77 -46
  187. package/src/js/modules/ResponsiveLayout/ResponsiveLayout.js +3 -5
  188. package/src/js/modules/SelectRow/SelectRow.js +26 -28
  189. package/src/js/modules/Sort/Sort.js +113 -85
  190. package/src/js/modules/Sort/defaults/sorters/alphanum.js +1 -1
  191. package/src/js/modules/Sort/defaults/sorters/array.js +24 -28
  192. package/src/js/modules/Sort/defaults/sorters/boolean.js +1 -1
  193. package/src/js/modules/Sort/defaults/sorters/date.js +1 -1
  194. package/src/js/modules/Sort/defaults/sorters/datetime.js +13 -13
  195. package/src/js/modules/Sort/defaults/sorters/exists.js +1 -1
  196. package/src/js/modules/Sort/defaults/sorters/number.js +1 -1
  197. package/src/js/modules/Sort/defaults/sorters/string.js +7 -7
  198. package/src/js/modules/Sort/defaults/sorters/time.js +1 -1
  199. package/src/js/modules/Tooltip/Tooltip.js +5 -7
  200. package/src/js/modules/Validate/Validate.js +10 -13
  201. package/src/js/modules/Validate/defaults/validators.js +8 -3
  202. package/src/scss/tabulator.scss +28 -17
  203. package/src/scss/themes/bootstrap/functions4.scss +1 -1
  204. package/src/scss/themes/bootstrap/tabulator_bootstrap3.scss +8 -8
  205. package/src/scss/themes/bootstrap/tabulator_bootstrap4.scss +8 -8
  206. package/src/scss/themes/bootstrap/tabulator_bootstrap5.scss +8 -8
  207. package/src/scss/themes/bulma/tabulator_bulma.scss +7 -7
  208. package/src/scss/themes/materialize/tabulator_materialize.scss +6 -6
  209. package/src/scss/themes/materialize/variables.scss +1 -1
  210. package/src/scss/themes/semanticui/tabulator_semanticui.scss +7 -7
  211. package/src/scss/themes/tabulator_midnight.scss +7 -7
  212. package/src/scss/themes/tabulator_modern.scss +14 -14
  213. package/src/scss/themes/tabulator_simple.scss +8 -8
  214. 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,19 +157,18 @@ 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
 
163
-
164
172
  if (this.table.options.columnHeaderSortMulti && (e.shiftKey || e.ctrlKey)) {
165
173
  sorters = this.getSort();
166
174
 
@@ -171,11 +179,9 @@ class Sort extends Module{
171
179
  if(match > -1){
172
180
  sorters[match].dir = dir;
173
181
 
174
- if(match != sorters.length -1){
175
- match = sorters.splice(match, 1)[0];
176
- if(dir != "none"){
177
- sorters.push(match);
178
- }
182
+ match = sorters.splice(match, 1)[0];
183
+ if(dir != "none"){
184
+ sorters.push(match);
179
185
  }
180
186
  }else{
181
187
  if(dir != "none"){
@@ -285,22 +291,22 @@ class Sort extends Module{
285
291
 
286
292
  switch(typeof value){
287
293
  case "undefined":
288
- sorter = "string";
289
- break;
294
+ sorter = "string";
295
+ break;
290
296
 
291
297
  case "boolean":
292
- sorter = "boolean";
293
- break;
298
+ sorter = "boolean";
299
+ break;
294
300
 
295
301
  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";
302
+ if(!isNaN(value) && value !== ""){
303
+ sorter = "number";
304
+ }else{
305
+ if(value.match(/((^[0-9]+[a-z]+)|(^[a-z]+[0-9]+))+$/i)){
306
+ sorter = "alphanum";
307
+ }
301
308
  }
302
- }
303
- break;
309
+ break;
304
310
  }
305
311
  }
306
312
  }
@@ -313,8 +319,7 @@ class Sort extends Module{
313
319
  var self = this,
314
320
  sortList = this.table.options.sortOrderReverse ? self.sortList.slice().reverse() : self.sortList,
315
321
  sortListActual = [],
316
- rowComponents = [],
317
- lastSort;
322
+ rowComponents = [];
318
323
 
319
324
  if(this.subscribedExternal("dataSorting")){
320
325
  this.dispatchExternal("dataSorting", self.getSort());
@@ -326,21 +331,25 @@ class Sort extends Module{
326
331
 
327
332
  //build list of valid sorters and trigger column specific callbacks before sort begins
328
333
  sortList.forEach(function(item, i){
329
- var sortObj = item.column.modules.sort;
334
+ var sortObj;
330
335
 
331
- if(item.column && sortObj){
336
+ if(item.column){
337
+ sortObj = item.column.modules.sort;
332
338
 
333
- //if no sorter has been defined, take a guess
334
- if(!sortObj.sorter){
335
- sortObj.sorter = self.findSorter(item.column);
336
- }
339
+ if(sortObj){
337
340
 
338
- item.params = typeof sortObj.params === "function" ? sortObj.params(item.column.getComponent(), item.dir) : sortObj.params;
341
+ //if no sorter has been defined, take a guess
342
+ if(!sortObj.sorter){
343
+ sortObj.sorter = self.findSorter(item.column);
344
+ }
339
345
 
340
- sortListActual.push(item);
341
- }
346
+ item.params = typeof sortObj.params === "function" ? sortObj.params(item.column.getComponent(), item.dir) : sortObj.params;
342
347
 
343
- self.setColumnHeader(item.column, item.dir);
348
+ sortListActual.push(item);
349
+ }
350
+
351
+ self.setColumnHeader(item.column, item.dir);
352
+ }
344
353
  });
345
354
 
346
355
  //sort data
@@ -367,10 +376,11 @@ class Sort extends Module{
367
376
 
368
377
  //clear sort arrows on columns
369
378
  clearColumnHeaders(){
370
- this.table.columnManager.getRealColumns().forEach(function(column){
379
+ this.table.columnManager.getRealColumns().forEach((column) => {
371
380
  if(column.modules.sort){
372
381
  column.modules.sort.dir = "none";
373
382
  column.getElement().setAttribute("aria-sort", "none");
383
+ this.setColumnHeaderSortIcon(column, "none");
374
384
  }
375
385
  });
376
386
  }
@@ -379,6 +389,24 @@ class Sort extends Module{
379
389
  setColumnHeader(column, dir){
380
390
  column.modules.sort.dir = dir;
381
391
  column.getElement().setAttribute("aria-sort", dir === "asc" ? "ascending" : "descending");
392
+ this.setColumnHeaderSortIcon(column, dir);
393
+ }
394
+
395
+ setColumnHeaderSortIcon(column, dir){
396
+ var sortEl = column.modules.sort.element,
397
+ arrowEl;
398
+
399
+ if(column.definition.headerSort && typeof this.table.options.headerSortElement === "function"){
400
+ while(sortEl.firstChild) sortEl.removeChild(sortEl.firstChild);
401
+
402
+ arrowEl = this.table.options.headerSortElement.call(this.table, column.getComponent(), dir);
403
+
404
+ if(typeof arrowEl === "object"){
405
+ sortEl.appendChild(arrowEl);
406
+ }else{
407
+ sortEl.innerHTML = arrowEl;
408
+ }
409
+ }
382
410
  }
383
411
 
384
412
  //sort each item in sort list
@@ -404,7 +432,7 @@ class Sort extends Module{
404
432
 
405
433
  //process individual rows for a sort function on active data
406
434
  _sortRow(a, b, column, dir, params){
407
- var el1Comp, el2Comp, colComp;
435
+ var el1Comp, el2Comp;
408
436
 
409
437
  //switch elements depending on search direction
410
438
  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
+ }