@lumeer/pivot 0.0.13 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/fesm2022/lumeer-pivot.mjs +56 -43
  2. package/fesm2022/lumeer-pivot.mjs.map +1 -1
  3. package/index.d.ts +332 -5
  4. package/lumeer-pivot-0.2.0.tgz +0 -0
  5. package/package.json +4 -6
  6. package/esm2022/lib/directives/lmr-templates.directive.mjs +0 -27
  7. package/esm2022/lib/lmr-pivot-table.component.mjs +0 -147
  8. package/esm2022/lib/lmr-pivot-table.module.mjs +0 -63
  9. package/esm2022/lib/lmr-simple-pivot-table.component.mjs +0 -101
  10. package/esm2022/lib/pipes/cell-has-value.pipe.mjs +0 -35
  11. package/esm2022/lib/pipes/contrast-color.pipe.mjs +0 -41
  12. package/esm2022/lib/pipes/filter-visible-cells.pipe.mjs +0 -35
  13. package/esm2022/lib/pipes/is-cell-expandable.pipe.mjs +0 -35
  14. package/esm2022/lib/pipes/is-cell-expanded.pipe.mjs +0 -37
  15. package/esm2022/lib/pipes/is-cell-rows-expandable.pipe.mjs +0 -35
  16. package/esm2022/lib/pipes/pivot-data-empty.pipe.mjs +0 -38
  17. package/esm2022/lib/util/lmr-pivot-config.mjs +0 -17
  18. package/esm2022/lib/util/lmr-pivot-constants.mjs +0 -12
  19. package/esm2022/lib/util/lmr-pivot-data.mjs +0 -2
  20. package/esm2022/lib/util/lmr-pivot-state.mjs +0 -156
  21. package/esm2022/lib/util/lmr-pivot-table.mjs +0 -2
  22. package/esm2022/lib/util/lmr-simple-pivot-config.mjs +0 -2
  23. package/esm2022/lib/util/pivot-data-converter.mjs +0 -507
  24. package/esm2022/lib/util/pivot-table-converter.mjs +0 -1017
  25. package/esm2022/lib/util/pivot-util.mjs +0 -75
  26. package/esm2022/lumeer-pivot.mjs +0 -5
  27. package/esm2022/public-api.mjs +0 -13
  28. package/lib/directives/lmr-templates.directive.d.ts +0 -14
  29. package/lib/lmr-pivot-table.component.d.ts +0 -49
  30. package/lib/lmr-pivot-table.module.d.ts +0 -18
  31. package/lib/lmr-simple-pivot-table.component.d.ts +0 -38
  32. package/lib/pipes/cell-has-value.pipe.d.ts +0 -8
  33. package/lib/pipes/contrast-color.pipe.d.ts +0 -11
  34. package/lib/pipes/filter-visible-cells.pipe.d.ts +0 -9
  35. package/lib/pipes/is-cell-expandable.pipe.d.ts +0 -8
  36. package/lib/pipes/is-cell-expanded.pipe.d.ts +0 -9
  37. package/lib/pipes/is-cell-rows-expandable.pipe.d.ts +0 -8
  38. package/lib/pipes/pivot-data-empty.pipe.d.ts +0 -8
  39. package/lib/util/lmr-pivot-config.d.ts +0 -84
  40. package/lib/util/lmr-pivot-constants.d.ts +0 -11
  41. package/lib/util/lmr-pivot-data.d.ts +0 -50
  42. package/lib/util/lmr-pivot-state.d.ts +0 -14
  43. package/lib/util/lmr-pivot-table.d.ts +0 -25
  44. package/lib/util/lmr-simple-pivot-config.d.ts +0 -9
  45. package/lib/util/pivot-data-converter.d.ts +0 -46
  46. package/lib/util/pivot-table-converter.d.ts +0 -74
  47. package/lib/util/pivot-util.d.ts +0 -12
  48. package/lumeer-pivot-0.0.13.tgz +0 -0
  49. package/public-api.d.ts +0 -9
