@oneteme/jquery-table 0.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oneteme-jquery-table.mjs","sources":["../../../../projects/oneteme/jquery-table/src/lib/directive/jqt-cell-def.directive.ts","../../../../projects/oneteme/jquery-table/src/lib/component/slice-panel/slice-panel.component.ts","../../../../projects/oneteme/jquery-table/src/lib/component/slice-panel/slice-panel.component.html","../../../../projects/oneteme/jquery-table/src/lib/component/table.utils.ts","../../../../projects/oneteme/jquery-table/src/lib/component/table.component.ts","../../../../projects/oneteme/jquery-table/src/lib/component/table.component.html","../../../../projects/oneteme/jquery-table/src/public-api.ts","../../../../projects/oneteme/jquery-table/src/oneteme-jquery-table.ts"],"sourcesContent":["import { Directive, Input, TemplateRef } from '@angular/core';\n\n/**\n * Directive permettant de définir un template de cellule personnalisé pour une colonne.\n *\n * Usage:\n * ```html\n * <jquery-table [config]=\"tableConfig\">\n * <ng-template jqtCellDef=\"monKey\" let-row>\n * <span>{{ row.monChamp }}</span>\n * </ng-template>\n * </jquery-table>\n * ```\n * Le contexte expose `$implicit` (ligne brute `T`) et `index` (index global).\n */\n@Directive({\n selector: '[jqtCellDef]',\n standalone: true,\n})\nexport class JqtCellDefDirective {\n /** Clé de la colonne à laquelle ce template s'applique. */\n @Input('jqtCellDef') columnKey: string = '';\n\n constructor(public readonly template: TemplateRef<{ $implicit: any; index: number }>) {}\n}\n","import { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component,\n ElementRef, EventEmitter, Input, OnChanges, OnInit, Output,\n SimpleChanges, ViewChild, inject\n} from '@angular/core';\nimport { SliceColumnDef, SliceConfig } from './slice-panel.model';\n\nconst EMPTY_CATEGORY_KEY = '__empty__';\nconst EMPTY_CATEGORY_LABEL = 'Vide';\n\n@Component({\n standalone: true,\n selector: 'slice-panel',\n imports: [CommonModule, MatIconModule],\n templateUrl: './slice-panel.component.html',\n styleUrls: ['./slice-panel.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SlicePanelComponent<T = any> implements OnChanges, OnInit {\n\n @Input() sliceConfigs: SliceConfig<T>[] = [];\n @Input() columns: SliceColumnDef<T>[] = [];\n @Input() data: T[] = [];\n @Input() lazyData: Map<string, Map<any, any>> = new Map();\n @Input() lazyStatus: Map<string, 'idle' | 'loading' | 'loaded' | 'error'> = new Map();\n @Input() showToggle = true;\n @Input() showCounts = true;\n @Input() collapsedByDefault = false;\n @Input() alwaysShow = false;\n\n @Output() filterChange = new EventEmitter<(row: T) => boolean>();\n @Output() activeKeysChange = new EventEmitter<string[][]>();\n @Output() dynamicSliceKeysChange = new EventEmitter<string[]>();\n @Output() collapsedChange = new EventEmitter<boolean>();\n\n @ViewChild('slicePanelBody') slicePanelBodyRef?: ElementRef<HTMLElement>;\n\n private _cdr = inject(ChangeDetectorRef);\n\n isCollapsed = false;\n activeKeysBySlice: Map<number, Set<string>> = new Map();\n private _expandedSlices = new Set<number>();\n _dynamicSlices: Array<{ key: string; slice: SliceConfig<T> }> = [];\n private _hiddenStaticSliceKeys = new Set<string>();\n\n // ── Cache ─────────────────────────────────────────────────────\n _cachedSlices: SliceConfig<T>[] = [];\n private _countCache = new Map<string, number>();\n\n readonly trackBySliceIndex = (index: number, _: any): number => index;\n readonly trackByCategoryKey = (_: number, cat: any): string => cat.key;\n\n // ── Lifecycle ─────────────────────────────────────────────────\n\n ngOnInit(): void {\n this.isCollapsed = this.collapsedByDefault;\n const initiallyHidden = (this.sliceConfigs || [])\n .filter(s => s.hidden === true && !!s.columnKey)\n .map(s => s.columnKey!);\n if (initiallyHidden.length) {\n this._hiddenStaticSliceKeys = new Set([...this._hiddenStaticSliceKeys, ...initiallyHidden]);\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['sliceConfigs'] || changes['data'] || changes['columns'] || changes['lazyData'] || changes['lazyStatus']) {\n this._refreshDynamicSlices();\n this._rebuildCache();\n this._cdr.markForCheck();\n }\n }\n\n // ── Computed ──────────────────────────────────────────────────\n\n get showPanel(): boolean {\n const visibleStaticCount = (this.sliceConfigs || []).filter(\n (s) => !s.columnKey || !this._hiddenStaticSliceKeys.has(s.columnKey)\n ).length;\n const hasCfg = visibleStaticCount > 0 || this._dynamicSlices.length > 0;\n if (this.alwaysShow) return hasCfg;\n return hasCfg && (this.data?.length ?? 0) > 0;\n }\n\n get slices(): SliceConfig<T>[] {\n return this._cachedSlices;\n }\n\n get staticSliceCount(): number {\n return (this.sliceConfigs || []).filter(\n (s) => !s.columnKey || !this._hiddenStaticSliceKeys.has(s.columnKey)\n ).length;\n }\n\n get staticSlicesForMenu(): Array<{ key: string; title: string }> {\n return (this.sliceConfigs || [])\n .filter((s) => !!s.columnKey)\n .map((s) => ({ key: s.columnKey!, title: s.title || s.columnKey! }));\n }\n\n get activeDynamicSliceColumns(): SliceColumnDef<T>[] {\n return this._dynamicSlices\n .map((d) => (this.columns || []).find((c) => c.key === d.key))\n .filter((c): c is SliceColumnDef<T> => !!c);\n }\n\n get availableColumnsForDynamicSlice(): SliceColumnDef<T>[] {\n const dynamicKeys = new Set(this._dynamicSlices.map((d) => d.key));\n const staticKeys = new Set(\n (this.sliceConfigs || []).map((s) => s.columnKey).filter((k): k is string => !!k)\n );\n const existingKeys = new Set([...dynamicKeys, ...staticKeys]);\n const seen = new Set<string>();\n return (this.columns || []).filter((c) => {\n if (existingKeys.has(c.key) || seen.has(c.key)) return false;\n seen.add(c.key);\n return true;\n });\n }\n\n get activeSliceByLabel(): string {\n const staticActiveCount = (this.sliceConfigs || []).filter(\n (s) => !s.columnKey || !this._hiddenStaticSliceKeys.has(s.columnKey)\n ).length;\n const total = staticActiveCount + this._dynamicSlices.length;\n if (total === 0) return 'Aucun';\n if (total === 1) {\n const first = (this.sliceConfigs || []).find(\n (s) => !s.columnKey || !this._hiddenStaticSliceKeys.has(s.columnKey)\n );\n if (first) return first.title || first.columnKey || '1';\n return this.activeDynamicSliceColumns[0]?.header || '1';\n }\n return `${total} actifs`;\n }\n\n // ── UI state ──────────────────────────────────────────────────\n\n isSliceCollapsed(sliceIndex: number): boolean {\n if (this._cachedSlices.length === 1) {\n return this._expandedSlices.has(-1 - sliceIndex);\n }\n return !this._expandedSlices.has(sliceIndex);\n }\n\n toggleSliceCollapse(sliceIndex: number): void {\n if (this.slices.length === 1) {\n const closedKey = -1 - sliceIndex;\n if (this._expandedSlices.has(closedKey)) {\n this._expandedSlices.delete(closedKey);\n } else {\n this._expandedSlices.add(closedKey);\n this._scrollSliceTitleIntoView(sliceIndex);\n }\n } else {\n if (this._expandedSlices.has(sliceIndex)) {\n this._expandedSlices.delete(sliceIndex);\n } else {\n this._expandedSlices.clear();\n this._expandedSlices.add(sliceIndex);\n this._scrollSliceTitleIntoView(sliceIndex);\n }\n }\n this._cdr.markForCheck();\n }\n\n togglePanel(): void {\n this.isCollapsed = !this.isCollapsed;\n this.collapsedChange.emit(this.isCollapsed);\n this._cdr.markForCheck();\n }\n\n isSliceDynamic(sliceIndex: number): boolean {\n return sliceIndex >= this.staticSliceCount;\n }\n\n isSliceLoading(sliceIndex: number): boolean {\n const staticSlice = (this.sliceConfigs || [])[sliceIndex];\n if (staticSlice?.columnKey) {\n const colDef = (this.columns || []).find(c => c.key === staticSlice.columnKey);\n if (colDef?.lazy) {\n const status = this.lazyStatus.get(staticSlice.columnKey!) ?? 'idle';\n return status === 'loading' || status === 'idle';\n }\n return false;\n }\n const key = this._getDynamicSliceColumnKey(sliceIndex);\n if (!key) return false;\n const colDef = (this.columns || []).find(c => c.key === key);\n if (!colDef?.lazy) return false;\n const status = this.lazyStatus.get(key) ?? 'idle';\n return status === 'loading' || status === 'idle';\n }\n\n isStaticSliceVisible(columnKey: string): boolean {\n return !this._hiddenStaticSliceKeys.has(columnKey);\n }\n\n toggleStaticSlice(columnKey: string): void {\n const next = new Set(this._hiddenStaticSliceKeys);\n if (next.has(columnKey)) next.delete(columnKey);\n else next.add(columnKey);\n this._hiddenStaticSliceKeys = next;\n this._rebuildCache();\n this._emitFilter();\n this._cdr.markForCheck();\n }\n\n // ── Selection ─────────────────────────────────────────────────\n getSliceIcon(slice: SliceConfig<T>): string | undefined {\n if (slice.icon) return slice.icon;\n if (slice.columnKey) {\n return (this.columns || []).find(c => c.key === slice.columnKey)?.icon;\n }\n return undefined;\n }\n isSliceCategoryActive(sliceIndex: number, categoryKey: string): boolean {\n return this.activeKeysBySlice.get(sliceIndex)?.has(categoryKey) ?? false;\n }\n\n isSliceAllActive(sliceIndex: number): boolean {\n return !this.activeKeysBySlice.has(sliceIndex) || this.activeKeysBySlice.get(sliceIndex)!.size === 0;\n }\n\n sliceCategoryCount(sliceIndex: number, categoryKey: string): number {\n const cacheKey = `${sliceIndex}:${categoryKey}`;\n if (this._countCache.has(cacheKey)) {\n return this._countCache.get(cacheKey)!;\n }\n const slice = this._cachedSlices[sliceIndex];\n if (!slice) return 0;\n const category = (slice.categories || []).find((c) => c.key === categoryKey);\n const count = category ? (this.data || []).filter((row) => category.filter(row)).length : 0;\n this._countCache.set(cacheKey, count);\n return count;\n }\n\n isSliceEmpty(sliceIndex: number): boolean {\n const slice = this._cachedSlices[sliceIndex];\n if (!slice) return true;\n return (slice.categories || []).every(c => this.sliceCategoryCount(sliceIndex, c.key) === 0);\n }\n\n onSliceCategorySelected(sliceIndex: number, categoryKey: string): void {\n const slice = this.slices[sliceIndex];\n if (!slice) return;\n if (!this.activeKeysBySlice.has(sliceIndex)) {\n this.activeKeysBySlice.set(sliceIndex, new Set());\n }\n const activeKeys = this.activeKeysBySlice.get(sliceIndex)!;\n if (slice.multiSelect === false) {\n if (activeKeys.has(categoryKey)) {\n activeKeys.clear();\n } else {\n activeKeys.clear();\n activeKeys.add(categoryKey);\n }\n } else {\n if (activeKeys.has(categoryKey)) {\n activeKeys.delete(categoryKey);\n } else {\n activeKeys.add(categoryKey);\n }\n }\n this._emitFilter();\n this._cdr.markForCheck();\n }\n\n onSliceAllSelected(sliceIndex: number): void {\n if (this.activeKeysBySlice.has(sliceIndex)) {\n this.activeKeysBySlice.get(sliceIndex)!.clear();\n }\n this._emitFilter();\n this._cdr.markForCheck();\n }\n\n // ── Dynamic slice management ──────────────────────────────────\n\n addDynamicSlice(column: SliceColumnDef<T>): void {\n const distinctValues = this._computeDistinctValues(column.key);\n const newSlice: SliceConfig<T> = {\n title: column.header,\n columnKey: column.key,\n categories: distinctValues.map((v) => this._buildCategoryFromValue(column.key, v)),\n };\n this._dynamicSlices = [...this._dynamicSlices, { key: column.key, slice: newSlice }];\n this._rebuildCache();\n this.dynamicSliceKeysChange.emit(this._dynamicSlices.map(d => d.key));\n this._emitFilter();\n this._cdr.markForCheck();\n }\n\n removeDynamicSlice(sliceIndex: number): void {\n const dynamicIndex = sliceIndex - this.staticSliceCount;\n if (dynamicIndex < 0) return;\n const newActiveKeys = new Map<number, Set<string>>();\n this.activeKeysBySlice.forEach((keys, idx) => {\n if (idx < sliceIndex) newActiveKeys.set(idx, keys);\n else if (idx > sliceIndex) newActiveKeys.set(idx - 1, keys);\n });\n this.activeKeysBySlice = newActiveKeys;\n this._dynamicSlices = this._dynamicSlices.filter((_, i) => i !== dynamicIndex);\n this._rebuildCache();\n this.dynamicSliceKeysChange.emit(this._dynamicSlices.map(d => d.key));\n this._emitFilter();\n this._cdr.markForCheck();\n }\n\n removeDynamicSliceByKey(key: string): void {\n const dynamicIndex = this._dynamicSlices.findIndex((d) => d.key === key);\n if (dynamicIndex < 0) return;\n const sliceIndex = this.staticSliceCount + dynamicIndex;\n this.removeDynamicSlice(sliceIndex);\n }\n\n // ── Private helpers ───────────────────────────────────────────\n\n private _emitFilter(): void {\n const slices = this.slices;\n const activeKeysBySlice = this.activeKeysBySlice;\n\n this.activeKeysChange.emit(\n slices.map((_, i) => {\n const keys = activeKeysBySlice.get(i);\n return keys ? [...keys] : [];\n })\n );\n\n const pred = (row: T): boolean =>\n slices.every((slice, sliceIndex) => {\n const activeKeys = activeKeysBySlice.get(sliceIndex);\n if (!activeKeys || activeKeys.size === 0) return true;\n return [...activeKeys].some((key) => {\n const category = (slice.categories || []).find((c) => c.key === key);\n return category ? category.filter(row) : false;\n });\n });\n this.filterChange.emit(pred);\n }\n\n private _getDynamicSliceColumnKey(sliceIndex: number): string | null {\n const dynamicIndex = sliceIndex - this.staticSliceCount;\n return this._dynamicSlices[dynamicIndex]?.key ?? null;\n }\n\n private _materializeSlice(slice: SliceConfig<T>): SliceConfig<T> {\n if (!slice.columnKey || (slice.categories && slice.categories.length > 0)) {\n return slice;\n }\n const col = (this.columns || []).find(c => c.key === slice.columnKey);\n const isLazy = !!col?.lazy;\n if (isLazy && this.lazyStatus.get(slice.columnKey!) !== 'loaded') {\n return { ...slice, categories: [] };\n }\n if (slice.bucket) {\n const distinctValues = [...new Set((this.data || []).map(slice.bucket))].sort();\n return {\n ...slice,\n categories: distinctValues.map((v) => ({\n key: v,\n label: v,\n filter: (row: T) => slice.bucket!(row) === v,\n })),\n };\n }\n const distinctValues = this._computeDistinctValues(slice.columnKey!);\n return {\n ...slice,\n categories: distinctValues.map((v) => this._buildCategoryFromValue(slice.columnKey!, v)),\n };\n }\n\n private _buildCategoryFromValue(columnKey: string, v: string): { key: string; label: string; filter: (row: T) => boolean } {\n if (v === EMPTY_CATEGORY_KEY) {\n return {\n key: EMPTY_CATEGORY_KEY,\n label: EMPTY_CATEGORY_LABEL,\n filter: (row: T) => {\n const val = this._getLazyAwareValue(columnKey, row);\n return val == null || val === '';\n },\n };\n }\n return {\n key: v,\n label: v,\n filter: (row: T) => String(this._getLazyAwareValue(columnKey, row) ?? '') === v,\n };\n }\n\n private _computeDistinctValues(columnKey: string): string[] {\n const rawValues = (this.data || []).map((row) => {\n const val = this._getLazyAwareValue(columnKey, row);\n return val != null && val !== '' ? String(val) : null;\n });\n const distinct = [...new Set(rawValues.filter((v): v is string => v !== null))].sort();\n if (rawValues.some(v => v === null)) {\n distinct.push(EMPTY_CATEGORY_KEY);\n }\n return distinct;\n }\n\n private _getLazyAwareValue(columnKey: string, row: T): any {\n const colDef = (this.columns || []).find(c => c.key === columnKey);\n if (colDef?.lazy) {\n return this.lazyData.get(columnKey)?.get(row) ?? null;\n }\n if (colDef?.value) {\n return colDef.value(row, 0);\n }\n return (row as any)[columnKey];\n }\n\n private _rebuildCache(): void {\n const staticSlices = (this.sliceConfigs || []).filter(\n (s) => !s.columnKey || !this._hiddenStaticSliceKeys.has(s.columnKey)\n );\n const allSlices = [...staticSlices, ...this._dynamicSlices.map((d) => d.slice)];\n this._cachedSlices = allSlices.map((slice) => this._materializeSlice(slice));\n this._countCache.clear();\n }\n\n private _refreshDynamicSlices(): void {\n this._dynamicSlices = this._dynamicSlices.map(({ key, slice }) => {\n const distinctValues = this._computeDistinctValues(key);\n return {\n key,\n slice: {\n ...slice,\n categories: distinctValues.map((v) => this._buildCategoryFromValue(key, v)),\n },\n };\n });\n }\n\n private _scrollSliceTitleIntoView(sliceIndex: number): void {\n setTimeout(() => {\n const container = this.slicePanelBodyRef?.nativeElement;\n if (!container) return;\n const row = container.querySelector(`[data-slice-index=\"${sliceIndex}\"]`) as HTMLElement;\n if (!row) return;\n row.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }, 0);\n }\n}\n","<div class=\"slice-panel-wrapper\" [class.collapsed]=\"isCollapsed\">\n <aside class=\"slice-panel\" [class.collapsed]=\"isCollapsed\">\n <div class=\"slice-panel-header\">\n <span *ngIf=\"!isCollapsed\" class=\"slice-panel-title\">\n <mat-icon class=\"slice-panel-title-icon\" fontSet=\"material-icons-outlined\">filter_list</mat-icon>\n {{ slices.length > 1 ? 'Filtres' : 'Filtre' }}\n </span>\n <button\n *ngIf=\"showToggle\"\n type=\"button\"\n class=\"slice-toggle\"\n [attr.aria-label]=\"isCollapsed ? 'Déplier le filtre' : 'Replier le filtre'\"\n (click)=\"togglePanel()\"\n >\n <span class=\"slice-toggle-icon\">{{ isCollapsed ? '›' : '‹' }}</span>\n </button>\n </div>\n\n <div class=\"slice-panel-body\" *ngIf=\"!isCollapsed\" #slicePanelBody>\n <ng-container *ngFor=\"let slice of slices; let si = index; trackBy: trackBySliceIndex\">\n <div class=\"slice-title-row\" [attr.data-slice-index]=\"si\" (click)=\"toggleSliceCollapse(si)\">\n <span class=\"slice-title-chevron\" [class.expanded]=\"!isSliceCollapsed(si)\">›</span>\n <mat-icon *ngIf=\"getSliceIcon(slice)\" class=\"slice-title-icon\" fontSet=\"material-icons-outlined\">{{ getSliceIcon(slice) }}</mat-icon>\n <p class=\"slice-title\">{{ slice.title || 'Filtrer' }}</p>\n <button\n *ngIf=\"isSliceDynamic(si)\"\n type=\"button\"\n class=\"slice-remove-btn\"\n (click)=\"$event.stopPropagation(); removeDynamicSlice(si)\"\n >×</button>\n </div>\n\n <div class=\"slice-section-items\" *ngIf=\"!isSliceCollapsed(si)\">\n <ng-container *ngIf=\"isSliceLoading(si); else sliceContent\">\n <div class=\"slice-lazy-loading\">\n <span class=\"lazy-skeleton\"></span>\n <span class=\"lazy-skeleton\"></span>\n <span class=\"lazy-skeleton\"></span>\n </div>\n </ng-container>\n <ng-template #sliceContent>\n <ng-container *ngFor=\"let category of slice.categories; trackBy: trackByCategoryKey\">\n <button\n *ngIf=\"sliceCategoryCount(si, category.key) > 0\"\n class=\"slice-item\"\n type=\"button\"\n [class.active]=\"isSliceCategoryActive(si, category.key)\"\n [attr.data-category-key]=\"category.key\"\n [title]=\"category.label\"\n (click)=\"onSliceCategorySelected(si, category.key)\"\n >\n <span>{{ category.label }}</span>\n <span *ngIf=\"showCounts\">{{ sliceCategoryCount(si, category.key) }}</span>\n </button>\n </ng-container>\n <div *ngIf=\"isSliceEmpty(si)\" class=\"slice-empty-state\">Aucune donnée</div>\n </ng-template>\n </div>\n\n <hr *ngIf=\"si < slices.length - 1\" class=\"slice-divider\" />\n </ng-container>\n </div>\n </aside>\n</div>\n","import { MatPaginatorIntl } from '@angular/material/paginator';\n\n/** Traductions françaises du paginator Material. */\nexport function getFrenchPaginatorIntl(): MatPaginatorIntl {\n const intl = new MatPaginatorIntl();\n intl.itemsPerPageLabel = 'Éléments par page :';\n intl.nextPageLabel = 'Page suivante';\n intl.previousPageLabel = 'Page précédente';\n intl.firstPageLabel = 'Première page';\n intl.lastPageLabel = 'Dernière page';\n intl.getRangeLabel = (page: number, pageSize: number, length: number) => {\n if (length === 0 || pageSize === 0) return `0 sur ${length}`;\n length = Math.max(length, 0);\n const start = page * pageSize;\n const end = start < length ? Math.min(start + pageSize, length) : start + pageSize;\n return `${start + 1} – ${end} sur ${length}`;\n };\n return intl;\n}\n\n/**\n * Convertit une valeur brute en chaîne affichable.\n * - null/undefined → ''\n * - Date → format locale fr-FR\n * - Tableau → valeurs jointes par ', '\n * - Objet avec label/name → sa valeur string\n * - Autres → String(value)\n */\nexport function normalizeCellValue(value: any): any {\n if (value === null || value === undefined) {\n return '';\n }\n if (value instanceof Date) {\n return value.toLocaleString('fr-FR');\n }\n if (Array.isArray(value)) {\n return value.map((item) => normalizeCellValue(item)).join(', ');\n }\n if (typeof value === 'object') {\n if ('label' in value && value.label !== undefined) {\n return String(value.label);\n }\n if ('name' in value && value.name !== undefined) {\n return String(value.name);\n }\n return JSON.stringify(value);\n }\n return value;\n}\n\n/**\n * Transforme une clé camelCase/snake_case en libellé lisible.\n * Ex: 'createdAt' → 'Created at', 'my_field' → 'My field'\n */\nexport function humanizeKey(key: string): string {\n return key\n .replaceAll(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replaceAll(/[_-]+/g, ' ')\n .replace(/^./, (value) => value.toUpperCase());\n}\n","import { CommonModule } from '@angular/common';\nimport { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, inject, Input, OnChanges, OnDestroy, Output, QueryList, SimpleChanges, TemplateRef, ViewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\nimport { MatPaginator, MatPaginatorIntl, MatPaginatorModule } from '@angular/material/paginator';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSort, MatSortModule } from '@angular/material/sort';\nimport { MatTableDataSource, MatTableModule } from '@angular/material/table';\nimport { Subject, take, takeUntil } from 'rxjs';\nimport { TableColumnProvider, TableProvider } from '../jquery-table.model';\nimport { JqtCellDefDirective } from '../directive/jqt-cell-def.directive';\nimport { SlicePanelComponent } from './slice-panel/slice-panel.component';\nimport { getFrenchPaginatorIntl, humanizeKey, normalizeCellValue } from './table.utils';\n\n@Component({\n standalone: true,\n selector: 'jquery-table',\n imports: [ CommonModule, FormsModule, MatTableModule, MatButtonModule, MatPaginatorModule, MatSortModule, MatMenuModule, MatIconModule, MatSelectModule, SlicePanelComponent ],\n templateUrl: './table.component.html',\n styleUrls: ['./table.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: MatPaginatorIntl, useFactory: getFrenchPaginatorIntl }],\n})\nexport class TableComponent<T = any> implements OnChanges, AfterViewInit, OnDestroy {\n @Input() config?: TableProvider<T>;\n\n @Input() dataSource?: T[] | { data: T[] };\n @Input() data?: T[];\n @Input() displayedColumns?: string[];\n @Input() columnsConfig?: TableColumnProvider<T>[];\n\n @Input() columnLabels?: Record<string, string>;\n @Input() isLoading = false;\n\n @Output() addRequested = new EventEmitter<void>();\n @Output() columnAdded = new EventEmitter<TableColumnProvider<T>>();\n @Output() columnRemoved = new EventEmitter<TableColumnProvider<T>>();\n @Output() categorySelected = new EventEmitter<string>();\n @Output() rowSelected = new EventEmitter<T>();\n\n @ViewChild(MatPaginator)\n set paginator(value: MatPaginator | undefined) {\n this._paginator = value;\n if (value) {\n this.attachPaginator();\n this._scheduleRender();\n }\n }\n get paginator(): MatPaginator | undefined { return this._paginator; }\n private _paginator?: MatPaginator;\n @ViewChild(MatSort) sort?: MatSort;\n @ViewChild('tableBodyScroll') tableBodyScrollRef?: ElementRef<HTMLElement>;\n @ViewChild(SlicePanelComponent) slicePanelRef?: SlicePanelComponent<T>;\n @ViewChild('viewMenuTrigger') viewMenuTrigger?: MatMenuTrigger;\n @ContentChildren(JqtCellDefDirective) _cellDefs!: QueryList<JqtCellDefDirective>;\n\n renderedColumns: string[] = [];\n tableDataSource = new MatTableDataSource<any>([]);\n activeColumns: TableColumnProvider<T>[] = [];\n\n activeSliceFilter: (row: T) => boolean = () => true;\n\n // Propriétés stables pour les bindings du template (contre erreur NG0100)\n _sliceConfigs: any[] = [];\n _sliceColumns: TableColumnProvider<T>[] = [];\n _sliceData: T[] = [];\n _sliceShowToggle = true;\n _staticSlicesForMenu: Array<{ key: string; title: string; icon?: string }> = [];\n _activeDynamicSliceColumns: TableColumnProvider<T>[] = [];\n _availableColumnsForDynamicSlice: TableColumnProvider<T>[] = [];\n _allDynamicSliceColumns: TableColumnProvider<T>[] = [];\n _activeSliceByLabel = 'Aucun';\n\n searchQuery = '';\n activeGroupByKey: string | null = null;\n _matSortActive = '';\n _matSortDirection: 'asc' | 'desc' | '' = '';\n private _collapsedGroups = new Set<string>();\n private _activeSort: { active: string; direction: 'asc' | 'desc' | '' } = { active: '', direction: '' };\n private _sortSubscribed: MatSort | null = null;\n private _destroy$ = new Subject<void>();\n private _defaultGroupCollapsed = false;\n private _groupPages = new Map<string, number>();\n private _totalFilteredCount = 0;\n\n _lazyColumnStatus = new Map<string, 'idle' | 'loading' | 'loaded' | 'error'>();\n _lazyColumnData = new Map<string, Map<any, any>>();\n private _lazyFetchCancels = new Map<string, Subject<void>>();\n private _cdr = inject(ChangeDetectorRef);\n private _el = inject(ElementRef<HTMLElement>);\n\n isGroupHeader = (_: number, row: any): boolean => row.__groupHeader === true;\n\n // ── Lifecycle ──────────────────────────────────────────────────────────────\n\n pageSize = 5;\n pageSizeOptions: number[] = [5, 10, 20];\n pageSizeOptionsGroupBy: number[] = [5, 10, 20];\n groupPageSize = 5;\n groupSortOrder: 'asc' | 'desc' = 'asc';\n\n draggedColumnKey: string | null = null;\n dragOverColumnKey: string | null = null;\n\n private userCustomizedColumns = false;\n private resolvedConfig: TableProvider<T> = { columns: [] };\n private _columnMap: Map<string, TableColumnProvider<T>> = new Map();\n private _resolvedData: T[] = [];\n private _preservePageIndex: number | null = null;\n private _initialSearchApplied = false;\n\n // Seuil au-delà duquel le rendu groupé est bloqué pour protéger le navigateur\n private static readonly MAX_GROUP_COUNT = 500;\n\n // ── Optimisation performance ─────────────────────────────────────────────\n private _allFilteredRows: T[] = [];\n private _paginatorSubscribed: MatPaginator | null = null;\n\n // Cache groupBy : invalide uniquement quand les données/tri/groupKey changent\n private _groupCacheRows: T[] | null = null;\n private _groupCacheKey: string | null = null;\n private _groupCacheSortOrder: 'asc' | 'desc' = 'asc';\n private _groupCacheSortActive: string = '';\n private _groupCacheSortDir: string = '';\n private _groupCacheOrder: string[] = [];\n private _groupCacheMap: Map<string, T[]> = new Map();\n private _pendingRender: ReturnType<typeof setTimeout> | null = null;\n\n\n ngOnChanges(changes: SimpleChanges): void {\n const dataChanged = !!(changes['config'] || changes['data'] || changes['dataSource']);\n if (dataChanged) {\n this._lazyFetchCancels.forEach(s => { s.next(); s.complete(); });\n this._lazyFetchCancels.clear();\n this._lazyColumnStatus = new Map();\n this._lazyColumnData = new Map();\n }\n if (changes['config'] && !this._initialSearchApplied) {\n const initial = this.config?.search?.initialQuery;\n if (initial != null) {\n this.searchQuery = initial;\n this._initialSearchApplied = true;\n }\n }\n this.refreshViewModel();\n if (dataChanged) {\n this.activeColumns.filter(c => c.lazy).forEach(c => this.triggerLazyFetch(c));\n }\n }\n\n ngAfterViewInit(): void {\n this.attachPaginator();\n this.attachSort();\n this._measureHeaderHeight();\n }\n\n ngOnDestroy(): void {\n if (this._pendingRender !== null) {\n clearTimeout(this._pendingRender);\n }\n this._destroy$.next();\n this._destroy$.complete();\n }\n\n private _measureHeaderHeight(): void {\n const headerRow = this._el.nativeElement.querySelector('tr.mat-mdc-header-row') as HTMLElement;\n if (headerRow) {\n const h = headerRow.getBoundingClientRect().height;\n if (h > 0) {\n this._el.nativeElement.style.setProperty('--actual-header-height', h + 'px');\n }\n }\n }\n\n // ── Getters d'affichage ────────────────────────────────────────────────────\n\n get title(): string {\n return this.resolvedConfig.title ?? '';\n }\n\n get showTitle(): boolean {\n return !!this.resolvedConfig.title;\n }\n\n get visibleColumns(): TableColumnProvider<T>[] {\n return this.activeColumns;\n }\n\n get showSearchBar(): boolean { return this.resolvedConfig.search?.enabled === true; }\n get showViewButton(): boolean { return this.resolvedConfig.view?.enabled === true; }\n get showToolbar(): boolean { return this.showSearchBar || this.showViewButton; }\n get showFields(): boolean { return this.showViewButton; }\n get showGroupBySection(): boolean { return this.showViewButton && this.groupByColumns.length > 0; }\n\n get filteredRowCount(): number {\n return this.activeGroupByKey ? this._totalFilteredCount : this._allFilteredRows.length;\n }\n\n get activeGroupByLabel(): string {\n if (!this.activeGroupByKey) return 'Aucun';\n const col = this.groupByColumns.find((c) => c.key === this.activeGroupByKey);\n return col?.header || this.activeGroupByKey;\n }\n\n get totalColumnCount(): number {\n return new Set((this.resolvedConfig.columns || []).map((c) => c.key)).size;\n }\n\n get activeSliceByLabel(): string {\n return this._activeSliceByLabel;\n }\n\n get activeDynamicSliceColumns(): TableColumnProvider<T>[] {\n return this._activeDynamicSliceColumns;\n }\n\n removeDynamicSliceByKey(key: string): void {\n this.slicePanelRef?.removeDynamicSliceByKey(key);\n }\n\n get groupByColumns(): TableColumnProvider<T>[] {\n const all = this.resolvedConfig.columns || [];\n const seen = new Set<string>();\n return all.filter((c) => {\n if (c.groupable === false || seen.has(c.key)) return false;\n if (!c.header && c.groupable !== true) return false;\n seen.add(c.key);\n return true;\n });\n }\n\n colLabel(col: { key: string; header?: string }): string {\n return col.header || humanizeKey(col.key);\n }\n\n // ── Actions utilisateur ────────────────────────────────────────────────────\n\n onSearchChange(): void {\n this._preservePageIndex = 0;\n this.refreshViewModel();\n this.paginator?.firstPage();\n }\n\n onGroupByChange(key: string | null): void {\n this.activeGroupByKey = key;\n this._defaultGroupCollapsed = key !== null;\n this._collapsedGroups.clear();\n this._groupPages.clear();\n this.groupPageSize = this.resolveDefaultGroupPageSize();\n this.refreshViewModel();\n this.paginator?.firstPage();\n if (key) {\n this.viewMenuTrigger?.closeMenu();\n const colDef = (this.resolvedConfig.columns || []).find(c => c.key === key);\n if (colDef?.lazy && this._lazyColumnStatus.get(key) !== 'loaded') {\n this.triggerLazyFetch(colDef);\n }\n } else {\n setTimeout(() => {\n this.tableBodyScrollRef?.nativeElement.scrollTo({ top: 0, behavior: 'smooth' });\n }, 0);\n }\n }\n\n onGroupPageSizeChange(size: number | string): void {\n this.groupPageSize = Number(size);\n this._groupPages.clear();\n this.refreshViewModel();\n }\n\n onGroupSortToggle(dir: 'asc' | 'desc'): void {\n if (this.groupSortOrder === dir) return;\n this.groupSortOrder = dir;\n this._groupPages.clear();\n this.refreshViewModel();\n const openGroup = this._defaultGroupCollapsed\n ? (this._collapsedGroups.size === 1 ? [...this._collapsedGroups][0] : null)\n : null;\n if (openGroup) {\n setTimeout(() => this.scrollToGroupHeader(openGroup), 0);\n }\n }\n\n // ── Lazy loading ─────────────────────────────────────────────────────────\n\n getLazyColumnStatus(key: string): 'idle' | 'loading' | 'loaded' | 'error' {\n return this._lazyColumnStatus.get(key) ?? 'idle';\n }\n\n getLazyRenderType(rowValue: any): 'loading' | 'error' | 'value' {\n if (rowValue === '__lazy_loading__') return 'loading';\n if (rowValue === '__lazy_error__') return 'error';\n return 'value';\n }\n\n retryLazyColumn(column: TableColumnProvider<T>): void {\n const k = column.key;\n const prev = this._lazyFetchCancels.get(k);\n if (prev) { prev.next(); prev.complete(); }\n this._lazyFetchCancels.delete(k);\n const newStatus = new Map(this._lazyColumnStatus);\n newStatus.delete(k);\n this._lazyColumnStatus = newStatus;\n const newData = new Map(this._lazyColumnData);\n newData.delete(k);\n this._lazyColumnData = newData;\n this.triggerLazyFetch(column);\n }\n\n triggerLazyFetch(column: TableColumnProvider<T>): void {\n if (!column.lazy) return;\n const k = column.key;\n if (this._lazyColumnStatus.get(k) === 'loading') return;\n\n const prev = this._lazyFetchCancels.get(k);\n if (prev) { prev.next(); prev.complete(); }\n const cancel$ = new Subject<void>();\n this._lazyFetchCancels.set(k, cancel$);\n\n const newStatus1 = new Map(this._lazyColumnStatus);\n newStatus1.set(k, 'loading');\n this._lazyColumnStatus = newStatus1;\n this.refreshViewModel();\n\n column.lazy.fetchFn().pipe(\n take(1),\n takeUntil(cancel$),\n ).subscribe({\n next: (values: any[]) => {\n const rowMap = new Map<any, any>();\n const data = this._resolvedData;\n values.forEach((value, i) => {\n if (i < data.length) rowMap.set(data[i], value);\n });\n const newData = new Map(this._lazyColumnData);\n newData.set(k, rowMap);\n this._lazyColumnData = newData;\n const newStatus2 = new Map(this._lazyColumnStatus);\n newStatus2.set(k, 'loaded');\n this._lazyColumnStatus = newStatus2;\n this.refreshViewModel();\n this._cdr.markForCheck();\n },\n error: () => {\n const newStatusErr = new Map(this._lazyColumnStatus);\n newStatusErr.set(k, 'error');\n this._lazyColumnStatus = newStatusErr;\n this.refreshViewModel();\n this._cdr.markForCheck();\n },\n });\n }\n\n // ── Groupement ────────────────────────────────────────────────────────────\n\n toggleGroupCollapse(groupKey: string): void {\n if (this._collapsedGroups.has(groupKey)) {\n this._collapsedGroups.delete(groupKey);\n } else {\n this._collapsedGroups.clear();\n this._collapsedGroups.add(groupKey);\n setTimeout(() => this.scrollToGroupHeader(groupKey), 0);\n }\n // Court-circuit de refreshViewModel : la data et les colonnes n'ont pas changé,\n // seul l'état collapsed change — reprojection directe sans rebuild complet\n this._projectCurrentPage();\n this._cdr.markForCheck();\n }\n\n private scrollToGroupHeader(groupKey: string): void {\n const container = this.tableBodyScrollRef?.nativeElement;\n if (!container) return;\n const row = container.querySelector<HTMLElement>(`tr[data-group-key=\"${CSS.escape(groupKey)}\"]`);\n if (!row) return;\n const headerHeight = parseFloat(\n this._el.nativeElement.style.getPropertyValue('--actual-header-height') || '56'\n ) || 56;\n const containerRect = container.getBoundingClientRect();\n const rowRect = row.getBoundingClientRect();\n const currentScrollTop = container.scrollTop;\n const targetScrollTop = currentScrollTop + (rowRect.top - containerRect.top) - headerHeight;\n container.scrollTo({ top: targetScrollTop, behavior: 'smooth' });\n }\n\n isGroupCollapsed(groupKey: string): boolean {\n return this._defaultGroupCollapsed ? !this._collapsedGroups.has(groupKey) : this._collapsedGroups.has(groupKey);\n }\n\n groupPageBack(groupKey: string): void {\n const current = this._groupPages.get(groupKey) ?? 0;\n if (current > 0) {\n this._groupPages.set(groupKey, current - 1);\n this._projectCurrentPage();\n this._cdr.markForCheck();\n }\n }\n\n groupPageForward(groupKey: string, totalCount: number): void {\n const maxPage = Math.ceil(totalCount / this.groupPageSize) - 1;\n const current = this._groupPages.get(groupKey) ?? 0;\n if (current < maxPage) {\n this._groupPages.set(groupKey, current + 1);\n this._projectCurrentPage();\n this._cdr.markForCheck();\n }\n }\n\n // ── Colonnes ──────────────────────────────────────────────────────────────\n\n get hasAddableColumns(): boolean {\n return this.menuBaseColumns.length > 0 || this.menuOptionalColumns.length > 0;\n }\n\n get menuBaseColumns(): TableColumnProvider<T>[] {\n return this.uniqueColumnsByKey((this.resolvedConfig.columns || []).filter((c) => !c.optional));\n }\n\n get menuOptionalColumns(): TableColumnProvider<T>[] {\n return this.uniqueColumnsByKey((this.resolvedConfig.columns || []).filter((c) => c.optional));\n }\n\n get availableColumnsToAdd(): TableColumnProvider<T>[] {\n const activeKeys = new Set(this.activeColumns.map((column) => column.key));\n return (this.resolvedConfig.columns || []).filter((c) => c.optional && !activeKeys.has(c.key));\n }\n\n get allowColumnRemoval(): boolean {\n return this.resolvedConfig.view?.enableColumnRemoval !== false;\n }\n\n // ── Slices ────────────────────────────────────────────────────────────────\n\n get hasSliceConfig(): boolean {\n return (this.resolvedConfig.slices?.length ?? 0) > 0;\n }\n\n get showSlicePanel(): boolean {\n return this.slicePanelRef?.showPanel ?? (this.hasSliceConfig && this._resolvedData.length > 0);\n }\n\n get showAddSliceButton(): boolean {\n return this.showViewButton && ((this.resolvedConfig.slices?.length ?? 0) > 0 || this._allDynamicSliceColumns.length > 0);\n }\n\n get staticSlicesForMenu(): Array<{ key: string; title: string; icon?: string }> {\n return this._staticSlicesForMenu;\n }\n\n get availableColumnsForDynamicSlice(): TableColumnProvider<T>[] {\n return this._availableColumnsForDynamicSlice;\n }\n\n isStaticSliceVisible(columnKey: string): boolean {\n return this.slicePanelRef?.isStaticSliceVisible(columnKey) ?? true;\n }\n\n toggleStaticSlice(columnKey: string): void {\n this.slicePanelRef?.toggleStaticSlice(columnKey);\n }\n\n addDynamicSlice(column: TableColumnProvider<T>): void {\n this.slicePanelRef?.addDynamicSlice(column);\n if (column.lazy && this._lazyColumnStatus.get(column.key) !== 'loaded') {\n this.triggerLazyFetch(column);\n }\n }\n\n get allDynamicSliceColumns(): TableColumnProvider<T>[] {\n return this._allDynamicSliceColumns;\n }\n\n isDynamicSliceActive(key: string): boolean {\n return this._activeDynamicSliceColumns.some(c => c.key === key);\n }\n\n toggleDynamicSlice(col: TableColumnProvider<T>): void {\n if (this.isDynamicSliceActive(col.key)) {\n this.removeDynamicSliceByKey(col.key);\n } else {\n this.addDynamicSlice(col);\n }\n }\n\n onSliceFilterChange(pred: (row: T) => boolean): void {\n this.activeSliceFilter = pred;\n this._preservePageIndex = 0;\n this.refreshViewModel();\n this.paginator?.firstPage();\n }\n\n onDynamicSliceKeysChange(keys: string[]): void {\n const allCols = this.resolvedConfig.columns ?? [];\n const staticKeys = new Set(\n (this.resolvedConfig.slices ?? []).map(s => s.columnKey).filter((k): k is string => !!k)\n );\n const dynamicKeySet = new Set(keys);\n const existingKeys = new Set([...staticKeys, ...dynamicKeySet]);\n this._activeDynamicSliceColumns = keys\n .map(k => allCols.find(c => c.key === k))\n .filter((c): c is TableColumnProvider<T> => !!c);\n const seen = new Set<string>();\n this._availableColumnsForDynamicSlice = allCols.filter(c => {\n if (c.sliceable === false || existingKeys.has(c.key) || seen.has(c.key)) return false;\n seen.add(c.key);\n return true;\n });\n this._computeSliceLabel();\n this._cdr.markForCheck();\n }\n\n get emptyStateLabel(): string {\n return this.resolvedConfig.labels?.empty || 'Aucune donnée';\n }\n\n get loadingStateLabel(): string {\n return this.resolvedConfig.labels?.loading || 'Chargement des données...';\n }\n\n get effectiveIsLoading(): boolean {\n return this.isLoading || this._pendingRender !== null;\n }\n\n get isEmpty(): boolean {\n return !this.effectiveIsLoading && this._allFilteredRows.length === 0;\n }\n\n get showPagination(): boolean {\n if (this.activeGroupByKey !== null) return false;\n return this.resolvedConfig.pagination?.enabled !== false;\n }\n\n get isColumnDragDropEnabled(): boolean {\n return this.resolvedConfig.view?.enableColumnDragDrop === true;\n }\n\n get totalRows(): number {\n return this.activeGroupByKey\n ? this.tableDataSource.data.filter((r) => !r.__groupHeader).length\n : this._allFilteredRows.length;\n }\n\n // ── Gestion des colonnes ─────────────────────────────────────────────────\n\n onAddColumn(column: TableColumnProvider<T>): void {\n this.userCustomizedColumns = true;\n const configCols = this.resolvedConfig.columns ?? [];\n const configIndex = configCols.findIndex(c => c.key === column.key);\n if (configIndex === -1) {\n this.activeColumns = [...this.activeColumns, column];\n } else {\n const insertBefore = this.activeColumns.findIndex(c => {\n const ci = configCols.findIndex(cc => cc.key === c.key);\n return ci !== -1 && ci > configIndex;\n });\n if (insertBefore === -1) {\n this.activeColumns = [...this.activeColumns, column];\n } else {\n const copy = [...this.activeColumns];\n copy.splice(insertBefore, 0, column);\n this.activeColumns = copy;\n }\n }\n this._preservePageIndex = this.paginator?.pageIndex ?? null;\n this.refreshViewModel();\n\n if (column.lazy) {\n this.triggerLazyFetch(column);\n }\n\n this.addRequested.emit();\n this.columnAdded.emit(column);\n }\n\n onColumnVisibilityChange(column: TableColumnProvider<T>, checked: boolean): void {\n const isVisible = this.isColumnVisible(column.key);\n\n if (checked && !isVisible) {\n this.onAddColumn(column);\n return;\n }\n\n if (!checked && isVisible) {\n if (!column.optional && !this.allowColumnRemoval) {\n return;\n }\n\n if (this.activeColumns.length <= 1) {\n return;\n }\n\n this.userCustomizedColumns = true;\n this.activeColumns = this.activeColumns.filter((item) => item.key !== column.key);\n this._preservePageIndex = this.paginator?.pageIndex ?? null;\n this.refreshViewModel();\n this.columnRemoved.emit(column);\n }\n }\n\n isColumnVisible(columnKey: string): boolean {\n return this.activeColumns.some((column) => column.key === columnKey);\n }\n\n onRemoveColumn(columnKey: string, event?: Event): void {\n event?.stopPropagation();\n if (!this.allowColumnRemoval) {\n return;\n }\n\n const column = this.activeColumns.find((item) => item.key === columnKey);\n if (!column || !this.canRemoveColumn(column)) {\n return;\n }\n\n this.userCustomizedColumns = true;\n this.activeColumns = this.activeColumns.filter((item) => item.key !== columnKey);\n\n this.refreshViewModel();\n this.columnRemoved.emit(column);\n }\n\n // ── Lignes ────────────────────────────────────────────────────────────────\n\n getCellTemplate(key: string): TemplateRef<{ $implicit: any; index: number }> | null {\n return this._cellDefs?.find((d) => d.columnKey === key)?.template ?? null;\n }\n\n get hasCustomCellDefs(): boolean {\n return (this._cellDefs?.length ?? 0) > 0;\n }\n\n get hasRowClickHandler(): boolean {\n return this.rowSelected.observed || !!this.config?.onRowSelected;\n }\n\n trackRowFn = (_index: number, row: any): any =>\n row.__groupHeader ? `__group_${row.__groupKey}` : row.__index ?? _index;\n\n getRowClass(row: any): string | string[] | Record<string, boolean> {\n const fn = this.resolvedConfig.rowClass;\n if (!fn || row?.__groupHeader) return {};\n return fn(row.__raw ?? row, row.__index ?? 0);\n }\n\n onRowClick(row: any, event: MouseEvent | null): void {\n if (row?.__groupHeader) return;\n if (!this.hasRowClickHandler) return;\n const resolved = (row?.__raw ?? row) as T;\n this.rowSelected.emit(resolved);\n this.config?.onRowSelected?.(resolved, event);\n }\n\n // ── Drag & drop ───────────────────────────────────────────────────────────\n\n onHeaderDragStart(columnKey: string, event: DragEvent): void {\n if (!this.isColumnDragDropEnabled) {\n return;\n }\n\n this.draggedColumnKey = columnKey;\n this.dragOverColumnKey = null;\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', columnKey);\n }\n }\n\n onHeaderDragOver(columnKey: string, event: DragEvent): void {\n if (!this.isColumnDragDropEnabled || !this.draggedColumnKey) {\n return;\n }\n\n event.preventDefault();\n this.dragOverColumnKey = columnKey;\n }\n\n onHeaderDrop(targetColumnKey: string, event: DragEvent): void {\n if (!this.isColumnDragDropEnabled || !this.draggedColumnKey) {\n return;\n }\n\n event.preventDefault();\n\n const previousIndex = this.activeColumns.findIndex((column) => column.key === this.draggedColumnKey);\n const currentIndex = this.activeColumns.findIndex((column) => column.key === targetColumnKey);\n\n if (previousIndex === -1 || currentIndex === -1 || previousIndex === currentIndex) {\n this.onHeaderDragEnd();\n return;\n }\n\n this.userCustomizedColumns = true;\n const reordered = [...this.activeColumns];\n const [moved] = reordered.splice(previousIndex, 1);\n reordered.splice(currentIndex, 0, moved);\n this.activeColumns = reordered;\n this.refreshViewModel();\n this.onHeaderDragEnd();\n }\n\n onHeaderDragEnd(): void {\n this.draggedColumnKey = null;\n this.dragOverColumnKey = null;\n }\n\n isHeaderDropTarget(columnKey: string): boolean {\n return !!this.draggedColumnKey && this.dragOverColumnKey === columnKey && this.draggedColumnKey !== columnKey;\n }\n\n canRemoveColumn(column: TableColumnProvider<T>): boolean {\n return (\n this.allowColumnRemoval &&\n column.removable !== false &&\n this.activeColumns.length > 1\n );\n }\n\n isCellEmpty(value: any): boolean {\n return value === '' || value == null;\n }\n\n asTitle(value: any): string {\n if (value === null || value === undefined) {\n return '';\n }\n return String(value);\n }\n\n // ── Pipeline de données (privé) ──────────────────────────────────────────\n\n private refreshViewModel(): void {\n this._resolvedData = this.resolveData();\n this.resolvedConfig = this.buildEffectiveConfig();\n this._columnMap = new Map((this.resolvedConfig.columns || []).map(c => [c.key, c]));\n const defaultColumns = (this.resolvedConfig.columns || []).filter(c => !c.optional);\n\n if (!this.userCustomizedColumns || this.activeColumns.length === 0) {\n this.activeColumns = [...defaultColumns];\n } else {\n const allowedKeys = new Set(\n (this.resolvedConfig.columns || []).map((column) => column.key)\n );\n this.activeColumns = this.activeColumns.filter((column) => allowedKeys.has(column.key));\n }\n\n this.renderedColumns = this.activeColumns.map((column) => column.key);\n\n this.pageSize = this.paginator?.pageSize || this.resolvePageSize();\n this.pageSizeOptions = this.resolvePageSizeOptions();\n this.pageSizeOptionsGroupBy = this.resolvePageSizeOptionsGroupBy();\n if (this.groupPageSize !== 0 && !this.pageSizeOptionsGroupBy.includes(this.groupPageSize)) {\n this.groupPageSize = this.resolveDefaultGroupPageSize();\n }\n\n this.attachPaginator();\n this.attachSort();\n\n // Mise à jour des propriétés stables pour les bindings du template\n this._sliceConfigs = this.resolvedConfig.slices ?? [];\n this._sliceColumns = this.resolvedConfig.columns ?? [];\n this._sliceData = this._resolvedData;\n this._sliceShowToggle = this.resolvedConfig.enableSliceToggle !== false;\n this._staticSlicesForMenu = (this.resolvedConfig.slices ?? [])\n .filter(s => !!s.columnKey)\n .map(s => {\n const colIcon = (this.resolvedConfig.columns ?? []).find(c => c.key === s.columnKey)?.icon;\n return { key: s.columnKey!, title: s.title || humanizeKey(s.columnKey!), icon: s.icon ?? colIcon };\n });\n if (!this._activeSort.active && this.resolvedConfig.defaultSort) {\n this._matSortActive = this.resolvedConfig.defaultSort.active;\n this._matSortDirection = this.resolvedConfig.defaultSort.direction;\n }\n const staticKeys = new Set(\n (this.resolvedConfig.slices ?? []).map(s => s.columnKey).filter((k): k is string => !!k)\n );\n const activeDynKeys = new Set(this._activeDynamicSliceColumns.map(c => c.key));\n const seen = new Set<string>();\n this._availableColumnsForDynamicSlice = (this.resolvedConfig.columns ?? []).filter(c => {\n if (c.sliceable === false || staticKeys.has(c.key) || activeDynKeys.has(c.key) || seen.has(c.key)) return false;\n if (!c.header && c.sliceable !== true) return false;\n seen.add(c.key);\n return true;\n });\n const seen2 = new Set<string>();\n this._allDynamicSliceColumns = (this.resolvedConfig.columns ?? []).filter(c => {\n if (c.sliceable === false || staticKeys.has(c.key) || seen2.has(c.key)) return false;\n if (!c.header && c.sliceable !== true) return false;\n seen2.add(c.key);\n return true;\n });\n this._computeSliceLabel();\n\n this._scheduleRender();\n }\n\n private _computeSliceLabel(): void {\n const visibleStaticCount = this.slicePanelRef?.staticSliceCount\n ?? this._sliceConfigs.length;\n const total = visibleStaticCount + this._activeDynamicSliceColumns.length;\n if (total === 0) { this._activeSliceByLabel = 'Aucun'; return; }\n if (total === 1) {\n if (visibleStaticCount === 1) {\n const first = this._sliceConfigs.find(\n s => !s.columnKey || this.isStaticSliceVisible(s.columnKey)\n );\n this._activeSliceByLabel = first?.title || first?.columnKey || '1';\n return;\n }\n this._activeSliceByLabel = this._activeDynamicSliceColumns[0]?.header || '1';\n return;\n }\n this._activeSliceByLabel = `${total} actifs`;\n }\n\n private _scheduleRender(): void {\n if (this._pendingRender !== null) {\n clearTimeout(this._pendingRender);\n this._pendingRender = null;\n }\n this._pendingRender = setTimeout(() => {\n this._pendingRender = null;\n this._executeRender();\n }, 0);\n }\n\n private _executeRender(): void {\n const categoryRows = this.getCategoryFilteredData();\n if (this.activeGroupByKey) {\n // En mode groupBy, projectRows gère tout le tri internement — pas de sort global inutile\n this._allFilteredRows = categoryRows;\n } else {\n const compareFn = this._buildSortComparator();\n this._allFilteredRows = compareFn ? [...categoryRows].sort(compareFn) : categoryRows;\n }\n\n // Mettre à jour le paginator avec le nouveau total\n if (this.paginator) {\n const savedIndex = this._preservePageIndex ?? this.paginator.pageIndex;\n const maxPage = Math.max(0, Math.ceil(this._allFilteredRows.length / this.pageSize) - 1);\n this.paginator.length = this._allFilteredRows.length;\n this.paginator.pageIndex = Math.min(savedIndex, maxPage);\n this._preservePageIndex = null;\n }\n\n this._projectCurrentPage();\n this._cdr.markForCheck();\n }\n\n private _projectCurrentPage(): void {\n if (this.activeGroupByKey) {\n this.tableDataSource.data = this.projectRows(this._allFilteredRows);\n return;\n }\n\n const pageIndex = this.paginator?.pageIndex ?? 0;\n const start = pageIndex * this.pageSize;\n const pageRows = this._allFilteredRows.slice(start, start + this.pageSize);\n\n const projected: any[] = [];\n pageRows.forEach((row, i) => {\n const idx = start + i;\n const p: any = { __raw: row, __index: idx };\n this.activeColumns.forEach((col) => {\n p[col.key] = this.resolveCellValue(col, row, idx);\n });\n projected.push(p);\n });\n this.tableDataSource.data = projected;\n }\n\n private buildEffectiveConfig(): TableProvider<T> {\n const config = this.config || {};\n const rows = this._resolvedData;\n\n const columns =\n config.columns ||\n this.columnsConfig ||\n this.resolveColumnsFromCompat(rows);\n\n return {\n ...config,\n columns,\n slices: config.slices || [],\n enableSliceToggle: config.enableSliceToggle ?? true,\n };\n }\n\n private resolveData(): T[] {\n if (Array.isArray(this.data)) {\n return this.data;\n }\n\n if (Array.isArray(this.dataSource)) {\n return this.dataSource;\n }\n\n if (this.dataSource && Array.isArray((this.dataSource as any).data)) {\n return (this.dataSource as any).data;\n }\n\n return [];\n }\n\n private resolveColumnsFromCompat(rows: T[]): TableColumnProvider<T>[] {\n if (this.displayedColumns?.length) {\n return this.displayedColumns.map((key) => ({\n key,\n header: this.columnLabels?.[key] || humanizeKey(key),\n }));\n }\n\n const firstRow = rows[0] as any;\n if (!firstRow || typeof firstRow !== 'object') {\n return [];\n }\n\n return Object.keys(firstRow).map((key) => ({\n key,\n header: this.columnLabels?.[key] || humanizeKey(key),\n }));\n }\n\n private getCategoryFilteredData(): T[] {\n const data = this._resolvedData;\n\n let filtered = data.filter(this.activeSliceFilter);\n\n const query = this.searchQuery?.trim().toLowerCase();\n if (query) {\n filtered = filtered.filter((row) =>\n this.activeColumns.some((col) => {\n const val = this.getLazyAwareValue(col.key, row);\n return val != null && String(val).toLowerCase().includes(query);\n })\n );\n }\n return filtered;\n }\n\n private projectRows(rows: T[]): any[] {\n const groupKey = this.activeGroupByKey;\n\n if (!groupKey) {\n const result: any[] = [];\n rows.forEach((row, index) => {\n const projected: any = { __raw: row, __index: index };\n this.activeColumns.forEach((col) => {\n projected[col.key] = this.resolveCellValue(col, row, index);\n });\n result.push(projected);\n });\n return result;\n }\n\n const groupColDef = this._columnMap.get(groupKey);\n const groupLazyStatus = groupColDef?.lazy ? (this._lazyColumnStatus.get(groupKey) ?? 'idle') : 'loaded';\n\n if (groupLazyStatus !== 'loaded') {\n this._totalFilteredCount = rows.length;\n return [{ __groupHeader: true, __groupKey: '__lazy_loading__', __groupCount: rows.length, __groupPage: 0, __groupPageCount: 1 }];\n }\n\n const effectiveSort = this._activeSort.active && this._activeSort.direction\n ? this._activeSort\n : this.resolvedConfig.defaultSort ?? { active: '', direction: '' as const };\n\n // Vérifie si le cache est encore valide (même référence de rows + même paramètres de tri/groupe)\n const cacheValid =\n this._groupCacheRows === rows &&\n this._groupCacheKey === groupKey &&\n this._groupCacheSortOrder === this.groupSortOrder &&\n this._groupCacheSortActive === (effectiveSort.active ?? '') &&\n this._groupCacheSortDir === (effectiveSort.direction ?? '');\n\n let groupOrder: string[];\n let groupMap: Map<string, T[]>;\n\n if (cacheValid) {\n groupOrder = this._groupCacheOrder;\n groupMap = this._groupCacheMap;\n } else {\n // Pré-calcul des valeurs de groupe en un seul passage (évite O(n) find() par comparaison)\n const groupValueCache = new Map<T, string>();\n rows.forEach(row => groupValueCache.set(row, String(this.getLazyAwareValue(groupKey, row) ?? '')));\n\n // Pré-calcul des valeurs de tri (évite O(n log n) × getLazyAwareValue dans le comparateur)\n let fastCompareFn: ((a: T, b: T) => number) | null = null;\n if (effectiveSort.active && effectiveSort.direction) {\n const sortValueCache = new Map<T, any>();\n rows.forEach(row => sortValueCache.set(row, this.getLazyAwareValue(effectiveSort.active, row)));\n const dir = effectiveSort.direction;\n fastCompareFn = (a: T, b: T): number => {\n const va = sortValueCache.get(a);\n const vb = sortValueCache.get(b);\n let cmp = 0;\n if (typeof va === 'number' && typeof vb === 'number') {\n cmp = va < vb ? -1 : va > vb ? 1 : 0;\n } else {\n const sa = va == null ? '' : String(va).toLowerCase();\n const sb = vb == null ? '' : String(vb).toLowerCase();\n cmp = sa < sb ? -1 : sa > sb ? 1 : 0;\n }\n return dir === 'asc' ? cmp : -cmp;\n };\n }\n\n const sorted = [...rows].sort((a, b) => {\n const va = groupValueCache.get(a)!;\n const vb = groupValueCache.get(b)!;\n const cmp = va.localeCompare(vb);\n return this.groupSortOrder === 'desc' ? -cmp : cmp;\n });\n\n groupOrder = [];\n groupMap = new Map<string, T[]>();\n sorted.forEach((row) => {\n const groupValue = groupValueCache.get(row)!;\n if (!groupMap.has(groupValue)) {\n groupOrder.push(groupValue);\n groupMap.set(groupValue, []);\n }\n groupMap.get(groupValue)!.push(row);\n });\n\n // Tri intra-groupe stocké dans le cache — évite le re-tri sur collapse/expand/pagination\n if (fastCompareFn) {\n const fn = fastCompareFn;\n groupMap.forEach((groupRows, key) => {\n groupMap.set(key, [...groupRows].sort(fn));\n });\n }\n\n // Mise en cache\n this._groupCacheRows = rows;\n this._groupCacheKey = groupKey;\n this._groupCacheSortOrder = this.groupSortOrder;\n this._groupCacheSortActive = effectiveSort.active ?? '';\n this._groupCacheSortDir = effectiveSort.direction ?? '';\n this._groupCacheOrder = groupOrder;\n this._groupCacheMap = groupMap;\n }\n\n this._totalFilteredCount = rows.length;\n\n // Protection contre les jeux de données à trop haute cardinalité\n if (groupOrder.length > TableComponent.MAX_GROUP_COUNT) {\n return [{ __groupHeader: true, __groupKey: '__too_many_groups__', __groupCount: groupOrder.length, __groupPage: 0, __groupPageCount: 1 }];\n }\n\n const pageSize = this.groupPageSize;\n const result: any[] = [];\n\n groupOrder.forEach((groupValue) => {\n const groupRows = groupMap.get(groupValue)!;\n const totalCount = groupRows.length;\n const currentPage = pageSize === 0 ? 0 : (this._groupPages.get(groupValue) ?? 0);\n const pageCount = pageSize === 0 ? 1 : Math.max(1, Math.ceil(totalCount / pageSize));\n const collapsed = this.isGroupCollapsed(groupValue);\n\n result.push({ __groupHeader: true, __groupKey: groupValue, __groupCount: totalCount, __groupPage: currentPage, __groupPageCount: pageCount });\n\n if (!collapsed) {\n const start = pageSize === 0 ? 0 : currentPage * pageSize;\n const end = pageSize === 0 ? totalCount : Math.min(start + pageSize, totalCount);\n groupRows.slice(start, end).forEach((row, i) => {\n const idx = start + i;\n const projected: any = { __raw: row, __index: idx };\n this.activeColumns.forEach((col) => {\n projected[col.key] = this.resolveCellValue(col, row, idx);\n });\n result.push(projected);\n });\n }\n });\n\n return result;\n }\n\n private _buildSortComparator(): ((a: T, b: T) => number) | null {\n const sort = this._activeSort.active && this._activeSort.direction\n ? this._activeSort\n : this.resolvedConfig.defaultSort ?? { active: '', direction: '' as const };\n const { active, direction } = sort;\n if (!active || !direction) return null;\n return (a: T, b: T): number => {\n const va = this.getLazyAwareValue(active, a);\n const vb = this.getLazyAwareValue(active, b);\n let cmp = 0;\n if (typeof va === 'number' && typeof vb === 'number') {\n cmp = va < vb ? -1 : va > vb ? 1 : 0;\n } else {\n const sa = va == null ? '' : String(va).toLowerCase();\n const sb = vb == null ? '' : String(vb).toLowerCase();\n cmp = sa < sb ? -1 : sa > sb ? 1 : 0;\n }\n return direction === 'asc' ? cmp : -cmp;\n };\n }\n\n private getLazyAwareValue(columnKey: string, row: T): any {\n const colDef = this._columnMap.get(columnKey);\n if (colDef?.lazy) {\n return this._lazyColumnData.get(columnKey)?.get(row) ?? null;\n }\n if (colDef?.sortValue) {\n return normalizeCellValue(colDef.sortValue(row, 0));\n }\n if (colDef?.value) {\n return normalizeCellValue(colDef.value(row, 0));\n }\n return (row as any)[columnKey];\n }\n\n private resolveCellValue(col: TableColumnProvider<T>, row: T, index: number): any {\n if (col.lazy) {\n const status = this._lazyColumnStatus.get(col.key) ?? 'idle';\n if (status === 'loading') return '__lazy_loading__';\n if (status === 'error') return '__lazy_error__';\n if (status === 'loaded') {\n const rowMap = this._lazyColumnData.get(col.key);\n return normalizeCellValue(rowMap?.get(row) ?? '');\n }\n return '';\n }\n const valueProvider = col.value;\n const rawValue = valueProvider ? valueProvider(row, index) : (row as any)?.[col.key];\n return normalizeCellValue(rawValue);\n }\n\n private resolvePageSize(): number {\n return Math.max(1, this.resolvedConfig.pagination?.pageSize || this.pageSize || 5);\n }\n\n private resolvePageSizeOptions(): number[] {\n const options = this.resolvedConfig.pagination?.pageSizeOptions || [5, 10, 20];\n const unique = [...new Set(options.filter((value) => value > 0))];\n\n if (!unique.includes(this.pageSize)) {\n unique.push(this.pageSize);\n }\n\n return unique.sort((a, b) => a - b);\n }\n\n private resolvePageSizeOptionsGroupBy(): number[] {\n const options = this.resolvedConfig.pagination?.pageSizeOptionsGroupBy || this.resolvedConfig.pagination?.pageSizeOptions || [5, 10, 20];\n const unique = [...new Set(options.filter((v) => v > 0))];\n if (this.groupPageSize > 0 && !unique.includes(this.groupPageSize)) {\n unique.push(this.groupPageSize);\n }\n return unique.sort((a, b) => a - b);\n }\n\n private resolveDefaultGroupPageSize(): number {\n const cfg = this.resolvedConfig;\n const options = cfg.pagination?.pageSizeOptionsGroupBy || cfg.pagination?.pageSizeOptions;\n if (options?.length) return options[0];\n return cfg.pagination?.pageSize || 5;\n }\n\n private uniqueColumnsByKey(columns: TableColumnProvider<T>[]): TableColumnProvider<T>[] {\n const seen = new Set<string>();\n return columns.filter((column) => {\n if (seen.has(column.key)) {\n return false;\n }\n seen.add(column.key);\n return true;\n });\n }\n\n private attachPaginator(): void {\n if (!this.showPagination) {\n this.tableDataSource.paginator = null;\n return;\n }\n if (!this.paginator) return;\n\n this.tableDataSource.paginator = null;\n this.paginator.pageSize = this.pageSize;\n\n if (this._paginatorSubscribed !== this.paginator) {\n this._paginatorSubscribed = this.paginator;\n this.paginator.page.pipe(takeUntil(this._destroy$)).subscribe(() => {\n this.pageSize = this.paginator!.pageSize;\n if (this._pendingRender !== null) return;\n this._projectCurrentPage();\n this._cdr.markForCheck();\n });\n }\n }\n\n private attachSort(): void {\n if (!this.sort) return;\n\n this.tableDataSource.sort = null as any;\n\n if (this._sortSubscribed !== this.sort) {\n this._sortSubscribed = this.sort;\n this.sort.sortChange.pipe(takeUntil(this._destroy$)).subscribe(() => {\n this._activeSort = {\n active: this.sort.active,\n direction: this.sort.direction,\n };\n this._scheduleRender();\n });\n }\n }\n\n}\n\n","<section class=\"jquery-table-wrapper\">\n <header class=\"table-header\" *ngIf=\"showTitle\">\n <h3>{{ title }}</h3>\n </header>\n\n <div\n class=\"table-layout\"\n [class.slice-collapsed]=\"showSlicePanel && (slicePanelRef?.isCollapsed ?? false)\"\n [class.no-slice]=\"!showSlicePanel\"\n >\n <slice-panel\n [style.display]=\"showSlicePanel ? null : 'none'\"\n [sliceConfigs]=\"_sliceConfigs\"\n [columns]=\"_sliceColumns\"\n [data]=\"_sliceData\"\n [lazyData]=\"_lazyColumnData\"\n [lazyStatus]=\"_lazyColumnStatus\"\n [showToggle]=\"_sliceShowToggle\"\n (filterChange)=\"onSliceFilterChange($event)\"\n (dynamicSliceKeysChange)=\"onDynamicSliceKeysChange($event)\"\n ></slice-panel>\n\n <div class=\"table-shell\">\n <div class=\"table-toolbar\" *ngIf=\"showToolbar\">\n <div class=\"table-toolbar-left\">\n <div *ngIf=\"showSearchBar\" class=\"search-input-wrapper\">\n <svg class=\"search-icon\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"8.5\" cy=\"8.5\" r=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M13 13L17 17\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <input\n class=\"search-input\"\n type=\"text\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange()\"\n placeholder=\"Rechercher...\"\n autocomplete=\"off\"\n />\n <button *ngIf=\"searchQuery\" type=\"button\" class=\"search-clear-btn\" (click)=\"searchQuery = ''; onSearchChange()\">×</button>\n <span class=\"search-count\">{{ filteredRowCount }}</span>\n </div>\n </div>\n <div *ngIf=\"showViewButton\" class=\"table-toolbar-right\">\n <button type=\"button\" class=\"view-btn\" [matMenuTriggerFor]=\"viewMenu\" #viewMenuTrigger=\"matMenuTrigger\">\n <mat-icon class=\"view-btn-icon\">settings</mat-icon>\n View\n </button>\n\n <mat-menu #viewMenu=\"matMenu\" [panelClass]=\"'view-menu-panel'\">\n <button *ngIf=\"showFields\" mat-menu-item [matMenuTriggerFor]=\"fieldsSubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">Champs</span>\n <span class=\"view-menu-sub-value\">{{ visibleColumns.length }}/{{ totalColumnCount }}</span>\n </button>\n <button *ngIf=\"showGroupBySection\" mat-menu-item [matMenuTriggerFor]=\"groupBySubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">Group by</span>\n <span class=\"view-menu-sub-value\">{{ activeGroupByLabel }}</span>\n </button>\n <button *ngIf=\"showAddSliceButton\" mat-menu-item [matMenuTriggerFor]=\"sliceBySubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">Slice by</span>\n <span class=\"view-menu-sub-value\">{{ activeSliceByLabel }}</span>\n </button>\n </mat-menu>\n\n <mat-menu #fieldsSubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let column of menuBaseColumns\"\n [disabled]=\"!column.optional && !allowColumnRemoval\"\n (click)=\"onColumnVisibilityChange(column, !isColumnVisible(column.key))\">\n <span class=\"view-menu-check\">{{ isColumnVisible(column.key) ? '✓' : '' }}</span>\n <mat-icon *ngIf=\"column.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n {{ colLabel(column) }}\n </button>\n <ng-container *ngIf=\"menuOptionalColumns.length > 0\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let column of menuOptionalColumns\"\n [disabled]=\"(isColumnVisible(column.key) && visibleColumns.length === 1) || getLazyColumnStatus(column.key) === 'loading'\"\n (click)=\"onColumnVisibilityChange(column, !isColumnVisible(column.key))\">\n <span class=\"view-menu-check\">{{ isColumnVisible(column.key) ? '✓' : '' }}</span>\n <mat-icon *ngIf=\"column.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n {{ colLabel(column) }}\n <span *ngIf=\"column.lazy && getLazyColumnStatus(column.key) === 'loading'\" class=\"lazy-menu-spinner\">↻</span>\n <span *ngIf=\"column.lazy && getLazyColumnStatus(column.key) === 'error'\" class=\"lazy-menu-error\" title=\"Erreur de chargement\">⚠</span>\n </button>\n </ng-container>\n </div>\n </mat-menu>\n\n <mat-menu #groupBySubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let col of groupByColumns\"\n [class.active]=\"activeGroupByKey === col.key\"\n (click)=\"onGroupByChange(activeGroupByKey === col.key ? null : col.key)\">\n <span class=\"view-menu-check\">{{ activeGroupByKey === col.key ? '✓' : '' }}</span>\n <mat-icon *ngIf=\"col.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ col.icon }}</mat-icon>\n {{ colLabel(col) }}\n </button>\n </div>\n </mat-menu>\n\n <mat-menu #sliceBySubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let s of staticSlicesForMenu\"\n (click)=\"toggleStaticSlice(s.key)\">\n <span class=\"view-menu-check\">{{ isStaticSliceVisible(s.key) ? '✓' : '' }}</span>\n <mat-icon *ngIf=\"s.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ s.icon }}</mat-icon>\n {{ s.title }}\n </button>\n <ng-container *ngIf=\"allDynamicSliceColumns.length > 0\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let col of allDynamicSliceColumns\"\n [class.active]=\"isDynamicSliceActive(col.key)\"\n (click)=\"toggleDynamicSlice(col)\">\n <span class=\"view-menu-check\">{{ isDynamicSliceActive(col.key) ? '✓' : '' }}</span>\n <mat-icon *ngIf=\"col.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ col.icon }}</mat-icon>\n {{ colLabel(col) }}\n </button>\n </ng-container>\n </div>\n </mat-menu>\n </div>\n </div>\n\n <div class=\"table-body-wrapper\">\n <div class=\"table-body-scroll\" #tableBodyScroll>\n <table mat-table matSort [dataSource]=\"tableDataSource\" class=\"jquery-table\"\n [trackBy]=\"trackRowFn\"\n [matSortActive]=\"_matSortActive\" [matSortDirection]=\"_matSortDirection\">\n <ng-container *ngFor=\"let column of visibleColumns\" [matColumnDef]=\"column.key\">\n <th\n mat-header-cell\n *matHeaderCellDef\n [mat-sort-header]=\"column.sortable !== false ? column.key : ''\"\n [disabled]=\"column.sortable === false\"\n [style.width]=\"column.width || null\"\n [style.min-width]=\"column.width || null\"\n [class.drag-enabled]=\"isColumnDragDropEnabled\"\n [class.drop-target]=\"isHeaderDropTarget(column.key)\"\n (dragover)=\"onHeaderDragOver(column.key, $event)\"\n (drop)=\"onHeaderDrop(column.key, $event)\"\n >\n <div class=\"head-cell\">\n <mat-icon *ngIf=\"column.icon\" class=\"head-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n <span class=\"head-text\" [title]=\"column.header\">{{ column.header }}</span>\n <span\n *ngIf=\"isColumnDragDropEnabled\"\n class=\"drag-handle\"\n draggable=\"true\"\n (dragstart)=\"onHeaderDragStart(column.key, $event)\"\n (dragend)=\"onHeaderDragEnd()\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon>drag_indicator</mat-icon>\n </span>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [style.width]=\"column.width || null\"\n [style.min-width]=\"column.width || null\">\n <ng-container *ngIf=\"getCellTemplate(column.key) as customTpl; else defaultCellTpl\">\n <ng-container *ngTemplateOutlet=\"customTpl; context: { $implicit: row.__raw, index: row.__index }\"></ng-container>\n </ng-container>\n <ng-template #defaultCellTpl>\n <ng-container [ngSwitch]=\"column.lazy ? getLazyRenderType(row[column.key]) : 'value'\">\n <span *ngSwitchCase=\"'loading'\" class=\"lazy-skeleton\"></span>\n <button *ngSwitchCase=\"'error'\" type=\"button\" class=\"lazy-error-btn\" (click)=\"retryLazyColumn(column)\" title=\"Erreur de chargement — cliquer pour réessayer\">\n <span class=\"lazy-error-icon\">⚠</span>\n <span class=\"lazy-error-label\">Réessayer</span>\n </button>\n <span *ngSwitchDefault class=\"cell-text\" [class.cell-empty]=\"isCellEmpty(row[column.key])\" [title]=\"asTitle(row[column.key])\">{{ isCellEmpty(row[column.key]) ? 'N/A' : row[column.key] }}</span>\n </ng-container>\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"renderedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: renderedColumns; when: !isGroupHeader\"\n [attr.tabindex]=\"hasRowClickHandler ? 0 : null\"\n [ngClass]=\"getRowClass(row)\"\n [class.no-pointer]=\"!hasRowClickHandler\"\n (click)=\"onRowClick(row, $event)\"\n (keydown.enter)=\"onRowClick(row, null)\"\n (keydown.space)=\"onRowClick(row, null)\"\n ></tr>\n <ng-container matColumnDef=\"__group_row\">\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"renderedColumns.length\" class=\"group-header-cell\">\n <div class=\"group-header-label\">\n <span class=\"group-chevron\" [class.collapsed]=\"isGroupCollapsed(row.__groupKey)\" *ngIf=\"row.__groupKey !== '__lazy_loading__' && row.__groupKey !== '__too_many_groups__'\">›</span>\n <span *ngIf=\"row.__groupKey !== '__lazy_loading__' && row.__groupKey !== '__too_many_groups__'\" class=\"group-key-label\">{{ row.__groupKey }}</span>\n <span *ngIf=\"row.__groupKey === '__lazy_loading__'\" class=\"lazy-skeleton group-lazy-key-skeleton\"></span>\n <span *ngIf=\"row.__groupKey === '__too_many_groups__'\" class=\"group-too-many-label\">⚠ Trop de groupes ({{ row.__groupCount }}) — affinez les données ou choisissez une autre colonne</span>\n <span class=\"group-count-badge\">{{ row.__groupCount }}</span>\n <div class=\"group-pagination\" *ngIf=\"!isGroupCollapsed(row.__groupKey) && row.__groupPageCount > 1\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row.__groupPage === 0\" (click)=\"groupPageBack(row.__groupKey)\">‹</button>\n <span class=\"group-page-info\">{{ row.__groupPage + 1 }} / {{ row.__groupPageCount }}</span>\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row.__groupPage >= row.__groupPageCount - 1\" (click)=\"groupPageForward(row.__groupKey, row.__groupCount)\">›</button>\n </div>\n </div>\n </td>\n </ng-container>\n <tr mat-row *matRowDef=\"let row; columns: ['__group_row']; when: isGroupHeader\"\n class=\"group-header-row\"\n [class.group-header-loading]=\"row.__groupKey === '__lazy_loading__'\"\n [class.group-header-too-many]=\"row.__groupKey === '__too_many_groups__'\"\n [attr.data-group-key]=\"row.__groupKey\"\n (click)=\"row.__groupKey !== '__lazy_loading__' && row.__groupKey !== '__too_many_groups__' && toggleGroupCollapse(row.__groupKey)\"></tr>\n <tr class=\"mat-mdc-row no-data-row\" *matNoDataRow>\n <td class=\"mat-mdc-cell no-data-cell\" [attr.colspan]=\"renderedColumns.length\"></td>\n </tr>\n </table>\n </div><!-- /table-body-scroll -->\n <div class=\"table-body-overlay\" *ngIf=\"effectiveIsLoading || isEmpty\">\n <span class=\"table-body-overlay-text\">{{ effectiveIsLoading ? loadingStateLabel : emptyStateLabel }}</span>\n </div>\n </div><!-- /table-body-wrapper -->\n\n <div class=\"bottom-bar\" *ngIf=\"showPagination\">\n <mat-paginator\n [length]=\"totalRows\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n ></mat-paginator>\n </div>\n\n <div class=\"group-bottom-bar\" *ngIf=\"activeGroupByKey\">\n <div class=\"group-bottom-bar-container\">\n <div class=\"group-bottom-bar-left\">\n <button type=\"button\" class=\"group-reset-btn\" (click)=\"onGroupByChange(null)\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"group-reset-icon\">\n <path d=\"M3 8a5 5 0 1 0 5-5 5 5 0 0 0-3.54 1.46L3 3\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3 3v2.5H5.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Retirer le groupe\n </button>\n <div class=\"group-bar-separator\"></div>\n <div class=\"group-sort-controls\">\n <span class=\"group-sort-label\">Trier :</span>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'asc'\" (click)=\"onGroupSortToggle('asc')\" title=\"A → Z\">\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'desc'\" (click)=\"onGroupSortToggle('desc')\" title=\"Z → A\">\n <mat-icon>arrow_downward</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"mat-mdc-paginator-page-size\">\n <div class=\"mat-mdc-paginator-page-size-label\">Lignes par groupe :</div>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"mat-mdc-paginator-page-size-select\">\n <mat-select\n [(ngModel)]=\"groupPageSize\"\n (ngModelChange)=\"onGroupPageSizeChange($event)\"\n panelClass=\"mat-mdc-paginator-select-page-size group-page-size-panel\"\n [panelWidth]=\"'auto'\"\n >\n <mat-select-trigger>{{ groupPageSize === 0 ? 'Toutes' : groupPageSize }}</mat-select-trigger>\n <mat-option *ngFor=\"let opt of pageSizeOptionsGroupBy\" [value]=\"opt\">{{ opt }}</mat-option>\n <mat-option [value]=\"0\">Toutes</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n </div>\n</section>\n","/*\n * Public API Surface of jquery-table\n */\n\nexport * from './lib/jquery-table.model';\nexport * from './lib/component/table.component';\nexport * from './lib/component/slice-panel/slice-panel.model';\nexport * from './lib/component/slice-panel/slice-panel.component';\nexport * from './lib/directive/jqt-cell-def.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i7"],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@oneteme/jquery-table" />
5
+ export * from './public-api';
@@ -0,0 +1,72 @@
1
+ import { ElementRef, EventEmitter, OnChanges, OnInit, SimpleChanges } from '@angular/core';
2
+ import { SliceColumnDef, SliceConfig } from './slice-panel.model';
3
+ import * as i0 from "@angular/core";
4
+ export declare class SlicePanelComponent<T = any> implements OnChanges, OnInit {
5
+ sliceConfigs: SliceConfig<T>[];
6
+ columns: SliceColumnDef<T>[];
7
+ data: T[];
8
+ lazyData: Map<string, Map<any, any>>;
9
+ lazyStatus: Map<string, 'idle' | 'loading' | 'loaded' | 'error'>;
10
+ showToggle: boolean;
11
+ showCounts: boolean;
12
+ collapsedByDefault: boolean;
13
+ alwaysShow: boolean;
14
+ filterChange: EventEmitter<(row: T) => boolean>;
15
+ activeKeysChange: EventEmitter<string[][]>;
16
+ dynamicSliceKeysChange: EventEmitter<string[]>;
17
+ collapsedChange: EventEmitter<boolean>;
18
+ slicePanelBodyRef?: ElementRef<HTMLElement>;
19
+ private _cdr;
20
+ isCollapsed: boolean;
21
+ activeKeysBySlice: Map<number, Set<string>>;
22
+ private _expandedSlices;
23
+ _dynamicSlices: Array<{
24
+ key: string;
25
+ slice: SliceConfig<T>;
26
+ }>;
27
+ private _hiddenStaticSliceKeys;
28
+ _cachedSlices: SliceConfig<T>[];
29
+ private _countCache;
30
+ readonly trackBySliceIndex: (index: number, _: any) => number;
31
+ readonly trackByCategoryKey: (_: number, cat: any) => string;
32
+ ngOnInit(): void;
33
+ ngOnChanges(changes: SimpleChanges): void;
34
+ get showPanel(): boolean;
35
+ get slices(): SliceConfig<T>[];
36
+ get staticSliceCount(): number;
37
+ get staticSlicesForMenu(): Array<{
38
+ key: string;
39
+ title: string;
40
+ }>;
41
+ get activeDynamicSliceColumns(): SliceColumnDef<T>[];
42
+ get availableColumnsForDynamicSlice(): SliceColumnDef<T>[];
43
+ get activeSliceByLabel(): string;
44
+ isSliceCollapsed(sliceIndex: number): boolean;
45
+ toggleSliceCollapse(sliceIndex: number): void;
46
+ togglePanel(): void;
47
+ isSliceDynamic(sliceIndex: number): boolean;
48
+ isSliceLoading(sliceIndex: number): boolean;
49
+ isStaticSliceVisible(columnKey: string): boolean;
50
+ toggleStaticSlice(columnKey: string): void;
51
+ getSliceIcon(slice: SliceConfig<T>): string | undefined;
52
+ isSliceCategoryActive(sliceIndex: number, categoryKey: string): boolean;
53
+ isSliceAllActive(sliceIndex: number): boolean;
54
+ sliceCategoryCount(sliceIndex: number, categoryKey: string): number;
55
+ isSliceEmpty(sliceIndex: number): boolean;
56
+ onSliceCategorySelected(sliceIndex: number, categoryKey: string): void;
57
+ onSliceAllSelected(sliceIndex: number): void;
58
+ addDynamicSlice(column: SliceColumnDef<T>): void;
59
+ removeDynamicSlice(sliceIndex: number): void;
60
+ removeDynamicSliceByKey(key: string): void;
61
+ private _emitFilter;
62
+ private _getDynamicSliceColumnKey;
63
+ private _materializeSlice;
64
+ private _buildCategoryFromValue;
65
+ private _computeDistinctValues;
66
+ private _getLazyAwareValue;
67
+ private _rebuildCache;
68
+ private _refreshDynamicSlices;
69
+ private _scrollSliceTitleIntoView;
70
+ static ɵfac: i0.ɵɵFactoryDeclaration<SlicePanelComponent<any>, never>;
71
+ static ɵcmp: i0.ɵɵComponentDeclaration<SlicePanelComponent<any>, "slice-panel", never, { "sliceConfigs": { "alias": "sliceConfigs"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; "data": { "alias": "data"; "required": false; }; "lazyData": { "alias": "lazyData"; "required": false; }; "lazyStatus": { "alias": "lazyStatus"; "required": false; }; "showToggle": { "alias": "showToggle"; "required": false; }; "showCounts": { "alias": "showCounts"; "required": false; }; "collapsedByDefault": { "alias": "collapsedByDefault"; "required": false; }; "alwaysShow": { "alias": "alwaysShow"; "required": false; }; }, { "filterChange": "filterChange"; "activeKeysChange": "activeKeysChange"; "dynamicSliceKeysChange": "dynamicSliceKeysChange"; "collapsedChange": "collapsedChange"; }, never, never, true, never>;
72
+ }
@@ -0,0 +1,59 @@
1
+ import { DataProvider } from '@oneteme/jquery-core';
2
+ import { Observable } from 'rxjs';
3
+ /** Une catégorie cliquable dans un slice (ex: "En cours", "Terminé"). */
4
+ export interface SliceCategory<T = any> {
5
+ key: string;
6
+ label: string;
7
+ filter: (row: T) => boolean;
8
+ }
9
+ /**
10
+ * Groupe de filtres affiché dans le panneau latéral.
11
+ *
12
+ * **Mode colonne** (`columnKey`) : le slice lit automatiquement les valeurs distinctes
13
+ * de la colonne désignée pour générer les catégories. `bucket` permet de regrouper
14
+ * des valeurs continues (ex: plages de durée). `hidden` le masque par défaut et
15
+ * laisse la table le rendre disponible dans le menu "Ajouter un filtre".
16
+ *
17
+ * **Mode manuel** (`categories`) : les catégories sont définies explicitement avec
18
+ * leur propre fonction `filter`. `columnKey` peut coexister pour le lien avec la
19
+ * colonne (icône, label), mais `categories` prend le dessus sur le bucketing auto.
20
+ */
21
+ export interface SliceConfig<T = any> {
22
+ title?: string;
23
+ /** Icône Material affichée dans le titre du slice (ex: 'schedule', 'dns'). */
24
+ icon?: string;
25
+ /** Autorise la sélection simultanée de plusieurs catégories. Par défaut : `false`. */
26
+ multiSelect?: boolean;
27
+ /**
28
+ * Clé de la colonne associée à ce slice.
29
+ * En **mode colonne**, les valeurs distinctes de cette colonne génèrent les catégories.
30
+ * En **mode manuel**, sert uniquement à lier visuellement le slice à la colonne.
31
+ */
32
+ columnKey?: string;
33
+ /** Masqué par défaut ; disponible via le menu "Ajouter un filtre". Par défaut : `false`. */
34
+ hidden?: boolean;
35
+ /**
36
+ * Transforme chaque valeur de ligne en label de tranche avant regroupement.
37
+ * Utilisé en **mode colonne** pour des valeurs continues (ex: durées, montants).
38
+ * Ignoré si `categories` est défini.
39
+ */
40
+ bucket?: (row: T) => string;
41
+ /** Catégories explicites (**mode manuel**). Si absent, générées auto depuis `columnKey`. */
42
+ categories?: SliceCategory<T>[];
43
+ }
44
+ /**
45
+ * Description minimale d'une colonne nécessaire au panneau de slices.
46
+ * Utilisé indépendamment de la table : pas de propriétés de rendu (tri, suppression, groupement...).
47
+ * `TableColumnProvider` (librairie table) est un superset structurel compatible.
48
+ */
49
+ export interface SliceColumnDef<T = any> {
50
+ key: string;
51
+ header?: string;
52
+ icon?: string;
53
+ value?: DataProvider<any>;
54
+ /** Chargement différé : la présence de cet objet active le mode lazy. */
55
+ lazy?: {
56
+ /** Fonction appelée pour charger les valeurs de la colonne. Retourne un tableau dans le même ordre que les lignes. */
57
+ fetchFn: () => Observable<any[]>;
58
+ };
59
+ }