@sumaris-net/ngx-components 18.23.0-beta.0 → 18.23.0-beta.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.
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, Directive, Pipe, Injectable, EventEmitter, Output, Optional, Inject, inject, NgModule, forwardRef, booleanAttribute, Component, ChangeDetectionStrategy, Input, ViewChildren, HostBinding, HostListener, ElementRef, numberAttribute, ViewChild, ANIMATION_MODULE_TYPE, RendererStyleFlags2, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectorRef, Self, ViewEncapsulation, APP_INITIALIZER,
|
|
2
|
+
import { InjectionToken, Directive, Pipe, Injectable, EventEmitter, Output, Optional, Inject, inject, NgModule, forwardRef, booleanAttribute, Component, ChangeDetectionStrategy, Input, ViewChildren, HostBinding, HostListener, ElementRef, numberAttribute, ViewChild, ANIMATION_MODULE_TYPE, RendererStyleFlags2, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectorRef, Self, ViewEncapsulation, APP_INITIALIZER, input, output, Renderer2, DestroyRef, SecurityContext, viewChild, signal, model, computed, effect, untracked } from '@angular/core';
|
|
3
3
|
import { firstValueFrom, shareReplay, tap, of, timer, Subject, merge, delay, isObservable, from, Subscription, BehaviorSubject, fromEvent, noop as noop$9, Observable, forkJoin, timeout, defer, combineLatest, debounceTime as debounceTime$1, distinctUntilChanged as distinctUntilChanged$1, interval, mergeMap as mergeMap$1, switchMap as switchMap$1, EMPTY } from 'rxjs';
|
|
4
4
|
import { catchError, map, filter, takeUntil, first, switchMap, tap as tap$1, throttleTime, debounceTime, startWith, distinctUntilChanged, mergeMap, skip, finalize, distinctUntilKeyChanged, bufferWhen, take } from 'rxjs/operators';
|
|
5
5
|
import * as cloneImported from 'clone';
|
|
@@ -153,11 +153,11 @@ import * as i3$5 from '@angular/cdk/clipboard';
|
|
|
153
153
|
import { select } from '@rx-angular/state/selections';
|
|
154
154
|
import { isDataSource, SelectionModel } from '@angular/cdk/collections';
|
|
155
155
|
import { Camera, CameraResultType } from '@capacitor/camera';
|
|
156
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
156
157
|
import { Geolocation } from '@capacitor/geolocation';
|
|
157
158
|
import * as i1$8 from '@e-is/ngx-material-table';
|
|
158
159
|
import { ValidatorService, TableDataSource, AsyncTableDataSource } from '@e-is/ngx-material-table';
|
|
159
160
|
import 'moment-timezone';
|
|
160
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
161
161
|
|
|
162
162
|
const ENVIRONMENT = new InjectionToken('ENV');
|
|
163
163
|
class Environment {
|
|
@@ -28364,6 +28364,414 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
28364
28364
|
}]
|
|
28365
28365
|
}] });
|
|
28366
28366
|
|
|
28367
|
+
const APP_CELL_SELECTION_SERVICE_TOKEN = new InjectionToken('CellSelectionService');
|
|
28368
|
+
const APP_CELL_SELECTION_SERVICE_CONFIG_TOKEN = new InjectionToken('CellSelectionServiceConfig');
|
|
28369
|
+
/**
|
|
28370
|
+
* Service to manage cell selection state across multiple directive instances.
|
|
28371
|
+
* This service should be provided at the component level (not root) to ensure
|
|
28372
|
+
* proper isolation between different table instances.
|
|
28373
|
+
*/
|
|
28374
|
+
class CellSelectionService {
|
|
28375
|
+
// Configuration
|
|
28376
|
+
config = inject(APP_CELL_SELECTION_SERVICE_CONFIG_TOKEN, { optional: true });
|
|
28377
|
+
selectableColumns = [];
|
|
28378
|
+
// Selection state
|
|
28379
|
+
selectedCells = [];
|
|
28380
|
+
selectionStartCell = null;
|
|
28381
|
+
isSelecting = false;
|
|
28382
|
+
// Drag state
|
|
28383
|
+
draggedCells = [];
|
|
28384
|
+
dragStartCell = null;
|
|
28385
|
+
isDragging = false;
|
|
28386
|
+
// Observables
|
|
28387
|
+
selectionChangeSubject = new Subject();
|
|
28388
|
+
selectionRightClickSubject = new Subject();
|
|
28389
|
+
// Overridable methods
|
|
28390
|
+
_equals;
|
|
28391
|
+
_new;
|
|
28392
|
+
constructor() {
|
|
28393
|
+
this._equals = this.config?.equals;
|
|
28394
|
+
this._new = this.config?.new;
|
|
28395
|
+
}
|
|
28396
|
+
// Override method
|
|
28397
|
+
equals(cell1, cell2) {
|
|
28398
|
+
return this._equals ? this._equals(cell1, cell2) : cell1?.rowId === cell2?.rowId && cell1?.columnName === cell2?.columnName;
|
|
28399
|
+
}
|
|
28400
|
+
// Override method
|
|
28401
|
+
new(cellId) {
|
|
28402
|
+
return this._new ? this._new(cellId) : cellId;
|
|
28403
|
+
}
|
|
28404
|
+
isCellSelected(cellId) {
|
|
28405
|
+
return this.selectedCells.some((selectedCell) => this.equals(selectedCell, cellId));
|
|
28406
|
+
}
|
|
28407
|
+
isCellDragged(cellId) {
|
|
28408
|
+
return this.draggedCells.some((selectedCell) => this.equals(selectedCell, cellId));
|
|
28409
|
+
}
|
|
28410
|
+
// Core selection logic (moved from CellIdentifierDirective)
|
|
28411
|
+
async handleCellMouseDown(event, cellId) {
|
|
28412
|
+
event.preventDefault();
|
|
28413
|
+
if (event.button === 2) {
|
|
28414
|
+
event.stopPropagation();
|
|
28415
|
+
this.selectionRightClickSubject.next(event);
|
|
28416
|
+
return;
|
|
28417
|
+
}
|
|
28418
|
+
const isCtrlKey = event.ctrlKey || event.metaKey;
|
|
28419
|
+
const isShiftKey = event.shiftKey;
|
|
28420
|
+
if (!isShiftKey && !isCtrlKey) {
|
|
28421
|
+
this.startSelection(cellId);
|
|
28422
|
+
// this.startDragSelection(cellId);
|
|
28423
|
+
}
|
|
28424
|
+
else if (isCtrlKey) {
|
|
28425
|
+
this.toggleCellSelection(cellId);
|
|
28426
|
+
}
|
|
28427
|
+
else if (isShiftKey) {
|
|
28428
|
+
this.selectRange(cellId);
|
|
28429
|
+
}
|
|
28430
|
+
}
|
|
28431
|
+
async handleCellMouseEnter(event, cellId) {
|
|
28432
|
+
// TODO check if next cell can be selected
|
|
28433
|
+
if (this.isSelecting && this.selectionStartCell) {
|
|
28434
|
+
this.updateSelection(cellId);
|
|
28435
|
+
}
|
|
28436
|
+
else if (this.isDragging && this.dragStartCell) {
|
|
28437
|
+
this.updateDraggedCells(cellId);
|
|
28438
|
+
}
|
|
28439
|
+
}
|
|
28440
|
+
endMouseMove() {
|
|
28441
|
+
if (this.isSelecting) {
|
|
28442
|
+
this.resetSelectionState();
|
|
28443
|
+
}
|
|
28444
|
+
else if (this.isDragging) {
|
|
28445
|
+
this.resetDragState();
|
|
28446
|
+
}
|
|
28447
|
+
}
|
|
28448
|
+
// Private helper methods
|
|
28449
|
+
startSelection(cellId) {
|
|
28450
|
+
this.selectionStartCell = cellId;
|
|
28451
|
+
this.isSelecting = true;
|
|
28452
|
+
this.emitSelection([cellId], false, false);
|
|
28453
|
+
}
|
|
28454
|
+
startDragSelection(cellId) {
|
|
28455
|
+
this.dragStartCell = cellId;
|
|
28456
|
+
this.isDragging = true;
|
|
28457
|
+
this.draggedCells = [cellId];
|
|
28458
|
+
// this.emitSelection([cellId], false, false);
|
|
28459
|
+
}
|
|
28460
|
+
toggleCellSelection(cellId) {
|
|
28461
|
+
const currentCells = [...this.selectedCells];
|
|
28462
|
+
const cellIndex = currentCells.findIndex((c) => this.equals(c, cellId));
|
|
28463
|
+
if (cellIndex >= 0) {
|
|
28464
|
+
currentCells.splice(cellIndex, 1);
|
|
28465
|
+
}
|
|
28466
|
+
else {
|
|
28467
|
+
currentCells.push(cellId);
|
|
28468
|
+
}
|
|
28469
|
+
this.emitSelection(currentCells, false, true);
|
|
28470
|
+
}
|
|
28471
|
+
selectRange(endCell) {
|
|
28472
|
+
const rangeCells = this.calculateRangeCells(endCell);
|
|
28473
|
+
this.emitSelection(rangeCells, true, false);
|
|
28474
|
+
}
|
|
28475
|
+
updateSelection(currentCell) {
|
|
28476
|
+
const rangeCells = this.calculateRangeBetweenCells(this.selectionStartCell, currentCell);
|
|
28477
|
+
this.emitSelection(rangeCells, true, false);
|
|
28478
|
+
}
|
|
28479
|
+
updateDraggedCells(currentCell) {
|
|
28480
|
+
// this.draggedCells.set(rangeCells);
|
|
28481
|
+
}
|
|
28482
|
+
emitSelection(cells, isRange, isToggle) {
|
|
28483
|
+
this.selectedCells = cells;
|
|
28484
|
+
this.selectionChangeSubject.next({
|
|
28485
|
+
selectedCells: cells,
|
|
28486
|
+
isRangeSelection: isRange,
|
|
28487
|
+
isToggleSelection: isToggle,
|
|
28488
|
+
});
|
|
28489
|
+
}
|
|
28490
|
+
calculateRangeCells(endCell) {
|
|
28491
|
+
if (isEmptyArray(this.selectedCells)) {
|
|
28492
|
+
return [endCell];
|
|
28493
|
+
}
|
|
28494
|
+
const lastSelectedCell = this.findFirstSelectedCell(this.selectedCells);
|
|
28495
|
+
return this.calculateRangeBetweenCells(lastSelectedCell, endCell);
|
|
28496
|
+
}
|
|
28497
|
+
calculateRangeBetweenCells(startCell, endCell) {
|
|
28498
|
+
// Get first cell coordinates, then add this cell as a range
|
|
28499
|
+
const firstRowId = Math.min(startCell.rowId, endCell.rowId);
|
|
28500
|
+
const lastRowId = Math.max(startCell.rowId, endCell.rowId);
|
|
28501
|
+
const startColumnIndex = this.selectableColumns.indexOf(startCell.columnName);
|
|
28502
|
+
const endColumnIndex = this.selectableColumns.indexOf(endCell.columnName);
|
|
28503
|
+
const firstColumnIndex = Math.min(startColumnIndex, endColumnIndex);
|
|
28504
|
+
const lastColumnIndex = Math.max(startColumnIndex, endColumnIndex);
|
|
28505
|
+
// Iterate columns and rows
|
|
28506
|
+
const rangeCells = [];
|
|
28507
|
+
for (let i = firstColumnIndex; i <= lastColumnIndex; i++) {
|
|
28508
|
+
const columnName = this.selectableColumns[i];
|
|
28509
|
+
for (let rowId = firstRowId; rowId <= lastRowId; rowId++) {
|
|
28510
|
+
rangeCells.push(this.new({ rowId: rowId, columnName: columnName }));
|
|
28511
|
+
}
|
|
28512
|
+
}
|
|
28513
|
+
return rangeCells;
|
|
28514
|
+
}
|
|
28515
|
+
resetSelectionState() {
|
|
28516
|
+
this.selectionStartCell = null;
|
|
28517
|
+
this.isSelecting = false;
|
|
28518
|
+
}
|
|
28519
|
+
resetDragState() {
|
|
28520
|
+
this.dragStartCell = null;
|
|
28521
|
+
this.isDragging = false;
|
|
28522
|
+
this.draggedCells = [];
|
|
28523
|
+
}
|
|
28524
|
+
findFirstSelectedCell(selectedCells) {
|
|
28525
|
+
// Find the cell with the lowest rowId and columnIndex
|
|
28526
|
+
return this.findSelectedCell(selectedCells, Math.min(...selectedCells.map((cell) => cell.rowId)), Math.min(...selectedCells.map((cell) => this.selectableColumns.indexOf(cell.columnName))));
|
|
28527
|
+
}
|
|
28528
|
+
findLastSelectedCell(selectedCells) {
|
|
28529
|
+
// Find the cell with the lowest rowId and columnIndex
|
|
28530
|
+
return this.findSelectedCell(selectedCells, Math.max(...selectedCells.map((cell) => cell.rowId)), Math.max(...selectedCells.map((cell) => this.selectableColumns.indexOf(cell.columnName))));
|
|
28531
|
+
}
|
|
28532
|
+
findSelectedCell(selectedCells, rowId, columnIndex) {
|
|
28533
|
+
// Find the cell with the current indexes
|
|
28534
|
+
return selectedCells.filter((cell) => cell.rowId === rowId && cell.columnName === this.selectableColumns[columnIndex])[0];
|
|
28535
|
+
}
|
|
28536
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellSelectionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
28537
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellSelectionService });
|
|
28538
|
+
}
|
|
28539
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellSelectionService, decorators: [{
|
|
28540
|
+
type: Injectable
|
|
28541
|
+
}], ctorParameters: () => [] });
|
|
28542
|
+
|
|
28543
|
+
class CellSelectionDirective {
|
|
28544
|
+
// Inputs
|
|
28545
|
+
// eslint-disable-next-line @angular-eslint/no-input-rename
|
|
28546
|
+
selectableColumns = input.required({ alias: 'appSelectableColumns' });
|
|
28547
|
+
// Outputs
|
|
28548
|
+
// eslint-disable-next-line @angular-eslint/no-output-rename
|
|
28549
|
+
selectionChange = output({ alias: 'appCellSelectionChange' });
|
|
28550
|
+
// eslint-disable-next-line @angular-eslint/no-output-rename
|
|
28551
|
+
rightClick = output({ alias: 'appCellRightClick' });
|
|
28552
|
+
// Inject service by token
|
|
28553
|
+
service = inject(APP_CELL_SELECTION_SERVICE_TOKEN);
|
|
28554
|
+
elementRef = inject(ElementRef);
|
|
28555
|
+
renderer = inject(Renderer2);
|
|
28556
|
+
destroyRef = inject(DestroyRef);
|
|
28557
|
+
overlayElements = [];
|
|
28558
|
+
constructor() { }
|
|
28559
|
+
ngOnInit() {
|
|
28560
|
+
// Initialize service with selectable columns
|
|
28561
|
+
this.setupServiceConfiguration();
|
|
28562
|
+
// Setup global mouseup listener
|
|
28563
|
+
this.setupGlobalMouseEvents();
|
|
28564
|
+
// Setup keyboard listener for copy (for test)
|
|
28565
|
+
// this.setupCopyListener();
|
|
28566
|
+
}
|
|
28567
|
+
setupServiceConfiguration() {
|
|
28568
|
+
// Pass selectable columns to service
|
|
28569
|
+
this.service.selectableColumns = this.selectableColumns();
|
|
28570
|
+
// Listen to service selection changes and emit
|
|
28571
|
+
this.service.selectionChangeSubject
|
|
28572
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
28573
|
+
.subscribe((event) => this.selectionChange.emit(event));
|
|
28574
|
+
// Listen to right-click event
|
|
28575
|
+
this.service.selectionRightClickSubject.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => this.rightClick.emit(event));
|
|
28576
|
+
}
|
|
28577
|
+
setupGlobalMouseEvents() {
|
|
28578
|
+
fromEvent(document, 'mouseup')
|
|
28579
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
28580
|
+
.subscribe(() => this.service.endMouseMove());
|
|
28581
|
+
}
|
|
28582
|
+
// For test purpose only (type CTRL+C)
|
|
28583
|
+
setupCopyListener() {
|
|
28584
|
+
fromEvent(document, 'keydown')
|
|
28585
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
28586
|
+
.subscribe((event) => {
|
|
28587
|
+
if ((event.ctrlKey || event.metaKey) && event.key === 'c') {
|
|
28588
|
+
const cells = this.service.selectedCells;
|
|
28589
|
+
if (isNotEmptyArray(cells)) {
|
|
28590
|
+
// Show overlay
|
|
28591
|
+
this.addCellsOverlay(cells);
|
|
28592
|
+
event.preventDefault();
|
|
28593
|
+
// Hide overlay after animation completes (1 second)
|
|
28594
|
+
setTimeout(() => {
|
|
28595
|
+
this.removeCellsOverlay();
|
|
28596
|
+
}, 1000);
|
|
28597
|
+
}
|
|
28598
|
+
}
|
|
28599
|
+
});
|
|
28600
|
+
}
|
|
28601
|
+
addCellsOverlay(cells) {
|
|
28602
|
+
// Remove existing overlays
|
|
28603
|
+
this.removeCellsOverlay();
|
|
28604
|
+
// Group cells into contiguous regions
|
|
28605
|
+
const cellGroups = this.groupContiguousCells(cells);
|
|
28606
|
+
// Create and render overlay for each contiguous region
|
|
28607
|
+
cellGroups.forEach((group) => {
|
|
28608
|
+
const bounds = this.calculateSelectionBounds(group);
|
|
28609
|
+
if (bounds) {
|
|
28610
|
+
const overlay = this.createOverlayElement(bounds);
|
|
28611
|
+
this.renderer.appendChild(this.elementRef.nativeElement, overlay);
|
|
28612
|
+
this.overlayElements.push(overlay);
|
|
28613
|
+
}
|
|
28614
|
+
});
|
|
28615
|
+
}
|
|
28616
|
+
removeCellsOverlay() {
|
|
28617
|
+
this.overlayElements.forEach((overlay) => {
|
|
28618
|
+
this.renderer.removeChild(this.elementRef.nativeElement, overlay);
|
|
28619
|
+
});
|
|
28620
|
+
this.overlayElements = [];
|
|
28621
|
+
}
|
|
28622
|
+
groupContiguousCells(cells) {
|
|
28623
|
+
// Create a map for quick lookup
|
|
28624
|
+
const cellMap = new Map();
|
|
28625
|
+
cells.forEach((cell) => {
|
|
28626
|
+
cellMap.set(this.getCellKey(cell), cell);
|
|
28627
|
+
});
|
|
28628
|
+
const visited = new Set();
|
|
28629
|
+
const groups = [];
|
|
28630
|
+
// Process each cell
|
|
28631
|
+
cells.forEach((cell) => {
|
|
28632
|
+
const key = this.getCellKey(cell);
|
|
28633
|
+
if (visited.has(key)) {
|
|
28634
|
+
return;
|
|
28635
|
+
}
|
|
28636
|
+
// Start a new contiguous group with flood-fill
|
|
28637
|
+
const group = [];
|
|
28638
|
+
const queue = [cell];
|
|
28639
|
+
visited.add(key);
|
|
28640
|
+
while (queue.length > 0) {
|
|
28641
|
+
const current = queue.shift();
|
|
28642
|
+
group.push(current);
|
|
28643
|
+
// Check all 4 adjacent cells (up, down, left, right)
|
|
28644
|
+
const neighbors = this.getAdjacentCells(current);
|
|
28645
|
+
neighbors.forEach((neighbor) => {
|
|
28646
|
+
const neighborKey = this.getCellKey(neighbor);
|
|
28647
|
+
if (cellMap.has(neighborKey) && !visited.has(neighborKey)) {
|
|
28648
|
+
visited.add(neighborKey);
|
|
28649
|
+
queue.push(neighbor);
|
|
28650
|
+
}
|
|
28651
|
+
});
|
|
28652
|
+
}
|
|
28653
|
+
groups.push(group);
|
|
28654
|
+
});
|
|
28655
|
+
return groups;
|
|
28656
|
+
}
|
|
28657
|
+
getAdjacentCells(cell) {
|
|
28658
|
+
// Returns cells adjacent to the current cell (up, down, left, right)
|
|
28659
|
+
// Note: We need to get column order from the actual table structure
|
|
28660
|
+
// For now, we'll use a simple approach based on rowId adjacency
|
|
28661
|
+
return [
|
|
28662
|
+
{ rowId: cell.rowId - 1, columnName: cell.columnName }, // up
|
|
28663
|
+
{ rowId: cell.rowId + 1, columnName: cell.columnName }, // down
|
|
28664
|
+
{ rowId: cell.rowId, columnName: this.getNextColumnName(cell.columnName, -1) }, // left
|
|
28665
|
+
{ rowId: cell.rowId, columnName: this.getNextColumnName(cell.columnName, 1) }, // right
|
|
28666
|
+
].filter((c) => c.columnName !== null);
|
|
28667
|
+
}
|
|
28668
|
+
getNextColumnName(currentColumnName, offset) {
|
|
28669
|
+
const columns = this.service.selectableColumns;
|
|
28670
|
+
const currentIndex = columns.indexOf(currentColumnName);
|
|
28671
|
+
if (currentIndex === -1) {
|
|
28672
|
+
return null;
|
|
28673
|
+
}
|
|
28674
|
+
const newIndex = currentIndex + offset;
|
|
28675
|
+
if (newIndex < 0 || newIndex >= columns.length) {
|
|
28676
|
+
return null;
|
|
28677
|
+
}
|
|
28678
|
+
return columns[newIndex];
|
|
28679
|
+
}
|
|
28680
|
+
getCellKey(cell) {
|
|
28681
|
+
return `${cell.rowId}-${cell.columnName}`;
|
|
28682
|
+
}
|
|
28683
|
+
calculateSelectionBounds(cells) {
|
|
28684
|
+
const container = this.elementRef.nativeElement;
|
|
28685
|
+
// Find all selected cell elements
|
|
28686
|
+
const cellElements = [];
|
|
28687
|
+
cells.forEach((cell) => {
|
|
28688
|
+
const cellElement = container.querySelector(`[data-row-id="${cell.rowId}"][data-column-name="${cell.columnName}"]`);
|
|
28689
|
+
if (cellElement) {
|
|
28690
|
+
cellElements.push(cellElement);
|
|
28691
|
+
}
|
|
28692
|
+
});
|
|
28693
|
+
if (isEmptyArray(cellElements)) {
|
|
28694
|
+
return null;
|
|
28695
|
+
}
|
|
28696
|
+
// Get container position
|
|
28697
|
+
const containerRect = container.getBoundingClientRect();
|
|
28698
|
+
// Calculate bounding box
|
|
28699
|
+
let minTop = Infinity;
|
|
28700
|
+
let minLeft = Infinity;
|
|
28701
|
+
let maxBottom = -Infinity;
|
|
28702
|
+
let maxRight = -Infinity;
|
|
28703
|
+
cellElements.forEach((element) => {
|
|
28704
|
+
const rect = element.getBoundingClientRect();
|
|
28705
|
+
minTop = Math.min(minTop, rect.top - containerRect.top);
|
|
28706
|
+
minLeft = Math.min(minLeft, rect.left - containerRect.left);
|
|
28707
|
+
maxBottom = Math.max(maxBottom, rect.bottom - containerRect.top);
|
|
28708
|
+
maxRight = Math.max(maxRight, rect.right - containerRect.left);
|
|
28709
|
+
});
|
|
28710
|
+
return {
|
|
28711
|
+
top: minTop,
|
|
28712
|
+
left: minLeft,
|
|
28713
|
+
width: maxRight - minLeft,
|
|
28714
|
+
height: maxBottom - minTop,
|
|
28715
|
+
};
|
|
28716
|
+
}
|
|
28717
|
+
createOverlayElement(bounds) {
|
|
28718
|
+
const overlay = this.renderer.createElement('div');
|
|
28719
|
+
this.renderer.addClass(overlay, 'cell-selection-overlay');
|
|
28720
|
+
// Set position and size
|
|
28721
|
+
this.renderer.setStyle(overlay, 'top', `${bounds.top}px`);
|
|
28722
|
+
this.renderer.setStyle(overlay, 'left', `${bounds.left}px`);
|
|
28723
|
+
this.renderer.setStyle(overlay, 'width', `${bounds.width}px`);
|
|
28724
|
+
this.renderer.setStyle(overlay, 'height', `${bounds.height}px`);
|
|
28725
|
+
return overlay;
|
|
28726
|
+
}
|
|
28727
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellSelectionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
28728
|
+
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: true, transformFunction: null } }, outputs: { selectionChange: "appCellSelectionChange", rightClick: "appCellRightClick" }, ngImport: i0 });
|
|
28729
|
+
}
|
|
28730
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellSelectionDirective, decorators: [{
|
|
28731
|
+
type: Directive,
|
|
28732
|
+
args: [{
|
|
28733
|
+
selector: '[appCellSelection]',
|
|
28734
|
+
standalone: true,
|
|
28735
|
+
}]
|
|
28736
|
+
}], ctorParameters: () => [] });
|
|
28737
|
+
|
|
28738
|
+
class CellIdentifierDirective {
|
|
28739
|
+
cellId = input.required({ alias: 'appCellId' });
|
|
28740
|
+
isCellSelected = false;
|
|
28741
|
+
isDragging = false;
|
|
28742
|
+
service = inject(APP_CELL_SELECTION_SERVICE_TOKEN);
|
|
28743
|
+
destroyRef = inject(DestroyRef);
|
|
28744
|
+
ngOnInit() {
|
|
28745
|
+
// Listen to service selection changes and emit
|
|
28746
|
+
this.service.selectionChangeSubject
|
|
28747
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
28748
|
+
.subscribe(() => (this.isCellSelected = this.service.isCellSelected(this.cellId())));
|
|
28749
|
+
}
|
|
28750
|
+
async handleMouseDown(event) {
|
|
28751
|
+
await this.service.handleCellMouseDown(event, this.cellId());
|
|
28752
|
+
}
|
|
28753
|
+
async handleMouseEnter(event) {
|
|
28754
|
+
await this.service.handleCellMouseEnter(event, this.cellId());
|
|
28755
|
+
}
|
|
28756
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellIdentifierDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
28757
|
+
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 });
|
|
28758
|
+
}
|
|
28759
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellIdentifierDirective, decorators: [{
|
|
28760
|
+
type: Directive,
|
|
28761
|
+
args: [{
|
|
28762
|
+
selector: '[appCellId]',
|
|
28763
|
+
standalone: true,
|
|
28764
|
+
host: {
|
|
28765
|
+
'(mousedown)': 'handleMouseDown($event)',
|
|
28766
|
+
'(mouseenter)': 'handleMouseEnter($event)',
|
|
28767
|
+
'[class.cell-selected]': 'isCellSelected',
|
|
28768
|
+
'[class.cell-dragging]': 'isDragging',
|
|
28769
|
+
'[attr.data-row-id]': 'cellId().rowId',
|
|
28770
|
+
'[attr.data-column-name]': 'cellId().columnName',
|
|
28771
|
+
},
|
|
28772
|
+
}]
|
|
28773
|
+
}] });
|
|
28774
|
+
|
|
28367
28775
|
/**
|
|
28368
28776
|
* Merges two LoadResult objects into a single LoadResult object by combining their data arrays and summing their total counts.
|
|
28369
28777
|
*
|
|
@@ -50137,414 +50545,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
50137
50545
|
type: Injectable
|
|
50138
50546
|
}], ctorParameters: () => [{ type: i1$3.UntypedFormBuilder }] });
|
|
50139
50547
|
|
|
50140
|
-
const APP_CELL_SELECTION_SERVICE_TOKEN = new InjectionToken('CellSelectionService');
|
|
50141
|
-
const APP_CELL_SELECTION_SERVICE_CONFIG_TOKEN = new InjectionToken('CellSelectionServiceConfig');
|
|
50142
|
-
/**
|
|
50143
|
-
* Service to manage cell selection state across multiple directive instances.
|
|
50144
|
-
* This service should be provided at the component level (not root) to ensure
|
|
50145
|
-
* proper isolation between different table instances.
|
|
50146
|
-
*/
|
|
50147
|
-
class CellSelectionService {
|
|
50148
|
-
// Configuration
|
|
50149
|
-
config = inject(APP_CELL_SELECTION_SERVICE_CONFIG_TOKEN, { optional: true });
|
|
50150
|
-
selectableColumns = [];
|
|
50151
|
-
// Selection state
|
|
50152
|
-
selectedCells = [];
|
|
50153
|
-
selectionStartCell = null;
|
|
50154
|
-
isSelecting = false;
|
|
50155
|
-
// Drag state
|
|
50156
|
-
draggedCells = [];
|
|
50157
|
-
dragStartCell = null;
|
|
50158
|
-
isDragging = false;
|
|
50159
|
-
// Observables
|
|
50160
|
-
selectionChangeSubject = new Subject();
|
|
50161
|
-
selectionRightClickSubject = new Subject();
|
|
50162
|
-
// Overridable methods
|
|
50163
|
-
_equals;
|
|
50164
|
-
_new;
|
|
50165
|
-
constructor() {
|
|
50166
|
-
this._equals = this.config?.equals;
|
|
50167
|
-
this._new = this.config?.new;
|
|
50168
|
-
}
|
|
50169
|
-
// Override method
|
|
50170
|
-
equals(cell1, cell2) {
|
|
50171
|
-
return this._equals ? this._equals(cell1, cell2) : cell1?.rowId === cell2?.rowId && cell1?.columnName === cell2?.columnName;
|
|
50172
|
-
}
|
|
50173
|
-
// Override method
|
|
50174
|
-
new(cellId) {
|
|
50175
|
-
return this._new ? this._new(cellId) : cellId;
|
|
50176
|
-
}
|
|
50177
|
-
isCellSelected(cellId) {
|
|
50178
|
-
return this.selectedCells.some((selectedCell) => this.equals(selectedCell, cellId));
|
|
50179
|
-
}
|
|
50180
|
-
isCellDragged(cellId) {
|
|
50181
|
-
return this.draggedCells.some((selectedCell) => this.equals(selectedCell, cellId));
|
|
50182
|
-
}
|
|
50183
|
-
// Core selection logic (moved from CellIdentifierDirective)
|
|
50184
|
-
async handleCellMouseDown(event, cellId) {
|
|
50185
|
-
event.preventDefault();
|
|
50186
|
-
if (event.button === 2) {
|
|
50187
|
-
event.stopPropagation();
|
|
50188
|
-
this.selectionRightClickSubject.next(event);
|
|
50189
|
-
return;
|
|
50190
|
-
}
|
|
50191
|
-
const isCtrlKey = event.ctrlKey || event.metaKey;
|
|
50192
|
-
const isShiftKey = event.shiftKey;
|
|
50193
|
-
if (!isShiftKey && !isCtrlKey) {
|
|
50194
|
-
this.startSelection(cellId);
|
|
50195
|
-
// this.startDragSelection(cellId);
|
|
50196
|
-
}
|
|
50197
|
-
else if (isCtrlKey) {
|
|
50198
|
-
this.toggleCellSelection(cellId);
|
|
50199
|
-
}
|
|
50200
|
-
else if (isShiftKey) {
|
|
50201
|
-
this.selectRange(cellId);
|
|
50202
|
-
}
|
|
50203
|
-
}
|
|
50204
|
-
async handleCellMouseEnter(event, cellId) {
|
|
50205
|
-
// TODO check if next cell can be selected
|
|
50206
|
-
if (this.isSelecting && this.selectionStartCell) {
|
|
50207
|
-
this.updateSelection(cellId);
|
|
50208
|
-
}
|
|
50209
|
-
else if (this.isDragging && this.dragStartCell) {
|
|
50210
|
-
this.updateDraggedCells(cellId);
|
|
50211
|
-
}
|
|
50212
|
-
}
|
|
50213
|
-
endMouseMove() {
|
|
50214
|
-
if (this.isSelecting) {
|
|
50215
|
-
this.resetSelectionState();
|
|
50216
|
-
}
|
|
50217
|
-
else if (this.isDragging) {
|
|
50218
|
-
this.resetDragState();
|
|
50219
|
-
}
|
|
50220
|
-
}
|
|
50221
|
-
// Private helper methods
|
|
50222
|
-
startSelection(cellId) {
|
|
50223
|
-
this.selectionStartCell = cellId;
|
|
50224
|
-
this.isSelecting = true;
|
|
50225
|
-
this.emitSelection([cellId], false, false);
|
|
50226
|
-
}
|
|
50227
|
-
startDragSelection(cellId) {
|
|
50228
|
-
this.dragStartCell = cellId;
|
|
50229
|
-
this.isDragging = true;
|
|
50230
|
-
this.draggedCells = [cellId];
|
|
50231
|
-
// this.emitSelection([cellId], false, false);
|
|
50232
|
-
}
|
|
50233
|
-
toggleCellSelection(cellId) {
|
|
50234
|
-
const currentCells = [...this.selectedCells];
|
|
50235
|
-
const cellIndex = currentCells.findIndex((c) => this.equals(c, cellId));
|
|
50236
|
-
if (cellIndex >= 0) {
|
|
50237
|
-
currentCells.splice(cellIndex, 1);
|
|
50238
|
-
}
|
|
50239
|
-
else {
|
|
50240
|
-
currentCells.push(cellId);
|
|
50241
|
-
}
|
|
50242
|
-
this.emitSelection(currentCells, false, true);
|
|
50243
|
-
}
|
|
50244
|
-
selectRange(endCell) {
|
|
50245
|
-
const rangeCells = this.calculateRangeCells(endCell);
|
|
50246
|
-
this.emitSelection(rangeCells, true, false);
|
|
50247
|
-
}
|
|
50248
|
-
updateSelection(currentCell) {
|
|
50249
|
-
const rangeCells = this.calculateRangeBetweenCells(this.selectionStartCell, currentCell);
|
|
50250
|
-
this.emitSelection(rangeCells, true, false);
|
|
50251
|
-
}
|
|
50252
|
-
updateDraggedCells(currentCell) {
|
|
50253
|
-
// this.draggedCells.set(rangeCells);
|
|
50254
|
-
}
|
|
50255
|
-
emitSelection(cells, isRange, isToggle) {
|
|
50256
|
-
this.selectedCells = cells;
|
|
50257
|
-
this.selectionChangeSubject.next({
|
|
50258
|
-
selectedCells: cells,
|
|
50259
|
-
isRangeSelection: isRange,
|
|
50260
|
-
isToggleSelection: isToggle,
|
|
50261
|
-
});
|
|
50262
|
-
}
|
|
50263
|
-
calculateRangeCells(endCell) {
|
|
50264
|
-
if (isEmptyArray(this.selectedCells)) {
|
|
50265
|
-
return [endCell];
|
|
50266
|
-
}
|
|
50267
|
-
const lastSelectedCell = this.findFirstSelectedCell(this.selectedCells);
|
|
50268
|
-
return this.calculateRangeBetweenCells(lastSelectedCell, endCell);
|
|
50269
|
-
}
|
|
50270
|
-
calculateRangeBetweenCells(startCell, endCell) {
|
|
50271
|
-
// Get first cell coordinates, then add this cell as a range
|
|
50272
|
-
const firstRowId = Math.min(startCell.rowId, endCell.rowId);
|
|
50273
|
-
const lastRowId = Math.max(startCell.rowId, endCell.rowId);
|
|
50274
|
-
const startColumnIndex = this.selectableColumns.indexOf(startCell.columnName);
|
|
50275
|
-
const endColumnIndex = this.selectableColumns.indexOf(endCell.columnName);
|
|
50276
|
-
const firstColumnIndex = Math.min(startColumnIndex, endColumnIndex);
|
|
50277
|
-
const lastColumnIndex = Math.max(startColumnIndex, endColumnIndex);
|
|
50278
|
-
// Iterate columns and rows
|
|
50279
|
-
const rangeCells = [];
|
|
50280
|
-
for (let i = firstColumnIndex; i <= lastColumnIndex; i++) {
|
|
50281
|
-
const columnName = this.selectableColumns[i];
|
|
50282
|
-
for (let rowId = firstRowId; rowId <= lastRowId; rowId++) {
|
|
50283
|
-
rangeCells.push(this.new({ rowId: rowId, columnName: columnName }));
|
|
50284
|
-
}
|
|
50285
|
-
}
|
|
50286
|
-
return rangeCells;
|
|
50287
|
-
}
|
|
50288
|
-
resetSelectionState() {
|
|
50289
|
-
this.selectionStartCell = null;
|
|
50290
|
-
this.isSelecting = false;
|
|
50291
|
-
}
|
|
50292
|
-
resetDragState() {
|
|
50293
|
-
this.dragStartCell = null;
|
|
50294
|
-
this.isDragging = false;
|
|
50295
|
-
this.draggedCells = [];
|
|
50296
|
-
}
|
|
50297
|
-
findFirstSelectedCell(selectedCells) {
|
|
50298
|
-
// Find the cell with the lowest rowId and columnIndex
|
|
50299
|
-
return this.findSelectedCell(selectedCells, Math.min(...selectedCells.map((cell) => cell.rowId)), Math.min(...selectedCells.map((cell) => this.selectableColumns.indexOf(cell.columnName))));
|
|
50300
|
-
}
|
|
50301
|
-
findLastSelectedCell(selectedCells) {
|
|
50302
|
-
// Find the cell with the lowest rowId and columnIndex
|
|
50303
|
-
return this.findSelectedCell(selectedCells, Math.max(...selectedCells.map((cell) => cell.rowId)), Math.max(...selectedCells.map((cell) => this.selectableColumns.indexOf(cell.columnName))));
|
|
50304
|
-
}
|
|
50305
|
-
findSelectedCell(selectedCells, rowId, columnIndex) {
|
|
50306
|
-
// Find the cell with the current indexes
|
|
50307
|
-
return selectedCells.filter((cell) => cell.rowId === rowId && cell.columnName === this.selectableColumns[columnIndex])[0];
|
|
50308
|
-
}
|
|
50309
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellSelectionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
50310
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellSelectionService });
|
|
50311
|
-
}
|
|
50312
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellSelectionService, decorators: [{
|
|
50313
|
-
type: Injectable
|
|
50314
|
-
}], ctorParameters: () => [] });
|
|
50315
|
-
|
|
50316
|
-
class CellIdentifierDirective {
|
|
50317
|
-
cellId = input.required({ alias: 'appCellId' });
|
|
50318
|
-
isCellSelected = false;
|
|
50319
|
-
isDragging = false;
|
|
50320
|
-
service = inject(APP_CELL_SELECTION_SERVICE_TOKEN);
|
|
50321
|
-
destroyRef = inject(DestroyRef);
|
|
50322
|
-
ngOnInit() {
|
|
50323
|
-
// Listen to service selection changes and emit
|
|
50324
|
-
this.service.selectionChangeSubject
|
|
50325
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
50326
|
-
.subscribe(() => (this.isCellSelected = this.service.isCellSelected(this.cellId())));
|
|
50327
|
-
}
|
|
50328
|
-
async handleMouseDown(event) {
|
|
50329
|
-
await this.service.handleCellMouseDown(event, this.cellId());
|
|
50330
|
-
}
|
|
50331
|
-
async handleMouseEnter(event) {
|
|
50332
|
-
await this.service.handleCellMouseEnter(event, this.cellId());
|
|
50333
|
-
}
|
|
50334
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellIdentifierDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
50335
|
-
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 });
|
|
50336
|
-
}
|
|
50337
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellIdentifierDirective, decorators: [{
|
|
50338
|
-
type: Directive,
|
|
50339
|
-
args: [{
|
|
50340
|
-
selector: '[appCellId]',
|
|
50341
|
-
standalone: true,
|
|
50342
|
-
host: {
|
|
50343
|
-
'(mousedown)': 'handleMouseDown($event)',
|
|
50344
|
-
'(mouseenter)': 'handleMouseEnter($event)',
|
|
50345
|
-
'[class.cell-selected]': 'isCellSelected',
|
|
50346
|
-
'[class.cell-dragging]': 'isDragging',
|
|
50347
|
-
'[attr.data-row-id]': 'cellId().rowId',
|
|
50348
|
-
'[attr.data-column-name]': 'cellId().columnName',
|
|
50349
|
-
},
|
|
50350
|
-
}]
|
|
50351
|
-
}] });
|
|
50352
|
-
|
|
50353
|
-
class CellSelectionDirective {
|
|
50354
|
-
// Inputs
|
|
50355
|
-
// eslint-disable-next-line @angular-eslint/no-input-rename
|
|
50356
|
-
selectableColumns = input.required({ alias: 'appSelectableColumns' });
|
|
50357
|
-
// Outputs
|
|
50358
|
-
// eslint-disable-next-line @angular-eslint/no-output-rename
|
|
50359
|
-
selectionChange = output({ alias: 'appCellSelectionChange' });
|
|
50360
|
-
// eslint-disable-next-line @angular-eslint/no-output-rename
|
|
50361
|
-
rightClick = output({ alias: 'appCellRightClick' });
|
|
50362
|
-
// Inject service by token
|
|
50363
|
-
service = inject(APP_CELL_SELECTION_SERVICE_TOKEN);
|
|
50364
|
-
elementRef = inject(ElementRef);
|
|
50365
|
-
renderer = inject(Renderer2);
|
|
50366
|
-
destroyRef = inject(DestroyRef);
|
|
50367
|
-
overlayElements = [];
|
|
50368
|
-
constructor() { }
|
|
50369
|
-
ngOnInit() {
|
|
50370
|
-
// Initialize service with selectable columns
|
|
50371
|
-
this.setupServiceConfiguration();
|
|
50372
|
-
// Setup global mouseup listener
|
|
50373
|
-
this.setupGlobalMouseEvents();
|
|
50374
|
-
// Setup keyboard listener for copy (for test)
|
|
50375
|
-
// this.setupCopyListener();
|
|
50376
|
-
}
|
|
50377
|
-
setupServiceConfiguration() {
|
|
50378
|
-
// Pass selectable columns to service
|
|
50379
|
-
this.service.selectableColumns = this.selectableColumns();
|
|
50380
|
-
// Listen to service selection changes and emit
|
|
50381
|
-
this.service.selectionChangeSubject
|
|
50382
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
50383
|
-
.subscribe((event) => this.selectionChange.emit(event));
|
|
50384
|
-
// Listen to right-click event
|
|
50385
|
-
this.service.selectionRightClickSubject.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => this.rightClick.emit(event));
|
|
50386
|
-
}
|
|
50387
|
-
setupGlobalMouseEvents() {
|
|
50388
|
-
fromEvent(document, 'mouseup')
|
|
50389
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
50390
|
-
.subscribe(() => this.service.endMouseMove());
|
|
50391
|
-
}
|
|
50392
|
-
// For test purpose only (type CTRL+C)
|
|
50393
|
-
setupCopyListener() {
|
|
50394
|
-
fromEvent(document, 'keydown')
|
|
50395
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
50396
|
-
.subscribe((event) => {
|
|
50397
|
-
if ((event.ctrlKey || event.metaKey) && event.key === 'c') {
|
|
50398
|
-
const cells = this.service.selectedCells;
|
|
50399
|
-
if (isNotEmptyArray(cells)) {
|
|
50400
|
-
// Show overlay
|
|
50401
|
-
this.addCellsOverlay(cells);
|
|
50402
|
-
event.preventDefault();
|
|
50403
|
-
// Hide overlay after animation completes (1 second)
|
|
50404
|
-
setTimeout(() => {
|
|
50405
|
-
this.removeCellsOverlay();
|
|
50406
|
-
}, 1000);
|
|
50407
|
-
}
|
|
50408
|
-
}
|
|
50409
|
-
});
|
|
50410
|
-
}
|
|
50411
|
-
addCellsOverlay(cells) {
|
|
50412
|
-
// Remove existing overlays
|
|
50413
|
-
this.removeCellsOverlay();
|
|
50414
|
-
// Group cells into contiguous regions
|
|
50415
|
-
const cellGroups = this.groupContiguousCells(cells);
|
|
50416
|
-
// Create and render overlay for each contiguous region
|
|
50417
|
-
cellGroups.forEach((group) => {
|
|
50418
|
-
const bounds = this.calculateSelectionBounds(group);
|
|
50419
|
-
if (bounds) {
|
|
50420
|
-
const overlay = this.createOverlayElement(bounds);
|
|
50421
|
-
this.renderer.appendChild(this.elementRef.nativeElement, overlay);
|
|
50422
|
-
this.overlayElements.push(overlay);
|
|
50423
|
-
}
|
|
50424
|
-
});
|
|
50425
|
-
}
|
|
50426
|
-
removeCellsOverlay() {
|
|
50427
|
-
this.overlayElements.forEach((overlay) => {
|
|
50428
|
-
this.renderer.removeChild(this.elementRef.nativeElement, overlay);
|
|
50429
|
-
});
|
|
50430
|
-
this.overlayElements = [];
|
|
50431
|
-
}
|
|
50432
|
-
groupContiguousCells(cells) {
|
|
50433
|
-
// Create a map for quick lookup
|
|
50434
|
-
const cellMap = new Map();
|
|
50435
|
-
cells.forEach((cell) => {
|
|
50436
|
-
cellMap.set(this.getCellKey(cell), cell);
|
|
50437
|
-
});
|
|
50438
|
-
const visited = new Set();
|
|
50439
|
-
const groups = [];
|
|
50440
|
-
// Process each cell
|
|
50441
|
-
cells.forEach((cell) => {
|
|
50442
|
-
const key = this.getCellKey(cell);
|
|
50443
|
-
if (visited.has(key)) {
|
|
50444
|
-
return;
|
|
50445
|
-
}
|
|
50446
|
-
// Start a new contiguous group with flood-fill
|
|
50447
|
-
const group = [];
|
|
50448
|
-
const queue = [cell];
|
|
50449
|
-
visited.add(key);
|
|
50450
|
-
while (queue.length > 0) {
|
|
50451
|
-
const current = queue.shift();
|
|
50452
|
-
group.push(current);
|
|
50453
|
-
// Check all 4 adjacent cells (up, down, left, right)
|
|
50454
|
-
const neighbors = this.getAdjacentCells(current);
|
|
50455
|
-
neighbors.forEach((neighbor) => {
|
|
50456
|
-
const neighborKey = this.getCellKey(neighbor);
|
|
50457
|
-
if (cellMap.has(neighborKey) && !visited.has(neighborKey)) {
|
|
50458
|
-
visited.add(neighborKey);
|
|
50459
|
-
queue.push(neighbor);
|
|
50460
|
-
}
|
|
50461
|
-
});
|
|
50462
|
-
}
|
|
50463
|
-
groups.push(group);
|
|
50464
|
-
});
|
|
50465
|
-
return groups;
|
|
50466
|
-
}
|
|
50467
|
-
getAdjacentCells(cell) {
|
|
50468
|
-
// Returns cells adjacent to the current cell (up, down, left, right)
|
|
50469
|
-
// Note: We need to get column order from the actual table structure
|
|
50470
|
-
// For now, we'll use a simple approach based on rowId adjacency
|
|
50471
|
-
return [
|
|
50472
|
-
{ rowId: cell.rowId - 1, columnName: cell.columnName }, // up
|
|
50473
|
-
{ rowId: cell.rowId + 1, columnName: cell.columnName }, // down
|
|
50474
|
-
{ rowId: cell.rowId, columnName: this.getNextColumnName(cell.columnName, -1) }, // left
|
|
50475
|
-
{ rowId: cell.rowId, columnName: this.getNextColumnName(cell.columnName, 1) }, // right
|
|
50476
|
-
].filter((c) => c.columnName !== null);
|
|
50477
|
-
}
|
|
50478
|
-
getNextColumnName(currentColumnName, offset) {
|
|
50479
|
-
const columns = this.service.selectableColumns;
|
|
50480
|
-
const currentIndex = columns.indexOf(currentColumnName);
|
|
50481
|
-
if (currentIndex === -1) {
|
|
50482
|
-
return null;
|
|
50483
|
-
}
|
|
50484
|
-
const newIndex = currentIndex + offset;
|
|
50485
|
-
if (newIndex < 0 || newIndex >= columns.length) {
|
|
50486
|
-
return null;
|
|
50487
|
-
}
|
|
50488
|
-
return columns[newIndex];
|
|
50489
|
-
}
|
|
50490
|
-
getCellKey(cell) {
|
|
50491
|
-
return `${cell.rowId}-${cell.columnName}`;
|
|
50492
|
-
}
|
|
50493
|
-
calculateSelectionBounds(cells) {
|
|
50494
|
-
const container = this.elementRef.nativeElement;
|
|
50495
|
-
// Find all selected cell elements
|
|
50496
|
-
const cellElements = [];
|
|
50497
|
-
cells.forEach((cell) => {
|
|
50498
|
-
const cellElement = container.querySelector(`[data-row-id="${cell.rowId}"][data-column-name="${cell.columnName}"]`);
|
|
50499
|
-
if (cellElement) {
|
|
50500
|
-
cellElements.push(cellElement);
|
|
50501
|
-
}
|
|
50502
|
-
});
|
|
50503
|
-
if (isEmptyArray(cellElements)) {
|
|
50504
|
-
return null;
|
|
50505
|
-
}
|
|
50506
|
-
// Get container position
|
|
50507
|
-
const containerRect = container.getBoundingClientRect();
|
|
50508
|
-
// Calculate bounding box
|
|
50509
|
-
let minTop = Infinity;
|
|
50510
|
-
let minLeft = Infinity;
|
|
50511
|
-
let maxBottom = -Infinity;
|
|
50512
|
-
let maxRight = -Infinity;
|
|
50513
|
-
cellElements.forEach((element) => {
|
|
50514
|
-
const rect = element.getBoundingClientRect();
|
|
50515
|
-
minTop = Math.min(minTop, rect.top - containerRect.top);
|
|
50516
|
-
minLeft = Math.min(minLeft, rect.left - containerRect.left);
|
|
50517
|
-
maxBottom = Math.max(maxBottom, rect.bottom - containerRect.top);
|
|
50518
|
-
maxRight = Math.max(maxRight, rect.right - containerRect.left);
|
|
50519
|
-
});
|
|
50520
|
-
return {
|
|
50521
|
-
top: minTop,
|
|
50522
|
-
left: minLeft,
|
|
50523
|
-
width: maxRight - minLeft,
|
|
50524
|
-
height: maxBottom - minTop,
|
|
50525
|
-
};
|
|
50526
|
-
}
|
|
50527
|
-
createOverlayElement(bounds) {
|
|
50528
|
-
const overlay = this.renderer.createElement('div');
|
|
50529
|
-
this.renderer.addClass(overlay, 'cell-selection-overlay');
|
|
50530
|
-
// Set position and size
|
|
50531
|
-
this.renderer.setStyle(overlay, 'top', `${bounds.top}px`);
|
|
50532
|
-
this.renderer.setStyle(overlay, 'left', `${bounds.left}px`);
|
|
50533
|
-
this.renderer.setStyle(overlay, 'width', `${bounds.width}px`);
|
|
50534
|
-
this.renderer.setStyle(overlay, 'height', `${bounds.height}px`);
|
|
50535
|
-
return overlay;
|
|
50536
|
-
}
|
|
50537
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellSelectionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
50538
|
-
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: true, transformFunction: null } }, outputs: { selectionChange: "appCellSelectionChange", rightClick: "appCellRightClick" }, ngImport: i0 });
|
|
50539
|
-
}
|
|
50540
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellSelectionDirective, decorators: [{
|
|
50541
|
-
type: Directive,
|
|
50542
|
-
args: [{
|
|
50543
|
-
selector: '[appCellSelection]',
|
|
50544
|
-
standalone: true,
|
|
50545
|
-
}]
|
|
50546
|
-
}], ctorParameters: () => [] });
|
|
50547
|
-
|
|
50548
50548
|
class Table2TestPage extends AppAsyncTable {
|
|
50549
50549
|
validatorService;
|
|
50550
50550
|
formBuilder;
|
|
@@ -52262,5 +52262,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
52262
52262
|
* Generated bundle index. Do not edit.
|
|
52263
52263
|
*/
|
|
52264
52264
|
|
|
52265
|
-
export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_DEBUG_DATA_SERVICE, APP_FEED_SERVICE, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_FRAGMENTS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_HOME_CONFIG, APP_HOTKEYS_CONFIG, APP_JOB_PROGRESSION_SERVICE, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_LOGGING_SERVICE, APP_MENU_ITEMS, APP_MENU_OPTIONS, APP_NAMED_FILTER_SERVICE, APP_PROGRESS_BAR_SERVICE, APP_SETTINGS_MENU_ITEMS, APP_STORAGE, APP_STORAGE_EXPLORER_PROTECTED_KEYS, APP_TESTING_PAGES, APP_USER_EVENT_LIST_INFINITE_SCROLL_THRESHOLD, APP_USER_EVENT_SERVICE, APP_USER_SETTINGS_OPTIONS, APP_USER_TOKEN_SCOPES, AboutModal, AbstractNamedFilterService, AbstractSelectionModelPipe, AbstractTableSelectionPipe, AbstractUserEventService, Account, AccountPage, AccountService, AccountToStringPipe, AccountUtils, ActionsColumnComponent, AdditionalFields, AdminModule, AdminRoutingModule, AdminUsersModule, Alerts, AndroidOsEnvironment, AppAboutModalModule, AppAccountModule, AppAsyncTable, AppAuthForm, AppAuthModal, AppAuthModule, AppChangePasswordModule, AppChangePasswordPage, AppEditor, AppEditorOptions, AppEntityEditor, AppEntityEditorModal, AppEntityEditorModalOptions, AppEntityFormModule, AppForm, AppFormArray, AppFormButtonsBarModule, AppFormContainer, AppFormField, AppFormModule, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHomePageModule, AppIconComponent, AppIconModule, AppImageGalleryComponent, AppInMemoryTable, AppInstallUpgradeCard, AppInstallUpgradeCardModule, AppListForm, AppListFormModule, AppLoadingSpinner, AppMarkdownContent, AppMarkdownModal, AppMenuModule, AppNullForm, AppPropertiesForm, AppPropertiesFormModule, AppPropertiesTable, AppPropertiesUtils, AppPropertyUtils, AppRegisterModule, AppResetPasswordModal, AppRowField, AppSelectPeerModule, AppSelectUsersModal, AppSettingsPageModule, AppTabEditor, AppTabEditorOptions, AppTable, AppTableModule, AppTableUtils, AppTextFormModule, AppTextPopoverModule, AppUpdateOfflineModeCard, AppUpdateOfflineModeCardModule, AppValidatorService, AppendQueryParamsPipePipe, ArrayDistinctPipe, ArrayFilterPipe, ArrayFindByPropertyPipe, ArrayFirstPipe, ArrayFormTestPage, ArrayIncludesPipe, ArrayJoinPipe, ArrayLastPipe, ArrayLengthPipe, ArrayMapPipe, ArrayPluckPipe, ArraySlicePipe, ArraySortPipe, AsAnyPipe, AsArrayPipe, AsBooleanPipe, AsFloatLabelTypePipe, AsObservablePipe, AudioProvider, AudioTestingModule, AudioTestingPage, AuthGuardService, AutoResizeDirective, AutoTitleDirective, AutocompleteTestPage, AutofocusDirective, BadgeDirective, BadgeNumberPipe, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, BooleanFormatPipe, BooleanTestPage, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CapitalizePipe, CellValueChangeListener, ChangePasswordForm, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigFragments, ConfigService, Configuration, CoreModule, CorePipesModule, CoreTestingModule, CryptoService, CsvUtils, DATE_ISO_PATTERN, DATE_MATCH_REGEXP, DATE_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_JOIN_ARRAY_VALUES_SEPARATOR, DEFAULT_JOIN_PROPERTIES_SEPARATOR, DEFAULT_MENU_SHOW_WHEN, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFormatService, DateFromNowPipe, DateFromPipe, DateShortTestPage, DateTestPage, DateTimeTestPage, DateUtils, DebugComponent, Department, DepartmentToStringPipe, DisplayWithPipe, DragAndDropDirective, DurationPipe, DurationTestPage, ED25519_SEED_LENGTH, EMPTY_PLACEHOLDER_CHAR, EMPTY_PLACEHOLDER_CHAR_REGEXP_GLOBAL, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesAsyncTableDataSource, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, EnvironmentHttpLoader, EnvironmentLoader, ErrorCodes, EvenPipe, FeedDirective, FeedModule, FeedPage, FeedService, FeedsComponent, FileResponse, FileService, FileSizePipe, FilesUtils, FirstFalsePipe, FirstPipe, FirstTruePipe, FormArrayHelper, FormArrayTestModule, FormButtonsBarComponent, FormButtonsBarToken, FormErrorPipe, FormErrorTranslatePipe, FormErrorTranslator, FormFieldDefinitionUtils, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetGroupPipe, FormGetPipe, FormGetValuePipe, GalleryTestPage, GeolocationUtils, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, IMAGE_DEFAULTS, IPosition, ImageAttachment, ImageAttachmentFilter, ImageAttachmentService, ImageGalleryModule, ImageGalleryTestingModule, ImageModule, ImageService, ImagesUtils, InMemoryEntitiesService, IsAllSelectedPipe, IsEmptySelectionPipe, IsLoginAccountPipe, IsMultipleSelectionPipe, IsNilOrBlankPipe, IsNilOrNaNPipe, IsNilPipe, IsNotAllSelectedPipe, IsNotEmptySelectionPipe, IsNotNilOrBlankPipe, IsNotNilOrNaNPipe, IsNotNilPipe, IsOnDeskPipe, IsOnFieldPipe, IsSelectedPipe, IsSingleSelectionPipe, IsValidDatePipe, JobModule, JobProgression, JobProgressionComponent, JobProgressionIcon, JobProgressionList, JobProgressionService, JobProgressionTestService, JobProgressionTestingPage, JobTestingModule, JobUtils, JsonFeedUtils, JsonUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_PATTERNS, LAT_LONG_PATTERN_MAX_DECIMALS, LAT_LONG_VALUE_MAX_DECIMALS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LogLevel, LogUtils, Logger, LoggingService, LoggingServiceModule, LongitudeFormatPipe, MASKS, MASK_RANGES, MAT_FORM_FIELD_DEFAULT_APPEARANCE, MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MOMENT_NO_TIME_PROPERTY, MapGetPipe, MapKeysPipe, MapPipe, MapToPipe, MapValuesPipe, MarkdownDirective, MarkdownService, MarkdownTestPage, MarkdownTestingModule, MarkdownUtils, MaskitoPlaceholderPipe, MaskitoTestPage, MatAutocompleteConfigHolder, MatAutocompleteField, MatAutocompleteFieldUtils, MatBadgeTestPage, MatBooleanField, MatChipsField, MatColorPipe, MatCommonTestPage, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatLatLongFieldInput, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItem, MenuItems, MenuOptions, MenuService, MenuTestingModule, MenuTestingPage, Message, MessageFilter, MessageForm, MessageModal, MessageModule, MessageService, MessageTypeList, MessageTypes, MimeTypes, ModalToolbarComponent, NETWORK_DEFAULT_CONNECTION_TIMEOUT, NamedFilter, NamedFilterFilter, NamedFilterSelector, NamedFilterSelectorTestingModule, NamedFilterSelectorTestingPage, NavActionsColumnComponent, NetworkService, NetworkUtils, NewTokenForm, NewTokenModal, NgInitDirective, NgVarDirective, NoHtmlPipe, NotEmptyArrayPipe, NumberFormatPipe, ObservableTestPage, OddPipe, OtherMenuTestingPage, PEER_URL_REGEXP, PLUS_PLACEHOLDER_CHAR_REGEXP_GLOBAL, PRINT_ID_QUERY_PARAM, PRINT_LOADING_STORAGE_KEY_PREFIX, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, PrintService, ProgressBarService, ProgressInterceptor, PropertiesFormTestPage, PropertiesFormTestingModule, PropertyEntity, PropertyEntityFilter, PropertyEntityValidator, PropertyFormatPipe, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialToStringPipe, ReferentialUtils, ReferentialValidatorService, ReferentialsToStringPipe, RegExpUtils, RegisterConfirmPage, RegisterForm, RegisterModal, ResizableComponent, ResizableDirective, ResizableModule, RoundPipe, RxStateComputed, RxStateModule, RxStateOutput, RxStateProperty, RxStateRegister, RxStateSelect, SCRYPT_PARAMS, SETTINGS_COMPACT_ROWS, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_STORAGE_TESTING_PAGES, SHARED_TESTING_PAGES, SOCIAL_CONFIG_OPTIONS, SOCIAL_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SPACE_PLACEHOLDER_CHAR_REGEXP_GLOBAL, SafeHtmlPipe, SafeStylePipe, SelectPeerModal, SelectionLengthPipe, ServerErrorCodes, SettingsPage, SharedAsyncValidators, SharedBadgeModule, SharedDebugModule, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMarkdownModule, SharedMatAutocompleteModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedNamedFilterModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedToolbarModule, SharedValidators, SocialErrorCodes, SocialModule, SocialModuleOptionsToken, SocialTestingModule, Software, SplitArrayInChunksPipe, StartableService, StatusById, StatusIds, StatusList, StorageDrivers, StorageExplorerComponent, StorageExplorerModule, StorageExplorerTestingModule, StorageExplorerTestingRoutingModule, StorageService, StrIncludesPipe, StrLengthPipe, StrReplacePipe, SubMenuTabDirective, SwipeTestPage, TABLE_SETTINGS_ENUM, TOOLBAR_HEADER_ID, Table2TestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TableValidatorService, TextForm, TextFormTestingModule, TextFormTestingPage, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ThrottledClickDirective, ToStringPipe, ToastTestingModule, ToastTestingPage, Toasts, TokenScope, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, TreeItemEntityUtils, TruncHtmlPipe, TruncTextPipe, TruncateHtmlPipe, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UriUtils, UrlUtils, UserEventModule, UserEventNotificationIcon, UserEventNotificationList, UserEventNotificationModal, UserEventTestService, UserEventTestingModule, UserEventTestingPage, UserSettings, UserToken, UserTokenTable, UsersPage, UsersUtils, ValueFormatPipe, VersionUtils, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayResize, arraySize, asInputElement, base64ArrayBuffer, booleanToString, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, collectByProperty, compareValues, compareValuesDesc, compareVersionNumbers, composeComparators, computeDecimalDegrees, computeDecimalPart, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, decorateWithTakeUntil, departmentToString, departmentsToString, disableAndClearControl, disableAndClearControls, disableControl, disableControls, emitPromiseEvent, enableControl, enableControls, enableRxStateProdMode, entityToString, equals, equalsOrNil, escapeRegExp, expansionAnimation, fadeInAnimation, fadeInOutAnimation, fadeInSlowAnimation, filterFalse, filterFormErrors, filterFormErrorsByPath, filterFormErrorsByPrefix, filterNotNil, filterNumberInput, filterTrue, findParentWithClass, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstPromise, firstTrue, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatLong, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorShade, getColorTint, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getInputRangeFromCaretIndex, getInputSelectionRangesFromMask, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, getRandomImageWithCredit, getUserAgent, hexToRgb, hexToRgbArray, initArrayControlsFromValues, interpolateString, intersectArrays, isAndroid, isBlankString, isCapacitor, isChrome, isControlHasInput, isEdge, isEmptyArray, isEntityService, isFirefox, isFocusableElement, isIOS, isInputElement, isInstanceOf, isInt, isIpad, isMacOS, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilBoolean, isNotNilObject, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isOnFieldMode, isPrint, isProgressEvent, isPromise, isResponseEvent, isSafari, isSameVersion, isStartableService, isTouchUi, isVersionCompatible, isWindows, joinProperties, joinPropertiesPath, lastArrayValue, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, maskitoAutoSelectByMaskPattern, maskitoPrefixPlugin, matchMedia, matchUpperCase, mergeLoadResult, mixHex, moveInputCaretToSeparator, newArray, noHtml, noTrailingSlash, notNilOrDefault, nullIfNilOrBlank, nullIfUndefined, numberOrNilAttribute, numberToString, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputContentFromEvent, selectInputRange, setCalculatedValue, setControlEnabled, setControlRequired, setControlsEnabled, setFormErrors, setPropertyByPath, setTabIndex, sleep, slideDownAnimation, slideInAnimation, slideInOutAnimation, slideUpDownAnimation, sort, splitArrayInChunks, splitById, splitByProperty, splitDegreesToDDArray, splitDegreesToDDMMArray, splitDegreesToDDMMSSArray, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toLoadData, toLoadResult, toNotNil, toNumber, trimEmptyToNull, truncateHtml, uncapitalizeFirstLetter, undefinedIfNull, underscoreToChangeCase, updateValueAndValidity, waitFor, waitForFalse, waitForTrue, waitIdle, waitWhilePending };
|
|
52265
|
+
export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CELL_SELECTION_SERVICE_CONFIG_TOKEN, APP_CELL_SELECTION_SERVICE_TOKEN, APP_CONFIG_OPTIONS, APP_DEBUG_DATA_SERVICE, APP_FEED_SERVICE, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_FRAGMENTS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_HOME_CONFIG, APP_HOTKEYS_CONFIG, APP_JOB_PROGRESSION_SERVICE, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_LOGGING_SERVICE, APP_MENU_ITEMS, APP_MENU_OPTIONS, APP_NAMED_FILTER_SERVICE, APP_PROGRESS_BAR_SERVICE, APP_SETTINGS_MENU_ITEMS, APP_STORAGE, APP_STORAGE_EXPLORER_PROTECTED_KEYS, APP_TESTING_PAGES, APP_USER_EVENT_LIST_INFINITE_SCROLL_THRESHOLD, APP_USER_EVENT_SERVICE, APP_USER_SETTINGS_OPTIONS, APP_USER_TOKEN_SCOPES, AboutModal, AbstractNamedFilterService, AbstractSelectionModelPipe, AbstractTableSelectionPipe, AbstractUserEventService, Account, AccountPage, AccountService, AccountToStringPipe, AccountUtils, ActionsColumnComponent, AdditionalFields, AdminModule, AdminRoutingModule, AdminUsersModule, Alerts, AndroidOsEnvironment, AppAboutModalModule, AppAccountModule, AppAsyncTable, AppAuthForm, AppAuthModal, AppAuthModule, AppChangePasswordModule, AppChangePasswordPage, AppEditor, AppEditorOptions, AppEntityEditor, AppEntityEditorModal, AppEntityEditorModalOptions, AppEntityFormModule, AppForm, AppFormArray, AppFormButtonsBarModule, AppFormContainer, AppFormField, AppFormModule, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHomePageModule, AppIconComponent, AppIconModule, AppImageGalleryComponent, AppInMemoryTable, AppInstallUpgradeCard, AppInstallUpgradeCardModule, AppListForm, AppListFormModule, AppLoadingSpinner, AppMarkdownContent, AppMarkdownModal, AppMenuModule, AppNullForm, AppPropertiesForm, AppPropertiesFormModule, AppPropertiesTable, AppPropertiesUtils, AppPropertyUtils, AppRegisterModule, AppResetPasswordModal, AppRowField, AppSelectPeerModule, AppSelectUsersModal, AppSettingsPageModule, AppTabEditor, AppTabEditorOptions, AppTable, AppTableModule, AppTableUtils, AppTextFormModule, AppTextPopoverModule, AppUpdateOfflineModeCard, AppUpdateOfflineModeCardModule, AppValidatorService, AppendQueryParamsPipePipe, ArrayDistinctPipe, ArrayFilterPipe, ArrayFindByPropertyPipe, ArrayFirstPipe, ArrayFormTestPage, ArrayIncludesPipe, ArrayJoinPipe, ArrayLastPipe, ArrayLengthPipe, ArrayMapPipe, ArrayPluckPipe, ArraySlicePipe, ArraySortPipe, AsAnyPipe, AsArrayPipe, AsBooleanPipe, AsFloatLabelTypePipe, AsObservablePipe, AudioProvider, AudioTestingModule, AudioTestingPage, AuthGuardService, AutoResizeDirective, AutoTitleDirective, AutocompleteTestPage, AutofocusDirective, BadgeDirective, BadgeNumberPipe, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, BooleanFormatPipe, BooleanTestPage, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CapitalizePipe, CellIdentifierDirective, CellSelectionDirective, CellSelectionService, CellValueChangeListener, ChangePasswordForm, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigFragments, ConfigService, Configuration, CoreModule, CorePipesModule, CoreTestingModule, CryptoService, CsvUtils, DATE_ISO_PATTERN, DATE_MATCH_REGEXP, DATE_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_JOIN_ARRAY_VALUES_SEPARATOR, DEFAULT_JOIN_PROPERTIES_SEPARATOR, DEFAULT_MENU_SHOW_WHEN, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFormatService, DateFromNowPipe, DateFromPipe, DateShortTestPage, DateTestPage, DateTimeTestPage, DateUtils, DebugComponent, Department, DepartmentToStringPipe, DisplayWithPipe, DragAndDropDirective, DurationPipe, DurationTestPage, ED25519_SEED_LENGTH, EMPTY_PLACEHOLDER_CHAR, EMPTY_PLACEHOLDER_CHAR_REGEXP_GLOBAL, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesAsyncTableDataSource, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, EnvironmentHttpLoader, EnvironmentLoader, ErrorCodes, EvenPipe, FeedDirective, FeedModule, FeedPage, FeedService, FeedsComponent, FileResponse, FileService, FileSizePipe, FilesUtils, FirstFalsePipe, FirstPipe, FirstTruePipe, FormArrayHelper, FormArrayTestModule, FormButtonsBarComponent, FormButtonsBarToken, FormErrorPipe, FormErrorTranslatePipe, FormErrorTranslator, FormFieldDefinitionUtils, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetGroupPipe, FormGetPipe, FormGetValuePipe, GalleryTestPage, GeolocationUtils, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, IMAGE_DEFAULTS, IPosition, ImageAttachment, ImageAttachmentFilter, ImageAttachmentService, ImageGalleryModule, ImageGalleryTestingModule, ImageModule, ImageService, ImagesUtils, InMemoryEntitiesService, IsAllSelectedPipe, IsEmptySelectionPipe, IsLoginAccountPipe, IsMultipleSelectionPipe, IsNilOrBlankPipe, IsNilOrNaNPipe, IsNilPipe, IsNotAllSelectedPipe, IsNotEmptySelectionPipe, IsNotNilOrBlankPipe, IsNotNilOrNaNPipe, IsNotNilPipe, IsOnDeskPipe, IsOnFieldPipe, IsSelectedPipe, IsSingleSelectionPipe, IsValidDatePipe, JobModule, JobProgression, JobProgressionComponent, JobProgressionIcon, JobProgressionList, JobProgressionService, JobProgressionTestService, JobProgressionTestingPage, JobTestingModule, JobUtils, JsonFeedUtils, JsonUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_PATTERNS, LAT_LONG_PATTERN_MAX_DECIMALS, LAT_LONG_VALUE_MAX_DECIMALS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LogLevel, LogUtils, Logger, LoggingService, LoggingServiceModule, LongitudeFormatPipe, MASKS, MASK_RANGES, MAT_FORM_FIELD_DEFAULT_APPEARANCE, MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MOMENT_NO_TIME_PROPERTY, MapGetPipe, MapKeysPipe, MapPipe, MapToPipe, MapValuesPipe, MarkdownDirective, MarkdownService, MarkdownTestPage, MarkdownTestingModule, MarkdownUtils, MaskitoPlaceholderPipe, MaskitoTestPage, MatAutocompleteConfigHolder, MatAutocompleteField, MatAutocompleteFieldUtils, MatBadgeTestPage, MatBooleanField, MatChipsField, MatColorPipe, MatCommonTestPage, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatLatLongFieldInput, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItem, MenuItems, MenuOptions, MenuService, MenuTestingModule, MenuTestingPage, Message, MessageFilter, MessageForm, MessageModal, MessageModule, MessageService, MessageTypeList, MessageTypes, MimeTypes, ModalToolbarComponent, NETWORK_DEFAULT_CONNECTION_TIMEOUT, NamedFilter, NamedFilterFilter, NamedFilterSelector, NamedFilterSelectorTestingModule, NamedFilterSelectorTestingPage, NavActionsColumnComponent, NetworkService, NetworkUtils, NewTokenForm, NewTokenModal, NgInitDirective, NgVarDirective, NoHtmlPipe, NotEmptyArrayPipe, NumberFormatPipe, ObservableTestPage, OddPipe, OtherMenuTestingPage, PEER_URL_REGEXP, PLUS_PLACEHOLDER_CHAR_REGEXP_GLOBAL, PRINT_ID_QUERY_PARAM, PRINT_LOADING_STORAGE_KEY_PREFIX, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, PrintService, ProgressBarService, ProgressInterceptor, PropertiesFormTestPage, PropertiesFormTestingModule, PropertyEntity, PropertyEntityFilter, PropertyEntityValidator, PropertyFormatPipe, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialToStringPipe, ReferentialUtils, ReferentialValidatorService, ReferentialsToStringPipe, RegExpUtils, RegisterConfirmPage, RegisterForm, RegisterModal, ResizableComponent, ResizableDirective, ResizableModule, RoundPipe, RxStateComputed, RxStateModule, RxStateOutput, RxStateProperty, RxStateRegister, RxStateSelect, SCRYPT_PARAMS, SETTINGS_COMPACT_ROWS, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_STORAGE_TESTING_PAGES, SHARED_TESTING_PAGES, SOCIAL_CONFIG_OPTIONS, SOCIAL_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SPACE_PLACEHOLDER_CHAR_REGEXP_GLOBAL, SafeHtmlPipe, SafeStylePipe, SelectPeerModal, SelectionLengthPipe, ServerErrorCodes, SettingsPage, SharedAsyncValidators, SharedBadgeModule, SharedDebugModule, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMarkdownModule, SharedMatAutocompleteModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedNamedFilterModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedToolbarModule, SharedValidators, SocialErrorCodes, SocialModule, SocialModuleOptionsToken, SocialTestingModule, Software, SplitArrayInChunksPipe, StartableService, StatusById, StatusIds, StatusList, StorageDrivers, StorageExplorerComponent, StorageExplorerModule, StorageExplorerTestingModule, StorageExplorerTestingRoutingModule, StorageService, StrIncludesPipe, StrLengthPipe, StrReplacePipe, SubMenuTabDirective, SwipeTestPage, TABLE_SETTINGS_ENUM, TOOLBAR_HEADER_ID, Table2TestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TableValidatorService, TextForm, TextFormTestingModule, TextFormTestingPage, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ThrottledClickDirective, ToStringPipe, ToastTestingModule, ToastTestingPage, Toasts, TokenScope, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, TreeItemEntityUtils, TruncHtmlPipe, TruncTextPipe, TruncateHtmlPipe, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UriUtils, UrlUtils, UserEventModule, UserEventNotificationIcon, UserEventNotificationList, UserEventNotificationModal, UserEventTestService, UserEventTestingModule, UserEventTestingPage, UserSettings, UserToken, UserTokenTable, UsersPage, UsersUtils, ValueFormatPipe, VersionUtils, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayResize, arraySize, asInputElement, base64ArrayBuffer, booleanToString, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, collectByProperty, compareValues, compareValuesDesc, compareVersionNumbers, composeComparators, computeDecimalDegrees, computeDecimalPart, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, decorateWithTakeUntil, departmentToString, departmentsToString, disableAndClearControl, disableAndClearControls, disableControl, disableControls, emitPromiseEvent, enableControl, enableControls, enableRxStateProdMode, entityToString, equals, equalsOrNil, escapeRegExp, expansionAnimation, fadeInAnimation, fadeInOutAnimation, fadeInSlowAnimation, filterFalse, filterFormErrors, filterFormErrorsByPath, filterFormErrorsByPrefix, filterNotNil, filterNumberInput, filterTrue, findParentWithClass, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstPromise, firstTrue, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatLong, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorShade, getColorTint, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getInputRangeFromCaretIndex, getInputSelectionRangesFromMask, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, getRandomImageWithCredit, getUserAgent, hexToRgb, hexToRgbArray, initArrayControlsFromValues, interpolateString, intersectArrays, isAndroid, isBlankString, isCapacitor, isChrome, isControlHasInput, isEdge, isEmptyArray, isEntityService, isFirefox, isFocusableElement, isIOS, isInputElement, isInstanceOf, isInt, isIpad, isMacOS, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilBoolean, isNotNilObject, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isOnFieldMode, isPrint, isProgressEvent, isPromise, isResponseEvent, isSafari, isSameVersion, isStartableService, isTouchUi, isVersionCompatible, isWindows, joinProperties, joinPropertiesPath, lastArrayValue, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, maskitoAutoSelectByMaskPattern, maskitoPrefixPlugin, matchMedia, matchUpperCase, mergeLoadResult, mixHex, moveInputCaretToSeparator, newArray, noHtml, noTrailingSlash, notNilOrDefault, nullIfNilOrBlank, nullIfUndefined, numberOrNilAttribute, numberToString, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputContentFromEvent, selectInputRange, setCalculatedValue, setControlEnabled, setControlRequired, setControlsEnabled, setFormErrors, setPropertyByPath, setTabIndex, sleep, slideDownAnimation, slideInAnimation, slideInOutAnimation, slideUpDownAnimation, sort, splitArrayInChunks, splitById, splitByProperty, splitDegreesToDDArray, splitDegreesToDDMMArray, splitDegreesToDDMMSSArray, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toLoadData, toLoadResult, toNotNil, toNumber, trimEmptyToNull, truncateHtml, uncapitalizeFirstLetter, undefinedIfNull, underscoreToChangeCase, updateValueAndValidity, waitFor, waitForFalse, waitForTrue, waitIdle, waitWhilePending };
|
|
52266
52266
|
//# sourceMappingURL=sumaris-net.ngx-components.mjs.map
|