package/index.d.ts CHANGED
@@ -1,5 +1,332 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- /// <amd-module name="@lumeer/pivot" />
5
- export * from './public-api';
1
+ import * as i0 from '@angular/core';
2
+ import { OnInit, OnChanges, TemplateRef, EventEmitter, SimpleChanges, PipeTransform } from '@angular/core';
3
+ import { Constraint, DataResource, DataAggregationType, ConstraintData, QueryStem, QueryAttribute, Collection, DocumentsAndLinksData, LinkType, Query, Attribute, LanguageTag } from '@lumeer/data-filters';
4
+ import { Observable, BehaviorSubject } from 'rxjs';
5
+ import * as i11 from '@angular/common';
6
+ import * as i12 from '@angular/cdk/scrolling';
7
+
8
+ interface LmrPivotData {
9
+ data: LmrPivotStemData[];
10
+ constraintData?: ConstraintData;
11
+ mergeTables?: boolean;
12
+ ableToMerge?: boolean;
13
+ }
14
+ interface LmrPivotStemData {
15
+ columnHeaders: LmrPivotDataHeader[];
16
+ columnHeaderAttributes: LmrPivotHeaderAttribute[];
17
+ rowHeaders: LmrPivotDataHeader[];
18
+ rowHeaderAttributes: LmrPivotHeaderAttribute[];
19
+ valueTitles: string[];
20
+ values: any[][];
21
+ dataResources: DataResource[][][];
22
+ valuesConstraints?: Constraint[];
23
+ valueTypes?: LmrPivotValueType[];
24
+ valueAggregations?: DataAggregationType[];
25
+ rowsConfig: LmrPivotDimensionConfig[];
26
+ columnsConfig: LmrPivotDimensionConfig[];
27
+ hasAdditionalColumnLevel?: boolean;
28
+ }
29
+ interface LmrPivotDimensionConfig {
30
+ showSums?: boolean;
31
+ sticky?: boolean;
32
+ sort?: LmrPivotSort;
33
+ expressions?: LmrPivotExpression[];
34
+ }
35
+ interface LmrPivotHeaderAttribute {
36
+ title: string;
37
+ color: string;
38
+ }
39
+ interface LmrPivotDataHeader {
40
+ title: string;
41
+ children?: LmrPivotDataHeader[];
42
+ targetIndex?: number;
43
+ color: string;
44
+ isValueHeader: boolean;
45
+ constraint?: Constraint;
46
+ attributeName?: string;
47
+ expressions?: LmrPivotDataHeaderExpression[];
48
+ }
49
+ interface LmrPivotDataHeaderExpression extends LmrPivotExpression {
50
+ firstHeaderIndex?: number;
51
+ operands: LmrPivotDataHeaderOperand[];
52
+ }
53
+ type LmrPivotDataHeaderOperand = LmrPivotHeaderOperand & {
54
+ headers: LmrPivotDataHeader[];
55
+ } | LmrPivotValueOperand | LmrPivotDataHeaderExpression;
56
+
57
+ interface LmrPivotConfig {
58
+ version?: LmrPivotConfigVersion;
59
+ stemsConfigs: LmrPivotStemConfig[];
60
+ mergeTables?: boolean;
61
+ }
62
+ interface LmrPivotTransform {
63
+ checkValidConstraintOverride?: (c1: Constraint, c2: Constraint) => Constraint;
64
+ formatAggregation?: (type: DataAggregationType) => string;
65
+ formatSummaryHeader?: (header: LmrPivotDataHeader, level: number) => {
66
+ title?: string;
67
+ summary: string;
68
+ };
69
+ formatRowHeader?: (title: string, level: number) => string;
70
+ formatColumnHeader?: (title: string, level: number) => string;
71
+ }
72
+ interface LmrPivotStemConfig {
73
+ stem?: QueryStem;
74
+ rowAttributes: LmrPivotRowAttribute[];
75
+ columnAttributes: LmrPivotColumnAttribute[];
76
+ valueAttributes: LmrPivotValueAttribute[];
77
+ }
78
+ declare enum LmrPivotConfigVersion {
79
+ V1 = "1"
80
+ }
81
+ interface LmrPivotAttribute extends QueryAttribute {
82
+ }
83
+ interface LmrPivotRowColumnAttribute extends LmrPivotAttribute {
84
+ showSums?: boolean;
85
+ sticky?: boolean;
86
+ sort?: LmrPivotSort;
87
+ expressions?: LmrPivotExpression[];
88
+ }
89
+ interface LmrPivotRowAttribute extends LmrPivotRowColumnAttribute {
90
+ showHeader?: boolean;
91
+ }
92
+ interface LmrPivotColumnAttribute extends LmrPivotRowColumnAttribute {
93
+ }
94
+ interface LmrPivotSortValue {
95
+ title: string;
96
+ isSummary?: boolean;
97
+ }
98
+ interface LmrPivotSortList {
99
+ valueTitle: string;
100
+ values: LmrPivotSortValue[];
101
+ }
102
+ interface LmrPivotSort {
103
+ attribute?: LmrPivotAttribute;
104
+ list?: LmrPivotSortList;
105
+ asc: boolean;
106
+ }
107
+ declare enum LmrPivotValueType {
108
+ Default = "default",
109
+ ColumnPercentage = "column",
110
+ RowPercentage = "row",
111
+ AllPercentage = "all"
112
+ }
113
+ interface LmrPivotValueAttribute extends LmrPivotAttribute {
114
+ aggregation: DataAggregationType;
115
+ valueType?: LmrPivotValueType;
116
+ }
117
+ interface LmrPivotExpression {
118
+ operation: LmrPivotExpressionOperation;
119
+ operands: LmrPivotOperand[];
120
+ title: string;
121
+ type: 'expression';
122
+ position: LmrPivotPosition;
123
+ expandable?: boolean;
124
+ }
125
+ declare enum LmrPivotPosition {
126
+ BeforeHeader = "beforeHeader",
127
+ StickToEnd = "stickToEnd"
128
+ }
129
+ type LmrPivotExpressionOperation = 'add' | 'subtract' | 'multiply' | 'divide';
130
+ interface LmrPivotHeaderOperand {
131
+ type: 'header';
132
+ value: string;
133
+ }
134
+ interface LmrPivotValueOperand {
135
+ type: 'value';
136
+ value: number;
137
+ }
138
+ type LmrPivotOperand = LmrPivotHeaderOperand | LmrPivotValueOperand | LmrPivotExpression;
139
+
140
+ interface LmrPivotTable {
141
+ cells: LmrPivotTableCell[][];
142
+ }
143
+ interface LmrPivotTableCell {
144
+ value: any;
145
+ dataResources?: DataResource[];
146
+ constraint?: Constraint;
147
+ summary?: string;
148
+ rowSpan: number;
149
+ colSpan: number;
150
+ cssClass: string;
151
+ isValue?: boolean;
152
+ isHeader?: boolean;
153
+ isAttributeHeader?: boolean;
154
+ isSummary?: boolean;
155
+ background?: string;
156
+ label?: string;
157
+ stickyTop?: boolean;
158
+ stickyStart?: boolean;
159
+ rowIndexes?: number[];
160
+ childIndexes?: number[];
161
+ originalRowIndex?: number;
162
+ expandable?: boolean;
163
+ }
164
+
165
+ interface LmrPivotTableState {
166
+ cells?: LmrPivotTableCellState[][];
167
+ }
168
+ interface LmrPivotTableCellState {
169
+ collapsed?: boolean;
170
+ }
171
+
172
+ declare class LmrPivotTableComponent implements OnInit, OnChanges {
173
+ collections: Collection[];
174
+ data: DocumentsAndLinksData;
175
+ linkTypes: LinkType[];
176
+ query: Query;
177
+ constraintData: ConstraintData;
178
+ config: LmrPivotConfig;
179
+ transform: LmrPivotTransform;
180
+ emptyTablesTemplateInput: TemplateRef<any>;
181
+ tableCellTemplateInput: TemplateRef<any>;
182
+ initiallyCollapsed: boolean;
183
+ cellClick: EventEmitter<{
184
+ cell: LmrPivotTableCell;
185
+ tableIndex: number;
186
+ rowIndex: number;
187
+ columnIndex: number;
188
+ }>;
189
+ pivotDataChange: EventEmitter<LmrPivotData>;
190
+ pivotTablesChange: EventEmitter<LmrPivotTable[]>;
191
+ emptyTablesTemplate: TemplateRef<any>;
192
+ tableCellTemplate: TemplateRef<any>;
193
+ private readonly pivotTransformer;
194
+ private readonly pivotTableConverter;
195
+ readonly stickyColumnWidth = 150;
196
+ readonly stickyColumnHeight = 40;
197
+ private dataSubject$;
198
+ private currentTables;
199
+ pivotData$: Observable<LmrPivotData>;
200
+ pivotTables$: Observable<LmrPivotTable[]>;
201
+ pivotStates$: BehaviorSubject<LmrPivotTableState[]>;
202
+ ngOnInit(): void;
203
+ private onPivotDataChange;
204
+ private onPivotTablesChange;
205
+ private handleData;
206
+ ngOnChanges(changes: SimpleChanges): void;
207
+ private resetState;
208
+ onCellClick(cell: LmrPivotTableCell, row: LmrPivotTableCell[], tableIndex: number, rowIndex: number, columnIndex: number): void;
209
+ private setState;
210
+ static ɵfac: i0.ɵɵFactoryDeclaration<LmrPivotTableComponent, never>;
211
+ static ɵcmp: i0.ɵɵComponentDeclaration<LmrPivotTableComponent, "lmr-pivot-table", never, { "collections": { "alias": "collections"; "required": false; }; "data": { "alias": "data"; "required": false; }; "linkTypes": { "alias": "linkTypes"; "required": false; }; "query": { "alias": "query"; "required": false; }; "constraintData": { "alias": "constraintData"; "required": false; }; "config": { "alias": "config"; "required": false; }; "transform": { "alias": "transform"; "required": false; }; "emptyTablesTemplateInput": { "alias": "emptyTablesTemplateInput"; "required": false; }; "tableCellTemplateInput": { "alias": "tableCellTemplateInput"; "required": false; }; "initiallyCollapsed": { "alias": "initiallyCollapsed"; "required": false; }; }, { "cellClick": "cellClick"; "pivotDataChange": "pivotDataChange"; "pivotTablesChange": "pivotTablesChange"; }, ["emptyTablesTemplate", "tableCellTemplate"], never, false, never>;
212
+ }
213
+
214
+ interface LmrSimplePivotConfig {
215
+ rowAttributes: LmrSimplePivotRowAttribute[];
216
+ columnAttributes: LmrSimplePivotColumnAttribute[];
217
+ valueAttributes: LmrSimplePivotValueAttribute[];
218
+ }
219
+ type LmrSimplePivotRowAttribute = Omit<LmrPivotRowAttribute, 'resourceType' | 'resourceId' | 'resourceIndex'>;
220
+ type LmrSimplePivotColumnAttribute = Omit<LmrPivotColumnAttribute, 'resourceType' | 'resourceId' | 'resourceIndex'>;
221
+ type LmrSimplePivotValueAttribute = Omit<LmrPivotValueAttribute, 'resourceType' | 'resourceId' | 'resourceIndex'>;
222
+
223
+ declare class LmrSimplePivotTableComponent implements OnChanges {
224
+ rows: Record<string, any>[];
225
+ attributes: Attribute[];
226
+ color: string;
227
+ config: LmrSimplePivotConfig;
228
+ transform: LmrPivotTransform;
229
+ locale: LanguageTag;
230
+ initiallyCollapsed: boolean;
231
+ cellClick: EventEmitter<{
232
+ cell: LmrPivotTableCell;
233
+ tableIndex: number;
234
+ rowIndex: number;
235
+ columnIndex: number;
236
+ }>;
237
+ pivotDataChange: EventEmitter<LmrPivotData>;
238
+ pivotTablesChange: EventEmitter<LmrPivotTable[]>;
239
+ emptyTablesTemplate: TemplateRef<any>;
240
+ tableCellTemplate: TemplateRef<any>;
241
+ readonly collectionId: string;
242
+ readonly query: Query;
243
+ collection: Collection;
244
+ pivotConfig: LmrPivotConfig;
245
+ data: DocumentsAndLinksData;
246
+ constraintData: ConstraintData;
247
+ ngOnChanges(changes: SimpleChanges): void;
248
+ private createCollection;
249
+ private createConfig;
250
+ private createRows;
251
+ static ɵfac: i0.ɵɵFactoryDeclaration<LmrSimplePivotTableComponent, never>;
252
+ static ɵcmp: i0.ɵɵComponentDeclaration<LmrSimplePivotTableComponent, "lmr-simple-pivot-table", never, { "rows": { "alias": "rows"; "required": false; }; "attributes": { "alias": "attributes"; "required": false; }; "color": { "alias": "color"; "required": false; }; "config": { "alias": "config"; "required": false; }; "transform": { "alias": "transform"; "required": false; }; "locale": { "alias": "locale"; "required": false; }; "initiallyCollapsed": { "alias": "initiallyCollapsed"; "required": false; }; }, { "cellClick": "cellClick"; "pivotDataChange": "pivotDataChange"; "pivotTablesChange": "pivotTablesChange"; }, ["emptyTablesTemplate", "tableCellTemplate"], never, false, never>;
253
+ }
254
+
255
+ declare class PivotDataEmptyPipe implements PipeTransform {
256
+ transform(value: LmrPivotData): boolean;
257
+ static ɵfac: i0.ɵɵFactoryDeclaration<PivotDataEmptyPipe, never>;
258
+ static ɵpipe: i0.ɵɵPipeDeclaration<PivotDataEmptyPipe, "pivotDataEmpty", false>;
259
+ }
260
+
261
+ declare class CellHasValuePipe implements PipeTransform {
262
+ transform(cell: LmrPivotTableCell): boolean;
263
+ static ɵfac: i0.ɵɵFactoryDeclaration<CellHasValuePipe, never>;
264
+ static ɵpipe: i0.ɵɵPipeDeclaration<CellHasValuePipe, "cellHasValue", false>;
265
+ }
266
+
267
+ declare class IsCellExpandablePipe implements PipeTransform {
268
+ transform(cell: LmrPivotTableCell): boolean;
269
+ static ɵfac: i0.ɵɵFactoryDeclaration<IsCellExpandablePipe, never>;
270
+ static ɵpipe: i0.ɵɵPipeDeclaration<IsCellExpandablePipe, "isCellExpandable", false>;
271
+ }
272
+
273
+ declare class IsCellExpandedPipe implements PipeTransform {
274
+ transform(cell: LmrPivotTableCell, columnIndex: number, state: LmrPivotTableState): boolean;
275
+ static ɵfac: i0.ɵɵFactoryDeclaration<IsCellExpandedPipe, never>;
276
+ static ɵpipe: i0.ɵɵPipeDeclaration<IsCellExpandedPipe, "isCellExpanded", false>;
277
+ }
278
+
279
+ declare class IsCellRowsExpandablePipe implements PipeTransform {
280
+ transform(cell: LmrPivotTableCell): boolean;
281
+ static ɵfac: i0.ɵɵFactoryDeclaration<IsCellRowsExpandablePipe, never>;
282
+ static ɵpipe: i0.ɵɵPipeDeclaration<IsCellRowsExpandablePipe, "isCellRowsExpandable", false>;
283
+ }
284
+
285
+ declare class FilterVisibleCellsPipe implements PipeTransform {
286
+ transform(table: LmrPivotTable, state: LmrPivotTableState): LmrPivotTableCell[][];
287
+ static ɵfac: i0.ɵɵFactoryDeclaration<FilterVisibleCellsPipe, never>;
288
+ static ɵpipe: i0.ɵɵPipeDeclaration<FilterVisibleCellsPipe, "filterVisibleCells", false>;
289
+ }
290
+
291
+ declare class ContrastColorPipe implements PipeTransform {
292
+ transform(color: string, returnCodes?: {
293
+ dark: string;
294
+ light: string;
295
+ }, opacity?: number): string;
296
+ static ɵfac: i0.ɵɵFactoryDeclaration<ContrastColorPipe, never>;
297
+ static ɵpipe: i0.ɵɵPipeDeclaration<ContrastColorPipe, "contrastColor", false>;
298
+ static ɵprov: i0.ɵɵInjectableDeclaration<ContrastColorPipe>;
299
+ }
300
+
301
+ declare class LmrEmptyTablesTemplateDirective {
302
+ template: TemplateRef<any>;
303
+ constructor(template: TemplateRef<any>);
304
+ static ɵfac: i0.ɵɵFactoryDeclaration<LmrEmptyTablesTemplateDirective, never>;
305
+ static ɵdir: i0.ɵɵDirectiveDeclaration<LmrEmptyTablesTemplateDirective, "[lmr-empty-tables-tmp]", never, {}, {}, never, never, false, never>;
306
+ }
307
+ declare class LmrTableCellTemplateDirective {
308
+ template: TemplateRef<any>;
309
+ constructor(template: TemplateRef<any>);
310
+ static ɵfac: i0.ɵɵFactoryDeclaration<LmrTableCellTemplateDirective, never>;
311
+ static ɵdir: i0.ɵɵDirectiveDeclaration<LmrTableCellTemplateDirective, "[lmr-table-cell-tmp]", never, {}, {}, never, never, false, never>;
312
+ }
313
+
314
+ declare class LmrPivotTableModule {
315
+ static ɵfac: i0.ɵɵFactoryDeclaration<LmrPivotTableModule, never>;
316
+ static ɵmod: i0.ɵɵNgModuleDeclaration<LmrPivotTableModule, [typeof LmrPivotTableComponent, typeof LmrSimplePivotTableComponent, typeof PivotDataEmptyPipe, typeof CellHasValuePipe, typeof IsCellExpandablePipe, typeof IsCellExpandedPipe, typeof IsCellRowsExpandablePipe, typeof FilterVisibleCellsPipe, typeof ContrastColorPipe, typeof LmrEmptyTablesTemplateDirective, typeof LmrTableCellTemplateDirective], [typeof i11.CommonModule, typeof i12.ScrollingModule], [typeof LmrPivotTableComponent, typeof LmrSimplePivotTableComponent, typeof LmrEmptyTablesTemplateDirective, typeof LmrTableCellTemplateDirective]>;
317
+ static ɵinj: i0.ɵɵInjectorDeclaration<LmrPivotTableModule>;
318
+ }
319
+
320
+ declare function pivotAttributesAreSame(a1: LmrPivotAttribute, a2: LmrPivotAttribute): boolean;
321
+ declare function isPivotConfigChanged(viewConfig: LmrPivotConfig, currentConfig: LmrPivotConfig): boolean;
322
+ declare function createDefaultPivotConfig(query: Query): LmrPivotConfig;
323
+ declare function createDefaultPivotStemConfig(stem?: QueryStem): LmrPivotStemConfig;
324
+ declare function pivotConfigIsEmpty(config: LmrPivotConfig): boolean;
325
+ declare function pivotStemConfigIsEmpty(config: LmrPivotStemConfig): boolean;
326
+ declare function contrastColor(color: string, returnCodes?: {
327
+ dark: string;
328
+ light: string;
329
+ }, opacity?: number): string;
330
+
331
+ export { LmrEmptyTablesTemplateDirective, LmrPivotConfigVersion, LmrPivotPosition, LmrPivotTableComponent, LmrPivotTableModule, LmrPivotValueType, LmrSimplePivotTableComponent, LmrTableCellTemplateDirective, contrastColor, createDefaultPivotConfig, createDefaultPivotStemConfig, isPivotConfigChanged, pivotAttributesAreSame, pivotConfigIsEmpty, pivotStemConfigIsEmpty };
332
+ export type { LmrPivotAttribute, LmrPivotColumnAttribute, LmrPivotConfig, LmrPivotData, LmrPivotDataHeader, LmrPivotDataHeaderExpression, LmrPivotDataHeaderOperand, LmrPivotDimensionConfig, LmrPivotExpression, LmrPivotExpressionOperation, LmrPivotHeaderAttribute, LmrPivotHeaderOperand, LmrPivotOperand, LmrPivotRowAttribute, LmrPivotRowColumnAttribute, LmrPivotSort, LmrPivotSortList, LmrPivotSortValue, LmrPivotStemConfig, LmrPivotStemData, LmrPivotTable, LmrPivotTableCell, LmrPivotTransform, LmrPivotValueAttribute, LmrPivotValueOperand, LmrSimplePivotColumnAttribute, LmrSimplePivotConfig, LmrSimplePivotRowAttribute, LmrSimplePivotValueAttribute };
Binary file
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@lumeer/pivot",
3
- "version": "0.0.13",
3
+ "version": "0.2.0",
4
4
  "peerDependencies": {
5
- "@angular/cdk": "^17.3.10",
6
- "@angular/common": "^17.3.12",
7
- "@angular/core": "^17.3.12",
5
+ "@angular/cdk": "^20.0.0",
6
+ "@angular/common": "^20.0.0",
7
+ "@angular/core": "^20.0.0",
8
8
  "@lumeer/data-filters": "^0.8.6",
9
9
  "@lumeer/utils": "^0.1.3"
10
10
  },
