@sumaris-net/ngx-components 18.23.0-beta.4 → 18.23.1
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/doc/changelog.md +29 -2
- package/esm2022/public_api.mjs +1 -4
- package/esm2022/src/app/core/services/platform.service.mjs +104 -6
- package/esm2022/src/app/core/table/column/actions-column.component.mjs +1 -1
- package/esm2022/src/app/core/table/table.pipes.mjs +7 -6
- package/esm2022/src/app/core/table/testing/table.testing.module.mjs +4 -25
- package/esm2022/src/app/core/table/testing/table2.testing.mjs +15 -63
- package/esm2022/src/app/shared/capacitor/plugins.mjs +2 -1
- package/esm2022/src/app/shared/constants.mjs +2 -2
- package/esm2022/src/app/shared/dates.mjs +52 -20
- package/esm2022/src/app/shared/file/csv.utils.mjs +2 -2
- package/esm2022/src/app/shared/functions.mjs +1 -1
- package/esm2022/src/app/shared/graph/colors.utils.mjs +30 -5
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +3 -3
- package/esm2022/src/app/shared/material/chips/material.chips.mjs +3 -3
- package/esm2022/src/app/shared/regexps.mjs +18 -11
- package/esm2022/src/app/shared/validator/validators.mjs +2 -2
- package/esm2022/src/app/social/feed/feed.component.mjs +3 -3
- package/fesm2022/sumaris-net.ngx-components.mjs +227 -542
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +16 -14
- package/public_api.d.ts +0 -3
- package/src/app/core/services/platform.service.d.ts +10 -1
- package/src/app/core/table/column/actions-column.component.d.ts +1 -1
- package/src/app/core/table/table.pipes.d.ts +1 -2
- package/src/app/core/table/testing/table.testing.module.d.ts +1 -3
- package/src/app/core/table/testing/table2.testing.d.ts +3 -7
- package/src/app/shared/capacitor/plugins.d.ts +1 -0
- package/src/app/shared/dates.d.ts +28 -4
- package/src/app/shared/functions.d.ts +1 -1
- package/src/app/shared/graph/colors.utils.d.ts +17 -0
- package/src/assets/manifest.json +1 -1
- package/src/theme/_ngx-components.scss +12 -0
- package/src/theme/_ngx-components.table.scss +2 -48
- package/esm2022/src/app/shared/directives/cell-selection/cell-identifier.directive.mjs +0 -41
- package/esm2022/src/app/shared/directives/cell-selection/cell-selection.directive.mjs +0 -201
- package/esm2022/src/app/shared/directives/cell-selection/cell-selection.service.mjs +0 -186
- package/src/app/shared/directives/cell-selection/cell-identifier.directive.d.ts +0 -15
- package/src/app/shared/directives/cell-selection/cell-selection.directive.d.ts +0 -28
- package/src/app/shared/directives/cell-selection/cell-selection.service.d.ts +0 -64
|
@@ -1,186 +0,0 @@
|
|
|
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==
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { OnInit } from '@angular/core';
|
|
2
|
-
import { ICellId } from './cell-selection.service';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
export declare class CellIdentifierDirective<C extends ICellId = ICellId> implements OnInit {
|
|
5
|
-
cellId: import("@angular/core").InputSignal<C>;
|
|
6
|
-
protected isCellSelected: boolean;
|
|
7
|
-
protected isDragging: boolean;
|
|
8
|
-
private readonly service;
|
|
9
|
-
private readonly destroyRef;
|
|
10
|
-
ngOnInit(): void;
|
|
11
|
-
protected handleMouseDown(event: MouseEvent): Promise<void>;
|
|
12
|
-
protected handleMouseEnter(event: MouseEvent): Promise<void>;
|
|
13
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<CellIdentifierDirective<any>, never>;
|
|
14
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<CellIdentifierDirective<any>, "[appCellId]", never, { "cellId": { "alias": "appCellId"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
15
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { OnInit } from '@angular/core';
|
|
2
|
-
import { CellSelectionEvent, ICellId } from './cell-selection.service';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
export declare class CellSelectionDirective<C extends ICellId = ICellId> implements OnInit {
|
|
5
|
-
selectableColumns: import("@angular/core").InputSignal<string[]>;
|
|
6
|
-
selectionChange: import("@angular/core").OutputEmitterRef<CellSelectionEvent<C>>;
|
|
7
|
-
rightClick: import("@angular/core").OutputEmitterRef<MouseEvent>;
|
|
8
|
-
protected service: import("./cell-selection.service").CellSelectionService<ICellId>;
|
|
9
|
-
private readonly elementRef;
|
|
10
|
-
private readonly renderer;
|
|
11
|
-
private readonly destroyRef;
|
|
12
|
-
private overlayElements;
|
|
13
|
-
constructor();
|
|
14
|
-
ngOnInit(): void;
|
|
15
|
-
private setupServiceConfiguration;
|
|
16
|
-
private setupGlobalMouseEvents;
|
|
17
|
-
private setupCopyListener;
|
|
18
|
-
addCellsOverlay(cells: C[]): void;
|
|
19
|
-
removeCellsOverlay(): void;
|
|
20
|
-
private groupContiguousCells;
|
|
21
|
-
private getAdjacentCells;
|
|
22
|
-
private getNextColumnName;
|
|
23
|
-
private getCellKey;
|
|
24
|
-
private calculateSelectionBounds;
|
|
25
|
-
private createOverlayElement;
|
|
26
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<CellSelectionDirective<any>, never>;
|
|
27
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<CellSelectionDirective<any>, "[appCellSelection]", never, { "selectableColumns": { "alias": "appSelectableColumns"; "required": false; "isSignal": true; }; }, { "selectionChange": "appCellSelectionChange"; "rightClick": "appCellRightClick"; }, never, never, true, never>;
|
|
28
|
-
}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { InjectionToken } from '@angular/core';
|
|
2
|
-
import { Subject } from 'rxjs';
|
|
3
|
-
import { EqualsFn } from '../../types';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export declare const APP_CELL_SELECTION_SERVICE_TOKEN: InjectionToken<CellSelectionService<ICellId>>;
|
|
6
|
-
export declare const APP_CELL_SELECTION_SERVICE_CONFIG_TOKEN: InjectionToken<CellSelectionServiceConfig<any>>;
|
|
7
|
-
export interface ICellId {
|
|
8
|
-
rowId: number;
|
|
9
|
-
columnName: string;
|
|
10
|
-
}
|
|
11
|
-
export interface CellSelectionEvent<C extends ICellId> {
|
|
12
|
-
selectedCells: C[];
|
|
13
|
-
isRangeSelection: boolean;
|
|
14
|
-
isToggleSelection: boolean;
|
|
15
|
-
}
|
|
16
|
-
export interface CellSelectionServiceConfig<C extends ICellId> {
|
|
17
|
-
equals: EqualsFn<C>;
|
|
18
|
-
new: (cellId: ICellId) => C;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Service to manage cell selection state across multiple directive instances.
|
|
22
|
-
* This service should be provided at the component level (not root) to ensure
|
|
23
|
-
* proper isolation between different table instances.
|
|
24
|
-
*/
|
|
25
|
-
export declare class CellSelectionService<C extends ICellId = ICellId> {
|
|
26
|
-
config: CellSelectionServiceConfig<any>;
|
|
27
|
-
selectableColumns: string[];
|
|
28
|
-
private _selectedCells;
|
|
29
|
-
private selectionStartCell;
|
|
30
|
-
private isSelecting;
|
|
31
|
-
draggedCells: C[];
|
|
32
|
-
private dragStartCell;
|
|
33
|
-
private isDragging;
|
|
34
|
-
readonly selectionChangeSubject: Subject<CellSelectionEvent<C>>;
|
|
35
|
-
readonly selectionRightClickSubject: Subject<MouseEvent>;
|
|
36
|
-
private readonly _equals;
|
|
37
|
-
private readonly _new;
|
|
38
|
-
constructor();
|
|
39
|
-
equals(cell1: C, cell2: C): boolean;
|
|
40
|
-
new(cellId: ICellId): C;
|
|
41
|
-
get selectedCells(): C[];
|
|
42
|
-
set selectedCells(value: C[]);
|
|
43
|
-
isCellSelected(cellId: C): boolean;
|
|
44
|
-
isCellDragged(cellId: C): boolean;
|
|
45
|
-
handleCellMouseDown(event: MouseEvent, cellId: C): Promise<void>;
|
|
46
|
-
handleCellMouseEnter(event: MouseEvent, cellId: C): Promise<void>;
|
|
47
|
-
endMouseMove(): void;
|
|
48
|
-
private startSelection;
|
|
49
|
-
private startDragSelection;
|
|
50
|
-
private toggleCellSelection;
|
|
51
|
-
private selectRange;
|
|
52
|
-
private updateSelection;
|
|
53
|
-
private updateDraggedCells;
|
|
54
|
-
private emitSelection;
|
|
55
|
-
calculateRangeCells(endCell: C): C[];
|
|
56
|
-
calculateRangeBetweenCells(startCell: C, endCell: C): C[];
|
|
57
|
-
resetSelectionState(): void;
|
|
58
|
-
resetDragState(): void;
|
|
59
|
-
private findFirstSelectedCell;
|
|
60
|
-
private findLastSelectedCell;
|
|
61
|
-
private findSelectedCell;
|
|
62
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<CellSelectionService<any>, never>;
|
|
63
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<CellSelectionService<any>>;
|
|
64
|
-
}
|