tabulator-tables 6.5.0 → 6.5.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 (222) hide show
  1. package/dist/js/tabulator.js +1 -1
  2. package/dist/js/tabulator.min.js +1 -1
  3. package/dist/js/tabulator_esm.js +1 -1
  4. package/dist/js/tabulator_esm.min.js +1 -1
  5. package/dist/js/tabulator_esm.min.mjs +1 -1
  6. package/dist/js/tabulator_esm.mjs +1 -1
  7. package/package.json +2 -1
  8. package/src/js/builds/esm.js +16 -0
  9. package/src/js/builds/jquery_wrapper.js +63 -0
  10. package/src/js/builds/usd.js +1 -0
  11. package/src/js/core/ColumnManager.js +789 -0
  12. package/src/js/core/CoreFeature.js +140 -0
  13. package/src/js/core/FooterManager.js +102 -0
  14. package/src/js/core/Module.js +140 -0
  15. package/src/js/core/RowManager.js +1140 -0
  16. package/src/js/core/Tabulator.js +928 -0
  17. package/src/js/core/TabulatorFull.js +21 -0
  18. package/src/js/core/cell/Cell.js +299 -0
  19. package/src/js/core/cell/CellComponent.js +79 -0
  20. package/src/js/core/column/Column.js +978 -0
  21. package/src/js/core/column/ColumnComponent.js +151 -0
  22. package/src/js/core/column/defaults/options.js +18 -0
  23. package/src/js/core/defaults/options.js +66 -0
  24. package/src/js/core/modules/core.js +3 -0
  25. package/src/js/core/modules/optional.js +37 -0
  26. package/src/js/core/rendering/Renderer.js +204 -0
  27. package/src/js/core/rendering/renderers/BasicHorizontal.js +27 -0
  28. package/src/js/core/rendering/renderers/BasicVertical.js +103 -0
  29. package/src/js/core/rendering/renderers/VirtualDomHorizontal.js +587 -0
  30. package/src/js/core/rendering/renderers/VirtualDomVertical.js +642 -0
  31. package/src/js/core/row/PseudoRow.js +47 -0
  32. package/src/js/core/row/Row.js +487 -0
  33. package/src/js/core/row/RowComponent.js +94 -0
  34. package/src/js/core/tools/Alert.js +66 -0
  35. package/src/js/core/tools/ComponentFunctionBinder.js +32 -0
  36. package/src/js/core/tools/DataLoader.js +128 -0
  37. package/src/js/core/tools/DependencyRegistry.js +82 -0
  38. package/src/js/core/tools/DeprecationAdvisor.js +51 -0
  39. package/src/js/core/tools/ExternalEventBus.js +105 -0
  40. package/src/js/core/tools/Helpers.js +66 -0
  41. package/src/js/core/tools/InteractionMonitor.js +329 -0
  42. package/src/js/core/tools/InternalEventBus.js +162 -0
  43. package/src/js/core/tools/ModuleBinder.js +153 -0
  44. package/src/js/core/tools/OptionsList.js +45 -0
  45. package/src/js/core/tools/Popup.js +317 -0
  46. package/src/js/core/tools/TableRegistry.js +65 -0
  47. package/src/js/modules/Accessor/Accessor.js +115 -0
  48. package/src/js/modules/Accessor/defaults/accessors.js +5 -0
  49. package/src/js/modules/Ajax/Ajax.js +142 -0
  50. package/src/js/modules/Ajax/defaults/config.js +3 -0
  51. package/src/js/modules/Ajax/defaults/contentTypeFormatters.js +45 -0
  52. package/src/js/modules/Ajax/defaults/loaderPromise.js +87 -0
  53. package/src/js/modules/Ajax/defaults/urlGenerator.js +44 -0
  54. package/src/js/modules/Clipboard/Clipboard.js +282 -0
  55. package/src/js/modules/Clipboard/defaults/pasteActions.js +11 -0
  56. package/src/js/modules/Clipboard/defaults/pasteParsers.js +75 -0
  57. package/src/js/modules/Clipboard/extensions/extensions.js +9 -0
  58. package/src/js/modules/Clipboard/extensions/keybindings/actions.js +9 -0
  59. package/src/js/modules/Clipboard/extensions/keybindings/bindings.js +3 -0
  60. package/src/js/modules/ColumnCalcs/CalcComponent.js +46 -0
  61. package/src/js/modules/ColumnCalcs/ColumnCalcs.js +586 -0
  62. package/src/js/modules/ColumnCalcs/defaults/calculations.js +93 -0
  63. package/src/js/modules/Comms/Comms.js +49 -0
  64. package/src/js/modules/DataTree/DataTree.js +620 -0
  65. package/src/js/modules/Download/Download.js +146 -0
  66. package/src/js/modules/Download/defaults/downloaders/csv.js +61 -0
  67. package/src/js/modules/Download/defaults/downloaders/html.js +5 -0
  68. package/src/js/modules/Download/defaults/downloaders/json.js +34 -0
  69. package/src/js/modules/Download/defaults/downloaders/jsonLines.js +32 -0
  70. package/src/js/modules/Download/defaults/downloaders/pdf.js +113 -0
  71. package/src/js/modules/Download/defaults/downloaders/xlsx.js +103 -0
  72. package/src/js/modules/Download/defaults/downloaders.js +15 -0
  73. package/src/js/modules/Edit/Edit.js +845 -0
  74. package/src/js/modules/Edit/List.js +1060 -0
  75. package/src/js/modules/Edit/defaults/editors/adaptable.js +37 -0
  76. package/src/js/modules/Edit/defaults/editors/date.js +144 -0
  77. package/src/js/modules/Edit/defaults/editors/datetime.js +131 -0
  78. package/src/js/modules/Edit/defaults/editors/input.js +77 -0
  79. package/src/js/modules/Edit/defaults/editors/list.js +7 -0
  80. package/src/js/modules/Edit/defaults/editors/number.js +110 -0
  81. package/src/js/modules/Edit/defaults/editors/progress.js +127 -0
  82. package/src/js/modules/Edit/defaults/editors/range.js +81 -0
  83. package/src/js/modules/Edit/defaults/editors/star.js +146 -0
  84. package/src/js/modules/Edit/defaults/editors/textarea.js +123 -0
  85. package/src/js/modules/Edit/defaults/editors/tickCross.js +95 -0
  86. package/src/js/modules/Edit/defaults/editors/time.js +132 -0
  87. package/src/js/modules/Edit/defaults/editors.js +27 -0
  88. package/src/js/modules/Edit/inputMask.js +74 -0
  89. package/src/js/modules/Export/Export.js +654 -0
  90. package/src/js/modules/Export/ExportColumn.js +9 -0
  91. package/src/js/modules/Export/ExportRow.js +8 -0
  92. package/src/js/modules/Export/defaults/columnLookups.js +3 -0
  93. package/src/js/modules/Export/defaults/rowLookups.js +18 -0
  94. package/src/js/modules/Filter/Filter.js +902 -0
  95. package/src/js/modules/Filter/defaults/filters.js +215 -0
  96. package/src/js/modules/Format/Format.js +200 -0
  97. package/src/js/modules/Format/defaults/formatters/adaptable.js +32 -0
  98. package/src/js/modules/Format/defaults/formatters/array.js +30 -0
  99. package/src/js/modules/Format/defaults/formatters/buttonCross.js +3 -0
  100. package/src/js/modules/Format/defaults/formatters/buttonTick.js +3 -0
  101. package/src/js/modules/Format/defaults/formatters/color.js +4 -0
  102. package/src/js/modules/Format/defaults/formatters/datetime.js +39 -0
  103. package/src/js/modules/Format/defaults/formatters/datetimediff.js +43 -0
  104. package/src/js/modules/Format/defaults/formatters/handle.js +4 -0
  105. package/src/js/modules/Format/defaults/formatters/html.js +3 -0
  106. package/src/js/modules/Format/defaults/formatters/image.js +40 -0
  107. package/src/js/modules/Format/defaults/formatters/json.js +12 -0
  108. package/src/js/modules/Format/defaults/formatters/link.js +82 -0
  109. package/src/js/modules/Format/defaults/formatters/lookup.js +10 -0
  110. package/src/js/modules/Format/defaults/formatters/money.js +44 -0
  111. package/src/js/modules/Format/defaults/formatters/plaintext.js +3 -0
  112. package/src/js/modules/Format/defaults/formatters/progress.js +133 -0
  113. package/src/js/modules/Format/defaults/formatters/rownum.js +14 -0
  114. package/src/js/modules/Format/defaults/formatters/star.js +38 -0
  115. package/src/js/modules/Format/defaults/formatters/textarea.js +4 -0
  116. package/src/js/modules/Format/defaults/formatters/tickCross.js +22 -0
  117. package/src/js/modules/Format/defaults/formatters/toggle.js +48 -0
  118. package/src/js/modules/Format/defaults/formatters/traffic.js +47 -0
  119. package/src/js/modules/Format/defaults/formatters.js +47 -0
  120. package/src/js/modules/FrozenColumns/FrozenColumns.js +302 -0
  121. package/src/js/modules/FrozenRows/FrozenRows.js +175 -0
  122. package/src/js/modules/GroupRows/Group.js +615 -0
  123. package/src/js/modules/GroupRows/GroupComponent.js +69 -0
  124. package/src/js/modules/GroupRows/GroupRows.js +636 -0
  125. package/src/js/modules/History/History.js +172 -0
  126. package/src/js/modules/History/defaults/redoers.js +31 -0
  127. package/src/js/modules/History/defaults/undoers.js +33 -0
  128. package/src/js/modules/History/extensions/extensions.js +9 -0
  129. package/src/js/modules/History/extensions/keybindings/actions.js +27 -0
  130. package/src/js/modules/History/extensions/keybindings/bindings.js +4 -0
  131. package/src/js/modules/HtmlTableImport/HtmlTableImport.js +180 -0
  132. package/src/js/modules/Import/Import.js +303 -0
  133. package/src/js/modules/Import/defaults/importers/array.js +3 -0
  134. package/src/js/modules/Import/defaults/importers/csv.js +61 -0
  135. package/src/js/modules/Import/defaults/importers/json.js +8 -0
  136. package/src/js/modules/Import/defaults/importers/xlsx.js +7 -0
  137. package/src/js/modules/Import/defaults/importers.js +11 -0
  138. package/src/js/modules/Interaction/Interaction.js +339 -0
  139. package/src/js/modules/Keybindings/Keybindings.js +198 -0
  140. package/src/js/modules/Keybindings/defaults/actions.js +90 -0
  141. package/src/js/modules/Keybindings/defaults/bindings.js +12 -0
  142. package/src/js/modules/Layout/Layout.js +66 -0
  143. package/src/js/modules/Layout/defaults/modes/fitColumns.js +171 -0
  144. package/src/js/modules/Layout/defaults/modes/fitData.js +10 -0
  145. package/src/js/modules/Layout/defaults/modes/fitDataGeneral.js +10 -0
  146. package/src/js/modules/Layout/defaults/modes/fitDataStretch.js +40 -0
  147. package/src/js/modules/Layout/defaults/modes.js +12 -0
  148. package/src/js/modules/Localize/Localize.js +184 -0
  149. package/src/js/modules/Localize/defaults/langs.js +37 -0
  150. package/src/js/modules/Menu/Menu.js +302 -0
  151. package/src/js/modules/MoveColumns/MoveColumns.js +311 -0
  152. package/src/js/modules/MoveRows/MoveRows.js +604 -0
  153. package/src/js/modules/MoveRows/defaults/receivers.js +30 -0
  154. package/src/js/modules/MoveRows/defaults/senders.js +5 -0
  155. package/src/js/modules/Mutator/Mutator.js +164 -0
  156. package/src/js/modules/Mutator/defaults/mutators.js +1 -0
  157. package/src/js/modules/Page/Page.js +891 -0
  158. package/src/js/modules/Page/defaults/pageCounters/pages.js +33 -0
  159. package/src/js/modules/Page/defaults/pageCounters/rows.js +40 -0
  160. package/src/js/modules/Page/defaults/pageCounters.js +8 -0
  161. package/src/js/modules/Persistence/Persistence.js +473 -0
  162. package/src/js/modules/Persistence/defaults/readers.js +29 -0
  163. package/src/js/modules/Persistence/defaults/writers.js +13 -0
  164. package/src/js/modules/Popup/Popup.js +227 -0
  165. package/src/js/modules/Print/Print.js +136 -0
  166. package/src/js/modules/ReactiveData/ReactiveData.js +416 -0
  167. package/src/js/modules/ResizeColumns/ResizeColumns.js +365 -0
  168. package/src/js/modules/ResizeRows/ResizeRows.js +145 -0
  169. package/src/js/modules/ResizeTable/ResizeTable.js +158 -0
  170. package/src/js/modules/ResponsiveLayout/ResponsiveLayout.js +354 -0
  171. package/src/js/modules/ResponsiveLayout/extensions/extensions.js +9 -0
  172. package/src/js/modules/ResponsiveLayout/extensions/formatters/responsiveCollapse.js +44 -0
  173. package/src/js/modules/SelectRange/Range.js +366 -0
  174. package/src/js/modules/SelectRange/RangeComponent.js +91 -0
  175. package/src/js/modules/SelectRange/SelectRange.js +993 -0
  176. package/src/js/modules/SelectRange/extensions/clipboard/pasteActions.js +45 -0
  177. package/src/js/modules/SelectRange/extensions/clipboard/pasteParsers.js +57 -0
  178. package/src/js/modules/SelectRange/extensions/export/columnLookups.js +11 -0
  179. package/src/js/modules/SelectRange/extensions/export/rowLookups.js +5 -0
  180. package/src/js/modules/SelectRange/extensions/extensions.js +21 -0
  181. package/src/js/modules/SelectRange/extensions/keybindings/actions.js +38 -0
  182. package/src/js/modules/SelectRange/extensions/keybindings/bindings.js +14 -0
  183. package/src/js/modules/SelectRow/SelectRow.js +499 -0
  184. package/src/js/modules/SelectRow/extensions/extensions.js +9 -0
  185. package/src/js/modules/SelectRow/extensions/formatters/rowSelection.js +60 -0
  186. package/src/js/modules/Sort/Sort.js +480 -0
  187. package/src/js/modules/Sort/defaults/sorters/alphanum.js +44 -0
  188. package/src/js/modules/Sort/defaults/sorters/array.js +82 -0
  189. package/src/js/modules/Sort/defaults/sorters/boolean.js +7 -0
  190. package/src/js/modules/Sort/defaults/sorters/date.js +10 -0
  191. package/src/js/modules/Sort/defaults/sorters/datetime.js +48 -0
  192. package/src/js/modules/Sort/defaults/sorters/exists.js +7 -0
  193. package/src/js/modules/Sort/defaults/sorters/number.js +40 -0
  194. package/src/js/modules/Sort/defaults/sorters/string.js +34 -0
  195. package/src/js/modules/Sort/defaults/sorters/time.js +10 -0
  196. package/src/js/modules/Sort/defaults/sorters.js +21 -0
  197. package/src/js/modules/Spreadsheet/GridCalculator.js +64 -0
  198. package/src/js/modules/Spreadsheet/Sheet.js +243 -0
  199. package/src/js/modules/Spreadsheet/SheetComponent.js +59 -0
  200. package/src/js/modules/Spreadsheet/Spreadsheet.js +309 -0
  201. package/src/js/modules/Tooltip/Tooltip.js +128 -0
  202. package/src/js/modules/Validate/Validate.js +303 -0
  203. package/src/js/modules/Validate/defaults/validators.js +150 -0
  204. package/src/scss/tabulator.scss +1693 -0
  205. package/src/scss/themes/bootstrap/tabulator_bootstrap3.scss +302 -0
  206. package/src/scss/themes/bootstrap/tabulator_bootstrap4.scss +589 -0
  207. package/src/scss/themes/bootstrap/tabulator_bootstrap5.scss +979 -0
  208. package/src/scss/themes/bootstrap/variables3.scss +872 -0
  209. package/src/scss/themes/bootstrap/variables4.scss +1059 -0
  210. package/src/scss/themes/bootstrap/variables5.scss +1967 -0
  211. package/src/scss/themes/bulma/tabulator_bulma.scss +316 -0
  212. package/src/scss/themes/bulma/variables.scss +198 -0
  213. package/src/scss/themes/materialize/tabulator_materialize.scss +318 -0
  214. package/src/scss/themes/materialize/variables.scss +71 -0
  215. package/src/scss/themes/semanticui/tabulator_semanticui.scss +623 -0
  216. package/src/scss/themes/semanticui/variables.scss +843 -0
  217. package/src/scss/themes/semanticui/variables_table.scss +248 -0
  218. package/src/scss/themes/tabulator_midnight.scss +235 -0
  219. package/src/scss/themes/tabulator_modern.scss +308 -0
  220. package/src/scss/themes/tabulator_simple.scss +143 -0
  221. package/src/scss/themes/tabulator_site.scss +267 -0
  222. package/src/scss/themes/tabulator_site_dark.scss +496 -0
