@sumaris-net/ngx-components 18.23.33 → 18.23.35

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 (34) hide show
  1. package/doc/changelog.md +7 -0
  2. package/esm2022/public_api.mjs +4 -1
  3. package/esm2022/src/app/core/form/list/list.form.mjs +8 -3
  4. package/esm2022/src/app/core/table/column/actions-column.component.mjs +1 -1
  5. package/esm2022/src/app/core/table/column/row-field.component.mjs +1 -1
  6. package/esm2022/src/app/core/table/table.pipes.mjs +6 -7
  7. package/esm2022/src/app/core/table/testing/table.testing.mjs +1 -1
  8. package/esm2022/src/app/core/table/testing/table.testing.module.mjs +25 -4
  9. package/esm2022/src/app/core/table/testing/table2.testing.mjs +63 -15
  10. package/esm2022/src/app/shared/directives/cell-selection/cell-identifier.directive.mjs +41 -0
  11. package/esm2022/src/app/shared/directives/cell-selection/cell-selection.directive.mjs +201 -0
  12. package/esm2022/src/app/shared/directives/cell-selection/cell-selection.service.mjs +186 -0
  13. package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +2 -2
  14. package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +64 -13
  15. package/esm2022/src/app/shared/functions.mjs +1 -1
  16. package/esm2022/src/app/shared/validator/validators.mjs +15 -1
  17. package/fesm2022/sumaris-net.ngx-components.mjs +580 -34
  18. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  19. package/package.json +1 -1
  20. package/public_api.d.ts +3 -0
  21. package/src/app/core/form/list/list.form.d.ts +2 -1
  22. package/src/app/core/table/column/actions-column.component.d.ts +1 -1
  23. package/src/app/core/table/table.pipes.d.ts +2 -1
  24. package/src/app/core/table/testing/table.testing.module.d.ts +3 -1
  25. package/src/app/core/table/testing/table2.testing.d.ts +7 -3
  26. package/src/app/shared/directives/cell-selection/cell-identifier.directive.d.ts +15 -0
  27. package/src/app/shared/directives/cell-selection/cell-selection.directive.d.ts +28 -0
  28. package/src/app/shared/directives/cell-selection/cell-selection.service.d.ts +64 -0
  29. package/src/app/shared/directives/resizable/resizable.directive.d.ts +15 -3
  30. package/src/app/shared/functions.d.ts +1 -1
  31. package/src/app/shared/inputs.d.ts +1 -1
  32. package/src/app/shared/validator/validators.d.ts +1 -0
  33. package/src/assets/manifest.json +1 -1
  34. package/src/theme/_ngx-components.table.scss +48 -2