@@ -20,8 +20,6 @@
20
20
  },
21
21
  ".": {
22
22
  "types": "./index.d.ts",
23
- "esm2022": "./esm2022/lumeer-pivot.mjs",
24
- "esm": "./esm2022/lumeer-pivot.mjs",
25
23
  "default": "./fesm2022/lumeer-pivot.mjs"
26
24
  }
27
25
  }
@@ -1,27 +0,0 @@
1
- import { Directive } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class LmrEmptyTablesTemplateDirective {
4
- template;
5
- constructor(template) {
6
- this.template = template;
7
- }
8
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LmrEmptyTablesTemplateDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
9
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: LmrEmptyTablesTemplateDirective, selector: "[lmr-empty-tables-tmp]", ngImport: i0 });
10
- }
11
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LmrEmptyTablesTemplateDirective, decorators: [{
12
- type: Directive,
13
- args: [{ selector: '[lmr-empty-tables-tmp]' }]
14
- }], ctorParameters: () => [{ type: i0.TemplateRef }] });
15
- export class LmrTableCellTemplateDirective {
16
- template;
17
- constructor(template) {
18
- this.template = template;
19
- }
20
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LmrTableCellTemplateDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
21
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: LmrTableCellTemplateDirective, selector: "[lmr-table-cell-tmp]", ngImport: i0 });
22
- }
23
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LmrTableCellTemplateDirective, decorators: [{
24
- type: Directive,
25
- args: [{ selector: '[lmr-table-cell-tmp]' }]
26
- }], ctorParameters: () => [{ type: i0.TemplateRef }] });
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG1yLXRlbXBsYXRlcy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9sbXItcGl2b3QtdGFibGUvc3JjL2xpYi9kaXJlY3RpdmVzL2xtci10ZW1wbGF0ZXMuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQWMsTUFBTSxlQUFlLENBQUM7O0FBR3JELE1BQU0sT0FBTywrQkFBK0I7SUFDdkI7SUFBbkIsWUFBbUIsUUFBMEI7UUFBMUIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7SUFBSSxDQUFDO3dHQUR2QywrQkFBK0I7NEZBQS9CLCtCQUErQjs7NEZBQS9CLCtCQUErQjtrQkFEM0MsU0FBUzttQkFBQyxFQUFFLFFBQVEsRUFBRSx3QkFBd0IsRUFBRTs7QUFNakQsTUFBTSxPQUFPLDZCQUE2QjtJQUNyQjtJQUFuQixZQUFtQixRQUEwQjtRQUExQixhQUFRLEdBQVIsUUFBUSxDQUFrQjtJQUFJLENBQUM7d0dBRHZDLDZCQUE2Qjs0RkFBN0IsNkJBQTZCOzs0RkFBN0IsNkJBQTZCO2tCQUR6QyxTQUFTO21CQUFDLEVBQUUsUUFBUSxFQUFFLHNCQUFzQixFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaXJlY3RpdmUsIFRlbXBsYXRlUmVmfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2xtci1lbXB0eS10YWJsZXMtdG1wXScgfSlcbmV4cG9ydCBjbGFzcyBMbXJFbXB0eVRhYmxlc1RlbXBsYXRlRGlyZWN0aXZlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+KSB7IH1cbn1cblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2xtci10YWJsZS1jZWxsLXRtcF0nIH0pXG5leHBvcnQgY2xhc3MgTG1yVGFibGVDZWxsVGVtcGxhdGVEaXJlY3RpdmUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHsgfVxufVxuIl19
@@ -1,147 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, Input, Output, TemplateRef } from '@angular/core';
2
- import { PivotDataConverter } from './util/pivot-data-converter';
3
- import { asyncScheduler, BehaviorSubject, filter, map, tap, throttleTime } from 'rxjs';
4
- import { PivotTableConverter } from './util/pivot-table-converter';
5
- import { LmrEmptyTablesTemplateDirective, LmrTableCellTemplateDirective } from './directives/lmr-templates.directive';
6
- import { collapseAllCells, isCellExpandable, toggleExpanded } from './util/lmr-pivot-state';
7
- import { isPivotConfigChanged } from './util/pivot-util';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@angular/common";
10
- import * as i2 from "./pipes/pivot-data-empty.pipe";
11
- import * as i3 from "./pipes/cell-has-value.pipe";
12
- import * as i4 from "./pipes/is-cell-expandable.pipe";
13
- import * as i5 from "./pipes/is-cell-expanded.pipe";
14
- import * as i6 from "./pipes/is-cell-rows-expandable.pipe";
15
- import * as i7 from "./pipes/filter-visible-cells.pipe";
16
- import * as i8 from "./pipes/contrast-color.pipe";
17
- export class LmrPivotTableComponent {
18
- collections;
19
- data;
20
- linkTypes;
21
- query;
22
- constraintData;
23
- config;
24
- transform;
25
- emptyTablesTemplateInput;
26
- tableCellTemplateInput;
27
- initiallyCollapsed;
28
- cellClick = new EventEmitter();
29
- pivotDataChange = new EventEmitter();
30
- pivotTablesChange = new EventEmitter();
31
- emptyTablesTemplate;
32
- tableCellTemplate;
33
- pivotTransformer = new PivotDataConverter();
34
- pivotTableConverter = new PivotTableConverter();
35
- stickyColumnWidth = 150;
36
- stickyColumnHeight = 40;
37
- dataSubject$ = new BehaviorSubject(null);
38
- currentTables;
39
- pivotData$;
40
- pivotTables$;
41
- pivotStates$ = new BehaviorSubject([]);
42
- ngOnInit() {
43
- const observable = this.dataSubject$.pipe(filter(data => !!data));
44
- this.pivotData$ = observable.pipe(throttleTime(200, asyncScheduler, { trailing: true, leading: true }), map(data => this.handleData(data)), tap(data => this.onPivotDataChange(data)));
45
- this.pivotTables$ = this.pivotData$.pipe(map(data => this.pivotTableConverter.createTables(data, this.transform)), tap(tables => this.onPivotTablesChange(tables)));
46
- }
47
- onPivotDataChange(data) {
48
- this.pivotDataChange.emit(data);
49
- }
50
- onPivotTablesChange(tables) {
51
- if (this.initiallyCollapsed && tablesAreVeryDifferent(this.currentTables, tables)) {
52
- this.pivotStates$.next(tables.map(table => collapseAllCells(table)));
53
- }
54
- this.currentTables = tables;
55
- this.pivotTablesChange.emit(tables);
56
- }
57
- handleData(data) {
58
- return this.pivotTransformer.createData(data.config, data.transform, data.collections, data.linkTypes, data.data, data.query, data.constraintData);
59
- }
60
- ngOnChanges(changes) {
61
- if (shouldResetState(changes)) {
62
- this.resetState();
63
- }
64
- this.dataSubject$.next({
65
- config: this.config,
66
- transform: this.transform,
67
- collections: this.collections,
68
- linkTypes: this.linkTypes,
69
- data: this.data,
70
- query: this.query,
71
- constraintData: this.constraintData,
72
- });
73
- }
74
- resetState() {
75
- // this.pivotStates$.next([]);
76
- }
77
- onCellClick(cell, row, tableIndex, rowIndex, columnIndex) {
78
- if (isCellExpandable(cell)) {
79
- const oldState = this.pivotStates$.value[tableIndex];
80
- const newState = toggleExpanded(cell, columnIndex, oldState);
81
- this.setState(tableIndex, newState);
82
- }
83
- else if (cell?.isHeader || cell?.isValue) {
84
- const headerCell = cell.isHeader ? cell : row.find(c => c.isHeader);
85
- this.cellClick.emit({ cell, tableIndex, rowIndex: headerCell?.originalRowIndex || rowIndex, columnIndex });
86
- }
87
- }
88
- setState(index, state) {
89
- const statesCopy = [...(this.pivotStates$.value || [])];
90
- statesCopy.splice(index, 1, state);
91
- this.pivotStates$.next(statesCopy);
92
- }
93
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LmrPivotTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
94
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: LmrPivotTableComponent, selector: "lmr-pivot-table", inputs: { collections: "collections", data: "data", linkTypes: "linkTypes", query: "query", constraintData: "constraintData", config: "config", transform: "transform", emptyTablesTemplateInput: "emptyTablesTemplateInput", tableCellTemplateInput: "tableCellTemplateInput", initiallyCollapsed: "initiallyCollapsed" }, outputs: { cellClick: "cellClick", pivotDataChange: "pivotDataChange", pivotTablesChange: "pivotTablesChange" }, queries: [{ propertyName: "emptyTablesTemplate", first: true, predicate: LmrEmptyTablesTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "tableCellTemplate", first: true, predicate: LmrTableCellTemplateDirective, descendants: true, read: TemplateRef }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"{pivotTables: pivotTables$ | async, pivotStates: pivotStates$ | async, pivotData: pivotData$ | async} as data\">\n <ng-container *ngIf=\"data.pivotTables?.length && !(data.pivotData | pivotDataEmpty)\">\n <table *ngFor=\"let pivotTable of data.pivotTables; let first; let tableIndex = index\"\n class=\"table table-without-padding table-borderless table-md\"\n [class.mt-4]=\"!first\">\n <tr *ngFor=\"let rowCells of pivotTable | filterVisibleCells:data.pivotStates[tableIndex]; let rowIndex = index\">\n\n <ng-container *ngFor=\"let cell of rowCells; let cellIndex = index\">\n <td *ngIf=\"cell && {hasValue: cell | cellHasValue} as cellData\"\n class=\"cell position-relative {{cell.constraint ? (cell.constraint.type | lowercase) : ''}} text-truncate\"\n [class.expandable]=\"cell | isCellExpandable\"\n [class.expandable-rows]=\"cell | isCellRowsExpandable\"\n [class.expanded]=\"cell | isCellExpanded:cellIndex:data.pivotStates[tableIndex]\"\n [class.sticky-start]=\"cell.stickyStart\"\n [class.sticky-top]=\"cell.stickyTop\"\n [rowSpan]=\"cell.rowSpan\"\n [colSpan]=\"cell.colSpan\"\n [style.top.px]=\"cell.stickyTop ? (rowIndex * stickyColumnHeight) : undefined\"\n [style.left.px]=\"cell.stickyStart ? (cellIndex * stickyColumnWidth) : undefined\"\n [style.width.px]=\"cell.stickyStart ? (cell.colSpan * stickyColumnWidth) : undefined\"\n [style.max-width.px]=\"cell.stickyStart ? (cell.colSpan * stickyColumnWidth) : 300\"\n [style.min-width.px]=\"cell.stickyStart ? (cell.colSpan * stickyColumnWidth) : undefined\"\n [ngClass]=\"cell.cssClass\"\n [style.background]=\"cell.background\"\n [style.color]=\"cell.background && (cell.background | contrastColor)\"\n (click)=\"onCellClick(cell, rowCells, tableIndex, rowIndex, cellIndex)\">\n <ng-container *ngIf=\"cell.summary\">\n <ng-container *ngIf=\"cellData.hasValue\">\n <div class=\"d-flex align-items-center h-100\">\n <span class=\"summary me-2\">{{cell.summary}}</span>\n <ng-template #defaultTableCellTemplate>\n <span class=\"flex-grow-1 h-100 text-truncate d-inline-block\">\n {{ cell.value }}\n </span>\n </ng-template>\n\n <ng-template\n [ngTemplateOutlet]=\"tableCellTemplate || tableCellTemplateInput || defaultTableCellTemplate\"\n [ngTemplateOutletContext]=\"{ value: cell.value, cell: cell }\">\n </ng-template>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!cellData.hasValue\">\n <span class=\"d-block\" style=\"overflow: hidden; white-space: normal\">{{cell.summary}}</span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!cell.summary\">\n <ng-container *ngIf=\"cellData.hasValue\">\n <ng-template #defaultTableCellTemplate>\n <span class=\"d-block\" style=\"overflow: hidden; white-space: normal; cursor: pointer\">\n {{ cell.value }}\n </span>\n </ng-template>\n\n <ng-template\n [ngTemplateOutlet]=\"tableCellTemplate || tableCellTemplateInput || defaultTableCellTemplate\"\n [ngTemplateOutletContext]=\"{ value: cell.value, cell: cell }\">\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!cellData.hasValue\">&nbsp;</ng-container>\n </ng-container>\n </td>\n </ng-container>\n </tr>\n </table>\n </ng-container>\n\n <ng-container *ngIf=\"!data.pivotTables?.length || (data.pivotData | pivotDataEmpty)\">\n <ng-template #defaultEmptyTablesTemplate>\n <div>&nbsp;</div>\n </ng-template>\n\n <ng-template\n [ngTemplateOutlet]=\"emptyTablesTemplate || emptyTablesTemplateInput || defaultEmptyTablesTemplate\"\n [ngTemplateOutletContext]=\"{ }\">\n </ng-template>\n </ng-container>\n</ng-container>\n", styles: [".table{border-spacing:0;border-collapse:separate}.pivot-data-cell,.pivot-data-group-cell,.pivot-column-header-cell,.pivot-column-group-header-cell{text-align:right}.pivot-column-header-cell,.pivot-row-attribute-header-cell,.pivot-row-header-cell,.pivot-data-group-cell,.pivot-row-group-header-cell,.pivot-column-group-header-cell{font-weight:700;border:1px #f8f9fa solid}.pivot-row-header-cell.sticky-start,.pivot-row-group-header-cell.sticky-start,.pivot-empty-cell.sticky-start{position:sticky!important;width:150px;min-width:150px;max-width:150px!important;z-index:9}.pivot-row-header-cell.expandable,.pivot-row-group-header-cell.expandable{position:absolute;cursor:pointer;padding-right:15px}.pivot-row-header-cell.expandable:after,.pivot-row-group-header-cell.expandable:after{content:\"\";position:absolute;top:50%;right:5px;width:0;height:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #253746;transform:translateY(-50%)}.pivot-row-header-cell.expandable.expanded.expandable-rows:after,.pivot-row-header-cell.expandable.expanded:after,.pivot-row-group-header-cell.expandable.expanded.expandable-rows:after,.pivot-row-group-header-cell.expandable.expanded:after{border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #253746;border-bottom:0}.pivot-column-header-cell.sticky-top,.pivot-row-attribute-header-cell.sticky-top,.pivot-column-group-header-cell.sticky-top,.pivot-empty-cell.sticky-top{position:sticky!important;z-index:10}.pivot-row-attribute-header-cell.sticky-top,.pivot-row-attribute-header-cell.sticky-start{position:sticky!important;z-index:11}.pivot-empty-cell{background:#fff;border:1px white solid}.pivot-empty-cell.sticky-top{z-index:11}.cell.color{padding:0!important;height:30px}.cell.color .summary{padding-left:.5rem}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.LowerCasePipe, name: "lowercase" }, { kind: "pipe", type: i2.PivotDataEmptyPipe, name: "pivotDataEmpty" }, { kind: "pipe", type: i3.CellHasValuePipe, name: "cellHasValue" }, { kind: "pipe", type: i4.IsCellExpandablePipe, name: "isCellExpandable" }, { kind: "pipe", type: i5.IsCellExpandedPipe, name: "isCellExpanded" }, { kind: "pipe", type: i6.IsCellRowsExpandablePipe, name: "isCellRowsExpandable" }, { kind: "pipe", type: i7.FilterVisibleCellsPipe, name: "filterVisibleCells" }, { kind: "pipe", type: i8.ContrastColorPipe, name: "contrastColor" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
95
- }
96
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LmrPivotTableComponent, decorators: [{
97
- type: Component,
98
- args: [{ selector: 'lmr-pivot-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"{pivotTables: pivotTables$ | async, pivotStates: pivotStates$ | async, pivotData: pivotData$ | async} as data\">\n <ng-container *ngIf=\"data.pivotTables?.length && !(data.pivotData | pivotDataEmpty)\">\n <table *ngFor=\"let pivotTable of data.pivotTables; let first; let tableIndex = index\"\n class=\"table table-without-padding table-borderless table-md\"\n [class.mt-4]=\"!first\">\n <tr *ngFor=\"let rowCells of pivotTable | filterVisibleCells:data.pivotStates[tableIndex]; let rowIndex = index\">\n\n <ng-container *ngFor=\"let cell of rowCells; let cellIndex = index\">\n <td *ngIf=\"cell && {hasValue: cell | cellHasValue} as cellData\"\n class=\"cell position-relative {{cell.constraint ? (cell.constraint.type | lowercase) : ''}} text-truncate\"\n [class.expandable]=\"cell | isCellExpandable\"\n [class.expandable-rows]=\"cell | isCellRowsExpandable\"\n [class.expanded]=\"cell | isCellExpanded:cellIndex:data.pivotStates[tableIndex]\"\n [class.sticky-start]=\"cell.stickyStart\"\n [class.sticky-top]=\"cell.stickyTop\"\n [rowSpan]=\"cell.rowSpan\"\n [colSpan]=\"cell.colSpan\"\n [style.top.px]=\"cell.stickyTop ? (rowIndex * stickyColumnHeight) : undefined\"\n [style.left.px]=\"cell.stickyStart ? (cellIndex * stickyColumnWidth) : undefined\"\n [style.width.px]=\"cell.stickyStart ? (cell.colSpan * stickyColumnWidth) : undefined\"\n [style.max-width.px]=\"cell.stickyStart ? (cell.colSpan * stickyColumnWidth) : 300\"\n [style.min-width.px]=\"cell.stickyStart ? (cell.colSpan * stickyColumnWidth) : undefined\"\n [ngClass]=\"cell.cssClass\"\n [style.background]=\"cell.background\"\n [style.color]=\"cell.background && (cell.background | contrastColor)\"\n (click)=\"onCellClick(cell, rowCells, tableIndex, rowIndex, cellIndex)\">\n <ng-container *ngIf=\"cell.summary\">\n <ng-container *ngIf=\"cellData.hasValue\">\n <div class=\"d-flex align-items-center h-100\">\n <span class=\"summary me-2\">{{cell.summary}}</span>\n <ng-template #defaultTableCellTemplate>\n <span class=\"flex-grow-1 h-100 text-truncate d-inline-block\">\n {{ cell.value }}\n </span>\n </ng-template>\n\n <ng-template\n [ngTemplateOutlet]=\"tableCellTemplate || tableCellTemplateInput || defaultTableCellTemplate\"\n [ngTemplateOutletContext]=\"{ value: cell.value, cell: cell }\">\n </ng-template>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!cellData.hasValue\">\n <span class=\"d-block\" style=\"overflow: hidden; white-space: normal\">{{cell.summary}}</span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!cell.summary\">\n <ng-container *ngIf=\"cellData.hasValue\">\n <ng-template #defaultTableCellTemplate>\n <span class=\"d-block\" style=\"overflow: hidden; white-space: normal; cursor: pointer\">\n {{ cell.value }}\n </span>\n </ng-template>\n\n <ng-template\n [ngTemplateOutlet]=\"tableCellTemplate || tableCellTemplateInput || defaultTableCellTemplate\"\n [ngTemplateOutletContext]=\"{ value: cell.value, cell: cell }\">\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!cellData.hasValue\">&nbsp;</ng-container>\n </ng-container>\n </td>\n </ng-container>\n </tr>\n </table>\n </ng-container>\n\n <ng-container *ngIf=\"!data.pivotTables?.length || (data.pivotData | pivotDataEmpty)\">\n <ng-template #defaultEmptyTablesTemplate>\n <div>&nbsp;</div>\n </ng-template>\n\n <ng-template\n [ngTemplateOutlet]=\"emptyTablesTemplate || emptyTablesTemplateInput || defaultEmptyTablesTemplate\"\n [ngTemplateOutletContext]=\"{ }\">\n </ng-template>\n </ng-container>\n</ng-container>\n", styles: [".table{border-spacing:0;border-collapse:separate}.pivot-data-cell,.pivot-data-group-cell,.pivot-column-header-cell,.pivot-column-group-header-cell{text-align:right}.pivot-column-header-cell,.pivot-row-attribute-header-cell,.pivot-row-header-cell,.pivot-data-group-cell,.pivot-row-group-header-cell,.pivot-column-group-header-cell{font-weight:700;border:1px #f8f9fa solid}.pivot-row-header-cell.sticky-start,.pivot-row-group-header-cell.sticky-start,.pivot-empty-cell.sticky-start{position:sticky!important;width:150px;min-width:150px;max-width:150px!important;z-index:9}.pivot-row-header-cell.expandable,.pivot-row-group-header-cell.expandable{position:absolute;cursor:pointer;padding-right:15px}.pivot-row-header-cell.expandable:after,.pivot-row-group-header-cell.expandable:after{content:\"\";position:absolute;top:50%;right:5px;width:0;height:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #253746;transform:translateY(-50%)}.pivot-row-header-cell.expandable.expanded.expandable-rows:after,.pivot-row-header-cell.expandable.expanded:after,.pivot-row-group-header-cell.expandable.expanded.expandable-rows:after,.pivot-row-group-header-cell.expandable.expanded:after{border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #253746;border-bottom:0}.pivot-column-header-cell.sticky-top,.pivot-row-attribute-header-cell.sticky-top,.pivot-column-group-header-cell.sticky-top,.pivot-empty-cell.sticky-top{position:sticky!important;z-index:10}.pivot-row-attribute-header-cell.sticky-top,.pivot-row-attribute-header-cell.sticky-start{position:sticky!important;z-index:11}.pivot-empty-cell{background:#fff;border:1px white solid}.pivot-empty-cell.sticky-top{z-index:11}.cell.color{padding:0!important;height:30px}.cell.color .summary{padding-left:.5rem}\n"] }]
99
- }], propDecorators: { collections: [{
100
- type: Input
101
- }], data: [{
102
- type: Input
103
- }], linkTypes: [{
104
- type: Input
105
- }], query: [{
106
- type: Input
107
- }], constraintData: [{
108
- type: Input
109
- }], config: [{
110
- type: Input
111
- }], transform: [{
112
- type: Input
113
- }], emptyTablesTemplateInput: [{
114
- type: Input
115
- }], tableCellTemplateInput: [{
116
- type: Input
117
- }], initiallyCollapsed: [{
118
- type: Input
119
- }], cellClick: [{
120
- type: Output
121
- }], pivotDataChange: [{
122
- type: Output
123
- }], pivotTablesChange: [{
124
- type: Output
125
- }], emptyTablesTemplate: [{
126
- type: ContentChild,
127
- args: [LmrEmptyTablesTemplateDirective, { read: TemplateRef }]
128
- }], tableCellTemplate: [{
129
- type: ContentChild,
130
- args: [LmrTableCellTemplateDirective, { read: TemplateRef }]
131
- }] } });
132
- function shouldResetState(changes) {
133
- if (changes['config']) {
134
- const previousValue = changes['config'].previousValue;
135
- const currentValue = changes['config'].currentValue;
136
- return isPivotConfigChanged(previousValue, currentValue);
137
- }
138
- return false;
139
- }
140
- function tablesAreVeryDifferent(t1, t2) {
141
- if ((t1 || []).length !== (t2 || []).length) {
142
- return true;
143
- }
144
- // row numbers are different
145
- return (t1 || []).some((t, index) => t.cells?.length !== t2[index].cells?.length);
146
- }
147
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG1yLXBpdm90LXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2xtci1waXZvdC10YWJsZS9zcmMvbGliL2xtci1waXZvdC10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9sbXItcGl2b3QtdGFibGUvc3JjL2xpYi9sbXItcGl2b3QtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFpQixXQUFXLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFHM0osT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFFL0QsT0FBTyxFQUFDLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBYyxHQUFHLEVBQUUsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRWpHLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBQywrQkFBK0IsRUFBRSw2QkFBNkIsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQ3BILE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBc0IsY0FBYyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDOUcsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7QUFrQnZELE1BQU0sT0FBTyxzQkFBc0I7SUFHMUIsV0FBVyxDQUFlO0lBRzFCLElBQUksQ0FBd0I7SUFHNUIsU0FBUyxDQUFhO0lBR3RCLEtBQUssQ0FBUTtJQUdiLGNBQWMsQ0FBaUI7SUFHL0IsTUFBTSxDQUFpQjtJQUd2QixTQUFTLENBQW9CO0lBRzdCLHdCQUF3QixDQUFtQjtJQUczQyxzQkFBc0IsQ0FBbUI7SUFH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RUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFDOztBQTJGbEUsU0FBUyxnQkFBZ0IsQ0FBQyxPQUFzQjtJQUM5QyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUErQixDQUFBO1FBQ3ZFLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUE4QixDQUFBO1FBQ3JFLE9BQU8sb0JBQW9CLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFBO0lBQzFELENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLEVBQW1CLEVBQUUsRUFBbUI7SUFDdEUsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUMsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBQ0QsNEJBQTRCO0lBQzVCLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNwRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TG1yUGl2b3RDb25maWcsIExtclBpdm90VHJhbnNmb3JtfSBmcm9tICcuL3V0aWwvbG1yLXBpdm90LWNvbmZpZyc7XG5pbXBvcnQge0NvbGxlY3Rpb24sIENvbnN0cmFpbnREYXRhLCBEb2N1bWVudHNBbmRMaW5rc0RhdGEsIExpbmtUeXBlLCBRdWVyeX0gZnJvbSAnQGx1bWVlci9kYXRhLWZpbHRlcnMnO1xuaW1wb3J0IHtQaXZvdERhdGFDb252ZXJ0ZXJ9IGZyb20gJy4vdXRpbC9waXZvdC1kYXRhLWNvbnZlcnRlcic7XG5pbXBvcnQge0xtclBpdm90RGF0YX0gZnJvbSAnLi91dGlsL2xtci1waXZvdC1kYXRhJztcbmltcG9ydCB7YXN5bmNTY2hlZHVsZXIsIEJlaGF2aW9yU3ViamVjdCwgZmlsdGVyLCBtYXAsIE9ic2VydmFibGUsIHRhcCwgdGhyb3R0bGVUaW1lfSBmcm9tICdyeGpzJztcbmltcG9ydCB7TG1yUGl2b3RUYWJsZSwgTG1yUGl2b3RUYWJsZUNlbGx9IGZyb20gJy4vdXRpbC9sbXItcGl2b3QtdGFibGUnO1xuaW1wb3J0IHtQaXZvdFRhYmxlQ29udmVydGVyfSBmcm9tICcuL3V0aWwvcGl2b3QtdGFibGUtY29udmVydGVyJztcbmltcG9ydCB7TG1yRW1wdHlUYWJsZXNUZW1wbGF0ZURpcmVjdGl2ZSwgTG1yVGFibGVDZWxsVGVtcGxhdGVEaXJlY3RpdmV9IGZyb20gJy4vZGlyZWN0aXZlcy9sbXItdGVtcGxhdGVzLmRpcmVjdGl2ZSc7XG5pbXBvcnQge2NvbGxhcHNlQWxsQ2VsbHMsIGlzQ2VsbEV4cGFuZGFibGUsIExtclBpdm90VGFibGVTdGF0ZSwgdG9nZ2xlRXhwYW5kZWR9IGZyb20gJy4vdXRpbC9sbXItcGl2b3Qtc3RhdGUnO1xuaW1wb3J0IHtpc1Bpdm90Q29uZmlnQ2hhbmdlZH0gZnJvbSAnLi91dGlsL3Bpdm90LXV0aWwnO1xuXG5pbnRlcmZhY2UgRGF0YSB7XG4gIGNvbGxlY3Rpb25zOiBDb2xsZWN0aW9uW107XG4gIGxpbmtUeXBlczogTGlua1R5cGVbXTtcbiAgZGF0YTogRG9jdW1lbnRzQW5kTGlua3NEYXRhO1xuICBxdWVyeTogUXVlcnk7XG4gIGNvbnN0cmFpbnREYXRhOiBDb25zdHJhaW50RGF0YTtcbiAgY29uZmlnOiBMbXJQaXZvdENvbmZpZztcbiAgdHJhbnNmb3JtOiBMbXJQaXZvdFRyYW5zZm9ybTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbG1yLXBpdm90LXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICdsbXItcGl2b3QtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9sbXItcGl2b3QtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIExtclBpdm90VGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGNvbGxlY3Rpb25zOiBDb2xsZWN0aW9uW107XG5cbiAgQElucHV0KClcbiAgcHVibGljIGRhdGE6IERvY3VtZW50c0FuZExpbmtzRGF0YTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgbGlua1R5cGVzOiBMaW5rVHlwZVtdO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBxdWVyeTogUXVlcnk7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGNvbnN0cmFpbnREYXRhOiBDb25zdHJhaW50RGF0YTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgY29uZmlnOiBMbXJQaXZvdENvbmZpZztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgdHJhbnNmb3JtOiBMbXJQaXZvdFRyYW5zZm9ybTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZW1wdHlUYWJsZXNUZW1wbGF0ZUlucHV0OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB0YWJsZUNlbGxUZW1wbGF0ZUlucHV0OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBpbml0aWFsbHlDb2xsYXBzZWQ6IGJvb2xlYW47XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBjZWxsQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHtjZWxsOiBMbXJQaXZvdFRhYmxlQ2VsbDsgdGFibGVJbmRleDogbnVtYmVyOyByb3dJbmRleDogbnVtYmVyOyBjb2x1bW5JbmRleDogbnVtYmVyIH0+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBwaXZvdERhdGFDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPExtclBpdm90RGF0YT4oKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIHBpdm90VGFibGVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxMbXJQaXZvdFRhYmxlW10+KCk7XG5cbiAgQENvbnRlbnRDaGlsZChMbXJFbXB0eVRhYmxlc1RlbXBsYXRlRGlyZWN0aXZlLCB7cmVhZDogVGVtcGxhdGVSZWZ9KSBlbXB0eVRhYmxlc1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKExtclRhYmxlQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLCB7cmVhZDogVGVtcGxhdGVSZWZ9KSB0YWJsZUNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICBwcml2YXRlIHJlYWRvbmx5IHBpdm90VHJhbnNmb3JtZXIgPSBuZXcgUGl2b3REYXRhQ29udmVydGVyKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGl2b3RUYWJsZUNvbnZlcnRlcjogUGl2b3RUYWJsZUNvbnZlcnRlciA9IG5ldyBQaXZvdFRhYmxlQ29udmVydGVyKCk7XG4gIHB1YmxpYyByZWFkb25seSBzdGlja3lDb2x1bW5XaWR0aCA9IDE1MDtcbiAgcHVibGljIHJlYWRvbmx5IHN0aWNreUNvbHVtbkhlaWdodCA9IDQwO1xuXG4gIHByaXZhdGUgZGF0YVN1YmplY3QkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhPihudWxsKTtcbiAgcHJpdmF0ZSBjdXJyZW50VGFibGVzOiBMbXJQaXZvdFRhYmxlW107XG5cbiAgcHVibGljIHBpdm90RGF0YSQ6IE9ic2VydmFibGU8TG1yUGl2b3REYXRhPjtcbiAgcHVibGljIHBpdm90VGFibGVzJDogT2JzZXJ2YWJsZTxMbXJQaXZvdFRhYmxlW10+O1xuICBwdWJsaWMgcGl2b3RTdGF0ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxMbXJQaXZvdFRhYmxlU3RhdGVbXT4oW10pO1xuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCBvYnNlcnZhYmxlID0gdGhpcy5kYXRhU3ViamVjdCQucGlwZShmaWx0ZXIoZGF0YSA9PiAhIWRhdGEpKTtcblxuICAgIHRoaXMucGl2b3REYXRhJCA9IG9ic2VydmFibGUucGlwZShcbiAgICAgIHRocm90dGxlVGltZSgyMDAsIGFzeW5jU2NoZWR1bGVyLCB7dHJhaWxpbmc6IHRydWUsIGxlYWRpbmc6IHRydWV9KSxcbiAgICAgIG1hcChkYXRhID0+IHRoaXMuaGFuZGxlRGF0YShkYXRhKSksXG4gICAgICB0YXAoZGF0YSA9PiB0aGlzLm9uUGl2b3REYXRhQ2hhbmdlKGRhdGEpKSxcbiAgICApO1xuXG4gICAgdGhpcy5waXZvdFRhYmxlcyQgPSB0aGlzLnBpdm90RGF0YSQucGlwZShcbiAgICAgIG1hcChkYXRhID0+IHRoaXMucGl2b3RUYWJsZUNvbnZlcnRlci5jcmVhdGVUYWJsZXMoZGF0YSwgdGhpcy50cmFuc2Zvcm0pKSxcbiAgICAgIHRhcCh0YWJsZXMgPT4gdGhpcy5vblBpdm90VGFibGVzQ2hhbmdlKHRhYmxlcykpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgb25QaXZvdERhdGFDaGFuZ2UoZGF0YTogTG1yUGl2b3REYXRhKSB7XG4gICAgdGhpcy5waXZvdERhdGFDaGFuZ2UuZW1pdChkYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgb25QaXZvdFRhYmxlc0NoYW5nZSh0YWJsZXM6IExtclBpdm90VGFibGVbXSkge1xuICAgIGlmICh0aGlzLmluaXRpYWxseUNvbGxhcHNlZCAmJiB0YWJsZXNBcmVWZXJ5RGlmZmVyZW50KHRoaXMuY3VycmVudFRhYmxlcywgdGFibGVzKSkge1xuICAgICAgdGhpcy5waXZvdFN0YXRlcyQubmV4dCh0YWJsZXMubWFwKHRhYmxlID0+IGNvbGxhcHNlQWxsQ2VsbHModGFibGUpKSk7XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50VGFibGVzID0gdGFibGVzO1xuICAgIHRoaXMucGl2b3RUYWJsZXNDaGFuZ2UuZW1pdCh0YWJsZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVEYXRhKGRhdGE6IERhdGEpOiBMbXJQaXZvdERhdGEge1xuICAgIHJldHVybiB0aGlzLnBpdm90VHJhbnNmb3JtZXIuY3JlYXRlRGF0YShcbiAgICAgIGRhdGEuY29uZmlnLFxuICAgICAgZGF0YS50cmFuc2Zvcm0sXG4gICAgICBkYXRhLmNvbGxlY3Rpb25zLFxuICAgICAgZGF0YS5saW5rVHlwZXMsXG4gICAgICBkYXRhLmRhdGEsXG4gICAgICBkYXRhLnF1ZXJ5LFxuICAgICAgZGF0YS5jb25zdHJhaW50RGF0YVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChzaG91bGRSZXNldFN0YXRlKGNoYW5nZXMpKSB7XG4gICAgICB0aGlzLnJlc2V0U3RhdGUoKTtcbiAgICB9XG4gICAgdGhpcy5kYXRhU3ViamVjdCQubmV4dCh7XG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgdHJhbnNmb3JtOiB0aGlzLnRyYW5zZm9ybSxcbiAgICAgIGNvbGxlY3Rpb25zOiB0aGlzLmNvbGxlY3Rpb25zLFxuICAgICAgbGlua1R5cGVzOiB0aGlzLmxpbmtUeXBlcyxcbiAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgY29uc3RyYWludERhdGE6IHRoaXMuY29uc3RyYWludERhdGEsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0U3RhdGUoKSB7XG4gICAgLy8gdGhpcy5waXZvdFN0YXRlcyQubmV4dChbXSk7XG4gIH1cblxuICBwdWJsaWMgb25DZWxsQ2xpY2soY2VsbDogTG1yUGl2b3RUYWJsZUNlbGwsIHJvdzogTG1yUGl2b3RUYWJsZUNlbGxbXSwgdGFibGVJbmRleDogbnVtYmVyLCByb3dJbmRleDogbnVtYmVyLCBjb2x1bW5JbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKGlzQ2VsbEV4cGFuZGFibGUoY2VsbCkpIHtcbiAgICAgIGNvbnN0IG9sZFN0YXRlID0gdGhpcy5waXZvdFN0YXRlcyQudmFsdWVbdGFibGVJbmRleF1cbiAgICAgIGNvbnN0IG5ld1N0YXRlID0gdG9nZ2xlRXhwYW5kZWQoY2VsbCwgY29sdW1uSW5kZXgsIG9sZFN0YXRlKVxuICAgICAgdGhpcy5zZXRTdGF0ZSh0YWJsZUluZGV4LCBuZXdTdGF0ZSlcbiAgICB9IGVsc2UgaWYgKGNlbGw/LmlzSGVhZGVyIHx8IGNlbGw/LmlzVmFsdWUpIHtcbiAgICAgIGNvbnN0IGhlYWRlckNlbGwgPSBjZWxsLmlzSGVhZGVyID8gY2VsbCA6IHJvdy5maW5kKGMgPT4gYy5pc0hlYWRlcilcbiAgICAgIHRoaXMuY2VsbENsaWNrLmVtaXQoe2NlbGwsIHRhYmxlSW5kZXgsIHJvd0luZGV4OiBoZWFkZXJDZWxsPy5vcmlnaW5hbFJvd0luZGV4IHx8IHJvd0luZGV4LCBjb2x1bW5JbmRleH0pXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRTdGF0ZShpbmRleDogbnVtYmVyLCBzdGF0ZTogTG1yUGl2b3RUYWJsZVN0YXRlKSB7XG4gICAgY29uc3Qgc3RhdGVzQ29weSA9IFsuLi4odGhpcy5waXZvdFN0YXRlcyQudmFsdWUgfHwgW10pXTtcbiAgICBzdGF0ZXNDb3B5LnNwbGljZShpbmRleCwgMSwgc3RhdGUpXG4gICAgdGhpcy5waXZvdFN0YXRlcyQubmV4dChzdGF0ZXNDb3B5KVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZFJlc2V0U3RhdGUoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IGJvb2xlYW4ge1xuICBpZiAoY2hhbmdlc1snY29uZmlnJ10pIHtcbiAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gY2hhbmdlc1snY29uZmlnJ10ucHJldmlvdXNWYWx1ZSBhcyBMbXJQaXZvdENvbmZpZ1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNoYW5nZXNbJ2NvbmZpZyddLmN1cnJlbnRWYWx1ZSBhcyBMbXJQaXZvdENvbmZpZ1xuICAgIHJldHVybiBpc1Bpdm90Q29uZmlnQ2hhbmdlZChwcmV2aW91c1ZhbHVlLCBjdXJyZW50VmFsdWUpXG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0YWJsZXNBcmVWZXJ5RGlmZmVyZW50KHQxOiBMbXJQaXZvdFRhYmxlW10sIHQyOiBMbXJQaXZvdFRhYmxlW10pOiBib29sZWFuIHtcbiAgaWYgKCh0MSB8fCBbXSkubGVuZ3RoICE9PSAodDIgfHwgW10pLmxlbmd0aCkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgLy8gcm93IG51bWJlcnMgYXJlIGRpZmZlcmVudFxuICByZXR1cm4gKHQxIHx8IFtdKS5zb21lKCh0LCBpbmRleCkgPT4gdC5jZWxscz8ubGVuZ3RoICE9PSB0MltpbmRleF0uY2VsbHM/Lmxlbmd0aCk7XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwie3Bpdm90VGFibGVzOiBwaXZvdFRhYmxlcyQgfCBhc3luYywgcGl2b3RTdGF0ZXM6IHBpdm90U3RhdGVzJCB8IGFzeW5jLCBwaXZvdERhdGE6IHBpdm90RGF0YSQgfCBhc3luY30gYXMgZGF0YVwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YS5waXZvdFRhYmxlcz8ubGVuZ3RoICYmICEoZGF0YS5waXZvdERhdGEgfCBwaXZvdERhdGFFbXB0eSlcIj5cbiAgICA8dGFibGUgKm5nRm9yPVwibGV0IHBpdm90VGFibGUgb2YgZGF0YS5waXZvdFRhYmxlczsgbGV0IGZpcnN0OyBsZXQgdGFibGVJbmRleCA9IGluZGV4XCJcbiAgICAgICAgICAgY2xhc3M9XCJ0YWJsZSB0YWJsZS13aXRob3V0LXBhZGRpbmcgdGFibGUtYm9yZGVybGVzcyB0YWJsZS1tZFwiXG4gICAgICAgICAgIFtjbGFzcy5tdC00XT1cIiFmaXJzdFwiPlxuICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3dDZWxscyBvZiBwaXZvdFRhYmxlIHwgZmlsdGVyVmlzaWJsZUNlbGxzOmRhdGEucGl2b3RTdGF0ZXNbdGFibGVJbmRleF07IGxldCByb3dJbmRleCA9IGluZGV4XCI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2VsbCBvZiByb3dDZWxsczsgbGV0IGNlbGxJbmRleCA9IGluZGV4XCI+XG4gICAgICAgICAgPHRkICpuZ0lmPVwiY2VsbCAmJiB7aGFzVmFsdWU6IGNlbGwgfCBjZWxsSGFzVmFsdWV9IGFzIGNlbGxEYXRhXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjZWxsIHBvc2l0aW9uLXJlbGF0aXZlIHt7Y2VsbC5jb25zdHJhaW50ID8gKGNlbGwuY29uc3RyYWludC50eXBlIHwgbG93ZXJjYXNlKSA6ICcnfX0gdGV4dC10cnVuY2F0ZVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5leHBhbmRhYmxlXT1cImNlbGwgfCBpc0NlbGxFeHBhbmRhYmxlXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmV4cGFuZGFibGUtcm93c109XCJjZWxsIHwgaXNDZWxsUm93c0V4cGFuZGFibGVcIlxuICAgICAgICAgICAgICBbY2xhc3MuZXhwYW5kZWRdPVwiY2VsbCB8IGlzQ2VsbEV4cGFuZGVkOmNlbGxJbmRleDpkYXRhLnBpdm90U3RhdGVzW3RhYmxlSW5kZXhdXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnN0aWNreS1zdGFydF09XCJjZWxsLnN0aWNreVN0YXJ0XCJcbiAgICAgICAgICAgICAgW2NsYXNzLnN0aWNreS10b3BdPVwiY2VsbC5zdGlja3lUb3BcIlxuICAgICAgICAgICAgICBbcm93U3Bhbl09XCJjZWxsLnJvd1NwYW5cIlxuICAgICAgICAgICAgICBbY29sU3Bhbl09XCJjZWxsLmNvbFNwYW5cIlxuICAgICAgICAgICAgICBbc3R5bGUudG9wLnB4XT1cImNlbGwuc3RpY2t5VG9wID8gKHJvd0luZGV4ICogc3RpY2t5Q29sdW1uSGVpZ2h0KSA6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImNlbGwuc3RpY2t5U3RhcnQgPyAoY2VsbEluZGV4ICogc3RpY2t5Q29sdW1uV2lkdGgpIDogdW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImNlbGwuc3RpY2t5U3RhcnQgPyAoY2VsbC5jb2xTcGFuICogc3RpY2t5Q29sdW1uV2lkdGgpIDogdW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjZWxsLnN0aWNreVN0YXJ0ID8gKGNlbGwuY29sU3BhbiAqIHN0aWNreUNvbHVtbldpZHRoKSA6IDMwMFwiXG4gICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiY2VsbC5zdGlja3lTdGFydCA/IChjZWxsLmNvbFNwYW4gKiBzdGlja3lDb2x1bW5XaWR0aCkgOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJjZWxsLmNzc0NsYXNzXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiY2VsbC5iYWNrZ3JvdW5kXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImNlbGwuYmFja2dyb3VuZCAmJiAoY2VsbC5iYWNrZ3JvdW5kIHwgY29udHJhc3RDb2xvcilcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25DZWxsQ2xpY2soY2VsbCwgcm93Q2VsbHMsIHRhYmxlSW5kZXgsIHJvd0luZGV4LCBjZWxsSW5kZXgpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2VsbC5zdW1tYXJ5XCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjZWxsRGF0YS5oYXNWYWx1ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGgtMTAwXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnkgbWUtMlwiPnt7Y2VsbC5zdW1tYXJ5fX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUYWJsZUNlbGxUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4LWdyb3ctMSBoLTEwMCB0ZXh0LXRydW5jYXRlIGQtaW5saW5lLWJsb2NrXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgY2VsbC52YWx1ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGFibGVDZWxsVGVtcGxhdGUgfHwgdGFibGVDZWxsVGVtcGxhdGVJbnB1dCB8fCBkZWZhdWx0VGFibGVDZWxsVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyB2YWx1ZTogY2VsbC52YWx1ZSwgY2VsbDogY2VsbCB9XCI+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjZWxsRGF0YS5oYXNWYWx1ZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZC1ibG9ja1wiIHN0eWxlPVwib3ZlcmZsb3c6IGhpZGRlbjsgd2hpdGUtc3BhY2U6IG5vcm1hbFwiPnt7Y2VsbC5zdW1tYXJ5fX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNlbGwuc3VtbWFyeVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2VsbERhdGEuaGFzVmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUYWJsZUNlbGxUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZC1ibG9ja1wiIHN0eWxlPVwib3ZlcmZsb3c6IGhpZGRlbjsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgY3Vyc29yOiBwb2ludGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGNlbGwudmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0YWJsZUNlbGxUZW1wbGF0ZSB8fCB0YWJsZUNlbGxUZW1wbGF0ZUlucHV0IHx8IGRlZmF1bHRUYWJsZUNlbGxUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyB2YWx1ZTogY2VsbC52YWx1ZSwgY2VsbDogY2VsbCB9XCI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY2VsbERhdGEuaGFzVmFsdWVcIj4mbmJzcDs8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC90cj5cbiAgICA8L3RhYmxlPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWRhdGEucGl2b3RUYWJsZXM/Lmxlbmd0aCB8fCAoZGF0YS5waXZvdERhdGEgfCBwaXZvdERhdGFFbXB0eSlcIj5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRFbXB0eVRhYmxlc1RlbXBsYXRlPlxuICAgICAgPGRpdj4mbmJzcDs8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLXRlbXBsYXRlXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJlbXB0eVRhYmxlc1RlbXBsYXRlIHx8IGVtcHR5VGFibGVzVGVtcGxhdGVJbnB1dCB8fCBkZWZhdWx0RW1wdHlUYWJsZXNUZW1wbGF0ZVwiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAgfVwiPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy1jb250YWluZXI+XG4iXX0=