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,636 @@
1
+ import Module from '../../core/Module.js';
2
+
3
+ import Group from './Group.js';
4
+
5
+ export default class GroupRows extends Module{
6
+
7
+ static moduleName = "groupRows";
8
+
9
+ constructor(table){
10
+ super(table);
11
+
12
+ this.groupIDLookups = false; //enable table grouping and set field to group by
13
+ this.startOpen = [function(){return false;}]; //starting state of group
14
+ this.headerGenerator = [function(){return "";}];
15
+ this.groupList = []; //ordered list of groups
16
+ this.allowedValues = false;
17
+ this.groups = {}; //hold row groups
18
+
19
+ this.displayHandler = this.getRows.bind(this);
20
+
21
+ this.blockRedraw = false;
22
+
23
+ //register table options
24
+ this.registerTableOption("groupBy", false); //enable table grouping and set field to group by
25
+ this.registerTableOption("groupStartOpen", true); //starting state of group
26
+ this.registerTableOption("groupValues", false);
27
+ this.registerTableOption("groupUpdateOnCellEdit", false);
28
+ this.registerTableOption("groupHeader", false); //header generation function
29
+ this.registerTableOption("groupHeaderPrint", null);
30
+ this.registerTableOption("groupHeaderClipboard", null);
31
+ this.registerTableOption("groupHeaderHtmlOutput", null);
32
+ this.registerTableOption("groupHeaderDownload", null);
33
+ this.registerTableOption("groupToggleElement", "arrow");
34
+ this.registerTableOption("groupClosedShowCalcs", false);
35
+
36
+ //register table functions
37
+ this.registerTableFunction("setGroupBy", this.setGroupBy.bind(this));
38
+ this.registerTableFunction("setGroupValues", this.setGroupValues.bind(this));
39
+ this.registerTableFunction("setGroupStartOpen", this.setGroupStartOpen.bind(this));
40
+ this.registerTableFunction("setGroupHeader", this.setGroupHeader.bind(this));
41
+ this.registerTableFunction("getGroups", this.userGetGroups.bind(this));
42
+ this.registerTableFunction("getGroupedData", this.userGetGroupedData.bind(this));
43
+
44
+ //register component functions
45
+ this.registerComponentFunction("row", "getGroup", this.rowGetGroup.bind(this));
46
+ }
47
+
48
+ //initialize group configuration
49
+ initialize(){
50
+ this.subscribe("table-destroy", this._blockRedrawing.bind(this));
51
+ this.subscribe("rows-wipe", this._blockRedrawing.bind(this));
52
+ this.subscribe("rows-wiped", this._restore_redrawing.bind(this));
53
+
54
+ if(this.table.options.groupBy){
55
+ if(this.table.options.groupUpdateOnCellEdit){
56
+ this.subscribe("cell-value-updated", this.cellUpdated.bind(this));
57
+ this.subscribe("row-data-changed", this.reassignRowToGroup.bind(this), 0);
58
+ }
59
+
60
+ this.subscribe("table-built", this.configureGroupSetup.bind(this));
61
+
62
+ this.subscribe("row-deleting", this.rowDeleting.bind(this));
63
+ this.subscribe("row-deleted", this.rowsUpdated.bind(this));
64
+ this.subscribe("scroll-horizontal", this.scrollHeaders.bind(this));
65
+ this.subscribe("rows-wipe", this.wipe.bind(this));
66
+ this.subscribe("rows-added", this.rowsUpdated.bind(this));
67
+ this.subscribe("row-moving", this.rowMoving.bind(this));
68
+ this.subscribe("row-adding-index", this.rowAddingIndex.bind(this));
69
+
70
+ this.subscribe("rows-sample", this.rowSample.bind(this));
71
+
72
+ this.subscribe("render-virtual-fill", this.virtualRenderFill.bind(this));
73
+ this.subscribe("table-layout", this.virtualRenderFill.bind(this));
74
+
75
+ this.registerDisplayHandler(this.displayHandler, 20);
76
+
77
+ this.initialized = true;
78
+ }
79
+ }
80
+
81
+ _blockRedrawing(){
82
+ this.blockRedraw = true;
83
+ }
84
+
85
+ _restore_redrawing(){
86
+ this.blockRedraw = false;
87
+ }
88
+
89
+ configureGroupSetup(){
90
+ if(this.table.options.groupBy){
91
+ var groupBy = this.table.options.groupBy,
92
+ startOpen = this.table.options.groupStartOpen,
93
+ groupHeader = this.table.options.groupHeader;
94
+
95
+ this.allowedValues = this.table.options.groupValues;
96
+
97
+ if(Array.isArray(groupBy) && Array.isArray(groupHeader) && groupBy.length > groupHeader.length){
98
+ console.warn("Error creating group headers, groupHeader array is shorter than groupBy array");
99
+ }
100
+
101
+ this.headerGenerator = [function(){return "";}];
102
+ this.startOpen = [function(){return false;}]; //starting state of group
103
+
104
+ this.langBind("groups|item", (langValue, lang) => {
105
+ this.headerGenerator[0] = (value, count, data) => { //header layout function
106
+ return (typeof value === "undefined" ? "" : value) + "<span>(" + count + " " + ((count === 1) ? langValue : lang.groups.items) + ")</span>";
107
+ };
108
+ });
109
+
110
+ this.groupIDLookups = [];
111
+
112
+ if(groupBy){
113
+ if(this.table.modExists("columnCalcs") && this.table.options.columnCalcs != "table" && this.table.options.columnCalcs != "both"){
114
+ this.table.modules.columnCalcs.removeCalcs();
115
+ }
116
+ }else{
117
+ if(this.table.modExists("columnCalcs") && this.table.options.columnCalcs != "group"){
118
+
119
+ var cols = this.table.columnManager.getRealColumns();
120
+
121
+ cols.forEach((col) => {
122
+ if(col.definition.topCalc){
123
+ this.table.modules.columnCalcs.initializeTopRow();
124
+ }
125
+
126
+ if(col.definition.bottomCalc){
127
+ this.table.modules.columnCalcs.initializeBottomRow();
128
+ }
129
+ });
130
+ }
131
+ }
132
+
133
+ if(!Array.isArray(groupBy)){
134
+ groupBy = [groupBy];
135
+ }
136
+
137
+ groupBy.forEach((group, i) => {
138
+ var lookupFunc, column;
139
+
140
+ if(typeof group == "function"){
141
+ lookupFunc = group;
142
+ }else{
143
+ column = this.table.columnManager.getColumnByField(group);
144
+
145
+ if(column){
146
+ lookupFunc = function(data){
147
+ return column.getFieldValue(data);
148
+ };
149
+ }else{
150
+ lookupFunc = function(data){
151
+ return data[group];
152
+ };
153
+ }
154
+ }
155
+
156
+ this.groupIDLookups.push({
157
+ field: typeof group === "function" ? false : group,
158
+ func:lookupFunc,
159
+ values:this.allowedValues ? this.allowedValues[i] : false,
160
+ });
161
+ });
162
+
163
+ if(startOpen){
164
+ if(!Array.isArray(startOpen)){
165
+ startOpen = [startOpen];
166
+ }
167
+
168
+ startOpen.forEach((level) => {
169
+ level = typeof level == "function" ? level : function(){return true;};
170
+ });
171
+
172
+ this.startOpen = startOpen;
173
+ }
174
+
175
+ if(groupHeader){
176
+ this.headerGenerator = Array.isArray(groupHeader) ? groupHeader : [groupHeader];
177
+ }
178
+ }else{
179
+ this.groupList = [];
180
+ this.groups = {};
181
+ }
182
+ }
183
+
184
+ rowSample(rows, prevValue){
185
+ if(this.table.options.groupBy){
186
+ var group = this.getGroups(false)[0];
187
+
188
+ prevValue.push(group.getRows(false)[0]);
189
+ }
190
+
191
+ return prevValue;
192
+ }
193
+
194
+ virtualRenderFill(){
195
+ const layout = this.layoutMode();
196
+ if (
197
+ layout === "fitDataFill"
198
+ || layout === "fitDataStretch"
199
+ || layout === "fitColumns"
200
+ ) {
201
+ this.table.rowManager.tableElement.style.minWidth =
202
+ this.table.columnManager.getWidth() + "px";
203
+ }
204
+ }
205
+
206
+ rowAddingIndex(row, index, top){
207
+ if(this.table.options.groupBy){
208
+ this.assignRowToGroup(row);
209
+
210
+ var groupRows = row.modules.group.rows;
211
+
212
+ if(groupRows.length > 1){
213
+ if(!index || (index && groupRows.indexOf(index) == -1)){
214
+ if(top){
215
+ if(groupRows[0] !== row){
216
+ index = groupRows[0];
217
+ this.table.rowManager.moveRowInArray(row.modules.group.rows, row, index, !top);
218
+ }
219
+ }else{
220
+ if(groupRows[groupRows.length -1] !== row){
221
+ index = groupRows[groupRows.length -1];
222
+ this.table.rowManager.moveRowInArray(row.modules.group.rows, row, index, !top);
223
+ }
224
+ }
225
+ }else{
226
+ this.table.rowManager.moveRowInArray(row.modules.group.rows, row, index, !top);
227
+ }
228
+ }
229
+
230
+ return index;
231
+ }
232
+ }
233
+
234
+ trackChanges(){
235
+ this.dispatch("group-changed");
236
+ }
237
+
238
+ ///////////////////////////////////
239
+ ///////// Table Functions /////////
240
+ ///////////////////////////////////
241
+
242
+ setGroupBy(groups){
243
+ this.table.options.groupBy = groups;
244
+
245
+ if(!this.initialized){
246
+ this.initialize();
247
+ }
248
+
249
+ this.configureGroupSetup();
250
+
251
+ if(!groups && this.table.modExists("columnCalcs") && this.table.options.columnCalcs === true){
252
+ this.table.modules.columnCalcs.reinitializeCalcs();
253
+ }
254
+
255
+ this.refreshData();
256
+
257
+ this.trackChanges();
258
+ }
259
+
260
+ setGroupValues(groupValues){
261
+ this.table.options.groupValues = groupValues;
262
+ this.configureGroupSetup();
263
+ this.refreshData();
264
+
265
+ this.trackChanges();
266
+ }
267
+
268
+ setGroupStartOpen(values){
269
+ this.table.options.groupStartOpen = values;
270
+ this.configureGroupSetup();
271
+
272
+ if(this.table.options.groupBy){
273
+ this.refreshData();
274
+
275
+ this.trackChanges();
276
+ }else{
277
+ console.warn("Grouping Update - cant refresh view, no groups have been set");
278
+ }
279
+ }
280
+
281
+ setGroupHeader(values){
282
+ this.table.options.groupHeader = values;
283
+ this.configureGroupSetup();
284
+
285
+ if(this.table.options.groupBy){
286
+ this.refreshData();
287
+
288
+ this.trackChanges();
289
+ }else{
290
+ console.warn("Grouping Update - cant refresh view, no groups have been set");
291
+ }
292
+ }
293
+
294
+ userGetGroups(values){
295
+ return this.getGroups(true);
296
+ }
297
+
298
+ // get grouped table data in the same format as getData()
299
+ userGetGroupedData(){
300
+ return this.table.options.groupBy ? this.getGroupedData() : this.getData();
301
+ }
302
+
303
+
304
+ ///////////////////////////////////////
305
+ ///////// Component Functions /////////
306
+ ///////////////////////////////////////
307
+
308
+ rowGetGroup(row){
309
+ return row.modules.group ? row.modules.group.getComponent() : false;
310
+ }
311
+
312
+ ///////////////////////////////////
313
+ ///////// Internal Logic //////////
314
+ ///////////////////////////////////
315
+
316
+ rowMoving(from, to, after){
317
+ if(this.table.options.groupBy){
318
+ if(!after && to instanceof Group){
319
+ to = this.table.rowManager.prevDisplayRow(from) || to;
320
+ }
321
+
322
+ var toGroup = to instanceof Group ? to : to.modules.group;
323
+ var fromGroup = from instanceof Group ? from : from.modules.group;
324
+
325
+ if(toGroup === fromGroup){
326
+ this.table.rowManager.moveRowInArray(toGroup.rows, from, to, after);
327
+ }else{
328
+ if(fromGroup){
329
+ fromGroup.removeRow(from);
330
+ }
331
+
332
+ toGroup.insertRow(from, to, after);
333
+ }
334
+ }
335
+ }
336
+
337
+
338
+ rowDeleting(row){
339
+ //remove from group
340
+ if(this.table.options.groupBy && row.modules.group){
341
+ row.modules.group.removeRow(row);
342
+ }
343
+ }
344
+
345
+ rowsUpdated(row){
346
+ if(this.table.options.groupBy){
347
+ this.updateGroupRows(true);
348
+ }
349
+ }
350
+
351
+ cellUpdated(cell){
352
+ if(this.table.options.groupBy){
353
+ this.reassignRowToGroup(cell.row);
354
+ }
355
+ }
356
+
357
+ //return appropriate rows with group headers
358
+ getRows(rows){
359
+ if(this.table.options.groupBy && this.groupIDLookups.length){
360
+
361
+ this.dispatchExternal("dataGrouping");
362
+
363
+ this.generateGroups(rows);
364
+
365
+ if(this.subscribedExternal("dataGrouped")){
366
+ this.dispatchExternal("dataGrouped", this.getGroups(true));
367
+ }
368
+
369
+ return this.updateGroupRows();
370
+
371
+ }else{
372
+ return rows.slice(0);
373
+ }
374
+ }
375
+
376
+ getGroups(component){
377
+ var groupComponents = [];
378
+
379
+ this.groupList.forEach(function(group){
380
+ groupComponents.push(component ? group.getComponent() : group);
381
+ });
382
+
383
+ return groupComponents;
384
+ }
385
+
386
+ getChildGroups(group){
387
+ var groupComponents = [];
388
+
389
+ if(!group){
390
+ group = this;
391
+ }
392
+
393
+ group.groupList.forEach((child) => {
394
+ if(child.groupList.length){
395
+ groupComponents = groupComponents.concat(this.getChildGroups(child));
396
+ }else{
397
+ groupComponents.push(child);
398
+ }
399
+ });
400
+
401
+ return groupComponents;
402
+ }
403
+
404
+ wipe(){
405
+ if(this.table.options.groupBy){
406
+ this.groupList.forEach(function(group){
407
+ group.wipe();
408
+ });
409
+
410
+ this.groupList = [];
411
+ this.groups = {};
412
+ }
413
+ }
414
+
415
+ pullGroupListData(groupList) {
416
+ var groupListData = [];
417
+
418
+ groupList.forEach((group) => {
419
+ var groupHeader = {};
420
+ groupHeader.level = 0;
421
+ groupHeader.rowCount = 0;
422
+ groupHeader.headerContent = "";
423
+ var childData = [];
424
+
425
+ if (group.hasSubGroups) {
426
+ childData = this.pullGroupListData(group.groupList);
427
+
428
+ groupHeader.level = group.level;
429
+ groupHeader.rowCount = childData.length - group.groupList.length; // data length minus number of sub-headers
430
+ groupHeader.headerContent = group.generator(group.key, groupHeader.rowCount, group.rows, group);
431
+
432
+ groupListData.push(groupHeader);
433
+ groupListData = groupListData.concat(childData);
434
+ }
435
+
436
+ else {
437
+ groupHeader.level = group.level;
438
+ groupHeader.headerContent = group.generator(group.key, group.rows.length, group.rows, group);
439
+ groupHeader.rowCount = group.getRows().length;
440
+
441
+ groupListData.push(groupHeader);
442
+
443
+ group.getRows().forEach((row) => {
444
+ groupListData.push(row.getData("data"));
445
+ });
446
+ }
447
+ });
448
+
449
+ return groupListData;
450
+ }
451
+
452
+ getGroupedData(){
453
+
454
+ return this.pullGroupListData(this.groupList);
455
+ }
456
+
457
+ getRowGroup(row){
458
+ var match = false;
459
+
460
+ if(this.options("dataTree")){
461
+ row = this.table.modules.dataTree.getTreeParentRoot(row);
462
+ }
463
+
464
+ this.groupList.forEach((group) => {
465
+ var result = group.getRowGroup(row);
466
+
467
+ if(result){
468
+ match = result;
469
+ }
470
+ });
471
+
472
+ return match;
473
+ }
474
+
475
+ countGroups(){
476
+ return this.groupList.length;
477
+ }
478
+
479
+ generateGroups(rows){
480
+ var oldGroups = this.groups;
481
+
482
+ this.groups = {};
483
+ this.groupList = [];
484
+
485
+ if(this.allowedValues && this.allowedValues[0]){
486
+ this.allowedValues[0].forEach((value) => {
487
+ this.createGroup(value, 0, oldGroups);
488
+ });
489
+
490
+ rows.forEach((row) => {
491
+ this.assignRowToExistingGroup(row, oldGroups);
492
+ });
493
+ }else{
494
+ rows.forEach((row) => {
495
+ this.assignRowToGroup(row, oldGroups);
496
+ });
497
+ }
498
+
499
+ Object.values(oldGroups).forEach((group) => {
500
+ group.wipe(true);
501
+ });
502
+ }
503
+
504
+
505
+ createGroup(groupID, level, oldGroups){
506
+ var groupKey = level + "_" + groupID,
507
+ group;
508
+
509
+ oldGroups = oldGroups || [];
510
+
511
+ group = new Group(this, false, level, groupID, this.groupIDLookups[0].field, this.headerGenerator[0], oldGroups[groupKey]);
512
+
513
+ this.groups[groupKey] = group;
514
+ this.groupList.push(group);
515
+ }
516
+
517
+ assignRowToExistingGroup(row, oldGroups){
518
+ var groupID = this.groupIDLookups[0].func(row.getData()),
519
+ groupKey = "0_" + groupID;
520
+
521
+ if(this.groups[groupKey]){
522
+ this.groups[groupKey].addRow(row);
523
+ }
524
+ }
525
+
526
+ assignRowToGroup(row, oldGroups){
527
+ var groupID = this.groupIDLookups[0].func(row.getData()),
528
+ newGroupNeeded = !this.groups["0_" + groupID];
529
+
530
+ if(newGroupNeeded){
531
+ this.createGroup(groupID, 0, oldGroups);
532
+ }
533
+
534
+ this.groups["0_" + groupID].addRow(row);
535
+
536
+ return !newGroupNeeded;
537
+ }
538
+
539
+ reassignRowToGroup(row){
540
+ if(row.type === "row"){
541
+ var oldRowGroup = row.modules.group,
542
+ oldGroupPath = oldRowGroup.getPath(),
543
+ newGroupPath = this.getExpectedPath(row),
544
+ samePath;
545
+
546
+ // figure out if new group path is the same as old group path
547
+ samePath = (oldGroupPath.length == newGroupPath.length) && oldGroupPath.every((element, index) => {
548
+ return element === newGroupPath[index];
549
+ });
550
+
551
+ // refresh if they new path and old path aren't the same (aka the row's groupings have changed)
552
+ if(!samePath) {
553
+ oldRowGroup.removeRow(row);
554
+ this.assignRowToGroup(row, this.groups);
555
+ this.refreshData(true);
556
+ }
557
+ }
558
+ }
559
+
560
+ getExpectedPath(row) {
561
+ var groupPath = [], rowData = row.getData();
562
+
563
+ this.groupIDLookups.forEach((groupId) => {
564
+ groupPath.push(groupId.func(rowData));
565
+ });
566
+
567
+ return groupPath;
568
+ }
569
+
570
+ updateGroupRows(force){
571
+ var output = [];
572
+
573
+ if(!this.blockRedraw){
574
+ this.groupList.forEach((group) => {
575
+ output = output.concat(group.getHeadersAndRows());
576
+ });
577
+
578
+ if(force){
579
+ this.refreshData(true);
580
+ }
581
+ }
582
+
583
+ return output;
584
+ }
585
+
586
+ scrollHeaders(left){
587
+ if(this.table.options.groupBy){
588
+ if(this.table.options.renderHorizontal === "virtual"){
589
+ left -= this.table.columnManager.renderer.vDomPadLeft;
590
+ }
591
+
592
+ left = left + "px";
593
+
594
+ this.groupList.forEach((group) => {
595
+ group.scrollHeader(left);
596
+ });
597
+ }
598
+ }
599
+
600
+ removeGroup(group){
601
+ var groupKey = group.level + "_" + group.key,
602
+ index;
603
+
604
+ if(this.groups[groupKey]){
605
+ delete this.groups[groupKey];
606
+
607
+ index = this.groupList.indexOf(group);
608
+
609
+ if(index > -1){
610
+ this.groupList.splice(index, 1);
611
+ }
612
+ }
613
+ }
614
+
615
+ checkBasicModeGroupHeaderWidth(){
616
+ var element = this.table.rowManager.tableElement,
617
+ onlyGroupHeaders = true;
618
+
619
+ this.table.rowManager.getDisplayRows().forEach((row, index) =>{
620
+ this.table.rowManager.styleRow(row, index);
621
+ element.appendChild(row.getElement());
622
+ row.initialize(true);
623
+
624
+ if(row.type !== "group"){
625
+ onlyGroupHeaders = false;
626
+ }
627
+ });
628
+
629
+ if(onlyGroupHeaders){
630
+ element.style.minWidth = this.table.columnManager.getWidth() + "px";
631
+ }else{
632
+ element.style.minWidth = "";
633
+ }
634
+ }
635
+
636
+ }