UNPKG

@edugouvfr/ngx-dsfr-ext

Version:

NgxDsfrExt est une extension au package @edugouvfr/ngx-dsfr (portage Angular des éléments DSFR)

1,110 lines 86.9 kB
import * as i0 from '@angular/core';
import { ViewEncapsulation, Component, EventEmitter, inject, NgZone, HostListener, Directive, ElementRef, forwardRef, booleanAttribute, Input, ViewChild, Output, ContentChild, ChangeDetectionStrategy, NgModule } from '@angular/core';
import * as i2 from '@edugouvfr/ngx-dsfr';
import { DsfrButtonModule, DsfrFormSelectModule, DsfrI18nService, newUniqueId, Language, DsfrPaginationModule, DsfrTableFooterComponent } from '@edugouvfr/ngx-dsfr';
import * as i1 from '@angular/forms';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import * as i1$1 from '@angular/common';
import { CommonModule } from '@angular/common';
import { AgGridAngular } from 'ag-grid-angular';
import { ModuleRegistry, AllCommunityModule } from 'ag-grid-community';
import { EMPTY, ReplaySubject } from 'rxjs';
import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';

class DsfrButtonCellGridComponent {
    agInit(params) {
        this.id = params.id;
        this.params = params;
        this.label = params.label;
        this.size = params.size;
        this.icon = params.icon;
        this.tooltipMessage = params.tooltipMessage;
        this.ariaLabel = params.ariaLabel;
        this.customClass = params.customClass;
        this.iconPosition = params.iconPosition;
        this.ariaControls = params.ariaControls;
    }
    refresh(params) {
        return true;
    }
    /**
     * Permet d'appeler la méthode définie sur le bouton en passant les données de la ligne
     * @param $event Event lié au clic sur le bouton
     */
    onClick($event) {
        if (this.params.onClick instanceof Function) {
            const params = {
                event: $event,
                rowData: this.params.node.data,
            };
            this.params.onClick(params);
        }
    }
    static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: DsfrButtonCellGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
    static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.24", type: DsfrButtonCellGridComponent, isStandalone: true, selector: "dsfr-button-cell-grid", ngImport: i0, template: `<dsfr-button
    [id]="id"
    [icon]="icon"
    [label]="label"
    [iconPosition]="iconPosition"
    [ariaLabel]="ariaLabel"
    [customClass]="customClass"
    [tooltipMessage]="tooltipMessage"
    [ariaControls]="ariaControls"
    [buttonSize]="size ?? 'MD'"
    (click)="onClick($event)"
    variant="secondary"></dsfr-button>`, isInline: true, styles: [".ag-cell-value .fr-btn{margin:0 .25rem;vertical-align:sub}\n"], dependencies: [{ kind: "ngmodule", type: DsfrButtonModule }, { kind: "component", type: i2.DsfrButtonComponent, selector: "dsfr-button", inputs: ["label", "type", "tooltipMessage", "variant", "buttonSize", "icon", "iconPosition", "disabled", "uppercase", "loader", "ariaLabel", "invertedOutlineContrast", "id", "buttonId", "ariaControls", "ariaPressed", "ariaHasPopup", "ariaExpanded", "ariaHidden", "tabIndex", "customClass", "buttonRole", "labelSrOnly", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: DsfrButtonCellGridComponent, decorators: [{
            type: Component,
            args: [{ selector: 'dsfr-button-cell-grid', template: `<dsfr-button
    [id]="id"
    [icon]="icon"
    [label]="label"
    [iconPosition]="iconPosition"
    [ariaLabel]="ariaLabel"
    [customClass]="customClass"
    [tooltipMessage]="tooltipMessage"
    [ariaControls]="ariaControls"
    [buttonSize]="size ?? 'MD'"
    (click)="onClick($event)"
    variant="secondary"></dsfr-button>`, encapsulation: ViewEncapsulation.None, imports: [DsfrButtonModule], styles: [".ag-cell-value .fr-btn{margin:0 .25rem;vertical-align:sub}\n"] }]
        }] });

class DsfrSelectFilterComponent {
    constructor() {
        this.options = [];
    }
    agInit(params) {
        this.params = params;
        this.label = params.label;
        this.options = params.options;
    }
    onParentModelChanged(parentModel) {
        // When the filter is empty we will receive a null value here
        if (!parentModel) {
            this.currentValue = undefined;
        }
        else {
            this.currentValue = parentModel.filter;
        }
    }
    onSelectChanged() {
        if (!this.currentValue) {
            // Remove the filter
            this.params.parentFilterInstance((instance) => {
                instance.onFloatingFilterChanged(null, null);
            });
            return;
        }
        //this.currentValue = Number(this.currentValue);
        this.params.parentFilterInstance((instance) => {
            instance.onFloatingFilterChanged('equals', this.currentValue);
        });
    }
    static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: DsfrSelectFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
    static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.24", type: DsfrSelectFilterComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: `<dsfr-form-select
    [inputId]="params.id"
    [(ngModel)]="currentValue"
    [placeholder]="params.placeholder ?? ''"
    [options]="options"
    (selectChange)="onSelectChanged()">
    <ng-container label
      ><span class="fr-sr-only"> {{ label }}</span>
    </ng-container>
  </dsfr-form-select>`, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: DsfrFormSelectModule }, { kind: "component", type: i2.DsfrFormSelectComponent, selector: "dsfr-form-select", inputs: ["placeholder", "required", "ariaLabel", "ariaInvalid", "labelSrOnly", "options", "placeHolder", "value", "compareWith"], outputs: ["selectChange"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: DsfrSelectFilterComponent, decorators: [{
            type: Component,
            args: [{
                    imports: [FormsModule, ReactiveFormsModule, DsfrFormSelectModule],
                    template: `<dsfr-form-select
    [inputId]="params.id"
    [(ngModel)]="currentValue"
    [placeholder]="params.placeholder ?? ''"
    [options]="options"
    (selectChange)="onSelectChanged()">
    <ng-container label
      ><span class="fr-sr-only"> {{ label }}</span>
    </ng-container>
  </dsfr-form-select>`,
                }]
        }] });

var DsfrGridModeConst;
(function (DsfrGridModeConst) {
    DsfrGridModeConst["CLIENT"] = "client";
    DsfrGridModeConst["SERVER"] = "server";
})(DsfrGridModeConst || (DsfrGridModeConst = {}));
/**
 * Datasource pour implémentation de la pagination coté backend de Ag-grid community
 * cf: https://medium.com/weekly-webtips/tech-building-reusable-server-side-pagination-for-ag-grid-in-angular-c8127e2da346
 * et https://www.ag-grid.com/javascript-data-grid/infinite-scrolling/
 *  */
class EduRemoteAgGridApi {
}

/**
 * Directive pour l'implémentation de la pagination coté backend de Ag-grid community
 * cf: https://medium.com/weekly-webtips/tech-building-reusable-server-side-pagination-for-ag-grid-in-angular-c8127e2da346
 */
class EduRemoteAgGridDirective {
    constructor() {
        this.remoteGridReady = new EventEmitter();
        // DOC: https://www.ag-grid.com/javascript-data-grid/infinite-scrolling/#datasource-interface
        this.dataSource = {
            getRows: (params) => {
                this.zone.run(() => {
                    // force event to run inside angular zone for detection (#fix 31.0.2)
                    this.host.prepareUpdateData(params);
                });
                this.host.result$?.subscribe({
                    next: (e) => {
                        params.successCallback(e.data, e.totalRecords);
                    },
                    error: (error) => {
                        this.handleError(error);
                    },
                });
            },
        };
        this.host = inject(EduRemoteAgGridApi);
        this.zone = inject(NgZone);
    }
    // https://www.ag-grid.com/angular-data-grid/grid-events/
    /**
     * Initialisation grid
     * @param grid
     */
    gridReady(grid) {
        grid.api.setGridOption('datasource', this.dataSource);
        this.remoteGridReady.emit(grid);
    }
    handleError(err) {
        this.host.getDataError && this.host.getDataError(err);
        return EMPTY;
    }
    static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: EduRemoteAgGridDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
    static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.24", type: EduRemoteAgGridDirective, isStandalone: true, selector: "[remoteAgGridBinding]", host: { listeners: { "gridReady": "gridReady($event)" } }, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: EduRemoteAgGridDirective, decorators: [{
            type: Directive,
            args: [{
                    selector: '[remoteAgGridBinding]',
                    standalone: true,
                }]
        }], propDecorators: { gridReady: [{
                type: HostListener,
                args: ['gridReady', ['$event']]
            }] } });

const AG_GRID_LOCALE_FR = {
    // Set Filter
    selectAll: '(Tout sélectionner)',
    selectAllSearchResults: '(Sélectionner tous les résultats)',
    addCurrentSelectionToFilter: 'Ajouter la sélection courante au filtre',
    searchOoo: 'Rechercher...',
    blanks: '(Blancs)',
    noMatches: 'Aucun résultat',
    // Number Filter & Text Filter
    filterOoo: 'Filtre...',
    equals: 'Egal',
    notEqual: 'Différent de',
    blank: 'Vide',
    notBlank: 'Non vide',
    empty: 'Choisir',
    // Number Filter
    lessThan: 'Inférieur à',
    greaterThan: 'Supérieur à',
    lessThanOrEqual: 'Inférieur ou égal à',
    greaterThanOrEqual: 'Supérieur ou égal à',
    inRange: 'Fourchette',
    inRangeStart: 'entre',
    inRangeEnd: 'et',
    // Text Filter
    contains: 'Contient',
    notContains: 'Ne contient pas',
    startsWith: 'Commence par',
    endsWith: 'Finit par',
    // Date Filter
    dateFormatOoo: 'jj/mm/aaaa',
    before: 'Avant',
    after: 'Après',
    // Filter Conditions
    andCondition: 'ET',
    orCondition: 'OU',
    // Filter Buttons
    applyFilter: 'Appliquer',
    resetFilter: 'Réinitialiser',
    clearFilter: 'Vider',
    cancelFilter: 'Annuler',
    // Filter Titles
    textFilter: 'Filtre textuel',
    numberFilter: 'Filtre numérique',
    dateFilter: 'Filtre de date',
    setFilter: 'Appliquer le filtre',
    // Side Bar
    columns: 'Colonnes',
    filters: 'Filtres',
    // columns tool panel
    pivotMode: 'Mode Pivot',
    groups: 'Groupes de lignes',
    rowGroupColumnsEmptyMessage: 'Faites glisser ici pour définir les groupes de lignes',
    values: 'Valeurs',
    valueColumnsEmptyMessage: 'Faites glisser ici pour aggréger',
    pivots: 'Labels de colonnes',
    pivotColumnsEmptyMessage: 'Faites glisser ici pour définir les labels de colonnes',
    // Header of the Default Group Column
    group: 'Groupe',
    // Row Drag
    rowDragRow: 'ligne',
    rowDragRows: 'lignes',
    // Other
    loadingOoo: 'Chargement...',
    loadingError: 'ERREUR',
    noRowsToShow: 'Aucun résultat',
    enabled: 'Activé',
    // Group Column Filter
    groupFilterSelect: 'Sélectionner un champ:',
    // Menu
    pinColumn: 'Epingler la colonne',
    pinLeft: 'Epingler à gauche',
    pinRight: 'Epingler à droite',
    noPin: "Pas d'épingle",
    valueAggregation: "Valeur d'aggrégation",
    autosizeThiscolumn: 'Adapter la taille de cette colonne',
    autosizeAllColumns: 'Adapter la taille de toutes les colonnes',
    groupBy: 'Grouper par',
    ungroupBy: 'Dégrouper par',
    addToValues: 'Ajouter ${variable} aux valeurs',
    removeFromValues: 'Retirer ${variable} des valeurs',
    addToLabels: 'Ajouter ${variable} aux labels',
    removeFromLabels: 'Retirer ${variable} des labels',
    resetColumns: 'Réinitialiser les colonnes',
    expandAll: 'Développer tout',
    collapseAll: 'Fermer tout',
    copy: 'Copier',
    ctrlC: 'Ctrl + C',
    copyWithHeaders: 'Copier avec les en-têtes',
    copyWithGroupHeaders: 'Copier avec les en-têtes de groupes',
    paste: 'Coller',
    ctrlV: 'Ctrl + V',
    export: 'Exporter',
    csvExport: 'Export en CSV ',
    excelExport: 'Export au format Excel',
    noAggregation: 'Aucune',
    ungroupAll: 'Tout dégrouper',
    ctrlX: 'Ctrl+X',
    cut: 'Couper',
    columnFilter: 'Filtre de colonne',
    columnChooser: 'Choisir la colonne',
    sortAscending: 'Tri ascendant',
    sortDescending: 'Tri descendant',
    sortUnSort: 'Effacer le tri',
    // Enterprise Menu Aggregation and Status Bar
    sum: 'Somme',
    min: 'Min',
    max: 'Max',
    none: 'Aucun',
    count: 'Compte',
    avg: 'Moyenne',
    filteredRows: 'Filtré',
    selectedRows: 'Selectionné',
    totalRows: 'Nombre total de lignes',
    totalAndFilteredRows: 'Lignes',
    more: 'Plus',
    to: 'à',
    of: 'sur',
    page: 'Page',
    nextPage: 'Page suivante',
    lastPage: 'Dernière Page',
    firstPage: 'Premère Page',
    previousPage: 'Page précédente',
    pageSize: 'Nombre de résultats affichés par page',
    // Pivoting
    pivotColumnGroupTotals: 'Total',
    // ARIA
    ariaChecked: 'sélectionné',
    ariaColumn: 'colonne',
    ariaColumnGroup: 'Groupe de colonnes',
    ariaColumnFiltered: 'Colonne Filtrée',
    ariaColumnList: 'Liste de colonnes',
    ariaColumnSelectAll: 'Sélectionner toutes les colonnes',
    ariaDateFilterInput: 'Champ du filtre de date',
    ariaDefaultListName: 'Liste',
    ariaFilterColumnsInput: 'Champ du filtre des colonnes',
    ariaFilterFromValue: 'Filtrer à partir de la valeur',
    ariaFilterInput: '',
    ariaFilterList: 'Filtre de liste',
    ariaFilterToValue: 'Valeur du filtre "de"',
    ariaFilterValue: 'Valeur du filtre',
    ariaFilteringOperator: 'Opérateur de filtre',
    ariaHidden: 'masqué',
    ariaIndeterminate: 'indéterminé',
    ariaInputEditor: 'Editeur',
    ariaMenuColumn: 'Appuyez sur CTRL ENTREE pour ouvrir le menu de colonne.',
    ariaRowDeselect: 'Appuyez sur ESPACE pour déselectionner cette ligne',
    ariaRowSelectAll: 'Appuyez sur ESPACE pour activer la sélection de toutes les lignes',
    ariaRowToggleSelection: 'Appuyez sur ESPACE pour activer la sélection de ligne',
    ariaRowSelect: 'Appuyez sur ESPACE pour sélectionner cette ligne',
    ariaSearch: 'Rechercher',
    ariaSortableColumn: 'Appuyez sur ENTREE pour trier',
    ariaToggleVisibility: 'Appuyez sur ESPACE pour activer la visibilité',
    ariaUnchecked: 'désélectionné',
    ariaVisible: 'visible',
    ariaSearchFilterValues: 'Chercher les valeurs de filtres',
    ariaFilterMenuOpen: 'Ouvrir le menu de filtre',
    ariaFilterColumn: 'Appuyer sur CTRL ENTER pour ouvrir le filtre',
    ariaRowSelectionDisabled: 'La sélection est désactivée pour cette ligne',
    ariaToggleCellValue: 'Appuyez sur ESPACE pour changer la valeur de la cellule',
    ariaPageSizeSelectorLabel: 'Nombre de résultats affichés par page',
    ariaSkeletonCellLoadingFailed: 'Le chargement de la ligne a échoué',
    ariaSkeletonCellLoading: 'Chargement des données en cours',
    // ARIA Labels for Drop Zones
    ariaRowGroupDropZonePanelLabel: 'Groupes de lignes',
    ariaValuesDropZonePanelLabel: 'Valeurs',
    ariaPivotDropZonePanelLabel: 'Labels des colonnes',
    ariaDropZoneColumnComponentDescription: 'Appuyez sur SUPPR pour supprimer',
    ariaDropZoneColumnValueItemDescription: "Appuyez sur ENTREE pour changer le type d'aggregation",
    ariaDropZoneColumnGroupItemDescription: 'Appuyez sur ENTREE pour trier',
    // used for aggregate drop zone, format: {aggregation}{ariaDropZoneColumnComponentAggFuncSeperator}{column name}
    ariaDropZoneColumnComponentAggFuncSeperator: ' de ',
    ariaDropZoneColumnComponentSortAscending: 'croissant',
    ariaDropZoneColumnComponentSortDescending: 'décroissant',
    // ARIA Labels for Dialogs
    ariaLabelColumnMenu: 'Menu des colonnes',
    ariaLabelCellEditor: 'Editeur de cellule',
    ariaLabelDialog: 'Modale',
    ariaLabelSelectField: 'Sélectionner le champ',
    ariaLabelTooltip: 'Info-bulle',
    ariaLabelContextMenu: 'Menu contextuel',
    ariaLabelSubMenu: 'Sous-Menu',
    ariaLabelAggregationFunction: "Fonction d'aggrégation",
    ariaLabelColumnFilter: 'Filtre de colonne',
    // Number Format (Status Bar, Pagination Panel)
    thousandSeparator: ' ',
    decimalSeparator: ',',
    // Data types
    true: 'Vrai',
    false: 'Faux',
    invalidDate: 'Date invalide',
    invalidNumber: 'Nombre invalide',
    january: 'Janvier',
    february: 'Février',
    march: 'Mars',
    april: 'Avril',
    may: 'Mai',
    june: 'Juin',
    july: 'Juillet',
    august: 'Août',
    september: 'Septembre',
    october: 'Octobre',
    november: 'Novembre',
    december: 'Décembre',
    // Time formats
    timeFormatSlashesDDMMYYYY: 'JJ/MM/AAAA',
    timeFormatSlashesMMDDYYYY: 'MM/JJ/AAAA',
    timeFormatSlashesDDMMYY: 'JJ/MM/AA',
    timeFormatSlashesMMDDYY: 'MM/AA/AA',
    timeFormatDotsDDMYY: 'JJ.M.AA',
    timeFormatDotsMDDYY: 'M.JJ.AA',
    timeFormatDashesYYYYMMDD: 'AAAA-MM-JJ',
    timeFormatSpacesDDMMMMYYYY: 'JJ MMMM AAAA',
    timeFormatHHMMSS: 'HH:MM:SS',
    timeFormatHHMMSSAmPm: 'HH:MM:SS AM/PM',
};

// Ordre alphabétique requis
const MESSAGES_EN = {
    grid: {
        noData: 'No matching data',
        loading: 'Data loading...',
    },
};

// Ordre alphabétique requis
const MESSAGES_FR = {
    grid: {
        noData: 'Aucune donnée correspondante',
        loading: 'Chargement des données...',
    },
};

ModuleRegistry.registerModules([AllCommunityModule]);
class DsfrGridComponent {
    constructor() {
        /** Nombre d'éléments affichés par page */
        this.pageSize = 20;
        /** Mode de la grid: données côté client ou serveur (défaut client) */
        this.mode = DsfrGridModeConst.CLIENT;
        /** Options des colonnes par défaut (cf. https://www.ag-grid.com/angular-data-grid/column-properties/ ) */
        this.defaultColDef = {
            suppressHeaderMenuButton: true,
            sortable: true,
            filter: false,
            resizable: false,
            filterParams: {
                maxNumConditions: 1,
            },
        };
        /** Afficher un texte par-dessus la grid pendant le chargement */
        this.showLoadingOverlay = true;
        /** Id du template overlayNoRowsTemplate contenant le texte utilisé pour le aria-describedby */
        this.idNoRowsTemplate = 'no-data-container';
        /** Calcul dynamique de la hauteur des lignes pour afficher le contenu des cellules sur plusieurs lignes (uniquement utilisé en serverSide).
         * Déconseillé d'utiliser si le nombre de lignes par pages est élevé, peut causer des problèmes de performance d'affichage.
         */
        this.autoRowsHeight = false;
        /** Afficher le bouton d'action exporter au format CSV (uniqument si headerActionsTemplate non défini) */
        this.showExportCsv = false;
        /** Afficher la pagination */
        this.showPagination = true;
        /** Afficher le total de lignes */
        this.showFooterResult = true;
        /** Mise à jour et application du tri des colonnes */
        this.sortChanged = new EventEmitter();
        /** Callback apres l'initialisation de la grid, retourne l'accès à l'API de agGrid */
        this.gridReady = new EventEmitter();
        /** Callback avant la destruction de la grid (destruction du composant), permet de récuperer le state */
        this.gridPreDestroyed = new EventEmitter();
        /** Mise à jour et application des filtres */
        this.filterChanged = new EventEmitter();
        /** Sélection d'une cellule du tableau */
        this.cellSelect = new EventEmitter();
        /** Sélection ou déselection d'une ligne du tableau. Emission de l'évènement (RowSelectedEvent) et des noeuds sélectionnés (IRowNode[]) */
        this.rowSelect = new EventEmitter();
        /** La sélection des lignes a changé. Emission de l'évènement (SelectionChangedEvent) et des noeuds sélectionnés (IRowNode[]) */
        this.selectionChange = new EventEmitter();
        /** Indique une mise à jour nécessaire des données suite à un changement d'affichage (pagination, tri ou filtres). Si données côté serveur. */
        this.dataChange = new EventEmitter();
        /** Callback après changement de page */
        this.paginationChange = new EventEmitter();
        /** Callback après chaque changement des lignes affichées (modelUpdated) */
        this.dataRender = new EventEmitter();
        /** Callback après appel à l'api en cas d'erreur de celle-ci */
        this.dataFail = new EventEmitter();
        /** Evenement de fin d'édition d'une cellule */
        this.cellEditingStopped = new EventEmitter();
        /** Pagination */
        /** Choix de taille de page (par défaut 10, 20, 50, 100). Pas d'affichage du select si non défini */
        this.pageSizes = [
            {
                value: 10,
                label: '10 lignes par page',
            },
            {
                value: 20,
                label: '20 lignes par page',
            },
            {
                value: 50,
                label: '50 lignes par page',
            },
            {
                value: 100,
                label: '100 lignes par page',
            },
        ];
        /** @internal Total résultats*/
        this.totalElements = 0;
        /** @internal  Page courante*/
        this.currentPage = undefined;
        /** @internal Total pages */
        this.totalPage = 0;
        /** @internal Index de la première ligne affichée */
        this.startRow = 1;
        /** @internal Index de la première ligne affichée */
        this.endRow = 1;
        /** @internal */
        this.isLoadingServerSide = false;
        this.loading = false;
        this.selectable = false;
        /** @internal */
        this._resultSubject$ = new ReplaySubject(1);
        /** Nombre d'éléments visuellement affichés en mode serveur */
        this._nbElementsDisplayed = 0;
        this.i18n = inject(DsfrI18nService);
        this.gridId ??= newUniqueId();
        this.i18n.extendsLabelsBundle(Language.EN, MESSAGES_EN);
        this.i18n.extendsLabelsBundle(Language.FR, MESSAGES_FR);
        this.i18n.completeLangChange$.subscribe((code) => this.onLangChange(code));
    }
    /** @internal */
    get result$() {
        return this._resultSubject$.asObservable();
    }
    /** Données renvoyées par l'API */
    set result(value) {
        if (value && this.agGrid?.api) {
            this.totalElements = value.totalRecords;
            this.totalPage = this.calculateTotalPage();
            this._nbElementsDisplayed = value.data.length;
            this._resultSubject$.next(value);
            if (this.autoRowsHeight) {
                this.setHeightOnRows();
            }
            this.isLoadingServerSide = false;
            this.forceReloadOnNoData();
            this.loading = false;
            if (!this.gridOptions?.autoSizeStrategy) {
                this.agGrid.api.sizeColumnsToFit();
            }
            if (this.totalElements === 0) {
                this.agGrid.api.showNoRowsOverlay();
            }
        }
    }
    ngOnInit() {
        this.captionId = 'caption-' + newUniqueId();
        this.defaultColDef = {
            wrapText: this.autoRowsHeight ? true : false,
            filterParams: { maxNumConditions: 1, debounceMs: 1000 },
            suppressFloatingFilterButton: true,
            suppressHeaderMenuButton: true,
            suppressHeaderFilterButton: true,
            resizable: false,
            unSortIcon: true,
            ...this.defaultColDef,
        };
        // gestion de la navigation au clavier par défaut
        if (this.defaultColDef && !this.defaultColDef?.suppressKeyboardEvent)
            this.suppressCellKeyboardEvent();
        if (this.defaultColDef && !this.defaultColDef?.suppressHeaderKeyboardEvent)
            this.suppressHeaderKeyboardEvent();
        this.gridOptions = {
            rowModelType: 'infinite',
            pagination: this.showPagination,
            suppressContextMenu: true,
            paginationPageSize: this.pageSize,
            maxBlocksInCache: 1,
            domLayout: this.fixedHeight ? 'normal' : 'autoHeight',
            enableCellTextSelection: true,
            suppressPaginationPanel: true,
            ensureDomOrder: true,
            rowBuffer: 20,
            icons: {
                filter: '<i class="fr-icon-filter-line"></i>',
                sortAscending: '<i class="fr-icon-arrow-up-line"></i>',
                sortDescending: '<i class="fr-icon-arrow-down-line"></i>',
                sortUnSort: '<i class="fr-icon-arrow-up-down-line"></i> ',
            },
            onGridPreDestroyed: ($event) => this.onGridPreDestroyed($event),
            ...this.gridOptions,
            getRowId: this.rowId ? (rowParams) => this.getRowNodeId(rowParams) : undefined,
        };
        if (!this.initialState && this.gridOptions.initialState) {
            this.initialState = this.gridOptions.initialState;
        }
        this.selectable = !!this.gridOptions.rowSelection;
        this.initPagination();
        if (this.mode === DsfrGridModeConst.CLIENT) {
            this.gridOptions.rowModelType = 'clientSide';
        }
        else {
            this.gridOptions.cacheBlockSize = this.pageSize;
            this.isLoadingServerSide = true;
        }
    }
    /**
     * Au changement de paramètres des lignes affichées (pagination, filtre etc.), préparation des query params et envoi de l'evenement updateData
     * @param params IGetRowsParams paramètres modifiés
     * @internal
     */
    prepareUpdateData(params) {
        if (this.showLoadingOverlay)
            this.loading = true;
        // Paramètres de la pagination
        if (!this.currentPage && this.initialState) {
            // si c'est le premier chargement du tableau et initialState renseigné, on remet les paramètres
            this.restoreInitialStateServer(params);
        }
        this.currentPage = Math.floor(params.startRow / this.pageSize) + 1;
        const httpParams = { limit: this.pageSize, offset: params.startRow };
        // Ajout du tri
        if (params.sortModel && params.sortModel[0]) {
            this.addSort(params.sortModel, httpParams);
        }
        //Ajout des filtres
        if (params.filterModel) {
            this.addFilters(params.filterModel, httpParams);
        }
        this.dataChange.emit(httpParams);
    }
    /**
     * Erreur au retour de l'appel à l'api
     * @internal
     */
    getDataError(err) {
        this.loading = false;
        if (this.totalElements === 0) {
            this.agGrid.api.showNoRowsOverlay();
        }
        this.dataFail.emit(err);
    }
    /**
     * Modification et application du tri
     * @internal
     */
    onSortChange(e) {
        this.sortChanged.emit(e);
    }
    /**
     * Modification et application des filtres
     * @internal
     */
    onFilterChange(e) {
        this.filterChanged.emit(e);
    }
    /**@internal */
    onCellEditingStop(e) {
        this.cellEditingStopped.emit(e);
    }
    /**
     * Après mise à jour des données
     * @internal
     */
    onModelUpdated(e) {
        if (this.mode === DsfrGridModeConst.CLIENT) {
            this.loading = false;
        }
        else if (this.totalElements === 0) {
            this.loading = false;
            this.agGrid.api.showNoRowsOverlay();
        }
        this.dataRender.emit();
    }
    /**
     * Au redimensionnement de la fenêtre
     * @internal
     */
    onGridSizeChanged(e) {
        if (this.autoRowsHeight && this.mode !== DsfrGridModeConst.CLIENT) {
            // recalculer la hauteur des lignes
            this.setHeightOnRows();
        }
        // this.agGrid.api.sizeColumnsToFit(); disable  automatic resize for perfs
    }
    /**
     * Au redimensionnement d'une colonne
     * @internal
     */
    onColumnResized() {
        if (this.autoRowsHeight && this.mode !== DsfrGridModeConst.CLIENT) {
            // recalculer la hauteur des lignes
            this.setHeightOnRows();
        }
    }
    /**
     * Premier affichage des données
     * bug ag-grid: en mode infite + pagination + initialPagination, si le nombre de lignes a afficher est < a pageSize
     * des lignes vides s'affichent. Execution d'un double appel avec paginationGoToPage pour forcer un rendu correct
     * @internal
     */
    onFirstDataRendered() {
        if (!this.gridOptions?.autoSizeStrategy) {
            this.agGrid.api.sizeColumnsToFit();
        }
        if (this.currentPage && this.currentPage > 1 && this._nbElementsDisplayed < this.pageSize) {
            this.agGrid.api.paginationGoToPage(this.currentPage);
        }
    }
    /**
     * Initialisation de la grid
     * @param params
     * @internal
     */
    onGridReady(params) {
        this.agGrid.api = params.api;
        if (this.caption && this.captionId) {
            this.agGrid.api.setGridAriaProperty('labelledby', this.captionId);
        }
        this.gridReady.emit(this.agGrid.api);
    }
    /**
     * Evenement clic sur une cellule
     * @internal
     */
    onCellClicked(e) {
        this.cellSelect.emit(e);
    }
    /**
     * Evenement à la sélection ou déselection d'une ligne
     * @internal
     */
    onRowSelected(e) {
        this.rowSelect.emit({ event: e, selectedNodes: this.agGrid.api?.getSelectedNodes() });
    }
    /**
     * Evenement au changement de sélection
     * @internal
     */
    onSelectionChanged(e) {
        this.selectionChange.emit({ event: e, selectedNodes: this.agGrid.api?.getSelectedNodes() });
    }
    /**
     * Changement de page
     * @param e numéro de page
     * @internal
     */
    onPage(e) {
        this.agGrid.api.paginationGoToPage(e - 1);
        // Fix bug mode server avec initial page et retour a page 1
        if (this.agGrid.api.paginationGetCurrentPage() === 0 &&
            this.initialStatePagination &&
            this.initialStatePagination.page > 1) {
            this.initialStatePagination.page = 1;
            this.agGrid.api.refreshInfiniteCache();
        }
    }
    /**
     * @internal
     */
    onClickExportCsv() {
        this.agGrid.api.exportDataAsCsv();
    }
    /**
     * @internal
     */
    onChangePageSize(pageSize) {
        this.pageSize = pageSize;
        this.agGrid.api.updateGridOptions({
            paginationPageSize: this.pageSize,
            cacheBlockSize: this.pageSize,
        });
    }
    /**
     * @internal
     */
    onGridPreDestroyed(e) {
        if (e?.state?.pagination?.page) {
            // fix current page number base 1
            e.state.pagination.page = this.currentPage;
        }
        this.gridPreDestroyed.emit(e);
    }
    onPaginationChanged(e) {
        if (this.totalElements === 0) {
            this.agGrid.api.setGridAriaProperty('describedby', this.idNoRowsTemplate);
        }
        else {
            this.agGrid.api.setGridAriaProperty('describedby', null);
        }
        if (!this.showPagination) {
            this.totalElements = this.agGrid.api.getDisplayedRowCount();
        }
        else {
            this.totalElements = this.agGrid.api.paginationGetRowCount();
            this.totalPage = this.agGrid.api.paginationGetTotalPages();
            if (this.mode === DsfrGridModeConst.CLIENT)
                this.currentPage = this.agGrid.api.paginationGetCurrentPage() + 1;
        }
        this.paginationChange.emit(e);
    }
    calculateTotalPage() {
        return Math.ceil(this.totalElements / this.pageSize);
    }
    /* Retourne un identifiant unique selon la propriété définie par rowId */
    getRowNodeId(row) {
        if (!row.data || !this.rowId || !row.data[this.rowId]) {
            throw Error(`L'identifiant rowId '${this.rowId}' n'est pas défini pour une donnée`);
        }
        return row.data[this.rowId];
    }
    /** Ajout du tri aux query params */
    addSort(sortModel, httpParams) {
        httpParams.sort = sortModel;
        return httpParams;
    }
    /**
     * Ajout des filtres aux query params
     * @internal */
    addFilters(filterModel, httpParams) {
        httpParams.filters = filterModel;
    }
    /**
     * Remettre manuellement les paramètres de query en cas d'initialState
     * @param params query params
     */
    restoreInitialStateServer(params) {
        if (!this.initialState)
            return;
        if (this.initialState.pagination?.page) {
            params.startRow = (this.initialState.pagination.page - 1) * this.pageSize;
        }
        if (this.initialState.filter?.filterModel) {
            params.filterModel = this.initialState.filter.filterModel;
        }
        if (this.initialState.sort?.sortModel) {
            params.sortModel = this.initialState.sort.sortModel;
        }
    }
    /**
     * Détection du changement de langue depuis le service i18n (display)
     * @param code
     */
    onLangChange(code) {
        // si la langue n'est pas gérée (ni anglais ni francais), pas de traitement
        if (this.localeText && this.localeText !== 'fr' && this.localeText !== 'en')
            return;
        // sinon mis a jour en français ou anglais
        this.localeText = code === 'fr' ? AG_GRID_LOCALE_FR : undefined;
    }
    /**
     * Permettre d'afficher sur plusieurs lignes en mode serveur (equivalent autoHeight en mode client)
     * Calculer la dimension de chaque row par rapport à son contenu et recalculer la taille de la grille
     * globale (limitation ag-grid sur le mode infinite)
     */
    setHeightOnRows() {
        if (!this.grid || !this.grid.nativeElement)
            return;
        let gridHeight = 0;
        // Dans le cas des colonnes pinned les rows peuvent être divisées en 3 containers
        const containers = [
            this.grid.nativeElement.querySelector('.ag-center-cols-viewport'),
            this.grid.nativeElement.querySelector('.ag-pinned-left-cols-container'),
            this.grid.nativeElement.querySelector('.ag-pinned-right-cols-container'),
        ].filter((el) => !!el && el.querySelector('.ag-row'));
        const hasPinnedColumns = containers.length > 1;
        this.agGrid.api.forEachNode((node) => {
            let maxRowHeight = 0;
            // Calculer la hauteur maximale pour cette row sur tous les containers
            containers.forEach((container) => {
                const rowElements = this.getRowElementFromNode(node.id, container);
                rowElements.forEach((rowEl) => {
                    const cells = rowEl.getElementsByClassName('ag-cell-value');
                    const rowHeight = this.getMaxHeightOnRow(cells) + 10;
                    if (rowHeight > maxRowHeight)
                        maxRowHeight = rowHeight;
                    if (!hasPinnedColumns) {
                        this.transformRowHeight(rowEl, maxRowHeight, gridHeight);
                    }
                });
            });
            // Appliquer cette hauteur et position à tous les containers en cas de colonnes pinned
            if (hasPinnedColumns) {
                containers.forEach((container) => {
                    const rowElements = this.getRowElementFromNode(node.id, container);
                    rowElements.forEach((rowEl) => {
                        this.transformRowHeight(rowEl, maxRowHeight, gridHeight);
                    });
                });
            }
            gridHeight += maxRowHeight; // increment grid height
        });
        // Maj de la hauteur totale de la grille
        if (containers[0]) {
            containers[0].style.height = `${gridHeight}px`;
        }
    }
    transformRowHeight(rowEl, maxRowHeight, gridHeight) {
        rowEl.style.height = `${maxRowHeight}px`;
        rowEl.style.setProperty('transform', `translateY(${gridHeight}px)`);
    }
    getRowElementFromNode(nodeId, container) {
        return container.querySelectorAll(`.ag-row[row-id="${nodeId}"]`);
    }
    /**
     * Get max cell height needed on row
     * @param nodesCell each cells on row
     * @returns max height
     */
    getMaxHeightOnRow(nodesCell) {
        const maxHeight = Array.from(nodesCell)?.reduce((a, b) => (a.clientHeight > b.clientHeight ? a : b)).clientHeight;
        // set min height of 30px if row height is not defined
        return maxHeight && maxHeight > 31 ? maxHeight : 31;
    }
    /**
     * Redéfinir le focus pour les cellules possédant des éléments interactifs (focusables, ex. buttons)
     * Suppression de la gestion du focus par défaut de ag grid lorsque c'est le cas
     */
    suppressCellKeyboardEvent() {
        this.defaultColDef.suppressKeyboardEvent = (params) => {
            const e = params.event;
            return this.suppressDefaultKeyboardEvent(e, '.ag-cell');
        };
    }
    /**
     * Redéfinir le focus pour les cellules d'en-tête possédant des floatings filters avec éléments interactifs (focusables, ex. buttons)
     * Suppression de la gestion du focus par défaut de ag grid lorsque c'est le cas
     */
    suppressHeaderKeyboardEvent() {
        this.defaultColDef.suppressHeaderKeyboardEvent = (params) => {
            const e = params.event;
            return this.suppressDefaultKeyboardEvent(e, '.ag-floating-cell');
        };
    }
    suppressDefaultKeyboardEvent(e, classToSearch) {
        if (e.code == 'Tab' || e.key == 'Tab') {
            // get interactive children of cell
            const target = e.target;
            const focusableChildrenOfParent = target
                ?.closest(classToSearch)
                ?.querySelectorAll('button, [href], :not(.ag-hidden) > input[tabindex]:not([tabindex="-1"], select, textarea, [tabindex]:not([tabindex="-1"])');
            if (!focusableChildrenOfParent ||
                focusableChildrenOfParent.length == 0 ||
                (!e.shiftKey && target == focusableChildrenOfParent[focusableChildrenOfParent.length - 1]) ||
                (e.shiftKey && target == focusableChildrenOfParent[0]) ||
                (e.shiftKey && target.classList.contains('ag-cell'))) {
                return false; // if no interactive elements are present do not suppress
            }
            return true; // else suppress
        }
        return false; // do not suppress by default
    }
    /*
      Fix to force reload of ag-Grid data when no data is previously displayed (e.g., after applying a filter).
      The modelUpdated callback is not called the first time, and cacheBlockState remains in "no data" mode.
      ag-Grid bug on infite mode ? Inconvenience: Data is loaded twice in this case.
    */
    forceReloadOnNoData() {
        const cacheBlock = this.agGrid.api.getCacheBlockState();
        if ((!cacheBlock || Object.keys(cacheBlock).length === 0) && this.totalElements > 0) {
            this.agGrid.api.refreshInfiniteCache();
        }
    }
    initPagination() {
        this.pageSize =
            !this.pageSize && this.initialState?.pagination?.pageSize
                ? this.initialState?.pagination?.pageSize
                : this.pageSize;
        if (this.gridOptions)
            this.gridOptions.paginationPageSize = this.pageSize;
        this.initialStatePagination = {
            rowsPerPage: this.pageSize,
            page: this.initialState?.pagination?.page ?? 1, // l'indexation de la pagination doit commencer à 1 ici
            sort: null,
        };
    }
    static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: DsfrGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
    static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.24", type: DsfrGridComponent, isStandalone: true, selector: "dsfr-ext-ag-grid, dsfrx-ag-grid", inputs: { gridId: "gridId", columnDefs: "columnDefs", caption: "caption", pageSize: "pageSize", localeText: "localeText", mode: "mode", rowData: "rowData", defaultColDef: "defaultColDef", initialState: "initialState", customClass: "customClass", showLoadingOverlay: "showLoadingOverlay", loadingOverlayTemplate: "loadingOverlayTemplate", overlayNoRowsTemplate: "overlayNoRowsTemplate", idNoRowsTemplate: "idNoRowsTemplate", fixedHeight: "fixedHeight", autoRowsHeight: ["autoRowsHeight", "autoRowsHeight", booleanAttribute], gridOptions: "gridOptions", showExportCsv: ["showExportCsv", "showExportCsv", booleanAttribute], rowId: "rowId", showPagination: ["showPagination", "showPagination", booleanAttribute], showFooterResult: ["showFooterResult", "showFooterResult", booleanAttribute], pageSizes: "pageSizes", result: "result" }, outputs: { sortChanged: "sortChanged", gridReady: "gridReady", gridPreDestroyed: "gridPreDestroyed", filterChanged: "filterChanged", cellSelect: "cellSelect", rowSelect: "rowSelect", selectionChange: "selectionChange", dataChange: "dataChange", paginationChange: "paginationChange", dataRender: "dataRender", dataFail: "dataFail", cellEditingStopped: "cellEditingStopped" }, providers: [{ provide: EduRemoteAgGridApi, useExisting: forwardRef(() => DsfrGridComponent) }], queries: [{ propertyName: "footerResultsTemplate", first: true, predicate: ["footerResultsTemplate"], descendants: true, static: true }, { propertyName: "footerActionsTemplate", first: true, predicate: ["footerActionsTemplate"], descendants: true, static: true }, { propertyName: "headerActionsTemplate", first: true, predicate: ["headerActionsTemplate"], descendants: true, static: true }], viewQueries: [{ propertyName: "grid", first: true, predicate: ["grid"], descendants: true, read: ElementRef }, { propertyName: "agGrid", first: true, predicate: AgGridAngular, descendants: true }], ngImport: i0, template: "<!-- AG Grid Angular Component -->\n<div\n  class=\"edu-grid__wrapper fr-table\"\n  [class]=\"customClass ?? ''\"\n  [ngClass]=\"{ 'dsfrx-auto-height__server': autoRowsHeight, 'fr-table--selectable': selectable }\">\n  <!-- Header ------------------------------->\n  <div class=\"fr-table__header\">\n    <!-- Gestion du titre du tableau -->\n    @if (caption) {\n      <p [id]=\"captionId\" class=\"edu-grid__title\">\n        {{ caption }}\n      </p>\n    } @else {\n      <div [id]=\"captionId\" class=\"edu-grid__title\">\n        <ng-content select=\"[caption]\"></ng-content>\n      </div>\n    }\n    <!-- Template actions group\u00E9es -->\n    @if (headerActionsTemplate) {\n      <div class=\"edu-grid__actions\">\n        <ng-container *ngTemplateOutlet=\"headerActionsTemplate\"></ng-container>\n      </div>\n    } @else if (showExportCsv) {\n      <div class=\"edu-grid__actions\">\n        <dsfr-button\n          label=\"Exporter au format CSV\"\n          customClass=\"edu-grid__actions--export\"\n          (click)=\"onClickExportCsv()\"\n          variant=\"secondary\"></dsfr-button>\n      </div>\n    }\n  </div>\n\n  <!-- Client side-->\n  @if (mode === 'client') {\n    <ag-grid-angular\n      [rowData]=\"rowData\"\n      #grid\n      style=\"width: 100%\"\n      [id]=\"gridId\"\n      [ngStyle]=\"{ height: fixedHeight ? fixedHeight : '100%' }\"\n      [ngClass]=\"customClass\"\n      [columnDefs]=\"columnDefs\"\n      [defaultColDef]=\"defaultColDef\"\n      [initialState]=\"initialState\"\n      [gridOptions]=\"gridOptions\"\n      [loading]=\"loading\"\n      [overlayLoadingTemplate]=\"loadingOverlayTemplate\"\n      [overlayNoRowsTemplate]=\"overlayNoRowsTemplate\"\n      [suppressPaginationPanel]=\"true\"\n      [localeText]=\"localeText\"\n      [animateRows]=\"false\"\n      (columnResized)=\"onColumnResized()\"\n      (gridSizeChanged)=\"onGridSizeChanged($event)\"\n      (modelUpdated)=\"onModelUpdated($event)\"\n      (cellClicked)=\"onCellClicked($event)\"\n      (cellEditingStopped)=\"onCellEditingStop($event)\"\n      (filterChanged)=\"onFilterChange($event)\"\n      (paginationChanged)=\"onPaginationChanged($event)\"\n      (sortChanged)=\"onSortChange($event)\"\n      (rowSelected)=\"onRowSelected($event)\"\n      (selectionChanged)=\"onSelectionChanged($event)\"\n      (gridReady)=\"onGridReady($event)\"></ag-grid-angular>\n  } @else if (mode === 'server') {\n    <!-- Remote data-->\n    <ag-grid-angular\n      remoteAgGridBinding\n      #grid\n      style=\"width: 100%\"\n      [id]=\"gridId\"\n      [ngStyle]=\"{ height: fixedHeight ? fixedHeight : '100%' }\"\n      [ngClass]=\"customClass\"\n      [columnDefs]=\"columnDefs\"\n      [defaultColDef]=\"defaultColDef\"\n      [initialState]=\"initialState\"\n      [gridOptions]=\"gridOptions\"\n      [loading]=\"loading\"\n      [overlayLoadingTemplate]=\"loadingOverlayTemplate\"\n      [overlayNoRowsTemplate]=\"overlayNoRowsTemplate\"\n      [suppressPaginationPanel]=\"true\"\n      [localeText]=\"localeText\"\n      [animateRows]=\"false\"\n      (columnResized)=\"onColumnResized()\"\n      (firstDataRendered)=\"onFirstDataRendered()\"\n      (gridSizeChanged)=\"onGridSizeChanged($event)\"\n      (modelUpdated)=\"onModelUpdated($event)\"\n      (cellClicked)=\"onCellClicked($event)\"\n      (cellEditingStopped)=\"onCellEditingStop($event)\"\n      (filterChanged)=\"onFilterChange($event)\"\n      (sortChanged)=\"onSortChange($event)\"\n      (paginationChanged)=\"onPaginationChanged($event)\"\n      (rowSelected)=\"onRowSelected($event)\"\n      (selectionChanged)=\"onSelectionChanged($event)\"\n      (gridReady)=\"onGridReady($event)\"></ag-grid-angular>\n  }\n\n  <!-- Footer -->\n  @if (totalElements > 0 && !isLoadingServerSide) {\n    <dsfr-table-footer\n      [initialState]=\"initialStatePagination\"\n      [rowsPerPageOptions]=\"pageSizes\"\n      [showFooterResult]=\"showFooterResult\"\n      [showPagination]=\"showPagination\"\n      [currentPage]=\"currentPage\"\n      [footerActionsTemplate]=\"footerActionsTemplate\"\n      [footerResultsTemplate]=\"footerResultsTemplate\"\n      [totalPage]=\"totalPage\"\n      [totalElements]=\"totalElements\"\n      (rowsPerPageChange)=\"onChangePageSize($event)\"\n      (pageSelect)=\"onPage($event)\"\n      data-testid=\"ag-grid-footer\"></dsfr-table-footer>\n  }\n</div>\n", styles: ["@charset \"UTF-8\";dsfr-ext-ag-grid [class*=ag-theme-]{--ag-checkbox-unchecked-border-color: var(--background-active-blue-france);--ag-checkbox-indeterminate-border-color: var(--background-active-blue-france);--ag-checkbox-indeterminate-background-color: var(--background-active-blue-france);--ag-checkbox-checked-background-color: var(--background-active-blue-france);--ag-checkbox-checked-border-color: var(--background-active-blue-france);--ag-checkbox-checked-shape-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23f5f5fe' d='m10 15.17 9.2-9.2 1.4 1.42L10 18l-6.36-6.36 1.4-1.42z'/%3E%3C/svg%3E\")}dsfr-ext-ag-grid [class*=ag-theme-] .ag-checkbox-input-wrapper:after{inset:-1px}dsfr-ext-ag-grid [class*=ag-theme-] .ag-checkbox-input-wrapper{box-shadow:none}.edu-grid__wrapper{width:100%}.edu-grid__wrapper .fr-pagination{margin-top:1rem}.edu-grid__wrapper .no-data{text-align:center;font-style:italic}.edu-grid__wrapper .edu-grid__title{font-size:1.5rem;margin-bottom:1rem;line-height:2rem}.fr-table__header .edu-grid__actions{display:flex;align-items:center}.fr-table__header .edu-grid__actions .fr-btns-group{padding:0}.fr-table__header .edu-grid__actions--export{margin-bottom:1rem;margin-left:.5rem}dsfr-ext-ag-grid [class*=ag-theme-]{--ag-cell-text-color: var(--text-default-grey);--ag-header-text-color: var(--text-default-grey);--ag-header-font-weight: 700;--ag-accent-color: var(--text-default-grey);--ag-menu-border-color: var(--border-contrast-grey);--ag-row-hover-color: (var(--background-alt-grey-hover));--ag-column-hover-color: var(--background-alt-grey-hover);--ag-foreground-color: var(--text-default-grey);--ag-background-color: var(--background-default-grey);--ag-chrome-background-color: var(--ag-foreground-color);--ag-header-background-color: var(--background-alt-grey);--ag-odd-row-background-color: var(--background-default-grey);--ag-tooltip-background-color: var(--background-alt-grey);--ag-input-disabled-border: var(--background-disabled-grey);--ag-input-disabled-background-color: var(--background-disabled-grey);--ag-input-focus-shadow: none;--ag-input-focus-border: #0a76f6;--ag-selected-row-background-color: transparent;--ag-font-family: \"Marianne\", arial, sans-serif;--ag-font-size: .875rem;--ag-icon-size: 1rem;--ag-border-color: var(--border-contrast-grey);--ag-wrapper-border-radius: 0}dsfr-ext-ag-grid [class*=ag-theme-] [class^=fr-icon-]:before,dsfr-ext-ag-grid [class*=ag-theme-] [class^=fr-icon-]:after{--icon-size: 1rem}dsfr-ext-ag-grid .ag-menu{border:1px solid var(--ag-menu-border-color);border-radius:0}dsfr-ext-ag-grid .ag-header .ag-sort-indicator-icon{border:1px solid var(--border-default-grey);padding:.25rem;margin-left:var(--ag-spacing);color:var(--text-action-high-blue-france);padding-left:6px}dsfr-ext-ag-grid .ag-header .ag-sort-indicator-icon.ag-sort-order{padding-left:var(--ag-spacing);border-right:none}dsfr-ext-ag-grid .ag-header .ag-sort-indicator-icon.ag-sort-ascending-icon,dsfr-ext-ag-grid .ag-header .ag-sort-indicator-icon.ag-sort-descending-icon{margin-left:0;border-left:none}dsfr-ext-ag-grid .ag-header .ag-sort-indicator-icon.ag-sort-none-icon{padding-top:6px;min-height:32px}dsfr-ext-ag-grid .ag-header .ag-sort-indicator-icon:hover{background-color:var(--background-contrast-grey)}dsfr-ext-ag-grid .ag-header .ag-sort-indicator-container:has(.ag-sort-order.ag-hidden) .ag-sort-indicator-icon{margin-left:var(--ag-spacing);border:1px solid var(--border-default-grey);min-width:32px}dsfr-ext-ag-grid .ag-row,dsfr-ext-ag-grid .ag-row-focus,dsfr-ext-ag-grid .ag-cell-focus,dsfr-ext-ag-grid .ag-cell{-moz-user-select:auto;-webkit-user-select:auto;-ms-user-select:auto;user-select:auto}dsfr-ext-ag-grid .ag-ltr .ag-cell-focus:not(.ag-cell-range-selected):focus-within,dsfr-ext-ag-grid .ag-ltr .ag-cell-focus:not(.ag-cell-range-selected):focus-visible{outline-style:solid;outline-color:#0a76f6;outline-offset:-2px;outline-width:2px}dsfr-ext-ag-grid .ag-ltr .ag-cell-focus:not(.ag-cell-range-selected):focus-within:not(:focus-visible){outline-offset:-1px;outline-width:1px}dsfr-ext-ag-grid input[class^=ag-][type=text],dsfr-ext-ag-grid input[class^=ag-][type=date]{border:0;background-color:var(--background-contrast-grey);border-radius:.25rem .25rem 0 0;box-shadow:inset 0 -2px 0 0 var(--border-plain-grey);color:var(--text-default-grey);display:block;line-height:1.5rem;padding:.5rem 1rem}dsfr-ext-ag-grid .ag-input-wrapper:before{display:none}dsfr-ext-ag-grid .ag-icon.ag-icon-filter:before{-webkit-mask-image:url(/filter-line.svg);mask-image:url(/filter-line.svg)}dsfr-ext-ag-grid .ag-icon.ag-icon-filter:after{content:\"\";width:.25rem;height:.25rem;position:absolute;top:2px;left:.5rem;transform:translate(100%,-100%);-webkit-mask-image:unset;mask-image:unset;border-radius:50%;background-color:var(--text-action-high-blue-france)}dsfr-ext-ag-grid .ag-floating-filter-full-body{padding:.25rem}dsfr-ext-ag-grid .ag-floating-filter-button .ag-button{font-size:1rem;line-height:1.5rem;min-height:2rem;background-color:transparent;color:var(--text-action-high-blue-france);box-shadow:inset 0 0 0 1px var(--border-default-grey);padding:.25rem .5rem;width:auto}dsfr-ext-ag-grid .ag-floating-filter-button .ag-button:hover{background-color:var(--background-alt-grey-hover)}dsfr-ext-ag-grid .ag-floating-filter-full-body{display:block;height:auto}dsfr-ext-ag-grid .ag-floating-filter-full-body .fr-label+.fr-select{margin-top:0}dsfr-ext-ag-grid .ag-advanced-filter-header-cell:focus-visible:after,dsfr-ext-ag-grid .ag-header-cell:focus-visible:after,dsfr-ext-ag-grid .ag-header-group-cell:focus-visible:after{border-color:#0a76f6}dsfr-ext-ag-grid input[class^=ag-]:focus,dsfr-ext-ag-grid .ag-select .ag-picker-field-wrapper:focus,dsfr-ext-ag-grid .fr-select:focus{outline-style:solid;outline-color:#0a76f6;outline-offset:2px;outline-width:2px}dsfr-ext-ag-grid .ag-button:focus{outline-style:solid;outline-color:#0a76f6;outline-width:2px;outline-offset:0}dsfr-ext-ag-grid .ag-select .ag-picker-field-wrapper{border-radius:.25rem .25rem 0 0;background-repeat:no-repeat;background-position:calc(100% - .5rem) 50%;background-size:1.5rem 1.5rem;border:none;margin-bottom:.25rem;background-color:var(--background-alt-raised-grey-hover);box-shadow:inset 0 -2px 0 0 var(--border-plain-grey);--data-uri-svg: url(\"data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' x='0px' y='0px' viewBox='0 0 24 24' ><path fill='%23161616' d='M12,13.1l5-4.9l1.4,1.4L12,15.9L5.6,9.5l1.4-1.4L12,13.1z'/></svg>\");background-image:var(--data-uri-svg)}dsfr-ext-ag-grid .ag-select .ag-picker-field-wrapper .ag-icon{display:none}.fr-table--selectable .ag-ltr .ag-column-first.ag-cell:has(.ag-selection-checkbox){background-color:var(--background-alt-grey);border-right:1px solid gray}.fr-table--selectable .ag-row-selected{border-top:1px solid var(--border-action-high-blue-france);border-bottom:1px solid var(--border-action-high-blue-france)}.fr-table--selectable .ag-row-selected .ag-column-first.ag-cell{border-left:1px solid var(--border-action-high-blue-france)}.fr-table--selectable .ag-row-selected .ag-column-last.ag-cell{border-right:1px solid var(--border-action-high-blue-france)}.fr-table--selectable .ag-row[aria-selected=true]+.ag-row[aria-selected=true]{border-top:none;border-bottom:1px solid gray}.fr-table--selectable .ag-row[aria-selected=true]:has(+.ag-row[aria-selected=false]){border-bottom:1px solid var(--border-action-high-blue-france)}.fr-table--selectable .ag-row[aria-selected=false]:has(+.ag-row[aria-selected=true]){border-bottom:1px solid var(--border-action-high-blue-france)}.fr-table--selectable .ag-row-selected+.ag-row:not([aria-selected=true]){border-top:1px solid var(--border-action-high-blue-france)}.fr-table--selectable .ag-row:not([aria-selected=true])+.ag-row-selected{border-bottom:1px solid gray}.fr-table--selectable .ag-row-selected:first-of-type{border-bottom:1px solid gray}.fr-table--selectable .ag-row[aria-selected=true]+.ag-row[aria-selected=true]:last-of-type,.fr-table--selectable .ag-row[aria-selected=true]:last-of-type{border-bottom:1px solid var(--border-action-high-blue-france)}dsfr-ext-ag-grid .fr-table-bordered,.fr-table--bordered{--ag-column-border: solid 1px var(--ag-border-color)}dsfr-ext-ag-grid .fr-table-bordered :where(.ag-ltr) .ag-header-cell:not(:last-child),.fr-table--bordered :where(.ag-ltr) .ag-header-cell:not(:last-child){border-right:var(--ag-column-border)}dsfr-ext-ag-grid .fr-table--striped{--ag-odd-row-background-color: var(--background-alt-grey)}:root[data-fr-theme=dark] .ag-select .ag-picker-field-wrapper{--data-uri-svg: url(\"data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' x='0px' y='0px' viewBox='0 0 24 24' ><path fill='%23fff' d='M12,13.1l5-4.9l1.4,1.4L12,15.9L5.6,9.5l1.4-1.4L12,13.1z'/></svg>\")}.dsfrx-auto-height__server .ag-cell-value{word-break:break-word;height:fit-content}.dsfrx-auto-height__server .ag-cell-wrapper{align-items:center}.dsfrx-auto-height__server .ag-cell{display:flex;line-height:inherit}.dsfrx-auto-height__server .ag-layout-auto-height,.dsfrx-auto-height__server .ag-center-cols-viewport{min-height:50px}\n"], dependencies: [{ kind: "component", type: AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "columnMenu", "suppressMenuHide", "enableBrowserTooltips", "tooltipTrigger", "tooltipShowDelay", "tooltipSwitchShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "tooltipShowMode", "tooltipInteraction", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "suppressCutToClipboard", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "dataTypeDefinitions", "maintainColumnOrder", "enableStrictPivotColumnOrder", "suppressFieldDotNotation", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "hidePaddedHeaderRows", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressMoveWhenColumnDragging", "suppressDragLeaveHidesColumns", "suppressGroupChangesColumnVisibility", "suppressMakeColumnVisibleAfterUnGroup", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "autoSizeStrategy", "animateColumnResizing", "components", "editType", "suppressStartEditOnTab", "getFullRowEditValidationErrors", "invalidEditValueMode", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterNavigatesVertically", "enterNavigatesVerticallyAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "findSearchValue", "findOptions", "quickFilterText", "cacheQuickFilter", "includeHiddenColumnsInQuickFilter", "quickFilterParser", "quickFilterMatcher", "applyQuickFilterBeforePivotOrAgg", "excludeChildrenWhenTreeDataFiltering", "enableAdvancedFilter", "alwaysPassFilter", "includeHiddenColumnsInAdvancedFilter", "advancedFilterParent", "advancedFilterBuilderParams", "advancedFilterParams", "suppressAdvancedFilterEval", "suppressSetFilterByDefault", "enableFilterHandlers", "filterHandlers", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "chartToolPanelsDef", "chartMenuItems", "loadingCellRenderer", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressTouch", "suppressFocusAfterRefresh", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "loading", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "suppressOverlays", "overlayComponent", "overlayComponentParams", "overlayComponentSelector", "activeOverlay", "activeOverlayParams", "pagination", "paginationPageSize", "paginationPageSizeSelector", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotMaxGeneratedColumns", "pivotDefaultExpanded", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "formulaDataSource", "formulaFuncs", "suppressAggFuncInHeader", "alwaysAggregateAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "cellFlashDuration", "cellFadeDuration", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableCellSpan", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "refreshAfterGroupEdit", "rowDragInsertDelay", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "dragAndDropImageComponent", "dragAndDropImageComponentParams", "fullWidthCellRenderer", "fullWidthCellRendererParams", "embedFullWidthRows", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupLockGroupColumns", "groupAggFiltering", "groupTotalRow", "grandTotalRow", "suppressStickyTotalRow", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupHideParentOfSingleChild", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "groupHideColumnsUntilExpanded", "groupAllowUnbalanced", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererParams", "treeData", "treeDataChildrenField", "treeDataParentIdField", "rowGroupPanelSuppressSort", "suppressGroupRowsSticky", "groupHierarchyConfig", "pinnedTopRowData", "pinnedBottomRowData", "enableRowPinning", "isRowPinnable", "isRowPinned", "rowModelType", "rowData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "suppressServerSideFullWidthLoadingRow", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideEnableClientSideSort", "serverSideOnlyRefreshFilteredGroups", "serverSidePivotResultFieldSeparator", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "cellSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellFocus", "suppressHeaderFocus", "selectionColumnDef", "rowNumbers", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "gridId", "deltaSort", "treeDataDisplayType", "enableGroupEdit", "initialState", "theme", "loadThemeGoogleFonts", "themeCssLayer", "styleNonce", "themeStyleContainer", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processUnpinnedColumns", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "focusGridInnerElement", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "tabToNextGridContainer", "getLocaleText", "getDocument", "paginationNumberFormatter", "getGroupRowAgg", "isGroupOpenByDefault", "ssrmExpandAllAffectsAllRows", "initialGroupOrderComparator", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "getChildCount", "getServerSideGroupLevelParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthRow", "isRowValidDropPosition"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "columnMenuVisibleChanged", "contextMenuVisibleChanged", "cutStart", "cutEnd", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "columnsReset", "columnHeaderMouseOver", "columnHeaderMouseLeave", "columnHeaderClicked", "columnHeaderContextMenu", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "bulkEditingStarted", "bulkEditingStopped", "batchEditingStarted", "batchEditingStopped", "undoStarted", "undoEnded", "redoStarted", "redoEnded", "cellSelectionDeleteStart", "cellSelectionDeleteEnd", "rangeDeleteStart", "rangeDeleteEnd", "fillStart", "fillEnd", "filterOpened", "filterChanged", "filterModified", "filterUiChanged", "floatingFilterUiChanged", "advancedFilterBuilderVisibleChanged", "findChanged", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "dragCancelled", "stateUpdated", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "rowDragCancel", "rowResizeStarted", "rowResizeEnded", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pivotMaxColumnsExceeded", "pinnedRowDataChanged", "pinnedRowsChanged", "rowDataUpdated", "asyncTransactionsFlushed", "storeRefreshed", "headerFocused", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "cellSelectionChanged", "tooltipShow", "tooltipHide", "sortChanged"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: DsfrButtonModule }, { kind: "component", type: i2.DsfrButtonComponent, selector: "dsfr-button", inputs: ["label", "type", "tooltipMessage", "variant", "buttonSize", "icon", "iconPosition", "disabled", "uppercase", "loader", "ariaLabel", "invertedOutlineContrast", "id", "buttonId", "ariaControls", "ariaPressed", "ariaHasPopup", "ariaExpanded", "ariaHidden", "tabIndex", "customClass", "buttonRole", "labelSrOnly", "size"] }, { kind: "ngmodule", type: DsfrPaginationModule }, { kind: "ngmodule", type: DsfrFormSelectModule }, { kind: "component", type: DsfrTableFooterComponent, selector: "dsfr-table-footer", inputs: ["footerActionsTemplate", "showPagination", "showFooterResult", "footerResultsTemplate", "initialState", "totalElements", "totalPage", "currentPage", "rowsPerPageOptions", "emptyResultsMessage", "disabledRowsPerPage"], outputs: ["rowsPerPageChange", "pageSelect"] }, { kind: "directive", type: EduRemoteAgGridDirective, selector: "[remoteAgGridBinding]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: DsfrGridComponent, decorators: [{
            type: Component,
            args: [{ selector: 'dsfr-ext-ag-grid, dsfrx-ag-grid', providers: [{ provide: EduRemoteAgGridApi, useExisting: forwardRef(() => DsfrGridComponent) }], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
                        AgGridAngular,
                        CommonModule,
                        FormsModule,
                        DsfrButtonModule,
                        DsfrPaginationModule,
                        DsfrFormSelectModule,
                        DsfrTableFooterComponent,
                        EduRemoteAgGridDirective,
                    ], template: "<!-- AG Grid Angular Component -->\n<div\n  class=\"edu-grid__wrapper fr-table\"\n  [class]=\"customClass ?? ''\"\n  [ngClass]=\"{ 'dsfrx-auto-height__server': autoRowsHeight, 'fr-table--selectable': selectable }\">\n  <!-- Header ------------------------------->\n  <div class=\"fr-table__header\">\n    <!-- Gestion du titre du tableau -->\n    @if (caption) {\n      <p [id]=\"captionId\" class=\"edu-grid__title\">\n        {{ caption }}\n      </p>\n    } @else {\n      <div [id]=\"captionId\" class=\"edu-grid__title\">\n        <ng-content select=\"[caption]\"></ng-content>\n      </div>\n    }\n    <!-- Template actions group\u00E9es -->\n    @if (headerActionsTemplate) {\n      <div class=\"edu-grid__actions\">\n        <ng-container *ngTemplateOutlet=\"headerActionsTemplate\"></ng-container>\n      </div>\n    } @else if (showExportCsv) {\n      <div class=\"edu-grid__actions\">\n        <dsfr-button\n          label=\"Exporter au format CSV\"\n          customClass=\"edu-grid__actions--export\"\n          (click)=\"onClickExportCsv()\"\n          variant=\"secondary\"></dsfr-button>\n      </div>\n    }\n  </div>\n\n  <!-- Client side-->\n  @if (mode === 'client') {\n    <ag-grid-angular\n      [rowData]=\"rowData\"\n      #grid\n      style=\"width: 100%\"\n      [id]=\"gridId\"\n      [ngStyle]=\"{ height: fixedHeight ? fixedHeight : '100%' }\"\n      [ngClass]=\"customClass\"\n      [columnDefs]=\"columnDefs\"\n      [defaultColDef]=\"defaultColDef\"\n      [initialState]=\"initialState\"\n      [gridOptions]=\"gridOptions\"\n      [loading]=\"loading\"\n      [overlayLoadingTemplate]=\"loadingOverlayTemplate\"\n      [overlayNoRowsTemplate]=\"overlayNoRowsTemplate\"\n      [suppressPaginationPanel]=\"true\"\n      [localeText]=\"localeText\"\n      [animateRows]=\"false\"\n      (columnResized)=\"onColumnResized()\"\n      (gridSizeChanged)=\"onGridSizeChanged($event)\"\n      (modelUpdated)=\"onModelUpdated($event)\"\n      (cellClicked)=\"onCellClicked($event)\"\n      (cellEditingStopped)=\"onCellEditingStop($event)\"\n      (filterChanged)=\"onFilterChange($event)\"\n      (paginationChanged)=\"onPaginationChanged($event)\"\n      (sortChanged)=\"onSortChange($event)\"\n      (rowSelected)=\"onRowSelected($event)\"\n      (selectionChanged)=\"onSelectionChanged($event)\"\n      (gridReady)=\"onGridReady($event)\"></ag-grid-angular>\n  } @else if (mode === 'server') {\n    <!-- Remote data-->\n    <ag-grid-angular\n      remoteAgGridBinding\n      #grid\n      style=\"width: 100%\"\n      [id]=\"gridId\"\n      [ngStyle]=\"{ height: fixedHeight ? fixedHeight : '100%' }\"\n      [ngClass]=\"customClass\"\n      [columnDefs]=\"columnDefs\"\n      [defaultColDef]=\"defaultColDef\"\n      [initialState]=\"initialState\"\n      [gridOptions]=\"gridOptions\"\n      [loading]=\"loading\"\n      [overlayLoadingTemplate]=\"loadingOverlayTemplate\"\n      [overlayNoRowsTemplate]=\"overlayNoRowsTemplate\"\n      [suppressPaginationPanel]=\"true\"\n      [localeText]=\"localeText\"\n      [animateRows]=\"false\"\n      (columnResized)=\"onColumnResized()\"\n      (firstDataRendered)=\"onFirstDataRendered()\"\n      (gridSizeChanged)=\"onGridSizeChanged($event)\"\n      (modelUpdated)=\"onModelUpdated($event)\"\n      (cellClicked)=\"onCellClicked($event)\"\n      (cellEditingStopped)=\"onCellEditingStop($event)\"\n      (filterChanged)=\"onFilterChange($event)\"\n      (sortChanged)=\"onSortChange($event)\"\n      (paginationChanged)=\"onPaginationChanged($event)\"\n      (rowSelected)=\"onRowSelected($event)\"\n      (selectionChanged)=\"onSelectionChanged($event)\"\n      (gridReady)=\"onGridReady($event)\"></ag-grid-angular>\n  }\n\n  <!-- Footer -->\n  @if (totalElements > 0 && !isLoadingServerSide) {\n    <dsfr-table-footer\n      [initialState]=\"initialStatePagination\"\n      [rowsPerPageOptions]=\"pageSizes\"\n      [showFooterResult]=\"showFooterResult\"\n      [showPagination]=\"showPagination\"\n      [currentPage]=\"currentPage\"\n      [footerActionsTemplate]=\"footerActionsTemplate\"\n      [footerResultsTemplate]=\"footerResultsTemplate\"\n      [totalPage]=\"totalPage\"\n      [totalElements]=\"totalElements\"\n      (rowsPerPageChange)=\"onChangePageSize($event)\"\n      (pageSelect)=\"onPage($event)\"\n      data-testid=\"ag-grid-footer\"></dsfr-table-footer>\n  }\n</div>\n", styles: ["@charset \"UTF-8\";dsfr-ext-ag-grid [class*=ag-theme-]{--ag-checkbox-unchecked-border-color: var(--background-active-blue-france);--ag-checkbox-indeterminate-border-color: var(--background-active-blue-france);--ag-checkbox-indeterminate-background-color: var(--background-active-blue-france);--ag-checkbox-checked-background-color: var(--background-active-blue-france);--ag-checkbox-checked-border-color: var(--background-active-blue-france);--ag-checkbox-checked-shape-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23f5f5fe' d='m10 15.17 9.2-9.2 1.4 1.42L10 18l-6.36-6.36 1.4-1.42z'/%3E%3C/svg%3E\")}dsfr-ext-ag-grid [class*=ag-theme-] .ag-checkbox-input-wrapper:after{inset:-1px}dsfr-ext-ag-grid [class*=ag-theme-] .ag-checkbox-input-wrapper{box-shadow:none}.edu-grid__wrapper{width:100%}.edu-grid__wrapper .fr-pagination{margin-top:1rem}.edu-grid__wrapper .no-data{text-align:center;font-style:italic}.edu-grid__wrapper .edu-grid__title{font-size:1.5rem;margin-bottom:1rem;line-height:2rem}.fr-table__header .edu-grid__actions{display:flex;align-items:center}.fr-table__header .edu-grid__actions .fr-btns-group{padding:0}.fr-table__header .edu-grid__actions--export{margin-bottom:1rem;margin-left:.5rem}dsfr-ext-ag-grid [class*=ag-theme-]{--ag-cell-text-color: var(--text-default-grey);--ag-header-text-color: var(--text-default-grey);--ag-header-font-weight: 700;--ag-accent-color: var(--text-default-grey);--ag-menu-border-color: var(--border-contrast-grey);--ag-row-hover-color: (var(--background-alt-grey-hover));--ag-column-hover-color: var(--background-alt-grey-hover);--ag-foreground-color: var(--text-default-grey);--ag-background-color: var(--background-default-grey);--ag-chrome-background-color: var(--ag-foreground-color);--ag-header-background-color: var(--background-alt-grey);--ag-odd-row-background-color: var(--background-default-grey);--ag-tooltip-background-color: var(--background-alt-grey);--ag-input-disabled-border: var(--background-disabled-grey);--ag-input-disabled-background-color: var(--background-disabled-grey);--ag-input-focus-shadow: none;--ag-input-focus-border: #0a76f6;--ag-selected-row-background-color: transparent;--ag-font-family: \"Marianne\", arial, sans-serif;--ag-font-size: .875rem;--ag-icon-size: 1rem;--ag-border-color: var(--border-contrast-grey);--ag-wrapper-border-radius: 0}dsfr-ext-ag-grid [class*=ag-theme-] [class^=fr-icon-]:before,dsfr-ext-ag-grid [class*=ag-theme-] [class^=fr-icon-]:after{--icon-size: 1rem}dsfr-ext-ag-grid .ag-menu{border:1px solid var(--ag-menu-border-color);border-radius:0}dsfr-ext-ag-grid .ag-header .ag-sort-indicator-icon{border:1px solid var(--border-default-grey);padding:.25rem;margin-left:var(--ag-spacing);color:var(--text-action-high-blue-france);padding-left:6px}dsfr-ext-ag-grid .ag-header .ag-sort-indicator-icon.ag-sort-order{padding-left:var(--ag-spacing);border-right:none}dsfr-ext-ag-grid .ag-header .ag-sort-indicator-icon.ag-sort-ascending-icon,dsfr-ext-ag-grid .ag-header .ag-sort-indicator-icon.ag-sort-descending-icon{margin-left:0;border-left:none}dsfr-ext-ag-grid .ag-header .ag-sort-indicator-icon.ag-sort-none-icon{padding-top:6px;min-height:32px}dsfr-ext-ag-grid .ag-header .ag-sort-indicator-icon:hover{background-color:var(--background-contrast-grey)}dsfr-ext-ag-grid .ag-header .ag-sort-indicator-container:has(.ag-sort-order.ag-hidden) .ag-sort-indicator-icon{margin-left:var(--ag-spacing);border:1px solid var(--border-default-grey);min-width:32px}dsfr-ext-ag-grid .ag-row,dsfr-ext-ag-grid .ag-row-focus,dsfr-ext-ag-grid .ag-cell-focus,dsfr-ext-ag-grid .ag-cell{-moz-user-select:auto;-webkit-user-select:auto;-ms-user-select:auto;user-select:auto}dsfr-ext-ag-grid .ag-ltr .ag-cell-focus:not(.ag-cell-range-selected):focus-within,dsfr-ext-ag-grid .ag-ltr .ag-cell-focus:not(.ag-cell-range-selected):focus-visible{outline-style:solid;outline-color:#0a76f6;outline-offset:-2px;outline-width:2px}dsfr-ext-ag-grid .ag-ltr .ag-cell-focus:not(.ag-cell-range-selected):focus-within:not(:focus-visible){outline-offset:-1px;outline-width:1px}dsfr-ext-ag-grid input[class^=ag-][type=text],dsfr-ext-ag-grid input[class^=ag-][type=date]{border:0;background-color:var(--background-contrast-grey);border-radius:.25rem .25rem 0 0;box-shadow:inset 0 -2px 0 0 var(--border-plain-grey);color:var(--text-default-grey);display:block;line-height:1.5rem;padding:.5rem 1rem}dsfr-ext-ag-grid .ag-input-wrapper:before{display:none}dsfr-ext-ag-grid .ag-icon.ag-icon-filter:before{-webkit-mask-image:url(/filter-line.svg);mask-image:url(/filter-line.svg)}dsfr-ext-ag-grid .ag-icon.ag-icon-filter:after{content:\"\";width:.25rem;height:.25rem;position:absolute;top:2px;left:.5rem;transform:translate(100%,-100%);-webkit-mask-image:unset;mask-image:unset;border-radius:50%;background-color:var(--text-action-high-blue-france)}dsfr-ext-ag-grid .ag-floating-filter-full-body{padding:.25rem}dsfr-ext-ag-grid .ag-floating-filter-button .ag-button{font-size:1rem;line-height:1.5rem;min-height:2rem;background-color:transparent;color:var(--text-action-high-blue-france);box-shadow:inset 0 0 0 1px var(--border-default-grey);padding:.25rem .5rem;width:auto}dsfr-ext-ag-grid .ag-floating-filter-button .ag-button:hover{background-color:var(--background-alt-grey-hover)}dsfr-ext-ag-grid .ag-floating-filter-full-body{display:block;height:auto}dsfr-ext-ag-grid .ag-floating-filter-full-body .fr-label+.fr-select{margin-top:0}dsfr-ext-ag-grid .ag-advanced-filter-header-cell:focus-visible:after,dsfr-ext-ag-grid .ag-header-cell:focus-visible:after,dsfr-ext-ag-grid .ag-header-group-cell:focus-visible:after{border-color:#0a76f6}dsfr-ext-ag-grid input[class^=ag-]:focus,dsfr-ext-ag-grid .ag-select .ag-picker-field-wrapper:focus,dsfr-ext-ag-grid .fr-select:focus{outline-style:solid;outline-color:#0a76f6;outline-offset:2px;outline-width:2px}dsfr-ext-ag-grid .ag-button:focus{outline-style:solid;outline-color:#0a76f6;outline-width:2px;outline-offset:0}dsfr-ext-ag-grid .ag-select .ag-picker-field-wrapper{border-radius:.25rem .25rem 0 0;background-repeat:no-repeat;background-position:calc(100% - .5rem) 50%;background-size:1.5rem 1.5rem;border:none;margin-bottom:.25rem;background-color:var(--background-alt-raised-grey-hover);box-shadow:inset 0 -2px 0 0 var(--border-plain-grey);--data-uri-svg: url(\"data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' x='0px' y='0px' viewBox='0 0 24 24' ><path fill='%23161616' d='M12,13.1l5-4.9l1.4,1.4L12,15.9L5.6,9.5l1.4-1.4L12,13.1z'/></svg>\");background-image:var(--data-uri-svg)}dsfr-ext-ag-grid .ag-select .ag-picker-field-wrapper .ag-icon{display:none}.fr-table--selectable .ag-ltr .ag-column-first.ag-cell:has(.ag-selection-checkbox){background-color:var(--background-alt-grey);border-right:1px solid gray}.fr-table--selectable .ag-row-selected{border-top:1px solid var(--border-action-high-blue-france);border-bottom:1px solid var(--border-action-high-blue-france)}.fr-table--selectable .ag-row-selected .ag-column-first.ag-cell{border-left:1px solid var(--border-action-high-blue-france)}.fr-table--selectable .ag-row-selected .ag-column-last.ag-cell{border-right:1px solid var(--border-action-high-blue-france)}.fr-table--selectable .ag-row[aria-selected=true]+.ag-row[aria-selected=true]{border-top:none;border-bottom:1px solid gray}.fr-table--selectable .ag-row[aria-selected=true]:has(+.ag-row[aria-selected=false]){border-bottom:1px solid var(--border-action-high-blue-france)}.fr-table--selectable .ag-row[aria-selected=false]:has(+.ag-row[aria-selected=true]){border-bottom:1px solid var(--border-action-high-blue-france)}.fr-table--selectable .ag-row-selected+.ag-row:not([aria-selected=true]){border-top:1px solid var(--border-action-high-blue-france)}.fr-table--selectable .ag-row:not([aria-selected=true])+.ag-row-selected{border-bottom:1px solid gray}.fr-table--selectable .ag-row-selected:first-of-type{border-bottom:1px solid gray}.fr-table--selectable .ag-row[aria-selected=true]+.ag-row[aria-selected=true]:last-of-type,.fr-table--selectable .ag-row[aria-selected=true]:last-of-type{border-bottom:1px solid var(--border-action-high-blue-france)}dsfr-ext-ag-grid .fr-table-bordered,.fr-table--bordered{--ag-column-border: solid 1px var(--ag-border-color)}dsfr-ext-ag-grid .fr-table-bordered :where(.ag-ltr) .ag-header-cell:not(:last-child),.fr-table--bordered :where(.ag-ltr) .ag-header-cell:not(:last-child){border-right:var(--ag-column-border)}dsfr-ext-ag-grid .fr-table--striped{--ag-odd-row-background-color: var(--background-alt-grey)}:root[data-fr-theme=dark] .ag-select .ag-picker-field-wrapper{--data-uri-svg: url(\"data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' x='0px' y='0px' viewBox='0 0 24 24' ><path fill='%23fff' d='M12,13.1l5-4.9l1.4,1.4L12,15.9L5.6,9.5l1.4-1.4L12,13.1z'/></svg>\")}.dsfrx-auto-height__server .ag-cell-value{word-break:break-word;height:fit-content}.dsfrx-auto-height__server .ag-cell-wrapper{align-items:center}.dsfrx-auto-height__server .ag-cell{display:flex;line-height:inherit}.dsfrx-auto-height__server .ag-layout-auto-height,.dsfrx-auto-height__server .ag-center-cols-viewport{min-height:50px}\n"] }]
        }], ctorParameters: () => [], propDecorators: { grid: [{
                type: ViewChild,
                args: ['grid', { read: ElementRef }]
            }], footerResultsTemplate: [{
                type: ContentChild,
                args: ['footerResultsTemplate', { static: true }]
            }], footerActionsTemplate: [{
                type: ContentChild,
                args: ['footerActionsTemplate', { static: true }]
            }], headerActionsTemplate: [{
                type: ContentChild,
                args: ['headerActionsTemplate', { static: true }]
            }], gridId: [{
                type: Input
            }], columnDefs: [{
                type: Input,
                args: [{ required: true }]
            }], caption: [{
                type: Input
            }], pageSize: [{
                type: Input
            }], localeText: [{
                type: Input
            }], mode: [{
                type: Input
            }], rowData: [{
                type: Input
            }], defaultColDef: [{
                type: Input
            }], initialState: [{
                type: Input
            }], customClass: [{
                type: Input
            }], showLoadingOverlay: [{
                type: Input
            }], loadingOverlayTemplate: [{
                type: Input
            }], overlayNoRowsTemplate: [{
                type: Input
            }], idNoRowsTemplate: [{
                type: Input
            }], fixedHeight: [{
                type: Input
            }], autoRowsHeight: [{
                type: Input,
                args: [{ transform: booleanAttribute }]
            }], gridOptions: [{
                type: Input
            }], showExportCsv: [{
                type: Input,
                args: [{ transform: booleanAttribute }]
            }], rowId: [{
                type: Input
            }], showPagination: [{
                type: Input,
                args: [{ transform: booleanAttribute }]
            }], showFooterResult: [{
                type: Input,
                args: [{ transform: booleanAttribute }]
            }], sortChanged: [{
                type: Output
            }], gridReady: [{
                type: Output
            }], gridPreDestroyed: [{
                type: Output
            }], filterChanged: [{
                type: Output
            }], cellSelect: [{
                type: Output
            }], rowSelect: [{
                type: Output
            }], selectionChange: [{
                type: Output
            }], dataChange: [{
                type: Output
            }], paginationChange: [{
                type: Output
            }], dataRender: [{
                type: Output
            }], dataFail: [{
                type: Output
            }], cellEditingStopped: [{
                type: Output
            }], agGrid: [{
                type: ViewChild,
                args: [AgGridAngular]
            }], pageSizes: [{
                type: Input
            }], result: [{
                type: Input
            }] } });

class DsfrGridModule {
    static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: DsfrGridModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
    static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.24", ngImport: i0, type: DsfrGridModule, imports: [DsfrGridComponent], exports: [DsfrGridComponent] }); }
    static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: DsfrGridModule, providers: [provideHttpClient(withInterceptorsFromDi())], imports: [DsfrGridComponent] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: DsfrGridModule, decorators: [{
            type: NgModule,
            args: [{
                    imports: [DsfrGridComponent],
                    exports: [DsfrGridComponent],
                    providers: [provideHttpClient(withInterceptorsFromDi())],
                }]
        }] });

/**
 * API publique du module Grid.
 *
 * @module ngx-dsfr-ext/grid
 */

/**
 * Generated bundle index. Do not edit.
 */

export { DsfrButtonCellGridComponent, DsfrGridComponent, DsfrGridModule, DsfrSelectFilterComponent };
//# sourceMappingURL=edugouvfr-ngx-dsfr-ext-grid.mjs.map