@@ -0,0 +1,41 @@
1
+ import { DestroyRef, Directive, inject, input } from '@angular/core';
2
+ import { APP_CELL_SELECTION_SERVICE_TOKEN } from './cell-selection.service';
3
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
+ import * as i0 from "@angular/core";
5
+ export class CellIdentifierDirective {
6
+ cellId = input.required({ alias: 'appCellId' });
7
+ isCellSelected = false;
8
+ isDragging = false;
9
+ service = inject(APP_CELL_SELECTION_SERVICE_TOKEN);
10
+ destroyRef = inject(DestroyRef);
11
+ ngOnInit() {
12
+ // Listen to service selection changes and emit
13
+ this.service.selectionChangeSubject
14
+ .pipe(takeUntilDestroyed(this.destroyRef))
15
+ .subscribe(() => (this.isCellSelected = this.service.isCellSelected(this.cellId())));
16
+ }
17
+ async handleMouseDown(event) {
18
+ await this.service.handleCellMouseDown(event, this.cellId());
19
+ }
20
+ async handleMouseEnter(event) {
21
+ await this.service.handleCellMouseEnter(event, this.cellId());
22
+ }
23
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellIdentifierDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
24
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.13", type: CellIdentifierDirective, isStandalone: true, selector: "[appCellId]", inputs: { cellId: { classPropertyName: "cellId", publicName: "appCellId", isSignal: true, isRequired: true, transformFunction: null } }, host: { listeners: { "mousedown": "handleMouseDown($event)", "mouseenter": "handleMouseEnter($event)" }, properties: { "class.cell-selected": "isCellSelected", "class.cell-dragging": "isDragging", "attr.data-row-id": "cellId().rowId", "attr.data-column-name": "cellId().columnName" } }, ngImport: i0 });
25
+ }
26
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellIdentifierDirective, decorators: [{
27
+ type: Directive,
28
+ args: [{
29
+ selector: '[appCellId]',
30
+ standalone: true,
31
+ host: {
32
+ '(mousedown)': 'handleMouseDown($event)',
33
+ '(mouseenter)': 'handleMouseEnter($event)',
34
+ '[class.cell-selected]': 'isCellSelected',
35
+ '[class.cell-dragging]': 'isDragging',
36
+ '[attr.data-row-id]': 'cellId().rowId',
37
+ '[attr.data-column-name]': 'cellId().columnName',
38
+ },
39
+ }]
40
+ }] });
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC1pZGVudGlmaWVyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL2RpcmVjdGl2ZXMvY2VsbC1zZWxlY3Rpb24vY2VsbC1pZGVudGlmaWVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBVyxNQUFNLDBCQUEwQixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQWNoRSxNQUFNLE9BQU8sdUJBQXVCO0lBQ2xDLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFFekMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUN2QixVQUFVLEdBQUcsS0FBSyxDQUFDO0lBRVosT0FBTyxHQUFHLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQ25ELFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFakQsUUFBUTtRQUNOLCtDQUErQztRQUMvQyxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQjthQUNoQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ3pDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFUyxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQWlCO1FBQy9DLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVTLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFpQjtRQUNoRCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7d0dBdEJVLHVCQUF1Qjs0RkFBdkIsdUJBQXVCOzs0RkFBdkIsdUJBQXVCO2tCQVpuQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxhQUFhO29CQUN2QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsSUFBSSxFQUFFO3dCQUNKLGFBQWEsRUFBRSx5QkFBeUI7d0JBQ3hDLGNBQWMsRUFBRSwwQkFBMEI7d0JBQzFDLHVCQUF1QixFQUFFLGdCQUFnQjt3QkFDekMsdUJBQXVCLEVBQUUsWUFBWTt3QkFDckMsb0JBQW9CLEVBQUUsZ0JBQWdCO3dCQUN0Qyx5QkFBeUIsRUFBRSxxQkFBcUI7cUJBQ2pEO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzdHJveVJlZiwgRGlyZWN0aXZlLCBpbmplY3QsIGlucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFQUF9DRUxMX1NFTEVDVElPTl9TRVJWSUNFX1RPS0VOLCBJQ2VsbElkIH0gZnJvbSAnLi9jZWxsLXNlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2FwcENlbGxJZF0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBob3N0OiB7XG4gICAgJyhtb3VzZWRvd24pJzogJ2hhbmRsZU1vdXNlRG93bigkZXZlbnQpJyxcbiAgICAnKG1vdXNlZW50ZXIpJzogJ2hhbmRsZU1vdXNlRW50ZXIoJGV2ZW50KScsXG4gICAgJ1tjbGFzcy5jZWxsLXNlbGVjdGVkXSc6ICdpc0NlbGxTZWxlY3RlZCcsXG4gICAgJ1tjbGFzcy5jZWxsLWRyYWdnaW5nXSc6ICdpc0RyYWdnaW5nJyxcbiAgICAnW2F0dHIuZGF0YS1yb3ctaWRdJzogJ2NlbGxJZCgpLnJvd0lkJyxcbiAgICAnW2F0dHIuZGF0YS1jb2x1bW4tbmFtZV0nOiAnY2VsbElkKCkuY29sdW1uTmFtZScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIENlbGxJZGVudGlmaWVyRGlyZWN0aXZlPEMgZXh0ZW5kcyBJQ2VsbElkID0gSUNlbGxJZD4gaW1wbGVtZW50cyBPbkluaXQge1xuICBjZWxsSWQgPSBpbnB1dC5yZXF1aXJlZDxDPih7IGFsaWFzOiAnYXBwQ2VsbElkJyB9KTtcblxuICBwcm90ZWN0ZWQgaXNDZWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzRHJhZ2dpbmcgPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNlcnZpY2UgPSBpbmplY3QoQVBQX0NFTExfU0VMRUNUSU9OX1NFUlZJQ0VfVE9LRU4pO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gTGlzdGVuIHRvIHNlcnZpY2Ugc2VsZWN0aW9uIGNoYW5nZXMgYW5kIGVtaXRcbiAgICB0aGlzLnNlcnZpY2Uuc2VsZWN0aW9uQ2hhbmdlU3ViamVjdFxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+ICh0aGlzLmlzQ2VsbFNlbGVjdGVkID0gdGhpcy5zZXJ2aWNlLmlzQ2VsbFNlbGVjdGVkKHRoaXMuY2VsbElkKCkpKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgYXdhaXQgdGhpcy5zZXJ2aWNlLmhhbmRsZUNlbGxNb3VzZURvd24oZXZlbnQsIHRoaXMuY2VsbElkKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZU1vdXNlRW50ZXIoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2UuaGFuZGxlQ2VsbE1vdXNlRW50ZXIoZXZlbnQsIHRoaXMuY2VsbElkKCkpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,201 @@
1
+ import { DestroyRef, Directive, ElementRef, inject, input, output, Renderer2 } from '@angular/core';
2
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
+ import { fromEvent } from 'rxjs';
4
+ import { APP_CELL_SELECTION_SERVICE_TOKEN } from './cell-selection.service';
5
+ import { isEmptyArray, isNotEmptyArray } from '../../functions';
6
+ import * as i0 from "@angular/core";
7
+ export class CellSelectionDirective {
8
+ // Inputs
9
+ // eslint-disable-next-line @angular-eslint/no-input-rename
10
+ selectableColumns = input([], { alias: 'appSelectableColumns' });
11
+ // Outputs
12
+ // eslint-disable-next-line @angular-eslint/no-output-rename
13
+ selectionChange = output({ alias: 'appCellSelectionChange' });
14
+ // eslint-disable-next-line @angular-eslint/no-output-rename
15
+ rightClick = output({ alias: 'appCellRightClick' });
16
+ // Inject service by token
17
+ service = inject(APP_CELL_SELECTION_SERVICE_TOKEN);
18
+ elementRef = inject(ElementRef);
19
+ renderer = inject(Renderer2);
20
+ destroyRef = inject(DestroyRef);
21
+ overlayElements = [];
22
+ constructor() { }
23
+ ngOnInit() {
24
+ // Initialize service with selectable columns
25
+ this.setupServiceConfiguration();
26
+ // Setup global mouseup listener
27
+ this.setupGlobalMouseEvents();
28
+ // Setup keyboard listener for copy (for test)
29
+ // this.setupCopyListener();
30
+ }
31
+ setupServiceConfiguration() {
32
+ // Pass selectable columns to service
33
+ this.service.selectableColumns = this.selectableColumns();
34
+ // Listen to service selection changes and emit
35
+ this.service.selectionChangeSubject
36
+ .pipe(takeUntilDestroyed(this.destroyRef))
37
+ .subscribe((event) => this.selectionChange.emit(event));
38
+ // Listen to right-click event
39
+ this.service.selectionRightClickSubject.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => this.rightClick.emit(event));
40
+ }
41
+ setupGlobalMouseEvents() {
42
+ fromEvent(document, 'mouseup')
43
+ .pipe(takeUntilDestroyed(this.destroyRef))
44
+ .subscribe(() => this.service.endMouseMove());
45
+ }
46
+ // For test purpose only (type CTRL+C)
47
+ setupCopyListener() {
48
+ fromEvent(document, 'keydown')
49
+ .pipe(takeUntilDestroyed(this.destroyRef))
50
+ .subscribe((event) => {
51
+ if ((event.ctrlKey || event.metaKey) && event.key === 'c') {
52
+ const cells = this.service.selectedCells;
53
+ if (isNotEmptyArray(cells)) {
54
+ // Show overlay
55
+ this.addCellsOverlay(cells);
56
+ event.preventDefault();
57
+ // Hide overlay after animation completes (1 second)
58
+ setTimeout(() => {
59
+ this.removeCellsOverlay();
60
+ }, 1000);
61
+ }
62
+ }
63
+ });
64
+ }
65
+ addCellsOverlay(cells) {
66
+ // Remove existing overlays
67
+ this.removeCellsOverlay();
68
+ // Group cells into contiguous regions
69
+ const cellGroups = this.groupContiguousCells(cells);
70
+ // Create and render overlay for each contiguous region
71
+ cellGroups.forEach((group) => {
72
+ const bounds = this.calculateSelectionBounds(group);
73
+ if (bounds) {
74
+ const overlay = this.createOverlayElement(bounds);
75
+ this.renderer.appendChild(this.elementRef.nativeElement, overlay);
76
+ this.overlayElements.push(overlay);
77
+ }
78
+ });
79
+ }
80
+ removeCellsOverlay() {
81
+ this.overlayElements.forEach((overlay) => {
82
+ this.renderer.removeChild(this.elementRef.nativeElement, overlay);
83
+ });
84
+ this.overlayElements = [];
85
+ }
86
+ groupContiguousCells(cells) {
87
+ // Create a map for quick lookup
88
+ const cellMap = new Map();
89
+ cells.forEach((cell) => {
90
+ cellMap.set(this.getCellKey(cell), cell);
91
+ });
92
+ const visited = new Set();
93
+ const groups = [];
94
+ // Process each cell
95
+ cells.forEach((cell) => {
96
+ const key = this.getCellKey(cell);
97
+ if (visited.has(key)) {
98
+ return;
99
+ }
100
+ // Start a new contiguous group with flood-fill
101
+ const group = [];
102
+ const queue = [cell];
103
+ visited.add(key);
104
+ while (queue.length > 0) {
105
+ const current = queue.shift();
106
+ group.push(current);
107
+ // Check all 4 adjacent cells (up, down, left, right)
108
+ const neighbors = this.getAdjacentCells(current);
109
+ neighbors.forEach((neighbor) => {
110
+ const neighborKey = this.getCellKey(neighbor);
111
+ if (cellMap.has(neighborKey) && !visited.has(neighborKey)) {
112
+ visited.add(neighborKey);
113
+ queue.push(neighbor);
114
+ }
115
+ });
116
+ }
117
+ groups.push(group);
118
+ });
119
+ return groups;
120
+ }
121
+ getAdjacentCells(cell) {
122
+ // Returns cells adjacent to the current cell (up, down, left, right)
123
+ // Note: We need to get column order from the actual table structure
124
+ // For now, we'll use a simple approach based on rowId adjacency
125
+ return [
126
+ { rowId: cell.rowId - 1, columnName: cell.columnName }, // up
127
+ { rowId: cell.rowId + 1, columnName: cell.columnName }, // down
128
+ { rowId: cell.rowId, columnName: this.getNextColumnName(cell.columnName, -1) }, // left
129
+ { rowId: cell.rowId, columnName: this.getNextColumnName(cell.columnName, 1) }, // right
130
+ ].filter((c) => c.columnName !== null);
131
+ }
132
+ getNextColumnName(currentColumnName, offset) {
133
+ const columns = this.service.selectableColumns;
134
+ const currentIndex = columns.indexOf(currentColumnName);
135
+ if (currentIndex === -1) {
136
+ return null;
137
+ }
138
+ const newIndex = currentIndex + offset;
139
+ if (newIndex < 0 || newIndex >= columns.length) {
140
+ return null;
141
+ }
142
+ return columns[newIndex];
143
+ }
144
+ getCellKey(cell) {
145
+ return `${cell.rowId}-${cell.columnName}`;
146
+ }
147
+ calculateSelectionBounds(cells) {
148
+ const container = this.elementRef.nativeElement;
149
+ // Find all selected cell elements
150
+ const cellElements = [];
151
+ cells.forEach((cell) => {
152
+ const cellElement = container.querySelector(`[data-row-id="${cell.rowId}"][data-column-name="${cell.columnName}"]`);
153
+ if (cellElement) {
154
+ cellElements.push(cellElement);
155
+ }
156
+ });
157
+ if (isEmptyArray(cellElements)) {
158
+ return null;
159
+ }
160
+ // Get container position
161
+ const containerRect = container.getBoundingClientRect();
162
+ // Calculate bounding box
163
+ let minTop = Infinity;
164
+ let minLeft = Infinity;
165
+ let maxBottom = -Infinity;
166
+ let maxRight = -Infinity;
167
+ cellElements.forEach((element) => {
168
+ const rect = element.getBoundingClientRect();
169
+ minTop = Math.min(minTop, rect.top - containerRect.top);
170
+ minLeft = Math.min(minLeft, rect.left - containerRect.left);
171
+ maxBottom = Math.max(maxBottom, rect.bottom - containerRect.top);
172
+ maxRight = Math.max(maxRight, rect.right - containerRect.left);
173
+ });
174
+ return {
175
+ top: minTop,
176
+ left: minLeft,
177
+ width: maxRight - minLeft,
178
+ height: maxBottom - minTop,
179
+ };
180
+ }
181
+ createOverlayElement(bounds) {
182
+ const overlay = this.renderer.createElement('div');
183
+ this.renderer.addClass(overlay, 'cell-selection-overlay');
184
+ // Set position and size
185
+ this.renderer.setStyle(overlay, 'top', `${bounds.top}px`);
186
+ this.renderer.setStyle(overlay, 'left', `${bounds.left}px`);
187
+ this.renderer.setStyle(overlay, 'width', `${bounds.width}px`);
188
+ this.renderer.setStyle(overlay, 'height', `${bounds.height}px`);
189
+ return overlay;
190
+ }
191
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellSelectionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
192
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.13", type: CellSelectionDirective, isStandalone: true, selector: "[appCellSelection]", inputs: { selectableColumns: { classPropertyName: "selectableColumns", publicName: "appSelectableColumns", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectionChange: "appCellSelectionChange", rightClick: "appCellRightClick" }, ngImport: i0 });
193
+ }
194
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellSelectionDirective, decorators: [{
195
+ type: Directive,
196
+ args: [{
197
+ selector: '[appCellSelection]',
198
+ standalone: true,
199
+ }]
200
+ }], ctorParameters: () => [] });
201
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC1zZWxlY3Rpb24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvZGlyZWN0aXZlcy9jZWxsLXNlbGVjdGlvbi9jZWxsLXNlbGVjdGlvbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBK0IsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RyxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQWFoRSxNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLFNBQVM7SUFDVCwyREFBMkQ7SUFDM0QsaUJBQWlCLEdBQUcsS0FBSyxDQUFXLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxDQUFDLENBQUM7SUFFM0UsVUFBVTtJQUNWLDREQUE0RDtJQUM1RCxlQUFlLEdBQUcsTUFBTSxDQUF3QixFQUFFLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxDQUFDLENBQUM7SUFDckYsNERBQTREO0lBQzVELFVBQVUsR0FBRyxNQUFNLENBQWEsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBRWhFLDBCQUEwQjtJQUNoQixPQUFPLEdBQUcsTUFBTSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7SUFFNUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNoQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFD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QUFPLENBQUM7SUFDakIsQ0FBQzt3R0EvTlUsc0JBQXNCOzRGQUF0QixzQkFBc0I7OzRGQUF0QixzQkFBc0I7a0JBSmxDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzdHJveVJlZiwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBPbkluaXQsIG91dHB1dCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFQUF9DRUxMX1NFTEVDVElPTl9TRVJWSUNFX1RPS0VOLCBDZWxsU2VsZWN0aW9uRXZlbnQsIElDZWxsSWQgfSBmcm9tICcuL2NlbGwtc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgaXNFbXB0eUFycmF5LCBpc05vdEVtcHR5QXJyYXkgfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMnO1xuXG5pbnRlcmZhY2UgU2VsZWN0aW9uQm91bmRzIHtcbiAgdG9wOiBudW1iZXI7XG4gIGxlZnQ6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1thcHBDZWxsU2VsZWN0aW9uXScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIENlbGxTZWxlY3Rpb25EaXJlY3RpdmU8QyBleHRlbmRzIElDZWxsSWQgPSBJQ2VsbElkPiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vIElucHV0c1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0LXJlbmFtZVxuICBzZWxlY3RhYmxlQ29sdW1ucyA9IGlucHV0PHN0cmluZ1tdPihbXSwgeyBhbGlhczogJ2FwcFNlbGVjdGFibGVDb2x1bW5zJyB9KTtcblxuICAvLyBPdXRwdXRzXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LXJlbmFtZVxuICBzZWxlY3Rpb25DaGFuZ2UgPSBvdXRwdXQ8Q2VsbFNlbGVjdGlvbkV2ZW50PEM+Pih7IGFsaWFzOiAnYXBwQ2VsbFNlbGVjdGlvbkNoYW5nZScgfSk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LXJlbmFtZVxuICByaWdodENsaWNrID0gb3V0cHV0PE1vdXNlRXZlbnQ+KHsgYWxpYXM6ICdhcHBDZWxsUmlnaHRDbGljaycgfSk7XG5cbiAgLy8gSW5qZWN0IHNlcnZpY2UgYnkgdG9rZW5cbiAgcHJvdGVjdGVkIHNlcnZpY2UgPSBpbmplY3QoQVBQX0NFTExfU0VMRUNUSU9OX1NFUlZJQ0VfVE9LRU4pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHByaXZhdGUgb3ZlcmxheUVsZW1lbnRzOiBIVE1MRWxlbWVudFtdID0gW107XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIEluaXRpYWxpemUgc2VydmljZSB3aXRoIHNlbGVjdGFibGUgY29sdW1uc1xuICAgIHRoaXMuc2V0dXBTZXJ2aWNlQ29uZmlndXJhdGlvbigpO1xuICAgIC8vIFNldHVwIGdsb2JhbCBtb3VzZXVwIGxpc3RlbmVyXG4gICAgdGhpcy5zZXR1cEdsb2JhbE1vdXNlRXZlbnRzKCk7XG4gICAgLy8gU2V0dXAga2V5Ym9hcmQgbGlzdGVuZXIgZm9yIGNvcHkgKGZvciB0ZXN0KVxuICAgIC8vIHRoaXMuc2V0dXBDb3B5TGlzdGVuZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBTZXJ2aWNlQ29uZmlndXJhdGlvbigpIHtcbiAgICAvLyBQYXNzIHNlbGVjdGFibGUgY29sdW1ucyB0byBzZXJ2aWNlXG4gICAgdGhpcy5zZXJ2aWNlLnNlbGVjdGFibGVDb2x1bW5zID0gdGhpcy5zZWxlY3RhYmxlQ29sdW1ucygpO1xuXG4gICAgLy8gTGlzdGVuIHRvIHNlcnZpY2Ugc2VsZWN0aW9uIGNoYW5nZXMgYW5kIGVtaXRcbiAgICB0aGlzLnNlcnZpY2Uuc2VsZWN0aW9uQ2hhbmdlU3ViamVjdFxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4gdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChldmVudCBhcyBDZWxsU2VsZWN0aW9uRXZlbnQ8Qz4pKTtcblxuICAgIC8vIExpc3RlbiB0byByaWdodC1jbGljayBldmVudFxuICAgIHRoaXMuc2VydmljZS5zZWxlY3Rpb25SaWdodENsaWNrU3ViamVjdC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB0aGlzLnJpZ2h0Q2xpY2suZW1pdChldmVudCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEdsb2JhbE1vdXNlRXZlbnRzKCkge1xuICAgIGZyb21FdmVudDxNb3VzZUV2ZW50Pihkb2N1bWVudCwgJ21vdXNldXAnKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2VydmljZS5lbmRNb3VzZU1vdmUoKSk7XG4gIH1cblxuICAvLyBGb3IgdGVzdCBwdXJwb3NlIG9ubHkgKHR5cGUgQ1RSTCtDKVxuICBwcml2YXRlIHNldHVwQ29weUxpc3RlbmVyKCkge1xuICAgIGZyb21FdmVudDxLZXlib2FyZEV2ZW50Pihkb2N1bWVudCwgJ2tleWRvd24nKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgZXZlbnQua2V5ID09PSAnYycpIHtcbiAgICAgICAgICBjb25zdCBjZWxscyA9IHRoaXMuc2VydmljZS5zZWxlY3RlZENlbGxzIGFzIENbXTtcbiAgICAgICAgICBpZiAoaXNOb3RFbXB0eUFycmF5KGNlbGxzKSkge1xuICAgICAgICAgICAgLy8gU2hvdyBvdmVybGF5XG4gICAgICAgICAgICB0aGlzLmFkZENlbGxzT3ZlcmxheShjZWxscyk7XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIC8vIEhpZGUgb3ZlcmxheSBhZnRlciBhbmltYXRpb24gY29tcGxldGVzICgxIHNlY29uZClcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnJlbW92ZUNlbGxzT3ZlcmxheSgpO1xuICAgICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIGFkZENlbGxzT3ZlcmxheShjZWxsczogQ1tdKSB7XG4gICAgLy8gUmVtb3ZlIGV4aXN0aW5nIG92ZXJsYXlzXG4gICAgdGhpcy5yZW1vdmVDZWxsc092ZXJsYXkoKTtcblxuICAgIC8vIEdyb3VwIGNlbGxzIGludG8gY29udGlndW91cyByZWdpb25zXG4gICAgY29uc3QgY2VsbEdyb3VwcyA9IHRoaXMuZ3JvdXBDb250aWd1b3VzQ2VsbHMoY2VsbHMpO1xuXG4gICAgLy8gQ3JlYXRlIGFuZCByZW5kZXIgb3ZlcmxheSBmb3IgZWFjaCBjb250aWd1b3VzIHJlZ2lvblxuICAgIGNlbGxHcm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IHtcbiAgICAgIGNvbnN0IGJvdW5kcyA9IHRoaXMuY2FsY3VsYXRlU2VsZWN0aW9uQm91bmRzKGdyb3VwKTtcbiAgICAgIGlmIChib3VuZHMpIHtcbiAgICAgICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMuY3JlYXRlT3ZlcmxheUVsZW1lbnQoYm91bmRzKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgb3ZlcmxheSk7XG4gICAgICAgIHRoaXMub3ZlcmxheUVsZW1lbnRzLnB1c2gob3ZlcmxheSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVDZWxsc092ZXJsYXkoKSB7XG4gICAgdGhpcy5vdmVybGF5RWxlbWVudHMuZm9yRWFjaCgob3ZlcmxheSkgPT4ge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgb3ZlcmxheSk7XG4gICAgfSk7XG4gICAgdGhpcy5vdmVybGF5RWxlbWVudHMgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgZ3JvdXBDb250aWd1b3VzQ2VsbHMoY2VsbHM6IENbXSk6IENbXVtdIHtcbiAgICAvLyBDcmVhdGUgYSBtYXAgZm9yIHF1aWNrIGxvb2t1cFxuICAgIGNvbnN0IGNlbGxNYXAgPSBuZXcgTWFwPHN0cmluZywgQz4oKTtcbiAgICBjZWxscy5mb3JFYWNoKChjZWxsKSA9PiB7XG4gICAgICBjZWxsTWFwLnNldCh0aGlzLmdldENlbGxLZXkoY2VsbCksIGNlbGwpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGdyb3VwczogQ1tdW10gPSBbXTtcblxuICAgIC8vIFByb2Nlc3MgZWFjaCBjZWxsXG4gICAgY2VsbHMuZm9yRWFjaCgoY2VsbCkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRDZWxsS2V5KGNlbGwpO1xuICAgICAgaWYgKHZpc2l0ZWQuaGFzKGtleSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTdGFydCBhIG5ldyBjb250aWd1b3VzIGdyb3VwIHdpdGggZmxvb2QtZmlsbFxuICAgICAgY29uc3QgZ3JvdXA6IENbXSA9IFtdO1xuICAgICAgY29uc3QgcXVldWU6IENbXSA9IFtjZWxsXTtcbiAgICAgIHZpc2l0ZWQuYWRkKGtleSk7XG5cbiAgICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBxdWV1ZS5zaGlmdCgpITtcbiAgICAgICAgZ3JvdXAucHVzaChjdXJyZW50KTtcblxuICAgICAgICAvLyBDaGVjayBhbGwgNCBhZGphY2VudCBjZWxscyAodXAsIGRvd24sIGxlZnQsIHJpZ2h0KVxuICAgICAgICBjb25zdCBuZWlnaGJvcnMgPSB0aGlzLmdldEFkamFjZW50Q2VsbHMoY3VycmVudCk7XG4gICAgICAgIG5laWdoYm9ycy5mb3JFYWNoKChuZWlnaGJvcikgPT4ge1xuICAgICAgICAgIGNvbnN0IG5laWdoYm9yS2V5ID0gdGhpcy5nZXRDZWxsS2V5KG5laWdoYm9yKTtcbiAgICAgICAgICBpZiAoY2VsbE1hcC5oYXMobmVpZ2hib3JLZXkpICYmICF2aXNpdGVkLmhhcyhuZWlnaGJvcktleSkpIHtcbiAgICAgICAgICAgIHZpc2l0ZWQuYWRkKG5laWdoYm9yS2V5KTtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2gobmVpZ2hib3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGdyb3Vwcy5wdXNoKGdyb3VwKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBncm91cHM7XG4gIH1cblxuICBwcml2YXRlIGdldEFkamFjZW50Q2VsbHMoY2VsbDogQyk6IENbXSB7XG4gICAgLy8gUmV0dXJucyBjZWxscyBhZGphY2VudCB0byB0aGUgY3VycmVudCBjZWxsICh1cCwgZG93biwgbGVmdCwgcmlnaHQpXG4gICAgLy8gTm90ZTogV2UgbmVlZCB0byBnZXQgY29sdW1uIG9yZGVyIGZyb20gdGhlIGFjdHVhbCB0YWJsZSBzdHJ1Y3R1cmVcbiAgICAvLyBGb3Igbm93LCB3ZSdsbCB1c2UgYSBzaW1wbGUgYXBwcm9hY2ggYmFzZWQgb24gcm93SWQgYWRqYWNlbmN5XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgcm93SWQ6IGNlbGwucm93SWQgLSAxLCBjb2x1bW5OYW1lOiBjZWxsLmNvbHVtbk5hbWUgfSwgLy8gdXBcbiAgICAgIHsgcm93SWQ6IGNlbGwucm93SWQgKyAxLCBjb2x1bW5OYW1lOiBjZWxsLmNvbHVtbk5hbWUgfSwgLy8gZG93blxuICAgICAgeyByb3dJZDogY2VsbC5yb3dJZCwgY29sdW1uTmFtZTogdGhpcy5nZXROZXh0Q29sdW1uTmFtZShjZWxsLmNvbHVtbk5hbWUsIC0xKSB9LCAvLyBsZWZ0XG4gICAgICB7IHJvd0lkOiBjZWxsLnJvd0lkLCBjb2x1bW5OYW1lOiB0aGlzLmdldE5leHRDb2x1bW5OYW1lKGNlbGwuY29sdW1uTmFtZSwgMSkgfSwgLy8gcmlnaHRcbiAgICBdLmZpbHRlcigoYykgPT4gYy5jb2x1bW5OYW1lICE9PSBudWxsKSBhcyBDW107XG4gIH1cblxuICBwcml2YXRlIGdldE5leHRDb2x1bW5OYW1lKGN1cnJlbnRDb2x1bW5OYW1lOiBzdHJpbmcsIG9mZnNldDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuc2VydmljZS5zZWxlY3RhYmxlQ29sdW1ucztcblxuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGNvbHVtbnMuaW5kZXhPZihjdXJyZW50Q29sdW1uTmFtZSk7XG4gICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0luZGV4ID0gY3VycmVudEluZGV4ICsgb2Zmc2V0O1xuICAgIGlmIChuZXdJbmRleCA8IDAgfHwgbmV3SW5kZXggPj0gY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjb2x1bW5zW25ld0luZGV4XTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2VsbEtleShjZWxsOiBDKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7Y2VsbC5yb3dJZH0tJHtjZWxsLmNvbHVtbk5hbWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlU2VsZWN0aW9uQm91bmRzKGNlbGxzOiBDW10pOiBTZWxlY3Rpb25Cb3VuZHMgfCBudWxsIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuICAgIC8vIEZpbmQgYWxsIHNlbGVjdGVkIGNlbGwgZWxlbWVudHNcbiAgICBjb25zdCBjZWxsRWxlbWVudHM6IEhUTUxFbGVtZW50W10gPSBbXTtcbiAgICBjZWxscy5mb3JFYWNoKChjZWxsKSA9PiB7XG4gICAgICBjb25zdCBjZWxsRWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGBbZGF0YS1yb3ctaWQ9XCIke2NlbGwucm93SWR9XCJdW2RhdGEtY29sdW1uLW5hbWU9XCIke2NlbGwuY29sdW1uTmFtZX1cIl1gKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGlmIChjZWxsRWxlbWVudCkge1xuICAgICAgICBjZWxsRWxlbWVudHMucHVzaChjZWxsRWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoaXNFbXB0eUFycmF5KGNlbGxFbGVtZW50cykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEdldCBjb250YWluZXIgcG9zaXRpb25cbiAgICBjb25zdCBjb250YWluZXJSZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGJvdW5kaW5nIGJveFxuICAgIGxldCBtaW5Ub3AgPSBJbmZpbml0eTtcbiAgICBsZXQgbWluTGVmdCA9IEluZmluaXR5O1xuICAgIGxldCBtYXhCb3R0b20gPSAtSW5maW5pdHk7XG4gICAgbGV0IG1heFJpZ2h0ID0gLUluZmluaXR5O1xuXG4gICAgY2VsbEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgbWluVG9wID0gTWF0aC5taW4obWluVG9wLCByZWN0LnRvcCAtIGNvbnRhaW5lclJlY3QudG9wKTtcbiAgICAgIG1pbkxlZnQgPSBNYXRoLm1pbihtaW5MZWZ0LCByZWN0LmxlZnQgLSBjb250YWluZXJSZWN0LmxlZnQpO1xuICAgICAgbWF4Qm90dG9tID0gTWF0aC5tYXgobWF4Qm90dG9tLCByZWN0LmJvdHRvbSAtIGNvbnRhaW5lclJlY3QudG9wKTtcbiAgICAgIG1heFJpZ2h0ID0gTWF0aC5tYXgobWF4UmlnaHQsIHJlY3QucmlnaHQgLSBjb250YWluZXJSZWN0LmxlZnQpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvcDogbWluVG9wLFxuICAgICAgbGVmdDogbWluTGVmdCxcbiAgICAgIHdpZHRoOiBtYXhSaWdodCAtIG1pbkxlZnQsXG4gICAgICBoZWlnaHQ6IG1heEJvdHRvbSAtIG1pblRvcCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVPdmVybGF5RWxlbWVudChib3VuZHM6IFNlbGVjdGlvbkJvdW5kcyk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKG92ZXJsYXksICdjZWxsLXNlbGVjdGlvbi1vdmVybGF5Jyk7XG5cbiAgICAvLyBTZXQgcG9zaXRpb24gYW5kIHNpemVcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG92ZXJsYXksICd0b3AnLCBgJHtib3VuZHMudG9wfXB4YCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShvdmVybGF5LCAnbGVmdCcsIGAke2JvdW5kcy5sZWZ0fXB4YCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShvdmVybGF5LCAnd2lkdGgnLCBgJHtib3VuZHMud2lkdGh9cHhgKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG92ZXJsYXksICdoZWlnaHQnLCBgJHtib3VuZHMuaGVpZ2h0fXB4YCk7XG5cbiAgICByZXR1cm4gb3ZlcmxheTtcbiAgfVxufVxuIl19
@@ -0,0 +1,186 @@
1
+ import { inject, Injectable, InjectionToken } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import { isEmptyArray } from '../../functions';
4
+ import * as i0 from "@angular/core";
5
+ export const APP_CELL_SELECTION_SERVICE_TOKEN = new InjectionToken('CellSelectionService');
6
+ export const APP_CELL_SELECTION_SERVICE_CONFIG_TOKEN = new InjectionToken('CellSelectionServiceConfig');
7
+ /**
8
+ * Service to manage cell selection state across multiple directive instances.
9
+ * This service should be provided at the component level (not root) to ensure
10
+ * proper isolation between different table instances.
11
+ */
12
+ export class CellSelectionService {
13
+ // Configuration
14
+ config = inject(APP_CELL_SELECTION_SERVICE_CONFIG_TOKEN, { optional: true });
15
+ selectableColumns = [];
16
+ // Selection state
17
+ _selectedCells = [];
18
+ selectionStartCell = null;
19
+ isSelecting = false;
20
+ // Drag state
21
+ draggedCells = [];
22
+ dragStartCell = null;
23
+ isDragging = false;
24
+ // Observables
25
+ selectionChangeSubject = new Subject();
26
+ selectionRightClickSubject = new Subject();
27
+ // Overridable methods
28
+ _equals;
29
+ _new;
30
+ constructor() {
31
+ this._equals = this.config?.equals;
32
+ this._new = this.config?.new;
33
+ }
34
+ // Override method
35
+ equals(cell1, cell2) {
36
+ return this._equals ? this._equals(cell1, cell2) : cell1?.rowId === cell2?.rowId && cell1?.columnName === cell2?.columnName;
37
+ }
38
+ // Override method
39
+ new(cellId) {
40
+ return this._new ? this._new(cellId) : cellId;
41
+ }
42
+ get selectedCells() {
43
+ return this._selectedCells;
44
+ }
45
+ set selectedCells(value) {
46
+ this.emitSelection(value, false, false);
47
+ }
48
+ isCellSelected(cellId) {
49
+ return this.selectedCells.some((selectedCell) => this.equals(selectedCell, cellId));
50
+ }
51
+ isCellDragged(cellId) {
52
+ return this.draggedCells.some((selectedCell) => this.equals(selectedCell, cellId));
53
+ }
54
+ // Core selection logic (moved from CellIdentifierDirective)
55
+ async handleCellMouseDown(event, cellId) {
56
+ event.preventDefault();
57
+ if (event.button === 2) {
58
+ event.stopPropagation();
59
+ this.selectionRightClickSubject.next(event);
60
+ return;
61
+ }
62
+ const isCtrlKey = event.ctrlKey || event.metaKey;
63
+ const isShiftKey = event.shiftKey;
64
+ if (!isShiftKey && !isCtrlKey) {
65
+ this.startSelection(cellId);
66
+ // this.startDragSelection(cellId);
67
+ }
68
+ else if (isCtrlKey) {
69
+ this.toggleCellSelection(cellId);
70
+ }
71
+ else if (isShiftKey) {
72
+ this.selectRange(cellId);
73
+ }
74
+ }
75
+ async handleCellMouseEnter(event, cellId) {
76
+ // TODO check if next cell can be selected
77
+ if (this.isSelecting && this.selectionStartCell) {
78
+ this.updateSelection(cellId);
79
+ }
80
+ else if (this.isDragging && this.dragStartCell) {
81
+ this.updateDraggedCells(cellId);
82
+ }
83
+ }
84
+ endMouseMove() {
85
+ if (this.isSelecting) {
86
+ this.resetSelectionState();
87
+ }
88
+ else if (this.isDragging) {
89
+ this.resetDragState();
90
+ }
91
+ }
92
+ // Private helper methods
93
+ startSelection(cellId) {
94
+ this.selectionStartCell = cellId;
95
+ this.isSelecting = true;
96
+ this.emitSelection([cellId], false, false);
97
+ }
98
+ startDragSelection(cellId) {
99
+ this.dragStartCell = cellId;
100
+ this.isDragging = true;
101
+ this.draggedCells = [cellId];
102
+ // this.emitSelection([cellId], false, false);
103
+ }
104
+ toggleCellSelection(cellId) {
105
+ const currentCells = [...this.selectedCells];
106
+ const cellIndex = currentCells.findIndex((c) => this.equals(c, cellId));
107
+ if (cellIndex >= 0) {
108
+ currentCells.splice(cellIndex, 1);
109
+ }
110
+ else {
111
+ currentCells.push(cellId);
112
+ }
113
+ this.emitSelection(currentCells, false, true);
114
+ }
115
+ selectRange(endCell) {
116
+ const rangeCells = this.calculateRangeCells(endCell);
117
+ this.emitSelection(rangeCells, true, false);
118
+ }
119
+ updateSelection(currentCell) {
120
+ const rangeCells = this.calculateRangeBetweenCells(this.selectionStartCell, currentCell);
121
+ this.emitSelection(rangeCells, true, false);
122
+ }
123
+ updateDraggedCells(currentCell) {
124
+ // this.draggedCells.set(rangeCells);
125
+ }
126
+ emitSelection(cells, isRange, isToggle) {
127
+ this._selectedCells = cells;
128
+ this.selectionChangeSubject.next({
129
+ selectedCells: cells,
130
+ isRangeSelection: isRange,
131
+ isToggleSelection: isToggle,
132
+ });
133
+ }
134
+ calculateRangeCells(endCell) {
135
+ if (isEmptyArray(this.selectedCells)) {
136
+ return [endCell];
137
+ }
138
+ const lastSelectedCell = this.findFirstSelectedCell(this.selectedCells);
139
+ return this.calculateRangeBetweenCells(lastSelectedCell, endCell);
140
+ }
141
+ calculateRangeBetweenCells(startCell, endCell) {
142
+ // Get first cell coordinates, then add this cell as a range
143
+ const firstRowId = Math.min(startCell.rowId, endCell.rowId);
144
+ const lastRowId = Math.max(startCell.rowId, endCell.rowId);
145
+ const startColumnIndex = this.selectableColumns.indexOf(startCell.columnName);
146
+ const endColumnIndex = this.selectableColumns.indexOf(endCell.columnName);
147
+ const firstColumnIndex = Math.min(startColumnIndex, endColumnIndex);
148
+ const lastColumnIndex = Math.max(startColumnIndex, endColumnIndex);
149
+ // Iterate columns and rows
150
+ const rangeCells = [];
151
+ for (let i = firstColumnIndex; i <= lastColumnIndex; i++) {
152
+ const columnName = this.selectableColumns[i];
153
+ for (let rowId = firstRowId; rowId <= lastRowId; rowId++) {
154
+ rangeCells.push(this.new({ rowId: rowId, columnName: columnName }));
155
+ }
156
+ }
157
+ return rangeCells;
158
+ }
159
+ resetSelectionState() {
160
+ this.selectionStartCell = null;
161
+ this.isSelecting = false;
162
+ }
163
+ resetDragState() {
164
+ this.dragStartCell = null;
165
+ this.isDragging = false;
166
+ this.draggedCells = [];
167
+ }
168
+ findFirstSelectedCell(selectedCells) {
169
+ // Find the cell with the lowest rowId and columnIndex
170
+ return this.findSelectedCell(selectedCells, Math.min(...selectedCells.map((cell) => cell.rowId)), Math.min(...selectedCells.map((cell) => this.selectableColumns.indexOf(cell.columnName))));
171
+ }
172
+ findLastSelectedCell(selectedCells) {
173
+ // Find the cell with the lowest rowId and columnIndex
174
+ return this.findSelectedCell(selectedCells, Math.max(...selectedCells.map((cell) => cell.rowId)), Math.max(...selectedCells.map((cell) => this.selectableColumns.indexOf(cell.columnName))));
175
+ }
176
+ findSelectedCell(selectedCells, rowId, columnIndex) {
177
+ // Find the cell with the current indexes
178
+ return selectedCells.filter((cell) => cell.rowId === rowId && cell.columnName === this.selectableColumns[columnIndex])[0];
179
+ }
180
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellSelectionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
181
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellSelectionService });
182
+ }
183
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellSelectionService, decorators: [{
184
+ type: Injectable
185
+ }], ctorParameters: () => [] });
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC1zZWxlY3Rpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL2RpcmVjdGl2ZXMvY2VsbC1zZWxlY3Rpb24vY2VsbC1zZWxlY3Rpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBRy9DLE1BQU0sQ0FBQyxNQUFNLGdDQUFnQyxHQUFHLElBQUksY0FBYyxDQUF1QixzQkFBc0IsQ0FBQyxDQUFDO0FBQ2pILE1BQU0sQ0FBQyxNQUFNLHVDQUF1QyxHQUFHLElBQUksY0FBYyxDQUFrQyw0QkFBNEIsQ0FBQyxDQUFDO0FBa0J6STs7OztHQUlHO0FBRUgsTUFBTSxPQUFPLG9CQUFvQjtJQUMvQixnQkFBZ0I7SUFDaEIsTUFBTSxHQUFHLE1BQU0sQ0FBQyx1Q0FBdUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzdFLGlCQUFpQixHQUFhLEVBQUUsQ0FBQztJQUVqQyxrQkFBa0I7SUFDVixjQUFjLEdBQVEsRUFBRSxDQUFDO0lBQ3pCLGtCQUFrQixHQUFhLElBQUksQ0FBQztJQUNwQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBRTVCLGFBQWE7SUFDYixZQUFZLEdBQVEsRUFBRSxDQUFDO0lBQ2YsYUFBYSxHQUFhLElBQUksQ0FBQztJQUMvQixVQUFVLEdBQUcsS0FBSyxDQUFDO0lBRTNCLGNBQWM7SUFDTCxzQkFBc0IsR0FBRyxJQUFJLE9BQU8sRUFBeUIsQ0FBQztJQUM5RCwwQkFBMEIsR0FBRyxJQUFJLE9BQU8sRUFBYyxDQUFDO0lBRWhFLHNCQUFzQjtJQUNM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SSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUMxRixDQUFDO0lBQ0osQ0FBQztJQUVPLGdCQUFnQixDQUFDLGFBQWtCLEVBQUUsS0FBYSxFQUFFLFdBQW1CO1FBQzdFLHlDQUF5QztRQUN6QyxPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUgsQ0FBQzt3R0E5TVUsb0JBQW9COzRHQUFwQixvQkFBb0I7OzRGQUFwQixvQkFBb0I7a0JBRGhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBpc0VtcHR5QXJyYXkgfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgRXF1YWxzRm4gfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBBUFBfQ0VMTF9TRUxFQ1RJT05fU0VSVklDRV9UT0tFTiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxDZWxsU2VsZWN0aW9uU2VydmljZT4oJ0NlbGxTZWxlY3Rpb25TZXJ2aWNlJyk7XG5leHBvcnQgY29uc3QgQVBQX0NFTExfU0VMRUNUSU9OX1NFUlZJQ0VfQ09ORklHX1RPS0VOID0gbmV3IEluamVjdGlvblRva2VuPENlbGxTZWxlY3Rpb25TZXJ2aWNlQ29uZmlnPGFueT4+KCdDZWxsU2VsZWN0aW9uU2VydmljZUNvbmZpZycpO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDZWxsSWQge1xuICByb3dJZDogbnVtYmVyO1xuICBjb2x1bW5OYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2VsbFNlbGVjdGlvbkV2ZW50PEMgZXh0ZW5kcyBJQ2VsbElkPiB7XG4gIHNlbGVjdGVkQ2VsbHM6IENbXTtcbiAgaXNSYW5nZVNlbGVjdGlvbjogYm9vbGVhbjtcbiAgaXNUb2dnbGVTZWxlY3Rpb246IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2VsbFNlbGVjdGlvblNlcnZpY2VDb25maWc8QyBleHRlbmRzIElDZWxsSWQ+IHtcbiAgZXF1YWxzOiBFcXVhbHNGbjxDPjtcbiAgbmV3OiAoY2VsbElkOiBJQ2VsbElkKSA9PiBDO1xufVxuXG4vKipcbiAqIFNlcnZpY2UgdG8gbWFuYWdlIGNlbGwgc2VsZWN0aW9uIHN0YXRlIGFjcm9zcyBtdWx0aXBsZSBkaXJlY3RpdmUgaW5zdGFuY2VzLlxuICogVGhpcyBzZXJ2aWNlIHNob3VsZCBiZSBwcm92aWRlZCBhdCB0aGUgY29tcG9uZW50IGxldmVsIChub3Qgcm9vdCkgdG8gZW5zdXJlXG4gKiBwcm9wZXIgaXNvbGF0aW9uIGJldHdlZW4gZGlmZmVyZW50IHRhYmxlIGluc3RhbmNlcy5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENlbGxTZWxlY3Rpb25TZXJ2aWNlPEMgZXh0ZW5kcyBJQ2VsbElkID0gSUNlbGxJZD4ge1xuICAvLyBDb25maWd1cmF0aW9uXG4gIGNvbmZpZyA9IGluamVjdChBUFBfQ0VMTF9TRUxFQ1RJT05fU0VSVklDRV9DT05GSUdfVE9LRU4sIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHNlbGVjdGFibGVDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIFNlbGVjdGlvbiBzdGF0ZVxuICBwcml2YXRlIF9zZWxlY3RlZENlbGxzOiBDW10gPSBbXTtcbiAgcHJpdmF0ZSBzZWxlY3Rpb25TdGFydENlbGw6IEMgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpc1NlbGVjdGluZyA9IGZhbHNlO1xuXG4gIC8vIERyYWcgc3RhdGVcbiAgZHJhZ2dlZENlbGxzOiBDW10gPSBbXTtcbiAgcHJpdmF0ZSBkcmFnU3RhcnRDZWxsOiBDIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaXNEcmFnZ2luZyA9IGZhbHNlO1xuXG4gIC8vIE9ic2VydmFibGVzXG4gIHJlYWRvbmx5IHNlbGVjdGlvbkNoYW5nZVN1YmplY3QgPSBuZXcgU3ViamVjdDxDZWxsU2VsZWN0aW9uRXZlbnQ8Qz4+KCk7XG4gIHJlYWRvbmx5IHNlbGVjdGlvblJpZ2h0Q2xpY2tTdWJqZWN0ID0gbmV3IFN1YmplY3Q8TW91c2VFdmVudD4oKTtcblxuICAvLyBPdmVycmlkYWJsZSBtZXRob2RzXG4gIHByaXZhdGUgcmVhZG9ubHkgX2VxdWFsczogRXF1YWxzRm48Qz47XG4gIHByaXZhdGUgcmVhZG9ubHkgX25ldzogKGNlbGxJZDogSUNlbGxJZCkgPT4gQztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9lcXVhbHMgPSB0aGlzLmNvbmZpZz8uZXF1YWxzO1xuICAgIHRoaXMuX25ldyA9IHRoaXMuY29uZmlnPy5uZXc7XG4gIH1cblxuICAvLyBPdmVycmlkZSBtZXRob2RcbiAgZXF1YWxzKGNlbGwxOiBDLCBjZWxsMjogQyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9lcXVhbHMgPyB0aGlzLl9lcXVhbHMoY2VsbDEsIGNlbGwyKSA6IGNlbGwxPy5yb3dJZCA9PT0gY2VsbDI/LnJvd0lkICYmIGNlbGwxPy5jb2x1bW5OYW1lID09PSBjZWxsMj8uY29sdW1uTmFtZTtcbiAgfVxuXG4gIC8vIE92ZXJyaWRlIG1ldGhvZFxuICBuZXcoY2VsbElkOiBJQ2VsbElkKTogQyB7XG4gICAgcmV0dXJuIHRoaXMuX25ldyA/IHRoaXMuX25ldyhjZWxsSWQpIDogKGNlbGxJZCBhcyBDKTtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZENlbGxzKCk6IENbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkQ2VsbHM7XG4gIH1cblxuICBzZXQgc2VsZWN0ZWRDZWxscyh2YWx1ZTogQ1tdKSB7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKHZhbHVlLCBmYWxzZSwgZmFsc2UpO1xuICB9XG5cbiAgaXNDZWxsU2VsZWN0ZWQoY2VsbElkOiBDKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRDZWxscy5zb21lKChzZWxlY3RlZENlbGwpID0+IHRoaXMuZXF1YWxzKHNlbGVjdGVkQ2VsbCwgY2VsbElkKSk7XG4gIH1cblxuICBpc0NlbGxEcmFnZ2VkKGNlbGxJZDogQyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRyYWdnZWRDZWxscy5zb21lKChzZWxlY3RlZENlbGwpID0+IHRoaXMuZXF1YWxzKHNlbGVjdGVkQ2VsbCwgY2VsbElkKSk7XG4gIH1cblxuICAvLyBDb3JlIHNlbGVjdGlvbiBsb2dpYyAobW92ZWQgZnJvbSBDZWxsSWRlbnRpZmllckRpcmVjdGl2ZSlcbiAgYXN5bmMgaGFuZGxlQ2VsbE1vdXNlRG93bihldmVudDogTW91c2VFdmVudCwgY2VsbElkOiBDKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmIChldmVudC5idXR0b24gPT09IDIpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5zZWxlY3Rpb25SaWdodENsaWNrU3ViamVjdC5uZXh0KGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc0N0cmxLZXkgPSBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXk7XG4gICAgY29uc3QgaXNTaGlmdEtleSA9IGV2ZW50LnNoaWZ0S2V5O1xuXG4gICAgaWYgKCFpc1NoaWZ0S2V5ICYmICFpc0N0cmxLZXkpIHtcbiAgICAgIHRoaXMuc3RhcnRTZWxlY3Rpb24oY2VsbElkKTtcbiAgICAgIC8vIHRoaXMuc3RhcnREcmFnU2VsZWN0aW9uKGNlbGxJZCk7XG4gICAgfSBlbHNlIGlmIChpc0N0cmxLZXkpIHtcbiAgICAgIHRoaXMudG9nZ2xlQ2VsbFNlbGVjdGlvbihjZWxsSWQpO1xuICAgIH0gZWxzZSBpZiAoaXNTaGlmdEtleSkge1xuICAgICAgdGhpcy5zZWxlY3RSYW5nZShjZWxsSWQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUNlbGxNb3VzZUVudGVyKGV2ZW50OiBNb3VzZUV2ZW50LCBjZWxsSWQ6IEMpIHtcbiAgICAvLyBUT0RPIGNoZWNrIGlmIG5leHQgY2VsbCBjYW4gYmUgc2VsZWN0ZWRcblxuICAgIGlmICh0aGlzLmlzU2VsZWN0aW5nICYmIHRoaXMuc2VsZWN0aW9uU3RhcnRDZWxsKSB7XG4gICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbihjZWxsSWQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0RyYWdnaW5nICYmIHRoaXMuZHJhZ1N0YXJ0Q2VsbCkge1xuICAgICAgdGhpcy51cGRhdGVEcmFnZ2VkQ2VsbHMoY2VsbElkKTtcbiAgICB9XG4gIH1cblxuICBlbmRNb3VzZU1vdmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNTZWxlY3RpbmcpIHtcbiAgICAgIHRoaXMucmVzZXRTZWxlY3Rpb25TdGF0ZSgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICB0aGlzLnJlc2V0RHJhZ1N0YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUHJpdmF0ZSBoZWxwZXIgbWV0aG9kc1xuICBwcml2YXRlIHN0YXJ0U2VsZWN0aW9uKGNlbGxJZDogQyk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uU3RhcnRDZWxsID0gY2VsbElkO1xuICAgIHRoaXMuaXNTZWxlY3RpbmcgPSB0cnVlO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbihbY2VsbElkXSwgZmFsc2UsIGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnREcmFnU2VsZWN0aW9uKGNlbGxJZDogQyk6IHZvaWQge1xuICAgIHRoaXMuZHJhZ1N0YXJ0Q2VsbCA9IGNlbGxJZDtcbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgIHRoaXMuZHJhZ2dlZENlbGxzID0gW2NlbGxJZF07XG4gICAgLy8gdGhpcy5lbWl0U2VsZWN0aW9uKFtjZWxsSWRdLCBmYWxzZSwgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVDZWxsU2VsZWN0aW9uKGNlbGxJZDogQyk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRDZWxscyA9IFsuLi50aGlzLnNlbGVjdGVkQ2VsbHNdO1xuICAgIGNvbnN0IGNlbGxJbmRleCA9IGN1cnJlbnRDZWxscy5maW5kSW5kZXgoKGMpID0+IHRoaXMuZXF1YWxzKGMsIGNlbGxJZCkpO1xuXG4gICAgaWYgKGNlbGxJbmRleCA+PSAwKSB7XG4gICAgICBjdXJyZW50Q2VsbHMuc3BsaWNlKGNlbGxJbmRleCwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRDZWxscy5wdXNoKGNlbGxJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKGN1cnJlbnRDZWxscywgZmFsc2UsIHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RSYW5nZShlbmRDZWxsOiBDKTogdm9pZCB7XG4gICAgY29uc3QgcmFuZ2VDZWxscyA9IHRoaXMuY2FsY3VsYXRlUmFuZ2VDZWxscyhlbmRDZWxsKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24ocmFuZ2VDZWxscywgdHJ1ZSwgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTZWxlY3Rpb24oY3VycmVudENlbGw6IEMpOiB2b2lkIHtcbiAgICBjb25zdCByYW5nZUNlbGxzID0gdGhpcy5jYWxjdWxhdGVSYW5nZUJldHdlZW5DZWxscyh0aGlzLnNlbGVjdGlvblN0YXJ0Q2VsbCwgY3VycmVudENlbGwpO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbihyYW5nZUNlbGxzLCB0cnVlLCBmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURyYWdnZWRDZWxscyhjdXJyZW50Q2VsbDogQyk6IHZvaWQge1xuICAgIC8vIHRoaXMuZHJhZ2dlZENlbGxzLnNldChyYW5nZUNlbGxzKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFNlbGVjdGlvbihjZWxsczogQ1tdLCBpc1JhbmdlOiBib29sZWFuLCBpc1RvZ2dsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGVkQ2VsbHMgPSBjZWxscztcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZVN1YmplY3QubmV4dCh7XG4gICAgICBzZWxlY3RlZENlbGxzOiBjZWxscyxcbiAgICAgIGlzUmFuZ2VTZWxlY3Rpb246IGlzUmFuZ2UsXG4gICAgICBpc1RvZ2dsZVNlbGVjdGlvbjogaXNUb2dnbGUsXG4gICAgfSk7XG4gIH1cblxuICBjYWxjdWxhdGVSYW5nZUNlbGxzKGVuZENlbGw6IEMpOiBDW10ge1xuICAgIGlmIChpc0VtcHR5QXJyYXkodGhpcy5zZWxlY3RlZENlbGxzKSkge1xuICAgICAgcmV0dXJuIFtlbmRDZWxsXTtcbiAgICB9XG5cbiAgICBjb25zdCBsYXN0U2VsZWN0ZWRDZWxsID0gdGhpcy5maW5kRmlyc3RTZWxlY3RlZENlbGwodGhpcy5zZWxlY3RlZENlbGxzKTtcbiAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVSYW5nZUJldHdlZW5DZWxscyhsYXN0U2VsZWN0ZWRDZWxsLCBlbmRDZWxsKTtcbiAgfVxuXG4gIGNhbGN1bGF0ZVJhbmdlQmV0d2VlbkNlbGxzKHN0YXJ0Q2VsbDogQywgZW5kQ2VsbDogQyk6IENbXSB7XG4gICAgLy8gR2V0IGZpcnN0IGNlbGwgY29vcmRpbmF0ZXMsIHRoZW4gYWRkIHRoaXMgY2VsbCBhcyBhIHJhbmdlXG4gICAgY29uc3QgZmlyc3RSb3dJZCA9IE1hdGgubWluKHN0YXJ0Q2VsbC5yb3dJZCwgZW5kQ2VsbC5yb3dJZCk7XG4gICAgY29uc3QgbGFzdFJvd0lkID0gTWF0aC5tYXgoc3RhcnRDZWxsLnJvd0lkLCBlbmRDZWxsLnJvd0lkKTtcbiAgICBjb25zdCBzdGFydENvbHVtbkluZGV4ID0gdGhpcy5zZWxlY3RhYmxlQ29sdW1ucy5pbmRleE9mKHN0YXJ0Q2VsbC5jb2x1bW5OYW1lKTtcbiAgICBjb25zdCBlbmRDb2x1bW5JbmRleCA9IHRoaXMuc2VsZWN0YWJsZUNvbHVtbnMuaW5kZXhPZihlbmRDZWxsLmNvbHVtbk5hbWUpO1xuICAgIGNvbnN0IGZpcnN0Q29sdW1uSW5kZXggPSBNYXRoLm1pbihzdGFydENvbHVtbkluZGV4LCBlbmRDb2x1bW5JbmRleCk7XG4gICAgY29uc3QgbGFzdENvbHVtbkluZGV4ID0gTWF0aC5tYXgoc3RhcnRDb2x1bW5JbmRleCwgZW5kQ29sdW1uSW5kZXgpO1xuICAgIC8vIEl0ZXJhdGUgY29sdW1ucyBhbmQgcm93c1xuICAgIGNvbnN0IHJhbmdlQ2VsbHM6IENbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSBmaXJzdENvbHVtbkluZGV4OyBpIDw9IGxhc3RDb2x1bW5JbmRleDsgaSsrKSB7XG4gICAgICBjb25zdCBjb2x1bW5OYW1lID0gdGhpcy5zZWxlY3RhYmxlQ29sdW1uc1tpXTtcbiAgICAgIGZvciAobGV0IHJvd0lkID0gZmlyc3RSb3dJZDsgcm93SWQgPD0gbGFzdFJvd0lkOyByb3dJZCsrKSB7XG4gICAgICAgIHJhbmdlQ2VsbHMucHVzaCh0aGlzLm5ldyh7IHJvd0lkOiByb3dJZCwgY29sdW1uTmFtZTogY29sdW1uTmFtZSB9KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhbmdlQ2VsbHM7XG4gIH1cblxuICByZXNldFNlbGVjdGlvblN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uU3RhcnRDZWxsID0gbnVsbDtcbiAgICB0aGlzLmlzU2VsZWN0aW5nID0gZmFsc2U7XG4gIH1cblxuICByZXNldERyYWdTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRyYWdTdGFydENlbGwgPSBudWxsO1xuICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgIHRoaXMuZHJhZ2dlZENlbGxzID0gW107XG4gIH1cblxuICBwcml2YXRlIGZpbmRGaXJzdFNlbGVjdGVkQ2VsbChzZWxlY3RlZENlbGxzOiBDW10pOiBDIHtcbiAgICAvLyBGaW5kIHRoZSBjZWxsIHdpdGggdGhlIGxvd2VzdCByb3dJZCBhbmQgY29sdW1uSW5kZXhcbiAgICByZXR1cm4gdGhpcy5maW5kU2VsZWN0ZWRDZWxsKFxuICAgICAgc2VsZWN0ZWRDZWxscyxcbiAgICAgIE1hdGgubWluKC4uLnNlbGVjdGVkQ2VsbHMubWFwKChjZWxsKSA9PiBjZWxsLnJvd0lkKSksXG4gICAgICBNYXRoLm1pbiguLi5zZWxlY3RlZENlbGxzLm1hcCgoY2VsbCkgPT4gdGhpcy5zZWxlY3RhYmxlQ29sdW1ucy5pbmRleE9mKGNlbGwuY29sdW1uTmFtZSkpKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRMYXN0U2VsZWN0ZWRDZWxsKHNlbGVjdGVkQ2VsbHM6IENbXSk6IEMge1xuICAgIC8vIEZpbmQgdGhlIGNlbGwgd2l0aCB0aGUgbG93ZXN0IHJvd0lkIGFuZCBjb2x1bW5JbmRleFxuICAgIHJldHVybiB0aGlzLmZpbmRTZWxlY3RlZENlbGwoXG4gICAgICBzZWxlY3RlZENlbGxzLFxuICAgICAgTWF0aC5tYXgoLi4uc2VsZWN0ZWRDZWxscy5tYXAoKGNlbGwpID0+IGNlbGwucm93SWQpKSxcbiAgICAgIE1hdGgubWF4KC4uLnNlbGVjdGVkQ2VsbHMubWFwKChjZWxsKSA9PiB0aGlzLnNlbGVjdGFibGVDb2x1bW5zLmluZGV4T2YoY2VsbC5jb2x1bW5OYW1lKSkpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFNlbGVjdGVkQ2VsbChzZWxlY3RlZENlbGxzOiBDW10sIHJvd0lkOiBudW1iZXIsIGNvbHVtbkluZGV4OiBudW1iZXIpOiBDIHtcbiAgICAvLyBGaW5kIHRoZSBjZWxsIHdpdGggdGhlIGN1cnJlbnQgaW5kZXhlc1xuICAgIHJldHVybiBzZWxlY3RlZENlbGxzLmZpbHRlcigoY2VsbCkgPT4gY2VsbC5yb3dJZCA9PT0gcm93SWQgJiYgY2VsbC5jb2x1bW5OYW1lID09PSB0aGlzLnNlbGVjdGFibGVDb2x1bW5zW2NvbHVtbkluZGV4XSlbMF07XG4gIH1cbn1cbiJdfQ==
@@ -38,11 +38,11 @@ export class ResizableComponent {
38
38
  }
