@revolist/revogrid 4.12.2 → 4.12.4
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.
- package/dist/cjs/{app-globals-66b5e3d1.js → app-globals-f72a6199.js} +2 -2
- package/dist/cjs/{app-globals-66b5e3d1.js.map → app-globals-f72a6199.js.map} +1 -1
- package/dist/cjs/{column.drag.plugin-2c24c512.js → column.drag.plugin-f196a293.js} +181 -187
- package/dist/cjs/column.drag.plugin-f196a293.js.map +1 -0
- package/dist/cjs/{column.service-cb3d757e.js → column.service-b59380a3.js} +78 -58
- package/dist/cjs/column.service-b59380a3.js.map +1 -0
- package/dist/cjs/{dimension.helpers-4527475f.js → dimension.helpers-5b822a09.js} +3 -2
- package/dist/cjs/dimension.helpers-5b822a09.js.map +1 -0
- package/dist/cjs/{edit.utils-787a9e1d.js → edit.utils-32d4c9e4.js} +2 -2
- package/dist/cjs/{edit.utils-787a9e1d.js.map → edit.utils-32d4c9e4.js.map} +1 -1
- package/dist/cjs/{filter.button-48acc2db.js → filter.button-2708e602.js} +2 -2
- package/dist/cjs/{filter.button-48acc2db.js.map → filter.button-2708e602.js.map} +1 -1
- package/dist/cjs/{header-cell-renderer-9d81a1fe.js → header-cell-renderer-a66fe375.js} +3 -3
- package/dist/cjs/{header-cell-renderer-9d81a1fe.js.map → header-cell-renderer-a66fe375.js.map} +1 -1
- package/dist/cjs/{index-bdea2cb6.js → index-8006d065.js} +8 -1
- package/dist/cjs/index-8006d065.js.map +1 -0
- package/dist/cjs/index.cjs.js +26 -10
- package/dist/cjs/index.cjs.js.map +1 -1
- package/dist/cjs/{key.utils-fcd0dda2.js → key.utils-05f14738.js} +2 -2
- package/dist/cjs/{key.utils-fcd0dda2.js.map → key.utils-05f14738.js.map} +1 -1
- package/dist/cjs/loader.cjs.js +2 -2
- package/dist/cjs/revo-grid.cjs.entry.js +7 -7
- package/dist/cjs/revo-grid.cjs.js +2 -2
- package/dist/cjs/revogr-attribution_7.cjs.entry.js +7 -7
- package/dist/cjs/revogr-clipboard_3.cjs.entry.js +5 -5
- package/dist/cjs/revogr-data_4.cjs.entry.js +15 -51
- package/dist/cjs/revogr-data_4.cjs.entry.js.map +1 -1
- package/dist/cjs/revogr-filter-panel.cjs.entry.js +2 -2
- package/dist/cjs/sorting.sign-a1e9d97a.js +72 -0
- package/dist/cjs/sorting.sign-a1e9d97a.js.map +1 -0
- package/dist/cjs/{text-editor-9f64bd5e.js → text-editor-82f53111.js} +3 -3
- package/dist/cjs/{text-editor-9f64bd5e.js.map → text-editor-82f53111.js.map} +1 -1
- package/dist/cjs/{throttle-6a2a8510.js → throttle-08957661.js} +2 -2
- package/dist/cjs/{throttle-6a2a8510.js.map → throttle-08957661.js.map} +1 -1
- package/dist/cjs/{viewport.store-0c68c932.js → viewport.store-4dbfeaa3.js} +2 -2
- package/dist/cjs/{viewport.store-0c68c932.js.map → viewport.store-4dbfeaa3.js.map} +1 -1
- package/dist/collection/components/data/cell-renderer.js +1 -1
- package/dist/collection/components/data/cell-renderer.js.map +1 -1
- package/dist/collection/components/data/revogr-data.js +2 -1
- package/dist/collection/components/data/revogr-data.js.map +1 -1
- package/dist/collection/plugins/filter/filter.plugin.js +1 -5
- package/dist/collection/plugins/filter/filter.plugin.js.map +1 -1
- package/dist/collection/plugins/groupingRow/grouping.row.plugin.js +58 -57
- package/dist/collection/plugins/groupingRow/grouping.row.plugin.js.map +1 -1
- package/dist/collection/plugins/groupingRow/grouping.row.renderer.js +16 -6
- package/dist/collection/plugins/groupingRow/grouping.row.renderer.js.map +1 -1
- package/dist/collection/plugins/groupingRow/grouping.row.types.js.map +1 -1
- package/dist/collection/plugins/groupingRow/grouping.service.js +70 -54
- package/dist/collection/plugins/groupingRow/grouping.service.js.map +1 -1
- package/dist/collection/plugins/index.js +0 -1
- package/dist/collection/plugins/index.js.map +1 -1
- package/dist/collection/serve/data.js +5 -0
- package/dist/collection/store/dataSource/trimmed.plugin.js +1 -0
- package/dist/collection/store/dataSource/trimmed.plugin.js.map +1 -1
- package/dist/collection/types/interfaces.js.map +1 -1
- package/dist/collection/utils/column.utils.js +1 -1
- package/dist/collection/utils/column.utils.js.map +1 -1
- package/dist/esm/{app-globals-60fd3b54.js → app-globals-6b929fd8.js} +2 -2
- package/dist/esm/{app-globals-60fd3b54.js.map → app-globals-6b929fd8.js.map} +1 -1
- package/dist/esm/{column.drag.plugin-6a84d7b0.js → column.drag.plugin-caf3ce50.js} +180 -188
- package/dist/esm/column.drag.plugin-caf3ce50.js.map +1 -0
- package/dist/esm/{column.service-ff8f75de.js → column.service-f39c0a1d.js} +76 -59
- package/dist/esm/column.service-f39c0a1d.js.map +1 -0
- package/dist/esm/{dimension.helpers-a4dd4f76.js → dimension.helpers-5567e424.js} +3 -2
- package/dist/esm/dimension.helpers-5567e424.js.map +1 -0
- package/dist/esm/{edit.utils-dd8b5cd7.js → edit.utils-b59306be.js} +2 -2
- package/dist/esm/{edit.utils-dd8b5cd7.js.map → edit.utils-b59306be.js.map} +1 -1
- package/dist/esm/{filter.button-d9b783c1.js → filter.button-84396156.js} +2 -2
- package/dist/esm/{filter.button-d9b783c1.js.map → filter.button-84396156.js.map} +1 -1
- package/dist/esm/{header-cell-renderer-4508273a.js → header-cell-renderer-31f53644.js} +3 -3
- package/dist/esm/{header-cell-renderer-4508273a.js.map → header-cell-renderer-31f53644.js.map} +1 -1
- package/dist/esm/{index-b5695870.js → index-f6fae858.js} +8 -2
- package/dist/esm/index-f6fae858.js.map +1 -0
- package/dist/esm/index.js +11 -11
- package/dist/esm/{key.utils-38b263fb.js → key.utils-3632161b.js} +2 -2
- package/dist/esm/{key.utils-38b263fb.js.map → key.utils-3632161b.js.map} +1 -1
- package/dist/esm/loader.js +3 -3
- package/dist/esm/revo-grid.entry.js +7 -7
- package/dist/esm/revo-grid.js +3 -3
- package/dist/esm/revogr-attribution_7.entry.js +7 -7
- package/dist/esm/revogr-clipboard_3.entry.js +5 -5
- package/dist/esm/revogr-data_4.entry.js +13 -49
- package/dist/esm/revogr-data_4.entry.js.map +1 -1
- package/dist/esm/revogr-filter-panel.entry.js +2 -2
- package/dist/esm/sorting.sign-c02e3b12.js +65 -0
- package/dist/esm/sorting.sign-c02e3b12.js.map +1 -0
- package/dist/esm/{text-editor-7fbbcea7.js → text-editor-e47e56c3.js} +3 -3
- package/dist/esm/{text-editor-7fbbcea7.js.map → text-editor-e47e56c3.js.map} +1 -1
- package/dist/esm/{throttle-61be638a.js → throttle-05489451.js} +2 -2
- package/dist/esm/{throttle-61be638a.js.map → throttle-05489451.js.map} +1 -1
- package/dist/esm/{viewport.store-e66c1a9b.js → viewport.store-c18a25a6.js} +2 -2
- package/dist/esm/{viewport.store-e66c1a9b.js.map → viewport.store-c18a25a6.js.map} +1 -1
- package/dist/revo-grid/app-globals-6b929fd8.js +5 -0
- package/dist/revo-grid/column.drag.plugin-caf3ce50.js +5 -0
- package/dist/revo-grid/column.drag.plugin-caf3ce50.js.map +1 -0
- package/dist/revo-grid/column.service-f39c0a1d.js +5 -0
- package/dist/revo-grid/column.service-f39c0a1d.js.map +1 -0
- package/dist/revo-grid/{dimension.helpers-a4dd4f76.js → dimension.helpers-5567e424.js} +2 -2
- package/dist/revo-grid/{dimension.helpers-a4dd4f76.js.map → dimension.helpers-5567e424.js.map} +1 -1
- package/dist/revo-grid/edit.utils-b59306be.js +5 -0
- package/dist/revo-grid/{filter.button-d9b783c1.js → filter.button-84396156.js} +2 -2
- package/dist/revo-grid/{header-cell-renderer-4508273a.js → header-cell-renderer-31f53644.js} +2 -2
- package/dist/revo-grid/index-f6fae858.js +6 -0
- package/dist/revo-grid/index-f6fae858.js.map +1 -0
- package/dist/revo-grid/index.esm.js +1 -1
- package/dist/revo-grid/index.esm.js.map +1 -1
- package/dist/revo-grid/key.utils-3632161b.js +5 -0
- package/dist/revo-grid/revo-grid.entry.js +1 -1
- package/dist/revo-grid/revo-grid.entry.js.map +1 -1
- package/dist/revo-grid/revo-grid.esm.js +1 -1
- package/dist/revo-grid/revogr-attribution_7.entry.js +1 -1
- package/dist/revo-grid/revogr-clipboard_3.entry.js +1 -1
- package/dist/revo-grid/revogr-data_4.entry.js +1 -1
- package/dist/revo-grid/revogr-data_4.entry.js.map +1 -1
- package/dist/revo-grid/revogr-filter-panel.entry.js +1 -1
- package/dist/revo-grid/sorting.sign-c02e3b12.js +5 -0
- package/dist/revo-grid/sorting.sign-c02e3b12.js.map +1 -0
- package/dist/revo-grid/text-editor-e47e56c3.js +5 -0
- package/dist/revo-grid/{throttle-61be638a.js → throttle-05489451.js} +2 -2
- package/dist/revo-grid/{viewport.store-e66c1a9b.js → viewport.store-c18a25a6.js} +2 -2
- package/dist/types/plugins/filter/filter.plugin.d.ts +2 -1
- package/dist/types/plugins/groupingRow/grouping.row.plugin.d.ts +8 -4
- package/dist/types/plugins/groupingRow/grouping.row.renderer.d.ts +6 -3
- package/dist/types/plugins/groupingRow/grouping.row.types.d.ts +6 -3
- package/dist/types/plugins/groupingRow/grouping.service.d.ts +0 -1
- package/dist/types/plugins/index.d.ts +0 -1
- package/dist/types/store/dataSource/trimmed.plugin.d.ts +3 -1
- package/dist/types/types/interfaces.d.ts +19 -0
- package/dist/types/utils/column.utils.d.ts +1 -1
- package/hydrate/index.js +187 -158
- package/hydrate/index.mjs +187 -158
- package/package.json +1 -1
- package/standalone/column.service.js +73 -56
- package/standalone/column.service.js.map +1 -1
- package/standalone/data.store.js +1 -0
- package/standalone/data.store.js.map +1 -1
- package/standalone/index.js +3 -2
- package/standalone/index.js.map +1 -1
- package/standalone/revo-grid.js +174 -182
- package/standalone/revo-grid.js.map +1 -1
- package/standalone/revogr-data2.js +19 -9
- package/standalone/revogr-data2.js.map +1 -1
- package/standalone/revogr-header2.js +1 -1
- package/standalone/revogr-overlay-selection2.js +1 -1
- package/dist/cjs/column.drag.plugin-2c24c512.js.map +0 -1
- package/dist/cjs/column.service-cb3d757e.js.map +0 -1
- package/dist/cjs/dimension.helpers-4527475f.js.map +0 -1
- package/dist/cjs/index-bdea2cb6.js.map +0 -1
- package/dist/cjs/sorting.sign-83d75503.js +0 -15
- package/dist/cjs/sorting.sign-83d75503.js.map +0 -1
- package/dist/esm/column.drag.plugin-6a84d7b0.js.map +0 -1
- package/dist/esm/column.service-ff8f75de.js.map +0 -1
- package/dist/esm/dimension.helpers-a4dd4f76.js.map +0 -1
- package/dist/esm/index-b5695870.js.map +0 -1
- package/dist/esm/sorting.sign-e096163a.js +0 -13
- package/dist/esm/sorting.sign-e096163a.js.map +0 -1
- package/dist/revo-grid/app-globals-60fd3b54.js +0 -5
- package/dist/revo-grid/column.drag.plugin-6a84d7b0.js +0 -5
- package/dist/revo-grid/column.drag.plugin-6a84d7b0.js.map +0 -1
- package/dist/revo-grid/column.service-ff8f75de.js +0 -5
- package/dist/revo-grid/column.service-ff8f75de.js.map +0 -1
- package/dist/revo-grid/edit.utils-dd8b5cd7.js +0 -5
- package/dist/revo-grid/index-b5695870.js +0 -6
- package/dist/revo-grid/index-b5695870.js.map +0 -1
- package/dist/revo-grid/key.utils-38b263fb.js +0 -5
- package/dist/revo-grid/sorting.sign-e096163a.js +0 -5
- package/dist/revo-grid/sorting.sign-e096163a.js.map +0 -1
- package/dist/revo-grid/text-editor-7fbbcea7.js +0 -5
- /package/dist/revo-grid/{app-globals-60fd3b54.js.map → app-globals-6b929fd8.js.map} +0 -0
- /package/dist/revo-grid/{edit.utils-dd8b5cd7.js.map → edit.utils-b59306be.js.map} +0 -0
- /package/dist/revo-grid/{filter.button-d9b783c1.js.map → filter.button-84396156.js.map} +0 -0
- /package/dist/revo-grid/{header-cell-renderer-4508273a.js.map → header-cell-renderer-31f53644.js.map} +0 -0
- /package/dist/revo-grid/{key.utils-38b263fb.js.map → key.utils-3632161b.js.map} +0 -0
- /package/dist/revo-grid/{text-editor-7fbbcea7.js.map → text-editor-e47e56c3.js.map} +0 -0
- /package/dist/revo-grid/{throttle-61be638a.js.map → throttle-05489451.js.map} +0 -0
- /package/dist/revo-grid/{viewport.store-e66c1a9b.js.map → viewport.store-c18a25a6.js.map} +0 -0
|
@@ -4,11 +4,16 @@
|
|
|
4
4
|
import { getPhysical, setItems, columnTypes, } from "../../store/index";
|
|
5
5
|
import { BasePlugin } from "../base.plugin";
|
|
6
6
|
import { FILTER_TRIMMED_TYPE } from "../filter/filter.plugin";
|
|
7
|
+
import { SortingPlugin } from "../sorting/sorting.plugin";
|
|
7
8
|
import { GROUPING_ROW_TYPE, PSEUDO_GROUP_COLUMN, } from "./grouping.const";
|
|
8
9
|
import { doExpand, doCollapse } from "./grouping.row.expand.service";
|
|
9
10
|
import { gatherGrouping, getExpanded, getSource, isGrouping, isGroupingColumn, } from "./grouping.service";
|
|
10
11
|
import { processDoubleConversionTrimmed, TRIMMED_GROUPING, } from "./grouping.trimmed.service";
|
|
11
|
-
|
|
12
|
+
export * from './grouping.const';
|
|
13
|
+
export * from './grouping.row.expand.service';
|
|
14
|
+
export * from './grouping.row.types';
|
|
15
|
+
export * from './grouping.service';
|
|
16
|
+
export * from './grouping.row.renderer';
|
|
12
17
|
export class GroupingRowPlugin extends BasePlugin {
|
|
13
18
|
getStore(type = GROUPING_ROW_TYPE) {
|
|
14
19
|
return this.providers.data.stores[type].store;
|
|
@@ -92,53 +97,6 @@ export class GroupingRowPlugin extends BasePlugin {
|
|
|
92
97
|
const sortingPlugin = this.providers.plugins.getByClass(SortingPlugin);
|
|
93
98
|
return !!(sortingPlugin === null || sortingPlugin === void 0 ? void 0 : sortingPlugin.sortingPromise);
|
|
94
99
|
}
|
|
95
|
-
// subscribe to grid events to process them accordingly
|
|
96
|
-
subscribe() {
|
|
97
|
-
/** if grouping present and new data source arrived */
|
|
98
|
-
this.addEventListener('beforesourceset', ({ detail }) => {
|
|
99
|
-
var _a, _b, _c;
|
|
100
|
-
if (!(((_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.props) === null || _b === void 0 ? void 0 : _b.length) && ((_c = detail === null || detail === void 0 ? void 0 : detail.source) === null || _c === void 0 ? void 0 : _c.length))) {
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
// if sorting is running don't apply grouping, wait for sorting, then it'll apply in @aftersortingapply
|
|
104
|
-
if (this.isSortingRunning()) {
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
this.onDataSet(detail);
|
|
108
|
-
});
|
|
109
|
-
this.addEventListener('beforecolumnsset', ({ detail }) => {
|
|
110
|
-
this.setColumns(detail);
|
|
111
|
-
});
|
|
112
|
-
/**
|
|
113
|
-
* filter applied need to clear grouping and apply again
|
|
114
|
-
* based on new results can be new grouping
|
|
115
|
-
*/
|
|
116
|
-
this.addEventListener('beforetrimmed', ({ detail: { trimmed, trimmedType } }) => this.beforeTrimmedApply(trimmed, trimmedType));
|
|
117
|
-
/**
|
|
118
|
-
* sorting applied need to clear grouping and apply again
|
|
119
|
-
* based on new results whole grouping order will changed
|
|
120
|
-
*/
|
|
121
|
-
this.addEventListener('aftersortingapply', () => {
|
|
122
|
-
var _a, _b;
|
|
123
|
-
if (!((_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.props) === null || _b === void 0 ? void 0 : _b.length)) {
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
this.doSourceUpdate(Object.assign({}, this.options));
|
|
127
|
-
});
|
|
128
|
-
/**
|
|
129
|
-
* Apply logic for focus inside of grouping
|
|
130
|
-
* We can't focus on grouping rows, navigation only inside of groups for now
|
|
131
|
-
*/
|
|
132
|
-
this.addEventListener('beforecellfocus', e => this.onFocus(e));
|
|
133
|
-
/**
|
|
134
|
-
* Prevent rgRow drag outside the group
|
|
135
|
-
*/
|
|
136
|
-
this.addEventListener('roworderchanged', e => this.onDrag(e));
|
|
137
|
-
/**
|
|
138
|
-
* When grouping expand icon was clicked
|
|
139
|
-
*/
|
|
140
|
-
this.addEventListener('groupexpandclick', e => this.onExpand(e.detail));
|
|
141
|
-
}
|
|
142
100
|
/**
|
|
143
101
|
* Starts global source update with group clearing and applying new one
|
|
144
102
|
* Initiated when need to reapply grouping
|
|
@@ -155,11 +113,11 @@ export class GroupingRowPlugin extends BasePlugin {
|
|
|
155
113
|
* Group again
|
|
156
114
|
* @param oldNewIndexMap - provides us mapping with new indexes vs old indexes
|
|
157
115
|
*/
|
|
158
|
-
const { sourceWithGroups, depth, trimmed, oldNewIndexMap,
|
|
116
|
+
const { sourceWithGroups, depth, trimmed, oldNewIndexMap, } = gatherGrouping(source, ((_a = this.options) === null || _a === void 0 ? void 0 : _a.props) || [], expanded);
|
|
159
117
|
const customRenderer = options === null || options === void 0 ? void 0 : options.groupLabelTemplate;
|
|
160
118
|
// setup source
|
|
161
119
|
this.providers.data.setData(sourceWithGroups, GROUPING_ROW_TYPE, this.revogrid.disableVirtualY, { depth, customRenderer }, true);
|
|
162
|
-
this.updateTrimmed(trimmed,
|
|
120
|
+
this.updateTrimmed(trimmed, oldNewIndexes !== null && oldNewIndexes !== void 0 ? oldNewIndexes : {}, oldNewIndexMap);
|
|
163
121
|
}
|
|
164
122
|
/**
|
|
165
123
|
* Apply grouping on data set
|
|
@@ -175,13 +133,13 @@ export class GroupingRowPlugin extends BasePlugin {
|
|
|
175
133
|
}
|
|
176
134
|
const source = data.source.filter(s => !isGrouping(s));
|
|
177
135
|
const options = Object.assign(Object.assign({}, (this.revogrid.grouping || {})), { prevExpanded: preservedExpanded });
|
|
178
|
-
const { sourceWithGroups, depth, trimmed, oldNewIndexMap,
|
|
136
|
+
const { sourceWithGroups, depth, trimmed, oldNewIndexMap, } = gatherGrouping(source, ((_b = this.options) === null || _b === void 0 ? void 0 : _b.props) || [], options);
|
|
179
137
|
data.source = sourceWithGroups;
|
|
180
138
|
this.providers.data.setGrouping({ depth });
|
|
181
|
-
this.updateTrimmed(trimmed,
|
|
139
|
+
this.updateTrimmed(trimmed, oldNewIndexMap);
|
|
182
140
|
}
|
|
183
141
|
/**
|
|
184
|
-
*
|
|
142
|
+
* External call to apply grouping. Called by revogrid when prop changed.
|
|
185
143
|
*/
|
|
186
144
|
setGrouping(options) {
|
|
187
145
|
var _a, _b;
|
|
@@ -193,12 +151,12 @@ export class GroupingRowPlugin extends BasePlugin {
|
|
|
193
151
|
this.clearGrouping();
|
|
194
152
|
return;
|
|
195
153
|
}
|
|
196
|
-
// props exist and source
|
|
154
|
+
// props exist and source initd
|
|
197
155
|
const { source } = getSource(this.getStore().get('source'), this.getStore().get('proxyItems'));
|
|
198
156
|
if (source.length) {
|
|
199
157
|
this.doSourceUpdate(Object.assign({}, options));
|
|
200
158
|
}
|
|
201
|
-
// props exist and columns
|
|
159
|
+
// props exist and columns initd
|
|
202
160
|
for (let t of columnTypes) {
|
|
203
161
|
if (this.setColumnGrouping(this.providers.column.getColumns(t))) {
|
|
204
162
|
this.providers.column.refreshByType(t);
|
|
@@ -206,7 +164,50 @@ export class GroupingRowPlugin extends BasePlugin {
|
|
|
206
164
|
}
|
|
207
165
|
}
|
|
208
166
|
// if has any grouping subscribe to events again
|
|
209
|
-
|
|
167
|
+
/** if grouping present and new data source arrived */
|
|
168
|
+
this.addEventListener('beforesourceset', ({ detail }) => {
|
|
169
|
+
var _a, _b, _c;
|
|
170
|
+
if (!(((_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.props) === null || _b === void 0 ? void 0 : _b.length) && ((_c = detail === null || detail === void 0 ? void 0 : detail.source) === null || _c === void 0 ? void 0 : _c.length))) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
// if sorting is running don't apply grouping, wait for sorting, then it'll apply in @aftersortingapply
|
|
174
|
+
if (this.isSortingRunning()) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
this.onDataSet(detail);
|
|
178
|
+
});
|
|
179
|
+
this.addEventListener('beforecolumnsset', ({ detail }) => {
|
|
180
|
+
this.setColumns(detail);
|
|
181
|
+
});
|
|
182
|
+
/**
|
|
183
|
+
* filter applied need to clear grouping and apply again
|
|
184
|
+
* based on new results can be new grouping
|
|
185
|
+
*/
|
|
186
|
+
this.addEventListener('beforetrimmed', ({ detail: { trimmed, trimmedType } }) => this.beforeTrimmedApply(trimmed, trimmedType));
|
|
187
|
+
/**
|
|
188
|
+
* sorting applied need to clear grouping and apply again
|
|
189
|
+
* based on new results whole grouping order will changed
|
|
190
|
+
*/
|
|
191
|
+
this.addEventListener('aftersortingapply', () => {
|
|
192
|
+
var _a, _b;
|
|
193
|
+
if (!((_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.props) === null || _b === void 0 ? void 0 : _b.length)) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
this.doSourceUpdate(Object.assign({}, this.options));
|
|
197
|
+
});
|
|
198
|
+
/**
|
|
199
|
+
* Apply logic for focus inside of grouping
|
|
200
|
+
* We can't focus on grouping rows, navigation only inside of groups for now
|
|
201
|
+
*/
|
|
202
|
+
this.addEventListener('beforecellfocus', e => this.onFocus(e));
|
|
203
|
+
/**
|
|
204
|
+
* Prevent rgRow drag outside the group
|
|
205
|
+
*/
|
|
206
|
+
this.addEventListener('roworderchanged', e => this.onDrag(e));
|
|
207
|
+
/**
|
|
208
|
+
* When grouping expand icon was clicked
|
|
209
|
+
*/
|
|
210
|
+
this.addEventListener('groupexpandclick', e => this.onExpand(e.detail));
|
|
210
211
|
}
|
|
211
212
|
// clear grouping
|
|
212
213
|
clearGrouping() {
|
|
@@ -230,7 +231,7 @@ export class GroupingRowPlugin extends BasePlugin {
|
|
|
230
231
|
this.providers.data.setData(source, GROUPING_ROW_TYPE, this.revogrid.disableVirtualY, undefined, true);
|
|
231
232
|
this.updateTrimmed(undefined, undefined, oldNewIndexes);
|
|
232
233
|
}
|
|
233
|
-
updateTrimmed(trimmedGroup = {},
|
|
234
|
+
updateTrimmed(trimmedGroup = {}, firstLevelMap = {}, secondLevelMap) {
|
|
234
235
|
// map previously trimmed data
|
|
235
236
|
const trimemedOptionsToUpgrade = processDoubleConversionTrimmed(this.getStore().get('trimmed'), firstLevelMap, secondLevelMap);
|
|
236
237
|
for (let type in trimemedOptionsToUpgrade) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grouping.row.plugin.js","sourceRoot":"","sources":["../../../src/plugins/groupingRow/grouping.row.plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getPhysical,\n setItems,\n columnTypes,\n type TrimmedEntity,\n type DSourceState,\n} from '@store';\nimport { BasePlugin } from '../base.plugin';\nimport { FILTER_TRIMMED_TYPE } from '../filter/filter.plugin';\nimport {\n GROUPING_ROW_TYPE,\n PSEUDO_GROUP_COLUMN,\n} from './grouping.const';\nimport { doExpand, doCollapse } from './grouping.row.expand.service';\nimport type {\n BeforeSourceSetEvent,\n ExpandedOptions,\n GroupingOptions,\n OnExpandEvent,\n} from './grouping.row.types';\nimport {\n gatherGrouping,\n getExpanded,\n getSource,\n isGrouping,\n isGroupingColumn,\n} from './grouping.service';\nimport {\n processDoubleConversionTrimmed,\n TRIMMED_GROUPING,\n} from './grouping.trimmed.service';\nimport type {\n BeforeSaveDataDetails,\n ColumnRegular,\n DataType,\n DimensionRows,\n PluginProviders,\n} from '@type';\nimport type { Observable, ColumnCollection } from '../../utils';\nimport { SortingPlugin } from '../sorting/sorting.plugin';\n\ndeclare global {\n interface HTMLRevoGridElementEventMap {\n groupexpandclick: OnExpandEvent;\n }\n}\n\nexport class GroupingRowPlugin extends BasePlugin {\n private options: GroupingOptions | undefined;\n\n getStore(\n type: DimensionRows = GROUPING_ROW_TYPE,\n ): Observable<DSourceState<DataType, DimensionRows>> {\n return this.providers.data.stores[type].store;\n }\n\n constructor(\n public revogrid: HTMLRevoGridElement,\n public providers: PluginProviders,\n ) {\n super(revogrid, providers);\n }\n\n // befoce cell focus\n private onFocus(e: CustomEvent<BeforeSaveDataDetails>) {\n if (isGrouping(e.detail.model)) {\n e.preventDefault();\n }\n }\n\n // expand event triggered\n private onExpand({ virtualIndex }: OnExpandEvent) {\n const { source } = getSource(\n this.getStore().get('source'),\n this.getStore().get('proxyItems'),\n );\n let newTrimmed = this.getStore().get('trimmed')[TRIMMED_GROUPING];\n\n let i = getPhysical(this.getStore(), virtualIndex);\n const isExpanded = getExpanded(source[i]);\n if (!isExpanded) {\n const { trimmed, items } = doExpand(\n virtualIndex,\n source,\n this.getStore().get('items'),\n );\n newTrimmed = { ...newTrimmed, ...trimmed };\n if (items) {\n setItems(this.getStore(), items);\n }\n } else {\n const { trimmed } = doCollapse(i, source);\n newTrimmed = { ...newTrimmed, ...trimmed };\n this.revogrid.clearFocus();\n }\n\n this.getStore().set('source', source);\n this.revogrid.addTrimmed(newTrimmed, TRIMMED_GROUPING);\n }\n\n private setColumnGrouping(cols?: ColumnRegular[]) {\n // if 0 column as holder\n if (cols?.length) {\n cols[0][PSEUDO_GROUP_COLUMN] = true;\n return true;\n }\n return false;\n }\n\n private setColumns({ columns }: ColumnCollection) {\n for (let type of columnTypes) {\n if (this.setColumnGrouping(columns[type])) {\n break;\n }\n }\n }\n\n // evaluate drag between groups\n private onDrag(e: CustomEvent<{ from: number; to: number }>) {\n const { from, to } = e.detail;\n const isDown = to - from >= 0;\n const { source } = getSource(\n this.getStore().get('source'),\n this.getStore().get('proxyItems'),\n );\n const items = this.getStore().get('items');\n let i = isDown ? from : to;\n const end = isDown ? to : from;\n for (; i < end; i++) {\n const model = source[items[i]];\n const isGroup = isGrouping(model);\n if (isGroup) {\n e.preventDefault();\n return;\n }\n }\n }\n\n private beforeTrimmedApply(trimmed: Record<number, boolean>, type: string) {\n /** Before filter apply remove grouping filtering */\n if (type === FILTER_TRIMMED_TYPE) {\n const source = this.getStore().get('source');\n for (let index in trimmed) {\n if (trimmed[index] && isGrouping(source[index])) {\n trimmed[index] = false;\n }\n }\n }\n }\n\n private isSortingRunning() {\n const sortingPlugin = this.providers.plugins.getByClass(SortingPlugin);\n return !!sortingPlugin?.sortingPromise;\n }\n\n // subscribe to grid events to process them accordingly\n private subscribe() {\n /** if grouping present and new data source arrived */\n this.addEventListener('beforesourceset', ({ detail }) => {\n if (!(this.options?.props?.length && detail?.source?.length)) {\n return;\n }\n // if sorting is running don't apply grouping, wait for sorting, then it'll apply in @aftersortingapply\n if (this.isSortingRunning()) {\n return;\n }\n this.onDataSet(detail);\n });\n this.addEventListener('beforecolumnsset', ({ detail }) => {\n this.setColumns(detail);\n });\n\n /**\n * filter applied need to clear grouping and apply again\n * based on new results can be new grouping\n */\n this.addEventListener(\n 'beforetrimmed',\n ({ detail: { trimmed, trimmedType } }) =>\n this.beforeTrimmedApply(trimmed, trimmedType),\n );\n /**\n * sorting applied need to clear grouping and apply again\n * based on new results whole grouping order will changed\n */\n this.addEventListener('aftersortingapply', () => {\n if (!this.options?.props?.length) {\n return;\n }\n this.doSourceUpdate({ ...this.options });\n });\n\n /**\n * Apply logic for focus inside of grouping\n * We can't focus on grouping rows, navigation only inside of groups for now\n */\n this.addEventListener('beforecellfocus', e => this.onFocus(e));\n /**\n * Prevent rgRow drag outside the group\n */\n this.addEventListener('roworderchanged', e => this.onDrag(e));\n\n /**\n * When grouping expand icon was clicked\n */\n this.addEventListener('groupexpandclick', e => this.onExpand(e.detail));\n }\n\n /**\n * Starts global source update with group clearing and applying new one\n * Initiated when need to reapply grouping\n */\n private doSourceUpdate(options?: ExpandedOptions) {\n /**\n * Get source without grouping\n * @param newOldIndexMap - provides us mapping with new indexes vs old indexes, we would use it for trimmed mapping\n */\n const { source, prevExpanded, oldNewIndexes } = getSource(\n this.getStore().get('source'),\n this.getStore().get('proxyItems'),\n true,\n );\n const expanded: ExpandedOptions = {\n prevExpanded,\n ...options,\n };\n /**\n * Group again\n * @param oldNewIndexMap - provides us mapping with new indexes vs old indexes\n */\n const {\n sourceWithGroups,\n depth,\n trimmed,\n oldNewIndexMap,\n childrenByGroup,\n } = gatherGrouping(source, this.options?.props || [], expanded);\n\n const customRenderer = options?.groupLabelTemplate;\n\n // setup source\n this.providers.data.setData(\n sourceWithGroups,\n GROUPING_ROW_TYPE,\n this.revogrid.disableVirtualY,\n { depth, customRenderer },\n true,\n );\n this.updateTrimmed(\n trimmed,\n childrenByGroup,\n oldNewIndexes ?? {},\n oldNewIndexMap,\n );\n }\n\n /**\n * Apply grouping on data set\n * Clear grouping from source\n * If source came from other plugin\n */\n private onDataSet(data: BeforeSourceSetEvent) {\n let preservedExpanded: ExpandedOptions['prevExpanded'] = {};\n if (this.options?.preserveGroupingOnUpdate !== false) {\n let { prevExpanded } = getSource(\n this.getStore().get('source'),\n this.getStore().get('proxyItems'),\n true,\n );\n preservedExpanded = prevExpanded;\n }\n const source = data.source.filter(s => !isGrouping(s));\n const options: ExpandedOptions = {\n ...(this.revogrid.grouping || {}),\n prevExpanded: preservedExpanded,\n };\n const {\n sourceWithGroups,\n depth,\n trimmed,\n oldNewIndexMap,\n childrenByGroup,\n } = gatherGrouping(source, this.options?.props || [], options);\n data.source = sourceWithGroups;\n this.providers.data.setGrouping({ depth });\n this.updateTrimmed(trimmed, childrenByGroup, oldNewIndexMap);\n }\n\n /**\n * Externam call to apply grouping. Called by revogrid when prop changed.\n */\n setGrouping(options: GroupingOptions) {\n // unsubscribe from all events when group applied\n this.clearSubscriptions();\n this.options = options;\n // clear props, no grouping exists\n if (!this.options?.props?.length) {\n this.clearGrouping();\n return;\n }\n // props exist and source inited\n const { source } = getSource(\n this.getStore().get('source'),\n this.getStore().get('proxyItems'),\n );\n if (source.length) {\n this.doSourceUpdate({ ...options });\n }\n // props exist and columns inited\n for (let t of columnTypes) {\n if (this.setColumnGrouping(this.providers.column.getColumns(t))) {\n this.providers.column.refreshByType(t);\n break;\n }\n }\n\n // if has any grouping subscribe to events again\n this.subscribe();\n }\n\n // clear grouping\n clearGrouping() {\n // clear columns\n columnTypes.forEach(t => {\n const cols = this.providers.column.getColumns(t);\n let deleted = false;\n cols.forEach(c => {\n if (isGroupingColumn(c)) {\n delete c[PSEUDO_GROUP_COLUMN];\n deleted = true;\n }\n });\n // if column store had grouping clear and refresh\n if (deleted) {\n this.providers.column.refreshByType(t);\n }\n });\n // clear rows\n const { source, oldNewIndexes } = getSource(\n this.getStore().get('source'),\n this.getStore().get('proxyItems'),\n true,\n );\n this.providers.data.setData(\n source,\n GROUPING_ROW_TYPE,\n this.revogrid.disableVirtualY,\n undefined,\n true,\n );\n this.updateTrimmed(undefined, undefined, oldNewIndexes);\n }\n\n private updateTrimmed(\n trimmedGroup: TrimmedEntity = {},\n _childrenByGroup: Record<number, number[]> = {},\n firstLevelMap: Record<number, number> = {},\n secondLevelMap?: Record<number, number>,\n ) {\n // map previously trimmed data\n const trimemedOptionsToUpgrade = processDoubleConversionTrimmed(\n this.getStore().get('trimmed'),\n firstLevelMap,\n secondLevelMap,\n );\n for (let type in trimemedOptionsToUpgrade) {\n this.revogrid.addTrimmed(trimemedOptionsToUpgrade[type], type);\n }\n\n // const emptyGroups = this.filterOutEmptyGroups(trimemedOptionsToUpgrade, childrenByGroup);\n\n // setup trimmed data for grouping\n this.revogrid.addTrimmed({ ...trimmedGroup }, TRIMMED_GROUPING);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"grouping.row.plugin.js","sourceRoot":"","sources":["../../../src/plugins/groupingRow/grouping.row.plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getPhysical,\n setItems,\n columnTypes,\n type TrimmedEntity,\n type DSourceState,\n} from '@store';\nimport type {\n BeforeSaveDataDetails,\n ColumnRegular,\n DataType,\n DimensionRows,\n PluginProviders,\n} from '@type';\n\nimport { BasePlugin } from '../base.plugin';\nimport { FILTER_TRIMMED_TYPE } from '../filter/filter.plugin';\n\nimport type { Observable, ColumnCollection } from '../../utils';\nimport { SortingPlugin } from '../sorting/sorting.plugin';\n\nimport {\n GROUPING_ROW_TYPE,\n PSEUDO_GROUP_COLUMN,\n} from './grouping.const';\nimport { doExpand, doCollapse } from './grouping.row.expand.service';\nimport type {\n BeforeSourceSetEvent,\n ExpandedOptions,\n GroupingOptions,\n OnExpandEvent,\n} from './grouping.row.types';\nimport {\n gatherGrouping,\n getExpanded,\n getSource,\n isGrouping,\n isGroupingColumn,\n} from './grouping.service';\nimport {\n processDoubleConversionTrimmed,\n TRIMMED_GROUPING,\n} from './grouping.trimmed.service';\n\nexport * from './grouping.const';\nexport * from './grouping.row.expand.service';\nexport * from './grouping.row.types';\nexport * from './grouping.service';\nexport * from './grouping.row.renderer';\n\ndeclare global {\n interface HTMLRevoGridElementEventMap {\n groupexpandclick: OnExpandEvent;\n }\n}\n\nexport class GroupingRowPlugin extends BasePlugin {\n private options: GroupingOptions | undefined;\n\n getStore(\n type: DimensionRows = GROUPING_ROW_TYPE,\n ): Observable<DSourceState<DataType, DimensionRows>> {\n return this.providers.data.stores[type].store;\n }\n\n constructor(\n public revogrid: HTMLRevoGridElement,\n public providers: PluginProviders,\n ) {\n super(revogrid, providers);\n }\n\n // befoce cell focus\n private onFocus(e: CustomEvent<BeforeSaveDataDetails>) {\n if (isGrouping(e.detail.model)) {\n e.preventDefault();\n }\n }\n\n // expand event triggered\n private onExpand({ virtualIndex }: OnExpandEvent) {\n const { source } = getSource(\n this.getStore().get('source'),\n this.getStore().get('proxyItems'),\n );\n let newTrimmed = this.getStore().get('trimmed')[TRIMMED_GROUPING];\n\n let i = getPhysical(this.getStore(), virtualIndex);\n const isExpanded = getExpanded(source[i]);\n if (!isExpanded) {\n const { trimmed, items } = doExpand(\n virtualIndex,\n source,\n this.getStore().get('items'),\n );\n newTrimmed = { ...newTrimmed, ...trimmed };\n if (items) {\n setItems(this.getStore(), items);\n }\n } else {\n const { trimmed } = doCollapse(i, source);\n newTrimmed = { ...newTrimmed, ...trimmed };\n this.revogrid.clearFocus();\n }\n\n this.getStore().set('source', source);\n this.revogrid.addTrimmed(newTrimmed, TRIMMED_GROUPING);\n }\n\n private setColumnGrouping(cols?: ColumnRegular[]) {\n // if 0 column as holder\n if (cols?.length) {\n cols[0][PSEUDO_GROUP_COLUMN] = true;\n return true;\n }\n return false;\n }\n\n private setColumns({ columns }: ColumnCollection) {\n for (let type of columnTypes) {\n if (this.setColumnGrouping(columns[type])) {\n break;\n }\n }\n }\n\n // evaluate drag between groups\n private onDrag(e: CustomEvent<{ from: number; to: number }>) {\n const { from, to } = e.detail;\n const isDown = to - from >= 0;\n const { source } = getSource(\n this.getStore().get('source'),\n this.getStore().get('proxyItems'),\n );\n const items = this.getStore().get('items');\n let i = isDown ? from : to;\n const end = isDown ? to : from;\n for (; i < end; i++) {\n const model = source[items[i]];\n const isGroup = isGrouping(model);\n if (isGroup) {\n e.preventDefault();\n return;\n }\n }\n }\n\n private beforeTrimmedApply(trimmed: Record<number, boolean>, type: string) {\n /** Before filter apply remove grouping filtering */\n if (type === FILTER_TRIMMED_TYPE) {\n const source = this.getStore().get('source');\n for (let index in trimmed) {\n if (trimmed[index] && isGrouping(source[index])) {\n trimmed[index] = false;\n }\n }\n }\n }\n\n private isSortingRunning() {\n const sortingPlugin = this.providers.plugins.getByClass(SortingPlugin);\n return !!sortingPlugin?.sortingPromise;\n }\n\n /**\n * Starts global source update with group clearing and applying new one\n * Initiated when need to reapply grouping\n */\n private doSourceUpdate(options?: ExpandedOptions) {\n /**\n * Get source without grouping\n * @param newOldIndexMap - provides us mapping with new indexes vs old indexes, we would use it for trimmed mapping\n */\n const { source, prevExpanded, oldNewIndexes } = getSource(\n this.getStore().get('source'),\n this.getStore().get('proxyItems'),\n true,\n );\n const expanded: ExpandedOptions = {\n prevExpanded,\n ...options,\n };\n /**\n * Group again\n * @param oldNewIndexMap - provides us mapping with new indexes vs old indexes\n */\n const {\n sourceWithGroups,\n depth,\n trimmed,\n oldNewIndexMap,\n } = gatherGrouping(source, this.options?.props || [], expanded);\n\n const customRenderer = options?.groupLabelTemplate;\n\n // setup source\n this.providers.data.setData(\n sourceWithGroups,\n GROUPING_ROW_TYPE,\n this.revogrid.disableVirtualY,\n { depth, customRenderer },\n true,\n );\n this.updateTrimmed(\n trimmed,\n oldNewIndexes ?? {},\n oldNewIndexMap,\n );\n }\n\n /**\n * Apply grouping on data set\n * Clear grouping from source\n * If source came from other plugin\n */\n private onDataSet(data: BeforeSourceSetEvent) {\n let preservedExpanded: ExpandedOptions['prevExpanded'] = {};\n if (this.options?.preserveGroupingOnUpdate !== false) {\n let { prevExpanded } = getSource(\n this.getStore().get('source'),\n this.getStore().get('proxyItems'),\n true,\n );\n preservedExpanded = prevExpanded;\n }\n const source = data.source.filter(s => !isGrouping(s));\n const options: ExpandedOptions = {\n ...(this.revogrid.grouping || {}),\n prevExpanded: preservedExpanded,\n };\n const {\n sourceWithGroups,\n depth,\n trimmed,\n oldNewIndexMap,\n } = gatherGrouping(source, this.options?.props || [], options);\n data.source = sourceWithGroups;\n this.providers.data.setGrouping({ depth });\n this.updateTrimmed(trimmed, oldNewIndexMap);\n }\n\n /**\n * External call to apply grouping. Called by revogrid when prop changed.\n */\n setGrouping(options: GroupingOptions) {\n // unsubscribe from all events when group applied\n this.clearSubscriptions();\n this.options = options;\n // clear props, no grouping exists\n if (!this.options?.props?.length) {\n this.clearGrouping();\n return;\n }\n // props exist and source initd\n const { source } = getSource(\n this.getStore().get('source'),\n this.getStore().get('proxyItems'),\n );\n if (source.length) {\n this.doSourceUpdate({ ...options });\n }\n // props exist and columns initd\n for (let t of columnTypes) {\n if (this.setColumnGrouping(this.providers.column.getColumns(t))) {\n this.providers.column.refreshByType(t);\n break;\n }\n }\n\n // if has any grouping subscribe to events again\n /** if grouping present and new data source arrived */\n this.addEventListener('beforesourceset', ({ detail }) => {\n if (!(this.options?.props?.length && detail?.source?.length)) {\n return;\n }\n // if sorting is running don't apply grouping, wait for sorting, then it'll apply in @aftersortingapply\n if (this.isSortingRunning()) {\n return;\n }\n this.onDataSet(detail);\n });\n this.addEventListener('beforecolumnsset', ({ detail }) => {\n this.setColumns(detail);\n });\n\n /**\n * filter applied need to clear grouping and apply again\n * based on new results can be new grouping\n */\n this.addEventListener(\n 'beforetrimmed',\n ({ detail: { trimmed, trimmedType } }) =>\n this.beforeTrimmedApply(trimmed, trimmedType),\n );\n /**\n * sorting applied need to clear grouping and apply again\n * based on new results whole grouping order will changed\n */\n this.addEventListener('aftersortingapply', () => {\n if (!this.options?.props?.length) {\n return;\n }\n this.doSourceUpdate({ ...this.options });\n });\n\n /**\n * Apply logic for focus inside of grouping\n * We can't focus on grouping rows, navigation only inside of groups for now\n */\n this.addEventListener('beforecellfocus', e => this.onFocus(e));\n /**\n * Prevent rgRow drag outside the group\n */\n this.addEventListener('roworderchanged', e => this.onDrag(e));\n\n /**\n * When grouping expand icon was clicked\n */\n this.addEventListener('groupexpandclick', e => this.onExpand(e.detail));\n }\n\n // clear grouping\n clearGrouping() {\n // clear columns\n columnTypes.forEach(t => {\n const cols = this.providers.column.getColumns(t);\n let deleted = false;\n cols.forEach(c => {\n if (isGroupingColumn(c)) {\n delete c[PSEUDO_GROUP_COLUMN];\n deleted = true;\n }\n });\n // if column store had grouping clear and refresh\n if (deleted) {\n this.providers.column.refreshByType(t);\n }\n });\n // clear rows\n const { source, oldNewIndexes } = getSource(\n this.getStore().get('source'),\n this.getStore().get('proxyItems'),\n true,\n );\n this.providers.data.setData(\n source,\n GROUPING_ROW_TYPE,\n this.revogrid.disableVirtualY,\n undefined,\n true,\n );\n this.updateTrimmed(undefined, undefined, oldNewIndexes);\n }\n\n private updateTrimmed(\n trimmedGroup: TrimmedEntity = {},\n firstLevelMap: Record<number, number> = {},\n secondLevelMap?: Record<number, number>,\n ) {\n // map previously trimmed data\n const trimemedOptionsToUpgrade = processDoubleConversionTrimmed(\n this.getStore().get('trimmed'),\n firstLevelMap,\n secondLevelMap,\n );\n for (let type in trimemedOptionsToUpgrade) {\n this.revogrid.addTrimmed(trimemedOptionsToUpgrade[type], type);\n }\n\n // const emptyGroups = this.filterOutEmptyGroups(trimemedOptionsToUpgrade, childrenByGroup);\n\n // setup trimmed data for grouping\n this.revogrid.addTrimmed({ ...trimmedGroup }, TRIMMED_GROUPING);\n }\n}\n"]}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { h } from "@stencil/core";
|
|
5
5
|
import RowRenderer from "../../components/data/row-renderer";
|
|
6
|
-
import { GROUP_DEPTH, GROUP_EXPANDED, GROUP_EXPAND_BTN, PSEUDO_GROUP_ITEM } from "./grouping.const";
|
|
7
|
-
function expandEvent(e, model, virtualIndex) {
|
|
6
|
+
import { GROUP_DEPTH, GROUP_EXPANDED, GROUP_EXPAND_BTN, PSEUDO_GROUP_ITEM, } from "./grouping.const";
|
|
7
|
+
export function expandEvent(e, model, virtualIndex) {
|
|
8
8
|
var _a;
|
|
9
9
|
const event = new CustomEvent('groupexpandclick', {
|
|
10
10
|
detail: {
|
|
@@ -16,8 +16,8 @@ function expandEvent(e, model, virtualIndex) {
|
|
|
16
16
|
});
|
|
17
17
|
(_a = e.target) === null || _a === void 0 ? void 0 : _a.dispatchEvent(event);
|
|
18
18
|
}
|
|
19
|
-
const GroupingRowRenderer = (props) => {
|
|
20
|
-
const { model, itemIndex, hasExpand, groupingCustomRenderer } = props;
|
|
19
|
+
export const GroupingRowRenderer = (props) => {
|
|
20
|
+
const { model, itemIndex, hasExpand, groupingCustomRenderer, providers } = props;
|
|
21
21
|
const name = model[PSEUDO_GROUP_ITEM];
|
|
22
22
|
const expanded = model[GROUP_EXPANDED];
|
|
23
23
|
const depth = parseInt(model[GROUP_DEPTH], 10) || 0;
|
|
@@ -25,9 +25,19 @@ const GroupingRowRenderer = (props) => {
|
|
|
25
25
|
return h(RowRenderer, Object.assign({}, props, { rowClass: "groupingRow", depth: depth }));
|
|
26
26
|
}
|
|
27
27
|
if (groupingCustomRenderer) {
|
|
28
|
-
return (h(RowRenderer, Object.assign({}, props, { rowClass: "groupingRow", depth: depth }), h("div", { onClick: e => expandEvent(e, model, itemIndex) }, groupingCustomRenderer(h, {
|
|
28
|
+
return (h(RowRenderer, Object.assign({}, props, { rowClass: "groupingRow", depth: depth }), h("div", { onClick: e => expandEvent(e, model, itemIndex) }, groupingCustomRenderer(h, {
|
|
29
|
+
name,
|
|
30
|
+
model,
|
|
31
|
+
itemIndex,
|
|
32
|
+
expanded,
|
|
33
|
+
depth,
|
|
34
|
+
providers,
|
|
35
|
+
}))));
|
|
29
36
|
}
|
|
30
|
-
return (h(RowRenderer, Object.assign({}, props, { rowClass: "groupingRow", depth: depth }), h("button", { class: { [GROUP_EXPAND_BTN]: true }, onClick: e => expandEvent(e, model, itemIndex) },
|
|
37
|
+
return (h(RowRenderer, Object.assign({}, props, { rowClass: "groupingRow", depth: depth }), h("button", { class: { [GROUP_EXPAND_BTN]: true }, onClick: e => expandEvent(e, model, itemIndex) }, expandSvgIconVNode(expanded)), name));
|
|
38
|
+
};
|
|
39
|
+
export const expandSvgIconVNode = (expanded = false) => {
|
|
40
|
+
return (h("svg", { "aria-hidden": "true", style: { transform: `rotate(${!expanded ? -90 : 0}deg)` }, focusable: "false", viewBox: "0 0 448 512" }, h("path", { fill: "currentColor", d: "M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z" })));
|
|
31
41
|
};
|
|
32
42
|
export default GroupingRowRenderer;
|
|
33
43
|
//# sourceMappingURL=grouping.row.renderer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grouping.row.renderer.js","sourceRoot":"","sources":["../../../src/plugins/groupingRow/grouping.row.renderer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,WAAyB,MAAM,oCAAoC,CAAC;AAC3E,OAAO,
|
|
1
|
+
{"version":3,"file":"grouping.row.renderer.js","sourceRoot":"","sources":["../../../src/plugins/groupingRow/grouping.row.renderer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,WAAyB,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAY1B,MAAM,UAAU,WAAW,CAAC,CAAa,EAAE,KAAe,EAAE,YAAoB;;IAC9E,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,kBAAkB,EAAE;QAChD,MAAM,EAAE;YACN,KAAK;YACL,YAAY;SACb;QACD,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,IAAI;KACd,CAAiE,CAAC;IACnE,MAAA,CAAC,CAAC,MAAM,0CAAE,aAAa,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAuB,EAAE,EAAE;IAC7D,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,sBAAsB,EAAE,SAAS,EAAE,GACtE,KAAK,CAAC;IACR,MAAM,IAAI,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAEpD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAC,WAAW,oBAAK,KAAK,IAAE,QAAQ,EAAC,aAAa,EAAC,KAAK,EAAE,KAAK,IAAI,CAAC;IACzE,CAAC;IAED,IAAI,sBAAsB,EAAE,CAAC;QAC3B,OAAO,CACL,EAAC,WAAW,oBAAK,KAAK,IAAE,QAAQ,EAAC,aAAa,EAAC,KAAK,EAAE,KAAK;YACzD,WAAK,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,IAChD,sBAAsB,CAAC,CAAC,EAAE;gBACzB,IAAI;gBACJ,KAAK;gBACL,SAAS;gBACT,QAAQ;gBACR,KAAK;gBACL,SAAS;aACV,CAAC,CACE,CACM,CACf,CAAC;IACJ,CAAC;IAED,OAAO,CACL,EAAC,WAAW,oBAAK,KAAK,IAAE,QAAQ,EAAC,aAAa,EAAC,KAAK,EAAE,KAAK;QACzD,cACE,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,EACnC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,IAE7C,kBAAkB,CAAC,QAAQ,CAAC,CACtB;QACR,IAAI,CACO,CACf,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAQ,GAAG,KAAK,EAAE,EAAE;IACrD,OAAO,CACL,0BACc,MAAM,EAClB,KAAK,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EACzD,SAAS,EAAC,OAAO,EACjB,OAAO,EAAC,aAAa;QAErB,YACE,IAAI,EAAC,cAAc,EACnB,CAAC,EAAC,yRAAyR,GACrR,CACJ,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,mBAAmB,CAAC","sourcesContent":["import { h } from '@stencil/core';\nimport RowRenderer, { RowProps } from '../../components/data/row-renderer';\nimport {\n GROUP_DEPTH,\n GROUP_EXPANDED,\n GROUP_EXPAND_BTN,\n PSEUDO_GROUP_ITEM,\n} from './grouping.const';\nimport { GroupLabelTemplateFunc } from './grouping.row.types';\nimport { DataType, PositionItem, Providers } from '@type';\n\ninterface GroupRowPros extends RowProps {\n model: DataType;\n hasExpand: boolean;\n providers: Providers;\n groupingCustomRenderer?: GroupLabelTemplateFunc | null;\n}\nexport type RowGroupingProps = GroupRowPros & PositionItem;\n\nexport function expandEvent(e: MouseEvent, model: DataType, virtualIndex: number) {\n const event = new CustomEvent('groupexpandclick', {\n detail: {\n model,\n virtualIndex,\n },\n cancelable: true,\n bubbles: true,\n }) as CustomEvent<HTMLRevoGridElementEventMap['groupexpandclick']>;\n e.target?.dispatchEvent(event);\n}\n\nexport const GroupingRowRenderer = (props: RowGroupingProps) => {\n const { model, itemIndex, hasExpand, groupingCustomRenderer, providers } =\n props;\n const name = model[PSEUDO_GROUP_ITEM];\n const expanded = model[GROUP_EXPANDED];\n const depth = parseInt(model[GROUP_DEPTH], 10) || 0;\n\n if (!hasExpand) {\n return <RowRenderer {...props} rowClass=\"groupingRow\" depth={depth} />;\n }\n\n if (groupingCustomRenderer) {\n return (\n <RowRenderer {...props} rowClass=\"groupingRow\" depth={depth}>\n <div onClick={e => expandEvent(e, model, itemIndex)}>\n {groupingCustomRenderer(h, {\n name,\n model,\n itemIndex,\n expanded,\n depth,\n providers,\n })}\n </div>\n </RowRenderer>\n );\n }\n\n return (\n <RowRenderer {...props} rowClass=\"groupingRow\" depth={depth}>\n <button\n class={{ [GROUP_EXPAND_BTN]: true }}\n onClick={e => expandEvent(e, model, itemIndex)}\n >\n {expandSvgIconVNode(expanded)}\n </button>\n {name}\n </RowRenderer>\n );\n};\n\nexport const expandSvgIconVNode = (expanded = false) => {\n return (\n <svg\n aria-hidden=\"true\"\n style={{ transform: `rotate(${!expanded ? -90 : 0}deg)` }}\n focusable=\"false\"\n viewBox=\"0 0 448 512\"\n >\n <path\n fill=\"currentColor\"\n d=\"M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z\"\n ></path>\n </svg>\n );\n};\n\nexport default GroupingRowRenderer;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grouping.row.types.js","sourceRoot":"","sources":["../../../src/plugins/groupingRow/grouping.row.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { VNode } from '@stencil/core';\nimport type {
|
|
1
|
+
{"version":3,"file":"grouping.row.types.js","sourceRoot":"","sources":["../../../src/plugins/groupingRow/grouping.row.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { VNode } from '@stencil/core';\nimport type {\n HyperFunc,\n ColumnProp,\n DimensionRows,\n DataType,\n Providers,\n} from '@type';\n\n\ninterface GroupTemplateProp {\n name: string;\n itemIndex: number;\n expanded: boolean;\n depth: number;\n providers: Providers;\n model?: DataType;\n}\n\nexport type GroupLabelTemplateFunc = (\n createElement: HyperFunc<VNode>,\n props: GroupTemplateProp,\n ...args: any[]\n) => any;\n\nexport type GroupingOptions = {\n /**\n * Column props to which grouping will be applied\n */\n props?: ColumnProp[];\n\n /**\n * Currently expanded items.\n * Corresponds to prop values as: source = [{ me: 'a' }, { me: 'b' }, { me: 'c' }], to set expanded: { a: true }\n */\n prevExpanded?: Record<string, boolean>;\n\n /**\n * Is expanded by default\n */\n expandedAll?: boolean;\n\n /**\n * Should grouping be preserved on source update.\n * default: true\n */\n preserveGroupingOnUpdate?: boolean;\n /**\n * Custom group label template\n */\n groupLabelTemplate?: GroupLabelTemplateFunc;\n} & ExpandedOptions;\n\nexport type BeforeSourceSetEvent = {\n type: DimensionRows;\n source: DataType[];\n};\n\nexport type OnExpandEvent = {\n model: DataType;\n virtualIndex: number;\n};\n\nexport type SourceGather = {\n source: DataType[];\n prevExpanded: Record<string, boolean>;\n oldNewIndexes?: Record<number, number>;\n};\n\nexport type ExpandedOptions = {\n prevExpanded?: Record<string, boolean>;\n /**\n * Is expanded by default\n */\n expandedAll?: boolean;\n\n /**\n * Custom group label value parser\n */\n getGroupValue?(item: DataType, prop: string | number): any;\n /**\n * Custom group label template\n */\n groupLabelTemplate?: GroupLabelTemplateFunc;\n};\n"]}
|
|
@@ -37,13 +37,70 @@ export function getSource(source, items, withoutGrouping = false) {
|
|
|
37
37
|
export function getExpanded(model = {}) {
|
|
38
38
|
return model[GROUP_EXPANDED];
|
|
39
39
|
}
|
|
40
|
+
function flattenGroupMaps({ groupedValues, parentIds, isExpanded, itemIndex, expandedAll, prevExpanded, columnProps, }) {
|
|
41
|
+
const depth = parentIds.length;
|
|
42
|
+
const sourceWithGroups = [];
|
|
43
|
+
// collapse all groups in the beginning
|
|
44
|
+
let trimmed = {};
|
|
45
|
+
// index mapping
|
|
46
|
+
let oldNewIndexMap = {};
|
|
47
|
+
groupedValues.forEach((innerGroupedValues, groupId) => {
|
|
48
|
+
const levelIds = [...parentIds, groupId];
|
|
49
|
+
const mergedIds = levelIds.join(',');
|
|
50
|
+
const isGroupExpanded = isExpanded && (!!expandedAll || !!prevExpanded[mergedIds]);
|
|
51
|
+
sourceWithGroups.push({
|
|
52
|
+
[PSEUDO_GROUP_ITEM]: groupId,
|
|
53
|
+
[GROUP_DEPTH]: depth,
|
|
54
|
+
[PSEUDO_GROUP_ITEM_ID]: JSON.stringify(levelIds),
|
|
55
|
+
[PSEUDO_GROUP_ITEM_VALUE]: mergedIds,
|
|
56
|
+
[GROUP_EXPANDED]: isGroupExpanded,
|
|
57
|
+
[GROUP_COLUMN_PROP]: columnProps[depth],
|
|
58
|
+
[columnProps[depth]]: groupId,
|
|
59
|
+
});
|
|
60
|
+
itemIndex += 1;
|
|
61
|
+
if (!isGroupExpanded && depth) {
|
|
62
|
+
trimmed[itemIndex] = true;
|
|
63
|
+
}
|
|
64
|
+
if (Array.isArray(innerGroupedValues)) {
|
|
65
|
+
innerGroupedValues.forEach(value => {
|
|
66
|
+
itemIndex += 1;
|
|
67
|
+
if (!isGroupExpanded) {
|
|
68
|
+
trimmed[itemIndex] = true;
|
|
69
|
+
}
|
|
70
|
+
oldNewIndexMap[value[GROUP_ORIGINAL_INDEX]] = itemIndex;
|
|
71
|
+
});
|
|
72
|
+
sourceWithGroups.push(...innerGroupedValues);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
const children = flattenGroupMaps({
|
|
76
|
+
groupedValues: innerGroupedValues,
|
|
77
|
+
parentIds: levelIds,
|
|
78
|
+
isExpanded: isGroupExpanded,
|
|
79
|
+
itemIndex,
|
|
80
|
+
expandedAll,
|
|
81
|
+
prevExpanded,
|
|
82
|
+
columnProps,
|
|
83
|
+
});
|
|
84
|
+
sourceWithGroups.push(...children.source);
|
|
85
|
+
trimmed = Object.assign(Object.assign({}, children.trimmed), trimmed);
|
|
86
|
+
oldNewIndexMap = Object.assign(Object.assign({}, children.oldNewIndexMap), oldNewIndexMap);
|
|
87
|
+
itemIndex = children.itemIndex;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
return {
|
|
91
|
+
source: sourceWithGroups,
|
|
92
|
+
oldNewIndexMap,
|
|
93
|
+
trimmed,
|
|
94
|
+
itemIndex,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
40
97
|
/**
|
|
41
98
|
* Gather data for grouping
|
|
42
99
|
* @param array - flat data array
|
|
43
100
|
* @param columnProps - ids of groups
|
|
44
101
|
* @param expanded - potentially expanded items if present
|
|
45
102
|
*/
|
|
46
|
-
export function gatherGrouping(array, columnProps, { prevExpanded, expandedAll, getGroupValue = getGroupValueDefault, }) {
|
|
103
|
+
export function gatherGrouping(array, columnProps, { prevExpanded = {}, expandedAll = false, getGroupValue = getGroupValueDefault, }) {
|
|
47
104
|
const groupedItems = new Map();
|
|
48
105
|
array.forEach((item, originalIndex) => {
|
|
49
106
|
const groupLevelValues = columnProps.map(groupId => getGroupValue(item, groupId));
|
|
@@ -56,72 +113,31 @@ export function gatherGrouping(array, columnProps, { prevExpanded, expandedAll,
|
|
|
56
113
|
currentGroupLevel = currentGroupLevel.get(value);
|
|
57
114
|
});
|
|
58
115
|
if (!currentGroupLevel.has(lastLevelValue)) {
|
|
59
|
-
|
|
116
|
+
const groupItems = [];
|
|
117
|
+
currentGroupLevel.set(lastLevelValue, groupItems);
|
|
60
118
|
}
|
|
61
119
|
const lastLevelItems = currentGroupLevel.get(lastLevelValue);
|
|
62
120
|
lastLevelItems.push(Object.assign(Object.assign({}, item), { [GROUP_ORIGINAL_INDEX]: originalIndex }));
|
|
63
121
|
});
|
|
64
|
-
let itemIndex = -1;
|
|
65
122
|
const groupingDepth = columnProps.length;
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
groupedValues.forEach((innerGroupedValues, groupId) => {
|
|
76
|
-
const levelIds = [...parentIds, groupId];
|
|
77
|
-
const mergedIds = levelIds.join(',');
|
|
78
|
-
const isGroupExpanded = isExpanded && (!!expandedAll || !!(prevExpanded === null || prevExpanded === void 0 ? void 0 : prevExpanded[mergedIds]));
|
|
79
|
-
sourceWithGroups.push({
|
|
80
|
-
[PSEUDO_GROUP_ITEM]: groupId,
|
|
81
|
-
[GROUP_DEPTH]: depth,
|
|
82
|
-
[PSEUDO_GROUP_ITEM_ID]: JSON.stringify(levelIds),
|
|
83
|
-
[PSEUDO_GROUP_ITEM_VALUE]: mergedIds,
|
|
84
|
-
[GROUP_EXPANDED]: isGroupExpanded,
|
|
85
|
-
[GROUP_COLUMN_PROP]: columnProps[depth],
|
|
86
|
-
[columnProps[depth]]: groupId,
|
|
87
|
-
});
|
|
88
|
-
itemIndex += 1;
|
|
89
|
-
if (!isGroupExpanded && depth) {
|
|
90
|
-
trimmed[itemIndex] = true;
|
|
91
|
-
}
|
|
92
|
-
if (Array.isArray(innerGroupedValues)) {
|
|
93
|
-
innerGroupedValues.forEach(value => {
|
|
94
|
-
itemIndex += 1;
|
|
95
|
-
if (!isGroupExpanded) {
|
|
96
|
-
trimmed[itemIndex] = true;
|
|
97
|
-
}
|
|
98
|
-
oldNewIndexMap[value[GROUP_ORIGINAL_INDEX]] = itemIndex;
|
|
99
|
-
const pseudoGroupTestIds = levelIds.map((_value, index) => levelIds.slice(0, index + 1).join(','));
|
|
100
|
-
pseudoGroupTestIds.forEach(pseudoGroupTestId => {
|
|
101
|
-
if (!pseudoGroupTest[pseudoGroupTestId]) {
|
|
102
|
-
pseudoGroupTest[pseudoGroupTestId] = [];
|
|
103
|
-
}
|
|
104
|
-
pseudoGroupTest[pseudoGroupTestId].push(itemIndex);
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
sourceWithGroups.push(...innerGroupedValues);
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
flattenGroupMaps(innerGroupedValues, levelIds, isGroupExpanded);
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
flattenGroupMaps(groupedItems, [], true);
|
|
123
|
+
const { source: sourceWithGroups, trimmed, oldNewIndexMap } = flattenGroupMaps({
|
|
124
|
+
groupedValues: groupedItems,
|
|
125
|
+
parentIds: [],
|
|
126
|
+
isExpanded: true,
|
|
127
|
+
itemIndex: -1,
|
|
128
|
+
expandedAll,
|
|
129
|
+
prevExpanded,
|
|
130
|
+
columnProps
|
|
131
|
+
});
|
|
115
132
|
return {
|
|
116
133
|
sourceWithGroups, // updates source mirror
|
|
117
134
|
depth: groupingDepth, // largest depth for grouping
|
|
118
135
|
trimmed, // used for expand/collapse grouping values
|
|
119
136
|
oldNewIndexMap, // used for mapping old values to new
|
|
120
|
-
childrenByGroup: pseudoGroupTest, // used to get child items in group
|
|
121
137
|
};
|
|
122
138
|
}
|
|
123
139
|
export function getGroupingName(rgRow) {
|
|
124
|
-
return rgRow
|
|
140
|
+
return rgRow === null || rgRow === void 0 ? void 0 : rgRow[PSEUDO_GROUP_ITEM];
|
|
125
141
|
}
|
|
126
142
|
export function isGrouping(rgRow) {
|
|
127
143
|
return typeof (rgRow === null || rgRow === void 0 ? void 0 : rgRow[PSEUDO_GROUP_ITEM]) !== 'undefined';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grouping.service.js","sourceRoot":"","sources":["../../../src/plugins/groupingRow/grouping.service.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DataType, ColumnProp, ColumnRegular } from '@type';\nimport {\n GROUP_DEPTH,\n GROUP_EXPANDED,\n PSEUDO_GROUP_COLUMN,\n PSEUDO_GROUP_ITEM,\n PSEUDO_GROUP_ITEM_ID,\n PSEUDO_GROUP_ITEM_VALUE,\n GROUP_ORIGINAL_INDEX,\n GROUP_COLUMN_PROP,\n} from './grouping.const';\nimport type { ExpandedOptions, SourceGather } from './grouping.row.types';\n\n\ntype GroupedData = Map<string, GroupedData | DataType[]>;\n\nfunction getGroupValueDefault(item: DataType, prop: string | number) {\n return item[prop] || null;\n}\n\n// get source based on proxy item collection to preserve rgRow order\nexport function getSource(\n source: DataType[],\n items: number[],\n withoutGrouping = false,\n) {\n let index = 0;\n const result: Required<SourceGather> = {\n source: [],\n prevExpanded: {},\n oldNewIndexes: {},\n };\n // order important here, expected parent is first, then others\n items.forEach(i => {\n const model = source[i];\n if (!withoutGrouping) {\n result.source.push(model);\n return;\n }\n\n // grouping filter\n if (isGrouping(model)) {\n if (getExpanded(model)) {\n result.prevExpanded[model[PSEUDO_GROUP_ITEM_VALUE]] = true;\n }\n } else {\n result.source.push(model);\n result.oldNewIndexes[i] = index;\n index++;\n }\n });\n return result;\n}\n\nexport function getExpanded(model: DataType = {}) {\n return model[GROUP_EXPANDED];\n}\n\n/**\n * Gather data for grouping\n * @param array - flat data array\n * @param columnProps - ids of groups\n * @param expanded - potentially expanded items if present\n */\nexport function gatherGrouping(\n array: DataType[],\n columnProps: ColumnProp[],\n {\n prevExpanded,\n expandedAll,\n getGroupValue = getGroupValueDefault,\n }: ExpandedOptions,\n) {\n const groupedItems: GroupedData = new Map();\n array.forEach((item, originalIndex) => {\n const groupLevelValues = columnProps.map(groupId =>\n getGroupValue(item, groupId),\n );\n const lastLevelValue = groupLevelValues.pop();\n let currentGroupLevel = groupedItems;\n groupLevelValues.forEach(value => {\n if (!currentGroupLevel.has(value)) {\n currentGroupLevel.set(value, new Map());\n }\n currentGroupLevel = currentGroupLevel.get(value) as GroupedData;\n });\n if (!currentGroupLevel.has(lastLevelValue)) {\n currentGroupLevel.set(lastLevelValue, []);\n }\n const lastLevelItems = currentGroupLevel.get(lastLevelValue) as DataType[];\n lastLevelItems.push({\n ...item,\n [GROUP_ORIGINAL_INDEX]: originalIndex,\n });\n });\n\n let itemIndex = -1;\n const groupingDepth = columnProps.length;\n // collapse all groups in the beginning\n const trimmed: Record<number, boolean> = {};\n // index mapping\n const oldNewIndexMap: Record<number, number> = {};\n // check if group header exists\n const pseudoGroupTest: Record<string, number[]> = {};\n const sourceWithGroups: DataType[] = [];\n function flattenGroupMaps(\n groupedValues: GroupedData,\n parentIds: string[],\n isExpanded: boolean,\n ) {\n const depth = parentIds.length;\n groupedValues.forEach((innerGroupedValues, groupId) => {\n const levelIds = [...parentIds, groupId];\n const mergedIds = levelIds.join(',');\n const isGroupExpanded =\n isExpanded && (!!expandedAll || !!prevExpanded?.[mergedIds]);\n sourceWithGroups.push({\n [PSEUDO_GROUP_ITEM]: groupId,\n [GROUP_DEPTH]: depth,\n [PSEUDO_GROUP_ITEM_ID]: JSON.stringify(levelIds),\n [PSEUDO_GROUP_ITEM_VALUE]: mergedIds,\n [GROUP_EXPANDED]: isGroupExpanded,\n [GROUP_COLUMN_PROP]: columnProps[depth],\n [columnProps[depth]]: groupId,\n });\n itemIndex += 1;\n if (!isGroupExpanded && depth) {\n trimmed[itemIndex] = true;\n }\n if (Array.isArray(innerGroupedValues)) {\n innerGroupedValues.forEach(value => {\n itemIndex += 1;\n if (!isGroupExpanded) {\n trimmed[itemIndex] = true;\n }\n oldNewIndexMap[value[GROUP_ORIGINAL_INDEX]] = itemIndex;\n const pseudoGroupTestIds = levelIds.map((_value, index) =>\n levelIds.slice(0, index + 1).join(','),\n );\n pseudoGroupTestIds.forEach(pseudoGroupTestId => {\n if (!pseudoGroupTest[pseudoGroupTestId]) {\n pseudoGroupTest[pseudoGroupTestId] = [];\n }\n pseudoGroupTest[pseudoGroupTestId].push(itemIndex);\n });\n });\n sourceWithGroups.push(...innerGroupedValues);\n } else {\n flattenGroupMaps(innerGroupedValues, levelIds, isGroupExpanded);\n }\n });\n }\n flattenGroupMaps(groupedItems, [], true);\n\n return {\n sourceWithGroups, // updates source mirror\n depth: groupingDepth, // largest depth for grouping\n trimmed, // used for expand/collapse grouping values\n oldNewIndexMap, // used for mapping old values to new\n childrenByGroup: pseudoGroupTest, // used to get child items in group\n };\n}\n\nexport function getGroupingName(rgRow?: DataType) {\n return rgRow && rgRow[PSEUDO_GROUP_ITEM];\n}\n\ntype GroupingItem = {\n [PSEUDO_GROUP_ITEM]: string;\n [GROUP_EXPANDED]: boolean;\n [PSEUDO_GROUP_ITEM_VALUE]: string;\n [GROUP_DEPTH]: number;\n [GROUP_COLUMN_PROP]: ColumnProp;\n};\n\nexport function isGrouping(rgRow?: DataType): rgRow is GroupingItem {\n return typeof rgRow?.[PSEUDO_GROUP_ITEM] !== 'undefined';\n}\n\nexport function isGroupingColumn(column?: ColumnRegular) {\n return typeof column?.[PSEUDO_GROUP_COLUMN] !== 'undefined';\n}\n\nexport function measureEqualDepth<T>(groupA: T[], groupB: T[]) {\n const ln = groupA.length;\n let i = 0;\n for (; i < ln; i++) {\n if (groupA[i] !== groupB[i]) {\n return i;\n }\n }\n return i;\n}\n\nexport function getParsedGroup(id: string) {\n const parseGroup = JSON.parse(id);\n // extra precaution and type safeguard\n if (!Array.isArray(parseGroup)) {\n return null;\n }\n return parseGroup;\n}\n\n// check if items is child of current clicked group\nexport function isSameGroup(\n currentGroup: any[],\n currentModel: DataType,\n nextModel: DataType,\n) {\n const nextGroup = getParsedGroup(nextModel[PSEUDO_GROUP_ITEM_ID]);\n if (!nextGroup) {\n return false;\n }\n\n const depth = measureEqualDepth(currentGroup, nextGroup);\n return currentModel[GROUP_DEPTH] < depth;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"grouping.service.js","sourceRoot":"","sources":["../../../src/plugins/groupingRow/grouping.service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAK1B,SAAS,oBAAoB,CAAC,IAAc,EAAE,IAAqB;IACjE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAC5B,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,SAAS,CACvB,MAAkB,EAClB,KAAe,EACf,eAAe,GAAG,KAAK;IAEvB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,MAAM,GAA2B;QACrC,MAAM,EAAE,EAAE;QACV,YAAY,EAAE,EAAE;QAChB,aAAa,EAAE,EAAE;KAClB,CAAC;IACF,8DAA8D;IAC9D,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QAChB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,kBAAkB;QAClB,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,GAAG,IAAI,CAAC;YAC7D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;YAChC,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAkB,EAAE;IAC9C,OAAO,KAAK,CAAC,cAAc,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,gBAAgB,CAAC,EACxB,aAAa,EACb,SAAS,EACT,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,WAAW,GASZ;IACC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC;IAC/B,MAAM,gBAAgB,GAAe,EAAE,CAAC;IACxC,uCAAuC;IACvC,IAAI,OAAO,GAA4B,EAAE,CAAC;IAE1C,gBAAgB;IAChB,IAAI,cAAc,GAA2B,EAAE,CAAC;IAEhD,aAAa,CAAC,OAAO,CAAC,CAAC,kBAAkB,EAAE,OAAO,EAAE,EAAE;QACpD,MAAM,QAAQ,GAAG,CAAC,GAAG,SAAS,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,eAAe,GACnB,UAAU,IAAI,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;QAC7D,gBAAgB,CAAC,IAAI,CAAC;YACpB,CAAC,iBAAiB,CAAC,EAAE,OAAO;YAC5B,CAAC,WAAW,CAAC,EAAE,KAAK;YACpB,CAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;YAChD,CAAC,uBAAuB,CAAC,EAAE,SAAS;YACpC,CAAC,cAAc,CAAC,EAAE,eAAe;YACjC,CAAC,iBAAiB,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC;YACvC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO;SAC9B,CAAC,CAAC;QACH,SAAS,IAAI,CAAC,CAAC;QACf,IAAI,CAAC,eAAe,IAAI,KAAK,EAAE,CAAC;YAC9B,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;QAC5B,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACtC,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACjC,SAAS,IAAI,CAAC,CAAC;gBACf,IAAI,CAAC,eAAe,EAAE,CAAC;oBACrB,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;gBAC5B,CAAC;gBACD,cAAc,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,GAAG,SAAS,CAAC;YAC1D,CAAC,CAAC,CAAC;YACH,gBAAgB,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,gBAAgB,CAAC;gBAChC,aAAa,EAAE,kBAAkB;gBACjC,SAAS,EAAE,QAAQ;gBACnB,UAAU,EAAE,eAAe;gBAC3B,SAAS;gBACT,WAAW;gBACX,YAAY;gBACZ,WAAW;aACZ,CAAC,CAAC;YACH,gBAAgB,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC1C,OAAO,mCAAQ,QAAQ,CAAC,OAAO,GAAK,OAAO,CAAE,CAAC;YAC9C,cAAc,mCAAQ,QAAQ,CAAC,cAAc,GAAK,cAAc,CAAE,CAAC;YACnE,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;QACjC,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO;QACL,MAAM,EAAE,gBAAgB;QACxB,cAAc;QACd,OAAO;QACP,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAiB,EACjB,WAAyB,EACzB,EACE,YAAY,GAAG,EAAE,EACjB,WAAW,GAAG,KAAK,EACnB,aAAa,GAAG,oBAAoB,GACpB;IAElB,MAAM,YAAY,GAAgB,IAAI,GAAG,EAAE,CAAC;IAE5C,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE;QACpC,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAClF,MAAM,cAAc,GAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC;QAC9C,IAAI,iBAAiB,GAAG,YAAY,CAAC;QACrC,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAC/B,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClC,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YAC1C,CAAC;YACD,iBAAiB,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAgB,CAAC;QAClE,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YAC3C,MAAM,UAAU,GAAe,EAAE,CAAC;YAClC,iBAAiB,CAAC,GAAG,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,cAAc,GAAG,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAe,CAAC;QAC3E,cAAc,CAAC,IAAI,iCACd,IAAI,KACP,CAAC,oBAAoB,CAAC,EAAE,aAAa,IACrC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC;IAEzC,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,gBAAgB,CAAC;QAC7E,aAAa,EAAE,YAAY;QAC3B,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,CAAC,CAAC;QACb,WAAW;QACX,YAAY;QACZ,WAAW;KACZ,CAAC,CAAC;IAEH,OAAO;QACL,gBAAgB,EAAE,wBAAwB;QAC1C,KAAK,EAAE,aAAa,EAAE,6BAA6B;QACnD,OAAO,EAAE,2CAA2C;QACpD,cAAc,EAAE,qCAAqC;KACtD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAgB;IAC9C,OAAO,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAG,iBAAiB,CAAC,CAAC;AACpC,CAAC;AAUD,MAAM,UAAU,UAAU,CAAC,KAAgB;IACzC,OAAO,OAAO,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAG,iBAAiB,CAAC,CAAA,KAAK,WAAW,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAsB;IACrD,OAAO,OAAO,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,mBAAmB,CAAC,CAAA,KAAK,WAAW,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAI,MAAW,EAAE,MAAW;IAC3D,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QACnB,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClC,sCAAsC;IACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,WAAW,CACzB,YAAmB,EACnB,YAAsB,EACtB,SAAmB;IAEnB,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAClE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,iBAAiB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IACzD,OAAO,YAAY,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC;AAC3C,CAAC","sourcesContent":["import type { DataType, ColumnProp, ColumnRegular } from '@type';\nimport {\n GROUP_DEPTH,\n GROUP_EXPANDED,\n PSEUDO_GROUP_COLUMN,\n PSEUDO_GROUP_ITEM,\n PSEUDO_GROUP_ITEM_ID,\n PSEUDO_GROUP_ITEM_VALUE,\n GROUP_ORIGINAL_INDEX,\n GROUP_COLUMN_PROP,\n} from './grouping.const';\nimport type { ExpandedOptions, SourceGather } from './grouping.row.types';\n\ntype GroupedData = Map<string, GroupedData | DataType[]>;\n\nfunction getGroupValueDefault(item: DataType, prop: string | number) {\n return item[prop] || null;\n}\n\n// get source based on proxy item collection to preserve rgRow order\nexport function getSource(\n source: DataType[],\n items: number[],\n withoutGrouping = false,\n) {\n let index = 0;\n const result: Required<SourceGather> = {\n source: [],\n prevExpanded: {},\n oldNewIndexes: {},\n };\n // order important here, expected parent is first, then others\n items.forEach(i => {\n const model = source[i];\n if (!withoutGrouping) {\n result.source.push(model);\n return;\n }\n\n // grouping filter\n if (isGrouping(model)) {\n if (getExpanded(model)) {\n result.prevExpanded[model[PSEUDO_GROUP_ITEM_VALUE]] = true;\n }\n } else {\n result.source.push(model);\n result.oldNewIndexes[i] = index;\n index++;\n }\n });\n return result;\n}\n\nexport function getExpanded(model: DataType = {}) {\n return model[GROUP_EXPANDED];\n}\n\nfunction flattenGroupMaps({\n groupedValues,\n parentIds,\n isExpanded,\n itemIndex,\n expandedAll,\n prevExpanded,\n columnProps,\n}: {\n groupedValues: GroupedData;\n parentIds: string[];\n isExpanded: boolean;\n itemIndex: number;\n expandedAll: boolean;\n prevExpanded: Record<string, boolean>;\n columnProps: ColumnProp[];\n}) {\n const depth = parentIds.length;\n const sourceWithGroups: DataType[] = [];\n // collapse all groups in the beginning\n let trimmed: Record<number, boolean> = {};\n\n // index mapping\n let oldNewIndexMap: Record<number, number> = {};\n\n groupedValues.forEach((innerGroupedValues, groupId) => {\n const levelIds = [...parentIds, groupId];\n const mergedIds = levelIds.join(',');\n const isGroupExpanded =\n isExpanded && (!!expandedAll || !!prevExpanded[mergedIds]);\n sourceWithGroups.push({\n [PSEUDO_GROUP_ITEM]: groupId,\n [GROUP_DEPTH]: depth,\n [PSEUDO_GROUP_ITEM_ID]: JSON.stringify(levelIds),\n [PSEUDO_GROUP_ITEM_VALUE]: mergedIds,\n [GROUP_EXPANDED]: isGroupExpanded,\n [GROUP_COLUMN_PROP]: columnProps[depth],\n [columnProps[depth]]: groupId,\n });\n itemIndex += 1;\n if (!isGroupExpanded && depth) {\n trimmed[itemIndex] = true;\n }\n if (Array.isArray(innerGroupedValues)) {\n innerGroupedValues.forEach(value => {\n itemIndex += 1;\n if (!isGroupExpanded) {\n trimmed[itemIndex] = true;\n }\n oldNewIndexMap[value[GROUP_ORIGINAL_INDEX]] = itemIndex;\n });\n sourceWithGroups.push(...innerGroupedValues);\n } else {\n const children = flattenGroupMaps({\n groupedValues: innerGroupedValues,\n parentIds: levelIds,\n isExpanded: isGroupExpanded,\n itemIndex,\n expandedAll,\n prevExpanded,\n columnProps,\n });\n sourceWithGroups.push(...children.source);\n trimmed = { ...children.trimmed, ...trimmed };\n oldNewIndexMap = { ...children.oldNewIndexMap, ...oldNewIndexMap };\n itemIndex = children.itemIndex;\n }\n });\n return {\n source: sourceWithGroups,\n oldNewIndexMap,\n trimmed,\n itemIndex,\n };\n}\n\n/**\n * Gather data for grouping\n * @param array - flat data array\n * @param columnProps - ids of groups\n * @param expanded - potentially expanded items if present\n */\nexport function gatherGrouping(\n array: DataType[],\n columnProps: ColumnProp[],\n {\n prevExpanded = {},\n expandedAll = false,\n getGroupValue = getGroupValueDefault,\n }: ExpandedOptions,\n) {\n const groupedItems: GroupedData = new Map();\n \n array.forEach((item, originalIndex) => {\n const groupLevelValues = columnProps.map(groupId => getGroupValue(item, groupId));\n const lastLevelValue = groupLevelValues.pop();\n let currentGroupLevel = groupedItems;\n groupLevelValues.forEach(value => {\n if (!currentGroupLevel.has(value)) {\n currentGroupLevel.set(value, new Map());\n }\n currentGroupLevel = currentGroupLevel.get(value) as GroupedData;\n });\n if (!currentGroupLevel.has(lastLevelValue)) {\n const groupItems: DataType[] = [];\n currentGroupLevel.set(lastLevelValue, groupItems);\n }\n const lastLevelItems = currentGroupLevel.get(lastLevelValue) as DataType[];\n lastLevelItems.push({\n ...item,\n [GROUP_ORIGINAL_INDEX]: originalIndex,\n });\n });\n\n const groupingDepth = columnProps.length;\n\n const { source: sourceWithGroups, trimmed, oldNewIndexMap } = flattenGroupMaps({\n groupedValues: groupedItems,\n parentIds: [],\n isExpanded: true,\n itemIndex: -1,\n expandedAll,\n prevExpanded,\n columnProps\n });\n\n return {\n sourceWithGroups, // updates source mirror\n depth: groupingDepth, // largest depth for grouping\n trimmed, // used for expand/collapse grouping values\n oldNewIndexMap, // used for mapping old values to new\n };\n}\n\nexport function getGroupingName(rgRow?: DataType) {\n return rgRow?.[PSEUDO_GROUP_ITEM];\n}\n\ntype GroupingItem = {\n [PSEUDO_GROUP_ITEM]: string;\n [GROUP_EXPANDED]: boolean;\n [PSEUDO_GROUP_ITEM_VALUE]: string;\n [GROUP_DEPTH]: number;\n [GROUP_COLUMN_PROP]: ColumnProp;\n};\n\nexport function isGrouping(rgRow?: DataType): rgRow is GroupingItem {\n return typeof rgRow?.[PSEUDO_GROUP_ITEM] !== 'undefined';\n}\n\nexport function isGroupingColumn(column?: ColumnRegular) {\n return typeof column?.[PSEUDO_GROUP_COLUMN] !== 'undefined';\n}\n\nexport function measureEqualDepth<T>(groupA: T[], groupB: T[]) {\n const ln = groupA.length;\n let i = 0;\n for (; i < ln; i++) {\n if (groupA[i] !== groupB[i]) {\n return i;\n }\n }\n return i;\n}\n\nexport function getParsedGroup(id: string) {\n const parseGroup = JSON.parse(id);\n // extra precaution and type safeguard\n if (!Array.isArray(parseGroup)) {\n return null;\n }\n return parseGroup;\n}\n\n// check if items is child of current clicked group\nexport function isSameGroup(\n currentGroup: any[],\n currentModel: DataType,\n nextModel: DataType,\n) {\n const nextGroup = getParsedGroup(nextModel[PSEUDO_GROUP_ITEM_ID]);\n if (!nextGroup) {\n return false;\n }\n\n const depth = measureEqualDepth(currentGroup, nextGroup);\n return currentModel[GROUP_DEPTH] < depth;\n}\n"]}
|
|
@@ -10,7 +10,6 @@ export * from './filter/filter.plugin';
|
|
|
10
10
|
export * from './groupingColumn/columnGroupsRenderer';
|
|
11
11
|
export * from './groupingColumn/headerGroupRenderer';
|
|
12
12
|
export * from './groupingRow/grouping.row.plugin';
|
|
13
|
-
export * from './groupingRow/grouping.service';
|
|
14
13
|
export * from './moveColumn/column.drag.plugin';
|
|
15
14
|
export * from './sorting/sorting.plugin';
|
|
16
15
|
export * from './sorting/sorting.sign';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC;AACrD,cAAc,mCAAmC,CAAC;AAClD,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC;AACrD,cAAc,mCAAmC,CAAC;AAClD,cAAc,iCAAiC,CAAC;AAChD,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC","sourcesContent":["export * from './base.plugin';\nexport * from './column.auto-size.plugin';\nexport * from './column.stretch.plugin';\nexport * from './dispatcher';\nexport * from './export/export.plugin';\nexport * from './filter/filter.plugin';\nexport * from './groupingColumn/columnGroupsRenderer';\nexport * from './groupingColumn/headerGroupRenderer';\nexport * from './groupingRow/grouping.row.plugin';\nexport * from './moveColumn/column.drag.plugin';\nexport * from './sorting/sorting.plugin';\nexport * from './sorting/sorting.sign';\nexport * from './add-rows-on-paste.plugin';\n"]}
|
|
@@ -72,6 +72,11 @@ export function generateFakeDataObject(config = {}) {
|
|
|
72
72
|
} else {
|
|
73
73
|
result[rgRow].key = 'b';
|
|
74
74
|
}
|
|
75
|
+
if (rgRow % 4) {
|
|
76
|
+
result[rgRow].key2 = 'c';
|
|
77
|
+
} else if (rgRow % 3) {
|
|
78
|
+
result[rgRow].key2 = 'd';
|
|
79
|
+
}
|
|
75
80
|
}
|
|
76
81
|
if (!columns[rgCol]) {
|
|
77
82
|
columns[rgCol] = {
|
|
@@ -12,6 +12,7 @@ export const trimmedPlugin = (store) => ({
|
|
|
12
12
|
// full sorted items list
|
|
13
13
|
const proxy = store.get('proxyItems');
|
|
14
14
|
const trimmed = gatherTrimmedItems(newVal);
|
|
15
|
+
// filter our physical indexes which are not trimmed
|
|
15
16
|
const newItems = proxy.filter(v => !trimmed[v]);
|
|
16
17
|
// set trimmed items in store
|
|
17
18
|
store.set('items', newItems);
|