@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.
- package/fesm2022/lumeer-pivot.mjs +56 -43
- package/fesm2022/lumeer-pivot.mjs.map +1 -1
- package/index.d.ts +332 -5
- package/lumeer-pivot-0.2.0.tgz +0 -0
- package/package.json +4 -6
- package/esm2022/lib/directives/lmr-templates.directive.mjs +0 -27
- package/esm2022/lib/lmr-pivot-table.component.mjs +0 -147
- package/esm2022/lib/lmr-pivot-table.module.mjs +0 -63
- package/esm2022/lib/lmr-simple-pivot-table.component.mjs +0 -101
- package/esm2022/lib/pipes/cell-has-value.pipe.mjs +0 -35
- package/esm2022/lib/pipes/contrast-color.pipe.mjs +0 -41
- package/esm2022/lib/pipes/filter-visible-cells.pipe.mjs +0 -35
- package/esm2022/lib/pipes/is-cell-expandable.pipe.mjs +0 -35
- package/esm2022/lib/pipes/is-cell-expanded.pipe.mjs +0 -37
- package/esm2022/lib/pipes/is-cell-rows-expandable.pipe.mjs +0 -35
- package/esm2022/lib/pipes/pivot-data-empty.pipe.mjs +0 -38
- package/esm2022/lib/util/lmr-pivot-config.mjs +0 -17
- package/esm2022/lib/util/lmr-pivot-constants.mjs +0 -12
- package/esm2022/lib/util/lmr-pivot-data.mjs +0 -2
- package/esm2022/lib/util/lmr-pivot-state.mjs +0 -156
- package/esm2022/lib/util/lmr-pivot-table.mjs +0 -2
- package/esm2022/lib/util/lmr-simple-pivot-config.mjs +0 -2
- package/esm2022/lib/util/pivot-data-converter.mjs +0 -507
- package/esm2022/lib/util/pivot-table-converter.mjs +0 -1017
- package/esm2022/lib/util/pivot-util.mjs +0 -75
- package/esm2022/lumeer-pivot.mjs +0 -5
- package/esm2022/public-api.mjs +0 -13
- package/lib/directives/lmr-templates.directive.d.ts +0 -14
- package/lib/lmr-pivot-table.component.d.ts +0 -49
- package/lib/lmr-pivot-table.module.d.ts +0 -18
- package/lib/lmr-simple-pivot-table.component.d.ts +0 -38
- package/lib/pipes/cell-has-value.pipe.d.ts +0 -8
- package/lib/pipes/contrast-color.pipe.d.ts +0 -11
- package/lib/pipes/filter-visible-cells.pipe.d.ts +0 -9
- package/lib/pipes/is-cell-expandable.pipe.d.ts +0 -8
- package/lib/pipes/is-cell-expanded.pipe.d.ts +0 -9
- package/lib/pipes/is-cell-rows-expandable.pipe.d.ts +0 -8
- package/lib/pipes/pivot-data-empty.pipe.d.ts +0 -8
- package/lib/util/lmr-pivot-config.d.ts +0 -84
- package/lib/util/lmr-pivot-constants.d.ts +0 -11
- package/lib/util/lmr-pivot-data.d.ts +0 -50
- package/lib/util/lmr-pivot-state.d.ts +0 -14
- package/lib/util/lmr-pivot-table.d.ts +0 -25
- package/lib/util/lmr-simple-pivot-config.d.ts +0 -9
- package/lib/util/pivot-data-converter.d.ts +0 -46
- package/lib/util/pivot-table-converter.d.ts +0 -74
- package/lib/util/pivot-util.d.ts +0 -12
- package/lumeer-pivot-0.0.13.tgz +0 -0
- package/public-api.d.ts +0 -9
package/index.d.ts
CHANGED
|
@@ -1,5 +1,332 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"peerDependencies": {
|
|
5
|
-
"@angular/cdk": "^
|
|
6
|
-
"@angular/common": "^
|
|
7
|
-
"@angular/core": "^
|
|
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\"> </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> </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\"> </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> </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=
|