@oneteme/jquery-table 0.0.8 → 0.0.10

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.
@@ -1,304 +0,0 @@
1
- import { Subject } from 'rxjs';
2
- import { humanizeKey } from '../table.utils';
3
- export { viewField, groupableViewFields, sliceableViewFields, initialViewState } from '@oneteme/jquery-core';
4
- // ── Facade
5
- /**
6
- * Centralise l'état et les actions du panneau View (Champs / Group by / Slice by).
7
- * Pas de dépendance Angular/DOM : peut être extraite vers jquery-core à terme.
8
- *
9
- * Usage :
10
- * this._view = new ViewFacade();
11
- * this._view.events$.subscribe(e => { ... });
12
- * this._view.update({ config, columns, sliceConfigs });
13
- */
14
- export class ViewFacade {
15
- constructor() {
16
- // ── State
17
- this.fields = {
18
- activeColumns: [],
19
- userCustomized: false,
20
- };
21
- this.groupBy = {
22
- activeKey: null,
23
- userCustomized: false,
24
- };
25
- this.sliceBy = {
26
- activeDynamicColumns: [],
27
- availableForDynamic: [],
28
- allDynamicColumns: [],
29
- activeLabel: 'Aucun',
30
- };
31
- this._panelConfig = { columns: [], sliceConfigs: [] };
32
- this._hiddenStaticKeys = new Set();
33
- // ── Events
34
- this._events$ = new Subject();
35
- this.events$ = this._events$.asObservable();
36
- }
37
- // ── Computed flags
38
- get enabled() {
39
- return this._panelConfig.config?.enabled === true;
40
- }
41
- get showFields() {
42
- return this.enabled;
43
- }
44
- get showGroupBySection() {
45
- return this.enabled && this.groupByColumns.length > 0;
46
- }
47
- get showSliceBySection() {
48
- return this.enabled && ((this._panelConfig.sliceConfigs?.length ?? 0) > 0 ||
49
- this.sliceBy.allDynamicColumns.length > 0);
50
- }
51
- get allowColumnRemoval() {
52
- return this._panelConfig.config?.enableColumnRemoval !== false;
53
- }
54
- get isColumnDragDropEnabled() {
55
- return this._panelConfig.config?.enableColumnDragDrop === true;
56
- }
57
- get menuBaseColumns() {
58
- return this._uniqueByKey((this._panelConfig.columns || []).filter(c => !c.optional));
59
- }
60
- get menuOptionalColumns() {
61
- return this._uniqueByKey((this._panelConfig.columns || []).filter(c => c.optional));
62
- }
63
- get totalColumnCount() {
64
- return new Set((this._panelConfig.columns || []).map(c => c.key)).size;
65
- }
66
- get groupByColumns() {
67
- const seen = new Set();
68
- return (this._panelConfig.columns || []).filter(c => {
69
- if (c.groupable === false || seen.has(c.key))
70
- return false;
71
- if (!c.header && c.groupable !== true)
72
- return false;
73
- seen.add(c.key);
74
- return true;
75
- });
76
- }
77
- get activeGroupByLabel() {
78
- if (!this.groupBy.activeKey)
79
- return this._panelConfig.noneLabel ?? 'Aucun';
80
- const col = this.groupByColumns.find(c => c.key === this.groupBy.activeKey);
81
- return col?.header || this.groupBy.activeKey;
82
- }
83
- get staticSlicesForMenu() {
84
- return (this._panelConfig.sliceConfigs ?? [])
85
- .filter(s => !!s.columnKey)
86
- .map(s => {
87
- const colIcon = (this._panelConfig.columns ?? []).find(c => c.key === s.columnKey)?.icon;
88
- return { key: s.columnKey, title: s.title || humanizeKey(s.columnKey), icon: s.icon ?? colIcon };
89
- });
90
- }
91
- colLabel(col) {
92
- return col.header || humanizeKey(col.key);
93
- }
94
- // ── Mise à jour de la config (appelée depuis refreshViewModel)
95
- update(panelConfig) {
96
- this._panelConfig = panelConfig;
97
- this._refreshDefaultColumns();
98
- this._refreshDynamicSliceMeta();
99
- if (!this.groupBy.userCustomized) {
100
- this.groupBy.activeKey = panelConfig.defaultGroupBy ?? null;
101
- }
102
- }
103
- // ── Actions Fields
104
- setActiveColumns(columns) {
105
- this.fields.activeColumns = columns;
106
- this.fields.userCustomized = true;
107
- }
108
- setUserCustomized(value) {
109
- this.fields.userCustomized = value;
110
- }
111
- /** Remet la vue dans son état initial : colonnes par défaut, groupBy par défaut, pas de dynamic slices. */
112
- resetToDefaults() {
113
- this.fields.userCustomized = false;
114
- this.groupBy.userCustomized = false;
115
- this._refreshDefaultColumns();
116
- this.groupBy.activeKey = this._panelConfig.defaultGroupBy ?? null;
117
- this.sliceBy.activeDynamicColumns = [];
118
- this._refreshDynamicSliceMeta();
119
- }
120
- addColumn(column) {
121
- const configCols = this._panelConfig.columns ?? [];
122
- const configIndex = configCols.findIndex(c => c.key === column.key);
123
- if (configIndex === -1) {
124
- this.fields.activeColumns = [...this.fields.activeColumns, column];
125
- }
126
- else {
127
- const insertBefore = this.fields.activeColumns.findIndex(c => {
128
- const ci = configCols.findIndex(cc => cc.key === c.key);
129
- return ci !== -1 && ci > configIndex;
130
- });
131
- if (insertBefore === -1) {
132
- this.fields.activeColumns = [...this.fields.activeColumns, column];
133
- }
134
- else {
135
- const copy = [...this.fields.activeColumns];
136
- copy.splice(insertBefore, 0, column);
137
- this.fields.activeColumns = copy;
138
- }
139
- }
140
- this.fields.userCustomized = true;
141
- this._events$.next({ type: 'fieldsChanged', fieldIds: this.fields.activeColumns.map(c => c.key) });
142
- }
143
- removeColumn(columnKey) {
144
- const col = this.fields.activeColumns.find(c => c.key === columnKey);
145
- if (!col)
146
- return false;
147
- if (!col.optional && !this.allowColumnRemoval)
148
- return false;
149
- if (this.fields.activeColumns.length <= 1)
150
- return false;
151
- this.fields.activeColumns = this.fields.activeColumns.filter(c => c.key !== columnKey);
152
- this.fields.userCustomized = true;
153
- this._events$.next({ type: 'fieldsChanged', fieldIds: this.fields.activeColumns.map(c => c.key) });
154
- return true;
155
- }
156
- toggleColumnVisibility(column, visible) {
157
- const isVisible = this.isColumnVisible(column.key);
158
- if (visible && !isVisible) {
159
- this.addColumn(column);
160
- }
161
- else if (!visible && isVisible) {
162
- this.removeColumn(column.key);
163
- }
164
- }
165
- reorderColumns(fromKey, toKey) {
166
- const prev = this.fields.activeColumns.findIndex(c => c.key === fromKey);
167
- const curr = this.fields.activeColumns.findIndex(c => c.key === toKey);
168
- if (prev === -1 || curr === -1 || prev === curr)
169
- return false;
170
- const reordered = [...this.fields.activeColumns];
171
- const [moved] = reordered.splice(prev, 1);
172
- reordered.splice(curr, 0, moved);
173
- this.fields.activeColumns = reordered;
174
- this.fields.userCustomized = true;
175
- this._events$.next({ type: 'fieldsChanged', fieldIds: this.fields.activeColumns.map(c => c.key) });
176
- return true;
177
- }
178
- isColumnVisible(key) {
179
- return this.fields.activeColumns.some(c => c.key === key);
180
- }
181
- // ── Actions Group by
182
- setGroupBy(key) {
183
- this.groupBy.activeKey = key;
184
- this.groupBy.userCustomized = true;
185
- this._events$.next({ type: 'groupByChanged', key });
186
- }
187
- // ── Actions Slice by (dynamique)
188
- /** Appelée quand le SlicePanelComponent émet dynamicSliceKeysChange */
189
- onDynamicSliceKeysChange(keys) {
190
- const allCols = this._panelConfig.columns ?? [];
191
- const staticKeys = new Set((this._panelConfig.sliceConfigs ?? []).map(s => s.columnKey).filter((k) => !!k));
192
- const dynamicKeySet = new Set(keys);
193
- const existingKeys = new Set([...staticKeys, ...dynamicKeySet]);
194
- this.sliceBy.activeDynamicColumns = keys
195
- .map(k => allCols.find(c => c.key === k))
196
- .filter((c) => !!c);
197
- const seen = new Set();
198
- this.sliceBy.availableForDynamic = allCols.filter(c => {
199
- if (c.sliceable === false || existingKeys.has(c.key) || seen.has(c.key))
200
- return false;
201
- seen.add(c.key);
202
- return true;
203
- });
204
- this._computeSliceLabel();
205
- this._events$.next({ type: 'dynamicSlicesChanged', keys });
206
- }
207
- isDynamicSliceActive(key) {
208
- return this.sliceBy.activeDynamicColumns.some(c => c.key === key);
209
- }
210
- // ── Contrat core
211
- /** Retourne un snapshot ViewState (contrat core) de l'état courant. */
212
- toViewState() {
213
- return {
214
- selectedFieldIds: this.fields.activeColumns.map(c => c.key),
215
- groupByKey: this.groupBy.activeKey,
216
- dynamicSliceKeys: this.sliceBy.activeDynamicColumns.map(c => c.key),
217
- };
218
- }
219
- /** Convertit une TableColumnProvider en ViewField (contrat core). */
220
- static toViewField(col) {
221
- return {
222
- id: col.key,
223
- label: col.header,
224
- icon: col.icon,
225
- groupable: col.groupable,
226
- sliceable: col.sliceable,
227
- optional: col.optional,
228
- };
229
- }
230
- // ── Destructor
231
- destroy() {
232
- this._events$.complete();
233
- }
234
- // ── Helpers privés
235
- _refreshDefaultColumns() {
236
- const defaultCols = (this._panelConfig.columns || []).filter(c => !c.optional);
237
- if (!this.fields.userCustomized || this.fields.activeColumns.length === 0) {
238
- this.fields.activeColumns = [...defaultCols];
239
- }
240
- else {
241
- const allowedKeys = new Set((this._panelConfig.columns || []).map(c => c.key));
242
- this.fields.activeColumns = this.fields.activeColumns.filter(c => allowedKeys.has(c.key));
243
- }
244
- }
245
- _refreshDynamicSliceMeta() {
246
- const allCols = this._panelConfig.columns ?? [];
247
- const staticKeys = new Set((this._panelConfig.sliceConfigs ?? []).map(s => s.columnKey).filter((k) => !!k));
248
- const activeDynKeys = new Set(this.sliceBy.activeDynamicColumns.map(c => c.key));
249
- const seen1 = new Set();
250
- this.sliceBy.availableForDynamic = allCols.filter(c => {
251
- if (c.sliceable === false || staticKeys.has(c.key) || activeDynKeys.has(c.key) || seen1.has(c.key))
252
- return false;
253
- if (!c.header && c.sliceable !== true)
254
- return false;
255
- seen1.add(c.key);
256
- return true;
257
- });
258
- const seen2 = new Set();
259
- this.sliceBy.allDynamicColumns = allCols.filter(c => {
260
- if (c.sliceable === false || staticKeys.has(c.key) || seen2.has(c.key))
261
- return false;
262
- if (!c.header && c.sliceable !== true)
263
- return false;
264
- seen2.add(c.key);
265
- return true;
266
- });
267
- this._computeSliceLabel();
268
- }
269
- /** Notifie la facade des slices statiques actuellement cachées (géré par table.component).
270
- * Recalcule le label slice afin qu'il reflète uniquement les slices visibles. */
271
- updateHiddenStaticKeys(keys) {
272
- this._hiddenStaticKeys = keys;
273
- this._computeSliceLabel();
274
- }
275
- _computeSliceLabel() {
276
- const visibleStatics = (this._panelConfig.sliceConfigs ?? []).filter(s => !s.columnKey || !this._hiddenStaticKeys.has(s.columnKey));
277
- const visibleStaticCount = visibleStatics.length;
278
- const total = visibleStaticCount + this.sliceBy.activeDynamicColumns.length;
279
- if (total === 0) {
280
- this.sliceBy.activeLabel = this._panelConfig.noneLabel ?? 'Aucun';
281
- return;
282
- }
283
- if (total === 1) {
284
- if (visibleStaticCount === 1) {
285
- const first = visibleStatics[0];
286
- this.sliceBy.activeLabel = first?.title || first?.columnKey || '1';
287
- return;
288
- }
289
- this.sliceBy.activeLabel = this.sliceBy.activeDynamicColumns[0]?.header || '1';
290
- return;
291
- }
292
- this.sliceBy.activeLabel = `${total} actifs`;
293
- }
294
- _uniqueByKey(cols) {
295
- const seen = new Set();
296
- return cols.filter(c => {
297
- if (seen.has(c.key))
298
- return false;
299
- seen.add(c.key);
300
- return true;
301
- });
302
- }
303
- }
304
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy5mYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmV0ZW1lL2pxdWVyeS10YWJsZS9zcmMvbGliL2NvbXBvbmVudC92aWV3L3ZpZXcuZmFjYWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJL0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzdDLE9BQU8sRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQWlDN0csWUFBWTtBQUVaOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFBdkI7UUFFRSxXQUFXO1FBRUYsV0FBTSxHQUFtQjtZQUNoQyxhQUFhLEVBQUUsRUFBRTtZQUNqQixjQUFjLEVBQUUsS0FBSztTQUN0QixDQUFDO1FBRU8sWUFBTyxHQUFxQjtZQUNuQyxTQUFTLEVBQUUsSUFBSTtZQUNmLGNBQWMsRUFBRSxLQUFLO1NBQ3RCLENBQUM7UUFFTyxZQUFPLEdBQXFCO1lBQ25DLG9CQUFvQixFQUFFLEVBQUU7WUFDeEIsbUJBQW1CLEVBQUUsRUFBRTtZQUN2QixpQkFBaUIsRUFBRSxFQUFFO1lBQ3JCLFdBQVcsRUFBRSxPQUFPO1NBQ3JCLENBQUM7UUFFTSxpQkFBWSxHQUFvQixFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ2xFLHNCQUFpQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFFOUMsWUFBWTtRQUVLLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBYSxDQUFDO1FBQzVDLFlBQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBOFNsRCxDQUFDO0lBNVNDLG9CQUFvQjtJQUVwQixJQUFJLE9B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Q0FBQztZQUNoQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVmlld0V2ZW50LCBWaWV3RmllbGQsIFZpZXdTdGF0ZSB9IGZyb20gJ0BvbmV0ZW1lL2pxdWVyeS1jb3JlJztcbmltcG9ydCB7IFRhYmxlQ29sdW1uUHJvdmlkZXIsIFRhYmxlVmlld0NvbmZpZyB9IGZyb20gJy4uLy4uL2pxdWVyeS10YWJsZS5tb2RlbCc7XG5pbXBvcnQgeyBTbGljZUNvbmZpZyB9IGZyb20gJy4uL3NsaWNlLXBhbmVsL3NsaWNlLXBhbmVsLm1vZGVsJztcbmltcG9ydCB7IGh1bWFuaXplS2V5IH0gZnJvbSAnLi4vdGFibGUudXRpbHMnO1xuXG5leHBvcnQgdHlwZSB7IFZpZXdGaWVsZCwgVmlld0NvbmZpZywgVmlld1N0YXRlLCBWaWV3RXZlbnQgfSBmcm9tICdAb25ldGVtZS9qcXVlcnktY29yZSc7XG5leHBvcnQgeyB2aWV3RmllbGQsIGdyb3VwYWJsZVZpZXdGaWVsZHMsIHNsaWNlYWJsZVZpZXdGaWVsZHMsIGluaXRpYWxWaWV3U3RhdGUgfSBmcm9tICdAb25ldGVtZS9qcXVlcnktY29yZSc7XG5cbi8vIOKUgOKUgCBUeXBlcyBpbnRlcm5lc1xuXG5leHBvcnQgaW50ZXJmYWNlIFZpZXdGaWVsZFN0YXRlIHtcbiAgYWN0aXZlQ29sdW1uczogVGFibGVDb2x1bW5Qcm92aWRlcjxhbnk+W107XG4gIC8qKiB0cnVlIHNpIGwndXRpbGlzYXRldXIgYSBkw6lqw6AgcGVyc29ubmFsaXPDqSBsYSBzw6lsZWN0aW9uIGRlIGNvbG9ubmVzICovXG4gIHVzZXJDdXN0b21pemVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZpZXdHcm91cEJ5U3RhdGUge1xuICBhY3RpdmVLZXk6IHN0cmluZyB8IG51bGw7XG4gIHVzZXJDdXN0b21pemVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZpZXdTbGljZUJ5U3RhdGUge1xuICBhY3RpdmVEeW5hbWljQ29sdW1uczogVGFibGVDb2x1bW5Qcm92aWRlcjxhbnk+W107XG4gIGF2YWlsYWJsZUZvckR5bmFtaWM6IFRhYmxlQ29sdW1uUHJvdmlkZXI8YW55PltdO1xuICBhbGxEeW5hbWljQ29sdW1uczogVGFibGVDb2x1bW5Qcm92aWRlcjxhbnk+W107XG4gIGFjdGl2ZUxhYmVsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlld1BhbmVsQ29uZmlnIHtcbiAgLyoqIENvbmZpZyBicnV0ZSBpc3N1ZSBkZSBUYWJsZVByb3ZpZGVyLnZpZXcgKi9cbiAgY29uZmlnPzogVGFibGVWaWV3Q29uZmlnO1xuICAvKiogVG91dGVzIGxlcyBjb2xvbm5lcyByw6lzb2x1ZXMgKG5vbiBmaWx0csOpZXMpICovXG4gIGNvbHVtbnM6IFRhYmxlQ29sdW1uUHJvdmlkZXI8YW55PltdO1xuICAvKiogU2xpY2VzIHN0YXRpcXVlcyAqL1xuICBzbGljZUNvbmZpZ3M6IFNsaWNlQ29uZmlnPGFueT5bXTtcbiAgLyoqIExhYmVsIHV0aWxpc8OpIHF1YW5kIGF1Y3VuIGdyb3VwZSAvIGF1Y3VuZSBzbGljZSBu4oCZZXN0IGFjdGlmLiBEw6lmYXV0wqA6ICdBdWN1bicuICovXG4gIG5vbmVMYWJlbD86IHN0cmluZzsgIC8qKiBDbMOpIGRlIGNvbG9ubmUgdXRpbGlzw6llIGNvbW1lIGdyb3VwLWJ5IHBhciBkw6lmYXV0IGF1IGNoYXJnZW1lbnQuICovXG4gIGRlZmF1bHRHcm91cEJ5Pzogc3RyaW5nIHwgbnVsbDt9XG5cbi8vIOKUgOKUgCBGYWNhZGVcblxuLyoqXG4gKiBDZW50cmFsaXNlIGwnw6l0YXQgZXQgbGVzIGFjdGlvbnMgZHUgcGFubmVhdSBWaWV3IChDaGFtcHMgLyBHcm91cCBieSAvIFNsaWNlIGJ5KS5cbiAqIFBhcyBkZSBkw6lwZW5kYW5jZSBBbmd1bGFyL0RPTSA6IHBldXQgw6p0cmUgZXh0cmFpdGUgdmVycyBqcXVlcnktY29yZSDDoCB0ZXJtZS5cbiAqXG4gKiBVc2FnZSA6XG4gKiAgIHRoaXMuX3ZpZXcgPSBuZXcgVmlld0ZhY2FkZSgpO1xuICogICB0aGlzLl92aWV3LmV2ZW50cyQuc3Vic2NyaWJlKGUgPT4geyAuLi4gfSk7XG4gKiAgIHRoaXMuX3ZpZXcudXBkYXRlKHsgY29uZmlnLCBjb2x1bW5zLCBzbGljZUNvbmZpZ3MgfSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBWaWV3RmFjYWRlPFQgPSBhbnk+IHtcblxuICAvLyDilIDilIAgU3RhdGVcblxuICByZWFkb25seSBmaWVsZHM6IFZpZXdGaWVsZFN0YXRlID0ge1xuICAgIGFjdGl2ZUNvbHVtbnM6IFtdLFxuICAgIHVzZXJDdXN0b21pemVkOiBmYWxzZSxcbiAgfTtcblxuICByZWFkb25seSBncm91cEJ5OiBWaWV3R3JvdXBCeVN0YXRlID0ge1xuICAgIGFjdGl2ZUtleTogbnVsbCxcbiAgICB1c2VyQ3VzdG9taXplZDogZmFsc2UsXG4gIH07XG5cbiAgcmVhZG9ubHkgc2xpY2VCeTogVmlld1NsaWNlQnlTdGF0ZSA9IHtcbiAgICBhY3RpdmVEeW5hbWljQ29sdW1uczogW10sXG4gICAgYXZhaWxhYmxlRm9yRHluYW1pYzogW10sXG4gICAgYWxsRHluYW1pY0NvbHVtbnM6IFtdLFxuICAgIGFjdGl2ZUxhYmVsOiAnQXVjdW4nLFxuICB9O1xuXG4gIHByaXZhdGUgX3BhbmVsQ29uZmlnOiBWaWV3UGFuZWxDb25maWcgPSB7IGNvbHVtbnM6IFtdLCBzbGljZUNvbmZpZ3M6IFtdIH07XG4gIHByaXZhdGUgX2hpZGRlblN0YXRpY0tleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvLyDilIDilIAgRXZlbnRzXG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZXZlbnRzJCA9IG5ldyBTdWJqZWN0PFZpZXdFdmVudD4oKTtcbiAgcmVhZG9ubHkgZXZlbnRzJCA9IHRoaXMuX2V2ZW50cyQuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLy8g4pSA4pSAIENvbXB1dGVkIGZsYWdzXG5cbiAgZ2V0IGVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3BhbmVsQ29uZmlnLmNvbmZpZz8uZW5hYmxlZCA9PT0gdHJ1ZTtcbiAgfVxuXG4gIGdldCBzaG93RmllbGRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVuYWJsZWQ7XG4gIH1cblxuICBnZXQgc2hvd0dyb3VwQnlTZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVuYWJsZWQgJiYgdGhpcy5ncm91cEJ5Q29sdW1ucy5sZW5ndGggPiAwO1xuICB9XG5cbiAgZ2V0IHNob3dTbGljZUJ5U2VjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lbmFibGVkICYmIChcbiAgICAgICh0aGlzLl9wYW5lbENvbmZpZy5zbGljZUNvbmZpZ3M/Lmxlbmd0aCA/PyAwKSA+IDAgfHxcbiAgICAgIHRoaXMuc2xpY2VCeS5hbGxEeW5hbWljQ29sdW1ucy5sZW5ndGggPiAwXG4gICAgKTtcbiAgfVxuXG4gIGdldCBhbGxvd0NvbHVtblJlbW92YWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3BhbmVsQ29uZmlnLmNvbmZpZz8uZW5hYmxlQ29sdW1uUmVtb3ZhbCAhPT0gZmFsc2U7XG4gIH1cblxuICBnZXQgaXNDb2x1bW5EcmFnRHJvcEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3BhbmVsQ29uZmlnLmNvbmZpZz8uZW5hYmxlQ29sdW1uRHJhZ0Ryb3AgPT09IHRydWU7XG4gIH1cblxuICBnZXQgbWVudUJhc2VDb2x1bW5zKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX3VuaXF1ZUJ5S2V5KCh0aGlzLl9wYW5lbENvbmZpZy5jb2x1bW5zIHx8IFtdKS5maWx0ZXIoYyA9PiAhYy5vcHRpb25hbCkpO1xuICB9XG5cbiAgZ2V0IG1lbnVPcHRpb25hbENvbHVtbnMoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fdW5pcXVlQnlLZXkoKHRoaXMuX3BhbmVsQ29uZmlnLmNvbHVtbnMgfHwgW10pLmZpbHRlcihjID0+IGMub3B0aW9uYWwpKTtcbiAgfVxuXG4gIGdldCB0b3RhbENvbHVtbkNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIG5ldyBTZXQoKHRoaXMuX3BhbmVsQ29uZmlnLmNvbHVtbnMgfHwgW10pLm1hcChjID0+IGMua2V5KSkuc2l6ZTtcbiAgfVxuXG4gIGdldCBncm91cEJ5Q29sdW1ucygpOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10ge1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICByZXR1cm4gKHRoaXMuX3BhbmVsQ29uZmlnLmNvbHVtbnMgfHwgW10pLmZpbHRlcihjID0+IHtcbiAgICAgIGlmIChjLmdyb3VwYWJsZSA9PT0gZmFsc2UgfHwgc2Vlbi5oYXMoYy5rZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIWMuaGVhZGVyICYmIGMuZ3JvdXBhYmxlICE9PSB0cnVlKSByZXR1cm4gZmFsc2U7XG4gICAgICBzZWVuLmFkZChjLmtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBhY3RpdmVHcm91cEJ5TGFiZWwoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuZ3JvdXBCeS5hY3RpdmVLZXkpIHJldHVybiB0aGlzLl9wYW5lbENvbmZpZy5ub25lTGFiZWwgPz8gJ0F1Y3VuJztcbiAgICBjb25zdCBjb2wgPSB0aGlzLmdyb3VwQnlDb2x1bW5zLmZpbmQoYyA9PiBjLmtleSA9PT0gdGhpcy5ncm91cEJ5LmFjdGl2ZUtleSk7XG4gICAgcmV0dXJuIGNvbD8uaGVhZGVyIHx8IHRoaXMuZ3JvdXBCeS5hY3RpdmVLZXk7XG4gIH1cblxuICBnZXQgc3RhdGljU2xpY2VzRm9yTWVudSgpOiBBcnJheTx7IGtleTogc3RyaW5nOyB0aXRsZTogc3RyaW5nOyBpY29uPzogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gKHRoaXMuX3BhbmVsQ29uZmlnLnNsaWNlQ29uZmlncyA/PyBbXSlcbiAgICAgIC5maWx0ZXIocyA9PiAhIXMuY29sdW1uS2V5KVxuICAgICAgLm1hcChzID0+IHtcbiAgICAgICAgY29uc3QgY29sSWNvbiA9ICh0aGlzLl9wYW5lbENvbmZpZy5jb2x1bW5zID8/IFtdKS5maW5kKGMgPT4gYy5rZXkgPT09IHMuY29sdW1uS2V5KT8uaWNvbjtcbiAgICAgICAgcmV0dXJuIHsga2V5OiBzLmNvbHVtbktleSEsIHRpdGxlOiBzLnRpdGxlIHx8IGh1bWFuaXplS2V5KHMuY29sdW1uS2V5ISksIGljb246IHMuaWNvbiA/PyBjb2xJY29uIH07XG4gICAgICB9KTtcbiAgfVxuXG4gIGNvbExhYmVsKGNvbDogeyBrZXk6IHN0cmluZzsgaGVhZGVyPzogc3RyaW5nIH0pOiBzdHJpbmcge1xuICAgIHJldHVybiBjb2wuaGVhZGVyIHx8IGh1bWFuaXplS2V5KGNvbC5rZXkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIE1pc2Ugw6Agam91ciBkZSBsYSBjb25maWcgKGFwcGVsw6llIGRlcHVpcyByZWZyZXNoVmlld01vZGVsKVxuXG4gIHVwZGF0ZShwYW5lbENvbmZpZzogVmlld1BhbmVsQ29uZmlnKTogdm9pZCB7XG4gICAgdGhpcy5fcGFuZWxDb25maWcgPSBwYW5lbENvbmZpZztcbiAgICB0aGlzLl9yZWZyZXNoRGVmYXVsdENvbHVtbnMoKTtcbiAgICB0aGlzLl9yZWZyZXNoRHluYW1pY1NsaWNlTWV0YSgpO1xuICAgIGlmICghdGhpcy5ncm91cEJ5LnVzZXJDdXN0b21pemVkKSB7XG4gICAgICB0aGlzLmdyb3VwQnkuYWN0aXZlS2V5ID0gcGFuZWxDb25maWcuZGVmYXVsdEdyb3VwQnkgPz8gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgQWN0aW9ucyBGaWVsZHNcblxuICBzZXRBY3RpdmVDb2x1bW5zKGNvbHVtbnM6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSk6IHZvaWQge1xuICAgIHRoaXMuZmllbGRzLmFjdGl2ZUNvbHVtbnMgPSBjb2x1bW5zO1xuICAgIHRoaXMuZmllbGRzLnVzZXJDdXN0b21pemVkID0gdHJ1ZTtcbiAgfVxuXG4gIHNldFVzZXJDdXN0b21pemVkKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5maWVsZHMudXNlckN1c3RvbWl6ZWQgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKiBSZW1ldCBsYSB2dWUgZGFucyBzb24gw6l0YXQgaW5pdGlhbCA6IGNvbG9ubmVzIHBhciBkw6lmYXV0LCBncm91cEJ5IHBhciBkw6lmYXV0LCBwYXMgZGUgZHluYW1pYyBzbGljZXMuICovXG4gIHJlc2V0VG9EZWZhdWx0cygpOiB2b2lkIHtcbiAgICB0aGlzLmZpZWxkcy51c2VyQ3VzdG9taXplZCA9IGZhbHNlO1xuICAgIHRoaXMuZ3JvdXBCeS51c2VyQ3VzdG9taXplZCA9IGZhbHNlO1xuICAgIHRoaXMuX3JlZnJlc2hEZWZhdWx0Q29sdW1ucygpO1xuICAgIHRoaXMuZ3JvdXBCeS5hY3RpdmVLZXkgPSB0aGlzLl9wYW5lbENvbmZpZy5kZWZhdWx0R3JvdXBCeSA/PyBudWxsO1xuICAgIHRoaXMuc2xpY2VCeS5hY3RpdmVEeW5hbWljQ29sdW1ucyA9IFtdO1xuICAgIHRoaXMuX3JlZnJlc2hEeW5hbWljU2xpY2VNZXRhKCk7XG4gIH1cblxuICBhZGRDb2x1bW4oY29sdW1uOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+KTogdm9pZCB7XG4gICAgY29uc3QgY29uZmlnQ29scyA9IHRoaXMuX3BhbmVsQ29uZmlnLmNvbHVtbnMgPz8gW107XG4gICAgY29uc3QgY29uZmlnSW5kZXggPSBjb25maWdDb2xzLmZpbmRJbmRleChjID0+IGMua2V5ID09PSBjb2x1bW4ua2V5KTtcbiAgICBpZiAoY29uZmlnSW5kZXggPT09IC0xKSB7XG4gICAgICB0aGlzLmZpZWxkcy5hY3RpdmVDb2x1bW5zID0gWy4uLnRoaXMuZmllbGRzLmFjdGl2ZUNvbHVtbnMsIGNvbHVtbl07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluc2VydEJlZm9yZSA9IHRoaXMuZmllbGRzLmFjdGl2ZUNvbHVtbnMuZmluZEluZGV4KGMgPT4ge1xuICAgICAgICBjb25zdCBjaSA9IGNvbmZpZ0NvbHMuZmluZEluZGV4KGNjID0+IGNjLmtleSA9PT0gYy5rZXkpO1xuICAgICAgICByZXR1cm4gY2kgIT09IC0xICYmIGNpID4gY29uZmlnSW5kZXg7XG4gICAgICB9KTtcbiAgICAgIGlmIChpbnNlcnRCZWZvcmUgPT09IC0xKSB7XG4gICAgICAgIHRoaXMuZmllbGRzLmFjdGl2ZUNvbHVtbnMgPSBbLi4udGhpcy5maWVsZHMuYWN0aXZlQ29sdW1ucywgY29sdW1uXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNvcHkgPSBbLi4udGhpcy5maWVsZHMuYWN0aXZlQ29sdW1uc107XG4gICAgICAgIGNvcHkuc3BsaWNlKGluc2VydEJlZm9yZSwgMCwgY29sdW1uKTtcbiAgICAgICAgdGhpcy5maWVsZHMuYWN0aXZlQ29sdW1ucyA9IGNvcHk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZmllbGRzLnVzZXJDdXN0b21pemVkID0gdHJ1ZTtcbiAgICB0aGlzLl9ldmVudHMkLm5leHQoeyB0eXBlOiAnZmllbGRzQ2hhbmdlZCcsIGZpZWxkSWRzOiB0aGlzLmZpZWxkcy5hY3RpdmVDb2x1bW5zLm1hcChjID0+IGMua2V5KSB9KTtcbiAgfVxuXG4gIHJlbW92ZUNvbHVtbihjb2x1bW5LZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNvbCA9IHRoaXMuZmllbGRzLmFjdGl2ZUNvbHVtbnMuZmluZChjID0+IGMua2V5ID09PSBjb2x1bW5LZXkpO1xuICAgIGlmICghY29sKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFjb2wub3B0aW9uYWwgJiYgIXRoaXMuYWxsb3dDb2x1bW5SZW1vdmFsKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuZmllbGRzLmFjdGl2ZUNvbHVtbnMubGVuZ3RoIDw9IDEpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLmZpZWxkcy5hY3RpdmVDb2x1bW5zID0gdGhpcy5maWVsZHMuYWN0aXZlQ29sdW1ucy5maWx0ZXIoYyA9PiBjLmtleSAhPT0gY29sdW1uS2V5KTtcbiAgICB0aGlzLmZpZWxkcy51c2VyQ3VzdG9taXplZCA9IHRydWU7XG4gICAgdGhpcy5fZXZlbnRzJC5uZXh0KHsgdHlwZTogJ2ZpZWxkc0NoYW5nZWQnLCBmaWVsZElkczogdGhpcy5maWVsZHMuYWN0aXZlQ29sdW1ucy5tYXAoYyA9PiBjLmtleSkgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB0b2dnbGVDb2x1bW5WaXNpYmlsaXR5KGNvbHVtbjogVGFibGVDb2x1bW5Qcm92aWRlcjxUPiwgdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGlzVmlzaWJsZSA9IHRoaXMuaXNDb2x1bW5WaXNpYmxlKGNvbHVtbi5rZXkpO1xuICAgIGlmICh2aXNpYmxlICYmICFpc1Zpc2libGUpIHtcbiAgICAgIHRoaXMuYWRkQ29sdW1uKGNvbHVtbik7XG4gICAgfSBlbHNlIGlmICghdmlzaWJsZSAmJiBpc1Zpc2libGUpIHtcbiAgICAgIHRoaXMucmVtb3ZlQ29sdW1uKGNvbHVtbi5rZXkpO1xuICAgIH1cbiAgfVxuXG4gIHJlb3JkZXJDb2x1bW5zKGZyb21LZXk6IHN0cmluZywgdG9LZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHByZXYgPSB0aGlzLmZpZWxkcy5hY3RpdmVDb2x1bW5zLmZpbmRJbmRleChjID0+IGMua2V5ID09PSBmcm9tS2V5KTtcbiAgICBjb25zdCBjdXJyID0gdGhpcy5maWVsZHMuYWN0aXZlQ29sdW1ucy5maW5kSW5kZXgoYyA9PiBjLmtleSA9PT0gdG9LZXkpO1xuICAgIGlmIChwcmV2ID09PSAtMSB8fCBjdXJyID09PSAtMSB8fCBwcmV2ID09PSBjdXJyKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVvcmRlcmVkID0gWy4uLnRoaXMuZmllbGRzLmFjdGl2ZUNvbHVtbnNdO1xuICAgIGNvbnN0IFttb3ZlZF0gPSByZW9yZGVyZWQuc3BsaWNlKHByZXYsIDEpO1xuICAgIHJlb3JkZXJlZC5zcGxpY2UoY3VyciwgMCwgbW92ZWQpO1xuICAgIHRoaXMuZmllbGRzLmFjdGl2ZUNvbHVtbnMgPSByZW9yZGVyZWQ7XG4gICAgdGhpcy5maWVsZHMudXNlckN1c3RvbWl6ZWQgPSB0cnVlO1xuICAgIHRoaXMuX2V2ZW50cyQubmV4dCh7IHR5cGU6ICdmaWVsZHNDaGFuZ2VkJywgZmllbGRJZHM6IHRoaXMuZmllbGRzLmFjdGl2ZUNvbHVtbnMubWFwKGMgPT4gYy5rZXkpIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaXNDb2x1bW5WaXNpYmxlKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGRzLmFjdGl2ZUNvbHVtbnMuc29tZShjID0+IGMua2V5ID09PSBrZXkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIEFjdGlvbnMgR3JvdXAgYnlcblxuICBzZXRHcm91cEJ5KGtleTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuZ3JvdXBCeS5hY3RpdmVLZXkgPSBrZXk7XG4gICAgdGhpcy5ncm91cEJ5LnVzZXJDdXN0b21pemVkID0gdHJ1ZTtcbiAgICB0aGlzLl9ldmVudHMkLm5leHQoeyB0eXBlOiAnZ3JvdXBCeUNoYW5nZWQnLCBrZXkgfSk7XG4gIH1cblxuICAvLyDilIDilIAgQWN0aW9ucyBTbGljZSBieSAoZHluYW1pcXVlKVxuXG4gIC8qKiBBcHBlbMOpZSBxdWFuZCBsZSBTbGljZVBhbmVsQ29tcG9uZW50IMOpbWV0IGR5bmFtaWNTbGljZUtleXNDaGFuZ2UgKi9cbiAgb25EeW5hbWljU2xpY2VLZXlzQ2hhbmdlKGtleXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgY29uc3QgYWxsQ29scyA9IHRoaXMuX3BhbmVsQ29uZmlnLmNvbHVtbnMgPz8gW107XG4gICAgY29uc3Qgc3RhdGljS2V5cyA9IG5ldyBTZXQoXG4gICAgICAodGhpcy5fcGFuZWxDb25maWcuc2xpY2VDb25maWdzID8/IFtdKS5tYXAocyA9PiBzLmNvbHVtbktleSkuZmlsdGVyKChrKTogayBpcyBzdHJpbmcgPT4gISFrKVxuICAgICk7XG4gICAgY29uc3QgZHluYW1pY0tleVNldCA9IG5ldyBTZXQoa2V5cyk7XG4gICAgY29uc3QgZXhpc3RpbmdLZXlzID0gbmV3IFNldChbLi4uc3RhdGljS2V5cywgLi4uZHluYW1pY0tleVNldF0pO1xuXG4gICAgdGhpcy5zbGljZUJ5LmFjdGl2ZUR5bmFtaWNDb2x1bW5zID0ga2V5c1xuICAgICAgLm1hcChrID0+IGFsbENvbHMuZmluZChjID0+IGMua2V5ID09PSBrKSlcbiAgICAgIC5maWx0ZXIoKGMpOiBjIGlzIFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4gPT4gISFjKTtcblxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB0aGlzLnNsaWNlQnkuYXZhaWxhYmxlRm9yRHluYW1pYyA9IGFsbENvbHMuZmlsdGVyKGMgPT4ge1xuICAgICAgaWYgKGMuc2xpY2VhYmxlID09PSBmYWxzZSB8fCBleGlzdGluZ0tleXMuaGFzKGMua2V5KSB8fCBzZWVuLmhhcyhjLmtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHNlZW4uYWRkKGMua2V5KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fY29tcHV0ZVNsaWNlTGFiZWwoKTtcbiAgICB0aGlzLl9ldmVudHMkLm5leHQoeyB0eXBlOiAnZHluYW1pY1NsaWNlc0NoYW5nZWQnLCBrZXlzIH0pO1xuICB9XG5cbiAgaXNEeW5hbWljU2xpY2VBY3RpdmUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zbGljZUJ5LmFjdGl2ZUR5bmFtaWNDb2x1bW5zLnNvbWUoYyA9PiBjLmtleSA9PT0ga2V5KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDb250cmF0IGNvcmVcblxuICAvKiogUmV0b3VybmUgdW4gc25hcHNob3QgVmlld1N0YXRlIChjb250cmF0IGNvcmUpIGRlIGwnw6l0YXQgY291cmFudC4gKi9cbiAgdG9WaWV3U3RhdGUoKTogVmlld1N0YXRlIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0ZWRGaWVsZElkczogdGhpcy5maWVsZHMuYWN0aXZlQ29sdW1ucy5tYXAoYyA9PiBjLmtleSksXG4gICAgICBncm91cEJ5S2V5OiB0aGlzLmdyb3VwQnkuYWN0aXZlS2V5LFxuICAgICAgZHluYW1pY1NsaWNlS2V5czogdGhpcy5zbGljZUJ5LmFjdGl2ZUR5bmFtaWNDb2x1bW5zLm1hcChjID0+IGMua2V5KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIENvbnZlcnRpdCB1bmUgVGFibGVDb2x1bW5Qcm92aWRlciBlbiBWaWV3RmllbGQgKGNvbnRyYXQgY29yZSkuICovXG4gIHN0YXRpYyB0b1ZpZXdGaWVsZChjb2w6IFRhYmxlQ29sdW1uUHJvdmlkZXI8YW55Pik6IFZpZXdGaWVsZCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBjb2wua2V5LFxuICAgICAgbGFiZWw6IGNvbC5oZWFkZXIsXG4gICAgICBpY29uOiBjb2wuaWNvbixcbiAgICAgIGdyb3VwYWJsZTogY29sLmdyb3VwYWJsZSxcbiAgICAgIHNsaWNlYWJsZTogY29sLnNsaWNlYWJsZSxcbiAgICAgIG9wdGlvbmFsOiBjb2wub3B0aW9uYWwsXG4gICAgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBEZXN0cnVjdG9yXG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9ldmVudHMkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvLyDilIDilIAgSGVscGVycyBwcml2w6lzXG5cbiAgcHJpdmF0ZSBfcmVmcmVzaERlZmF1bHRDb2x1bW5zKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRDb2xzID0gKHRoaXMuX3BhbmVsQ29uZmlnLmNvbHVtbnMgfHwgW10pLmZpbHRlcihjID0+ICFjLm9wdGlvbmFsKTtcbiAgICBpZiAoIXRoaXMuZmllbGRzLnVzZXJDdXN0b21pemVkIHx8IHRoaXMuZmllbGRzLmFjdGl2ZUNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmZpZWxkcy5hY3RpdmVDb2x1bW5zID0gWy4uLmRlZmF1bHRDb2xzXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYWxsb3dlZEtleXMgPSBuZXcgU2V0KCh0aGlzLl9wYW5lbENvbmZpZy5jb2x1bW5zIHx8IFtdKS5tYXAoYyA9PiBjLmtleSkpO1xuICAgICAgdGhpcy5maWVsZHMuYWN0aXZlQ29sdW1ucyA9IHRoaXMuZmllbGRzLmFjdGl2ZUNvbHVtbnMuZmlsdGVyKGMgPT4gYWxsb3dlZEtleXMuaGFzKGMua2V5KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVmcmVzaER5bmFtaWNTbGljZU1ldGEoKTogdm9pZCB7XG4gICAgY29uc3QgYWxsQ29scyA9IHRoaXMuX3BhbmVsQ29uZmlnLmNvbHVtbnMgPz8gW107XG4gICAgY29uc3Qgc3RhdGljS2V5cyA9IG5ldyBTZXQoXG4gICAgICAodGhpcy5fcGFuZWxDb25maWcuc2xpY2VDb25maWdzID8/IFtdKS5tYXAocyA9PiBzLmNvbHVtbktleSkuZmlsdGVyKChrKTogayBpcyBzdHJpbmcgPT4gISFrKVxuICAgICk7XG4gICAgY29uc3QgYWN0aXZlRHluS2V5cyA9IG5ldyBTZXQodGhpcy5zbGljZUJ5LmFjdGl2ZUR5bmFtaWNDb2x1bW5zLm1hcChjID0+IGMua2V5KSk7XG5cbiAgICBjb25zdCBzZWVuMSA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHRoaXMuc2xpY2VCeS5hdmFpbGFibGVGb3JEeW5hbWljID0gYWxsQ29scy5maWx0ZXIoYyA9PiB7XG4gICAgICBpZiAoYy5zbGljZWFibGUgPT09IGZhbHNlIHx8IHN0YXRpY0tleXMuaGFzKGMua2V5KSB8fCBhY3RpdmVEeW5LZXlzLmhhcyhjLmtleSkgfHwgc2VlbjEuaGFzKGMua2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCFjLmhlYWRlciAmJiBjLnNsaWNlYWJsZSAhPT0gdHJ1ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgc2VlbjEuYWRkKGMua2V5KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2VlbjIgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB0aGlzLnNsaWNlQnkuYWxsRHluYW1pY0NvbHVtbnMgPSBhbGxDb2xzLmZpbHRlcihjID0+IHtcbiAgICAgIGlmIChjLnNsaWNlYWJsZSA9PT0gZmFsc2UgfHwgc3RhdGljS2V5cy5oYXMoYy5rZXkpIHx8IHNlZW4yLmhhcyhjLmtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghYy5oZWFkZXIgJiYgYy5zbGljZWFibGUgIT09IHRydWUpIHJldHVybiBmYWxzZTtcbiAgICAgIHNlZW4yLmFkZChjLmtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2NvbXB1dGVTbGljZUxhYmVsKCk7XG4gIH1cblxuICAvKiogTm90aWZpZSBsYSBmYWNhZGUgZGVzIHNsaWNlcyBzdGF0aXF1ZXMgYWN0dWVsbGVtZW50IGNhY2jDqWVzIChnw6lyw6kgcGFyIHRhYmxlLmNvbXBvbmVudCkuXG4gICAqIFJlY2FsY3VsZSBsZSBsYWJlbCBzbGljZSBhZmluIHF1J2lsIHJlZmzDqHRlIHVuaXF1ZW1lbnQgbGVzIHNsaWNlcyB2aXNpYmxlcy4gKi9cbiAgdXBkYXRlSGlkZGVuU3RhdGljS2V5cyhrZXlzOiBTZXQ8c3RyaW5nPik6IHZvaWQge1xuICAgIHRoaXMuX2hpZGRlblN0YXRpY0tleXMgPSBrZXlzO1xuICAgIHRoaXMuX2NvbXB1dGVTbGljZUxhYmVsKCk7XG4gIH1cblxuICBwcml2YXRlIF9jb21wdXRlU2xpY2VMYWJlbCgpOiB2b2lkIHtcbiAgICBjb25zdCB2aXNpYmxlU3RhdGljcyA9ICh0aGlzLl9wYW5lbENvbmZpZy5zbGljZUNvbmZpZ3MgPz8gW10pLmZpbHRlcihcbiAgICAgIHMgPT4gIXMuY29sdW1uS2V5IHx8ICF0aGlzLl9oaWRkZW5TdGF0aWNLZXlzLmhhcyhzLmNvbHVtbktleSlcbiAgICApO1xuICAgIGNvbnN0IHZpc2libGVTdGF0aWNDb3VudCA9IHZpc2libGVTdGF0aWNzLmxlbmd0aDtcbiAgICBjb25zdCB0b3RhbCA9IHZpc2libGVTdGF0aWNDb3VudCArIHRoaXMuc2xpY2VCeS5hY3RpdmVEeW5hbWljQ29sdW1ucy5sZW5ndGg7XG4gICAgaWYgKHRvdGFsID09PSAwKSB7IHRoaXMuc2xpY2VCeS5hY3RpdmVMYWJlbCA9IHRoaXMuX3BhbmVsQ29uZmlnLm5vbmVMYWJlbCA/PyAnQXVjdW4nOyByZXR1cm47IH1cbiAgICBpZiAodG90YWwgPT09IDEpIHtcbiAgICAgIGlmICh2aXNpYmxlU3RhdGljQ291bnQgPT09IDEpIHtcbiAgICAgICAgY29uc3QgZmlyc3QgPSB2aXNpYmxlU3RhdGljc1swXTtcbiAgICAgICAgdGhpcy5zbGljZUJ5LmFjdGl2ZUxhYmVsID0gZmlyc3Q/LnRpdGxlIHx8IGZpcnN0Py5jb2x1bW5LZXkgfHwgJzEnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnNsaWNlQnkuYWN0aXZlTGFiZWwgPSB0aGlzLnNsaWNlQnkuYWN0aXZlRHluYW1pY0NvbHVtbnNbMF0/LmhlYWRlciB8fCAnMSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2xpY2VCeS5hY3RpdmVMYWJlbCA9IGAke3RvdGFsfSBhY3RpZnNgO1xuICB9XG5cbiAgcHJpdmF0ZSBfdW5pcXVlQnlLZXkoY29sczogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcmV0dXJuIGNvbHMuZmlsdGVyKGMgPT4ge1xuICAgICAgaWYgKHNlZW4uaGFzKGMua2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgc2Vlbi5hZGQoYy5rZXkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,44 +0,0 @@
1
- /**
2
- * GroupByManager
3
- *
4
- * Encapsule tout l'état et la logique liés au mode Group By :
5
- * - état collapsed / expanded des groupes
6
- * - pagination interne par groupe
7
- * - tri des groupes (asc / desc)
8
- * - scroll vers un groupe
9
- *
10
- * Le composant TableComponent l'instancie et lui passe deux callbacks :
11
- * - `onNeedProjection` : demande une reprojection légère de la page courante
12
- * - `onNeedRender` : demande un rebuild complet (tri changé etc.)
13
- */
14
- export declare class GroupByManager {
15
- private readonly onNeedProjection;
16
- private readonly onNeedRender;
17
- /** Groupes actuellement ouverts (mode default-collapsed) ou fermés (mode default-expanded). */
18
- private readonly _collapsedGroups;
19
- /** Page courante par clé de groupe. */
20
- private readonly _groupPages;
21
- /** Taille de page pour la pagination interne des groupes. */
22
- groupPageSize: number;
23
- /** Ordre de tri des groupes ('asc' | 'desc'). */
24
- groupSortOrder: 'asc' | 'desc';
25
- /**
26
- * Quand `true`, tous les groupes sont collapsés par défaut.
27
- * `_collapsedGroups` contient alors le seul groupe ouvert.
28
- */
29
- private _defaultGroupCollapsed;
30
- constructor(onNeedProjection: () => void, onNeedRender: () => void);
31
- /** Initialise le mode par défaut selon qu'un groupBy vient d'être activé. */
32
- setDefaultCollapsed(collapsed: boolean): void;
33
- /** Réinitialise l'état (à appeler quand le groupBy change de colonne). */
34
- reset(): void;
35
- isGroupCollapsed(groupKey: string): boolean;
36
- toggleGroupCollapse(groupKey: string, scrollTo: (key: string) => void): void;
37
- /** Retourne le groupe actuellement ouvert (seulement en mode default-collapsed avec exactement 1 ouvert). */
38
- getSingleOpenGroup(): string | null;
39
- getPage(groupKey: string): number;
40
- groupPageBack(groupKey: string): void;
41
- groupPageForward(groupKey: string, totalCount: number): void;
42
- onGroupPageSizeChange(size: number): void;
43
- onGroupSortToggle(dir: 'asc' | 'desc', scrollTo: (key: string) => void): void;
44
- }
@@ -1,26 +0,0 @@
1
- import { TableColumnProvider } from '../jquery-table.model';
2
- export interface LazyCallbacks {
3
- onRefresh(): void;
4
- onMarkForCheck(): void;
5
- }
6
- /**
7
- * Gère le cycle de vie des colonnes à chargement différé (lazy) :
8
- * statuts, données, annulation des requêtes en cours.
9
- *
10
- * Pas de dépendance Angular/DOM — peut être instancié manuellement dans le composant.
11
- */
12
- export declare class LazyColumnManager<T = any> {
13
- private _status;
14
- private _data;
15
- private _cancels;
16
- get status(): Map<string, 'idle' | 'loading' | 'loaded' | 'error'>;
17
- get data(): Map<string, Map<any, any>>;
18
- getStatus(key: string): 'idle' | 'loading' | 'loaded' | 'error';
19
- getRenderType(rowValue: any): 'loading' | 'error' | 'value';
20
- /** Annule tous les fetches en cours et réinitialise l'état (appeler lors d'un changement de données). */
21
- cancelAll(): void;
22
- /** Réinitialise une colonne et relance son fetch. */
23
- retry(column: TableColumnProvider<T>, resolvedData: T[], callbacks: LazyCallbacks): void;
24
- /** Lance le chargement différé d'une colonne. No-op si déjà en cours. */
25
- fetch(column: TableColumnProvider<T>, resolvedData: T[], callbacks: LazyCallbacks): void;
26
- }
@@ -1,81 +0,0 @@
1
- import { ElementRef, EventEmitter, OnChanges, OnInit, SimpleChanges } from '@angular/core';
2
- import { SliceColumnDef, SliceConfig } from './slice-panel.model';
3
- import { JqtI18n } from '../../jqt-i18n.token';
4
- import * as i0 from "@angular/core";
5
- export declare class SlicePanelComponent<T = any> implements OnChanges, OnInit {
6
- sliceConfigs: SliceConfig<T>[];
7
- columns: SliceColumnDef<T>[];
8
- data: T[];
9
- lazyData: Map<string, Map<any, any>>;
10
- lazyStatus: Map<string, 'idle' | 'loading' | 'loaded' | 'error'>;
11
- showToggle: boolean;
12
- showCounts: boolean;
13
- collapsedByDefault: boolean;
14
- alwaysShow: boolean;
15
- filterChange: EventEmitter<(row: T) => boolean>;
16
- activeKeysChange: EventEmitter<string[][]>;
17
- dynamicSliceKeysChange: EventEmitter<string[]>;
18
- collapsedChange: EventEmitter<boolean>;
19
- slicePanelBodyRef?: ElementRef<HTMLElement>;
20
- private _cdr;
21
- private _i18nRaw;
22
- readonly i18n: JqtI18n;
23
- isCollapsed: boolean;
24
- activeKeysBySlice: Map<number, Set<string>>;
25
- private _expandedSlices;
26
- _dynamicSlices: Array<{
27
- key: string;
28
- slice: SliceConfig<T>;
29
- }>;
30
- _cachedSlices: SliceConfig<T>[];
31
- private _countCache;
32
- readonly trackBySliceIndex: (index: number, _: any) => number;
33
- readonly trackByCategoryKey: (_: number, cat: any) => string;
34
- ngOnInit(): void;
35
- ngOnChanges(changes: SimpleChanges): void;
36
- get showPanel(): boolean;
37
- get slices(): SliceConfig<T>[];
38
- get staticSliceCount(): number;
39
- get staticSlicesForMenu(): Array<{
40
- key: string;
41
- title: string;
42
- }>;
43
- get activeDynamicSliceColumns(): SliceColumnDef<T>[];
44
- get availableColumnsForDynamicSlice(): SliceColumnDef<T>[];
45
- get activeSliceByLabel(): string;
46
- isSliceCollapsed(sliceIndex: number): boolean;
47
- toggleSliceCollapse(sliceIndex: number): void;
48
- togglePanel(): void;
49
- isSliceDynamic(sliceIndex: number): boolean;
50
- isSliceLoading(sliceIndex: number): boolean;
51
- isStaticSliceVisible(_columnKey: string): boolean;
52
- toggleStaticSlice(_columnKey: string): void;
53
- getSliceIcon(slice: SliceConfig<T>): string | undefined;
54
- isSliceCategoryActive(sliceIndex: number, categoryKey: string): boolean;
55
- isSliceAllActive(sliceIndex: number): boolean;
56
- sliceCategoryCount(sliceIndex: number, categoryKey: string): number;
57
- isSliceEmpty(sliceIndex: number): boolean;
58
- onSliceCategorySelected(sliceIndex: number, categoryKey: string): void;
59
- onSliceAllSelected(sliceIndex: number): void;
60
- /** Retourne l'état des filtres actifs sous forme sérialisable (sliceIndex → tableau de clés).
61
- * Inclut les slices sans sélection (tableau vide) pour distinguer "aucune tranche sélectionnée"
62
- * (= filtre ouvert, rien coché) de "slice absente". */
63
- getActiveFilters(): Record<number, string[]>;
64
- /** Restaure les filtres actifs depuis un snapshot sérialisé et réémet le filtre. */
65
- restoreFilters(filters: Record<number, string[]>): void;
66
- addDynamicSlice(column: SliceColumnDef<T>): void;
67
- removeDynamicSlice(sliceIndex: number): void;
68
- removeDynamicSliceByKey(key: string): void;
69
- private _emitFilter;
70
- private _getDynamicSliceColumnKey;
71
- private _getSliceIdentity;
72
- private _materializeSlice;
73
- private _buildCategoryFromValue;
74
- private _computeDistinctValues;
75
- private _getLazyAwareValue;
76
- private _rebuildCache;
77
- private _refreshDynamicSlices;
78
- private _scrollSliceTitleIntoView;
79
- static ɵfac: i0.ɵɵFactoryDeclaration<SlicePanelComponent<any>, never>;
80
- static ɵcmp: i0.ɵɵComponentDeclaration<SlicePanelComponent<any>, "slice-panel", never, { "sliceConfigs": { "alias": "sliceConfigs"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; "data": { "alias": "data"; "required": false; }; "lazyData": { "alias": "lazyData"; "required": false; }; "lazyStatus": { "alias": "lazyStatus"; "required": false; }; "showToggle": { "alias": "showToggle"; "required": false; }; "showCounts": { "alias": "showCounts"; "required": false; }; "collapsedByDefault": { "alias": "collapsedByDefault"; "required": false; }; "alwaysShow": { "alias": "alwaysShow"; "required": false; }; }, { "filterChange": "filterChange"; "activeKeysChange": "activeKeysChange"; "dynamicSliceKeysChange": "dynamicSliceKeysChange"; "collapsedChange": "collapsedChange"; }, never, never, true, never>;
81
- }
@@ -1,69 +0,0 @@
1
- import { DataProvider } from '@oneteme/jquery-core';
2
- import { Observable } from 'rxjs';
3
- /** Une catégorie cliquable dans un slice (ex: "En cours", "Terminé"). */
4
- export interface SliceCategory<T = any> {
5
- key: string;
6
- label: string;
7
- /**
8
- * Prédicat de filtrage en mémoire — **optionnel**.
9
- *
10
- * - **Tableau** : requis. Le slice-panel applique ce prédicat sur les lignes locales.
11
- * - **Graphique** : omis. Le parent écoute `(activeKeysChange)` pour déclencher
12
- * une nouvelle requête API avec les clés sélectionnées.
13
- *
14
- * Si `filter` est absent, la sélection n'a aucun effet sur les données locales ;
15
- * c'est au composant parent de réagir via `(activeKeysChange)`.
16
- */
17
- filter?: (row: T) => boolean;
18
- }
19
- /**
20
- * Groupe de filtres affiché dans le panneau latéral.
21
- *
22
- * **Mode colonne** (`columnKey`) : le slice lit automatiquement les valeurs distinctes
23
- * de la colonne désignée pour générer les catégories. `bucket` permet de regrouper
24
- * des valeurs continues (ex: plages de durée). `hidden` le masque par défaut et
25
- * laisse la table le rendre disponible dans le menu "Ajouter un filtre".
26
- *
27
- * **Mode manuel** (`categories`) : les catégories sont définies explicitement avec
28
- * leur propre fonction `filter`. `columnKey` peut coexister pour le lien avec la
29
- * colonne (icône, label), mais `categories` prend le dessus sur le bucketing auto.
30
- */
31
- export interface SliceConfig<T = any> {
32
- title?: string;
33
- /** Icône Material affichée dans le titre du slice (ex: 'schedule', 'dns'). */
34
- icon?: string;
35
- /** Autorise la sélection simultanée de plusieurs catégories. Par défaut : `false`. */
36
- multiSelect?: boolean;
37
- /**
38
- * Clé de la colonne associée à ce slice.
39
- * En **mode colonne**, les valeurs distinctes de cette colonne génèrent les catégories.
40
- * En **mode manuel**, sert uniquement à lier visuellement le slice à la colonne.
41
- */
42
- columnKey?: string;
43
- /** Masqué par défaut ; disponible via le menu "Ajouter un filtre". Par défaut : `false`. */
44
- hidden?: boolean;
45
- /**
46
- * Transforme chaque valeur de ligne en label de tranche avant regroupement.
47
- * Utilisé en **mode colonne** pour des valeurs continues (ex: durées, montants).
48
- * Ignoré si `categories` est défini.
49
- */
50
- bucket?: (row: T) => string;
51
- /** Catégories explicites (**mode manuel**). Si absent, générées auto depuis `columnKey`. */
52
- categories?: SliceCategory<T>[];
53
- }
54
- /**
55
- * Description minimale d'une colonne nécessaire au panneau de slices.
56
- * Utilisé indépendamment de la table : pas de propriétés de rendu (tri, suppression, groupement...).
57
- * `TableColumnProvider` (librairie table) est un superset structurel compatible.
58
- */
59
- export interface SliceColumnDef<T = any> {
60
- key: string;
61
- header?: string;
62
- icon?: string;
63
- value?: DataProvider<any>;
64
- /** Chargement différé : la présence de cet objet active le mode lazy. */
65
- lazy?: {
66
- /** Fonction appelée pour charger les valeurs de la colonne. Retourne un tableau dans le même ordre que les lignes. */
67
- fetchFn: () => Observable<any[]>;
68
- };
69
- }