@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
JavaScript
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