{"version":3,"file":"ibenvandeveire-ngx-layout.mjs","sources":["../../../../../libs/angular/layout/src/lib/services/online-service/online.service.ts","../../../../../libs/angular/layout/src/lib/services/image-marker/image-marker.service.ts","../../../../../libs/angular/layout/src/lib/tokens/display-content-configuration.token.ts","../../../../../libs/angular/layout/src/lib/tokens/ngx-table-config.token.ts","../../../../../libs/angular/layout/src/lib/tokens/mobile-layout-configuration.token.ts","../../../../../libs/angular/layout/src/lib/tokens/button-configuration.token.ts","../../../../../libs/angular/layout/src/lib/tokens/media-queries.token.ts","../../../../../libs/angular/layout/src/lib/tokens/link-configuration.token.ts","../../../../../libs/angular/layout/src/lib/tokens/marked-configuration.token.ts","../../../../../libs/angular/layout/src/lib/utils/hide-element/hide-element.util.ts","../../../../../libs/angular/layout/src/lib/utils/table-form/generate-form.util.ts","../../../../../libs/angular/layout/src/lib/utils/table-form/reset-form.util.ts","../../../../../libs/angular/layout/src/lib/utils/table-form/handle-form-changes.util.ts","../../../../../libs/angular/layout/src/lib/utils/extract-layout/extract-layout.util.ts","../../../../../libs/angular/layout/src/lib/services/media-query/media-query.service.ts","../../../../../libs/angular/layout/src/lib/services/mobile-layout/mobile-layout.service.ts","../../../../../libs/angular/layout/src/lib/services/markdown/markdown.service.ts","../../../../../libs/angular/layout/src/lib/directives/display-content/display-content.directive.ts","../../../../../libs/angular/layout/src/lib/directives/drag-and-drop/drag-and-drop-container.directive.ts","../../../../../libs/angular/layout/src/lib/abstracts/display-content/display-content.component.ts","../../../../../libs/angular/layout/src/lib/abstracts/drag-and-drop/has-focus.directive.ts","../../../../../libs/angular/layout/src/lib/abstracts/drag-and-drop/drag-and-drop-item.directive.ts","../../../../../libs/angular/layout/src/lib/const/drag-and-drop/drag-and-drop-message.const.ts","../../../../../libs/angular/layout/src/lib/abstracts/drag-and-drop/drag-and-drop.service.ts","../../../../../libs/angular/layout/src/lib/abstracts/table/open-row-state-template.component.ts","../../../../../libs/angular/layout/src/lib/abstracts/table/select-template.component.ts","../../../../../libs/angular/layout/src/lib/abstracts/table/sort-template.component.ts","../../../../../libs/angular/layout/src/lib/directives/drag-and-drop/drag-and-drop-host.directive.ts","../../../../../libs/angular/layout/src/lib/directives/drag-and-drop/drag-and-drop-item.directive.ts","../../../../../libs/angular/layout/src/lib/directives/drag-and-drop/index.ts","../../../../../libs/angular/layout/src/lib/directives/has-focus-action/has-focus.directive.ts","../../../../../libs/angular/layout/src/lib/directives/tree-grid/tree-grid.directive.ts","../../../../../libs/angular/layout/src/lib/directives/tree-grid/tree-grid-row.directive.ts","../../../../../libs/angular/layout/src/lib/directives/tree-grid/tree-grid.cell.directive.ts","../../../../../libs/angular/layout/src/lib/directives/tree-grid/index.ts","../../../../../libs/angular/layout/src/lib/directives/button/button.directive.ts","../../../../../libs/angular/layout/src/lib/directives/media-query/media-query.directive.ts","../../../../../libs/angular/layout/src/lib/directives/link/link.directive.ts","../../../../../libs/angular/layout/src/lib/pipes/item-size/item-size.pipe.ts","../../../../../libs/angular/layout/src/lib/pipes/aria-sort/aria-sort.pipe.ts","../../../../../libs/angular/layout/src/lib/pipes/get-pipe/get.pipe.ts","../../../../../libs/angular/layout/src/lib/pipes/has-observers/has-observers.pipe.ts","../../../../../libs/angular/layout/src/lib/pipes/markdown/markdown.pipe.ts","../../../../../libs/angular/layout/src/lib/pipes/show-header/show-header.pipe.ts","../../../../../libs/angular/layout/src/lib/enums/sort-direction.enum.ts","../../../../../libs/angular/layout/src/lib/pipes/sort-icon/sort-icon.pipe.ts","../../../../../libs/angular/layout/src/lib/pipes/matches-query/matches-query.pipe.ts","../../../../../libs/angular/layout/src/lib/pipes/table-aria-label/table-aria-label.pipe.ts","../../../../../libs/angular/layout/src/lib/pipes/index.ts","../../../../../libs/angular/layout/src/lib/components/configurable-layout-item/configurable-layout-item.component.ts","../../../../../libs/angular/layout/src/lib/components/configurable-layout-item/configurable-layout-item.component.html","../../../../../libs/angular/layout/src/lib/components/configurable-layout/configurable-layout.component.ts","../../../../../libs/angular/layout/src/lib/components/configurable-layout/configurable-layout.component.html","../../../../../libs/angular/layout/src/lib/components/accordion/accordion.component.ts","../../../../../libs/angular/layout/src/lib/components/accordion/item/accordion-item.component.ts","../../../../../libs/angular/layout/src/lib/components/accordion/item/accordion-item.component.html","../../../../../libs/angular/layout/src/lib/components/accordion/index.ts","../../../../../libs/angular/layout/src/lib/components/image-marker/image-marker.component.ts","../../../../../libs/angular/layout/src/lib/components/mobile-layout/mobile-layout.component.ts","../../../../../libs/angular/layout/src/lib/components/mobile-layout/mobile-layout.component.html","../../../../../libs/angular/layout/src/lib/components/cell/cell.directive.ts","../../../../../libs/angular/layout/src/lib/components/cell/currency-cell.component.ts","../../../../../libs/angular/layout/src/lib/components/cell/date-cell.component.ts","../../../../../libs/angular/layout/src/lib/components/cell/generic-cell.directive.ts","../../../../../libs/angular/layout/src/lib/components/cell/index.ts","../../../../../libs/angular/layout/src/lib/components/table/ngx-table.component.ts","../../../../../libs/angular/layout/src/lib/components/table/ngx-table.component.html","../../../../../libs/angular/layout/src/lib/components/index.ts","../../../../../libs/angular/layout/src/lib/providers/display-content/display-content.provider.ts","../../../../../libs/angular/layout/src/lib/providers/drag-and-drop/drag-and-drop.provider.ts","../../../../../libs/angular/layout/src/lib/providers/table/table-configuration.provider.ts","../../../../../libs/angular/layout/src/lib/providers/mobile-layout/mobile-layout-configuration.provider.ts","../../../../../libs/angular/layout/src/lib/providers/button/button-configuration.provider.ts","../../../../../libs/angular/layout/src/lib/providers/media-queries/media-queries.provider.ts","../../../../../libs/angular/layout/src/lib/providers/link/link-configuration.provider.ts","../../../../../libs/angular/layout/src/lib/providers/markdown/markdown-configuration.provider.ts","../../../../../libs/angular/layout/src/lib/guards/mobile-layout/mobile-layout.guard.ts","../../../../../libs/angular/layout/src/lib/guards/mobile-layout/mobile-layout-default.guard.ts","../../../../../libs/angular/layout/src/ibenvandeveire-ngx-layout.ts"],"sourcesContent":["import { Injectable, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NgxWindowService } from '@ibenvandeveire/ngx-core';\nimport { Observable, Subject, fromEvent, tap } from 'rxjs';\n\n/**\n * A service that provides the currently online status of the application\n */\n@Injectable({ providedIn: 'root' })\nexport class NgxOnlineService {\n\t/**\n\t * An instance of the window service\n\t */\n\tprotected readonly windowService = inject(NgxWindowService);\n\n\t/**\n\t * A subject that emits whenever the application is on or offline\n\t */\n\tprotected readonly onlineSubject: Subject<boolean> = new Subject<boolean>();\n\n\t/**\n\t * An observable that emits whenever the application is on or offline\n\t */\n\tpublic readonly online$: Observable<boolean> = this.onlineSubject.asObservable();\n\n\tconstructor() {\n\t\t// Iben: When we're in the browser, listen to the online and offline status of the application\n\t\tif (this.windowService.isBrowser()) {\n\t\t\t// Iben: Handle the on and offline status of the application\n\t\t\tfromEvent(window, 'online')\n\t\t\t\t.pipe(\n\t\t\t\t\ttap(() => {\n\t\t\t\t\t\tthis.onlineSubject.next(true);\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntilDestroyed()\n\t\t\t\t)\n\t\t\t\t.subscribe();\n\n\t\t\tfromEvent(window, 'offline')\n\t\t\t\t.pipe(\n\t\t\t\t\ttap(() => {\n\t\t\t\t\t\tthis.onlineSubject.next(false);\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntilDestroyed()\n\t\t\t\t)\n\t\t\t\t.subscribe();\n\t\t}\n\t}\n}\n","import { Injectable, OnDestroy, inject } from '@angular/core';\nimport { NgxWindowService } from '@ibenvandeveire/ngx-core';\nimport { MarkerView } from 'markerjs-live';\nimport { MarkerArea, MarkerAreaState } from 'markerjs2';\nimport { Observable, Subject } from 'rxjs';\nimport { v4 as uuid } from 'uuid';\n\nimport {\n\tNgxImageMarker,\n\tNgxImageMarkerConfiguration,\n\tNgxImageMarkerEdit,\n\tNgxImageMarkerItem,\n\tNgxImageMarkerView,\n} from '../../types';\n\n/**\n * A service that serves as a wrapper for MarkerJs2 and MarkerJs-live\n *\n * https://markerjs.com/\n */\n// TODO: Iben: To avoid essentially only testing a mocked version of this package, we need to test this through Cypress/Playwrite/... tests\n@Injectable({\n\tprovidedIn: 'root',\n})\nexport class NgxImageMarkerService implements OnDestroy {\n\tprivate readonly windowService = inject(NgxWindowService);\n\n\t/**\n\t * A record with all markers\n\t */\n\tprivate readonly markers: Record<string, NgxImageMarker> = {};\n\n\t/**\n\t * Create an image with markers\n\t *\n\t * @param image - The image element we wish to draw markers on\n\t * @param rootTarget - The element we render the image in\n\t * @param configuration - The configuration we wish to pass to the image markers\n\t */\n\tpublic createImageMarker(\n\t\timage: HTMLImageElement | HTMLElement,\n\t\trootTarget: HTMLElement,\n\t\tconfiguration: NgxImageMarkerConfiguration\n\t): NgxImageMarker {\n\t\t// Iben: Return undefined if we're not in the browser\n\t\tif (!this.windowService.isBrowser) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Iben: Create an id for the marker\n\t\tconst id = uuid();\n\n\t\t// Iben: Depending on the provided mode, we create a edit view or a non editable view\n\t\treturn configuration.mode === 'edit'\n\t\t\t? this.createImageMakerEdit(id, image, rootTarget, configuration)\n\t\t\t: this.createReadonlyImageMarker(id, image, rootTarget, configuration);\n\t}\n\n\t/**\n\t * Creates a readonly marker view\n\t *\n\t * @param image - The image element we wish to draw markers on\n\t * @param rootTarget - The element we render the image in\n\t * @param configuration - The configuration we wish to pass to the image markers\n\t */\n\tprivate createReadonlyImageMarker(\n\t\tid: string,\n\t\timage: HTMLImageElement | HTMLElement,\n\t\trootTarget: HTMLElement,\n\t\tconfiguration: NgxImageMarkerConfiguration\n\t): NgxImageMarkerView {\n\t\t// Iben: Create the new marker view\n\t\tconst marker = new MarkerView(image);\n\n\t\t// Iben: Set the root element so the marker layer is rendered in the same element\n\t\tmarker.targetRoot = rootTarget;\n\n\t\t// Iben: Create the Angular marker view\n\t\tconst result: NgxImageMarkerView = {\n\t\t\tmode: 'view',\n\t\t\tclose: (() => {\n\t\t\t\t// Iben: Remove the event listener and close the marker\n\t\t\t\tmarker.removeEventListener('select', () => {});\n\t\t\t\tmarker.close();\n\n\t\t\t\t// Iben: Remove the marker from the record\n\t\t\t\tthis.markers[id] = undefined;\n\t\t\t}).bind(this),\n\t\t\tvalueChanges: this.createMarkerClickedListener(marker),\n\t\t};\n\n\t\t// Iben: Create a clicked listener for the currently clicked item\n\t\tthis.createMarkerClickedListener(marker);\n\n\t\t// Iben: If custom marker types were provided, set them as the available types\n\t\tif (configuration.markerTypes?.view) {\n\t\t\tmarker.availableMarkerTypes = configuration.markerTypes.view;\n\t\t}\n\n\t\t// Iben: Show the marker once all settings are set\n\t\tmarker.show(configuration.defaultState);\n\n\t\t// Iben: Add the marker to the record\n\t\tthis.markers[id] = result;\n\n\t\t// Iben: Return the Angular view\n\t\treturn result;\n\t}\n\n\t/**\n\t * Creates an editable marker view\n\t *\n\t * @param image - The image element we wish to draw markers on\n\t * @param rootTarget - The element we render the image in\n\t * @param configuration - The configuration we wish to pass to the image markers\n\t */\n\tprivate createImageMakerEdit(\n\t\tid: string,\n\t\timage: HTMLImageElement | HTMLElement,\n\t\trootTarget: HTMLElement,\n\t\tconfiguration: NgxImageMarkerConfiguration\n\t): NgxImageMarkerEdit {\n\t\t// Iben: Create a new marker view\n\t\tconst marker = new MarkerArea(image);\n\n\t\t// Iben: Set the root element so the marker layer is rendered in the same element\n\t\tmarker.targetRoot = rootTarget;\n\n\t\t// Iben: Create the Angular based view\n\t\tconst result: NgxImageMarkerEdit = {\n\t\t\tmode: 'edit',\n\t\t\tclose: (() => {\n\t\t\t\t// Iben: Remove the event listener and close the marker\n\t\t\t\tmarker.removeEventListener('statechange', () => {});\n\t\t\t\tmarker.close();\n\n\t\t\t\t// Iben: Remove the marker from the record\n\t\t\t\tthis.markers[id] = undefined;\n\t\t\t}).bind(this),\n\t\t\tvalueChanges: this.createMarkerValueChanges(marker),\n\t\t};\n\n\t\t// Iben: Set the configuration settings\n\t\t// These can later on be extended when needed\n\t\tmarker.uiStyleSettings.zoomButtonVisible = configuration.allowZoom;\n\t\tmarker.uiStyleSettings.zoomOutButtonVisible = configuration.allowZoom;\n\t\tmarker.zoomSteps = configuration.zoom?.levels || [1, 2, 3, 4];\n\t\tmarker.zoomLevel = configuration.zoom?.current ?? 1;\n\t\tmarker.uiStyleSettings.clearButtonVisible = configuration.allowClear;\n\n\t\t// Iben: Set the available marker types\n\t\tmarker.availableMarkerTypes =\n\t\t\t(configuration.markerTypes?.edit as any) || marker.ALL_MARKER_TYPES;\n\n\t\t// Iben: Set the class names of the items\n\t\tmarker.uiStyleSettings.notesAreaStyleClassName = 'ngx-image-marker-notes-area';\n\t\tmarker.uiStyleSettings.toolbarStyleColorsClassName = 'ngx-image-marker-toolbar';\n\t\tmarker.uiStyleSettings.toolboxStyleColorsClassName = 'ngx-image-marker-toolbox';\n\t\tmarker.uiStyleSettings.toolbarButtonStyleColorsClassName =\n\t\t\t'ngx-image-marker-toolbar-button';\n\t\tmarker.uiStyleSettings.toolbarActiveButtonStyleColorsClassName =\n\t\t\t'ngx-image-marker-toolbar-button-active';\n\t\tmarker.uiStyleSettings.toolboxButtonStyleColorsClassName =\n\t\t\t'ngx-image-marker-toolbox-button';\n\t\tmarker.uiStyleSettings.toolboxActiveButtonStyleColorsClassName =\n\t\t\t'ngx-image-marker-toolbox-button-active';\n\n\t\t// Iben: Show the marker once all settings are set\n\t\tmarker.show();\n\n\t\t// Iben: If there was state before, set it accordingly\n\t\tif (configuration.defaultState) {\n\t\t\tmarker.restoreState(configuration.defaultState);\n\t\t}\n\n\t\t// Iben: Add the marker to the record\n\t\tthis.markers[id] = result;\n\n\t\t// Iben: Return the Angular view\n\t\treturn result;\n\t}\n\n\t/**\n\t * Listen to the value changes in the editable view\n\t *\n\t * @param {MarkerArea} marker - The marker view\n\t */\n\tprivate createMarkerValueChanges(marker: MarkerArea): Observable<MarkerAreaState> {\n\t\t// Iben: Setup valueChanges\n\t\tconst valueChanges = new Subject<MarkerAreaState>();\n\n\t\t// Iben: Update the subject whenever a new item was added to the marker view\n\t\tmarker.addEventListener('statechange', (event) => {\n\t\t\tvalueChanges.next(event?.markerArea?.getState());\n\t\t});\n\n\t\t// Iben: Return changes observable\n\t\t// This Observable gets closed in the NgxImageMarkerComponent and therefor do not require a takeUntil here\n\t\treturn valueChanges.asObservable();\n\t}\n\n\t/**\n\t * Listen to the marker clicks in the readonly view\n\t *\n\t * @param {MarkerArea} marker - The marker view\n\t */\n\tprivate createMarkerClickedListener(marker: MarkerView): Observable<NgxImageMarkerItem> {\n\t\t// Iben: Setup valueChanges\n\t\tconst valueChanges = new Subject<any>();\n\n\t\t// Iben: Update the subject whenever a marker was clicked\n\t\tmarker.addEventListener('select', (_, marker) => {\n\t\t\tvalueChanges.next(marker);\n\t\t});\n\n\t\t// Iben: Return changes observable\n\t\t// This Observable gets closed in the NgxImageMarkerComponent and therefor do not require a takeUntil here\n\t\treturn valueChanges.asObservable();\n\t}\n\n\tngOnDestroy(): void {\n\t\t// Iben: Close all existing markers, removing the listeners where needed\n\t\tObject.values(this.markers)\n\t\t\t.filter(Boolean)\n\t\t\t.forEach((marker) => {\n\t\t\t\tmarker.close();\n\t\t\t});\n\t}\n}\n","import { InjectionToken } from '@angular/core';\n\nimport { NgxDisplayContentConfiguration } from '../types';\n/**\n * A token to provide the necessary configuration to the directive\n */\nexport const NgxDisplayContentConfigurationToken =\n\tnew InjectionToken<NgxDisplayContentConfiguration>('NgxDisplayContentConfiguration');\n","import { InjectionToken, Type } from '@angular/core';\n\nimport {\n\tNgxDisplayContentComponent,\n\tNgxTableOpenRowStateTemplateAbstractComponent,\n\tNgxTableSelectTemplateAbstractComponent,\n\tNgxTableSortTemplateAbstractComponent,\n} from '../abstracts';\nimport { NgxTableAriaLabels } from '../types';\n\ntype HideHeaderRowOptions = 'when-loading' | 'when-empty';\nexport type HideHeaderRowOption =\n\t| 'never'\n\t| [HideHeaderRowOptions]\n\t| [HideHeaderRowOptions, HideHeaderRowOptions];\nexport type ShowDetailRowOption = 'always' | 'on-click' | 'on-single-item';\n\n/**\n * A configuration we can provide to set properties of the table globally\n *\n * showDetailRow - Defines the default open behavior of detail rows. 'always' will open all rows by default, 'on-click' will only open them on click, 'on-single-item' will open the row on click and when there's only one item in the table.\n * ngxTableClass - A default class that will be set on the ngx-table component itself\n * showOpenRowState - Defines whether we always want to show the open-row state indicator for each table.\n * allowMultipleRowsOpen - Defines whether multiple rows can be open at once.\n * showOpenRowState - Defines whether we always want to show the open-row state indicator for each table.\n * showSelectedOpenRow - Defines whether we want a class to be added to the currently opened row\n * emitValueOnSingleItem - Defines whether we want to emit the rowClicked when there's only one item in the table and the showDetailRow is set to 'on-single-item'\n * hideHeaderWhen - Defines whether we want to show the header when the table is empty or loading\n * components - A set of components we can use as defaults for the loading, error and empty state of the\n * ariaLabels - Configurable fallback ARIA labels for accessibility purposes.\n */\nexport interface NgxTableConfiguration {\n\tshowDetailRow?: ShowDetailRowOption;\n\tngxTableClass?: string;\n\tshowOpenRowState?: boolean;\n\tallowMultipleRowsOpen?: boolean;\n\thighlightKey?: string;\n\tshowSelectedOpenRow?: boolean;\n\temitValueOnSingleItem?: boolean;\n\thideHeaderWhen?: HideHeaderRowOption;\n\tcomponents?: {\n\t\tloading?: Type<NgxDisplayContentComponent>;\n\t\tempty?: Type<NgxDisplayContentComponent>;\n\t\tradio?: Type<NgxTableSelectTemplateAbstractComponent>;\n\t\tcheckbox?: Type<NgxTableSelectTemplateAbstractComponent>;\n\t\topenRowState?: Type<NgxTableOpenRowStateTemplateAbstractComponent>;\n\t\tsort?: Type<NgxTableSortTemplateAbstractComponent>;\n\t};\n\tariaLabels?: NgxTableAriaLabels;\n}\n\nexport const NgxTableConfigurationToken = new InjectionToken<NgxTableConfiguration>(\n\t'NgxTableConfiguration'\n);\n","import { InjectionToken } from '@angular/core';\n\nimport { NgxMobileLayoutConfiguration } from '../types';\n\n/**\n * An optional token to provide the base mobile configuration to the `NgxMobileLayoutService`\n */\nexport const NgxMobileLayoutConfigurationToken = new InjectionToken<NgxMobileLayoutConfiguration>(\n\t'NgxMobileLayoutConfiguration'\n);\n","import { InjectionToken } from '@angular/core';\n\nimport { NgxButtonConfiguration } from '../types';\n/**\n * A token to provide the necessary configuration to the NgxButton directive\n */\nexport const NgxButtonConfigurationToken = new InjectionToken<NgxButtonConfiguration>(\n\t'NgxButtonConfiguration'\n);\n","import { InjectionToken } from '@angular/core';\n\nimport { NgxMediaQuery } from '../types';\n/**\n * A list of media queries we wish to listen to on start\n */\nexport const NgxMediaQueriesToken = new InjectionToken<NgxMediaQuery[]>('NgxMediaQueriesToken');\n","import { InjectionToken } from '@angular/core';\n\nimport { NgxLinkConfiguration } from '../types';\n/**\n * A token to provide the necessary configuration to the NgxLink directive\n */\nexport const NgxLinkConfigurationToken = new InjectionToken<NgxLinkConfiguration>(\n\t'NgxLinkConfiguration'\n);\n","import { InjectionToken } from '@angular/core';\nimport { MarkedExtension } from 'marked';\n\n/**\n * A token to provide the necessary configuration to NgxMarkdownService\n */\nexport const NgxMarkdownConfigurationToken = new InjectionToken<MarkedExtension[]>(\n\t'NgxMarkdownConfigurationToken'\n);\n","/**\n * Hides the element for users without assistive technologies\n *\n * @param {HTMLElement} element - A provided HTMLElement\n */\nexport const hideElement = (element: HTMLElement): void => {\n\telement.style.position = 'absolute';\n\telement.style.width = '1px';\n\telement.style.height = '1px';\n\telement.style.marginTop = '-1px';\n\telement.style.overflow = 'hidden';\n};\n","import { FormControl, FormGroup } from '@angular/forms';\n\n/**\n * Generates a NgxTable form based on a provided selectable key. If no key is provided, the form is based on the index instead\n *\n * @param form - The form provided by the table\n * @param data - The data provided by the table\n * @param selectableKey - An optional key that will be used to fetch the keys of the controls\n */\nexport const generateNgxTableForm = (\n\tform: FormGroup,\n\tdata: unknown[],\n\tselectableKey?: string\n): void => {\n\t// Iben: Early exit if the data is null or if no items were provided\n\tif (!data || data.length === 0) {\n\t\treturn;\n\t}\n\n\t// Iben: If no selectable key was provided, we build a form based on the index\n\tif (!selectableKey) {\n\t\treturn buildNgxTableForm(form, 'ngxTableIndex', data);\n\t}\n\n\t// Iben: If a selectable key was provided, we build a form based on the key\n\treturn buildNgxTableForm(form, selectableKey, data);\n};\n\n/**\n * Builds the NgxTable form\n *\n * @param key - A key to determine whether we need to build the form based on the index or an actual key\n * @param data - The data provided by the table\n */\nconst buildNgxTableForm = (\n\tform: FormGroup,\n\tkey: 'ngxTableIndex' | string,\n\tdata: unknown[]\n): void => {\n\t// Iben: Check if the selectableKey is unique, otherwise the form cannot be set correctly\n\tif (key !== 'ngxTableIndex') {\n\t\tconst keys = new Set([...data].map((item) => item[key]));\n\n\t\tif (keys.size !== data.length) {\n\t\t\tconsole.error(\n\t\t\t\t'NgxTableComponent encountered a non unique selectableKey and can therefor not generate a FormGroup. Please provide a key with unique values.'\n\t\t\t);\n\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Iben: Add a new control based on the index or on the provided key\n\tdata.forEach((item, index) => {\n\t\tform.addControl(key === 'ngxTableIndex' ? `${index}` : item[key], new FormControl());\n\t});\n};\n","import { FormControl, FormGroup } from '@angular/forms';\n\n/**\n * Resets the NgxTable form if new data is provided, so new controls can be added to the form\n *\n * @param currentForm - The form we wish to mutate\n * @param data - The provided data in the table\n * @param selectableKey - Optional selectable key\n * @param resetFormOnNewData - Whether we wish to reset the form when new data was provided\n */\nexport const resetNgxTableForm = (\n\tcurrentForm: FormGroup,\n\tdata: unknown[],\n\tselectableKey?: string,\n\tresetFormOnNewData?: boolean\n): void => {\n\t// Iben: If no selectableKey was provided but resetFormOnNewData is false, we throw an error. This is because then the form is index based, and it cannot be reset\n\tif (!resetFormOnNewData && !selectableKey) {\n\t\tconsole.error(\n\t\t\t'NgxTableComponent cannot keep the current form data if no selectableKey was provided, as the keys of the FormGroup are index based. Provide a selectableKey in order for the table to correctly function.'\n\t\t);\n\n\t\treturn;\n\t}\n\n\t// Iben: If no selectableKey was passed, we assume that we're in the index based form and we can remove all current controls\n\tif (!selectableKey) {\n\t\t// Iben: Loop over the current form and remove all controls\n\t\tObject.keys(currentForm.controls || []).forEach((control) => {\n\t\t\tcurrentForm.removeControl(control, { emitEvent: false });\n\t\t});\n\n\t\t// Iben: Loop over data and create the new controls\n\t\tdata.forEach((_, index) => {\n\t\t\tcurrentForm.addControl(`${index}`, new FormControl(), {\n\t\t\t\temitEvent: false,\n\t\t\t});\n\t\t});\n\n\t\treturn;\n\t}\n\n\t// Iben: If we can reset the form we remove all controls of the form and add new\n\tif (resetFormOnNewData) {\n\t\t// Iben: Loop over the current form and remove all controls\n\t\tObject.keys(currentForm.controls || []).forEach((control) => {\n\t\t\tcurrentForm.removeControl(control, { emitEvent: false });\n\t\t});\n\n\t\t// Iben: Loop over data and create the new controls\n\t\tdata.forEach((item) => {\n\t\t\tcurrentForm.addControl(item[selectableKey], new FormControl(), {\n\t\t\t\temitEvent: false,\n\t\t\t});\n\t\t});\n\n\t\treturn;\n\t}\n\n\t// Iben If we cannot reset the form, we add new controls for each new data entry point\n\n\t// Iben:We start by grabbing all the current keys so we can see which ones need to be added\n\tconst keys = new Set(Object.keys(currentForm.controls) || []);\n\n\t// Iben: Add new controls for the keys that do not exist yet\n\t[...data].forEach((item) => {\n\t\tif (!keys.has(item[selectableKey])) {\n\t\t\tcurrentForm.addControl(item[selectableKey], new FormControl(), {\n\t\t\t\temitEvent: false,\n\t\t\t});\n\t\t}\n\t});\n};\n","import { FormGroup } from '@angular/forms';\n\n/**\n * Handles the writeValue value of an NgxTableComponent form\n *\n * @param value - The value we wish to convert\n * @param selectableKey - An optional key that is used to fetch the value\n */\nexport const writeNgxTableValue = (\n\tvalue: string[],\n\tselectableKey?: string\n): Record<string, boolean> => {\n\t// Iben: Early exit if the value is empty or not an array\n\tif (!Array.isArray(value) || value.length === 0) {\n\t\treturn {};\n\t}\n\n\t// Iben: Create group value to patch\n\treturn [...value].reduce((previousValue, selectedValue, index) => {\n\t\t// Iben: If a selectableKey is provided, we use the value as the key, otherwise we use the index\n\t\tconst key = selectableKey ? selectedValue : index;\n\n\t\treturn {\n\t\t\t...previousValue,\n\t\t\t[key]: true,\n\t\t};\n\t}, {});\n};\n\n/**\n * Get for every control in the group a record with the value `true`.\n *\n * @param data The formGroup whose controls will be used.\n * @returns A record with the key of the controls as key with the value `true`.\n */\nexport const handleNgxTableHeaderValueChanges = (data: FormGroup): Record<string, true> => {\n\treturn Object.keys(data.controls || []).reduce(\n\t\t(previousValues, currentValue) => ({\n\t\t\t...previousValues,\n\t\t\t[currentValue]: true,\n\t\t}),\n\t\t{}\n\t);\n};\n\n/**\n * Handles the value changes of a NgxTableComponent form\n *\n * @param value - The value of the form\n */\nexport const handleNgxTableValueChanges = (value: Record<string, boolean>): string[] => {\n\tconst result = [];\n\n\t// Iben: Foreach over the entries as a map and a filter would mean two loops instead of one\n\tObject.entries(value || {}).forEach(([key, isSelected]) => {\n\t\tif (isSelected) {\n\t\t\tresult.push(key);\n\t\t}\n\t});\n\n\treturn result;\n};\n","import { Type } from '@angular/core';\n\nimport {\n\tComponentType,\n\tNgxMobileLayoutByQuery,\n\tNgxMobileLayoutConfiguration,\n\tNgxMobileLayoutItem,\n} from '../../types';\n\n/**\n * Extracts the layout from the configuration and sorts them by query\n *\n * @param layout - The layout configuration we wish to set\n * @param defaultLayout - The default layout that was set\n * @param queries - The queries set to the NgxMediaQueryService\n */\nexport const extractLayout = (\n\tlayout: NgxMobileLayoutConfiguration,\n\tdefaultLayout: NgxMobileLayoutConfiguration | undefined,\n\tqueries: string[]\n): NgxMobileLayoutByQuery => {\n\treturn {\n\t\theader: {\n\t\t\tleft: extractComponents(layout?.header?.left, defaultLayout?.header?.left, queries),\n\t\t\tmain: extractComponents(layout?.header?.main, defaultLayout?.header?.main, queries),\n\t\t\tright: extractComponents(layout?.header?.right, defaultLayout?.header?.right, queries),\n\t\t},\n\t\tnavigation: extractComponents(layout?.navigation, defaultLayout?.navigation, queries),\n\t\taside: extractComponents(layout?.aside, defaultLayout?.aside, queries),\n\t\tflyout: extractComponents(layout?.flyout, defaultLayout?.flyout, queries),\n\t\tfooter: extractComponents(layout?.footer, defaultLayout?.footer, queries),\n\t};\n};\n\n/**\n * Extracts the components from the item and creates a layout item per query\n *\n * @param item - The item used by the layout\n * @param defaultLayout - The default layout that was set\n * @param queries - The queries set to the NgxMediaQueryService\n */\nconst extractComponents = (\n\titem: NgxMobileLayoutItem,\n\tdefaultLayout: NgxMobileLayoutItem,\n\tqueries: string[]\n): Record<string, ComponentType> => {\n\t// Iben: If the item is null, we return an empty object\n\tif (item === null) {\n\t\treturn {};\n\t}\n\n\t// Iben: If a single component is presented, we use this component for each query\n\tif (item instanceof Type) {\n\t\tconst result = {};\n\n\t\tqueries.forEach((query) => {\n\t\t\tresult[query] = item;\n\t\t});\n\n\t\treturn result;\n\t}\n\n\t// Iben: In this case, a record of components was provided\n\tconst result = { ...(item || {}) };\n\n\t// Iben: If no default was provided, we return the record as is.\n\tif (!defaultLayout) {\n\t\treturn result;\n\t}\n\n\t// Iben: If the default layout is a single component, we fill in the missing gaps\n\tif (defaultLayout instanceof Type) {\n\t\tqueries.forEach((query) => {\n\t\t\tif (result[query] === undefined) {\n\t\t\t\tresult[query] = defaultLayout;\n\t\t\t}\n\t\t});\n\t} else {\n\t\t// Iben: If the default layout is a a record, we fill in the missing gaps with the ones that are provided\n\t\tqueries.forEach((query) => {\n\t\t\tif (result[query] === undefined) {\n\t\t\t\tresult[query] = defaultLayout[query];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn result;\n};\n","import { Injectable, OnDestroy, inject } from '@angular/core';\nimport { NgxWindowService } from '@ibenvandeveire/ngx-core';\nimport { BehaviorSubject, distinctUntilChanged, filter, map, Observable, throwError } from 'rxjs';\n\nimport { NgxMediaQueriesToken } from '../../tokens';\nimport { NgxMediaQuery, NgxMediaQueryMatchingPredicate } from '../../types';\n\n/**\n * A service that can be used to track media queries and their changes.\n */\n@Injectable({ providedIn: 'root' })\nexport class NgxMediaQueryService implements OnDestroy {\n\t/**\n\t * An instance of the NgxWindowService\n\t */\n\tprivate readonly windowService: NgxWindowService = inject(NgxWindowService);\n\n\t/**\n\t * An optional list of default mediaQueries we want to register at start time\n\t */\n\tprivate readonly mediaQueries: NgxMediaQuery[] = inject(NgxMediaQueriesToken, {\n\t\toptional: true,\n\t});\n\n\t/**\n\t * A record of all the registered listeners\n\t */\n\tprivate listeners: Record<string, { mediaQueryList: MediaQueryList; listener: EventListener }> =\n\t\t{};\n\n\t/**\n\t * The id of the current query match\n\t */\n\tprivate readonly currentQueryMatch: BehaviorSubject<string> = new BehaviorSubject<string>(\n\t\tundefined\n\t);\n\n\tpublic readonly currentQueryMatch$: Observable<string> = this.currentQueryMatch.asObservable();\n\n\tconstructor() {\n\t\t// Iben: Register the optionally provided standard queries\n\t\tthis.registerQuery(this.mediaQueries || []);\n\t}\n\n\tngOnDestroy(): void {\n\t\t// Iben: Remove all the listeners\n\t\tObject.values(this.listeners).forEach(({ listener, mediaQueryList }) => {\n\t\t\tmediaQueryList.removeEventListener('change', listener);\n\t\t});\n\t}\n\n\t/**\n\t * Registers one or multiple queries to listen to\n\t *\n\t * @param value - One or multiple queries to register\n\t */\n\tpublic registerQuery(value: NgxMediaQuery | NgxMediaQuery[]): void {\n\t\t// Iben: Only run when we're in the browser\n\t\tthis.windowService.runInBrowser(({ browserWindow }) => {\n\t\t\t// Iben: Loop over all the queries\n\t\t\t(Array.isArray(value) ? value : [value]).forEach((item) => {\n\t\t\t\tconst { id, query } = item;\n\n\t\t\t\t// Iben: Early exit if a query already exists\n\t\t\t\tif (this.listeners[id]) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t'@ibenvandeveire/ngx-layout: NgxMediaQueryService: A query with this id already exists.'\n\t\t\t\t\t);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Iben: Match the query with the browser\n\t\t\t\tconst mediaQueryList = browserWindow.matchMedia(query);\n\n\t\t\t\t// Iben: Perform an initial check to see if the query matches\n\t\t\t\tif (mediaQueryList.matches) {\n\t\t\t\t\tthis.currentQueryMatch.next(id);\n\t\t\t\t}\n\n\t\t\t\t// Iben: Setup a listener to track the changes\n\t\t\t\tconst listener = (queryChangedEvent: MediaQueryListEvent) => {\n\t\t\t\t\tif (queryChangedEvent.matches) {\n\t\t\t\t\t\t// Iben: Emit the id of the query that has changed\n\t\t\t\t\t\tthis.currentQueryMatch.next(id);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Iben: Register the listener to the query\n\t\t\t\tmediaQueryList.addEventListener('change', listener);\n\n\t\t\t\t// Iben: Save the listener to remove it later\n\t\t\t\tthis.listeners[id] = {\n\t\t\t\t\tlistener,\n\t\t\t\t\tmediaQueryList,\n\t\t\t\t};\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Check if the query matches with the current screen size\n\t *\n\t * @param id - The id of the query we wish to match\n\t * @param predicate - Whether every or some part(s) of the query have to be matched\n\t */\n\tpublic matchesQuery(\n\t\tid: string | string[],\n\t\tpredicate: NgxMediaQueryMatchingPredicate = 'every'\n\t): Observable<boolean> {\n\t\tconst ids = Array.isArray(id) ? id : [id];\n\n\t\t// Iben: Check if the query matches\n\t\tconst hasQuery = ids[predicate]((item) => this.listeners[item]);\n\n\t\t// Iben: If the listener does not exist yet, throw an error\n\t\tif (!hasQuery) {\n\t\t\treturn throwError(\n\t\t\t\t() =>\n\t\t\t\t\tnew Error(\n\t\t\t\t\t\t'@ibenvandeveire/ngx-layout: NgxMediaQueryService: No provided query matched with the provided ids.'\n\t\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\t// Iben: Create a matching set\n\t\tconst matchingSet = new Set(ids);\n\n\t\t// Iben: Return whether the current screen size matches the query\n\t\treturn this.currentQueryMatch.pipe(\n\t\t\tfilter(Boolean),\n\t\t\tdistinctUntilChanged(),\n\t\t\tmap((query) => matchingSet.has(query))\n\t\t);\n\t}\n\n\tpublic get queries() {\n\t\treturn Object.keys(this.listeners);\n\t}\n}\n","import { inject, Injectable, signal, Signal, WritableSignal } from '@angular/core';\nimport { get } from 'lodash';\nimport clean from 'obj-clean';\nimport {\n\tBehaviorSubject,\n\tcombineLatest,\n\tdistinctUntilChanged,\n\tfilter,\n\tmap,\n\tObservable,\n\ttake,\n\ttap,\n} from 'rxjs';\n\nimport { NgxMobileLayoutConfigurationToken } from '../../tokens';\nimport {\n\tComponentType,\n\tNgxMobileLayout,\n\tNgxMobileLayoutByQuery,\n\tNgxMobileLayoutConfiguration,\n\tNgxMobileLayoutElements,\n\tNgxMobileLayoutOutletParams,\n} from '../../types';\nimport { extractLayout } from '../../utils';\nimport { NgxMediaQueryService } from '../media-query/media-query.service';\n\n/**\n * The `NgxMobileLayoutService` allows us to configure an entire layout based on routing rather than on HTML. This allows for an easier use for mobile-first applications.\n */\n@Injectable({\n\tprovidedIn: 'root',\n})\nexport class NgxMobileLayoutService {\n\t/**\n\t * An instance of the NgxMediaQueryService\n\t */\n\tprotected readonly mediaService: NgxMediaQueryService = inject(NgxMediaQueryService);\n\n\t/**\n\t * A subject holding whether the initial layout has been set\n\t */\n\tprotected readonly initialLayoutSetSubject$: BehaviorSubject<boolean> = new BehaviorSubject(\n\t\tfalse\n\t);\n\n\t/**\n\t * Whether the initial layout has been set\n\t */\n\tprotected readonly initialLayoutSet$: Observable<boolean> = this.initialLayoutSetSubject$;\n\n\t/**\n\t * An optional default layout that was provided\n\t */\n\tprotected readonly defaultLayout: NgxMobileLayoutConfiguration | undefined = inject(\n\t\tNgxMobileLayoutConfigurationToken,\n\t\t{ optional: true }\n\t);\n\n\t/**\n\t * A subject holding the current layout of the application\n\t */\n\tprotected readonly layoutSubject$: BehaviorSubject<NgxMobileLayoutByQuery> =\n\t\tnew BehaviorSubject<NgxMobileLayoutByQuery>(undefined);\n\n\t/**\n\t * Whether the flyout should be shown\n\t */\n\tprotected readonly showFlyout: WritableSignal<boolean> = signal(false);\n\n\t/**\n\t * Whether the currently opened flyout should be preserved when the route changes\n\t */\n\tprotected readonly preserveFlyout: WritableSignal<boolean> = signal(false);\n\n\t/**\n\t * Whether the aside should be shown\n\t */\n\tprotected readonly showAside: WritableSignal<boolean> = signal(false);\n\n\t/**\n\t * An array of queries\n\t */\n\tprotected queries: string[];\n\n\t/**\n\t * The current layout of the application as an Observable\n\t */\n\tpublic readonly layout$: Observable<NgxMobileLayout> = combineLatest([\n\t\tthis.mediaService.currentQueryMatch$.pipe(\n\t\t\tdistinctUntilChanged(),\n\t\t\tmap((query) => (query ? query.toLowerCase() : 'default'))\n\t\t),\n\t\tthis.layoutSubject$.asObservable().pipe(distinctUntilChanged(), filter(Boolean)),\n\t]).pipe(\n\t\tmap(([query, layout]) => {\n\t\t\treturn clean({\n\t\t\t\theader: {\n\t\t\t\t\tleft: layout.header.left[query],\n\t\t\t\t\tmain: layout.header.main[query],\n\t\t\t\t\tright: layout.header.right[query],\n\t\t\t\t},\n\t\t\t\tnavigation: layout.navigation[query],\n\t\t\t\tflyout: layout.flyout[query],\n\t\t\t\taside: layout.aside[query],\n\t\t\t\tfooter: layout.footer[query],\n\t\t\t}) as NgxMobileLayout;\n\t\t})\n\t);\n\n\t/**\n\t * Whether the flyout is visible\n\t */\n\tpublic flyoutShown: Signal<boolean> = this.showFlyout.asReadonly();\n\n\t/**\n\t * The parameter context of the flyout\n\t */\n\tpublic flyoutParams: WritableSignal<NgxMobileLayoutOutletParams> = signal(undefined);\n\n\t/**\n\t * The parameter context of the aside\n\t */\n\tpublic asideParams: WritableSignal<NgxMobileLayoutOutletParams> = signal(undefined);\n\n\t/**\n\t * Whether the aside is visible\n\t */\n\tpublic asideShown: Signal<boolean> = this.showAside.asReadonly();\n\n\t/**\n\t * Sets the provided layout for the\n\t *\n\t * @param layout - The layout we wish to set\n\t */\n\tpublic setLayout(layout: NgxMobileLayoutConfiguration): Observable<boolean> {\n\t\t// Iben: To prevent timing issues, we wait until the initial layout has been set\n\t\treturn this.initialLayoutSet$.pipe(\n\t\t\tfilter(Boolean),\n\t\t\ttake(1),\n\t\t\ttap(() => {\n\t\t\t\t// Iben: Preserve the flyout if it was required\n\t\t\t\tconst result = this.preserveFlyout()\n\t\t\t\t\t? { ...layout, flyout: this.layoutSubject$.value.flyout }\n\t\t\t\t\t: layout;\n\n\t\t\t\t// Iben: Update the layout\n\t\t\t\tthis.layoutSubject$.next(extractLayout(result, this.defaultLayout, this.queries));\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Open a flyout\n\t *\n\t * @param flyout - The flyout component\n\t * @param params - The required parameters for the flyout\n\t * @param preserveFlyout - Whether the flyout needs to be preserved\n\t *\n\t */\n\tpublic openFlyout(\n\t\tflyout: ComponentType,\n\t\tparams: NgxMobileLayoutOutletParams,\n\t\tpreserveFlyout: boolean = false\n\t): void {\n\t\t// Iben: Add the flyout if there wasn't one defined\n\t\tif (flyout) {\n\t\t\tthis.layoutSubject$.next({\n\t\t\t\t...this.layoutSubject$.getValue(),\n\t\t\t\tflyout: this.queries.reduce((previous, current) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...previous,\n\t\t\t\t\t\t[current]: flyout,\n\t\t\t\t\t};\n\t\t\t\t}, {}),\n\t\t\t});\n\n\t\t\t// Iben: Make the flyout visible and add the injector\n\t\t\tthis.showFlyout.set(true);\n\t\t\tthis.preserveFlyout.set(preserveFlyout);\n\t\t\tthis.flyoutParams.set(params);\n\t\t}\n\t}\n\n\t/**\n\t * Close the currently open flyout\n\t */\n\tpublic closeFlyout(): void {\n\t\t// Iben: Make the flyout invisible\n\t\tthis.preserveFlyout.set(false);\n\t\tthis.showFlyout.set(false);\n\t\tthis.flyoutParams.set(undefined);\n\t}\n\n\t/**\n\t * Open an aside\n\t *\n\t * @param aside - The aside component\n\t * @param params - The required parameters for the aside\n\t */\n\tpublic openAside(aside: ComponentType, params: NgxMobileLayoutOutletParams): void {\n\t\t// Iben: Add the aside if there wasn't one defined\n\t\tif (aside) {\n\t\t\tthis.layoutSubject$.next({\n\t\t\t\t...this.layoutSubject$.getValue(),\n\t\t\t\taside: this.queries.reduce((previous, current) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...previous,\n\t\t\t\t\t\t[current]: aside,\n\t\t\t\t\t};\n\t\t\t\t}, {}),\n\t\t\t});\n\t\t}\n\n\t\t// Iben: Show the aside and add the injector\n\t\tthis.showAside.set(true);\n\t\tthis.asideParams.set(params);\n\t}\n\n\t/**\n\t * Close the currently open aside\n\t */\n\tpublic closeAside(): void {\n\t\tthis.showAside.set(false);\n\t\tthis.asideParams.set(undefined);\n\t}\n\n\t/**\n\t * Provides an initial layout if one was provided\n\t */\n\tpublic setUpInitialLayout(markAsInitial: boolean = true): void {\n\t\t// Iben: Set up the initial queries and set it as 'default' if\n\t\tthis.queries = this.mediaService.queries.length\n\t\t\t? this.mediaService.queries.map((query) => query.toLowerCase())\n\t\t\t: ['default'];\n\n\t\t// Iben: Preserve the flyout if it was required\n\t\tconst layout = this.preserveFlyout()\n\t\t\t? { ...this.defaultLayout, flyout: this.layoutSubject$.value.flyout }\n\t\t\t: this.defaultLayout;\n\n\t\t// Iben: Set initial layout\n\t\tthis.layoutSubject$.next(extractLayout(layout, {}, this.queries));\n\n\t\t// Iben: Mark the initial layout set as true\n\t\tif (markAsInitial) {\n\t\t\tthis.initialLayoutSetSubject$.next(true);\n\t\t}\n\t}\n\n\t/**\n\t * Returns whether an element is defined in the layout\n\t *\n\t * @param element - The element we wish to check\n\t */\n\tpublic hasElement(element: NgxMobileLayoutElements): Observable<boolean> {\n\t\treturn this.layout$.pipe(\n\t\t\tfilter(Boolean),\n\t\t\tdistinctUntilChanged(),\n\t\t\tmap((layout) => Boolean(get(layout, element)))\n\t\t);\n\t}\n}\n","import { inject, Injectable, Sanitizer, SecurityContext } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { Marked, MarkedExtension, MarkedOptions } from 'marked';\nimport { from, map, Observable, take } from 'rxjs';\n\nimport { NgxMarkdownConfigurationToken } from '../../tokens';\n\n/**\n * A service that can be used to parse markdown strings to HTML using the Marked library\n */\n@Injectable({\n\tprovidedIn: 'root',\n})\nexport class NgxMarkdownService {\n\t/**\n\t * An optional set of configuration for the Marked library\n\t */\n\tprivate readonly configuration: MarkedExtension[] = inject(NgxMarkdownConfigurationToken, {\n\t\toptional: true,\n\t});\n\n\t/**\n\t * An instance of the Sanitizer\n\t */\n\tprivate readonly sanitizer: Sanitizer = inject(DomSanitizer);\n\n\t/**\n\t * An instance of the Marked library\n\t * https://marked.js.org/\n\t */\n\tprivate markedInstance: Marked = this.configuration\n\t\t? new Marked(...this.configuration)\n\t\t: new Marked();\n\n\t/**\n\t * Parse markdown to HTML and sanitizes the HTML string\n\t *\n\t * @param markdown - The markdown string to parse\n\t */\n\tpublic parse(markdown: string, options?: Omit<MarkedOptions, 'async'>): Observable<string> {\n\t\t// Iben: Parse the markdown string to HTML using the Marked library\n\t\treturn from(this.markedInstance.parse(markdown, { ...(options || {}), async: true })).pipe(\n\t\t\ttake(1),\n\t\t\t// Iben: Sanitize the HTML string\n\t\t\tmap((html) => this.sanitizer.sanitize(SecurityContext.HTML, html))\n\t\t);\n\t}\n\n\t/**\n\t * Get the instance of the Marked library\n\t */\n\tpublic getMarkedInstance(): Marked {\n\t\treturn this.markedInstance;\n\t}\n}\n","import {\n\tAfterViewInit,\n\tChangeDetectorRef,\n\tDirective,\n\tElementRef,\n\tInputSignal,\n\tOnDestroy,\n\tTemplateRef,\n\tType,\n\tViewContainerRef,\n\teffect,\n\tinject,\n\tinput,\n\tDestroyRef,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Subject, distinctUntilChanged, tap } from 'rxjs';\n\nimport { NgxDisplayContentComponent } from '../../abstracts';\nimport { NgxOnlineService } from '../../services';\nimport { NgxDisplayContentConfigurationToken } from '../../tokens';\nimport {\n\tNgxDisplayContentAriaLive,\n\tNgxDisplayContentConditions,\n\tNgxDisplayContentConfiguration,\n\tNgxDisplayContentOverrideConfiguration,\n\tNgxDisplayContentStatus,\n} from '../../types';\n\n/**\n * NgxDisplayContentDirective handles whether content should be shown based on a loading, error or offline condition by using provided default components or a provided override template\n */\n@Directive({\n\tselector: '[displayContent]',\n\tstandalone: true,\n})\nexport class NgxDisplayContentDirective implements AfterViewInit, OnDestroy {\n\t/**\n\t * An instance of the ElementRef\n\t */\n\tprotected readonly elementRef = inject(ElementRef);\n\t/**\n\t * An instance of the TemplateRef\n\t */\n\tprotected readonly templateRef = inject<TemplateRef<any>>(TemplateRef);\n\t/**\n\t * An instance of the ChangeDetectorRef\n\t */\n\tprotected readonly cdRef = inject(ChangeDetectorRef);\n\n\t/**\n\t * An instance of the ViewContainerRef\n\t */\n\tprotected readonly viewContainer = inject(ViewContainerRef);\n\n\t/**\n\t * An instance of the OnlineService\n\t */\n\tprotected readonly onlineService = inject(NgxOnlineService);\n\n\t/**\n\t * The configuration used to display the content\n\t */\n\tprotected readonly configuration = inject<NgxDisplayContentConfiguration>(\n\t\tNgxDisplayContentConfigurationToken\n\t);\n\n\t/**\n\t * A subject to hold the destroy flow\n\t */\n\tprotected readonly destroyRef = inject(DestroyRef);\n\n\t/**\n\t * A subject to know when we need to update the view\n\t */\n\tprotected readonly updateViewSubject: Subject<void> = new Subject<void>();\n\n\t/**\n\t * Holds an optional override configuration\n\t */\n\tprotected overrideConfiguration: NgxDisplayContentOverrideConfiguration = {};\n\n\t/**\n\t * Holds the conditions we use to render the component\n\t */\n\tprotected conditions: NgxDisplayContentConditions = {};\n\n\t/**\n\t * Renders the item or a default fallback based on the provided conditions\n\t */\n\tpublic displayContent: InputSignal<NgxDisplayContentConditions> = input.required();\n\n\t/**\n\t * Override the existing configuration with custom configuration\n\t */\n\tpublic displayContentConfiguration: InputSignal<NgxDisplayContentOverrideConfiguration> =\n\t\tinput();\n\n\t/**\n\t * The aria-live label we wish to provide to the parent element. By default, this is 'polite'.\n\t *\n\t * https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Live_Regions\n\t */\n\treadonly displayContentAriaLive = input<NgxDisplayContentAriaLive>('polite');\n\n\tconstructor() {\n\t\t// Iben: If we want to listen to the online status, we set up a listener to the status of the application\n\t\tif (this.configuration.listenToOnlineStatus) {\n\t\t\tthis.onlineService.online$\n\t\t\t\t.pipe(\n\t\t\t\t\tdistinctUntilChanged(),\n\t\t\t\t\ttap((online) => {\n\t\t\t\t\t\t// Iben: Update the conditions with the new status\n\t\t\t\t\t\tthis.updateConditions({ offline: !online });\n\n\t\t\t\t\t\t// Iben: Notify that the view needs to be updated\n\t\t\t\t\t\tthis.updateViewSubject.next();\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntilDestroyed()\n\t\t\t\t)\n\t\t\t\t.subscribe();\n\t\t}\n\n\t\teffect(() => {\n\t\t\t// Iben: Update the conditions\n\t\t\tthis.updateConditions(this.displayContent() || {});\n\n\t\t\t// Iben: Notify that the view needs to be updated\n\t\t\tthis.updateViewSubject.next();\n\t\t});\n\n\t\teffect(() => {\n\t\t\t// Iben: Update the override configuration\n\t\t\tthis.overrideConfiguration = this.displayContentConfiguration() || {};\n\n\t\t\t// Iben: Notify that the view needs to be updated\n\t\t\tthis.updateViewSubject.next();\n\t\t});\n\t}\n\n\tpublic ngAfterViewInit(): void {\n\t\t// Iben: Set the aria-live and aria-busy tag of the parent\n\t\tthis.setAriaLiveTag(this.displayContentAriaLive());\n\n\t\t// Iben: Listen to whenever we need to update the view and act accordingly\n\t\tthis.updateViewSubject\n\t\t\t.asObservable()\n\t\t\t.pipe(\n\t\t\t\ttap(() => {\n\t\t\t\t\t// Iben: Clear the current view container\n\t\t\t\t\tthis.viewContainer.clear();\n\n\t\t\t\t\t// Iben: Update the busy tag\n\t\t\t\t\tthis.setAriaBusyTag(this.conditions.loading);\n\n\t\t\t\t\t// Iben: If we're offline, we render the offline component or template\n\t\t\t\t\tif (this.conditions.offline) {\n\t\t\t\t\t\tthis.renderTemplate('offline', this.configuration.components.offline);\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t// Iben: If we're loading, we render the loading component or template\n\t\t\t\t\tif (this.conditions.loading) {\n\t\t\t\t\t\tthis.renderTemplate('loading', this.configuration.components.loading);\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t// Iben: If we've encountered an error, we render the error component or template\n\t\t\t\t\tif (this.conditions.error) {\n\t\t\t\t\t\tthis.renderTemplate('error', this.configuration.components.error);\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t//Iben: Render the initial template\n\t\t\t\t\tthis.renderInitialTemplate();\n\t\t\t\t}),\n\t\t\t\t// Iben: We add a second tap here, so the detectChanges gets run after each outcome we did earlier\n\t\t\t\ttap(() => {\n\t\t\t\t\t// Iben: Detect the changes so this works with (nested) OnPush component\n\t\t\t\t\tthis.cdRef.detectChanges();\n\t\t\t\t}),\n\t\t\t\ttakeUntilDestroyed(this.destroyRef)\n\t\t\t)\n\t\t\t.subscribe();\n\n\t\t// Iben: Run the initial content check\n\t\tthis.updateViewSubject.next();\n\t}\n\n\tpublic ngOnDestroy(): void {\n\t\tthis.elementRef.nativeElement.parentElement?.removeAttribute('aria-busy');\n\t}\n\n\t/**\n\t * Renders the provided component or template\n\t *\n\t * @param  status - The status we're handling\n\t * @param  component - The component we're wishing to render\n\t */\n\tprotected renderTemplate(\n\t\tstatus: NgxDisplayContentStatus,\n\t\tcomponent: Type<NgxDisplayContentComponent>\n\t): void {\n\t\t// Iben: If an override for this template exists, we render the override template and early exit\n\t\tif (this.overrideConfiguration[status]?.template) {\n\t\t\tthis.viewContainer.createEmbeddedView(this.overrideConfiguration[status]?.template);\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Iben: If a component was provided, we render this component and pass along the provided data and early exit\n\t\tif (component) {\n\t\t\t// Iben: Render the component\n\t\t\tconst componentRef =\n\t\t\t\tthis.viewContainer.createComponent<NgxDisplayContentComponent>(component);\n\n\t\t\t// Iben: Pass the data\n\t\t\tcomponentRef.setInput('data', this.overrideConfiguration[status]?.data);\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Iben: If we need to hide the template when no template was provided, we early exit\n\t\tif (this.configuration.hideWhenNoTemplateProvided) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Iben: In case we don't need to hide the initial template, we render it\n\t\tthis.renderInitialTemplate();\n\t}\n\n\t/**\n\t * Renders the initial template\n\t */\n\tprotected renderInitialTemplate(): void {\n\t\tthis.viewContainer.createEmbeddedView(this.templateRef);\n\t}\n\n\t/**\n\t * Updates the conditions\n\t *\n\t * @param conditions - The conditions we want to merge with the current set\n\t */\n\tprotected updateConditions(conditions: NgxDisplayContentConditions): void {\n\t\t// Iben: Update the conditions, but use a merge so that the online status can be preserved\n\t\tif (conditions) {\n\t\t\tthis.conditions = {\n\t\t\t\t...this.conditions,\n\t\t\t\t...conditions,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Sets the aria-live tag of the item\n\t * @param  value - The value we wish to set\n\t */\n\tprotected setAriaLiveTag(value: 'polite' | 'assertive' | 'off'): void {\n\t\t// Iben: Get the parent element and early exit if it isn't found\n\t\tconst parentElement: HTMLElement = this.elementRef.nativeElement.parentElement;\n\n\t\tif (!parentElement) {\n\t\t\t// Iben:\n\t\t\tconsole.error(\n\t\t\t\t'NgxLayout: No parent element was found for NgxDisplayContentDirective. Because of that, the correct aria-live label could not be set.'\n\t\t\t);\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Iben: If the value is assertive then we always set it, as it has the highest priority\n\t\tif (value === 'assertive') {\n\t\t\tparentElement.setAttribute('aria-live', value);\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Iben: Fetch the current aria-live label. If none were found, set it automatically\n\t\tconst currentValue = parentElement.getAttribute('aria-live');\n\n\t\tif (!currentValue) {\n\t\t\tparentElement.setAttribute('aria-live', value);\n\t\t}\n\n\t\t// Iben: If the current value is assertive or if the values are the same, we early exit\n\t\tif (currentValue === 'assertive' || currentValue === value) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Iben: Set the value\n\t\tparentElement.setAttribute('aria-live', value);\n\t}\n\n\t/**\n\t * Sets the aria-busy tag of the item\n\t * @param  isLoading - The loading state of the item\n\t */\n\tprotected setAriaBusyTag(isLoading: boolean): void {\n\t\tthis.elementRef.nativeElement.parentElement?.setAttribute('aria-busy', `${isLoading}`);\n\t}\n}\n","import { Directive, input } from '@angular/core';\n\n/**\n * A directive to handle accessible drag and drop flows. This directive is meant to be placed on the drag and drop container(s).\n */\n@Directive({\n\tselector: '[ngxAccessibleDragAndDropContainer]',\n\texportAs: 'ngxAccessibleDragAndDropContainer',\n\tstandalone: true,\n})\nexport class NgxAccessibleDragAndDropContainerDirective {\n\t/**\n\t * The index of the container\n\t */\n\tpublic readonly index = input.required<number>({ alias: \"ngxAccessibleDragAndDropContainerIndex\" });\n\n\t/**\n\t * An optional label used in the event messages\n\t */\n\tpublic readonly label = input<string>(undefined, { alias: \"ngxAccessibleDragAndDropContainerLabel\" });\n}\n","import { Directive, ElementRef, inject, input } from '@angular/core';\n\n/**\n * An abstract class to use when implementing custom fallbacks for the NgxDisplayContentDirective\n */\n@Directive()\nexport abstract class NgxDisplayContentComponent {\n\tpublic elementRef: ElementRef = inject(ElementRef);\n\n\t/**\n\t * An optional data input to provide data to the fallback components. This property is typed as any.\n\t */\n\treadonly data = input<any>();\n}\n","import { Directive, ElementRef, HostListener, inject } from '@angular/core';\n\n//TODO: Iben: Move this copy to a shared lib once we have figured out how to handle that.\n\n/**\n * An abstract directive used as a base to handle focussed base actions\n */\n@Directive({\n\tstandalone: true,\n})\nexport abstract class NgxHasFocusDragAndDropAbstractDirective {\n\t/**\n\t * Whether the current element is focussed\n\t */\n\tprotected hasFocus: boolean = false;\n\n\t/**\n\t * Set the hasFocus flag\n\t */\n\t@HostListener('focus') public setFocus(): void {\n\t\tthis.hasFocus = true;\n\n\t\tif (this.onFocus) {\n\t\t\tthis.onFocus();\n\t\t}\n\t}\n\n\t/**\n\t * Remove the hasFocus flag\n\t */\n\t@HostListener('blur') public removeFocus() {\n\t\tthis.hasFocus = false;\n\n\t\tif (this.onBlur) {\n\t\t\tthis.onBlur();\n\t\t}\n\t}\n\n  public readonly elementRef: ElementRef<HTMLElement> = inject( ElementRef );\n\n\tpublic focus(): void {\n\t\tthis.elementRef.nativeElement.focus();\n\t}\n\n\tpublic onBlur?(): void;\n\n\tpublic onFocus?(): void;\n\n\t/**\n\t * Execute an action when the element has focussed\n\t *\n\t * @param action - The provided action\n\t */\n\tpublic handleWhenFocussed(action: () => void): void {\n\t\tif (this.hasFocus) {\n\t\t\taction();\n\t\t}\n\t}\n}\n","import { Directive, Signal } from '@angular/core';\n\nimport { NgxHasFocusDragAndDropAbstractDirective } from './has-focus.directive';\n\n/**\n * An abstract class to avoid circular dependency with the ItemDirective and the HostDirective\n */\n@Directive()\nexport abstract class NgxAccessibleAbstractDragAndDropItemDirective extends NgxHasFocusDragAndDropAbstractDirective {\n\t/**\n\t * An unique id of the draggable item\n\t */\n\tabstract itemId: Signal<string>;\n\n\t/**\n\t *  Marks the item as focussed and selected\n\t */\n\tabstract markAsActive(): void;\n}\n","import { NgxAccessibleDragAndDropMessageRecord } from '../../types';\n\nexport const NgxAccessibleDragAndDropMessageRecords: Record<\n\tstring,\n\tNgxAccessibleDragAndDropMessageRecord\n> = {\n\tnl: {\n\t\tselected: '{{#item}} geselecteerd.',\n\t\tdeselected: '{{#item}} gedeselecteerd.',\n\t\treordered: '{{#item}} werd verplaatst van positie {{#from}} naar {{#to}}.',\n\t\tmoved: '{{#item}} werd verplaatst van {{#from}} naar {{#to}}.',\n\t\tcancelled: 'Het verplaatsen van {{#item}} werd geannuleerd.',\n\t\titem: 'item',\n\t\tcontainer: 'lijst',\n\t\tdescription:\n\t\t\t'Om items in dit onderdeel te verplaatsen, navigeer naar een item via de Tab toets. Door de Enter of Space toets in te drukken selecteer je een item. Met de pijltjes toetsen verplaats je het item.',\n\t},\n\ten: {\n\t\tselected: '{{#item}} selected.',\n\t\tdeselected: '{{#item}} deselected.',\n\t\treordered: '{{#item}} was moved from position {{#from}} to {{#to}}.',\n\t\tmoved: '{{#item}} was moved from {{#from}} to {{#to}}.',\n\t\tcancelled: 'Moving {{#item}} was cancelled.',\n\t\titem: 'item',\n\t\tcontainer: 'list',\n\t\tdescription:\n\t\t\t'To move items in this container, navigate to the item using the Tab key. By pressing Enter or Space you can select the item, which you can then move by using the Arrow keys.',\n\t},\n\tfr: {\n\t\tselected: '{{#item}} sélectionné.',\n\t\tdeselected: '{{#item}} désélectionné.',\n\t\treordered: '{{#item}} a été déplacé de la position {{#from}} à {{#to}}.',\n\t\tmoved: '{{#item}} a été déplacé de {{#from}} à {{#to}}.',\n\t\tcancelled: 'Le déplacement de {{#item}} a été annulé.',\n\t\titem: 'article',\n\t\tcontainer: 'liste',\n\t\tdescription:\n\t\t\t\"Pour déplacer des éléments dans cette section, naviguez vers un élément à l'aide de la touche Tab. Appuyez sur la touche Entrée ou Espace pour sélectionner un élément. Utilisez les touches fléchées pour déplacer l'élément.\",\n\t},\n\tes: {\n\t\tselected: '{{#item}} elegido.',\n\t\tdeselected: '{{#item}} rechazado.',\n\t\treordered: '{{#item}} fue reorganizado de la posición {{#from}} a {{#to}}.',\n\t\tmoved: '{{#item}} fue trasladado de {{#from}} a {{#to}}.',\n\t\tcancelled: 'El desplazamiento de {{#item}} estuvo anulado.',\n\t\titem: 'objeto',\n\t\tcontainer: 'lista',\n\t\tdescription:\n\t\t\t'Para trasladar los objetos en esta sección, diríjase al objeto con la tecla Tab. Al tocar el botón Enter o el botón de Espacio puede seleccionar el objeto. Con las flechas puede trasladar el objeto.',\n\t},\n\tpt: {\n\t\tselected: '{{#item}} selecionado.',\n\t\tdeselected: '{{#item}} desselecionado.',\n\t\treordered: '{{#item}} foi movido da posição {{#from}} para {{#to}}.',\n\t\tmoved: '{{#item}} foi movido de {{#from}} para {{#to}}.',\n\t\tcancelled: 'A movimentação de {{#item}} foi cancelada.',\n\t\titem: 'item',\n\t\tcontainer: 'lista',\n\t\tdescription:\n\t\t\t'Para mover itens nesta seção, navegue até um item usando a tecla Tab. Pressione Enter ou Barra de Espaço para selecionar um item. Use as teclas de seta para mover o item.',\n\t},\n\ttr: {\n\t\tselected: '{{#item}} seçildi.',\n\t\tdeselected: '{{#item}} seçimi kaldırıldı.',\n\t\treordered: '{{#item}} {{#from}} konumundan {{#to}} konumuna taşındı.',\n\t\tmoved: '{{#item}} {{#from}} konumundan {{#to}} konumuna taşındı.',\n\t\tcancelled: '{{#item}} taşınması iptal edildi.',\n\t\titem: 'öğe',\n\t\tcontainer: 'liste',\n\t\tdescription:\n\t\t\t'Bu bölümdeki öğeleri taşımak için Tab tuşunu kullanarak bir öğeye gidin. Bir öğeyi seçmek için Enter veya Boşluk tuşuna basın. Öğeyi taşımak için ok tuşlarını kullanın.',\n\t},\n\tde: {\n\t\tselected: '{{#item}} ausgewählt.',\n\t\tdeselected: '{{#item}} abgewählt.',\n\t\treordered: '{{#item}} wurde von Position {{#from}} nach Position {{#to}} verschoben.',\n\t\tmoved: '{{#item}} wurde von {{#from}} nach {{#to}} verschoben.',\n\t\tcancelled: 'Das Verschieben von {{#item}} wurde abgebrochen.',\n\t\titem: 'Eintrag',\n\t\tcontainer: 'Liste',\n\n\t\tdescription:\n\t\t\t'Um Einträge in diesem Teil zu verschieben, navigiere mit der Tab-Taste zu einem Eintrag. Mit Drücken der Eingabe- oder Leerzeichentaste wählst du einen Eintrag aus. Mit den Pfeiltasten verschiebst du den Eintrag.',\n\t},\n\tku: {\n\t\tselected: '{{#item}} hate hilbijartin.',\n\t\tdeselected: '{{#item}} hate rakirin.',\n\t\treordered: '{{#item}} ji cîhê {{#from}} ve ji cîhê {{#to}} ve kişandin.',\n\t\tmoved: '{{#item}} hate veguhastin ji {{#from}} ve {{#to}}.',\n\t\tcancelled: 'Kişandina {{#item}} hate betal kirin.',\n\t\titem: 'hêman',\n\t\tcontainer: 'lista',\n\t\tdescription:\n\t\t\t'Ji bo dikaribî hêmanên vê beşê bibî/bikşînî bibî devereka dî pêl tûşa TABê bike û here ser hêmanekî. Ji bo hêmanekî bineqînî pêl tûşa ENTER an jî tûşa SPACE yê bike. Ji bo hêmanekî bibî devereka dî tûşa OK bi kar bîne.',\n\t},\n\t// TODO: Iben: Get description translation\n\t// ru: {\n\t// \tselected: '{{#item}} выбрано.',\n\t// \tdeselected: '{{#item}} снято выделение.',\n\t// \treordered: '{{#item}} перенесен с позиции {{#from}} на {{#to}}.',\n\t// \tmoved: '{{#item}} перенесен с {{#from}} на {{#to}}.',\n\t// \tcancelled: 'перемещение {{#item}} был отменен.',\n\t// \titem: 'элемент',\n\t// \tcontainer: 'список',\n\t// \tdescription: 'TBD',\n\t// },\n};\n","import { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { inject } from '@angular/core';\nimport { NgxWindowService } from '@ibenvandeveire/ngx-core';\nimport { filter, map, Observable, of, take, tap } from 'rxjs';\nimport { v4 as uuid } from 'uuid';\n\nimport { NgxAccessibleDragAndDropMessageRecords } from '../../const';\nimport {\n\tNgxAccessibleDragAndDropMessage,\n\tNgxAccessibleDragAndDropMessageRecord,\n} from '../../types';\nimport { hideElement } from '../../utils';\n\n/**\n * An abstract service that is used to make drag and drop components accessible for assistive technologies\n */\nexport abstract class NgxAccessibleDragAndDropAbstractService {\n\t/**\n\t * The live region service\n\t */\n\tprotected readonly liveRegionService: LiveAnnouncer = inject(LiveAnnouncer);\n\n\t/**\n\t * The window service\n\t */\n\tprotected readonly windowService: NgxWindowService = inject(NgxWindowService);\n\n\t/**\n\t * A method that passes the current language, can either be a string or an Observable\n\t */\n\tabstract get currentLanguage(): string | Observable<string>;\n\n\t/**\n\t * A custom set of messages used for the drag and drop events.\n\t *\n\t *  Please check the readme for more information on what is necessary to make these messages accessible.\n\t */\n\tpublic customMessages: Record<string, NgxAccessibleDragAndDropMessageRecord>;\n\n\t/**\n\t * Sets a message to the live region\n\t *\n\t * @param message - The provided message\n\t */\n\tpublic setMessage(message: NgxAccessibleDragAndDropMessage): Observable<void> {\n\t\t// Iben: If no language was set, we early exit\n\t\tif (!this.currentLanguage) {\n\t\t\tconsole.error(\n\t\t\t\t'NgxAccessibleDragAndDropAbstractService: No language was provided, so no message could be set.'\n\t\t\t);\n\n\t\t\treturn of();\n\t\t}\n\n\t\t// Iben: Take the current language to fetch the message\n\t\treturn (\n\t\t\ttypeof this.currentLanguage === 'string'\n\t\t\t\t? of(this.currentLanguage)\n\t\t\t\t: this.currentLanguage\n\t\t).pipe(\n\t\t\tfilter(Boolean),\n\t\t\ttake(1),\n\t\t\ttap((currentLanguage) => {\n\t\t\t\t// Iben: Fetch the necessary data\n\t\t\t\tconst { type, data } = message;\n\n\t\t\t\tlet result: string = this.messageRecord[currentLanguage][type];\n\n\t\t\t\t// Iben: If no message was found, we early exit and throw an error\n\t\t\t\tif (!result) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t'NgxAccessibleDragAndDropAbstractService: No message for the corresponding drag and drop event was found.'\n\t\t\t\t\t);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Iben: Replace the necessary substrings\n\t\t\t\tif (type === 'selected' || type === 'deselected' || type === 'cancelled') {\n\t\t\t\t\tresult = result.replace(\n\t\t\t\t\t\t'{{#item}}',\n\t\t\t\t\t\tdata.itemLabel || `${this.messageRecord[currentLanguage].item} ${data.item}`\n\t\t\t\t\t);\n\t\t\t\t} else if (type === 'moved') {\n\t\t\t\t\tresult = result\n\t\t\t\t\t\t.replace(\n\t\t\t\t\t\t\t'{{#item}}',\n\t\t\t\t\t\t\tdata.itemLabel ||\n\t\t\t\t\t\t\t\t`${this.messageRecord[currentLanguage].item} ${data.item}`\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.replace(\n\t\t\t\t\t\t\t`{{#from}}`,\n\t\t\t\t\t\t\tdata.fromLabel ||\n\t\t\t\t\t\t\t\t`${this.messageRecord[currentLanguage].container} ${data.from}`\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.replace(\n\t\t\t\t\t\t\t`{{#to}}`,\n\t\t\t\t\t\t\tdata.toLabel ||\n\t\t\t\t\t\t\t\t`${this.messageRecord[currentLanguage].container} ${data.to}`\n\t\t\t\t\t\t);\n\t\t\t\t} else if (type === 'reordered') {\n\t\t\t\t\tresult = result\n\t\t\t\t\t\t.replace(\n\t\t\t\t\t\t\t'{{#item}}',\n\t\t\t\t\t\t\tdata.itemLabel ||\n\t\t\t\t\t\t\t\t`${this.messageRecord[currentLanguage].item} ${data.item}`\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.replace(`{{#from}}`, data.from)\n\t\t\t\t\t\t.replace(`{{#to}}`, data.to);\n\t\t\t\t}\n\n\t\t\t\t// Iben: Update the message in the live region\n\t\t\t\tthis.liveRegionService.announce(result);\n\t\t\t}),\n\t\t\tmap(() => null)\n\t\t);\n\t}\n\n\t/**\n\t * Adds a description to the drag and drop host explaining how the drag and drop functions\n\t *\n\t * @param  parent - The drag and drop host\n\t * @param description - An optional description used to overwrite the default description\n\t */\n\tpublic setDragAndDropDescription(parent: HTMLElement, description?: string): Observable<void> {\n\t\t// Iben: Create the description element and its id\n\t\tconst element: HTMLParagraphElement = document.createElement('p');\n\t\tconst id: string = uuid();\n\n\t\t// Iben: Take the current language to fetch the message\n\t\treturn (\n\t\t\ttypeof this.currentLanguage === 'string'\n\t\t\t\t? of(this.currentLanguage)\n\t\t\t\t: this.currentLanguage\n\t\t).pipe(\n\t\t\ttap((language: string) => {\n\t\t\t\t// Iben: Get the description text\n\t\t\t\tconst text = description || this.messageRecord[language].description;\n\n\t\t\t\t// Iben: If no description was found, we early exit and throw an error\n\t\t\t\tif (!text) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t'NgxAccessibleDragAndDropAbstractService: No description for the drag and drop container was found.'\n\t\t\t\t\t);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Iben: Set the description and id of the element\n\t\t\t\telement.innerText = text;\n\t\t\t\telement.setAttribute('id', id);\n\n\t\t\t\t// Iben: Attach the element to the parent and update the aria id\n\t\t\t\tparent.appendChild(element);\n\t\t\t\tparent.setAttribute('aria-describedby', id);\n\n\t\t\t\t// Iben: Hide element\n\t\t\t\thideElement(element);\n\t\t\t}),\n\t\t\tmap(() => null)\n\t\t);\n\t}\n\n\t/**\n\t * Returns the custom message record or the default when no custom record was provided\n\t */\n\tprivate get messageRecord(): Record<string, NgxAccessibleDragAndDropMessageRecord> {\n\t\treturn this.customMessages || NgxAccessibleDragAndDropMessageRecords;\n\t}\n}\n","import { Directive, input, InputSignal } from '@angular/core';\n\n/**\n * An abstract component provided for the NgxTableComponent, allowing to user to set a default open row state template for all tables\n *\n */\n@Directive()\nexport abstract class NgxTableOpenRowStateTemplateAbstractComponent {\n\t/**\n\t * The current open state the component has to visualize\n\t */\n\tpublic isOpen: InputSignal<boolean> = input<boolean>();\n\n\t/**\n\t * The row data\n\t */\n\tpublic row: InputSignal<any> = input<any>();\n\n\t/**\n\t * The index of the row\n\t */\n\tpublic index: InputSignal<number> = input<number>();\n}\n","import { Directive, input, InputSignal } from '@angular/core';\nimport { FormControl } from '@angular/forms';\n\n/**\n * An abstract component provided for the NgxTableComponent, allowing to user to set a default select template for all tables\n *\n */\n@Directive()\nexport abstract class NgxTableSelectTemplateAbstractComponent {\n\t/**\n\t * The control we wish to pass to the input\n\t */\n\tpublic control: InputSignal<FormControl<any>> = input();\n\n\t/**\n\t * The row that is visualized\n\t */\n\tpublic row: InputSignal<any> = input<any>();\n\n\t/**\n\t * The index of the row\n\t */\n\tpublic index: InputSignal<number> = input<number>();\n}\n","import { Directive, input, InputSignal} from '@angular/core';\n\nimport { NgxTableSortDirection } from '../../enums';\n\n/**\n * An abstract component provided for the NgxTableComponent, allowing to user to set a default sort template for all tables\n *\n */\n@Directive()\nexport abstract class NgxTableSortTemplateAbstractComponent {\n\t/**\n\t * The current sort direction the component has to visualize\n\t */\n\tpublic direction: InputSignal<NgxTableSortDirection> = input<NgxTableSortDirection>();\n}\n","import { Directive, ElementRef, AfterViewInit, inject, input, contentChildren } from '@angular/core';\n\nimport {\n\tNgxAccessibleAbstractDragAndDropItemDirective,\n\tNgxAccessibleDragAndDropAbstractService,\n} from '../../abstracts';\n\nimport { NgxAccessibleDragAndDropContainerDirective } from './drag-and-drop-container.directive';\n\n/**\n * A directive to handle accessible drag and drop flows. This directive is meant to be placed on the host of the drag and drop container(s).\n */\n@Directive({\n\tselector: '[ngxAccessibleDragAndDropHost]',\n\texportAs: 'ngxAccessibleDragAndDropHost',\n\tstandalone: true,\n})\nexport class NgxAccessibleDragAndDropHostDirective implements AfterViewInit {\n\tprivate readonly dragAndDropService = inject(NgxAccessibleDragAndDropAbstractService);\n\treadonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n\t/**\n\t * A list of all the drag and drop items\n\t */\n\tpublic items: Record<string, NgxAccessibleAbstractDragAndDropItemDirective> = {};\n\n\t/**\n\t * A list of all the drag and drop containers\n\t */\n\tpublic readonly containers = contentChildren(NgxAccessibleDragAndDropContainerDirective, { descendants: true });\n\n\t/**\n\t * An optional description describing how the drag and drop works.\n\t */\n\tpublic readonly description = input<string>(undefined, { alias: \"ngxAccessibleDragAndDropHostDescription\" });\n\n\t/**\n\t * Mark a specific drag and drop item as active\n\t *\n\t * @param  id - The id of the drag and drop item\n\t */\n\tpublic markAsActive(id: string): void {\n\t\tthis.items[id].markAsActive();\n\t}\n\n\t/**\n\t * Returns the container based on the provided index\n\t *\n\t * @param index - The index of the container\n\t */\n\tpublic getContainer(index: number): NgxAccessibleDragAndDropContainerDirective {\n\t\treturn this.containers().find((container) => container.index() === index);\n\t}\n\n\tpublic ngAfterViewInit(): void {\n\t\t// Iben: Add the description tag\n\t\tthis.dragAndDropService\n\t\t\t.setDragAndDropDescription(this.elementRef.nativeElement, this.description())\n\t\t\t.subscribe();\n\t}\n\n\tpublic registerDragAndDropItem(item: NgxAccessibleAbstractDragAndDropItemDirective): void {\n\t\tthis.items[item.itemId()] = item;\n\t}\n}\n","import { CdkDropList } from '@angular/cdk/drag-drop';\nimport {\n\tDirective,\n\tElementRef,\n\tHostBinding,\n\tHostListener,\n\tsignal,\n\tWritableSignal,\n\tOnInit,\n\tinject,\n\tinput,\n\tOutputEmitterRef,\n\toutput,\n\tInputSignal,\n\teffect,\n} from '@angular/core';\n\nimport {\n\tNgxAccessibleAbstractDragAndDropItemDirective,\n\tNgxAccessibleDragAndDropAbstractService,\n} from '../../abstracts';\nimport { NgxAccessibleDragAndDropMoveEvent, NgxAccessibleDragAndDropMoveType } from '../../types';\n\nimport { NgxAccessibleDragAndDropContainerDirective } from './drag-and-drop-container.directive';\nimport { NgxAccessibleDragAndDropHostDirective } from './drag-and-drop-host.directive';\n\n/**\n * A directive to handle accessible drag and drop flows. This directive is meant to be placed on the item(s) of the drag and drop container(s).\n */\n@Directive({\n\tselector: '[ngxAccessibleDragAndDropItem]',\n\texportAs: 'ngxAccessibleDragAndDropItem',\n\tstandalone: true,\n\thost: {\n\t\t'[attr.tabIndex]': 'tabIndex()',\n\t},\n})\nexport class NgxAccessibleDragAndDropItemDirective\n\textends NgxAccessibleAbstractDragAndDropItemDirective\n\timplements OnInit\n{\n\tprivate readonly dragAndDropService = inject(NgxAccessibleDragAndDropAbstractService);\n\tprivate readonly dropList = inject(CdkDropList);\n\tprivate readonly dropContainer = inject(NgxAccessibleDragAndDropContainerDirective);\n\tprivate readonly dropHost = inject(NgxAccessibleDragAndDropHostDirective);\n\tpublic override readonly elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n\n\t/**\n\t * The tab index of the item\n\t */\n\tpublic tabIndex: WritableSignal<number> = signal<number>(0);\n\n\t/**\n\t * The selected state of the item\n\t */\n\t@HostBinding('attr.aria-selected') public isSelected: boolean = false;\n\n\t/**\n\t * Handle the selected state when pressing enter\n\t */\n\t@HostListener('keydown.Enter') public onEnter(): void {\n\t\tthis.handlePress();\n\t}\n\n\t/**\n\t * Handle the selected state when pressing space\n\t */\n\t@HostListener('keydown.Space') public onSpace(): void {\n\t\tthis.handlePress();\n\t}\n\n\t/**\n\t * Handle the ArrowUp Press\n\t */\n\t@HostListener('keydown.ArrowUp', ['$event']) public onArrowUp(event: Event): void {\n\t\tthis.moveItem('up', event as KeyboardEvent);\n\t}\n\n\t/**\n\t * Handle the ArrowDown Press\n\t */\n  @HostListener( 'keydown.ArrowDown',[ '$event' ] ) public onArrowDown ( event: Event ): void {\n\t\tthis.moveItem('down', event as KeyboardEvent);\n\t}\n\n\t/**\n\t * Handle the ArrowLeft Press\n\t */\n\t@HostListener('keydown.ArrowLeft', ['$event']) public onArrowLeft(event: Event): void {\n\t\tthis.moveItem('left', event as KeyboardEvent);\n\t}\n\n\t/**\n\t * Handle the ArrowRight Press\n\t */\n\t@HostListener('keydown.ArrowRight', ['$event']) public onArrowRight(event: Event): void {\n\t\tthis.moveItem('right', event as KeyboardEvent);\n\t}\n\n\t/**\n\t * The index of the draggable item\n\t */\n\n\tpublic readonly itemIndex = input.required<number>({\n\t\talias: 'ngxAccessibleDragAndDropItemIndex',\n\t});\n\n\t/**\n\t * An unique id of the draggable item\n\t */\n\n\tpublic readonly itemId: InputSignal<string> = input.required<string>({\n\t\talias: 'ngxAccessibleDragAndDropItemId',\n\t});\n\n\t/**\n\t * An optional label for the draggable item\n\t */\n\n\tpublic readonly label = input<string>(undefined, { alias: 'ngxAccessibleDragAndDropLabel' });\n\n\t/**\n\t * Whether the draggable item  is disabled\n\t */\n\tpublic disabled: InputSignal<boolean> = input(false, {\n\t\talias: 'ngxAccessibleDragAndDropDisabled',\n\t});\n\n\t/**\n\t * Emits when the item has been moved through keyboard input\n\t */\n\tpublic ngxAccessibleDragAndDropItemMove: OutputEmitterRef<NgxAccessibleDragAndDropMoveEvent> =\n\t\toutput<NgxAccessibleDragAndDropMoveEvent>();\n\n\tconstructor() {\n\t\tsuper();\n\n\t\teffect(() => {\n\t\t\tthis.tabIndex.set(this.disabled() ? -1 : 0);\n\t\t});\n\t}\n\n\t/**\n\t *  Marks the item as focussed and selected\n\t */\n\tpublic markAsActive(): void {\n\t\tthis.focus();\n\t\tthis.isSelected = true;\n\t}\n\n\t/**\n\t * Deselects the current item if it's selected\n\t *\n\t */\n\tpublic override onBlur(): void {\n\t\t// Iben: Early exit if the item is not selected\n\t\tif (!this.isSelected) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Iben: Set the item as deselected\n\t\tthis.isSelected = false;\n\n\t\t// Iben: Announce the item as deselected\n\t\tthis.dragAndDropService\n\t\t\t.setMessage({\n\t\t\t\ttype: 'deselected',\n\t\t\t\tdata: { item: `${this.itemIndex()}`, itemLabel: this.label() || undefined },\n\t\t\t})\n\t\t\t.subscribe();\n\t}\n\n\t/**\n\t * Registers the item with the drop host\n\t */\n\tpublic ngOnInit(): void {\n\t\tthis.dropHost.registerDragAndDropItem(this);\n\t}\n\n\t/**\n\t * Handles the pressing of a button in the drag and drop host\n\t */\n\tprivate handlePress(): void {\n\t\tthis.handleWhenFocussed(() => {\n\t\t\tthis.isSelected = !this.isSelected;\n\t\t\tthis.dragAndDropService\n\t\t\t\t.setMessage({\n\t\t\t\t\ttype: this.isSelected ? 'selected' : 'deselected',\n\t\t\t\t\tdata: { item: `${this.itemIndex()}`, itemLabel: this.label() || undefined },\n\t\t\t\t})\n\t\t\t\t.subscribe();\n\t\t});\n\t}\n\n\t/**\n\t * Moves the item in the correct direction\n\t *\n\t * @param key - The pressed key\n\t * @param event - The keyboard event\n\t */\n  private moveItem ( key: 'up' | 'down' | 'left' | 'right',event: KeyboardEvent ): void {\n\t\tif (!this.disabled() && this.hasFocus && this.isSelected) {\n\t\t\t// Iben: Prevent the default action\n\t\t\tevent.preventDefault();\n      event.stopPropagation();\n\n\t\t\t// Iben: Set up the needed items\n\t\t\tlet newIndex: number;\n\t\t\tlet newContainer: number;\n\n\t\t\tconst currentContainer = this.dropContainer.index();\n\t\t\tconst isHorizontal = this.dropList.orientation === 'horizontal';\n\t\t\tconst isUpOrDown: boolean = key === 'up' || key === 'down';\n\n\t\t\t// Iben: In this case we're changing the current container\n\t\t\tif ((isUpOrDown && isHorizontal) || (!isUpOrDown && !isHorizontal)) {\n\t\t\t\tnewIndex = this.itemIndex();\n\t\t\t\tnewContainer =\n\t\t\t\t\tkey === 'up' || key === 'left' ? currentContainer - 1 : currentContainer + 1;\n\n\t\t\t\tthis.handleItemMove(newIndex, newContainer, 'moved');\n\t\t\t}\n\n\t\t\t// Iben: In this case, we're changing the order of the items\n\t\t\tif ((!isUpOrDown && isHorizontal) || (isUpOrDown && !isHorizontal)) {\n\t\t\t\tnewIndex =\n\t\t\t\t\tkey === 'up' || key === 'left' ? this.itemIndex() - 1 : this.itemIndex() + 1;\n\t\t\t\tnewContainer = currentContainer;\n\t\t\t\tthis.handleItemMove(newIndex, newContainer, 'reordered');\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Moves an item based on the provided container and index, and sends a message to the live region\n\t *\n\t * @private\n\t * @param newIndex - The new index of the item\n\t * @param newContainer - The container we wish to move the item to\n\t * @param  type - The type of movement we perform\n\t */\n\tprivate handleItemMove(\n\t\tnewIndex: number,\n\t\tnewContainer: number,\n\t\ttype: NgxAccessibleDragAndDropMoveType\n\t): void {\n\t\t// Iben: Check if the newContainer exits, if not early exit\n\t\tconst targetContainer = this.dropHost.getContainer(newContainer);\n\n\t\tif (!targetContainer) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Iben: Emit the move event\n\t\tconst index = this.dropContainer.index();\n\t\tconst itemIndex = this.itemIndex();\n\t\tthis.ngxAccessibleDragAndDropItemMove.emit({\n\t\t\tpreviousIndex: itemIndex,\n\t\t\tnewIndex,\n\t\t\tpreviousContainer: index,\n\t\t\tnewContainer,\n\t\t});\n\n\t\t// Iben: Set the message in the live region\n\t\tthis.dragAndDropService\n\t\t\t.setMessage({\n\t\t\t\ttype: type,\n\t\t\t\tdata: {\n\t\t\t\t\titem: this.itemId(),\n\t\t\t\t\titemLabel: this.label() || undefined,\n\t\t\t\t\tfrom: type === 'reordered' ? `${itemIndex + 1}` : `${index + 1}`,\n\t\t\t\t\tto: type === 'reordered' ? `${newIndex + 1}` : `${newContainer + 1}`,\n\t\t\t\t\tfromLabel: this.dropContainer.label() || undefined,\n\t\t\t\t\ttoLabel: targetContainer.label() || undefined,\n\t\t\t\t},\n\t\t\t})\n\t\t\t.subscribe();\n\n\t\t// Iben: Set the focus and select the new item with the same id, using a setTimeOut so the correct item is rendered first\n\t\tsetTimeout(() => {\n\t\t\tthis.dropHost.markAsActive(this.itemId());\n\t\t});\n\t}\n}\n","import { NgxAccessibleDragAndDropContainerDirective } from './drag-and-drop-container.directive';\nimport { NgxAccessibleDragAndDropHostDirective } from './drag-and-drop-host.directive';\nimport { NgxAccessibleDragAndDropItemDirective } from './drag-and-drop-item.directive';\n\n/**\n * All the needed directives for the accessible drag and drop implementation\n */\nexport const NgxAccessibleDragAndDrop = [\n\tNgxAccessibleDragAndDropItemDirective,\n\tNgxAccessibleDragAndDropContainerDirective,\n\tNgxAccessibleDragAndDropHostDirective,\n] as const;\n","import { Directive, HostListener } from '@angular/core';\n\n/**\n * An abstract directive used as a base to handle focussed base actions\n */\n@Directive({\n\tstandalone: true,\n})\nexport abstract class NgxHasFocusDirective {\n\t/**\n\t * Whether the current element is focussed\n\t */\n\tprotected hasFocus: boolean = false;\n\n\t/**\n\t * Set the hasFocus flag\n\t */\n\t@HostListener('focus') setFocus() {\n\t\tthis.hasFocus = true;\n\t}\n\n\t/**\n\t * Remove the hasFocus flag\n\t */\n\t@HostListener('blur') removeFocus() {\n\t\tthis.hasFocus = false;\n\t}\n\n\t/**\n\t * Execute an action when the element has focussed\n\t *\n\t * @param action - The provided action\n\t */\n\tpublic handleWhenFocussed(action: () => void): void {\n\t\tif (this.hasFocus) {\n\t\t\taction();\n\t\t}\n\t}\n\n\t/**\n   * Returns when the item has been focussed on\n   */\n  public isFocussedOn(): boolean {\n\t\treturn this.hasFocus;\n\t}\n}\n","import { Directive, HostBinding, OnChanges, input } from '@angular/core';\n\nimport { NgxTreeGridRowDirective } from './tree-grid-row.directive';\nimport { NgxTreeGridCellDirective } from './tree-grid.cell.directive';\n\n/**\n * An overarching directive to handle navigation according to the WCAG treegrid pattern\n *\n * See https://www.w3.org/WAI/ARIA/apg/patterns/treegrid/\n */\n@Directive({\n\tselector: '[ngxTreeGrid]',\n\tstandalone: true,\n})\nexport class NgxTreeGridDirective implements OnChanges {\n\t/**\n\t * An array of all rows in the treegrid\n\t */\n\tprivate rows: NgxTreeGridRowDirective[] = [];\n\n\t@HostBinding('attr.role') role: 'table' | 'treegrid' = 'table';\n\n\t/**\n\t * Whether the current item is a treegrid\n\t */\n\tpublic readonly ngxTreeGrid = input.required<boolean>();\n\n\t/**\n\t * Whether the treegrid has expandableRows\n\t */\n\tpublic readonly ngxTreeGridExpandable = input.required<boolean>();\n\n\t/**\n\t * Registers a row to the rows array\n\t *\n\t * @param row - The provided row\n\t */\n\tpublic registerRow(row: NgxTreeGridRowDirective): void {\n\t\tthis.rows.push(row);\n\t}\n\n\t/**\n\t * Removes a registered row from the grid\n\t *\n\t * @param index - The index of the provided row\n\t */\n\tpublic removeRow(index: number): void {\n\t\tthis.rows = this.rows.slice(0, index).concat(this.rows.slice(index + 1));\n\t}\n\n\t/**\n\t * Returns a row from the grid\n\t *\n\t * @param index - The index of the row\n\t */\n\tpublic getRow(index: number): NgxTreeGridRowDirective {\n\t\t// Iben: Early exit if the row is not found\n\t\tif (!this.ngxTreeGrid()) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Iben: Return the row\n\t\treturn this.rows[index];\n\t}\n\n\t/**\n\t * Returns the first row of the grid\n\t */\n\tpublic getFirstRow(): NgxTreeGridRowDirective {\n\t\treturn this.getRow(0);\n\t}\n\n\t/**\n\t * Returns the last row of the grid\n\t */\n\tpublic getLastRow(): NgxTreeGridRowDirective {\n\t\treturn this.getRow(this.rows.length - 1);\n\t}\n\n\t/**\n\t * Moves the row focus to either the top or the bottom row of the grid\n\t *\n\t * @param direction - Whether we want to go to the top or the bottom of the grid\n\t */\n\tpublic moveTo(direction: 'top' | 'bottom') {\n\t\tthis.rows[direction === 'top' ? 0 : this.rows.length - 1]?.focus();\n\t}\n\n\t/**\n\t * Registers a a cell to a row of the grid\n\t *\n\t * @param cell - The provided cell\n\t */\n\tpublic registerCell(index: number, cell: NgxTreeGridCellDirective) {\n\t\tthis.getRow(index)?.registerCell(cell);\n\t}\n\n\tngOnChanges() {\n\t\t// Iben: Set the role based on the tree grid\n\t\tthis.role = this.ngxTreeGrid() ? 'treegrid' : 'table';\n\t}\n}\n","import {\n\tDirective,\n\tElementRef,\n\tHostListener,\n\tOnDestroy,\n\tOutputEmitterRef,\n\tinject,\n\tinput,\n\toutput,\n} from '@angular/core';\n\nimport { NgxTreeGridCellTarget, NgxTreeGridRowTarget } from '../../types';\nimport { NgxHasFocusDirective } from '../has-focus-action';\n\nimport { NgxTreeGridCellDirective } from './tree-grid.cell.directive';\nimport { NgxTreeGridDirective } from './tree-grid.directive';\n\n/**\n * A row directive to handle navigation according to the WCAG treegrid pattern\n *\n * See https://www.w3.org/WAI/ARIA/apg/patterns/treegrid/\n */\n@Directive({\n\tselector: '[ngxTreeGridRow]',\n\tstandalone: true,\n\thost: {\n\t\t'[attr.aria-expanded]': 'ngxTreeGridRowExpanded()',\n\t},\n})\nexport class NgxTreeGridRowDirective extends NgxHasFocusDirective implements OnDestroy {\n\tprivate readonly parent = inject(NgxTreeGridDirective);\n\tprivate readonly elementRef = inject(ElementRef);\n\n\t/**\n\t * An array of all cells in the row\n\t */\n\tprivate readonly cells: NgxTreeGridCellDirective[] = [];\n\n\t/**\n\t * Sets focus on to the previous row\n\t */\n\t@HostListener('keydown.ArrowUp') public moveUp(): void {\n\t\tthis.handleWhenFocussed(() => {\n\t\t\tthis.parent.getRow(this.ngxTreeGridRow() - 1)?.focus();\n\t\t});\n\t}\n\n\t/**\n\t * Sets focus to the next row\n\t */\n\t@HostListener('keydown.ArrowDown') public moveDown(): void {\n\t\tthis.handleWhenFocussed(() => {\n\t\t\tthis.parent.getRow(this.ngxTreeGridRow() + 1)?.focus();\n\t\t});\n\t}\n\n\t/**\n\t * Sets the focus on the first cell in the row or expands the row when collapsed\n\t */\n\t@HostListener('keydown.ArrowRight') public arrowRight(): void {\n\t\tthis.handleWhenFocussed(() => {\n\t\t\t// Iben: Only when the row is not expanded we can move to the next cell, as by WCAG design\n\t\t\tif (this.parent.ngxTreeGridExpandable() && !this.ngxTreeGridRowExpanded()) {\n\t\t\t\tthis.ngxTreeGridRowExpandRow.emit(true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Iben: Focus on the first cell\n\t\t\tthis.cells[0]?.focus();\n\t\t});\n\t}\n\n\t/**\n\t * Expand the row when closed\n\t */\n\t@HostListener('keydown.ArrowLeft') public arrowLeft(): void {\n\t\tthis.handleWhenFocussed(() => {\n\t\t\tthis.ngxTreeGridRowExpandRow.emit(false);\n\t\t});\n\t}\n\n\t/**\n\t * Sets focus on the first row of the grid\n\t */\n\t@HostListener('keydown.PageUp') public moveToTopPageUp(): void {\n\t\tthis.moveToTop();\n\t}\n\n\t/**\n\t * Sets focus on the first row of the grid\n\t */\n\t@HostListener('keydown.Home') public moveToTopHome(): void {\n\t\tthis.moveToTop();\n\t}\n\n\t/**\n\t * Sets focus on the first row of the grid\n\t */\n\t@HostListener('keydown.control.Home') public moveToTopControlHome(): void {\n\t\tthis.moveToTop();\n\t}\n\n\t/**\n\t * Sets focus on the last row of the grid\n\t */\n\t@HostListener('keydown.PageDown') public moveToBottomPageDown(): void {\n\t\tthis.moveToBottom();\n\t}\n\n\t/**\n\t * Sets focus on the last row of the grid\n\t */\n\t@HostListener('keydown.End') public moveToBottomEnd(): void {\n\t\tthis.moveToBottom();\n\t}\n\n\t/**\n\t * Sets focus on the last row of the grid\n\t */\n\t@HostListener('keydown.control.End') public moveToBottomControlEnd(): void {\n\t\tthis.moveToBottom();\n\t}\n\n\t/**\n\t * Emits a select event to select a row\n\t */\n\t@HostListener('keydown.shift.space') public selectRowShift(): void {\n\t\tthis.handleWhenFocussed(() => {\n\t\t\tthis.selectRow();\n\t\t});\n\t}\n\n\t/**\n\t * Emits a select event to select a row\n\t */\n\t@HostListener('keydown.control.space') public selectRowControl(): void {\n\t\tthis.handleWhenFocussed(() => {\n\t\t\tthis.selectRow();\n\t\t});\n\t}\n\n\t/**\n\t * Emits a select event to select a row below the current row and move focus to that row\n\t */\n\t@HostListener('keydown.shift.ArrowDown') public selectNextRow(): void {\n\t\tthis.handleWhenFocussed(() => {\n\t\t\tconst ngxTreeGridRow = this.ngxTreeGridRow();\n\t\t\tthis.parent.getRow(ngxTreeGridRow + 1)?.selectRow();\n\t\t\tthis.parent.getRow(ngxTreeGridRow + 1)?.focus();\n\t\t});\n\t}\n\n\t/**\n\t * Emits a select event to select a row above the current row and move focus to that row\n\t */\n\t@HostListener('keydown.shift.ArrowUp') public selectPreviousRow(): void {\n\t\tthis.handleWhenFocussed(() => {\n\t\t\tconst ngxTreeGridRow = this.ngxTreeGridRow();\n\t\t\tthis.parent.getRow(ngxTreeGridRow - 1)?.selectRow();\n\t\t\tthis.parent.getRow(ngxTreeGridRow - 1)?.focus();\n\t\t});\n\t}\n\n\t/**\n\t * Marks the row as expanded\n\t */\n\t/**\n\t * Marks the row as expanded\n\t */\n\tpublic readonly ngxTreeGridRowExpanded = input<boolean>(false);\n\n\t/**\n\t * The index of the row\n\t */\n\tpublic readonly ngxTreeGridRow = input.required<number>();\n\n\t/**\n\t * Whether the row is selectable\n\t */\n\tpublic readonly ngxTreeGridRowSelectable = input<boolean>(false);\n\n\t/**\n\t * Emits a select row event\n\t */\n\tpublic ngxTreeGridRowSelectRow: OutputEmitterRef<void> = output<void>();\n\n\t/**\n\t * Emits an expand row event\n\t */\n\tpublic ngxTreeGridRowExpandRow: OutputEmitterRef<boolean> = output<boolean>();\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.parent.registerRow(this);\n\t}\n\n\t/**\n\t * Registers a cell to the row\n\t *\n\t * @param  cell - The provided cell\n\t */\n\tpublic registerCell(cell: NgxTreeGridCellDirective): void {\n\t\tthis.cells.push(cell);\n\t}\n\n\t/**\n\t * Focus on the row\n\t */\n\tpublic focus(): void {\n\t\tthis.elementRef.nativeElement.focus();\n\t}\n\n\t/**\n\t * Get a cell from either the current row, or one of the other rows in the grid\n\t *\n\t * @param cell - The cell we wish to target\n\t * @param row - The row we wish to target\n\t */\n\tpublic getCell(\n\t\tcell: NgxTreeGridCellTarget,\n\t\trow: NgxTreeGridRowTarget\n\t): NgxTreeGridCellDirective {\n\t\t// Iben: Get the index of the cell\n\t\tconst index =\n\t\t\ttypeof cell === 'string' ? (cell === 'first' ? 0 : this.cells.length - 1) : cell;\n\n\t\t// Iben: If the cell is in the current row, we return the cell\n\t\tif (row === 'current') {\n\t\t\treturn this.cells[index];\n\t\t}\n\n\t\t// Iben: If the row is either the above or below one, we get the cell from those rows\n\t\tif (row === 'above' || row === 'below') {\n\t\t\treturn this.parent\n\t\t\t\t.getRow(row === 'below' ? this.ngxTreeGridRow() + 1 : this.ngxTreeGridRow() - 1)\n\t\t\t\t?.getCell(index, 'current');\n\t\t}\n\n\t\t// Iben: If the row is the first or last, we get those rows\n\t\treturn row === 'first'\n\t\t\t? this.parent.getFirstRow()?.getCell(index, 'current')\n\t\t\t: this.parent.getLastRow()?.getCell(index, 'current');\n\t}\n\n\t/**\n\t * Emit the row event only if the row is selectable\n\t */\n\tpublic selectRow(): void {\n\t\tif (this.ngxTreeGridRowSelectable()) {\n\t\t\tthis.ngxTreeGridRowSelectRow.emit();\n\t\t}\n\t}\n\n\t/**\n\t * Move to the top of the grid\n\t */\n\tpublic moveToTop(): void {\n\t\tthis.handleWhenFocussed(() => {\n\t\t\tthis.parent.moveTo('top');\n\t\t});\n\t}\n\n\t/**\n\t * Move to the bottom of the grid\n\t *\n\t * @memberof NgxTreeGridRowDirective\n\t */\n\tpublic moveToBottom(): void {\n\t\tthis.handleWhenFocussed(() => {\n\t\t\tthis.parent.moveTo('bottom');\n\t\t});\n\t}\n\n\tpublic ngOnDestroy(): void {\n\t\t// Iben: Remove the row from the grid\n\t\tthis.parent.removeRow(this.ngxTreeGridRow());\n\t}\n}\n","import { Directive, ElementRef, HostListener, AfterViewInit, inject, input } from '@angular/core';\n\nimport { NgxTreeGridCellTarget, NgxTreeGridRowTarget } from '../../types';\nimport { NgxHasFocusDirective } from '../has-focus-action';\n\nimport { NgxTreeGridRowDirective } from './tree-grid-row.directive';\nimport { NgxTreeGridDirective } from './tree-grid.directive';\n\n/**\n * A cell directive to handle navigation according to the WCAG treegrid pattern\n *\n * See https://www.w3.org/WAI/ARIA/apg/patterns/treegrid/\n */\n@Directive({\n\tselector: '[ngxTreeGridCell]',\n\tstandalone: true,\n\thost: {\n\t\t// Iben: Marks the cell as focusable, but only by setting its focus programmatically, not by the tab key\n\t\t'[attr.tabIndex]': '-1',\n\t},\n})\nexport class NgxTreeGridCellDirective extends NgxHasFocusDirective implements AfterViewInit {\n\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\tprivate readonly parent: NgxTreeGridDirective = inject(NgxTreeGridDirective, {\n\t\toptional: true,\n\t})!;\n\tprivate readonly elementRef = inject(ElementRef);\n\n\t/**\n\t * The parent row of the cell\n\t */\n\tprivate row: NgxTreeGridRowDirective;\n\n\t/**\n\t * Set focus on the previous cell to the left\n\t */\n\t@HostListener('keydown.ArrowLeft', ['$event']) moveLeft(event: Event): void {\n\t\tthis.handleWhenFocussed(() => {\n\t\t\t// Iben: Stop the event from bubbling so that the row does not open when navigating through the row (see arrowLeft in the NgxTreeGridRowDirective )\n\t\t\tconst ngxTreeGridCell = this.ngxTreeGridCell();\n   if (ngxTreeGridCell === 0) {\n\t\t\t\tevent.stopPropagation();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.moveToCell(ngxTreeGridCell - 1, 'current');\n\t\t});\n\t}\n\n\t/**\n\t * Set focus on the next cell to the right\n\t */\n\t@HostListener('keydown.ArrowRight') moveRight(): void {\n\t\tthis.moveToCell(this.ngxTreeGridCell() + 1, 'current');\n\t}\n\n\t/**\n\t * Set focus on the cell above\n\t */\n\t@HostListener('keydown.ArrowUp') moveUp(): void {\n\t\tthis.moveToCell(this.ngxTreeGridCell(), 'above');\n\t}\n\n\t/**\n\t * Set focus on the cell below\n\t */\n\t@HostListener('keydown.ArrowDown') moveDown(): void {\n\t\tthis.moveToCell(this.ngxTreeGridCell(), 'below');\n\t}\n\n\t/**\n\t * Set focus on the first cell of the grid\n\t */\n\t@HostListener('keydown.PageUp') moveToFirstCellOfGrid(): void {\n\t\tthis.moveToCell('first', 'first');\n\t}\n\n\t/**\n\t * Set focus on the first cell of the row\n\t */\n\t@HostListener('keydown.Home') moveToFirstOfRow(): void {\n\t\tthis.moveToCell('first', 'current');\n\t}\n\n\t/**\n\t * Set focus on the first cell of the same column of the grid\n\t */\n\t@HostListener('keydown.control.Home') moveToFirstColumnOfGrid(): void {\n\t\tthis.moveToCell(this.ngxTreeGridCell(), 'first');\n\t}\n\n\t/**\n\t * Set focus on the last cell of the grid\n\t */\n\t@HostListener('keydown.PageDown') moveToLastCellOfGrid(): void {\n\t\tthis.moveToCell('last', 'last');\n\t}\n\n\t/**\n\t * Set focus on the last cell of the row\n\t */\n\t@HostListener('keydown.End') moveToBottomEnd(): void {\n\t\tthis.moveToCell('last', 'current');\n\t}\n\n\t/**\n\t * Set focus on the last cell of the same column of the grid\n\t */\n\t@HostListener('keydown.control.End') moveToBottomControlEnd(): void {\n\t\tthis.moveToCell(this.ngxTreeGridCell(), 'last');\n\t}\n\n\t@HostListener('focusin') onFocusIn() {\n\t\tthis.hasFocus = true;\n\t}\n\n\t@HostListener('focusout') onFocusOut() {\n\t\tthis.hasFocus = false;\n\t}\n\n\t/**\n\t * The index of the cell in the row\n\t */\n\tpublic readonly ngxTreeGridCell = input.required<number>();\n\n\t/**\n\t * The index of the row\n\t */\n\tpublic readonly ngxTreeGridCellRow = input.required<number>();\n\n\t/**\n\t * Sets focus on the cell or on the first focusable item in the cell\n\t */\n\tpublic focus(): void {\n\t\t// Iben: Check if any of the child elements are focusable\n\t\tconst focusableElement = this.findFocusableElement();\n\n\t\t// Iben: If no element was focusable, focus on the current element\n\t\tif (!focusableElement) {\n\t\t\tthis.elementRef.nativeElement.focus();\n\t\t} else {\n\t\t\tfocusableElement.focus();\n\t\t}\n\t}\n\n\t/**\n\t * Moves focus to a provided cell in a provided row\n\t *\n\t * @private\n\t * @param cell - The cell we wish to put focus on\n\t * @param row - The row in which the cell is\n\t */\n\tprivate moveToCell(cell: NgxTreeGridCellTarget, row: NgxTreeGridRowTarget): void {\n\t\tthis.handleWhenFocussed(() => {\n\t\t\tthis.row.getCell(cell, row)?.focus();\n\t\t});\n\t}\n\n\t/**\n\t * Searches for a focusable element in the cell\n\t */\n\tprivate findFocusableElement(): HTMLElement | undefined {\n\t\t// Iben: Standard CSS selector to find naturally focusable elements (links, buttons, inputs, textareas, selects) \n\t\t// that are not disabled, as well as any elements with a custom tab index other than -1.\n\t\tconst selector = 'a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\t\t\n\t\t// Iben: Retrieve all matching interactive elements in the cell's DOM subtree\n\t\tconst elements = this.elementRef.nativeElement.querySelectorAll(selector);\n\t\t\n\t\t// Iben: Iterate over the found elements to locate the first visible and rendered one\n\t\tfor (const el of Array.from(elements)) {\n\t\t\tconst htmlEl = el as HTMLElement;\n\t\t\t\n\t\t\t// Iben: Check that the element has layout dimensions (is visible and rendered) before returning it as focusable\n\t\t\tif (htmlEl.offsetWidth > 0 || htmlEl.offsetHeight > 0 || htmlEl.getClientRects().length > 0) {\n\t\t\t\treturn htmlEl;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn undefined;\n\t}\n\n\tpublic ngAfterViewInit(): void {\n\t\t// Iben: We register the cell and the row through the parent, as the td elements are not rendered within the row initially.\n\t\tconst ngxTreeGridCellRow = this.ngxTreeGridCellRow();\n  this.parent?.registerCell(ngxTreeGridCellRow, this);\n\t\tthis.row = this.parent.getRow(ngxTreeGridCellRow);\n\t}\n}\n","import { NgxTreeGridRowDirective } from './tree-grid-row.directive';\nimport { NgxTreeGridCellDirective } from './tree-grid.cell.directive';\nimport { NgxTreeGridDirective } from './tree-grid.directive';\n\nexport const NgxTreeGrid = [\n\tNgxTreeGridDirective,\n\tNgxTreeGridRowDirective,\n\tNgxTreeGridCellDirective,\n];\n","import {\n\tComponentRef,\n\tcomputed,\n\tDirective,\n\teffect,\n\tElementRef,\n\tinject,\n\tinput,\n\tInputSignal,\n\tOnInit,\n\tRenderer2,\n\tSignal,\n\tViewContainerRef,\n} from '@angular/core';\n\nimport { NgxDisplayContentComponent } from '../../abstracts';\nimport { NgxButtonConfigurationToken } from '../../tokens';\nimport {\n\tNgxButtonConfiguration,\n\tNgxButtonDisplayType,\n\tNgxButtonIconPosition,\n\tNgxButtonPriority,\n\tNgxButtonType,\n\tNgxButtonWidth,\n} from '../../types';\n\n/**\n * A directive that adds the classic button states, priority, loading and icon handling\n */\n@Directive({\n\tselector: '[ngxButton]',\n\thost: {\n\t\t'[attr.class]': 'buttonClasses()',\n\t\t'[attr.aria-busy]': 'loading() ? \"true\" : null',\n\t\t'[attr.aria-disabled]': 'loading() ? \"true\" : null',\n\t\t'[attr.disabled]': 'loading() ? \"true\" : null',\n\t},\n})\nexport class NgxButtonDirective implements OnInit {\n\t/**\n\t * An instance of the viewContainer\n\t */\n\tprotected readonly viewContainer: ViewContainerRef = inject(ViewContainerRef);\n\n\t/**\n\t * An instance of the elementRef\n\t */\n\tprotected readonly elementRef: ElementRef<HTMLButtonElement> = inject(\n\t\tElementRef<HTMLButtonElement>\n\t);\n\n\t/**\n\t * An instance of the NativeElement\n\t */\n\tprotected readonly nativeElement = this.elementRef.nativeElement;\n\n\t/**\n\t * An instance of the renderer\n\t */\n\tprotected readonly renderer: Renderer2 = inject(Renderer2);\n\n\t/**\n\t * An optional set of configuration\n\t */\n\tprotected readonly configuration: NgxButtonConfiguration = inject(NgxButtonConfigurationToken, {\n\t\toptional: true,\n\t});\n\n\t/**\n\t * The icon element in case we did not configure an icon component\n\t */\n\tprotected iconElement: HTMLElement;\n\n\t/**\n\t * The icon component in case we did configure an icon component\n\t */\n\tprotected iconComponent: ComponentRef<NgxDisplayContentComponent>;\n\n\tprotected loadingComponent: ComponentRef<NgxDisplayContentComponent>;\n\n\t/**\n\t * The classes of the button generated by its configuration\n\t */\n\tprotected buttonClasses: Signal<string> = computed(() => {\n\t\t// Iben: Inserts the icon\n\t\tthis.handleIcon();\n\n\t\t// Iben: Inserts the loading component when needed\n\t\tthis.handleLoading();\n\n\t\treturn `\n    ngx-button\n    ngx-button-${this.buttonType()}\n    ngx-button-${this.priority()}\n    ngx-button-${this.buttonWidth()}\n    ${this.display() !== 'both' ? `ngx-button-${this.display()}-only ` : ''}\n    ${this.loading() ? 'ngx-button-loading ' : ''}\n    ${this.icon() ? `ngx-button-icon-${this.iconPosition()}` : ''}`;\n\t});\n\n\t/**\n\t * Whether the button is currently loading\n\t */\n\tpublic loading: InputSignal<boolean> = input(false);\n\n\t/**\n\t * Optional loading data\n\t */\n\tpublic loadingData: InputSignal<any> = input();\n\n\t/**\n\t * Whether the button is a regular, outline, text or fab button. By default, this is regular.\n\t */\n\tpublic buttonType: InputSignal<NgxButtonType> = input('regular');\n\n\t/**\n\t * Whether the button has primary, secondary, tertiary or danger priority. By default, this is primary.\n\t */\n\tpublic priority: InputSignal<NgxButtonPriority> = input('primary');\n\n\t/**\n\t * Whether the button has to show only the icon, the text or both. By default, this is both.\n\t */\n\tpublic display: InputSignal<NgxButtonDisplayType> = input('both');\n\n\t/**\n\t * The width of the button, either full or fit. By default, this is fit.\n\t */\n\tpublic buttonWidth: InputSignal<NgxButtonWidth> = input('fit');\n\n\t/**\n\t * An optional icon we wish to display alongside the button text\n\t */\n\tpublic icon: InputSignal<any> = input();\n\n\t/**\n\t * The position of the icon when provided, by default this is Left unless overwritten in the configuration\n\t */\n\tpublic iconPosition: InputSignal<NgxButtonIconPosition> = input(\n\t\tthis.configuration?.iconPosition || 'left'\n\t);\n\n\tconstructor() {\n\t\t// Iben: Verify that icon-only buttons have an accessible name for screen readers\n\t\teffect(() => {\n\t\t\tif (this.display() === 'icon') {\n\t\t\t\tconst hasAriaLabel =\n\t\t\t\t\tthis.nativeElement.hasAttribute('aria-label') ||\n\t\t\t\t\tthis.nativeElement.hasAttribute('aria-labelledby');\n\n\t\t\t\tif (!hasAriaLabel) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t'NgxLayout: NgxButtonDirective is used in icon-only mode, but no accessible name (aria-label or aria-labelledby) was found on the element. Screen readers will not be able to announce this button.'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tngOnInit() {\n\t\t// Iben: Wrap the base text in an element\n\t\tconst wrapperElement: HTMLSpanElement = this.renderer.createElement(\n\t\t\tthis.configuration?.labelWrapper || 'span'\n\t\t);\n\n\t\t// Iben: Append all the child nodes\n\t\tArray.from(this.nativeElement.childNodes).forEach((node) => {\n\t\t\tthis.renderer.appendChild(wrapperElement, node);\n\t\t});\n\n\t\tthis.renderer.setAttribute(wrapperElement, 'class', 'ngx-button-label');\n\n\t\t// Iben: Remove all the nodes\n\t\tthis.nativeElement.childNodes.forEach((node) => {\n\t\t\tthis.renderer.removeChild(wrapperElement, node);\n\t\t});\n\n\t\t// Iben: Remove the current innerHtml and replace it with a span element\n\t\tthis.renderer.appendChild(this.nativeElement, wrapperElement);\n\t}\n\n\t/**\n\t * Adds or removes the loading component\n\t */\n\tprivate handleLoading(): void {\n\t\t// Iben: If the loading state is on and a loading component is provided we add it\n\t\tif (this.loading() && this.configuration?.loading) {\n\t\t\t// Iben: Create the loading component and set its data\n\t\t\tthis.loadingComponent = this.viewContainer.createComponent(this.configuration.loading);\n\t\t\tthis.loadingComponent.setInput('data', this.loadingData());\n\n\t\t\t// Iben: Add the loading component to the button\n\t\t\tthis.renderer.setAttribute(\n\t\t\t\tthis.loadingComponent.instance.elementRef.nativeElement,\n\t\t\t\t'aria-hidden',\n\t\t\t\t'true'\n\t\t\t);\n\t\t\tthis.renderer.appendChild(\n\t\t\t\tthis.nativeElement,\n\t\t\t\tthis.loadingComponent.instance.elementRef.nativeElement\n\t\t\t);\n\t\t} else {\n\t\t\t// Iben: If the loading has stopped and a loading component is present, remove it\n\t\t\tif (!this.loading() && this.loadingComponent) {\n\t\t\t\tthis.loadingComponent.destroy();\n\t\t\t\tthis.loadingComponent = undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Adds or removes an icon\n\t */\n\tprivate handleIcon(): void {\n\t\t// Iben: Check if we need to add an icon\n\t\tif (this.icon()) {\n\t\t\t// Iben: Check if the button already has an icon, if not, add it\n\t\t\tif (!this.iconElement && !this.iconComponent) {\n\t\t\t\t// Iben: If no icon component exists, we create a regular i element\n\t\t\t\tif (!this.configuration?.icon) {\n\t\t\t\t\t// Iben: Create a new icon element\n\t\t\t\t\tthis.iconElement = this.renderer.createElement('i');\n\t\t\t\t\tthis.iconElement.className = `ngx-button-icon ${this.icon()}`;\n\t\t\t\t\t// Iben: Hide the icon for screen readers\n\t\t\t\t\tthis.renderer.setAttribute(this.iconElement, 'aria-hidden', 'true');\n\t\t\t\t} else {\n\t\t\t\t\t// Iben: Create new component and add the icon\n\t\t\t\t\tthis.iconComponent =\n\t\t\t\t\t\tthis.viewContainer.createComponent<NgxDisplayContentComponent>(\n\t\t\t\t\t\t\tthis.configuration.icon,\n\t\t\t\t\t\t\t{ index: 0 }\n\t\t\t\t\t\t);\n\t\t\t\t\tthis.iconComponent.setInput('data', this.icon());\n\t\t\t\t\tthis.renderer.addClass(\n\t\t\t\t\t\tthis.iconComponent.instance.elementRef.nativeElement,\n\t\t\t\t\t\t'ngx-button-icon'\n\t\t\t\t\t);\n\t\t\t\t\t// Iben: Hide the icon for screen readers\n\t\t\t\t\tthis.renderer.setAttribute(\n\t\t\t\t\t\tthis.iconComponent.instance.elementRef.nativeElement,\n\t\t\t\t\t\t'aria-hidden',\n\t\t\t\t\t\t'true'\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Iben: Add the icon depending on whether we want to add it on the left or the right\n\t\t\t\tthis.iconPosition() === 'left'\n\t\t\t\t\t? this.renderer.insertBefore(\n\t\t\t\t\t\t\tthis.nativeElement,\n\t\t\t\t\t\t\tthis.iconElement ||\n\t\t\t\t\t\t\t\tthis.iconComponent.instance.elementRef.nativeElement,\n\t\t\t\t\t\t\tthis.nativeElement.firstChild\n\t\t\t\t\t  )\n\t\t\t\t\t: this.renderer.appendChild(\n\t\t\t\t\t\t\tthis.nativeElement,\n\t\t\t\t\t\t\tthis.iconElement || this.iconComponent.instance.elementRef.nativeElement\n\t\t\t\t\t  );\n\t\t\t}\n\t\t}\n\t\t// Iben: If an icon already exists and we no longer have an icon presented, we remove it\n\t\telse if (this.iconElement || this.iconComponent) {\n\t\t\tif (!this.configuration?.icon) {\n\t\t\t\tthis.renderer.removeChild(this.nativeElement, this.iconElement);\n\t\t\t\tthis.iconElement = undefined;\n\t\t\t} else {\n\t\t\t\tthis.iconComponent?.destroy();\n\t\t\t\tthis.iconComponent = undefined;\n\t\t\t}\n\t\t}\n\t}\n}\n","import {\n\tChangeDetectorRef,\n\tDirective,\n\tEmbeddedViewRef,\n\tinject,\n\tinput,\n\tInputSignal,\n\tTemplateRef,\n\tViewContainerRef,\n\tOnDestroy,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { Subject, tap, takeUntil, combineLatest } from 'rxjs';\n\nimport { NgxMediaQueryService } from '../../services';\nimport { NgxMediaQueryMatchingPredicate } from '../../types';\n\n/**\n * A directive that will render a part of the template based on whether the current screen size matches the provided query\n *\n * Based upon `*ngIf`. See https://github.com/angular/angular/blob/master/packages/common/src/directives/ng_if.ts\n */\n\n@Directive({\n\tselector: '[ngxMediaQuery]',\n})\nexport class NgxMediaQueryDirective implements OnDestroy {\n\tprotected readonly mediaQueryService: NgxMediaQueryService = inject(NgxMediaQueryService);\n\t/**\n\t * The provided template ref\n\t */\n\tprotected readonly templateRef = inject<TemplateRef<any>>(TemplateRef);\n\t/**\n\t * The provided ViewContainerRef\n\t */\n\tprotected readonly viewContainer = inject(ViewContainerRef);\n\n\t/**\n\t * The provided ChangeDetectorRef\n\t */\n\tprotected readonly cdRef = inject(ChangeDetectorRef);\n\n\t/**\n\t * The destroyed state of the directive\n\t */\n\tprotected destroyed$: Subject<void>;\n\n\t/**\n\t * The needed templateRefs\n\t */\n\tprotected thenTemplateRef: TemplateRef<unknown> | null = null;\n\tprotected thenViewRef: EmbeddedViewRef<unknown> | null = null;\n\tprotected elseTemplateRef: TemplateRef<unknown> | null = null;\n\tprotected elseViewRef: EmbeddedViewRef<unknown> | null = null;\n\n\t/**\n\t * The query it should match\n\t */\n\tpublic ngxMediaQuery: InputSignal<string | string[]> = input();\n\n\t/**\n\t * The else template in case the query isn't matched\n\t */\n\tpublic ngxMediaQueryElse: InputSignal<TemplateRef<unknown>> = input(undefined);\n\n\t/**\n\t * Whether the query should be matched, by default this is true\n\t */\n\tpublic ngxMediaQueryShouldMatch: InputSignal<boolean> = input(true);\n\n\t/**\n\t * Whether every or just some parts of the query needs to be matched\n\t *\n\t * By default this is `every`.\n\t */\n\tpublic ngxMediaQueryMatchingPredicate: InputSignal<NgxMediaQueryMatchingPredicate> =\n\t\tinput('every');\n\n\tconstructor() {\n\t\tconst templateRef = this.templateRef;\n\n\t\tthis.thenTemplateRef = templateRef;\n\n\t\t// Iben: Listen to the changes and handle them accordingly\n\t\tcombineLatest([\n\t\t\ttoObservable(this.ngxMediaQuery),\n\t\t\ttoObservable(this.ngxMediaQueryElse),\n\t\t\ttoObservable(this.ngxMediaQueryShouldMatch),\n\t\t])\n\t\t\t.pipe(\n\t\t\t\ttap(() => {\n\t\t\t\t\tthis.updateView();\n\t\t\t\t}),\n\t\t\t\ttakeUntilDestroyed()\n\t\t\t)\n\t\t\t.subscribe();\n\t}\n\n\tpublic ngOnDestroy(): void {\n\t\tthis.dispose();\n\t}\n\n\t/**\n\t * Updates the view and hides/renders the template as needed\n\t */\n\tprotected updateView(): void {\n\t\t// Iben: Dispose the current subscription\n\t\tthis.dispose();\n\n\t\t// Iben: Create a new onDestroyed handler\n\t\tthis.destroyed$ = new Subject();\n\n\t\t// Iben: Render the views based on the correct state\n\t\tthis.mediaQueryService\n\t\t\t.matchesQuery(this.ngxMediaQuery(), this.ngxMediaQueryMatchingPredicate())\n\t\t\t.pipe(\n\t\t\t\ttap((matchesQuery) => {\n\t\t\t\t\t// Iben: Clear the current view\n\t\t\t\t\tthis.viewContainer.clear();\n\n\t\t\t\t\t// Iben: Check if we should render the view\n\t\t\t\t\tconst shouldRender: boolean = this.ngxMediaQueryShouldMatch()\n\t\t\t\t\t\t? matchesQuery\n\t\t\t\t\t\t: !matchesQuery;\n\n\t\t\t\t\t// Iben: Render the correct templates\n\t\t\t\t\tif (shouldRender) {\n\t\t\t\t\t\tthis.viewContainer.clear();\n\t\t\t\t\t\tthis.elseViewRef = null;\n\n\t\t\t\t\t\tif (this.thenTemplateRef) {\n\t\t\t\t\t\t\tthis.thenViewRef = this.viewContainer.createEmbeddedView(\n\t\t\t\t\t\t\t\tthis.thenTemplateRef\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (!this.elseViewRef) {\n\t\t\t\t\t\t\tthis.viewContainer.clear();\n\t\t\t\t\t\t\tthis.thenViewRef = null;\n\n\t\t\t\t\t\t\tif (this.elseTemplateRef) {\n\t\t\t\t\t\t\t\tthis.elseViewRef = this.viewContainer.createEmbeddedView(\n\t\t\t\t\t\t\t\t\tthis.elseTemplateRef\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Iben: Detect the changes so that the view gets updated\n\t\t\t\t\tthis.cdRef.detectChanges();\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.destroyed$)\n\t\t\t)\n\t\t\t.subscribe();\n\t}\n\n\t/**\n\t * Dispose the current subscription\n\t */\n\tprotected dispose(): void {\n\t\tif (this.destroyed$) {\n\t\t\tthis.destroyed$.next();\n\t\t\tthis.destroyed$.complete();\n\t\t}\n\t}\n}\n","import {\n\tComponentRef,\n\tcomputed,\n\tDirective,\n\tElementRef,\n\tinject,\n\tinput,\n\tInputSignal,\n\tOnInit,\n\tRenderer2,\n\tSignal,\n\tViewContainerRef,\n} from '@angular/core';\n\nimport { NgxDisplayContentComponent } from '../../abstracts';\nimport { NgxLinkConfigurationToken } from '../../tokens';\nimport {\n\tNgxLinkConfiguration,\n\tNgxLinkContext,\n\tNgxLinkDestination,\n\tNgxLinkIconPosition,\n\tNgxLinkPriority,\n\tNgxLinkType,\n\tNgxLinkWidth,\n} from '../../types';\n\n/**\n * A directive that adds the classic link types, priority, context, destination and icon handling\n */\n@Directive({\n\tselector: '[ngxLink]',\n\thost: {\n\t\t'[attr.class]': 'classes()',\n\t\t'[attr.target]': 'target()',\n\t\t'[attr.rel]': 'destination() === \"external\" ? \"noopener noreferrer\" : null',\n\t},\n})\nexport class NgxLinkDirective implements OnInit {\n\t/**\n\t * An instance of the viewContainer\n\t */\n\tprotected readonly viewContainer: ViewContainerRef = inject(ViewContainerRef);\n\n\t/**\n\t * An instance of the elementRef\n\t */\n\tprotected readonly elementRef: ElementRef<HTMLAnchorElement> = inject(\n\t\tElementRef<HTMLAnchorElement>\n\t);\n\n\t/**\n\t * An instance of the NativeElement\n\t */\n\tprotected readonly nativeElement = this.elementRef.nativeElement;\n\n\t/**\n\t * An instance of the renderer\n\t */\n\tprotected readonly renderer: Renderer2 = inject(Renderer2);\n\n\t/**\n\t * An optional set of configuration\n\t */\n\tprotected readonly configuration: NgxLinkConfiguration = inject(NgxLinkConfigurationToken, {\n\t\toptional: true,\n\t});\n\n\t/**\n\t * The icon element in case we did not configure an icon component\n\t */\n\tprotected iconElement: HTMLElement;\n\n\t/**\n\t * The icon component in case we did configure an icon component\n\t */\n\tprotected iconComponent: ComponentRef<NgxDisplayContentComponent>;\n\n\t/**\n\t * The classes we set to the link\n\t */\n\tprotected readonly classes: Signal<string> = computed(() => {\n\t\t// Iben: Inserts the icon\n\t\tthis.handleIcon();\n\n\t\treturn `\n    ngx-link\n    ngx-link-${this.linkType()}\n    ngx-link-${this.priority()}\n    ngx-link-${this.destination()}\n    ngx-link-${this.linkWidth()}\n    ${this.context() ? `ngx-link-${this.context()}` : ''}\n    ${this.icon() ? 'ngx-link-with-icon' : ''}\n    `;\n\t});\n\n\t/**\n\t * The target calculated based on the destination\n\t */\n\tprotected readonly target: Signal<string> = computed(() =>\n\t\tthis.destination() === 'internal' ? '_self' : '_blank'\n\t);\n\n\t/**\n\t * The visual type of the link, by default `text`.\n\t *\n\t * The options are `text`, `button` and `icon`.\n\t */\n\tpublic readonly linkType: InputSignal<NgxLinkType> = input('text');\n\n\t/**\n\t * The width of the link, either full or fit. By default, this is fit.\n\t */\n\tpublic linkWidth: InputSignal<NgxLinkWidth> = input('fit');\n\n\t/**\n\t * The context in which the link is used, by default undefined.\n\t *\n\t * The options are `navigation`, `breadcrumb`, `anchor`, `form` and `footer`.\n\t */\n\tpublic readonly context: InputSignal<NgxLinkContext> = input();\n\n\t/**\n\t * The priority the link, by default `primary`.\n\t *\n\t * The options are `primary`, `secondary`, `tertiary` and `danger`.\n\t */\n\tpublic readonly priority: InputSignal<NgxLinkPriority> = input('primary');\n\n\t/**\n\t * The destination of the link, by default `internal`.\n\t *\n\t * The options are `internal` and `external`.\n\t */\n\tpublic readonly destination: InputSignal<NgxLinkDestination> = input('internal');\n\n\t/**\n\t * An optional icon we wish to show\n\t */\n\tpublic readonly icon: InputSignal<unknown> = input();\n\n\t/**\n\t * The position of the icon when provided, by default this is `left` unless overwritten in the configuration\n\t *\n\t * The options are `left` and `right`.\n\t */\n\tpublic readonly iconPosition: InputSignal<NgxLinkIconPosition> = input('left');\n\n\tngOnInit(): void {\n\t\t// Iben: Wrap the base text in an element\n\t\tconst wrapperElement: HTMLSpanElement = this.renderer.createElement(\n\t\t\tthis.configuration?.labelWrapper || 'span'\n\t\t);\n\n\t\t// Iben: Append all the child nodes\n\t\tthis.nativeElement.childNodes.forEach((node) => {\n\t\t\tthis.renderer.appendChild(wrapperElement, node);\n\t\t});\n\n\t\tthis.renderer.setAttribute(wrapperElement, 'class', 'ngx-link-label');\n\n\t\t// Iben: Remove all the nodes\n\t\tthis.nativeElement.childNodes.forEach((node) => {\n\t\t\tthis.renderer.removeChild(wrapperElement, node);\n\t\t});\n\n\t\t// Iben: Remove the current innerHtml and replace it with a span element\n\t\tthis.renderer.appendChild(this.nativeElement, wrapperElement);\n\t}\n\n\t/**\n\t * Adds or removes an icon\n\t */\n\tprivate handleIcon(): void {\n\t\t// Iben: Check if we need to add an icon\n\t\tif (this.icon()) {\n\t\t\t// Iben: Check if the link already has an icon, if not, add it\n\t\t\tif (!this.iconElement && !this.iconComponent) {\n\t\t\t\t// Iben: If no icon component exists, we create a regular i element\n\t\t\t\tif (!this.configuration?.icon) {\n\t\t\t\t\t// Iben: Create a new icon element\n\t\t\t\t\tthis.iconElement = this.renderer.createElement('i');\n\t\t\t\t\tthis.iconElement.className = `ngx-link-icon ${this.icon()}`;\n\t\t\t\t\t// Iben: Hide the icon screen readers\n\t\t\t\t\tthis.renderer.setAttribute(this.iconElement, 'aria-hidden', 'true');\n\t\t\t\t} else {\n\t\t\t\t\t// Iben: Create new component and add the icon\n\t\t\t\t\tthis.iconComponent =\n\t\t\t\t\t\tthis.viewContainer.createComponent<NgxDisplayContentComponent>(\n\t\t\t\t\t\t\tthis.configuration.icon,\n\t\t\t\t\t\t\t{ index: 0 }\n\t\t\t\t\t\t);\n\t\t\t\t\tthis.iconComponent.setInput('data', this.icon());\n\n\t\t\t\t\t// Iben: Set the class of the icon\n\t\t\t\t\tthis.renderer.addClass(\n\t\t\t\t\t\tthis.iconComponent.instance.elementRef.nativeElement,\n\t\t\t\t\t\t'ngx-link-icon'\n\t\t\t\t\t);\n\n\t\t\t\t\t// Iben: Hide the icon for screen readers\n\t\t\t\t\tthis.renderer.setAttribute(\n\t\t\t\t\t\tthis.iconComponent.instance.elementRef.nativeElement,\n\t\t\t\t\t\t'aria-hidden',\n\t\t\t\t\t\t'true'\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Iben: Add the icon depending on whether we want to add it on the left or the right\n\t\t\t\tthis.iconPosition() === 'left'\n\t\t\t\t\t? this.renderer.insertBefore(\n\t\t\t\t\t\t\tthis.nativeElement,\n\t\t\t\t\t\t\tthis.iconElement ||\n\t\t\t\t\t\t\t\tthis.iconComponent.instance.elementRef.nativeElement,\n\t\t\t\t\t\t\tthis.nativeElement.firstChild\n\t\t\t\t\t\t)\n\t\t\t\t\t: this.renderer.appendChild(\n\t\t\t\t\t\t\tthis.nativeElement,\n\t\t\t\t\t\t\tthis.iconElement || this.iconComponent.instance.elementRef.nativeElement\n\t\t\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\t// Iben: If an icon already exists and we no longer have an icon presented, we remove it\n\t\telse if (this.iconElement || this.iconComponent) {\n\t\t\tif (!this.configuration?.icon) {\n\t\t\t\tthis.renderer.removeChild(this.nativeElement, this.iconElement);\n\t\t\t\tthis.iconElement = undefined;\n\t\t\t} else {\n\t\t\t\tthis.iconComponent?.destroy();\n\t\t\t\tthis.iconComponent = undefined;\n\t\t\t}\n\t\t}\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { NgxConfigurableLayoutItemEntity, NgxConfigurableLayoutItemSizeOption } from '../../types';\n\n@Pipe({\n\tname: 'ngxConfigurableLayoutItemSize',\n\tstandalone: true,\n})\nexport class NgxConfigurableLayoutItemSizePipe implements PipeTransform {\n\t/**\n\t * Returns the needed styling for the ngx-configurable-layout component\n\t *\n\t * @param keys - The keys used in the grid\n\t * @param showInactive - Whether we want to show inactive items\n\t * @param itemSize - The itemSize used by the layout\n\t */\n\ttransform(\n\t\t{\n\t\t\tkeys,\n\t\t\tshowInactive,\n\t\t}: { keys: NgxConfigurableLayoutItemEntity[][]; showInactive: boolean } = {\n\t\t\tkeys: null,\n\t\t\tshowInactive: true,\n\t\t},\n\t\titemSize: NgxConfigurableLayoutItemSizeOption\n\t): Record<string, any> {\n\t\t// Iben: If non data source is provided or if the itemSize is 'fill',\n\t\t// we can use the default grid size which will result in filling up the available grid space.\n\t\tif (!keys || itemSize === 'fill') {\n\t\t\treturn {};\n\t\t}\n\n\t\t// Iben: If itemSize is 'fit-content', the columns will be based on the content of the template\n\t\tif (itemSize === 'fit-content') {\n\t\t\treturn {\n\t\t\t\t'grid-auto-columns': 'max-content',\n\t\t\t};\n\t\t}\n\n\t\t// Iben: If itemSize is 'equal', all items in the grid need to be of equal size.\n\t\t// For this, we grab the row with the largest amount of items, which will define the amount of columns\n\t\tconst longestRow = Math.max(\n\t\t\t...[...keys].map((item) => {\n\t\t\t\treturn item.filter((key) => {\n\t\t\t\t\tif (!showInactive) {\n\t\t\t\t\t\treturn key.isActive;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\t\t\t\t}).length;\n\t\t\t})\n\t\t);\n\n\t\treturn {\n\t\t\t'grid-template-columns': `repeat(${longestRow}, minmax(0, 1fr))`,\n\t\t};\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { NgxAbstractTableCellDirective } from '../../components';\nimport { NgxTableSortEvent } from '../../types';\n\n\n@Pipe({\n\tname: 'ngxAriaSort',\n\tstandalone: true,\n})\nexport class NgxAriaSortPipe implements PipeTransform {\n\ttransform(value: {\n\t\tcurrentSorting: NgxTableSortEvent;\n\t\tcell: NgxAbstractTableCellDirective;\n\t}): 'none' | 'ascending' | 'descending' {\n\t\tconst { cell } = value;\n\n\t\tif (!cell || !cell.sortDirection) {\n\t\t\treturn 'none';\n\t\t}\n\n\t\treturn cell.sortDirection.toLocaleLowerCase() as 'ascending' | 'descending';\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { get } from 'lodash';\n\n/**\n * This pipe returns a value based on a provided path\n *\n * @export\n * @class NgxTableGetPipe\n * @implements {PipeTransform}\n */\n@Pipe({\n\tname: 'getProp',\n\tstandalone: true,\n})\nexport class NgxTableGetPipe implements PipeTransform {\n\tpublic transform(value: unknown, path: string): any {\n\t\t// Iben: Check if the value is not an object and return an empty string so the frontend doesn't break and warn the user\n\t\tif (typeof value !== 'object' || Array.isArray(value) || value === null) {\n\t\t\tconsole.warn(\n\t\t\t\t'NgxTableGetPipe encountered a value that was not an object and returned an empty string instead.'\n\t\t\t);\n\n\t\t\treturn '';\n\t\t}\n\n\t\t// Iben: If no path was provided, we return the value and warn the user\n\t\tif (!path) {\n\t\t\tconsole.warn(\n\t\t\t\t'NgxTableGetPipe did not receive a path to a property and returned an empty string instead.'\n\t\t\t);\n\n\t\t\treturn value;\n\t\t}\n\n\t\t// Iben: Return the property\n\t\treturn get(value, path);\n\t}\n}\n","import { Pipe,PipeTransform,OutputEmitterRef } from '@angular/core';\n\n@Pipe({\n\tname: 'ngxTableHasObservers',\n\tstandalone: true,\n})\nexport class NgxTableHasObserversPipe implements PipeTransform {\n\t/**\n\t * Returns true in case an observer was set to an EventEmitter\n\t *\n\t * @param output - The provided EventEmitter\n\t */\n  public transform ( output: OutputEmitterRef<unknown> ): boolean {\n\t\treturn output && output['listeners']?.length > 0;\n\t}\n}\n","import {\n\tChangeDetectorRef,\n\tinject,\n\tPipe,\n\tPipeTransform,\n\tOnDestroy,\n\tElementRef,\n\tRenderer2,\n} from '@angular/core';\nimport { MarkedOptions } from 'marked';\nimport { Observable, Subject, takeUntil, tap } from 'rxjs';\n\nimport { NgxMarkdownService } from '../../services';\n\n/**\n * A pipe that parses a markdown string to HTML using the Marked library\n * https://marked.js.org/\n */\n@Pipe({\n\tname: 'ngxMarkdown',\n\tpure: false,\n})\nexport class NgxMarkdownPipe implements PipeTransform, OnDestroy {\n\t/**\n\t * An instance of the NgxMarkdownService\n\t */\n\tprotected readonly markdownService: NgxMarkdownService = inject(NgxMarkdownService);\n\n\t/**\n\t * An instance of the ChangeDetectorRef\n\t */\n\tprotected readonly cdRef: ChangeDetectorRef = inject(ChangeDetectorRef);\n\n\t/**\n\t * An instance of the ElementRef\n\t */\n\tprotected readonly elementRef: ElementRef = inject(ElementRef);\n\n\t/**\n\t * An instance of the Renderer2\n\t */\n\tprotected readonly renderer: Renderer2 = inject(Renderer2);\n\n\t/**\n\t * Subject to hold the destroyed state of the current observable\n\t */\n\tprotected destroyed$: Subject<void>;\n\n\t/**\n\t * The latest value of the Observable, the parsed markdown\n\t */\n\tprotected parsed: string;\n\n\t/**\n\t * The previous value of the markdown string\n\t */\n\tprotected previousValue: string;\n\n\t/**\n\t * Instance of the change detector ref, implemented like this according to the async pipe implementation\n\t * https://github.com/angular/angular/blob/main/packages/common/src/pipes/async_pipe.ts\n\t */\n\tprotected changeDetectorRef: ChangeDetectorRef | null;\n\n\tconstructor() {\n\t\tconst cdRef = this.cdRef;\n\n\t\t// Iben: Use instance of cdRef like this to prevent memory leaks (see Angular async Pipe implementation)\n\t\tthis.changeDetectorRef = cdRef;\n\n\t\t// Iben: Add a `ngx-markdown-element` class to the element\n\t\tif (this.elementRef?.nativeElement) {\n\t\t\tthis.renderer.addClass(this.elementRef.nativeElement, 'ngx-markdown-element');\n\t\t}\n\t}\n\n\t/**\n\t * Parse a markdown string to HTML\n\t *\n\t * @param value - The markdown string to parse\n\t */\n\tpublic transform(value: string, options?: Omit<MarkedOptions, 'async'>): string {\n\t\t// Iben: If the value is the same as the previous value, return the parsed value\n\t\tif (value === this.previousValue) {\n\t\t\treturn this.parsed;\n\t\t}\n\n\t\t// Iben: Set the previous value to the new value\n\t\tthis.previousValue = value;\n\n\t\t// Iben: Parse the markdown string to HTML\n\t\tthis.subscribe(this.markdownService.parse(value, options));\n\n\t\t// Iben: Return the parsed value\n\t\treturn this.parsed;\n\t}\n\n\t/**\n\t * Handles the changeDetection, latest value and dispose of the matchesQuery observable\n\t *\n\t * @param observable - The parsed markdown observable\n\t */\n\tprotected subscribe(observable: Observable<string>): void {\n\t\t// Iben: Dispose the current subscription\n\t\tthis.dispose();\n\n\t\t// Iben: Create a new destroyed subject to handle the destruction when needed\n\t\tthis.destroyed$ = new Subject();\n\n\t\tobservable\n\t\t\t.pipe(\n\t\t\t\ttap((value) => {\n\t\t\t\t\t// Iben: Update the latest value when it a new value is provided\n\t\t\t\t\tthis.parsed = value;\n\n\t\t\t\t\t// Iben: Mark the component as ready for check\n\t\t\t\t\tthis.changeDetectorRef.detectChanges();\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.destroyed$)\n\t\t\t)\n\t\t\t.subscribe();\n\t}\n\n\tpublic ngOnDestroy(): void {\n\t\t// Iben: Call the dispose when the component is destroyed so we have no running subscriptions left\n\t\tthis.dispose();\n\n\t\t// Iben: Clear instance of cdRef like this to prevent memory leaks (see Angular async Pipe implementation)\n\t\tthis.changeDetectorRef = null;\n\t}\n\n\t/**\n\t * Dispose of the matchesQuery observable when existing\n\t */\n\tprotected dispose(): void {\n\t\t// Iben: In case there's a destroyed, we have an observable and we destroy the subscription and reset the observable\n\t\tif (this.destroyed$) {\n\t\t\tthis.destroyed$.next();\n\t\t\tthis.destroyed$.complete();\n\t\t}\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { HideHeaderRowOption } from '../../tokens';\nimport { NgxTableShowHeaderRequirements } from '../../types';\n\n/**\n * This pipe returns whether we want to show the header\n *\n * @export\n * @class NgxTableShowHeaderPipe\n * @implements {PipeTransform}\n */\n@Pipe({\n\tname: 'ngxTableShowHeader',\n\tstandalone: true,\n})\nexport class NgxTableShowHeaderPipe implements PipeTransform {\n\tpublic transform(\n\t\tvalue: NgxTableShowHeaderRequirements,\n\t\thideHeaderRowWhen: HideHeaderRowOption\n\t): boolean {\n\t\t// Iben: If we never want to hide the header row, we return true\n\t\tif (hideHeaderRowWhen === 'never') {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Iben: Check if the value is not an object and return an empty string so the frontend doesn't break and warn the user\n\t\tif (typeof value !== 'object' || !value) {\n\t\t\tconsole.warn(\n\t\t\t\t'NgxTableShowHeaderPipe encountered a value that was not an object and showed the header.'\n\t\t\t);\n\n\t\t\treturn true;\n\t\t}\n\n\t\t// Iben: Add to set for better performance\n\t\tconst options = new Set(hideHeaderRowWhen);\n\n\t\t// Iben: Check which cases need the header to be hidden, and then flip it\n\t\treturn !(\n\t\t\t(options.has('when-empty') && value.isEmpty) ||\n\t\t\t(options.has('when-loading') && value.isLoading)\n\t\t);\n\t}\n}\n","export enum NgxTableSortDirection {\n\tASCENDING = 'ASCENDING',\n\tDESCENDING = 'DESCENDING',\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { NgxTableSortDirection } from '../../enums';\n\n@Pipe({\n\tname: 'ngxTableSortIcon',\n\tstandalone: true,\n})\nexport class NgxTableSortIconPipe implements PipeTransform {\n\t/**\n\t * Returns a icon based on the provided sort direction\n\t *\n\t * @param direction - The provided sort direction\n\t */\n\tpublic transform(direction: null | NgxTableSortDirection): string {\n\t\tif (!direction) {\n\t\t\treturn '&equiv;';\n\t\t}\n\n\t\treturn direction === NgxTableSortDirection.ASCENDING ? '&uArr;' : '&dArr;';\n\t}\n}\n","import { ChangeDetectorRef, OnDestroy, Pipe, PipeTransform, inject } from '@angular/core';\nimport { Observable, Subject, takeUntil, tap } from 'rxjs';\n\nimport { NgxMediaQueryService } from '../../services';\nimport { NgxMediaQueryMatchingPredicate } from '../../types';\n\n/**\n * A pipe that returns whether a (list of) query(s) have been matched\n */\n@Pipe({\n\tname: 'ngxMatchesQuery',\n\tpure: false,\n})\nexport class NgxMatchesQueryPipe implements PipeTransform, OnDestroy {\n\t/**\n\t * An instance of the NgxMediaQueryService\n\t */\n\tprotected readonly mediaService: NgxMediaQueryService = inject(NgxMediaQueryService);\n\n\t/**\n\t * An instance of the ChangeDetectorRef\n\t */\n\tprotected readonly cdRef = inject(ChangeDetectorRef);\n\n\t/**\n\t * Subject to hold the destroyed state of the current observable\n\t */\n\tprotected destroyed$: Subject<void>;\n\t/**\n\t * The latest value of the Observable, whether or not the query is matched\n\t */\n\tprotected matchesQuery: boolean;\n\t/**\n\t * Instance of the change detector ref, implemented like this according to the async pipe implementation\n\t * https://github.com/angular/angular/blob/main/packages/common/src/pipes/async_pipe.ts\n\t */\n\tprotected changeDetectorRef: ChangeDetectorRef | null;\n\n\tconstructor() {\n\t\tconst cdRef = this.cdRef;\n\n\t\t// Iben: Use instance of cdRef like this to prevent memory leaks (see Angular async Pipe implementation)\n\t\tthis.changeDetectorRef = cdRef;\n\t}\n\n\tpublic ngOnDestroy(): void {\n\t\t// Iben: Call the dispose when the component is destroyed so we have no running subscriptions left\n\t\tthis.dispose();\n\n\t\t// Iben: Clear instance of cdRef like this to prevent memory leaks (see Angular async Pipe implementation)\n\t\tthis.changeDetectorRef = null;\n\t}\n\n\t/**\n\t * Returns whether or not a query is matched\n\t *\n\t * @param query - The provided query\n\t * @param predicate - Whether every or some part(s) of the query have to be matched\n\t */\n\tpublic transform(\n\t\tquery: string | string[],\n\t\tpredicate: NgxMediaQueryMatchingPredicate = 'every'\n\t): boolean {\n\t\tthis.subscribe(this.mediaService.matchesQuery(query, predicate));\n\n\t\treturn this.matchesQuery;\n\t}\n\n\t/**\n\t * Handles the changeDetection, latest value and dispose of the matchesQuery observable\n\t *\n\t * @param observable - The matchesQuery observable\n\t */\n\tprotected subscribe(observable: Observable<boolean>): void {\n\t\t// Iben: Dispose the current subscription\n\t\tthis.dispose();\n\n\t\t// Iben: Create a new destroyed subject to handle the destruction when needed\n\t\tthis.destroyed$ = new Subject();\n\n\t\tobservable\n\t\t\t.pipe(\n\t\t\t\ttap((value) => {\n\t\t\t\t\t// Iben: Update the latest value when it a new value is provided\n\t\t\t\t\tthis.matchesQuery = value;\n\n\t\t\t\t\t// Iben: Mark the component as ready for check\n\t\t\t\t\tthis.changeDetectorRef.markForCheck();\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.destroyed$)\n\t\t\t)\n\t\t\t.subscribe();\n\t}\n\n\t/**\n\t * Dispose of the matchesQuery observable when existing\n\t */\n\tprotected dispose(): void {\n\t\t// Iben: In case there's a destroyed, we have an observable and we destroy the subscription and reset the observable\n\t\tif (this.destroyed$) {\n\t\t\tthis.destroyed$.next();\n\t\t\tthis.destroyed$.complete();\n\t\t}\n\t}\n}\n","import { inject, Pipe, PipeTransform } from '@angular/core';\n\nimport { NgxTableConfigurationToken } from '../../tokens';\nimport { NgxTableAriaLabels } from '../../types';\n\n// Iben: Define configuration keys and fallback prefixes mapping at module level to prevent re-allocation\nconst CONFIG_MAPPING = {\n\tselect: { key: 'selectRow' as const, fallbackPrefix: 'Select' },\n\texpand: { key: 'expandRow' as const, fallbackPrefix: 'Expand' },\n\tcollapse: { key: 'collapseRow' as const, fallbackPrefix: 'Collapse' },\n};\n\n@Pipe({\n\tname: 'ngxTableAriaLabel',\n\tstandalone: true,\n})\nexport class NgxTableAriaLabelPipe implements PipeTransform {\n\t/**\n\t * The global configuration we wish to use for the table\n\t */\n\tprivate readonly globalConfig = inject(NgxTableConfigurationToken, { optional: true });\n\n\t/**\n\t * Resolves the ARIA label we wish to set on the selection and expansion controls\n\t *\n\t * @param index - The index of the row we wish to target, undefined for the header controls\n\t * @param type - The action type we wish to perform\n\t * @param config - The custom ARIA labels configuration we wish to use\n\t */\n\ttransform(\n\t\tindex: number | undefined,\n\t\ttype: 'select' | 'expand' | 'collapse',\n\t\tconfig?: NgxTableAriaLabels\n\t): string {\n\t\t// Iben: If the index is undefined, we resolve and return the select all label\n\t\tif (index === undefined) {\n\t\t\treturn (\n\t\t\t\tconfig?.selectAll ?? this.globalConfig?.ariaLabels?.selectAll ?? 'Select all rows'\n\t\t\t);\n\t\t}\n\n\t\tconst { key, fallbackPrefix } = CONFIG_MAPPING[type];\n\n\t\t// Iben: Resolve the configured label (local overrides global)\n\t\tconst label = config?.[key] ?? this.globalConfig?.ariaLabels?.[key];\n\n\t\t// Iben: Return dynamic callback value if it is a function\n\t\tif (typeof label === 'function') {\n\t\t\treturn label(index);\n\t\t}\n\n\t\t// Iben: Return static string if configured\n\t\tif (typeof label === 'string') {\n\t\t\treturn label;\n\t\t}\n\n\t\t// Iben: Fallback to the standard English label\n\t\treturn `${fallbackPrefix} row ${index + 1}`;\n\t}\n}\n","export * from './item-size/item-size.pipe';\nimport { NgxAriaSortPipe } from './aria-sort/aria-sort.pipe';\nimport { NgxTableGetPipe } from './get-pipe/get.pipe';\nimport { NgxTableHasObserversPipe } from './has-observers/has-observers.pipe';\nimport { NgxMarkdownPipe } from './markdown/markdown.pipe';\nimport { NgxTableShowHeaderPipe } from './show-header/show-header.pipe';\nimport { NgxTableSortIconPipe } from './sort-icon/sort-icon.pipe';\n\nexport * from './has-observers/has-observers.pipe';\nexport * from './sort-icon/sort-icon.pipe';\nexport * from './get-pipe/get.pipe';\nexport * from './show-header/show-header.pipe';\nexport * from './aria-sort/aria-sort.pipe';\nexport * from './matches-query/matches-query.pipe';\nexport * from './markdown/markdown.pipe';\nexport * from './table-aria-label/table-aria-label.pipe';\n\nexport const Pipes = [\n\tNgxTableHasObserversPipe,\n\tNgxTableSortIconPipe,\n\tNgxTableGetPipe,\n\tNgxTableShowHeaderPipe,\n\tNgxAriaSortPipe,\n\tNgxMarkdownPipe,\n];\n","import { Component, TemplateRef, input, viewChild, ChangeDetectionStrategy } from '@angular/core';\n\n/**\n * The layout item pairs with the `<ngx-configurable-layout>` container.\n * This component will in itself not be rendered. The key provided in this component\n * will need to be provided in the `[keys]` input or the `formControl` of the layout container\n * as well. The order in which they are provided there, will define the order in which\n * the items will be rendered.\n */\n@Component({\n\tselector: 'ngx-configurable-layout-item',\n\ttemplateUrl: './configurable-layout-item.component.html',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tstandalone: true,\n})\nexport class NgxConfigurableLayoutItemComponent {\n\t/**\n\t * The unique key of the layout item.\n\t */\n\tpublic readonly key = input.required<string>();\n\n\t/**\n\t * An optional label for the layout item used for WCAG purposes.\n\t */\n\tpublic readonly label = input<string>();\n\n\t/**\n\t * The template reference of the;\n\t */\n\tpublic readonly template = viewChild<TemplateRef<any>>('contentTmpl');\n}\n","<ng-template #contentTmpl>\n\t<ng-content></ng-content>\n</ng-template>\n","import {\n\tCdkDragDrop,\n\tCdkDrag,\n\tCdkDropList,\n\tCdkDropListGroup,\n\tmoveItemInArray,\n\ttransferArrayItem,\n\tCdkDragPlaceholder,\n} from '@angular/cdk/drag-drop';\nimport { NgTemplateOutlet, NgStyle, CommonModule } from '@angular/common';\nimport {\n\tAfterContentChecked,\n\tComponent,\n\tOnInit,\n\tTemplateRef,\n\tWritableSignal,\n\tforwardRef,\n\tsignal,\n\tAfterViewInit,\n\tChangeDetectionStrategy,\n\tinput,\n\tcontentChildren,\n\tcontentChild,\n\teffect,\n\tInputSignal,\n\tDestroyRef,\n\tinject,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n\tControlValueAccessor,\n\tFormControl,\n\tFormRecord,\n\tNG_VALUE_ACCESSOR,\n\tReactiveFormsModule,\n} from '@angular/forms';\nimport { BehaviorSubject, filter, switchMap, take, tap } from 'rxjs';\n\nimport { NgxAccessibleDragAndDrop } from '../../directives';\nimport { NgxConfigurableLayoutItemSizePipe } from '../../pipes';\nimport {\n\tNgxAccessibleDragAndDropMoveEvent,\n\tNgxConfigurableLayoutGrid,\n\tNgxConfigurableLayoutItemDropEvent,\n\tNgxConfigurableLayoutItemEntity,\n\tNgxConfigurableLayoutItemSizeOption,\n\tNgxConfigurableLayoutType,\n} from '../../types';\nimport { NgxConfigurableLayoutItemComponent } from '../configurable-layout-item/configurable-layout-item.component';\n\n/**\n * This component acts essentially as a layout wrapper. In combination with the\n * `<ngx-configurable-layout-item>` provided with a key as input, this component allows\n * you to dynamically change the order in which the items get rendered.\n *\n * The order of the items in the template does not matter, it gets set by the `[keys]` input.\n * You may also bind a `FormControl<string[][]>` to this component, which will allow you to reactively\n * change the order in which the elements get rendered. The control will always override the`[keys]` input.\n */\n@Component({\n\tselector: 'ngx-configurable-layout',\n\ttemplateUrl: './configurable-layout.component.html',\n\tstyleUrl: './configurable-layout.component.scss',\n\timports: [\n\t\tNgTemplateOutlet,\n\t\tNgStyle,\n\t\tCdkDropListGroup,\n\t\tCdkDropList,\n\t\tCdkDrag,\n\t\tCdkDragPlaceholder,\n\t\tNgxConfigurableLayoutItemSizePipe,\n\t\tReactiveFormsModule,\n\t\tCommonModule,\n\t\tNgxAccessibleDragAndDrop,\n\t],\n\tproviders: [\n\t\t{\n\t\t\tprovide: NG_VALUE_ACCESSOR,\n\t\t\tuseExisting: forwardRef(() => NgxConfigurableLayoutComponent),\n\t\t\tmulti: true,\n\t\t},\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgxConfigurableLayoutComponent\n\timplements ControlValueAccessor, OnInit, AfterContentChecked, AfterViewInit\n{\n\t/**\n\t * A subject to mark the isActiveFormRecord as initialized\n\t */\n\tprotected readonly isActiveFormRecordInitializedSubject: BehaviorSubject<boolean> =\n\t\tnew BehaviorSubject(false);\n\n\t/**\n\t * A subject to hold the destroy flow\n\t */\n\tprotected readonly destroyRef = inject(DestroyRef);\n\n\t/**\n\t * A list of the configurable item templates.\n\t */\n\tpublic readonly configurableItemTemplates = contentChildren(NgxConfigurableLayoutItemComponent);\n\n\t/**\n\t * An optional template to overwrite the default checkbox\n\t */\n\tpublic readonly checkboxTemplate = contentChild<TemplateRef<any>>('checkboxTmpl');\n\n\t// This component uses the internal implementation of the `ngx-forms` library.\n\t// Until we have moved to an NX workspace setup, we are unable to install the required\n\t//  dependencies to make the `ngx-forms` work.\n\t//\n\tpublic readonly form: FormControl<NgxConfigurableLayoutGrid> =\n\t\tnew FormControl<NgxConfigurableLayoutGrid>([]);\n\tpublic readonly isActiveFormRecord: FormRecord<FormControl<boolean>> = new FormRecord({});\n\n\t/**\n\t * A record of the templates with the unique item `key` and its `templateRef`.\n\t */\n\tpublic itemTemplateRecord: WritableSignal<Record<string, TemplateRef<any>>> = signal({});\n\n\t/**\n\t * A record of the label with the unique item `key` and its `label`.\n\t */\n\tpublic itemLabelRecord: WritableSignal<Record<string, string>> = signal({});\n\n\t/**\n\t * Whether the layout is static or editable.\n\t *\n\t * If the layout is `static`, a two dimensional array of key strings needs to be provided to the layout through the `keys` input.\n\t * If the layout is `editable`, a form control needs to be provided to the layout requiring a two dimensional array with {key, isActive} pairs.\n\t */\n\tpublic readonly layoutType = input.required<NgxConfigurableLayoutType>();\n\n\t/**\n\t * The keys will determine the order of the `ngx-configurable-layout-item` layout items.\n\t *\n\t * This property can only be used when the layoutType  is set to `static`.\n\t */\n\tpublic keys: InputSignal<string[][]> = input();\n\n\t/**\n\t * Whether the inactive items should be visible in the layout.\n\t *\n\t * This property can only be used when the layoutType is set to `editable`.\n\t */\n\tpublic readonly showInactive = input<boolean>();\n\n\t/**\n\t * Whether drag and drop is enabled for the layout.\n\t *\n\t * This property can only be used when the layoutType is set to `editable`\n\t */\n\tpublic readonly allowDragAndDrop = input<boolean>();\n\n\t/**\n\t * Determines how much space each item takes in the row. By default, this is 'fill'\n\t *\n\t * fill - Will make the items take up the available space\n\t * fit-content - Will make the items take up the space of the provided template\n\t * equal - Will make the items take up equal amount of space throughout the grid\n\t */\n\tpublic readonly itemSize = input<NgxConfigurableLayoutItemSizeOption>('fill');\n\n\t/**\n\t * An optional row gap we can provide to create a gap between the rows of the layout.\n\t *\n\t * This input requires an amount in px, rem, %, etc.\n\t */\n\tpublic readonly rowGap = input<string>();\n\n\t/**\n\t * An optional predicate we can use to allow or disallow items to be dropped\n\t *\n\t * @memberof NgxConfigurableLayoutComponent\n\t */\n\tpublic readonly dropPredicate = input<(event: NgxConfigurableLayoutItemDropEvent) => boolean>();\n\n\t/**\n\t * An optional label for the layout item used for WCAG purposes.\n\t */\n\tpublic readonly itemLabel = input<string>();\n\n\t/**\n\t * An optional label for the layout item used for WCAG purposes.\n\t */\n\tpublic readonly rowLabel = input<string>();\n\n\t/**\n\t * An optional description explaining how the drag and drop works used for WCAG purposes.\n\t */\n\tpublic readonly description = input<string>();\n\n\t/**\n\t * An optional column gap we can provide to create a gap between the columns of the layout.\n\t *\n\t * This input requires an amount in px, rem, %, etc.\n\t */\n\tpublic readonly columnGap = input<string>();\n\n\tconstructor() {\n\t\teffect(() => {\n\t\t\tconst keys = this.keys();\n\n\t\t\t// Wouter: If no keys are provided, we prevent the patching of the control.\n\t\t\tif (!keys) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Wouter: Patch the provided keys onto the control.\n\t\t\tthis.form.patchValue(\n\t\t\t\t[...keys].map((row) => {\n\t\t\t\t\treturn [...row].map((key) => ({ key, isActive: true }));\n\t\t\t\t}),\n\t\t\t\t{ emitEvent: false }\n\t\t\t);\n\t\t});\n\n\t\teffect(() => {\n\t\t\tif (this.layoutType() === 'static') {\n\t\t\t\t// Iben: If no keys are provided, we return an error, as without it, there nothing will be rendered and the layout will not work.\n\t\t\t\tif (!this.keys()) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t'NgxLayout: The configurable layout was set to \"static\" but no 2D array of keys was provided. Provide an 2D array of keys to visualize the items. For more information, check the readme.'\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Iben: If either of the properties was set, we simply warn the user that these will have no effect as this will not influence the setup.\n\t\t\t\tif (this.allowDragAndDrop() !== undefined || this.showInactive() !== undefined) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t'NgxLayout: The configurable layout was set to \"static\". Properties \"allowDragAndDrop\" and \"showInactive\" will have no effect. For more information, check the readme.'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Iben: If keys are provided, there's possible inconsistent behavior. We return an error so the user is notified.\n\t\t\t\tif (this.keys()) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t'NgxLayout: The configurable layout was set to \"editable\". The property \"keys\" will have cause inconsistent behavior. For more information, check the readme.'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic ngOnInit(): void {\n\t\t// Iben: Listen to the form\n\t\tthis.form.valueChanges\n\t\t\t.pipe(\n\t\t\t\ttap(() => {\n\t\t\t\t\tthis.onChanged(this.form.value);\n\t\t\t\t\tthis.onTouched();\n\t\t\t\t}),\n\t\t\t\ttakeUntilDestroyed(this.destroyRef)\n\t\t\t)\n\t\t\t.subscribe();\n\n\t\t// Iben: Listen to the valueChanges of the isActiveFormRecord and update accordingly\n\t\tthis.isActiveFormRecordInitializedSubject\n\t\t\t.pipe(\n\t\t\t\tfilter(Boolean),\n\t\t\t\ttake(1),\n\t\t\t\tswitchMap(() => this.isActiveFormRecord.valueChanges),\n\t\t\t\ttap(() => {\n\t\t\t\t\tconst result = [];\n\n\t\t\t\t\t// Iben: Loop over all keys and update the new isActive\n\t\t\t\t\tthis.form.value.forEach((row) => {\n\t\t\t\t\t\tresult.push(\n\t\t\t\t\t\t\t[...row].map(({ key }) => {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\t\t\tisActive: this.isActiveFormRecord.value[key],\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\n\t\t\t\t\t// Iben: Update the parent form\n\t\t\t\t\tthis.form.setValue(result);\n\t\t\t\t}),\n\t\t\t\ttakeUntilDestroyed(this.destroyRef)\n\t\t\t)\n\t\t\t.subscribe();\n\t}\n\n\tpublic ngAfterContentChecked(): void {\n\t\t// Iben: Run with content check so that we can dynamically add templates/columns\n\t\tthis.handleItemTemplates();\n\t}\n\n\tpublic ngAfterViewInit(): void {\n\t\t// Femke: Run after view init so we have the initial templates\n\t\tthis.handleItemTemplates();\n\t}\n\n\t/**\n\t * Callback function for ControlValueAccessor onChange\n\t */\n\tprotected onChanged: Function = () => {};\n\t/**\n\t * Callback function for ControlValueAccessor onTouched\n\t */\n\tprotected onTouched: Function = () => {};\n\n\twriteValue(value: NgxConfigurableLayoutGrid): void {\n\t\t// Iben: Update the inner form.\n\t\tthis.form.setValue(value || [], { emitEvent: false });\n\n\t\t// Iben: Setup the isActive form\n\t\t(value || []).forEach((row) => {\n\t\t\trow.forEach(({ key, isActive }) => {\n\t\t\t\tthis.isActiveFormRecord.setControl(key, new FormControl(isActive), {\n\t\t\t\t\temitEvent: false,\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Iben: Notify that the form has been initialized\n\t\tif (!this.isActiveFormRecordInitializedSubject.getValue()) {\n\t\t\tthis.isActiveFormRecordInitializedSubject.next(true);\n\t\t}\n\t}\n\n\tregisterOnChange(fn: any): void {\n\t\tthis.onChanged = fn;\n\t}\n\tregisterOnTouched(fn: any): void {\n\t\tthis.onTouched = fn;\n\t}\n\tsetDisabledState?(isDisabled: boolean): void {\n\t\tisDisabled\n\t\t\t? this.form.disable({ emitEvent: false })\n\t\t\t: this.form.enable({ emitEvent: false });\n\t}\n\n\t/**\n\t * Drag and drop an element in the grid\n\t *\n\t * @param {CdkDragDrop<string[]>} event - The grid element\n\t * @memberof NgxConfigurableLayoutComponent\n\t */\n\tpublic drop(event: CdkDragDrop<string[]>): void {\n\t\t// Iben: Fetch the arrays we need to update\n\t\tconst startArrayIndex = parseInt(event.previousContainer.id.split('ngx-layout-row-')[1]);\n\t\tconst endArrayIndex = parseInt(event.container.id.split('ngx-layout-row-')[1]);\n\t\tconst formData = [...this.form.value];\n\t\tconst startArray = formData[startArrayIndex];\n\t\tconst endArray = formData[endArrayIndex];\n\n\t\t// Iben: If the drag and drop is within the same row, we move\n\t\tif (event.previousContainer === event.container) {\n\t\t\tmoveItemInArray(endArray, event.previousIndex, event.currentIndex);\n\t\t} else {\n\t\t\t// Iben: If the drag and drop is over multiple rows, we transfer\n\t\t\ttransferArrayItem(startArray, endArray, event.previousIndex, event.currentIndex);\n\t\t\tformData[startArrayIndex] = startArray;\n\t\t}\n\n\t\tformData[endArrayIndex] = endArray;\n\n\t\t// Iben: Update the form value\n\t\tthis.form.setValue(formData);\n\t}\n\n\t/**\n\t * Moves an element based on its provided event\n\t *\n\t * @param event - The provided move event\n\t */\n\tpublic move(event: NgxAccessibleDragAndDropMoveEvent): void {\n\t\t// Iben: Get the required data\n\t\tconst formData = [...this.form.value];\n\t\tconst startArray = formData[event.previousContainer];\n\t\tconst endArray = formData[event.newContainer];\n\n\t\t// Iben: Early exit if the provided containers don't exist\n\t\tif (isNaN(event.previousContainer) || isNaN(event.newContainer)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Iben: If the drag and drop is within the same row, we move\n\t\tif (event.previousContainer === event.newContainer) {\n\t\t\tmoveItemInArray(endArray, event.previousIndex, event.newIndex);\n\t\t} else {\n\t\t\t// Iben: If the drag and drop is over multiple rows, we transfer\n\t\t\ttransferArrayItem(startArray, endArray, event.previousIndex, event.newIndex);\n\t\t\tformData[event.previousContainer] = startArray;\n\t\t}\n\n\t\tformData[event.newContainer] = endArray;\n\n\t\t// Iben: Update the form value\n\t\tthis.form.setValue(formData);\n\t}\n\n\t/**\n\t * The predicate we run before sorting\n\t *\n\t * @param  draggedElement - The dragged element\n\t * @param  list - The list into which we're dragging the element\n\t */\n\tpublic beforeSort = (_: number, draggedElement: CdkDrag, list: CdkDropList): boolean => {\n\t\treturn this.dropPredicateHandler('sorting', draggedElement, list);\n\t};\n\n\t/**\n\t * The predicate we run before moving\n\t *\n\t * @param  draggedElement - The dragged element\n\t * @param  list - The list into which we're dragging the element\n\t */\n\tpublic beforeDrop = (draggedElement: CdkDrag, list: CdkDropList): boolean => {\n\t\treturn this.dropPredicateHandler('moving', draggedElement, list);\n\t};\n\n\t/**\n\t * Handles the drop predicate\n\t *\n\t * @protected\n\t * @param eventType - Whether we're moving or sorting\n\t * @param draggedElement - The element that's being dragged\n\t * @param list - The list into which we're dragging the element\n\t */\n\tprotected dropPredicateHandler(\n\t\teventType: 'sorting' | 'moving',\n\t\tdraggedElement: CdkDrag<NgxConfigurableLayoutItemEntity>,\n\t\tlist: CdkDropList\n\t): boolean {\n\t\t// Iben: If no predicate is passed, we always return true\n\t\tconst dropPredicate = this.dropPredicate();\n\t\tif (!dropPredicate) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Iben: Fetch the index of the target\n\t\tconst targetRowIndex = parseInt(list.id.split('ngx-layout-row-')[1]);\n\n\t\t// Iben: Fetch the current element\n\t\tconst element = draggedElement.data;\n\n\t\t// Iben: Call the dropPredicate with the needed information\n\t\treturn dropPredicate({\n\t\t\teventType,\n\t\t\tcurrentGrid: [...this.form.value],\n\t\t\telement,\n\t\t\tshowInactive: this.showInactive(),\n\t\t\ttargetRowIndex,\n\t\t});\n\t}\n\n\t// Component internal working\n\t/**\n\t * Update the item layout template order.\n\t */\n\tprotected handleItemTemplates(): void {\n\t\t// Wouter: Clear the current item template record\n\t\tthis.itemTemplateRecord.set({});\n\t\tthis.itemLabelRecord.set({});\n\n\t\tArray.from(this.configurableItemTemplates()).forEach((itemTemplate) => {\n\t\t\tconst { key: keyInput, template: templateInput, label: labelInput } = itemTemplate;\n\t\t\tconst template = templateInput();\n\t\t\tconst key = keyInput();\n\t\t\tconst label = labelInput();\n\n\t\t\t// Wouter: Update the item template record with the unique column key and its template ref\n\t\t\tthis.itemTemplateRecord.update((value) => ({ ...value, [key]: template }));\n\n\t\t\tthis.itemLabelRecord.update((value) => ({\n\t\t\t\t...value,\n\t\t\t\t[key]: label || key,\n\t\t\t}));\n\t\t});\n\t}\n}\n","<div\n\tclass=\"ngx-layout-grid\"\n\tcdkDropListGroup\n\tngxAccessibleDragAndDropHost\n\t[ngxAccessibleDragAndDropHostDescription]=\"description()\"\n\t[class.ngx-layout-equal-size]=\"itemSize() === 'equal'\"\n\t[style.row-gap]=\"rowGap()\"\n\t[class.ngx-layout-grid-inactive-shown]=\"showInactive()\"\n>\n\t@for (row of form.value; track index; let index = $index) {\n\t<ul\n\t\tclass=\"ngx-layout-row\"\n\t\tcdkDropList\n\t\tngxAccessibleDragAndDropContainer\n\t\tcdkDropListOrientation=\"horizontal\"\n\t\t[cdkDropListDisabled]=\"!allowDragAndDrop() && !form.disabled\"\n\t\t[ngxAccessibleDragAndDropContainerIndex]=\"index\"\n\t\t[ngxAccessibleDragAndDropContainerLabel]=\"rowLabel() ? rowLabel() + ' ' + (index + 1) : ''\"\n\t\t[id]=\"'ngx-layout-row-' + index\"\n\t\t[ngStyle]=\"\n\t\t\t{ keys: form.value, showInactive: showInactive() }\n\t\t\t\t| ngxConfigurableLayoutItemSize : itemSize()\n\t\t\"\n\t\t[style.column-gap]=\"columnGap()\"\n\t\t[cdkDropListSortPredicate]=\"beforeSort\"\n\t\t[cdkDropListEnterPredicate]=\"beforeDrop\"\n\t\t(cdkDropListDropped)=\"drop($event)\"\n\t>\n\t\t@for (item of row; track item.key; let index = $index) { @if\n\t\t(itemTemplateRecord()[item.key]) { @if (showInactive() || item.isActive) {\n\t\t<li\n\t\t\tclass=\"ngx-layout-item\"\n\t\t\tcdkDrag\n\t\t\tngxAccessibleDragAndDropItem\n\t\t\tcdkDragPreviewContainer=\"parent\"\n\t\t\t[class.ngx-layout-item-inactive]=\"!item.isActive\"\n\t\t\t[class.ngx-layout-item-disabled]=\"item.disabled\"\n\t\t\t[cdkDragData]=\"item\"\n\t\t\t[ngxAccessibleDragAndDropItemIndex]=\"index\"\n\t\t\t[ngxAccessibleDragAndDropItemId]=\"item.key\"\n\t\t\t[ngxAccessibleDragAndDropLabel]=\"itemLabelRecord()[item.key] || itemLabel()\"\n\t\t\t[ngxAccessibleDragAndDropDisabled]=\"\n\t\t\t\titem.disabled || (!allowDragAndDrop() && !form.disabled)\n\t\t\t\"\n\t\t\t(ngxAccessibleDragAndDropItemMove)=\"move($event)\"\n\t\t>\n\t\t\t<ng-template [ngTemplateOutlet]=\"itemTemplateRecord()[item.key]\"></ng-template>\n\t\t\t@if (!form.disabled && showInactive() && !item.disabled) {\n\t\t\t<ng-template\n\t\t\t\t[ngTemplateOutlet]=\"checkboxTemplate() || defaultCheckBoxTmpl\"\n\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t\t\t\t$implicit: isActiveFormRecord.controls[item.key],\n\t\t\t\t\t\t\t\t\t\tlabel: itemLabelRecord()[item.key] || itemLabel() || item.key,\n\t\t\t\t\t\t\t\t\t}\"\n\t\t\t>\n\t\t\t</ng-template>\n\t\t\t}\n\t\t\t<div *cdkDragPlaceholder class=\"ngx-layout-drag-placeholder\"></div>\n\t\t</li>\n\t\t} } }\n\t</ul>\n\t}\n</div>\n\n<ng-template #defaultCheckBoxTmpl let-control let-label=\"label\">\n\t<input\n\t\tclass=\"ngx-layout-item-toggle\"\n\t\ttype=\"checkbox\"\n\t\t[formControl]=\"control\"\n\t\t[attr.aria-label]=\"'Toggle ' + label\"\n\t/>\n</ng-template>\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tDestroyRef,\n\tinject,\n\tinput,\n\tInputSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { combineLatest, distinctUntilChanged, Observable, shareReplay, Subject, tap } from 'rxjs';\n\nimport { NgxAccordionOpenBehavior, NgxAccordionOpenStateBehavior } from '../../types';\n\nimport { NgxAccordionItemComponent } from './item/accordion-item.component';\n\n/**\n * A WCAG/ARIA compliant implementation of the accordion pattern.\n *\n * https://www.w3.org/WAI/ARIA/apg/patterns/accordion/\n */\n@Component({\n\tselector: 'ngx-accordion',\n\ttemplate: '<ng-content/>',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'ngx-accordion',\n\t},\n})\nexport class NgxAccordionComponent {\n\t/**\n\t * An instance of the DestroyRef\n\t */\n\tprotected readonly destroyRef: DestroyRef = inject(DestroyRef);\n\t/**\n\t * A subject to hold a registered event\n\t */\n\tprotected readonly itemRegisteredSubject: Subject<void> = new Subject<void>();\n\n\t/**\n\t * An observable based on the itemRegisteredSubject, sharing its replay\n\t */\n\tprotected readonly itemRegistered$: Observable<void> = this.itemRegisteredSubject\n\t\t.asObservable()\n\t\t.pipe(shareReplay(1));\n\n\t/**\n\t * A list of all accordion items\n\t */\n\tpublic items: NgxAccordionItemComponent[] = [];\n\n\t/**\n\t * Open the specific items in the accordion\n\t */\n\tpublic open: InputSignal<NgxAccordionOpenBehavior> = input();\n\n\t/**\n\t * Whether all or just one item can be opened at the same time; by default this is `all`\n\t */\n\tpublic openStateBehavior: InputSignal<NgxAccordionOpenStateBehavior> = input('all');\n\n\tconstructor() {\n\t\tcombineLatest([toObservable(this.open), this.itemRegistered$])\n\t\t\t.pipe(\n\t\t\t\tdistinctUntilChanged(),\n\t\t\t\ttap(([open]) => {\n\t\t\t\t\t// Iben: Use a setTimeOut so we wait an extra tick\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tif (open === 'all') {\n\t\t\t\t\t\t\tthis.items.forEach((item) => item.updateAccordionItemState(true));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Iben: Open specific items\n\t\t\t\t\t\t\tconst indexes =\n\t\t\t\t\t\t\t\topen === 'first' ? [0] : Array.isArray(open) ? open : [open];\n\n\t\t\t\t\t\t\tindexes.forEach((index) => {\n\t\t\t\t\t\t\t\tthis.items[index]?.updateAccordionItemState(true);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t\ttakeUntilDestroyed(this.destroyRef)\n\t\t\t)\n\t\t\t.subscribe();\n\t}\n\n\t/**\n\t * Register an accordion item to the container\n\t *\n\t * @param item - An accordion item\n\t */\n\tpublic registerItem(item: NgxAccordionItemComponent): void {\n\t\tthis.itemRegisteredSubject.next();\n\t\tthis.items.push(item);\n\t}\n\n\t/**\n\t * Removes an accordion item from the container\n\t *\n\t * @param item - An accordion item\n\t */\n\tpublic removeItem(item: NgxAccordionItemComponent): void {\n\t\t// Iben: Get the index of the item\n\t\tconst index = this.items.findIndex(({ id }) => id === item.id);\n\n\t\t// Iben: If no item was found, we early exit\n\t\tif (index === -1) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Iben: Remove the item\n\t\tthis.items = [...this.items.slice(0, index), ...this.items.slice(index + 1)];\n\t}\n\n\t/**\n\t * Moves the focus to an accordion\n\t *\n\t * @param  id - The id of the current item\n\t * @param  direction - The direction we move in\n\t */\n\tpublic moveFocus(id: string, direction: 'up' | 'down' | 'first' | 'last') {\n\t\t// Iben: If we go to the first or last accordion, we don't need to find the index\n\t\tif (direction === 'first' || direction === 'last') {\n\t\t\tthis.items[direction === 'first' ? 0 : this.items.length - 1].focus();\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Iben: Find the index and move to the next\n\t\tconst index = this.items.findIndex((item) => id === item.id);\n\n\t\tthis.items[direction === 'down' ? index + 1 : index - 1]?.focus();\n\t}\n\n\t/**\n\t * Update the state of other accordion items based on the openStateBehavior\n\t *\n\t * @param id - The recently opened item\n\t */\n\tpublic handleOpenState(id: string): void {\n\t\t// Iben: If we can open all items, we early exit\n\t\tif (this.openStateBehavior() !== 'one') {\n\t\t\treturn;\n\t\t}\n\n\t\t// Iben: Close all other items in the accordion\n\t\tthis.items.forEach((item) => {\n\t\t\tif (item.id !== id) {\n\t\t\t\titem.updateAccordionItemState(false);\n\t\t\t}\n\t\t});\n\t}\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n\tAfterViewInit,\n\tChangeDetectionStrategy,\n\tChangeDetectorRef,\n\tComponent,\n\tElementRef,\n\tHostListener,\n\tinject,\n\tOnDestroy,\n\tOnInit,\n\tRenderer2,\n\tTemplateRef,\n\tinput,\n\tviewChild,\n\tcontentChild,\n\tWritableSignal,\n\tsignal,\n} from '@angular/core';\nimport { v4 as uuid } from 'uuid';\n\nimport { NgxAccordionComponent } from '../accordion.component';\n\n/**\n * A WCAG/ARIA compliant implementation of an item in the accordion pattern.\n *\n * https://www.w3.org/WAI/ARIA/apg/patterns/accordion/\n */\n@Component({\n\tselector: 'ngx-accordion-item',\n\ttemplateUrl: './accordion-item.component.html',\n\tstyleUrl: './accordion-item.component.scss',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\timports: [NgTemplateOutlet],\n\thost: {\n\t\tclass: 'ngx-accordion-item',\n\t},\n})\nexport class NgxAccordionItemComponent implements OnInit, AfterViewInit, OnDestroy {\n\t/**\n\t * An instance of the parent NgxAccordionComponent\n\t */\n\tprotected readonly parent: NgxAccordionComponent = inject(NgxAccordionComponent);\n\n\t/**\n\t * An instance of the ChangeDetectorRef\n\t */\n\tprotected readonly cdRef: ChangeDetectorRef = inject(ChangeDetectorRef);\n\n\t/**\n\t * An instance of the Renderer2\n\t */\n\tprotected readonly renderer: Renderer2 = inject(Renderer2);\n\n\t/**\n\t * The details element\n\t */\n\tpublic readonly detailsElement = viewChild<ElementRef>('details');\n\n\t/**\n\t * The summary element\n\t */\n\tpublic readonly summaryElement = viewChild<ElementRef>('summary');\n\n\t/**\n\t * The template for the content\n\t */\n\tpublic readonly contentTemplate = contentChild<TemplateRef<any>>('contentTmpl');\n\n\t/**\n\t * The template for the header\n\t */\n\tpublic readonly headerTemplate = contentChild<TemplateRef<any>>('headerTmpl');\n\n\t/**\n\t * Moves the focus to the accordion item above the current one\n\t */\n\t@HostListener('keydown.ArrowUp', ['$event']) arrowUp(event: Event) {\n\t\tthis.handleWhenFocussed(() => {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopImmediatePropagation();\n\t\t\tthis.parent.moveFocus(this.id, 'up');\n\t\t});\n\t}\n\n\t/**\n\t * Moves the focus to the accordion item below the current one\n\t */\n\t@HostListener('keydown.ArrowDown', ['$event']) arrowDown(event: Event) {\n\t\tthis.handleWhenFocussed(() => {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopImmediatePropagation();\n\t\t\tthis.parent.moveFocus(this.id, 'down');\n\t\t});\n\t}\n\n\t/**\n\t * Moves the focus to the first accordion item\n\t */\n\t@HostListener('keydown.Home') home() {\n\t\tthis.handleWhenFocussed(() => {\n\t\t\tthis.parent.moveFocus(this.id, 'first');\n\t\t});\n\t}\n\n\t/**\n\t * Moves the focus to the last accordion item\n\t */\n\t@HostListener('keydown.End') end() {\n\t\tthis.handleWhenFocussed(() => {\n\t\t\tthis.parent.moveFocus(this.id, 'last');\n\t\t});\n\t}\n\n\t/**\n\t * Whether the accordion item is disabled\n\t */\n\tpublic readonly disabled = input<boolean>(false);\n\n\t/**\n\t * The id of the accordion item\n\t */\n\tpublic readonly id: string = uuid();\n\n\t/**\n\t * Whether the accordion item is open\n\t */\n\tpublic isOpen: WritableSignal<boolean> = signal(false);\n\n\t/**\n\t * Whether the accordion item is focussed\n\t */\n\tprotected hasFocus: WritableSignal<boolean> = signal(false);\n\n\t/**\n\t * Updates the current open/closed state of the accordion item, regardless of the disabled state\n\t */\n\tpublic updateAccordionItemState(isOpen: boolean): void {\n\t\t// Iben: Sets the item to open and updates the parent state\n\t\tthis.isOpen.set(isOpen);\n\n\t\t// Iben: If the item is opened, we update the other items\n\t\tif (isOpen) {\n\t\t\tthis.parent.handleOpenState(this.id);\n\t\t}\n\n\t\t// Iben: Trigger the visual changes\n\t\tthis.cdRef.detectChanges();\n\t}\n\t/**\n\t * Set the focus on the summary item\n\t */\n\tpublic focus() {\n\t\tthis.summaryElement()?.nativeElement.focus();\n\t}\n\n\t/**\n\t * Set the focus state of the accordion item\n\t *\n\t * @param hasFocus - Whether the item has focus\n\t */\n\tpublic setFocus(hasFocus: boolean) {\n\t\tthis.hasFocus.set(hasFocus);\n\t}\n\n\t/**\n\t * Register the item to its parent\n\t */\n\tpublic ngOnInit(): void {\n\t\tthis.parent.registerItem(this);\n\t}\n\n\t/**\n\t * Listen to the default HTML events of the details object\n\t */\n\tpublic ngAfterViewInit(): void {\n\t\t// Iben: If for some reason no accordion item is found, we return\n\t\tconst detailsElement = this.detailsElement();\n\t\tif (!detailsElement?.nativeElement) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Iben: Prevent the accordion from being opened if it is disabled\n\t\tthis.renderer.listen(detailsElement.nativeElement, 'click', (event: Event) => {\n\t\t\tif (this.disabled()) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t});\n\n\t\t// Iben: Prevent the accordion from being opened if it is disabled (keyboard events)\n\t\tthis.renderer.listen(detailsElement.nativeElement, 'keydown', (event: KeyboardEvent) => {\n\t\t\tif (this.disabled() && (event.key === ' ' || event.key === 'Enter')) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t});\n\n\t\t// Iben: Listen to the open state of details and update the internal one\n\t\tthis.renderer.listen(detailsElement.nativeElement, 'toggle', (event: ToggleEvent) => {\n\t\t\tthis.updateAccordionItemState(event.newState === 'open');\n\t\t});\n\t}\n\n\t/**\n\t * Remove the item from its parent when destroyed\n\t */\n\tpublic ngOnDestroy(): void {\n\t\tthis.parent.removeItem(this);\n\t}\n\n\t/**\n\t * Only perform an action when the item has focus\n\t *\n\t * @param  action - The provided action\n\t */\n\tprotected handleWhenFocussed(action: () => void) {\n\t\t// Iben: Early exit if there's no focus\n\t\tif (!this.hasFocus()) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Iben: Perform the action\n\t\taction();\n\t}\n}\n","<details #details [open]=\"isOpen()\">\n\t<summary\n\t\tclass=\"ngx-accordion-header\"\n\t\t#summary\n\t\t[class.is-disabled]=\"disabled()\"\n\t\t[class.is-open]=\"isOpen()\"\n\t\t[attr.disabled]=\"disabled()\"\n\t\t[attr.aria-disabled]=\"disabled()\"\n\t\t[id]=\"id\"\n\t\t[attr.aria-controls]=\"'accordion-content-' + id\"\n\t\t[attr.aria-expanded]=\"isOpen()\"\n\t\t[attr.tabindex]=\"disabled() ? -1 : 0\"\n\t\t(focus)=\"setFocus(true)\"\n\t\t(blur)=\"setFocus(false)\"\n\t>\n\t\t<ng-template\n\t\t\t[ngTemplateOutlet]=\"headerTemplate()\"\n\t\t\t[ngTemplateOutletContext]=\"{ $implicit: isOpen }\"\n\t\t/>\n\t</summary>\n\n\t<div\n\t\tclass=\"ngx-accordion-content\"\n\t\t[class.is-open]=\"isOpen()\"\n\t\trole=\"region\"\n\t\t[id]=\"'accordion-content-' + id\"\n\t\t[attr.aria-labelledby]=\"id\"\n\t>\n\t\t<ng-template\n\t\t\t[ngTemplateOutlet]=\"contentTemplate()\"\n\t\t\t[ngTemplateOutletContext]=\"{ $implicit: isOpen }\"\n\t\t/>\n\t</div>\n</details>\n","import { NgxAccordionComponent } from './accordion.component';\nimport { NgxAccordionItemComponent } from './item/accordion-item.component';\n\nexport * from './accordion.component';\nexport * from './item/accordion-item.component';\nexport const NgxAccordion = [NgxAccordionComponent, NgxAccordionItemComponent] as const;\n","import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  Component,\n  ElementRef,\n  inject,\n  OnChanges,\n  OnDestroy,\n  input,\n  OutputEmitterRef,\n  output,\n  viewChild\n} from '@angular/core';\nimport { NgxWindowService, simpleChangeHasChanged } from '@ibenvandeveire/ngx-core';\nimport { Subject, takeUntil, tap } from 'rxjs';\n\nimport { NgxImageMarkerService } from '../../services';\nimport {\n\tNgxImageMarker,\n\tNgxImageMarkerItem,\n\tNgxImageMarkerState,\n\tNgxImageMarkerTypes,\n} from '../../types';\n\n/**\n * A component wrapper for MarkerJs views\n *\n * https://markerjs.com/\n */\n\n// TODO: Iben: Once we figured out how we'll share the FormAccessors with other packages, we should make this a ControlValueAccessor\n@Component({\n\tselector: 'ngx-image-marker',\n\ttemplate: `<img\n\t\tclass=\"ngx-image-marker-image\"\n\t\t#imageElement\n\t\t[alt]=\"imageDescription()\"\n\t\t[src]=\"image()\"\n\t/>`,\n\tstyleUrl: './image-marker.component.scss',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'ngx-image-marker',\n\t},\n})\nexport class NgxImageMarkerComponent implements AfterViewInit, OnChanges, OnDestroy {\n\t/**\n\t * An instance of the NgxImageMarkerService\n\t */\n\tprotected readonly imageMarkerService: NgxImageMarkerService = inject(NgxImageMarkerService);\n\n\t/**\n\t * An instance of the NgxWindowService\n\t */\n\tprotected readonly windowService: NgxWindowService = inject(NgxWindowService);\n\n\t/**\n\t * An instance of the ElementRef\n\t */\n\tprotected readonly elementRef: ElementRef = inject(ElementRef);\n\n\t/**\n\t * The currently created marker\n\t */\n\tprotected currentMarker: NgxImageMarker;\n\n\t/**\n\t * A subject holding the destroy state of the marker\n\t */\n\tprotected readonly markerDestroyedSubject: Subject<void> = new Subject<void>();\n\n\t/**\n\t * The rendered image element\n\t */\n\tpublic readonly imageElement = viewChild<ElementRef>('imageElement');\n\n\t/**\n\t * The url to the image we wish to render\n\t */\n\tpublic readonly image = input.required<string>();\n\n\t/**\n\t * A WCAG/WAI-ARIA compliant description of the image\n\t */\n\tpublic readonly imageDescription = input.required<string>();\n\n\t/**\n\t * The start data we wish to render\n\t */\n\tpublic readonly startState = input<NgxImageMarkerState>();\n\n\t/**\n\t * Whether we can edit the view, by default this is true\n\t */\n\tpublic readonly canEdit = input<boolean>(true);\n\n\t/**\n\t * An optional current zoom level\n\t */\n\tpublic readonly currentZoomLevel = input<number>();\n\n\t/**\n\t * An optional amount of times we can zoom in and out\n\t */\n\tpublic readonly zoomLevels = input<number[]>();\n\n\t/**\n\t * An optional record of types of Markerjs markers we wish to render\n\t */\n\tpublic readonly markerTypes = input<NgxImageMarkerTypes>();\n\n\t/**\n\t * Emits when the state has been updated\n\t */\n\tpublic stateUpdated: OutputEmitterRef<NgxImageMarkerState> = output<NgxImageMarkerState>();\n\n\t/**\n\t * Emits when a marker is clicked when the view is in readonly mode\n\t */\n\tpublic markerClicked: OutputEmitterRef<NgxImageMarkerItem> = output<NgxImageMarkerItem>();\n\n\tngAfterViewInit(): void {\n\t\t// Iben: Create the initial marker\n\t\tthis.createMarker();\n\t}\n\n\tngOnChanges(changes: any): void {\n\t\t// Iben: If no marker exists or if the image has not rendered, early exit\n\t\tif (!this.currentMarker || !this.imageElement()) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Iben: Check if there are changes to the state or the configuration when there is a marker\n\t\tconst hasChanges =\n\t\t\tthis.currentMarker &&\n\t\t\t(simpleChangeHasChanged(changes.startState) ||\n\t\t\t\tsimpleChangeHasChanged(changes.canEdit) ||\n\t\t\t\tsimpleChangeHasChanged(changes.markerTypes) ||\n\t\t\t\tsimpleChangeHasChanged(changes.currentZoomLevel) ||\n\t\t\t\tsimpleChangeHasChanged(changes.zoomLevels));\n\n\t\t// Iben: Recreate the marker whenever the configuration is adjusted\n\t\tif (!this.currentMarker || hasChanges) {\n\t\t\tthis.createMarker();\n\t\t}\n\t}\n\n\tngOnDestroy(): void {\n\t\t// Iben: Close the marker\n\t\tthis.currentMarker.close();\n\n\t\t// Iben: Complete the destroy subject\n\t\tthis.markerDestroyedSubject.next();\n\t\tthis.markerDestroyedSubject.complete();\n\t}\n\n\t/**\n\t * Creates a MarkerJs view based on the provided configuration\n\t */\n\tprotected createMarker() {\n\t\t// Iben: Only create the image when we're in the browser\n\t\tthis.windowService.runInBrowser(() => {\n\t\t\t// Iben: Close the existing marker if needed\n\t\t\tif (this.currentMarker) {\n\t\t\t\tthis.currentMarker.close();\n\t\t\t\tthis.markerDestroyedSubject.next();\n\t\t\t}\n\n\t\t\t// Iben: Create a new marker view based on the provided configuration\n\t\t\tconst currentZoomLevel = this.currentZoomLevel();\n\t\t\tconst zoomLevels = this.zoomLevels();\n\t\t\tthis.currentMarker = this.imageMarkerService.createImageMarker(\n\t\t\t\tthis.imageElement().nativeElement,\n\t\t\t\tthis.elementRef.nativeElement,\n\t\t\t\t{\n\t\t\t\t\tmode: this.canEdit() ? 'edit' : 'view',\n\t\t\t\t\tallowZoom: true,\n\t\t\t\t\tdefaultState: this.startState() || undefined,\n\t\t\t\t\tmarkerTypes: this.markerTypes(),\n\t\t\t\t\tzoom:\n\t\t\t\t\t\tcurrentZoomLevel !== undefined && zoomLevels\n\t\t\t\t\t\t\t? { current: currentZoomLevel, levels: zoomLevels }\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t}\n\t\t\t);\n\n\t\t\t// Iben: Listen to the valueChanges based on the provided type.\n\t\t\tif (this.currentMarker.mode === 'edit') {\n\t\t\t\tthis.currentMarker.valueChanges\n\t\t\t\t\t.pipe(\n\t\t\t\t\t\ttap((value) => {\n\t\t\t\t\t\t\tthis.stateUpdated.emit(value);\n\t\t\t\t\t\t}),\n\t\t\t\t\t\ttakeUntil(this.markerDestroyedSubject)\n\t\t\t\t\t)\n\t\t\t\t\t.subscribe();\n\t\t\t} else {\n\t\t\t\tthis.currentMarker.valueChanges\n\t\t\t\t\t.pipe(\n\t\t\t\t\t\ttap((value) => {\n\t\t\t\t\t\t\tthis.markerClicked.emit(value);\n\t\t\t\t\t\t}),\n\t\t\t\t\t\ttakeUntil(this.markerDestroyedSubject)\n\t\t\t\t\t)\n\t\t\t\t\t.subscribe();\n\t\t\t}\n\t\t});\n\t}\n}\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { NgComponentOutlet, NgTemplateOutlet } from '@angular/common';\nimport {\n\tComponent,\n\tcontentChild,\n\teffect,\n\tinject,\n\tOnInit,\n\tSignal,\n\tTemplateRef,\n\tChangeDetectionStrategy,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { RouterModule } from '@angular/router';\n\nimport { NgxMobileLayoutService } from '../../services';\nimport { NgxMobileLayout, NgxMobileLayoutOutletParams } from '../../types';\n\n/**\n * A component used to render a mobile-first layout\n */\n@Component({\n\tselector: 'ngx-mobile-layout',\n\timports: [NgComponentOutlet, NgTemplateOutlet, RouterModule, A11yModule],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplateUrl: './mobile-layout.component.html',\n})\nexport class NgxMobileLayoutComponent implements OnInit {\n\t/**\n\t * The previous active element\n\t */\n\tprotected previousActiveElement: HTMLElement;\n\n\t/**\n\t * The instance of the NgxMobileLayoutService\n\t */\n\tprotected readonly layoutService: NgxMobileLayoutService = inject(NgxMobileLayoutService);\n\n\t/**\n\t * The currently displayed layout\n\t */\n\tprotected layout: Signal<NgxMobileLayout> = toSignal(this.layoutService.layout$);\n\n\t/**\n\t * Whether the flyout needs to be shown\n\t */\n\tprotected readonly flyoutShown: Signal<boolean> = this.layoutService.flyoutShown;\n\n\t/**\n\t * Whether the aside needs to be shown\n\t */\n\tprotected readonly asideShown: Signal<boolean> = this.layoutService.asideShown;\n\n\t/**\n\t * The params context for the aside\n\t */\n\tprotected readonly asideParams: Signal<NgxMobileLayoutOutletParams> =\n\t\tthis.layoutService.asideParams;\n\n\t/**\n\t * The params context for the flyout\n\t */\n\tprotected readonly flyoutParams: Signal<NgxMobileLayoutOutletParams> =\n\t\tthis.layoutService.flyoutParams;\n\n\t/**\n\t * An optional template we can pass to replace the default routerOutlet\n\t */\n\tpublic readonly contentTemplate = contentChild<TemplateRef<any>>('contentTmpl');\n\n\tconstructor() {\n\t\t// Iben: Track the active element when aside or flyout opens to restore focus when they close\n\t\teffect(() => {\n\t\t\tconst isOpen = this.asideShown() || this.flyoutShown();\n\n\t\t\tif (isOpen) {\n\t\t\t\t// Iben: Store the active element before the dialog opens\n\t\t\t\tif (!this.previousActiveElement && document.activeElement instanceof HTMLElement) {\n\t\t\t\t\tthis.previousActiveElement = document.activeElement;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Iben: Restore focus to the original triggering element\n\t\t\t\tif (this.previousActiveElement) {\n\t\t\t\t\tthis.previousActiveElement.focus();\n\t\t\t\t\tthis.previousActiveElement = null;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tngOnInit(): void {\n\t\t// Iben: Sets up the initial layout if one was provided\n\t\tthis.layoutService.setUpInitialLayout();\n\t}\n}\n","@if (layout()) {\n<main class=\"ngx-mobile-layout-main\">\n\t@if (layout().header) {\n\t<header class=\"ngx-mobile-layout-header\">\n\t\t@if (layout().header.left) {\n\t\t<ng-template [ngComponentOutlet]=\"layout().header.left\" />\n\t\t}\n\t\t<ng-template [ngComponentOutlet]=\"layout().header.main\" />\n\n\t\t@if (layout().header.right) {\n\t\t<ng-template [ngComponentOutlet]=\"layout().header.right\" />\n\t\t}\n\t</header>\n\t} @if (layout().navigation) {\n\t<nav class=\"ngx-mobile-layout-navigation\">\n\t\t<ng-template [ngComponentOutlet]=\"layout().navigation\" />\n\t</nav>\n\t} @if (layout().aside && asideShown()) {\n\t<aside\n\t\tclass=\"ngx-mobile-layout-aside\"\n\t\tanimate.enter=\"ngx-mobile-layout-aside-in\"\n\t\tanimate.leave=\"ngx-mobile-layout-aside-out\"\n\t\trole=\"dialog\"\n\t\taria-modal=\"true\"\n\t\t[attr.aria-label]=\"asideParams().label\"\n\t\tcdkTrapFocus\n\t\tcdkTrapFocusAutoCapture\n\t\t(keydown.escape)=\"layoutService.closeAside()\"\n\t>\n\t\t<ng-template\n\t\t\t[ngComponentOutlet]=\"layout().aside\"\n\t\t\t[ngComponentOutletInjector]=\"$safeNavigationMigration(asideParams()?.injector)\"\n\t\t\t[ngComponentOutletInputs]=\"$safeNavigationMigration(asideParams()?.inputs)\"\n\t\t\t[ngComponentOutletEnvironmentInjector]=\"\n\t\t\t\t$safeNavigationMigration(asideParams()?.environmentInjector)\n\t\t\t\"\n\t\t\t[ngComponentOutletContent]=\"$safeNavigationMigration(asideParams()?.content)\"\n\t\t/>\n\t</aside>\n\t}\n\n\t<div class=\"ngx-mobile-layout-content\">\n\t\t@if (contentTemplate()) {\n\t\t<ng-template [ngTemplateOutlet]=\"contentTemplate()\" />\n\t\t} @else {\n\t\t<router-outlet />\n\t\t}\n\t</div>\n\n\t@if (layout().flyout && flyoutShown()) {\n\t<div\n\t\tclass=\"ngx-mobile-layout-flyout\"\n\t\tanimate.enter=\"ngx-mobile-layout-flyout-in\"\n\t\tanimate.leave=\"ngx-mobile-layout-flyout-out\"\n\t\trole=\"dialog\"\n\t\taria-modal=\"true\"\n\t\t[attr.aria-label]=\"flyoutParams().label\"\n\t\tcdkTrapFocus\n\t\tcdkTrapFocusAutoCapture\n\t\t(keydown.escape)=\"layoutService.closeFlyout()\"\n\t>\n\t\t<ng-template\n\t\t\t[ngComponentOutlet]=\"layout().flyout\"\n\t\t\t[ngComponentOutletInjector]=\"$safeNavigationMigration(flyoutParams()?.injector)\"\n\t\t\t[ngComponentOutletInputs]=\"$safeNavigationMigration(flyoutParams()?.inputs)\"\n\t\t\t[ngComponentOutletEnvironmentInjector]=\"\n\t\t\t\t$safeNavigationMigration(flyoutParams()?.environmentInjector)\n\t\t\t\"\n\t\t\t[ngComponentOutletContent]=\"$safeNavigationMigration(flyoutParams()?.content)\"\n\t\t/>\n\t</div>\n\t} @if (layout().footer) {\n\t<footer class=\"ngx-mobile-layout-footer\">\n\t\t<ng-template [ngComponentOutlet]=\"layout().footer\" />\n\t</footer>\n\t}\n</main>\n}\n","import { Directive, OutputEmitterRef, Signal, TemplateRef, input, output } from '@angular/core';\n\nimport { NgxTableSortDirection } from '../../enums/sort-direction.enum';\nimport { NgxTableCypressDataTags, NgxTableSortEvent } from '../../types';\n\n@Directive({\n\tselector: 'ngx-abstract-table-cell',\n\tstandalone: true,\n})\nexport class NgxAbstractTableCellDirective {\n\t/**\n\t * The current sortDirection of the cell\n\t */\n\tpublic sortDirection: NgxTableSortDirection | null = null;\n\n\t/**\n\t * The templates used to set in the table\n\t */\n\tpublic footerTemplate: Signal<TemplateRef<any>>;\n\tpublic headerTemplate: Signal<TemplateRef<any>>;\n\tpublic cellTemplate: Signal<TemplateRef<any>>;\n\n\t/**\n\t * An optional class that can be set for the cell\n\t */\n\tpublic cellClass: string;\n\n\t/**\n\t * The name of the column we want this cell to represent\n\t */\n\tpublic readonly column = input.required<string>();\n\n\t/**\n\t * Whether or not the cell is sortable\n\t */\n\tpublic readonly sortable = input<boolean>(false);\n\n\t/**\n\t * A tag that can be added to a column in the table, set according to the cypress best practices\n\t * See https://docs.cypress.io/guides/references/best-practices#Selecting-Elements\n\t */\n\tpublic readonly cypressDataTags = input<NgxTableCypressDataTags>();\n\n\t/**\n\t * Whether the content of a cell is editable. By default, this is set to false\n\t */\n\tpublic readonly editable = input<boolean>(false);\n\n\t/**\n\t * Emits the sortable event if a column is sortable\n\t */\n\tpublic sort: OutputEmitterRef<NgxTableSortEvent> = output<NgxTableSortEvent>();\n\n\t/**\n\t * Handles the sorting click events\n\t */\n\tpublic handleSort(): void {\n\t\t// Iben: Setup the sort direction\n\t\tlet newSortDirection = NgxTableSortDirection.ASCENDING;\n\n\t\t// Iben: If a an existing sorting direction exists, we switch based on the ones we have\n\t\tif (this.sortDirection) {\n\t\t\tnewSortDirection =\n\t\t\t\tthis.sortDirection === NgxTableSortDirection.ASCENDING\n\t\t\t\t\t? NgxTableSortDirection.DESCENDING\n\t\t\t\t\t: NgxTableSortDirection.ASCENDING;\n\t\t}\n\n\t\t// Iben: Set the internal sorting direction\n\t\tthis.setSortDirection(newSortDirection);\n\n\t\t// Iben: Emit the sorting event\n\t\tthis.sort.emit({\n\t\t\tdirection: this.sortDirection,\n\t\t\tcolumn: this.column(),\n\t\t});\n\t}\n\n\t/**\n\t * Resets the sort direction back to null\n\t */\n\tpublic resetSortDirection(): void {\n\t\tthis.sortDirection = null;\n\t}\n\n\t/**\n\t * Sets the sorting direction based on the provided direction\n\t *\n\t * @param direction - The provided direction\n\t */\n\tpublic setSortDirection(direction: NgxTableSortDirection): void {\n\t\tthis.sortDirection = direction;\n\t}\n}\n","import { CurrencyPipe } from '@angular/common';\nimport {\n\tChangeDetectionStrategy,\n\tComponent,\n\tTemplateRef,\n\tcontentChild,\n\tinput,\n\tviewChild,\n} from '@angular/core';\n\nimport { NgxAbstractTableCellDirective } from './cell.directive';\n\n@Component({\n\tselector: 'ngx-table-currency-cell',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tproviders: [\n\t\t{\n\t\t\tprovide: NgxAbstractTableCellDirective,\n\t\t\tuseExisting: NgxCurrencyTableCellComponent,\n\t\t},\n\t],\n\ttemplate: `\n\t\t<ng-template #cellTmpl let-item>\n\t\t\t{{ item | currency : currency() }}\n\t\t</ng-template>\n\t`,\n\timports: [CurrencyPipe],\n})\nexport class NgxCurrencyTableCellComponent extends NgxAbstractTableCellDirective {\n\t/**\n\t * The [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) format of the provided amount, by default `EUR`\n\t */\n\tpublic readonly currency = input('EUR');\n\n\t/**\n\t * A template for the header of the cell\n\t */\n\n\tpublic override readonly headerTemplate = contentChild<TemplateRef<any>>('headerTmpl');\n\t/**\n\t * A template for the footer of the cell\n\t */\n\n\tpublic override readonly footerTemplate = contentChild<TemplateRef<any>>('footerTmpl');\n\n\t/**\n\t * ViewChild that represents the cell template\n\t */\n\n\tpublic override readonly cellTemplate = viewChild<TemplateRef<any>>('cellTmpl');\n\n\t/**\n\t * A generic class to indicate that this is a currency cell\n\t */\n\tpublic override cellClass: string = 'ngx-currency-table-cell';\n}\n","import { DatePipe } from '@angular/common';\nimport {\n\tChangeDetectionStrategy,\n\tComponent,\n\tTemplateRef,\n\tcontentChild,\n\tinput,\n\tviewChild,\n} from '@angular/core';\n\nimport { NgxTableGetPipe } from '../../pipes/get-pipe/get.pipe';\n\nimport { NgxAbstractTableCellDirective } from './cell.directive';\n\n@Component({\n\tselector: 'ngx-table-date-cell',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tproviders: [\n\t\t{\n\t\t\tprovide: NgxAbstractTableCellDirective,\n\t\t\tuseExisting: NgxDateTableCellComponent,\n\t\t},\n\t],\n\ttemplate: `\n\t\t<ng-template #cellTmpl let-item let-row=\"row\">\n\t\t\t@if (rowKey()) { @if (row | getProp: rowKey(); as rowItem) {\n\t\t\t<time>\n\t\t\t\t{{ rowItem | date : format() }}\n\t\t\t</time>\n\t\t\t} @else {\n\t\t\t<i>{{ emptyLabel() }}</i>\n\t\t\t} } @else { @if (item) {\n\t\t\t<time>{{ (itemKey() ? item[itemKey()] : item) | date : format() }}</time>\n\t\t\t} @else {\n\t\t\t<i>{{ emptyLabel() }}</i>\n\t\t\t} }\n\t\t</ng-template>\n\t`,\n\timports: [DatePipe, NgxTableGetPipe],\n})\nexport class NgxDateTableCellComponent extends NgxAbstractTableCellDirective {\n\t/**\n\t * The format of the provided date, by default `dd/MM/yyyy`\n\t */\n\tpublic readonly format = input('dd/MM/yyyy');\n\n\t/**\n\t * The label to display when date is invalid or empty\n\t */\n\tpublic readonly emptyLabel = input('Empty date');\n\n\t/**\n\t * In case the date is nested in an object, we can provide a key to fetch it\n\t */\n\tpublic readonly itemKey = input<string>();\n\n\t/**\n\t * In case the date is nested in the row, we can provide a key to fetch it\n\t */\n\tpublic readonly rowKey = input<string>();\n\n\t/**\n\t * A template for the header of the cell\n\t */\n\n\tpublic override readonly headerTemplate = contentChild<TemplateRef<unknown>>('headerTmpl');\n\t/**\n\t * A template for the footer of the cell\n\t */\n\n\tpublic override readonly footerTemplate = contentChild<TemplateRef<unknown>>('footerTmpl');\n\n\t/**\n\t * ViewChild that represents the cell template\n\t */\n\n\tpublic override readonly cellTemplate = viewChild<TemplateRef<any>>('cellTmpl');\n\n\t/**\n\t * A generic class to indicate that this is a date cell\n\t */\n\tpublic override cellClass: string = 'ngx-date-table-cell';\n}\n","import { Directive, TemplateRef, contentChild } from '@angular/core';\n\nimport { NgxAbstractTableCellDirective } from './cell.directive';\n\n@Directive({\n\tselector: 'ngx-table-cell',\n\tproviders: [\n\t\t{\n\t\t\tprovide: NgxAbstractTableCellDirective,\n\t\t\tuseExisting: NgxTableCellDirective,\n\t\t},\n\t],\n\tstandalone: true,\n})\nexport class NgxTableCellDirective extends NgxAbstractTableCellDirective {\n\t/**\n\t * A template for the header of the cell\n\t */\n\n\tpublic override readonly headerTemplate = contentChild<TemplateRef<any>>('headerTmpl');\n\t/**\n\t * A template for the body of the cell\n\t */\n\n\tpublic override readonly cellTemplate = contentChild<TemplateRef<any>>('cellTmpl');\n\t/**\n\t * A template for the footer of the cell\n\t */\n\n\tpublic override readonly footerTemplate = contentChild<TemplateRef<any>>('footerTmpl');\n}\n","import { NgxAbstractTableCellDirective } from './cell.directive';\nimport { NgxCurrencyTableCellComponent } from './currency-cell.component';\nimport { NgxDateTableCellComponent } from './date-cell.component';\nimport { NgxTableCellDirective } from './generic-cell.directive';\n\nexport * from './cell.directive';\nexport * from './currency-cell.component';\nexport * from './date-cell.component';\nexport * from './generic-cell.directive';\n\nexport const Cells = [\n\tNgxAbstractTableCellDirective,\n\tNgxTableCellDirective,\n\tNgxCurrencyTableCellComponent,\n\tNgxDateTableCellComponent,\n];\n","import { CdkTableModule } from '@angular/cdk/table';\nimport { NgTemplateOutlet, NgClass, NgComponentOutlet } from '@angular/common';\nimport {\n\tAfterContentChecked,\n\tChangeDetectionStrategy,\n\tChangeDetectorRef,\n\tComponent,\n\tDestroyRef,\n\tHostBinding,\n\tInject,\n\tOnInit,\n\tTemplateRef,\n\tWritableSignal,\n\tinject,\n\tsignal,\n\tinput,\n\tOutputEmitterRef,\n\toutput,\n\tcontentChildren,\n\tcontentChild,\n\teffect,\n\tInputSignal,\n\tlinkedSignal,\n\tcomputed,\n\tSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n\tControlValueAccessor,\n\tFormControl,\n\tFormRecord,\n\tNG_VALUE_ACCESSOR,\n\tReactiveFormsModule,\n} from '@angular/forms';\nimport { isEmpty } from 'lodash';\nimport { tap } from 'rxjs/operators';\n\nimport { NgxTreeGrid } from '../../directives';\nimport {\n\tNgxAriaSortPipe,\n\tNgxTableHasObserversPipe,\n\tNgxTableShowHeaderPipe,\n\tNgxTableSortIconPipe,\n\tNgxTableAriaLabelPipe,\n} from '../../pipes';\nimport {\n\tHideHeaderRowOption,\n\tNgxTableConfiguration,\n\tNgxTableConfigurationToken,\n\tShowDetailRowOption,\n} from '../../tokens';\nimport { NgxTableCypressDataTags, NgxTableSortEvent, NgxTableAriaLabels } from '../../types';\nimport {\n\tgenerateNgxTableForm,\n\thandleNgxTableHeaderValueChanges,\n\thandleNgxTableValueChanges,\n\tresetNgxTableForm,\n\twriteNgxTableValue,\n} from '../../utils';\nimport { NgxAbstractTableCellDirective } from '../cell';\n\ninterface TableCellTemplate {\n\theaderTemplate?: Signal<TemplateRef<any>>;\n\tcellTemplate?: Signal<TemplateRef<any>>;\n\tfooterTemplate?: Signal<TemplateRef<any>>;\n\tcellClass?: string;\n}\n\n/**\n * A customizable and accessible data table component.\n *\n * ## Accessibility Guidelines\n * - **Table Cell Templates**: When defining custom templates via `cellTemplate` or `headerTemplate`, ensure all interactive elements are nested inside a native `<button>` or a valid `<a>` element rather than applying click listeners to non-semantic elements.\n * - **Color Contrast & Outlines**: Ensure overridden focus ring CSS variables (e.g. `--ngx-focus-outline`) maintain at least a **3:1** contrast ratio against the background.\n */\n@Component({\n\tselector: 'ngx-table',\n\ttemplateUrl: './ngx-table.component.html',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tstyleUrls: ['./ngx-table.component.scss'],\n\tproviders: [\n\t\t{\n\t\t\tprovide: NG_VALUE_ACCESSOR,\n\t\t\tmulti: true,\n\t\t\tuseExisting: NgxTableComponent,\n\t\t},\n\t],\n\timports: [\n\t\tCdkTableModule,\n\t\tNgTemplateOutlet,\n\t\tNgClass,\n\t\tReactiveFormsModule,\n\t\tNgxTableHasObserversPipe,\n\t\tNgxTableSortIconPipe,\n\t\tNgxTableShowHeaderPipe,\n\t\tNgxAriaSortPipe,\n\t\tNgxTreeGrid,\n\t\tNgComponentOutlet,\n\t\tNgxTableAriaLabelPipe,\n\t],\n\thost: {\n\t\t'[class.ngx-table-loading]': 'loading()',\n\t},\n})\nexport class NgxTableComponent implements AfterContentChecked, ControlValueAccessor, OnInit {\n\t/**\n\t * An instance of the ChangeDetectorRef\n\t */\n\tprotected cdRef: ChangeDetectorRef = inject(ChangeDetectorRef);\n\n\t/**\n\t * An instance of the NgxTableConfiguration\n\t */\n\tpublic readonly ngxTableConfiguration: NgxTableConfiguration = inject(\n\t\tNgxTableConfigurationToken,\n\t\t{ optional: true }\n\t);\n\n\t/**\n\t * An instance of the destroyRef\n\t */\n\tprotected readonly destroyRef: DestroyRef = inject(DestroyRef);\n\n\t/**\n\t * Default class that will be put on the ngx-table component\n\t */\n\t@HostBinding('class') public readonly componentClass =\n\t\tthis.ngxTableConfiguration?.ngxTableClass || '';\n\n\t/**\n\t * onTouch function for the control value accessor\n\t */\n\tprotected onTouch: Function = () => {};\n\t/**\n\t * onChanged function for the control value accessor\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tprotected onChanged: Function = (_: any) => {};\n\n\t/**\n\t * Whether or not the form was generated\n\t */\n\tprotected formGenerated: boolean = false;\n\t/**\n\t * The current sorting event\n\t */\n\tprotected currentSortingEvent: WritableSignal<NgxTableSortEvent | undefined> = linkedSignal(\n\t\t() => {\n\t\t\tthis.handleCurrentSort(this.currentSorting());\n\n\t\t\treturn this.currentSorting();\n\t\t}\n\t);\n\n\t/**\n\t * Keeps a record with the column and it's templates\n\t */\n\tprotected tableCellTemplateRecord: WritableSignal<Record<string, TableCellTemplate>> = signal(\n\t\t{}\n\t);\n\t/**\n\t * Keeps a record of which columns are sortable\n\t */\n\tprotected sortableTableCellRecord: WritableSignal<\n\t\tRecord<string, NgxAbstractTableCellDirective>\n\t> = signal({});\n\t/**\n\t * Keeps a record of which cells have a cypress tag\n\t */\n\tprotected tableCypressRecord: WritableSignal<Record<string, NgxTableCypressDataTags>> = signal(\n\t\t{}\n\t);\n\t/**\n\t * Keeps a record of which cells are editable\n\t */\n\tprotected editableTableCellRecord: WritableSignal<\n\t\tRecord<string, NgxAbstractTableCellDirective>\n\t> = signal({});\n\n\t/**\n\t * An object with all the open rows\n\t */\n\tprotected openedRows: WritableSignal<Record<number, boolean>> = linkedSignal(() => {\n\t\t// Wouter: If all detail rows should be shown by default, we add all indices to the open rows\n\t\tif (this.showDetailRow() === 'always') {\n\t\t\treturn this.data().reduce((previousValue, _, index) => {\n\t\t\t\treturn {\n\t\t\t\t\t...previousValue,\n\t\t\t\t\t[index]: true,\n\t\t\t\t};\n\t\t\t}, {});\n\t\t} else if (\n\t\t\t// Wouter: If the detail row should be shown on single item and there is only one item, we add the first index to the open rows\n\t\t\tthis.showDetailRow() === 'on-single-item' &&\n\t\t\tthis.data().length === 1\n\t\t) {\n\t\t\treturn { 0: true };\n\t\t} else {\n\t\t\t// Iben: If no detail row should be shown due to global config, we reset the open rows\n\t\t\treturn {};\n\t\t}\n\t});\n\n\t/**\n\t * A FormGroup that adds a control for each row\n\t */\n\tprotected readonly rowsFormGroup = new FormRecord<FormControl<boolean>>({});\n\n\t/**\n\t * A computed signal to see if we have a form\n\t */\n\tprotected readonly hasForm: Signal<boolean> = computed(() => {\n\t\t// Iben: Setup the form when the data or selectable state changes\n\t\tif (this.data() && this.selectable()) {\n\t\t\t// Iben: If no form was generated, first generate the form we need\n\t\t\tif (!this.formGenerated) {\n\t\t\t\tgenerateNgxTableForm(this.rowsFormGroup, this.data(), this.selectableKey());\n\n\t\t\t\tthis.formGenerated = true;\n\t\t\t} else {\n\t\t\t\t// Iben: If a form was generated, reset it as required\n\t\t\t\tresetNgxTableForm(\n\t\t\t\t\tthis.rowsFormGroup,\n\t\t\t\t\tthis.data(),\n\t\t\t\t\tthis.selectableKey(),\n\t\t\t\t\tthis.resetFormOnNewData()\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn this.formGenerated;\n\t});\n\n\t/**\n\t * A control for the select all option in the header of the table\n\t */\n\tprotected readonly headerControl = new FormControl();\n\n\t/**\n\t * A control for when we use a radio button\n\t */\n\tprotected readonly radioControl = new FormControl();\n\n\t/**\n\t * Whether the table functions as a treegrid\n\t */\n\tpublic readonly isTreeGrid: Signal<boolean> = computed(() => {\n\t\treturn this.detailRowTemplate() !== undefined;\n\t});\n\n\t/**\n\t * Precalculates the base sort labels for each column.\n\t * This only re-evaluates when the sortable columns are updated.\n\t */\n\tprotected readonly baseSortLabels: Signal<Record<string, string>> = computed(() => {\n\t\tconst record = this.sortableTableCellRecord();\n\t\tconst result: Record<string, string> = {};\n\n\t\tObject.keys(record).forEach((column) => {\n\t\t\tresult[column] = `Sort by ${column}`;\n\t\t});\n\n\t\treturn result;\n\t});\n\n\t/**\n\t * Reactively resolves the full ARIA label for each sort button.\n\t */\n\tpublic readonly sortAriaLabels: Signal<Record<string, string>> = computed(() => {\n\t\t// Iben: Subscribe to the values\n\t\tconst baseLabels = this.baseSortLabels();\n\t\tconst activeSort = this.currentSortingEvent();\n\t\tconst globalAriaLabels = this.ariaLabels();\n\t\tconst result: Record<string, string> = {};\n\n\t\t// Iben: Generate the labels\n\t\tObject.keys(baseLabels).forEach((column) => {\n\t\t\tconst direction = activeSort?.column === column ? activeSort.direction : null;\n\t\t\tconst labelConfiguration =\n\t\t\t\tglobalAriaLabels?.sortColumn ?? this.ngxTableConfiguration?.ariaLabels?.sortColumn;\n\n\t\t\tif (typeof labelConfiguration === 'function') {\n\t\t\t\tresult[column] = labelConfiguration(column, direction);\n\t\t\t} else if (typeof labelConfiguration === 'string') {\n\t\t\t\tresult[column] = labelConfiguration;\n\t\t\t} else {\n\t\t\t\t// Iben: Fallback to the standard English label\n\t\t\t\tconst directionSuffix = direction\n\t\t\t\t\t? `, currently sorted ${direction.toLowerCase()}`\n\t\t\t\t\t: '';\n\t\t\t\tresult[column] = `${baseLabels[column]}${directionSuffix}`;\n\t\t\t}\n\t\t});\n\n\t\treturn result;\n\t});\n\n\t/**\n\t * A list of all defined columns\n\t */\n\tprotected definedColumns: WritableSignal<string[]> = linkedSignal(() => {\n\t\treturn [\n\t\t\t...(this.selectable() ? ['ngxTableSelectColumn'] : []),\n\t\t\t...(this.columns() || []),\n\t\t\t...(this.actions() || []),\n\t\t\t...(this.showOpenRowState() && this.detailRowTemplate()\n\t\t\t\t? ['ngxOpenRowStateColumn']\n\t\t\t\t: []),\n\t\t];\n\t});\n\n\t/**\n\t * Whether or not there was a footer template set somewhere in one of the cells\n\t */\n\tprotected hasFooterTemplates: WritableSignal<boolean> = signal(false);\n\n\t/**\n\t * Whether or not there was a row selected\n\t */\n\tpublic selectedRow: WritableSignal<number | undefined> = linkedSignal(() => {\n\t\t// Iben: Subscribe to the data changes\n\t\tthis.data();\n\n\t\t// Wouter: Deselect any row that was selected to prevent faulty class toggle.\n\t\treturn undefined;\n\t});\n\n\t/**\n\t * An array of table columns\n\t */\n\tprotected tableColumns: WritableSignal<string[]> = linkedSignal(() => {\n\t\treturn [...(this.columns() || []), ...(this.actions() || [])];\n\t});\n\n\t/**\n\t * The currently focussed row\n\t */\n\tprotected focussedRow: string;\n\n\t/**\n\t * The currently focussed cell\n\t */\n\tprotected focussedCell: string;\n\n\t/**\n\t * A QueryList of all the table cell templates\n\t */\n\tprotected readonly tableCellTemplates = contentChildren(NgxAbstractTableCellDirective);\n\n\t/**\n\t * A template to provide a detail row\n\t */\n\tprotected readonly detailRowTemplate = contentChild<TemplateRef<any>>('detailRowTmpl');\n\n\t/**\n\t * A template to provide an empty view\n\t */\n\tprotected readonly emptyTemplate = contentChild<TemplateRef<any>>('emptyTmpl');\n\n\t/**\n\t * A template to provide a loading view\n\t */\n\tprotected readonly loadingTemplate = contentChild<TemplateRef<any>>('loadingTmpl');\n\n\t/**\n\t * A template to provide a checkbox template\n\t */\n\n\tprotected checkboxTemplate = contentChild<TemplateRef<any>>('checkboxTmpl');\n\n\t/**\n\t * A template to provide a radio button template\n\t */\n\n\tprotected radioTemplate = contentChild<TemplateRef<any>>('radioTmpl');\n\n\t/**\n\t * A template to provide a sort template\n\t */\n\n\tprotected sortTemplate = contentChild<TemplateRef<any>>('sortTmpl');\n\n\t/**\n\t * A template to provide a open state template\n\t */\n\tprotected readonly openRowStateTemplate = contentChild<TemplateRef<any>>('openRowStateTmpl');\n\n\t/**\n\t * The accessible name we wish to set on the table for screen readers\n\t */\n\tpublic readonly ariaLabel = input.required<string>();\n\n\t/**\n\t * A list of all column names we want to represent in the table\n\t */\n\tpublic readonly columns = input<string[]>([]);\n\n\t/**\n\t * An optional list of all columns we wish to attribute to row actions, which are sorted to the end of the row by default\n\t */\n\tpublic readonly actions = input<string[]>([]);\n\n\t/**\n\t * The data we wish to render in the table\n\t */\n\tpublic readonly data = input<any[]>([]);\n\n\t/**\n\t * An optional property that defines whether multiple rows can be open at once.\n\t * By default, this is false. The default can be overwritten in the NgxTableConfiguration.\n\t */\n\tpublic readonly allowMultipleOpenRows = input<boolean>(\n\t\tthis.ngxTableConfiguration?.allowMultipleRowsOpen || false\n\t);\n\n\t/**\n\t * Whether or not rows in the table are selectable\n\t */\n\tpublic readonly selectable = input<boolean>(false);\n\n\t/**\n\t * In case the rows are selectable, we can pass a key we want to use as return value instead of the index of the row\n\t */\n\tpublic readonly selectableKey = input<string>();\n\n\t/**\n\t * In case the rows are selectable, we pass whether we want a radio button or a checkbox. By default, this is a checkbox\n\t */\n\tpublic readonly selectableType = input<'checkbox' | 'radio'>('checkbox');\n\n\t/**\n\t * In case the rows are selectable, we can determine whether we want to reset the form based on new data. Setting this to false will add new controls to the FormGroup; but will not remove the earlier controls from the form.\n\t * This is a useful feature for when the data is being filtered or new data is added through a load more mechanic\n\t *\n\t * By default, this is true. This default cannot be overwritten in the NgxTableConfiguration.\n\t */\n\tpublic readonly resetFormOnNewData = input<boolean>(true);\n\n\t/**\n\t *\n\t * The current sorting event.\n\t */\n\tpublic currentSorting: InputSignal<NgxTableSortEvent> = input();\n\n\t/**\n\t * An optional property to define whether we want to add a class to the currently opened row.\n\t * By default this is false. The default can be overwritten in the NgxTableConfiguration.\n\t */\n\tpublic readonly showSelectedOpenRow = input<boolean>(\n\t\tthis.ngxTableConfiguration?.showSelectedOpenRow || false\n\t);\n\n\t/**\n\t * An optional class to add to the rows of the table\n\t */\n\tpublic readonly rowClass = input<string>();\n\n\t/**\n\t * An optional key that can be used in the data in order to highlight a row. If this property is present and true, the highlight class will be provided.\n\t * By default, this key is ngx-highlight. The default can be overwritten in the NgxTableConfiguration\n\t */\n\tpublic readonly highlightKey = input<string>(\n\t\tthis.ngxTableConfiguration?.highlightKey || 'ngx-highlight'\n\t);\n\n\t/**\n\t * An optional property to define whether we want to show a visual indicator of the open and closed state of a detail row.\n\t * By default this is false. The default can be overwritten in the NgxTableConfiguration.\n\t */\n\tpublic readonly showOpenRowState = input<boolean>(\n\t\tthis.ngxTableConfiguration?.showOpenRowState || false\n\t);\n\n\t/**\n\t * An optional property to define the default open state of the detail row.\n\t * By default this is 'on-click'. The default can be overwritten in the NgxTableConfiguration.\n\t */\n\tpublic readonly showDetailRow = input<ShowDetailRowOption>(\n\t\tthis.ngxTableConfiguration?.showDetailRow || 'on-click'\n\t);\n\n\t/**\n\t * An optional property to define whether we want to emit the row when there's only one item in the table and the showDetailRow is set to `on-single-item`\n\t * By default this is false. The default can be overwritten in the NgxTableConfiguration.\n\t */\n\tpublic readonly emitValueOnSingleItem = input<boolean>(\n\t\tthis.ngxTableConfiguration?.showDetailRow === 'on-single-item' &&\n\t\t\tthis.ngxTableConfiguration?.emitValueOnSingleItem\n\t);\n\n\t/**\n\t * An optional key to open a row by default upon rendering.\n\t */\n\tpublic defaultRowOpen: InputSignal<number> = input();\n\n\t/**\n\t * An optional property to define whether we want the header to be hidden in certain cases.\n\t * By default this is never. The default can be overwritten in the NgxTableConfiguration\n\t */\n\tpublic readonly hideHeaderWhen = input<HideHeaderRowOption>(\n\t\tthis.ngxTableConfiguration?.hideHeaderWhen || 'never'\n\t);\n\n\t/**\n\t * An optional set of ARIA labels we wish to set on the checkboxes and radio buttons in the table selection column\n\t */\n\tpublic readonly ariaLabels = input<NgxTableAriaLabels>({});\n\n\t/**\n\t * Resolves the ARIA label for the selection column header.\n\t */\n\tprotected readonly selectionColumnAriaLabel = computed(() => {\n\t\tconst local = this.ariaLabels()?.selectionColumn;\n\t\tconst global = this.ngxTableConfiguration?.ariaLabels?.selectionColumn;\n\t\treturn local ?? global ?? 'Selection column';\n\t});\n\n\t/**\n\t * Resolves the ARIA label for the expansion column header.\n\t */\n\tprotected readonly expansionColumnAriaLabel = computed(() => {\n\t\tconst local = this.ariaLabels()?.expansionColumn;\n\t\tconst global = this.ngxTableConfiguration?.ariaLabels?.expansionColumn;\n\t\treturn local ?? global ?? 'Expansion column';\n\t});\n\n\t/**\n\t * The loading state of our table\n\t */\n\tpublic loading = input<boolean>(false);\n\n\t/**\n\t * An optional set of data we pass if the loading state is shown\n\t */\n\tpublic loadingData = input<any>();\n\n\t/**\n\t * An optional set of data we pass if the empty state is shown\n\t */\n\tpublic emptyData = input<any>();\n\n\t/**\n\t * Returns the data of the row that was clicked\n\t */\n\tpublic rowClicked: OutputEmitterRef<any> = output<any>();\n\n\tconstructor() {\n\t\teffect(() => {\n\t\t\tconst openedIndex = this.defaultRowOpen();\n\t\t\t// Wouter: The function findIndex is most likely to be used. It returns\n\t\t\t// -1 if the index was not found.\n\t\t\tif (openedIndex < 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Wouter: This timeout is needed to wait for the TemplateRefs to be found.\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.handleRowClicked(this.data()[openedIndex], openedIndex);\n\t\t\t\tthis.cdRef.markForCheck();\n\t\t\t});\n\t\t});\n\n\t\t// Iben: If there's only one item in the data and we open the detail row by default, we emit the row clicked value\n\t\teffect(() => {\n\t\t\tif (\n\t\t\t\tthis.emitValueOnSingleItem() &&\n\t\t\t\tthis.data()?.length === 1 &&\n\t\t\t\tthis.showDetailRow() === 'on-single-item'\n\t\t\t) {\n\t\t\t\tthis.handleRowClicked(this.data()[0], 0);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * WriteValue method for the value accessor\n\t *\n\t * @param value - The value patched to the control\n\t */\n\tpublic writeValue(value: string[] | unknown): void {\n\t\t// Iben: In case we're using radio buttons, we set the radio control and early exit\n\t\tif (this.selectableType() === 'radio') {\n\t\t\tthis.radioControl.patchValue(value, { emitEvent: false });\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Iben: Reset the form\n\t\tthis.rowsFormGroup.reset({}, { emitEvent: false });\n\n\t\t// Iben: Early exit if the value is empty or not an array\n\t\tif (!Array.isArray(value) || value.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Iben: Patch the value to the form\n\t\tthis.rowsFormGroup.patchValue(writeNgxTableValue(value, this.selectableKey()), {\n\t\t\temitEvent: false,\n\t\t});\n\n\t\t// Wouter: Some rows are not selected, so uncheck the header checkbox\n\t\tif (\n\t\t\tObject.values(this.rowsFormGroup.controls).some(\n\t\t\t\t(control: FormControl) => !control?.value\n\t\t\t)\n\t\t) {\n\t\t\tthis.headerControl.patchValue(false, { emitEvent: false });\n\t\t\treturn;\n\t\t}\n\n\t\t// Wouter: Set the header checkbox to `checked`, because all rows are selected\n\t\tthis.headerControl.patchValue(true, { emitEvent: false });\n\t}\n\n\t/**\n\t * Register the onChange function\n\t */\n\tpublic registerOnChange(fn: any): void {\n\t\tthis.onChanged = fn;\n\t}\n\n\t/**\n\t * Register the onTouched function\n\t */\n\tpublic registerOnTouched(fn: any): void {\n\t\tthis.onTouch = fn;\n\t}\n\n\t/**\n\t * Handle the disabled state of the form\n\t *\n\t * @param  isDisabled - Whether or not the form is disabled\n\t */\n\tpublic setDisabledState?(isDisabled: boolean): void {\n\t\tif (isDisabled) {\n\t\t\tthis.rowsFormGroup.disable({ emitEvent: false });\n\t\t\tthis.headerControl.disable({ emitEvent: false });\n\t\t\tthis.radioControl.disable({ emitEvent: false });\n\t\t} else {\n\t\t\tthis.rowsFormGroup.enable({ emitEvent: false });\n\t\t\tthis.headerControl.enable({ emitEvent: false });\n\t\t\tthis.radioControl.enable({ emitEvent: false });\n\t\t}\n\t}\n\n\t/**\n\t * Handle a click on a row\n\t *\n\t * @param row - The data of the row that was clicked\n\t * @param index - The index of the row that was clicked\n\t */\n\tpublic handleRowClicked(row: any, index: number) {\n\t\t// Iben: Emit a row click event\n\t\tthis.rowClicked.emit(row);\n\n\t\t// Iben: Handle the selected open row if needed\n\t\tif (this.showSelectedOpenRow()) {\n\t\t\tif (this.selectedRow() === index) {\n\t\t\t\t// Benoit: If you close the selected row, unselect that row\n\t\t\t\tthis.selectedRow.set(undefined);\n\t\t\t} else {\n\t\t\t\tthis.selectedRow.set(index);\n\t\t\t}\n\t\t}\n\t\tthis.handleRowState(index, !this.openedRows()[index] ? 'open' : 'close');\n\t}\n\n\t/**\n\t * Handle the expanded state of a row\n\t *\n\t * @param index - The index of the row\n\t * @param action - Whether the row needs to be opened or closed\n\t */\n\tpublic handleRowState(index: number, action: 'open' | 'close'): void {\n\t\t// Iben: If there's no detail row we early exit\n\t\tif (!this.detailRowTemplate()) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Wouter: When the detail row should be shown due to global config, we add the index to the open rows\n\t\tif (\n\t\t\tthis.showDetailRow() === 'always' ||\n\t\t\t(this.showDetailRow() === 'on-single-item' && this.data().length === 1)\n\t\t) {\n\t\t\tthis.openedRows.update((value) => ({ ...value, 0: true }));\n\t\t\t// Iben: Depending on whether we allow multiple rows to be open at the same time, we toggle the open rows accordingly\n\t\t}\n\t\t// Iben: Depending on whether we allow multiple rows to be open at the same time, we toggle the open rows accordingly\n\t\telse if (this.allowMultipleOpenRows()) {\n\t\t\tthis.openedRows.update((value) => ({\n\t\t\t\t...value,\n\t\t\t\t[index]: action === 'open',\n\t\t\t}));\n\t\t} else {\n\t\t\tthis.openedRows.set(action === 'open' ? { [index]: true } : {});\n\t\t}\n\t}\n\n\t/**\n\t * Assigns the templates of each cell to the correct columns\n\t */\n\tprotected handleTableCellTemplates(): void {\n\t\t// Iben: Reset the provided records\n\t\tthis.tableCellTemplateRecord.set({});\n\t\tthis.sortableTableCellRecord.set({});\n\t\tthis.tableCypressRecord.set({});\n\t\tthis.editableTableCellRecord.set({});\n\n\t\t// Iben: Loop over all provided table cell templates\n\t\tArray.from(this.tableCellTemplates()).forEach((tableCellTemplate) => {\n\t\t\t// Iben: Early exit in case for some reason the template is undefined\n\t\t\tif (!tableCellTemplate) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Iben: Add the template to the template record for easy access in the table template\n\t\t\tconst {\n\t\t\t\tcolumn: columnInput,\n\t\t\t\theaderTemplate,\n\t\t\t\tcellTemplate,\n\t\t\t\tfooterTemplate,\n\t\t\t\tsortable: sortableInput,\n\t\t\t\tcellClass,\n\t\t\t\tcypressDataTags: cypressDataTagsInput,\n\t\t\t\teditable: editableInput,\n\t\t\t} = tableCellTemplate;\n\t\t\tconst column = columnInput();\n\t\t\tconst sortable = sortableInput();\n\t\t\tconst cypressDataTags = cypressDataTagsInput();\n\t\t\tconst editable = editableInput();\n\n\t\t\tthis.tableCellTemplateRecord.update((value) => {\n\t\t\t\treturn {\n\t\t\t\t\t...value,\n\t\t\t\t\t[column]: {\n\t\t\t\t\t\theaderTemplate,\n\t\t\t\t\t\tcellTemplate,\n\t\t\t\t\t\tfooterTemplate,\n\t\t\t\t\t\tcellClass,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t});\n\n\t\t\t// Iben: If the column is sortable, we add it to the sortable record\n\t\t\tif (sortable) {\n\t\t\t\tthis.sortableTableCellRecord.update((value) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...value,\n\t\t\t\t\t\t[column]: tableCellTemplate,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Iben: If the column has cypress tags, we add them to the record\n\t\t\tif (cypressDataTags) {\n\t\t\t\tthis.tableCypressRecord.update((value) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...value,\n\t\t\t\t\t\t[column]: cypressDataTags,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Iben: If the cell is editable, we add it to the record\n\t\t\tif (editable) {\n\t\t\t\tthis.editableTableCellRecord.update((value) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...value,\n\t\t\t\t\t\t[column]: tableCellTemplate,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// Iben: Check if at least one template has a footer template, so that we know whether or not we have to render the footer row\n\t\tthis.hasFooterTemplates.set(\n\t\t\tArray.from(this.tableCellTemplates()).some((cellTemplate) =>\n\t\t\t\tBoolean(cellTemplate.footerTemplate())\n\t\t\t)\n\t\t);\n\n\t\t// Iben:\n\t\tthis.handleCurrentSort(this.currentSortingEvent());\n\n\t\t// Iben: Detect changes to update the view\n\t\tthis.cdRef.detectChanges();\n\t}\n\n\t/**\n\t * Respond to a click on the sort of a column\n\t *\n\t * @param column - The column we clicked on\n\t */\n\tpublic handleSort(column: string): void {\n\t\t// Iben: If the column is not sortable we early exit\n\t\tif (!this.sortableTableCellRecord()[column]) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Iben: Loop over the sortable columns and reset all columns that don't match with the clicked column\n\t\tObject.entries(this.sortableTableCellRecord()).forEach(([cellName, cell]) => {\n\t\t\tif (cellName === column) {\n\t\t\t\tthis.sortableTableCellRecord()[column].handleSort();\n\t\t\t} else {\n\t\t\t\tcell.resetSortDirection();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic selectRow(index: number): void {\n\t\tconst selectableKey = this.selectableKey();\n\t\tthis.rowsFormGroup\n\t\t\t.get(selectableKey ? `${this.data()[index][selectableKey]}` : `${index}`)\n\t\t\t?.patchValue(true);\n\t}\n\n\t/**\n\t * Handle the changes in sort events\n\t *\n\t * @param event - The new sorting event\n\t */\n\tprotected handleCurrentSort(event: NgxTableSortEvent): void {\n\t\t// Iben: Early exit if the sortable cell record is empty or if the cell already has the sortDirection of the event\n\t\tif (\n\t\t\tisEmpty(this.sortableTableCellRecord()) ||\n\t\t\t(event &&\n\t\t\t\tthis.sortableTableCellRecord()[event.column]?.sortDirection === event.direction)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Iben: We reset all the sort directions by default, so all of them are unsorted.\n\t\tObject.values(this.sortableTableCellRecord()).forEach((cell) => cell.resetSortDirection());\n\n\t\t// Iben: If there's no sort event passed, we early exit\n\t\tif (!event) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Iben: In case there was a sorting provided and we set the sorting to the provided column and direction\n\t\tthis.sortableTableCellRecord()[event.column].setSortDirection(event.direction);\n\t}\n\n\t/**\n\t * Setup the columns array\n\t */\n\tprotected handleRowColumns(): void {\n\t\t// Iben: Make sure that the select option, the open row state and the defined actions are correctly placed\n\t\tconst columns = this.columns();\n\t\tconst actions = this.actions();\n\t\tthis.definedColumns.set([\n\t\t\t...(this.selectable() ? ['ngxTableSelectColumn'] : []),\n\t\t\t...(columns || []),\n\t\t\t...(actions || []),\n\t\t\t...(this.showOpenRowState() && this.detailRowTemplate()\n\t\t\t\t? ['ngxOpenRowStateColumn']\n\t\t\t\t: []),\n\t\t]);\n\n\t\t// Iben: Set the actual table columns\n\t\tthis.tableColumns.set([...(columns || []), ...(actions || [])]);\n\t}\n\n\t// Lifecycle methods\n\t// ==============================\n\tpublic ngAfterContentChecked(): void {\n\t\t// Iben: Run with content check so that we can dynamically add templates/columns\n\t\tthis.handleRowColumns();\n\t\tthis.handleTableCellTemplates();\n\t}\n\n\tpublic ngOnInit() {\n\t\t// Iben: Subscribe to the form to handle the selectable behavior\n\t\tthis.rowsFormGroup.valueChanges\n\t\t\t.pipe(\n\t\t\t\ttap((value) => {\n\t\t\t\t\t// Iben: If not all items are selected, we uncheck the headerControl without emitting a value to prevent an infinite loop in the next subscription\n\t\t\t\t\tthis.headerControl.setValue(\n\t\t\t\t\t\tObject.values(value).every((selected) => selected),\n\t\t\t\t\t\t{ emitEvent: false }\n\t\t\t\t\t);\n\n\t\t\t\t\t// Iben: Emit the current selection and mark the form as touched\\\n\t\t\t\t\tthis.onChanged(handleNgxTableValueChanges(value));\n\t\t\t\t\tthis.onTouch();\n\t\t\t\t}),\n\t\t\t\ttakeUntilDestroyed(this.destroyRef)\n\t\t\t)\n\t\t\t.subscribe();\n\n\t\t// Iben: Listen to the radio control and update the value accordingly\n\t\tthis.radioControl.valueChanges\n\t\t\t.pipe(\n\t\t\t\ttap((value) => {\n\t\t\t\t\tthis.onChanged(value);\n\t\t\t\t\tthis.onTouch();\n\t\t\t\t}),\n\t\t\t\ttakeUntilDestroyed(this.destroyRef)\n\t\t\t)\n\t\t\t.subscribe();\n\n\t\t// Iben: Subscribe to the headerControl to handle multiSelect behaviour\n\t\tthis.headerControl.valueChanges\n\t\t\t.pipe(\n\t\t\t\ttap((selected) => {\n\t\t\t\t\t// Iben: Select all items when this control is selected, if not, unselect them all\n\t\t\t\t\tif (selected) {\n\t\t\t\t\t\tthis.rowsFormGroup.patchValue(\n\t\t\t\t\t\t\thandleNgxTableHeaderValueChanges(this.rowsFormGroup)\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.rowsFormGroup.reset();\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\ttakeUntilDestroyed(this.destroyRef)\n\t\t\t)\n\t\t\t.subscribe();\n\t}\n}\n","<table\n\tclass=\"ngx-table\"\n\tcdk-table\n\tmultiTemplateDataRows\n\tfixedLayout\n\t[ngxTreeGrid]=\"isTreeGrid()\"\n\t[ngxTreeGridExpandable]=\"detailRowTemplate() !== undefined\"\n\t[class.ngx-table-hide-rows]=\"loading() || (data() || []).length === 0\"\n\t[class.ngx-table-clickable-rows]=\"detailRowTemplate() || (rowClicked | ngxTableHasObservers)\"\n\t[attr.aria-multiselectable]=\"isTreeGrid() && selectableType() === 'checkbox' ? 'true' : null\"\n\t[dataSource]=\"!loading() ? data() : []\"\n\t[attr.aria-label]=\"ariaLabel()\"\n>\n\t@if (selectable()) {\n\t<ng-container cdkColumnDef=\"ngxTableSelectColumn\">\n\t\t<th\n\t\t\t*cdkHeaderCellDef\n\t\t\tclass=\"ngx-table-cell ngx-table-header-cell ngx-table-selectable-cell\"\n\t\t\tcdk-header-cell\n\t\t\t[attr.aria-readonly]=\"isTreeGrid() && headerControl.disabled ? 'true' : null\"\n\t\t\t[attr.aria-label]=\"selectionColumnAriaLabel()\"\n\t\t>\n\t\t\t@if (selectableType() === 'checkbox') {\n\t\t\t<ng-template\n\t\t\t\t[ngTemplateOutlet]=\"checkboxTmpl\"\n\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t$implicit: headerControl,\n\t\t\t\t\t\t\trow: undefined,\n\t\t\t\t\t\t\tindex: undefined,\n\t\t\t\t\t\t}\"\n\t\t\t>\n\t\t\t</ng-template>\n\t\t\t}\n\t\t</th>\n\t\t<td\n\t\t\t*cdkCellDef=\"let row; let index = dataIndex\"\n\t\t\tclass=\"ngx-table-cell ngx-table-row-cell ngx-table-selectable-cell\"\n\t\t\t[ngxTreeGridCell]=\"0\"\n\t\t\t[ngxTreeGridCellRow]=\"index\"\n\t\t>\n\t\t\t@if ( (hasForm() && selectableType() === 'radio') || (selectableType() === 'checkbox' &&\n\t\t\trowsFormGroup.controls[ this.selectableKey() ? row[selectableKey()] : index ]); as\n\t\t\tcontrol ) {\n\t\t\t<ng-template\n\t\t\t\t[ngTemplateOutlet]=\"\n\t\t\t\t\tselectableType() === 'checkbox' ? checkboxTmpl : radioButtonTmpl\n\t\t\t\t\"\n\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t$implicit: control,\n\t\t\t\t\t\t\trow: row,\n\t\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\t}\"\n\t\t\t>\n\t\t\t</ng-template>\n\t\t\t}\n\t\t</td>\n\t\t<td\n\t\t\t*cdkFooterCellDef=\"let row\"\n\t\t\tclass=\"ngx-table-cell ngx-table-footer-cell\"\n\t\t\tcdk-footer-cell\n\t\t></td>\n\t</ng-container>\n\t} @if (showOpenRowState()) {\n\t<ng-container cdkColumnDef=\"ngxOpenRowStateColumn\">\n\t\t<th\n\t\t\t*cdkHeaderCellDef\n\t\t\tclass=\"ngx-table-cell ngx-table-header-cell\"\n\t\t\tcdk-header-cell\n\t\t\t[attr.aria-label]=\"expansionColumnAriaLabel()\"\n\t\t></th>\n\t\t<td\n\t\t\t*cdkCellDef=\"let row; let index = dataIndex\"\n\t\t\tclass=\"ngx-table-cell ngx-table-row-cell ngx-table-open-row-state-cell\"\n\t\t\t[ngxTreeGridCell]=\"selectable() ? columns().length + 1 : columns().length + 2\"\n\t\t\t[ngxTreeGridCellRow]=\"index\"\n\t\t\t[attr.role]=\"isTreeGrid() ? 'gridcell' : 'cell'\"\n\t\t\t[attr.aria-label]=\"\n\t\t\t\tshowDetailRow() === 'always' ||\n\t\t\t\t(showDetailRow() === 'on-single-item' && data()?.length === 1) ||\n\t\t\t\topenedRows()[index]\n\t\t\t\t\t? 'Collapse row ' + (index + 1)\n\t\t\t\t\t: 'Expand row ' + (index + 1)\n\t\t\t\"\n\t\t\t(click)=\"handleRowClicked(row, index)\"\n\t\t\t(keydown.enter)=\"handleRowClicked(row, index)\"\n\t\t\t(keydown.space)=\"$event.preventDefault(); handleRowClicked(row, index)\"\n\t\t>\n\t\t\t@if (openRowStateTemplate()) {\n\t\t\t<ng-template\n\t\t\t\t[ngTemplateOutlet]=\"openRowStateTemplate()\"\n\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t$implicit:\n\t\t\t\t\t\t\t\tshowDetailRow() === 'always' ||\n\t\t\t\t\t\t\t\t(showDetailRow() === 'on-single-item' && data()?.length === 1) ||\n\t\t\t\t\t\t\t\topenedRows()[index],\n\t\t\t\t\t\t\trow,\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t}\"\n\t\t\t/>\n\t\t\t} @else if (ngxTableConfiguration?.components?.openRowState) {\n\t\t\t<ng-template\n\t\t\t\t[ngComponentOutlet]=\"ngxTableConfiguration.components.openRowState\"\n\t\t\t\t[ngComponentOutletInputs]=\"{\n\t\t\t\t\t\t\tisOpen:\n\t\t\t\t\t\t\t\tshowDetailRow() === 'always' ||\n\t\t\t\t\t\t\t\t(showDetailRow() === 'on-single-item' && data()?.length === 1) ||\n\t\t\t\t\t\t\t\topenedRows()[index],\n\t\t\t\t\t\t\trow,\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t}\"\n\t\t\t/>\n\t\t\t} @else {\n\t\t\t<ng-template\n\t\t\t\t[ngTemplateOutlet]=\"defaultOpenRowStateTmpl\"\n\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t$implicit:\n\t\t\t\t\t\t\t\tshowDetailRow() === 'always' ||\n\t\t\t\t\t\t\t\t(showDetailRow() === 'on-single-item' && data()?.length === 1) ||\n\t\t\t\t\t\t\t\topenedRows()[index],\n\t\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\t}\"\n\t\t\t/>\n\t\t\t}\n\t\t</td>\n\t\t<td\n\t\t\t*cdkFooterCellDef=\"let row\"\n\t\t\tclass=\"ngx-table-cell ngx-table-footer-cell\"\n\t\t\tcdk-footer-cell\n\t\t></td>\n\t</ng-container>\n\t} @for (column of tableColumns(); track column; let columnIndex = $index) {\n\t<ng-container [cdkColumnDef]=\"column\">\n\t\t<th\n\t\t\t*cdkHeaderCellDef\n\t\t\tcdk-header-cell\n\t\t\t[ngClass]=\"[\n\t\t\t\t'ngx-table-cell',\n\t\t\t\t'ngx-table-header-cell',\n\t\t\t\ttableCellTemplateRecord()[column]?.cellClass || ''\n\t\t\t]\"\n\t\t\t[class.ngx-table-sortable-cell]=\"sortableTableCellRecord()[column]\"\n\t\t\t[attr.data-cy]=\"tableCypressRecord()[column]?.header || ''\"\n\t\t\t[attr.aria-sort]=\"\n\t\t\t\t\tisTreeGrid()\n\t\t\t\t\t\t? ({\n\t\t\t\t\t\t\t\tcurrentSorting: currentSortingEvent(),\n\t\t\t\t\t\t\t\tcell: sortableTableCellRecord()[column],\n\t\t\t\t\t\t\t} | ngxAriaSort)\n\t\t\t\t\t\t: null\n\t\t\t\t\"\n\t\t\t[attr.aria-readonly]=\"\n\t\t\t\tisTreeGrid() && !sortableTableCellRecord()[column] ? 'true' : null\n\t\t\t\"\n\t\t>\n\t\t\t<!-- Wouter: Check if header is sortable -->\n\t\t\t@if (sortableTableCellRecord()[column]; as sortCell) {\n\t\t\t<!-- Wouter: If so: wrap button element around content -->\n\t\t\t<button\n\t\t\t\tclass=\"ngx-table-sorting-cell-button\"\n\t\t\t\t[attr.aria-label]=\"sortAriaLabels()[column]\"\n\t\t\t\t(click)=\"handleSort(column)\"\n\t\t\t>\n\t\t\t\t@if (tableCellTemplateRecord()[column]?.headerTemplate()) {\n\t\t\t\t<!-- Wouter: Check if a custom template has been provided -->\n\t\t\t\t<ng-template\n\t\t\t\t\t[ngTemplateOutlet]=\"tableCellTemplateRecord()[column].headerTemplate()\"\n\t\t\t\t>\n\t\t\t\t</ng-template>\n\t\t\t\t} @else {\n\t\t\t\t<!-- Wouter: If not: display passed column name -->\n\t\t\t\t{{ column }}\n\t\t\t\t} @if (sortTemplate()) {\n\t\t\t\t<!-- Wouter: Check if a custom sorting template has been provided -->\n\t\t\t\t<ng-template\n\t\t\t\t\t[ngTemplateOutlet]=\"sortTemplate()\"\n\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t\t\t$implicit: sortCell.sortDirection\n\t\t\t\t\t\t\t\t\t\t? sortCell.sortDirection.toString()\n\t\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t\t}\"\n\t\t\t\t/>\n\t\t\t\t} @else if (ngxTableConfiguration?.components?.sort) {\n\t\t\t\t<ng-template\n\t\t\t\t\t[ngComponentOutlet]=\"ngxTableConfiguration.components.sort\"\n\t\t\t\t\t[ngComponentOutletInputs]=\"{\n\t\t\t\t\t\t\t\t\tsortDirection: sortCell.sortDirection\n\t\t\t\t\t\t\t\t\t\t? sortCell.sortDirection.toString()\n\t\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t\t}\"\n\t\t\t\t/>\n\t\t\t\t} @else {\n\t\t\t\t<i\n\t\t\t\t\tclass=\"ngx-table-sorting-icon\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t[innerHtml]=\"sortCell.sortDirection | ngxTableSortIcon\"\n\t\t\t\t></i>\n\t\t\t\t}\n\t\t\t</button>\n\t\t\t} @else { @if (tableCellTemplateRecord()[column]?.headerTemplate()) {\n\t\t\t<!-- Wouter: Check if a custom template has been provided -->\n\t\t\t<ng-template [ngTemplateOutlet]=\"tableCellTemplateRecord()[column].headerTemplate()\">\n\t\t\t</ng-template>\n\t\t\t} @else {\n\t\t\t<!-- Wouter: If not: display passed column name -->\n\t\t\t{{ column }}\n\t\t\t} }\n\t\t</th>\n\t\t<td\n\t\t\t*cdkCellDef=\"let row; let index = dataIndex\"\n\t\t\tcdk-cell\n\t\t\t[ngClass]=\"[\n\t\t\t\t'ngx-table-cell',\n\t\t\t\t'ngx-table-row-cell',\n\t\t\t\ttableCellTemplateRecord()[column]?.cellClass || ''\n\t\t\t]\"\n\t\t\t[ngxTreeGridCell]=\"selectable() ? columnIndex + 1 : columnIndex\"\n\t\t\t[ngxTreeGridCellRow]=\"index\"\n\t\t\t[attr.data-cy]=\"tableCypressRecord()[column]?.cell || ''\"\n\t\t\t[attr.role]=\"isTreeGrid() ? 'gridcell' : 'cell'\"\n\t\t\t[attr.aria-readonly]=\"\n\t\t\t\tisTreeGrid() && !editableTableCellRecord()[column] ? 'true' : null\n\t\t\t\"\n\t\t\t(click)=\"handleRowClicked(row, index)\"\n\t\t\t(keydown.enter)=\"handleRowClicked(row, index)\"\n\t\t\t(keydown.space)=\"$event.preventDefault(); handleRowClicked(row, index)\"\n\t\t>\n\t\t\t@if (tableCellTemplateRecord()[column]?.cellTemplate()) {\n\t\t\t<ng-template\n\t\t\t\t[ngTemplateOutlet]=\"tableCellTemplateRecord()[column].cellTemplate()\"\n\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t$implicit: row[column],\n\t\t\t\t\t\t\trow: row,\n\t\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\t\tisRowOpen:\n\t\t\t\t\t\t\t\tshowDetailRow() === 'always' ||\n\t\t\t\t\t\t\t\t(showDetailRow() === 'on-single-item' && data()?.length === 1) ||\n\t\t\t\t\t\t\t\topenedRows()[index],\n\t\t\t\t\t\t}\"\n\t\t\t>\n\t\t\t</ng-template>\n\t\t\t} @else {\n\t\t\t{{ row[column] }}\n\t\t\t}\n\t\t</td>\n\t\t<td\n\t\t\t*cdkFooterCellDef=\"let row\"\n\t\t\tclass=\"ngx-table-cell ngx-table-footer-cell\"\n\t\t\tcdk-footer-cell\n\t\t\t[attr.data-cy]=\"tableCypressRecord()[column]?.footer || ''\"\n\t\t>\n\t\t\t@if (tableCellTemplateRecord()[column]?.footerTemplate()) {\n\t\t\t<ng-template [ngTemplateOutlet]=\"tableCellTemplateRecord()[column].footerTemplate()\">\n\t\t\t</ng-template>\n\t\t\t}\n\t\t</td>\n\t</ng-container>\n\t} @if (detailRowTemplate()) {\n\t<ng-container cdkColumnDef=\"ngxTableDetailColumn\">\n\t\t<td\n\t\t\t*cdkCellDef=\"let row; let index = dataIndex\"\n\t\t\tclass=\"ngx-table-cell ngx-table-detail-cell\"\n\t\t\tcdk-cell\n\t\t\t[attr.colspan]=\"definedColumns().length\"\n\t\t>\n\t\t\t<ng-template\n\t\t\t\t[ngTemplateOutlet]=\"detailRowTmpl\"\n\t\t\t\t[ngTemplateOutletContext]=\"{ $implicit: row, index: index }\"\n\t\t\t>\n\t\t\t</ng-template>\n\t\t</td>\n\t</ng-container>\n\t} @if ( { isLoading: loading(), isEmpty: data()?.length === 0 } | ngxTableShowHeader:\n\thideHeaderWhen() ) {\n\t<tr *cdkHeaderRowDef=\"definedColumns()\" cdk-header-row></tr>\n\t} @if (data()) {\n\t<!-- Wouter: An explanation for the ngx-table-row-last class calculation:\n\t\t\t- If there is a detail row template, we only want to apply the class if the row is not open. Additionally, it must be the second-to-last\n\t\t\t\trendered row. This is because the length of the data and the indexes are already off by one, and we want the second-to-last row, so minus another one.\n\t\t\t- If there is no detail row template and this is the last row, we want to apply the ngx-table-row-last class. -->\n\t<tr\n\t\t*cdkRowDef=\"\n\t\t\tlet row;\n\t\t\tcolumns: definedColumns();\n\t\t\tlet rowIndex = dataIndex;\n\t\t\tlet last = last;\n\t\t\tlet first = first;\n\t\t\tlet count = count;\n\t\t\tlet renderIndex = renderIndex\n\t\t\"\n\t\t#rowItem\n\t\tcdk-row\n\t\t[attr.aria-level]=\"isTreeGrid() ? '1' : null\"\n\t\t[attr.tabindex]=\"detailRowTemplate() !== undefined || selectable() ? 0 : -1\"\n\t\t[attr.aria-setsize]=\"isTreeGrid() && detailRowTemplate() ? 1 : null\"\n\t\t[ngClass]=\"[\n\t\t\t'ngx-table-row',\n\t\t\trowClass() || '',\n\t\t\trow[highlightKey()] ? 'ngx-table-row-highlight' : '',\n\t\t\tfirst ? 'ngx-table-row-first' : '',\n\t\t\tdetailRowTemplate\n\t\t\t\t? openedRows()[rowIndex]\n\t\t\t\t\t? ''\n\t\t\t\t\t: renderIndex === count - 2\n\t\t\t\t\t? 'ngx-table-row-last'\n\t\t\t\t\t: ''\n\t\t\t\t: last\n\t\t\t\t? 'ngx-table-row-last'\n\t\t\t\t: ''\n\t\t]\"\n\t\t[class.ngx-table-row-odd]=\"rowIndex % 2 !== 0\"\n\t\t[class.ngx-table-row-even]=\"rowIndex % 2 === 0\"\n\t\t[class.ngx-table-row-selected]=\"\n\t\t\tshowSelectedOpenRow() &&\n\t\t\t(selectedRow() === rowIndex ||\n\t\t\t\t(showDetailRow() === 'on-single-item' && data()?.length === 1))\n\t\t\"\n\t\t[ngxTreeGridRow]=\"rowIndex\"\n\t\t[ngxTreeGridRowSelectable]=\"selectable()\"\n\t\t[ngxTreeGridRowExpanded]=\"openedRows()[rowIndex]\"\n\t\t[attr.aria-selected]=\"\n\t\t\tisTreeGrid() && selectable()\n\t\t\t\t? rowsFormGroup.get(\n\t\t\t\t\t\tselectableKey() ? '' + data()[rowIndex][selectableKey()] : '' + rowIndex\n\t\t\t\t  )?.value\n\t\t\t\t\t? 'true'\n\t\t\t\t\t: 'false'\n\t\t\t\t: null\n\t\t\"\n\t\t(ngxTreeGridRowSelectRow)=\"selectRow(rowIndex)\"\n\t\t(ngxTreeGridRowExpandRow)=\"handleRowState(rowIndex, $event ? 'open' : 'close')\"\n\t\t(keydown.enter)=\"handleRowClicked(row, rowIndex)\"\n\t></tr>\n\t@if (detailRowTemplate()) {\n\t<tr\n\t\t*cdkRowDef=\"\n\t\t\tlet row;\n\t\t\tlet index = dataIndex;\n\t\t\tcolumns: ['ngxTableDetailColumn'];\n\t\t\tlet last = last\n\t\t\"\n\t\tclass=\"ngx-table-detail-row\"\n\t\tcdk-row\n\t\t[attr.aria-level]=\"isTreeGrid() ? '2' : null\"\n\t\t[attr.aria-posinset]=\"isTreeGrid() ? '1' : null\"\n\t\t[ngClass]=\"{\n\t\t\t\t\t'ngx-table-row-last':\n\t\t\t\t\t\tlast &&\n\t\t\t\t\t\t(showDetailRow() === 'always' ||\n\t\t\t\t\t\t\t(showDetailRow() === 'on-single-item' && data?.length === 1) ||\n\t\t\t\t\t\t\topenedRows()[index]),\n\t\t\t\t}\"\n\t\t[class.ngx-table-detail-row-open]=\"\n\t\t\tshowDetailRow() === 'always' ||\n\t\t\t(showDetailRow() === 'on-single-item' && data()?.length === 1) ||\n\t\t\topenedRows()[index]\n\t\t\"\n\t></tr>\n\t} @if (hasFooterTemplates()) {\n\t<tr *cdkFooterRowDef=\"definedColumns()\" class=\"ngx-table-footer-row\" cdk-footer-row></tr>\n\t} }\n</table>\n\n@if (!loading() && (!data() || data().length === 0)) {\n<div class=\"ngx-table-empty-state-container\">\n\t@if (emptyTemplate()) {\n\t<ng-template\n\t\t[ngTemplateOutlet]=\"emptyTemplate()\"\n\t\t[ngTemplateOutletContext]=\"{ $implicit: emptyData() }\"\n\t/>\n\t} @else if (ngxTableConfiguration?.components?.empty) {\n\t<ng-template\n\t\t[ngComponentOutlet]=\"ngxTableConfiguration.components.empty\"\n\t\t[ngComponentOutletInputs]=\"{ data: emptyData() }\"\n\t/>\n\t}\n</div>\n} @if (loading()) {\n<div class=\"ngx-table-loading-state-container\">\n\t@if (loadingTemplate()) {\n\t<ng-template\n\t\t[ngTemplateOutlet]=\"loadingTemplate()\"\n\t\t[ngTemplateOutletContext]=\"{ $implicit: loadingData() }\"\n\t/>\n\t} @else if (ngxTableConfiguration?.components?.loading) {\n\t<ng-template\n\t\t[ngComponentOutlet]=\"ngxTableConfiguration.components.loading\"\n\t\t[ngComponentOutletInputs]=\"{ data: loadingData() }\"\n\t/>\n\t}\n</div>\n}\n\n<ng-template #detailRowTmpl let-row let-index=\"index\">\n\t@if ( showDetailRow() === 'always' || (showDetailRow() === 'on-single-item' && data()?.length\n\t=== 1) || openedRows()[index] ) {\n\t<ng-template\n\t\t[ngTemplateOutlet]=\"detailRowTemplate()\"\n\t\t[ngTemplateOutletContext]=\"{ $implicit: row, index }\"\n\t/>\n\t}\n</ng-template>\n\n<ng-template #checkboxTmpl let-control let-row=\"row\" let-index=\"index\">\n\t@if (checkboxTemplate()) {\n\t<ng-template\n\t\t[ngTemplateOutlet]=\"checkboxTemplate()\"\n\t\t[ngTemplateOutletContext]=\"{ $implicit: control, row: row, index: index }\"\n\t/>\n\t} @else if (ngxTableConfiguration?.components?.checkbox) {\n\t<ng-template\n\t\t[ngComponentOutlet]=\"ngxTableConfiguration.components.checkbox\"\n\t\t[ngComponentOutletInputs]=\"{ control, row, index }\"\n\t/>\n\t} @else {\n\t<input\n\t\tclass=\"ngx-table-checkbox\"\n\t\ttype=\"checkbox\"\n\t\t[formControl]=\"control\"\n\t\t[attr.aria-label]=\"index | ngxTableAriaLabel : 'select' : ariaLabels()\"\n\t/>\n\t}\n</ng-template>\n\n<ng-template #radioButtonTmpl let-row=\"row\" let-index=\"index\">\n\t@if (radioTemplate()) {\n\t<ng-template\n\t\t[ngTemplateOutlet]=\"radioTemplate()\"\n\t\t[ngTemplateOutletContext]=\"{ $implicit: radioControl, row: row, index: index }\"\n\t/>\n\t} @else if (ngxTableConfiguration?.components?.checkbox) {\n\t<ng-template\n\t\t[ngComponentOutlet]=\"ngxTableConfiguration.components.checkbox\"\n\t\t[ngComponentOutletInputs]=\"{ control: radioControl, row, index }\"\n\t/>\n\t} @else {\n\t<input\n\t\tclass=\"ngx-table-radio\"\n\t\tname=\"ngx-table-radio\"\n\t\ttype=\"radio\"\n\t\t[id]=\"`ngx-table-radio-${index}`\"\n\t\t[value]=\"selectableKey() ? row[selectableKey()] : index\"\n\t\t[formControl]=\"radioControl\"\n\t\t[attr.aria-label]=\"index | ngxTableAriaLabel : 'select' : ariaLabels()\"\n\t/>\n\t}\n</ng-template>\n\n<ng-template #defaultOpenRowStateTmpl let-open let-index=\"index\">\n\t<button\n\t\ttype=\"button\"\n\t\tclass=\"ngx-table-open-state-button\"\n\t\t[attr.aria-expanded]=\"open\"\n\t\t[attr.aria-label]=\"\n\t\t\topen\n\t\t\t\t? (index | ngxTableAriaLabel : 'collapse' : ariaLabels())\n\t\t\t\t: (index | ngxTableAriaLabel : 'expand' : ariaLabels())\n\t\t\"\n\t>\n\t\t<i\n\t\t\tclass=\"ngx-table-open-state-icon\"\n\t\t\taria-hidden=\"true\"\n\t\t\t[innerHtml]=\"open ? '&#9650;' : '&#9660;'\"\n\t\t></i>\n\t</button>\n</ng-template>\n","/// components\nexport * from './configurable-layout/configurable-layout.component';\nexport * from './configurable-layout-item/configurable-layout-item.component';\nexport * from './accordion';\nexport * from './image-marker/image-marker.component';\nexport * from './mobile-layout/mobile-layout.component';\nimport { Cells } from './cell';\nimport { NgxConfigurableLayoutComponent } from './configurable-layout/configurable-layout.component';\nimport { NgxConfigurableLayoutItemComponent } from './configurable-layout-item/configurable-layout-item.component';\nimport { NgxTableComponent } from './table/ngx-table.component';\n\nexport * from './table/ngx-table.component';\nexport * from './cell';\n\n/** All the necessary ngx-table components */\nexport const NgxTable = [NgxTableComponent, ...Cells] as const;\n\n/** All the necessary ngx-configurable layout components */\nexport const NgxConfigurableLayout = [\n\tNgxConfigurableLayoutComponent,\n\tNgxConfigurableLayoutItemComponent,\n] as const;\n","import { Provider } from '@angular/core';\n\nimport { NgxDisplayContentConfigurationToken } from '../../tokens';\nimport { NgxDisplayContentConfiguration } from '../../types';\n\n/**\n * Provides the configuration for the NgxDisplayContent directive\n *\n * @param configuration - The required configuration\n */\nexport const provideNgxDisplayContentConfiguration = (\n\tconfiguration: NgxDisplayContentConfiguration\n): Provider => {\n\treturn {\n\t\tprovide: NgxDisplayContentConfigurationToken,\n\t\tuseValue: configuration,\n\t};\n};\n","import { Provider, Type } from '@angular/core';\n\nimport { NgxAccessibleDragAndDropAbstractService } from '../../abstracts';\n\n/**\n * Provides a custom implementation of the NgxDragAndDropService\n *\n * @param service - The custom implementation for the NgxDragAndDropService\n */\nexport const provideNgxDragAndDropService = (\n\tservice: Type<NgxAccessibleDragAndDropAbstractService>\n): Provider => {\n\treturn {\n\t\tprovide: NgxAccessibleDragAndDropAbstractService,\n\t\tuseClass: service,\n\t};\n};\n","import { Provider } from '@angular/core';\n\nimport { NgxTableConfiguration, NgxTableConfigurationToken } from '../../tokens';\n\n/**\n * Provides the optional configuration for the NgxTable component\n *\n * @param configuration - The provided of configuration\n */\nexport const provideNgxTableConfiguration = (configuration: NgxTableConfiguration): Provider => {\n\treturn {\n\t\tprovide: NgxTableConfigurationToken,\n\t\tuseValue: configuration,\n\t};\n};\n","import { Provider } from '@angular/core';\n\nimport { NgxMobileLayoutConfigurationToken } from '../../tokens';\nimport { NgxMobileLayoutConfiguration } from '../../types';\n\n/**\n * Provides an optional configuration for the `NgxMobileLayoutService`\n *\n * @param configuration - The optional configuration\n */\nexport const provideNgxMobileLayoutConfiguration = (\n\tconfiguration: NgxMobileLayoutConfiguration\n): Provider => {\n\treturn {\n\t\tprovide: NgxMobileLayoutConfigurationToken,\n\t\tuseValue: configuration,\n\t};\n};\n","import { Provider } from '@angular/core';\n\nimport { NgxButtonConfigurationToken } from '../../tokens';\nimport { NgxButtonConfiguration } from '../../types';\n\n/**\n * Provides the configuration for the NgxButton directive\n *\n * @param configuration - The required configuration\n */\nexport const provideNgxButtonConfiguration = (configuration: NgxButtonConfiguration): Provider => {\n\treturn {\n\t\tprovide: NgxButtonConfigurationToken,\n\t\tuseValue: configuration,\n\t};\n};\n","import { Provider } from '@angular/core';\n\nimport { NgxMediaQueriesToken } from '../../tokens';\nimport { NgxMediaQuery } from '../../types';\n\n/**\n * Provides an optional list of media queries for the `NgxMediaQueryService`\n *\n * @param queries - A list of queries\n */\nexport const provideNgxMediaQueries = (queries: NgxMediaQuery[]): Provider => {\n\treturn {\n\t\tprovide: NgxMediaQueriesToken,\n\t\tuseValue: queries,\n\t};\n};\n","import { Provider } from '@angular/core';\n\nimport { NgxLinkConfigurationToken } from '../../tokens';\nimport { NgxLinkConfiguration } from '../../types';\n\n/**\n * Provides the configuration for the NgxLink directive\n *\n * @param configuration - The required configuration\n */\nexport const provideNgxLinkConfiguration = (configuration: NgxLinkConfiguration): Provider => {\n\treturn {\n\t\tprovide: NgxLinkConfigurationToken,\n\t\tuseValue: configuration,\n\t};\n};\n","import { Provider } from '@angular/core';\nimport { MarkedExtension } from 'marked';\n\nimport { NgxMarkdownConfigurationToken } from '../../tokens';\n\n/**\n * Provides the configuration for the NgxMarkdownService\n *\n * @param configuration - The required configuration\n */\nexport const provideNgxMarkdownConfiguration = (configuration: MarkedExtension[]): Provider => {\n\treturn {\n\t\tprovide: NgxMarkdownConfigurationToken,\n\t\tuseValue: configuration,\n\t};\n};\n","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivateFn } from '@angular/router';\n\nimport { NgxMobileLayoutService } from '../../services';\n\n/**\n * A guard that will set the mobile layout in the `NgxMobileLayoutService`\n */\nexport const NgxMobileLayoutGuard: CanActivateFn = (route: ActivatedRouteSnapshot) => {\n\t// Iben: Get the layout service\n\tconst layoutService: NgxMobileLayoutService = inject(NgxMobileLayoutService);\n\n\t// Iben: Set the desired layout\n\t// As the setLayout has a take one and we always want to continue routing, we can safely subscribe here\n\tlayoutService.setLayout(route.data['mobileLayout']).subscribe();\n\n\t//Iben: Always return true as we merely set the layout\n\treturn true;\n};\n","import { inject } from '@angular/core';\nimport { CanDeactivateFn } from '@angular/router';\n\nimport { NgxMobileLayoutService } from '../../services';\nimport { ComponentType } from '../../types';\n\n/**\n * A guard that will set the default mobile layout in the `NgxMobileLayoutService`\n */\nexport const NgxMobileLayoutDefaultGuard: CanDeactivateFn<ComponentType> = () => {\n\t// Iben: Get the layout service\n\tconst layoutService: NgxMobileLayoutService = inject(NgxMobileLayoutService);\n\n\t// Iben: Set the default layout\n\tlayoutService.setUpInitialLayout(false);\n\n\t//Iben: Always return true as we merely set the layout\n\treturn true;\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["uuid","i1","i2","tap"],"mappings":"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"}