39
39
  }
40
40
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResizableComponent, deps: [{ token: i1.MatColumnDef, optional: true }], target: i0.ɵɵFactoryTarget.Component });
41
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ResizableComponent, selector: "th[resizable]", inputs: { resizable: "resizable" }, outputs: { sizeChanged: "sizeChanged" }, host: { properties: { "style.width": "this.width", "style.min-width": "this.minWidth", "style.max-width": "this.maxWidth" } }, ngImport: i0, template: "<div class=\"wrapper\">\n <div class=\"content\">\n <ng-content></ng-content>\n </div>\n <div class=\"bar\" [class.cdk-visually-hidden]=\"!resizable\" (resizable)=\"onResize($event)\" (fit)=\"onFit()\"></div>\n</div>\n", styles: [":host:last-child .bar{display:none}.wrapper{display:flex;justify-content:flex-end;align-items:center}.content{flex:1}.bar{height:var(--app-table-header-height, 55px);width:10px;justify-self:flex-end;border-left:4px solid transparent;border-right:4px solid transparent;background:var(--ion-color-secondary);background-clip:content-box;cursor:ew-resize;opacity:0;transition:opacity .3s}.bar:hover,.bar:active{opacity:1}:host-context(.mat-table-sticky) .bar{width:12px!important}\n"], dependencies: [{ kind: "directive", type: i2.ResizableDirective, selector: "[resizable]", outputs: ["resizable", "fit"] }] });
41
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ResizableComponent, selector: "th[resizable]", inputs: { resizable: "resizable" }, outputs: { sizeChanged: "sizeChanged" }, host: { properties: { "style.width": "this.width", "style.min-width": "this.minWidth", "style.max-width": "this.maxWidth" } }, ngImport: i0, template: "<div class=\"wrapper\">\n <div class=\"content\">\n <ng-content></ng-content>\n </div>\n <div class=\"bar\" [class.cdk-visually-hidden]=\"!resizable\" (resizable)=\"onResize($event)\" (fit)=\"onFit()\"></div>\n</div>\n", styles: [":host:last-child .bar{display:none}.wrapper{display:flex;justify-content:flex-end;align-items:center;position:relative;height:var(--app-table-header-height, 100%)}.content{flex:1}.bar{position:relative;width:16px;justify-self:flex-end;cursor:ew-resize;opacity:0;transition:opacity .2s ease-in-out}.bar:before{content:\"\";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:2px;height:24px;background:var(--ion-color-medium, #92949c);border-radius:1px;transition:all .2s ease-in-out}.bar:after{content:\"\";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:4px;height:16px;background-image:radial-gradient(circle,var(--ion-color-medium-shade, #808289) 1.5px,transparent 1.5px);background-size:4px 5px;background-position:center;opacity:0;transition:opacity .2s ease-in-out}.bar:hover{opacity:1}.bar:hover:before{background:var(--ion-color-primary, #3880ff);height:32px;width:6px;box-shadow:0 0 8px rgba(var(--ion-color-primary-rgb, 56, 128, 255),.4)}.bar:hover:after{opacity:1}.bar:active{opacity:1}.bar:active:before{background:var(--ion-color-primary-shade, #3171e0);height:40px;width:6px;box-shadow:0 0 12px rgba(var(--ion-color-primary-rgb, 56, 128, 255),.6)}.bar:active:after{opacity:0}:host:hover .bar{opacity:.6}:host-context(.mat-table-sticky) .bar{width:18px}:host-context(.dark-theme) .bar:before,:host-context([color-scheme=dark]) .bar:before{background:var(--ion-color-medium-tint, #a2a4ab)}:host-context(.dark-theme) .bar:hover:before,:host-context([color-scheme=dark]) .bar:hover:before{background:var(--ion-color-primary-tint, #4c8dff)}:host-context(.dark-theme) .bar:active:before,:host-context([color-scheme=dark]) .bar:active:before{background:var(--ion-color-primary, #3880ff)}\n"], dependencies: [{ kind: "directive", type: i2.ResizableDirective, selector: "[resizable]", inputs: ["minWidth"], outputs: ["resizable", "fit"] }] });
42
42
  }
