@softheon/armature 19.17.1 → 19.17.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -215,7 +215,7 @@ class SofTableComponent {
|
|
|
215
215
|
onGridReady(params) {
|
|
216
216
|
this.gridApi = params.api;
|
|
217
217
|
this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;
|
|
218
|
-
this.totalLength = this.gridApi.paginationGetRowCount();
|
|
218
|
+
this.totalLength = this.enablePagination ? this.gridApi.paginationGetRowCount() : this.gridApi.getDisplayedRowCount();
|
|
219
219
|
setTimeout(() => {
|
|
220
220
|
const ariaContainer = this.document.querySelector('.ag-aria-description-container');
|
|
221
221
|
if (ariaContainer) {
|
|
@@ -303,7 +303,7 @@ class SofTableComponent {
|
|
|
303
303
|
// Only need to do this work if the page size has changed.
|
|
304
304
|
if (event.newPageSize) {
|
|
305
305
|
// Update the total number of filtered rows.
|
|
306
|
-
this.totalLength = this.gridApi.paginationGetRowCount();
|
|
306
|
+
this.totalLength = this.enablePagination ? this.gridApi.paginationGetRowCount() : this.gridApi.getDisplayedRowCount();
|
|
307
307
|
// Handle text changes
|
|
308
308
|
this.handlePageChangeText();
|
|
309
309
|
}
|
|
@@ -315,7 +315,7 @@ class SofTableComponent {
|
|
|
315
315
|
onFilterChanged() {
|
|
316
316
|
const previousTotalLength = Number(this.totalLength);
|
|
317
317
|
// Update the total number of filtered rows.
|
|
318
|
-
this.totalLength = this.gridApi.paginationGetRowCount();
|
|
318
|
+
this.totalLength = this.enablePagination ? this.gridApi.paginationGetRowCount() : this.gridApi.getDisplayedRowCount();
|
|
319
319
|
if (this.totalLength !== previousTotalLength) {
|
|
320
320
|
this.ariaResultsCount.nativeElement.innerHTML = "";
|
|
321
321
|
this.ariaResultsCount.nativeElement.innerHTML = this.totalLength === 0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"softheon-armature-ag-grid-components.mjs","sources":["../../../../projects/armature/ag-grid-components/src/column-options-modal/column-options.component.ts","../../../../projects/armature/ag-grid-components/src/column-options-modal/column-options.component.html","../../../../projects/armature/ag-grid-components/src/sof-table/sof-table.component.ts","../../../../projects/armature/ag-grid-components/src/sof-table/sof-table.component.html","../../../../projects/armature/ag-grid-components/src/table-cell/table-cell.component.ts","../../../../projects/armature/ag-grid-components/src/table-cell/table-cell.component.html","../../../../projects/armature/ag-grid-components/src/ag-grid-components.module.ts","../../../../projects/armature/ag-grid-components/public-api.ts","../../../../projects/armature/ag-grid-components/softheon-armature-ag-grid-components.ts"],"sourcesContent":["import { Component, inject } from \"@angular/core\";\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from \"@angular/material/dialog\";\r\nimport { ApplyColumnStateParams, ColumnState } from \"ag-grid-community\";\r\n\r\n/** Table Column options dialog */\r\n@Component({\r\n selector: 'sof-column-options',\r\n templateUrl: './column-options.component.html',\r\n styleUrl: './column-options.component.scss',\r\n standalone: false\r\n})\r\nexport class SofColumnOptionsComponent {\r\n\r\n /** dialog reference */\r\n private dialogRef: MatDialogRef<SofColumnOptionsComponent> = inject(MatDialogRef<SofColumnOptionsComponent>);\r\n\r\n /** dialog data */\r\n public data: ColumnOptionsData = inject(MAT_DIALOG_DATA);\r\n\r\n /** emit the updated column state */\r\n public applyUpdatedColumnState(): void {\r\n const columnState: Array<ColumnState> = this.data.columnData.map((column) => {\r\n return {\r\n colId: column.id,\r\n hide: !column.isChecked\r\n }\r\n });\r\n const updatedColumnState: ApplyColumnStateParams = {\r\n state: [...columnState],\r\n applyOrder: true\r\n };\r\n this.dialogRef.close(updatedColumnState);\r\n }\r\n\r\n /** reset the column data to its first saved value */\r\n public resetColumnData(): void {\r\n this.data.columnData = structuredClone(this.data.initialColumnData);\r\n }\r\n}\r\n\r\n/** \r\n * Column options modal data\r\n * @description data passed from the 'SofTableComponent'\r\n * @property `tableName: string` name of the table using the column options\r\n * @property `columnData: Array<ColumnData>` column data returned from the agGrid api\r\n * @property `initialColumnData: Array<ColumnData>` column data from saved user preference or initial `columnData` \r\n * @see {@link ColumnData}\r\n */\r\nexport interface ColumnOptionsData {\r\n /** name of the table using the column options */\r\n tableName?: string;\r\n /** column data returned from the agGrid api */\r\n columnData?: Array<ColumnData>;\r\n /** column data from saved user preference or initial `columnData` */\r\n initialColumnData?: Array<ColumnData>;\r\n /** \r\n * To display the text on the column options modal, which states -\r\n * `\"Options will be saved for the next time you log in.\"`\r\n */\r\n showSaveColumnOptionsText?: boolean;\r\n}\r\n\r\n/** \r\n * Column data \r\n * @description column data derived from the agGrid api, adds id property to type `HandleInput`\r\n * @property `id: string` columns unique id\r\n * @property `text: string` columns header text\r\n * @property `isChecked: boolean` column not hidden\r\n*/\r\nexport interface ColumnData {\r\n /** columns unique id */\r\n id?: string;\r\n /** columns header text */\r\n text?: string;\r\n /** column not hidden */\r\n isChecked?: boolean;\r\n}\r\n","<div class=\"column-options-header\">\r\n <i class=\"ph-bold ph-square-split-horizontal\" aria-hidden=\"true\"></i>\r\n <h2 id=\"column-options-heading\">{{'armature.sof-table.column-options' | translate}}</h2>\r\n <button \r\n mat-dialog-close m-l-auto \r\n disableRipple=\"true\" id=\"column-options-close\" aria-label=\"close\">\r\n <i class=\"ph-bold ph-x close\" aria-hidden=\"true\"></i>\r\n </button>\r\n</div>\r\n<div class=\"column-options-container\">\r\n <div class=\"column-options-description\">\r\n <p>\r\n {{'armature.sof-table.column-options-description' | translate}} \r\n {{ data.showSaveColumnOptionsText ? ('armature.sof-table.column-options-description-saving' | translate) : ''}}\r\n </p>\r\n <p class=\"table-label\">{{data.tableName | translate}} {{'armature.sof-table.columns' | translate}}</p>\r\n </div>\r\n <div class=\"column-options-selections\">\r\n <sof-handle [handleList]=\"data.columnData\"/>\r\n </div>\r\n <div class=\"column-options-bottom\">\r\n <button\r\n (click)=\"resetColumnData()\"\r\n mat-flat-button\r\n theme=\"neutral\" emphasis=\"floating\"\r\n class=\"sof-button-v2\" m-r-auto\r\n id=\"column-options-reset\">\r\n {{'armature.sof-table.reset' | translate}}\r\n </button>\r\n <button \r\n mat-flat-button mat-dialog-close \r\n theme=\"neutral\" emphasis=\"secondary\"\r\n class=\"sof-button-v2\"\r\n id=\"column-options-cancel\">\r\n {{'armature.sof-table.cancel' | translate}}\r\n </button>\r\n <button \r\n (click)=\"applyUpdatedColumnState()\"\r\n mat-flat-button \r\n class=\"sof-button-v2\"\r\n theme=\"primary\" emphasis=\"solid\"\r\n id=\"column-options-update\">\r\n {{'armature.sof-table.update' | translate}}\r\n </button>\r\n </div>\r\n</div>\r\n","import { \r\n Component, \r\n ElementRef, \r\n EventEmitter, \r\n inject, \r\n Input, \r\n OnChanges, \r\n OnInit, \r\n Output, \r\n QueryList, \r\n signal, \r\n SimpleChanges, \r\n ViewChild, \r\n ViewChildren, \r\n WritableSignal \r\n} from '@angular/core';\r\n\r\nimport { take, tap } from 'rxjs';\r\nimport { MatDialog } from '@angular/material/dialog';\r\n\r\nimport { \r\n ColumnData, \r\n ColumnOptionsData, \r\n SofColumnOptionsComponent \r\n} from '../column-options-modal/column-options.component';\r\n\r\nimport {\r\n ApplyColumnStateParams,\r\n ColDef,\r\n Column,\r\n ColumnState,\r\n FilterModel,\r\n GridApi,\r\n GridReadyEvent,\r\n HeaderPosition,\r\n IRowNode,\r\n ITextFilterParams,\r\n NavigateToNextHeaderParams,\r\n PaginationChangedEvent,\r\n SortChangedEvent,\r\n SuppressKeyboardEventParams,\r\n TabToNextHeaderParams,\r\n TextFilterModel\r\n} from \"ag-grid-community\";\r\n\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { MatSelect } from '@angular/material/select';\r\nimport { DOCUMENT } from '@angular/common';\r\n\r\n/** The Softheon Armature Table component */\r\n@Component({\r\n selector: 'sof-table',\r\n templateUrl: './sof-table.component.html',\r\n styleUrl: './sof-table.component.scss',\r\n standalone: false\r\n})\r\nexport class SofTableComponent implements OnInit, OnChanges {\r\n\r\n /** The language text or a key that will be shown in this component */\r\n @Input() public rowData!: Array<any>;\r\n\r\n /** Column Definitions: Defines & controls grid columns. */\r\n @Input() public colDefs: Array<ColDef> = [];\r\n\r\n /** Size modes for table */\r\n @Input() public sizeMode: 'Compact' | 'Roomy' | 'Default';\r\n\r\n /** Pages sizes */\r\n @Input() public paginationPageSizeSelector: Array<number> = [10, 20, 50, 100];\r\n\r\n /** Enable search, default: true */\r\n @Input() public enableSearch: boolean = true;\r\n\r\n /** Enable custom text filter dropdowns, default: true */\r\n @Input() public enableFilter: boolean = true;\r\n\r\n /** Enable column options modal selection, default: true */\r\n @Input() public enableColumnOptions: boolean = true;\r\n\r\n /** Enable export button to output filtered row data, default: false */\r\n @Input() public enableExport: boolean = false;\r\n\r\n /** Enable pagination, default: true */\r\n @Input() public enablePagination: boolean = true;\r\n\r\n /** \r\n * To display the text on the column options modal, which states -\r\n * `\"Options will be saved for the next time you log in.\"`\r\n * @default false\r\n * @description set to true if set-up for saving preferences to User data.\r\n * @note You can still save preferences to _local_ or _session_ storage\r\n * using the `savedColumnState` input, and `updatedColumnState` output event.\r\n * @see The Demo site is saving to local storage.\r\n */\r\n @Input() public showSaveColumnOptionsText: boolean = false;\r\n\r\n /** \r\n * Name/label of the table \r\n * @note should be a translation key\r\n */\r\n @Input() public tableName: string;\r\n\r\n /** Users saved column options state */\r\n @Input() public savedColumnState: ApplyColumnStateParams;\r\n\r\n /** Initial filter model */\r\n @Input() public initialFilterModel: FilterModel;\r\n\r\n /** Output updated column options event to save to user or browser storage */\r\n @Output() updatedColumnState: EventEmitter<ApplyColumnStateParams> = new EventEmitter();\r\n\r\n /** Output filtered/sorted row data and table headers, all values returned will be formatted & translated */\r\n @Output() filteredRowDataForExport: EventEmitter<ExportTableData> = new EventEmitter();\r\n\r\n /** the search input */\r\n @ViewChild('gridSearchTextInput') gridSearchTextInput: ElementRef<HTMLInputElement>;\r\n\r\n /** The hidden element that announces when the table content changes from filter */\r\n @ViewChild('ariaResultsCount') public ariaResultsCount: ElementRef<HTMLElement>;\r\n\r\n /** To reference the filter toggle panel DOM node */\r\n @ViewChild('filterPanel') filterPanel: ElementRef;\r\n\r\n /** To reference all filter mat-selects */\r\n @ViewChildren('filterSelect') filterSelects: QueryList<MatSelect>;\r\n\r\n /** \r\n * Keep track of the current column state\r\n * @note If columns are re-defined (onChanges), this state will be applied\r\n */\r\n private currentColumnState: ApplyColumnStateParams = {};\r\n\r\n /** Column names that should be filterable */\r\n public colFilters: Array<SofTableFilter> = [];\r\n\r\n /** Row Height for table */\r\n public rowHeight: number = 48;\r\n\r\n /** Current Page Index */\r\n public currentPage: number = 0;\r\n\r\n /** Grid API */\r\n private gridApi!: GridApi;\r\n\r\n /** Is the table ready to be displayed */\r\n public isGridDataRendered: WritableSignal<boolean> = signal(false);\r\n\r\n /** Default Page Size */\r\n public paginationPageSize: number = 20; \r\n\r\n /** Tool tip show delay */\r\n public tooltipShowDelay: number = 500;\r\n \r\n /** Number of filters used */\r\n public filterCount: number = 0;\r\n\r\n /** \r\n * Default Column Definition \r\n * @note (suppressKeyboardEvent) Table cells can be navigated with the arrow keys, \r\n * if the cell contains a button you can Tab into the button, enter | space to interact.\r\n */\r\n public defaultColDef: ColDef = {\r\n resizable: false, // disable resize \r\n suppressHeaderMenuButton: true, // disable default filter menu \r\n suppressMovable: true, // disable default drag & drop for columns \r\n cellStyle: { justifyContent: \"center\" },\r\n suppressKeyboardEvent: (params: SuppressKeyboardEventParams) => {\r\n const event = params.event;\r\n if (event.key === 'Enter') {\r\n const target = event.target as HTMLElement;\r\n const targetCell = target.closest('.ag-cell');\r\n if (targetCell) {\r\n const ellipsisButton = targetCell.querySelector('.button-icon-utility') as HTMLElement | null;\r\n if (ellipsisButton) {\r\n ellipsisButton.click();\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n },\r\n cellClassRules: {\r\n 'sorted-cell': params => params.column.isSortAscending() || params.column.isSortDescending()\r\n },\r\n filterParams: {\r\n maxNumConditions: 100, // by default filters have a max condition limit of only 2\r\n } as ITextFilterParams\r\n };\r\n\r\n /** Length of data */\r\n public totalLength: number = 0;\r\n\r\n /**Total number of pages */\r\n public totalNumberOfPages: number;\r\n\r\n /** Page Change text */\r\n public pageChangeText: string;\r\n\r\n /** Page selector array */\r\n public pageSelector: Array<number> = [];\r\n\r\n /** Filter Panel open state */\r\n public filterOpenState: boolean;\r\n\r\n /** The list of filters and the selected values */\r\n public filterSelections: Array<Array<string>> = [];\r\n\r\n /** mat-dialog */\r\n private dialog: MatDialog = inject(MatDialog);\r\n\r\n /** Translation service */\r\n private translateService: TranslateService = inject(TranslateService);\r\n\r\n /** Inject angular's document reference */\r\n private document: Document = inject(DOCUMENT);\r\n\r\n /** The id of the filter fieldset */\r\n public filterFieldSetId: string = '';\r\n\r\n /** The header cells sort icons */\r\n public headerSortIcons: { [key:string] : string } = {\r\n sortAscending: `<i class=\"ph-bold ph-sort-ascending\"></i>`,\r\n sortDescending: `<i class=\"ph-bold ph-sort-descending\"></i>`\r\n };\r\n\r\n /** On component init */\r\n public ngOnInit(): void {\r\n this.resizeGrid();\r\n this.filterFieldSetId = this.tableName \r\n ? (this.translateService.instant(this.tableName) + 'fieldset').toLowerCase()\r\n : 'tablefieldset';\r\n }\r\n\r\n /**\r\n * Angular On Changes\r\n * @param changes The input changes\r\n */\r\n public ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.rowData && !changes.rowData.firstChange && !!this.gridApi) {\r\n this.totalLength = this.rowData?.length ?? 0; // handles null, undefined and [] data return, so will not load indefinitely \r\n setTimeout(() => {\r\n this.populateFilters();\r\n this.handlePageChangeText();\r\n this.isGridDataRendered.set(true);\r\n });\r\n }\r\n if (changes.colDefs && !changes.colDefs.firstChange && !!this.gridApi) {\r\n setTimeout(() => {\r\n this.gridApi.applyColumnState(this.currentColumnState);\r\n this.populateFilters();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Called when the grid has ingested the input data\r\n * @param params Grid Ready Event,\r\n * The grid has initialized and is ready for most api calls, but may not be fully rendered yet.\r\n * @note you can not access this.gridApi before this function is run, \r\n * any attempts to access this.gridApi in this components ngOnInit or the first ngOnChanges cycle\r\n * will result in a type error; being this.gridApi is undefined at that time.\r\n */\r\n public onGridReady(params: GridReadyEvent) {\r\n this.gridApi = params.api;\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n this.totalLength = this.gridApi.paginationGetRowCount();\r\n setTimeout(() => {\r\n const ariaContainer = this.document.querySelector('.ag-aria-description-container');\r\n if (ariaContainer) {\r\n ariaContainer.removeAttribute('aria-live');\r\n ariaContainer.removeAttribute('aria-relevant'); \r\n ariaContainer.removeAttribute('aria-atomic');\r\n }\r\n const rootDiv = this.document.querySelector('.ag-root.ag-unselectable.ag-layout-auto-height');\r\n if (rootDiv) {\r\n rootDiv.removeAttribute('role');\r\n }\r\n });\r\n window.onresize = () => {\r\n const mobileWidthThreshold = 752;\r\n if (window.innerWidth <= mobileWidthThreshold) {\r\n this.rowHeight = 40;\r\n this.paginationPageSize = 10;\r\n }\r\n else {\r\n this.resizeGrid();\r\n }\r\n this.handlePageChangeText();\r\n }\r\n }\r\n\r\n /** Fired the first time data is rendered into the grid. */\r\n public onFirstDataRendered() {\r\n if (!this.savedColumnState?.state.length) {\r\n const columnState: Array<ColumnState> = structuredClone(this.gridApi.getColumnState());\r\n this.savedColumnState = {\r\n state: columnState,\r\n applyOrder: true\r\n };\r\n }\r\n this.gridApi.applyColumnState(this.savedColumnState);\r\n this.updatedColumnState.emit(this.savedColumnState);\r\n this.currentColumnState = this.savedColumnState;\r\n this.populateFilters();\r\n this.handlePageChangeText();\r\n this.isGridDataRendered.set(true);\r\n }\r\n\r\n /** Resize grid from size mode */\r\n private resizeGrid(): void {\r\n if (this.sizeMode === 'Compact') {\r\n this.rowHeight = 40;\r\n }\r\n else if (this.sizeMode === 'Roomy') {\r\n this.rowHeight = 56;\r\n }\r\n else {\r\n this.rowHeight = 48;\r\n }\r\n }\r\n\r\n /** \r\n * Refresh the cells if sorted to apply styling \r\n * @note styling is applied with `this.defaultColDef.cellClassRules`, refreshing cells required to take effect.\r\n */\r\n public onSortChanged(params: SortChangedEvent): void {\r\n params.api.refreshCells({force: true});\r\n }\r\n\r\n /**\r\n * On page selection change\r\n * @param value The selected page number\r\n */\r\n public onPageNumberChange(value: number): void {\r\n // The page values are 1 off to make a 1-based array, but the actual pages are a 0-based array.\r\n this.gridApi.paginationGoToPage(value - 1);\r\n }\r\n\r\n /** On next page event */\r\n public nextPage() {\r\n this.gridApi.paginationGoToNextPage();\r\n this.handlePageChangeText()\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n }\r\n\r\n /** On Previous Page Event */\r\n public previousPage() {\r\n this.gridApi.paginationGoToPreviousPage();\r\n this.handlePageChangeText()\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n }\r\n\r\n /**\r\n * On Change Page Size Event\r\n * @param event The pagination event\r\n */\r\n public changePageSize(event: PaginationChangedEvent) {\r\n // Only need to do this work if the page size has changed.\r\n if (event.newPageSize) {\r\n // Update the total number of filtered rows.\r\n this.totalLength = this.gridApi.paginationGetRowCount();\r\n // Handle text changes\r\n this.handlePageChangeText();\r\n }\r\n }\r\n\r\n /** \r\n * Called when the grid filter is changed \r\n * @todo update the filter dropdown options based on the filtered data set, instead of the complete data set.\r\n */\r\n public onFilterChanged(): void {\r\n const previousTotalLength: number = Number(this.totalLength);\r\n // Update the total number of filtered rows.\r\n this.totalLength = this.gridApi.paginationGetRowCount();\r\n if (this.totalLength !== previousTotalLength) {\r\n this.ariaResultsCount.nativeElement.innerHTML = \"\";\r\n this.ariaResultsCount.nativeElement.innerHTML = this.totalLength === 0\r\n ? this.translateService.instant('armature.sof-table.screen-reader.filtered-results.no-results')\r\n : this.translateService.instant(\r\n 'armature.sof-table.screen-reader.filtered-results.has-results', {'resultsCount': this.totalLength}\r\n );\r\n setTimeout(() => {\r\n this.ariaResultsCount.nativeElement.innerHTML = \"\";\r\n }, 100);\r\n }\r\n this.handlePageChangeText();\r\n }\r\n\r\n /** When a mat-select dropdown within the filter is opened\r\n * @param opened sets whether the selected filter has been opened\r\n */\r\n onFilterSelectOpened(opened: boolean) {\r\n if (opened) {\r\n setTimeout(() => {\r\n // Get the overlay panel\r\n const panels = this.document.querySelectorAll('.mat-select-panel');\r\n panels.forEach(panel => {\r\n // Only set if not already set\r\n if (!panel.hasAttribute('aria-multiselectable')) {\r\n panel.setAttribute('aria-multiselectable', 'true');\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n /** Generated text for showing pages in format: 1-11 of 11 */\r\n private handlePageChangeText(): void {\r\n // Handle empty table\r\n if (!this.totalLength || this.paginationPageSize === 0) {\r\n // Reset the pagination UI\r\n this.totalNumberOfPages = 1;\r\n this.pageSelector = [1];\r\n this.pageChangeText = `0`;\r\n this.gridApi.showNoRowsOverlay();\r\n return;\r\n } else {\r\n this.gridApi.hideOverlay();\r\n }\r\n // Update the total number of pages\r\n this.totalNumberOfPages = this.gridApi.paginationGetTotalPages() || Math.ceil(this.totalLength / this.paginationPageSize) || 1;\r\n // Reset the page selector\r\n this.currentPage = 1;\r\n const pageSelector = [];\r\n for (let i = 1; i <= this.totalNumberOfPages; i++) {\r\n pageSelector.push(i);\r\n }\r\n this.pageSelector = pageSelector;\r\n const length = Math.max(this.totalLength, 0);\r\n const pageSize = this.paginationPageSize;\r\n const startIndex = this.gridApi.paginationGetCurrentPage() * pageSize;\r\n const endIndex = startIndex < length ? Math.min(startIndex + pageSize, length) : startIndex + pageSize;\r\n this.pageChangeText = `${startIndex + 1} - ${endIndex}`;\r\n }\r\n\r\n /**\r\n * Apply the search filter on data when search text changed\r\n */\r\n public onSearchTextChanged(): void {\r\n this.gridApi.setGridOption(\"quickFilterText\", this.gridSearchTextInput.nativeElement.value);\r\n }\r\n\r\n /** Toggle the filter panel display */\r\n public toggleFilterPanel(): void {\r\n this.filterOpenState = !this.filterOpenState;\r\n // Only set focus when opening the panel\r\n if (this.filterOpenState) {\r\n setTimeout(() => {\r\n this.focusFirstFilterElement();\r\n }); // Wait for DOM to render\r\n }\r\n }\r\n\r\n /** Moving focus to first element of the Filter panel when opened */\r\n private focusFirstFilterElement(): void {\r\n if (this.filterPanel && this.filterPanel.nativeElement) {\r\n // Find the first focusable input or select in the panel\r\n const first = this.filterPanel.nativeElement.querySelector(\r\n 'input:not([disabled]), select:not([disabled]), mat-select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\r\n );\r\n // For mat-select, focus the underlying element\r\n if (first) {\r\n // If it's a mat-select, call focus on the underlying element\r\n if (first.tagName.toLowerCase() === 'mat-select') {\r\n first.focus();\r\n } else {\r\n first.focus();\r\n }\r\n }\r\n }\r\n } \r\n\r\n /** Apply the selected filters */\r\n public applyFilters(): void {\r\n let tableFilterModel: FilterModel = {};\r\n for (let i = 0; i < this.colFilters.length; i++) {\r\n const colFilter = this.colFilters[i];\r\n const selectedElements = this.filterSelections[i];\r\n if (!selectedElements.length) {\r\n // Reset out the column filters\r\n this.gridApi.setColumnFilterModel(colFilter.header, null);\r\n tableFilterModel[colFilter.header] = null;\r\n }\r\n else if (selectedElements.length == 1) {\r\n // Set the single filter for the column\r\n let filterModel: TextFilterModel = { filterType: 'text', type: 'equals', filter: selectedElements[0] };\r\n // Apply the filter model to the column\r\n tableFilterModel[colFilter.header] = filterModel;\r\n }\r\n else {\r\n // Set multiple OR filters for the column\r\n let filterModels: CombinedSimpleModel<TextFilterModel> = { filterType: 'text', operator: 'OR', conditions: [] };\r\n // Set the selected elements in the model\r\n for (const selectedElement of selectedElements) {\r\n filterModels.conditions.push({ filterType: 'text', type: 'equals', filter: selectedElement });\r\n }\r\n // Apply the filter model collection to the column\r\n tableFilterModel[colFilter.header] = filterModels;\r\n }\r\n }\r\n // Once everything is set, update the filters\r\n this.filterCount = this.getFilterCount();\r\n this.gridApi.setFilterModel(tableFilterModel);\r\n this.gridApi.onFilterChanged();\r\n }\r\n\r\n /** Clear all filters */\r\n public clearFilters(): void {\r\n // Clear all selections\r\n for (let i = 0; i < this.filterSelections.length; i++) {\r\n this.filterSelections[i] = [];\r\n }\r\n // Set the full grid filter model to null\r\n this.gridApi.setFilterModel(null);\r\n // Update the display\r\n this.gridApi.onFilterChanged();\r\n this.filterCount = this.getFilterCount();\r\n }\r\n\r\n /**\r\n * Returns true if no filters are selected\r\n * @returns True if a filter is selected, false otherwise.\r\n */\r\n public hasEmptyFilters(): boolean {\r\n if (!this.filterSelections || !this.filterSelections.length) {\r\n return true;\r\n }\r\n for (const filterSelect of this.filterSelections) {\r\n // If at least one filter has been selected, return false\r\n if (filterSelect.length) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /** Cancel the changes to the filter and closes the filter panel */\r\n public cancelFilterChanges(): void {\r\n //Sets the filter selections on filter panel\r\n this.setFilterSelections();\r\n // Close the filter panel\r\n this.toggleFilterPanel();\r\n }\r\n\r\n /** Populates the filter dropdowns */\r\n private populateFilters(): void {\r\n // Reset the filter dropdowns\r\n this.filterSelections = [];\r\n this.colFilters = [];\r\n // Get the column definitions that have a filter\r\n const filteredCols: Array<ColDef> = this.gridApi.getColumnDefs().filter((def) => def['filter']);\r\n // Create a map to store unique values for each field\r\n const filterValuesMap = new Map<string, Set<any>>();\r\n // Initialize sets for each field (column) \r\n for (const col of filteredCols) {\r\n const field: string = col[\"field\"];\r\n filterValuesMap.set(field, new Set<any>());\r\n }\r\n // Use forEachNode to iterate over the rows\r\n this.gridApi.forEachNode((node: IRowNode) => {\r\n if (node.data) {\r\n for (const col of filteredCols) {\r\n const field: string = col[\"field\"];\r\n const value: any = this.gridApi.getCellValue({rowNode: node, colKey: field});\r\n if (value) {\r\n filterValuesMap.get(field)?.add(value);\r\n }\r\n }\r\n }\r\n });\r\n // Now that we have the unique values for each field, populate filter options\r\n for (const col of filteredCols) {\r\n const field: string = col[\"field\"];\r\n const label: string = col[\"headerName\"];\r\n const uniqueValues: Array<any> = Array.from(filterValuesMap.get(field) || []).sort();\r\n if (uniqueValues.length > 1) {\r\n // Ensure there's space for filter selections\r\n this.filterSelections.push([]); \r\n this.colFilters.push({ header: field, label: label, options: uniqueValues });\r\n }\r\n }\r\n this.gridApi.setFilterModel(this.initialFilterModel);\r\n this.setFilterSelections();\r\n this.filterCount = this.getFilterCount();\r\n }\r\n\r\n /** Open the column options modal */\r\n public openColumnOptions(): void {\r\n const columnState: Array<ColumnState> = this.gridApi.getColumnState();\r\n const columnData: Array<ColumnData> = this.columnStateToData(columnState);\r\n const initialColumnData: Array<ColumnData> = this.columnStateToData(this.savedColumnState.state);\r\n const columnOptionsData: ColumnOptionsData = {\r\n tableName: this.tableName,\r\n columnData,\r\n initialColumnData,\r\n showSaveColumnOptionsText: this.showSaveColumnOptionsText\r\n };\r\n const dialogRef = this.dialog.open(SofColumnOptionsComponent, {\r\n width: '500px',\r\n position: { bottom: '40px', right: '40px' },\r\n ariaLabelledBy: 'column-options-heading',\r\n data: columnOptionsData\r\n });\r\n dialogRef.afterClosed().pipe(\r\n take(1),\r\n tap((updatedColumnState: ApplyColumnStateParams) => {\r\n if (updatedColumnState && updatedColumnState.state.length) {\r\n this.gridApi.applyColumnState(updatedColumnState);\r\n this.updatedColumnState.emit(updatedColumnState);\r\n this.currentColumnState = updatedColumnState;\r\n }\r\n })\r\n ).subscribe();\r\n }\r\n\r\n /**\r\n * Maps `Array<ColumnState>` to `Array<ColumnData>` \r\n * @note filters out any columns marked as 'pinned' by the column definitions.\r\n * @note filters any columns without a 'headerName'.\r\n * @param columnState the column state to modify\r\n * @returns an array of column data formatted to be ingested by the `SofColumnOptionsComponent`\r\n */\r\n private columnStateToData(columnState: Array<ColumnState>): Array<ColumnData> {\r\n return columnState\r\n .filter((column) => {\r\n const headerName: string = this.gridApi.getColumnDef(column.colId)?.headerName || \"\";\r\n if (headerName && headerName.length && !column.pinned) {\r\n return column;\r\n }\r\n })\r\n .map((column) => {\r\n const headerName: string = this.gridApi.getColumnDef(column.colId).headerName;\r\n return {\r\n id: column.colId,\r\n isChecked: !column.hide,\r\n text: headerName\r\n };\r\n }\r\n );\r\n }\r\n\r\n /** Emit the current filtered/sorted row data */\r\n public exportFilteredRowData(): void {\r\n const rowData: Array<any> = [];\r\n const columns: Array<Column> = this.gridApi.getAllDisplayedColumns().filter((col) => col.getColDef().headerName);\r\n const tableHeaders: Array<KeyValPair> = [];\r\n columns.forEach((col) => {\r\n const colDef: ColDef = col.getColDef();\r\n tableHeaders.push({\r\n key: colDef.field,\r\n value: colDef.headerName\r\n });\r\n });\r\n this.gridApi.forEachNodeAfterFilterAndSort((node: IRowNode<any>) => {\r\n const nodeData: any = {};\r\n columns.forEach((col) => {\r\n const colId: string = col.getColId();\r\n // Use gridApi's getCellValue to get the value transformed by valueGetter\r\n nodeData[colId] = this.gridApi.getCellValue({ rowNode: node, colKey: colId });\r\n });\r\n rowData.push(nodeData);\r\n });\r\n const exportData: ExportTableData = {\r\n tableHeaders,\r\n rowData\r\n };\r\n this.filteredRowDataForExport.emit(exportData);\r\n }\r\n\r\n /** Sets filter selections for filter panel */\r\n private setFilterSelections(): void {\r\n for (let i = 0; i < this.colFilters.length; i++) {\r\n // Get the stored filters for the given model\r\n const colFilter = this.colFilters[i];\r\n const model = this.gridApi.getColumnFilterModel(colFilter.header);\r\n let filterSelectionData = [];\r\n if (model && model[\"conditions\"]) {\r\n // The model is a combined model with multiple selections\r\n const filterModel = model as CombinedSimpleModel<TextFilterModel>;\r\n for (const element of filterModel.conditions) {\r\n filterSelectionData.push(element.filter);\r\n }\r\n }\r\n else if (model) {\r\n // Assume the model is a single Text Filter Model\r\n let filterSelection: TextFilterModel = model;\r\n filterSelectionData.push(filterSelection.filter);\r\n }\r\n // Set the filter selections\r\n this.filterSelections[i] = filterSelectionData;\r\n }\r\n }\r\n\r\n /** Gets the count of current filter selections */\r\n private getFilterCount(): number {\r\n return this.filterSelections.reduce((acc, curr) => acc.concat(curr), []).length;\r\n }\r\n\r\n /**\r\n * Function passed to AG Grid to ignore headers with blank headings when using arrow keys.\r\n * @param params Navigation parameters.\r\n * @returns Next column to focus or undefined if there is no next column to focus.\r\n */\r\n public navigateToNextHeader(params: NavigateToNextHeaderParams<any, any>): ((HeaderPosition | null) | undefined) {\r\n const next = params.nextHeaderPosition;\r\n if (params.key !== 'ArrowLeft' && params.key !== 'ArrowRight') {\r\n return {\r\n headerRowIndex: next.headerRowIndex,\r\n column: next.column\r\n }\r\n }\r\n const skip: boolean = !next.column.getDefinition().headerName;\r\n if (!skip) {\r\n return {\r\n headerRowIndex: 0,\r\n column: next.column\r\n }\r\n }\r\n const visibleColumns: Column[] = params.api.getColumns().filter(col => col.isVisible());\r\n let indexOf = visibleColumns.findIndex(col => col.getId() === next.column.getUniqueId());\r\n if (params.key === 'ArrowLeft' && indexOf > 0) {\r\n if (indexOf > 0) {\r\n indexOf--;\r\n return {\r\n headerRowIndex: 0,\r\n column: visibleColumns[indexOf]\r\n }\r\n } \r\n } else if (params.key === 'ArrowRight') {\r\n if (indexOf < visibleColumns.length - 1) {\r\n indexOf++;\r\n return {\r\n headerRowIndex: 0,\r\n column: visibleColumns[indexOf]\r\n }\r\n } \r\n }\r\n }\r\n \r\n /**\r\n * Function passed to AG Grid to ignore headers with blank headings when using tab key.\r\n * @param params Navigation parameters.\r\n * @returns Next column to focus or false if there is no next column to focus.\r\n */\r\n public tabToNextHeader(params: TabToNextHeaderParams<any, any>): ((HeaderPosition | boolean | null) | undefined) {\r\n const next = params.nextHeaderPosition;\r\n if (!next) {\r\n return false;\r\n }\r\n const skip: boolean = !next.column.getDefinition().headerName;\r\n if (!skip) {\r\n return {\r\n headerRowIndex: 0,\r\n column: next.column\r\n }\r\n }\r\n const visibleColumns: Column[] = params.api.getColumns().filter(col => col.isVisible());\r\n if (visibleColumns.length <= 1) {\r\n return false;\r\n }\r\n let indexOf = visibleColumns.findIndex(col => col.getId() === next.column.getUniqueId());\r\n if (params.backwards && indexOf > 0) {\r\n if (indexOf > 0) {\r\n indexOf--;\r\n return {\r\n headerRowIndex: 0,\r\n column: visibleColumns[indexOf]\r\n }\r\n } \r\n } else {\r\n if (indexOf < visibleColumns.length - 1) {\r\n indexOf++;\r\n return {\r\n headerRowIndex: 0,\r\n column: visibleColumns[indexOf]\r\n }\r\n } \r\n }\r\n return false;\r\n }\r\n}\r\n\r\nexport interface ExportTableData {\r\n tableHeaders?: Array<KeyValPair>;\r\n rowData?: Array<any>\r\n}\r\n\r\ninterface KeyValPair { \r\n key?: string;\r\n value?: string;\r\n}\r\n\r\n/** Used for setting filter values */\r\nclass SofTableFilter {\r\n /** The column header */\r\n header: string;\r\n /** The column label or translation key */\r\n label: string;\r\n /** The column filter options */\r\n options: string[] = [];\r\n}\r\n\r\n/** A filter combining multiple conditions, taken from AgGrid*/\r\nclass CombinedSimpleModel<T> {\r\n /** The filter type. Usually 'text' */\r\n filterType: string;\r\n /** The operator. Usually 'OR' */\r\n operator: 'AND' | 'OR';\r\n /** multiple instances of the Filter Model */\r\n conditions: T[];\r\n}\r\n","<div \r\n [fxShow]=\"isGridDataRendered()\"\r\n fxLayoutGap=\"16px\" m-b-24>\r\n @if (enableFilter && colFilters.length) {\r\n <button \r\n (click)=\"toggleFilterPanel()\" \r\n mat-flat-button class=\"sof-button-v2\"\r\n theme=\"neutral\" \r\n [attr.emphasis]=\"filterOpenState ? 'solid' : filterCount === 0 ? 'secondary' : 'contained'\"\r\n [matBadge]=\"filterCount\"\r\n matBadgePosition=\"after\"\r\n [matBadgeHidden]=\"filterCount === 0 ? true : false\"\r\n [attr.aria-controls]=\"filterFieldSetId\" [ariaExpanded]=\"!!filterOpenState\">\r\n <i class=\"ph ph-bold ph-sliders-horizontal\" aria-hidden=\"true\"></i>\r\n {{'armature.sof-table.filter' | translate}}\r\n </button>\r\n }\r\n @if (enableSearch) {\r\n <mat-form-field class=\"sof-form-field table-search-field dense-4\" fxFlex=\"auto\">\r\n <span matPrefix>\r\n <i class=\"ph-bold ph-magnifying-glass search-icon\" aria-hidden=\"true\"></i>\r\n </span>\r\n <mat-label class=\"search-label\">{{'armature.sof-table.search' | translate}}</mat-label>\r\n <input \r\n (input)=\"onSearchTextChanged()\" \r\n #gridSearchTextInput matInput type=\"text\" id=\"gridSearchTextInput\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.search-filter-description' | translate\"/>\r\n </mat-form-field>\r\n }\r\n @if (enableColumnOptions) {\r\n <button \r\n (click)=\"openColumnOptions()\"\r\n mat-flat-button class=\"sof-button-icon-v2\" \r\n theme=\"neutral\" emphasis=\"secondary\" id=\"open-column-options\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.column-options-btn' | translate\"\r\n [matTooltip]=\"'armature.sof-table.screen-reader.column-options-btn' | translate\"\r\n [disabled]=\"!totalLength\">\r\n <i class=\"ph-bold ph-pause\" aria-hidden=\"true\"></i>\r\n </button>\r\n }\r\n @if(enableExport) {\r\n <button \r\n (click)=\"exportFilteredRowData()\"\r\n mat-flat-button class=\"sof-button-icon-v2\" \r\n theme=\"neutral\" emphasis=\"secondary\" id=\"export-table\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.export-table' | translate\"\r\n [matTooltip]=\"'armature.sof-table.screen-reader.export-table' | translate\"\r\n [disabled]=\"!totalLength\">\r\n <i class=\"ph-bold ph-export\" aria-hidden=\"true\"></i>\r\n </button>\r\n }\r\n <ng-content select=\"[sof-table-right-buttons]\"></ng-content>\r\n <!-- \r\n Only inject <button>'s inside an <ng-container sof-table-right-buttons>\r\n ... \r\n <ng-container sof-table-right-buttons>\r\n <button \r\n (click)=\"anyFunction()\"\r\n mat-flat-button class=\"sof-button-icon-v2\" \r\n theme=\"neutral\" emphasis=\"secondary\" aria-label=\"any button\"\r\n matTooltip=\"any button\">\r\n <i class=\"ph-bold ph-acorn\" aria-hidden=\"true\"></i>\r\n </button>\r\n </ng-container>\r\n ... \r\n note: make sure buttons have the following attributes to match others (unless other style needed by design) =\r\n `mat-flat-button class=\"sof-button-icon-v2\" theme=\"neutral\" emphasis=\"secondary\"`\r\n * remember to add aria-label and tooltip for icon only button\r\n -->\r\n</div>\r\n\r\n<div #ariaResultsCount class=\"sr-only\" aria-live=\"assertive\"></div>\r\n\r\n@if (isGridDataRendered() && filterOpenState) {\r\n <fieldset \r\n #filterPanel\r\n [id]=\"filterFieldSetId\"\r\n class=\"filter-panel\" role=\"region\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.select-filters-description' | translate\">\r\n <p>\r\n <i class=\"ph ph-bold ph-sliders-horizontal\" aria-hidden=\"true\"></i>\r\n <span class=\"m-l-8\">{{'armature.sof-table.filter' | translate}}</span>\r\n </p>\r\n <div class=\"filter-panel-select-container m-v-20\">\r\n @for (colFilter of colFilters; let i = $index; track i) {\r\n <mat-form-field appearance=\"outline\" class=\"sof-form-field table-filter-select\">\r\n <mat-label [attr.for]=\"'filterDropdown' + i\">{{ colFilter.label }}</mat-label>\r\n <mat-select\r\n #filterSelect\r\n [(ngModel)]=\"filterSelections[i]\" \r\n multiple \r\n id=\"filterDropdown{{i}}\"\r\n (openedChange)=\"onFilterSelectOpened($event)\"\r\n placeholder=\"{{'armature.sof-table.all' | translate}}\" disableRipple=\"true\">\r\n @for (colOption of colFilter.options; track $index) {\r\n <mat-option [value]=\"colOption\">\r\n {{colOption}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n </div>\r\n <div fxLayout=\"row\">\r\n <div fxFlex=\"50%\">\r\n <button \r\n (click)=\"clearFilters()\" [disabled]=\"hasEmptyFilters()\" \r\n mat-flat-button class=\"sof-button-v2\"\r\n theme=\"neutral\" emphasis=\"floating\"\r\n id=\"tableFilterClear\">\r\n {{'armature.sof-table.reset' | translate}}\r\n </button>\r\n </div>\r\n <div fxFlex=\"50%\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"2%\" fxLayoutAlign=\"flex-end\">\r\n <div fxFlex=\"0 1 auto\">\r\n <button \r\n (click)=\"cancelFilterChanges()\" mat-flat-button class=\"sof-button-v2\" \r\n id=\"tableFilterCancel\" theme=\"neutral\" emphasis=\"secondary\">\r\n {{'armature.sof-table.cancel' | translate}}\r\n </button>\r\n </div>\r\n <div fxFlex=\"0 1 auto\">\r\n <button \r\n (click)=\"applyFilters()\" mat-flat-button class=\"sof-button-v2\"\r\n id=\"tableFilterApply\" theme=\"primary\" emphasis=\"solid\">\r\n {{'armature.sof-table.results' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </fieldset>\r\n}\r\n\r\n<ag-grid-angular \r\n [fxShow]=\"isGridDataRendered()\"\r\n (gridReady)=\"onGridReady($event)\" \r\n (firstDataRendered)=\"onFirstDataRendered()\"\r\n (filterChanged)=\"onFilterChanged()\"\r\n (paginationChanged)=\"changePageSize($event)\" \r\n (sortChanged)=\"onSortChanged($event)\"\r\n [icons]=\"headerSortIcons\"\r\n [rowData]=\"rowData\" \r\n [columnDefs]=\"colDefs\" \r\n [defaultColDef]=\"defaultColDef\" \r\n [pagination]=\"enablePagination\" \r\n [suppressPaginationPanel]=\"true\"\r\n [paginationPageSizeSelector]=\"paginationPageSizeSelector\" \r\n [paginationPageSize]=\"paginationPageSize\"\r\n [headerHeight]=\"rowHeight\" \r\n [rowHeight]=\"rowHeight\" \r\n [domLayout]=\"'autoHeight'\" \r\n [tooltipShowDelay]=\"tooltipShowDelay\"\r\n [overlayNoRowsTemplate]=\"('armature.sof-table.no-rows' | translate) || 'No results found.'\"\r\n [class.no-rows]=\"!totalLength\" [tabToNextHeader]=\"tabToNextHeader\" [navigateToNextHeader]=\"navigateToNextHeader\"\r\n class=\"ag-theme-material\">\r\n</ag-grid-angular>\r\n\r\n@if (enablePagination) {\r\n <div \r\n [fxShow]=\"isGridDataRendered() && totalLength\"\r\n class=\"custom-paginator\">\r\n <div class=\"first-section\">\r\n <mat-select\r\n #pageSizeSelect class=\"button-part-1\" aria-label=\"{{'armature.sof-table.page-size-arialabel' | translate}}\"\r\n id=\"pageSizeInput\" name=\"pageSizeInput\" \r\n [(value)]=\"paginationPageSize\" disableRipple=\"true\">\r\n @for (size of paginationPageSizeSelector; let i = $index; track i) {\r\n <mat-option \r\n class=\"page-option\" id=\"size{{i}}\"\r\n [value]=\"paginationPageSizeSelector[i]\">\r\n {{size}}\r\n </mat-option>\r\n }\r\n <mat-select-trigger>\r\n <div class=\"field\">\r\n <span class=\"current-page\">\r\n {{paginationPageSize}}\r\n </span>\r\n <span class=\"select-icon\">\r\n <i [class]=\"'ph-bold ph-caret-' + (pageSizeSelect.panelOpen ? 'up':'down')\" aria-hidden=\"true\"></i>\r\n </span>\r\n </div>\r\n </mat-select-trigger>\r\n </mat-select>\r\n <span class=\"page-change-text\">\r\n {{pageChangeText}} {{'armature.sof-table.of' | translate}} {{totalLength}}\r\n </span>\r\n </div>\r\n <div class=\"go-to-page\">\r\n <mat-select\r\n #pageNumberSelect class=\"button-part\" aria-label=\"{{'armature.sof-table.page-selector-arialabel' | translate}}\"\r\n (selectionChange)=\"onPageNumberChange($event.value)\"\r\n [(value)]=\"currentPage\" \r\n id=\"pageSelelctor\" name=\"pageSelector\" disableRipple=\"true\">\r\n @for (page of pageSelector; track $index) {\r\n <mat-option [value]=\"page\" class=\"page-option\">\r\n <span class=\"current-page\">\r\n {{page}}\r\n </span>\r\n </mat-option>\r\n }\r\n <mat-select-trigger>\r\n <div class=\"field\">\r\n <span class=\"current-page\">\r\n {{currentPage}} {{'armature.sof-table.of' | translate}} {{totalNumberOfPages}}\r\n </span>\r\n <span class=\"select-icon\">\r\n <i [class]=\"'ph-bold ph-caret-' + (pageNumberSelect.panelOpen ? 'up':'down')\" aria-hidden=\"true\"></i>\r\n </span>\r\n </div>\r\n </mat-select-trigger>\r\n </mat-select>\r\n <nav class=\"second-section\">\r\n <button \r\n (click)=\"previousPage()\"\r\n id=\"prev-button\" mat-flat-button class=\"sof-button-icon-v2\" theme=\"neutral\" emphasis=\"secondary\"\r\n [disabled]=\"currentPage === 1\" \r\n [attr.aria-label]=\"'screen-reader.pagination.previous' | translate\">\r\n <i class=\"ph-bold ph-caret-left\" aria-hidden=\"true\"></i>\r\n </button>\r\n <button \r\n (click)=\"nextPage()\" \r\n id=\"next-button\" mat-flat-button class=\"sof-button-icon-v2\" theme=\"neutral\" emphasis=\"secondary\"\r\n [disabled]=\"currentPage === totalNumberOfPages\"\r\n [attr.aria-label]=\"'screen-reader.pagination.next' | translate\">\r\n <i class=\"ph-bold ph-caret-right\" aria-hidden=\"true\"></i>\r\n </button>\r\n </nav>\r\n </div>\r\n </div>\r\n}\r\n\r\n@if (!isGridDataRendered()) {\r\n <div class=\"loading-container\">\r\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\"/>\r\n </div>\r\n}\r\n","import { Component, Input } from '@angular/core';\r\n\r\n/** The Softheon Armature Table Cell component */\r\n@Component({\r\n selector: 'sof-table-cell',\r\n templateUrl: './table-cell.component.html',\r\n styleUrl: './table-cell.component.scss',\r\n standalone: false\r\n})\r\nexport class SofTableCellComponent {\r\n\r\n /** All Components for Table Cell */\r\n @Input() public components: TableCellComponent[] = [];\r\n\r\n /** Any logic related to ag grid cell renderer data can be added here */\r\n public agInit(params): void {\r\n this.components = params['components'];\r\n }\r\n}\r\n\r\n/** Components to Render in Table Cell */\r\ninterface TableCellComponent {\r\n /** Component Class */\r\n component: any,\r\n /** Inputs needed for specific component */\r\n inputs: any\r\n}\r\n","<div class=\"table-cell\">\r\n <ng-container *ngFor=\"let currentComponent of components\">\r\n <ng-container *ngComponentOutlet=\"currentComponent.component; \r\n inputs:currentComponent.inputs;\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatOptionModule } from '@angular/material/core';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { AgGridModule } from 'ag-grid-angular';\r\nimport { SofTableComponent } from './sof-table/sof-table.component';\r\nimport { SofTableCellComponent } from './table-cell/table-cell.component';\r\nimport { SofColumnOptionsComponent } from './column-options-modal/column-options.component';\r\nimport { BaseComponentModule } from '@softheon/armature';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\n\r\n\r\n/** The material modules */\r\nconst materialModules = [\r\n MatSelectModule,\r\n MatOptionModule,\r\n MatCheckboxModule,\r\n MatIconModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatToolbarModule,\r\n MatTooltipModule,\r\n MatButtonToggleModule,\r\n MatCardModule,\r\n MatRadioModule,\r\n MatBadgeModule,\r\n MatProgressSpinnerModule\r\n];\r\n\r\n@NgModule({\r\n declarations: [\r\n SofTableComponent,\r\n SofTableCellComponent,\r\n SofColumnOptionsComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n FlexLayoutModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TranslateModule,\r\n AgGridModule,\r\n ...materialModules,\r\n BaseComponentModule\r\n ],\r\n exports: [\r\n SofTableComponent,\r\n SofTableCellComponent,\r\n SofColumnOptionsComponent\r\n ]\r\n})\r\nexport class AgGridComponentsModule { }\r\n","/** Public API Surface of Ag Grid components */\r\nexport * from './src/ag-grid-components.module';\r\nexport * from './src/sof-table/sof-table.component';\r\nexport * from './src/table-cell/table-cell.component';\r\nexport * from './src/column-options-modal/column-options.component';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i4","i8","i13"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"softheon-armature-ag-grid-components.mjs","sources":["../../../../projects/armature/ag-grid-components/src/column-options-modal/column-options.component.ts","../../../../projects/armature/ag-grid-components/src/column-options-modal/column-options.component.html","../../../../projects/armature/ag-grid-components/src/sof-table/sof-table.component.ts","../../../../projects/armature/ag-grid-components/src/sof-table/sof-table.component.html","../../../../projects/armature/ag-grid-components/src/table-cell/table-cell.component.ts","../../../../projects/armature/ag-grid-components/src/table-cell/table-cell.component.html","../../../../projects/armature/ag-grid-components/src/ag-grid-components.module.ts","../../../../projects/armature/ag-grid-components/public-api.ts","../../../../projects/armature/ag-grid-components/softheon-armature-ag-grid-components.ts"],"sourcesContent":["import { Component, inject } from \"@angular/core\";\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from \"@angular/material/dialog\";\r\nimport { ApplyColumnStateParams, ColumnState } from \"ag-grid-community\";\r\n\r\n/** Table Column options dialog */\r\n@Component({\r\n selector: 'sof-column-options',\r\n templateUrl: './column-options.component.html',\r\n styleUrl: './column-options.component.scss',\r\n standalone: false\r\n})\r\nexport class SofColumnOptionsComponent {\r\n\r\n /** dialog reference */\r\n private dialogRef: MatDialogRef<SofColumnOptionsComponent> = inject(MatDialogRef<SofColumnOptionsComponent>);\r\n\r\n /** dialog data */\r\n public data: ColumnOptionsData = inject(MAT_DIALOG_DATA);\r\n\r\n /** emit the updated column state */\r\n public applyUpdatedColumnState(): void {\r\n const columnState: Array<ColumnState> = this.data.columnData.map((column) => {\r\n return {\r\n colId: column.id,\r\n hide: !column.isChecked\r\n }\r\n });\r\n const updatedColumnState: ApplyColumnStateParams = {\r\n state: [...columnState],\r\n applyOrder: true\r\n };\r\n this.dialogRef.close(updatedColumnState);\r\n }\r\n\r\n /** reset the column data to its first saved value */\r\n public resetColumnData(): void {\r\n this.data.columnData = structuredClone(this.data.initialColumnData);\r\n }\r\n}\r\n\r\n/** \r\n * Column options modal data\r\n * @description data passed from the 'SofTableComponent'\r\n * @property `tableName: string` name of the table using the column options\r\n * @property `columnData: Array<ColumnData>` column data returned from the agGrid api\r\n * @property `initialColumnData: Array<ColumnData>` column data from saved user preference or initial `columnData` \r\n * @see {@link ColumnData}\r\n */\r\nexport interface ColumnOptionsData {\r\n /** name of the table using the column options */\r\n tableName?: string;\r\n /** column data returned from the agGrid api */\r\n columnData?: Array<ColumnData>;\r\n /** column data from saved user preference or initial `columnData` */\r\n initialColumnData?: Array<ColumnData>;\r\n /** \r\n * To display the text on the column options modal, which states -\r\n * `\"Options will be saved for the next time you log in.\"`\r\n */\r\n showSaveColumnOptionsText?: boolean;\r\n}\r\n\r\n/** \r\n * Column data \r\n * @description column data derived from the agGrid api, adds id property to type `HandleInput`\r\n * @property `id: string` columns unique id\r\n * @property `text: string` columns header text\r\n * @property `isChecked: boolean` column not hidden\r\n*/\r\nexport interface ColumnData {\r\n /** columns unique id */\r\n id?: string;\r\n /** columns header text */\r\n text?: string;\r\n /** column not hidden */\r\n isChecked?: boolean;\r\n}\r\n","<div class=\"column-options-header\">\r\n <i class=\"ph-bold ph-square-split-horizontal\" aria-hidden=\"true\"></i>\r\n <h2 id=\"column-options-heading\">{{'armature.sof-table.column-options' | translate}}</h2>\r\n <button \r\n mat-dialog-close m-l-auto \r\n disableRipple=\"true\" id=\"column-options-close\" aria-label=\"close\">\r\n <i class=\"ph-bold ph-x close\" aria-hidden=\"true\"></i>\r\n </button>\r\n</div>\r\n<div class=\"column-options-container\">\r\n <div class=\"column-options-description\">\r\n <p>\r\n {{'armature.sof-table.column-options-description' | translate}} \r\n {{ data.showSaveColumnOptionsText ? ('armature.sof-table.column-options-description-saving' | translate) : ''}}\r\n </p>\r\n <p class=\"table-label\">{{data.tableName | translate}} {{'armature.sof-table.columns' | translate}}</p>\r\n </div>\r\n <div class=\"column-options-selections\">\r\n <sof-handle [handleList]=\"data.columnData\"/>\r\n </div>\r\n <div class=\"column-options-bottom\">\r\n <button\r\n (click)=\"resetColumnData()\"\r\n mat-flat-button\r\n theme=\"neutral\" emphasis=\"floating\"\r\n class=\"sof-button-v2\" m-r-auto\r\n id=\"column-options-reset\">\r\n {{'armature.sof-table.reset' | translate}}\r\n </button>\r\n <button \r\n mat-flat-button mat-dialog-close \r\n theme=\"neutral\" emphasis=\"secondary\"\r\n class=\"sof-button-v2\"\r\n id=\"column-options-cancel\">\r\n {{'armature.sof-table.cancel' | translate}}\r\n </button>\r\n <button \r\n (click)=\"applyUpdatedColumnState()\"\r\n mat-flat-button \r\n class=\"sof-button-v2\"\r\n theme=\"primary\" emphasis=\"solid\"\r\n id=\"column-options-update\">\r\n {{'armature.sof-table.update' | translate}}\r\n </button>\r\n </div>\r\n</div>\r\n","import { \r\n Component, \r\n ElementRef, \r\n EventEmitter, \r\n inject, \r\n Input, \r\n OnChanges, \r\n OnInit, \r\n Output, \r\n QueryList, \r\n signal, \r\n SimpleChanges, \r\n ViewChild, \r\n ViewChildren, \r\n WritableSignal \r\n} from '@angular/core';\r\n\r\nimport { take, tap } from 'rxjs';\r\nimport { MatDialog } from '@angular/material/dialog';\r\n\r\nimport { \r\n ColumnData, \r\n ColumnOptionsData, \r\n SofColumnOptionsComponent \r\n} from '../column-options-modal/column-options.component';\r\n\r\nimport {\r\n ApplyColumnStateParams,\r\n ColDef,\r\n Column,\r\n ColumnState,\r\n FilterModel,\r\n GridApi,\r\n GridReadyEvent,\r\n HeaderPosition,\r\n IRowNode,\r\n ITextFilterParams,\r\n NavigateToNextHeaderParams,\r\n PaginationChangedEvent,\r\n SortChangedEvent,\r\n SuppressKeyboardEventParams,\r\n TabToNextHeaderParams,\r\n TextFilterModel\r\n} from \"ag-grid-community\";\r\n\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { MatSelect } from '@angular/material/select';\r\nimport { DOCUMENT } from '@angular/common';\r\n\r\n/** The Softheon Armature Table component */\r\n@Component({\r\n selector: 'sof-table',\r\n templateUrl: './sof-table.component.html',\r\n styleUrl: './sof-table.component.scss',\r\n standalone: false\r\n})\r\nexport class SofTableComponent implements OnInit, OnChanges {\r\n\r\n /** The language text or a key that will be shown in this component */\r\n @Input() public rowData!: Array<any>;\r\n\r\n /** Column Definitions: Defines & controls grid columns. */\r\n @Input() public colDefs: Array<ColDef> = [];\r\n\r\n /** Size modes for table */\r\n @Input() public sizeMode: 'Compact' | 'Roomy' | 'Default';\r\n\r\n /** Pages sizes */\r\n @Input() public paginationPageSizeSelector: Array<number> = [10, 20, 50, 100];\r\n\r\n /** Enable search, default: true */\r\n @Input() public enableSearch: boolean = true;\r\n\r\n /** Enable custom text filter dropdowns, default: true */\r\n @Input() public enableFilter: boolean = true;\r\n\r\n /** Enable column options modal selection, default: true */\r\n @Input() public enableColumnOptions: boolean = true;\r\n\r\n /** Enable export button to output filtered row data, default: false */\r\n @Input() public enableExport: boolean = false;\r\n\r\n /** Enable pagination, default: true */\r\n @Input() public enablePagination: boolean = true;\r\n\r\n /** \r\n * To display the text on the column options modal, which states -\r\n * `\"Options will be saved for the next time you log in.\"`\r\n * @default false\r\n * @description set to true if set-up for saving preferences to User data.\r\n * @note You can still save preferences to _local_ or _session_ storage\r\n * using the `savedColumnState` input, and `updatedColumnState` output event.\r\n * @see The Demo site is saving to local storage.\r\n */\r\n @Input() public showSaveColumnOptionsText: boolean = false;\r\n\r\n /** \r\n * Name/label of the table \r\n * @note should be a translation key\r\n */\r\n @Input() public tableName: string;\r\n\r\n /** Users saved column options state */\r\n @Input() public savedColumnState: ApplyColumnStateParams;\r\n\r\n /** Initial filter model */\r\n @Input() public initialFilterModel: FilterModel;\r\n\r\n /** Output updated column options event to save to user or browser storage */\r\n @Output() updatedColumnState: EventEmitter<ApplyColumnStateParams> = new EventEmitter();\r\n\r\n /** Output filtered/sorted row data and table headers, all values returned will be formatted & translated */\r\n @Output() filteredRowDataForExport: EventEmitter<ExportTableData> = new EventEmitter();\r\n\r\n /** the search input */\r\n @ViewChild('gridSearchTextInput') gridSearchTextInput: ElementRef<HTMLInputElement>;\r\n\r\n /** The hidden element that announces when the table content changes from filter */\r\n @ViewChild('ariaResultsCount') public ariaResultsCount: ElementRef<HTMLElement>;\r\n\r\n /** To reference the filter toggle panel DOM node */\r\n @ViewChild('filterPanel') filterPanel: ElementRef;\r\n\r\n /** To reference all filter mat-selects */\r\n @ViewChildren('filterSelect') filterSelects: QueryList<MatSelect>;\r\n\r\n /** \r\n * Keep track of the current column state\r\n * @note If columns are re-defined (onChanges), this state will be applied\r\n */\r\n private currentColumnState: ApplyColumnStateParams = {};\r\n\r\n /** Column names that should be filterable */\r\n public colFilters: Array<SofTableFilter> = [];\r\n\r\n /** Row Height for table */\r\n public rowHeight: number = 48;\r\n\r\n /** Current Page Index */\r\n public currentPage: number = 0;\r\n\r\n /** Grid API */\r\n private gridApi!: GridApi;\r\n\r\n /** Is the table ready to be displayed */\r\n public isGridDataRendered: WritableSignal<boolean> = signal(false);\r\n\r\n /** Default Page Size */\r\n public paginationPageSize: number = 20; \r\n\r\n /** Tool tip show delay */\r\n public tooltipShowDelay: number = 500;\r\n \r\n /** Number of filters used */\r\n public filterCount: number = 0;\r\n\r\n /** \r\n * Default Column Definition \r\n * @note (suppressKeyboardEvent) Table cells can be navigated with the arrow keys, \r\n * if the cell contains a button you can Tab into the button, enter | space to interact.\r\n */\r\n public defaultColDef: ColDef = {\r\n resizable: false, // disable resize \r\n suppressHeaderMenuButton: true, // disable default filter menu \r\n suppressMovable: true, // disable default drag & drop for columns \r\n cellStyle: { justifyContent: \"center\" },\r\n suppressKeyboardEvent: (params: SuppressKeyboardEventParams) => {\r\n const event = params.event;\r\n if (event.key === 'Enter') {\r\n const target = event.target as HTMLElement;\r\n const targetCell = target.closest('.ag-cell');\r\n if (targetCell) {\r\n const ellipsisButton = targetCell.querySelector('.button-icon-utility') as HTMLElement | null;\r\n if (ellipsisButton) {\r\n ellipsisButton.click();\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n },\r\n cellClassRules: {\r\n 'sorted-cell': params => params.column.isSortAscending() || params.column.isSortDescending()\r\n },\r\n filterParams: {\r\n maxNumConditions: 100, // by default filters have a max condition limit of only 2\r\n } as ITextFilterParams\r\n };\r\n\r\n /** Length of data */\r\n public totalLength: number = 0;\r\n\r\n /**Total number of pages */\r\n public totalNumberOfPages: number;\r\n\r\n /** Page Change text */\r\n public pageChangeText: string;\r\n\r\n /** Page selector array */\r\n public pageSelector: Array<number> = [];\r\n\r\n /** Filter Panel open state */\r\n public filterOpenState: boolean;\r\n\r\n /** The list of filters and the selected values */\r\n public filterSelections: Array<Array<string>> = [];\r\n\r\n /** mat-dialog */\r\n private dialog: MatDialog = inject(MatDialog);\r\n\r\n /** Translation service */\r\n private translateService: TranslateService = inject(TranslateService);\r\n\r\n /** Inject angular's document reference */\r\n private document: Document = inject(DOCUMENT);\r\n\r\n /** The id of the filter fieldset */\r\n public filterFieldSetId: string = '';\r\n\r\n /** The header cells sort icons */\r\n public headerSortIcons: { [key:string] : string } = {\r\n sortAscending: `<i class=\"ph-bold ph-sort-ascending\"></i>`,\r\n sortDescending: `<i class=\"ph-bold ph-sort-descending\"></i>`\r\n };\r\n\r\n /** On component init */\r\n public ngOnInit(): void {\r\n this.resizeGrid();\r\n this.filterFieldSetId = this.tableName \r\n ? (this.translateService.instant(this.tableName) + 'fieldset').toLowerCase()\r\n : 'tablefieldset';\r\n }\r\n\r\n /**\r\n * Angular On Changes\r\n * @param changes The input changes\r\n */\r\n public ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.rowData && !changes.rowData.firstChange && !!this.gridApi) {\r\n this.totalLength = this.rowData?.length ?? 0; // handles null, undefined and [] data return, so will not load indefinitely \r\n setTimeout(() => {\r\n this.populateFilters();\r\n this.handlePageChangeText();\r\n this.isGridDataRendered.set(true);\r\n });\r\n }\r\n if (changes.colDefs && !changes.colDefs.firstChange && !!this.gridApi) {\r\n setTimeout(() => {\r\n this.gridApi.applyColumnState(this.currentColumnState);\r\n this.populateFilters();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Called when the grid has ingested the input data\r\n * @param params Grid Ready Event,\r\n * The grid has initialized and is ready for most api calls, but may not be fully rendered yet.\r\n * @note you can not access this.gridApi before this function is run, \r\n * any attempts to access this.gridApi in this components ngOnInit or the first ngOnChanges cycle\r\n * will result in a type error; being this.gridApi is undefined at that time.\r\n */\r\n public onGridReady(params: GridReadyEvent) {\r\n this.gridApi = params.api;\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n this.totalLength = this.enablePagination ? this.gridApi.paginationGetRowCount() : this.gridApi.getDisplayedRowCount();\r\n setTimeout(() => {\r\n const ariaContainer = this.document.querySelector('.ag-aria-description-container');\r\n if (ariaContainer) {\r\n ariaContainer.removeAttribute('aria-live');\r\n ariaContainer.removeAttribute('aria-relevant'); \r\n ariaContainer.removeAttribute('aria-atomic');\r\n }\r\n const rootDiv = this.document.querySelector('.ag-root.ag-unselectable.ag-layout-auto-height');\r\n if (rootDiv) {\r\n rootDiv.removeAttribute('role');\r\n }\r\n });\r\n window.onresize = () => {\r\n const mobileWidthThreshold = 752;\r\n if (window.innerWidth <= mobileWidthThreshold) {\r\n this.rowHeight = 40;\r\n this.paginationPageSize = 10;\r\n }\r\n else {\r\n this.resizeGrid();\r\n }\r\n this.handlePageChangeText();\r\n }\r\n }\r\n\r\n /** Fired the first time data is rendered into the grid. */\r\n public onFirstDataRendered() {\r\n if (!this.savedColumnState?.state.length) {\r\n const columnState: Array<ColumnState> = structuredClone(this.gridApi.getColumnState());\r\n this.savedColumnState = {\r\n state: columnState,\r\n applyOrder: true\r\n };\r\n }\r\n this.gridApi.applyColumnState(this.savedColumnState);\r\n this.updatedColumnState.emit(this.savedColumnState);\r\n this.currentColumnState = this.savedColumnState;\r\n this.populateFilters();\r\n this.handlePageChangeText();\r\n this.isGridDataRendered.set(true);\r\n }\r\n\r\n /** Resize grid from size mode */\r\n private resizeGrid(): void {\r\n if (this.sizeMode === 'Compact') {\r\n this.rowHeight = 40;\r\n }\r\n else if (this.sizeMode === 'Roomy') {\r\n this.rowHeight = 56;\r\n }\r\n else {\r\n this.rowHeight = 48;\r\n }\r\n }\r\n\r\n /** \r\n * Refresh the cells if sorted to apply styling \r\n * @note styling is applied with `this.defaultColDef.cellClassRules`, refreshing cells required to take effect.\r\n */\r\n public onSortChanged(params: SortChangedEvent): void {\r\n params.api.refreshCells({force: true});\r\n }\r\n\r\n /**\r\n * On page selection change\r\n * @param value The selected page number\r\n */\r\n public onPageNumberChange(value: number): void {\r\n // The page values are 1 off to make a 1-based array, but the actual pages are a 0-based array.\r\n this.gridApi.paginationGoToPage(value - 1);\r\n }\r\n\r\n /** On next page event */\r\n public nextPage() {\r\n this.gridApi.paginationGoToNextPage();\r\n this.handlePageChangeText()\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n }\r\n\r\n /** On Previous Page Event */\r\n public previousPage() {\r\n this.gridApi.paginationGoToPreviousPage();\r\n this.handlePageChangeText()\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n }\r\n\r\n /**\r\n * On Change Page Size Event\r\n * @param event The pagination event\r\n */\r\n public changePageSize(event: PaginationChangedEvent) {\r\n // Only need to do this work if the page size has changed.\r\n if (event.newPageSize) {\r\n // Update the total number of filtered rows.\r\n this.totalLength = this.enablePagination ? this.gridApi.paginationGetRowCount() : this.gridApi.getDisplayedRowCount();\r\n // Handle text changes\r\n this.handlePageChangeText();\r\n }\r\n }\r\n\r\n /** \r\n * Called when the grid filter is changed \r\n * @todo update the filter dropdown options based on the filtered data set, instead of the complete data set.\r\n */\r\n public onFilterChanged(): void {\r\n const previousTotalLength: number = Number(this.totalLength);\r\n // Update the total number of filtered rows.\r\n this.totalLength = this.enablePagination ? this.gridApi.paginationGetRowCount() : this.gridApi.getDisplayedRowCount();\r\n if (this.totalLength !== previousTotalLength) {\r\n this.ariaResultsCount.nativeElement.innerHTML = \"\";\r\n this.ariaResultsCount.nativeElement.innerHTML = this.totalLength === 0\r\n ? this.translateService.instant('armature.sof-table.screen-reader.filtered-results.no-results')\r\n : this.translateService.instant(\r\n 'armature.sof-table.screen-reader.filtered-results.has-results', {'resultsCount': this.totalLength}\r\n );\r\n setTimeout(() => {\r\n this.ariaResultsCount.nativeElement.innerHTML = \"\";\r\n }, 100);\r\n }\r\n this.handlePageChangeText();\r\n }\r\n\r\n /** When a mat-select dropdown within the filter is opened\r\n * @param opened sets whether the selected filter has been opened\r\n */\r\n onFilterSelectOpened(opened: boolean) {\r\n if (opened) {\r\n setTimeout(() => {\r\n // Get the overlay panel\r\n const panels = this.document.querySelectorAll('.mat-select-panel');\r\n panels.forEach(panel => {\r\n // Only set if not already set\r\n if (!panel.hasAttribute('aria-multiselectable')) {\r\n panel.setAttribute('aria-multiselectable', 'true');\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n /** Generated text for showing pages in format: 1-11 of 11 */\r\n private handlePageChangeText(): void {\r\n // Handle empty table\r\n if (!this.totalLength || this.paginationPageSize === 0) {\r\n // Reset the pagination UI\r\n this.totalNumberOfPages = 1;\r\n this.pageSelector = [1];\r\n this.pageChangeText = `0`;\r\n this.gridApi.showNoRowsOverlay();\r\n return;\r\n } else {\r\n this.gridApi.hideOverlay();\r\n }\r\n // Update the total number of pages\r\n this.totalNumberOfPages = this.gridApi.paginationGetTotalPages() || Math.ceil(this.totalLength / this.paginationPageSize) || 1;\r\n // Reset the page selector\r\n this.currentPage = 1;\r\n const pageSelector = [];\r\n for (let i = 1; i <= this.totalNumberOfPages; i++) {\r\n pageSelector.push(i);\r\n }\r\n this.pageSelector = pageSelector;\r\n const length = Math.max(this.totalLength, 0);\r\n const pageSize = this.paginationPageSize;\r\n const startIndex = this.gridApi.paginationGetCurrentPage() * pageSize;\r\n const endIndex = startIndex < length ? Math.min(startIndex + pageSize, length) : startIndex + pageSize;\r\n this.pageChangeText = `${startIndex + 1} - ${endIndex}`;\r\n }\r\n\r\n /**\r\n * Apply the search filter on data when search text changed\r\n */\r\n public onSearchTextChanged(): void {\r\n this.gridApi.setGridOption(\"quickFilterText\", this.gridSearchTextInput.nativeElement.value);\r\n }\r\n\r\n /** Toggle the filter panel display */\r\n public toggleFilterPanel(): void {\r\n this.filterOpenState = !this.filterOpenState;\r\n // Only set focus when opening the panel\r\n if (this.filterOpenState) {\r\n setTimeout(() => {\r\n this.focusFirstFilterElement();\r\n }); // Wait for DOM to render\r\n }\r\n }\r\n\r\n /** Moving focus to first element of the Filter panel when opened */\r\n private focusFirstFilterElement(): void {\r\n if (this.filterPanel && this.filterPanel.nativeElement) {\r\n // Find the first focusable input or select in the panel\r\n const first = this.filterPanel.nativeElement.querySelector(\r\n 'input:not([disabled]), select:not([disabled]), mat-select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\r\n );\r\n // For mat-select, focus the underlying element\r\n if (first) {\r\n // If it's a mat-select, call focus on the underlying element\r\n if (first.tagName.toLowerCase() === 'mat-select') {\r\n first.focus();\r\n } else {\r\n first.focus();\r\n }\r\n }\r\n }\r\n } \r\n\r\n /** Apply the selected filters */\r\n public applyFilters(): void {\r\n let tableFilterModel: FilterModel = {};\r\n for (let i = 0; i < this.colFilters.length; i++) {\r\n const colFilter = this.colFilters[i];\r\n const selectedElements = this.filterSelections[i];\r\n if (!selectedElements.length) {\r\n // Reset out the column filters\r\n this.gridApi.setColumnFilterModel(colFilter.header, null);\r\n tableFilterModel[colFilter.header] = null;\r\n }\r\n else if (selectedElements.length == 1) {\r\n // Set the single filter for the column\r\n let filterModel: TextFilterModel = { filterType: 'text', type: 'equals', filter: selectedElements[0] };\r\n // Apply the filter model to the column\r\n tableFilterModel[colFilter.header] = filterModel;\r\n }\r\n else {\r\n // Set multiple OR filters for the column\r\n let filterModels: CombinedSimpleModel<TextFilterModel> = { filterType: 'text', operator: 'OR', conditions: [] };\r\n // Set the selected elements in the model\r\n for (const selectedElement of selectedElements) {\r\n filterModels.conditions.push({ filterType: 'text', type: 'equals', filter: selectedElement });\r\n }\r\n // Apply the filter model collection to the column\r\n tableFilterModel[colFilter.header] = filterModels;\r\n }\r\n }\r\n // Once everything is set, update the filters\r\n this.filterCount = this.getFilterCount();\r\n this.gridApi.setFilterModel(tableFilterModel);\r\n this.gridApi.onFilterChanged();\r\n }\r\n\r\n /** Clear all filters */\r\n public clearFilters(): void {\r\n // Clear all selections\r\n for (let i = 0; i < this.filterSelections.length; i++) {\r\n this.filterSelections[i] = [];\r\n }\r\n // Set the full grid filter model to null\r\n this.gridApi.setFilterModel(null);\r\n // Update the display\r\n this.gridApi.onFilterChanged();\r\n this.filterCount = this.getFilterCount();\r\n }\r\n\r\n /**\r\n * Returns true if no filters are selected\r\n * @returns True if a filter is selected, false otherwise.\r\n */\r\n public hasEmptyFilters(): boolean {\r\n if (!this.filterSelections || !this.filterSelections.length) {\r\n return true;\r\n }\r\n for (const filterSelect of this.filterSelections) {\r\n // If at least one filter has been selected, return false\r\n if (filterSelect.length) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /** Cancel the changes to the filter and closes the filter panel */\r\n public cancelFilterChanges(): void {\r\n //Sets the filter selections on filter panel\r\n this.setFilterSelections();\r\n // Close the filter panel\r\n this.toggleFilterPanel();\r\n }\r\n\r\n /** Populates the filter dropdowns */\r\n private populateFilters(): void {\r\n // Reset the filter dropdowns\r\n this.filterSelections = [];\r\n this.colFilters = [];\r\n // Get the column definitions that have a filter\r\n const filteredCols: Array<ColDef> = this.gridApi.getColumnDefs().filter((def) => def['filter']);\r\n // Create a map to store unique values for each field\r\n const filterValuesMap = new Map<string, Set<any>>();\r\n // Initialize sets for each field (column) \r\n for (const col of filteredCols) {\r\n const field: string = col[\"field\"];\r\n filterValuesMap.set(field, new Set<any>());\r\n }\r\n // Use forEachNode to iterate over the rows\r\n this.gridApi.forEachNode((node: IRowNode) => {\r\n if (node.data) {\r\n for (const col of filteredCols) {\r\n const field: string = col[\"field\"];\r\n const value: any = this.gridApi.getCellValue({rowNode: node, colKey: field});\r\n if (value) {\r\n filterValuesMap.get(field)?.add(value);\r\n }\r\n }\r\n }\r\n });\r\n // Now that we have the unique values for each field, populate filter options\r\n for (const col of filteredCols) {\r\n const field: string = col[\"field\"];\r\n const label: string = col[\"headerName\"];\r\n const uniqueValues: Array<any> = Array.from(filterValuesMap.get(field) || []).sort();\r\n if (uniqueValues.length > 1) {\r\n // Ensure there's space for filter selections\r\n this.filterSelections.push([]); \r\n this.colFilters.push({ header: field, label: label, options: uniqueValues });\r\n }\r\n }\r\n this.gridApi.setFilterModel(this.initialFilterModel);\r\n this.setFilterSelections();\r\n this.filterCount = this.getFilterCount();\r\n }\r\n\r\n /** Open the column options modal */\r\n public openColumnOptions(): void {\r\n const columnState: Array<ColumnState> = this.gridApi.getColumnState();\r\n const columnData: Array<ColumnData> = this.columnStateToData(columnState);\r\n const initialColumnData: Array<ColumnData> = this.columnStateToData(this.savedColumnState.state);\r\n const columnOptionsData: ColumnOptionsData = {\r\n tableName: this.tableName,\r\n columnData,\r\n initialColumnData,\r\n showSaveColumnOptionsText: this.showSaveColumnOptionsText\r\n };\r\n const dialogRef = this.dialog.open(SofColumnOptionsComponent, {\r\n width: '500px',\r\n position: { bottom: '40px', right: '40px' },\r\n ariaLabelledBy: 'column-options-heading',\r\n data: columnOptionsData\r\n });\r\n dialogRef.afterClosed().pipe(\r\n take(1),\r\n tap((updatedColumnState: ApplyColumnStateParams) => {\r\n if (updatedColumnState && updatedColumnState.state.length) {\r\n this.gridApi.applyColumnState(updatedColumnState);\r\n this.updatedColumnState.emit(updatedColumnState);\r\n this.currentColumnState = updatedColumnState;\r\n }\r\n })\r\n ).subscribe();\r\n }\r\n\r\n /**\r\n * Maps `Array<ColumnState>` to `Array<ColumnData>` \r\n * @note filters out any columns marked as 'pinned' by the column definitions.\r\n * @note filters any columns without a 'headerName'.\r\n * @param columnState the column state to modify\r\n * @returns an array of column data formatted to be ingested by the `SofColumnOptionsComponent`\r\n */\r\n private columnStateToData(columnState: Array<ColumnState>): Array<ColumnData> {\r\n return columnState\r\n .filter((column) => {\r\n const headerName: string = this.gridApi.getColumnDef(column.colId)?.headerName || \"\";\r\n if (headerName && headerName.length && !column.pinned) {\r\n return column;\r\n }\r\n })\r\n .map((column) => {\r\n const headerName: string = this.gridApi.getColumnDef(column.colId).headerName;\r\n return {\r\n id: column.colId,\r\n isChecked: !column.hide,\r\n text: headerName\r\n };\r\n }\r\n );\r\n }\r\n\r\n /** Emit the current filtered/sorted row data */\r\n public exportFilteredRowData(): void {\r\n const rowData: Array<any> = [];\r\n const columns: Array<Column> = this.gridApi.getAllDisplayedColumns().filter((col) => col.getColDef().headerName);\r\n const tableHeaders: Array<KeyValPair> = [];\r\n columns.forEach((col) => {\r\n const colDef: ColDef = col.getColDef();\r\n tableHeaders.push({\r\n key: colDef.field,\r\n value: colDef.headerName\r\n });\r\n });\r\n this.gridApi.forEachNodeAfterFilterAndSort((node: IRowNode<any>) => {\r\n const nodeData: any = {};\r\n columns.forEach((col) => {\r\n const colId: string = col.getColId();\r\n // Use gridApi's getCellValue to get the value transformed by valueGetter\r\n nodeData[colId] = this.gridApi.getCellValue({ rowNode: node, colKey: colId });\r\n });\r\n rowData.push(nodeData);\r\n });\r\n const exportData: ExportTableData = {\r\n tableHeaders,\r\n rowData\r\n };\r\n this.filteredRowDataForExport.emit(exportData);\r\n }\r\n\r\n /** Sets filter selections for filter panel */\r\n private setFilterSelections(): void {\r\n for (let i = 0; i < this.colFilters.length; i++) {\r\n // Get the stored filters for the given model\r\n const colFilter = this.colFilters[i];\r\n const model = this.gridApi.getColumnFilterModel(colFilter.header);\r\n let filterSelectionData = [];\r\n if (model && model[\"conditions\"]) {\r\n // The model is a combined model with multiple selections\r\n const filterModel = model as CombinedSimpleModel<TextFilterModel>;\r\n for (const element of filterModel.conditions) {\r\n filterSelectionData.push(element.filter);\r\n }\r\n }\r\n else if (model) {\r\n // Assume the model is a single Text Filter Model\r\n let filterSelection: TextFilterModel = model;\r\n filterSelectionData.push(filterSelection.filter);\r\n }\r\n // Set the filter selections\r\n this.filterSelections[i] = filterSelectionData;\r\n }\r\n }\r\n\r\n /** Gets the count of current filter selections */\r\n private getFilterCount(): number {\r\n return this.filterSelections.reduce((acc, curr) => acc.concat(curr), []).length;\r\n }\r\n\r\n /**\r\n * Function passed to AG Grid to ignore headers with blank headings when using arrow keys.\r\n * @param params Navigation parameters.\r\n * @returns Next column to focus or undefined if there is no next column to focus.\r\n */\r\n public navigateToNextHeader(params: NavigateToNextHeaderParams<any, any>): ((HeaderPosition | null) | undefined) {\r\n const next = params.nextHeaderPosition;\r\n if (params.key !== 'ArrowLeft' && params.key !== 'ArrowRight') {\r\n return {\r\n headerRowIndex: next.headerRowIndex,\r\n column: next.column\r\n }\r\n }\r\n const skip: boolean = !next.column.getDefinition().headerName;\r\n if (!skip) {\r\n return {\r\n headerRowIndex: 0,\r\n column: next.column\r\n }\r\n }\r\n const visibleColumns: Column[] = params.api.getColumns().filter(col => col.isVisible());\r\n let indexOf = visibleColumns.findIndex(col => col.getId() === next.column.getUniqueId());\r\n if (params.key === 'ArrowLeft' && indexOf > 0) {\r\n if (indexOf > 0) {\r\n indexOf--;\r\n return {\r\n headerRowIndex: 0,\r\n column: visibleColumns[indexOf]\r\n }\r\n } \r\n } else if (params.key === 'ArrowRight') {\r\n if (indexOf < visibleColumns.length - 1) {\r\n indexOf++;\r\n return {\r\n headerRowIndex: 0,\r\n column: visibleColumns[indexOf]\r\n }\r\n } \r\n }\r\n }\r\n \r\n /**\r\n * Function passed to AG Grid to ignore headers with blank headings when using tab key.\r\n * @param params Navigation parameters.\r\n * @returns Next column to focus or false if there is no next column to focus.\r\n */\r\n public tabToNextHeader(params: TabToNextHeaderParams<any, any>): ((HeaderPosition | boolean | null) | undefined) {\r\n const next = params.nextHeaderPosition;\r\n if (!next) {\r\n return false;\r\n }\r\n const skip: boolean = !next.column.getDefinition().headerName;\r\n if (!skip) {\r\n return {\r\n headerRowIndex: 0,\r\n column: next.column\r\n }\r\n }\r\n const visibleColumns: Column[] = params.api.getColumns().filter(col => col.isVisible());\r\n if (visibleColumns.length <= 1) {\r\n return false;\r\n }\r\n let indexOf = visibleColumns.findIndex(col => col.getId() === next.column.getUniqueId());\r\n if (params.backwards && indexOf > 0) {\r\n if (indexOf > 0) {\r\n indexOf--;\r\n return {\r\n headerRowIndex: 0,\r\n column: visibleColumns[indexOf]\r\n }\r\n } \r\n } else {\r\n if (indexOf < visibleColumns.length - 1) {\r\n indexOf++;\r\n return {\r\n headerRowIndex: 0,\r\n column: visibleColumns[indexOf]\r\n }\r\n } \r\n }\r\n return false;\r\n }\r\n}\r\n\r\nexport interface ExportTableData {\r\n tableHeaders?: Array<KeyValPair>;\r\n rowData?: Array<any>\r\n}\r\n\r\ninterface KeyValPair { \r\n key?: string;\r\n value?: string;\r\n}\r\n\r\n/** Used for setting filter values */\r\nclass SofTableFilter {\r\n /** The column header */\r\n header: string;\r\n /** The column label or translation key */\r\n label: string;\r\n /** The column filter options */\r\n options: string[] = [];\r\n}\r\n\r\n/** A filter combining multiple conditions, taken from AgGrid*/\r\nclass CombinedSimpleModel<T> {\r\n /** The filter type. Usually 'text' */\r\n filterType: string;\r\n /** The operator. Usually 'OR' */\r\n operator: 'AND' | 'OR';\r\n /** multiple instances of the Filter Model */\r\n conditions: T[];\r\n}\r\n","<div \r\n [fxShow]=\"isGridDataRendered()\"\r\n fxLayoutGap=\"16px\" m-b-24>\r\n @if (enableFilter && colFilters.length) {\r\n <button \r\n (click)=\"toggleFilterPanel()\" \r\n mat-flat-button class=\"sof-button-v2\"\r\n theme=\"neutral\" \r\n [attr.emphasis]=\"filterOpenState ? 'solid' : filterCount === 0 ? 'secondary' : 'contained'\"\r\n [matBadge]=\"filterCount\"\r\n matBadgePosition=\"after\"\r\n [matBadgeHidden]=\"filterCount === 0 ? true : false\"\r\n [attr.aria-controls]=\"filterFieldSetId\" [ariaExpanded]=\"!!filterOpenState\">\r\n <i class=\"ph ph-bold ph-sliders-horizontal\" aria-hidden=\"true\"></i>\r\n {{'armature.sof-table.filter' | translate}}\r\n </button>\r\n }\r\n @if (enableSearch) {\r\n <mat-form-field class=\"sof-form-field table-search-field dense-4\" fxFlex=\"auto\">\r\n <span matPrefix>\r\n <i class=\"ph-bold ph-magnifying-glass search-icon\" aria-hidden=\"true\"></i>\r\n </span>\r\n <mat-label class=\"search-label\">{{'armature.sof-table.search' | translate}}</mat-label>\r\n <input \r\n (input)=\"onSearchTextChanged()\" \r\n #gridSearchTextInput matInput type=\"text\" id=\"gridSearchTextInput\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.search-filter-description' | translate\"/>\r\n </mat-form-field>\r\n }\r\n @if (enableColumnOptions) {\r\n <button \r\n (click)=\"openColumnOptions()\"\r\n mat-flat-button class=\"sof-button-icon-v2\" \r\n theme=\"neutral\" emphasis=\"secondary\" id=\"open-column-options\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.column-options-btn' | translate\"\r\n [matTooltip]=\"'armature.sof-table.screen-reader.column-options-btn' | translate\"\r\n [disabled]=\"!totalLength\">\r\n <i class=\"ph-bold ph-pause\" aria-hidden=\"true\"></i>\r\n </button>\r\n }\r\n @if(enableExport) {\r\n <button \r\n (click)=\"exportFilteredRowData()\"\r\n mat-flat-button class=\"sof-button-icon-v2\" \r\n theme=\"neutral\" emphasis=\"secondary\" id=\"export-table\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.export-table' | translate\"\r\n [matTooltip]=\"'armature.sof-table.screen-reader.export-table' | translate\"\r\n [disabled]=\"!totalLength\">\r\n <i class=\"ph-bold ph-export\" aria-hidden=\"true\"></i>\r\n </button>\r\n }\r\n <ng-content select=\"[sof-table-right-buttons]\"></ng-content>\r\n <!-- \r\n Only inject <button>'s inside an <ng-container sof-table-right-buttons>\r\n ... \r\n <ng-container sof-table-right-buttons>\r\n <button \r\n (click)=\"anyFunction()\"\r\n mat-flat-button class=\"sof-button-icon-v2\" \r\n theme=\"neutral\" emphasis=\"secondary\" aria-label=\"any button\"\r\n matTooltip=\"any button\">\r\n <i class=\"ph-bold ph-acorn\" aria-hidden=\"true\"></i>\r\n </button>\r\n </ng-container>\r\n ... \r\n note: make sure buttons have the following attributes to match others (unless other style needed by design) =\r\n `mat-flat-button class=\"sof-button-icon-v2\" theme=\"neutral\" emphasis=\"secondary\"`\r\n * remember to add aria-label and tooltip for icon only button\r\n -->\r\n</div>\r\n\r\n<div #ariaResultsCount class=\"sr-only\" aria-live=\"assertive\"></div>\r\n\r\n@if (isGridDataRendered() && filterOpenState) {\r\n <fieldset \r\n #filterPanel\r\n [id]=\"filterFieldSetId\"\r\n class=\"filter-panel\" role=\"region\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.select-filters-description' | translate\">\r\n <p>\r\n <i class=\"ph ph-bold ph-sliders-horizontal\" aria-hidden=\"true\"></i>\r\n <span class=\"m-l-8\">{{'armature.sof-table.filter' | translate}}</span>\r\n </p>\r\n <div class=\"filter-panel-select-container m-v-20\">\r\n @for (colFilter of colFilters; let i = $index; track i) {\r\n <mat-form-field appearance=\"outline\" class=\"sof-form-field table-filter-select\">\r\n <mat-label [attr.for]=\"'filterDropdown' + i\">{{ colFilter.label }}</mat-label>\r\n <mat-select\r\n #filterSelect\r\n [(ngModel)]=\"filterSelections[i]\" \r\n multiple \r\n id=\"filterDropdown{{i}}\"\r\n (openedChange)=\"onFilterSelectOpened($event)\"\r\n placeholder=\"{{'armature.sof-table.all' | translate}}\" disableRipple=\"true\">\r\n @for (colOption of colFilter.options; track $index) {\r\n <mat-option [value]=\"colOption\">\r\n {{colOption}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n </div>\r\n <div fxLayout=\"row\">\r\n <div fxFlex=\"50%\">\r\n <button \r\n (click)=\"clearFilters()\" [disabled]=\"hasEmptyFilters()\" \r\n mat-flat-button class=\"sof-button-v2\"\r\n theme=\"neutral\" emphasis=\"floating\"\r\n id=\"tableFilterClear\">\r\n {{'armature.sof-table.reset' | translate}}\r\n </button>\r\n </div>\r\n <div fxFlex=\"50%\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"2%\" fxLayoutAlign=\"flex-end\">\r\n <div fxFlex=\"0 1 auto\">\r\n <button \r\n (click)=\"cancelFilterChanges()\" mat-flat-button class=\"sof-button-v2\" \r\n id=\"tableFilterCancel\" theme=\"neutral\" emphasis=\"secondary\">\r\n {{'armature.sof-table.cancel' | translate}}\r\n </button>\r\n </div>\r\n <div fxFlex=\"0 1 auto\">\r\n <button \r\n (click)=\"applyFilters()\" mat-flat-button class=\"sof-button-v2\"\r\n id=\"tableFilterApply\" theme=\"primary\" emphasis=\"solid\">\r\n {{'armature.sof-table.results' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </fieldset>\r\n}\r\n\r\n<ag-grid-angular \r\n [fxShow]=\"isGridDataRendered()\"\r\n (gridReady)=\"onGridReady($event)\" \r\n (firstDataRendered)=\"onFirstDataRendered()\"\r\n (filterChanged)=\"onFilterChanged()\"\r\n (paginationChanged)=\"changePageSize($event)\" \r\n (sortChanged)=\"onSortChanged($event)\"\r\n [icons]=\"headerSortIcons\"\r\n [rowData]=\"rowData\" \r\n [columnDefs]=\"colDefs\" \r\n [defaultColDef]=\"defaultColDef\" \r\n [pagination]=\"enablePagination\" \r\n [suppressPaginationPanel]=\"true\"\r\n [paginationPageSizeSelector]=\"paginationPageSizeSelector\" \r\n [paginationPageSize]=\"paginationPageSize\"\r\n [headerHeight]=\"rowHeight\" \r\n [rowHeight]=\"rowHeight\" \r\n [domLayout]=\"'autoHeight'\" \r\n [tooltipShowDelay]=\"tooltipShowDelay\"\r\n [overlayNoRowsTemplate]=\"('armature.sof-table.no-rows' | translate) || 'No results found.'\"\r\n [class.no-rows]=\"!totalLength\" [tabToNextHeader]=\"tabToNextHeader\" [navigateToNextHeader]=\"navigateToNextHeader\"\r\n class=\"ag-theme-material\">\r\n</ag-grid-angular>\r\n\r\n@if (enablePagination) {\r\n <div \r\n [fxShow]=\"isGridDataRendered() && totalLength\"\r\n class=\"custom-paginator\">\r\n <div class=\"first-section\">\r\n <mat-select\r\n #pageSizeSelect class=\"button-part-1\" aria-label=\"{{'armature.sof-table.page-size-arialabel' | translate}}\"\r\n id=\"pageSizeInput\" name=\"pageSizeInput\" \r\n [(value)]=\"paginationPageSize\" disableRipple=\"true\">\r\n @for (size of paginationPageSizeSelector; let i = $index; track i) {\r\n <mat-option \r\n class=\"page-option\" id=\"size{{i}}\"\r\n [value]=\"paginationPageSizeSelector[i]\">\r\n {{size}}\r\n </mat-option>\r\n }\r\n <mat-select-trigger>\r\n <div class=\"field\">\r\n <span class=\"current-page\">\r\n {{paginationPageSize}}\r\n </span>\r\n <span class=\"select-icon\">\r\n <i [class]=\"'ph-bold ph-caret-' + (pageSizeSelect.panelOpen ? 'up':'down')\" aria-hidden=\"true\"></i>\r\n </span>\r\n </div>\r\n </mat-select-trigger>\r\n </mat-select>\r\n <span class=\"page-change-text\">\r\n {{pageChangeText}} {{'armature.sof-table.of' | translate}} {{totalLength}}\r\n </span>\r\n </div>\r\n <div class=\"go-to-page\">\r\n <mat-select\r\n #pageNumberSelect class=\"button-part\" aria-label=\"{{'armature.sof-table.page-selector-arialabel' | translate}}\"\r\n (selectionChange)=\"onPageNumberChange($event.value)\"\r\n [(value)]=\"currentPage\" \r\n id=\"pageSelelctor\" name=\"pageSelector\" disableRipple=\"true\">\r\n @for (page of pageSelector; track $index) {\r\n <mat-option [value]=\"page\" class=\"page-option\">\r\n <span class=\"current-page\">\r\n {{page}}\r\n </span>\r\n </mat-option>\r\n }\r\n <mat-select-trigger>\r\n <div class=\"field\">\r\n <span class=\"current-page\">\r\n {{currentPage}} {{'armature.sof-table.of' | translate}} {{totalNumberOfPages}}\r\n </span>\r\n <span class=\"select-icon\">\r\n <i [class]=\"'ph-bold ph-caret-' + (pageNumberSelect.panelOpen ? 'up':'down')\" aria-hidden=\"true\"></i>\r\n </span>\r\n </div>\r\n </mat-select-trigger>\r\n </mat-select>\r\n <nav class=\"second-section\">\r\n <button \r\n (click)=\"previousPage()\"\r\n id=\"prev-button\" mat-flat-button class=\"sof-button-icon-v2\" theme=\"neutral\" emphasis=\"secondary\"\r\n [disabled]=\"currentPage === 1\" \r\n [attr.aria-label]=\"'screen-reader.pagination.previous' | translate\">\r\n <i class=\"ph-bold ph-caret-left\" aria-hidden=\"true\"></i>\r\n </button>\r\n <button \r\n (click)=\"nextPage()\" \r\n id=\"next-button\" mat-flat-button class=\"sof-button-icon-v2\" theme=\"neutral\" emphasis=\"secondary\"\r\n [disabled]=\"currentPage === totalNumberOfPages\"\r\n [attr.aria-label]=\"'screen-reader.pagination.next' | translate\">\r\n <i class=\"ph-bold ph-caret-right\" aria-hidden=\"true\"></i>\r\n </button>\r\n </nav>\r\n </div>\r\n </div>\r\n}\r\n\r\n@if (!isGridDataRendered()) {\r\n <div class=\"loading-container\">\r\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\"/>\r\n </div>\r\n}\r\n","import { Component, Input } from '@angular/core';\r\n\r\n/** The Softheon Armature Table Cell component */\r\n@Component({\r\n selector: 'sof-table-cell',\r\n templateUrl: './table-cell.component.html',\r\n styleUrl: './table-cell.component.scss',\r\n standalone: false\r\n})\r\nexport class SofTableCellComponent {\r\n\r\n /** All Components for Table Cell */\r\n @Input() public components: TableCellComponent[] = [];\r\n\r\n /** Any logic related to ag grid cell renderer data can be added here */\r\n public agInit(params): void {\r\n this.components = params['components'];\r\n }\r\n}\r\n\r\n/** Components to Render in Table Cell */\r\ninterface TableCellComponent {\r\n /** Component Class */\r\n component: any,\r\n /** Inputs needed for specific component */\r\n inputs: any\r\n}\r\n","<div class=\"table-cell\">\r\n <ng-container *ngFor=\"let currentComponent of components\">\r\n <ng-container *ngComponentOutlet=\"currentComponent.component; \r\n inputs:currentComponent.inputs;\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatOptionModule } from '@angular/material/core';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { AgGridModule } from 'ag-grid-angular';\r\nimport { SofTableComponent } from './sof-table/sof-table.component';\r\nimport { SofTableCellComponent } from './table-cell/table-cell.component';\r\nimport { SofColumnOptionsComponent } from './column-options-modal/column-options.component';\r\nimport { BaseComponentModule } from '@softheon/armature';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\n\r\n\r\n/** The material modules */\r\nconst materialModules = [\r\n MatSelectModule,\r\n MatOptionModule,\r\n MatCheckboxModule,\r\n MatIconModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatToolbarModule,\r\n MatTooltipModule,\r\n MatButtonToggleModule,\r\n MatCardModule,\r\n MatRadioModule,\r\n MatBadgeModule,\r\n MatProgressSpinnerModule\r\n];\r\n\r\n@NgModule({\r\n declarations: [\r\n SofTableComponent,\r\n SofTableCellComponent,\r\n SofColumnOptionsComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n FlexLayoutModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TranslateModule,\r\n AgGridModule,\r\n ...materialModules,\r\n BaseComponentModule\r\n ],\r\n exports: [\r\n SofTableComponent,\r\n SofTableCellComponent,\r\n SofColumnOptionsComponent\r\n ]\r\n})\r\nexport class AgGridComponentsModule { }\r\n","/** Public API Surface of Ag Grid components */\r\nexport * from './src/ag-grid-components.module';\r\nexport * from './src/sof-table/sof-table.component';\r\nexport * from './src/table-cell/table-cell.component';\r\nexport * from './src/column-options-modal/column-options.component';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i4","i8","i13"],"mappings":"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"}
|