@@ -0,0 +1,60 @@
1
+ import RowComponent from '../../../../core/row/RowComponent.js';
2
+
3
+ export default function(cell, formatterParams, onRendered){
4
+ var checkbox = document.createElement("input");
5
+ var blocked = false;
6
+
7
+ checkbox.type = 'checkbox';
8
+
9
+ checkbox.setAttribute("aria-label", "Select Row");
10
+
11
+ if(this.table.modExists("selectRow", true)){
12
+
13
+ checkbox.addEventListener("click", (e) => {
14
+ e.stopPropagation();
15
+ });
16
+
17
+ if(typeof cell.getRow == 'function'){
18
+ var row = cell.getRow();
19
+
20
+ if(row instanceof RowComponent){
21
+
22
+ checkbox.addEventListener("change", (e) => {
23
+ if(this.table.options.selectableRowsRangeMode === "click"){
24
+ if(!blocked){
25
+ row.toggleSelect();
26
+ }else{
27
+ blocked = false;
28
+ }
29
+ }else{
30
+ row.toggleSelect();
31
+ }
32
+ });
33
+
34
+ if(this.table.options.selectableRowsRangeMode === "click"){
35
+ checkbox.addEventListener("click", (e) => {
36
+ blocked = true;
37
+ this.table.modules.selectRow.handleComplexRowClick(row._row, e);
38
+ });
39
+ }
40
+
41
+ checkbox.checked = row.isSelected && row.isSelected();
42
+ this.table.modules.selectRow.registerRowSelectCheckbox(row, checkbox);
43
+ }else{
44
+ checkbox = "";
45
+ }
46
+ }else {
47
+ checkbox.addEventListener("change", (e) => {
48
+ if(this.table.modules.selectRow.selectedRows.length){
49
+ this.table.deselectRow();
50
+ }else {
51
+ this.table.selectRow(formatterParams.rowRange);
52
+ }
53
+ });
54
+
55
+ this.table.modules.selectRow.registerHeaderSelectCheckbox(checkbox);
56
+ }
57
+ }
58
+
59
+ return checkbox;
60
+ }
@@ -0,0 +1,480 @@
1
+ import Module from '../../core/Module.js';
2
+
3
+ import defaultSorters from './defaults/sorters.js';
4
+
5
+ export default class Sort extends Module{
6
+
7
+ static moduleName = "sort";
8
+
9
+ //load defaults
10
+ static sorters = defaultSorters;
11
+
12
+ constructor(table){
13
+ super(table);
14
+
15
+ this.sortList = []; //holder current sort
16
+ this.changed = false; //has the sort changed since last render
17
+
18
+ this.registerTableOption("sortMode", "local"); //local or remote sorting
19
+
20
+ this.registerTableOption("initialSort", false); //initial sorting criteria
21
+ this.registerTableOption("columnHeaderSortMulti", true); //multiple or single column sorting
22
+ this.registerTableOption("sortOrderReverse", false); //reverse internal sort ordering
23
+ this.registerTableOption("headerSortElement", "<div class='tabulator-arrow'></div>"); //header sort element
24
+ this.registerTableOption("headerSortClickElement", "header"); //element which triggers sort when clicked
25
+
26
+ this.registerColumnOption("sorter");
27
+ this.registerColumnOption("sorterParams");
28
+
29
+ this.registerColumnOption("headerSort", true);
30
+ this.registerColumnOption("headerSortStartingDir");
31
+ this.registerColumnOption("headerSortTristate");
32
+
33
+ }
34
+
35
+ initialize(){
36
+ this.subscribe("column-layout", this.initializeColumn.bind(this));
37
+ this.subscribe("table-built", this.tableBuilt.bind(this));
38
+ this.registerDataHandler(this.sort.bind(this), 20);
39
+
40
+ this.registerTableFunction("setSort", this.userSetSort.bind(this));
41
+ this.registerTableFunction("getSorters", this.getSort.bind(this));
42
+ this.registerTableFunction("clearSort", this.clearSort.bind(this));
43
+
44
+ if(this.table.options.sortMode === "remote"){
45
+ this.subscribe("data-params", this.remoteSortParams.bind(this));
46
+ }
47
+ }
48
+
49
+ tableBuilt(){
50
+ if(this.table.options.initialSort){
51
+ this.setSort(this.table.options.initialSort);
52
+ }
53
+ }
54
+
55
+ remoteSortParams(data, config, silent, params){
56
+ var sorters = this.getSort();
57
+
58
+ sorters.forEach((item) => {
59
+ delete item.column;
60
+ });
61
+
62
+ params.sort = sorters;
63
+
64
+ return params;
65
+ }
66
+
67
+
68
+ ///////////////////////////////////
69
+ ///////// Table Functions /////////
70
+ ///////////////////////////////////
71
+
72
+ userSetSort(sortList, dir){
73
+ this.setSort(sortList, dir);
74
+ // this.table.rowManager.sorterRefresh();
75
+ this.refreshSort();
76
+ }
77
+
78
+ clearSort(){
79
+ this.clear();
80
+ // this.table.rowManager.sorterRefresh();
81
+ this.refreshSort();
82
+ }
83
+
84
+
85
+ ///////////////////////////////////
86
+ ///////// Internal Logic //////////
87
+ ///////////////////////////////////
88
+
89
+ //initialize column header for sorting
90
+ initializeColumn(column){
91
+ var sorter = false,
92
+ colEl,
93
+ arrowEl;
94
+
95
+ switch(typeof column.definition.sorter){
96
+ case "string":
97
+ if(Sort.sorters[column.definition.sorter]){
98
+ sorter = Sort.sorters[column.definition.sorter];
99
+ }else{
100
+ console.warn("Sort Error - No such sorter found: ", column.definition.sorter);
101
+ }
102
+ break;
103
+
104
+ case "function":
105
+ sorter = column.definition.sorter;
106
+ break;
107
+ }
108
+
109
+ column.modules.sort = {
110
+ sorter:sorter, dir:"none",
111
+ params:column.definition.sorterParams || {},
112
+ startingDir:column.definition.headerSortStartingDir || "asc",
113
+ tristate: column.definition.headerSortTristate,
114
+ };
115
+
116
+ if(column.definition.headerSort !== false){
117
+
118
+ colEl = column.getElement();
119
+
120
+ colEl.classList.add("tabulator-sortable");
121
+
122
+ arrowEl = document.createElement("div");
123
+ arrowEl.classList.add("tabulator-col-sorter");
124
+
125
+ switch(this.table.options.headerSortClickElement){
126
+ case "icon":
127
+ arrowEl.classList.add("tabulator-col-sorter-element");
128
+ break;
129
+ case "header":
130
+ colEl.classList.add("tabulator-col-sorter-element");
131
+ break;
132
+ default:
133
+ colEl.classList.add("tabulator-col-sorter-element");
134
+ break;
135
+ }
136
+
137
+ switch(this.table.options.headerSortElement){
138
+ case "function":
139
+ //do nothing
140
+ break;
141
+
142
+ case "object":
143
+ arrowEl.appendChild(this.table.options.headerSortElement);
144
+ break;
145
+
146
+ default:
147
+ arrowEl.innerHTML = this.table.options.headerSortElement;
148
+ }
149
+
150
+ //create sorter arrow
151
+ column.titleHolderElement.appendChild(arrowEl);
152
+
153
+ column.modules.sort.element = arrowEl;
154
+
155
+ this.setColumnHeaderSortIcon(column, "none");
156
+
157
+ if(this.table.options.headerSortClickElement === "icon"){
158
+ arrowEl.addEventListener("mousedown", (e) => {
159
+ e.stopPropagation();
160
+ });
161
+ }
162
+
163
+ //sort on click
164
+ (this.table.options.headerSortClickElement === "icon" ? arrowEl : colEl).addEventListener("click", (e) => {
165
+ var dir = "",
166
+ sorters=[],
167
+ match = false;
168
+
169
+ if(column.modules.sort){
170
+ if(column.modules.sort.tristate){
171
+ if(column.modules.sort.dir == "none"){
172
+ dir = column.modules.sort.startingDir;
173
+ }else{
174
+ if(column.modules.sort.dir == column.modules.sort.startingDir){
175
+ dir = column.modules.sort.dir == "asc" ? "desc" : "asc";
176
+ }else{
177
+ dir = "none";
178
+ }
179
+ }
180
+ }else{
181
+ switch(column.modules.sort.dir){
182
+ case "asc":
183
+ dir = "desc";
184
+ break;
185
+
186
+ case "desc":
187
+ dir = "asc";
188
+ break;
189
+
190
+ default:
191
+ dir = column.modules.sort.startingDir;
192
+ }
193
+ }
194
+
195
+ if (this.table.options.columnHeaderSortMulti && (e.shiftKey || e.ctrlKey)) {
196
+ sorters = this.getSort();
197
+
198
+ match = sorters.findIndex((sorter) => {
199
+ return sorter.field === column.getField();
200
+ });
201
+
202
+ if(match > -1){
203
+ sorters[match].dir = dir;
204
+
205
+ match = sorters.splice(match, 1)[0];
206
+ if(dir != "none"){
207
+ sorters.push(match);
208
+ }
209
+ }else{
210
+ if(dir != "none"){
211
+ sorters.push({column:column, dir:dir});
212
+ }
213
+ }
214
+
215
+ //add to existing sort
216
+ this.setSort(sorters);
217
+ }else{
218
+ if(dir == "none"){
219
+ this.clear();
220
+ }else{
221
+ //sort by column only
222
+ this.setSort(column, dir);
223
+ }
224
+
225
+ }
226
+
227
+ // this.table.rowManager.sorterRefresh(!this.sortList.length);
228
+ this.refreshSort();
229
+ }
230
+ });
231
+ }
232
+ }
233
+
234
+ refreshSort(){
235
+ if(this.table.options.sortMode === "remote"){
236
+ this.reloadData(null, false, false);
237
+ }else{
238
+ this.refreshData(true);
239
+ }
240
+
241
+ //TODO - Persist left position of row manager
242
+ // left = this.scrollLeft;
243
+ // this.scrollHorizontal(left);
244
+ }
245
+
246
+ //check if the sorters have changed since last use
247
+ hasChanged(){
248
+ var changed = this.changed;
249
+ this.changed = false;
250
+ return changed;
251
+ }
252
+
253
+ //return current sorters
254
+ getSort(){
255
+ var self = this,
256
+ sorters = [];
257
+
258
+ self.sortList.forEach(function(item){
259
+ if(item.column){
260
+ sorters.push({column:item.column.getComponent(), field:item.column.getField(), dir:item.dir});
261
+ }
262
+ });
263
+
264
+ return sorters;
265
+ }
266
+
267
+ //change sort list and trigger sort
268
+ setSort(sortList, dir){
269
+ var self = this,
270
+ newSortList = [];
271
+
272
+ if(!Array.isArray(sortList)){
273
+ sortList = [{column: sortList, dir:dir}];
274
+ }
275
+
276
+ sortList.forEach(function(item){
277
+ var column;
278
+
279
+ column = self.table.columnManager.findColumn(item.column);
280
+
281
+ if(column){
282
+ item.column = column;
283
+ newSortList.push(item);
284
+ self.changed = true;
285
+ }else{
286
+ console.warn("Sort Warning - Sort field does not exist and is being ignored: ", item.column);
287
+ }
288
+
289
+ });
290
+
291
+ self.sortList = newSortList;
292
+
293
+ this.dispatch("sort-changed");
294
+ }
295
+
296
+ //clear sorters
297
+ clear(){
298
+ this.setSort([]);
299
+ }
300
+
301
+ //find appropriate sorter for column
302
+ findSorter(column){
303
+ var row = this.table.rowManager.activeRows[0],
304
+ sorter = "string",
305
+ field, value;
306
+
307
+ if(row){
308
+ row = row.getData();
309
+ field = column.getField();
310
+
311
+ if(field){
312
+
313
+ value = column.getFieldValue(row);
314
+
315
+ switch(typeof value){
316
+ case "undefined":
317
+ sorter = "string";
318
+ break;
319
+
320
+ case "boolean":
321
+ sorter = "boolean";
322
+ break;
323
+
324
+ default:
325
+ if(!isNaN(Number(value)) && value !== ""){
326
+ sorter = "number";
327
+ }else{
328
+ if(value.match(/((^[0-9]+[a-z]+)|(^[a-z]+[0-9]+))+$/i)){
329
+ sorter = "alphanum";
330
+ }
331
+ }
332
+ break;
333
+ }
334
+ }
335
+ }
336
+
337
+ return Sort.sorters[sorter];
338
+ }
339
+
340
+ //work through sort list sorting data
341
+ sort(data, sortOnly){
342
+ var self = this,
343
+ sortList = this.table.options.sortOrderReverse ? self.sortList.slice().reverse() : self.sortList,
344
+ sortListActual = [],
345
+ rowComponents = [];
346
+
347
+ if(this.subscribedExternal("dataSorting")){
348
+ this.dispatchExternal("dataSorting", self.getSort());
349
+ }
350
+
351
+ if(!sortOnly) {
352
+ self.clearColumnHeaders();
353
+ }
354
+
355
+ if(this.table.options.sortMode !== "remote"){
356
+
357
+ //build list of valid sorters and trigger column specific callbacks before sort begins
358
+ sortList.forEach(function(item, i){
359
+ var sortObj;
360
+
361
+ if(item.column){
362
+ sortObj = item.column.modules.sort;
363
+
364
+ if(sortObj){
365
+
366
+ //if no sorter has been defined, take a guess
367
+ if(!sortObj.sorter){
368
+ sortObj.sorter = self.findSorter(item.column);
369
+ }
370
+
371
+ item.params = typeof sortObj.params === "function" ? sortObj.params(item.column.getComponent(), item.dir) : sortObj.params;
372
+
373
+ sortListActual.push(item);
374
+ }
375
+
376
+ if(!sortOnly) {
377
+ self.setColumnHeader(item.column, item.dir);
378
+ }
379
+ }
380
+ });
381
+
382
+ //sort data
383
+ if (sortListActual.length) {
384
+ self._sortItems(data, sortListActual);
385
+ }
386
+
387
+ }else if(!sortOnly) {
388
+ sortList.forEach(function(item, i){
389
+ self.setColumnHeader(item.column, item.dir);
390
+ });
391
+ }
392
+
393
+
394
+ if(this.subscribedExternal("dataSorted")){
395
+ data.forEach((row) => {
396
+ rowComponents.push(row.getComponent());
397
+ });
398
+
399
+ this.dispatchExternal("dataSorted", self.getSort(), rowComponents);
400
+ }
401
+
402
+ return data;
403
+ }
404
+
405
+ //clear sort arrows on columns
406
+ clearColumnHeaders(){
407
+ this.table.columnManager.getRealColumns().forEach((column) => {
408
+ if(column.modules.sort){
409
+ column.modules.sort.dir = "none";
410
+ column.getElement().setAttribute("aria-sort", "none");
411
+ this.setColumnHeaderSortIcon(column, "none");
412
+ }
413
+ });
414
+ }
415
+
416
+ //set the column header sort direction
417
+ setColumnHeader(column, dir){
418
+ column.modules.sort.dir = dir;
419
+ column.getElement().setAttribute("aria-sort", dir === "asc" ? "ascending" : "descending");
420
+ this.setColumnHeaderSortIcon(column, dir);
421
+ }
422
+
423
+ setColumnHeaderSortIcon(column, dir){
424
+ var sortEl = column.modules.sort.element,
425
+ arrowEl;
426
+
427
+ if(column.definition.headerSort && typeof this.table.options.headerSortElement === "function"){
428
+ while(sortEl.firstChild) sortEl.removeChild(sortEl.firstChild);
429
+
430
+ arrowEl = this.table.options.headerSortElement.call(this.table, column.getComponent(), dir);
431
+
432
+ if(typeof arrowEl === "object"){
433
+ sortEl.appendChild(arrowEl);
434
+ }else{
435
+ sortEl.innerHTML = arrowEl;
436
+ }
437
+ }
438
+ }
439
+
440
+ //sort each item in sort list
441
+ _sortItems(data, sortList){
442
+ var sorterCount = sortList.length - 1;
443
+
444
+ data.sort((a, b) => {
445
+ var result;
446
+
447
+ for(var i = sorterCount; i>= 0; i--){
448
+ let sortItem = sortList[i];
449
+
450
+ result = this._sortRow(a, b, sortItem.column, sortItem.dir, sortItem.params);
451
+
452
+ if(result !== 0){
453
+ break;
454
+ }
455
+ }
456
+
457
+ return result;
458
+ });
459
+ }
460
+
461
+ //process individual rows for a sort function on active data
462
+ _sortRow(a, b, column, dir, params){
463
+ var el1Comp, el2Comp;
464
+
465
+ //switch elements depending on search direction
466
+ var el1 = dir == "asc" ? a : b;
467
+ var el2 = dir == "asc" ? b : a;
468
+
469
+ a = column.getFieldValue(el1.getData());
470
+ b = column.getFieldValue(el2.getData());
471
+
472
+ a = typeof a !== "undefined" ? a : "";
473
+ b = typeof b !== "undefined" ? b : "";
474
+
475
+ el1Comp = el1.getComponent();
476
+ el2Comp = el2.getComponent();
477
+
478
+ return column.modules.sort.sorter.call(this, a, b, el1Comp, el2Comp, column.getComponent(), dir, params);
479
+ }
480
+ }
@@ -0,0 +1,44 @@
1
+ //sort alpha numeric strings
2
+ export default function(as, bs, aRow, bRow, column, dir, params){
3
+ var a, b, a1, b1, i= 0, L, rx = /(\d+)|(\D+)/g, rd = /\d/;
4
+ var alignEmptyValues = params.alignEmptyValues;
5
+ var emptyAlign = 0;
6
+
7
+ //handle empty values
8
+ if(!as && as!== 0){
9
+ emptyAlign = !bs && bs!== 0 ? 0 : -1;
10
+ }else if(!bs && bs!== 0){
11
+ emptyAlign = 1;
12
+ }else{
13
+
14
+ if(isFinite(as) && isFinite(bs)) return as - bs;
15
+ a = String(as).toLowerCase();
16
+ b = String(bs).toLowerCase();
17
+ if(a === b) return 0;
18
+ if(!(rd.test(a) && rd.test(b))) return a > b ? 1 : -1;
19
+ a = a.match(rx);
20
+ b = b.match(rx);
21
+ L = a.length > b.length ? b.length : a.length;
22
+ while(i < L){
23
+ a1= a[i];
24
+ b1= b[i++];
25
+ if(a1 !== b1){
26
+ if(isFinite(a1) && isFinite(b1)){
27
+ if(a1.charAt(0) === "0") a1 = "." + a1;
28
+ if(b1.charAt(0) === "0") b1 = "." + b1;
29
+ return a1 - b1;
30
+ }
31
+ else return a1 > b1 ? 1 : -1;
32
+ }
33
+ }
34
+
35
+ return a.length > b.length;
36
+ }
37
+
38
+ //fix empty values in position
39
+ if((alignEmptyValues === "top" && dir === "desc") || (alignEmptyValues === "bottom" && dir === "asc")){
40
+ emptyAlign *= -1;
41
+ }
42
+
43
+ return emptyAlign;
44
+ }
@@ -0,0 +1,82 @@
1
+ import Helpers from '../../../../core/tools/Helpers.js';
2
+
3
+ //sort if element contains any data
4
+ export default function(a, b, aRow, bRow, column, dir, params){
5
+ var type = params.type || "length",
6
+ alignEmptyValues = params.alignEmptyValues,
7
+ emptyAlign = 0,
8
+ table = this.table,
9
+ valueMap;
10
+
11
+ if(params.valueMap){
12
+ if(typeof params.valueMap === "string"){
13
+ valueMap = function(value){
14
+ return value.map((item) => {
15
+ return Helpers.retrieveNestedData(table.options.nestedFieldSeparator, params.valueMap, item);
16
+ });
17
+ };
18
+ }else{
19
+ valueMap = params.valueMap;
20
+ }
21
+ }
22
+
23
+ function calc(value){
24
+ var result;
25
+
26
+ if(valueMap){
27
+ value = valueMap(value);
28
+ }
29
+
30
+ switch(type){
31
+ case "length":
32
+ result = value.length;
33
+ break;
34
+
35
+ case "sum":
36
+ result = value.reduce(function(c, d){
37
+ return c + d;
38
+ });
39
+ break;
40
+
41
+ case "max":
42
+ result = Math.max.apply(null, value) ;
43
+ break;
44
+
45
+ case "min":
46
+ result = Math.min.apply(null, value) ;
47
+ break;
48
+
49
+ case "avg":
50
+ result = value.reduce(function(c, d){
51
+ return c + d;
52
+ }) / value.length;
53
+ break;
54
+
55
+ case "string":
56
+ result = value.join("");
57
+ break;
58
+ }
59
+
60
+ return result;
61
+ }
62
+
63
+ //handle non array values
64
+ if(!Array.isArray(a)){
65
+ emptyAlign = !Array.isArray(b) ? 0 : -1;
66
+ }else if(!Array.isArray(b)){
67
+ emptyAlign = 1;
68
+ }else{
69
+ if(type === "string"){
70
+ return String(calc(a)).toLowerCase().localeCompare(String(calc(b)).toLowerCase());
71
+ }else{
72
+ return calc(b) - calc(a);
73
+ }
74
+ }
75
+
76
+ //fix empty values in position
77
+ if((alignEmptyValues === "top" && dir === "desc") || (alignEmptyValues === "bottom" && dir === "asc")){
78
+ emptyAlign *= -1;
79
+ }
80
+
81
+ return emptyAlign;
82
+ }
@@ -0,0 +1,7 @@
1
+ //sort booleans
2
+ export default function(a, b, aRow, bRow, column, dir, params){
3
+ var el1 = a === true || a === "true" || a === "True" || a === 1 ? 1 : 0;
4
+ var el2 = b === true || b === "true" || b === "True" || b === 1 ? 1 : 0;
5
+
6
+ return el1 - el2;
7
+ }
@@ -0,0 +1,10 @@
1
+ import datetime from './datetime.js';
2
+
3
+ //sort date
4
+ export default function(a, b, aRow, bRow, column, dir, params){
5
+ if(!params.format){
6
+ params.format = "dd/MM/yyyy";
7
+ }
8
+
9
+ return datetime.call(this, a, b, aRow, bRow, column, dir, params);
10
+ }