43
43
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResizableComponent, decorators: [{
44
44
  type: Component,
45
- args: [{ selector: 'th[resizable]', template: "<div class=\"wrapper\">\n <div class=\"content\">\n <ng-content></ng-content>\n </div>\n <div class=\"bar\" [class.cdk-visually-hidden]=\"!resizable\" (resizable)=\"onResize($event)\" (fit)=\"onFit()\"></div>\n</div>\n", styles: [":host:last-child .bar{display:none}.wrapper{display:flex;justify-content:flex-end;align-items:center}.content{flex:1}.bar{height:var(--app-table-header-height, 55px);width:10px;justify-self:flex-end;border-left:4px solid transparent;border-right:4px solid transparent;background:var(--ion-color-secondary);background-clip:content-box;cursor:ew-resize;opacity:0;transition:opacity .3s}.bar:hover,.bar:active{opacity:1}:host-context(.mat-table-sticky) .bar{width:12px!important}\n"] }]
45
+ args: [{ selector: 'th[resizable]', template: "<div class=\"wrapper\">\n <div class=\"content\">\n <ng-content></ng-content>\n </div>\n <div class=\"bar\" [class.cdk-visually-hidden]=\"!resizable\" (resizable)=\"onResize($event)\" (fit)=\"onFit()\"></div>\n</div>\n", styles: [":host:last-child .bar{display:none}.wrapper{display:flex;justify-content:flex-end;align-items:center;position:relative;height:var(--app-table-header-height, 100%)}.content{flex:1}.bar{position:relative;width:16px;justify-self:flex-end;cursor:ew-resize;opacity:0;transition:opacity .2s ease-in-out}.bar:before{content:\"\";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:2px;height:24px;background:var(--ion-color-medium, #92949c);border-radius:1px;transition:all .2s ease-in-out}.bar:after{content:\"\";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:4px;height:16px;background-image:radial-gradient(circle,var(--ion-color-medium-shade, #808289) 1.5px,transparent 1.5px);background-size:4px 5px;background-position:center;opacity:0;transition:opacity .2s ease-in-out}.bar:hover{opacity:1}.bar:hover:before{background:var(--ion-color-primary, #3880ff);height:32px;width:6px;box-shadow:0 0 8px rgba(var(--ion-color-primary-rgb, 56, 128, 255),.4)}.bar:hover:after{opacity:1}.bar:active{opacity:1}.bar:active:before{background:var(--ion-color-primary-shade, #3171e0);height:40px;width:6px;box-shadow:0 0 12px rgba(var(--ion-color-primary-rgb, 56, 128, 255),.6)}.bar:active:after{opacity:0}:host:hover .bar{opacity:.6}:host-context(.mat-table-sticky) .bar{width:18px}:host-context(.dark-theme) .bar:before,:host-context([color-scheme=dark]) .bar:before{background:var(--ion-color-medium-tint, #a2a4ab)}:host-context(.dark-theme) .bar:hover:before,:host-context([color-scheme=dark]) .bar:hover:before{background:var(--ion-color-primary-tint, #4c8dff)}:host-context(.dark-theme) .bar:active:before,:host-context([color-scheme=dark]) .bar:active:before{background:var(--ion-color-primary, #3880ff)}\n"] }]
46
46
  }], ctorParameters: () => [{ type: i1.MatColumnDef, decorators: [{
47
47
  type: Optional
48
48
  }] }], propDecorators: { resizable: [{