@zambon-dev/ui 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2329 -0
- package/README.md +80 -2
- package/fesm2022/zambon-dev-ui-framework.mjs +5960 -0
- package/fesm2022/zambon-dev-ui-framework.mjs.map +1 -0
- package/fesm2022/zambon-dev-ui-library.mjs +5795 -0
- package/fesm2022/zambon-dev-ui-library.mjs.map +1 -0
- package/fesm2022/zambon-dev-ui-shared.mjs +2517 -0
- package/fesm2022/zambon-dev-ui-shared.mjs.map +1 -0
- package/fesm2022/zambon-dev-ui-testing.mjs +76 -0
- package/fesm2022/zambon-dev-ui-testing.mjs.map +1 -0
- package/fesm2022/zambon-dev-ui.mjs +3 -0
- package/i18n/framework/en.json +63 -0
- package/i18n/framework/pt.json +63 -0
- package/i18n/shared/external-content/en.json +12 -0
- package/i18n/shared/external-content/pt.json +12 -0
- package/i18n/shared/language-selector/en.json +5 -0
- package/i18n/shared/language-selector/pt.json +5 -0
- package/i18n/shared/login/en.json +14 -0
- package/i18n/shared/login/pt.json +14 -0
- package/i18n/shared/operations-history/en.json +5 -0
- package/i18n/shared/operations-history/pt.json +5 -0
- package/i18n/shared/services-history/en.json +14 -0
- package/i18n/shared/services-history/pt.json +14 -0
- package/i18n/shared/top-bar/en.json +7 -0
- package/i18n/shared/top-bar/pt.json +7 -0
- package/package.json +106 -4
- package/styles/common.scss +10 -0
- package/styles/components/button.scss +101 -0
- package/styles/components/card.scss +13 -0
- package/styles/components/dropdown-static.scss +35 -0
- package/styles/components/input-group.scss +44 -0
- package/styles/components/input.scss +99 -0
- package/styles/components/label.scss +3 -0
- package/styles/components/row.scss +48 -0
- package/styles/mixins/background.scss +31 -0
- package/styles/theme.css +75 -0
- package/styles/variables.scss +60 -0
- package/types/zambon-dev-ui-framework.d.ts +1496 -0
- package/types/zambon-dev-ui-library.d.ts +1675 -0
- package/types/zambon-dev-ui-shared.d.ts +675 -0
- package/types/zambon-dev-ui-testing.d.ts +51 -0
- package/types/zambon-dev-ui.d.ts +3 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zambon-dev-ui-library.mjs","names":[],"sources":["../../../../libs/ui/src/library/components/base.component.ts","../../../../libs/ui/src/library/helpers/date-helpers.ts","../../../../libs/ui/src/library/helpers/display-controls.ts","../../../../libs/ui/src/library/helpers/guid-helper.ts","../../../../libs/ui/src/library/helpers/route-formatter.ts","../../../../libs/ui/src/library/services/catalog.service.ts","../../../../libs/ui/src/library/services/data-providers/data-provider.service.ts","../../../../libs/ui/src/library/services/datasets/base.dataset.ts","../../../../libs/ui/src/library/services/configs-providers/grid-configs.provider.ts","../../../../libs/ui/src/library/services/datasets/grid.dataset.ts","../../../../libs/ui/src/library/services/datasets/data-grid.dataset.ts","../../../../libs/ui/src/library/services/datasets/multi-editor.dataset.ts","../../../../libs/ui/src/library/services/datasets/multi-select-result.dataset.ts","../../../../libs/ui/src/library/services/form-group.service.ts","../../../../libs/ui/src/library/services/form.service.ts","../../../../libs/ui/src/library/models/ribbon-group-child.ts","../../../../libs/ui/src/library/models/sidebar/sidebar-configs.ts","../../../../libs/ui/src/library/models/sidebar/sidebar-menu.ts","../../../../libs/ui/src/library/models/sidebar/sidebar-menu-open-mode.ts","../../../../libs/ui/src/library/services/sidebar.service.ts","../../../../libs/ui/src/library/components/form-input/form-input.component.ts","../../../../libs/ui/src/library/components/form-input/form-input.component.html","../../../../libs/ui/src/library/components/form-input-group/form-input-group.component.ts","../../../../libs/ui/src/library/components/form-input-group/form-input-group.component.html","../../../../libs/ui/src/library/components/catalog-select/catalog-select.component.ts","../../../../libs/ui/src/library/components/catalog-select/catalog-select.component.html","../../../../libs/ui/src/library/components/data-grid-row/data-grid-row.component.ts","../../../../libs/ui/src/library/components/data-grid-row/data-grid-row.component.html","../../../../libs/ui/src/library/components/data-grid/data-grid.component.ts","../../../../libs/ui/src/library/components/data-grid/data-grid.component.html","../../../../libs/ui/src/library/components/form-group/form-group.component.ts","../../../../libs/ui/src/library/components/form-group/form-group.component.html","../../../../libs/ui/src/library/components/group-accordion/group-accordion.component.ts","../../../../libs/ui/src/library/components/group-accordion/group-accordion.component.html","../../../../libs/ui/src/library/directives/scroll-spy.directive.ts","../../../../libs/ui/src/library/components/group-container/group-container.component.ts","../../../../libs/ui/src/library/components/group-container/group-container.component.html","../../../../libs/ui/src/library/components/group-scroll-spy/group-scroll-spy.component.ts","../../../../libs/ui/src/library/components/group-scroll-spy/group-scroll-spy.component.html","../../../../libs/ui/src/library/components/modal/modal.component.ts","../../../../libs/ui/src/library/components/modal/modal.component.html","../../../../libs/ui/src/library/components/multi-editor/multi-editor.component.ts","../../../../libs/ui/src/library/components/multi-editor/multi-editor.component.html","../../../../libs/ui/src/library/components/multi-select/result-grid/result-grid.component.ts","../../../../libs/ui/src/library/components/multi-select/result-grid/result-grid.component.html","../../../../libs/ui/src/library/components/multi-select/multi-select.component.ts","../../../../libs/ui/src/library/components/multi-select/multi-select.component.html","../../../../libs/ui/src/library/components/sidebar-item/sidebar-item.component.ts","../../../../libs/ui/src/library/components/sidebar-item/sidebar-item.component.html","../../../../libs/ui/src/library/components/sidebar/sidebar.component.ts","../../../../libs/ui/src/library/components/sidebar/sidebar.component.html","../../../../libs/ui/src/library/components/ribbon-button/ribbon-button.component.ts","../../../../libs/ui/src/library/components/ribbon-button/ribbon-button.component.html","../../../../libs/ui/src/library/components/ribbon/ribbon.component.ts","../../../../libs/ui/src/library/components/ribbon/ribbon.component.html","../../../../libs/ui/src/library/components/ribbon-group/ribbon-group.component.ts","../../../../libs/ui/src/library/components/ribbon-group/ribbon-group.component.html","../../../../libs/ui/src/library/pipes/enum.ts","../../../../libs/ui/src/library/pipes/replace-many.pipe.ts","../../../../libs/ui/src/library/pipes/replace.pipe.ts","../../../../libs/ui/src/library/library.module.ts","../../../../libs/ui/src/library/services/configs-providers/data-grid-configs.provider.ts","../../../../libs/ui/src/library/validators/date.validators.ts"],"sourcesContent":["import { Component, OnDestroy } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n// No strategy on purpose: Angular never inherits `changeDetection`, so one declared here would\n// describe a class that is never instantiated, while every subclass compiles to whatever it\n// declares -- which in v22 means OnPush. Correctness comes from the state below notifying\n// Angular, never from this decorator. See docs/guides/reactivity.md.\n@Component({ template: '' })\nexport abstract class BaseComponent implements OnDestroy {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Host listeners\n //#endregion\n\n //#region Variables\n protected destroy$: Subject<boolean> = new Subject<boolean>();\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n public ngOnDestroy(): void {\n this.destroy$.next(true);\n this.destroy$.complete();\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n //#endregion\n\n //#region Private methods\n //#endregion\n}\n","export class DateHelpers {\n //#region Public methods\n public static diffDays(initialDate: Date, finalDate: Date): number {\n const initialDateOnly: Date = new Date(initialDate.getFullYear(), initialDate.getMonth(), initialDate.getDate());\n const finalDateOnly: Date = new Date(finalDate.getFullYear(), finalDate.getMonth(), finalDate.getDate());\n\n const diff: number = initialDateOnly.getTime() - finalDateOnly.getTime();\n return Math.floor(diff / (1000 * 60 * 60 * 24));\n }\n //#endregion\n}\n","import { AbstractControl } from '@angular/forms';\n\n/**\n * Tracks the form controls that exist only to show a catalog selection's label.\n *\n * `lib-catalog-select` works in pairs: the control named by `controlName` holds the identifier, and\n * the one named by `displayControlName` holds the text the user reads. The second is created by the\n * component itself when a screen does not declare it, so a form ends up carrying controls nobody\n * wrote down — and a filters form then submits them alongside the real filters.\n *\n * The mark lives in a `WeakSet` keyed by the control instance rather than by its name. That is the\n * only scope that is actually correct: two forms may each have an `employeeName`, and only the one\n * a catalog select drives is a display control. It also keeps nothing alive.\n */\nexport class DisplayControls {\n //#region Variables\n private static readonly marked: WeakSet<AbstractControl> = new WeakSet<AbstractControl>();\n //#endregion\n\n //#region Public methods\n /**\n * Whether the control exists only to display a catalog selection's label.\n *\n * @param control The control, which may be absent.\n * @returns `true` when a catalog select drives it as its display control.\n */\n public static isDisplayControl(control: AbstractControl | null | undefined): boolean {\n return !!control && DisplayControls.marked.has(control);\n }\n\n /**\n * Marks the control as existing only to display a catalog selection's label.\n *\n * @param control The control, which may be absent.\n */\n public static markAsDisplayControl(control: AbstractControl | null | undefined): void {\n if (control) {\n DisplayControls.marked.add(control);\n }\n }\n //#endregion\n}\n","export class GuidHelper {\n public static generateGUID(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c: string) => {\n const r: number = (Math.random() * 16) | 0;\n const v: number = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n","import { ActivatedRouteSnapshot } from '@angular/router';\n\nexport abstract class RouterFormatter {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public static getURL(route: ActivatedRouteSnapshot): string {\n let parentRoute = '';\n if (route.parent) {\n parentRoute = this.getURL(route.parent);\n }\n\n let path = route.routeConfig?.path ?? '';\n route.paramMap.keys.forEach((k) => {\n path = path.replace(':' + k, k === 'view' ? '' : (route.paramMap.get(k) ?? ''));\n });\n\n if (!route.parent || (parentRoute !== '' && parentRoute !== '/' && route.routeConfig?.path && path)) {\n parentRoute += '/';\n }\n\n return parentRoute + path;\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\n\nimport { ICatalogResult } from '../models/catalog-result';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CatalogService {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n private http: HttpClient = inject(HttpClient);\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public search(\n endpoint: string,\n maxResults: number,\n criteria?: string,\n filters: { [key: string]: string } | null = null,\n ): Observable<ICatalogResult> {\n return this.http.post<ICatalogResult>(`${endpoint}`, { maxResults, criteria, filters });\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { inject, Injectable, OnDestroy, signal, WritableSignal } from '@angular/core';\nimport { ActivatedRoute, ParamMap } from '@angular/router';\nimport { Observable, ReplaySubject, Subject, take } from 'rxjs';\n\n@Injectable()\nexport abstract class DataProviderService<TEntityModel> implements OnDestroy {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n protected activatedRoute: ActivatedRoute = inject(ActivatedRoute);\n protected destroy$: Subject<boolean> = new Subject<boolean>();\n protected shouldLazyLoad = false;\n\n // A signal rather than a field: `hasEntityID` is read from templates -- the New and Edit\n // buttons are only shown once a record exists -- and the route resolving or a save assigning\n // an id told Angular nothing. The accessors below keep their old shape.\n private readonly _entityID: WritableSignal<number | undefined> = signal(undefined);\n private errorSubject: Subject<HttpErrorResponse> = new Subject<HttpErrorResponse>();\n private isLoading = false;\n private isModelLoaded = false;\n private modelCache: ReplaySubject<TEntityModel | null> = new ReplaySubject<TEntityModel | null>(1);\n //#endregion\n\n //#region Properties\n public get entityID(): number | undefined {\n return this._entityID();\n }\n\n public get hasEntityID(): boolean {\n return !!this.entityID;\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n this.activatedRoute.paramMap.pipe(take(1)).subscribe((paramMap: ParamMap) => {\n const newID = Number(paramMap.get('id'));\n if (newID !== this.entityID) {\n this._entityID.set(newID);\n\n // Need to wait for the data-provider to be initialized.\n queueMicrotask(() => {\n // When lazy loading, the model should be loaded by the consuming component.\n if (!this.shouldLazyLoad) {\n this.refreshModel();\n }\n });\n }\n });\n }\n\n public ngOnDestroy(): void {\n this.destroy$.next(true);\n this.destroy$.complete();\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public getError$(): Observable<HttpErrorResponse> {\n return this.errorSubject.asObservable();\n }\n\n public abstract getTitle(entity: TEntityModel): string;\n\n public getModel$(): Observable<TEntityModel | null> {\n if (!this.isModelLoaded && !this.shouldLazyLoad) {\n this.refreshModel();\n }\n return this.modelCache.asObservable();\n }\n\n public refreshModel(): void {\n if (this.isLoading) {\n return;\n }\n\n this.isLoading = true;\n\n this.loadModel(this.entityID)\n .pipe(take(1))\n .subscribe({\n next: (model: TEntityModel | null) => {\n this.isLoading = false;\n this.updateModel(model);\n },\n error: (error: HttpErrorResponse) => {\n this.isLoading = false;\n this.isModelLoaded = true;\n this.modelCache.next(null);\n this.errorSubject.next(error);\n },\n });\n }\n\n public resetForNewEntity(): void {\n this._entityID.set(undefined);\n this.isModelLoaded = false;\n this.modelCache.next(null);\n }\n\n public abstract saveModel(model: any): Observable<TEntityModel>;\n\n public updateModel(model: any): void {\n this.isModelLoaded = true;\n\n // Update entity ID if changed.\n if (model && (model as any).id !== this.entityID) {\n this._entityID.set((model as any).id);\n }\n\n this.modelCache.next(model);\n }\n //#endregion\n\n //#region Private methods\n protected abstract loadModel(entityID?: number): Observable<TEntityModel | null>;\n //#endregion\n}\n","import { inject, Injectable, OnDestroy, signal, WritableSignal } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { DataProviderService } from '../data-providers';\n\n@Injectable()\nexport abstract class BaseDataset implements OnDestroy {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n /**\n * Bumped by every write to dataset state, and read by every accessor below it.\n *\n * A dataset is rows, keys and selections mutated in place -- pushed, spliced, reassigned -- so a\n * signal holding the array could not see the change. This counter stands in for one: the read\n * inside each accessor is what makes a template using it re-render. It is a bridge for mutable\n * collections, not a pattern to copy into a component; there the state itself is the signal.\n * See docs/guides/reactivity.md.\n */\n private readonly revision: WritableSignal<number> = signal(0);\n\n protected dataProvider: DataProviderService<any> | null;\n protected destroy$: Subject<boolean> = new Subject<boolean>();\n\n // TODO: Remove.\n private _parentEntityId?: any;\n //#endregion\n\n //#region Properties\n // TODO: Remove.\n public get parentEntityId(): any {\n return this._parentEntityId;\n }\n public set parentEntityId(value: any) {\n this._parentEntityId = value;\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n this.dataProvider = inject(DataProviderService, { optional: true });\n }\n\n public ngOnDestroy(): void {\n this.destroy$.next(true);\n this.destroy$.complete();\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n //#endregion\n\n //#region Protected methods\n // Both are guarded: the logic specs build datasets with Object.create(), which runs no field\n // initialiser, so `revision` is genuinely absent there. Nothing to notify and nothing to track\n // in that case, which is correct -- those specs assert state, not rendering.\n\n /** Announces that dataset state changed, so views reading it re-render. */\n protected touched(): void {\n this.revision?.update((revision: number) => revision + 1);\n }\n\n /** Takes a tracked dependency on the dataset's state. Call it first in any accessor. */\n protected tracked(): void {\n this.revision?.();\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}\n","import { Injectable } from '@angular/core';\nimport { GridConfigs } from '../../models/configs/grid-configs';\n\n@Injectable()\nexport class GridConfigsProvider<TGridConfigs extends GridConfigs = GridConfigs> {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n protected _configs: TGridConfigs;\n //#endregion\n\n //#region Properties\n public get configs(): TGridConfigs {\n return this._configs;\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n this._configs = {\n loadingDisplayText: 'Loading...',\n messageOnEmpty: 'No results',\n recordBlockSize: 100,\n rowHeight: 41.6,\n rowsToDisplay: 6,\n } as TGridConfigs;\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n //#endregion\n\n //#region Private methods\n //#endregion\n}\n","import { EventEmitter, inject, Injectable } from '@angular/core';\nimport { Observable, take } from 'rxjs';\nimport { GuidHelper } from '../../helpers';\nimport { GridConfigs } from '../../models/configs/grid-configs';\nimport { GridConfigsProvider } from '../configs-providers/grid-configs.provider';\nimport { BaseDataset } from './base.dataset';\n\nconst KEY_FIELD = '_key';\n\n@Injectable()\nexport abstract class GridDataset extends BaseDataset {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n public configs: GridConfigs;\n public filtersChanged: EventEmitter<{ [key: string]: string }> = new EventEmitter<{ [key: string]: string }>();\n private _isLoading = false;\n private _loadedLastRow = false;\n private _totalRows?: number;\n public loadFinished: EventEmitter<boolean> = new EventEmitter<boolean>();\n public loadStarted: EventEmitter<void> = new EventEmitter<void>();\n\n protected compareProperty = 'id';\n protected configsProvider: GridConfigsProvider;\n protected focusedRow: string | null = null;\n protected recordBlock = 0;\n\n private _hasBeenLoaded = false;\n private _loadedKeys?: string[];\n private _loadedRows?: any[];\n private queryFilters?: { [key: string]: string };\n //#endregion\n\n //#region Properties\n public get isLoading(): boolean {\n this.tracked();\n return this._isLoading;\n }\n public set isLoading(value: boolean) {\n this._isLoading = value;\n this.touched();\n }\n\n public get loadedLastRow(): boolean {\n this.tracked();\n return this._loadedLastRow;\n }\n public set loadedLastRow(value: boolean) {\n this._loadedLastRow = value;\n this.touched();\n }\n\n public get totalRows(): number | undefined {\n this.tracked();\n return this._totalRows;\n }\n public set totalRows(value: number | undefined) {\n this._totalRows = value;\n this.touched();\n }\n\n public get filters(): { [key: string]: string } | undefined {\n this.tracked();\n return this.queryFilters;\n }\n\n public get hasBeenLoaded(): boolean {\n this.tracked();\n return this._hasBeenLoaded;\n }\n\n public get hasLoadedRows(): boolean {\n this.tracked();\n return !!this._loadedRows && this._loadedRows.length > 0;\n }\n\n public get keyProperty(): string {\n return this.compareProperty;\n }\n\n public get loadedKeys(): string[] | undefined {\n this.tracked();\n return this._loadedKeys;\n }\n\n public get loadedRows(): any[] | undefined {\n this.tracked();\n return this._loadedRows;\n }\n\n public override get parentEntityId(): any {\n return super.parentEntityId;\n }\n\n public override set parentEntityId(value: any) {\n super.parentEntityId = value;\n if (this.loadedRows) {\n this.refresh();\n }\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super();\n\n this.configsProvider = inject(GridConfigsProvider);\n this.configs = JSON.parse(JSON.stringify(this.configsProvider.configs));\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public addNewRow(row: any): void {\n this.updateLoadedRows([row]);\n }\n\n /** The key of the currently focused row, or null. Read by DataGridRowComponent's host binding. */\n public get focusedRowKey(): string | null {\n this.tracked();\n return this.focusedRow;\n }\n\n public clearFocusedRow(): void {\n this.focusedRow = null;\n this.touched();\n }\n\n public getRowData(key: string): any | null {\n if (this.hasLoadedRows) {\n const index: number = this._loadedKeys!.indexOf(key);\n return this.loadedRows![index];\n }\n return null;\n }\n\n public getRowID(key: string): any {\n const row: any = this.getRowData(key);\n\n return this.compareProperty.split('.').reduce((row: any, property: string) => row[property], row);\n }\n\n public getRowInternalKey(row: any): string {\n return row[KEY_FIELD];\n }\n\n public hasRowWithID(id: any): boolean {\n if (!this.hasLoadedRows) {\n return false;\n }\n\n const loadedIDs: any[] = this.compareProperty\n .split('.')\n .reduce(\n (loadedRows: any[], property: string) => loadedRows.map((row: any) => row[property]),\n this._loadedRows ?? [],\n )\n .map((row: any) => (typeof id === 'string' ? `${row}` : typeof id === 'number' ? parseInt(`${row}`) : row));\n\n return loadedIDs.indexOf(id) >= 0;\n }\n\n public isKeyExists(key: string): boolean {\n return this.hasLoadedRows && this._loadedKeys!.some((x: string) => x === key);\n }\n\n public loadRows(): void {\n if (this.isLoading) {\n return;\n }\n\n this.isLoading = true;\n this.loadStarted.emit();\n\n const parameters: any = {\n endRow: this.configsProvider.configs.recordBlockSize,\n filters: this.queryFilters,\n startRow: this.recordBlock,\n };\n\n this.getData(parameters)\n .pipe(take(1))\n .subscribe({\n next: (response: any[] | { items: any[]; totalRows: number }) => {\n let rows: any[];\n if (Array.isArray(response)) {\n rows = response;\n } else {\n rows = response?.items ?? [];\n this.totalRows = response?.totalRows;\n }\n\n this.updateLoadedRows(rows ?? []);\n\n this.isLoading = false;\n this._hasBeenLoaded = true;\n this.touched();\n this.loadFinished.emit(true);\n },\n error: (_: any) => {\n this.isLoading = false;\n this.loadFinished.emit(false);\n },\n });\n }\n\n public refresh(): void {\n if (this.focusedRow) {\n this.clearFocusedRow();\n }\n this.clearLoadedRows();\n this.loadRows();\n }\n\n public removeKeys(keys: string[]): void {\n if (!this.hasLoadedRows) {\n return;\n }\n\n keys.forEach((key: string) => {\n if (this.focusedRow === key) {\n this.clearFocusedRow();\n }\n\n const indexToRemove: number = this._loadedKeys!.indexOf(key);\n\n if (indexToRemove >= 0) {\n // Need to set again the array values to trigger the change detection.\n this._loadedKeys = this._loadedKeys!.filter((_, index) => index !== indexToRemove);\n this.touched();\n this._loadedRows = this._loadedRows!.filter((_, index) => index !== indexToRemove);\n this.touched();\n }\n });\n }\n\n public setFilters(filters?: { [key: string]: string }): void {\n this.queryFilters = filters;\n this.filtersChanged.emit(filters);\n this.refresh();\n }\n\n public setFocusedRow(key: string): void {\n this.focusedRow = key;\n this.touched();\n }\n\n public updateRow(key: string, newRowData: any): void {\n if (!this.hasLoadedRows) {\n return;\n }\n\n const index: number = this._loadedKeys!.indexOf(key);\n if (index >= 0) {\n // Need to set the KEY_FIELD value into the new data, to make sure this information is not lost.\n newRowData[KEY_FIELD] = key;\n\n this._loadedRows![index] = newRowData;\n\n // Need to update loaded rows to force displayed rows to refresh.\n this.updateLoadedRows([]);\n }\n }\n //#endregion\n\n //#region Private methods\n protected clearLoadedRows(): void {\n this._hasBeenLoaded = false;\n this.touched();\n this._loadedRows = undefined;\n this.touched();\n this._loadedKeys = undefined;\n this.touched();\n this.recordBlock = 0;\n this.loadedLastRow = false;\n this.totalRows = undefined;\n }\n\n protected updateLoadedRows(rows: any[]): void {\n // Assign individual key to each row.\n rows.forEach((row: any) => {\n row[KEY_FIELD] = GuidHelper.generateGUID();\n });\n\n this._loadedRows = [...(this._loadedRows ?? []), ...rows];\n this.touched();\n this._loadedKeys = [...(this._loadedKeys ?? []), ...rows.map((row: any) => row[KEY_FIELD])];\n this.touched();\n\n this.recordBlock += rows.length;\n if (rows.length < this.configsProvider.configs.recordBlockSize) {\n this.loadedLastRow = true;\n }\n }\n //#endregion\n\n //#region Abstract methods\n abstract getData(params?: any): Observable<any[] | { items: any[]; totalRows: number }>;\n //#endregion\n}\n","import { HttpResponse } from '@angular/common/http';\nimport { EventEmitter, Injectable } from '@angular/core';\nimport { Observable, throwError } from 'rxjs';\nimport { DataGridConfigs } from '../../models/configs/data-grid-configs';\nimport { IListParameters } from '../../models/data-grid-parameters';\nimport { IGridColumn } from '../../models/grid-column';\nimport { GridDataset } from './grid.dataset';\n\n@Injectable()\nexport abstract class DataGridDataset extends GridDataset {\n //#region ViewChilds, Inputs, Outputs\n public selectedRowsChanged: EventEmitter<{ [id: string]: { rowData: any; selected: boolean } }> = new EventEmitter<{\n [id: string]: { rowData: any; selected: boolean };\n }>();\n //#endregion\n\n //#region Variables\n public override configs: DataGridConfigs;\n\n public columns!: IGridColumn[];\n\n private _selectedRowKeys: string[] = [];\n //#endregion\n\n //#region Properties\n public get selectedRowKeys(): string[] {\n this.tracked();\n return this._selectedRowKeys;\n }\n public set selectedRowKeys(value: string[]) {\n this._selectedRowKeys = value;\n this.touched();\n }\n\n public get columnsSize(): string {\n const sizes: string[] = [];\n\n if (this.configs.multiSelect) {\n sizes.push(this.configs.multiSelectSize ?? 'minmax(1.5rem,min-content)');\n }\n\n sizes.push(...this.columns.map((col: IGridColumn) => col.size ?? 'minmax(0,1fr)'));\n\n return sizes.join(' ');\n }\n\n public get hasSelectedRows(): boolean {\n return this.selectedRowKeys.length > 0;\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super();\n\n this.configs = JSON.parse(JSON.stringify(this.configsProvider.configs));\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public clearSelection(): void {\n if (!this.hasLoadedRows || !this.hasSelectedRows) {\n return;\n }\n\n const selectedKeys: string[] = this.selectedRowKeys;\n\n this.selectedRowKeys = [];\n this.clearFocusedRow();\n this.selectedRowsChanged.emit(\n selectedKeys.reduce((keys: { [id: string]: { rowData: any; selected: boolean } }, key: string) => {\n keys[key] = {\n rowData: this.getRowData(key),\n selected: false,\n };\n return keys;\n }, {}),\n );\n }\n\n public export(_format: string, _parameters: IListParameters): Observable<HttpResponse<Blob>> {\n return throwError(() => new Error(`Export is not implemented for ${this.constructor.name}.`));\n }\n\n public deselectRow(key: string): void {\n if (!this.hasLoadedRows || !this.isKeySelected(key)) {\n return;\n }\n\n this.removeSelectedRow(key);\n\n this.selectedRowsChanged.emit({\n [key]: {\n rowData: this.getRowData(key),\n selected: false,\n },\n });\n }\n\n public deselectRowID(id: any): void {\n if (!this.hasLoadedRows) {\n return;\n }\n\n const index: number = this.loadedKeys!.map((key: string) => this.getRowID(key)).indexOf(id);\n\n const key: string = this.loadedKeys![index];\n this.deselectRow(key);\n }\n\n public getSelectedRowsData(): any[] {\n if (!this.hasLoadedRows || !this.hasSelectedRows) {\n return [];\n }\n\n return this.selectedRowKeys\n .map((key: string) => this.loadedKeys!.indexOf(key))\n .filter((index: number) => index >= 0)\n .map((index: number) => this.loadedRows![index]);\n }\n\n public isKeySelected(key: any): boolean {\n return this.selectedRowKeys.indexOf(key) >= 0;\n }\n\n public override refresh(): void {\n if (this.hasSelectedRows) {\n this.clearSelection();\n }\n super.refresh();\n }\n\n public override removeKeys(keys: string[]): void {\n if (!this.hasLoadedRows) {\n return;\n }\n\n if (this.hasSelectedRows) {\n keys\n .filter((key: string) => this.isKeySelected(key))\n .forEach((key: string) => {\n this.removeSelectedRow(key);\n });\n }\n\n super.removeKeys(keys);\n }\n\n public selectRow(key: string): void {\n if (!this.hasLoadedRows) {\n return;\n }\n\n if (!this.configs.multiSelect) {\n if (this.isKeySelected(key)) {\n return;\n }\n // Clear current selected row.\n this.removeSelectedRow(this.selectedRowKeys[0]);\n }\n\n if (!this.isKeySelected(key)) {\n this._selectedRowKeys.push(key);\n this.touched();\n this.selectedRowsChanged.emit({\n [key]: {\n rowData: this.getRowData(key),\n selected: true,\n },\n });\n }\n }\n\n public selectRowID(id: any): void {\n if (!this.hasLoadedRows) {\n return;\n }\n\n if (this.hasRowWithID(id)) {\n const rowIndex: number = this.loadedRows!.findIndex((row: any) => row[this.compareProperty] === id);\n\n if (rowIndex < 0) {\n return;\n }\n\n const key: string | undefined = this.loadedKeys![rowIndex];\n if (key) {\n this.selectRow(key);\n }\n }\n }\n\n public selectRows(keys: string[]): void {\n if (!this.hasLoadedRows || !this.configs.multiSelect) {\n return;\n }\n\n // Filter only the keys that are not selected yet.\n const keysNotSelected: string[] = keys.filter((key: string) => !this.isKeySelected(key));\n\n if (keysNotSelected.length > 0) {\n this._selectedRowKeys.push(...keysNotSelected);\n this.touched();\n this.selectedRowsChanged.emit(\n keys.reduce((keys: { [id: string]: { rowData: any; selected: boolean } }, key: string) => {\n keys[key] = {\n rowData: this.getRowData(key),\n selected: true,\n };\n return keys;\n }, {}),\n );\n }\n }\n\n public override setFocusedRow(key: any): void {\n super.setFocusedRow(key);\n\n if (!this.configs.multiSelect) {\n this.selectRow(key);\n } else if (this.configs.selectOnClick ?? true) {\n if (this.isKeySelected(key)) {\n this.deselectRow(key);\n } else {\n this.selectRow(key);\n }\n }\n }\n //#endregion\n\n //#region Private methods\n protected removeSelectedRow(key: string): void {\n const index: number = this.selectedRowKeys.indexOf(key);\n if (index >= 0) {\n this._selectedRowKeys.splice(index, 1);\n this.touched();\n }\n }\n //#endregion\n}\n","import { EventEmitter, inject, Injectable } from '@angular/core';\nimport { Observable, tap } from 'rxjs';\nimport { IBatchUpdate } from '../../models/batch-update';\nimport { IMultiEditorChanges } from '../../models/multi-editor-changes';\nimport { BaseDataset } from './base.dataset';\nimport { DataGridDataset } from './data-grid.dataset';\n\n@Injectable()\nexport abstract class MultiEditorDataset extends BaseDataset {\n //#region ViewChilds, Inputs, Outputs\n public savedChanges: EventEmitter<void> = new EventEmitter();\n //#endregion\n\n //#region Variables\n protected readonly dataGridDataset: DataGridDataset;\n\n private fakeIDsGenerated: any[] = [];\n private modifiedValues: IMultiEditorChanges = {\n changed: {},\n removed: [],\n };\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super();\n\n this.dataGridDataset = inject(DataGridDataset);\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public clearChangedValues(): void {\n this.fakeIDsGenerated = [];\n\n this.modifiedValues = {\n changed: {},\n removed: [],\n };\n }\n\n public removeValue(key: string): void {\n if (this.modifiedValues.changed[key]) {\n delete this.modifiedValues.changed[key];\n }\n\n const id: any = this.dataGridDataset.getRowID(key);\n this.dataGridDataset.removeKeys([key]);\n\n if (!id) {\n return;\n }\n\n if (this.fakeIDsGenerated.indexOf(id) < 0) {\n this.modifiedValues.removed.push(id);\n } else {\n this.fakeIDsGenerated.splice(this.fakeIDsGenerated.indexOf(id), 1);\n }\n }\n\n public saveChanges(): Observable<any> {\n const batchUpdate: IBatchUpdate<any, any> = {\n entitiesToInsertOrUpdate: Object.entries(this.modifiedValues.changed).map(([_, v]: [string, string]) => v),\n entitiesToDelete: this.modifiedValues.removed,\n };\n\n return this.saveData(batchUpdate).pipe(tap(() => this.savedChanges.emit()));\n }\n\n public storeFakeIDGenerated(id: any): void {\n if (this.fakeIDsGenerated.indexOf(id) >= 0) {\n return;\n }\n\n this.fakeIDsGenerated.push(id);\n }\n\n public updateValues(key: string, newRowData: any): void {\n this.modifiedValues.changed[key] = newRowData;\n\n this.dataGridDataset.updateRow(key, newRowData);\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n\n //#region Abstract methods\n public abstract newData(id: any): any;\n\n public abstract saveData(batchUpdate: IBatchUpdate<any, any>): Observable<any>;\n //#endregion\n}\n","import { EventEmitter, Injectable } from '@angular/core';\nimport { Observable, tap } from 'rxjs';\nimport { IMultiSelectorChanges } from '../../models/multi-selector-changes';\nimport { GridDataset } from './grid.dataset';\n\n@Injectable()\nexport abstract class MultiSelectResultDataset extends GridDataset {\n //#region ViewChilds, Inputs, Outputs\n public savedChanges: EventEmitter<void> = new EventEmitter();\n //#endregion\n\n //#region Variables\n private _displayedIDs: any[] = [];\n private _displayedRows: any[] = [];\n\n private _idsToAdd: any[] = [];\n private _idsToRemove: any[] = [];\n private addedRowData: any[] = [];\n //#endregion\n\n //#region Properties\n public get displayedIDs(): any[] {\n this.tracked();\n return this._displayedIDs;\n }\n\n public get displayedRows(): any[] {\n this.tracked();\n return this._displayedRows;\n }\n\n public get idsToAdd(): any[] {\n this.tracked();\n return this._idsToAdd;\n }\n\n public get idsToRemove(): any[] {\n this.tracked();\n return this._idsToRemove;\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public override refresh(): void {\n this.clearSelection();\n super.refresh();\n }\n\n public saveChanges(): Observable<any> {\n const changes: IMultiSelectorChanges = {\n idsToAdd: this.idsToAdd,\n idsToRemove: this.idsToRemove,\n };\n\n return this.saveData(changes).pipe(\n tap(() => {\n this.savedChanges.emit();\n this.clearSelection();\n this.clearLoadedRows();\n }),\n );\n }\n\n /**\n * Records that an entry is to be added, if it is not already recorded or already saved.\n *\n * Idempotent: the same entry can be reported more than once, because a click on the grid and a\n * click in the panel both land here through different paths.\n */\n public setIDToAdd(idToAdd: any, rowData: any): void {\n const index: number = this._idsToRemove.indexOf(idToAdd);\n if (index >= 0) {\n this._idsToRemove.splice(index, 1);\n this.touched();\n } else if (!this.isExistingID(idToAdd) && this._idsToAdd.indexOf(idToAdd) < 0) {\n this._idsToAdd.push(idToAdd);\n this.touched();\n this.addedRowData.push(rowData);\n }\n this.updateDisplayedRows();\n }\n\n /** Idempotent, for the same reason as {@link setIDToAdd}. */\n public setIDToRemove(idToRemove: any): void {\n const index: number = this._idsToAdd.indexOf(idToRemove);\n if (index >= 0) {\n this._idsToAdd.splice(index, 1);\n this.touched();\n this.addedRowData.splice(index, 1);\n } else if (this.isExistingID(idToRemove) && this._idsToRemove.indexOf(idToRemove) < 0) {\n this._idsToRemove.push(idToRemove);\n this.touched();\n }\n this.updateDisplayedRows();\n }\n\n protected override updateLoadedRows(rows: any[]): void {\n super.updateLoadedRows(rows);\n this.updateDisplayedRows();\n }\n //#endregion\n\n //#region Private methods\n private clearSelection(): void {\n this._idsToAdd = [];\n this._idsToRemove = [];\n this.addedRowData = [];\n\n this.updateDisplayedRows();\n }\n\n private isExistingID(id: any): boolean {\n return (this.loadedKeys ?? []).map((key: string) => this.getRowID(key)).indexOf(id) >= 0;\n }\n\n private updateDisplayedRows() {\n const loadedKeys: string[] = (this.loadedKeys ?? []).filter(\n (key: string) => this.idsToRemove.indexOf(this.getRowID(key)) < 0,\n );\n\n this._displayedIDs = loadedKeys.map((key: string) => this.getRowID(key));\n this.touched();\n this._displayedIDs.push(...this._idsToAdd);\n this.touched();\n\n this._displayedRows = loadedKeys.map((key: string) => this.getRowData(key));\n this.touched();\n this._displayedRows.push(...this.addedRowData);\n this.touched();\n }\n //#endregion\n\n //#region Abstract methods\n protected abstract saveData(changedIds: IMultiSelectorChanges): Observable<any>;\n //#endregion\n}\n","import { EventEmitter, Injectable } from '@angular/core';\n\n@Injectable()\nexport class FormGroupService {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n //#region Variables\n //#endregion\n //#region Properties\n //#endregion\n //#region Constructor and Angular life cycle methods\n //#endregion\n //#region Event handlers\n //#endregion\n //#region Public methods\n //#endregion\n //#region Private methods\n //#endregion\n}\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { EventEmitter, Injectable, signal, WritableSignal } from '@angular/core';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { Observable, Subject, Subscription } from 'rxjs';\n\n@Injectable()\nexport class FormService {\n //#region ViewChilds, Inputs, Outputs\n public fieldRefreshed = new EventEmitter<{ fieldName: string; value?: any; loading?: boolean }>();\n public modelRefreshed = new EventEmitter<any | null>();\n //#endregion\n\n //#region Variables\n // Signals rather than fields: these are read from templates through the accessors below, and a\n // plain assignment told Angular nothing. The accessors keep their old shape, so nothing that\n // reads or writes them has to change.\n private readonly _loading: WritableSignal<boolean> = signal(false);\n private readonly _model: WritableSignal<any | null> = signal(null);\n private readonly currentMode: WritableSignal<'edit' | 'view'> = signal('view');\n\n // A FormGroup's validity is not a signal and never notifies one, so its status is mirrored here\n // and `isValid` reads this. Without it a save button bound to isValid keeps its first answer.\n private readonly formStatus: WritableSignal<string | undefined> = signal(undefined);\n\n private editCanceled$: Subject<void> = new Subject<void>();\n private form?: FormGroup;\n // Held rather than tied to a DestroyRef: this service is also built directly in specs, outside\n // any injection context, and re-initialising with another form has to drop the old subscription.\n private formStatusSubscription?: Subscription;\n private initialValue?: any;\n //#endregion\n\n //#region Properties\n public get editCanceled(): Observable<void> {\n return this.editCanceled$.asObservable();\n }\n\n public get isEditMode(): boolean {\n return this.currentMode() === 'edit';\n }\n\n public get isValid(): boolean {\n this.formStatus();\n return this.form?.valid ?? false;\n }\n\n public get loading(): boolean {\n return this._loading();\n }\n\n public set loading(value: boolean) {\n if (this._loading() !== value) {\n this._loading.set(value);\n if (value) {\n this.form?.disable();\n } else if (this.isEditMode) {\n this.form?.enable();\n }\n }\n }\n\n public get model(): any | null {\n return this._model();\n }\n\n public set model(value: any | null) {\n if (this._model() !== value) {\n this._model.set(value);\n this.modelRefreshed.emit(value);\n }\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public beginEdit(): void {\n this.currentMode.set('edit');\n this.form?.enable();\n }\n\n public beginFieldLoading(fieldName: string) {\n this.fieldRefreshed.emit({\n fieldName,\n loading: true,\n });\n }\n\n public cancelEdit(): void {\n this.currentMode.set('view');\n this.form?.disable();\n this.resetForm();\n this.editCanceled$.next();\n }\n\n public disableForm(): void {\n this.form?.disable();\n }\n\n public enableForm(): void {\n if (this.isEditMode) {\n this.form?.enable();\n }\n }\n\n public getModelFromForm(): any {\n return this.form?.getRawValue();\n }\n\n public initializeForm(form: FormGroup): void {\n this.form = form;\n this.initialValue = form.getRawValue();\n\n this.formStatusSubscription?.unsubscribe();\n this.formStatus.set(form.status);\n this.formStatusSubscription = form.statusChanges.subscribe((status: string) => this.formStatus.set(status));\n\n if (this.currentMode() === 'view') {\n this.form.disable();\n }\n }\n\n public markAllAsTouched(): void {\n if (!this.form) {\n return;\n }\n\n this.form.markAllAsTouched();\n }\n\n public resetForm(): void {\n if (!this.form) {\n return;\n }\n\n this.form.reset();\n\n if (this.model) {\n this.form.patchValue(this.model);\n } else if (this.initialValue) {\n this.form.patchValue(this.initialValue);\n }\n\n this.form.updateValueAndValidity();\n }\n\n public setFieldValue(fieldName: string, value: any): void {\n this.fieldRefreshed.emit({\n fieldName,\n loading: false,\n value,\n });\n }\n\n public setValidationErrorsFromHttpResponse(errorResponse: HttpErrorResponse): void {\n if (!errorResponse || !this.form) {\n return;\n }\n\n // Error 400 = Validation issues\n if (errorResponse.status === 400 && errorResponse.error && errorResponse.error.errors) {\n const errors: { [id: string]: string[] } = <{ [id: string]: string[] }>errorResponse.error.errors;\n\n Object.keys(errors)\n .map((x: string) => {\n return { key: x, field: x.substring(0, 1).toLocaleLowerCase() + x.substring(1, x.length) };\n })\n .forEach((err: { key: string; field: string }) => {\n setTimeout(() => {\n const field: FormControl = <FormControl>this.form!.get(err.field);\n field?.setErrors({ [errors[err.key][0]]: true });\n field?.markAsTouched();\n });\n });\n }\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}\n","import { Signal } from '@angular/core';\n\n/**\n * A child that decides whether its ribbon group is shown at all.\n *\n * `isVisible` is a signal rather than a plain field because `RibbonGroupComponent` reads it from\n * a host binding, and Angular evaluates a component's host bindings during its PARENT's pass. A\n * child assigning a field could not reach that pass at all: nothing marked it, and writing it\n * afterwards raised NG0100. A signal read inside the group's binding is tracked, so flipping it\n * refreshes the group whatever strategy the host application uses.\n */\nexport abstract class RibbonGroupChild {\n abstract readonly isVisible: Signal<boolean>;\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const SIDEBAR_CONFIGS: InjectionToken<SidebarConfigs> = new InjectionToken<SidebarConfigs>('', {\n providedIn: 'root',\n factory: () => new SidebarConfigs(),\n});\n\nexport class SidebarConfigs {\n public errorText = 'Error';\n /** Tooltip for items that open in a new browser tab. Rendered as-is, like {@link errorText}. */\n public externalLinkText = 'Opens in a new browser tab';\n public loadingText = 'Loading';\n /**\n * Derive region headers from the menu tree instead of from {@link SidebarMenu.region}.\n *\n * With this on, a top-level menu that has children and no URL stops being a collapsible node\n * and becomes an area header, with its children rendered flat beneath it as top-level items --\n * icons included. The area is then a real menu row, so it carries its own translated label and\n * its own order, and no `region` label has to be repeated across every item that belongs to it.\n *\n * Off by default: without it a top-level parent stays the collapsible group it has always been.\n */\n public shouldDeriveAreasFromRootMenus = false;\n public logoCollapsedPath?: string;\n public logoExpandedPath?: string;\n\n constructor(options: Partial<SidebarConfigs> = {}) {\n Object.assign(this, options);\n }\n}\n","import { SidebarMenuOpenMode } from './sidebar-menu-open-mode';\n\nexport class SidebarMenu {\n public childCount = 0;\n public children: SidebarMenu[] = [];\n public height?: number;\n public icon?: string;\n public id = 0;\n public label = '';\n public isSelected = false;\n /**\n * How {@link url} is opened. An absent value means {@link SidebarMenuOpenMode.Internal}.\n *\n * Left optional and without an initializer on purpose: the constructor is an `Object.assign`,\n * which would overwrite a default with the `null` a nullable backend column serializes to.\n * Read it through `toSidebarMenuOpenMode(menu.openMode)` instead of comparing it directly.\n */\n public openMode?: SidebarMenuOpenMode;\n public parent: SidebarMenu | null = null;\n public region?: string;\n public url?: string;\n\n constructor(options: Partial<SidebarMenu> = {}) {\n Object.assign(this, options);\n }\n}\n","/**\n * How a {@link SidebarMenu}'s `url` is opened when the item is clicked.\n *\n * Read the value off a menu through {@link toSidebarMenuOpenMode} rather than comparing the\n * field directly: it crosses HTTP, so it can arrive as a string, as a number, as `null`, or not\n * at all.\n */\nexport enum SidebarMenuOpenMode {\n /** `url` is an internal Angular route and opens an application tab. The default. */\n Internal = 'internal',\n\n /** `url` is an absolute http(s) address and opens in a new browser tab. */\n ExternalNewTab = 'externalNewTab',\n\n /** `url` is an absolute http(s) address and opens embedded in an application tab. */\n ExternalEmbedded = 'externalEmbedded',\n}\n\n/** Ordinals matching the mode column stored by the backend, for a numeric payload. */\nconst ORDINAL_MODES: SidebarMenuOpenMode[] = [\n SidebarMenuOpenMode.Internal,\n SidebarMenuOpenMode.ExternalNewTab,\n SidebarMenuOpenMode.ExternalEmbedded,\n];\n\n/**\n * Parses the wire value of `SidebarMenu.openMode`.\n *\n * Deliberately a parser rather than a `?? Internal` fallback, because the field is deserialized\n * straight from each application's menu endpoint and its shape is not guaranteed:\n *\n * - a **number** is read as the backend's enum ordinal, which is what an ASP.NET Core enum\n * property serializes to unless that backend registers a string converter;\n * - a **string** is matched case-insensitively, so `'externalNewTab'` and `'ExternalNewTab'`\n * both work;\n * - anything else — an omitted field from a backend that predates this feature, `null`, or a\n * mode introduced by a newer one — degrades to {@link SidebarMenuOpenMode.Internal}.\n *\n * Degrading to `Internal` keeps an unrecognized mode behaving the way menus behaved before\n * external destinations existed, instead of producing an item that does nothing when clicked.\n */\nexport function toSidebarMenuOpenMode(value: unknown): SidebarMenuOpenMode {\n if (typeof value === 'number') {\n return ORDINAL_MODES[value] ?? SidebarMenuOpenMode.Internal;\n }\n\n if (typeof value === 'string') {\n const normalized: string = value.toLowerCase();\n\n return (\n ORDINAL_MODES.find((mode: SidebarMenuOpenMode) => mode.toLowerCase() === normalized) ??\n SidebarMenuOpenMode.Internal\n );\n }\n\n return SidebarMenuOpenMode.Internal;\n}\n","import { EventEmitter, Injectable, signal, WritableSignal } from '@angular/core';\nimport { map, Observable, take, tap } from 'rxjs';\nimport { ISidebarProfile, SidebarMenu, SidebarMenuOpenMode, toSidebarMenuOpenMode } from '../models';\nimport { HttpErrorResponse } from '@angular/common/http';\n\n@Injectable({\n providedIn: 'root',\n})\nexport abstract class SidebarService {\n //#region ViewChilds, Inputs, Outputs\n public childrenFailed: EventEmitter<SidebarMenu> = new EventEmitter<SidebarMenu>();\n public childrenLoading: EventEmitter<SidebarMenu> = new EventEmitter<SidebarMenu>();\n public childrenInitialized: EventEmitter<SidebarMenu> = new EventEmitter<SidebarMenu>();\n public menuExternalUrlSelected: EventEmitter<SidebarMenu> = new EventEmitter<SidebarMenu>();\n public menuUrlSelected: EventEmitter<SidebarMenu> = new EventEmitter<SidebarMenu>();\n public selectionChanged: EventEmitter<SidebarMenu> = new EventEmitter<SidebarMenu>();\n //#endregion\n\n //#region Variables\n // Signals rather than plain fields: a sidebar component reads these through a getter in its\n // template, and a signal read there is tracked, so flipping one renders the sidebar whatever\n // change-detection strategy the host application uses. A plain assignment told Angular nothing,\n // which is why the sidebar could sit on a stale frame until the user clicked something.\n private readonly _isActive: WritableSignal<boolean> = signal(false);\n private readonly _isCollapsed: WritableSignal<boolean> = signal(false);\n private readonly _shouldActivate: WritableSignal<boolean> = signal(false);\n\n private menus: SidebarMenu[] = [];\n private selectedMenu: SidebarMenu | null = null;\n //#endregion\n\n //#region Properties\n /** Whether the collapsed sidebar is currently held open. */\n public get isActive(): boolean {\n return this._isActive();\n }\n public set isActive(value: boolean) {\n this._isActive.set(value);\n }\n\n public get isCollapsed(): boolean {\n return this._isCollapsed();\n }\n public set isCollapsed(value: boolean) {\n this._isCollapsed.set(value);\n }\n\n /** Whether a click should hold the sidebar open, which depends on width and collapsed state. */\n public get shouldActivate(): boolean {\n return this._shouldActivate();\n }\n public set shouldActivate(value: boolean) {\n this._shouldActivate.set(value);\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Public methods\n public deselectAll(): void {\n this.menus\n .filter((menu: SidebarMenu) => menu.isSelected)\n .forEach((menu: SidebarMenu) => {\n this.deselectMenu(menu);\n });\n }\n\n public loadChildren(parentMenu: SidebarMenu): void {\n this.childrenLoading.emit(parentMenu);\n\n this.loadChildrenFor(parentMenu).subscribe({\n error: (exception: HttpErrorResponse) => {\n this.childrenFailed.emit(parentMenu);\n throw exception;\n },\n });\n }\n\n /**\n * Loads a parent's children and hands them back, for callers that need them before the user\n * clicks -- a sidebar rendering areas flat has to have them up front. {@link loadChildren} is\n * the fire-and-forget variant that also raises the loading and failure events.\n */\n public loadChildrenFor(parentMenu: SidebarMenu): Observable<SidebarMenu[]> {\n return this.loadMenus(parentMenu).pipe(\n take(1),\n map((menus: SidebarMenu[]) => menus.map((menu: SidebarMenu) => new SidebarMenu(menu))),\n tap((childrenMenus: SidebarMenu[]) => {\n parentMenu.children = childrenMenus;\n childrenMenus.forEach((childMenu: SidebarMenu) => (childMenu.parent = parentMenu));\n }),\n );\n }\n\n public loadRoot(): Observable<SidebarMenu[]> {\n return this.loadMenus(null).pipe(\n take(1),\n map((menus: SidebarMenu[]) => menus.map((menu: SidebarMenu) => new SidebarMenu(menu))),\n tap((menus: SidebarMenu[]) => (this.menus = menus)),\n );\n }\n\n public select(menu: SidebarMenu): void {\n if (menu.childCount > 0 && (menu.children?.length ?? 0) === 0) {\n this.loadChildren(menu);\n }\n\n const hasUrl: boolean = (menu.url?.length ?? 0) > 0;\n const openMode: SidebarMenuOpenMode = toSidebarMenuOpenMode(menu.openMode);\n const isExternal: boolean = hasUrl && openMode !== SidebarMenuOpenMode.Internal;\n\n // External destinations are announced on their own emitter, so a consumer that only knows\n // menuUrlSelected never receives an absolute URL it would hand to the Angular router.\n const urlSelected: EventEmitter<SidebarMenu> = isExternal ? this.menuExternalUrlSelected : this.menuUrlSelected;\n\n // Opening a new browser tab is an action, not a destination: the user stays on the view\n // already on screen, so the item must neither take the selection nor clear that view's.\n // Parents still fall through, so a parent that carries a URL keeps expanding instead of\n // becoming impossible to open.\n if (isExternal && openMode === SidebarMenuOpenMode.ExternalNewTab && menu.childCount === 0) {\n urlSelected.emit(menu);\n return;\n }\n\n // In case we're deselecting the menu because a child was selected, we need to keep track of the original selection state.\n const isSelected: boolean = menu.isSelected;\n\n if (!!this.selectedMenu && this.selectedMenu !== menu) {\n this.deselectAll();\n }\n\n if (!isSelected) {\n this.selectedMenu = menu;\n this.selectMenu(menu);\n\n if (hasUrl) {\n urlSelected.emit(menu);\n }\n } else if (hasUrl) {\n // Menu with a URL is already selected — navigate again instead of toggling off.\n urlSelected.emit(menu);\n } else {\n this.selectedMenu = null;\n this.deselectMenu(menu);\n }\n }\n //#endregion\n\n //#region Private methods\n private deselectMenu(menu: SidebarMenu, shouldUpdateParents = true): void {\n if (!menu.isSelected) {\n return;\n }\n\n menu.isSelected = false;\n this.selectionChanged.emit(menu);\n\n if ((menu.children?.length ?? 0) > 0) {\n menu.children\n .filter((child: SidebarMenu) => child.isSelected)\n .forEach((child: SidebarMenu) => {\n const shouldUpdateParents = false;\n this.deselectMenu(child, shouldUpdateParents);\n });\n }\n\n if (!!menu.parent && shouldUpdateParents) {\n while (menu.parent) {\n this.selectionChanged.emit(menu.parent);\n menu = menu.parent;\n }\n }\n }\n\n private selectMenu(menu: SidebarMenu): void {\n menu.isSelected = true;\n this.selectionChanged.emit(menu);\n\n if (menu.parent) {\n this.selectMenu(menu.parent);\n }\n }\n //#endregion\n\n //#region Abstract methods\n public abstract getMenuFromUrl(url: string): Observable<SidebarMenu>;\n\n public abstract getUserProfile(): ISidebarProfile | undefined;\n\n protected abstract loadMenus(parentMenuID: SidebarMenu | null): Observable<SidebarMenu[]>;\n //#endregion\n}\n","import { CommonModule, formatDate } from '@angular/common';\nimport {\n Component,\n inject,\n input,\n InputSignal,\n model,\n ModelSignal,\n OnInit,\n output,\n OutputEmitterRef,\n} from '@angular/core';\nimport {\n ControlContainer,\n FormControl,\n FormGroup,\n FormGroupDirective,\n FormGroupName,\n FormsModule,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { takeUntil } from 'rxjs';\nimport { FormService } from '../../services';\nimport { BaseComponent } from '../base.component';\n\n@Component({\n selector: 'lib-form-input',\n templateUrl: './form-input.component.html',\n styleUrls: ['./form-input.component.scss'],\n imports: [CommonModule, FormsModule, ReactiveFormsModule],\n viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective }],\n host: {\n '[class.full-height]': 'isFullHeight()',\n // Clears a stray `type` attribute for the same reason as FormInputGroupComponent — see the\n // comment there. Applies when a consumer sets `type` on `lib-form-input` directly.\n '[attr.type]': 'null',\n },\n})\nexport class FormInputComponent extends BaseComponent implements OnInit {\n //#region ViewChilds, Inputs, Outputs\n public readonly autofocus: InputSignal<boolean> = input(false);\n public readonly controlName: InputSignal<string> = input('');\n public readonly disabledControlName: InputSignal<string | undefined> = input<string>();\n public readonly displayReadOnlyAsDisabled: InputSignal<boolean> = input(true);\n public readonly invalid: InputSignal<boolean> = input(false);\n public readonly isDisabled: InputSignal<boolean> = input(true);\n public readonly isFullHeight: InputSignal<boolean> = input(false);\n public readonly maxLength: InputSignal<number | undefined> = input<number>();\n public readonly min: InputSignal<number | undefined> = input<number>();\n public readonly readOnly: InputSignal<boolean> = input(false);\n public readonly rows: InputSignal<number | undefined> = input<number>();\n public readonly step: InputSignal<number> = input(1);\n public readonly type: InputSignal<string> = input('text');\n\n // Both are written by this component as well as bound by a parent, so they are models rather\n // than inputs: `fixedValue` is two-way bound through ngModel, and `format` gets a default for\n // date types when the consumer supplies none.\n public readonly fixedValue: ModelSignal<any> = model<any>();\n public readonly format: ModelSignal<string | undefined> = model<string>();\n\n // Deliberately NOT named blur/change/input/focus. <lib-form-input> is a real DOM\n // element, so an output sharing a native event name fires the consumer's handler\n // twice for the bubbling events and shadows the native one for the rest.\n public readonly blurred: OutputEmitterRef<void> = output<void>();\n public readonly changed: OutputEmitterRef<any> = output<any>();\n public readonly fixedValueChanged: OutputEmitterRef<string> = output<string>();\n public readonly focused: OutputEmitterRef<void> = output<void>();\n public readonly inputChanged: OutputEmitterRef<void> = output<void>();\n //#endregion\n\n //#region Host listeners\n //#endregion\n\n //#region Variables\n protected readonly formGroupDirective: FormGroupDirective = inject(FormGroupDirective);\n protected readonly formGroupName: FormGroupName = inject(FormGroupName, { optional: true })!;\n protected readonly formService: FormService = inject(FormService);\n //#endregion\n\n //#region Properties\n protected get formControl(): FormControl<any> | null {\n return this.controlName() ? <FormControl>this.formGroup.get(this.controlName()) : null;\n }\n\n protected get formControlName(): string {\n return [...this.parentGroups, this.controlName()].join('.');\n }\n\n protected get formGroup(): FormGroup {\n let formGroup: FormGroup = this.formGroupDirective.form;\n for (const group of this.parentGroups) {\n formGroup = <FormGroup>formGroup.get(group);\n }\n return formGroup;\n }\n\n protected get isFormControl(): boolean {\n return !!this.controlName() && this.controlName().length > 0;\n }\n\n protected get isFormEditMode(): boolean {\n return this.formService.isEditMode;\n }\n\n protected get parentGroups(): string[] {\n return this.formGroupName?.path ?? [];\n }\n\n protected get stepAttributeValue(): number | null {\n if (this.type() === 'number') {\n return this.step();\n }\n return null;\n }\n\n protected get minAttributeValue(): number | null {\n if (this.type() === 'number') {\n return this.min() ?? null;\n }\n return null;\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super();\n }\n\n public ngOnInit(): void {\n switch (this.type()) {\n case 'number':\n if (this.formControl) {\n this.formControl.valueChanges.pipe(takeUntil(this.destroy$)).subscribe((value: any) => {\n if (value !== null && value === '') {\n this.formControl?.setValue(null);\n }\n });\n }\n break;\n\n case 'date':\n if (this.format() === undefined) {\n this.format.set('yyyy-MM-dd');\n }\n\n if (this.formControl) {\n this.formControl.valueChanges.pipe(takeUntil(this.destroy$)).subscribe((value: any) => {\n if (value !== null) {\n try {\n if (value !== formatDate(value, 'yyyy-MM-dd', 'en')) {\n this.formControl?.setValue(formatDate(value, 'yyyy-MM-dd', 'en'), { emitEvent: false });\n }\n } catch {\n this.formControl?.setValue(null, { emitEvent: false });\n }\n }\n });\n }\n break;\n }\n }\n //#endregion\n\n //#region Event handlers\n protected onBlur(): void {\n this.blurred.emit();\n }\n\n protected onChange(value: any): void {\n this.changed.emit(value);\n }\n\n protected onFocus(): void {\n this.focused.emit();\n }\n\n protected onInput(): void {\n this.inputChanged.emit();\n }\n\n protected onValueChanged(newText: string): void {\n this.fixedValue.set(newText);\n this.fixedValueChanged.emit(newText);\n }\n //#endregion\n\n //#region Public methods\n //#endregion\n\n //#region Private methods\n //#endregion\n}\n","@if (formGroupDirective.form?.enabled || isFormEditMode) {\n @switch (type()) {\n @case ('textarea') {\n <textarea\n [attr.maxLength]=\"maxLength() ?? null\"\n [attr.rows]=\"rows()\"\n [class.invalid]=\"invalid()\"\n [formControlName]=\"controlName()\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n (input)=\"onInput()\"\n ></textarea>\n }\n @case ('checkbox') {\n @if (isFormControl) {\n <input\n class=\"switch\"\n type=\"checkbox\"\n [class.invalid]=\"invalid()\"\n [formControlName]=\"controlName()\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n (input)=\"onInput()\"\n />\n } @else {\n <input\n class=\"switch\"\n type=\"checkbox\"\n [(ngModel)]=\"fixedValue\"\n [attr.readonly]=\"true\"\n [class.invalid]=\"invalid()\"\n [class.readonly-as-disabled]=\"displayReadOnlyAsDisabled()\"\n [disabled]=\"isDisabled()\"\n [ngModelOptions]=\"{ standalone: true }\"\n (blur)=\"onBlur()\"\n (change)=\"onChange($event)\"\n (focus)=\"onFocus()\"\n (input)=\"onInput()\"\n (ngModelChange)=\"onValueChanged($event)\"\n />\n }\n }\n @default {\n @if (isFormControl) {\n <input\n [attr.maxLength]=\"maxLength() ?? null\"\n [attr.min]=\"minAttributeValue\"\n [attr.readonly]=\"readOnly() ? true : null\"\n [attr.step]=\"stepAttributeValue\"\n [class.invalid]=\"invalid()\"\n [class.readonly-as-disabled]=\"displayReadOnlyAsDisabled()\"\n [formControlName]=\"controlName()\"\n [type]=\"type()\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n (input)=\"onInput()\"\n />\n } @else {\n <input\n type=\"text\"\n [attr.maxLength]=\"maxLength() ?? null\"\n [attr.min]=\"minAttributeValue\"\n [attr.readonly]=\"true\"\n [attr.step]=\"stepAttributeValue\"\n [class.invalid]=\"invalid()\"\n [class.readonly-as-disabled]=\"displayReadOnlyAsDisabled()\"\n [disabled]=\"isDisabled()\"\n [ngModel]=\"\n type() === 'date' || type() === 'datetime-local'\n ? (fixedValue() | date: format())\n : type() === 'number'\n ? (fixedValue() | number)\n : fixedValue()\n \"\n [ngModelOptions]=\"{ standalone: true }\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n (input)=\"onInput()\"\n (ngModelChange)=\"onValueChanged($event)\"\n />\n }\n }\n }\n} @else {\n @switch (type()) {\n @case ('checkbox') {\n <span class=\"value\">\n <i\n [ngClass]=\"\n (fixedValue() ?? formGroupDirective.form.get(disabledControlName() ?? controlName())?.value)\n ? 'fa-solid fa-square-check'\n : 'fa-regular fa-square'\n \"\n ></i>\n </span>\n }\n @case ('date') {\n <span class=\"value\">\n {{\n fixedValue() ?? formGroupDirective.form.get(disabledControlName() ?? controlName())?.value | date: format()\n }}\n </span>\n }\n @case ('datetime-local') {\n <span class=\"value\">\n {{\n fixedValue() ?? formGroupDirective.form.get(disabledControlName() ?? controlName())?.value | date: format()\n }}\n </span>\n }\n @case ('number') {\n <span class=\"value\">\n {{\n fixedValue() ?? formGroupDirective.form.get(disabledControlName() ?? controlName())?.value | number: format()\n }}\n </span>\n }\n @default {\n <span class=\"value text\">{{\n fixedValue() ?? formGroupDirective.form.get(disabledControlName() ?? controlName())?.value\n }}</span>\n }\n }\n}\n\n<ng-template #fixedTextbox let-fixedValue=\"fixedValue\"> </ng-template>\n","import { KeyValuePipe, NgStyle, NgTemplateOutlet } from '@angular/common';\nimport { Component, inject, input, InputSignal, OnInit, signal, TemplateRef, WritableSignal } from '@angular/core';\nimport { FormControl, FormGroup, FormGroupDirective, FormGroupName } from '@angular/forms';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { filter, takeUntil } from 'rxjs';\nimport { FormService } from '../../services';\nimport { BaseComponent } from '../base.component';\nimport { FormInputComponent } from '../form-input/form-input.component';\n\n@Component({\n selector: 'lib-form-input-group',\n templateUrl: './form-input-group.component.html',\n styleUrls: ['./form-input-group.component.scss'],\n imports: [FormInputComponent, KeyValuePipe, NgStyle, NgTemplateOutlet, TranslatePipe],\n host: {\n '[class.full-height]': 'isFullHeight()',\n // Angular keeps static attributes in the DOM even when a directive consumes them as an\n // @Input(), so `type=\"checkbox\"` would linger on this host element — where\n // @tailwindcss/forms' tag-agnostic `[type=\"checkbox\"]` base rules style the host itself as\n // a checkbox (1px border, white fill, height:1rem). Clearing the attribute removes the\n // stray box for every type while leaving the `type` @Input() untouched.\n '[attr.type]': 'null',\n },\n})\nexport class FormInputGroupComponent extends BaseComponent implements OnInit {\n //#region ViewChilds, Inputs, Outputs\n public readonly autofocus: InputSignal<boolean> = input(false);\n public readonly alignContent: InputSignal<'center' | 'end' | 'start'> = input<'center' | 'end' | 'start'>('center');\n public readonly controlName: InputSignal<string> = input.required<string>();\n public readonly fixedValue: InputSignal<any> = input<any>();\n public readonly format: InputSignal<string | undefined> = input<string>();\n public readonly label: InputSignal<string> = input('');\n public readonly isDisabled: InputSignal<boolean> = input(true);\n public readonly isFullHeight: InputSignal<boolean> = input(false);\n public readonly maxLength: InputSignal<number | undefined> = input<number>();\n public readonly min: InputSignal<number | undefined> = input<number>();\n public readonly notes: InputSignal<string> = input('');\n public readonly readOnly: InputSignal<boolean> = input(false);\n public readonly rows: InputSignal<number | undefined> = input<number>();\n public readonly showLabel: InputSignal<boolean> = input(true);\n public readonly step: InputSignal<number> = input(1);\n public readonly template: InputSignal<TemplateRef<any> | undefined> = input<TemplateRef<any>>();\n public readonly type: InputSignal<string> = input('text');\n public readonly validations: InputSignal<{ [id: string]: string }> = input<{ [id: string]: string }>({});\n //#endregion\n\n //#region Host listeners\n //#endregion\n\n //#region Variables\n protected readonly formGroupDirective: FormGroupDirective = inject(FormGroupDirective);\n protected readonly formGroupName: FormGroupName = inject(FormGroupName, { optional: true })!;\n protected formService: FormService = inject(FormService);\n protected readonly loadingField: WritableSignal<boolean> = signal(false);\n //#endregion\n\n //#region Properties\n protected get formControl(): FormControl<any> | null {\n return this.controlName() ? <FormControl>this.formGroup.get(this.controlName()) : null;\n }\n\n protected get formGroup(): FormGroup {\n let formGroup: FormGroup = this.formGroupDirective.form;\n for (const group of this.parentGroups) {\n formGroup = <FormGroup>formGroup.get(group);\n }\n return formGroup;\n }\n\n protected get hasNotes(): boolean {\n return !!this.notes() && this.notes().length > 0;\n }\n\n protected get parentGroups(): string[] {\n return this.formGroupName?.path ?? [];\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super();\n }\n\n public ngOnInit(): void {\n this.formControl?.statusChanges.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.loadingField.set(false);\n });\n\n this.formControl?.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.loadingField.set(false);\n });\n\n this.formService.fieldRefreshed\n .pipe(\n takeUntil(this.destroy$),\n filter(\n (field: { fieldName?: string; value?: any; loading?: boolean }) => field.fieldName === this.controlName(),\n ),\n )\n .subscribe((field: { fieldName?: string; value?: any; loading?: boolean }) => {\n this.loadingField.set(field.loading ?? false);\n });\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n protected hasValidation(errorKey: string): boolean {\n return Object.keys(this.validations()).indexOf(errorKey) >= 0;\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}\n","@if (showLabel()) {\n <label [attr.for]=\"controlName()\"> {{ label() | translate }}: </label>\n}\n\n<div class=\"field\" [class.col-span-2]=\"!showLabel()\" [ngStyle]=\"{ 'align-content': alignContent() }\">\n @if (loadingField() || (formService.loading && formService.model === null)) {\n <div class=\"loading\">\n <div></div>\n </div>\n } @else {\n <ng-container *ngTemplateOutlet=\"template() ?? defaultTemplate\"> </ng-container>\n @if (formControl?.touched) {\n <div class=\"validations\" [class.show]=\"formControl?.invalid\">\n @for (error of $safeNavigationMigration(formControl?.errors) | keyvalue; track error) {\n @if (hasValidation(error.key)) {\n <span>{{ validations()[error.key] | translate }}</span>\n }\n <ng-template #defaultValidationError>{{ error.key }}</ng-template>\n }\n </div>\n }\n <ng-template #defaultTemplate>\n <lib-form-input\n #formInput\n [autofocus]=\"autofocus()\"\n [controlName]=\"controlName()\"\n [fixedValue]=\"fixedValue()\"\n [format]=\"format()\"\n [isDisabled]=\"isDisabled()\"\n [isFullHeight]=\"isFullHeight()\"\n [min]=\"min()\"\n [maxLength]=\"maxLength()\"\n [readOnly]=\"readOnly()\"\n [rows]=\"rows()!\"\n [step]=\"step()\"\n [type]=\"type()\"\n >\n </lib-form-input>\n </ng-template>\n @if (hasNotes) {\n <span class=\"text-sm italic\"> *{{ notes() | translate }} </span>\n }\n }\n</div>\n","import { FlexibleConnectedPositionStrategy, Overlay, OverlayPositionBuilder, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\n\nimport {\n AfterViewInit,\n Component,\n ElementRef,\n HostListener,\n inject,\n input,\n Input,\n InputSignal,\n KeyValueChanges,\n KeyValueDiffer,\n KeyValueDiffers,\n OnDestroy,\n OnInit,\n Signal,\n signal,\n TemplateRef,\n viewChild,\n ViewContainerRef,\n WritableSignal,\n} from '@angular/core';\nimport { FormControl, FormGroup, FormGroupDirective, FormGroupName } from '@angular/forms';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport {\n debounceTime,\n forkJoin,\n Observable,\n of,\n pairwise,\n startWith,\n Subject,\n switchMap,\n take,\n takeUntil,\n tap,\n} from 'rxjs';\nimport { DisplayControls } from '../../helpers';\nimport { ICatalogEntry, ICatalogResult } from '../../models';\nimport { CatalogService, DataGridDataset } from '../../services';\nimport { BaseComponent } from '../base.component';\nimport { FormInputGroupComponent } from '../form-input-group/form-input-group.component';\nimport { FormInputComponent } from '../form-input/form-input.component';\n\n@Component({\n selector: 'lib-catalog-select',\n templateUrl: './catalog-select.component.html',\n styleUrls: ['./catalog-select.component.scss'],\n imports: [FormInputComponent, FormInputGroupComponent, TranslatePipe],\n})\nexport class CatalogSelectComponent extends BaseComponent implements OnInit, AfterViewInit, OnDestroy {\n //#region HostListeners\n @HostListener('body:mousedown', ['$event'])\n protected bodyMouseDown(event: MouseEvent): void {\n const target: HTMLElement = <HTMLElement>event.target;\n if (this.isDropDownShown() && !target.closest('.catalog-container.show')) {\n this.wasClickedOutside = (event.button === 0 && !target.closest('.dropdown-container')) ?? false;\n }\n }\n\n @HostListener('body:mouseup', ['$event'])\n protected bodyMouseUp(event: MouseEvent): void {\n if (this.isDropDownShown() && this.wasClickedOutside) {\n this.closeDropdownOverlay();\n this.wasClickedOutside = false;\n }\n }\n //#endregion\n\n //#region ViewChilds, Inputs, Outputs\n private readonly dropdownTemplate: Signal<TemplateRef<any> | undefined> = viewChild('dropdownTemplate', {\n read: TemplateRef,\n });\n private readonly inputElement: Signal<ElementRef<HTMLDivElement> | undefined> = viewChild('input', {\n read: ElementRef,\n });\n\n public readonly autofocus: InputSignal<boolean> = input(false);\n public readonly controlName: InputSignal<string> = input.required<string>();\n public readonly displayControlName: InputSignal<string> = input.required<string>();\n public readonly displayProperty: InputSignal<string> = input('display');\n @Input() public set entriesList(\n value: any[] | { key: number; value: Observable<any> | string }[] | null | undefined,\n ) {\n if (this._entriesList !== value) {\n this._entriesList = value;\n if (this.isSubscriptionInitialized) {\n this.entriesDataSource = [];\n this.initializeEntriesDataSource();\n this.refreshSearch();\n }\n }\n }\n @Input() public set filters(value: { [id: string]: any }) {\n if (this._filters !== value) {\n this._filters = value;\n this.updateFilters();\n }\n }\n public readonly label: InputSignal<string> = input('');\n public readonly maxEntries: InputSignal<number> = input(100);\n public readonly minimumLengthSearch: InputSignal<number> = input(3);\n public readonly notes: InputSignal<string> = input('');\n public readonly readOnly: InputSignal<boolean> = input(false);\n /**\n * Whether the field accepts typing to narrow the list.\n *\n * A catalog of a handful of entries is a picker, not a search: typing only gets in the way, and\n * the minimum-length rule would hide the very entries the user opened the field to choose from.\n * Turning this off leaves the input read-only to the keyboard while the dropdown still opens on\n * click and the clear button still works -- unlike {@link readOnly}, which means the value\n * cannot be changed at all.\n *\n * It does not suit an endpoint that answers shouldUseCriteria: that endpoint returns nothing\n * until it is given criteria, and there would be no way left to type any.\n */\n public readonly searchable: InputSignal<boolean> = input(true);\n @Input() public set searchEndpoint(value: string | undefined) {\n if (this._searchEndpoint === value) {\n return;\n }\n\n this._searchEndpoint = value;\n\n // A screen that reads the endpoint off a model it loads over HTTP binds an empty string first,\n // and this component initializes against that: no endpoint takes the static-list path, finds an\n // empty list and latches \"no results\". Nothing re-ran the search when the real endpoint landed,\n // so the field stayed empty until the user typed something and cleared it again.\n //\n // Re-initializing rather than merely refreshing, because a different endpoint is a different\n // catalog: what the previous one reported about needing criteria cannot be carried over.\n if (this.isSubscriptionInitialized) {\n const reInitialize = true;\n this.refreshSearch(reInitialize);\n }\n }\n public readonly validations: InputSignal<{ [id: string]: string }> = input<{ [id: string]: string }>({});\n public readonly valueProperty: InputSignal<string> = input('value');\n //#endregion\n\n //#region Variables\n // The three setter inputs below -- entriesList, filters and searchEndpoint -- stay decorator\n // inputs on purpose. They are imperative configuration that re-initialises the search, no\n // template reads them, and converting them would move that side effect into an effect() for\n // no gain in what reaches the screen.\n protected readonly displayedEntries: WritableSignal<ICatalogEntry[]> = signal<ICatalogEntry[]>([]);\n protected readonly focusedIndex: WritableSignal<number> = signal(-1);\n protected readonly isDropDownShown: WritableSignal<boolean> = signal(false);\n protected readonly isFocused: WritableSignal<boolean> = signal(false);\n protected readonly isLoading: WritableSignal<boolean> = signal(false);\n protected readonly selectedValue: WritableSignal<any> = signal(undefined);\n protected readonly shouldUseCriteria: WritableSignal<boolean> = signal(false);\n protected readonly showFailureMessage: WritableSignal<boolean> = signal(false);\n protected readonly showMinimumCharactersMessage: WritableSignal<boolean> = signal(false);\n protected readonly showNoResultsMessage: WritableSignal<boolean> = signal(false);\n\n private static instanceCounter = 0;\n private _entriesList?: any[] | { key: number; value: Observable<any> | string }[] | null;\n private _filters: { [id: string]: any } = {};\n private _searchEndpoint?: string;\n private catalogService: CatalogService = inject(CatalogService);\n private dataGridDataset: DataGridDataset = inject(DataGridDataset, { optional: true })!;\n private entriesDataSource: ICatalogEntry[] = [];\n private filterDiffer?: KeyValueDiffer<string, any>;\n private readonly formGroup: FormGroupDirective = inject(FormGroupDirective);\n private readonly formGroupName: FormGroupName = inject(FormGroupName, { optional: true })!;\n private instanceId: number;\n private isDataInitialized = false;\n private isSubscriptionInitialized = false;\n private keyValueDiffers: KeyValueDiffers = inject(KeyValueDiffers);\n private lastCriteriaUsed: string | null = null;\n private overlay: Overlay = inject(Overlay);\n private overlayRef?: OverlayRef;\n private positionBuilder: OverlayPositionBuilder = inject(OverlayPositionBuilder);\n private searchSubject: Subject<string | null> = new Subject<string | null>();\n private viewContainerRef: ViewContainerRef = inject(ViewContainerRef);\n private wasClickedOutside = false;\n //#endregion\n\n //#region Properties\n public get entriesList(): any[] | { key: number; value: Observable<any> | string }[] | null | undefined {\n return this._entriesList;\n }\n\n public get filters(): { [id: string]: any } | undefined {\n return this._filters;\n }\n\n public get searchEndpoint(): string | undefined {\n return this._searchEndpoint;\n }\n\n protected get activeDescendantId(): string | null {\n if (this.focusedIndex() >= 0 && this.focusedIndex() < this.displayedEntries().length) {\n return `catalog-select-${this.instanceId}-option-${this.focusedIndex()}`;\n }\n return null;\n }\n\n protected get displayControl(): FormControl {\n return <FormControl>this.formGroup.form.get(this.formDisplayControlName);\n }\n\n protected get formControl(): FormControl {\n return <FormControl>this.formGroup.form.get(this.formControlName);\n }\n\n protected get formControlName(): string {\n return [...(this.formGroupName?.path ?? []), this.controlName()].join('.');\n }\n\n protected get formDisplayControlName(): string {\n return [...(this.formGroupName?.path ?? []), this.displayControlName()].join('.');\n }\n\n protected get isInvalid(): boolean {\n return this.formControl.invalid;\n }\n\n protected get isTouched(): boolean {\n return this.formControl.touched;\n }\n\n protected get listboxId(): string {\n return `catalog-select-${this.instanceId}-listbox`;\n }\n\n /**\n * Whether the button that empties the field is offered.\n *\n * It asks the form control, not {@link selectedValue}. The latter is only written when this\n * component sees the value arrive -- from a pick in the dropdown, or from the initial sync in\n * ngOnInit. A value patched in afterwards without an event, which is how a saved filter is\n * restored into a form this component has already initialised, reaches the control and the\n * display without ever reaching {@link selectedValue}. Keying the button off it left the field\n * showing a value with no way to remove it.\n */\n protected get showClearButton(): boolean {\n return this.formControl?.value != null && !this.readOnly() && (this.formControl?.enabled ?? false);\n }\n\n private get hasSearchEndpoint(): boolean {\n return !!this.searchEndpoint && this.searchEndpoint.length > 0;\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super();\n this.instanceId = CatalogSelectComponent.instanceCounter++;\n }\n\n public ngAfterViewInit(): void {\n this.setInputAriaAttributes();\n }\n\n public override ngOnDestroy(): void {\n this.closeDropdownOverlay();\n super.ngOnDestroy();\n }\n\n public ngOnInit(): void {\n // Check and add the display control, if it does not exist.\n const wasFormDisabled: boolean = this.formGroup.form.disabled;\n this.checkAndAddDisplayControl();\n if (wasFormDisabled) {\n this.formGroup.form.disable();\n }\n\n // Initialize the entries data source from the entries list, if provided.\n this.initializeEntriesDataSource();\n\n // Initialize the search functionality.\n this.initializeSearch();\n\n // Subscribe to changes in the display control to apply search criteria.\n this.displayControl?.valueChanges\n .pipe(\n takeUntil(this.destroy$),\n tap(() => {\n if (!this.isFocused()) {\n return;\n }\n this.isLoading.set(true);\n this.resetMessages();\n }),\n debounceTime(500),\n startWith(null),\n pairwise(),\n )\n .subscribe(([previous, current]: string[]) => {\n if (!this.isFocused() || previous === current) {\n this.isLoading.set(false);\n return;\n }\n this.applySearchCriteria(current);\n });\n\n this.filterDiffer = this.keyValueDiffers.find(this._filters).create();\n\n // Subscribe to changes in the form control to update the selected value and display control states.\n this.syncFormControlsEnabledDisabled();\n\n this.formControl?.valueChanges.pipe(takeUntil(this.destroy$)).subscribe((value: any) => {\n this.syncFormControlsEnabledDisabled();\n\n if (!this.shouldRefreshDisplay(value)) {\n return;\n }\n\n this.selectedValue.set(value);\n if (this.hasSearchEndpoint) {\n if (!value) {\n this.displayControl?.reset(null, { emitEvent: false });\n }\n } else {\n this.displayControl?.setValue(this.resolveDisplay(value), { emitEvent: false });\n }\n });\n\n // Initial sync: if the form control already has a value (e.g., the model was loaded\n // before this component initialized), sync the display control immediately.\n this.syncDisplayFromCurrentValue();\n }\n //#endregion\n\n //#region Event handlers\n protected onContainerBlur(): void {\n this.isFocused.set(false);\n }\n\n protected onContainerClick(): void {\n if (\n (!this.isDropDownShown() || this.readOnly()) &&\n (this.formGroup.form?.enabled ?? false) &&\n (this.formGroup.form?.get(this.formControlName)?.enabled ?? false)\n ) {\n this.openDropdownOverlay();\n }\n }\n\n protected onContainerFocus(): void {\n this.isFocused.set(true);\n if (\n !this.isDropDownShown() &&\n !this.readOnly() &&\n (this.formGroup.form?.enabled ?? false) &&\n (this.formGroup.form?.get(this.formControlName)?.enabled ?? false)\n ) {\n this.openDropdownOverlay();\n }\n }\n\n protected onClearClick(event: MouseEvent): void {\n event.stopPropagation();\n\n if (this.formControl) {\n this.formControl.setValue(null);\n this.formControl.markAsDirty();\n this.formControl.markAsTouched();\n }\n\n if (this.displayControl) {\n this.displayControl.setValue('', { emitEvent: false });\n this.displayControl.markAsDirty();\n this.displayControl.markAsTouched();\n }\n\n this.selectedValue.set(null);\n }\n\n protected onKeyDown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (!this.isDropDownShown()) {\n this.openDropdownOverlay();\n }\n if (this.displayedEntries().length > 0) {\n this.focusedIndex.set(Math.min(this.focusedIndex() + 1, this.displayedEntries().length - 1));\n this.scrollFocusedItemIntoView();\n }\n this.updateInputAriaActiveDescendant();\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n if (this.isDropDownShown() && this.displayedEntries().length > 0) {\n this.focusedIndex.set(Math.max(this.focusedIndex() - 1, 0));\n this.scrollFocusedItemIntoView();\n }\n this.updateInputAriaActiveDescendant();\n break;\n\n case 'Enter':\n event.preventDefault();\n if (\n this.isDropDownShown() &&\n this.focusedIndex() >= 0 &&\n this.focusedIndex() < this.displayedEntries().length\n ) {\n this.onDropDownItemClick(this.displayedEntries()[this.focusedIndex()]);\n }\n break;\n\n case 'Escape':\n if (this.isDropDownShown()) {\n event.preventDefault();\n this.closeDropdownOverlay();\n }\n break;\n\n case 'Tab':\n if (this.isDropDownShown()) {\n this.closeDropdownOverlay();\n }\n break;\n }\n }\n\n protected onDropDownErrorClick(): void {\n this.refreshSearch();\n }\n\n protected onDropDownItemClick(entry: ICatalogEntry): void {\n if (this.displayControl) {\n this.displayControl.markAsDirty();\n this.displayControl.markAllAsTouched();\n this.displayControl.setValue(entry.display, { emitEvent: false });\n }\n\n if (this.formControl) {\n this.formControl.markAsDirty();\n this.formControl.markAsTouched();\n this.formControl.setValue(entry.value);\n }\n\n this.closeDropdownOverlay();\n }\n\n //#endregion\n\n //#region Public methods\n protected getOptionId(index: number): string {\n return `catalog-select-${this.instanceId}-option-${index}`;\n }\n\n /**\n * Re-reads the catalog from its endpoint.\n *\n * The entries are fetched once, when the field initializes, so a screen that changes the data\n * behind the catalog -- granting a role, moving an employee, anything that alters what the\n * endpoint would now answer -- otherwise keeps offering the list it read before the change.\n *\n * It re-reads rather than merely re-runs the last request, because the number of entries may\n * have crossed the threshold that decides whether the endpoint requires search criteria.\n */\n public refresh(): void {\n const reInitialize = true;\n this.refreshSearch(reInitialize);\n }\n //#endregion\n\n //#region Private methods\n private applySearchCriteria(criteria: string | null): void {\n this.isLoading.set(true);\n this.resetMessages();\n\n this.searchSubject.next(criteria);\n }\n\n private checkAndAddDisplayControl(): void {\n let parent: FormGroup = this.formGroup.form;\n const controlNames: string[] = this.formDisplayControlName.split('.');\n\n controlNames.forEach((name, index) => {\n if (index < controlNames.length - 1) {\n parent = <FormGroup>parent.get(name);\n } else {\n if (!parent.get(name)) {\n parent.addControl(name, new FormControl(''));\n }\n\n // Marked whether this component created it or the screen declared it: what makes a control\n // a display control is being driven as one, not who wrote it down. A filters form reads the\n // mark to keep it out of what it submits.\n DisplayControls.markAsDisplayControl(parent.get(name));\n }\n });\n }\n\n private closeDropdownOverlay(): void {\n this.isDropDownShown.set(false);\n this.focusedIndex.set(-1);\n this.updateInputAriaActiveDescendant();\n if (this.overlayRef) {\n this.overlayRef.detach();\n this.overlayRef.dispose();\n this.overlayRef = undefined;\n }\n }\n\n private initializeEntriesDataSource(): void {\n if (this.hasSearchEndpoint || !this._entriesList || this._entriesList.length === 0) {\n return;\n }\n\n const observables: Observable<string>[] = [];\n\n this._entriesList.forEach((entry: any | { key: number; value: Observable<any> }) => {\n const value: number = entry[this.valueProperty()];\n const display: string | Observable<any> = entry[this.displayProperty()];\n\n if (display instanceof Observable) {\n this.entriesDataSource.push({ value: value, display: 'Loading...' });\n\n observables.push(\n display.pipe(\n take(1),\n tap((v) => {\n this.entriesDataSource.filter((x) => x.value === value)[0].display = v;\n if (this.selectedValue() === value) {\n this.displayControl.setValue(v);\n }\n }),\n ),\n );\n } else {\n this.entriesDataSource.push({ value, display });\n }\n });\n\n // Subscribed only to run the requests; the emitted values are not needed here.\n forkJoin(observables).pipe(take(1)).subscribe();\n }\n\n private initializeSearch(): void {\n this.searchSubject\n .pipe(\n takeUntil(this.destroy$),\n switchMap((criteria: string | null) => {\n this.lastCriteriaUsed = criteria;\n\n if (!this.hasSearchEndpoint) {\n if (this.entriesDataSource.length === 0) {\n return of(null).pipe(take(1));\n }\n return of(\n this.entriesDataSource.filter(\n (entry: ICatalogEntry) => entry.display.toLowerCase().indexOf(criteria?.toLowerCase() ?? '') > -1,\n ),\n ).pipe(take(1));\n }\n\n this.updateMinimumCharactersMessageVisibility(criteria ?? '');\n if (this.showMinimumCharactersMessage()) {\n return of(null).pipe(take(1));\n }\n\n return this.catalogService\n .search(this.searchEndpoint!, this.maxEntries(), criteria ?? '', this.filters)\n .pipe(take(1));\n }),\n )\n .subscribe({\n next: (result: ICatalogResult | any[] | null | undefined) => {\n this.isLoading.set(false);\n this.displayedEntries.set([]);\n\n if (Array.isArray(result) && result.length > 0) {\n this.displayedEntries.set(result);\n } else if (result?.entries && Array.isArray(result.entries)) {\n const catalogResult: ICatalogResult = result as ICatalogResult;\n if (!catalogResult) {\n return;\n }\n\n this.displayedEntries.set(catalogResult.entries);\n\n if (!this.isDataInitialized) {\n // The shouldUseCriteria is only set from the initialization.\n this.isDataInitialized = true;\n this.shouldUseCriteria.set(catalogResult.shouldUseCriteria ?? false);\n this.showMinimumCharactersMessage.set(this.searchable() && this.displayedEntries().length === 0);\n }\n }\n\n // Try to filter out already loaded rows from the data grid dataset.\n if (this.displayedEntries().length > 0 && this.dataGridDataset) {\n this.displayedEntries.set(this.tryFilterFromDataset(this.displayedEntries()));\n }\n\n if (!this.showMinimumCharactersMessage() && this.displayedEntries().length === 0) {\n this.showNoResultsMessage.set(true);\n }\n },\n error: (_: any) => {\n this.isLoading.set(false);\n this.displayedEntries.set([]);\n this.showFailureMessage.set(true);\n\n // Set a new subscription to allow retrying the search later.\n this.initializeSearch();\n },\n });\n\n if (!this.isSubscriptionInitialized) {\n this.isSubscriptionInitialized = true;\n this.applySearchCriteria(null);\n }\n }\n\n private openDropdownOverlay(): void {\n // Defensive cleanup of any stale overlay before creating a new one.\n if (this.overlayRef) {\n this.overlayRef.detach();\n this.overlayRef.dispose();\n this.overlayRef = undefined;\n }\n\n const positionStrategy: FlexibleConnectedPositionStrategy = this.positionBuilder\n .flexibleConnectedTo(this.inputElement()!)\n .withPositions([\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n },\n ]);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n hasBackdrop: false,\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n });\n\n // Set overlay width to match input field\n const inputRect: DOMRect = this.inputElement()!.nativeElement.getBoundingClientRect();\n this.overlayRef.updateSize({ width: inputRect.width });\n\n const portal: TemplatePortal = new TemplatePortal(this.dropdownTemplate()!, this.viewContainerRef);\n this.overlayRef.attach(portal);\n this.isDropDownShown.set(true);\n this.focusedIndex.set(\n this.selectedValue() != null\n ? this.displayedEntries().findIndex((entry: ICatalogEntry) => entry.value === this.selectedValue())\n : -1,\n );\n this.updateInputAriaActiveDescendant();\n\n // Re-evaluate minimum characters message visibility when opening the dropdown,\n // in case it was incorrectly reset by a programmatic value change.\n if (this.shouldUseCriteria() && !this.isLoading()) {\n this.updateMinimumCharactersMessageVisibility(this.displayControl?.value ?? '');\n }\n\n // Scroll the selected item into view after the overlay renders.\n if (this.focusedIndex() >= 0) {\n requestAnimationFrame(() => this.scrollFocusedItemIntoView());\n }\n }\n\n private refreshSearch(reInitialize = false): void {\n if (reInitialize) {\n // Both are written together when a catalog first answers, so both have to go together.\n // Leaving shouldUseCriteria behind let the previous catalog gate the new one: the\n // minimum-length check short-circuited the very request that would have corrected it.\n this.isDataInitialized = false;\n this.shouldUseCriteria.set(false);\n }\n\n this.applySearchCriteria(this.lastCriteriaUsed);\n }\n\n private resetMessages(): void {\n this.showFailureMessage.set(false);\n this.showNoResultsMessage.set(false);\n this.showMinimumCharactersMessage.set(false);\n }\n\n private resolveDisplay(value: any): string {\n return this.entriesDataSource.filter((entry: ICatalogEntry) => entry.value === value)[0]?.display ?? '';\n }\n\n private syncDisplayFromCurrentValue(): void {\n const currentValue: any = this.formControl?.value;\n if (currentValue == null || !this.shouldRefreshDisplay(currentValue)) {\n return;\n }\n\n this.selectedValue.set(currentValue);\n if (!this.hasSearchEndpoint) {\n this.displayControl?.setValue(this.resolveDisplay(currentValue), { emitEvent: false });\n }\n }\n\n /**\n * Decides whether the display control has to be written again.\n *\n * The value on its own is not enough. Resetting a form clears the display control and then\n * patches the same value back, so an unchanged value can still leave the display empty. That\n * only happens when the stored value equals the control's initial value, which is why it used\n * to show up on the default entry alone.\n */\n private shouldRefreshDisplay(value: any): boolean {\n if (this.selectedValue() !== value) {\n return true;\n }\n\n if (this.hasSearchEndpoint) {\n return false;\n }\n\n const display: string = this.resolveDisplay(value);\n return display.length > 0 && this.displayControl?.value !== display;\n }\n\n private syncFormControlsEnabledDisabled(): void {\n if (this.formControl.enabled !== this.displayControl.enabled) {\n if (this.formControl.disabled) {\n this.displayControl.disable({ emitEvent: false });\n } else {\n this.displayControl.enable({ emitEvent: false });\n }\n }\n }\n\n private tryFilterFromDataset(results: ICatalogEntry[]): ICatalogEntry[] {\n if (\n this.dataGridDataset &&\n this.controlName() === this.dataGridDataset?.keyProperty &&\n this.dataGridDataset.hasLoadedRows\n ) {\n // If the control name is matching the ID property of the data grid dataset, filter out the loaded rows to remove duplicated IDs.\n const loadedIDs: any[] = this.dataGridDataset.loadedKeys!.map((key: string) =>\n this.dataGridDataset.getRowID(key),\n );\n return results.filter((result: ICatalogEntry) => loadedIDs.indexOf(result.value) < 0);\n }\n return results;\n }\n\n private updateFilters(): void {\n if (!this.filterDiffer || !this.filters) {\n return;\n }\n\n const changes: KeyValueChanges<string, any> | null = this.filterDiffer.diff(this.filters);\n if (changes) {\n const reInitialize = true;\n this.refreshSearch(reInitialize);\n }\n }\n\n private updateMinimumCharactersMessageVisibility(criteria: string): void {\n this.showMinimumCharactersMessage.set(\n this.searchable() &&\n this.shouldUseCriteria() &&\n this.minimumLengthSearch() > 0 &&\n (criteria?.length ?? 0) < this.minimumLengthSearch(),\n );\n }\n\n private getNativeInput(): HTMLInputElement | null {\n return this.inputElement()?.nativeElement?.querySelector('input') ?? null;\n }\n\n private scrollFocusedItemIntoView(): void {\n if (!this.overlayRef || this.focusedIndex() < 0) {\n return;\n }\n const optionId: string = this.getOptionId(this.focusedIndex());\n const element: HTMLElement | null = this.overlayRef.overlayElement.querySelector('#' + optionId);\n if (element) {\n element.scrollIntoView({ block: 'nearest' });\n }\n }\n\n private setInputAriaAttributes(): void {\n const input: HTMLInputElement | null = this.getNativeInput();\n if (!input) {\n return;\n }\n input.setAttribute('role', 'combobox');\n input.setAttribute('aria-autocomplete', 'list');\n input.setAttribute('aria-expanded', String(this.isDropDownShown()));\n input.setAttribute('aria-haspopup', 'listbox');\n input.setAttribute('aria-owns', this.listboxId);\n }\n\n private updateInputAriaActiveDescendant(): void {\n const input: HTMLInputElement | null = this.getNativeInput();\n if (!input) {\n return;\n }\n input.setAttribute('aria-expanded', String(this.isDropDownShown()));\n const descendantId: string | null = this.activeDescendantId;\n if (descendantId) {\n input.setAttribute('aria-activedescendant', descendantId);\n } else {\n input.removeAttribute('aria-activedescendant');\n }\n }\n //#endregion\n}\n","<lib-form-input-group\n [controlName]=\"controlName()\"\n [label]=\"label()\"\n [notes]=\"notes()\"\n [template]=\"template\"\n [validations]=\"validations()\"\n>\n</lib-form-input-group>\n\n<ng-template #template>\n <div class=\"catalog-container\" [class.show]=\"isDropDownShown()\">\n <lib-form-input\n #input\n [class.fixed-content]=\"readOnly() && !shouldUseCriteria()\"\n [autofocus]=\"autofocus()\"\n [controlName]=\"displayControlName()\"\n [displayReadOnlyAsDisabled]=\"readOnly()\"\n [invalid]=\"isInvalid && isTouched\"\n [readOnly]=\"readOnly() || !searchable()\"\n (blurred)=\"onContainerBlur()\"\n (click)=\"onContainerClick()\"\n (focused)=\"onContainerFocus()\"\n (keydown)=\"onKeyDown($event)\"\n >\n </lib-form-input>\n @if (showClearButton) {\n <button class=\"clear-button\" type=\"button\" tabindex=\"-1\" (click)=\"onClearClick($event)\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n</ng-template>\n\n<ng-template #dropdownTemplate>\n <div class=\"dropdown-container\">\n <ul class=\"dropdown\" role=\"listbox\" [attr.id]=\"listboxId\">\n <!-- Status rows are not options: role=\"presentation\" keeps them out of the\n listbox's option set, and they carry no click handler. The dropdown already\n closes on Escape, on blur and on an outside click. -->\n @if (isLoading()) {\n <li role=\"presentation\" aria-live=\"polite\">\n {{ 'CatalogSelect-Loading' | translate }}\n </li>\n }\n @if (shouldUseCriteria() && showMinimumCharactersMessage()) {\n <li\n role=\"presentation\"\n aria-live=\"polite\"\n title=\"{{ 'CatalogSelect-MinimumLengthSearch' | translate: { minimumLengthSearch: minimumLengthSearch() } }}\"\n >\n {{ 'CatalogSelect-MinimumLengthSearch' | translate: { minimumLengthSearch: minimumLengthSearch() } }}\n </li>\n }\n @if (showNoResultsMessage()) {\n <li role=\"presentation\" aria-live=\"polite\" title=\"{{ 'CatalogSelect-NoResultsFound' | translate }}\">\n {{ 'CatalogSelect-NoResultsFound' | translate }}\n </li>\n }\n\n <!-- Retrying is a real action, so it is a real button and reachable by keyboard. -->\n @if (showFailureMessage()) {\n <li class=\"error\" role=\"presentation\">\n <button\n class=\"retry\"\n type=\"button\"\n title=\"{{ 'CatalogSelect-FailureMessage' | translate }}\"\n (click)=\"onDropDownErrorClick()\"\n >\n {{ 'CatalogSelect-FailureMessage' | translate }}\n </button>\n </li>\n }\n\n <!-- eslint-disable @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus --\n Options in a combobox listbox are deliberately not focusable. Keyboard\n interaction lives on the input, which owns ArrowUp/ArrowDown/Enter/Escape and\n points at the active option through aria-activedescendant. Giving each option\n its own tabindex and key handlers would break that pattern. -->\n @for (entry of displayedEntries(); track entry; let i = $index) {\n <li\n class=\"dropdown-item\"\n role=\"option\"\n [attr.id]=\"getOptionId(i)\"\n [attr.aria-selected]=\"selectedValue() === entry.value\"\n [class.focused]=\"focusedIndex() === i\"\n [class.selected]=\"selectedValue() === entry.value\"\n (click)=\"onDropDownItemClick(entry)\"\n >\n {{ entry.display }}\n </li>\n }\n <!-- eslint-enable @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n </ul>\n </div>\n</ng-template>\n","import { NgClass, NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n inject,\n Input,\n OnInit,\n Output,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { NgxResizeObserverModule } from 'ngx-resize-observer';\nimport { takeUntil } from 'rxjs';\nimport { IGridColumn } from '../../models';\nimport { DataGridDataset } from '../../services/datasets/data-grid.dataset';\nimport { BaseComponent } from '../base.component';\n\n@Component({\n selector: 'lib-data-grid-row',\n templateUrl: './data-grid-row.component.html',\n host: {\n '[class.focused]': 'dataGridDataset.focusedRowKey === rowData',\n '[class.selected]': 'dataGridDataset.isKeySelected(rowKey)',\n },\n styleUrls: ['./data-grid-row.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FormsModule, NgClass, NgTemplateOutlet, NgxResizeObserverModule],\n})\nexport class DataGridRowComponent extends BaseComponent implements OnInit {\n //#region ViewChilds, Inputs, Outputs\n @Input() public disabled = false;\n @Input() public isFirstRow = false;\n @Input() public set rowData(value: any) {\n this._rowData = value;\n this.refreshSelection();\n }\n\n @Output() public selectionResized: EventEmitter<number> = new EventEmitter<number>();\n //#endregion\n\n //#region Host listeners\n @HostListener('click')\n public setFocus(): void {\n if (!this.disabled) {\n this.dataGridDataset.setFocusedRow(this.rowKey);\n\n if (this.dataGridDataset.configs.multiSelect && (this.dataGridDataset.configs.selectOnClick ?? true)) {\n this.selected.set(this.isRowDataSelected);\n }\n }\n }\n //#endregion\n\n //#region Variables\n protected dataGridDataset: DataGridDataset = inject(DataGridDataset);\n\n // A signal rather than a field: the grid announces a selection change from a subscription,\n // and the checkbox below is bound to this. It used to be a plain field refreshed by calling\n // detectChanges() on this component -- which renders, but renders because it was forced\n // rather than because anything was notified. See docs/guides/reactivity.md.\n protected readonly selected: WritableSignal<boolean> = signal(false);\n\n private _rowData!: any;\n private elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n //#endregion\n\n //#region Properties\n public get rowData(): any {\n return this._rowData;\n }\n\n protected get columns(): IGridColumn[] {\n return this.dataGridDataset.columns;\n }\n\n private get isLaidOut(): boolean {\n return (this.elementRef.nativeElement?.getBoundingClientRect().width ?? 0) > 0;\n }\n\n private get isRowDataSelected(): boolean {\n return this.dataGridDataset.isKeySelected(this.rowKey);\n }\n\n protected get rowKey(): string {\n return this.dataGridDataset.getRowInternalKey(this.rowData);\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super();\n }\n\n public ngOnInit(): void {\n this.selected.set(this.isRowDataSelected);\n\n this.dataGridDataset.selectedRowsChanged\n .pipe(takeUntil(this.destroy$))\n .subscribe((selectionChanges: { [id: string]: { rowData: any; selected: boolean } }) => {\n if (this.rowKey in selectionChanges) {\n this.selected.set(selectionChanges[this.rowKey].selected);\n }\n });\n }\n //#endregion\n\n //#region Event handlers\n protected onResize(colIndex: number, event: ResizeObserverEntry): void {\n const width: number = event.contentRect.width;\n\n // A zero means one of two very different things. Before the grid is laid out every column\n // reports zero, and taking that at face value would pin every heading at zero. Once the row\n // itself has a width the layout is live, and a zero is then the real thing: a 1fr column\n // collapsed for want of room, whose heading has to collapse with it or every column to its\n // right sits under the wrong one. Asking the row -- rather than remembering whether this\n // column once measured something -- also covers a column that is born collapsed and never\n // measures anything else.\n if (width <= 0 && !this.isLaidOut) {\n return;\n }\n\n // Reported on every change, not just the first. The body lays the columns out as a CSS grid of\n // minmax(x, min-content), so a column is only as wide as the content currently rendered --\n // which virtual scrolling keeps changing. Measuring once and latching left the header copying\n // a width the body no longer had, and with many columns that drift accumulated into cells\n // sitting under the wrong heading.\n if (this.columns[colIndex].realSize !== width) {\n this.columns[colIndex].realSize = width;\n }\n }\n\n protected onResizeSelection(event: ResizeObserverEntry): void {\n const width: number = event.contentRect.width;\n this.selectionResized.emit(width);\n }\n\n protected onToggleSelection(): void {\n if (\n this.disabled ||\n (this.dataGridDataset.configs.multiSelect && (this.dataGridDataset.configs.selectOnClick ?? true))\n ) {\n return;\n }\n\n this.selected.update((isSelected: boolean) => !isSelected);\n\n if (this.selected()) {\n this.dataGridDataset.selectRow(this.rowKey);\n } else {\n this.dataGridDataset.deselectRow(this.rowKey);\n }\n }\n //#endregion\n\n //#region Public methods\n protected getValue(field: string): any {\n return field.split('.').reduce((value: any, field: string) => value[field], this.rowData);\n }\n //#endregion\n\n //#region Private methods\n private refreshSelection(): void {\n this.selected.set(this.isRowDataSelected);\n }\n //#endregion\n}\n","<!-- A <label> rather than a clickable <div>: clicking anywhere in the cell still\nreaches the checkbox, natively. The click handler is a mouse-only convenience;\nthe keyboard path is the nested checkbox, which is focusable and toggles with\nSpace on its own. -->\n@if (dataGridDataset.configs.multiSelect) {\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <label class=\"cell selection\" (click)=\"onToggleSelection()\" (onResize)=\"onResizeSelection($event)\">\n <!-- Null, not false: an attribute binding writes disabled=\"false\" for false, and any value at\n all disables a control, so every checkbox rendered disabled and faded. -->\n <input class=\"form-input\" type=\"checkbox\" [attr.disabled]=\"disabled ? true : null\" [(ngModel)]=\"selected\" />\n </label>\n}\n@for (column of columns; track column; let i = $index) {\n <div #cell class=\"cell\" [class.disabled]=\"disabled\" [ngClass]=\"column.customClass\">\n @if (isFirstRow) {\n <div class=\"spacer\" (onResize)=\"onResize(i, $event)\"></div>\n }\n <ng-container\n *ngTemplateOutlet=\"\n column.template ? column.template : simpleTemplate;\n context: { rowData: rowData, column: column }\n \"\n >\n </ng-container>\n </div>\n}\n\n<ng-template #simpleTemplate let-rowData=\"rowData\" let-column=\"column\">\n <span>{{ getValue(column.field) }}</span>\n</ng-template>\n","import { ListRange } from '@angular/cdk/collections';\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { NgStyle } from '@angular/common';\nimport {\n AfterViewInit,\n Component,\n ElementRef,\n inject,\n input,\n InputSignal,\n NgZone,\n OnDestroy,\n OnInit,\n Signal,\n signal,\n viewChild,\n WritableSignal,\n} from '@angular/core';\nimport { NavigationEnd, NavigationStart, Router } from '@angular/router';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { debounceTime, filter, fromEvent, Subject, takeUntil } from 'rxjs';\nimport { IGridColumn } from '../../models';\nimport { DataGridConfigs } from '../../models/configs';\nimport { DataGridDataset } from '../../services';\nimport { BaseComponent } from '../base.component';\nimport { DataGridRowComponent } from '../data-grid-row/data-grid-row.component';\n\n@Component({\n selector: 'lib-data-grid',\n templateUrl: './data-grid.component.html',\n styleUrls: ['./data-grid.component.scss'],\n host: {\n '[class.no-borders]': 'showButtons()',\n },\n imports: [DataGridRowComponent, NgStyle, ScrollingModule, TranslatePipe],\n})\nexport class DataGridComponent extends BaseComponent implements OnInit, AfterViewInit, OnDestroy {\n //#region ViewChilds, Inputs, Outputs\n private readonly bodyElement: Signal<ElementRef<HTMLDivElement> | undefined> =\n viewChild<ElementRef<HTMLDivElement>>('body');\n private readonly viewport: Signal<CdkVirtualScrollViewport | undefined> = viewChild(CdkVirtualScrollViewport);\n\n public readonly disabled: InputSignal<boolean> = input(false);\n public readonly lazyLoadRows: InputSignal<boolean> = input(false);\n public readonly showButtons: InputSignal<boolean> = input(false);\n //#endregion\n\n //#region Variables\n protected dataGridDataset: DataGridDataset = inject(DataGridDataset);\n protected readonly hasFailed: WritableSignal<boolean> = signal(false);\n protected readonly headerRightMargin: WritableSignal<number> = signal(0);\n protected readonly headerScrollLeft: WritableSignal<number> = signal(0);\n protected readonly loading: WritableSignal<boolean> = signal(false);\n\n private bodyResized$: Subject<void> = new Subject<void>();\n private bodyResizeObserver?: ResizeObserver;\n private gridRoute = '';\n private isGridCurrentUrl = false;\n private lastPosition = 0;\n private ngZone: NgZone = inject(NgZone);\n private router: Router = inject(Router);\n private selectionColRealSize?: number;\n //#endregion\n\n //#region Properties\n protected get bodyMinHeight(): number {\n let rowsToDisplay: number = this.configs.rowsToDisplay ?? 3;\n\n let rowsCount: number = this.dataGridDataset.loadedRows?.length ?? 0;\n if (rowsCount === 0) {\n rowsCount = 1;\n }\n\n if (rowsCount < rowsToDisplay) {\n rowsToDisplay = rowsCount;\n }\n\n return rowsToDisplay * this.configs.rowHeight;\n }\n\n protected get columns(): IGridColumn[] {\n return this.dataGridDataset.columns;\n }\n\n protected get configs(): DataGridConfigs {\n return this.dataGridDataset.configs;\n }\n\n protected get gridColumns(): string {\n return this.dataGridDataset.columnsSize;\n }\n\n protected get hasBeenLoaded(): boolean {\n return this.dataGridDataset.hasBeenLoaded;\n }\n\n protected get hasLoadedRows(): boolean {\n return (this.dataGridDataset.loadedRows?.length ?? 0) > 0;\n }\n\n protected get hasMessageToDisplayWhenEmpty(): boolean {\n return this.messageToDisplayWhenEmpty.length > 0;\n }\n\n protected get isHideColumns(): boolean {\n return this.dataGridDataset.configs.hideColumnHeaders ?? false;\n }\n\n protected get isShowMultiSelect(): boolean {\n return this.dataGridDataset.configs.multiSelect ?? false;\n }\n\n protected get messageToDisplayWhenEmpty(): string {\n return this.dataGridDataset?.configs?.messageOnEmpty ?? '';\n }\n\n protected get messageToDisplayWhenLazyLoad(): string {\n return this.dataGridDataset?.configs?.messageOnLazyLoad ?? '';\n }\n\n protected get messageToDisplayWhenFailed(): string {\n return this.dataGridDataset?.configs?.messageOnFailed ?? '';\n }\n\n protected get selectionColWidth(): string {\n return this.selectionColRealSize\n ? `${this.selectionColRealSize}px`\n : (this.configs.multiSelectSize ?? 'minmax(1.5rem,min-content)');\n }\n\n protected get shouldDisplayMessageWhenEmpty(): boolean {\n return this.dataGridDataset?.configs?.showMessageOnEmpty ?? true;\n }\n\n /**\n * Whether the grid is in the document, which it is not while the route-reuse strategy holds its\n * view detached -- the list a tab keeps in its history while the user is on a record.\n *\n * Nothing may measure the CDK viewport then. The body leaving the document is itself a resize,\n * to nothing, and measuring makes the viewport work out its rendered range from a scroll offset\n * of 0 and write that out while detached, which leaves its own change-detection flag stuck until\n * the view renders again. Reattached and scrolled back, the viewport then computes the right\n * range but cannot write the content offset out: the rows are rendered, translated to the top,\n * and the viewport shows the place the user had scrolled to -- an empty list. Coming back is a\n * resize as well, from nothing to the panel, so the measurement still happens, on the way in.\n */\n private get isBodyAttached(): boolean {\n return this.bodyElement()?.nativeElement?.isConnected ?? false;\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super();\n }\n\n public ngOnInit(): void {\n this.gridRoute = this.router.url;\n this.isGridCurrentUrl = true;\n\n this.router.events\n .pipe(\n takeUntil(this.destroy$),\n filter((events: any) => events instanceof NavigationStart || events instanceof NavigationEnd),\n )\n .subscribe((event: NavigationStart | NavigationEnd) => {\n if (event instanceof NavigationStart && this.isGridCurrentUrl) {\n this.lastPosition = this.viewport()?.measureScrollOffset() ?? 0;\n this.isGridCurrentUrl = false;\n } else if (event instanceof NavigationEnd && event.url === this.gridRoute) {\n this.viewport()?.scrollTo({ top: this.lastPosition });\n this.viewport()?.checkViewportSize();\n this.isGridCurrentUrl = true;\n }\n });\n\n this.dataGridDataset.loadStarted.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.loading.set(true);\n });\n\n this.dataGridDataset.loadFinished.pipe(takeUntil(this.destroy$)).subscribe((isSuccess: boolean) => {\n this.loading.set(false);\n this.hasFailed.set(!isSuccess);\n\n setTimeout(() => {\n const viewportWidth: number = this.viewport()?.measureViewportSize('horizontal') ?? 0;\n if (viewportWidth > 0) {\n this.headerRightMargin.set(this.bodyElement()!.nativeElement.clientWidth - viewportWidth);\n }\n }, 100);\n\n // A load can finish after the user has left the list -- a record opened while the next page\n // was still coming in -- and a detached grid must not be measured. See isBodyAttached.\n setTimeout(() => {\n if (this.isBodyAttached) {\n this.viewport()?.checkViewportSize();\n }\n });\n });\n\n if (!this.lazyLoadRows()) {\n if (!this.dataGridDataset.loadedRows) {\n this.loading.set(true);\n }\n this.dataGridDataset.loadRows();\n } else if (this.dataGridDataset.isLoading) {\n this.loading.set(true);\n }\n }\n\n public ngAfterViewInit(): void {\n // The rows scroll sideways inside the CDK viewport while the header sits outside it, so the\n // header has to be moved by hand or the headings stay behind as the cells travel. Read outside\n // Angular and written back inside it, because this fires for every frame of a scroll.\n const viewportElement: HTMLElement | undefined = this.viewport()?.elementRef?.nativeElement;\n\n if (viewportElement) {\n this.ngZone.runOutsideAngular(() => {\n fromEvent(viewportElement, 'scroll')\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n const scrollLeft: number = viewportElement.scrollLeft;\n if (this.headerScrollLeft() === scrollLeft) {\n return;\n }\n\n this.headerScrollLeft.set(scrollLeft);\n });\n });\n }\n\n this.viewport()\n ?.renderedRangeStream.pipe(takeUntil(this.destroy$))\n .subscribe((listRange: ListRange) => {\n const loadedRows: number = this.dataGridDataset.loadedRows?.length ?? 0;\n if (\n this.hasLoadedRows &&\n !this.loading() &&\n listRange.end >= loadedRows &&\n !this.dataGridDataset.loadedLastRow\n ) {\n this.loading.set(true);\n this.dataGridDataset.loadRows();\n }\n });\n\n this.bodyResized$.pipe(debounceTime(150), takeUntil(this.destroy$)).subscribe(() => {\n // Leaving the document is a resize too. A detached grid has nothing to measure, and measuring\n // it is what left the list empty when it came back; see isBodyAttached.\n if (!this.isBodyAttached) {\n return;\n }\n\n const viewportWidth: number = this.viewport()?.measureViewportSize('horizontal') ?? 0;\n if (viewportWidth > 0) {\n this.headerRightMargin.set(this.bodyElement()!.nativeElement.clientWidth - viewportWidth);\n }\n this.viewport()?.checkViewportSize();\n this.syncHeaderScroll();\n });\n\n this.ngZone.runOutsideAngular(() => {\n this.bodyResizeObserver = new ResizeObserver(() => {\n this.bodyResized$.next();\n });\n this.bodyResizeObserver.observe(this.bodyElement()!.nativeElement);\n });\n }\n\n public override ngOnDestroy(): void {\n this.bodyResizeObserver?.disconnect();\n super.ngOnDestroy();\n }\n //#endregion\n\n //#region Event handlers\n protected onSelectionResized(newSize: number): void {\n if (this.selectionColRealSize != newSize) {\n this.selectionColRealSize = newSize;\n }\n }\n //#endregion\n\n //#region Public methods\n protected isFirstVisibleRow(rowIndex: number): boolean {\n const renderedRange: ListRange | undefined = this.viewport()?.getRenderedRange();\n if (renderedRange) {\n return rowIndex === renderedRange.start;\n }\n return false;\n }\n //#endregion\n\n //#region Private methods\n private syncHeaderScroll(): void {\n // Re-inserting the viewport into the DOM -- which is what re-activating a detached tab does --\n // puts its scroll position back to zero without firing a scroll event, so nothing tells the\n // header to come back with it and the headings sit at an offset the body no longer has.\n const scrollLeft: number = this.viewport()?.elementRef?.nativeElement?.scrollLeft ?? 0;\n\n if (this.headerScrollLeft() !== scrollLeft) {\n this.headerScrollLeft.set(scrollLeft);\n }\n }\n\n protected trackByFn(index: number, item: any): number {\n return item.key;\n }\n //#endregion\n}\n","@if (showButtons()) {\n <div class=\"buttons\">\n <ng-content select=\"[buttons]\"></ng-content>\n </div>\n}\n\n<div class=\"header\" [class.hide]=\"isHideColumns\" [style.padding-right.px]=\"headerRightMargin()\">\n <!-- Translated by however far the body is scrolled sideways. The rows scroll inside the CDK\n viewport and the header sits outside it, so without this the headings simply stay put\n while the cells move away from them. -->\n <div class=\"header-row\" [style.transform]=\"headerScrollLeft() ? 'translateX(-' + headerScrollLeft() + 'px)' : null\">\n @if (isShowMultiSelect) {\n <div\n class=\"header-cell selection\"\n [ngStyle]=\"{\n width: selectionColWidth ? selectionColWidth : null,\n }\"\n >\n \n </div>\n }\n\n <!-- A measured zero is a width, not the absence of one: it is a 1fr column that collapsed,\n and its heading has to collapse too.\n\n Such a heading is removed rather than merely made zero wide, because a flex item still\n takes a gap on each side while the body grid allows the collapsed track only one, and\n that spare gap pushed every heading to its right out by 16px. -->\n @for (column of columns; track column) {\n <div\n class=\"header-cell\"\n [ngStyle]=\"{\n display: column.realSize === 0 ? 'none' : null,\n 'width.px': column.realSize ?? null,\n }\"\n >\n <span>{{ column.headerName | translate }}</span>\n </div>\n }\n </div>\n</div>\n\n<div #body class=\"body\" [style.min-height.px]=\"bodyMinHeight\">\n <cdk-virtual-scroll-viewport [itemSize]=\"configs.rowHeight\" [style.grid-template-columns]=\"gridColumns\">\n <lib-data-grid-row\n #row\n *cdkVirtualFor=\"let row of dataGridDataset.loadedRows; index as i; trackBy: trackByFn\"\n [disabled]=\"disabled()\"\n [isFirstRow]=\"isFirstVisibleRow(i)\"\n [rowData]=\"row\"\n [style.height.px]=\"configs.rowHeight\"\n (selectionResized)=\"onSelectionResized($event)\"\n >\n </lib-data-grid-row>\n\n @if (loading()) {\n <div class=\"loading\" [style.height.px]=\"configs.rowHeight\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path\n class=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n <span>\n {{ dataGridDataset.configs.loadingDisplayText ?? '' | translate }}\n </span>\n </div>\n }\n @if (!loading() && !hasBeenLoaded && lazyLoadRows()) {\n <div class=\"message\" [style.height.px]=\"configs.rowHeight\">\n <span>\n {{ messageToDisplayWhenLazyLoad | translate }}\n </span>\n </div>\n }\n @if (!loading() && hasBeenLoaded && (!hasLoadedRows || hasFailed())) {\n @if (!hasFailed() && !hasLoadedRows && hasMessageToDisplayWhenEmpty && shouldDisplayMessageWhenEmpty) {\n <div class=\"message\" [style.height.px]=\"configs.rowHeight\">\n <span>\n {{ messageToDisplayWhenEmpty | translate }}\n </span>\n </div>\n }\n @if (hasFailed()) {\n <div class=\"message\" [style.height.px]=\"configs.rowHeight\">\n <span>\n <i class=\"fas fa-exclamation-triangle mr-2 text-yellow-600\"></i>{{ messageToDisplayWhenFailed | translate }}\n </span>\n </div>\n }\n }\n </cdk-virtual-scroll-viewport>\n</div>\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\n\n@Component({\n selector: 'lib-form-group',\n templateUrl: './form-group.component.html',\n styleUrls: ['./form-group.component.scss'],\n imports: [TranslatePipe],\n host: {\n '[class.expand]': 'shouldExpand',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FormGroupComponent {\n //#region ViewChilds, Inputs, Outputs\n @Input() public shouldExpand = false;\n @Input() public label!: string;\n //#endregion\n\n //#region Variables\n //#endregion\n\n //#region Properties\n protected get hasTitle(): boolean {\n return !!this.label;\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n //#endregion\n\n //#region Private methods\n //#endregion\n}\n","@if (hasTitle) {\n <h3 class=\"title\">\n {{ label | translate }}\n </h3>\n}\n\n<div class=\"content\" [class.has-title]=\"hasTitle\">\n <ng-content></ng-content>\n</div>\n","import { NgStyle } from '@angular/common';\nimport { Component, ElementRef, input, InputSignal, Signal, signal, viewChild, WritableSignal } from '@angular/core';\n\n@Component({\n selector: 'lib-group-accordion',\n templateUrl: './group-accordion.component.html',\n styleUrls: ['./group-accordion.component.scss'],\n host: { '[class.collapsed]': 'collapsed()' },\n imports: [NgStyle],\n})\nexport class GroupAccordionComponent {\n //#region ViewChilds, Inputs, Outputs\n private readonly containerElementRef: Signal<ElementRef<HTMLDivElement> | undefined> =\n viewChild<ElementRef<HTMLDivElement>>('container');\n\n public readonly label: InputSignal<string> = input.required<string>();\n //#endregion\n\n //#region Variables\n private readonly _maxHeight: WritableSignal<number> = signal(-1);\n protected readonly collapsed: WritableSignal<boolean> = signal(false);\n //#endregion\n\n //#region Properties\n public readonly maxHeight: Signal<number> = this._maxHeight.asReadonly();\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n protected onToggle(): void {\n // Before collapsing, we set the max height style for the closing effect.\n if (!this.collapsed()) {\n this.setMaxHeight();\n }\n\n setTimeout(() => {\n this.collapsed.update((collapsed: boolean) => !collapsed);\n\n // After expanding, we wait the transition to end and remove the max height.\n if (!this.collapsed()) {\n this.clearMaxHeight();\n }\n });\n }\n //#endregion\n\n //#region Public methods\n //#endregion\n\n //#region Private methods\n private clearMaxHeight(): void {\n setTimeout(() => {\n this._maxHeight.set(-1);\n }, 150);\n }\n private setMaxHeight(): void {\n this._maxHeight.set(this.containerElementRef()?.nativeElement?.offsetHeight ?? 0);\n }\n //#endregion\n}\n","<div class=\"title\">\n <h6\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"!collapsed()\"\n (click)=\"onToggle()\"\n (keydown.enter)=\"onToggle()\"\n (keydown.space)=\"onToggle(); $event.preventDefault()\"\n >\n <i class=\"fas fa-chevron-down fa-sm\"></i>{{ label() }}\n </h6>\n</div>\n\n<div\n #container\n class=\"content animate\"\n [ngStyle]=\"\n (maxHeight() >= 0 && {\n 'height.px': maxHeight(),\n 'max-height.px': maxHeight(),\n }) ||\n null\n \"\n>\n <div #maxHeighContainer>\n <ng-content></ng-content>\n </div>\n</div>\n","import { AfterViewInit, Directive, ElementRef, EventEmitter, HostListener, inject, Input, Output } from '@angular/core';\n\n@Directive({\n selector: '[libScrollSpy]',\n})\nexport class ScrollSpyDirective implements AfterViewInit {\n //#region ViewChilds, Inputs, Outputs\n @Input() public spiedTags: Array<string> = [];\n\n @Output() public activeSectionChange: EventEmitter<number> = new EventEmitter<number>();\n //#endregion\n\n //#region Variables\n private _el: ElementRef<HTMLElement> = inject(ElementRef);\n private activeSection: number | null = null;\n private sections: Array<Element> = new Array<Element>();\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n public ngAfterViewInit(): void {\n this.updateSections(Array.from(this._el.nativeElement.children));\n }\n //#endregion\n\n //#region Event handlers\n @HostListener('scroll', ['$event'])\n public onScroll(event: any): void {\n const scrollTop: number = event.target.scrollTop;\n const scrollHeight: number = event.target.scrollHeight;\n const maxScroll: number = Math.round(event.target.scrollHeight - event.target.getBoundingClientRect().height);\n\n const currentScroll: number = Math.round((scrollTop * scrollHeight) / maxScroll);\n\n if (currentScroll >= scrollHeight) {\n this.select(this.sections.length - 1);\n return;\n }\n\n const elements: Element[] = this.sections.filter((el) => (el as HTMLElement).offsetTop <= currentScroll);\n\n this.select(elements.length > 0 ? elements.length - 1 : 0);\n }\n //#endregion\n\n //#region Public methods\n public scrollTo(section: number): void {\n this._el.nativeElement.scrollTop = (this.sections[section] as HTMLElement).offsetTop;\n }\n\n public select(section: number): void {\n if (section !== this.activeSection) {\n this.activeSection = section;\n this.activeSectionChange.emit(section);\n }\n }\n //#endregion\n\n //#region Private methods\n private updateSections(children: Element[]): void {\n children.forEach((el) => {\n if (this.spiedTags.some((spiedTag) => spiedTag.toUpperCase() === el.tagName.toUpperCase())) {\n this.sections.push(el);\n } else {\n this.updateSections(Array.from(el.children));\n }\n });\n }\n //#endregion\n}\n","import { NgClass } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ContentChildren, Input, QueryList, ViewChild } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ScrollSpyDirective } from '../../directives/scroll-spy.directive';\nimport { GroupAccordionComponent } from '../group-accordion/group-accordion.component';\n\n@Component({\n selector: 'lib-group-container',\n templateUrl: './group-container.component.html',\n styleUrls: ['./group-container.component.scss'],\n imports: [NgClass, TranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class GroupContainerComponent {\n @ViewChild(ScrollSpyDirective) scrollSpy!: ScrollSpyDirective;\n @ContentChildren(GroupAccordionComponent, { descendants: true }) sections!: QueryList<GroupAccordionComponent>;\n\n public get titles(): string[] {\n return this.sections?.map((x) => x.label()) ?? [];\n }\n\n public activeSection = 0;\n\n @Input() title?: string;\n\n @Input() icon?: string;\n\n activeSectionChanged(index: number): void {\n this.activeSection = index;\n }\n\n scrollTo(section: number) {\n this.scrollSpy.scrollTo(section);\n }\n}\n","<div class=\"title\">\n @if (!!title && !!icon) {\n <i class=\"fas fa-fw\" [ngClass]=\"icon\"></i>\n }\n @if (!!title) {\n <h4>{{ title | translate }}</h4>\n }\n @if (!title) {\n <svg [ngClass]=\"''\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path\n class=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n }\n</div>\n\n<div class=\"content-container\">\n <ng-content></ng-content>\n</div>\n","import { Component, computed, contentChildren, Signal, signal, viewChild, WritableSignal } from '@angular/core';\nimport { ScrollSpyDirective } from '../../directives/scroll-spy.directive';\nimport { GroupAccordionComponent } from '../group-accordion/group-accordion.component';\n\n@Component({\n selector: 'lib-group-scroll-spy',\n templateUrl: './group-scroll-spy.component.html',\n styleUrls: ['./group-scroll-spy.component.scss'],\n imports: [ScrollSpyDirective],\n})\nexport class GroupScrollSpyComponent {\n public readonly scrollSpy: Signal<ScrollSpyDirective | undefined> = viewChild(ScrollSpyDirective);\n public readonly sections: Signal<readonly GroupAccordionComponent[]> = contentChildren(GroupAccordionComponent, {\n descendants: true,\n });\n\n // Reads each section's own label signal, so a section renaming itself refreshes the strip too.\n public readonly titles: Signal<string[]> = computed(() =>\n this.sections().map((section: GroupAccordionComponent) => section.label()),\n );\n\n public readonly activeSection: WritableSignal<number> = signal(0);\n\n public activeSectionChanged(index: number): void {\n this.activeSection.set(index);\n }\n\n public scrollTo(section: number): void {\n this.scrollSpy()?.scrollTo(section);\n }\n}\n","<div class=\"scroll-spy\">\n @for (title of titles(); track title; let i = $index) {\n <a\n class=\"item\"\n [class.active]=\"i === activeSection()\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-current]=\"i === activeSection()\"\n (click)=\"scrollTo(i)\"\n (keydown.enter)=\"scrollTo(i)\"\n (keydown.space)=\"scrollTo(i); $event.preventDefault()\"\n >{{ title }}</a\n >\n }\n</div>\n\n<div\n class=\"content\"\n libScrollSpy\n [class.no-scroll-spy]=\"titles().length === 0\"\n [spiedTags]=\"['lib-group-accordion']\"\n (activeSectionChange)=\"activeSectionChanged($event)\"\n>\n <ng-content></ng-content>\n</div>\n","import {\n Component,\n ElementRef,\n HostListener,\n inject,\n input,\n InputSignal,\n model,\n ModelSignal,\n OnInit,\n output,\n OutputEmitterRef,\n Signal,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { IModal, ModalSize } from '../../models';\nimport { BaseComponent } from '../base.component';\n\n@Component({\n selector: 'lib-modal',\n templateUrl: './modal.component.html',\n styleUrls: ['./modal.component.scss'],\n host: {\n title: '', // This is to ensure that the title input does not conflict with the native HTML title attribute.\n '[class.show]': 'isOpen()',\n },\n imports: [],\n})\nexport class ModalComponent extends BaseComponent implements IModal, OnInit {\n //#region ViewChilds, Inputs, Outputs\n public readonly closeButtonText: ModelSignal<string> = model('Close');\n public readonly dialog: InputSignal<boolean> = input(true);\n public readonly modalProcessing: ModelSignal<boolean> = model(false);\n public readonly position: InputSignal<'top' | 'left' | 'right' | 'bottom' | 'center'> = input<\n 'top' | 'left' | 'right' | 'bottom' | 'center'\n >('center');\n public readonly size: InputSignal<ModalSize> = input<ModalSize>('auto');\n public readonly title: InputSignal<string | undefined> = input<string>();\n\n public readonly closed: OutputEmitterRef<void> = output<void>();\n //#endregion\n\n //#region Variables\n private readonly _isOpen: WritableSignal<boolean> = signal(false);\n private clickedOutside = false;\n private elementRef: ElementRef;\n //#endregion\n\n //#region Properties\n /** Renamed from `isShown`, and a signal now -- IModal says why. */\n public readonly isOpen: Signal<boolean> = this._isOpen.asReadonly();\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super();\n\n this.elementRef = inject(ElementRef);\n }\n\n /**\n * Moves the host to `<body>`.\n *\n * The host is `fixed` at `z-index: 50`, which ought to put it over everything. It did not: a\n * modal opened from a view rendered *under* the navigation, and the tab strip stayed visible and\n * clickable behind it. z-index only ranks siblings inside one stacking context, and the panel\n * these views render in is its own — it has to be, so the glass layer behind it can sit at -1\n * without falling through the app backdrop. Inside that context the modal's 50 counts for\n * nothing against the sidebar's 20 outside it, and it can never reach over the strip either.\n *\n * A bigger number cannot fix that, and dropping the isolation breaks the glass. Leaving the\n * context is the fix, and the body is the one place with nothing above it.\n *\n * Angular keeps rendering into this element wherever it sits, and injection does not care where\n * the node ends up — the forms and datasets these modals reach for still resolve through the\n * component tree.\n */\n public ngOnInit(): void {\n // Guarded because the logic specs build these components with Object.create() and never give\n // them a host; there is nothing to move then, and nothing to do.\n const host: HTMLElement | undefined = this.elementRef?.nativeElement;\n host?.ownerDocument.body.appendChild(host);\n }\n\n /** Angular drops the view but not the node, now that the host is no longer where it was created. */\n public override ngOnDestroy(): void {\n (<HTMLElement | undefined>this.elementRef?.nativeElement)?.remove();\n\n super.ngOnDestroy();\n }\n //#endregion\n\n //#region Event handlers\n protected onCloseClick(): void {\n if (!this.modalProcessing() && this.isOpen()) {\n this.closeModal();\n }\n }\n\n /**\n * Refuses the native submission of the form the content sits in.\n *\n * A submit button in here -- framework-button-filters' Confirm is one, and any <button> without a\n * type is another -- makes the browser submit this form once the button's own click handler has\n * run: a GET to the current URL, which reloads the whole application. Before the host moved to\n * <body> the submit bubbled through the consumer, and the FormGroupDirective of its [formGroup]\n * binding cancelled it; that was never this component's doing, and it stopped when the event\n * stopped passing through the consumer. A modal is never meant to submit natively, so the form\n * says so itself, wherever the host lives.\n *\n * Only the default is prevented. The event still bubbles, and the click that caused it has already\n * done its work.\n */\n protected onFormSubmit(event: Event): void {\n event.preventDefault();\n }\n //#endregion\n\n //#region Public methods\n public closeModal(): void {\n if (this.isOpen()) {\n this.toggleModal();\n }\n }\n\n public toggleModal(): void {\n const wasOpen: boolean = this._isOpen();\n\n const body: HTMLBodyElement | null = document.querySelector('body');\n body?.classList.toggle('modal-active');\n\n this._isOpen.set(body?.classList.contains('modal-active') ?? false);\n\n if (this.isOpen()) {\n this.clickedOutside = false;\n\n const autofocus: any = this.elementRef.nativeElement.querySelector('[autofocus]');\n if (autofocus && !!autofocus.focus) {\n autofocus.focus();\n }\n } else if (wasOpen) {\n this.closed.emit();\n }\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n\n //#region Host listeners\n @HostListener('body:mousedown', ['$event'])\n protected bodyMouseDown(event: MouseEvent): void {\n if (this.dialog() && this.isOpen()) {\n const target: HTMLElement = <HTMLElement>event.target;\n\n this.clickedOutside =\n (!this.modalProcessing() &&\n event.button === 0 &&\n target.closest('lib-modal') &&\n !target.closest('.modal-content')) ??\n false;\n }\n }\n\n @HostListener('body:mouseup', ['$event'])\n protected bodyMouseUp(event: MouseEvent): void {\n if (this.dialog() && this.isOpen()) {\n if (this.clickedOutside && !this.modalProcessing()) {\n this.toggleModal();\n }\n }\n }\n\n @HostListener('document:keydown.escape', ['$event'])\n protected documentKeyDown(event: Event): void {\n event = event || window.event;\n\n // keyCode is the fallback for engines predating KeyboardEvent.key.\n const isEscape: boolean =\n 'key' in event ? event.key === 'Escape' || event.key === 'Esc' : (<KeyboardEvent>event).keyCode === 27;\n\n if (!this.modalProcessing() && this.isOpen() && isEscape && document.body.classList.contains('modal-active')) {\n this.toggleModal();\n }\n }\n //#endregion\n}\n","<div class=\"modal-overlay\"></div>\n\n<div class=\"modal-container size-{{ size() }} {{ position() }}\">\n <form class=\"modal-content\" (submit)=\"onFormSubmit($event)\">\n @if (title()) {\n <div class=\"modal-header\">\n <p class=\"text-2xl font-bold\">{{ title() }}</p>\n <button type=\"button\" class=\"modal-close\" (click)=\"toggleModal()\">\n <svg\n class=\"fill-current text-black\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n >\n <path\n d=\"M14.53 4.53l-1.06-1.06L9 7.94 4.53 3.47 3.47 4.53 7.94 9l-4.47 4.47 1.06 1.06L9 10.06l4.47 4.47 1.06-1.06L10.06 9z\"\n ></path>\n </svg>\n </button>\n </div>\n }\n\n <div class=\"modal-body\">\n <ng-content select=\"[body]\"></ng-content>\n </div>\n\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn gray-300\" [disabled]=\"modalProcessing()\" (click)=\"onCloseClick()\">\n {{ closeButtonText() }}\n </button>\n\n <ng-content select=\"[footer]\"></ng-content>\n </div>\n </form>\n</div>\n","import { HttpErrorResponse } from '@angular/common/http';\nimport {\n Component,\n computed,\n inject,\n input,\n InputSignal,\n OnInit,\n Signal,\n signal,\n viewChild,\n WritableSignal,\n} from '@angular/core';\nimport { AbstractControl, FormArray, FormGroup } from '@angular/forms';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { take, takeUntil } from 'rxjs';\nimport { FormService } from '../../services';\nimport { DataGridDataset } from '../../services/datasets/data-grid.dataset';\nimport { MultiEditorDataset } from '../../services/datasets/multi-editor.dataset';\nimport { DataGridComponent } from '../data-grid/data-grid.component';\nimport { FormGroupComponent } from '../form-group/form-group.component';\nimport { ModalComponent } from '../modal/modal.component';\n\n@Component({\n selector: 'lib-multi-editor',\n templateUrl: './multi-editor.component.html',\n styleUrls: ['./multi-editor.component.scss'],\n imports: [DataGridComponent, ModalComponent, FormGroupComponent, TranslatePipe],\n})\nexport class MultiEditorComponent extends ModalComponent implements OnInit {\n //#region ViewChilds, Inputs, Outputs\n private readonly modal: Signal<ModalComponent | undefined> = viewChild(ModalComponent);\n\n public readonly addButtonLabel: InputSignal<string> = input('Add row');\n public readonly formGroup: InputSignal<FormGroup<any>> = input.required<FormGroup<any>>();\n public readonly removeButtonLabel: InputSignal<string> = input('Remove row');\n public readonly showAddButton: InputSignal<boolean> = input(true);\n public readonly showDeleteButton: InputSignal<boolean> = input(true);\n //#endregion\n\n //#region Variables\n protected readonly gridLoading: WritableSignal<boolean> = signal(false);\n\n private dataGridDataset: DataGridDataset = inject(DataGridDataset);\n private formService: FormService = inject(FormService);\n private multiEditorDataset: MultiEditorDataset = inject(MultiEditorDataset);\n private readonly selectedKey: WritableSignal<string | undefined> = signal(undefined);\n private selectedValue?: any;\n //#endregion\n\n //#region Properties\n protected get formLoading(): boolean {\n return this.formService.loading;\n }\n\n protected readonly hasSelectedKey: Signal<boolean> = computed(() => !!this.selectedKey());\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super();\n }\n\n public override ngOnInit(): void {\n // ModalComponent moves the host to <body> here. Without this call the dialog stays inside the\n // tab panel's stacking context and renders under the navigation.\n super.ngOnInit();\n\n this.dataGridDataset.loadFinished.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.multiEditorDataset.clearChangedValues();\n\n this.gridLoading.set(false);\n this.selectedKey.set(undefined);\n this.selectedValue = undefined;\n });\n\n this.dataGridDataset.selectedRowsChanged.pipe(takeUntil(this.destroy$)).subscribe(() => {\n if (this.gridLoading() || !this.dataGridDataset.hasLoadedRows || !this.dataGridDataset.hasSelectedRows) {\n return;\n }\n\n if (this.formGroup().disabled) {\n this.formGroup().enable();\n }\n\n const selectedRowKey: string = this.dataGridDataset.selectedRowKeys[0];\n if (\n !!this.selectedKey() &&\n this.formGroup().enabled &&\n !this.formGroup().valid &&\n this.selectedKey() !== selectedRowKey\n ) {\n // If the form is invalid, need to stay in the same selected row.\n this.dataGridDataset.selectRow(this.selectedKey()!);\n this.formGroup().markAllAsTouched();\n } else {\n this.selectedKey.set(selectedRowKey);\n this.selectedValue = this.dataGridDataset.getRowData(selectedRowKey);\n this.formService.model = this.selectedValue;\n\n this.formGroup().reset();\n this.formGroup().patchValue(this.selectedValue);\n }\n });\n\n this.formGroup()\n .valueChanges.pipe(takeUntil(this.destroy$))\n .subscribe((_: any) => {\n if (this.selectedKey() && this.formGroup().dirty) {\n this.multiEditorDataset.updateValues(this.selectedKey()!, this.formGroup().getRawValue());\n }\n });\n\n // Start with an empty form and, since there is no selected row, disable the form.\n this.formGroup().disable({ emitEvent: false });\n }\n //#endregion\n\n //#region Event handlers\n protected onDeleteClick(): void {\n if (!this.selectedKey()) {\n return;\n }\n\n this.multiEditorDataset.removeValue(this.selectedKey()!);\n\n this.selectedKey.set(undefined);\n this.formGroup().reset({ emitEvent: false });\n this.clearAllFormArrays(this.formGroup());\n\n this.formGroup().disable({ emitEvent: false });\n }\n\n protected onNewClick(): void {\n const fakeNewID: number = (Math.floor(Math.random() * (999999 - 100000)) + 100000) * -1;\n const newModel: any = this.multiEditorDataset.newData(fakeNewID);\n\n if (newModel) {\n // Read before addNewRow: it stamps the grid's internal key onto the row, so afterwards even a\n // `{}` model reports one own key and the check below would never skip.\n const hasPrefilledValues: boolean = Object.keys(newModel).length > 0;\n\n this.multiEditorDataset.storeFakeIDGenerated(fakeNewID);\n\n this.dataGridDataset.addNewRow(newModel);\n\n const newKey: string = this.dataGridDataset.loadedKeys![this.dataGridDataset.loadedKeys!.length - 1];\n\n // Record whatever `newData` pre-filled. `selectRow` below reaches the form through\n // reset() + patchValue(), which leaves it pristine, and the `valueChanges` handler is gated on\n // `formGroup.dirty` — so a row the user never types into is never recorded. Without this, values\n // returned by `newData` show up in the grid but are dropped from the save batch, and adding\n // several rows while only editing the last silently discards the earlier ones.\n //\n // Skipped for a value-less model (`{}`, the blank-row convention) so implementations that\n // pre-fill nothing keep sending nothing for a row that was added and never touched.\n if (hasPrefilledValues) {\n this.multiEditorDataset.updateValues(newKey, newModel);\n }\n\n this.dataGridDataset.selectRow(newKey);\n }\n }\n\n protected onSaveClick(): void {\n if (this.selectedKey()) {\n this.formGroup().markAllAsTouched();\n }\n\n if (!this.selectedKey() || this.formGroup().valid) {\n this.modalProcessing.set(true);\n this.formGroup().disable();\n\n this.multiEditorDataset\n .saveChanges()\n .pipe(take(1))\n .subscribe({\n next: (_: any) => {\n this.modalProcessing.set(false);\n this.toggleModal();\n },\n error: (e: HttpErrorResponse) => {\n this.modalProcessing.set(false);\n this.formGroup().enable();\n\n if (e.status === 400 && e.error.errors) {\n this.dataGridDataset.selectRowID(e.error.entityKey);\n\n this.formService.setValidationErrorsFromHttpResponse(e);\n }\n },\n });\n }\n }\n //#endregion\n\n //#region Public methods\n public override closeModal(): void {\n this.modal()?.closeModal();\n }\n\n public override toggleModal(): void {\n this.modal()?.toggleModal();\n\n if (this.modal()?.isOpen()) {\n this.gridLoading.set(true);\n this.dataGridDataset.refresh();\n\n this.selectedKey.set(undefined);\n this.formGroup().reset({ emitEvent: false });\n this.clearAllFormArrays(this.formGroup());\n this.formGroup().disable({ emitEvent: false });\n }\n }\n //#endregion\n\n //#region Private methods\n private clearAllFormArrays(form: FormGroup): void {\n Object.keys(form.controls).forEach((key: string) => {\n const control: AbstractControl | null = form.get(key);\n if (control instanceof FormArray) {\n control.clear({ emitEvent: false });\n }\n\n // Check for nested FormArrays.\n if (control instanceof FormGroup) {\n this.clearAllFormArrays(control);\n }\n });\n }\n //#endregion\n}\n","<lib-modal\n [closeButtonText]=\"closeButtonText() | translate\"\n [dialog]=\"dialog()\"\n [modalProcessing]=\"modalProcessing()\"\n [position]=\"position()\"\n [size]=\"size()\"\n [title]=\"title() ?? ''\"\n>\n <div body class=\"body-content\">\n <div class=\"data-grid\">\n <lib-data-grid [disabled]=\"modalProcessing()\" [lazyLoadRows]=\"true\"></lib-data-grid>\n </div>\n\n <div class=\"data\">\n <div class=\"buttons\">\n @if (showAddButton()) {\n <button\n class=\"btn gray-500\"\n type=\"button\"\n [class.disabled]=\"modalProcessing() || gridLoading() || formLoading || formGroup().invalid\"\n [disabled]=\"modalProcessing() || gridLoading() || formLoading || formGroup().invalid\"\n (click)=\"onNewClick()\"\n >\n {{ addButtonLabel() }}\n </button>\n }\n @if (showDeleteButton() && hasSelectedKey()) {\n <button\n class=\"btn red-500\"\n type=\"button\"\n [class.disabled]=\"modalProcessing() || gridLoading() || formLoading\"\n [disabled]=\"modalProcessing() || gridLoading() || formLoading\"\n (click)=\"onDeleteClick()\"\n >\n {{ removeButtonLabel() }}\n </button>\n }\n </div>\n\n <lib-form-group>\n <ng-content></ng-content>\n </lib-form-group>\n </div>\n </div>\n\n <div footer>\n <button\n class=\"btn blue-500\"\n type=\"button\"\n [class.disabled]=\"gridLoading() || formLoading\"\n [class.loading]=\"modalProcessing()\"\n (click)=\"onSaveClick()\"\n >\n {{ 'Button-Modal-MultiEditor-Confirm' | translate }}\n </button>\n </div>\n</lib-modal>\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, input, InputSignal, OnInit, signal, TemplateRef, WritableSignal } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { takeUntil } from 'rxjs';\nimport { MultiSelectResultDataset } from '../../../services/datasets/multi-select-result.dataset';\nimport { BaseComponent } from '../../base.component';\nimport { DataGridDataset } from '../../../services';\n\n@Component({\n selector: 'lib-multi-select-result-grid',\n templateUrl: './result-grid.component.html',\n styleUrls: ['./result-grid.component.scss'],\n host: {\n class: 'flex-grow',\n },\n imports: [CommonModule, TranslatePipe],\n})\nexport class MultiSelectResultGridComponent extends BaseComponent implements OnInit {\n //#region ViewChilds, Inputs, Outputs\n public readonly isDisabled: InputSignal<boolean> = input(false);\n public readonly template: InputSignal<TemplateRef<any> | undefined> = input<TemplateRef<any>>();\n //#endregion\n\n //#region Variables\n protected dataGridDataset: DataGridDataset = inject(DataGridDataset);\n protected readonly isLoading: WritableSignal<boolean> = signal(true);\n protected resultDataset: MultiSelectResultDataset = inject(MultiSelectResultDataset);\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super();\n }\n\n public ngOnInit(): void {\n this.resultDataset.loadStarted.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.isLoading.set(true);\n });\n\n this.resultDataset.loadFinished.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.isLoading.set(false);\n });\n }\n //#endregion\n\n //#region Event handlers\n public onItemRemoved(rowIndex: number): void {\n const id: any = this.resultDataset.displayedIDs[rowIndex];\n\n // Removing used to go only through the grid on the left, which knows nothing about a row it\n // has not loaded -- and this panel lists entries the search may never have shown. The click\n // then did nothing at all. The dataset is told directly, and the grid is still told too so a\n // row that does happen to be loaded keeps its checkbox in step.\n this.resultDataset.setIDToRemove(id);\n this.dataGridDataset.deselectRowID(id);\n }\n\n protected onScrolled(event: any): void {\n const currentScroll: number = event.target.scrollTop + event.target.clientHeight;\n const scrollHeight: number = event.target.scrollHeight - event.target.clientHeight;\n\n if (currentScroll > scrollHeight && !this.isLoading() && !this.resultDataset.loadedLastRow) {\n this.isLoading.set(true);\n this.resultDataset.loadRows();\n }\n }\n //#endregion\n\n //#region Public methods\n //#endregion\n\n //#region Private methods\n //#endregion\n}\n","<div class=\"body\" (scroll)=\"onScrolled($event)\">\n @for (row of resultDataset.displayedRows; track row; let i = $index) {\n <div class=\"row\">\n <div class=\"cell\">\n <button\n class=\"remove\"\n type=\"button\"\n [class.disabled]=\"isDisabled()\"\n [disabled]=\"isDisabled()\"\n (click)=\"onItemRemoved(i)\"\n >\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"cell\">\n <div>\n <ng-container *ngTemplateOutlet=\"template()!; context: { rowData: row }\"> </ng-container>\n </div>\n </div>\n </div>\n }\n @if (isLoading()) {\n <div class=\"loading\">\n <svg [ngClass]=\"''\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path\n class=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n <span>\n {{ resultDataset.configs.loadingDisplayText ?? '' | translate }}\n </span>\n </div>\n }\n</div>\n","import {\n Component,\n inject,\n input,\n InputSignal,\n OnInit,\n Signal,\n signal,\n TemplateRef,\n viewChild,\n WritableSignal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { take, takeUntil } from 'rxjs';\nimport { IGridColumn } from '../../models';\nimport { DataGridDataset } from '../../services/datasets/data-grid.dataset';\nimport { MultiSelectResultDataset } from '../../services/datasets/multi-select-result.dataset';\nimport { DataGridComponent } from '../data-grid/data-grid.component';\nimport { ModalComponent } from '../modal/modal.component';\nimport { MultiSelectResultGridComponent } from './result-grid/result-grid.component';\n\n@Component({\n selector: 'lib-multi-select',\n templateUrl: './multi-select.component.html',\n styleUrls: ['./multi-select.component.scss'],\n imports: [DataGridComponent, FormsModule, ModalComponent, MultiSelectResultGridComponent, TranslatePipe],\n})\nexport class MultiSelectComponent extends ModalComponent implements OnInit {\n //#region ViewChilds, Inputs, Outputs\n private readonly modal: Signal<ModalComponent | undefined> = viewChild(ModalComponent);\n\n public readonly itemTemplate: InputSignal<TemplateRef<unknown> | undefined> = input<TemplateRef<unknown>>();\n //#endregion\n\n //#region Variables\n protected readonly isResultGridLoading: WritableSignal<boolean> = signal(false);\n protected readonly isSearchGridLoading: WritableSignal<boolean> = signal(false);\n protected resultDataset: MultiSelectResultDataset = inject(MultiSelectResultDataset);\n protected readonly searchCriteria: WritableSignal<string> = signal('');\n\n private _searchColumn = '';\n private dataGridDataset: DataGridDataset = inject(DataGridDataset);\n //#endregion\n\n //#region Properties\n private get searchColumn(): string {\n if (this._searchColumn.length === 0) {\n let columnName =\n this.dataGridDataset.columns.filter((col: IGridColumn) => col.field !== '')[0]?.field ?? 'Search';\n columnName = columnName.charAt(0).toUpperCase() + columnName.slice(1);\n this._searchColumn = columnName;\n }\n return this._searchColumn;\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super();\n\n this.dataGridDataset.configs.multiSelect = true;\n this.closeButtonText.set('Button-Modal-Cancel');\n }\n\n public override ngOnInit(): void {\n // ModalComponent moves the host to <body> here. Without this call the dialog stays inside the\n // tab panel's stacking context and renders under the navigation.\n super.ngOnInit();\n\n this.dataGridDataset.loadStarted.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.isSearchGridLoading.set(true);\n });\n\n this.dataGridDataset.loadFinished.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.isSearchGridLoading.set(false);\n this.updateSelectedItems();\n });\n\n this.resultDataset.loadFinished.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.isResultGridLoading.set(false);\n this.updateSelectedItems();\n });\n\n this.dataGridDataset.selectedRowsChanged\n .pipe(takeUntil(this.destroy$))\n .subscribe((selectionChanges: { [id: string]: { rowData: any; selected: boolean } }) => {\n if (this.isSearchGridLoading() || this.isResultGridLoading()) {\n return;\n }\n\n Object.keys(selectionChanges).forEach((key: string) => {\n const selection: { rowData: any; selected: boolean } = selectionChanges[key];\n const id: any = this.dataGridDataset.getRowID(key);\n\n if (selection.selected) {\n this.resultDataset.setIDToAdd(id, selection.rowData);\n } else {\n this.resultDataset.setIDToRemove(id);\n }\n });\n });\n }\n //#endregion\n\n //#region Event handlers\n protected onSave(): void {\n this.modalProcessing.set(true);\n this.resultDataset\n .saveChanges()\n .pipe(take(1))\n .subscribe(() => {\n this.modalProcessing.set(false);\n this.toggleModal();\n });\n }\n\n /**\n * Runs the search.\n *\n * The input lives inside the modal's form, so Enter would submit it. Submitting reaches the\n * footer and saves changes the user has not finished making -- pressing Enter after typing a\n * name means \"find this\", never \"confirm everything\". The event is stopped here rather than in\n * the template so the reason travels with the code.\n */\n protected onSearch(event?: Event): void {\n event?.preventDefault();\n event?.stopPropagation();\n\n const filters: { [key: string]: string } = this.dataGridDataset.filters ?? {};\n\n this.isSearchGridLoading.set(true);\n if (this.searchCriteria().length > 0) {\n filters[this.searchColumn] = this.searchCriteria();\n this.dataGridDataset.setFilters(filters);\n } else if (Object.keys(filters).includes(this.searchColumn)) {\n this.clearSearch();\n }\n }\n //#endregion\n\n //#region Public methods\n public override closeModal(): void {\n this.modal()?.closeModal();\n }\n\n public override toggleModal(): void {\n this.modal()?.toggleModal();\n\n if (this.modal()?.isOpen()) {\n this.searchCriteria.set('');\n this.clearSearch();\n\n this.isResultGridLoading.set(true);\n this.resultDataset.refresh();\n }\n }\n //#endregion\n\n //#regiosn Private methods\n private clearSearch(): void {\n const filters: { [key: string]: string } = this.dataGridDataset.filters ?? {};\n if (Object.keys(filters).includes(this.searchColumn)) {\n delete filters[this.searchColumn];\n }\n this.dataGridDataset.setFilters(filters);\n }\n private updateSelectedItems(): void {\n if (this.isSearchGridLoading() || this.isResultGridLoading()) {\n return;\n }\n\n // Filter by the results that are not marked to be removed.\n const idsFromResult: any[] = (this.resultDataset.loadedKeys ?? [])\n .map((key: string) => this.resultDataset.getRowID(key))\n .filter((id: any) => this.resultDataset.idsToRemove.indexOf(id) < 0);\n\n idsFromResult.push(...this.resultDataset.idsToAdd);\n\n // Get each corresponding key from the data grid.\n const keysToSelect: string[] = (this.dataGridDataset.loadedKeys ?? []).filter(\n (key: string) => idsFromResult.indexOf(this.dataGridDataset.getRowID(key)) >= 0,\n );\n\n this.dataGridDataset.selectRows(keysToSelect);\n }\n //#endregion\n}\n","<lib-modal\n [closeButtonText]=\"closeButtonText() | translate\"\n [dialog]=\"dialog()\"\n [modalProcessing]=\"modalProcessing()\"\n [position]=\"position()\"\n [size]=\"size()\"\n [title]=\"title() ?? ''\"\n>\n <div body class=\"body-content\">\n <div class=\"search-grid\">\n <div class=\"search\">\n <input\n class=\"form-input\"\n placeholder=\"Search...\"\n type=\"text\"\n [(ngModel)]=\"searchCriteria\"\n [disabled]=\"modalProcessing() || isSearchGridLoading()\"\n (keydown.enter)=\"onSearch($event)\"\n />\n </div>\n\n <lib-data-grid\n [disabled]=\"modalProcessing() || isSearchGridLoading() || isResultGridLoading()\"\n [lazyLoadRows]=\"true\"\n >\n </lib-data-grid>\n </div>\n\n <lib-multi-select-result-grid\n [isDisabled]=\"modalProcessing() || isSearchGridLoading() || isResultGridLoading()\"\n [template]=\"itemTemplate()!\"\n >\n </lib-multi-select-result-grid>\n </div>\n\n <div footer>\n <button class=\"btn blue-500\" type=\"button\" [class.loading]=\"modalProcessing()\" (click)=\"onSave()\">\n {{ 'Button-Modal-MultiSelect-Confirm' | translate }}\n </button>\n </div>\n</lib-modal>\n","import { NgStyle } from '@angular/common';\nimport {\n AfterViewInit,\n Component,\n ElementRef,\n inject,\n Input,\n OnInit,\n signal,\n ViewChild,\n WritableSignal,\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { delay, filter, takeUntil } from 'rxjs';\nimport { SIDEBAR_CONFIGS, SidebarConfigs, SidebarMenu, SidebarMenuOpenMode, toSidebarMenuOpenMode } from '../../models';\nimport { SidebarService } from '../../services';\nimport { BaseComponent } from '../base.component';\n\n@Component({\n selector: 'lib-sidebar-item',\n templateUrl: './sidebar-item.component.html',\n styleUrls: ['./sidebar-item.component.scss'],\n imports: [NgStyle, TranslatePipe],\n host: {\n '[class.active]': 'isActive',\n '[class.expanded]': '!isCollapsed',\n '[class.first-level]': 'level === 0',\n '[class.last-child]': 'isLast',\n '[class.selected]': 'isSelected()',\n },\n})\nexport class SidebarItemComponent extends BaseComponent implements OnInit, AfterViewInit {\n //#region ViewChilds, Inputs, Outputs\n @ViewChild('menuContainer') private menuContainer!: ElementRef<HTMLAnchorElement>;\n\n @Input() public isLast = false;\n @Input() public level = 0;\n @Input() public menu!: SidebarMenu;\n //#endregion\n\n //#region Variables\n // Signals, not fields. Three of these are read from host bindings, which Angular evaluates in\n // the PARENT's pass -- so `changeDetectorRef.detectChanges()` on this component could never\n // refresh them, and writing them after that pass raised NG0100 instead. A signal write marks\n // this view and every ancestor, which is the only notification that reaches a host binding.\n protected readonly hasFailed: WritableSignal<boolean> = signal(false);\n protected readonly isLoading: WritableSignal<boolean> = signal(false);\n protected readonly isSelected: WritableSignal<boolean> = signal(false);\n\n private readonly _childHeight: WritableSignal<number> = signal(0);\n private sidebarConfigs: SidebarConfigs = inject(SIDEBAR_CONFIGS);\n private sidebarService: SidebarService = inject(SidebarService);\n //#endregion\n\n //#region Properties\n public get childHeight(): number {\n return this._childHeight();\n }\n\n protected get areChildrenLoaded(): boolean {\n return this.isParent && (this.menu.children?.length ?? 0) > 0;\n }\n\n protected get externalLinkText(): string {\n return this.sidebarConfigs.externalLinkText;\n }\n\n protected get isActive(): boolean {\n return this.sidebarService.isActive;\n }\n\n protected get isCollapsed(): boolean {\n return this.sidebarService.isCollapsed;\n }\n\n protected get isParent(): boolean {\n return this.menu.childCount > 0;\n }\n\n protected get opensInNewBrowserTab(): boolean {\n return (\n (this.menu.url?.length ?? 0) > 0 &&\n toSidebarMenuOpenMode(this.menu.openMode) === SidebarMenuOpenMode.ExternalNewTab\n );\n }\n\n protected get hasIcon(): boolean {\n return !!this.menu.icon && this.menu.icon.length > 0;\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super();\n }\n\n public ngAfterViewInit(): void {\n if (!!this.menu && !!this.menu.parent) {\n this.menu.height = this.menuContainer?.nativeElement?.offsetHeight ?? 0;\n this.sidebarService.childrenInitialized.emit(this.menu.parent);\n }\n }\n\n public ngOnInit(): void {\n if (this.isParent) {\n this.sidebarService.childrenFailed\n .pipe(\n takeUntil(this.destroy$),\n filter((menu: SidebarMenu) => menu.id === this.menu.id),\n delay(1000),\n )\n .subscribe((_menu: SidebarMenu) => {\n this.hasFailed.set(true);\n this.isLoading.set(false);\n this.isSelected.set(false);\n this.menu.isSelected = false;\n });\n\n this.sidebarService.childrenLoading\n .pipe(\n takeUntil(this.destroy$),\n filter((menu: SidebarMenu) => menu.id === this.menu.id),\n )\n .subscribe((_menu: SidebarMenu) => {\n this.hasFailed.set(false);\n this.isLoading.set(true);\n });\n\n this.sidebarService.childrenInitialized\n .pipe(\n takeUntil(this.destroy$),\n filter(\n (menu: SidebarMenu) =>\n menu.id === this.menu.id && this.menu.children.every((child: SidebarMenu) => (child.height ?? 0) > 0),\n ),\n )\n .subscribe((_menu: SidebarMenu) => {\n this.isLoading.set(false);\n this.hasFailed.set(false);\n this.updateSubMenuHeight();\n\n if (this.menu.parent) {\n this.sidebarService.childrenInitialized.emit(this.menu.parent);\n }\n });\n }\n\n this.sidebarService.selectionChanged\n .pipe(\n takeUntil(this.destroy$),\n filter((menu: SidebarMenu) => menu.id === this.menu.id),\n )\n .subscribe((menu: SidebarMenu) => {\n this.isSelected.set(menu.isSelected);\n this.updateSubMenuHeight();\n });\n }\n //#endregion\n\n //#region Event handlers\n protected onSelectItem(): void {\n if (this.sidebarService.shouldActivate) {\n this.sidebarService.isActive = true;\n }\n\n this.sidebarService.select(this.menu);\n }\n //#endregion\n\n //#region Public methods\n //#endregion\n\n //#region Private methods\n protected trackByFn(_index: number, item: SidebarMenu): number {\n return item.id;\n }\n\n private getChildHeight(menu: SidebarMenu): number {\n if (menu.isSelected) {\n return menu.children.reduce(\n (height: number, childMenu: SidebarMenu) => height + (childMenu.height ?? 0) + this.getChildHeight(childMenu),\n 0,\n );\n }\n return 0;\n }\n\n private updateSubMenuHeight(): void {\n this._childHeight.set(this.getChildHeight(this.menu));\n }\n //#endregion\n}\n","<li>\n <div\n #menuContainer\n [class.external]=\"opensInNewBrowserTab\"\n [class.failed]=\"hasFailed()\"\n [class.loading]=\"isLoading()\"\n [class.parent]=\"isParent\"\n [class.selected]=\"isSelected()\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-current]=\"isSelected()\"\n (click)=\"onSelectItem()\"\n (keydown.enter)=\"onSelectItem()\"\n (keydown.space)=\"onSelectItem(); $event.preventDefault()\"\n >\n <a [attr.title]=\"opensInNewBrowserTab ? externalLinkText : null\">\n @if (hasIcon && level === 0) {\n <i class=\"fa-solid fa-fw {{ menu.icon }}\"></i>\n }\n <span>{{ menu.label | translate }}</span>\n </a>\n\n @if (isParent) {\n <div class=\"loading\">\n <svg class=\"animate-spin text-white\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path\n class=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n </div>\n }\n </div>\n\n @if (isParent) {\n <ul\n [class.open]=\"isSelected()\"\n [ngStyle]=\"{\n 'height.px': childHeight,\n 'max-height.px': childHeight,\n }\"\n >\n @for (child of menu.children; track trackByFn($index, child); let last = $last) {\n <lib-sidebar-item [menu]=\"child\" [level]=\"level + 1\" [isLast]=\"last\"> </lib-sidebar-item>\n }\n </ul>\n }\n</li>\n","import {\n AfterViewInit,\n Component,\n computed,\n HostListener,\n inject,\n OnInit,\n Signal,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { forkJoin, map, merge, Observable, of, switchMap, take, takeUntil } from 'rxjs';\nimport { SIDEBAR_CONFIGS, SidebarConfigs, SidebarMenu, SidebarRegion } from '../../models';\nimport { SidebarService } from '../../services';\nimport { BaseComponent } from '../base.component';\nimport { SidebarItemComponent } from '../sidebar-item/sidebar-item.component';\n\n@Component({\n selector: 'lib-sidebar',\n templateUrl: './sidebar.component.html',\n styleUrls: ['./sidebar.component.scss'],\n imports: [SidebarItemComponent, TranslatePipe],\n host: {\n '[class.active]': 'isActive',\n '[class.expanded]': '!isCollapsed',\n },\n})\nexport class SidebarComponent extends BaseComponent implements AfterViewInit, OnInit {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Host listeners\n @HostListener('body:mousedown', ['$event'])\n protected onBodyMouseDown(event: MouseEvent): void {\n if (this.isActive && event.target) {\n const target: HTMLElement = <HTMLElement>event.target;\n this.wasClickedOutside = (event.button === 0 && !target.closest('lib-sidebar')) ?? false;\n }\n }\n\n @HostListener('body:mouseup', ['$event'])\n protected onBodyMouseUp(_event: MouseEvent): void {\n if (this.wasClickedOutside) {\n this.wasClickedOutside = false;\n this.deactivate();\n }\n }\n\n @HostListener('document:keydown.escape', ['$event'])\n protected onDocumentKeyDown(event: Event): void {\n event = event || window.event;\n\n // keyCode is the fallback for engines predating KeyboardEvent.key.\n const isEscapeKey: boolean =\n 'key' in event ? event.key === 'Escape' || event.key === 'Esc' : (<KeyboardEvent>event).keyCode === 27;\n\n if (isEscapeKey) {\n this.deactivate();\n }\n }\n\n @HostListener('window:resize', ['$event'])\n protected onResize(_event: Event): void {\n this.updateShouldActivate();\n }\n //#endregion\n\n //#region Variables\n private sidebarConfigs: SidebarConfigs = inject(SIDEBAR_CONFIGS);\n\n protected configErrorText: string = this.sidebarConfigs.errorText;\n protected configLoadingText: string = this.sidebarConfigs.loadingText;\n protected readonly hasFailed: WritableSignal<boolean> = signal(false);\n protected readonly menus: WritableSignal<SidebarMenu[]> = signal<SidebarMenu[]>([]);\n protected readonly regions: WritableSignal<SidebarRegion[]> = signal<SidebarRegion[]>([]);\n\n private sidebarService: SidebarService = inject(SidebarService);\n private wasClickedOutside = false;\n //#endregion\n\n //#region Properties\n protected get isActive(): boolean {\n return this.sidebarService.isActive;\n }\n\n protected get isCollapsed(): boolean {\n return this.sidebarService.isCollapsed;\n }\n\n protected readonly isLoading: Signal<boolean> = computed(() => this.menus().length === 0);\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super();\n }\n\n public ngAfterViewInit(): void {\n this.updateShouldActivate();\n }\n\n public ngOnInit(): void {\n merge(this.sidebarService.menuUrlSelected, this.sidebarService.menuExternalUrlSelected)\n .pipe(takeUntil(this.destroy$))\n .subscribe((_menu: SidebarMenu) => this.deactivate());\n\n this.sidebarService\n .loadRoot()\n .pipe(\n take(1),\n switchMap((menus: SidebarMenu[]) => this.loadAreaChildren(menus)),\n )\n .subscribe({\n next: (menus: SidebarMenu[]) => {\n this.menus.set(menus);\n this.regions.set(this.groupIntoRegions(menus));\n },\n error: () => this.hasFailed.set(true),\n });\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public collapse(): void {\n this.sidebarService.isCollapsed = !this.sidebarService.isCollapsed;\n this.sidebarService.isActive = false;\n\n if (this.sidebarService.isCollapsed) {\n this.sidebarService.deselectAll();\n }\n\n this.updateShouldActivate();\n }\n //#endregion\n\n //#region Private methods\n protected trackByFn(_index: number, item: SidebarMenu): number {\n return item.id;\n }\n\n protected trackByRegion(_index: number, region: SidebarRegion): string {\n return region.name ?? '';\n }\n\n /** Whether this top-level menu stands for an area rather than a destination of its own. */\n private isArea(menu: SidebarMenu): boolean {\n return menu.childCount > 0 && (menu.url?.length ?? 0) === 0;\n }\n\n // Group top-level menus into regions by their optional `region` label, preserving\n // first-appearance order. Ungrouped menus fall into a single header-less region.\n private groupByRegionLabel(menus: SidebarMenu[]): SidebarRegion[] {\n const regions: SidebarRegion[] = [];\n const byName: Map<string | undefined, SidebarRegion> = new Map<string | undefined, SidebarRegion>();\n\n menus.forEach((menu: SidebarMenu) => {\n let region: SidebarRegion | undefined = byName.get(menu.region);\n if (!region) {\n region = { name: menu.region, items: [] };\n byName.set(menu.region, region);\n regions.push(region);\n }\n region.items.push(menu);\n });\n\n return regions;\n }\n\n // Derive the regions from the tree: an area menu becomes a header and lends the group its own\n // children, so the area carries one translated label and one order instead of a string repeated\n // across every item. Anything that is not an area keeps falling into a header-less region, which\n // is created where the first such item appears so the original ordering still holds.\n private groupByRootMenus(menus: SidebarMenu[]): SidebarRegion[] {\n const regions: SidebarRegion[] = [];\n let ungrouped: SidebarRegion | undefined;\n\n menus.forEach((menu: SidebarMenu) => {\n if (this.isArea(menu)) {\n regions.push({ name: menu.label, items: menu.children });\n return;\n }\n\n if (!ungrouped) {\n ungrouped = { name: undefined, items: [] };\n regions.push(ungrouped);\n }\n\n ungrouped.items.push(menu);\n });\n\n return regions;\n }\n\n private groupIntoRegions(menus: SidebarMenu[]): SidebarRegion[] {\n return this.sidebarConfigs.shouldDeriveAreasFromRootMenus\n ? this.groupByRootMenus(menus)\n : this.groupByRegionLabel(menus);\n }\n\n /**\n * Fetches the children of every area up front, because they are rendered flat rather than\n * behind a click, so the lazy load a collapsible parent relies on would never be triggered.\n */\n private loadAreaChildren(menus: SidebarMenu[]): Observable<SidebarMenu[]> {\n if (!this.sidebarConfigs.shouldDeriveAreasFromRootMenus) {\n return of(menus);\n }\n\n const areas: SidebarMenu[] = menus.filter((menu: SidebarMenu) => this.isArea(menu));\n\n // forkJoin never emits on an empty array, so a menu with no areas has to short-circuit.\n if (areas.length === 0) {\n return of(menus);\n }\n\n return forkJoin(areas.map((area: SidebarMenu) => this.sidebarService.loadChildrenFor(area))).pipe(map(() => menus));\n }\n\n private deactivate(): void {\n if (this.sidebarService.isActive) {\n this.sidebarService.isActive = false;\n this.sidebarService.deselectAll();\n }\n }\n\n private updateShouldActivate(): void {\n this.sidebarService.shouldActivate =\n (window.innerWidth <= 767 && !this.sidebarService.isCollapsed) || this.sidebarService.isCollapsed;\n }\n //#endregion\n}\n","<div class=\"sidebar-toolbar\">\n <button type=\"button\" class=\"sidebar-toggle\" (click)=\"collapse()\" aria-label=\"Toggle navigation\">\n <i class=\"fa-solid fa-angle-left\" [class.is-collapsed]=\"isCollapsed\"></i>\n </button>\n</div>\n\n<nav>\n @if (!isLoading()) {\n <ul>\n @for (region of regions(); track trackByRegion($index, region)) {\n @if (region.name) {\n <li class=\"sidebar-region-header\">\n <span>{{ region.name | translate }}</span>\n </li>\n }\n @for (menu of region.items; track trackByFn($index, menu)) {\n <lib-sidebar-item [menu]=\"menu\"> </lib-sidebar-item>\n }\n }\n @if (hasFailed()) {\n <div class=\"error\">\n <div>\n <i class=\"fa-solid fa-fw fa-triangle-exclamation\"></i>\n <span>{{ configErrorText }}</span>\n </div>\n </div>\n }\n </ul>\n } @else {\n <div class=\"loading\">\n <div>\n <svg class=\"animate-spin text-white\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path\n class=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n <span>{{ configLoadingText }}</span>\n </div>\n </div>\n }\n</nav>\n\n<div class=\"sidebar-footer\"><ng-content></ng-content></div>\n","import { FlexibleConnectedPositionStrategy, Overlay, OverlayPositionBuilder, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { NgClass } from '@angular/common';\nimport {\n Component,\n ElementRef,\n HostListener,\n inject,\n input,\n InputSignal,\n model,\n ModelSignal,\n OnDestroy,\n output,\n OutputEmitterRef,\n Signal,\n signal,\n TemplateRef,\n viewChild,\n ViewContainerRef,\n WritableSignal,\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { IRibbonButtonOption } from '../../models/ribbon-button-option';\n\n@Component({\n selector: 'lib-ribbon-button',\n templateUrl: './ribbon-button.component.html',\n host: {\n '[class.dropdown]': 'options().length > 0',\n '[class.show]': 'showDropdown()',\n },\n styleUrls: ['./ribbon-button.component.scss'],\n imports: [NgClass, TranslatePipe],\n})\nexport class RibbonButtonComponent implements OnDestroy {\n //#region ViewChilds, Inputs, Outputs\n private readonly buttonContainer: Signal<ElementRef<HTMLElement> | undefined> =\n viewChild<ElementRef<HTMLElement>>('buttonContainer');\n private readonly optionsDropdown: Signal<TemplateRef<unknown> | undefined> =\n viewChild<TemplateRef<unknown>>('optionsDropdown');\n\n public readonly color: InputSignal<string> = input('text-primary-500');\n public readonly defaultOption: InputSignal<number> = input(-1);\n public readonly disabled: InputSignal<boolean> = input(false);\n public readonly icon: InputSignal<string | undefined> = input<string>();\n public readonly iconSize: InputSignal<'small' | 'large'> = input<'small' | 'large'>('large');\n public readonly label: InputSignal<string> = input('');\n public readonly loading: ModelSignal<boolean> = model(false);\n public readonly options: InputSignal<IRibbonButtonOption[]> = input<IRibbonButtonOption[]>([]);\n public readonly tooltip: InputSignal<string> = input('');\n\n public readonly action: OutputEmitterRef<string | undefined> = output<string | undefined>();\n //#endregion\n\n //#region Host listeners\n @HostListener('body:mousedown', ['$event'])\n protected bodyMouseDown(event: MouseEvent): void {\n if (this.showDropdown()) {\n const target: HTMLElement = <HTMLElement>event.target;\n\n const button: HTMLElement | null | undefined = target.closest('.button-container')?.parentElement;\n\n this.clickedOutside =\n event.button === 0 &&\n !target.closest('.options-dropdown') &&\n (!button || (!button?.classList.contains('dropdown') && !button?.classList.contains('open')));\n }\n }\n\n @HostListener('body:mouseup', ['$event'])\n protected bodyMouseUp(event: MouseEvent): void {\n if (this.showDropdown() && this.clickedOutside) {\n this.closeDropdown();\n }\n }\n\n @HostListener('document:keydown.escape', ['$event'])\n protected documentKeyDown(event: Event): void {\n event = event || window.event;\n\n // keyCode is the fallback for engines predating KeyboardEvent.key.\n const isEscape: boolean =\n 'key' in event ? event.key === 'Escape' || event.key === 'Esc' : (<KeyboardEvent>event).keyCode === 27;\n\n if (this.showDropdown() && isEscape) {\n this.closeDropdown();\n }\n }\n //#endregion\n\n //#region Variables\n protected readonly showDropdown: WritableSignal<boolean> = signal(false);\n protected readonly status: WritableSignal<null | 'failure' | 'warning' | 'success'> = signal(null);\n\n private clickedOutside = false;\n private overlay: Overlay = inject(Overlay);\n private overlayRef?: OverlayRef;\n private positionBuilder: OverlayPositionBuilder = inject(OverlayPositionBuilder);\n private viewContainerRef: ViewContainerRef = inject(ViewContainerRef);\n //#endregion\n\n //#region Properties\n protected get buttonIcon(): string {\n switch (this.status()) {\n case 'success':\n return 'fa-check';\n case 'failure':\n return 'fa-times';\n case 'warning':\n return 'fa-exclamation';\n default:\n return this.icon() ?? '';\n }\n }\n\n protected get isButtonDisabled(): boolean {\n return (\n this.disabled() ||\n this.loading() ||\n (this.options().length > 0 && !this.options().some((option: IRibbonButtonOption) => this.isOptionVisible(option)))\n );\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n public ngOnDestroy(): void {\n this.closeDropdown();\n }\n //#endregion\n\n //#region Event handlers\n protected onButtonClicked(): void {\n if (this.options().length > 0) {\n if (this.defaultOption() >= 0 && this.defaultOption() < this.options().length) {\n this.closeDropdown();\n this.action.emit(this.options()[this.defaultOption()].id);\n } else {\n this.onShowHideDropdown();\n }\n } else {\n this.action.emit(undefined);\n }\n }\n\n protected onOptionClicked(option: IRibbonButtonOption) {\n this.closeDropdown();\n this.action.emit(option.id);\n }\n\n protected onShowHideDropdown(): void {\n if (this.showDropdown()) {\n this.closeDropdown();\n } else {\n this.openDropdown();\n }\n }\n //#endregion\n\n //#region Public methods\n public finishLoading(status: 'failure' | 'warning' | 'success'): void {\n this.loading.set(false);\n this.status.set(status);\n\n setTimeout(() => {\n this.status.set(null);\n }, 1000);\n }\n\n public startLoading(): void {\n this.loading.set(true);\n }\n\n protected isOptionDisabled(option: IRibbonButtonOption): boolean {\n return option.isDisabled || ((option.allowedActions?.length ?? 0) > 0 && option.isAccessAllowed === undefined);\n }\n\n protected isOptionVisible(option: IRibbonButtonOption): boolean {\n return (\n (option.isVisible ?? true) &&\n (option.allowedActions === undefined ||\n option.allowedActions.length === 0 ||\n option.isAccessAllowed === true ||\n (option.isAccessAllowed == undefined && option.allowedActions?.length > 0))\n );\n }\n //#endregion\n\n //#region Private methods\n private closeDropdown(): void {\n this.showDropdown.set(false);\n\n this.overlayRef?.detach();\n this.overlayRef?.dispose();\n this.overlayRef = undefined;\n }\n\n /**\n * Opens the options list in an overlay attached to the document rather than inside this button.\n *\n * The list is absolutely positioned and used to live in the button's own subtree, which works\n * only while nothing between it and the page clips. `lib-data-grid` does: it is\n * `overflow: hidden`, its buttons bar is its first child, and a child list's grid is only a few\n * rows tall -- so the export button's options opened downwards into the grid and had their lower\n * part cut off. Measured in Storybook at 129px of list against 65px of room, 64px lost.\n *\n * Nothing smaller fixes it. The grid's clipping is load-bearing -- the rows scroll inside it and\n * its corners are rounded -- and no z-index lifts content out of an ancestor's overflow. Leaving\n * the subtree is the fix, and it is what `lib-catalog-select` already does for its own dropdown.\n *\n * `reposition()` rather than `close()`: the button can move while the list is open, and the list\n * should follow it rather than disappear.\n */\n private openDropdown(): void {\n if (!this.optionsDropdown()) {\n return;\n }\n\n this.closeDropdown();\n\n const positionStrategy: FlexibleConnectedPositionStrategy = this.positionBuilder\n .flexibleConnectedTo(this.buttonContainer()!)\n .withPositions([\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top' },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom' },\n ]);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n hasBackdrop: false,\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n });\n\n this.overlayRef.attach(new TemplatePortal(this.optionsDropdown()!, this.viewContainerRef));\n this.showDropdown.set(true);\n }\n //#endregion\n}\n","<div #buttonContainer class=\"button-container\" [attr.title]=\"tooltip() || null\">\n <a\n class=\"button\"\n role=\"button\"\n [attr.tabindex]=\"isButtonDisabled ? -1 : 0\"\n [attr.aria-disabled]=\"isButtonDisabled\"\n [class.disabled]=\"isButtonDisabled\"\n [class.success]=\"status() === 'success'\"\n [class.warning]=\"status() === 'warning'\"\n [class.failure]=\"status() === 'failure'\"\n [class.small]=\"iconSize() === 'small'\"\n (click)=\"onButtonClicked()\"\n (keydown.enter)=\"onButtonClicked()\"\n (keydown.space)=\"onButtonClicked(); $event.preventDefault()\"\n >\n <span class=\"icon\" [class.loading]=\"loading()\">\n <i class=\"fas fa-fw\" [ngClass]=\"[buttonIcon, color()]\"></i>\n\n <svg [ngClass]=\"[color()]\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path\n class=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n </span>\n\n <span class=\"label\" [class.text-white]=\"status() !== null\">\n {{ label() | translate }}\n </span>\n </a>\n\n @if (options().length > 0) {\n <a\n class=\"button-dropdown\"\n role=\"button\"\n [attr.tabindex]=\"isButtonDisabled ? -1 : 0\"\n [attr.aria-disabled]=\"isButtonDisabled\"\n aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"showDropdown()\"\n [class.disabled]=\"isButtonDisabled\"\n [class.success]=\"status() === 'success'\"\n [class.warning]=\"status() === 'warning'\"\n [class.failure]=\"status() === 'failure'\"\n [class.small]=\"iconSize() === 'small'\"\n (click)=\"onShowHideDropdown()\"\n (keydown.enter)=\"onShowHideDropdown()\"\n (keydown.space)=\"onShowHideDropdown(); $event.preventDefault()\"\n >\n <i class=\"fas fa-chevron-down\" [ngClass]=\"[color()]\"></i>\n </a>\n }\n</div>\n\n<!-- Rendered into a CDK overlay rather than here, so the list is not cut off by an ancestor that\n clips -- lib-data-grid does, and its buttons bar sits at the top of it. The `open` class is\n what the styles key on now that the list is no longer inside this component's `.show` host. -->\n<ng-template #optionsDropdown>\n <ul class=\"options-dropdown open\" role=\"menu\">\n @for (option of options(); track option; let i = $index) {\n <li\n role=\"menuitem\"\n [attr.tabindex]=\"isOptionDisabled(option) || !isOptionVisible(option) ? -1 : 0\"\n [attr.aria-disabled]=\"isOptionDisabled(option)\"\n [class.default-option]=\"i === defaultOption()\"\n [class.disabled]=\"isOptionDisabled(option)\"\n [class.hidden]=\"!isOptionVisible(option)\"\n (click)=\"onOptionClicked(option)\"\n (keydown.enter)=\"onOptionClicked(option)\"\n (keydown.space)=\"onOptionClicked(option); $event.preventDefault()\"\n >\n @if (!!option.icon) {\n <i class=\"fas fa-fw\" [ngClass]=\"[option.icon, color()]\"></i>\n }\n {{ option.label | translate }}\n </li>\n }\n </ul>\n</ng-template>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n@Component({\n selector: 'lib-ribbon',\n templateUrl: './ribbon.component.html',\n styleUrls: ['./ribbon.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RibbonComponent {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n //#region Host listeners\n //#endregion\n //#region Variables\n //#endregion\n //#region Properties\n //#endregion\n //#region Constructor and Angular life cycle methods\n //#endregion\n //#region Event handlers\n //#endregion\n //#region Public methods\n //#endregion\n //#region Private methods\n //#endregion\n}\n","<div>\n <ng-content></ng-content>\n</div>\n\n<ng-content select=\"[right]\"></ng-content>\n","import { Component, computed, contentChildren, Input, Signal } from '@angular/core';\n\nimport { RibbonGroupChild } from '../../models/ribbon-group-child';\n\n@Component({\n selector: 'lib-ribbon-group',\n templateUrl: './ribbon-group.component.html',\n styleUrls: ['./ribbon-group.component.scss'],\n host: { '[class.hidden]': '!hasChildren()' },\n})\nexport class RibbonGroupComponent {\n //#region ViewChilds, Inputs, Outputs\n // A signal query, so a child arriving or leaving re-runs `hasChildren` on its own.\n public readonly children: Signal<readonly RibbonGroupChild[]> = contentChildren(RibbonGroupChild, {\n descendants: true,\n });\n\n @Input() public label = '';\n //#endregion\n\n //#region Host listeners\n //#endregion\n\n //#region Variables\n //#endregion\n\n //#region Properties\n protected readonly hasChildren: Signal<boolean> = computed(() =>\n this.children().some((child: RibbonGroupChild) => child.isVisible()),\n );\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n //#endregion\n\n //#region Private methods\n //#endregion\n}\n","<div class=\"content\">\n <ng-content></ng-content>\n</div>\n\n<div class=\"label\">\n <span>{{ label }}</span>\n</div>\n","import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Observable } from 'rxjs';\n\n@Pipe({\n name: 'enumTranslate',\n})\nexport class EnumTranslatePipe implements PipeTransform {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n private translate: TranslateService = inject(TranslateService);\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public transform(enumType: any): Array<{ value: any; display: Observable<any> }> {\n return Object.keys(enumType)\n .filter((key) => isNaN(Number(key)))\n .map((key) => ({\n value: enumType[key],\n display: this.translate.get(key),\n }));\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'replaceMany',\n})\nexport class ReplaceManyPipe implements PipeTransform {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public transform(message: string, replaceArgs?: { [id: string]: string | null | undefined }): string {\n if (replaceArgs) {\n for (const [key, value] of Object.entries(replaceArgs)) {\n message = message.replace(key, value ?? '');\n }\n }\n return message;\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'replace',\n})\nexport class ReplacePipe implements PipeTransform {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public transform(message: string, searchValue: string, replaceValue?: string | null): string {\n return message.replace(searchValue, replaceValue ?? '');\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}\n","import { NgModule } from '@angular/core';\nimport * as c from './components';\nimport * as d from './directives';\nimport * as p from './pipes';\n\n@NgModule({\n declarations: [],\n imports: [\n c.CatalogSelectComponent,\n c.DataGridComponent,\n c.DataGridRowComponent,\n c.FormInputComponent,\n c.FormInputGroupComponent,\n c.FormGroupComponent,\n c.GroupAccordionComponent,\n c.GroupContainerComponent,\n c.GroupScrollSpyComponent,\n c.SidebarComponent,\n c.ModalComponent,\n c.MultiEditorComponent,\n c.MultiSelectComponent,\n c.MultiSelectResultGridComponent,\n c.RibbonComponent,\n c.RibbonButtonComponent,\n c.RibbonGroupComponent,\n\n d.ScrollSpyDirective,\n\n p.EnumTranslatePipe,\n p.ReplacePipe,\n p.ReplaceManyPipe,\n ],\n exports: [\n c.CatalogSelectComponent,\n c.DataGridComponent,\n c.DataGridRowComponent,\n c.FormInputComponent,\n c.FormInputGroupComponent,\n c.FormGroupComponent,\n c.GroupAccordionComponent,\n c.GroupContainerComponent,\n c.GroupScrollSpyComponent,\n c.SidebarComponent,\n c.ModalComponent,\n c.MultiEditorComponent,\n c.MultiSelectComponent,\n c.MultiSelectResultGridComponent,\n c.RibbonComponent,\n c.RibbonButtonComponent,\n c.RibbonGroupComponent,\n\n d.ScrollSpyDirective,\n\n p.EnumTranslatePipe,\n p.ReplacePipe,\n p.ReplaceManyPipe,\n ],\n})\n/**\n * @deprecated Use standalone component imports instead of LibraryModule.\n * Import individual components directly in your component's `imports` array.\n */\nexport class LibraryModule {}\n","import { Injectable } from '@angular/core';\nimport { DataGridConfigs } from '../../models/configs/data-grid-configs';\nimport { GridConfigsProvider } from './grid-configs.provider';\n\n@Injectable()\nexport class DataGridConfigsProvider extends GridConfigsProvider<DataGridConfigs> {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super();\n\n this._configs = {\n ...this._configs,\n multiSelect: false,\n multiSelectSize: 'minmax(1.5rem, min-content)',\n } as DataGridConfigs;\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n //#endregion\n\n //#region Private methods\n //#endregion\n}\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nexport class DateValidators {\n //#region Public methods\n public static greaterThanControl(controlName: string): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const compareControl: AbstractControl | null | undefined = control.parent?.get(controlName);\n if (!!control.value && !!compareControl?.value && new Date(control.value) <= new Date(compareControl?.value)) {\n return { greaterThanControl: true };\n }\n return null;\n };\n }\n\n public static greaterThanOrEqualControl(controlName: string): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const compareControl: AbstractControl | null | undefined = control.parent?.get(controlName);\n if (!!control.value && !!compareControl?.value && new Date(control.value) < new Date(compareControl?.value)) {\n return { greaterThanOrEqualControl: true };\n }\n return null;\n };\n }\n\n public static greaterThanOrEqualToday(control: AbstractControl): ValidationErrors | null {\n const today: Date = new Date();\n if (!!control.value && new Date(control.value) < today) {\n return { greaterThanOrEqualToday: true };\n }\n return null;\n }\n\n public static greaterThanToday(control: AbstractControl): ValidationErrors | null {\n const today: Date = new Date();\n if (!!control.value && new Date(control.value) <= today) {\n return { greaterThanToday: true };\n }\n return null;\n }\n\n public static lessThanControl(controlName: string): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const compareControl: AbstractControl | null | undefined = control.parent?.get(controlName);\n if (!!control.value && !!compareControl?.value && new Date(control.value) >= new Date(compareControl?.value)) {\n return { lessThanControl: true };\n }\n return null;\n };\n }\n\n public static lessThanOrEqualControl(controlName: string): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const compareControl: AbstractControl | null | undefined = control.parent?.get(controlName);\n if (!!control.value && !!compareControl?.value && new Date(control.value) > new Date(compareControl?.value)) {\n return { lessThanOrEqualControl: true };\n }\n return null;\n };\n }\n\n public static lessThanOrEqualToday(control: AbstractControl): ValidationErrors | null {\n const today: Date = new Date();\n if (!!control.value && new Date(control.value) > today) {\n return { lessThanOrEqualToday: true };\n }\n return null;\n }\n\n public static lessThanToday(control: AbstractControl): ValidationErrors | null {\n const today: Date = new Date();\n if (!!control.value && new Date(control.value) >= today) {\n return { lessThanToday: true };\n }\n return null;\n }\n\n public static maxDate(maxDate: Date): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n if (!!control.value && new Date(control.value) > maxDate) {\n return { maxDate: true };\n }\n return null;\n };\n }\n\n public static minDate(minDate: Date): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n if (!!control.value && new Date(control.value) < minDate) {\n return { minDate: true };\n }\n return null;\n };\n }\n //#endregion\n}\n"],"mappings":"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"}
|