@oneteme/jquery-table 0.0.15 → 0.0.16

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 +1 @@
1
- {"version":3,"file":"oneteme-jquery-table.mjs","sources":["../../../../projects/oneteme/jquery-table/src/lib/jquery-table.model.ts","../../../../projects/oneteme/jquery-table/src/lib/snapshot-table-config.ts","../../../../projects/oneteme/jquery-table/src/lib/jqt-i18n.token.ts","../../../../projects/oneteme/jquery-table/src/lib/directive/jqt-cell-def.directive.ts","../../../../projects/oneteme/jquery-table/src/lib/component/table.utils.ts","../../../../projects/oneteme/jquery-table/src/lib/component/table-preferences.manager.ts","../../../../projects/oneteme/jquery-table/src/lib/component/export.manager.ts","../../../../projects/oneteme/jquery-table/src/lib/component/table.constants.ts","../../../../projects/oneteme/jquery-table/src/lib/component/organizer-button/organizer-button.component.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 { DataProvider } from '@oneteme/jquery-core';\nimport { Observable } from 'rxjs';\nimport { OrganizerConfig, SliceConfig } from '@oneteme/jquery-organizer';\nexport { SliceConfig } from '@oneteme/jquery-organizer';\n\n/** Propriétés communes à toutes les colonnes ; voir `TableColumnProvider`. */\nexport interface TableColumnBase<T = any> {\n key: string;\n /** Libellé affiché dans l'en-tête de colonne. Optionnel si la colonne utilise un template custom. */\n header?: string;\n icon?: string;\n value?: DataProvider<any>;\n /** Valeur utilisée pour le tri si différente de `value`. Utile quand `value` retourne une chaîne formatée (date, durée...). */\n sortValue?: DataProvider<any>;\n /**\n * Valeur utilisée pour la recherche plein-texte.\n * À définir quand la colonne utilise un `jqt-cell-def` template personnalisé et qu'aucun `value` provider n'est déclaré.\n * Si absent, la recherche utilise `value` en priorité, puis la valeur brute de la ligne.\n * Exemple : `searchValue: (row) => durationPipe.transform((today - row.start) / 1000)`\n */\n searchValue?: DataProvider<string>;\n /** Active le tri ; `true` par défaut. */\n sortable?: boolean;\n removable?: boolean;\n width?: string;\n /** Rend la colonne disponible dans Group by ; `true` par défaut si `header` est défini. */\n groupable?: boolean;\n /** Rend la colonne disponible comme Slice by dynamique ; `true` par défaut si `header` est défini. */\n sliceable?: boolean;\n}\n\n/**\n * Colonne du tableau.\n *\n * - `optional: true` : masquée par défaut, ajoutable depuis le menu View.\n * - `lazy: true` : absente de la requête de base, demandée à sa première activation (Organizer, Group by, Slice by).\n * Une colonne lazy est forcément optionnelle : `optional: true` est implicite et `optional: false` est refusé\n * (la colonne serait demandée dès le premier rendu, soit une requête de plus pour rien).\n * Le chargement passe par `TableProvider.lazyLoader`, ou par l'événement `lazyColumnsRequested` si l'application\n * préfère relancer elle-même sa requête. La cellule affiche un skeleton jusqu'à la réception des lignes complètes ;\n * la colonne supporte ensuite tri, recherche, Group by et Slice by.\n */\nexport type TableColumnMode =\n | { lazy?: undefined; optional?: boolean }\n | { lazy: true; optional?: true };\n\nexport type TableColumnProvider<T = any> = TableColumnBase<T> & TableColumnMode;\n\n/**\n * Charge les colonnes `lazy` : reçoit les clés des colonnes lazy demandées jusqu'ici (cumul) et retourne les lignes complètes,\n * qui remplacent `data` ; la requête est celle de l'application, la table ne connaît pas la source.\n */\nexport type TableLazyLoader<T = any> = (lazyColumns: string[]) => Observable<T[]>;\n\n/** Configuration de la barre de recherche. */\nexport interface TableSearchConfig {\n enabled?: boolean;\n /** Valeur initiale au chargement. */\n initialQuery?: string;\n /** Restreint la recherche texte aux colonnes dont la `key` est dans ce tableau. Si absent, toutes les colonnes sont cherchées. */\n searchColumns?: string[];\n}\n\n/** Configuration de la pagination. */\nexport interface TablePaginationConfig {\n enabled?: boolean;\n pageSize?: number;\n pageSizeOptions?: number[];\n showFirstLastButtons?: boolean;\n /** Options de taille de page spécifiques au mode Group by. Si absent, utilise `pageSizeOptions`. */\n pageSizeOptionsGroupBy?: number[];\n}\n\n/** Configuration du menu View (Champs / Group by / Slice by). */\nexport interface TableViewConfig {\n /** Active le bouton View. Par défaut : `false`. */\n enabled?: boolean;\n /** Autorise le masquage/affichage des colonnes de base via View > Champs. Par défaut : `true`. */\n enableColumnRemoval?: boolean;\n /** Active le drag & drop pour réordonner les colonnes. Par défaut : `false`. */\n enableColumnDragDrop?: boolean;\n}\n\n/** Labels d'état du tableau. */\nexport interface TableLabelsConfig {\n /** Affiché quand le tableau est vide. Par défaut : `'Aucune donnée'`. */\n empty?: string;\n /** Affiché pendant le chargement. Par défaut : `'Chargement des données...'`. */\n loading?: string;\n}\n\n/** Options publiques du bouton Organizer intégré à la toolbar. */\nexport interface TableOrganizerConfig {\n /** Libellé optionnel affiché à côté de l'icône. */\n buttonLabel?: OrganizerConfig['buttonLabel'];\n /** Icône Material affichée dans le bouton. */\n buttonIcon?: OrganizerConfig['buttonIcon'];\n /** Masque l'icône lorsque le bouton utilise un libellé seul. */\n showButtonIcon?: OrganizerConfig['showButtonIcon'];\n /** Masque les valeurs récapitulatives dans les sous-menus. */\n hideMenuValues?: boolean;\n}\n\n/**\n * Raccourci pour déclarer une colonne de base.\n *\n * ```ts\n * columns: [\n * col('name', 'Nom'),\n * col('status', 'Statut', { sortable: false }),\n * ]\n * ```\n */\nexport function col<T = any>(\n key: string,\n header: string,\n overrides?: Partial<TableColumnBase<T>> & TableColumnMode,\n): TableColumnProvider<T> {\n return { key, header, ...overrides };\n}\n\n/** Configuration de l’export CSV déclenché depuis la toolbar. */\nexport interface TableExportConfig<T = any> {\n /** Affiche le bouton Export dans la toolbar. Par défaut : `true`. */\n enabled?: boolean;\n /** Nom du fichier généré. Par défaut : `'export.csv'`. */\n filename?: string;\n /**\n * Transforme chaque ligne avant export.\n * Si absent, les valeurs affichées (après `normalizeCellValue`) sont utilisées.\n * Seules les colonnes visibles sont exportées.\n */\n transform?: (row: T) => Record<string, string>;\n}\n/**\n * Configuration de la fonctionnalité Préférences.\n *\n * Ajoute un menu \"Préférences\" dans View qui permet :\n * - Le **mode édition** (redimensionner / réordonner les colonnes à la souris)\n * - L'**enregistrement** de la configuration courante dans le localStorage\n * - L'**effacement** de la configuration sauvegardée\n *\n * Chaque tableau est identifié par `tableId` (clé localStorage unique).\n */\nexport interface TablePreferencesConfig {\n /** Active la fonctionnalité. Par défaut : `true`. */\n enabled?: boolean;\n /**\n * Identifiant unique du tableau, utilisé comme clé localStorage.\n * Doit être stable entre les rechargements de page.\n * Si absent, un identifiant est dérivé automatiquement des clés de colonnes.\n * Exemple : `'user-table'`, `'invoice-list'`.\n */\n tableId?: string;\n}\n\n/** Snapshot de configuration persisté dans le localStorage. */\nexport interface SavedTableConfig {\n /** Valeur de la searchbar. */\n search?: string;\n /** Clé de la colonne utilisée pour le group by. `null` = aucun. */\n groupBy?: string | null;\n /** Ordre des clés de colonnes (position). */\n columnOrder?: string[];\n /** Clés des colonnes visibles. */\n visibleColumns?: string[];\n /** Largeurs de colonnes en pixels, indexées par clé. */\n columnWidths?: Record<string, number>;\n /** Panneau slice replié ou non. */\n slicePanelCollapsed?: boolean;\n /** Clés des slices statiques cachées par l'utilisateur (via toggle dans le menu View). */\n hiddenSliceKeys?: string[];\n /** Clés des colonnes utilisées comme slices dynamiques. */\n dynamicSliceKeys?: string[];\n /** Filtres actifs du slice panel, indexés par clé de colonne stable. */\n sliceFilters?: Record<string, string[]>;\n}\nexport interface TableProvider<T = any> {\n columns?: TableColumnProvider<T>[];\n title?: string;\n showActions?: boolean;\n onCopyVisual?: () => void;\n onToggleFullscreen?: () => void;\n slices?: SliceConfig<T>[];\n /** État initial du panneau de slices. Une préférence sauvegardée reste prioritaire. */\n slicePanelCollapsed?: boolean;\n /** Affiche le bouton toggle pour replier/déplier le panneau de slices. Par défaut : `true`. */\n enableSliceToggle?: boolean;\n /**\n * Permet de vider search bar depuis config\n * Changez cette valeur (ex: route courante, compteur, timestamp) pour déclencher un reset.\n */\n clearSearchInput?: string | number | boolean | null;\n search?: TableSearchConfig;\n pagination?: TablePaginationConfig;\n view?: TableViewConfig;\n organizer?: TableOrganizerConfig;\n labels?: TableLabelsConfig;\n /** Tri initial appliqué au chargement. N'est pas écrasé par les changements de données. */\n defaultSort?: { active: string; direction: 'asc' | 'desc' };\n /** Clé de colonne à utiliser comme group-by par défaut au chargement. N'est pas écrasé par les changements de données ni par un reset explicite de l'utilisateur. */\n defaultGroupBy?: string | null;\n rowClass?: (row: T, index: number) => string | string[] | Record<string, boolean>;\n /** Callback déclenché quand l'utilisateur clique sur une ligne. Alternative au `(rowSelected)` Output. */\n onRowSelected?: (row: T, event: MouseEvent | null) => void;\n /** Configuration de l'export CSV. */\n export?: TableExportConfig<T>;\n /**\n * Chargeur des colonnes `lazy` : appelé à l'activation d'une colonne lazy (et après chaque nouveau `data` si des colonnes\n * ont déjà été demandées). Sans chargeur, la table émet seulement `lazyColumnsRequested`.\n */\n lazyLoader?: TableLazyLoader<T>;\n /** Configuration de la fonctionnalité Préférences (édition + persistance localStorage). */\n preferences?: TablePreferencesConfig;\n}\n\n\n","import { VisualSnapshot } from '@oneteme/jquery-core';\nimport { TableProvider } from './jquery-table.model';\n\n/**\n * Reconstruit la vue autonome d'un snapshot de tableau.\n * Les actions d'édition sont volontairement absentes d'une copie ; la recherche\n * reste disponible et s'appuie sur les données sérialisées du snapshot.\n */\nexport function tableProviderFromSnapshot(snapshot: VisualSnapshot): TableProvider<any> {\n if (snapshot.type !== 'table') {\n return { columns: [] };\n }\n\n const config = snapshot.config as {\n title?: string;\n columns?: Array<{ key: string; header?: string; sortable?: boolean; optional?: boolean }>;\n search?: TableProvider<any>['search'];\n pagination?: TableProvider<any>['pagination'];\n };\n const state = snapshot.state as {\n search?: string;\n groupBy?: string | null;\n columnOrder?: string[];\n visibleColumns?: string[];\n pageSize?: number;\n };\n const columns = (config.columns ?? []).map(column => ({\n key: column.key,\n header: column.header || column.key,\n sortable: column.sortable !== false,\n optional: column.optional,\n searchValue: (row: any): string => {\n const value = row?.[column.key];\n return value == null ? '' : String(value);\n },\n }));\n const orderedKeys = state.columnOrder?.length ? state.columnOrder : state.visibleColumns;\n const orderedColumns = orderedKeys?.length\n ? orderedKeys.map(key => columns.find(column => column.key === key)).filter(Boolean)\n : columns;\n\n return {\n title: config.title,\n search: config.search\n ? { ...config.search, initialQuery: state.search ?? config.search.initialQuery }\n : undefined,\n pagination: config.pagination\n ? { ...config.pagination, pageSize: state.pageSize ?? config.pagination.pageSize }\n : undefined,\n defaultGroupBy: state.groupBy ?? null,\n view: { enabled: false, enableColumnRemoval: false, enableColumnDragDrop: false },\n export: { enabled: false },\n preferences: { enabled: false },\n showActions: false,\n columns: orderedColumns as any[],\n };\n}","import { InjectionToken } from '@angular/core';\n\n/**\n * Labels de l'interface utilisateur de jquery-table.\n *\n * Fournir ce token au niveau du module ou du composant racine pour localiser\n * ou personnaliser tous les textes de la bibliothèque en un seul endroit :\n *\n * ```ts\n * providers: [\n * { provide: JQT_I18N, useValue: { searchPlaceholder: 'Search…', emptyState: 'No data' } }\n * ]\n * ```\n *\n * Tous les champs sont optionnels : seul ce que vous fournissez écrase les\n * valeurs par défaut françaises.\n */\nexport interface JqtI18n {\n /** Placeholder de la barre de recherche. */\n searchPlaceholder: string;\n /** Titre du bouton pour déplier le panneau de filtres. */\n expandFilterTitle: string;\n /** Titre du bouton pour replier le panneau de filtres. */\n collapseFilterTitle: string;\n /** Label du sous-menu \"Champs\" dans View. */\n viewMenuFields: string;\n /** Label du sous-menu \"Group by\" dans View. */\n viewMenuGroupBy: string;\n /** Label du sous-menu \"Slice by\" dans View. */\n viewMenuSliceBy: string;\n /** Label affiché quand aucune option n'est sélectionnée (groupe, slice). */\n viewNoneSelected: string;\n /** Bouton \"Retirer le groupe\" dans la barre de groupe. */\n groupRemove: string;\n /** Label \"Trier :\" dans la barre de groupe. */\n groupSortLabel: string;\n /** Tooltip tri ascendant. */\n groupSortAsc: string;\n /** Tooltip tri descendant. */\n groupSortDesc: string;\n /** Label \"Lignes par groupe\" dans le sélecteur de taille de groupe. */\n groupRowsPerGroup: string;\n /** Option \"Toutes\" (afficher toutes les lignes sans pagination de groupe). */\n groupShowAll: string;\n /** Message quand le groupe dépasse le nombre maximal autorisé. Reçoit le nombre de groupes. */\n groupTooMany: (count: number) => string;\n /** Label du bouton de réessai pour une colonne lazy en erreur. */\n lazyRetry: string;\n /** Tooltip du bouton de réessai. */\n lazyErrorTitle: string;\n /** Tooltip de l'icône d'erreur dans le menu View > Champs. */\n lazyErrorMenuTitle: string;\n /** Valeur affichée dans une cellule vide (null / undefined / ''). */\n cellEmpty: string;\n /** Message quand le tableau est vide. */\n emptyState: string;\n /** Message pendant le chargement (`[isLoading]=\"true\"`). */\n loadingState: string;\n /** Titre du panneau de filtres latéral. Reçoit le nombre de blocs de filtres actifs. */\n filterPanelTitle: (count: number) => string;\n /** Titre par défaut d'un bloc de filtre sans `title` configuré. */\n filterBlockDefaultTitle: string;\n /** Message dans un bloc de filtre sans catégories correspondantes. */\n filterEmptyState: string;\n /** Label du bouton d'export CSV. */\n exportButtonLabel: string;\n /** Label du menu Préférences dans View. */\n preferencesMenuLabel: string;\n /** Sous-item : activer le mode édition. */\n preferencesEdit: string;\n /** Sous-item : enregistrer la config. */\n preferencesSave: string;\n /** Sous-item : effacer la config. */\n preferencesClear: string;\n /** Message de confirmation après enregistrement. */\n preferencesSavedMessage: string;\n /** Message de confirmation après effacement. */\n preferencesClearedMessage: string;\n /** Tooltip du bouton de validation du mode édition. */\n preferencesConfirmEdit: string;\n}\n\n/** Valeurs par défaut (français). Toutes les propriétés sont garanties non nulles. */\nexport const JQT_I18N_DEFAULTS: JqtI18n = {\n searchPlaceholder: 'Rechercher...',\n expandFilterTitle: 'Déplier le filtre',\n collapseFilterTitle: 'Replier le filtre',\n viewMenuFields: 'Champs',\n viewMenuGroupBy: 'Grouper par',\n viewMenuSliceBy: 'Filtrer par',\n viewNoneSelected: 'Aucun',\n groupRemove: 'Retirer le groupe',\n groupSortLabel: 'Trier :',\n groupSortAsc: 'A → Z',\n groupSortDesc: 'Z → A',\n groupRowsPerGroup: 'Lignes par groupe :',\n groupShowAll: 'Toutes',\n groupTooMany: (count) => `⚠ Trop de groupes (${count}) — affinez les données ou choisissez une autre colonne`,\n lazyRetry: 'Réessayer',\n lazyErrorTitle: 'Erreur de chargement — cliquer pour réessayer',\n lazyErrorMenuTitle: 'Erreur de chargement',\n cellEmpty: 'N/A',\n emptyState: 'Aucune donnée',\n loadingState: 'Chargement des données...',\n filterPanelTitle: (count) => count > 1 ? 'Filtres' : 'Filtre',\n filterBlockDefaultTitle: 'Filtrer',\n filterEmptyState: 'Aucune donnée',\n exportButtonLabel: 'Exporter',\n preferencesMenuLabel: 'Préférences',\n preferencesEdit: 'Éditer',\n preferencesSave: 'Sauvegarder',\n preferencesClear: 'Réinitialiser',\n preferencesSavedMessage: 'Configuration enregistrée. Vous pouvez la réinitialiser à tout moment via Préférences → Réinitialiser.',\n preferencesClearedMessage: 'Configuration réinitialisée.',\n preferencesConfirmEdit: 'Valider les modifications',\n};\n\n/**\n * Token d'injection pour surcharger tout ou partie des labels de jquery-table.\n * Accepte un `Partial<JqtI18n>` — seules les clés fournies écrasent les défauts.\n */\nexport const JQT_I18N = new InjectionToken<Partial<JqtI18n>>('JQT_I18N');\n","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`), `index` (index global) et `value` (valeur affichée de la cellule,\n * y compris pour une colonne `lazy` dont la valeur n'est pas présente dans la ligne brute).\n * Pour une colonne `lazy`, le template n'est rendu qu'une fois la valeur chargée ; le chargement et l'erreur sont gérés par le tableau.\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; value: any }>) {}\n}\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();\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 { SavedTableConfig } from '../jquery-table.model';\n\nconst STORAGE_PREFIX = 'jqt_prefs_';\n\n/**\n * Gère la persistance de la configuration d'un tableau dans le localStorage.\n * Identifie chaque tableau par un `tableId` unique fourni par l'utilisateur.\n */\nexport class TablePreferencesManager {\n readonly key: string;\n\n constructor(tableId: string) {\n this.key = STORAGE_PREFIX + tableId;\n }\n\n /** Retourne la configuration sauvegardée, ou `null` si absente / corrompue. */\n load(): SavedTableConfig | null {\n try {\n const raw = localStorage.getItem(this.key);\n return raw ? (JSON.parse(raw) as SavedTableConfig) : null;\n } catch {\n return null;\n }\n }\n\n /** Persiste la configuration dans le localStorage. */\n save(config: SavedTableConfig): void {\n try {\n localStorage.setItem(this.key, JSON.stringify(config));\n } catch {\n // localStorage peut être indisponible (mode privé strict, quota dépassé…)\n }\n }\n\n /** Supprime la configuration sauvegardée. */\n clear(): void {\n try {\n localStorage.removeItem(this.key);\n } catch {\n // stockage indisponible : rien à effacer\n }\n }\n\n /** Indique si une configuration est actuellement sauvegardée. */\n hasSaved(): boolean {\n try {\n return localStorage.getItem(this.key) !== null;\n } catch {\n return false;\n }\n }\n}\n","import { TableColumnProvider, TableExportConfig } from '../jquery-table.model';\n\n/**\n * ExportManager\n *\n * Encapsule l'export CSV : construction du fichier BOM/UTF-8, échappement et déclenchement du téléchargement.\n * Aucune dépendance Angular — indépendant du cycle de vie du composant.\n */\nexport class ExportManager<T> {\n constructor(\n private readonly getRows: () => T[],\n private readonly getColumns: () => TableColumnProvider<T>[],\n private readonly getConfig: () => TableExportConfig<T> | undefined,\n private readonly resolveCellValue: (col: TableColumnProvider<T>, row: T, index: number) => any,\n ) {}\n\n export(): void {\n const cfg = this.getConfig();\n if (!cfg?.enabled) return;\n const rows = this.getRows();\n const columns = this.getColumns();\n const baseName = cfg.filename || 'export';\n const filename = baseName.toLowerCase().endsWith('.csv') ? baseName : baseName + '.csv';\n\n const header = columns.map(c => this._csvEscape(c.header || c.key)).join(',');\n const lines = rows.map((row, idx) => {\n if (cfg.transform) {\n const t = cfg.transform(row);\n return columns.map(c => this._csvEscape(String(t[c.key] ?? ''))).join(',');\n }\n return columns.map(c => this._csvEscape(String(this.resolveCellValue(c, row, idx) ?? ''))).join(',');\n });\n\n // BOM UTF-8 pour une ouverture correcte sous Excel\n const blob = new Blob(['\\uFEFF' + [header, ...lines].join('\\n')], { type: 'text/csv;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n private _csvEscape(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n') || value.includes('\\r')) {\n return '\"' + value.replaceAll('\"', '\"\"') + '\"';\n }\n return value;\n }\n}\n","/**\n * Constantes sentinel utilisées pour les identifiants de colonnes et les valeurs\n * projetées dans le datasource interne de la table.\n *\n * Centraliser ici évite les typos silencieuses et facilite les tests unitaires.\n */\n\n/** Identifiant de la colonne virtuelle rendue sur toute la largeur pour les en-têtes de groupe. */\nexport const GROUP_ROW_COLUMN = '__group_row';\n\n/** Marqueur posé sur les objets de ligne pour signaler une ligne d'en-tête de groupe. */\nexport const GROUP_HEADER_MARKER = '__groupHeader';\n\n/** Clé du groupe spéciale « chargement lazy en cours ». */\nexport const GROUP_KEY_LAZY_LOADING = '__lazy_loading__';\n\n/** Clé du groupe spéciale « chargement lazy en erreur ». */\nexport const GROUP_KEY_LAZY_ERROR = '__lazy_error__';\n\n/** Clé du groupe spéciale « trop de groupes ». */\nexport const GROUP_KEY_TOO_MANY = '__too_many_groups__';\n\n/** Propriété injectée dans chaque ligne projetée : référence vers la ligne brute d'origine. */\nexport const ROW_RAW_KEY = '__raw';\n\n/** Propriété injectée dans chaque ligne projetée : index global de la ligne dans le jeu de données filtré. */\nexport const ROW_INDEX_KEY = '__index';\n\n/** Propriété injectée dans chaque ligne projetée : clé du groupe auquel appartient la ligne d'en-tête. */\nexport const ROW_GROUP_KEY = '__groupKey';\n\n/** Propriété injectée dans chaque ligne projetée : nombre de lignes dans le groupe. */\nexport const ROW_GROUP_COUNT = '__groupCount';\n\n/** Propriété injectée dans chaque ligne projetée : page courante du groupe. */\nexport const ROW_GROUP_PAGE = '__groupPage';\n\n/** Propriété injectée dans chaque ligne projetée : nombre de pages du groupe. */\nexport const ROW_GROUP_PAGE_COUNT = '__groupPageCount';\n\n/** Valeur sentinelle posée dans une cellule lazy en cours de chargement. */\nexport const LAZY_LOADING_VALUE = '__lazy_loading__';\n\n/** Valeur sentinelle posée dans une cellule lazy en erreur. */\nexport const LAZY_ERROR_VALUE = '__lazy_error__';\n","import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\nimport { OrganizerButtonComponent, OrganizerConfig, OrganizerButtonEvent, OrganizerState, OrganizerSliceState } from '@oneteme/jquery-organizer';\n\n@Component({\n standalone: true,\n selector: 'table-organizer-button',\n imports: [OrganizerButtonComponent],\n template: `\n <organizer-button\n [config]=\"config\"\n [state]=\"state\"\n [hideMenuValues]=\"hideMenuValues\"\n (viewChange)=\"viewChange.emit($event)\"\n (sliceStateChange)=\"sliceStateChange.emit($event)\">\n </organizer-button>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class OrganizerButtonWrapperComponent {\n @Input() config!: OrganizerConfig;\n @Input() state?: OrganizerState;\n @Input() hideMenuValues = false;\n @Output() viewChange = new EventEmitter<OrganizerButtonEvent>();\n @Output() sliceStateChange = new EventEmitter<OrganizerSliceState | null>();\n}\n","import { CommonModule } from '@angular/common';\nimport { AfterContentInit, AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, HostBinding, HostListener, inject, Input, isDevMode, NgZone, OnChanges, OnDestroy, Output, QueryList, SimpleChanges, TemplateRef, ViewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } 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 { defer, Subject, Subscription, take, takeUntil } from 'rxjs';\nimport { TableColumnProvider, TableExportConfig, TablePreferencesConfig, TableProvider, TableViewConfig } from '../jquery-table.model';\nimport { JqtI18n, JQT_I18N, JQT_I18N_DEFAULTS } from '../jqt-i18n.token';\nimport { JqtCellDefDirective } from '../directive/jqt-cell-def.directive';\nimport { SliceConfig, SlicePanelComponent, OrganizerFacade, GroupByManager, OrganizerConfig, OrganizerButtonEvent, OrganizerState } from '@oneteme/jquery-organizer';\nimport { getFrenchPaginatorIntl, humanizeKey, normalizeCellValue } from './table.utils';\nimport { TablePreferencesManager } from './table-preferences.manager';\nimport { ExportManager } from './export.manager';\nimport {\n GROUP_ROW_COLUMN, GROUP_HEADER_MARKER,\n GROUP_KEY_LAZY_LOADING, GROUP_KEY_LAZY_ERROR, GROUP_KEY_TOO_MANY,\n ROW_RAW_KEY, ROW_INDEX_KEY,\n ROW_GROUP_KEY, ROW_GROUP_COUNT, ROW_GROUP_PAGE, ROW_GROUP_PAGE_COUNT,\n LAZY_LOADING_VALUE, LAZY_ERROR_VALUE,\n} from './table.constants';\nimport { OrganizerButtonWrapperComponent } from './organizer-button/organizer-button.component';\nimport { cloneSerializable, containsFunction, FullscreenManager, VisualCopyFeedbackConfig, VisualSnapshot, VisualSnapshotApplyResult, VisualSnapshotDraft, VisualSnapshotStorage } from '@oneteme/jquery-core';\n\n/** Cache interne du groupement — invalidé dès que les données, la clé ou les paramètres de tri changent. */\ninterface GroupByCache<T> {\n rows: T[];\n key: string;\n sortOrder: 'asc' | 'desc';\n sortActive: string;\n sortDir: string;\n order: string[];\n map: Map<string, T[]>;\n}\n\ninterface TableSortState {\n active: string;\n direction: 'asc' | 'desc' | '';\n}\n\n/** Options de l'Organizer déduites de TableViewConfig. */\ninterface OrganizerViewOptions {\n enabled?: boolean;\n enableFieldRemoval?: boolean;\n enableFieldDragDrop?: boolean;\n}\n\n@Component({\n standalone: true,\n selector: 'jquery-table',\n imports: [ CommonModule, FormsModule, MatTableModule, MatButtonModule, MatDividerModule, MatPaginatorModule, MatSortModule, MatMenuModule, MatIconModule, MatSelectModule, SlicePanelComponent, OrganizerButtonWrapperComponent ],\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, AfterContentInit, AfterViewInit, OnDestroy {\n @HostBinding('class.visual-fullscreen') _isFullscreen = false;\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 /**\n * Mode HTML : active et configure le panneau View indépendamment du `[config]`.\n * Prend le dessus sur `config.view` si défini.\n * Exemple : `<jquery-table [view]=\"{ enabled: true }\">`\n */\n @Input() view?: TableViewConfig;\n\n @Input() columnLabels?: Record<string, string>;\n @Input() isLoading = false;\n /**\n * À passer à `true` quand la requête relancée après `lazyColumnsRequested` échoue : les colonnes en attente affichent un bouton\n * « Réessayer ». Repasser à `false` au nouvel essai.\n */\n @Input() lazyError = false;\n @Input() copyFeedback: VisualCopyFeedbackConfig = {};\n\n /** Paramètre de contrôle pour réinitialiser barre de recherche. */\n @Input()\n set clearSearchInput(value: boolean | null | undefined) {\n if (value) {\n this.searchQuery = '';\n this.onSearchChange();\n }\n }\n\n @Output() readonly addRequested = new EventEmitter<void>();\n @Output() readonly columnAdded = new EventEmitter<TableColumnProvider<T>>();\n @Output() readonly columnRemoved = new EventEmitter<TableColumnProvider<T>>();\n @Output() readonly categorySelected = new EventEmitter<string>();\n @Output() readonly rowSelected = new EventEmitter<T>();\n\n /** Émis à chaque changement de tri (y compris le tri initial). */\n @Output() readonly sortChange = new EventEmitter<TableSortState>();\n /** Émis à chaque changement de page ou de taille de page. */\n @Output() readonly pageChange = new EventEmitter<{ pageIndex: number; pageSize: number }>();\n /** Émis à chaque changement de la recherche texte. */\n @Output() readonly searchChange = new EventEmitter<string>();\n /** Émis quand le Group by change (clé de colonne, ou `null` si désactivé). */\n @Output() readonly groupByChange = new EventEmitter<string | null>();\n /** Émis quand la liste des colonnes visibles change (clés dans l’ordre d’affichage). */\n @Output() readonly columnsChange = new EventEmitter<string[]>();\n @Output() readonly visualCopied = new EventEmitter<VisualSnapshot>();\n /**\n * Clés de toutes les colonnes `lazy` demandées jusqu'ici (cumul), émises quand l'une d'elles est activée pour la première fois.\n * L'application relance sa requête complète en les incluant puis repasse les nouvelles `data`.\n */\n @Output() readonly lazyColumnsRequested = new EventEmitter<string[]>();\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('tableShell') tableShellRef?: ElementRef<HTMLElement>;\n @ViewChild(SlicePanelComponent) slicePanelRef?: SlicePanelComponent<T>;\n @ContentChildren(JqtCellDefDirective) _cellDefs!: QueryList<JqtCellDefDirective>;\n /** Map clé→TemplateRef pré-calculée depuis _cellDefs. Mise à jour dans ngAfterContentInit et sur _cellDefs.changes. */\n private _cellDefMap = new Map<string, TemplateRef<{ $implicit: any; index: number; value: any }>>();\n\n renderedColumns: string[] = [];\n tableDataSource = new MatTableDataSource<any>([]);\n\n /** Constante exposée au template pour le matColumnDef de la ligne de groupe. */\n readonly _GROUP_ROW_COLUMN = GROUP_ROW_COLUMN;\n /** Clés d'accès aux propriétés des lignes projetées — exposées pour le template. */\n readonly _ROW_RAW_KEY = ROW_RAW_KEY;\n readonly _ROW_INDEX_KEY = ROW_INDEX_KEY;\n readonly _ROW_GROUP_KEY = ROW_GROUP_KEY;\n readonly _ROW_GROUP_COUNT = ROW_GROUP_COUNT;\n readonly _ROW_GROUP_PAGE = ROW_GROUP_PAGE;\n readonly _ROW_GROUP_PAGE_COUNT = ROW_GROUP_PAGE_COUNT;\n\n /** Facade View : état et actions centralisés (Champs / Group by / Slice by) */\n readonly _organizer = new OrganizerFacade<TableColumnProvider<T>>();\n\n /**\n * Snapshot stable synchronisé depuis _organizer.fields.activeFields dans refreshViewModel().\n * Propriété (non getter) pour qu'Angular puisse la suivre sans NG0100.\n */\n activeFields: 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 /** Snapshot stable de la visibilité du panneau slice — jamais calculé depuis @ViewChild */\n _showSlicePanel = false;\n /** Snapshot stable de l'état collapsed du panneau slice, mis à jour via (collapsedChange) */\n _slicePanelCollapsed = false;\n private _initialSlicePanelCollapsedApplied = false;\n\n // Délégués vers _view (conservés pour compatibilité template sans refactoring HTML)\n get _staticSlicesForMenu(): Array<{ key: string; title: string; icon?: string }> { return this._organizer.staticSlicesForMenu; }\n get _activeDynamicSliceColumns(): TableColumnProvider<T>[] { return this._organizer.sliceBy.activeDynamicFields; }\n get _availableColumnsForDynamicSlice(): TableColumnProvider<T>[] { return this._organizer.sliceBy.availableForDynamic; }\n get _allDynamicSliceColumns(): TableColumnProvider<T>[] { return this._organizer.sliceBy.allDynamicFields; }\n get _activeSliceByLabel(): string { return this._organizer.sliceBy.activeLabel; }\n _sliceByMenuItems: Array<{ isStatic: boolean; key: string; title: string; icon?: string; col?: TableColumnProvider<T> }> = [];\n\n searchQuery = '';\n get activeGroupByKey(): string | null { return this._organizer.groupBy.activeKey; }\n _matSortActive = '';\n _matSortDirection: 'asc' | 'desc' | '' = '';\n private _activeSort: TableSortState = { active: '', direction: '' };\n private _sortSubscribed: MatSort | null = null;\n private _destroy$ = new Subject<void>();\n private _totalFilteredCount = 0;\n\n /** Gestionnaire du mode Group By (état collapsed, pagination, tri des groupes). */\n readonly _groupBy = new GroupByManager(\n () => { this._projectCurrentPage(); this._cdr.markForCheck(); },\n () => this.refreshViewModel(),\n );\n\n /** Délégués vers GroupByManager pour la compatibilité des templates. */\n get groupPageSize(): number { return this._groupBy.groupPageSize; }\n set groupPageSize(v: number) { this._groupBy.groupPageSize = v; }\n get groupSortOrder(): 'asc' | 'desc' { return this._groupBy.groupSortOrder; }\n set groupSortOrder(v: 'asc' | 'desc') { this._groupBy.groupSortOrder = v; }\n\n /**\n * Statut des colonnes `lazy` déjà demandées (absente = pas encore demandée).\n * `loading` dure jusqu'à la réception de nouvelles `data` ; la référence change à chaque mise à jour (panneau de slices).\n */\n _lazyColumnStatus = new Map<string, 'idle' | 'loading' | 'loaded' | 'error'>();\n private _lazyFlushQueued = false;\n /** Lignes retournées par `config.lazyLoader` : elles remplacent `data` jusqu'au prochain `data`. */\n private _loaderRows: T[] | null = null;\n private _loaderSub?: Subscription;\n private _lazyWarned = false;\n /** Colonnes de la dernière config résolue : évite de reconstruire le tableau (et d'agiter le panneau de slices) à chaque rafraîchissement. */\n private _columnsSource?: TableColumnProvider<T>[];\n private _columnsNormalized?: TableColumnProvider<T>[];\n private readonly _optionalLazyColumns = new WeakMap<object, TableColumnProvider<T>>();\n private _cdr = inject(ChangeDetectorRef);\n private _el = inject(ElementRef<HTMLElement>);\n private _ngZone = inject(NgZone);\n private _paginatorIntl = inject(MatPaginatorIntl);\n private _i18nRaw = inject(JQT_I18N, { optional: true });\n private _tableShellResizeObserver?: ResizeObserver;\n private readonly _fullItemsPerPageLabel = this._paginatorIntl.itemsPerPageLabel;\n copyFeedbackMessage = '';\n private _copyFeedbackTimer?: number;\n\n /** Labels de l’interface. Fusionnés depuis JQT_I18N_DEFAULTS et le token JQT_I18N injecté. */\n readonly i18n: JqtI18n = this._i18nRaw\n ? { ...JQT_I18N_DEFAULTS, ...this._i18nRaw }\n : { ...JQT_I18N_DEFAULTS };\n\n isGroupHeader = (_: number, row: any): boolean => row[GROUP_HEADER_MARKER] === true;\n\n /** Retourne true si la ligne de groupe est une ligne normale (ni lazy, ni too-many). */\n isNormalGroupRow(row: any): boolean {\n const key = row[ROW_GROUP_KEY];\n return key !== GROUP_KEY_LAZY_LOADING && key !== GROUP_KEY_LAZY_ERROR && key !== GROUP_KEY_TOO_MANY;\n }\n isGroupRowLoading(row: any): boolean { return row[ROW_GROUP_KEY] === GROUP_KEY_LAZY_LOADING; }\n isGroupRowError(row: any): boolean { return row[ROW_GROUP_KEY] === GROUP_KEY_LAZY_ERROR; }\n isGroupRowTooMany(row: any): boolean { return row[ROW_GROUP_KEY] === GROUP_KEY_TOO_MANY; }\n\n retryGroupByColumn(event?: Event): void {\n event?.stopPropagation();\n this.retryLazyColumns();\n }\n\n /** Gère le clic sur une ligne d'en-tête de groupe (no-op pour les états spéciaux). */\n onGroupHeaderClick(row: any): void {\n if (!this.isNormalGroupRow(row)) return;\n this.toggleGroupCollapse(row[ROW_GROUP_KEY]);\n }\n\n /** Gestionnaire export CSV. */\n private readonly _export = new ExportManager<T>(\n () => this._allFilteredRows,\n () => this.activeFields,\n () => this.resolvedConfig.export,\n (col, row, idx) => this._resolveExportValue(col, row, idx),\n );\n\n // ── Lifecycle\n\n pageSize = 5;\n pageSizeOptions: number[] = [5, 10, 20];\n pageSizeOptionsGroupBy: number[] = [5, 10, 20];\n\n draggedColumnKey: string | null = null;\n dragOverColumnKey: string | null = null;\n\n // ── Mode édition (Préférences)\n /** Vrai quand le mode édition est actif (resize + drag colonnes, interactions désactivées). */\n _editMode = false;\n /** Largeurs de colonnes personnalisées par l'utilisateur (clé → px). */\n _columnWidths: Record<string, number> = {};\n /** Message de feedback après save/clear. `null` = pas de message. */\n _preferencesMessage: string | null = null;\n /** Vrai si une configuration est sauvegardée pour ce tableau. */\n _hasSavedConfig = false;\n private _preferencesManager: TablePreferencesManager | null = null;\n /** true une fois que le group-by par défaut a été initialisé (évite de reconfigurer GroupByManager à chaque changement de données). */\n private _defaultGroupByApplied = false;\n private _resizeState: { key: string; startX: number; startWidth: number } | null = null;\n /** Dynamic slice keys à restaurer après ngAfterViewInit (slicePanelRef pas encore dispo). */\n private _pendingDynamicSliceKeys: string[] | null = null;\n /** Filtres de slice à restaurer après ngAfterViewInit (slicePanelRef pas encore dispo). */\n private _pendingSliceFilters: Record<string, string[]> | null = null;\n\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 _lastConfigClearSearchInput: string | number | boolean | null | undefined;\n private _initialSearchQueryApplied = false;\n private _lastInitialSearchQuery: string | undefined;\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 — invalidé dès que rows/key/tri changent. */\n private _groupCache: GroupByCache<T> | null = null;\n private _pendingRender: ReturnType<typeof setTimeout> | null = null;\n private readonly _deferredTimers = new Set<ReturnType<typeof setTimeout>>();\n private _headerMeasureFrame: number | null = null;\n private _destroyed = false;\n\n private _staticSliceHiddenKeys = new Set<string>();\n private _configHiddenKeys = new Set<string>();\n\n\n /** Clés des colonnes visibles du dernier émission columnsChange (pour éviter les émissions dupliquement). */\n private _prevColumnKeys: string[] = [];\n\n private emitColumnsChangeIfNeeded(): void {\n const nextKeys = [...this.renderedColumns];\n if (nextKeys.length === this._prevColumnKeys.length\n && nextKeys.every((key, index) => key === this._prevColumnKeys[index])) return;\n this._prevColumnKeys = nextKeys;\n this.columnsChange.emit(nextKeys);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n const dataChanged = !!(changes['data'] || changes['dataSource']);\n if (dataChanged) this._onNewData();\n if (changes['lazyError']) this._applyLazyError();\n this.refreshViewModel();\n if (changes['config']) {\n this.applyConfigSearchReset();\n this.applyInitialSearchQuery(changes['config'].firstChange);\n this._invalidateOrganizerConfig(); // les colonnes ont pu changer\n }\n if (dataChanged && this._lazyColumnStatus.size && this._resolvedData.length) this._runLazyLoader();\n }\n\n ngAfterContentInit(): void {\n this._rebuildCellDefMap();\n this._cellDefs.changes.pipe(takeUntil(this._destroy$)).subscribe(() => {\n this._rebuildCellDefMap();\n this._cdr.markForCheck();\n });\n }\n\n ngAfterViewInit(): void {\n this.attachPaginator();\n this.attachSort();\n this._measureHeaderHeight();\n this._observeTableShellWidth();\n this._applyPendingDynamicSliceKeys();\n }\n\n private _observeTableShellWidth(): void {\n const tableShell = this.tableShellRef?.nativeElement;\n if (!tableShell || typeof ResizeObserver === 'undefined') return;\n\n this._tableShellResizeObserver = new ResizeObserver(([entry]) => {\n const compact = entry.contentRect.width < 660;\n const label = compact ? 'Par page :' : this._fullItemsPerPageLabel;\n if (this._paginatorIntl.itemsPerPageLabel === label) return;\n\n this._ngZone.run(() => {\n this._paginatorIntl.itemsPerPageLabel = label;\n this._paginatorIntl.changes.next();\n this._cdr.markForCheck();\n });\n });\n this._tableShellResizeObserver.observe(tableShell);\n }\n\n private _applyPendingDynamicSliceKeys(): void {\n const hasPendingDynamic = !!this._pendingDynamicSliceKeys;\n const hasPendingFilters = !!this._pendingSliceFilters;\n if (!hasPendingDynamic && !hasPendingFilters) return;\n\n const allCols = this.resolvedConfig.columns ?? [];\n const keys = hasPendingDynamic ? [...this._pendingDynamicSliceKeys!] : [];\n const filters = this._pendingSliceFilters ? { ...this._pendingSliceFilters } : null;\n this._pendingDynamicSliceKeys = null;\n this._pendingSliceFilters = null;\n\n this._scheduleDeferred(() => {\n if (this._resolvedData.length === 0) {\n if (filters) this._pendingSliceFilters = filters;\n if (keys.length > 0) this._pendingDynamicSliceKeys = [...keys];\n return;\n }\n keys.forEach(key => {\n const col = allCols.find(c => c.key === key);\n if (col) this.addDynamicSlice(col);\n });\n if (filters && this.slicePanelRef) {\n this.slicePanelRef.restoreFilters(filters);\n }\n this._cdr.markForCheck();\n });\n }\n\n ngOnDestroy(): void {\n this._destroyed = true;\n this._tableShellResizeObserver?.disconnect();\n if (this._copyFeedbackTimer !== undefined) window.clearTimeout(this._copyFeedbackTimer);\n if (this._pendingRender !== null) {\n clearTimeout(this._pendingRender);\n }\n if (this._preferencesMessageTimer !== null) {\n clearTimeout(this._preferencesMessageTimer);\n }\n this._deferredTimers.forEach(timer => clearTimeout(timer));\n this._deferredTimers.clear();\n if (this._headerMeasureFrame !== null) cancelAnimationFrame(this._headerMeasureFrame);\n // Nettoie un éventuel resize en cours (listeners window non retirés)\n this._resizeState = null;\n this._destroy$.next();\n this._destroy$.complete();\n this._organizer.destroy();\n }\n\n private _measureHeaderHeight(): void {\n const measure = () => {\n if (this._destroyed) return;\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 return;\n }\n }\n // Header pas encore rendu (ex: lazy Angular Material), on réessaie après le prochain frame\n this._scheduleHeaderMeasure(measure);\n };\n this._scheduleHeaderMeasure(measure);\n }\n\n private _scheduleHeaderMeasure(measure: () => void): void {\n this._ngZone.runOutsideAngular(() => {\n this._headerMeasureFrame = requestAnimationFrame(() => {\n this._headerMeasureFrame = null;\n measure();\n });\n });\n }\n\n private _scheduleDeferred(callback: () => void): void {\n const timer = setTimeout(() => {\n this._deferredTimers.delete(timer);\n if (!this._destroyed) callback();\n }, 0);\n this._deferredTimers.add(timer);\n }\n\n private _organizerConfigCache: OrganizerConfig | null = null;\n private _invalidateOrganizerConfig(): void { this._organizerConfigCache = null; }\n get organizerConfig(): OrganizerConfig {\n if (this._organizerConfigCache) return this._organizerConfigCache;\n const allCols = [...this._organizer.menuBaseFields, ...this._organizer.menuOptionalFields];\n const organizerOptions = this.resolvedConfig.organizer;\n this._organizerConfigCache = {\n fields: this._organizer.showFields ? allCols.map(c => ({\n id: c.key,\n label: this.colLabel(c),\n icon: c.icon,\n state: 'ready' as const,\n })) : undefined,\n groups: this._organizer.showGroupBySection ? this._organizer.groupByFields.map(c => ({\n id: c.key,\n label: this.colLabel(c),\n icon: c.icon,\n })) : undefined,\n slices: this._organizer.showSliceBySection ? this._sliceByMenuItems.map(item => ({\n id: item.key,\n label: item.title,\n icon: item.icon,\n })) : undefined,\n buttonLabel: organizerOptions?.buttonLabel,\n buttonIcon: organizerOptions?.buttonIcon,\n showButtonIcon: organizerOptions?.showButtonIcon,\n showExport: this.showExportButton,\n onExport: () => this.onExport(),\n showPreferences: this.showPreferencesMenu,\n hasSavedPreferences: this.hasSavedPreferences,\n onPreferencesEdit: () => this.enterEditMode(),\n onPreferencesSave: () => this.savePreferences(),\n onPreferencesClear: () => this.clearPreferences(),\n showActions: this.resolvedConfig.showActions === true,\n onCopyVisual: this.resolvedConfig.onCopyVisual ?? (() => this.copyVisualSnapshot()),\n onToggleFullscreen: this.resolvedConfig.onToggleFullscreen ?? (this.fullscreenSupported ? () => this.toggleFullscreen() : undefined),\n isFullscreen: this._isFullscreen,\n };\n return this._organizerConfigCache;\n }\n\n get organizerHideMenuValues(): boolean {\n return this.resolvedConfig.organizer?.hideMenuValues === true;\n }\n\n get organizerState(): OrganizerState {\n return {\n visibleFields: this.visibleColumns.map(c => c.key),\n selectedGroupBy: this.activeGroupByKey ?? undefined,\n selectedSlices: this._sliceByMenuItems\n .filter(i => this.isSliceMenuItemActive(i))\n .map(i => i.key),\n };\n }\n\n onOrganizerViewChange(event: OrganizerButtonEvent): void {\n if (event.type === 'fieldToggled') {\n const allCols = [...this._organizer.menuBaseFields, ...this._organizer.menuOptionalFields];\n const newVisible = new Set(event.state.visibleFields ?? []);\n for (const col of allCols) {\n const isNowVisible = newVisible.has(col.key);\n if (this.isColumnVisible(col.key) !== isNowVisible) {\n this.onColumnVisibilityChange(col, isNowVisible);\n }\n }\n } else if (event.type === 'groupBySelected') {\n const newKey = event.state.selectedGroupBy ?? null;\n this.onGroupByChange(newKey === this.activeGroupByKey ? null : newKey);\n } else if (event.type === 'sliceSelected') {\n const prevSlices = new Set(this.organizerState.selectedSlices ?? []);\n const nextSlices = new Set(event.state.selectedSlices ?? []);\n const clickedId = [...prevSlices].find(id => !nextSlices.has(id))\n ?? [...nextSlices].find(id => !prevSlices.has(id));\n if (clickedId) {\n const item = this._sliceByMenuItems.find(i => i.key === clickedId);\n if (item) this.onSliceMenuItemClick(item);\n }\n }\n this._cdr.markForCheck();\n }\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.activeFields;\n }\n\n get showSearchBar(): boolean { return this.resolvedConfig.search?.enabled === true; }\n get showViewButton(): boolean { return this._organizer.enabled || this.showExportButton || this.showPreferencesMenu; }\n get showOrganizerButton(): boolean { return this._organizer.enabled || this.showExportButton || this.showPreferencesMenu; }\n get showSliceExpandBtn(): boolean { return this._showSlicePanel && this._slicePanelCollapsed && this._sliceShowToggle; }\n get showExportButton(): boolean {\n return this.resolvedConfig.export?.enabled === true;\n }\n get showPreferencesMenu(): boolean {\n return this.resolvedConfig.preferences?.enabled === true;\n }\n\n get isDefaultGroupByActive(): boolean {\n if (!this.activeGroupByKey) return false;\n return this.activeGroupByKey === this.resolvedConfig.defaultGroupBy;\n }\n\n get hasSavedPreferences(): boolean { return this._hasSavedConfig; }\n\n get showToolbar(): boolean { return this.showSearchBar || this.showViewButton || this.showSliceExpandBtn; }\n get fullscreenSupported(): boolean { return FullscreenManager.isSupported(this._el.nativeElement); }\n\n async toggleFullscreen(): Promise<void> {\n try {\n await FullscreenManager.toggle(this._el.nativeElement);\n } catch {\n this._isFullscreen = false;\n }\n this._invalidateOrganizerConfig();\n this._cdr.markForCheck();\n }\n\n /** Crée un snapshot autonome et le place dans le stockage partagé. */\n copyVisualSnapshot(label?: string): VisualSnapshot | null {\n const snapshotLabel = label ?? (this.title || 'Tableau');\n if (!snapshotLabel?.trim()) return null;\n const snapshot = new VisualSnapshotStorage().create(this.createVisualSnapshot(snapshotLabel.trim()));\n this.visualCopied.emit(snapshot);\n this.showCopyFeedback();\n return snapshot;\n }\n\n private showCopyFeedback(): void {\n if (this.copyFeedback.enabled === false) return;\n this.copyFeedbackMessage = this.copyFeedback.message || 'Copié';\n if (this._copyFeedbackTimer !== undefined) window.clearTimeout(this._copyFeedbackTimer);\n this._copyFeedbackTimer = window.setTimeout(() => this.copyFeedbackMessage = '', this.copyFeedback.durationMs ?? 2200);\n }\n\n @HostListener('document:fullscreenchange')\n onFullscreenChange(): void {\n this._isFullscreen = FullscreenManager.isActive(this._el.nativeElement);\n this._invalidateOrganizerConfig();\n this._cdr.markForCheck();\n }\n\n expandSlicePanel(): void {\n this.slicePanelRef?.togglePanel();\n }\n get showFields(): boolean { return this._organizer.showFields; }\n get showGroupBySection(): boolean { return this._organizer.showGroupBySection; }\n\n get filteredRowCount(): number {\n return this.activeGroupByKey ? this._totalFilteredCount : this._allFilteredRows.length;\n }\n\n get activeGroupByLabel(): string { return this._organizer.activeGroupByLabel; }\n\n get totalColumnCount(): number { return this._organizer.totalFieldCount; }\n\n get activeSliceByLabel(): string { return this._organizer.sliceBy.activeLabel; }\n\n get activeDynamicSliceColumns(): TableColumnProvider<T>[] { return this._organizer.sliceBy.activeDynamicFields; }\n\n removeDynamicSliceByKey(key: string): void {\n this.slicePanelRef?.removeDynamicSliceByKey(key);\n }\n\n get groupByColumns(): TableColumnProvider<T>[] { return this._organizer.groupByFields; }\n\n colLabel(col: { key: string; header?: string }): string { return this._organizer.fieldLabel(col); }\n\n /** Traduit les options de la vue table vers celles de l'Organizer. */\n private _organizerViewConfig(): OrganizerViewOptions | undefined {\n const view = this.resolvedConfig.view;\n if (!view) return undefined;\n return {\n enabled: view.enabled,\n enableFieldRemoval: view.enableColumnRemoval,\n enableFieldDragDrop: view.enableColumnDragDrop,\n };\n }\n\n /** Ne change la référence que si le contenu change : le panneau recalcule tout à chaque nouvelle référence. */\n private _setSliceConfigs(next: SliceConfig<T>[]): void {\n const same = next.length === this._sliceConfigs.length && next.every((slice, i) => slice === this._sliceConfigs[i]);\n if (!same) this._sliceConfigs = next;\n }\n\n onSearchChange(): void {\n this._runSearch();\n this.searchChange.emit(this.searchQuery);\n }\n\n private _runSearch(): void {\n this._preservePageIndex = 0;\n this._scheduleRender();\n this.paginator?.firstPage();\n }\n\n private setGroupByAndEmit(key: string | null): void {\n const previousKey = this._organizer.groupBy.activeKey ?? null;\n this._organizer.setGroupBy(key);\n const nextKey = this._organizer.groupBy.activeKey ?? null;\n if (previousKey !== nextKey) this.groupByChange.emit(nextKey);\n }\n\n onGroupByChange(key: string | null): void {\n this.setGroupByAndEmit(key);\n this._groupBy.setDefaultCollapsed(key !== null);\n this._groupBy.reset();\n this._groupBy.groupPageSize = this.resolveDefaultGroupPageSize();\n this.refreshViewModel();\n this.paginator?.firstPage();\n if (!key) {\n this._ngZone.runOutsideAngular(() => this._scheduleDeferred(() => {\n this.tableBodyScrollRef?.nativeElement.scrollTo({ top: 0, behavior: 'smooth' });\n }));\n }\n }\n\n onGroupPageSizeChange(size: number | string): void {\n this._groupBy.onGroupPageSizeChange(Number(size));\n }\n\n onGroupSortToggle(dir: 'asc' | 'desc'): void {\n this._groupBy.onGroupSortToggle(dir, (key) => {\n this._ngZone.runOutsideAngular(() => this._scheduleDeferred(() => this.scrollToGroupHeader(key)));\n });\n }\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_VALUE) return 'loading';\n if (rowValue === LAZY_ERROR_VALUE) return 'error';\n return 'value';\n }\n\n /** Relance la demande des colonnes en erreur : le chargeur est rappelé, ou l'application refait sa requête complète. */\n retryLazyColumns(): void {\n const failed = [...this._lazyColumnStatus].filter(([, status]) => status === 'error').map(([key]) => key);\n if (!failed.length) return;\n this._setLazyStatus(failed, 'loading');\n this.lazyColumnsRequested.emit([...this._lazyColumnStatus.keys()]);\n this._runLazyLoader();\n this._scheduleRender();\n }\n\n /** Colonnes lazy dont la valeur est nécessaire : affichées, utilisées en Group by ou en Slice by dynamique. */\n private _usedLazyColumns(): TableColumnProvider<T>[] {\n const used = new Map<string, TableColumnProvider<T>>();\n const add = (column?: TableColumnProvider<T>) => { if (column?.lazy) used.set(column.key, column); };\n this.activeFields.forEach(add);\n this._organizer.sliceBy.activeDynamicFields.forEach(add);\n const groupKey = this.activeGroupByKey;\n if (groupKey) add(this._columnMap.get(groupKey));\n return [...used.values()];\n }\n\n /**\n * Quel que soit le chemin d'activation (Organizer, Group by, Slice by, préférences...), les colonnes lazy utilisées et pas encore\n * demandées sont réclamées en un seul événement. Hors cycle de détection, et seulement une fois des lignes affichées :\n * la première réponse de l'application ne doit pas être prise pour celle qui contient les colonnes.\n */\n private _requestLazyColumns(): void {\n if (this._lazyFlushQueued) return;\n this._lazyFlushQueued = true;\n queueMicrotask(() => {\n this._lazyFlushQueued = false;\n if (this._destroyed || !this._resolvedData.length) return;\n const idle = this._usedLazyColumns().filter(c => !this._lazyColumnStatus.has(c.key));\n if (!idle.length) return;\n this._warnIfNoLazySource(idle);\n this._setLazyStatus(idle.map(c => c.key), 'loading');\n this.lazyColumnsRequested.emit([...this._lazyColumnStatus.keys()]);\n this._runLazyLoader();\n this._scheduleRender();\n this._cdr.markForCheck();\n });\n }\n\n /** Appelle `config.lazyLoader` avec toutes les colonnes lazy demandées ; sa réponse remplace `data`. */\n private _runLazyLoader(): void {\n const loader = this.resolvedConfig.lazyLoader;\n if (!loader) return;\n this._loaderSub?.unsubscribe();\n const columns = [...this._lazyColumnStatus.keys()];\n this._loaderSub = defer(() => loader(columns)).pipe(take(1), takeUntil(this._destroy$)).subscribe({\n next: rows => {\n this._loaderRows = rows;\n this._settleLazyColumns();\n this.refreshViewModel();\n this._cdr.markForCheck();\n },\n error: () => {\n const loading = [...this._lazyColumnStatus].filter(([, status]) => status === 'loading').map(([key]) => key);\n this._setLazyStatus(loading, 'error');\n this._scheduleRender();\n this._cdr.markForCheck();\n },\n });\n }\n\n /** Nouveau `data` : il l'emporte sur les lignes du chargeur. Avec un chargeur, les colonnes déjà demandées sont rechargées. */\n private _onNewData(): void {\n this._loaderSub?.unsubscribe();\n this._loaderRows = null;\n if (this.config?.lazyLoader && this._lazyColumnStatus.size) {\n this._setLazyStatus([...this._lazyColumnStatus.keys()], 'loading');\n } else {\n this._settleLazyColumns();\n }\n }\n\n /** Sans chargeur ni écouteur, la colonne demandée resterait en skeleton sans que rien ne l'explique. */\n private _warnIfNoLazySource(columns: TableColumnProvider<T>[]): void {\n if (this._lazyWarned || this.resolvedConfig.lazyLoader || this.lazyColumnsRequested.observed || !isDevMode()) return;\n this._lazyWarned = true;\n console.warn(\n `[jquery-table] Colonne lazy activée (${columns.map(c => c.key).join(', ')}) mais ni config.lazyLoader ni (lazyColumnsRequested) ne sont définis : `\n + 'aucune requête n\\'est lancée et le skeleton restera affiché.',\n );\n }\n\n /** De nouvelles `data` sont arrivées : toutes les colonnes demandées sont considérées comme prêtes. */\n private _settleLazyColumns(): void {\n const waiting = [...this._lazyColumnStatus].filter(([, status]) => status !== 'loaded').map(([key]) => key);\n if (waiting.length) this._setLazyStatus(waiting, 'loaded');\n }\n\n private _applyLazyError(): void {\n const from = this.lazyError ? 'loading' : 'error';\n const keys = [...this._lazyColumnStatus].filter(([, status]) => status === from).map(([key]) => key);\n if (keys.length) this._setLazyStatus(keys, this.lazyError ? 'error' : 'loading');\n }\n\n private _setLazyStatus(keys: string[], status: 'loading' | 'loaded' | 'error'): void {\n const next = new Map(this._lazyColumnStatus);\n keys.forEach(key => next.set(key, status));\n this._lazyColumnStatus = next;\n }\n\n toggleGroupCollapse(groupKey: string): void {\n this._groupBy.toggleGroupCollapse(groupKey, (key) => {\n this._ngZone.runOutsideAngular(() => this._scheduleDeferred(() => this.scrollToGroupHeader(key)));\n });\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 = Number.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._groupBy.isGroupCollapsed(groupKey);\n }\n\n groupPageBack(groupKey: string): void {\n this._groupBy.groupPageBack(groupKey);\n }\n\n groupPageForward(groupKey: string, totalCount: number): void {\n this._groupBy.groupPageForward(groupKey, totalCount);\n }\n\n get hasAddableColumns(): boolean {\n return this._organizer.menuBaseFields.length > 0 || this._organizer.menuOptionalFields.length > 0;\n }\n\n get menuBaseColumns(): TableColumnProvider<T>[] {\n return this._organizer.menuBaseFields;\n }\n\n get menuOptionalColumns(): TableColumnProvider<T>[] {\n return this._organizer.menuOptionalFields;\n }\n\n get availableColumnsToAdd(): TableColumnProvider<T>[] {\n const activeKeys = new Set(this.activeFields.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._organizer.allowFieldRemoval;\n }\n\n get hasSliceConfig(): boolean {\n return (this.resolvedConfig.slices?.length ?? 0) > 0;\n }\n\n get showSlicePanel(): boolean {\n return this._showSlicePanel;\n }\n\n onSlicePanelCollapsedChange(collapsed: boolean): void {\n this._slicePanelCollapsed = collapsed;\n this._cdr.markForCheck();\n }\n\n private _recomputeShowSlicePanel(): void {\n const hasPendingDynamicSlices = (this._pendingDynamicSliceKeys?.length ?? 0) > 0;\n const hasCfg = this._sliceConfigs.length > 0\n || this._organizer.sliceBy.activeDynamicFields.length > 0\n || hasPendingDynamicSlices;\n const wasVisible = this._showSlicePanel;\n this._showSlicePanel = hasCfg && this._resolvedData.length > 0;\n // Les données viennent d'arriver : appliquer les dynamic slices et les filtres en attente.\n // Les slices dynamiques sont ajoutées avant les filtres pour rendre leurs clés disponibles.\n if (!wasVisible && this._showSlicePanel && (this._pendingSliceFilters || this._pendingDynamicSliceKeys)) {\n const filters = this._pendingSliceFilters;\n const dynamicKeys = this._pendingDynamicSliceKeys;\n this._pendingSliceFilters = null;\n this._pendingDynamicSliceKeys = null;\n const allCols = this.resolvedConfig.columns ?? [];\n this._scheduleDeferred(() => {\n if (dynamicKeys) {\n dynamicKeys.forEach(key => {\n const col = allCols.find(c => c.key === key);\n if (col) this.addDynamicSlice(col);\n });\n }\n if (filters && this.slicePanelRef) {\n this.slicePanelRef.restoreFilters(filters);\n }\n this._cdr.markForCheck();\n });\n }\n }\n\n get showAddSliceButton(): boolean {\n return this._organizer.showSliceBySection;\n }\n\n get staticSlicesForMenu(): Array<{ key: string; title: string; icon?: string }> {\n return this._organizer.staticSlicesForMenu;\n }\n\n get availableColumnsForDynamicSlice(): TableColumnProvider<T>[] {\n return this._organizer.sliceBy.availableForDynamic;\n }\n\n isStaticSliceVisible(columnKey: string): boolean {\n return !this._staticSliceHiddenKeys.has(columnKey);\n }\n\n toggleStaticSlice(columnKey: string): void {\n const next = new Set(this._staticSliceHiddenKeys);\n if (next.has(columnKey)) next.delete(columnKey);\n else next.add(columnKey);\n this._staticSliceHiddenKeys = next;\n this._organizer.updateHiddenStaticKeys(this._staticSliceHiddenKeys);\n // Le panneau retire la sélection du slice masqué et réémet le filtre des autres.\n this._setSliceConfigs(this._computeSliceConfigs());\n this._recomputeShowSlicePanel();\n this._scheduleRender();\n this._cdr.markForCheck();\n }\n\n addDynamicSlice(column: TableColumnProvider<T>): void {\n this.slicePanelRef?.addDynamicSlice(column);\n }\n\n get allDynamicSliceColumns(): TableColumnProvider<T>[] {\n return this._allDynamicSliceColumns;\n }\n\n isDynamicSliceActive(key: string): boolean {\n return this._organizer.isDynamicSliceActive(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 this._organizer.onDynamicSliceKeysChange(keys);\n this._recomputeShowSlicePanel();\n this._requestLazyColumns();\n this._cdr.markForCheck();\n }\n\n get emptyStateLabel(): string {\n return this.resolvedConfig.labels?.empty || this.i18n.emptyState;\n }\n\n get loadingStateLabel(): string {\n return this.resolvedConfig.labels?.loading || this.i18n.loadingState;\n }\n\n get effectiveIsLoading(): boolean {\n return this.isLoading;\n }\n\n get isEmpty(): boolean {\n // _pendingRender : le rendu interne n'est pas encore terminé → pas de message vide prématuré\n return !this.isLoading && this._pendingRender === null && 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 resolvedPaginationShowFirstLastButtons(): boolean {\n return this.resolvedConfig.pagination?.showFirstLastButtons !== false;\n }\n\n get isColumnDragDropEnabled(): boolean {\n return this._organizer.isFieldDragDropEnabled;\n }\n\n get totalRows(): number {\n return this.activeGroupByKey\n ? this.tableDataSource.data.filter((r) => !r[GROUP_HEADER_MARKER]).length\n : this._allFilteredRows.length;\n }\n\n // ── Gestion des colonnes\n\n onAddColumn(column: TableColumnProvider<T>): void {\n this._organizer.addField(column);\n this._preservePageIndex = this.paginator?.pageIndex ?? null;\n this.refreshViewModel();\n\n this.addRequested.emit();\n this.columnAdded.emit(column);\n }\n\n onColumnVisibilityChange(column: TableColumnProvider<T>, checked: boolean): void {\n const isVisible = this._organizer.isFieldVisible(column.key);\n\n if (checked && !isVisible) {\n this.onAddColumn(column);\n return;\n }\n\n if (!checked && isVisible) {\n const removed = this._organizer.removeField(column.key);\n if (!removed) return;\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.activeFields.some(c => c.key === columnKey);\n }\n\n onRemoveColumn(columnKey: string, event?: Event): void {\n event?.stopPropagation();\n const column = this.activeFields.find(item => item.key === columnKey);\n if (!column) return;\n const removed = this._organizer.removeField(columnKey);\n if (!removed) return;\n this.refreshViewModel();\n this.columnRemoved.emit(column);\n }\n\n // ── Lignes\n\n private _rebuildCellDefMap(): void {\n this._cellDefMap = new Map(\n (this._cellDefs ?? []).map(d => [d.columnKey, d.template] as [string, TemplateRef<{ $implicit: any; index: number; value: any }>])\n );\n }\n\n getCellTemplate(key: string): TemplateRef<{ $implicit: any; index: number; value: any }> | null {\n return this._cellDefMap.get(key) ?? null;\n }\n\n get hasCustomCellDefs(): boolean {\n return this._cellDefMap.size > 0;\n }\n\n get hasRowClickHandler(): boolean {\n return this.rowSelected.observed || !!this.resolvedConfig.onRowSelected;\n }\n\n rowActionLabel(row: any): string {\n return `Sélectionner la ligne ${(row?.[ROW_INDEX_KEY] ?? 0) + 1}`;\n }\n\n /** Largeur minimale du tableau en px, calculée depuis les largeurs explicites des colonnes actives.\n * Retourne null si aucune colonne n'a de largeur définie (le tableau remplit alors 100% du conteneur).\n * Seules les valeurs explicitement en `px` sont sommables ; les pourcentages ou autres unités sont ignorés. */\n get tableMinWidth(): string | null {\n const hasResized = Object.keys(this._columnWidths).length > 0;\n const hasSomeExplicitWidth = hasResized || this.activeFields.some(c => c.width);\n if (!hasSomeExplicitWidth) return null;\n let sum = 0;\n for (const col of this.activeFields) {\n if (this._columnWidths[col.key] != null) {\n sum += this._columnWidths[col.key];\n } else if (col.width) {\n const isPx = col.width.trim().toLowerCase().endsWith('px');\n const px = Number.parseFloat(col.width);\n if (isPx && !Number.isNaN(px)) { sum += px; }\n } else {\n sum += 120; // largeur minimale estimée pour une colonne sans largeur explicite\n }\n }\n return sum + 'px';\n }\n\n trackRowFn = (_index: number, row: any): any => {\n if (row[GROUP_HEADER_MARKER]) return `__group_${row[ROW_GROUP_KEY]}`;\n if (row[ROW_GROUP_KEY] !== undefined) return `__row_${row[ROW_GROUP_KEY]}_${row[ROW_INDEX_KEY] ?? _index}`;\n return row[ROW_INDEX_KEY] ?? _index;\n };\n\n getRowClass(row: any): string | string[] | Record<string, boolean> {\n const fn = this.resolvedConfig.rowClass;\n if (!fn || row?.[GROUP_HEADER_MARKER]) return {};\n return fn(row[ROW_RAW_KEY] ?? row, row[ROW_INDEX_KEY] ?? 0);\n }\n\n onRowClick(row: any, event: MouseEvent | null): void {\n if (row?.[GROUP_HEADER_MARKER]) return;\n if (!this.hasRowClickHandler) return;\n const resolved = (row?.[ROW_RAW_KEY] ?? row) as T;\n this.resolvedConfig.onRowSelected?.(resolved, event);\n this.rowSelected.emit(resolved);\n }\n\n // ── Drag & drop\n\n onHeaderDragStart(columnKey: string, event: DragEvent): void {\n if (!this.isColumnDragDropEnabled && !this._editMode) {\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 onHeaderKeyDown(columnKey: string, event: KeyboardEvent): void {\n if ((!this.isColumnDragDropEnabled && !this._editMode)\n || (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight')) return;\n\n const currentIndex = this.activeFields.findIndex(column => column.key === columnKey);\n const targetIndex = event.key === 'ArrowLeft' ? currentIndex - 1 : currentIndex + 1;\n if (currentIndex < 0 || targetIndex < 0 || targetIndex >= this.activeFields.length) return;\n\n event.preventDefault();\n const reordered = [...this.activeFields];\n [reordered[currentIndex], reordered[targetIndex]] = [reordered[targetIndex], reordered[currentIndex]];\n this._organizer.setActiveFields(reordered);\n this.refreshViewModel();\n }\n\n onHeaderDragOver(columnKey: string, event: DragEvent): void {\n if ((!this.isColumnDragDropEnabled && !this._editMode) || !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._editMode) || !this.draggedColumnKey) {\n return;\n }\n\n event.preventDefault();\n\n const moved = this._organizer.reorderFields(this.draggedColumnKey, targetColumnKey);\n if (!moved) {\n this.onHeaderDragEnd();\n return;\n }\n\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 // ── Préférences : mode édition\n\n enterEditMode(): void {\n this._editMode = true;\n this._preferencesMessage = null;\n this._cdr.markForCheck();\n }\n\n confirmEditMode(): void {\n this._editMode = false;\n this._cdr.markForCheck();\n }\n\n /** Démarre le resize d'une colonne (mousedown sur la poignée droite). */\n onResizeStart(columnKey: string, event: MouseEvent): void {\n if (!this._editMode) return;\n event.preventDefault();\n event.stopPropagation();\n\n const th = (event.target as HTMLElement).closest('th') as HTMLElement | null;\n if (!th) return;\n\n const scrollEl = this.tableBodyScrollRef?.nativeElement;\n if (scrollEl) {\n const allTh = scrollEl.querySelectorAll<HTMLElement>('th.mat-mdc-header-cell');\n allTh.forEach(thEl => {\n const colClass = Array.from(thEl.classList).find(c => c.startsWith('mat-column-'));\n const colKey = colClass ? colClass.replace('mat-column-', '') : null;\n if (colKey && this._columnWidths[colKey] == null) {\n this._columnWidths = { ...this._columnWidths, [colKey]: thEl.offsetWidth };\n }\n });\n }\n\n this._resizeState = { key: columnKey, startX: event.clientX, startWidth: th.offsetWidth };\n\n const onMove = (e: MouseEvent) => {\n if (!this._resizeState) {\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n return;\n }\n const delta = e.clientX - this._resizeState.startX;\n const newWidth = Math.max(60, this._resizeState.startWidth + delta);\n this._columnWidths = { ...this._columnWidths, [this._resizeState.key]: newWidth };\n // detectChanges() pour forcer la mise à jour immédiate en mode OnPush\n // (les listeners window tournent hors zone Angular avec runOutsideAngular)\n this._cdr.detectChanges();\n };\n\n const onUp = () => {\n this._resizeState = null;\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n };\n\n // Listeners hors zone Angular pour éviter des cycles CD à chaque mousemove\n this._ngZone.runOutsideAngular(() => {\n window.addEventListener('mousemove', onMove);\n window.addEventListener('mouseup', onUp);\n });\n }\n\n /** Retourne la largeur CSS d'une colonne (px si personnalisée, sinon la valeur de config ou auto). */\n getColumnWidth(key: string): string {\n if (this._columnWidths[key] != null) return this._columnWidths[key] + 'px';\n const col = this._columnMap.get(key);\n return col?.width ?? 'auto';\n }\n\n // ── Préférences : save / clear\n\n savePreferences(): void {\n if (!this._preferencesManager) return;\n const dynamicSliceKeys = this._organizer.sliceBy.activeDynamicFields.map(c => c.key);\n const config: import('../jquery-table.model').SavedTableConfig = {\n search: this.searchQuery || undefined,\n groupBy: this.activeGroupByKey,\n columnOrder: this.activeFields.map(c => c.key),\n visibleColumns: this.activeFields.map(c => c.key),\n columnWidths: Object.keys(this._columnWidths).length ? { ...this._columnWidths } : undefined,\n slicePanelCollapsed: this._slicePanelCollapsed,\n hiddenSliceKeys: [...this._staticSliceHiddenKeys],\n dynamicSliceKeys: dynamicSliceKeys.length ? dynamicSliceKeys : undefined,\n sliceFilters: this.slicePanelRef ? this.slicePanelRef.getActiveFilters() : undefined,\n };\n this._preferencesManager.save(config);\n this._hasSavedConfig = true;\n this._showPreferencesMessage(this.i18n.preferencesSavedMessage);\n }\n\n clearPreferences(): void {\n if (!this._preferencesManager) return;\n this._preferencesManager.clear();\n this._hasSavedConfig = false;\n\n // Capturer les dynamic slices actives AVANT le reset (resetToDefaults() les vide)\n const dynamicSlicesToRemove = this._organizer.sliceBy.activeDynamicFields.slice();\n\n // Reset complet de l'état vers les valeurs par défaut de la config\n this.searchQuery = '';\n this._columnWidths = {};\n this._slicePanelCollapsed = false;\n // Synchroniser l'état interne du slice-panel : si le composant est en état collapsed\n // (l'utilisateur l'avait fermé après la sauvegarde), le rouvrir explicitement pour\n // éviter que display:none soit retiré mais que isCollapsed interne reste à true.\n if (this.slicePanelRef?.isCollapsed) {\n this.slicePanelRef.togglePanel();\n }\n this._groupBy.reset();\n this._groupBy.setDefaultCollapsed(false);\n\n // Slices statiques : revenir aux seules celles cachées par la config (pas par l'utilisateur)\n this._staticSliceHiddenKeys = new Set(this._configHiddenKeys);\n this._organizer.updateHiddenStaticKeys(this._staticSliceHiddenKeys);\n\n // Colonnes et groupBy : reset via la facade (retire les optionnelles, remet l'ordre config)\n this._organizer.resetToDefaults();\n this._defaultGroupByApplied = false;\n\n // Dynamic slices : les retirer du slice panel avec la liste capturée avant le reset\n dynamicSlicesToRemove.forEach(col => {\n this.slicePanelRef?.removeDynamicSliceByKey(col.key);\n });\n\n // Filtre de slice actif\n this.activeSliceFilter = () => true;\n if (this.slicePanelRef) this.slicePanelRef.restoreFilters({});\n\n // Rafraîchit toute la vue\n this.activeFields = this._organizer.fields.activeFields;\n this.renderedColumns = this.activeFields.map(c => c.key);\n this._pendingDynamicSliceKeys = null;\n this._pendingSliceFilters = null;\n this.refreshViewModel();\n\n this._showPreferencesMessage(this.i18n.preferencesClearedMessage);\n }\n\n private _preferencesMessageTimer: ReturnType<typeof setTimeout> | null = null;\n\n private _showPreferencesMessage(msg: string): void {\n if (this._preferencesMessageTimer !== null) clearTimeout(this._preferencesMessageTimer);\n this._preferencesMessage = msg;\n this._cdr.markForCheck();\n this._preferencesMessageTimer = setTimeout(() => {\n this._preferencesMessageTimer = null;\n this._preferencesMessage = null;\n this._cdr.markForCheck();\n }, 4000);\n }\n\n private _applyPreferences(saved: import('../jquery-table.model').SavedTableConfig | null): void {\n if (!saved) return;\n // Recherche\n if (saved.search) this.searchQuery = saved.search;\n // Largeurs colonnes\n if (saved.columnWidths) this._columnWidths = { ...saved.columnWidths };\n // Group by\n if (saved.groupBy !== undefined) {\n this.setGroupByAndEmit(saved.groupBy);\n if (saved.groupBy) {\n this._groupBy.setDefaultCollapsed(true);\n this._groupBy.reset();\n }\n }\n // État panneau slice\n if (saved.slicePanelCollapsed !== undefined) this._slicePanelCollapsed = saved.slicePanelCollapsed;\n // Slices statiques cachées — on utilise la valeur exacte sauvegardée (pas les defaults de config)\n if (saved.hiddenSliceKeys !== undefined) {\n this._staticSliceHiddenKeys = new Set(saved.hiddenSliceKeys);\n this._organizer.updateHiddenStaticKeys(this._staticSliceHiddenKeys);\n }\n // Colonnes visibles + ordre — reconstruit activeFields en une seule passe.\n // On part de saved.columnOrder (ordre sauvegardé) si disponible, sinon saved.visibleColumns.\n // Cela gère à la fois : colonnes optionnelles ajoutées, colonnes retirées, et réordonnancement.\n const targetKeys = saved.columnOrder ?? saved.visibleColumns;\n if (targetKeys?.length) {\n const allByKey = new Map((this.resolvedConfig.columns ?? []).map(c => [c.key, c]));\n // Colonnes dans l'ordre sauvegardé (on ne garde que celles connues de la config)\n const ordered = targetKeys\n .map(key => allByKey.get(key))\n .filter((c): c is TableColumnProvider<T> => c !== undefined);\n // Colonnes actives actuelllement non présentes dans targetKeys (non-optional passées sous silence)\n // → on les exclut : l'utilisateur avait explicitement choisi ce sous-ensemble\n if (ordered.length > 0) {\n this._organizer.setActiveFields(ordered);\n }\n }\n // Filtres actifs du slice panel\n // Filtres actifs du slice panel — toujours stockés en pending :\n // appliqués par _applyPendingDynamicSliceKeys (si dynamic slices) ou\n // par _recomputeShowSlicePanel (quand les données arrivent et rendent le panel visible)\n if (saved.sliceFilters && Object.keys(saved.sliceFilters).length) {\n this._pendingSliceFilters = saved.sliceFilters;\n }\n\n const activeFilterColumnKeys = Object.entries(saved.sliceFilters ?? {})\n .filter(([key, values]) => key.startsWith('column:') && values.length > 0)\n .map(([key]) => key.slice('column:'.length));\n const staticSliceKeys = new Set(\n (this.resolvedConfig.slices ?? [])\n .map(slice => slice.columnKey)\n .filter((key): key is string => !!key)\n );\n const dynamicSliceKeys = new Set(this._organizer.sliceBy.allDynamicFields.map(field => field.key));\n\n // Un filtre persistant doit toujours retrouver sa slice : une préférence\n // ancienne ou incomplète ne peut pas laisser un filtre sans panneau visible.\n activeFilterColumnKeys\n .filter(key => staticSliceKeys.has(key))\n .forEach(key => this._staticSliceHiddenKeys.delete(key));\n this._organizer.updateHiddenStaticKeys(this._staticSliceHiddenKeys);\n\n // Une clé de filtre sur une colonne non statique désigne une slice dynamique.\n // Elle complète dynamicSliceKeys pour les configurations sauvegardées avant\n // que ce champ ne soit persistant.\n const persistedDynamicKeys = [\n ...(saved.dynamicSliceKeys ?? []),\n ...activeFilterColumnKeys,\n ];\n const uniqueDynamicKeys = [...new Set(persistedDynamicKeys)].filter(\n key => !staticSliceKeys.has(key) && dynamicSliceKeys.has(key)\n );\n if (uniqueDynamicKeys.length) {\n this._pendingDynamicSliceKeys = uniqueDynamicKeys;\n }\n }\n\n canRemoveColumn(column: TableColumnProvider<T>): boolean {\n return (\n this._organizer.allowFieldRemoval &&\n column.removable !== false &&\n this.activeFields.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 // ── Export CSV\n\n onExport(): void {\n this._export.export();\n }\n\n /** Capture les lignes et l'état actuellement visibles dans un snapshot autonome. */\n createVisualSnapshot(label = this.title || 'Tableau'): VisualSnapshotDraft {\n const warnings: string[] = [];\n if (containsFunction(this.resolvedConfig)) {\n warnings.push('Certaines fonctions de configuration ne sont pas transportables.');\n }\n return {\n type: 'table',\n label,\n config: cloneSerializable({\n title: this.title,\n columns: this.resolvedConfig.columns?.map(column => serializableColumn(column)),\n search: this.resolvedConfig.search,\n pagination: this.resolvedConfig.pagination,\n }),\n state: cloneSerializable({\n search: this.searchQuery,\n groupBy: this.activeGroupByKey,\n columnOrder: this.activeFields.map(column => column.key),\n visibleColumns: this.activeFields.map(column => column.key),\n pageIndex: this.paginator?.pageIndex ?? 0,\n pageSize: this.paginator?.pageSize ?? this.pageSize,\n }),\n data: cloneSerializable(this._allFilteredRows),\n warnings,\n };\n }\n\n /** Applique l'état compatible et retourne les données à fournir au composant cible. */\n applyVisualSnapshot(snapshot: VisualSnapshot): VisualSnapshotApplyResult {\n if (snapshot.type !== 'table') {\n return { applied: false, restored: [], skipped: ['type'], warnings: ['Le snapshot n\\'est pas un tableau.'] };\n }\n\n const state = snapshot.state as {\n search?: string;\n groupBy?: string | null;\n visibleColumns?: string[];\n columnOrder?: string[];\n columnWidths?: Record<string, number>;\n };\n const available = new Map((this.resolvedConfig.columns ?? []).map(column => [column.key, column]));\n const requestedKeys = state.columnOrder ?? state.visibleColumns ?? [];\n const compatibleKeys = requestedKeys.filter(key => available.has(key));\n const skipped = requestedKeys.filter(key => !available.has(key));\n const restored: string[] = [];\n\n if (compatibleKeys.length) {\n this._organizer.setActiveFields(compatibleKeys.map(key => available.get(key)!));\n restored.push('columns');\n this.refreshViewModel();\n }\n if (typeof state.search === 'string') {\n this.searchQuery = state.search;\n restored.push('search');\n }\n if (state.groupBy === null || typeof state.groupBy === 'string') {\n const groupKey = state.groupBy && available.has(state.groupBy) ? state.groupBy : null;\n this.setGroupByAndEmit(groupKey);\n restored.push('groupBy');\n }\n if (state.columnWidths) {\n this._columnWidths = { ...state.columnWidths };\n restored.push('columnWidths');\n }\n this.refreshViewModel();\n return {\n applied: true,\n restored,\n skipped,\n warnings: snapshot.warnings ?? [],\n data: cloneSerializable(snapshot.data),\n };\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\n if (!this._initialSlicePanelCollapsedApplied) {\n this._slicePanelCollapsed = this.resolvedConfig.slicePanelCollapsed === true;\n this._initialSlicePanelCollapsedApplied = true;\n }\n\n // ── Initialiser le gestionnaire de préférences si l'option est activée\n const prefsId = this.resolvedConfig.preferences?.enabled\n ? this.resolvedConfig.preferences.tableId\n : null;\n const currentId = prefsId ?? null;\n // Préférences à appliquer après _organizer.update() (quand activeFields est déjà peuplé)\n let pendingPrefs: import('../jquery-table.model').SavedTableConfig | null = null;\n if (currentId && this._preferencesManager?.key !== ('jqt_prefs_' + currentId)) {\n this._preferencesManager = new TablePreferencesManager(currentId);\n this._hasSavedConfig = this._preferencesManager.hasSaved();\n pendingPrefs = this._preferencesManager.load();\n } else if (!currentId) {\n this._preferencesManager = null;\n this._hasSavedConfig = false;\n }\n\n // Délègue à la facade : mise à jour de l'état View (colonnes, groupBy meta, sliceBy meta)\n this._organizer.update({\n config: this._organizerViewConfig(),\n fields: this.resolvedConfig.columns ?? [],\n sliceConfigs: this.resolvedConfig.slices ?? [],\n defaultGroupBy: this.resolvedConfig.defaultGroupBy,\n });\n\n if (!pendingPrefs && !this._defaultGroupByApplied && !this._organizer.groupBy.userCustomized && this._organizer.groupBy.activeKey != null) {\n this._defaultGroupByApplied = true;\n this._groupBy.setDefaultCollapsed(true);\n this._groupBy.reset();\n this._groupBy.groupPageSize = this.resolveDefaultGroupPageSize();\n this.groupByChange.emit(this._organizer.groupBy.activeKey);\n }\n\n // Synchronise la propriété stable (évite NG0100 — la facade est source de vérité)\n this.activeFields = this._organizer.fields.activeFields;\n\n this.renderedColumns = this.activeFields.map(c => c.key);\n this.emitColumnsChangeIfNeeded();\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 // Réinitialise _staticSliceHiddenKeys seulement si les clés hidden de la config ont vraiment changé\n // ET qu'il n'y a pas de préférences sauvegardées (qui géreront hiddenSliceKeys elles-mêmes).\n const newConfigHidden = new Set<string>(\n (this.resolvedConfig.slices ?? []).filter(s => s.hidden && s.columnKey).map(s => s.columnKey!)\n );\n if (!TableComponent._setsEqual(newConfigHidden, this._configHiddenKeys)) {\n this._configHiddenKeys = newConfigHidden;\n // N'écraser _staticSliceHiddenKeys que si on n'est PAS en train d'appliquer des prefs\n // (pendingPrefs les gèrera lui-même via _applyPreferences → hiddenSliceKeys)\n if (!pendingPrefs) {\n this._staticSliceHiddenKeys = new Set(newConfigHidden);\n this._organizer.updateHiddenStaticKeys(this._staticSliceHiddenKeys);\n }\n }\n\n // Applique les préférences ICI, APRÈS _organizer.update() ET après _configHiddenKeys mis à jour,\n // mais avant _computeSliceConfigs() pour que hiddenSliceKeys soit déjà restauré.\n if (pendingPrefs) {\n this._applyPreferences(pendingPrefs);\n this.activeFields = this._organizer.fields.activeFields;\n this.renderedColumns = this.activeFields.map(c => c.key);\n this.emitColumnsChangeIfNeeded();\n }\n\n // Propriétés stables pour les bindings du template\n // On recalcule _sliceConfigs en reflétant l'état courant des slices cachées,\n // pour que SlicePanelComponent.ngOnInit reçoive la bonne valeur de `hidden`\n // même quand le composant est créé pour la 1ère fois après un toggle.\n this._setSliceConfigs(this._computeSliceConfigs());\n this._sliceColumns = this.resolvedConfig.columns ?? [];\n this._sliceData = this._resolvedData;\n this._sliceShowToggle = this.resolvedConfig.enableSliceToggle !== false;\n this._recomputeShowSlicePanel();\n if (!this._activeSort.active && this.resolvedConfig.defaultSort) {\n this._matSortActive = this.resolvedConfig.defaultSort.active;\n this._matSortDirection = this.resolvedConfig.defaultSort.direction;\n }\n this._buildSliceByMenuItems();\n\n this._requestLazyColumns();\n this._scheduleRender();\n }\n\n /** Retourne uniquement les slices visibles (non cachées par _staticSliceHiddenKeys).\n * Le SlicePanelComponent affiche tout ce qu'il reçoit — c'est ici que se fait le filtrage. */\n private _computeSliceConfigs(): SliceConfig<T>[] {\n return (this.resolvedConfig.slices ?? []).filter(\n s => !s.columnKey || !this._staticSliceHiddenKeys.has(s.columnKey)\n );\n }\n\n private static _setsEqual(a: Set<string>, b: Set<string>): boolean {\n if (a.size !== b.size) return false;\n for (const v of a) if (!b.has(v)) return false;\n return true;\n }\n\n private _buildSliceByMenuItems(): void {\n const staticSliceMap = new Map(this._staticSlicesForMenu.map(s => [s.key, s]));\n const dynamicSliceSet = new Set(this._allDynamicSliceColumns.map(c => c.key));\n const seen = new Set<string>();\n const items: Array<{ isStatic: boolean; key: string; title: string; icon?: string; col?: TableColumnProvider<T> }> = [];\n for (const col of this.resolvedConfig.columns ?? []) {\n if (seen.has(col.key)) continue;\n if (staticSliceMap.has(col.key)) {\n const s = staticSliceMap.get(col.key)!;\n items.push({ isStatic: true, key: s.key, title: s.title, icon: s.icon });\n seen.add(col.key);\n } else if (dynamicSliceSet.has(col.key)) {\n items.push({ isStatic: false, key: col.key, title: this.colLabel(col), icon: col.icon, col });\n seen.add(col.key);\n }\n }\n for (const s of this._staticSlicesForMenu) {\n if (!seen.has(s.key)) {\n items.push({ isStatic: true, key: s.key, title: s.title, icon: s.icon });\n }\n }\n this._sliceByMenuItems = items;\n this._invalidateOrganizerConfig(); // les slices ont changé\n }\n\n get sliceByMenuItems() { return this._sliceByMenuItems; }\n\n onSliceMenuItemClick(item: { isStatic: boolean; key: string; col?: TableColumnProvider<T> }): void {\n if (item.isStatic) {\n this.toggleStaticSlice(item.key);\n } else if (item.col) {\n this.toggleDynamicSlice(item.col);\n }\n }\n\n isSliceMenuItemActive(item: { isStatic: boolean; key: string }): boolean {\n return item.isStatic ? this.isStaticSliceVisible(item.key) : this.isDynamicSliceActive(item.key);\n }\n\n private _scheduleRender(): void {\n if (this._pendingRender !== null) {\n clearTimeout(this._pendingRender);\n this._pendingRender = null;\n }\n this._ngZone.runOutsideAngular(() => {\n this._pendingRender = setTimeout(() => {\n this._pendingRender = null;\n this._ngZone.run(() => this._executeRender());\n }, 0);\n });\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(categoryRows);\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 // detectChanges() au lieu de markForCheck() : met à jour uniquement CE composant\n // sans déclencher un cycle CD global qui provoquerait NG0100 dans les parents.\n this._cdr.detectChanges();\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 = { [ROW_RAW_KEY]: row, [ROW_INDEX_KEY]: idx };\n this.activeFields.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 = this._normalizeColumns(\n config.columns ||\n this.columnsConfig ||\n this.resolveColumnsFromCompat(rows),\n );\n\n // Mode HTML : [view] prend le dessus sur config.view si fourni (Phase 3).\n const view = this.view ?? config.view;\n\n const autoTableId = config.preferences?.tableId || TableComponent._hashColumns((columns || []).map(c => c.key));\n const exportConfig: TableExportConfig<T> = {\n enabled: true,\n filename: autoTableId,\n ...config.export,\n };\n\n const prefsConfig: TablePreferencesConfig = {\n enabled: true,\n tableId: autoTableId,\n ...config.preferences,\n };\n\n return {\n ...config,\n columns,\n view,\n slices: config.slices || [],\n enableSliceToggle: config.enableSliceToggle ?? true,\n export: exportConfig,\n preferences: prefsConfig,\n };\n }\n\n /** Une colonne lazy est forcément optionnelle : `optional` est implicite, et `optional: false` est refusé. */\n private _normalizeColumns(columns: TableColumnProvider<T>[]): TableColumnProvider<T>[] {\n if (columns === this._columnsSource) return this._columnsNormalized!;\n const normalized = columns.map(column => this._withImpliedOptional(column));\n const result = normalized.some((column, index) => column !== columns[index]) ? normalized : columns;\n this._columnsSource = columns;\n this._columnsNormalized = result;\n return result;\n }\n\n private _withImpliedOptional(column: TableColumnProvider<T>): TableColumnProvider<T> {\n if (!column.lazy || column.optional) return column;\n if ((column as { optional?: boolean }).optional === false) {\n throw new Error(\n `[jquery-table] La colonne '${column.key}' est lazy : elle est forcément optionnelle (optional: true est implicite). `\n + 'optional: false la ferait demander dès le premier rendu, soit une requête de plus pour rien. '\n + 'Retirez optional: false, ou lazy: true si la colonne doit toujours être affichée.',\n );\n }\n let implied = this._optionalLazyColumns.get(column);\n if (!implied) {\n implied = { ...column, optional: true };\n this._optionalLazyColumns.set(column, implied);\n }\n return implied;\n }\n\n private applyConfigSearchReset(): void {\n const clearToken = this.resolvedConfig.clearSearchInput;\n const shouldClear = !!clearToken && clearToken !== this._lastConfigClearSearchInput;\n\n this._lastConfigClearSearchInput = clearToken;\n\n if (!shouldClear) {\n return;\n }\n\n this.searchQuery = '';\n this.onSearchChange();\n }\n\n private applyInitialSearchQuery(isFirstConfigChange = false): void {\n const initialQuery = this.resolvedConfig.search?.initialQuery;\n if (initialQuery === this._lastInitialSearchQuery\n && (this._initialSearchQueryApplied || !isFirstConfigChange)) {\n return;\n }\n\n this._lastInitialSearchQuery = initialQuery;\n this._initialSearchQueryApplied = true;\n const next = initialQuery ?? '';\n const changed = this.searchQuery !== next;\n this.searchQuery = next;\n if (changed) this.onSearchChange();\n else this._runSearch();\n }\n\n private static _hashColumns(keys: string[]): string {\n const str = keys.join('|');\n let h = 0x811c9dc5;\n for (let i = 0; i < str.length; i++) {\n h ^= str.charCodeAt(i);\n h = Math.imul(h, 0x01000193) >>> 0;\n }\n return h.toString(16).padStart(8, '0');\n }\n\n private resolveData(): T[] {\n if (this._loaderRows) {\n return this._loaderRows;\n }\n\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 const restrictedKeys = this.resolvedConfig.search?.searchColumns;\n const searchCols = restrictedKeys?.length\n ? [...this._columnMap.values()].filter(col => restrictedKeys.includes(col.key))\n : [...this._columnMap.values()];\n filtered = filtered.filter((row) =>\n searchCols.some((col) => {\n const val = this.getDisplayValueForSearch(col, 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 = { [ROW_RAW_KEY]: row, [ROW_INDEX_KEY]: index };\n this.activeFields.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 const key = groupLazyStatus === 'error' ? GROUP_KEY_LAZY_ERROR : GROUP_KEY_LAZY_LOADING;\n return [{ [GROUP_HEADER_MARKER]: true, [ROW_GROUP_KEY]: key, [ROW_GROUP_COUNT]: rows.length, [ROW_GROUP_PAGE]: 0, [ROW_GROUP_PAGE_COUNT]: 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._groupCache !== null &&\n this._groupCache.rows === rows &&\n this._groupCache.key === groupKey &&\n this._groupCache.sortOrder === this._groupBy.groupSortOrder &&\n this._groupCache.sortActive === (effectiveSort.active ?? '') &&\n this._groupCache.sortDir === (effectiveSort.direction ?? '');\n\n let groupOrder: string[];\n let groupMap: Map<string, T[]>;\n\n if (cacheValid) {\n groupOrder = this._groupCache!.order;\n groupMap = this._groupCache!.map;\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 const fastCompareFn = this._buildCachedSortComparator(rows, effectiveSort);\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._groupBy.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._groupCache = {\n rows,\n key: groupKey,\n sortOrder: this._groupBy.groupSortOrder,\n sortActive: effectiveSort.active ?? '',\n sortDir: effectiveSort.direction ?? '',\n order: groupOrder,\n map: groupMap,\n };\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 [{ [GROUP_HEADER_MARKER]: true, [ROW_GROUP_KEY]: GROUP_KEY_TOO_MANY, [ROW_GROUP_COUNT]: groupOrder.length, [ROW_GROUP_PAGE]: 0, [ROW_GROUP_PAGE_COUNT]: 1 }];\n }\n\n const pageSize = this.groupPageSize;\n const result: any[] = [];\n const rowIndexes = new Map<T, number>();\n rows.forEach((row, index) => rowIndexes.set(row, index));\n\n groupOrder.forEach((groupValue) => {\n const groupRows = groupMap.get(groupValue)!;\n const totalCount = groupRows.length;\n const currentPage = pageSize === 0 ? 0 : this._groupBy.getPage(groupValue);\n const pageCount = pageSize === 0 ? 1 : Math.max(1, Math.ceil(totalCount / pageSize));\n const collapsed = this.isGroupCollapsed(groupValue);\n\n result.push({ [GROUP_HEADER_MARKER]: true, [ROW_GROUP_KEY]: groupValue, [ROW_GROUP_COUNT]: totalCount, [ROW_GROUP_PAGE]: currentPage, [ROW_GROUP_PAGE_COUNT]: 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) => {\n const idx = rowIndexes.get(row) ?? 0;\n const projected: any = { [ROW_RAW_KEY]: row, [ROW_INDEX_KEY]: idx, [ROW_GROUP_KEY]: groupValue };\n this.activeFields.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 /** Comparateur dont les valeurs de tri sont calculées une seule fois par ligne. */\n private _buildSortComparator(rows: T[]): ((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 return this._buildCachedSortComparator(rows, sort);\n }\n\n private _buildCachedSortComparator(\n rows: T[],\n sort: TableSortState,\n ): ((a: T, b: T) => number) | null {\n if (!sort.active || !sort.direction) return null;\n const sortKey = sort.active;\n const sortDirection: 'asc' | 'desc' = sort.direction;\n const sortValueCache = new Map<T, unknown>();\n rows.forEach(row => sortValueCache.set(row, this.getLazyAwareValue(sortKey, row)));\n return (left: T, right: T): number => this._applySortDirection(\n this._compareSortValues(sortValueCache.get(left), sortValueCache.get(right)),\n sortDirection,\n );\n }\n\n private static readonly _collator = new Intl.Collator('fr', { sensitivity: 'accent', numeric: true });\n\n private _compareSortValues(left: unknown, right: unknown): number {\n if (typeof left === 'number' && typeof right === 'number') {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n }\n if (left instanceof Date && right instanceof Date) {\n return Math.sign(left.getTime() - right.getTime()) || 0;\n }\n\n return TableComponent._collator.compare(this._normalizeSortValue(left), this._normalizeSortValue(right));\n }\n\n private _normalizeSortValue(value: any): string {\n return value == null ? '' : String(value);\n }\n\n private _applySortDirection(comparison: number, direction: 'asc' | 'desc'): number {\n return direction === 'asc' ? comparison : -comparison;\n }\n\n /**\n * Retourne la valeur telle qu'elle est affichée dans la cellule, en suivant exactement\n * le même chemin que resolveCellValue — utilisée pour la recherche plein-texte.\n * Ne passe pas par sortValue (valeur brute de tri) contrairement à getLazyAwareValue.\n */\n private getDisplayValueForSearch(col: TableColumnProvider<T>, row: T): any {\n if (col.lazy && this._lazyColumnStatus.get(col.key) !== 'loaded') return null;\n if (col.searchValue) {\n return col.searchValue(row, 0);\n }\n const rawValue = col.value ? col.value(row, 0) : (row as any)?.[col.key];\n return normalizeCellValue(rawValue);\n }\n\n private getLazyAwareValue(columnKey: string, row: T): any {\n const colDef = this._columnMap.get(columnKey);\n if (colDef?.lazy && this._lazyColumnStatus.get(columnKey) !== 'loaded') {\n return null;\n }\n if (colDef?.sortValue) {\n return this._toSortInput(colDef.sortValue(row, 0));\n }\n if (colDef?.value) {\n return this._toSortInput(colDef.value(row, 0));\n }\n return (row as any)[columnKey];\n }\n\n /** Les nombres et les dates gardent leur type pour un tri correct ; le reste est normalisé en texte. */\n private _toSortInput(value: unknown): unknown {\n return typeof value === 'number' || value instanceof Date ? value : normalizeCellValue(value);\n }\n\n /** Les statuts de chargement lazy ne doivent jamais apparaître dans un fichier exporté. */\n private _resolveExportValue(col: TableColumnProvider<T>, row: T, index: number): any {\n const value = this.resolveCellValue(col, row, index);\n return value === LAZY_LOADING_VALUE || value === LAZY_ERROR_VALUE ? '' : value;\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);\n if (status === 'loading') return LAZY_LOADING_VALUE;\n if (status === 'error') return LAZY_ERROR_VALUE;\n if (!status) 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 this.pageChange.emit({ pageIndex: this.paginator!.pageIndex, 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.sortChange.emit({ active: this.sort.active, direction: this.sort.direction });\n this._scheduleRender();\n });\n }\n }\n}\n\nfunction serializableColumn<T>(column: TableColumnProvider<T>): Record<string, unknown> {\n return {\n key: column.key,\n header: column.header,\n icon: column.icon,\n sortable: column.sortable,\n removable: column.removable,\n optional: column.optional,\n width: column.width,\n groupable: column.groupable,\n sliceable: column.sliceable,\n lazy: !!column.lazy,\n };\n}\n","<section class=\"jquery-table-wrapper\">\n <output class=\"visual-copy-feedback\" *ngIf=\"copyFeedbackMessage\" aria-live=\"polite\">{{ copyFeedbackMessage }}</output>\n <header class=\"table-header\" *ngIf=\"showTitle\">\n <h3>{{ title }}</h3>\n </header>\n\n <div\n class=\"table-layout\"\n [class.no-slice]=\"!_showSlicePanel || _slicePanelCollapsed\"\n >\n <slice-panel\n [style.display]=\"!_showSlicePanel || _slicePanelCollapsed ? 'none' : null\"\n [sliceConfigs]=\"_sliceConfigs\"\n [columns]=\"_sliceColumns\"\n [data]=\"_sliceData\"\n [lazyStatus]=\"_lazyColumnStatus\"\n [showToggle]=\"_sliceShowToggle\"\n [collapsedByDefault]=\"_slicePanelCollapsed\"\n (filterChange)=\"onSliceFilterChange($event)\"\n (dynamicSliceKeysChange)=\"onDynamicSliceKeysChange($event)\"\n (collapsedChange)=\"onSlicePanelCollapsedChange($event)\"\n ></slice-panel>\n\n <div class=\"table-shell\" #tableShell>\n <div class=\"table-toolbar\" *ngIf=\"showToolbar\">\n <div class=\"table-toolbar-left\">\n <button\n *ngIf=\"showSliceExpandBtn\"\n type=\"button\"\n class=\"slice-expand-btn\"\n [title]=\"i18n.expandFilterTitle\"\n (click)=\"expandSlicePanel()\"\n ><mat-icon class=\"slice-expand-mat-icon\">filter_list</mat-icon></button>\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]=\"i18n.searchPlaceholder\"\n [attr.aria-label]=\"i18n.searchPlaceholder\"\n autocomplete=\"off\"\n />\n <button *ngIf=\"searchQuery\" type=\"button\" class=\"search-clear-btn\" (click)=\"searchQuery = ''; onSearchChange()\">×</button>\n <span class=\"search-count\" *ngIf=\"!effectiveIsLoading\">{{ filteredRowCount }}</span>\n <div class=\"search-count-loader\" *ngIf=\"effectiveIsLoading\">\n <div class=\"spinner\"></div>\n </div>\n </div>\n </div>\n <div *ngIf=\"showOrganizerButton\" class=\"table-toolbar-right\">\n <table-organizer-button\n [config]=\"organizerConfig\"\n [state]=\"organizerState\"\n [hideMenuValues]=\"organizerHideMenuValues\"\n (viewChange)=\"onOrganizerViewChange($event)\">\n </table-organizer-button>\n </div>\n </div>\n\n <div class=\"table-body-wrapper\">\n\n <!-- Bannière message préférences -->\n <div *ngIf=\"_preferencesMessage\" class=\"preferences-message\">\n <mat-icon class=\"preferences-message-icon\">check_circle</mat-icon>\n <span>{{ _preferencesMessage }}</span>\n </div>\n\n <!-- Bouton de confirmation du mode édition -->\n <button\n *ngIf=\"_editMode\"\n type=\"button\"\n class=\"edit-confirm-btn\"\n [title]=\"i18n.preferencesConfirmEdit\"\n (click)=\"confirmEditMode()\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n <div class=\"table-body-scroll\" #tableBodyScroll>\n <table mat-table matSort [dataSource]=\"tableDataSource\" class=\"jquery-table\"\n [style.min-width]=\"tableMinWidth\"\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]=\"(!_editMode && column.sortable !== false) ? column.key : ''\"\n [disabled]=\"_editMode || column.sortable === false\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.drag-enabled]=\"isColumnDragDropEnabled || _editMode\"\n [class.drop-target]=\"isHeaderDropTarget(column.key)\"\n [class.edit-mode-header]=\"_editMode\"\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 <button\n type=\"button\"\n *ngIf=\"isColumnDragDropEnabled || _editMode\"\n class=\"drag-handle\"\n draggable=\"true\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Réordonner la colonne ' + column.header\"\n (dragstart)=\"onHeaderDragStart(column.key, $event)\"\n (dragend)=\"onHeaderDragEnd()\"\n (keydown)=\"onHeaderKeyDown(column.key, $event)\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon>drag_indicator</mat-icon>\n </button>\n </div>\n <!-- Poignée de resize (visible uniquement en mode édition) -->\n <span\n *ngIf=\"_editMode\"\n class=\"col-resize-handle\"\n draggable=\"false\"\n (mousedown)=\"onResizeStart(column.key, $event)\"\n ></span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.edit-mode-cell]=\"_editMode\">\n <ng-container *ngIf=\"!_editMode; else editModeCellTpl\">\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)=\"$event.stopPropagation(); retryLazyColumns()\" [title]=\"i18n.lazyErrorTitle\">\n <span class=\"lazy-error-icon\">⚠</span>\n <span class=\"lazy-error-label\">{{ i18n.lazyRetry }}</span>\n </button>\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"getCellTemplate(column.key) as customTpl; else defaultCellTpl\">\n <ng-container *ngTemplateOutlet=\"customTpl; context: { $implicit: row[_ROW_RAW_KEY], index: row[_ROW_INDEX_KEY], value: row[column.key] }\"></ng-container>\n </ng-container>\n <ng-template #defaultCellTpl>\n <span class=\"cell-text\" [class.cell-empty]=\"isCellEmpty(row[column.key])\" [title]=\"asTitle(row[column.key])\">{{ isCellEmpty(row[column.key]) ? i18n.cellEmpty : row[column.key] }}</span>\n </ng-template>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-template #editModeCellTpl>\n <span class=\"cell-text cell-edit-mode\" [title]=\"asTitle(row[column.key])\">{{ row[column.key] }}</span>\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 && !_editMode ? 0 : null\"\n [attr.aria-label]=\"hasRowClickHandler && !_editMode ? rowActionLabel(row) : null\"\n [attr.aria-keyshortcuts]=\"hasRowClickHandler && !_editMode ? 'Enter Space' : null\"\n [ngClass]=\"getRowClass(row)\"\n [class.no-pointer]=\"!hasRowClickHandler || _editMode\"\n [class.edit-mode-row]=\"_editMode\"\n (click)=\"!_editMode && onRowClick(row, $event)\"\n (keydown.enter)=\"!_editMode && onRowClick(row, null)\"\n (keydown.space)=\"!_editMode && onRowClick(row, null); $event.preventDefault()\"\n ></tr>\n <ng-container [matColumnDef]=\"_GROUP_ROW_COLUMN\">\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[_ROW_GROUP_KEY])\" *ngIf=\"isNormalGroupRow(row)\">›</span>\n <span *ngIf=\"isNormalGroupRow(row)\" class=\"group-key-label\">{{ row[_ROW_GROUP_KEY] }}</span>\n <span *ngIf=\"isGroupRowLoading(row)\" class=\"lazy-skeleton group-lazy-key-skeleton\"></span>\n <button *ngIf=\"isGroupRowError(row)\" type=\"button\" class=\"lazy-error-btn\" (click)=\"retryGroupByColumn($event)\" [title]=\"i18n.lazyErrorTitle\">\n <span class=\"lazy-error-icon\">⚠</span>\n <span class=\"lazy-error-label\">{{ i18n.lazyRetry }}</span>\n </button>\n <span *ngIf=\"isGroupRowTooMany(row)\" class=\"group-too-many-label\">{{ i18n.groupTooMany(row[_ROW_GROUP_COUNT]) }}</span>\n <span class=\"group-count-badge\">{{ row[_ROW_GROUP_COUNT] }}</span>\n <div class=\"group-pagination\" *ngIf=\"!isGroupCollapsed(row[_ROW_GROUP_KEY]) && row[_ROW_GROUP_PAGE_COUNT] > 1\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] === 0\" (click)=\"groupPageBack(row[_ROW_GROUP_KEY])\">‹</button>\n <span class=\"group-page-info\">{{ row[_ROW_GROUP_PAGE] + 1 }} / {{ row[_ROW_GROUP_PAGE_COUNT] }}</span>\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] >= row[_ROW_GROUP_PAGE_COUNT] - 1\" (click)=\"groupPageForward(row[_ROW_GROUP_KEY], row[_ROW_GROUP_COUNT])\">›</button>\n </div>\n </div>\n </td>\n </ng-container>\n <tr mat-row *matRowDef=\"let row; columns: [_GROUP_ROW_COLUMN]; when: isGroupHeader\"\n class=\"group-header-row\"\n [class.group-header-loading]=\"isGroupRowLoading(row)\"\n [class.group-header-error]=\"isGroupRowError(row)\"\n [class.group-header-too-many]=\"isGroupRowTooMany(row)\"\n [attr.data-group-key]=\"row[_ROW_GROUP_KEY]\"\n [attr.tabindex]=\"isNormalGroupRow(row) ? 0 : null\"\n [attr.aria-expanded]=\"isNormalGroupRow(row) ? !isGroupCollapsed(row[_ROW_GROUP_KEY]) : null\"\n (click)=\"onGroupHeaderClick(row)\"\n (keydown.enter)=\"onGroupHeaderClick(row)\"\n (keydown.space)=\"onGroupHeaderClick(row); $event.preventDefault()\"></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\" [class.is-loading]=\"effectiveIsLoading\" *ngIf=\"showPagination\">\n <mat-paginator\n [length]=\"totalRows\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [showFirstLastButtons]=\"resolvedPaginationShowFirstLastButtons\"\n ></mat-paginator>\n <div class=\"paginator-range-loader\" \n [class.paginator-range-loader--no-first-last]=\"!resolvedPaginationShowFirstLastButtons\"\n *ngIf=\"effectiveIsLoading\">\n <div class=\"spinner\"></div>\n </div>\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 {{ i18n.groupRemove }}\n </button>\n <div class=\"group-bar-separator\"></div>\n <div class=\"group-sort-controls\">\n <span class=\"group-sort-label\">{{ i18n.groupSortLabel }}</span>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'asc'\" (click)=\"onGroupSortToggle('asc')\" [title]=\"i18n.groupSortAsc\">\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]=\"i18n.groupSortDesc\">\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\">{{ i18n.groupRowsPerGroup }}</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 ? i18n.groupShowAll : groupPageSize }}</mat-select-trigger>\n <mat-option *ngFor=\"let opt of pageSizeOptionsGroupBy\" [value]=\"opt\">{{ opt }}</mat-option>\n <mat-option [value]=\"0\">{{ i18n.groupShowAll }}</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/snapshot-table-config';\nexport * from './lib/jqt-i18n.token';\nexport * from './lib/component/table.component';\nexport * from './lib/component/organizer-button/organizer-button.component';\nexport { SliceConfig, SliceColumnDef, SliceCategory, SlicePanelComponent } from '@oneteme/jquery-organizer';\nexport { OrganizerButtonComponent, OrganizerConfig, OrganizerButtonEvent, OrganizerState } from '@oneteme/jquery-organizer';\nexport * from './lib/directive/jqt-cell-def.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oneteme-jquery-table.mjs","sources":["../../../../projects/oneteme/jquery-table/src/lib/jquery-table.model.ts","../../../../projects/oneteme/jquery-table/src/lib/snapshot-table-config.ts","../../../../projects/oneteme/jquery-table/src/lib/jqt-i18n.token.ts","../../../../projects/oneteme/jquery-table/src/lib/directive/jqt-cell-def.directive.ts","../../../../projects/oneteme/jquery-table/src/lib/component/table.utils.ts","../../../../projects/oneteme/jquery-table/src/lib/component/table-preferences.manager.ts","../../../../projects/oneteme/jquery-table/src/lib/component/export.manager.ts","../../../../projects/oneteme/jquery-table/src/lib/component/table.constants.ts","../../../../projects/oneteme/jquery-table/src/lib/component/organizer-button/organizer-button.component.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 { DataProvider } from '@oneteme/jquery-core';\nimport { Observable } from 'rxjs';\nimport { OrganizerConfig, SliceConfig } from '@oneteme/jquery-organizer';\nexport { SliceConfig } from '@oneteme/jquery-organizer';\n\n/** Propriétés communes à toutes les colonnes ; voir `TableColumnProvider`. */\nexport interface TableColumnBase<T = any> {\n key: string;\n /** Libellé affiché dans l'en-tête de colonne. Optionnel si la colonne utilise un template custom. */\n header?: string;\n icon?: string;\n value?: DataProvider<any>;\n /** Valeur utilisée pour le tri si différente de `value`. Utile quand `value` retourne une chaîne formatée (date, durée...). */\n sortValue?: DataProvider<any>;\n /**\n * Valeur utilisée pour la recherche plein-texte.\n * À définir quand la colonne utilise un `jqt-cell-def` template personnalisé et qu'aucun `value` provider n'est déclaré.\n * Si absent, la recherche utilise `value` en priorité, puis la valeur brute de la ligne.\n * Exemple : `searchValue: (row) => durationPipe.transform((today - row.start) / 1000)`\n */\n searchValue?: DataProvider<string>;\n /** Active le tri ; `true` par défaut. */\n sortable?: boolean;\n removable?: boolean;\n width?: string;\n /** Rend la colonne disponible dans Group by ; `true` par défaut si `header` est défini. */\n groupable?: boolean;\n /** Rend la colonne disponible comme Slice by dynamique ; `true` par défaut si `header` est défini. */\n sliceable?: boolean;\n}\n\n/**\n * Colonne du tableau.\n *\n * - `optional: true` : masquée par défaut, ajoutable depuis le menu View.\n * - `lazy: true` : absente de la requête de base, demandée à sa première activation (Organizer, Group by, Slice by).\n * Une colonne lazy est forcément optionnelle : `optional: true` est implicite et `optional: false` est refusé\n * (la colonne serait demandée dès le premier rendu, soit une requête de plus pour rien).\n * Le chargement passe par `TableProvider.lazyLoader`, ou par l'événement `lazyColumnsRequested` si l'application\n * préfère relancer elle-même sa requête. La cellule affiche un skeleton jusqu'à la réception des lignes complètes ;\n * la colonne supporte ensuite tri, recherche, Group by et Slice by.\n */\nexport type TableColumnMode =\n | { lazy?: undefined; optional?: boolean }\n | { lazy: true; optional?: true };\n\nexport type TableColumnProvider<T = any> = TableColumnBase<T> & TableColumnMode;\n\n/**\n * Charge les colonnes `lazy` : reçoit les clés des colonnes lazy demandées jusqu'ici (cumul) et retourne les lignes complètes,\n * qui remplacent `data` ; la requête est celle de l'application, la table ne connaît pas la source.\n */\nexport type TableLazyLoader<T = any> = (lazyColumns: string[]) => Observable<T[]>;\n\n/** Configuration de la barre de recherche. */\nexport interface TableSearchConfig {\n enabled?: boolean;\n /** Valeur initiale au chargement. */\n initialQuery?: string;\n /** Restreint la recherche texte aux colonnes dont la `key` est dans ce tableau. Si absent, toutes les colonnes sont cherchées. */\n searchColumns?: string[];\n}\n\n/** Configuration de la pagination. */\nexport interface TablePaginationConfig {\n enabled?: boolean;\n pageSize?: number;\n pageSizeOptions?: number[];\n showFirstLastButtons?: boolean;\n /** Options de taille de page spécifiques au mode Group by. Si absent, utilise `pageSizeOptions`. */\n pageSizeOptionsGroupBy?: number[];\n}\n\n/** Configuration du menu View (Champs / Group by / Slice by). */\nexport interface TableViewConfig {\n /** Active le bouton View. Par défaut : `false`. */\n enabled?: boolean;\n /** Autorise le masquage/affichage des colonnes de base via View > Champs. Par défaut : `true`. */\n enableColumnRemoval?: boolean;\n /** Active le drag & drop pour réordonner les colonnes. Par défaut : `false`. */\n enableColumnDragDrop?: boolean;\n}\n\n/** Labels d'état du tableau. */\nexport interface TableLabelsConfig {\n /** Affiché quand le tableau est vide. Par défaut : `'Aucune donnée'`. */\n empty?: string;\n /** Affiché pendant le chargement. Par défaut : `'Chargement des données...'`. */\n loading?: string;\n}\n\n/** Options publiques du bouton Organizer intégré à la toolbar. */\nexport interface TableOrganizerConfig {\n /** Libellé optionnel affiché à côté de l'icône. */\n buttonLabel?: OrganizerConfig['buttonLabel'];\n /** Icône Material affichée dans le bouton. */\n buttonIcon?: OrganizerConfig['buttonIcon'];\n /** Masque l'icône lorsque le bouton utilise un libellé seul. */\n showButtonIcon?: OrganizerConfig['showButtonIcon'];\n /** Masque les valeurs récapitulatives dans les sous-menus. */\n hideMenuValues?: boolean;\n}\n\n/**\n * Raccourci pour déclarer une colonne de base.\n *\n * ```ts\n * columns: [\n * col('name', 'Nom'),\n * col('status', 'Statut', { sortable: false }),\n * ]\n * ```\n */\nexport function col<T = any>(\n key: string,\n header: string,\n overrides?: Partial<TableColumnBase<T>> & TableColumnMode,\n): TableColumnProvider<T> {\n return { key, header, ...overrides };\n}\n\n/** Configuration de l’export CSV déclenché depuis la toolbar. */\nexport interface TableExportConfig<T = any> {\n /** Affiche le bouton Export dans la toolbar. Par défaut : `true`. */\n enabled?: boolean;\n /** Nom du fichier généré. Par défaut : `'export.csv'`. */\n filename?: string;\n /**\n * Transforme chaque ligne avant export.\n * Si absent, les valeurs affichées (après `normalizeCellValue`) sont utilisées.\n * Seules les colonnes visibles sont exportées.\n */\n transform?: (row: T) => Record<string, string>;\n}\n/**\n * Configuration de la fonctionnalité Préférences.\n *\n * Ajoute un menu \"Préférences\" dans View qui permet :\n * - Le **mode édition** (redimensionner / réordonner les colonnes à la souris)\n * - L'**enregistrement** de la configuration courante dans le localStorage\n * - L'**effacement** de la configuration sauvegardée\n *\n * Chaque tableau est identifié par `tableId` (clé localStorage unique).\n */\nexport interface TablePreferencesConfig {\n /** Active la fonctionnalité. Par défaut : `true`. */\n enabled?: boolean;\n /**\n * Identifiant unique du tableau, utilisé comme clé localStorage.\n * Doit être stable entre les rechargements de page.\n * Si absent, un identifiant est dérivé automatiquement des clés de colonnes.\n * Exemple : `'user-table'`, `'invoice-list'`.\n */\n tableId?: string;\n}\n\n/** Snapshot de configuration persisté dans le localStorage. */\nexport interface SavedTableConfig {\n /** Valeur de la searchbar. */\n search?: string;\n /** Clé de la colonne utilisée pour le group by. `null` = aucun. */\n groupBy?: string | null;\n /** Nombre de lignes par page (mode normal). */\n pageSize?: number;\n /** Nombre de lignes par groupe (mode Group by). `0` = tout afficher. */\n groupPageSize?: number;\n /** Ordre des clés de colonnes (position). */\n columnOrder?: string[];\n /** Clés des colonnes visibles. */\n visibleColumns?: string[];\n /** Largeurs de colonnes en pixels, indexées par clé. */\n columnWidths?: Record<string, number>;\n /** Panneau slice replié ou non. */\n slicePanelCollapsed?: boolean;\n /** Clés des slices statiques cachées par l'utilisateur (via toggle dans le menu View). */\n hiddenSliceKeys?: string[];\n /** Clés des colonnes utilisées comme slices dynamiques. */\n dynamicSliceKeys?: string[];\n /** Filtres actifs du slice panel, indexés par clé de colonne stable. */\n sliceFilters?: Record<string, string[]>;\n}\nexport interface TableProvider<T = any> {\n columns?: TableColumnProvider<T>[];\n title?: string;\n showActions?: boolean;\n onCopyVisual?: () => void;\n onToggleFullscreen?: () => void;\n slices?: SliceConfig<T>[];\n /** État initial du panneau de slices. Une préférence sauvegardée reste prioritaire. */\n slicePanelCollapsed?: boolean;\n /** Affiche le bouton toggle pour replier/déplier le panneau de slices. Par défaut : `true`. */\n enableSliceToggle?: boolean;\n /**\n * Permet de vider search bar depuis config\n * Changez cette valeur (ex: route courante, compteur, timestamp) pour déclencher un reset.\n */\n clearSearchInput?: string | number | boolean | null;\n search?: TableSearchConfig;\n pagination?: TablePaginationConfig;\n view?: TableViewConfig;\n organizer?: TableOrganizerConfig;\n labels?: TableLabelsConfig;\n /** Tri initial appliqué au chargement. N'est pas écrasé par les changements de données. */\n defaultSort?: { active: string; direction: 'asc' | 'desc' };\n /** Clé de colonne à utiliser comme group-by par défaut au chargement. N'est pas écrasé par les changements de données ni par un reset explicite de l'utilisateur. */\n defaultGroupBy?: string | null;\n rowClass?: (row: T, index: number) => string | string[] | Record<string, boolean>;\n /** Callback déclenché quand l'utilisateur clique sur une ligne. Alternative au `(rowSelected)` Output. */\n onRowSelected?: (row: T, event: MouseEvent | null) => void;\n /** Configuration de l'export CSV. */\n export?: TableExportConfig<T>;\n /**\n * Chargeur des colonnes `lazy` : appelé à l'activation d'une colonne lazy (et après chaque nouveau `data` si des colonnes\n * ont déjà été demandées). Sans chargeur, la table émet seulement `lazyColumnsRequested`.\n */\n lazyLoader?: TableLazyLoader<T>;\n /** Configuration de la fonctionnalité Préférences (édition + persistance localStorage). */\n preferences?: TablePreferencesConfig;\n}\n\n\n","import { VisualSnapshot } from '@oneteme/jquery-core';\nimport { TableProvider } from './jquery-table.model';\n\n/**\n * Reconstruit la vue autonome d'un snapshot de tableau.\n * Les actions d'édition sont volontairement absentes d'une copie ; la recherche\n * reste disponible et s'appuie sur les données sérialisées du snapshot.\n */\nexport function tableProviderFromSnapshot(snapshot: VisualSnapshot): TableProvider<any> {\n if (snapshot.type !== 'table') {\n return { columns: [] };\n }\n\n const config = snapshot.config as {\n title?: string;\n columns?: Array<{ key: string; header?: string; sortable?: boolean; optional?: boolean }>;\n search?: TableProvider<any>['search'];\n pagination?: TableProvider<any>['pagination'];\n };\n const state = snapshot.state as {\n search?: string;\n groupBy?: string | null;\n columnOrder?: string[];\n visibleColumns?: string[];\n pageSize?: number;\n };\n const columns = (config.columns ?? []).map(column => ({\n key: column.key,\n header: column.header || column.key,\n sortable: column.sortable !== false,\n optional: column.optional,\n searchValue: (row: any): string => {\n const value = row?.[column.key];\n return value == null ? '' : String(value);\n },\n }));\n const orderedKeys = state.columnOrder?.length ? state.columnOrder : state.visibleColumns;\n const orderedColumns = orderedKeys?.length\n ? orderedKeys.map(key => columns.find(column => column.key === key)).filter(Boolean)\n : columns;\n\n return {\n title: config.title,\n search: config.search\n ? { ...config.search, initialQuery: state.search ?? config.search.initialQuery }\n : undefined,\n pagination: config.pagination\n ? { ...config.pagination, pageSize: state.pageSize ?? config.pagination.pageSize }\n : undefined,\n defaultGroupBy: state.groupBy ?? null,\n view: { enabled: false, enableColumnRemoval: false, enableColumnDragDrop: false },\n export: { enabled: false },\n preferences: { enabled: false },\n showActions: false,\n columns: orderedColumns as any[],\n };\n}","import { InjectionToken } from '@angular/core';\n\n/**\n * Labels de l'interface utilisateur de jquery-table.\n *\n * Fournir ce token au niveau du module ou du composant racine pour localiser\n * ou personnaliser tous les textes de la bibliothèque en un seul endroit :\n *\n * ```ts\n * providers: [\n * { provide: JQT_I18N, useValue: { searchPlaceholder: 'Search…', emptyState: 'No data' } }\n * ]\n * ```\n *\n * Tous les champs sont optionnels : seul ce que vous fournissez écrase les\n * valeurs par défaut françaises.\n */\nexport interface JqtI18n {\n /** Placeholder de la barre de recherche. */\n searchPlaceholder: string;\n /** Titre du bouton pour déplier le panneau de filtres. */\n expandFilterTitle: string;\n /** Titre du bouton pour replier le panneau de filtres. */\n collapseFilterTitle: string;\n /** Label du sous-menu \"Champs\" dans View. */\n viewMenuFields: string;\n /** Label du sous-menu \"Group by\" dans View. */\n viewMenuGroupBy: string;\n /** Label du sous-menu \"Slice by\" dans View. */\n viewMenuSliceBy: string;\n /** Label affiché quand aucune option n'est sélectionnée (groupe, slice). */\n viewNoneSelected: string;\n /** Bouton \"Retirer le groupe\" dans la barre de groupe. */\n groupRemove: string;\n /** Label \"Trier :\" dans la barre de groupe. */\n groupSortLabel: string;\n /** Tooltip tri ascendant. */\n groupSortAsc: string;\n /** Tooltip tri descendant. */\n groupSortDesc: string;\n /** Label \"Lignes par groupe\" dans le sélecteur de taille de groupe. */\n groupRowsPerGroup: string;\n /** Option \"Toutes\" (afficher toutes les lignes sans pagination de groupe). */\n groupShowAll: string;\n /** Message quand le groupe dépasse le nombre maximal autorisé. Reçoit le nombre de groupes. */\n groupTooMany: (count: number) => string;\n /** Label du bouton de réessai pour une colonne lazy en erreur. */\n lazyRetry: string;\n /** Tooltip du bouton de réessai. */\n lazyErrorTitle: string;\n /** Tooltip de l'icône d'erreur dans le menu View > Champs. */\n lazyErrorMenuTitle: string;\n /** Valeur affichée dans une cellule vide (null / undefined / ''). */\n cellEmpty: string;\n /** Message quand le tableau est vide. */\n emptyState: string;\n /** Message pendant le chargement (`[isLoading]=\"true\"`). */\n loadingState: string;\n /** Titre du panneau de filtres latéral. Reçoit le nombre de blocs de filtres actifs. */\n filterPanelTitle: (count: number) => string;\n /** Titre par défaut d'un bloc de filtre sans `title` configuré. */\n filterBlockDefaultTitle: string;\n /** Message dans un bloc de filtre sans catégories correspondantes. */\n filterEmptyState: string;\n /** Label du bouton d'export CSV. */\n exportButtonLabel: string;\n /** Label du menu Préférences dans View. */\n preferencesMenuLabel: string;\n /** Sous-item : activer le mode édition. */\n preferencesEdit: string;\n /** Sous-item : enregistrer la config. */\n preferencesSave: string;\n /** Sous-item : effacer la config. */\n preferencesClear: string;\n /** Message de confirmation après enregistrement. */\n preferencesSavedMessage: string;\n /** Message de confirmation après effacement. */\n preferencesClearedMessage: string;\n /** Tooltip du bouton de validation du mode édition. */\n preferencesConfirmEdit: string;\n}\n\n/** Valeurs par défaut (français). Toutes les propriétés sont garanties non nulles. */\nexport const JQT_I18N_DEFAULTS: JqtI18n = {\n searchPlaceholder: 'Rechercher...',\n expandFilterTitle: 'Déplier le filtre',\n collapseFilterTitle: 'Replier le filtre',\n viewMenuFields: 'Champs',\n viewMenuGroupBy: 'Grouper par',\n viewMenuSliceBy: 'Filtrer par',\n viewNoneSelected: 'Aucun',\n groupRemove: 'Retirer le groupe',\n groupSortLabel: 'Trier :',\n groupSortAsc: 'A → Z',\n groupSortDesc: 'Z → A',\n groupRowsPerGroup: 'Lignes par groupe :',\n groupShowAll: 'Toutes',\n groupTooMany: (count) => `⚠ Trop de groupes (${count}) — affinez les données ou choisissez une autre colonne`,\n lazyRetry: 'Réessayer',\n lazyErrorTitle: 'Erreur de chargement — cliquer pour réessayer',\n lazyErrorMenuTitle: 'Erreur de chargement',\n cellEmpty: 'N/A',\n emptyState: 'Aucune donnée',\n loadingState: 'Chargement des données...',\n filterPanelTitle: (count) => count > 1 ? 'Filtres' : 'Filtre',\n filterBlockDefaultTitle: 'Filtrer',\n filterEmptyState: 'Aucune donnée',\n exportButtonLabel: 'Exporter',\n preferencesMenuLabel: 'Préférences',\n preferencesEdit: 'Éditer',\n preferencesSave: 'Sauvegarder',\n preferencesClear: 'Réinitialiser',\n preferencesSavedMessage: 'Configuration enregistrée. Vous pouvez la réinitialiser à tout moment via Préférences → Réinitialiser.',\n preferencesClearedMessage: 'Configuration réinitialisée.',\n preferencesConfirmEdit: 'Valider les modifications',\n};\n\n/**\n * Token d'injection pour surcharger tout ou partie des labels de jquery-table.\n * Accepte un `Partial<JqtI18n>` — seules les clés fournies écrasent les défauts.\n */\nexport const JQT_I18N = new InjectionToken<Partial<JqtI18n>>('JQT_I18N');\n","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`), `index` (index global) et `value` (valeur affichée de la cellule,\n * y compris pour une colonne `lazy` dont la valeur n'est pas présente dans la ligne brute).\n * Pour une colonne `lazy`, le template n'est rendu qu'une fois la valeur chargée ; le chargement et l'erreur sont gérés par le tableau.\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; value: any }>) {}\n}\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();\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 { SavedTableConfig } from '../jquery-table.model';\n\nconst STORAGE_PREFIX = 'jqt_prefs_';\n\n/**\n * Gère la persistance de la configuration d'un tableau dans le localStorage.\n * Identifie chaque tableau par un `tableId` unique fourni par l'utilisateur.\n */\nexport class TablePreferencesManager {\n readonly key: string;\n\n constructor(tableId: string) {\n this.key = STORAGE_PREFIX + tableId;\n }\n\n /** Retourne la configuration sauvegardée, ou `null` si absente / corrompue. */\n load(): SavedTableConfig | null {\n try {\n const raw = localStorage.getItem(this.key);\n return raw ? (JSON.parse(raw) as SavedTableConfig) : null;\n } catch {\n return null;\n }\n }\n\n /** Persiste la configuration dans le localStorage. */\n save(config: SavedTableConfig): void {\n try {\n localStorage.setItem(this.key, JSON.stringify(config));\n } catch {\n // localStorage peut être indisponible (mode privé strict, quota dépassé…)\n }\n }\n\n /** Supprime la configuration sauvegardée. */\n clear(): void {\n try {\n localStorage.removeItem(this.key);\n } catch {\n // stockage indisponible : rien à effacer\n }\n }\n\n /** Indique si une configuration est actuellement sauvegardée. */\n hasSaved(): boolean {\n try {\n return localStorage.getItem(this.key) !== null;\n } catch {\n return false;\n }\n }\n}\n","import { TableColumnProvider, TableExportConfig } from '../jquery-table.model';\n\n/**\n * ExportManager\n *\n * Encapsule l'export CSV : construction du fichier BOM/UTF-8, échappement et déclenchement du téléchargement.\n * Aucune dépendance Angular — indépendant du cycle de vie du composant.\n */\nexport class ExportManager<T> {\n constructor(\n private readonly getRows: () => T[],\n private readonly getColumns: () => TableColumnProvider<T>[],\n private readonly getConfig: () => TableExportConfig<T> | undefined,\n private readonly resolveCellValue: (col: TableColumnProvider<T>, row: T, index: number) => any,\n ) {}\n\n export(): void {\n const cfg = this.getConfig();\n if (!cfg?.enabled) return;\n const rows = this.getRows();\n const columns = this.getColumns();\n const baseName = cfg.filename || 'export';\n const filename = baseName.toLowerCase().endsWith('.csv') ? baseName : baseName + '.csv';\n\n const header = columns.map(c => this._csvEscape(c.header || c.key)).join(',');\n const lines = rows.map((row, idx) => {\n if (cfg.transform) {\n const t = cfg.transform(row);\n return columns.map(c => this._csvEscape(String(t[c.key] ?? ''))).join(',');\n }\n return columns.map(c => this._csvEscape(String(this.resolveCellValue(c, row, idx) ?? ''))).join(',');\n });\n\n // BOM UTF-8 pour une ouverture correcte sous Excel\n const blob = new Blob(['\\uFEFF' + [header, ...lines].join('\\n')], { type: 'text/csv;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n private _csvEscape(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n') || value.includes('\\r')) {\n return '\"' + value.replaceAll('\"', '\"\"') + '\"';\n }\n return value;\n }\n}\n","/**\n * Constantes sentinel utilisées pour les identifiants de colonnes et les valeurs\n * projetées dans le datasource interne de la table.\n *\n * Centraliser ici évite les typos silencieuses et facilite les tests unitaires.\n */\n\n/** Identifiant de la colonne virtuelle rendue sur toute la largeur pour les en-têtes de groupe. */\nexport const GROUP_ROW_COLUMN = '__group_row';\n\n/** Marqueur posé sur les objets de ligne pour signaler une ligne d'en-tête de groupe. */\nexport const GROUP_HEADER_MARKER = '__groupHeader';\n\n/** Clé du groupe spéciale « chargement lazy en cours ». */\nexport const GROUP_KEY_LAZY_LOADING = '__lazy_loading__';\n\n/** Clé du groupe spéciale « chargement lazy en erreur ». */\nexport const GROUP_KEY_LAZY_ERROR = '__lazy_error__';\n\n/** Clé du groupe spéciale « trop de groupes ». */\nexport const GROUP_KEY_TOO_MANY = '__too_many_groups__';\n\n/** Propriété injectée dans chaque ligne projetée : référence vers la ligne brute d'origine. */\nexport const ROW_RAW_KEY = '__raw';\n\n/** Propriété injectée dans chaque ligne projetée : index global de la ligne dans le jeu de données filtré. */\nexport const ROW_INDEX_KEY = '__index';\n\n/** Propriété injectée dans chaque ligne projetée : clé du groupe auquel appartient la ligne d'en-tête. */\nexport const ROW_GROUP_KEY = '__groupKey';\n\n/** Propriété injectée dans chaque ligne projetée : nombre de lignes dans le groupe. */\nexport const ROW_GROUP_COUNT = '__groupCount';\n\n/** Propriété injectée dans chaque ligne projetée : page courante du groupe. */\nexport const ROW_GROUP_PAGE = '__groupPage';\n\n/** Propriété injectée dans chaque ligne projetée : nombre de pages du groupe. */\nexport const ROW_GROUP_PAGE_COUNT = '__groupPageCount';\n\n/** Valeur sentinelle posée dans une cellule lazy en cours de chargement. */\nexport const LAZY_LOADING_VALUE = '__lazy_loading__';\n\n/** Valeur sentinelle posée dans une cellule lazy en erreur. */\nexport const LAZY_ERROR_VALUE = '__lazy_error__';\n","import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\nimport { OrganizerButtonComponent, OrganizerConfig, OrganizerButtonEvent, OrganizerState, OrganizerSliceState } from '@oneteme/jquery-organizer';\n\n@Component({\n standalone: true,\n selector: 'table-organizer-button',\n imports: [OrganizerButtonComponent],\n template: `\n <organizer-button\n [config]=\"config\"\n [state]=\"state\"\n [hideMenuValues]=\"hideMenuValues\"\n (viewChange)=\"viewChange.emit($event)\"\n (sliceStateChange)=\"sliceStateChange.emit($event)\">\n </organizer-button>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class OrganizerButtonWrapperComponent {\n @Input() config!: OrganizerConfig;\n @Input() state?: OrganizerState;\n @Input() hideMenuValues = false;\n @Output() viewChange = new EventEmitter<OrganizerButtonEvent>();\n @Output() sliceStateChange = new EventEmitter<OrganizerSliceState | null>();\n}\n","import { CommonModule } from '@angular/common';\nimport { AfterContentInit, AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, HostBinding, HostListener, inject, Input, isDevMode, NgZone, OnChanges, OnDestroy, Output, QueryList, SimpleChanges, TemplateRef, ViewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } 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 { defer, Subject, Subscription, take, takeUntil } from 'rxjs';\nimport { TableColumnProvider, TableExportConfig, TablePreferencesConfig, TableProvider, TableViewConfig } from '../jquery-table.model';\nimport { JqtI18n, JQT_I18N, JQT_I18N_DEFAULTS } from '../jqt-i18n.token';\nimport { JqtCellDefDirective } from '../directive/jqt-cell-def.directive';\nimport { SliceConfig, SlicePanelComponent, OrganizerFacade, GroupByManager, OrganizerConfig, OrganizerButtonEvent, OrganizerState } from '@oneteme/jquery-organizer';\nimport { getFrenchPaginatorIntl, humanizeKey, normalizeCellValue } from './table.utils';\nimport { TablePreferencesManager } from './table-preferences.manager';\nimport { ExportManager } from './export.manager';\nimport {\n GROUP_ROW_COLUMN, GROUP_HEADER_MARKER,\n GROUP_KEY_LAZY_LOADING, GROUP_KEY_LAZY_ERROR, GROUP_KEY_TOO_MANY,\n ROW_RAW_KEY, ROW_INDEX_KEY,\n ROW_GROUP_KEY, ROW_GROUP_COUNT, ROW_GROUP_PAGE, ROW_GROUP_PAGE_COUNT,\n LAZY_LOADING_VALUE, LAZY_ERROR_VALUE,\n} from './table.constants';\nimport { OrganizerButtonWrapperComponent } from './organizer-button/organizer-button.component';\nimport { cloneSerializable, containsFunction, FullscreenManager, VisualCopyFeedbackConfig, VisualSnapshot, VisualSnapshotApplyResult, VisualSnapshotDraft, VisualSnapshotStorage } from '@oneteme/jquery-core';\n\n/** Cache interne du groupement — invalidé dès que les données, la clé ou les paramètres de tri changent. */\ninterface GroupByCache<T> {\n rows: T[];\n key: string;\n sortOrder: 'asc' | 'desc';\n sortActive: string;\n sortDir: string;\n order: string[];\n map: Map<string, T[]>;\n}\n\ninterface TableSortState {\n active: string;\n direction: 'asc' | 'desc' | '';\n}\n\n/** Options de l'Organizer déduites de TableViewConfig. */\ninterface OrganizerViewOptions {\n enabled?: boolean;\n enableFieldRemoval?: boolean;\n enableFieldDragDrop?: boolean;\n}\n\n@Component({\n standalone: true,\n selector: 'jquery-table',\n imports: [ CommonModule, FormsModule, MatTableModule, MatButtonModule, MatDividerModule, MatPaginatorModule, MatSortModule, MatMenuModule, MatIconModule, MatSelectModule, SlicePanelComponent, OrganizerButtonWrapperComponent ],\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, AfterContentInit, AfterViewInit, OnDestroy {\n @HostBinding('class.visual-fullscreen') _isFullscreen = false;\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 /**\n * Mode HTML : active et configure le panneau View indépendamment du `[config]`.\n * Prend le dessus sur `config.view` si défini.\n * Exemple : `<jquery-table [view]=\"{ enabled: true }\">`\n */\n @Input() view?: TableViewConfig;\n\n @Input() columnLabels?: Record<string, string>;\n @Input() isLoading = false;\n /**\n * À passer à `true` quand la requête relancée après `lazyColumnsRequested` échoue : les colonnes en attente affichent un bouton\n * « Réessayer ». Repasser à `false` au nouvel essai.\n */\n @Input() lazyError = false;\n @Input() copyFeedback: VisualCopyFeedbackConfig = {};\n\n /** Paramètre de contrôle pour réinitialiser barre de recherche. */\n @Input()\n set clearSearchInput(value: boolean | null | undefined) {\n if (value) {\n this.searchQuery = '';\n this.onSearchChange();\n }\n }\n\n @Output() readonly addRequested = new EventEmitter<void>();\n @Output() readonly columnAdded = new EventEmitter<TableColumnProvider<T>>();\n @Output() readonly columnRemoved = new EventEmitter<TableColumnProvider<T>>();\n @Output() readonly categorySelected = new EventEmitter<string>();\n @Output() readonly rowSelected = new EventEmitter<T>();\n\n /** Émis à chaque changement de tri (y compris le tri initial). */\n @Output() readonly sortChange = new EventEmitter<TableSortState>();\n /** Émis à chaque changement de page ou de taille de page. */\n @Output() readonly pageChange = new EventEmitter<{ pageIndex: number; pageSize: number }>();\n /** Émis à chaque changement de la recherche texte. */\n @Output() readonly searchChange = new EventEmitter<string>();\n /** Émis quand le Group by change (clé de colonne, ou `null` si désactivé). */\n @Output() readonly groupByChange = new EventEmitter<string | null>();\n /** Émis quand la liste des colonnes visibles change (clés dans l’ordre d’affichage). */\n @Output() readonly columnsChange = new EventEmitter<string[]>();\n @Output() readonly visualCopied = new EventEmitter<VisualSnapshot>();\n /**\n * Clés de toutes les colonnes `lazy` demandées jusqu'ici (cumul), émises quand l'une d'elles est activée pour la première fois.\n * L'application relance sa requête complète en les incluant puis repasse les nouvelles `data`.\n */\n @Output() readonly lazyColumnsRequested = new EventEmitter<string[]>();\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('tableShell') tableShellRef?: ElementRef<HTMLElement>;\n @ViewChild(SlicePanelComponent) slicePanelRef?: SlicePanelComponent<T>;\n @ContentChildren(JqtCellDefDirective) _cellDefs!: QueryList<JqtCellDefDirective>;\n /** Map clé→TemplateRef pré-calculée depuis _cellDefs. Mise à jour dans ngAfterContentInit et sur _cellDefs.changes. */\n private _cellDefMap = new Map<string, TemplateRef<{ $implicit: any; index: number; value: any }>>();\n\n renderedColumns: string[] = [];\n tableDataSource = new MatTableDataSource<any>([]);\n\n /** Constante exposée au template pour le matColumnDef de la ligne de groupe. */\n readonly _GROUP_ROW_COLUMN = GROUP_ROW_COLUMN;\n /** Clés d'accès aux propriétés des lignes projetées — exposées pour le template. */\n readonly _ROW_RAW_KEY = ROW_RAW_KEY;\n readonly _ROW_INDEX_KEY = ROW_INDEX_KEY;\n readonly _ROW_GROUP_KEY = ROW_GROUP_KEY;\n readonly _ROW_GROUP_COUNT = ROW_GROUP_COUNT;\n readonly _ROW_GROUP_PAGE = ROW_GROUP_PAGE;\n readonly _ROW_GROUP_PAGE_COUNT = ROW_GROUP_PAGE_COUNT;\n\n /** Facade View : état et actions centralisés (Champs / Group by / Slice by) */\n readonly _organizer = new OrganizerFacade<TableColumnProvider<T>>();\n\n /**\n * Snapshot stable synchronisé depuis _organizer.fields.activeFields dans refreshViewModel().\n * Propriété (non getter) pour qu'Angular puisse la suivre sans NG0100.\n */\n activeFields: 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 /** Snapshot stable de la visibilité du panneau slice — jamais calculé depuis @ViewChild */\n _showSlicePanel = false;\n /** Snapshot stable de l'état collapsed du panneau slice, mis à jour via (collapsedChange) */\n _slicePanelCollapsed = false;\n private _initialSlicePanelCollapsedApplied = false;\n\n // Délégués vers _view (conservés pour compatibilité template sans refactoring HTML)\n get _staticSlicesForMenu(): Array<{ key: string; title: string; icon?: string }> { return this._organizer.staticSlicesForMenu; }\n get _activeDynamicSliceColumns(): TableColumnProvider<T>[] { return this._organizer.sliceBy.activeDynamicFields; }\n get _availableColumnsForDynamicSlice(): TableColumnProvider<T>[] { return this._organizer.sliceBy.availableForDynamic; }\n get _allDynamicSliceColumns(): TableColumnProvider<T>[] { return this._organizer.sliceBy.allDynamicFields; }\n get _activeSliceByLabel(): string { return this._organizer.sliceBy.activeLabel; }\n _sliceByMenuItems: Array<{ isStatic: boolean; key: string; title: string; icon?: string; col?: TableColumnProvider<T> }> = [];\n\n searchQuery = '';\n get activeGroupByKey(): string | null { return this._organizer.groupBy.activeKey; }\n _matSortActive = '';\n _matSortDirection: 'asc' | 'desc' | '' = '';\n private _activeSort: TableSortState = { active: '', direction: '' };\n private _sortSubscribed: MatSort | null = null;\n private _destroy$ = new Subject<void>();\n private _totalFilteredCount = 0;\n\n /** Gestionnaire du mode Group By (état collapsed, pagination, tri des groupes). */\n readonly _groupBy = new GroupByManager(\n () => { this._projectCurrentPage(); this._cdr.markForCheck(); },\n () => this.refreshViewModel(),\n );\n\n /** Délégués vers GroupByManager pour la compatibilité des templates. */\n get groupPageSize(): number { return this._groupBy.groupPageSize; }\n set groupPageSize(v: number) { this._groupBy.groupPageSize = v; }\n get groupSortOrder(): 'asc' | 'desc' { return this._groupBy.groupSortOrder; }\n set groupSortOrder(v: 'asc' | 'desc') { this._groupBy.groupSortOrder = v; }\n\n /**\n * Statut des colonnes `lazy` déjà demandées (absente = pas encore demandée).\n * `loading` dure jusqu'à la réception de nouvelles `data` ; la référence change à chaque mise à jour (panneau de slices).\n */\n _lazyColumnStatus = new Map<string, 'idle' | 'loading' | 'loaded' | 'error'>();\n private _lazyFlushQueued = false;\n /** Lignes retournées par `config.lazyLoader` : elles remplacent `data` jusqu'au prochain `data`. */\n private _loaderRows: T[] | null = null;\n private _loaderSub?: Subscription;\n private _lazyWarned = false;\n /** Colonnes de la dernière config résolue : évite de reconstruire le tableau (et d'agiter le panneau de slices) à chaque rafraîchissement. */\n private _columnsSource?: TableColumnProvider<T>[];\n private _columnsNormalized?: TableColumnProvider<T>[];\n private readonly _optionalLazyColumns = new WeakMap<object, TableColumnProvider<T>>();\n private _cdr = inject(ChangeDetectorRef);\n private _el = inject(ElementRef<HTMLElement>);\n private _ngZone = inject(NgZone);\n private _paginatorIntl = inject(MatPaginatorIntl);\n private _i18nRaw = inject(JQT_I18N, { optional: true });\n private _tableShellResizeObserver?: ResizeObserver;\n private readonly _fullItemsPerPageLabel = this._paginatorIntl.itemsPerPageLabel;\n copyFeedbackMessage = '';\n private _copyFeedbackTimer?: number;\n\n /** Labels de l’interface. Fusionnés depuis JQT_I18N_DEFAULTS et le token JQT_I18N injecté. */\n readonly i18n: JqtI18n = this._i18nRaw\n ? { ...JQT_I18N_DEFAULTS, ...this._i18nRaw }\n : { ...JQT_I18N_DEFAULTS };\n\n isGroupHeader = (_: number, row: any): boolean => row[GROUP_HEADER_MARKER] === true;\n\n /** Retourne true si la ligne de groupe est une ligne normale (ni lazy, ni too-many). */\n isNormalGroupRow(row: any): boolean {\n const key = row[ROW_GROUP_KEY];\n return key !== GROUP_KEY_LAZY_LOADING && key !== GROUP_KEY_LAZY_ERROR && key !== GROUP_KEY_TOO_MANY;\n }\n isGroupRowLoading(row: any): boolean { return row[ROW_GROUP_KEY] === GROUP_KEY_LAZY_LOADING; }\n isGroupRowError(row: any): boolean { return row[ROW_GROUP_KEY] === GROUP_KEY_LAZY_ERROR; }\n isGroupRowTooMany(row: any): boolean { return row[ROW_GROUP_KEY] === GROUP_KEY_TOO_MANY; }\n\n retryGroupByColumn(event?: Event): void {\n event?.stopPropagation();\n this.retryLazyColumns();\n }\n\n /** Gère le clic sur une ligne d'en-tête de groupe (no-op pour les états spéciaux). */\n onGroupHeaderClick(row: any): void {\n if (!this.isNormalGroupRow(row)) return;\n this.toggleGroupCollapse(row[ROW_GROUP_KEY]);\n }\n\n /** Gestionnaire export CSV. */\n private readonly _export = new ExportManager<T>(\n () => this._allFilteredRows,\n () => this.activeFields,\n () => this.resolvedConfig.export,\n (col, row, idx) => this._resolveExportValue(col, row, idx),\n );\n\n // ── Lifecycle\n\n pageSize = 5;\n pageSizeOptions: number[] = [5, 10, 20];\n pageSizeOptionsGroupBy: number[] = [5, 10, 20];\n /** Taille de page choisie par l'utilisateur ou restaurée des préférences ; prioritaire sur la config tant que le paginator est absent (mode Group by). */\n private _userPageSize: number | null = null;\n\n draggedColumnKey: string | null = null;\n dragOverColumnKey: string | null = null;\n\n // ── Mode édition (Préférences)\n /** Vrai quand le mode édition est actif (resize + drag colonnes, interactions désactivées). */\n _editMode = false;\n /** Largeurs de colonnes personnalisées par l'utilisateur (clé → px). */\n _columnWidths: Record<string, number> = {};\n /** Message de feedback après save/clear. `null` = pas de message. */\n _preferencesMessage: string | null = null;\n /** Vrai si une configuration est sauvegardée pour ce tableau. */\n _hasSavedConfig = false;\n private _preferencesManager: TablePreferencesManager | null = null;\n /** true une fois que le group-by par défaut a été initialisé (évite de reconfigurer GroupByManager à chaque changement de données). */\n private _defaultGroupByApplied = false;\n private _resizeState: { key: string; startX: number; startWidth: number } | null = null;\n /** Dynamic slice keys à restaurer après ngAfterViewInit (slicePanelRef pas encore dispo). */\n private _pendingDynamicSliceKeys: string[] | null = null;\n /** Filtres de slice à restaurer après ngAfterViewInit (slicePanelRef pas encore dispo). */\n private _pendingSliceFilters: Record<string, string[]> | null = null;\n\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 _lastConfigClearSearchInput: string | number | boolean | null | undefined;\n private _initialSearchQueryApplied = false;\n private _lastInitialSearchQuery: string | undefined;\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 — invalidé dès que rows/key/tri changent. */\n private _groupCache: GroupByCache<T> | null = null;\n private _pendingRender: ReturnType<typeof setTimeout> | null = null;\n private readonly _deferredTimers = new Set<ReturnType<typeof setTimeout>>();\n private _headerMeasureFrame: number | null = null;\n private _destroyed = false;\n\n private _staticSliceHiddenKeys = new Set<string>();\n private _configHiddenKeys = new Set<string>();\n\n\n /** Clés des colonnes visibles du dernier émission columnsChange (pour éviter les émissions dupliquement). */\n private _prevColumnKeys: string[] = [];\n\n private emitColumnsChangeIfNeeded(): void {\n const nextKeys = [...this.renderedColumns];\n if (nextKeys.length === this._prevColumnKeys.length\n && nextKeys.every((key, index) => key === this._prevColumnKeys[index])) return;\n this._prevColumnKeys = nextKeys;\n this.columnsChange.emit(nextKeys);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n const dataChanged = !!(changes['data'] || changes['dataSource']);\n if (dataChanged) this._onNewData();\n if (changes['lazyError']) this._applyLazyError();\n this.refreshViewModel();\n if (changes['config']) {\n this.applyConfigSearchReset();\n this.applyInitialSearchQuery(changes['config'].firstChange);\n this._invalidateOrganizerConfig(); // les colonnes ont pu changer\n }\n if (dataChanged && this._lazyColumnStatus.size && this._resolvedData.length) this._runLazyLoader();\n }\n\n ngAfterContentInit(): void {\n this._rebuildCellDefMap();\n this._cellDefs.changes.pipe(takeUntil(this._destroy$)).subscribe(() => {\n this._rebuildCellDefMap();\n this._cdr.markForCheck();\n });\n }\n\n ngAfterViewInit(): void {\n this.attachPaginator();\n this.attachSort();\n this._measureHeaderHeight();\n this._observeTableShellWidth();\n this._applyPendingDynamicSliceKeys();\n }\n\n private _observeTableShellWidth(): void {\n const tableShell = this.tableShellRef?.nativeElement;\n if (!tableShell || typeof ResizeObserver === 'undefined') return;\n\n this._tableShellResizeObserver = new ResizeObserver(([entry]) => {\n const compact = entry.contentRect.width < 660;\n const label = compact ? 'Par page :' : this._fullItemsPerPageLabel;\n if (this._paginatorIntl.itemsPerPageLabel === label) return;\n\n this._ngZone.run(() => {\n this._paginatorIntl.itemsPerPageLabel = label;\n this._paginatorIntl.changes.next();\n this._cdr.markForCheck();\n });\n });\n this._tableShellResizeObserver.observe(tableShell);\n }\n\n private _applyPendingDynamicSliceKeys(): void {\n const hasPendingDynamic = !!this._pendingDynamicSliceKeys;\n const hasPendingFilters = !!this._pendingSliceFilters;\n if (!hasPendingDynamic && !hasPendingFilters) return;\n\n const allCols = this.resolvedConfig.columns ?? [];\n const keys = hasPendingDynamic ? [...this._pendingDynamicSliceKeys!] : [];\n const filters = this._pendingSliceFilters ? { ...this._pendingSliceFilters } : null;\n this._pendingDynamicSliceKeys = null;\n this._pendingSliceFilters = null;\n\n this._scheduleDeferred(() => {\n if (this._resolvedData.length === 0) {\n if (filters) this._pendingSliceFilters = filters;\n if (keys.length > 0) this._pendingDynamicSliceKeys = [...keys];\n return;\n }\n keys.forEach(key => {\n const col = allCols.find(c => c.key === key);\n if (col) this.addDynamicSlice(col);\n });\n if (filters && this.slicePanelRef) {\n this.slicePanelRef.restoreFilters(filters);\n }\n this._cdr.markForCheck();\n });\n }\n\n ngOnDestroy(): void {\n this._destroyed = true;\n this._tableShellResizeObserver?.disconnect();\n if (this._copyFeedbackTimer !== undefined) window.clearTimeout(this._copyFeedbackTimer);\n if (this._pendingRender !== null) {\n clearTimeout(this._pendingRender);\n }\n if (this._preferencesMessageTimer !== null) {\n clearTimeout(this._preferencesMessageTimer);\n }\n this._deferredTimers.forEach(timer => clearTimeout(timer));\n this._deferredTimers.clear();\n if (this._headerMeasureFrame !== null) cancelAnimationFrame(this._headerMeasureFrame);\n // Nettoie un éventuel resize en cours (listeners window non retirés)\n this._resizeState = null;\n this._destroy$.next();\n this._destroy$.complete();\n this._organizer.destroy();\n }\n\n private _measureHeaderHeight(): void {\n const measure = () => {\n if (this._destroyed) return;\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 return;\n }\n }\n // Header pas encore rendu (ex: lazy Angular Material), on réessaie après le prochain frame\n this._scheduleHeaderMeasure(measure);\n };\n this._scheduleHeaderMeasure(measure);\n }\n\n private _scheduleHeaderMeasure(measure: () => void): void {\n this._ngZone.runOutsideAngular(() => {\n this._headerMeasureFrame = requestAnimationFrame(() => {\n this._headerMeasureFrame = null;\n measure();\n });\n });\n }\n\n private _scheduleDeferred(callback: () => void): void {\n const timer = setTimeout(() => {\n this._deferredTimers.delete(timer);\n if (!this._destroyed) callback();\n }, 0);\n this._deferredTimers.add(timer);\n }\n\n private _organizerConfigCache: OrganizerConfig | null = null;\n private _invalidateOrganizerConfig(): void { this._organizerConfigCache = null; }\n get organizerConfig(): OrganizerConfig {\n if (this._organizerConfigCache) return this._organizerConfigCache;\n const allCols = [...this._organizer.menuBaseFields, ...this._organizer.menuOptionalFields];\n const organizerOptions = this.resolvedConfig.organizer;\n this._organizerConfigCache = {\n fields: this._organizer.showFields ? allCols.map(c => ({\n id: c.key,\n label: this.colLabel(c),\n icon: c.icon,\n state: 'ready' as const,\n })) : undefined,\n groups: this._organizer.showGroupBySection ? this._organizer.groupByFields.map(c => ({\n id: c.key,\n label: this.colLabel(c),\n icon: c.icon,\n })) : undefined,\n slices: this._organizer.showSliceBySection ? this._sliceByMenuItems.map(item => ({\n id: item.key,\n label: item.title,\n icon: item.icon,\n })) : undefined,\n buttonLabel: organizerOptions?.buttonLabel,\n buttonIcon: organizerOptions?.buttonIcon,\n showButtonIcon: organizerOptions?.showButtonIcon,\n showExport: this.showExportButton,\n onExport: () => this.onExport(),\n showPreferences: this.showPreferencesMenu,\n hasSavedPreferences: this.hasSavedPreferences,\n onPreferencesEdit: () => this.enterEditMode(),\n onPreferencesSave: () => this.savePreferences(),\n onPreferencesClear: () => this.clearPreferences(),\n showActions: this.resolvedConfig.showActions === true,\n onCopyVisual: this.resolvedConfig.onCopyVisual ?? (() => this.copyVisualSnapshot()),\n onToggleFullscreen: this.resolvedConfig.onToggleFullscreen ?? (this.fullscreenSupported ? () => this.toggleFullscreen() : undefined),\n isFullscreen: this._isFullscreen,\n };\n return this._organizerConfigCache;\n }\n\n get organizerHideMenuValues(): boolean {\n return this.resolvedConfig.organizer?.hideMenuValues === true;\n }\n\n get organizerState(): OrganizerState {\n return {\n visibleFields: this.visibleColumns.map(c => c.key),\n selectedGroupBy: this.activeGroupByKey ?? undefined,\n selectedSlices: this._sliceByMenuItems\n .filter(i => this.isSliceMenuItemActive(i))\n .map(i => i.key),\n };\n }\n\n onOrganizerViewChange(event: OrganizerButtonEvent): void {\n if (event.type === 'fieldToggled') {\n const allCols = [...this._organizer.menuBaseFields, ...this._organizer.menuOptionalFields];\n const newVisible = new Set(event.state.visibleFields ?? []);\n for (const col of allCols) {\n const isNowVisible = newVisible.has(col.key);\n if (this.isColumnVisible(col.key) !== isNowVisible) {\n this.onColumnVisibilityChange(col, isNowVisible);\n }\n }\n } else if (event.type === 'groupBySelected') {\n const newKey = event.state.selectedGroupBy ?? null;\n this.onGroupByChange(newKey === this.activeGroupByKey ? null : newKey);\n } else if (event.type === 'sliceSelected') {\n const prevSlices = new Set(this.organizerState.selectedSlices ?? []);\n const nextSlices = new Set(event.state.selectedSlices ?? []);\n const clickedId = [...prevSlices].find(id => !nextSlices.has(id))\n ?? [...nextSlices].find(id => !prevSlices.has(id));\n if (clickedId) {\n const item = this._sliceByMenuItems.find(i => i.key === clickedId);\n if (item) this.onSliceMenuItemClick(item);\n }\n }\n this._cdr.markForCheck();\n }\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.activeFields;\n }\n\n get showSearchBar(): boolean { return this.resolvedConfig.search?.enabled === true; }\n get showViewButton(): boolean { return this._organizer.enabled || this.showExportButton || this.showPreferencesMenu; }\n get showOrganizerButton(): boolean { return this._organizer.enabled || this.showExportButton || this.showPreferencesMenu; }\n get showSliceExpandBtn(): boolean { return this._showSlicePanel && this._slicePanelCollapsed && this._sliceShowToggle; }\n get showExportButton(): boolean {\n return this.resolvedConfig.export?.enabled === true;\n }\n get showPreferencesMenu(): boolean {\n return this.resolvedConfig.preferences?.enabled === true;\n }\n\n get isDefaultGroupByActive(): boolean {\n if (!this.activeGroupByKey) return false;\n return this.activeGroupByKey === this.resolvedConfig.defaultGroupBy;\n }\n\n get hasSavedPreferences(): boolean { return this._hasSavedConfig; }\n\n get showToolbar(): boolean { return this.showSearchBar || this.showViewButton || this.showSliceExpandBtn; }\n get fullscreenSupported(): boolean { return FullscreenManager.isSupported(this._el.nativeElement); }\n\n async toggleFullscreen(): Promise<void> {\n try {\n await FullscreenManager.toggle(this._el.nativeElement);\n } catch {\n this._isFullscreen = false;\n }\n this._invalidateOrganizerConfig();\n this._cdr.markForCheck();\n }\n\n /** Crée un snapshot autonome et le place dans le stockage partagé. */\n copyVisualSnapshot(label?: string): VisualSnapshot | null {\n const snapshotLabel = label ?? (this.title || 'Tableau');\n if (!snapshotLabel?.trim()) return null;\n const snapshot = new VisualSnapshotStorage().create(this.createVisualSnapshot(snapshotLabel.trim()));\n this.visualCopied.emit(snapshot);\n this.showCopyFeedback();\n return snapshot;\n }\n\n private showCopyFeedback(): void {\n if (this.copyFeedback.enabled === false) return;\n this.copyFeedbackMessage = this.copyFeedback.message || 'Copié';\n if (this._copyFeedbackTimer !== undefined) window.clearTimeout(this._copyFeedbackTimer);\n this._copyFeedbackTimer = window.setTimeout(() => this.copyFeedbackMessage = '', this.copyFeedback.durationMs ?? 2200);\n }\n\n @HostListener('document:fullscreenchange')\n onFullscreenChange(): void {\n this._isFullscreen = FullscreenManager.isActive(this._el.nativeElement);\n this._invalidateOrganizerConfig();\n this._cdr.markForCheck();\n }\n\n expandSlicePanel(): void {\n this.slicePanelRef?.togglePanel();\n }\n get showFields(): boolean { return this._organizer.showFields; }\n get showGroupBySection(): boolean { return this._organizer.showGroupBySection; }\n\n get filteredRowCount(): number {\n return this.activeGroupByKey ? this._totalFilteredCount : this._allFilteredRows.length;\n }\n\n get activeGroupByLabel(): string { return this._organizer.activeGroupByLabel; }\n\n get totalColumnCount(): number { return this._organizer.totalFieldCount; }\n\n get activeSliceByLabel(): string { return this._organizer.sliceBy.activeLabel; }\n\n get activeDynamicSliceColumns(): TableColumnProvider<T>[] { return this._organizer.sliceBy.activeDynamicFields; }\n\n removeDynamicSliceByKey(key: string): void {\n this.slicePanelRef?.removeDynamicSliceByKey(key);\n }\n\n get groupByColumns(): TableColumnProvider<T>[] { return this._organizer.groupByFields; }\n\n colLabel(col: { key: string; header?: string }): string { return this._organizer.fieldLabel(col); }\n\n /** Traduit les options de la vue table vers celles de l'Organizer. */\n private _organizerViewConfig(): OrganizerViewOptions | undefined {\n const view = this.resolvedConfig.view;\n if (!view) return undefined;\n return {\n enabled: view.enabled,\n enableFieldRemoval: view.enableColumnRemoval,\n enableFieldDragDrop: view.enableColumnDragDrop,\n };\n }\n\n /** Ne change la référence que si le contenu change : le panneau recalcule tout à chaque nouvelle référence. */\n private _setSliceConfigs(next: SliceConfig<T>[]): void {\n const same = next.length === this._sliceConfigs.length && next.every((slice, i) => slice === this._sliceConfigs[i]);\n if (!same) this._sliceConfigs = next;\n }\n\n onSearchChange(): void {\n this._runSearch();\n this.searchChange.emit(this.searchQuery);\n }\n\n private _runSearch(): void {\n this._preservePageIndex = 0;\n this._scheduleRender();\n this.paginator?.firstPage();\n }\n\n private setGroupByAndEmit(key: string | null): void {\n const previousKey = this._organizer.groupBy.activeKey ?? null;\n this._organizer.setGroupBy(key);\n const nextKey = this._organizer.groupBy.activeKey ?? null;\n if (previousKey !== nextKey) this.groupByChange.emit(nextKey);\n }\n\n onGroupByChange(key: string | null): void {\n this.setGroupByAndEmit(key);\n this._groupBy.setDefaultCollapsed(key !== null);\n this._groupBy.reset();\n this._groupBy.groupPageSize = this.resolveDefaultGroupPageSize();\n this.refreshViewModel();\n this.paginator?.firstPage();\n if (!key) {\n this._ngZone.runOutsideAngular(() => this._scheduleDeferred(() => {\n this.tableBodyScrollRef?.nativeElement.scrollTo({ top: 0, behavior: 'smooth' });\n }));\n }\n }\n\n onGroupPageSizeChange(size: number | string): void {\n this._groupBy.onGroupPageSizeChange(Number(size));\n }\n\n onGroupSortToggle(dir: 'asc' | 'desc'): void {\n this._groupBy.onGroupSortToggle(dir, (key) => {\n this._ngZone.runOutsideAngular(() => this._scheduleDeferred(() => this.scrollToGroupHeader(key)));\n });\n }\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_VALUE) return 'loading';\n if (rowValue === LAZY_ERROR_VALUE) return 'error';\n return 'value';\n }\n\n /** Relance la demande des colonnes en erreur : le chargeur est rappelé, ou l'application refait sa requête complète. */\n retryLazyColumns(): void {\n const failed = [...this._lazyColumnStatus].filter(([, status]) => status === 'error').map(([key]) => key);\n if (!failed.length) return;\n this._setLazyStatus(failed, 'loading');\n this.lazyColumnsRequested.emit([...this._lazyColumnStatus.keys()]);\n this._runLazyLoader();\n this._scheduleRender();\n }\n\n /** Colonnes lazy dont la valeur est nécessaire : affichées, utilisées en Group by ou en Slice by dynamique. */\n private _usedLazyColumns(): TableColumnProvider<T>[] {\n const used = new Map<string, TableColumnProvider<T>>();\n const add = (column?: TableColumnProvider<T>) => { if (column?.lazy) used.set(column.key, column); };\n this.activeFields.forEach(add);\n this._organizer.sliceBy.activeDynamicFields.forEach(add);\n const groupKey = this.activeGroupByKey;\n if (groupKey) add(this._columnMap.get(groupKey));\n return [...used.values()];\n }\n\n /**\n * Quel que soit le chemin d'activation (Organizer, Group by, Slice by, préférences...), les colonnes lazy utilisées et pas encore\n * demandées sont réclamées en un seul événement. Hors cycle de détection, et seulement une fois des lignes affichées :\n * la première réponse de l'application ne doit pas être prise pour celle qui contient les colonnes.\n */\n private _requestLazyColumns(): void {\n if (this._lazyFlushQueued) return;\n this._lazyFlushQueued = true;\n queueMicrotask(() => {\n this._lazyFlushQueued = false;\n if (this._destroyed || !this._resolvedData.length) return;\n const idle = this._usedLazyColumns().filter(c => !this._lazyColumnStatus.has(c.key));\n if (!idle.length) return;\n this._warnIfNoLazySource(idle);\n this._setLazyStatus(idle.map(c => c.key), 'loading');\n this.lazyColumnsRequested.emit([...this._lazyColumnStatus.keys()]);\n this._runLazyLoader();\n this._scheduleRender();\n this._cdr.markForCheck();\n });\n }\n\n /** Appelle `config.lazyLoader` avec toutes les colonnes lazy demandées ; sa réponse remplace `data`. */\n private _runLazyLoader(): void {\n const loader = this.resolvedConfig.lazyLoader;\n if (!loader) return;\n this._loaderSub?.unsubscribe();\n const columns = [...this._lazyColumnStatus.keys()];\n this._loaderSub = defer(() => loader(columns)).pipe(take(1), takeUntil(this._destroy$)).subscribe({\n next: rows => {\n this._loaderRows = rows;\n this._settleLazyColumns();\n this.refreshViewModel();\n this._cdr.markForCheck();\n },\n error: () => {\n const loading = [...this._lazyColumnStatus].filter(([, status]) => status === 'loading').map(([key]) => key);\n this._setLazyStatus(loading, 'error');\n this._scheduleRender();\n this._cdr.markForCheck();\n },\n });\n }\n\n /** Nouveau `data` : il l'emporte sur les lignes du chargeur. Avec un chargeur, les colonnes déjà demandées sont rechargées. */\n private _onNewData(): void {\n this._loaderSub?.unsubscribe();\n this._loaderRows = null;\n if (this.config?.lazyLoader && this._lazyColumnStatus.size) {\n this._setLazyStatus([...this._lazyColumnStatus.keys()], 'loading');\n } else {\n this._settleLazyColumns();\n }\n }\n\n /** Sans chargeur ni écouteur, la colonne demandée resterait en skeleton sans que rien ne l'explique. */\n private _warnIfNoLazySource(columns: TableColumnProvider<T>[]): void {\n if (this._lazyWarned || this.resolvedConfig.lazyLoader || this.lazyColumnsRequested.observed || !isDevMode()) return;\n this._lazyWarned = true;\n console.warn(\n `[jquery-table] Colonne lazy activée (${columns.map(c => c.key).join(', ')}) mais ni config.lazyLoader ni (lazyColumnsRequested) ne sont définis : `\n + 'aucune requête n\\'est lancée et le skeleton restera affiché.',\n );\n }\n\n /** De nouvelles `data` sont arrivées : toutes les colonnes demandées sont considérées comme prêtes. */\n private _settleLazyColumns(): void {\n const waiting = [...this._lazyColumnStatus].filter(([, status]) => status !== 'loaded').map(([key]) => key);\n if (waiting.length) this._setLazyStatus(waiting, 'loaded');\n }\n\n private _applyLazyError(): void {\n const from = this.lazyError ? 'loading' : 'error';\n const keys = [...this._lazyColumnStatus].filter(([, status]) => status === from).map(([key]) => key);\n if (keys.length) this._setLazyStatus(keys, this.lazyError ? 'error' : 'loading');\n }\n\n private _setLazyStatus(keys: string[], status: 'loading' | 'loaded' | 'error'): void {\n const next = new Map(this._lazyColumnStatus);\n keys.forEach(key => next.set(key, status));\n this._lazyColumnStatus = next;\n }\n\n toggleGroupCollapse(groupKey: string): void {\n this._groupBy.toggleGroupCollapse(groupKey, (key) => {\n this._ngZone.runOutsideAngular(() => this._scheduleDeferred(() => this.scrollToGroupHeader(key)));\n });\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 = Number.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._groupBy.isGroupCollapsed(groupKey);\n }\n\n groupPageBack(groupKey: string): void {\n this._groupBy.groupPageBack(groupKey);\n }\n\n groupPageForward(groupKey: string, totalCount: number): void {\n this._groupBy.groupPageForward(groupKey, totalCount);\n }\n\n get hasAddableColumns(): boolean {\n return this._organizer.menuBaseFields.length > 0 || this._organizer.menuOptionalFields.length > 0;\n }\n\n get menuBaseColumns(): TableColumnProvider<T>[] {\n return this._organizer.menuBaseFields;\n }\n\n get menuOptionalColumns(): TableColumnProvider<T>[] {\n return this._organizer.menuOptionalFields;\n }\n\n get availableColumnsToAdd(): TableColumnProvider<T>[] {\n const activeKeys = new Set(this.activeFields.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._organizer.allowFieldRemoval;\n }\n\n get hasSliceConfig(): boolean {\n return (this.resolvedConfig.slices?.length ?? 0) > 0;\n }\n\n get showSlicePanel(): boolean {\n return this._showSlicePanel;\n }\n\n onSlicePanelCollapsedChange(collapsed: boolean): void {\n this._slicePanelCollapsed = collapsed;\n this._cdr.markForCheck();\n }\n\n private _recomputeShowSlicePanel(): void {\n const hasPendingDynamicSlices = (this._pendingDynamicSliceKeys?.length ?? 0) > 0;\n const hasCfg = this._sliceConfigs.length > 0\n || this._organizer.sliceBy.activeDynamicFields.length > 0\n || hasPendingDynamicSlices;\n const wasVisible = this._showSlicePanel;\n this._showSlicePanel = hasCfg && this._resolvedData.length > 0;\n // Les données viennent d'arriver : appliquer les dynamic slices et les filtres en attente.\n // Les slices dynamiques sont ajoutées avant les filtres pour rendre leurs clés disponibles.\n if (!wasVisible && this._showSlicePanel && (this._pendingSliceFilters || this._pendingDynamicSliceKeys)) {\n const filters = this._pendingSliceFilters;\n const dynamicKeys = this._pendingDynamicSliceKeys;\n this._pendingSliceFilters = null;\n this._pendingDynamicSliceKeys = null;\n const allCols = this.resolvedConfig.columns ?? [];\n this._scheduleDeferred(() => {\n if (dynamicKeys) {\n dynamicKeys.forEach(key => {\n const col = allCols.find(c => c.key === key);\n if (col) this.addDynamicSlice(col);\n });\n }\n if (filters && this.slicePanelRef) {\n this.slicePanelRef.restoreFilters(filters);\n }\n this._cdr.markForCheck();\n });\n }\n }\n\n get showAddSliceButton(): boolean {\n return this._organizer.showSliceBySection;\n }\n\n get staticSlicesForMenu(): Array<{ key: string; title: string; icon?: string }> {\n return this._organizer.staticSlicesForMenu;\n }\n\n get availableColumnsForDynamicSlice(): TableColumnProvider<T>[] {\n return this._organizer.sliceBy.availableForDynamic;\n }\n\n isStaticSliceVisible(columnKey: string): boolean {\n return !this._staticSliceHiddenKeys.has(columnKey);\n }\n\n toggleStaticSlice(columnKey: string): void {\n const next = new Set(this._staticSliceHiddenKeys);\n if (next.has(columnKey)) next.delete(columnKey);\n else next.add(columnKey);\n this._staticSliceHiddenKeys = next;\n this._organizer.updateHiddenStaticKeys(this._staticSliceHiddenKeys);\n // Le panneau retire la sélection du slice masqué et réémet le filtre des autres.\n this._setSliceConfigs(this._computeSliceConfigs());\n this._recomputeShowSlicePanel();\n this._scheduleRender();\n this._cdr.markForCheck();\n }\n\n addDynamicSlice(column: TableColumnProvider<T>): void {\n this.slicePanelRef?.addDynamicSlice(column);\n }\n\n get allDynamicSliceColumns(): TableColumnProvider<T>[] {\n return this._allDynamicSliceColumns;\n }\n\n isDynamicSliceActive(key: string): boolean {\n return this._organizer.isDynamicSliceActive(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 this._organizer.onDynamicSliceKeysChange(keys);\n this._recomputeShowSlicePanel();\n this._requestLazyColumns();\n this._cdr.markForCheck();\n }\n\n get emptyStateLabel(): string {\n return this.resolvedConfig.labels?.empty || this.i18n.emptyState;\n }\n\n get loadingStateLabel(): string {\n return this.resolvedConfig.labels?.loading || this.i18n.loadingState;\n }\n\n get effectiveIsLoading(): boolean {\n return this.isLoading;\n }\n\n get isEmpty(): boolean {\n // _pendingRender : le rendu interne n'est pas encore terminé → pas de message vide prématuré\n return !this.isLoading && this._pendingRender === null && 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 resolvedPaginationShowFirstLastButtons(): boolean {\n return this.resolvedConfig.pagination?.showFirstLastButtons !== false;\n }\n\n get isColumnDragDropEnabled(): boolean {\n return this._organizer.isFieldDragDropEnabled;\n }\n\n get totalRows(): number {\n return this.activeGroupByKey\n ? this.tableDataSource.data.filter((r) => !r[GROUP_HEADER_MARKER]).length\n : this._allFilteredRows.length;\n }\n\n // ── Gestion des colonnes\n\n onAddColumn(column: TableColumnProvider<T>): void {\n this._organizer.addField(column);\n this._preservePageIndex = this.paginator?.pageIndex ?? null;\n this.refreshViewModel();\n\n this.addRequested.emit();\n this.columnAdded.emit(column);\n }\n\n onColumnVisibilityChange(column: TableColumnProvider<T>, checked: boolean): void {\n const isVisible = this._organizer.isFieldVisible(column.key);\n\n if (checked && !isVisible) {\n this.onAddColumn(column);\n return;\n }\n\n if (!checked && isVisible) {\n const removed = this._organizer.removeField(column.key);\n if (!removed) return;\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.activeFields.some(c => c.key === columnKey);\n }\n\n onRemoveColumn(columnKey: string, event?: Event): void {\n event?.stopPropagation();\n const column = this.activeFields.find(item => item.key === columnKey);\n if (!column) return;\n const removed = this._organizer.removeField(columnKey);\n if (!removed) return;\n this.refreshViewModel();\n this.columnRemoved.emit(column);\n }\n\n // ── Lignes\n\n private _rebuildCellDefMap(): void {\n this._cellDefMap = new Map(\n (this._cellDefs ?? []).map(d => [d.columnKey, d.template] as [string, TemplateRef<{ $implicit: any; index: number; value: any }>])\n );\n }\n\n getCellTemplate(key: string): TemplateRef<{ $implicit: any; index: number; value: any }> | null {\n return this._cellDefMap.get(key) ?? null;\n }\n\n get hasCustomCellDefs(): boolean {\n return this._cellDefMap.size > 0;\n }\n\n get hasRowClickHandler(): boolean {\n return this.rowSelected.observed || !!this.resolvedConfig.onRowSelected;\n }\n\n rowActionLabel(row: any): string {\n return `Sélectionner la ligne ${(row?.[ROW_INDEX_KEY] ?? 0) + 1}`;\n }\n\n /** Largeur minimale du tableau en px, calculée depuis les largeurs explicites des colonnes actives.\n * Retourne null si aucune colonne n'a de largeur définie (le tableau remplit alors 100% du conteneur).\n * Seules les valeurs explicitement en `px` sont sommables ; les pourcentages ou autres unités sont ignorés. */\n get tableMinWidth(): string | null {\n const hasResized = Object.keys(this._columnWidths).length > 0;\n const hasSomeExplicitWidth = hasResized || this.activeFields.some(c => c.width);\n if (!hasSomeExplicitWidth) return null;\n let sum = 0;\n for (const col of this.activeFields) {\n if (this._columnWidths[col.key] != null) {\n sum += this._columnWidths[col.key];\n } else if (col.width) {\n const isPx = col.width.trim().toLowerCase().endsWith('px');\n const px = Number.parseFloat(col.width);\n if (isPx && !Number.isNaN(px)) { sum += px; }\n } else {\n sum += 120; // largeur minimale estimée pour une colonne sans largeur explicite\n }\n }\n return sum + 'px';\n }\n\n trackRowFn = (_index: number, row: any): any => {\n if (row[GROUP_HEADER_MARKER]) return `__group_${row[ROW_GROUP_KEY]}`;\n if (row[ROW_GROUP_KEY] !== undefined) return `__row_${row[ROW_GROUP_KEY]}_${row[ROW_INDEX_KEY] ?? _index}`;\n return row[ROW_INDEX_KEY] ?? _index;\n };\n\n getRowClass(row: any): string | string[] | Record<string, boolean> {\n const fn = this.resolvedConfig.rowClass;\n if (!fn || row?.[GROUP_HEADER_MARKER]) return {};\n return fn(row[ROW_RAW_KEY] ?? row, row[ROW_INDEX_KEY] ?? 0);\n }\n\n onRowClick(row: any, event: MouseEvent | null): void {\n if (row?.[GROUP_HEADER_MARKER]) return;\n if (!this.hasRowClickHandler) return;\n const resolved = (row?.[ROW_RAW_KEY] ?? row) as T;\n this.resolvedConfig.onRowSelected?.(resolved, event);\n this.rowSelected.emit(resolved);\n }\n\n // ── Drag & drop\n\n onHeaderDragStart(columnKey: string, event: DragEvent): void {\n if (!this.isColumnDragDropEnabled && !this._editMode) {\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 onHeaderKeyDown(columnKey: string, event: KeyboardEvent): void {\n if ((!this.isColumnDragDropEnabled && !this._editMode)\n || (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight')) return;\n\n const currentIndex = this.activeFields.findIndex(column => column.key === columnKey);\n const targetIndex = event.key === 'ArrowLeft' ? currentIndex - 1 : currentIndex + 1;\n if (currentIndex < 0 || targetIndex < 0 || targetIndex >= this.activeFields.length) return;\n\n event.preventDefault();\n const reordered = [...this.activeFields];\n [reordered[currentIndex], reordered[targetIndex]] = [reordered[targetIndex], reordered[currentIndex]];\n this._organizer.setActiveFields(reordered);\n this.refreshViewModel();\n }\n\n onHeaderDragOver(columnKey: string, event: DragEvent): void {\n if ((!this.isColumnDragDropEnabled && !this._editMode) || !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._editMode) || !this.draggedColumnKey) {\n return;\n }\n\n event.preventDefault();\n\n const moved = this._organizer.reorderFields(this.draggedColumnKey, targetColumnKey);\n if (!moved) {\n this.onHeaderDragEnd();\n return;\n }\n\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 // ── Préférences : mode édition\n\n enterEditMode(): void {\n this._editMode = true;\n this._preferencesMessage = null;\n this._cdr.markForCheck();\n }\n\n confirmEditMode(): void {\n this._editMode = false;\n this._cdr.markForCheck();\n }\n\n /** Démarre le resize d'une colonne (mousedown sur la poignée droite). */\n onResizeStart(columnKey: string, event: MouseEvent): void {\n if (!this._editMode) return;\n event.preventDefault();\n event.stopPropagation();\n\n const th = (event.target as HTMLElement).closest('th') as HTMLElement | null;\n if (!th) return;\n\n const scrollEl = this.tableBodyScrollRef?.nativeElement;\n if (scrollEl) {\n const allTh = scrollEl.querySelectorAll<HTMLElement>('th.mat-mdc-header-cell');\n allTh.forEach(thEl => {\n const colClass = Array.from(thEl.classList).find(c => c.startsWith('mat-column-'));\n const colKey = colClass ? colClass.replace('mat-column-', '') : null;\n if (colKey && this._columnWidths[colKey] == null) {\n this._columnWidths = { ...this._columnWidths, [colKey]: thEl.offsetWidth };\n }\n });\n }\n\n this._resizeState = { key: columnKey, startX: event.clientX, startWidth: th.offsetWidth };\n\n const onMove = (e: MouseEvent) => {\n if (!this._resizeState) {\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n return;\n }\n const delta = e.clientX - this._resizeState.startX;\n const newWidth = Math.max(60, this._resizeState.startWidth + delta);\n this._columnWidths = { ...this._columnWidths, [this._resizeState.key]: newWidth };\n // detectChanges() pour forcer la mise à jour immédiate en mode OnPush\n // (les listeners window tournent hors zone Angular avec runOutsideAngular)\n this._cdr.detectChanges();\n };\n\n const onUp = () => {\n this._resizeState = null;\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n };\n\n // Listeners hors zone Angular pour éviter des cycles CD à chaque mousemove\n this._ngZone.runOutsideAngular(() => {\n window.addEventListener('mousemove', onMove);\n window.addEventListener('mouseup', onUp);\n });\n }\n\n /** Retourne la largeur CSS d'une colonne (px si personnalisée, sinon la valeur de config ou auto). */\n getColumnWidth(key: string): string {\n if (this._columnWidths[key] != null) return this._columnWidths[key] + 'px';\n const col = this._columnMap.get(key);\n return col?.width ?? 'auto';\n }\n\n // ── Préférences : save / clear\n\n savePreferences(): void {\n if (!this._preferencesManager) return;\n const dynamicSliceKeys = this._organizer.sliceBy.activeDynamicFields.map(c => c.key);\n const config: import('../jquery-table.model').SavedTableConfig = {\n search: this.searchQuery || undefined,\n groupBy: this.activeGroupByKey,\n columnOrder: this.activeFields.map(c => c.key),\n visibleColumns: this.activeFields.map(c => c.key),\n pageSize: this.paginator?.pageSize ?? this.pageSize,\n groupPageSize: this.groupPageSize,\n columnWidths: Object.keys(this._columnWidths).length ? { ...this._columnWidths } : undefined,\n slicePanelCollapsed: this._slicePanelCollapsed,\n hiddenSliceKeys: [...this._staticSliceHiddenKeys],\n dynamicSliceKeys: dynamicSliceKeys.length ? dynamicSliceKeys : undefined,\n sliceFilters: this.slicePanelRef ? this.slicePanelRef.getActiveFilters() : undefined,\n };\n this._preferencesManager.save(config);\n this._hasSavedConfig = true;\n this._showPreferencesMessage(this.i18n.preferencesSavedMessage);\n }\n\n clearPreferences(): void {\n if (!this._preferencesManager) return;\n this._preferencesManager.clear();\n this._hasSavedConfig = false;\n\n // Capturer les dynamic slices actives AVANT le reset (resetToDefaults() les vide)\n const dynamicSlicesToRemove = this._organizer.sliceBy.activeDynamicFields.slice();\n\n // Reset complet de l'état vers les valeurs par défaut de la config\n this.searchQuery = '';\n this._columnWidths = {};\n this._slicePanelCollapsed = false;\n // Synchroniser l'état interne du slice-panel : si le composant est en état collapsed\n // (l'utilisateur l'avait fermé après la sauvegarde), le rouvrir explicitement pour\n // éviter que display:none soit retiré mais que isCollapsed interne reste à true.\n if (this.slicePanelRef?.isCollapsed) {\n this.slicePanelRef.togglePanel();\n }\n this._groupBy.reset();\n this._groupBy.setDefaultCollapsed(false);\n this._userPageSize = null;\n this.pageSize = this.resolvePageSize();\n if (this.paginator) this.paginator.pageSize = this.pageSize;\n this.groupPageSize = this.resolveDefaultGroupPageSize();\n\n // Slices statiques : revenir aux seules celles cachées par la config (pas par l'utilisateur)\n this._staticSliceHiddenKeys = new Set(this._configHiddenKeys);\n this._organizer.updateHiddenStaticKeys(this._staticSliceHiddenKeys);\n\n // Colonnes et groupBy : reset via la facade (retire les optionnelles, remet l'ordre config)\n this._organizer.resetToDefaults();\n this._defaultGroupByApplied = false;\n\n // Dynamic slices : les retirer du slice panel avec la liste capturée avant le reset\n dynamicSlicesToRemove.forEach(col => {\n this.slicePanelRef?.removeDynamicSliceByKey(col.key);\n });\n\n // Filtre de slice actif\n this.activeSliceFilter = () => true;\n if (this.slicePanelRef) this.slicePanelRef.restoreFilters({});\n\n // Rafraîchit toute la vue\n this.activeFields = this._organizer.fields.activeFields;\n this.renderedColumns = this.activeFields.map(c => c.key);\n this._pendingDynamicSliceKeys = null;\n this._pendingSliceFilters = null;\n this.refreshViewModel();\n\n this._showPreferencesMessage(this.i18n.preferencesClearedMessage);\n }\n\n private _preferencesMessageTimer: ReturnType<typeof setTimeout> | null = null;\n\n private _showPreferencesMessage(msg: string): void {\n if (this._preferencesMessageTimer !== null) clearTimeout(this._preferencesMessageTimer);\n this._preferencesMessage = msg;\n this._cdr.markForCheck();\n this._preferencesMessageTimer = setTimeout(() => {\n this._preferencesMessageTimer = null;\n this._preferencesMessage = null;\n this._cdr.markForCheck();\n }, 4000);\n }\n\n private _applyPreferences(saved: import('../jquery-table.model').SavedTableConfig | null): void {\n if (!saved) return;\n // Recherche\n if (saved.search) this.searchQuery = saved.search;\n // Largeurs colonnes\n if (saved.columnWidths) this._columnWidths = { ...saved.columnWidths };\n // Group by\n if (saved.groupBy !== undefined) {\n this.setGroupByAndEmit(saved.groupBy);\n if (saved.groupBy) {\n this._groupBy.setDefaultCollapsed(true);\n this._groupBy.reset();\n }\n }\n // Nombre de lignes : valeurs ignorées si elles ne figurent plus dans les options de la config\n if (typeof saved.pageSize === 'number' && this.pageSizeOptions.includes(saved.pageSize)) {\n this._userPageSize = saved.pageSize;\n this.pageSize = saved.pageSize;\n if (this.paginator) this.paginator.pageSize = saved.pageSize;\n }\n if (typeof saved.groupPageSize === 'number'\n && (saved.groupPageSize === 0 || this.pageSizeOptionsGroupBy.includes(saved.groupPageSize))) {\n this.groupPageSize = saved.groupPageSize;\n }\n // État panneau slice\n if (saved.slicePanelCollapsed !== undefined) this._slicePanelCollapsed = saved.slicePanelCollapsed;\n // Slices statiques cachées — on utilise la valeur exacte sauvegardée (pas les defaults de config)\n if (saved.hiddenSliceKeys !== undefined) {\n this._staticSliceHiddenKeys = new Set(saved.hiddenSliceKeys);\n this._organizer.updateHiddenStaticKeys(this._staticSliceHiddenKeys);\n }\n // Colonnes visibles + ordre — reconstruit activeFields en une seule passe.\n // On part de saved.columnOrder (ordre sauvegardé) si disponible, sinon saved.visibleColumns.\n // Cela gère à la fois : colonnes optionnelles ajoutées, colonnes retirées, et réordonnancement.\n const targetKeys = saved.columnOrder ?? saved.visibleColumns;\n if (targetKeys?.length) {\n const allByKey = new Map((this.resolvedConfig.columns ?? []).map(c => [c.key, c]));\n // Colonnes dans l'ordre sauvegardé (on ne garde que celles connues de la config)\n const ordered = targetKeys\n .map(key => allByKey.get(key))\n .filter((c): c is TableColumnProvider<T> => c !== undefined);\n // Colonnes actives actuelllement non présentes dans targetKeys (non-optional passées sous silence)\n // → on les exclut : l'utilisateur avait explicitement choisi ce sous-ensemble\n if (ordered.length > 0) {\n this._organizer.setActiveFields(ordered);\n }\n }\n // Filtres actifs du slice panel\n // Filtres actifs du slice panel — toujours stockés en pending :\n // appliqués par _applyPendingDynamicSliceKeys (si dynamic slices) ou\n // par _recomputeShowSlicePanel (quand les données arrivent et rendent le panel visible)\n if (saved.sliceFilters && Object.keys(saved.sliceFilters).length) {\n this._pendingSliceFilters = saved.sliceFilters;\n }\n\n const activeFilterColumnKeys = Object.entries(saved.sliceFilters ?? {})\n .filter(([key, values]) => key.startsWith('column:') && values.length > 0)\n .map(([key]) => key.slice('column:'.length));\n const staticSliceKeys = new Set(\n (this.resolvedConfig.slices ?? [])\n .map(slice => slice.columnKey)\n .filter((key): key is string => !!key)\n );\n const dynamicSliceKeys = new Set(this._organizer.sliceBy.allDynamicFields.map(field => field.key));\n\n // Un filtre persistant doit toujours retrouver sa slice : une préférence\n // ancienne ou incomplète ne peut pas laisser un filtre sans panneau visible.\n activeFilterColumnKeys\n .filter(key => staticSliceKeys.has(key))\n .forEach(key => this._staticSliceHiddenKeys.delete(key));\n this._organizer.updateHiddenStaticKeys(this._staticSliceHiddenKeys);\n\n // Une clé de filtre sur une colonne non statique désigne une slice dynamique.\n // Elle complète dynamicSliceKeys pour les configurations sauvegardées avant\n // que ce champ ne soit persistant.\n const persistedDynamicKeys = [\n ...(saved.dynamicSliceKeys ?? []),\n ...activeFilterColumnKeys,\n ];\n const uniqueDynamicKeys = [...new Set(persistedDynamicKeys)].filter(\n key => !staticSliceKeys.has(key) && dynamicSliceKeys.has(key)\n );\n if (uniqueDynamicKeys.length) {\n this._pendingDynamicSliceKeys = uniqueDynamicKeys;\n }\n }\n\n canRemoveColumn(column: TableColumnProvider<T>): boolean {\n return (\n this._organizer.allowFieldRemoval &&\n column.removable !== false &&\n this.activeFields.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 // ── Export CSV\n\n onExport(): void {\n this._export.export();\n }\n\n /** Capture les lignes et l'état actuellement visibles dans un snapshot autonome. */\n createVisualSnapshot(label = this.title || 'Tableau'): VisualSnapshotDraft {\n const warnings: string[] = [];\n if (containsFunction(this.resolvedConfig)) {\n warnings.push('Certaines fonctions de configuration ne sont pas transportables.');\n }\n return {\n type: 'table',\n label,\n config: cloneSerializable({\n title: this.title,\n columns: this.resolvedConfig.columns?.map(column => serializableColumn(column)),\n search: this.resolvedConfig.search,\n pagination: this.resolvedConfig.pagination,\n }),\n state: cloneSerializable({\n search: this.searchQuery,\n groupBy: this.activeGroupByKey,\n columnOrder: this.activeFields.map(column => column.key),\n visibleColumns: this.activeFields.map(column => column.key),\n pageIndex: this.paginator?.pageIndex ?? 0,\n pageSize: this.paginator?.pageSize ?? this.pageSize,\n }),\n data: cloneSerializable(this._allFilteredRows),\n warnings,\n };\n }\n\n /** Applique l'état compatible et retourne les données à fournir au composant cible. */\n applyVisualSnapshot(snapshot: VisualSnapshot): VisualSnapshotApplyResult {\n if (snapshot.type !== 'table') {\n return { applied: false, restored: [], skipped: ['type'], warnings: ['Le snapshot n\\'est pas un tableau.'] };\n }\n\n const state = snapshot.state as {\n search?: string;\n groupBy?: string | null;\n visibleColumns?: string[];\n columnOrder?: string[];\n columnWidths?: Record<string, number>;\n };\n const available = new Map((this.resolvedConfig.columns ?? []).map(column => [column.key, column]));\n const requestedKeys = state.columnOrder ?? state.visibleColumns ?? [];\n const compatibleKeys = requestedKeys.filter(key => available.has(key));\n const skipped = requestedKeys.filter(key => !available.has(key));\n const restored: string[] = [];\n\n if (compatibleKeys.length) {\n this._organizer.setActiveFields(compatibleKeys.map(key => available.get(key)!));\n restored.push('columns');\n this.refreshViewModel();\n }\n if (typeof state.search === 'string') {\n this.searchQuery = state.search;\n restored.push('search');\n }\n if (state.groupBy === null || typeof state.groupBy === 'string') {\n const groupKey = state.groupBy && available.has(state.groupBy) ? state.groupBy : null;\n this.setGroupByAndEmit(groupKey);\n restored.push('groupBy');\n }\n if (state.columnWidths) {\n this._columnWidths = { ...state.columnWidths };\n restored.push('columnWidths');\n }\n this.refreshViewModel();\n return {\n applied: true,\n restored,\n skipped,\n warnings: snapshot.warnings ?? [],\n data: cloneSerializable(snapshot.data),\n };\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\n if (!this._initialSlicePanelCollapsedApplied) {\n this._slicePanelCollapsed = this.resolvedConfig.slicePanelCollapsed === true;\n this._initialSlicePanelCollapsedApplied = true;\n }\n\n // ── Initialiser le gestionnaire de préférences si l'option est activée\n const prefsId = this.resolvedConfig.preferences?.enabled\n ? this.resolvedConfig.preferences.tableId\n : null;\n const currentId = prefsId ?? null;\n // Préférences à appliquer après _organizer.update() (quand activeFields est déjà peuplé)\n let pendingPrefs: import('../jquery-table.model').SavedTableConfig | null = null;\n if (currentId && this._preferencesManager?.key !== ('jqt_prefs_' + currentId)) {\n this._preferencesManager = new TablePreferencesManager(currentId);\n this._hasSavedConfig = this._preferencesManager.hasSaved();\n pendingPrefs = this._preferencesManager.load();\n } else if (!currentId) {\n this._preferencesManager = null;\n this._hasSavedConfig = false;\n }\n\n // Délègue à la facade : mise à jour de l'état View (colonnes, groupBy meta, sliceBy meta)\n this._organizer.update({\n config: this._organizerViewConfig(),\n fields: this.resolvedConfig.columns ?? [],\n sliceConfigs: this.resolvedConfig.slices ?? [],\n defaultGroupBy: this.resolvedConfig.defaultGroupBy,\n });\n\n if (!pendingPrefs && !this._defaultGroupByApplied && !this._organizer.groupBy.userCustomized && this._organizer.groupBy.activeKey != null) {\n this._defaultGroupByApplied = true;\n this._groupBy.setDefaultCollapsed(true);\n this._groupBy.reset();\n this._groupBy.groupPageSize = this.resolveDefaultGroupPageSize();\n this.groupByChange.emit(this._organizer.groupBy.activeKey);\n }\n\n // Synchronise la propriété stable (évite NG0100 — la facade est source de vérité)\n this.activeFields = this._organizer.fields.activeFields;\n\n this.renderedColumns = this.activeFields.map(c => c.key);\n this.emitColumnsChangeIfNeeded();\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 // Réinitialise _staticSliceHiddenKeys seulement si les clés hidden de la config ont vraiment changé\n // ET qu'il n'y a pas de préférences sauvegardées (qui géreront hiddenSliceKeys elles-mêmes).\n const newConfigHidden = new Set<string>(\n (this.resolvedConfig.slices ?? []).filter(s => s.hidden && s.columnKey).map(s => s.columnKey!)\n );\n if (!TableComponent._setsEqual(newConfigHidden, this._configHiddenKeys)) {\n this._configHiddenKeys = newConfigHidden;\n // N'écraser _staticSliceHiddenKeys que si on n'est PAS en train d'appliquer des prefs\n // (pendingPrefs les gèrera lui-même via _applyPreferences → hiddenSliceKeys)\n if (!pendingPrefs) {\n this._staticSliceHiddenKeys = new Set(newConfigHidden);\n this._organizer.updateHiddenStaticKeys(this._staticSliceHiddenKeys);\n }\n }\n\n // Applique les préférences ICI, APRÈS _organizer.update() ET après _configHiddenKeys mis à jour,\n // mais avant _computeSliceConfigs() pour que hiddenSliceKeys soit déjà restauré.\n if (pendingPrefs) {\n this._applyPreferences(pendingPrefs);\n this.activeFields = this._organizer.fields.activeFields;\n this.renderedColumns = this.activeFields.map(c => c.key);\n this.emitColumnsChangeIfNeeded();\n }\n\n // Propriétés stables pour les bindings du template\n // On recalcule _sliceConfigs en reflétant l'état courant des slices cachées,\n // pour que SlicePanelComponent.ngOnInit reçoive la bonne valeur de `hidden`\n // même quand le composant est créé pour la 1ère fois après un toggle.\n this._setSliceConfigs(this._computeSliceConfigs());\n this._sliceColumns = this.resolvedConfig.columns ?? [];\n this._sliceData = this._resolvedData;\n this._sliceShowToggle = this.resolvedConfig.enableSliceToggle !== false;\n this._recomputeShowSlicePanel();\n if (!this._activeSort.active && this.resolvedConfig.defaultSort) {\n this._matSortActive = this.resolvedConfig.defaultSort.active;\n this._matSortDirection = this.resolvedConfig.defaultSort.direction;\n }\n this._buildSliceByMenuItems();\n\n this._requestLazyColumns();\n this._scheduleRender();\n }\n\n /** Retourne uniquement les slices visibles (non cachées par _staticSliceHiddenKeys).\n * Le SlicePanelComponent affiche tout ce qu'il reçoit — c'est ici que se fait le filtrage. */\n private _computeSliceConfigs(): SliceConfig<T>[] {\n return (this.resolvedConfig.slices ?? []).filter(\n s => !s.columnKey || !this._staticSliceHiddenKeys.has(s.columnKey)\n );\n }\n\n private static _setsEqual(a: Set<string>, b: Set<string>): boolean {\n if (a.size !== b.size) return false;\n for (const v of a) if (!b.has(v)) return false;\n return true;\n }\n\n private _buildSliceByMenuItems(): void {\n const staticSliceMap = new Map(this._staticSlicesForMenu.map(s => [s.key, s]));\n const dynamicSliceSet = new Set(this._allDynamicSliceColumns.map(c => c.key));\n const seen = new Set<string>();\n const items: Array<{ isStatic: boolean; key: string; title: string; icon?: string; col?: TableColumnProvider<T> }> = [];\n for (const col of this.resolvedConfig.columns ?? []) {\n if (seen.has(col.key)) continue;\n if (staticSliceMap.has(col.key)) {\n const s = staticSliceMap.get(col.key)!;\n items.push({ isStatic: true, key: s.key, title: s.title, icon: s.icon });\n seen.add(col.key);\n } else if (dynamicSliceSet.has(col.key)) {\n items.push({ isStatic: false, key: col.key, title: this.colLabel(col), icon: col.icon, col });\n seen.add(col.key);\n }\n }\n for (const s of this._staticSlicesForMenu) {\n if (!seen.has(s.key)) {\n items.push({ isStatic: true, key: s.key, title: s.title, icon: s.icon });\n }\n }\n this._sliceByMenuItems = items;\n this._invalidateOrganizerConfig(); // les slices ont changé\n }\n\n get sliceByMenuItems() { return this._sliceByMenuItems; }\n\n onSliceMenuItemClick(item: { isStatic: boolean; key: string; col?: TableColumnProvider<T> }): void {\n if (item.isStatic) {\n this.toggleStaticSlice(item.key);\n } else if (item.col) {\n this.toggleDynamicSlice(item.col);\n }\n }\n\n isSliceMenuItemActive(item: { isStatic: boolean; key: string }): boolean {\n return item.isStatic ? this.isStaticSliceVisible(item.key) : this.isDynamicSliceActive(item.key);\n }\n\n private _scheduleRender(): void {\n if (this._pendingRender !== null) {\n clearTimeout(this._pendingRender);\n this._pendingRender = null;\n }\n this._ngZone.runOutsideAngular(() => {\n this._pendingRender = setTimeout(() => {\n this._pendingRender = null;\n this._ngZone.run(() => this._executeRender());\n }, 0);\n });\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(categoryRows);\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 // detectChanges() au lieu de markForCheck() : met à jour uniquement CE composant\n // sans déclencher un cycle CD global qui provoquerait NG0100 dans les parents.\n this._cdr.detectChanges();\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 = { [ROW_RAW_KEY]: row, [ROW_INDEX_KEY]: idx };\n this.activeFields.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 = this._normalizeColumns(\n config.columns ||\n this.columnsConfig ||\n this.resolveColumnsFromCompat(rows),\n );\n\n // Mode HTML : [view] prend le dessus sur config.view si fourni (Phase 3).\n const view = this.view ?? config.view;\n\n const autoTableId = config.preferences?.tableId || TableComponent._hashColumns((columns || []).map(c => c.key));\n const exportConfig: TableExportConfig<T> = {\n enabled: true,\n filename: autoTableId,\n ...config.export,\n };\n\n const prefsConfig: TablePreferencesConfig = {\n enabled: true,\n tableId: autoTableId,\n ...config.preferences,\n };\n\n return {\n ...config,\n columns,\n view,\n slices: config.slices || [],\n enableSliceToggle: config.enableSliceToggle ?? true,\n export: exportConfig,\n preferences: prefsConfig,\n };\n }\n\n /** Une colonne lazy est forcément optionnelle : `optional` est implicite, et `optional: false` est refusé. */\n private _normalizeColumns(columns: TableColumnProvider<T>[]): TableColumnProvider<T>[] {\n if (columns === this._columnsSource) return this._columnsNormalized!;\n const normalized = columns.map(column => this._withImpliedOptional(column));\n const result = normalized.some((column, index) => column !== columns[index]) ? normalized : columns;\n this._columnsSource = columns;\n this._columnsNormalized = result;\n return result;\n }\n\n private _withImpliedOptional(column: TableColumnProvider<T>): TableColumnProvider<T> {\n if (!column.lazy || column.optional) return column;\n if ((column as { optional?: boolean }).optional === false) {\n throw new Error(\n `[jquery-table] La colonne '${column.key}' est lazy : elle est forcément optionnelle (optional: true est implicite). `\n + 'optional: false la ferait demander dès le premier rendu, soit une requête de plus pour rien. '\n + 'Retirez optional: false, ou lazy: true si la colonne doit toujours être affichée.',\n );\n }\n let implied = this._optionalLazyColumns.get(column);\n if (!implied) {\n implied = { ...column, optional: true };\n this._optionalLazyColumns.set(column, implied);\n }\n return implied;\n }\n\n private applyConfigSearchReset(): void {\n const clearToken = this.resolvedConfig.clearSearchInput;\n const shouldClear = !!clearToken && clearToken !== this._lastConfigClearSearchInput;\n\n this._lastConfigClearSearchInput = clearToken;\n\n if (!shouldClear) {\n return;\n }\n\n this.searchQuery = '';\n this.onSearchChange();\n }\n\n private applyInitialSearchQuery(isFirstConfigChange = false): void {\n const initialQuery = this.resolvedConfig.search?.initialQuery;\n if (initialQuery === this._lastInitialSearchQuery\n && (this._initialSearchQueryApplied || !isFirstConfigChange)) {\n return;\n }\n\n this._lastInitialSearchQuery = initialQuery;\n this._initialSearchQueryApplied = true;\n const next = initialQuery ?? '';\n const changed = this.searchQuery !== next;\n this.searchQuery = next;\n if (changed) this.onSearchChange();\n else this._runSearch();\n }\n\n private static _hashColumns(keys: string[]): string {\n const str = keys.join('|');\n let h = 0x811c9dc5;\n for (let i = 0; i < str.length; i++) {\n h ^= str.charCodeAt(i);\n h = Math.imul(h, 0x01000193) >>> 0;\n }\n return h.toString(16).padStart(8, '0');\n }\n\n private resolveData(): T[] {\n if (this._loaderRows) {\n return this._loaderRows;\n }\n\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 const restrictedKeys = this.resolvedConfig.search?.searchColumns;\n const searchCols = restrictedKeys?.length\n ? [...this._columnMap.values()].filter(col => restrictedKeys.includes(col.key))\n : [...this._columnMap.values()];\n filtered = filtered.filter((row) =>\n searchCols.some((col) => {\n const val = this.getDisplayValueForSearch(col, 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 = { [ROW_RAW_KEY]: row, [ROW_INDEX_KEY]: index };\n this.activeFields.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 const key = groupLazyStatus === 'error' ? GROUP_KEY_LAZY_ERROR : GROUP_KEY_LAZY_LOADING;\n return [{ [GROUP_HEADER_MARKER]: true, [ROW_GROUP_KEY]: key, [ROW_GROUP_COUNT]: rows.length, [ROW_GROUP_PAGE]: 0, [ROW_GROUP_PAGE_COUNT]: 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._groupCache !== null &&\n this._groupCache.rows === rows &&\n this._groupCache.key === groupKey &&\n this._groupCache.sortOrder === this._groupBy.groupSortOrder &&\n this._groupCache.sortActive === (effectiveSort.active ?? '') &&\n this._groupCache.sortDir === (effectiveSort.direction ?? '');\n\n let groupOrder: string[];\n let groupMap: Map<string, T[]>;\n\n if (cacheValid) {\n groupOrder = this._groupCache!.order;\n groupMap = this._groupCache!.map;\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 const fastCompareFn = this._buildCachedSortComparator(rows, effectiveSort);\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._groupBy.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._groupCache = {\n rows,\n key: groupKey,\n sortOrder: this._groupBy.groupSortOrder,\n sortActive: effectiveSort.active ?? '',\n sortDir: effectiveSort.direction ?? '',\n order: groupOrder,\n map: groupMap,\n };\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 [{ [GROUP_HEADER_MARKER]: true, [ROW_GROUP_KEY]: GROUP_KEY_TOO_MANY, [ROW_GROUP_COUNT]: groupOrder.length, [ROW_GROUP_PAGE]: 0, [ROW_GROUP_PAGE_COUNT]: 1 }];\n }\n\n const pageSize = this.groupPageSize;\n const result: any[] = [];\n const rowIndexes = new Map<T, number>();\n rows.forEach((row, index) => rowIndexes.set(row, index));\n\n groupOrder.forEach((groupValue) => {\n const groupRows = groupMap.get(groupValue)!;\n const totalCount = groupRows.length;\n const currentPage = pageSize === 0 ? 0 : this._groupBy.getPage(groupValue);\n const pageCount = pageSize === 0 ? 1 : Math.max(1, Math.ceil(totalCount / pageSize));\n const collapsed = this.isGroupCollapsed(groupValue);\n\n result.push({ [GROUP_HEADER_MARKER]: true, [ROW_GROUP_KEY]: groupValue, [ROW_GROUP_COUNT]: totalCount, [ROW_GROUP_PAGE]: currentPage, [ROW_GROUP_PAGE_COUNT]: 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) => {\n const idx = rowIndexes.get(row) ?? 0;\n const projected: any = { [ROW_RAW_KEY]: row, [ROW_INDEX_KEY]: idx, [ROW_GROUP_KEY]: groupValue };\n this.activeFields.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 /** Comparateur dont les valeurs de tri sont calculées une seule fois par ligne. */\n private _buildSortComparator(rows: T[]): ((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 return this._buildCachedSortComparator(rows, sort);\n }\n\n private _buildCachedSortComparator(\n rows: T[],\n sort: TableSortState,\n ): ((a: T, b: T) => number) | null {\n if (!sort.active || !sort.direction) return null;\n const sortKey = sort.active;\n const sortDirection: 'asc' | 'desc' = sort.direction;\n const sortValueCache = new Map<T, unknown>();\n rows.forEach(row => sortValueCache.set(row, this.getLazyAwareValue(sortKey, row)));\n return (left: T, right: T): number => this._applySortDirection(\n this._compareSortValues(sortValueCache.get(left), sortValueCache.get(right)),\n sortDirection,\n );\n }\n\n private static readonly _collator = new Intl.Collator('fr', { sensitivity: 'accent', numeric: true });\n\n private _compareSortValues(left: unknown, right: unknown): number {\n if (typeof left === 'number' && typeof right === 'number') {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n }\n if (left instanceof Date && right instanceof Date) {\n return Math.sign(left.getTime() - right.getTime()) || 0;\n }\n\n return TableComponent._collator.compare(this._normalizeSortValue(left), this._normalizeSortValue(right));\n }\n\n private _normalizeSortValue(value: any): string {\n return value == null ? '' : String(value);\n }\n\n private _applySortDirection(comparison: number, direction: 'asc' | 'desc'): number {\n return direction === 'asc' ? comparison : -comparison;\n }\n\n /**\n * Retourne la valeur telle qu'elle est affichée dans la cellule, en suivant exactement\n * le même chemin que resolveCellValue — utilisée pour la recherche plein-texte.\n * Ne passe pas par sortValue (valeur brute de tri) contrairement à getLazyAwareValue.\n */\n private getDisplayValueForSearch(col: TableColumnProvider<T>, row: T): any {\n if (col.lazy && this._lazyColumnStatus.get(col.key) !== 'loaded') return null;\n if (col.searchValue) {\n return col.searchValue(row, 0);\n }\n const rawValue = col.value ? col.value(row, 0) : (row as any)?.[col.key];\n return normalizeCellValue(rawValue);\n }\n\n private getLazyAwareValue(columnKey: string, row: T): any {\n const colDef = this._columnMap.get(columnKey);\n if (colDef?.lazy && this._lazyColumnStatus.get(columnKey) !== 'loaded') {\n return null;\n }\n if (colDef?.sortValue) {\n return this._toSortInput(colDef.sortValue(row, 0));\n }\n if (colDef?.value) {\n return this._toSortInput(colDef.value(row, 0));\n }\n return (row as any)[columnKey];\n }\n\n /** Les nombres et les dates gardent leur type pour un tri correct ; le reste est normalisé en texte. */\n private _toSortInput(value: unknown): unknown {\n return typeof value === 'number' || value instanceof Date ? value : normalizeCellValue(value);\n }\n\n /** Les statuts de chargement lazy ne doivent jamais apparaître dans un fichier exporté. */\n private _resolveExportValue(col: TableColumnProvider<T>, row: T, index: number): any {\n const value = this.resolveCellValue(col, row, index);\n return value === LAZY_LOADING_VALUE || value === LAZY_ERROR_VALUE ? '' : value;\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);\n if (status === 'loading') return LAZY_LOADING_VALUE;\n if (status === 'error') return LAZY_ERROR_VALUE;\n if (!status) 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._userPageSize || 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 this._userPageSize = this.pageSize;\n this.pageChange.emit({ pageIndex: this.paginator!.pageIndex, 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.sortChange.emit({ active: this.sort.active, direction: this.sort.direction });\n this._scheduleRender();\n });\n }\n }\n}\n\nfunction serializableColumn<T>(column: TableColumnProvider<T>): Record<string, unknown> {\n return {\n key: column.key,\n header: column.header,\n icon: column.icon,\n sortable: column.sortable,\n removable: column.removable,\n optional: column.optional,\n width: column.width,\n groupable: column.groupable,\n sliceable: column.sliceable,\n lazy: !!column.lazy,\n };\n}\n","<section class=\"jquery-table-wrapper\">\n <output class=\"visual-copy-feedback\" *ngIf=\"copyFeedbackMessage\" aria-live=\"polite\">{{ copyFeedbackMessage }}</output>\n <header class=\"table-header\" *ngIf=\"showTitle\">\n <h3>{{ title }}</h3>\n </header>\n\n <div\n class=\"table-layout\"\n [class.no-slice]=\"!_showSlicePanel || _slicePanelCollapsed\"\n >\n <slice-panel\n [style.display]=\"!_showSlicePanel || _slicePanelCollapsed ? 'none' : null\"\n [sliceConfigs]=\"_sliceConfigs\"\n [columns]=\"_sliceColumns\"\n [data]=\"_sliceData\"\n [lazyStatus]=\"_lazyColumnStatus\"\n [showToggle]=\"_sliceShowToggle\"\n [collapsedByDefault]=\"_slicePanelCollapsed\"\n (filterChange)=\"onSliceFilterChange($event)\"\n (dynamicSliceKeysChange)=\"onDynamicSliceKeysChange($event)\"\n (collapsedChange)=\"onSlicePanelCollapsedChange($event)\"\n ></slice-panel>\n\n <div class=\"table-shell\" #tableShell>\n <div class=\"table-toolbar\" *ngIf=\"showToolbar\">\n <div class=\"table-toolbar-left\">\n <button\n *ngIf=\"showSliceExpandBtn\"\n type=\"button\"\n class=\"slice-expand-btn\"\n [title]=\"i18n.expandFilterTitle\"\n (click)=\"expandSlicePanel()\"\n ><mat-icon class=\"slice-expand-mat-icon\">filter_list</mat-icon></button>\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]=\"i18n.searchPlaceholder\"\n [attr.aria-label]=\"i18n.searchPlaceholder\"\n autocomplete=\"off\"\n />\n <button *ngIf=\"searchQuery\" type=\"button\" class=\"search-clear-btn\" (click)=\"searchQuery = ''; onSearchChange()\">×</button>\n <span class=\"search-count\" *ngIf=\"!effectiveIsLoading\">{{ filteredRowCount }}</span>\n <div class=\"search-count-loader\" *ngIf=\"effectiveIsLoading\">\n <div class=\"spinner\"></div>\n </div>\n </div>\n </div>\n <div *ngIf=\"showOrganizerButton\" class=\"table-toolbar-right\">\n <table-organizer-button\n [config]=\"organizerConfig\"\n [state]=\"organizerState\"\n [hideMenuValues]=\"organizerHideMenuValues\"\n (viewChange)=\"onOrganizerViewChange($event)\">\n </table-organizer-button>\n </div>\n </div>\n\n <div class=\"table-body-wrapper\">\n\n <!-- Bannière message préférences -->\n <div *ngIf=\"_preferencesMessage\" class=\"preferences-message\">\n <mat-icon class=\"preferences-message-icon\">check_circle</mat-icon>\n <span>{{ _preferencesMessage }}</span>\n </div>\n\n <!-- Bouton de confirmation du mode édition -->\n <button\n *ngIf=\"_editMode\"\n type=\"button\"\n class=\"edit-confirm-btn\"\n [title]=\"i18n.preferencesConfirmEdit\"\n (click)=\"confirmEditMode()\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n <div class=\"table-body-scroll\" #tableBodyScroll>\n <table mat-table matSort [dataSource]=\"tableDataSource\" class=\"jquery-table\"\n [style.min-width]=\"tableMinWidth\"\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]=\"(!_editMode && column.sortable !== false) ? column.key : ''\"\n [disabled]=\"_editMode || column.sortable === false\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.drag-enabled]=\"isColumnDragDropEnabled || _editMode\"\n [class.drop-target]=\"isHeaderDropTarget(column.key)\"\n [class.edit-mode-header]=\"_editMode\"\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 <button\n type=\"button\"\n *ngIf=\"isColumnDragDropEnabled || _editMode\"\n class=\"drag-handle\"\n draggable=\"true\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Réordonner la colonne ' + column.header\"\n (dragstart)=\"onHeaderDragStart(column.key, $event)\"\n (dragend)=\"onHeaderDragEnd()\"\n (keydown)=\"onHeaderKeyDown(column.key, $event)\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon>drag_indicator</mat-icon>\n </button>\n </div>\n <!-- Poignée de resize (visible uniquement en mode édition) -->\n <span\n *ngIf=\"_editMode\"\n class=\"col-resize-handle\"\n draggable=\"false\"\n (mousedown)=\"onResizeStart(column.key, $event)\"\n ></span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.edit-mode-cell]=\"_editMode\">\n <ng-container *ngIf=\"!_editMode; else editModeCellTpl\">\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)=\"$event.stopPropagation(); retryLazyColumns()\" [title]=\"i18n.lazyErrorTitle\">\n <span class=\"lazy-error-icon\">⚠</span>\n <span class=\"lazy-error-label\">{{ i18n.lazyRetry }}</span>\n </button>\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"getCellTemplate(column.key) as customTpl; else defaultCellTpl\">\n <ng-container *ngTemplateOutlet=\"customTpl; context: { $implicit: row[_ROW_RAW_KEY], index: row[_ROW_INDEX_KEY], value: row[column.key] }\"></ng-container>\n </ng-container>\n <ng-template #defaultCellTpl>\n <span class=\"cell-text\" [class.cell-empty]=\"isCellEmpty(row[column.key])\" [title]=\"asTitle(row[column.key])\">{{ isCellEmpty(row[column.key]) ? i18n.cellEmpty : row[column.key] }}</span>\n </ng-template>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-template #editModeCellTpl>\n <span class=\"cell-text cell-edit-mode\" [title]=\"asTitle(row[column.key])\">{{ row[column.key] }}</span>\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 && !_editMode ? 0 : null\"\n [attr.aria-label]=\"hasRowClickHandler && !_editMode ? rowActionLabel(row) : null\"\n [attr.aria-keyshortcuts]=\"hasRowClickHandler && !_editMode ? 'Enter Space' : null\"\n [ngClass]=\"getRowClass(row)\"\n [class.no-pointer]=\"!hasRowClickHandler || _editMode\"\n [class.edit-mode-row]=\"_editMode\"\n (click)=\"!_editMode && onRowClick(row, $event)\"\n (keydown.enter)=\"!_editMode && onRowClick(row, null)\"\n (keydown.space)=\"!_editMode && onRowClick(row, null); $event.preventDefault()\"\n ></tr>\n <ng-container [matColumnDef]=\"_GROUP_ROW_COLUMN\">\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[_ROW_GROUP_KEY])\" *ngIf=\"isNormalGroupRow(row)\">›</span>\n <span *ngIf=\"isNormalGroupRow(row)\" class=\"group-key-label\">{{ row[_ROW_GROUP_KEY] }}</span>\n <span *ngIf=\"isGroupRowLoading(row)\" class=\"lazy-skeleton group-lazy-key-skeleton\"></span>\n <button *ngIf=\"isGroupRowError(row)\" type=\"button\" class=\"lazy-error-btn\" (click)=\"retryGroupByColumn($event)\" [title]=\"i18n.lazyErrorTitle\">\n <span class=\"lazy-error-icon\">⚠</span>\n <span class=\"lazy-error-label\">{{ i18n.lazyRetry }}</span>\n </button>\n <span *ngIf=\"isGroupRowTooMany(row)\" class=\"group-too-many-label\">{{ i18n.groupTooMany(row[_ROW_GROUP_COUNT]) }}</span>\n <span class=\"group-count-badge\">{{ row[_ROW_GROUP_COUNT] }}</span>\n <div class=\"group-pagination\" *ngIf=\"!isGroupCollapsed(row[_ROW_GROUP_KEY]) && row[_ROW_GROUP_PAGE_COUNT] > 1\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] === 0\" (click)=\"groupPageBack(row[_ROW_GROUP_KEY])\">‹</button>\n <span class=\"group-page-info\">{{ row[_ROW_GROUP_PAGE] + 1 }} / {{ row[_ROW_GROUP_PAGE_COUNT] }}</span>\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] >= row[_ROW_GROUP_PAGE_COUNT] - 1\" (click)=\"groupPageForward(row[_ROW_GROUP_KEY], row[_ROW_GROUP_COUNT])\">›</button>\n </div>\n </div>\n </td>\n </ng-container>\n <tr mat-row *matRowDef=\"let row; columns: [_GROUP_ROW_COLUMN]; when: isGroupHeader\"\n class=\"group-header-row\"\n [class.group-header-loading]=\"isGroupRowLoading(row)\"\n [class.group-header-error]=\"isGroupRowError(row)\"\n [class.group-header-too-many]=\"isGroupRowTooMany(row)\"\n [attr.data-group-key]=\"row[_ROW_GROUP_KEY]\"\n [attr.tabindex]=\"isNormalGroupRow(row) ? 0 : null\"\n [attr.aria-expanded]=\"isNormalGroupRow(row) ? !isGroupCollapsed(row[_ROW_GROUP_KEY]) : null\"\n (click)=\"onGroupHeaderClick(row)\"\n (keydown.enter)=\"onGroupHeaderClick(row)\"\n (keydown.space)=\"onGroupHeaderClick(row); $event.preventDefault()\"></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\" [class.is-loading]=\"effectiveIsLoading\" *ngIf=\"showPagination\">\n <mat-paginator\n [length]=\"totalRows\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [showFirstLastButtons]=\"resolvedPaginationShowFirstLastButtons\"\n ></mat-paginator>\n <div class=\"paginator-range-loader\" \n [class.paginator-range-loader--no-first-last]=\"!resolvedPaginationShowFirstLastButtons\"\n *ngIf=\"effectiveIsLoading\">\n <div class=\"spinner\"></div>\n </div>\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 {{ i18n.groupRemove }}\n </button>\n <div class=\"group-bar-separator\"></div>\n <div class=\"group-sort-controls\">\n <span class=\"group-sort-label\">{{ i18n.groupSortLabel }}</span>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'asc'\" (click)=\"onGroupSortToggle('asc')\" [title]=\"i18n.groupSortAsc\">\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]=\"i18n.groupSortDesc\">\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\">{{ i18n.groupRowsPerGroup }}</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 ? i18n.groupShowAll : groupPageSize }}</mat-select-trigger>\n <mat-option *ngFor=\"let opt of pageSizeOptionsGroupBy\" [value]=\"opt\">{{ opt }}</mat-option>\n <mat-option [value]=\"0\">{{ i18n.groupShowAll }}</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/snapshot-table-config';\nexport * from './lib/jqt-i18n.token';\nexport * from './lib/component/table.component';\nexport * from './lib/component/organizer-button/organizer-button.component';\nexport { SliceConfig, SliceColumnDef, SliceCategory, SlicePanelComponent } from '@oneteme/jquery-organizer';\nexport { OrganizerButtonComponent, OrganizerConfig, OrganizerButtonEvent, OrganizerState } from '@oneteme/jquery-organizer';\nexport * from './lib/directive/jqt-cell-def.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}