@meshmakers/shared-ui 3.5.100 → 3.5.130
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meshmakers-shared-ui.mjs","sources":["../../../../projects/meshmakers/shared-ui/src/lib/svg-icons.ts","../../../../projects/meshmakers/shared-ui/src/lib/models/confirmation.ts","../../../../projects/meshmakers/shared-ui/src/lib/upload-file-dialog/upload-file-dialog.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/upload-file-dialog/upload-file-dialog.component.html","../../../../projects/meshmakers/shared-ui/src/lib/services/file-upload.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/confirmation-window/confirmation-window.messages.ts","../../../../projects/meshmakers/shared-ui/src/lib/confirmation-window/confirmation-window.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/confirmation-window/confirmation-window.component.html","../../../../projects/meshmakers/shared-ui/src/lib/danger-confirmation/danger-confirmation.model.ts","../../../../projects/meshmakers/shared-ui/src/lib/danger-confirmation/danger-confirmation-window.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/services/confirmation.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/models/inputDialogResult.ts","../../../../projects/meshmakers/shared-ui/src/lib/input-dialog/input-dialog.messages.ts","../../../../projects/meshmakers/shared-ui/src/lib/input-dialog/input-dialog.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/input-dialog/input-dialog.component.html","../../../../projects/meshmakers/shared-ui/src/lib/services/input.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/progress-window/progress-window.messages.ts","../../../../projects/meshmakers/shared-ui/src/lib/progress-window/progress-window.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/progress-window/progress-window.component.html","../../../../projects/meshmakers/shared-ui/src/lib/progress-window/progress-window.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/message-details-dialog/message-details-dialog.messages.ts","../../../../projects/meshmakers/shared-ui/src/lib/message-details-dialog/message-details-dialog.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/services/window-state.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/message-details-dialog/message-details-dialog.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/services/notification-display.messages.ts","../../../../projects/meshmakers/shared-ui/src/lib/services/notification-display.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/services/message-listener.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/list-view/list-view-filters.directive.ts","../../../../projects/meshmakers/shared-ui/src/lib/list-view/list-view.model.ts","../../../../projects/meshmakers/shared-ui/src/lib/pipes/pascal-case.pipe.ts","../../../../projects/meshmakers/shared-ui/src/lib/data-sources/data-source-base.ts","../../../../projects/meshmakers/shared-ui/src/lib/services/list-state.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/directives/mm-list-view-data-binding.directive.ts","../../../../projects/meshmakers/shared-ui/src/lib/actions/action.model.ts","../../../../projects/meshmakers/shared-ui/src/lib/actions/action-button.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/list-view/list-view-row-actions.ts","../../../../projects/meshmakers/shared-ui/src/lib/pipes/bytes-to-size.pipe.ts","../../../../projects/meshmakers/shared-ui/src/lib/cron-builder/services/cron-humanizer.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/octobot/octobot.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/empty-state/empty-state.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/list-view/list-view.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/list-view/list-view.component.html","../../../../projects/meshmakers/shared-ui/src/lib/tree/tree.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/tree/tree.component.html","../../../../projects/meshmakers/shared-ui/src/lib/guards/unsaved-changes.interface.ts","../../../../projects/meshmakers/shared-ui/src/lib/guards/unsaved-changes.directive.ts","../../../../projects/meshmakers/shared-ui/src/lib/base-form/base-form.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/base-form/base-form.component.html","../../../../projects/meshmakers/shared-ui/src/lib/base-tree-detail/base-tree-detail.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/data-sources/data-source-typed.ts","../../../../projects/meshmakers/shared-ui/src/lib/data-sources/hierarchy-data-source.ts","../../../../projects/meshmakers/shared-ui/src/lib/data-sources/hierarchy-data-source-base.ts","../../../../projects/meshmakers/shared-ui/src/lib/models/fetchResult.ts","../../../../projects/meshmakers/shared-ui/src/lib/models/progressValue.ts","../../../../projects/meshmakers/shared-ui/src/lib/models/importStrategyDto.ts","../../../../projects/meshmakers/shared-ui/src/lib/entity-select-dialog/entity-select-dialog-data-source.ts","../../../../projects/meshmakers/shared-ui/src/lib/entity-select-dialog/entity-select-dialog.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/entity-select-dialog/entity-select-dialog.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/entity-select-input/entity-select-input.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/guards/unsaved-changes.guard.ts","../../../../projects/meshmakers/shared-ui/src/lib/save-as-dialog/save-as-dialog.messages.ts","../../../../projects/meshmakers/shared-ui/src/lib/save-as-dialog/save-as-dialog.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/save-as-dialog/save-as-dialog.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/time-range-picker/time-range-picker.models.ts","../../../../projects/meshmakers/shared-ui/src/lib/time-range-picker/time-range-picker.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/time-range-picker/time-range-picker.component.html","../../../../projects/meshmakers/shared-ui/src/lib/cron-builder/cron-builder.models.ts","../../../../projects/meshmakers/shared-ui/src/lib/cron-builder/services/cron-parser.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/cron-builder/cron-builder.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/cron-builder/cron-builder.component.html","../../../../projects/meshmakers/shared-ui/src/lib/copyable-text/copyable-text.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/copyable-text/copyable-text.component.html","../../../../projects/meshmakers/shared-ui/src/lib/import-strategy-dialog/import-strategy-dialog.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/import-strategy-dialog/import-strategy-dialog.component.html","../../../../projects/meshmakers/shared-ui/src/lib/import-strategy-dialog/import-strategy-dialog.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/actions/row-actions.messages.ts","../../../../projects/meshmakers/shared-ui/src/lib/actions/row-actions.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/i18n/mm-translate.ts","../../../../projects/meshmakers/shared-ui/src/lib/i18n/mm-translate.pipe.ts","../../../../projects/meshmakers/shared-ui/src/lib/i18n/live-messages.ts","../../../../projects/meshmakers/shared-ui/src/public-api.ts","../../../../projects/meshmakers/shared-ui/src/meshmakers-shared-ui.ts"],"sourcesContent":["export const upload = {\n name: 'upload',\n content: '<path d=\"M440-200h80v-167l64 64 56-57-160-160-160 160 57 56 63-63v167ZM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h320l240 240v480q0 33-23.5 56.5T720-80H240Zm280-520v-200H240v640h480v-440H520ZM240-800v200-200 640-640Z\"/>',\n viewBox: '0 -960 960 960'\n}\n\nexport const deleteIcon = {\n name: 'delete',\n content: '<path d=\"M280-120q-33 0-56.5-23.5T200-200v-520h-40v-80h200v-40h240v40h200v80h-40v520q0 33-23.5 56.5T680-120H280Zm400-600H280v520h400v-520ZM360-280h80v-360h-80v360Zm160 0h80v-360h-80v360ZM280-720v520-520Z\"/>',\n viewBox: '0 -960 960 960'\n}\n","import type { ConfirmationWindowMessages } from '../confirmation-window/confirmation-window.messages';\n\nexport enum ButtonTypes {\n Ok,\n Cancel,\n Yes,\n No\n}\n\nexport enum DialogType {\n YesNo = 0,\n YesNoCancel = 1,\n OkCancel = 2,\n Ok = 3\n}\n\nexport interface ConfirmationButtonLabels {\n yes?: string;\n no?: string;\n ok?: string;\n cancel?: string;\n}\n\nexport interface ConfirmationWindowData {\n title: string;\n message: string;\n dialogType: DialogType;\n buttonLabels?: ConfirmationButtonLabels;\n messages?: Partial<ConfirmationWindowMessages>;\n /** Destructive confirmation: the confirming (right-most) button is styled as danger (`themeColor=\"error\"`). */\n danger?: boolean;\n}\n\nexport class ConfirmationWindowResult {\n result: ButtonTypes;\n\n constructor(result: ButtonTypes) {\n this.result = result;\n }\n}\n\nexport interface FileUploadData{\n title: string;\n message: string;\n mimeTypes: string;\n fileExtensions: string | null;\n}\n\nexport class FileUploadResult {\n public selectedFile: File | null;\n\n constructor(selectedFile: File) {\n this.selectedFile = selectedFile;\n }\n}\n","import { Component, ElementRef, Input, signal, ViewChild, inject, ChangeDetectionStrategy } from '@angular/core';\nimport {NotificationService} from '@progress/kendo-angular-notification';\nimport {ButtonComponent} from '@progress/kendo-angular-buttons';\nimport {\n DialogActionsComponent,\n DialogContentBase,\n DialogRef,\n} from '@progress/kendo-angular-dialog';\nimport {NgIf} from '@angular/common';\nimport {SVGIconComponent} from '@progress/kendo-angular-icons';\nimport {deleteIcon, upload} from '../svg-icons';\nimport {FileUploadResult} from '../models/confirmation';\n\n@Component({\n selector: 'mm-upload-file-dialog',\n imports: [\n ButtonComponent,\n DialogActionsComponent,\n NgIf,\n SVGIconComponent\n ],\n templateUrl: './upload-file-dialog.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './upload-file-dialog.component.css'\n})\nexport class UploadFileDialogComponent extends DialogContentBase {\n private readonly dialogRef: DialogRef;\n private readonly notificationService = inject(NotificationService);\n\n @Input() message = '';\n @Input() mimeTypes: string | null = null;\n @Input() fileExtensions: string | null = null;\n\n protected fileName = signal('');\n protected fileSize = signal(0);\n protected uploadProgress = signal(0);\n @ViewChild('fileInput') protected fileInput: ElementRef | undefined;\n protected selectedFile: File | null = null;\n protected uploadSuccess: boolean;\n protected uploadError: boolean;\n\n constructor() {\n const dialogRef = inject(DialogRef);\n\n super(dialogRef);\n this.dialogRef = dialogRef;\n\n this.uploadError = false;\n this.uploadSuccess = false;\n }\n\n\n // Handler for file input change\n onFileChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0] ?? null;\n this.uploadFile(file);\n }\n\n // Handler for the file drop\n onFileDrop(event: DragEvent): void {\n event.preventDefault();\n const file = event.dataTransfer?.files[0] as File | null;\n this.uploadFile(file);\n }\n\n // Prevent default dragover behavior\n onDragOver(event: DragEvent): void {\n event.preventDefault();\n }\n\n // Method to handle file upload\n uploadFile(file: File | null): void {\n const allowedMimeTypes = this.mimeTypes?.split(',').map((mimeType) => mimeType.trim()) ?? [];\n const allowedFileExtensions = this.fileExtensions?.split(',').map((mimeType) => mimeType.trim()) ?? [];\n if (!file) {\n return;\n }\n const extension = file.name.substring(file.name.lastIndexOf('.')).toLowerCase();\n\n if ((allowedFileExtensions.includes(extension) || allowedMimeTypes.includes(file.type)) ||\n allowedFileExtensions.length > 0 && allowedMimeTypes.length > 0) {\n this.selectedFile = file;\n this.fileSize.set(Math.round(file.size / 1024)); // Set file size in KB\n\n this.uploadSuccess = true;\n this.uploadError = false;\n this.fileName.set(file.name); // Set image name\n } else {\n this.uploadSuccess = false;\n this.uploadError = true;\n\n this.notificationService.show({\n content: 'File type not supported!',\n hideAfter: 600,\n position: {horizontal: 'right', vertical: 'top'},\n animation: {type: 'fade', duration: 400},\n type: {style: 'error', icon: true},\n });\n }\n }\n\n // Method to remove a file\n removeFile(): void {\n this.selectedFile = null;\n this.fileName.set('');\n this.fileSize.set(0);\n this.uploadSuccess = false;\n this.uploadError = false;\n this.uploadProgress.set(0);\n }\n\n onOk(): void {\n if (this.selectedFile) {\n this.dialogRef.close(new FileUploadResult(this.selectedFile));\n }\n }\n\n onCancel(): void {\n this.dialogRef.close(null);\n }\n\n protected get upload(): typeof upload { return upload; }\n protected get deleteIcon(): typeof deleteIcon { return deleteIcon; }\n}\n","<div\n class=\"file-upload-wrapper\"\n [class.success]=\"uploadSuccess\"\n [class.error]=\"uploadError\"\n (drop)=\"onFileDrop($event)\"\n (dragover)=\"onDragOver($event)\"\n>\n <input type=\"file\" accept=\"{{fileExtensions}}\" (change)=\"onFileChange($event)\" hidden #fileInput/>\n <div class=\"file-dropper\" (click)=\"fileInput.click()\">\n <kendo-svgicon [icon]=\"upload\" size=\"xxxlarge\"></kendo-svgicon>\n <p>{{ message }}</p>\n <div *ngIf=\"fileName()\">\n <div *ngIf=\"selectedFile\">\n <p>\n <span class=\"image-name\">{{ fileName() }}</span> ({{\n fileSize()\n }} KB)\n </p>\n <kendo-svgicon class=\"delete-icon\" [icon]=\"deleteIcon\" size=\"xlarge\"></kendo-svgicon>\n </div>\n </div>\n </div>\n</div>\n<kendo-dialog-actions>\n <button kendoButton (click)=\"onOk()\" [disabled]=\"!selectedFile\" themeColor=\"primary\">Upload</button>\n <button kendoButton (click)=\"onCancel()\">Cancel</button>\n</kendo-dialog-actions>\n\n\n\n","import { Injectable, inject } from '@angular/core';\nimport {DialogRef, DialogService} from '@progress/kendo-angular-dialog';\nimport {UploadFileDialogComponent} from '../upload-file-dialog/upload-file-dialog.component';\nimport {FileUploadResult} from '../models/confirmation';\n\n@Injectable()\nexport class FileUploadService {\n private readonly dialogService = inject(DialogService);\n\n public async showUploadDialog(title: string, message: string, mimeTypes: string | null = null, fileExtensions: string | null = null): Promise<File | null> {\n\n const dialogRef: DialogRef = this.dialogService.open({\n title,\n content: UploadFileDialogComponent\n });\n\n const component = dialogRef.content.instance as UploadFileDialogComponent;\n component.message = message;\n component.mimeTypes = mimeTypes;\n component.fileExtensions = fileExtensions;\n\n return new Promise<File | null>((resolve) => {\n dialogRef.result.subscribe((result) => {\n if (result instanceof FileUploadResult) {\n resolve(result.selectedFile as File);\n } else {\n resolve(null);\n }\n });\n });\n }\n}\n","export interface ConfirmationWindowMessages {\n ok: string;\n cancel: string;\n yes: string;\n no: string;\n}\n\nexport const DEFAULT_CONFIRMATION_WINDOW_MESSAGES: ConfirmationWindowMessages = {\n ok: 'OK',\n cancel: 'Cancel',\n yes: 'Yes',\n no: 'No',\n};\n","import { Component, ElementRef, Input, OnInit, inject, ChangeDetectionStrategy } from '@angular/core';\nimport {ButtonTypes, ConfirmationWindowData, ConfirmationWindowResult, DialogType} from '../models/confirmation';\nimport {DialogActionsComponent, DialogContentBase, DialogRef} from '@progress/kendo-angular-dialog';\nimport {NgIf} from '@angular/common';\nimport {ButtonComponent} from '@progress/kendo-angular-buttons';\nimport {\n ConfirmationWindowMessages,\n DEFAULT_CONFIRMATION_WINDOW_MESSAGES,\n} from './confirmation-window.messages';\n\n@Component({\n selector: 'mm-confirmation-window',\n imports: [\n DialogActionsComponent,\n NgIf,\n ButtonComponent\n ],\n templateUrl: './confirmation-window.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './confirmation-window.component.css'\n})\nexport class ConfirmationWindowComponent extends DialogContentBase implements OnInit {\n private readonly dialogRef: DialogRef;\n\n @Input() public data?: ConfirmationWindowData;\n\n protected button1Text: string;\n protected button1Result: ButtonTypes;\n protected button2Text: string | null;\n protected button2Result: ButtonTypes | null;\n protected button3Text: string | null;\n protected button3Result: ButtonTypes | null;\n\n constructor() {\n const dialogRef = inject(DialogRef);\n\n super(dialogRef);\n this.dialogRef = dialogRef;\n\n this.button2Text = null;\n this.button2Result = null;\n this.button3Text = null;\n this.button3Result = null;\n this.button1Text = DEFAULT_CONFIRMATION_WINDOW_MESSAGES.ok;\n this.button1Result = ButtonTypes.Ok;\n }\n\n ngOnInit(): void {\n\n if (this.data){\n // Precedence: buttonLabels > messages > English defaults.\n const messages: ConfirmationWindowMessages = {\n ...DEFAULT_CONFIRMATION_WINDOW_MESSAGES,\n ...(this.data.messages ?? {}),\n };\n const labels = this.data.buttonLabels;\n const okLabel = labels?.ok ?? messages.ok;\n const cancelLabel = labels?.cancel ?? messages.cancel;\n const yesLabel = labels?.yes ?? messages.yes;\n const noLabel = labels?.no ?? messages.no;\n\n if (this.data.dialogType === DialogType.OkCancel) {\n this.button1Text = okLabel;\n this.button1Result = ButtonTypes.Ok;\n this.button2Text = cancelLabel;\n this.button2Result = ButtonTypes.Cancel;\n } else if (this.data.dialogType === DialogType.YesNoCancel) {\n this.button1Text = yesLabel;\n this.button1Result = ButtonTypes.Yes;\n this.button2Text = noLabel;\n this.button2Result = ButtonTypes.No;\n this.button3Text = cancelLabel;\n this.button3Result = ButtonTypes.Cancel;\n } else if (this.data.dialogType === DialogType.Ok) {\n this.button1Text = okLabel;\n this.button1Result = ButtonTypes.Ok;\n } else {\n this.button1Text = yesLabel;\n this.button1Result = ButtonTypes.Yes;\n this.button2Text = noLabel;\n this.button2Result = ButtonTypes.No;\n }\n }\n }\n\n private readonly host = inject(ElementRef<HTMLElement>);\n\n /**\n * Destructive confirmations start with the focus on the dismissing button (AB#5578): Enter must\n * never confirm a delete. Backs up the service's `autoFocusedElement`.\n */\n override ngAfterViewInit(): void {\n super.ngAfterViewInit();\n if (this.data?.danger) {\n setTimeout(() => {\n const root = this.host.nativeElement.closest('.k-dialog') ?? this.host.nativeElement;\n (root.querySelector('[data-action=\"dismiss\"], [data-action=\"cancel\"]') as HTMLElement | null)?.focus();\n });\n }\n }\n\n onButton1(): void {\n this.dialogRef.close((new ConfirmationWindowResult(this.button1Result!)));\n }\n\n onButton2(): void {\n this.dialogRef.close((new ConfirmationWindowResult(this.button2Result!)));\n }\n\n onButton3(): void {\n this.dialogRef.close((new ConfirmationWindowResult(this.button3Result!)));\n }\n}\n","<div>{{data?.message}}</div>\n<!-- Button order (Studio action guideline §2.2, app convention): dismissing buttons first (left),\n the confirming / primary button last (right) - also for destructive confirmations. -->\n<kendo-dialog-actions>\n <button kendoButton (click)=\"onButton3()\" *ngIf=\"button3Text\" data-action=\"cancel\">{{button3Text}}</button>\n <button kendoButton (click)=\"onButton2()\" *ngIf=\"button2Text\" data-action=\"dismiss\">{{button2Text}}</button>\n <button kendoButton (click)=\"onButton1()\" [themeColor]=\"data?.danger ? 'error' : 'primary'\" [attr.data-danger]=\"data?.danger ? 'true' : null\" data-action=\"confirm\">{{button1Text}}</button>\n</kendo-dialog-actions>\n","import {InjectionToken} from '@angular/core';\n\n/**\n * Texts of the danger confirmation (AB#5578); apps translate them like the other shared-ui\n * dialogs (`Partial<…Messages>` per call or as `ConfirmationService.defaultDangerMessages`).\n */\nexport interface DangerConfirmationMessages {\n /** Dismissing button. Default: \"Cancel\" */\n cancel: string;\n /** Label of the type-to-confirm input; `{name}` = target name. Default: \"Type {name} to confirm\" */\n typeToConfirm: string;\n /** Environment notice; `{environment}` = environment label. Default: \"{environment} environment. Check the target before you confirm.\" */\n environmentNotice: string;\n /** Label in front of the target. Default: \"Target\" */\n target: string;\n}\n\nexport const DEFAULT_DANGER_CONFIRMATION_MESSAGES: DangerConfirmationMessages = {\n cancel: 'Cancel',\n typeToConfirm: 'Type {name} to confirm',\n environmentNotice: '{environment} environment. Check the target before you confirm.',\n target: 'Target',\n};\n\n/**\n * A destructive action's confirmation (Studio action guideline §2.4, AB#5578): the title names\n * the target, the body says what is lost, the confirming button names the verb + object and is\n * danger-styled on the right, Cancel on the left. Optionally the user has to type the target\n * name before the confirming button enables (production tenants).\n *\n * ```ts\n * const ok = await confirmation.showDangerConfirm({\n * title: 'Delete adapter Mesh Adapter?',\n * targetName: 'Mesh Adapter',\n * consequence: 'The adapter and its configuration are deleted. This cannot be undone.',\n * confirmText: 'Delete adapter',\n * });\n * ```\n */\nexport interface DangerConfirmationOptions {\n /** Dialog title naming the target (\"Delete adapter Mesh Adapter?\"). */\n title: string;\n /** Name of the affected item (\"Mesh Adapter\", \"3 adapters\"); shown emphasised and typed when required. */\n targetName: string;\n /** What is lost and whether it can be undone. */\n consequence: string;\n /** Confirming button: verb + object (\"Delete adapter\"), never \"Yes\" / \"OK\". */\n confirmText: string;\n /** Overrides `messages.cancel`. */\n cancelText?: string;\n /** The confirming button enables only once `targetName` is typed exactly (trimmed). */\n requireTypingName?: boolean;\n /** Environment label (\"PRODUCTION\", \"STAGING\") — shows the environment notice; omit in dev/test tenants. */\n environmentLabel?: string | null;\n messages?: Partial<DangerConfirmationMessages>;\n}\n\n/** Word typed when the target name is empty and no confirm text is set either. */\nexport const DANGER_CONFIRM_FALLBACK_WORD = 'DELETE';\n\n/**\n * The text the user has to type when `requireTypingName` is set: the target name, or — when the\n * target name is empty/whitespace — the confirm button text, else {@link DANGER_CONFIRM_FALLBACK_WORD}.\n * Never empty, so an empty input can never satisfy the type-to-confirm rule.\n */\nexport function dangerConfirmTypingToken(options: Pick<DangerConfirmationOptions, 'targetName' | 'confirmText'>): string {\n return (options.targetName ?? '').trim() || (options.confirmText ?? '').trim() || DANGER_CONFIRM_FALLBACK_WORD;\n}\n\n/**\n * True when `typed` matches the target name (trimmed, case-sensitive). An empty/whitespace target\n * name never matches — use {@link dangerConfirmTypingToken} to get a non-empty word to type.\n */\nexport function dangerConfirmNameMatches(typed: string | null | undefined, targetName: string): boolean {\n const expected = (targetName ?? '').trim();\n return expected.length > 0 && (typed ?? '').trim() === expected;\n}\n\n/**\n * App-wide environment defaults of {@link ConfirmationService.showDangerConfirm} (AB#5578), e.g.\n * \"production tenants type the target name\". Applied whenever a caller — typically a library\n * component — leaves `requireTypingName` / `environmentLabel` unset; explicit caller options win.\n */\nexport interface DangerConfirmEnvironment {\n /** Default of `requireTypingName`. */\n requireTypingName: boolean;\n /** Default of `environmentLabel` (\"PRODUCTION\", \"STAGING\"); `null`/omitted = no notice. */\n environmentLabel?: string | null;\n}\n\n/**\n * Optional hook providing the current {@link DangerConfirmEnvironment}; evaluated each time a\n * danger confirmation opens (so it may read signals). Absent = behaviour unchanged.\n *\n * ```ts\n * { provide: DANGER_CONFIRM_ENVIRONMENT, useFactory: () => {\n * const mode = inject(MyEnvironmentService);\n * return () => ({ requireTypingName: mode.isProduction(), environmentLabel: mode.label() });\n * } }\n * ```\n */\nexport const DANGER_CONFIRM_ENVIRONMENT = new InjectionToken<() => DangerConfirmEnvironment>('DANGER_CONFIRM_ENVIRONMENT');\n\n/** Applies the environment defaults to options that leave `requireTypingName` / `environmentLabel` unset. */\nexport function applyDangerConfirmEnvironment(\n options: DangerConfirmationOptions,\n environment: DangerConfirmEnvironment | null | undefined,\n): DangerConfirmationOptions {\n if (!environment) {\n return options;\n }\n return {\n ...options,\n requireTypingName: options.requireTypingName ?? environment.requireTypingName,\n environmentLabel: options.environmentLabel !== undefined ? options.environmentLabel : (environment.environmentLabel ?? null),\n };\n}\n","import {ChangeDetectionStrategy, Component, ElementRef, computed, inject, signal} from '@angular/core';\nimport {ButtonComponent} from '@progress/kendo-angular-buttons';\nimport {DialogActionsComponent, DialogContentBase, DialogRef} from '@progress/kendo-angular-dialog';\nimport {\n DEFAULT_DANGER_CONFIRMATION_MESSAGES,\n DangerConfirmationMessages,\n DangerConfirmationOptions,\n dangerConfirmNameMatches,\n dangerConfirmTypingToken,\n} from './danger-confirmation.model';\n\nlet nextId = 0;\n\n/** Selector of the element that gets the initial focus (never the destructive button). */\nexport function DANGER_CONFIRM_SAFE_FOCUS(requireTypingName: boolean): string {\n return requireTypingName ? '[data-type-to-confirm]' : '[data-action=\"cancel\"]';\n}\n\n/** Result of the danger confirmation dialog: `true` only for the confirming button. */\nexport class DangerConfirmationResult {\n constructor(public readonly confirmed: boolean) {}\n}\n\n/**\n * Content of {@link ConfirmationService.showDangerConfirm} (AB#5578): environment notice,\n * target, consequence, optional type-to-confirm input; Cancel left, danger confirm right.\n */\n@Component({\n selector: 'mm-danger-confirmation-window',\n standalone: true,\n imports: [DialogActionsComponent, ButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @let o = options();\n <div class=\"mm-danger-confirmation\" data-dialog=\"danger-confirm\">\n @if (o.environmentLabel) {\n <p class=\"mm-danger-confirmation__environment\" role=\"alert\" data-production-warning>\n {{ environmentNotice() }}\n </p>\n }\n <p class=\"mm-danger-confirmation__target\">\n <span class=\"mm-danger-confirmation__target-label\">{{ messages().target }}:</span>\n <strong data-target>{{ o.targetName }}</strong>\n </p>\n <p class=\"mm-danger-confirmation__consequence\" data-consequence>{{ o.consequence }}</p>\n @if (o.requireTypingName) {\n <label class=\"mm-danger-confirmation__type\" [for]=\"inputId\">{{ typeLabel() }}</label>\n <input\n class=\"k-textbox k-input k-input-md k-rounded-md mm-danger-confirmation__input\"\n [id]=\"inputId\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n data-type-to-confirm\n [value]=\"typed()\"\n (input)=\"typed.set($any($event.target).value)\"\n (keydown.enter)=\"canConfirm() && confirm()\"\n />\n }\n </div>\n <kendo-dialog-actions>\n <button kendoButton data-action=\"cancel\" (click)=\"cancel()\">{{ o.cancelText ?? messages().cancel }}</button>\n <button kendoButton themeColor=\"error\" data-action=\"confirm\" data-danger=\"true\"\n [disabled]=\"!canConfirm()\" (click)=\"confirm()\">{{ o.confirmText }}</button>\n </kendo-dialog-actions>\n `,\n styles: [`\n .mm-danger-confirmation p { margin: 0 0 var(--theme-space-3, 12px); }\n .mm-danger-confirmation__environment {\n padding: var(--theme-space-2, 8px) var(--theme-space-3, 12px);\n border-left: 3px solid var(--theme-status-error, #c0385f);\n border-radius: var(--theme-radius-sm, 4px);\n background: var(--theme-status-error-subtle, rgba(192, 56, 95, 0.08));\n font-weight: 600;\n }\n .mm-danger-confirmation__target-label { color: var(--theme-text-muted, #75829a); margin-right: var(--theme-space-1, 4px); }\n .mm-danger-confirmation__type { display: block; margin-bottom: var(--theme-space-1, 4px); }\n .mm-danger-confirmation__input { width: 100%; }\n `],\n})\nexport class DangerConfirmationWindowComponent extends DialogContentBase {\n private readonly ref: DialogRef;\n\n /** Set by the service right after opening. */\n readonly options = signal<DangerConfirmationOptions>({title: '', targetName: '', consequence: '', confirmText: ''});\n protected readonly typed = signal('');\n protected readonly inputId = `mm-danger-confirm-${nextId++}`;\n\n protected readonly messages = computed<DangerConfirmationMessages>(() => ({\n ...DEFAULT_DANGER_CONFIRMATION_MESSAGES,\n ...(this.options().messages ?? {}),\n }));\n /** What has to be typed: the target name, or a non-empty fallback when it is empty. */\n protected readonly typingToken = computed(() => dangerConfirmTypingToken(this.options()));\n protected readonly typeLabel = computed(() => this.messages().typeToConfirm.replace('{name}', this.typingToken()));\n protected readonly environmentNotice = computed(() =>\n this.messages().environmentNotice.replace('{environment}', this.options().environmentLabel ?? ''));\n protected readonly canConfirm = computed(() =>\n !this.options().requireTypingName || dangerConfirmNameMatches(this.typed(), this.typingToken()));\n\n constructor() {\n const ref = inject(DialogRef);\n super(ref);\n this.ref = ref;\n }\n\n private readonly host = inject(ElementRef<HTMLElement>);\n\n /**\n * Initial focus never on the destructive button (Enter must not delete): the type-to-confirm\n * input when required, else Cancel. The service also passes `autoFocusedElement`; this is the\n * fallback for hosts that render the content themselves.\n */\n override ngAfterViewInit(): void {\n super.ngAfterViewInit();\n setTimeout(() => this.focusSafeElement());\n }\n\n /** Focuses the type-to-confirm input or Cancel (unless focus already sits on one of them). */\n focusSafeElement(): void {\n const root = this.host.nativeElement.closest('.k-dialog') ?? this.host.nativeElement;\n const target = root.querySelector(DANGER_CONFIRM_SAFE_FOCUS(!!this.options().requireTypingName)) as HTMLElement | null;\n target?.focus();\n }\n\n protected cancel(): void {\n this.ref.close(new DangerConfirmationResult(false));\n }\n\n protected confirm(): void {\n if (this.canConfirm()) {\n this.ref.close(new DangerConfirmationResult(true));\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport {DialogRef, DialogService} from '@progress/kendo-angular-dialog';\nimport {firstValueFrom} from 'rxjs';\nimport {ConfirmationWindowComponent} from '../confirmation-window/confirmation-window.component';\nimport {\n ButtonTypes,\n ConfirmationButtonLabels,\n ConfirmationWindowData,\n ConfirmationWindowResult,\n DialogType,\n} from '../models/confirmation';\nimport {ConfirmationWindowMessages} from '../confirmation-window/confirmation-window.messages';\nimport {\n DANGER_CONFIRM_SAFE_FOCUS,\n DangerConfirmationResult,\n DangerConfirmationWindowComponent,\n} from '../danger-confirmation/danger-confirmation-window.component';\nimport {\n DANGER_CONFIRM_ENVIRONMENT,\n DangerConfirmationMessages,\n DangerConfirmationOptions,\n applyDangerConfirmEnvironment,\n} from '../danger-confirmation/danger-confirmation.model';\n\n@Injectable()\nexport class ConfirmationService {\n private readonly dialogService = inject(DialogService);\n /** Optional app-wide environment defaults (e.g. production → type the name), AB#5578. */\n private readonly dangerEnvironment = inject(DANGER_CONFIRM_ENVIRONMENT, {optional: true});\n\n public defaultMessages: Partial<ConfirmationWindowMessages> | undefined;\n /** App-wide translations of {@link showDangerConfirm}; per-call `options.messages` win. */\n public defaultDangerMessages: Partial<DangerConfirmationMessages> | undefined;\n\n /**\n * Danger confirmation that names the target (Studio action guideline §2.4, AB#5578): title +\n * target + consequence, Cancel left / danger confirm right, initial focus on Cancel (or on the\n * type-to-confirm input when `requireTypingName`, e.g. in production tenants). Resolves `true`\n * only when the confirming button was used. Unset `requireTypingName` / `environmentLabel` fall\n * back to the app's {@link DANGER_CONFIRM_ENVIRONMENT}, if provided.\n */\n public async showDangerConfirm(callerOptions: DangerConfirmationOptions): Promise<boolean> {\n const options = applyDangerConfirmEnvironment(callerOptions, this.dangerEnvironment?.());\n const dialogRef: DialogRef = this.dialogService.open({\n title: options.title,\n content: DangerConfirmationWindowComponent,\n cssClass: 'mm-dialog-danger',\n autoFocusedElement: DANGER_CONFIRM_SAFE_FOCUS(!!options.requireTypingName),\n minWidth: 'min(320px, calc(100vw - 32px))',\n maxWidth: 'min(560px, calc(100vw - 32px))',\n });\n const component = dialogRef.content.instance as DangerConfirmationWindowComponent;\n component.options.set({\n ...options,\n messages: {...(this.defaultDangerMessages ?? {}), ...(options.messages ?? {})},\n });\n const result = await firstValueFrom(dialogRef.result);\n return result instanceof DangerConfirmationResult && result.confirmed;\n }\n\n public async showYesNoConfirmationDialog(title: string, message: string, cssClass?: string, buttonLabels?: ConfirmationButtonLabels, messages?: Partial<ConfirmationWindowMessages>): Promise<boolean> {\n\n const dialogRef = this.openDialog(title, message, DialogType.YesNo, cssClass, buttonLabels, messages);\n\n const result = await firstValueFrom(dialogRef.result);\n if (result instanceof ConfirmationWindowResult) {\n return result.result === ButtonTypes.Yes;\n } else {\n return false;\n }\n }\n\n public async showYesNoCancelConfirmationDialog(title: string, message: string, buttonLabels?: ConfirmationButtonLabels, messages?: Partial<ConfirmationWindowMessages>): Promise<ConfirmationWindowResult | undefined> {\n\n const dialogRef = this.openDialog(title, message, DialogType.YesNoCancel, undefined, buttonLabels, messages);\n\n const result = await firstValueFrom(dialogRef.result);\n if (result instanceof ConfirmationWindowResult) {\n return result;\n }\n return undefined;\n }\n\n public async showOkCancelConfirmationDialog(title: string, message: string, messages?: Partial<ConfirmationWindowMessages>): Promise<boolean> {\n\n const dialogRef = this.openDialog(title, message, DialogType.OkCancel, undefined, undefined, messages);\n\n const component = dialogRef.content.instance as ConfirmationWindowComponent;\n component.data = {\n title,\n message,\n dialogType: DialogType.OkCancel,\n messages: messages ?? this.defaultMessages,\n } as ConfirmationWindowData\n\n const result = await firstValueFrom(dialogRef.result);\n if (result instanceof ConfirmationWindowResult) {\n return result.result === ButtonTypes.Ok;\n } else {\n return false;\n }\n }\n\n /**\n * Confirmation of a destructive action: explicit verb labels instead of Yes / No (e.g.\n * \"Rotate\" / \"Cancel\") and the confirming button styled as danger. Resolves `true` only when\n * the confirming button was clicked.\n */\n public async showDestructiveConfirmationDialog(title: string, message: string, confirmLabel: string, cancelLabel = 'Cancel'): Promise<boolean> {\n const dialogRef = this.openDialog(title, message, DialogType.YesNo, undefined, { yes: confirmLabel, no: cancelLabel }, undefined, true);\n const result = await firstValueFrom(dialogRef.result);\n return result instanceof ConfirmationWindowResult && result.result === ButtonTypes.Yes;\n }\n\n public async showOkDialog(title: string, message: string, messages?: Partial<ConfirmationWindowMessages>): Promise<boolean> {\n const dialogRef = this.openDialog(title, message, DialogType.Ok, undefined, undefined, messages);\n\n const result = await firstValueFrom(dialogRef.result);\n if (result instanceof ConfirmationWindowResult) {\n return result.result === ButtonTypes.Ok;\n } else {\n return false;\n }\n }\n\n private openDialog(title: string, message: string, dialogType: DialogType, cssClass?: string, buttonLabels?: ConfirmationButtonLabels, messages?: Partial<ConfirmationWindowMessages>, danger = false) {\n // A confirmation is a short text: cap its width so a long message wraps instead of\n // stretching the dialog over the whole viewport.\n const dialogRef: DialogRef = this.dialogService.open({\n title,\n content: ConfirmationWindowComponent,\n cssClass,\n // Destructive confirmations focus the dismissing button first: Enter must never confirm a\n // delete (AB#5578). Danger = showDestructiveConfirmationDialog, 'mm-dialog-danger' = production check.\n ...(danger || cssClass?.includes('mm-dialog-danger') ? {autoFocusedElement: '[data-action=\"dismiss\"], [data-action=\"cancel\"]'} : {}),\n // Both bounds leave a 16 px gutter on each side, so a phone (< 352 px) never overflows.\n minWidth: 'min(320px, calc(100vw - 32px))',\n maxWidth: 'min(560px, calc(100vw - 32px))'\n });\n\n const component = dialogRef.content.instance as ConfirmationWindowComponent;\n component.data = {\n title,\n message,\n dialogType,\n buttonLabels,\n messages: messages ?? this.defaultMessages,\n ...(danger ? { danger: true } : {}),\n };\n return dialogRef;\n }\n}\n","export class InputDialogResult {\n newValue: unknown;\n\n constructor(newValue: unknown) {\n this.newValue = newValue;\n }\n}\n","export interface InputDialogMessages {\n ok: string;\n cancel: string;\n placeholder: string;\n}\n\nexport const DEFAULT_INPUT_DIALOG_MESSAGES: InputDialogMessages = {\n ok: 'OK',\n cancel: 'Cancel',\n placeholder: 'Enter value',\n};\n","import { Component, Input, inject, ChangeDetectionStrategy } from '@angular/core';\nimport {DialogActionsComponent, DialogContentBase, DialogRef} from '@progress/kendo-angular-dialog';\nimport {ButtonComponent} from '@progress/kendo-angular-buttons';\nimport {FormsModule} from '@angular/forms';\nimport {LabelComponent} from '@progress/kendo-angular-label';\nimport {TextBoxComponent} from '@progress/kendo-angular-inputs';\nimport {InputDialogResult} from '../models/inputDialogResult';\nimport {\n InputDialogMessages,\n DEFAULT_INPUT_DIALOG_MESSAGES,\n} from './input-dialog.messages';\n\n@Component({\n selector: 'mm-input-dialog',\n imports: [\n DialogActionsComponent,\n ButtonComponent,\n FormsModule,\n LabelComponent,\n TextBoxComponent\n ],\n templateUrl: './input-dialog.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './input-dialog.component.scss'\n})\nexport class InputDialogComponent extends DialogContentBase {\n private readonly dialogRef: DialogRef;\n\n @Input() public buttonOkText = DEFAULT_INPUT_DIALOG_MESSAGES.ok;\n @Input() public message = '';\n @Input() public placeholder = DEFAULT_INPUT_DIALOG_MESSAGES.placeholder;\n\n @Input() protected inputValue: string | null = '';\n\n public _messages: InputDialogMessages = { ...DEFAULT_INPUT_DIALOG_MESSAGES };\n\n @Input() set messages(value: Partial<InputDialogMessages> | undefined) {\n this._messages = { ...DEFAULT_INPUT_DIALOG_MESSAGES, ...(value ?? {}) };\n if (this.buttonOkText === DEFAULT_INPUT_DIALOG_MESSAGES.ok) {\n this.buttonOkText = this._messages.ok;\n }\n if (this.placeholder === DEFAULT_INPUT_DIALOG_MESSAGES.placeholder) {\n this.placeholder = this._messages.placeholder;\n }\n }\n\n constructor() {\n const dialogRef = inject(DialogRef);\n\n super(dialogRef);\n\n this.dialogRef = dialogRef;\n }\n\n protected onOk(): void {\n this.dialogRef.close(new InputDialogResult(this.inputValue!));\n }\n\n protected onCancel(): void {\n this.dialogRef.close(null);\n }\n}\n","<kendo-label text=\"{{message}}\">\n<kendo-textbox id=\"input\" [placeholder]=\"placeholder\" [(ngModel)]=\"inputValue\" ></kendo-textbox>\n</kendo-label>\n<kendo-dialog-actions>\n <button kendoButton (click)=\"onOk()\" themeColor=\"primary\" [disabled]=\"!inputValue\">{{buttonOkText}}</button>\n <button kendoButton (click)=\"onCancel()\">{{ _messages.cancel }}</button>\n</kendo-dialog-actions>\n","import { Injectable, inject } from '@angular/core';\nimport {DialogService} from '@progress/kendo-angular-dialog';\nimport {InputDialogComponent} from '../input-dialog/input-dialog.component';\nimport {firstValueFrom} from 'rxjs';\nimport {InputDialogResult} from '../models/inputDialogResult';\nimport {InputDialogMessages} from '../input-dialog/input-dialog.messages';\n\n@Injectable()\nexport class InputService {\n private readonly dialogService = inject(DialogService);\n\n public defaultMessages: Partial<InputDialogMessages> | undefined;\n\n public async showInputDialog(\n title: string,\n message: string,\n placeholder: string,\n buttonOkText: string | null = null,\n messages?: Partial<InputDialogMessages>,\n ): Promise<string | null> {\n const dialogRef = this.dialogService.open({\n title,\n content: InputDialogComponent,\n autoFocusedElement: 'input'\n });\n\n const component = dialogRef.content.instance;\n component.message = message;\n component.placeholder = placeholder;\n if (buttonOkText) {\n component.buttonOkText = buttonOkText;\n }\n const effectiveMessages = messages ?? this.defaultMessages;\n if (effectiveMessages) {\n component.messages = effectiveMessages;\n }\n\n const result = await firstValueFrom(dialogRef.result);\n if (result instanceof InputDialogResult) {\n return result.newValue as string;\n }\n\n return null;\n }\n}\n","export interface ProgressWindowMessages {\n cancel: string;\n}\n\nexport const DEFAULT_PROGRESS_WINDOW_MESSAGES: ProgressWindowMessages = {\n cancel: 'Cancel',\n};\n","import { Component, inject, OnDestroy, AfterViewInit, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ButtonComponent } from '@progress/kendo-angular-buttons';\nimport {\n DialogActionsComponent,\n DialogContentBase,\n DialogRef,\n} from '@progress/kendo-angular-dialog';\nimport { ProgressBarComponent } from '@progress/kendo-angular-progressbar';\nimport { Observable, Subscription } from 'rxjs';\nimport { ProgressValue } from '../models/progressValue';\nimport {\n ProgressWindowMessages,\n DEFAULT_PROGRESS_WINDOW_MESSAGES,\n} from './progress-window.messages';\n\nexport interface ProgressWindowData {\n title: string;\n isDeterminate: boolean;\n progress: Observable<ProgressValue>;\n isCancelOperationAvailable: boolean;\n cancelOperation: () => void;\n}\n\nexport type ProgressWindowResult = object;\n\n@Component({\n selector: 'mm-progress-window',\n standalone: true,\n imports: [\n CommonModule,\n ButtonComponent,\n DialogActionsComponent,\n ProgressBarComponent,\n ],\n templateUrl: './progress-window.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './progress-window.component.scss'\n})\nexport class ProgressWindowComponent extends DialogContentBase implements OnDestroy, AfterViewInit {\n private readonly dialogRef: DialogRef;\n private progressSubscription?: Subscription;\n\n @Input() isDeterminate = true;\n @Input() progress!: Observable<ProgressValue>;\n @Input() isCancelOperationAvailable = false;\n @Input() cancelOperation?: () => void;\n\n public statusText: string | null = null;\n public progressValue = 0;\n\n public _messages: ProgressWindowMessages = { ...DEFAULT_PROGRESS_WINDOW_MESSAGES };\n\n @Input() set messages(value: Partial<ProgressWindowMessages> | undefined) {\n this._messages = { ...DEFAULT_PROGRESS_WINDOW_MESSAGES, ...(value ?? {}) };\n }\n\n constructor() {\n const dialogRef = inject(DialogRef);\n super(dialogRef);\n this.dialogRef = dialogRef;\n }\n\n override ngAfterViewInit(): void {\n // Subscribe to progress updates after view is initialized\n if (this.progress) {\n this.progressSubscription = this.progress.subscribe((value: ProgressValue) => {\n this.statusText = value.statusText;\n this.progressValue = value.progressValue;\n });\n }\n }\n\n ngOnDestroy(): void {\n // Clean up subscription\n if (this.progressSubscription) {\n this.progressSubscription.unsubscribe();\n }\n }\n\n onCancelClick(): void {\n if (this.cancelOperation) {\n this.cancelOperation();\n }\n this.dialogRef.close();\n }\n}\n","<div class=\"progress-content\">\n <div class=\"progress-section\">\n <!-- Determinate progress bar -->\n @if (isDeterminate) {\n <kendo-progressbar\n [value]=\"progressValue\"\n [max]=\"100\" [label]=\"false\"\n class=\"progress-bar\">\n </kendo-progressbar>\n }\n\n <!-- Indeterminate progress bar -->\n @if (!isDeterminate) {\n <kendo-progressbar\n [indeterminate]=\"true\"\n class=\"progress-bar\">\n </kendo-progressbar>\n }\n\n <!-- Status text -->\n @if (statusText) {\n <p class=\"status-text\">{{ statusText }}</p>\n }\n </div>\n</div>\n\n<kendo-dialog-actions>\n @if (isCancelOperationAvailable) {\n <button\n kendoButton\n (click)=\"onCancelClick()\">\n {{ _messages.cancel }}\n </button>\n }\n</kendo-dialog-actions>\n","import { Injectable, inject } from '@angular/core';\nimport { DialogRef, DialogService } from '@progress/kendo-angular-dialog';\nimport { Observable } from 'rxjs';\nimport { ProgressValue } from '../models/progressValue';\nimport { ProgressWindowComponent } from './progress-window.component';\nimport { ProgressWindowMessages } from './progress-window.messages';\n\n@Injectable()\nexport class ProgressWindowService {\n private readonly dialogService = inject(DialogService);\n\n public defaultMessages: Partial<ProgressWindowMessages> | undefined;\n\n showProgress(config: ProgressWindowConfig): DialogRef {\n const dialogRef = this.dialogService.open({\n title: config.title,\n content: ProgressWindowComponent,\n width: config.width ?? 450,\n height: config.height ?? 'auto',\n cssClass: 'mm-progress-window-no-close',\n preventAction: () => true\n });\n\n const component = dialogRef.content.instance;\n component.isDeterminate = config.isDeterminate !== false;\n component.progress = config.progress;\n component.isCancelOperationAvailable = config.isCancelOperationAvailable || false;\n component.cancelOperation = config.cancelOperation || (() => { /* noop */ });\n const messages = config.messages ?? this.defaultMessages;\n if (messages) {\n component.messages = messages;\n }\n\n return dialogRef;\n }\n\n /**\n * Shows a determinate progress window (with percentage)\n * @param title Window title\n * @param progress Observable that emits progress updates\n * @param options Additional options\n * @returns DialogRef for the progress window\n */\n showDeterminateProgress(\n title: string,\n progress: Observable<ProgressValue>,\n options?: Partial<ProgressWindowOptions>\n ): DialogRef {\n return this.showProgress({\n title,\n isDeterminate: true,\n progress,\n ...options\n });\n }\n\n /**\n * Shows an indeterminate progress window (spinning/pulsing animation)\n * @param title Window title\n * @param progress Observable that emits progress updates (statusText only)\n * @param options Additional options\n * @returns DialogRef for the progress window\n */\n showIndeterminateProgress(\n title: string,\n progress: Observable<ProgressValue>,\n options?: Partial<ProgressWindowOptions>\n ): DialogRef {\n return this.showProgress({\n title,\n isDeterminate: false,\n progress,\n ...options\n });\n }\n}\n\nexport interface ProgressWindowConfig {\n title: string;\n progress: Observable<ProgressValue>;\n isDeterminate?: boolean;\n isCancelOperationAvailable?: boolean;\n cancelOperation?: () => void;\n width?: number;\n height?: number | string;\n allowClose?: boolean;\n messages?: Partial<ProgressWindowMessages>;\n}\n\nexport interface ProgressWindowOptions {\n isCancelOperationAvailable?: boolean;\n cancelOperation?: () => void;\n width?: number;\n height?: number | string;\n allowClose?: boolean;\n messages?: Partial<ProgressWindowMessages>;\n}\n","export interface MessageDetailsDialogMessages {\n copyToClipboard: string;\n close: string;\n closeTitle: string;\n minimizeTitle: string;\n maximizeTitle: string;\n restoreTitle: string;\n}\n\nexport const DEFAULT_MESSAGE_DETAILS_DIALOG_MESSAGES: MessageDetailsDialogMessages = {\n copyToClipboard: 'Copy to Clipboard',\n close: 'Close',\n closeTitle: 'Close',\n minimizeTitle: 'Minimize',\n maximizeTitle: 'Maximize',\n restoreTitle: 'Restore',\n};\n","import { Component, inject, OnInit, ChangeDetectionStrategy } from '@angular/core';\nimport { WindowRef } from '@progress/kendo-angular-dialog';\nimport { ButtonModule } from '@progress/kendo-angular-buttons';\nimport { copyIcon, xIcon } from '@progress/kendo-svg-icons';\nimport {\n MessageDetailsDialogMessages,\n DEFAULT_MESSAGE_DETAILS_DIALOG_MESSAGES,\n} from './message-details-dialog.messages';\n\nexport interface MessageDetailsDialogData {\n title: string;\n details: string;\n level: 'error' | 'warning';\n copyLabel?: string;\n closeLabel?: string;\n messages?: Partial<MessageDetailsDialogMessages>;\n}\n\n@Component({\n selector: 'mm-message-details-dialog',\n standalone: true,\n imports: [\n ButtonModule,\n ],\n // No <kendo-window-messages> here: the titlebar tooltips travel through WindowSettings.messages\n // (see MessageDetailsDialogService). WindowService builds this content outside the window, so\n // the directive finds no LocalizationService and the dialog fails to open with NG0201.\n template: `\n <div class=\"message-details-content\">\n @if (!details) {\n <div class=\"loading-section\">\n <span class=\"k-icon k-i-loading\"></span>\n </div>\n } @else {\n <pre class=\"details-pre\">{{ details }}</pre>\n }\n\n <div class=\"dialog-actions\">\n <button\n kendoButton\n [svgIcon]=\"copyIcon\"\n themeColor=\"primary\"\n (click)=\"copyToClipboard()\">\n {{ copyLabel }}\n </button>\n <button\n kendoButton\n [svgIcon]=\"xIcon\"\n themeColor=\"base\"\n (click)=\"onClose()\">\n {{ closeLabel }}\n </button>\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.Eager,\n styles: [`\n .message-details-content {\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 16px;\n box-sizing: border-box;\n overflow: hidden;\n }\n\n .loading-section {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .details-pre {\n flex: 1;\n margin: 0;\n font-family: 'Courier New', monospace;\n font-size: 13px;\n line-height: 1.5;\n border: 1px solid var(--kendo-color-border);\n background: var(--kendo-color-base-subtle);\n border-radius: 4px;\n padding: 12px;\n overflow: scroll;\n white-space: pre;\n min-height: 0;\n }\n\n .details-pre::-webkit-scrollbar {\n width: 10px;\n height: 10px;\n }\n\n .details-pre::-webkit-scrollbar-track {\n background: var(--kendo-color-base-subtle, #f5f5f5);\n border-radius: 4px;\n }\n\n .details-pre::-webkit-scrollbar-thumb {\n background: var(--kendo-color-border, #ccc);\n border-radius: 4px;\n }\n\n .details-pre::-webkit-scrollbar-thumb:hover {\n background: #999;\n }\n\n .dialog-actions {\n flex-shrink: 0;\n padding-top: 16px;\n margin-top: 16px;\n border-top: 1px solid var(--kendo-color-border);\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n gap: 12px;\n }\n `]\n})\nexport class MessageDetailsDialogComponent implements OnInit {\n protected readonly copyIcon = copyIcon;\n protected readonly xIcon = xIcon;\n\n private readonly windowRef = inject(WindowRef);\n\n public data!: MessageDetailsDialogData;\n public details = '';\n public copyLabel = DEFAULT_MESSAGE_DETAILS_DIALOG_MESSAGES.copyToClipboard;\n public closeLabel = DEFAULT_MESSAGE_DETAILS_DIALOG_MESSAGES.close;\n public messages: MessageDetailsDialogMessages = { ...DEFAULT_MESSAGE_DETAILS_DIALOG_MESSAGES };\n\n ngOnInit(): void {\n if (this.data) {\n this.details = this.data.details;\n this.messages = {\n ...DEFAULT_MESSAGE_DETAILS_DIALOG_MESSAGES,\n ...(this.data.messages ?? {}),\n };\n this.copyLabel = this.data.copyLabel ?? this.messages.copyToClipboard;\n this.closeLabel = this.data.closeLabel ?? this.messages.close;\n }\n }\n\n onClose(): void {\n this.windowRef.close();\n }\n\n async copyToClipboard(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.details);\n } catch {\n this.fallbackCopyToClipboard(this.details);\n }\n }\n\n private fallbackCopyToClipboard(text: string): void {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n\n try {\n document.execCommand('copy');\n } catch {\n // clipboard fallback failed silently\n } finally {\n document.body.removeChild(textarea);\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { WindowRef } from '@progress/kendo-angular-dialog';\n\nexport interface WindowDimensions {\n width: number;\n height: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class WindowStateService {\n private readonly storageKey = 'mm-window-states';\n private activeBackdrops = 0;\n\n getDimensions(dialogKey: string): WindowDimensions | null {\n const states = this.loadStates();\n return states[dialogKey] ?? null;\n }\n\n saveDimensions(dialogKey: string, dimensions: WindowDimensions): void {\n const states = this.loadStates();\n states[dialogKey] = dimensions;\n this.saveStates(states);\n }\n\n clearDimensions(dialogKey: string): void {\n const states = this.loadStates();\n delete states[dialogKey];\n this.saveStates(states);\n }\n\n resolveWindowSize(\n dialogKey: string,\n defaults: WindowDimensions,\n min?: WindowDimensions\n ): WindowDimensions {\n const stored = this.getDimensions(dialogKey);\n let size = defaults;\n // Sub-min stored values are presumed corrupt (e.g. captured before the dialog's current\n // min was raised, or under a CSS zoom that distorted the saved rect). Fall back to the\n // caller's defaults instead of clamping to min — clamping would trap the dialog at min\n // permanently, since the next captureAndSave would store min and resolveWindowSize would\n // happily return it forever after.\n if (stored && !(min && (stored.width < min.width || stored.height < min.height))) {\n size = stored;\n }\n return this.clampToViewport(size);\n }\n\n /**\n * Keeps a dialog fully on screen: neither a large default nor a size stored\n * on a bigger monitor may exceed the current viewport (minus a margin), or\n * the action bar ends up unreachable below the fold on small resolutions.\n * The clamp deliberately wins over the dialog's minWidth/minHeight — a\n * slightly-too-small dialog is usable, an off-screen one is not. Stored\n * sizes stay untouched, so returning to a larger screen restores them.\n */\n private clampToViewport(size: WindowDimensions): WindowDimensions {\n const viewport = this.viewportSize();\n const margin = 24;\n const maxWidth = Math.max(280, viewport.width - margin * 2);\n const maxHeight = Math.max(240, viewport.height - margin * 2);\n return {\n width: Math.min(size.width, maxWidth),\n height: Math.min(size.height, maxHeight)\n };\n }\n\n /** Seam for tests — window.innerWidth/innerHeight are not assignable in jsdom. */\n protected viewportSize(): WindowDimensions {\n return { width: window.innerWidth, height: window.innerHeight };\n }\n\n captureAndSave(\n dialogKey: string,\n windowElement: HTMLElement,\n min?: WindowDimensions\n ): void {\n // Inline style holds the document-pixel dimensions Kendo sets when the user resizes;\n // getBoundingClientRect would return zoom-adjusted values (e.g. parent CSS zoom: 0.75\n // shrinks the rect by 25%) and saving those would cause the window to shrink on every\n // open/close cycle.\n const styleW = this.parsePixels(windowElement.style.width);\n const styleH = this.parsePixels(windowElement.style.height);\n if (styleW <= 0 || styleH <= 0) {\n return;\n }\n this.saveDimensions(dialogKey, {\n width: Math.max(Math.round(styleW), min?.width ?? 0),\n height: Math.max(Math.round(styleH), min?.height ?? 0)\n });\n }\n\n private parsePixels(value: string | null | undefined): number {\n if (!value) return 0;\n const n = parseFloat(value);\n return Number.isFinite(n) ? n : 0;\n }\n\n /**\n * Applies modal behavior to a Kendo WindowRef: shows a dark backdrop overlay\n * that blocks interaction with the background, and removes it when the window closes.\n * Also captures and saves window dimensions on close.\n *\n * Reads minWidth/minHeight from the Kendo Window instance and clamps stored sizes\n * accordingly — both on save (so future captures never fall below min) and as a\n * self-healing pass on entry (so a previously-stored size below the current min is\n * cleared on first open, falling back to the dialog's configured defaults next time).\n */\n applyModalBehavior(dialogKey: string, windowRef: WindowRef): void {\n const windowEl = windowRef.window.location.nativeElement;\n const min = this.readMinDimensions(windowRef);\n this.healStaleDimensions(dialogKey, min);\n this.showBackdrop();\n\n windowRef.result.subscribe({\n next: () => {\n this.captureAndSave(dialogKey, windowEl, min);\n this.hideBackdrop();\n },\n error: () => {\n this.captureAndSave(dialogKey, windowEl, min);\n this.hideBackdrop();\n }\n });\n }\n\n private readMinDimensions(windowRef: WindowRef): WindowDimensions | undefined {\n const instance = (windowRef.window as { instance?: { minWidth?: number; minHeight?: number } }).instance;\n if (!instance) return undefined;\n const minWidth = instance.minWidth ?? 0;\n const minHeight = instance.minHeight ?? 0;\n if (minWidth <= 0 && minHeight <= 0) return undefined;\n return { width: minWidth, height: minHeight };\n }\n\n /**\n * Drops stored dimensions that fall below the current minimum so the next open uses\n * the caller's defaults instead of a too-small persisted size. The current open is\n * unaffected (it already resolved at open time), but the next one is healed.\n */\n private healStaleDimensions(dialogKey: string, min: WindowDimensions | undefined): void {\n if (!min) return;\n const stored = this.getDimensions(dialogKey);\n if (!stored) return;\n if (stored.width < min.width || stored.height < min.height) {\n this.clearDimensions(dialogKey);\n }\n }\n\n private showBackdrop(): void {\n this.activeBackdrops++;\n if (this.activeBackdrops === 1) {\n this.getOrCreateBackdropElement().style.display = 'block';\n }\n }\n\n private hideBackdrop(): void {\n this.activeBackdrops = Math.max(0, this.activeBackdrops - 1);\n if (this.activeBackdrops === 0) {\n const el = document.querySelector('.mm-window-backdrop') as HTMLElement | null;\n if (el) {\n el.style.display = 'none';\n }\n }\n }\n\n private getOrCreateBackdropElement(): HTMLElement {\n let el = document.querySelector('.mm-window-backdrop') as HTMLElement | null;\n if (!el) {\n el = document.createElement('div');\n el.className = 'mm-window-backdrop';\n // background-color, not the `background` shorthand: jsdom's CSSOM (cssstyle) drops the\n // entire declaration block when the shorthand carries an rgba() value. Same rendering.\n el.style.cssText = 'position:fixed;inset:0;background-color:rgba(0,0,0,0.4);z-index:11499;display:none;';\n document.body.appendChild(el);\n }\n return el;\n }\n\n private loadStates(): Record<string, WindowDimensions> {\n try {\n const raw = sessionStorage.getItem(this.storageKey);\n return raw ? JSON.parse(raw) : {};\n } catch {\n return {};\n }\n }\n\n private saveStates(states: Record<string, WindowDimensions>): void {\n try {\n sessionStorage.setItem(this.storageKey, JSON.stringify(states));\n } catch {\n // sessionStorage full or unavailable\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { WindowService, WindowRef } from '@progress/kendo-angular-dialog';\nimport { MessageDetailsDialogComponent, MessageDetailsDialogData } from './message-details-dialog.component';\nimport { WindowStateService } from '../services/window-state.service';\nimport { MessageDetailsDialogMessages } from './message-details-dialog.messages';\n\n@Injectable()\nexport class MessageDetailsDialogService {\n private readonly windowService = inject(WindowService);\n private readonly windowStateService = inject(WindowStateService);\n\n public defaultMessages: Partial<MessageDetailsDialogMessages> | undefined;\n\n showDetailsDialog(data: MessageDetailsDialogData): WindowRef {\n const size = this.windowStateService.resolveWindowSize('message-details', { width: 900, height: 600 });\n\n const effectiveMessages = data.messages ?? this.defaultMessages;\n\n // Kendo's Window titlebar reads close/minimize/maximize/restore tooltips\n // from WindowSettings.messages at open time - the only way in. The content\n // component cannot carry them: WindowService builds it in the container's\n // injector, outside the window, so a <kendo-window-messages> there finds no\n // LocalizationService (NG0201) and could not reach the titlebar anyway.\n const windowMessages = effectiveMessages\n ? {\n closeTitle: effectiveMessages.closeTitle,\n minimizeTitle: effectiveMessages.minimizeTitle,\n maximizeTitle: effectiveMessages.maximizeTitle,\n restoreTitle: effectiveMessages.restoreTitle,\n }\n : undefined;\n\n const windowRef = this.windowService.open({\n content: MessageDetailsDialogComponent,\n title: data.title,\n width: size.width,\n height: size.height,\n minWidth: 500,\n minHeight: 400,\n resizable: true,\n messages: windowMessages,\n });\n\n this.windowStateService.applyModalBehavior('message-details', windowRef);\n\n const contentRef = windowRef.content as { instance?: MessageDetailsDialogComponent } | undefined;\n if (contentRef?.instance) {\n contentRef.instance.data = effectiveMessages\n ? { ...data, messages: effectiveMessages }\n : data;\n }\n\n return windowRef;\n }\n}\n","export interface NotificationDisplayMessages {\n showDetails: string;\n}\n\nexport const DEFAULT_NOTIFICATION_DISPLAY_MESSAGES: NotificationDisplayMessages = {\n showDetails: 'Show details',\n};\n","import {Injectable, inject, InjectionToken, OnDestroy, NgZone} from '@angular/core';\nimport {NotificationService, NotificationSettings, NotificationRef} from '@progress/kendo-angular-notification';\nimport { MessageDetailsDialogService } from '../message-details-dialog/message-details-dialog.service';\nimport { Router, NavigationEnd } from '@angular/router';\nimport { Subscription, fromEvent } from 'rxjs';\nimport { filter, debounceTime } from 'rxjs/operators';\nimport {\n NotificationDisplayMessages,\n DEFAULT_NOTIFICATION_DISPLAY_MESSAGES,\n} from './notification-display.messages';\n\n/**\n * How the {@link NotificationDisplayService} stacks its toasts. Provide it with\n * {@link NOTIFICATION_DISPLAY_OPTIONS}; without a provider the defaults keep the former behaviour\n * except for de-duplication, which is always safe.\n */\nexport interface NotificationDisplayOptions {\n /**\n * Milliseconds after which an error hides itself when the caller passes no `hideAfter`.\n * 0 (default) keeps errors until user interaction or navigation. A caller passing\n * `hideAfter: 0` explicitly always gets a sticky (critical) error.\n */\n errorHideAfter?: number;\n /** Same as {@link errorHideAfter} for warnings. */\n warningHideAfter?: number;\n /**\n * Errors and warnings that come with details (the \"show details\" button) stay until closed,\n * whatever {@link errorHideAfter} / {@link warningHideAfter} say. Default false.\n */\n stickyWithDetails?: boolean;\n /** Most toasts shown at once; beyond it the oldest toast of the LOWEST severity is hidden\n * (an error or warning is never dropped in favour of a success or info). 0 (default) = no limit. */\n maxVisible?: number;\n /** A toast with the same type, text and details as a visible one is not stacked again; the visible one's timer restarts. Default true. */\n dedupe?: boolean;\n}\n\nexport const NOTIFICATION_DISPLAY_OPTIONS = new InjectionToken<NotificationDisplayOptions>('NOTIFICATION_DISPLAY_OPTIONS');\n\nconst DEFAULT_OPTIONS: Required<NotificationDisplayOptions> = {\n errorHideAfter: 0,\n warningHideAfter: 0,\n maxVisible: 0,\n dedupe: true,\n stickyWithDetails: false,\n};\n\n/** Eviction order of the stack cap: lower goes first. */\nconst SEVERITY: Record<'success' | 'info' | 'warning' | 'error', number> = { success: 0, info: 0, warning: 1, error: 2 };\n\ntype ToastStyle = 'success' | 'info' | 'warning' | 'error';\n\n/** One visible toast. */\ninterface ActiveToast {\n id: string;\n key: string;\n style: ToastStyle;\n title: string;\n ref: NotificationRef;\n hideAfter: number;\n timer?: ReturnType<typeof setTimeout>;\n /** Hover / keyboard focus on the toast: the auto-hide timer waits until both are gone. */\n hovered: boolean;\n focused: boolean;\n}\n\n@Injectable()\nexport class NotificationDisplayService implements OnDestroy {\n private readonly notificationService = inject(NotificationService);\n private readonly messageDetailsDialogService = inject(MessageDetailsDialogService);\n private readonly router = inject(Router);\n private readonly ngZone = inject(NgZone);\n\n private readonly options: Required<NotificationDisplayOptions> = {\n ...DEFAULT_OPTIONS,\n ...(inject(NOTIFICATION_DISPLAY_OPTIONS, { optional: true }) ?? {}),\n };\n\n private notificationCounter = 0;\n private activeNotifications = new Map<string, NotificationRef>();\n /** Every visible toast, oldest first (dedupe, stack cap, auto-hide timers). */\n private toasts: ActiveToast[] = [];\n private subscriptions: Subscription[] = [];\n private interactionDebounceTime = 300; // ms\n private gracePeriod = 1000; // ms - prevent immediate closure after opening\n private notificationOpenTimes = new Map<string, number>();\n\n public messages: NotificationDisplayMessages = { ...DEFAULT_NOTIFICATION_DISPLAY_MESSAGES };\n\n public setMessages(value: Partial<NotificationDisplayMessages>): void {\n this.messages = { ...DEFAULT_NOTIFICATION_DISPLAY_MESSAGES, ...value };\n }\n\n private readonly defaultSettings: NotificationSettings = {\n content: '',\n type: {style: 'success', icon: true},\n animation: {type: 'slide', duration: 400},\n hideAfter: 3000,\n closable: true,\n position: { horizontal: 'center', vertical: 'top' }\n };\n\n constructor() {\n this.setupNavigationListener();\n this.setupGlobalInteractionListeners();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach(sub => sub.unsubscribe());\n this.clearAllNotifications();\n }\n\n private setupNavigationListener(): void {\n const navigationSubscription = this.router.events\n .pipe(filter(event => event instanceof NavigationEnd))\n .subscribe(() => {\n this.clearErrorAndWarningNotifications();\n });\n this.subscriptions.push(navigationSubscription);\n }\n\n private setupGlobalInteractionListeners(): void {\n this.ngZone.runOutsideAngular(() => {\n const events = ['click', 'keydown', 'touchstart'];\n\n events.forEach(eventType => {\n const subscription = fromEvent(document, eventType)\n .pipe(\n debounceTime(this.interactionDebounceTime),\n filter(() => this.hasActiveErrorOrWarning()), // Only process events if we have error/warning notifications\n filter((event) => this.shouldCloseOnInteraction(event as Event))\n )\n .subscribe(() => {\n this.ngZone.run(() => {\n this.clearErrorAndWarningNotifications();\n });\n });\n this.subscriptions.push(subscription);\n });\n });\n }\n\n private hasActiveErrorOrWarning(): boolean {\n for (const [id, _] of this.activeNotifications) {\n if (id.includes('error') || id.includes('warning')) {\n return true;\n }\n }\n return false;\n }\n\n private shouldCloseOnInteraction(event: Event): boolean {\n const target = event.target as Element;\n\n // Don't close if clicking on the notification itself\n const notificationElements = document.querySelectorAll('.k-notification');\n for (const element of Array.from(notificationElements)) {\n if (element.contains(target)) {\n return false;\n }\n }\n\n // Don't close if clicking on navigation elements\n const navElements = document.querySelectorAll('nav, .navigation, .navbar, .menu, .sidebar');\n for (const element of Array.from(navElements)) {\n if (element.contains(target)) {\n return false;\n }\n }\n\n // Check grace period for recent error/warning notifications\n for (const [id, openTime] of this.notificationOpenTimes) {\n if (id.includes('error') || id.includes('warning')) {\n const timeSinceOpen = Date.now() - openTime;\n if (timeSinceOpen < this.gracePeriod) {\n return false;\n }\n }\n }\n\n // Don't close on certain key presses\n if (event.type === 'keydown') {\n const keyEvent = event as KeyboardEvent;\n const excludedKeys = ['Tab', 'Shift', 'Control', 'Alt', 'Meta'];\n return !excludedKeys.includes(keyEvent.key);\n }\n\n return true;\n }\n\n private clearErrorAndWarningNotifications(): void {\n const toRemove: string[] = [];\n for (const [id, ref] of this.activeNotifications) {\n if (id.includes('error') || id.includes('warning')) {\n ref.hide();\n toRemove.push(id);\n }\n }\n toRemove.forEach(id => {\n this.activeNotifications.delete(id);\n this.notificationOpenTimes.delete(id);\n this.forget(id);\n });\n }\n\n private clearAllNotifications(): void {\n for (const [_, ref] of this.activeNotifications) {\n ref.hide();\n }\n this.activeNotifications.clear();\n this.notificationOpenTimes.clear();\n this.toasts.forEach(toast => clearTimeout(toast.timer));\n this.toasts = [];\n }\n\n /**\n * Helper method to create SVG icon HTML\n */\n private createSvgIcon(): string {\n return '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\"' +\n ' d=\"M12 9a3 3 0 0 0-3 3a3 3 0 0 0 3 3a3 3 0 0 0 3-3a3 3 0 0 0-3-3m0 8a5 5 0 0 1-5-5a5 5 0 0 1 5-5a5 5 0 0 1 5 5a5 5 0 0 1-5 5m0-12.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5\"/></svg>';\n }\n\n\n /**\n * Shows a success notification (auto-closes after 3 seconds)\n */\n showSuccess(title: string, hideAfter?: number): void {\n this.present('success', title, undefined, hideAfter ?? 3000);\n }\n\n /**\n * Shows an error notification. It persists until user interaction or navigation, or hides\n * after `hideAfter` ms (default: `errorHideAfter` of the options; `0` = sticky).\n */\n showError(title: string, details?: string, hideAfter?: number): void {\n this.present('error', title, details, hideAfter ?? this.options.errorHideAfter);\n }\n\n /**\n * Shows a warning notification. It persists until user interaction or navigation, or hides\n * after `hideAfter` ms (default: `warningHideAfter` of the options; `0` = sticky).\n */\n showWarning(title: string, details?: string, hideAfter?: number): void {\n this.present('warning', title, details, hideAfter ?? this.options.warningHideAfter);\n }\n\n /**\n * Shows an info notification (auto-closes after 3 seconds)\n */\n showInfo(title: string, hideAfter?: number): void {\n this.present('info', title, undefined, hideAfter ?? 3000);\n }\n\n /** The visible toasts as `[style, text]`, oldest first — for tests and diagnostics. */\n visibleToasts(): [ToastStyle, string][] {\n return this.toasts.map(toast => [toast.style, toast.title]);\n }\n\n private present(style: ToastStyle, title: string, details: string | undefined, hideAfter: number): void {\n const key = `${style}\\u0000${title}\\u0000${details ?? ''}`;\n if (this.options.dedupe) {\n const same = this.toasts.find(toast => toast.key === key);\n if (same) {\n // Already on screen: no second copy, the visible one just stays a while longer.\n this.schedule(same);\n return;\n }\n }\n\n const sticky = style === 'error' || style === 'warning';\n // An error or warning with details is read in the details dialog: it waits for the user.\n const duration = sticky && details && this.options.stickyWithDetails ? 0 : hideAfter;\n const notificationId = `${style}-${++this.notificationCounter}-${Date.now()}`;\n const settings: NotificationSettings = {\n ...this.defaultSettings,\n content: title,\n type: { style, icon: true },\n // Kendo ignores hideAfter on closable notifications: hiding is done by schedule().\n hideAfter: 0,\n closable: true,\n cssClass: `notification-${notificationId}`,\n };\n\n const notificationRef = this.notificationService.show(settings);\n if (!notificationRef) {\n return;\n }\n\n if (sticky) {\n this.activeNotifications.set(notificationId, notificationRef);\n this.notificationOpenTimes.set(notificationId, Date.now());\n }\n const toast: ActiveToast = { id: notificationId, key, style, title, ref: notificationRef, hideAfter: duration, hovered: false, focused: false };\n this.toasts.push(toast);\n notificationRef.afterHide?.subscribe(() => this.forget(notificationId));\n this.schedule(toast);\n this.enforceLimit();\n\n // The toast element exists once Kendo has rendered it.\n setTimeout(() => {\n this.watchPointerAndFocus(toast);\n if (details && sticky) {\n this.addDetailsButton(notificationId, title, details, style);\n }\n }, 50);\n }\n\n /** (Re)starts the auto-hide timer of a toast; a toast with `hideAfter` 0 stays, a hovered or focused one waits. */\n private schedule(toast: ActiveToast): void {\n clearTimeout(toast.timer);\n toast.timer = undefined;\n if (toast.hideAfter > 0 && !toast.hovered && !toast.focused) {\n toast.timer = setTimeout(() => this.hideToast(toast), toast.hideAfter);\n }\n }\n\n /** Pauses the auto-hide while the pointer is over the toast or focus is inside it; restarts it afterwards. */\n private watchPointerAndFocus(toast: ActiveToast): void {\n const element = document.querySelector<HTMLElement>(`.notification-${toast.id}`);\n if (!element || !this.toasts.includes(toast)) {\n return;\n }\n const update = (change: Partial<Pick<ActiveToast, 'hovered' | 'focused'>>) => {\n Object.assign(toast, change);\n if (this.toasts.includes(toast)) {\n this.schedule(toast);\n }\n };\n element.addEventListener('mouseenter', () => update({ hovered: true }));\n element.addEventListener('mouseleave', () => update({ hovered: false }));\n element.addEventListener('focusin', () => update({ focused: true }));\n element.addEventListener('focusout', (event: FocusEvent) => {\n if (!(event.relatedTarget instanceof Node && element.contains(event.relatedTarget))) {\n update({ focused: false });\n }\n });\n }\n\n /** Beyond `maxVisible`, hides the oldest toast of the lowest severity (success/info before warning before error). */\n private enforceLimit(): void {\n const max = this.options.maxVisible;\n while (max > 0 && this.toasts.length > max) {\n const lowest = Math.min(...this.toasts.map(toast => SEVERITY[toast.style]));\n const victim = this.toasts.find(toast => SEVERITY[toast.style] === lowest);\n if (!victim) {\n return;\n }\n this.hideToast(victim);\n }\n }\n\n private hideToast(toast: ActiveToast): void {\n toast.ref.hide();\n this.activeNotifications.delete(toast.id);\n this.notificationOpenTimes.delete(toast.id);\n this.forget(toast.id);\n }\n\n private forget(id: string): void {\n const toast = this.toasts.find(entry => entry.id === id);\n if (toast) {\n clearTimeout(toast.timer);\n this.toasts = this.toasts.filter(entry => entry !== toast);\n }\n }\n\n private addDetailsButton(notificationId: string, title: string, details: string, level: 'error' | 'warning'): void {\n // Called once the notification is rendered: find it by the unique class and modify its content\n {\n const notification = document.querySelector(`.notification-${notificationId}`);\n if (notification) {\n const contentEl = notification.querySelector('.k-notification-content');\n if (contentEl && !contentEl.querySelector('.notification-details-btn')) {\n // Create wrapper div\n const wrapper = document.createElement('div');\n wrapper.style.cssText = 'display: flex; align-items: center; justify-content: space-between; width: 100%; gap: 10px;';\n\n // Create text span\n const textSpan = document.createElement('span');\n textSpan.style.cssText = 'flex: 1; overflow: hidden; text-overflow: ellipsis;';\n textSpan.textContent = title;\n\n // Create details button with icon only\n const detailsBtn = document.createElement('button');\n detailsBtn.className = 'k-button k-button-sm k-button-flat k-button-flat-base notification-details-btn';\n detailsBtn.style.cssText = 'flex-shrink: 0; width: 32px; height: 32px; padding: 8px; display: flex; align-items: center; justify-content: center;';\n detailsBtn.innerHTML = this.createSvgIcon();\n // Icon-only: tooltip and accessible name (AB#6222, action guideline §2.2).\n detailsBtn.type = 'button';\n detailsBtn.title = this.messages.showDetails;\n detailsBtn.setAttribute('aria-label', this.messages.showDetails);\n detailsBtn.onclick = (event) => {\n event.stopPropagation();\n this.messageDetailsDialogService.showDetailsDialog({\n title,\n details,\n level\n });\n };\n\n // Assemble the elements\n wrapper.appendChild(textSpan);\n wrapper.appendChild(detailsBtn);\n\n // Replace content\n contentEl.innerHTML = '';\n contentEl.appendChild(wrapper);\n }\n }\n }\n }\n}\n","import { Injectable, inject, OnDestroy } from '@angular/core';\nimport { MessageService } from '@meshmakers/shared-services';\nimport { NotificationDisplayService } from './notification-display.service';\nimport { Subscription } from 'rxjs';\n\n/**\n * Service that listens to MessageService events and displays them as UI notifications.\n * This service should be initialized at app startup to ensure all messages are displayed.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class MessageListenerService implements OnDestroy {\n private readonly messageService = inject(MessageService);\n private readonly notificationDisplay = inject(NotificationDisplayService);\n private subscription?: Subscription;\n\n /**\n * Starts listening to messages from MessageService and displays them as notifications.\n * Call this once at application startup.\n */\n initialize(): void {\n if (this.subscription) {\n return; // Already initialized\n }\n\n // Subscribe to the new message stream\n this.subscription = this.messageService.messages$.subscribe(message => {\n switch (message.level) {\n case 'error':\n this.notificationDisplay.showError(message.message, message.details);\n break;\n case 'warning':\n this.notificationDisplay.showWarning(message.message, message.details);\n break;\n case 'info':\n this.notificationDisplay.showInfo(message.message);\n break;\n case 'success':\n this.notificationDisplay.showSuccess(message.message);\n break;\n }\n });\n }\n\n /**\n * Stops listening to messages\n */\n stop(): void {\n this.subscription?.unsubscribe();\n this.subscription = undefined;\n }\n\n ngOnDestroy(): void {\n this.stop();\n }\n}\n","import {Directive, TemplateRef, inject} from '@angular/core';\n\n/**\n * Marks an `<ng-template>` whose contents the list view renders inside its\n * toolbar, between the host's toolbar actions and the search box.\n *\n * It exists so a page can put its own scope/filter controls — view switches,\n * \"only in clarification\" toggles and the like — in the SAME band as the\n * table's search and options, instead of stacking a second strip above the\n * grid. Those controls steer the table, so they belong with the table's own\n * controls.\n *\n * A directive rather than plain `<ng-content>`: the toolbar itself lives in a\n * `kendoGridToolbarTemplate`, and content projected with `<ng-content>` cannot\n * be placed inside an `<ng-template>`. Capturing a TemplateRef and rendering it\n * with `ngTemplateOutlet` is the way to reach that spot.\n *\n * ```html\n * <mm-list-view ...>\n * <ng-template mmListViewFilters>\n * <kendo-buttongroup selection=\"single\" [attr.aria-label]=\"'Ansicht'\">…</kendo-buttongroup>\n * </ng-template>\n * </mm-list-view>\n * ```\n */\n@Directive({\n selector: '[mmListViewFilters]',\n standalone: true,\n})\nexport class ListViewFiltersDirective {\n public readonly templateRef = inject(TemplateRef<unknown>);\n}\n","import {Type} from '@angular/core';\nimport {SVGIcon} from '@progress/kendo-svg-icons';\n\n/**\n * Mapping configuration for a single status value to its visual representation\n */\nexport interface StatusIconMapping {\n /** The Kendo SVG icon to display */\n icon: SVGIcon;\n /** Tooltip text shown on hover */\n tooltip: string;\n /** Optional CSS color for the icon (e.g., 'green', '#28a745', 'var(--success-color)') */\n color?: string;\n}\n\n/**\n * Maps enum/status values to their icon representations\n * Key is the enum value (e.g., 'OK', 'MAINTENANCE'), value is the visual config\n */\nexport type StatusMapping = Record<string, StatusIconMapping>;\n\n/**\n * Configuration for a single field in a multi-field status icons column\n */\nexport interface StatusFieldConfig {\n /** The field name in the data object */\n field: string;\n /** Mapping of field values to icons */\n statusMapping: StatusMapping;\n}\n\n/**\n * Visual configuration for one possible value in a `badge` column. Lets host apps map enum-style\n * cell values onto a tinted text pill — e.g. health states, lifecycle statuses, severity levels —\n * without forcing every consumer to roll their own custom cell template.\n */\nexport interface BadgeMapping {\n /** Foreground text colour (CSS colour). Defaults to the host theme's `--badge-text-default`. */\n color?: string;\n /** Background colour (CSS colour). Defaults to the host theme's `--badge-bg-default`. */\n backgroundColor?: string;\n /** Border colour. Defaults to the resolved background. */\n borderColor?: string;\n /** Optional tooltip shown on hover. */\n tooltip?: string;\n /** Override the displayed label. When omitted, the cell renders the raw field value. */\n label?: string;\n}\n\n/** Maps an enum-style cell value to its badge appearance. Keys compared with the raw value via String(). */\nexport type BadgeMappingTable = Record<string, BadgeMapping>;\n\nexport interface TableColumn {\n displayName?: string | null;\n field: string;\n /**\n * How the cell renders and filters. `booleanIcon` (AB#5623) shows a boolean as a check / x icon\n * named \"<column>: Yes|No\" for screen readers (`role=\"img\"` + `aria-label`, texts from\n * `messages.booleanYes` / `booleanNo`) and filters like `boolean`; see {@link booleanIcons}.\n */\n dataType?: 'text' | 'numeric' | 'numericRange' | 'boolean' | 'booleanIcon' | 'date' | 'iso8601' | 'bytes' | 'statusIcons' | 'cronExpression' | 'progressBar' | 'badge' | 'component';\n format?: string;\n /**\n * Column width in pixels. If not set, the column will auto-size.\n */\n width?: number;\n /**\n * Minimum width in pixels for auto-sized columns (columns without `width`).\n * Without it, fixed-width siblings can squeeze an auto column to zero on narrow\n * viewports. When the available space per auto column drops below this value, the\n * column is pinned to `minWidth` and the grid overflows into a horizontal scrollbar\n * instead of collapsing the column. Also applied as the Kendo `minResizableWidth`,\n * so user resizing cannot shrink the column below it either.\n */\n minWidth?: number;\n /**\n * Hides the column while the list view is narrower than this many pixels.\n * Measured against the component's own width (not the browser viewport), so the\n * column set also adapts when surrounding layout (drawer, split panes) takes space.\n * Use it to declare column priority: give low-value detail columns a breakpoint so\n * the identifying columns keep their room on small screens.\n */\n hideBelow?: number;\n /**\n * Horizontal alignment of the column's header and cells. Defaults to the\n * grid's start alignment. Amount and quantity columns should be `'right'`:\n * right-aligned figures line up on the decimal separator so magnitudes can\n * be compared down the column, and the cell additionally renders with\n * tabular (fixed-width) digits so the digits themselves line up too.\n */\n align?: 'left' | 'center' | 'right';\n /**\n * Status mapping for single-field statusIcons columns.\n * Use this when the column displays icons for a single field.\n */\n statusMapping?: StatusMapping;\n /**\n * Configuration for multi-field statusIcons columns.\n * Use this when multiple fields should be displayed as icons in a single column.\n * When set, 'field' is ignored and each entry in 'statusFields' defines its own field.\n */\n statusFields?: StatusFieldConfig[];\n /**\n * Whether sorting is enabled for this column.\n * When not set, inherits from the grid-level sortable setting.\n * Set to false to disable sorting for computed or client-side-only columns.\n */\n sortable?: boolean;\n /**\n * Whether filtering is enabled for this column.\n * When not set, defaults to true (filterable).\n * Set to false to hide the filter cell for this column when row filtering is active.\n */\n filterable?: boolean;\n /**\n * Default filter operator for the row filter.\n * For numeric columns, defaults to 'eq'. Set to 'gte' for range-style filtering.\n */\n filterOperator?: string;\n /**\n * Dropdown filter options for the row filter.\n * When set, the column's row filter renders a dropdown instead of a text input.\n * Each option has a display text and a value used for filtering.\n */\n filterOptions?: { text: string; value: string }[];\n /**\n * Mapping of raw cell values to badge appearances (only consulted for `dataType: 'badge'`).\n * Values not in the mapping fall back to the neutral default badge styling, so callers don't\n * have to handle every possible enum value explicitly.\n */\n badgeMapping?: BadgeMappingTable;\n /**\n * When true, values without a `badgeMapping` entry render an empty cell instead of the\n * neutral raw-value pill (only consulted for `dataType: 'badge'`). Use for flag-style\n * columns where only some values carry a badge — e.g. a boolean marker column that shows\n * a pill for `true` and nothing (rather than a \"false\" pill) for `false`.\n */\n badgeHideUnmapped?: boolean;\n /**\n * Icons of a `booleanIcon` column (AB#5623). Default: a check for `true`, an x for `false`.\n * Set `false: null` to leave `false` cells empty (flag columns); `null` / `undefined` values\n * always render an empty cell. Colours default to the theme tokens\n * `--mm-list-boolean-true-color` / `--mm-list-boolean-false-color`.\n */\n booleanIcons?: BooleanIconMapping;\n /**\n * Optional callback that produces the cell's display string.\n * When set, this overrides the default rendering selected by `dataType`.\n * Filter/sort behaviour still follow `dataType` and the underlying `field` value,\n * so sorting on a numeric column with a currency formatter still sorts numerically.\n *\n * @example\n * ```ts\n * { field: 'grossTotal', dataType: 'numeric',\n * formatter: (value) => new Intl.NumberFormat('de-AT', { style: 'currency', currency: 'EUR' })\n * .format(Number(value)) }\n * ```\n */\n formatter?: (value: unknown, item: unknown) => string;\n /**\n * When true, cell content is rendered on a single line and clipped with an ellipsis.\n * The full value is exposed via a native `title` tooltip on hover, so long strings\n * (e.g. error messages, log lines) stay readable without bloating row heights.\n * Intended for text-style cells; has no visual effect on columns whose content is\n * already a fixed-size widget (statusIcons, progressBar, badge, …).\n */\n truncate?: boolean;\n /**\n * Standalone component to instantiate inside the cell for `dataType: 'component'` columns.\n * The grid renders the component via `*ngComponentOutlet`, with `cellInputs` supplying\n * its `@Input()` bindings per row. Use this when the cell needs internal state\n * (polling, async data, animation) that a static formatter cannot provide.\n */\n cellComponent?: Type<unknown>;\n /**\n * Builds the `@Input()` bindings for the component instance from the row's data item.\n * Called once per row when the cell is rendered. Return values are forwarded verbatim\n * to `*ngComponentOutlet`'s `inputs` map (keyed by the @Input() property name).\n */\n cellInputs?: (item: unknown) => Record<string, unknown>;\n}\n\n/** Icons of a `booleanIcon` column (AB#5623). */\nexport interface BooleanIconMapping {\n /** Icon for `true`. Default: a check icon. */\n true?: SVGIcon;\n /** Icon for `false`; `null` = no icon (empty cell). Default: an x icon. */\n false?: SVGIcon | null;\n /** CSS colour of the `true` icon. Default: `var(--mm-list-boolean-true-color, var(--kendo-color-success))`. */\n trueColor?: string;\n /** CSS colour of the `false` icon. Default: `var(--mm-list-boolean-false-color, var(--kendo-color-subtle))`. */\n falseColor?: string;\n}\n\nexport type ColumnDefinition =\n | string\n | TableColumn;\n\nexport type ContextMenuType = 'contextMenu' | 'actionMenu';\n\n/**\n * Callback for applying CSS classes to individual grid rows based on data.\n * Mirrors Kendo Grid's RowClassFn signature.\n *\n * @example\n * ```typescript\n * rowClassFn = (context: { dataItem: any; index: number }) => ({\n * 'row-warning': context.dataItem.status === 'warn',\n * 'row-error': context.dataItem.status === 'error'\n * });\n * ```\n */\nexport type RowClassFn = (context: { dataItem: unknown; index: number }) => string | string[] | Set<string> | Record<string, boolean>;\n\n/**\n * Translatable messages for the ListViewComponent.\n * Pass translated strings to override the English defaults.\n *\n * Members added after the interface was first published are optional, so an app that builds a\n * complete `ListViewMessages` object for an older library version keeps compiling; a member that\n * is missing (or `undefined`) falls back to {@link DEFAULT_LIST_VIEW_MESSAGES}. New members must\n * be added as optional for the same reason.\n */\nexport interface ListViewMessages {\n /** Search input placeholder. Default: \"Search in all columns...\" */\n searchPlaceholder: string;\n /** Tooltip for \"Show Row Filter\" button. Default: \"Show Row Filter\" */\n showRowFilter: string;\n /** Tooltip for \"Export to Excel\" button. Default: \"Export to Excel\" */\n exportToExcel: string;\n /** Tooltip for \"Export to PDF\" button. Default: \"Export to PDF\" */\n exportToPdf: string;\n /** Tooltip for \"Refresh Data\" button. Default: \"Refresh Data\" */\n refreshData: string;\n /** Tooltip for the \"Reset Filters\" button. Default: \"Reset Filters\". Optional (added in 3.4). */\n resetFilters?: string;\n /** Tooltip for the collapsed command menu. Default: \"Commands\". Optional (added in 3.4). */\n commands?: string;\n /** Title for the actions command column. Default: \"Actions\" */\n actionsColumnTitle: string;\n /** Accessible name of a row's menu button; `{name}` = the row's name. Default: \"Actions for {name}\" */\n rowActionsFor?: string;\n /** Accessible name of a row's menu button when the row has no name. Default: \"Row actions\" */\n rowActions?: string;\n /** Disabled reason of a row action whose `CommandItem` has no `disabledReason` (AB#5572). Default: \"Not available for this row\" */\n rowActionUnavailable?: string;\n /** Disabled reason of every row action while the list loads (AB#5572). Default: \"The list is loading\" */\n rowActionsLoading?: string;\n /** PDF footer page template. Default: \"Page {pageNum} of {totalPages}\" */\n pdfPageTemplate: string;\n\n // Kendo Grid pager messages\n /** Pager: text after page size selector. Default: \"items per page\" */\n pagerItemsPerPage: string;\n /** Pager: \"of\" text between page number and total. Default: \"of\" */\n pagerOf: string;\n /** Pager: text after total count. Default: \"items\" */\n pagerItems: string;\n /** Pager: text before page input. Default: \"Page\" */\n pagerPage: string;\n /** Pager: first page button tooltip. Default: \"Go to the first page\" */\n pagerFirstPage: string;\n /** Pager: last page button tooltip. Default: \"Go to the last page\" */\n pagerLastPage: string;\n /** Pager: previous page button tooltip. Default: \"Go to the previous page\" */\n pagerPreviousPage: string;\n /** Pager: next page button tooltip. Default: \"Go to the next page\" */\n pagerNextPage: string;\n /** Grid: no records message. Default: \"No records available.\" */\n noRecords: string;\n /** Empty state title while a search or filter matches nothing (`emptyState` set, AB#3444). Default: \"No results\". Optional. */\n noResultsTitle?: string;\n /** Empty state text while a search or filter matches nothing (AB#3444). Default: \"Nothing matches the current search or filter.\" Optional. */\n noResultsText?: string;\n /** Accessible value of a `booleanIcon` cell that is true (AB#5623). Default: \"Yes\". Optional. */\n booleanYes?: string;\n /** Accessible value of a `booleanIcon` cell that is false (AB#5623). Default: \"No\". Optional. */\n booleanNo?: string;\n /** Accessible name of a `booleanIcon` cell; `{column}` = column name, `{value}` = Yes / No (AB#5623). Default: \"{column}: {value}\". Optional. */\n booleanIconLabel?: string;\n}\n\n/**\n * Texts of the list's shared empty state (`mm-list-view [emptyState]`, AB#3444). `title` / `text`\n * describe a list without records (\"No data flows yet\"); the `filtered*` texts override the\n * \"no results\" texts of {@link ListViewMessages} while a search or filter is active.\n */\nexport interface MmListEmptyState {\n title: string;\n text?: string | null;\n filteredTitle?: string | null;\n filteredText?: string | null;\n}\n\n/** Template context of `mm-list-view [emptyTemplate]` (AB#3444). */\nexport interface MmListEmptyContext {\n /** Same as `filtered`. */\n $implicit: boolean;\n /** A search, row filter or host filter is active (an empty list means \"no results\"). */\n filtered: boolean;\n}\n\n/**\n * One entry of the list toolbar's command group (row filter, exports, reset,\n * refresh). Rendered as a laid-out icon button when the list is wide enough,\n * and as a menu item once the commands collapse.\n */\nexport interface ListViewCommand {\n id: 'rowFilter' | 'excel' | 'pdf' | 'reset' | 'refresh';\n text: string;\n svgIcon: SVGIcon;\n}\n\n/**\n * Default English messages for the ListViewComponent. Complete: every member, including the\n * optional ones, has a value.\n */\nexport const DEFAULT_LIST_VIEW_MESSAGES: Required<ListViewMessages> = {\n searchPlaceholder: 'Search in all columns...',\n showRowFilter: 'Show Row Filter',\n exportToExcel: 'Export to Excel',\n exportToPdf: 'Export to PDF',\n refreshData: 'Refresh Data',\n resetFilters: 'Reset Filters',\n commands: 'Commands',\n actionsColumnTitle: 'Actions',\n rowActionsFor: 'Actions for {name}',\n rowActions: 'Row actions',\n rowActionUnavailable: 'Not available for this row',\n rowActionsLoading: 'The list is loading',\n pdfPageTemplate: 'Page {pageNum} of {totalPages}',\n pagerItemsPerPage: 'items per page',\n pagerOf: 'of',\n pagerItems: 'items',\n pagerPage: 'Page',\n pagerFirstPage: 'Go to the first page',\n pagerLastPage: 'Go to the last page',\n pagerPreviousPage: 'Go to the previous page',\n pagerNextPage: 'Go to the next page',\n noRecords: 'No records available.',\n noResultsTitle: 'No results',\n noResultsText: 'Nothing matches the current search or filter.',\n booleanYes: 'Yes',\n booleanNo: 'No',\n booleanIconLabel: '{column}: {value}',\n};\n\n/**\n * Merges app-supplied list-view messages over {@link DEFAULT_LIST_VIEW_MESSAGES}. Members that\n * are missing, `undefined` or `null` keep their default, so an app compiled against an older\n * `ListViewMessages` shape (or one that leaves a translation unset) never renders an empty label.\n */\nexport function resolveListViewMessages(\n messages: Partial<ListViewMessages> | null | undefined\n): Required<ListViewMessages> {\n const resolved: Required<ListViewMessages> = { ...DEFAULT_LIST_VIEW_MESSAGES };\n if (!messages) {\n return resolved;\n }\n for (const key of Object.keys(messages) as (keyof ListViewMessages)[]) {\n const value = messages[key];\n if (value !== undefined && value !== null) {\n resolved[key] = value;\n }\n }\n return resolved;\n}\n","import {Pipe, PipeTransform} from '@angular/core';\n\n@Pipe({\n standalone: true,\n name: 'pascalCase'\n})\nexport class PascalCasePipe implements PipeTransform {\n transform(value: string): string {\n if (!value) return value;\n return value.charAt(0).toUpperCase() + value.slice(1);\n }\n}\n","import {State} from '@progress/kendo-data-query/dist/npm/state';\nimport {BehaviorSubject, Observable} from 'rxjs';\nimport {ListViewComponent} from '../list-view/list-view.component';\nimport {EventEmitter, signal} from '@angular/core';\nimport {FetchResult} from '../models/fetchResult';\n\nexport interface FetchDataOptions {\n state: State;\n textSearch: string | null;\n /** When true, bypass cache and fetch fresh data from the server */\n forceRefresh?: boolean;\n}\n\nexport interface FetchAgainOptions {\n /**\n * Reset paging to page 1 before refetching. Pass `true` whenever the data\n * source's own filters (quick-view/bar filters outside the Kendo grid state)\n * changed: the result set changes, so the current page offset would point\n * into stale data or past the end — mirroring `notifyFilterChange()` and the\n * text-search path, which already reset the page.\n */\n resetSkip?: boolean;\n}\n\nexport abstract class DataSourceBase {\n\n public readonly fetchAgainEvent = new EventEmitter<FetchAgainOptions | undefined>()\n\n private readonly _isLoading$ = new BehaviorSubject<boolean>(false);\n\n /** Observable indicating if the data source is currently loading data */\n public readonly isLoading$ = this._isLoading$.asObservable();\n\n /** Current loading state */\n public get isLoading(): boolean {\n return this._isLoading$.value;\n }\n\n private readonly _totalCount = signal<number | null>(null);\n\n /**\n * Total row count reported by the last fetch (`null` before the first result).\n * Kept current by MmListViewDataBindingDirective; lets host pages show the\n * overall count (e.g. in a header badge) without a second query.\n */\n public readonly totalCount = this._totalCount.asReadonly();\n\n /** Set the total row count (called by MmListViewDataBindingDirective) */\n public setTotalCount(count: number | null): void {\n this._totalCount.set(count);\n }\n\n protected constructor(public readonly listViewComponent: ListViewComponent) {\n }\n\n /** Set the loading state (called by MmListViewDataBindingDirective) */\n public setLoading(loading: boolean): void {\n this._isLoading$.next(loading);\n }\n\n public fetchAgain(options?: FetchAgainOptions): void {\n this.fetchAgainEvent.emit(options);\n }\n\n /**\n * Whether a failed fetch means the requested page offset lies beyond the\n * (shrunken) result set. MmListViewDataBindingDirective then recovers by\n * resetting to page 1 and refetching once instead of silently keeping the\n * previous rows on screen. Protocol-specific subclasses (e.g. the OctoMesh\n * GraphQL data source) override this; the default cannot tell and says no.\n */\n public isPageOutOfRangeError(_error: unknown): boolean {\n return false;\n }\n\n public abstract fetchData(queryOptions: FetchDataOptions): Observable<FetchResult | null>;\n}\n","import { Injectable } from '@angular/core';\nimport {\n CompositeFilterDescriptor,\n FilterDescriptor,\n SortDescriptor,\n State,\n isCompositeFilterDescriptor,\n} from '@progress/kendo-data-query';\n\n/**\n * The slice of a Kendo grid {@link State} that is worth persisting for a list\n * view: the user's sort, row filter and current page offset. `take`/`pageSize`\n * is deliberately excluded — in `autoPageSize` mode it is re-derived from the\n * viewport on every load, so persisting it is pointless (and restoring it would\n * fight the measurement).\n */\nexport interface PersistedListState {\n sort?: SortDescriptor[];\n filter?: CompositeFilterDescriptor;\n skip?: number;\n /** Free-text \"search all columns\" value — lives outside the Kendo state. */\n textSearch?: string | null;\n /**\n * App-owned extra state stored under the same list key — e.g. the coarse\n * \"quick view\" / bar filters (category, view, date range) that live in app\n * signals rather than the Kendo grid state. Opaque to this service; the host\n * app defines the shape. Written via {@link ListStateService.saveExtra} and\n * preserved by the directive's own {@link ListStateService.save}.\n */\n extra?: unknown;\n}\n\n/** Matches ISO-8601 date/date-time strings that JSON.stringify produces from a Date. */\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/;\n\n/**\n * Persists list-view sort/filter/paging per list so users do not have to\n * re-apply them on every visit. Central to shared-ui so every app gets the\n * behaviour for free (see {@link ListViewComponent.listStateKey}).\n *\n * Storage is a single namespaced blob in localStorage (survives reloads and\n * browser restarts), keyed by list — mirroring {@link WindowStateService}'s\n * `mm-window-states` map pattern. Every access is guarded: a corrupt or\n * unavailable store must never break a list, it just falls back to no state.\n */\n@Injectable({ providedIn: 'root' })\nexport class ListStateService {\n private readonly storageKey = 'mm-list-view-state';\n\n /** Returns the persisted state for `key`, with date filter values re-hydrated to `Date`. */\n load(key: string): PersistedListState | null {\n const all = this.loadAll();\n const entry = all[key];\n if (!entry) {\n return null;\n }\n // JSON round-trips Date -> ISO string; the Kendo date filter cell needs a\n // real Date back or date filtering/display breaks after restore.\n if (entry.filter) {\n this.reviveFilterDates(entry.filter);\n }\n return entry;\n }\n\n /**\n * Stores the sort/filter/skip slice of `state` for `key` plus the free-text\n * search (which lives outside the Kendo state). `take` is intentionally dropped.\n */\n save(key: string, state: State, textSearch?: string | null): void {\n const all = this.loadAll();\n all[key] = {\n // Preserve any app-owned `extra` (bar filters) written via saveExtra().\n ...all[key],\n sort: state.sort,\n filter: state.filter,\n skip: state.skip,\n textSearch: textSearch ?? null,\n };\n this.saveAll(all);\n }\n\n /**\n * Stores app-owned extra state (e.g. quick-view/bar filters) under `key`,\n * merging into the same entry as the grid state without clobbering it.\n */\n saveExtra(key: string, extra: unknown): void {\n const all = this.loadAll();\n all[key] = { ...all[key], extra };\n this.saveAll(all);\n }\n\n /** Returns the app-owned extra state stored under `key`, or null. */\n loadExtra<T>(key: string): T | null {\n const all = this.loadAll();\n return (all[key]?.extra as T) ?? null;\n }\n\n /** Drops the stored state for `key`. */\n clear(key: string): void {\n const all = this.loadAll();\n if (key in all) {\n delete all[key];\n this.saveAll(all);\n }\n }\n\n private reviveFilterDates(filter: CompositeFilterDescriptor): void {\n for (const f of filter.filters) {\n if (isCompositeFilterDescriptor(f)) {\n this.reviveFilterDates(f);\n continue;\n }\n const leaf = f as FilterDescriptor;\n if (typeof leaf.value === 'string' && ISO_DATE.test(leaf.value)) {\n const parsed = new Date(leaf.value);\n if (!Number.isNaN(parsed.getTime())) {\n leaf.value = parsed;\n }\n }\n }\n }\n\n private loadAll(): Record<string, PersistedListState> {\n try {\n const raw = localStorage.getItem(this.storageKey);\n return raw ? (JSON.parse(raw) as Record<string, PersistedListState>) : {};\n } catch {\n return {};\n }\n }\n\n private saveAll(all: Record<string, PersistedListState>): void {\n try {\n localStorage.setItem(this.storageKey, JSON.stringify(all));\n } catch {\n // localStorage full or unavailable — persistence is best-effort.\n }\n }\n}\n","import { ChangeDetectorRef, Directive, OnDestroy, OnInit, inject } from '@angular/core';\nimport {DataBindingDirective, DataStateChangeEvent, GridComponent} from '@progress/kendo-angular-grid';\nimport {CompositeFilterDescriptor, State} from '@progress/kendo-data-query';\nimport {Observable, of, Subscription} from 'rxjs';\nimport {DataSourceBase, FetchAgainOptions} from '../data-sources/data-source-base';\nimport {ListStateService} from '../services/list-state.service';\n\n@Directive({\n selector: '[mmListViewDataBinding]',\n})\nexport class MmListViewDataBindingDirective extends DataBindingDirective implements OnInit, OnDestroy {\n private readonly dataSource = inject(DataSourceBase, { optional: true, skipSelf: true })!;\n private readonly listStateService = inject(ListStateService);\n\n /** Observable indicating if the data source is currently loading data */\n public get isLoading$(): Observable<boolean> {\n return this.dataSource?.isLoading$ ?? of(false);\n }\n\n /** Current loading state */\n public get isLoading(): boolean {\n return this.dataSource?.isLoading ?? false;\n }\n\n /**\n * Read-only view of the grid state (filter, sort, skip, take) Kendo keeps\n * protected on the base directive. The list view consults it to decide\n * whether anything is filtered right now.\n */\n public get currentState(): State {\n return this.state;\n }\n\n private _serviceSubscription: Subscription | null;\n private _executeFilterSubscription: Subscription | null;\n private _fetchAgainSubscription: Subscription | null;\n private _refreshDataSubscription: Subscription | null;\n private _textSearchValue: string | null = null;\n private _forceRefresh = false;\n\n constructor() {\n const grid = inject(GridComponent);\n const changeDetector = inject(ChangeDetectorRef);\n\n super(grid, changeDetector);\n this._serviceSubscription = null;\n this._executeFilterSubscription = null;\n this._fetchAgainSubscription = null;\n this._refreshDataSubscription = null;\n }\n\n public override ngOnInit(): void {\n super.ngOnInit();\n\n if (!this.dataSource) {\n return;\n }\n\n this._fetchAgainSubscription = this.dataSource.fetchAgainEvent.subscribe((options?: FetchAgainOptions) => {\n this._forceRefresh = true;\n // A data source refetching because its own (bar/quick-view) filters\n // changed must return to page 1 — same invariant as notifyFilterChange()\n // and the text-search path. A plain refresh keeps the current page.\n if (options?.resetSkip) {\n this.skip = 0;\n }\n this.rebind();\n if (options?.resetSkip) {\n this.persistState();\n }\n });\n\n this._executeFilterSubscription = this.dataSource.listViewComponent.onExecuteFilter.subscribe((value: string | null) => {\n this._textSearchValue = value;\n // A changed search term changes the result set — the current page offset\n // would point into stale data (or past the end), so return to page 1.\n this.skip = 0;\n this.rebind();\n this.persistState();\n });\n\n this._refreshDataSubscription = this.dataSource.listViewComponent.onRefreshData.subscribe(() => {\n this._forceRefresh = true;\n this.rebind();\n });\n\n // Restore the persisted sort/filter/page BEFORE the first fetch so the\n // initial rebind() already reflects the user's remembered view.\n this.restoreState();\n\n this.rebind();\n }\n\n public override ngOnDestroy(): void {\n this._serviceSubscription?.unsubscribe();\n this._executeFilterSubscription?.unsubscribe();\n this._fetchAgainSubscription?.unsubscribe();\n this._refreshDataSubscription?.unsubscribe();\n super.ngOnDestroy();\n }\n\n // noinspection JSUnusedGlobalSymbols\n\n /**\n * Triggers a rebind when the filter state changes programmatically.\n * Syncs the grid's filter into the DataBindingDirective state before rebinding.\n * Resets `skip` to page 1: a changed filter changes the result set, so the\n * current page offset would point into stale data or past the end (Kendo's\n * own filter-row path does the same reset via its dataStateChange event).\n */\n public notifyFilterChange(filter: CompositeFilterDescriptor): void {\n this.state.filter = filter;\n this.skip = 0;\n this.rebind();\n this.persistState();\n }\n\n /**\n * Applies a programmatic page-size change (fit-to-height mode of mm-list-view).\n * The inherited setters sync grid and query state; `skip` is realigned to the\n * new page grid so the pager stays on a valid page, then the data is refetched.\n */\n public applyPageSize(take: number): void {\n const skip = this.state.skip ?? 0;\n this.pageSize = take;\n this.skip = Math.floor(skip / take) * take;\n this.rebind();\n this.persistState();\n }\n\n /**\n * Kendo emits this for header-sort clicks, the built-in filter row and the\n * pager. Persist the resulting state so those interactions survive a revisit.\n */\n public override onStateChange(state: DataStateChangeEvent): void {\n super.onStateChange(state);\n this.persistState();\n }\n\n /** Effective per-list storage key, or null when persistence is disabled/unavailable. */\n private stateKey(): string | null {\n return this.dataSource?.listViewComponent?.resolveListStateKey() ?? null;\n }\n\n /**\n * Restores the persisted sort/filter/page into the grid state via the\n * inherited setters (which sync both the Kendo grid and the query state).\n * `take`/`pageSize` is intentionally not restored — it is the caller's\n * initial pageSize or the autoPageSize measurement.\n */\n private restoreState(): void {\n const key = this.stateKey();\n if (!key) {\n return;\n }\n const stored = this.listStateService.load(key);\n if (!stored) {\n return;\n }\n if (stored.sort) {\n this.sort = stored.sort;\n }\n if (stored.filter) {\n this.filter = stored.filter;\n }\n if (typeof stored.skip === 'number') {\n this.skip = stored.skip;\n }\n if (stored.textSearch) {\n // Drive the fetch and mirror the value into the search box display.\n this._textSearchValue = stored.textSearch;\n this.dataSource?.listViewComponent?.restoreSearchValue(stored.textSearch);\n }\n }\n\n /**\n * Clears all filtering for this list back to the default view: row filter,\n * column sort, free-text search and page offset, and drops the persisted\n * entry (incl. any app-owned bar filters) so nothing is restored next visit.\n * The app-side bar filters are reset by the host via\n * {@link ListViewComponent.onResetFilters}.\n */\n public resetState(): void {\n this.sort = [];\n this.filter = { logic: 'and', filters: [] };\n this.skip = 0;\n this._textSearchValue = null;\n const key = this.stateKey();\n if (key) {\n this.listStateService.clear(key);\n }\n this.rebind();\n }\n\n /** Writes the current sort/filter/skip + free-text search for this list to storage (best-effort). */\n private persistState(): void {\n const key = this.stateKey();\n if (!key) {\n return;\n }\n this.listStateService.save(key, this.state, this._textSearchValue);\n }\n\n public override rebind(): void {\n try {\n if (!this.dataSource) {\n return;\n }\n // Cancel a still-running fetch before starting a new one. Without this,\n // overlapping fetches (sort/page click while a load is in flight, or the\n // autoPageSize measurement refetch) race: whichever response arrives LAST\n // wins, so a stale response could overwrite newer data — e.g. an unsorted\n // page replacing the sorted one the user just requested.\n this._serviceSubscription?.unsubscribe();\n // Only use dataSource.setLoading() (tracked via isLoading$ / isLoading signal).\n // Do NOT set grid.loading directly — it triggers Kendo's internal loading overlay.\n this.dataSource.setLoading(true);\n const forceRefresh = this._forceRefresh;\n this._forceRefresh = false; // Reset for next call\n\n this._serviceSubscription = this.dataSource.fetchData({\n state: this.state,\n textSearch: this._textSearchValue,\n forceRefresh\n }).subscribe({\n next: value => {\n this.dataSource.setLoading(false);\n this.dataSource.setTotalCount(value?.totalCount ?? 0);\n this.grid.data = {\n data: (value?.data ?? []) as unknown[],\n total: value?.totalCount || 0\n }\n this.notifyDataChange();\n },\n error: (err) => {\n console.error('[MmListViewDataBinding] fetchData error:', err);\n this.dataSource.setLoading(false);\n // A restored/stale page offset can lie beyond the current result set\n // (persisted skip + changed filters, or data shrunk since the last\n // visit) — the server rejects the fetch and the grid would silently\n // keep showing the PREVIOUS rows under the NEW filters. Recover by\n // returning to page 1 once; skip === 0 cannot be out of range, so\n // this cannot loop.\n if ((this.state.skip ?? 0) > 0 && this.dataSource.isPageOutOfRangeError(err)) {\n this.skip = 0;\n this._forceRefresh = true;\n this.rebind();\n this.persistState();\n }\n }\n });\n } catch (e) {\n console.error('[MmListViewDataBinding] rebind() caught error:', e);\n this.dataSource.setLoading(false);\n }\n }\n}\n","import {SVGIcon} from '@progress/kendo-svg-icons';\nimport {\n arrowRotateCwIcon,\n calculatorIcon,\n cellsMergeIcon,\n clockArrowRotateIcon,\n copyIcon,\n downloadIcon,\n eraserIcon,\n exportIcon,\n eyeIcon,\n fileDataIcon,\n fileReportIcon,\n hyperlinkOpenIcon,\n importIcon,\n passwordIcon,\n pencilIcon,\n pinIcon,\n playIcon,\n plusIcon,\n stopIcon,\n trashIcon,\n undoIcon,\n unpinIcon,\n uploadIcon,\n xCircleIcon,\n} from '@progress/kendo-svg-icons';\n\n/**\n * One user action (AB#5570): a row action, a toolbar action or a page action. The same\n * definition drives the inline icon button, the overflow menu item and the text button, so\n * label, icon, danger styling and the disabled reason never diverge between them.\n *\n * See `octo-frontend-refinery-studio/docs/concepts/studio-action-guideline.md`.\n */\nexport interface MmAction<TId extends string = string> {\n /** Stable id, emitted with the event and rendered as `data-action` (tests, analytics). */\n id: TId;\n /**\n * Verb phrase in sentence case (\"Edit\", \"Delete dump\", \"Set value\"). Used as tooltip,\n * menu/button text (unless `menuLabel` is set) and — together with the row label — as the\n * accessible name. Never ends with \"…\"; put that into `menuLabel`.\n */\n label: string;\n /**\n * Visible text in menus and text buttons when it differs from `label` — typically the \"…\" of\n * actions that open a dialog (\"Delete dump…\"). Tooltips and accessible names keep `label`.\n * Falls back to `label`.\n */\n menuLabel?: string;\n /** Kendo SVG icon; take it from {@link MM_ACTION_ICONS} where a canonical icon exists. */\n icon?: SVGIcon;\n /** Destructive action: danger styling; the handler must confirm (danger dialog, named target). */\n danger?: boolean;\n /**\n * Why the action is not available right now. A non-empty reason disables the action\n * (`aria-disabled`, still focusable) and is announced via `aria-describedby` and shown in\n * the tooltip. `null`/`undefined`/`''` = enabled.\n */\n disabledReason?: string | null;\n /** `false` hides the action (no permission, not applicable to this row). Default: visible. */\n visible?: boolean;\n /** Always place the action in the overflow menu, even when there is room inline. */\n overflow?: boolean;\n /**\n * Navigation target. Inline the action renders as a real link (`routerLink`, open in new tab\n * works); in the overflow menu it navigates with the Router. `triggered` still fires.\n */\n link?: MmActionLink;\n}\n\n/** Router target of a navigating action (`Router.navigate(commands, {queryParams})`). */\nexport interface MmActionLink {\n commands: readonly unknown[] | string;\n queryParams?: Record<string, string>;\n}\n\n/** Emitted when an enabled action is triggered. */\nexport interface MmActionEvent<TId extends string = string> {\n id: TId;\n action: MmAction<TId>;\n}\n\n/** Default number of row action slots (inline buttons incl. the overflow button). */\nexport const MM_ROW_ACTIONS_MAX_INLINE = 3;\n\n/**\n * Canonical action icons (AB#5570). One verb, one icon, everywhere: pick from this map\n * instead of importing a Kendo icon ad hoc, so \"Edit\" never shows a gear in one list and a\n * pencil in the next.\n */\nexport const MM_ACTION_ICONS = {\n /** Create a new item (\"New adapter\", \"Add mapping\"). */\n add: plusIcon,\n /** Edit / open the editable form of the item. */\n edit: pencilIcon,\n /** Read-only view / preview. */\n view: eyeIcon,\n /** Open the item (or a related page) in its own view / new tab. */\n open: hyperlinkOpenIcon,\n /** Delete / remove the item (always `danger`). */\n delete: trashIcon,\n /** Clear a stored value without deleting the item (\"Not needed\", \"Clear secret\"). */\n clear: eraserIcon,\n /** Copy an id or value to the clipboard. */\n copy: copyIcon,\n /** Duplicate the item as a new item. */\n duplicate: fileDataIcon,\n /** Reload data. */\n refresh: arrowRotateCwIcon,\n /** Deploy to a pool / cluster. */\n deploy: uploadIcon,\n /** Undeploy. */\n undeploy: xCircleIcon,\n /** Run / execute / start. */\n run: playIcon,\n /** Stop / cancel a running job. */\n stop: stopIcon,\n /** Export data (file the user saves). */\n export: exportIcon,\n /** Import data. */\n import: importIcon,\n /** Download a file. */\n download: downloadIcon,\n /** Show a report / log. */\n report: fileReportIcon,\n /** Restore / roll back to a stored state (e.g. restore a dump); destructive restores are `danger`. */\n restore: undoIcon,\n /** Pin to a start page / favourites (\"Pin to Home\"). */\n pin: pinIcon,\n /** Remove a pin (\"Unpin from Home\"). */\n unpin: unpinIcon,\n /** Merge one item into another (e.g. merge users); usually `danger`. */\n merge: cellsMergeIcon,\n /** Reset / set a password. */\n resetPassword: passwordIcon,\n /** Fill a past time range from the source data (e.g. rollup backfill). */\n backfill: clockArrowRotateIcon,\n /** Recalculate derived values for a range (e.g. rollup recompute); not the same as `refresh`. */\n recompute: calculatorIcon,\n} as const satisfies Record<string, SVGIcon>;\n\nexport type MmActionIconName = keyof typeof MM_ACTION_ICONS;\n\n/** True when the action is disabled (non-empty {@link MmAction.disabledReason}). */\nexport function isActionDisabled(action: MmAction): boolean {\n return !!action.disabledReason && action.disabledReason.trim().length > 0;\n}\n\n/** True unless the action is explicitly hidden. */\nexport function isActionVisible(action: MmAction): boolean {\n return action.visible !== false;\n}\n\n/**\n * Accessible name of an action on a named target: \"Delete dump Encrypt run 2026-10-06 17:09\".\n * Without a target the label alone.\n */\nexport function actionAccessibleName(action: MmAction, targetLabel?: string | null): string {\n const target = (targetLabel ?? '').trim();\n return target ? `${action.label} ${target}` : action.label;\n}\n\n/** Tooltip: the label, plus the reason when disabled (\"Delete dump — Requires SecretManagement\"). */\nexport function actionTooltip(action: MmAction): string {\n return isActionDisabled(action) ? `${action.label} — ${action.disabledReason!.trim()}` : action.label;\n}\n\n/**\n * Splits visible actions into inline buttons and overflow-menu items. At most `maxInline`\n * slots are rendered: when the actions do not fit, the last slot becomes the overflow\n * button. Actions with `overflow: true` always go to the menu (and need the overflow slot).\n */\nexport function splitRowActions<TId extends string>(\n actions: readonly MmAction<TId>[],\n maxInline: number = MM_ROW_ACTIONS_MAX_INLINE,\n): { inline: MmAction<TId>[]; menu: MmAction<TId>[] } {\n const visible = actions.filter(isActionVisible);\n const forced = visible.filter((a) => a.overflow);\n const candidates = visible.filter((a) => !a.overflow);\n const slots = Math.max(1, Math.floor(maxInline));\n const needsMenu = forced.length > 0 || candidates.length > slots;\n if (!needsMenu) {\n return {inline: candidates, menu: []};\n }\n const inlineCount = Math.max(0, slots - 1);\n return {\n inline: candidates.slice(0, inlineCount),\n menu: [...candidates.slice(inlineCount), ...forced],\n };\n}\n","import {ChangeDetectionStrategy, booleanAttribute, Component, ViewEncapsulation, computed, input, output} from '@angular/core';\nimport {RouterLink} from '@angular/router';\nimport {ButtonModule} from '@progress/kendo-angular-buttons';\nimport {SVGIconModule} from '@progress/kendo-angular-icons';\nimport {\n MmAction,\n MmActionEvent,\n actionAccessibleName,\n actionTooltip,\n isActionDisabled,\n} from './action.model';\n\n/** Where the button sits; drives size, icon size (16 px rows, 20 px toolbars) and emphasis. */\nexport type MmActionContext = 'row' | 'toolbar' | 'page';\n\n/** What the button shows. Icon-only buttons always get a tooltip and an accessible name. */\nexport type MmActionDisplay = 'icon' | 'text' | 'icon-text';\n\nlet nextReasonId = 0;\n\n/**\n * One action as a button (AB#5570), rendered from a shared {@link MmAction} definition.\n *\n * - `display=\"icon\"`: icon-only, native tooltip = label (+ disabled reason), `aria-label`\n * = label + `targetLabel` (\"Delete dump Encrypt run 2026-10-06 17:09\").\n * - `display=\"text\"` / `\"icon-text\"`: visible label; `targetLabel` still extends the\n * accessible name when the same label repeats (one per row).\n * - Disabled (`disabledReason`): stays focusable, `aria-disabled=\"true\"`, the reason is\n * linked via `aria-describedby` and shown in the tooltip; clicks are swallowed.\n * - `danger`: Kendo `themeColor=\"error\"`. The consumer confirms before acting.\n * - `primary` (page/toolbar context only): solid primary button for the one main action.\n * - `link`: rendered as a real router link (`<a kendoButton [routerLink]>`, so open-in-new-tab\n * works); a disabled link action renders as a disabled button.\n *\n * ```html\n * <mm-action-button [action]=\"refresh\" context=\"toolbar\" (triggered)=\"reload()\" />\n * <mm-action-button [action]=\"newAdapter\" context=\"page\" display=\"icon-text\" primary (triggered)=\"create()\" />\n * ```\n */\n@Component({\n selector: 'mm-action-button',\n standalone: true,\n imports: [ButtonModule, RouterLink, SVGIconModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {class: 'mm-action-button-host', '[class.mm-action-button-host--disabled]': 'disabled()'},\n template: `\n @if (action().link && !disabled()) {\n <!-- kendoButton only matches <button>: the link carries the same Kendo button classes itself. -->\n <a\n class=\"mm-action-button\"\n [class]=\"linkClasses()\"\n [class.mm-action-button--danger]=\"!!action().danger\"\n [class.mm-action-button--icon-only]=\"iconOnly()\"\n [class.mm-action-button--toolbar]=\"context() !== 'row'\"\n [attr.title]=\"tooltip()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.data-action]=\"action().id\"\n [routerLink]=\"$any(action().link!.commands)\"\n [queryParams]=\"action().link!.queryParams ?? null\"\n (click)=\"onClick($event)\"\n >@if (showIcon()) {<kendo-svgicon class=\"k-button-icon\" [icon]=\"action().icon!\" />}@if (!iconOnly()) {<span class=\"k-button-text\">{{ visibleLabel() }}</span>}</a>\n } @else {\n <button\n kendoButton\n type=\"button\"\n class=\"mm-action-button\"\n [class.mm-action-button--disabled]=\"disabled()\"\n [class.mm-action-button--danger]=\"!!action().danger\"\n [class.mm-action-button--icon-only]=\"iconOnly()\"\n [class.mm-action-button--toolbar]=\"context() !== 'row'\"\n [svgIcon]=\"showIcon() ? action().icon! : $any(undefined)\"\n [size]=\"context() === 'row' ? 'small' : 'medium'\"\n [fillMode]=\"primary() && !action().danger ? 'solid' : 'flat'\"\n [themeColor]=\"action().danger ? 'error' : primary() ? 'primary' : 'base'\"\n [attr.title]=\"tooltip()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.data-action]=\"action().id\"\n [attr.aria-disabled]=\"disabled() ? 'true' : null\"\n [attr.aria-describedby]=\"disabled() ? reasonId : null\"\n (click)=\"onClick($event)\"\n >@if (!iconOnly()) { {{ visibleLabel() }} }</button>\n }\n @if (disabled()) {\n <span class=\"mm-action-button__reason\" [id]=\"reasonId\">{{ action().disabledReason }}</span>\n }\n `,\n styles: [`\n .mm-action-button-host { display: inline-flex; position: relative; }\n .mm-action-button--toolbar.mm-action-button--icon-only .k-svg-icon { width: 20px; height: 20px; }\n .mm-action-button--disabled { opacity: 0.45; cursor: not-allowed; }\n /* Keyboard focus ring from the theme (guideline §2.6), above Kendo's own focus shadow. */\n .mm-action-button-host .mm-action-button:focus-visible {\n outline: none;\n box-shadow: var(--theme-focus-ring, 0 0 0 2px #ffffff, 0 0 0 4px #2e8473);\n }\n /* Disabled reason: announced via aria-describedby, visually hidden ... */\n .mm-action-button__reason {\n position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;\n overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;\n }\n /* ... and shown as a hint bubble while the disabled action has keyboard focus (guideline §2.5). */\n .mm-action-button-host--disabled:has(.mm-action-button:focus-visible) .mm-action-button__reason {\n top: calc(100% + 4px); left: 0; z-index: 20;\n width: max-content; max-width: 280px; height: auto; margin: 0; overflow: visible; clip: auto;\n padding: var(--theme-space-1, 4px) var(--theme-space-2, 8px);\n white-space: normal; font-size: 0.75rem; line-height: 1.4;\n color: var(--theme-text-primary, #0f1c2e);\n background: var(--theme-bg-overlay, #ffffff);\n border: 1px solid var(--theme-border-default, rgba(7, 23, 43, 0.12));\n border-radius: var(--theme-radius-sm, 4px);\n box-shadow: var(--theme-shadow-popup, 0 8px 24px rgba(7, 23, 43, 0.14));\n pointer-events: none;\n }\n `],\n})\nexport class ActionButtonComponent<TId extends string = string> {\n /** The action definition. */\n readonly action = input.required<MmAction<TId>>();\n /** Name of the target (row) for the accessible name; required for repeated row actions. */\n readonly targetLabel = input<string | null | undefined>(undefined);\n readonly context = input<MmActionContext>('row');\n readonly display = input<MmActionDisplay>('icon');\n /** Solid primary emphasis — at most one per page header / toolbar. */\n readonly primary = input(false, {transform: booleanAttribute});\n\n /** Fires for enabled actions only. */\n readonly triggered = output<MmActionEvent<TId>>();\n\n protected readonly reasonId = `mm-action-reason-${nextReasonId++}`;\n protected readonly disabled = computed(() => isActionDisabled(this.action()));\n /** Icon-only needs an icon; without one the button falls back to its text. */\n protected readonly iconOnly = computed(() => this.display() === 'icon' && !!this.action().icon);\n /** Visible text: `menuLabel` (\"Delete dump…\") when set, else the label. */\n protected readonly visibleLabel = computed(() => this.action().menuLabel || this.action().label);\n protected readonly showIcon = computed(() => this.display() !== 'text' && !!this.action().icon);\n protected readonly tooltip = computed(() =>\n this.iconOnly() || this.disabled() ? actionTooltip(this.action()) : null);\n protected readonly ariaLabel = computed(() =>\n this.iconOnly() || this.targetLabel() ? actionAccessibleName(this.action(), this.targetLabel()) : null);\n\n /** Kendo button classes for the link variant (same look as `button[kendoButton]`). */\n protected readonly linkClasses = computed(() => {\n const size = this.context() === 'row' ? 'sm' : 'md';\n const fill = this.primary() && !this.action().danger ? 'solid' : 'flat';\n const theme = this.action().danger ? 'error' : this.primary() ? 'primary' : 'base';\n return ['k-button', `k-button-${size}`, `k-button-${fill}`, `k-button-${theme}`, 'k-rounded-md',\n this.iconOnly() ? 'k-icon-button' : ''].filter(Boolean).join(' ');\n });\n\n protected onClick(event: Event): void {\n if (this.disabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n const action = this.action();\n this.triggered.emit({id: action.id, action});\n }\n}\n","import {CommandItem} from '@meshmakers/shared-services';\nimport {MmAction, MmActionLink} from '../actions/action.model';\n\n/* eslint-disable @typescript-eslint/no-explicit-any -- row callbacks are declared by the host with its own row type */\n\n/**\n * A row action of `mm-list-view` (AB#5572), declared once per list from the shared action model\n * ({@link MmAction}): the per-row parts (`disabledReason`, `visible`, `link`) may be callbacks that\n * receive the row. Rendered with the guideline rules — neutral icon buttons (danger colour only for\n * `danger` actions), tooltip = label, accessible name = label + row name, at most\n * `maxInlineRowActions` slots (default 3; the last one becomes \"More actions for …\"), disabled\n * actions stay focusable and announce their reason.\n *\n * ```ts\n * protected readonly rowActions: MmListRowAction<AdapterDto>[] = [\n * { id: 'edit', label: 'Edit', icon: MM_ACTION_ICONS.edit, link: (row) => ({ commands: ['details', row.rtId] }) },\n * { id: 'delete', label: 'Delete', menuLabel: 'Delete…', icon: MM_ACTION_ICONS.delete, danger: true,\n * disabledReason: (row) => row.deployed ? 'Undeploy the adapter first' : null, run: (row) => this.delete(row) },\n * ];\n * ```\n * ```html\n * <mm-list-view [rowActions]=\"rowActions\" (rowAction)=\"onRowAction($event)\" … />\n * ```\n */\nexport interface MmListRowAction<TRow = any, TId extends string = string>\n extends Omit<MmAction<TId>, 'disabledReason' | 'visible' | 'link'> {\n /** Why the action is unavailable for this row; non-empty = disabled (focusable, announced). */\n disabledReason?: string | null | ((row: TRow) => string | null | undefined);\n /** `false` (or a callback returning false) hides the action for the row. */\n visible?: boolean | ((row: TRow) => boolean);\n /** Navigation target (inline: real router link; overflow menu: Router.navigate relative to the host route). */\n link?: MmActionLink | ((row: TRow) => MmActionLink | null | undefined);\n /** Optional handler; `(rowAction)` fires as well. Destructive handlers confirm first (danger dialog). */\n run?: (row: TRow) => void | Promise<void>;\n}\n\n/** Emitted by `(rowAction)` for an enabled row action. */\nexport interface MmListRowActionEvent<TRow = any, TId extends string = string> {\n id: TId;\n action: MmAction<TId>;\n row: TRow;\n}\n\n/**\n * One row action resolved for a concrete row: the rendered {@link MmAction} plus where it came from —\n * a legacy `CommandItem` (`actionCommandItems`, handled via the CommandItem's link / onClick) or a\n * {@link MmListRowAction} (`rowActions`).\n */\nexport interface ResolvedListRowAction {\n action: MmAction;\n commandItem?: CommandItem;\n rowAction?: MmListRowAction;\n}\n\n/**\n * Human label of a list row (AB#5623) — the row's name in row action names (\"Actions for <label>\"),\n * dialog titles and danger confirmations. Reads `field` (a dotted path such as `contact.displayName`\n * also works, a flat key with dots wins), then each of `fallbacks` (default `rtWellKnownName`,\n * `rtId`); the first non-blank value wins. `''` when none is set.\n */\nexport function resolveListRowLabel(\n row: unknown,\n field: string | null | undefined,\n fallbacks: readonly string[] = ['rtWellKnownName', 'rtId'],\n): string {\n const record = (row ?? {}) as Record<string, unknown>;\n for (const key of field ? [field, ...fallbacks] : fallbacks) {\n const value = readRowPath(record, key);\n if (value !== null && value !== undefined && typeof value !== 'object' && typeof value !== 'function' && String(value).trim() !== '') {\n return String(value);\n }\n }\n return '';\n}\n\nfunction readRowPath(row: Record<string, unknown>, path: string): unknown {\n if (path in row || path.indexOf('.') === -1) {\n return row[path];\n }\n let value: unknown = row;\n for (const key of path.split('.')) {\n if (value === null || value === undefined || typeof value !== 'object') {\n return undefined;\n }\n value = (value as Record<string, unknown>)[key];\n }\n return value;\n}\n\n/** Resolves the per-row callbacks of a {@link MmListRowAction}. */\nexport function resolveListRowAction(definition: MmListRowAction, row: unknown): MmAction {\n const {disabledReason, visible, link, run: _run, ...rest} = definition;\n return {\n ...rest,\n disabledReason: typeof disabledReason === 'function' ? disabledReason(row) ?? null : disabledReason ?? null,\n visible: typeof visible === 'function' ? visible(row) : visible,\n link: typeof link === 'function' ? link(row) ?? undefined : link,\n };\n}\n\n/** Structural equality of two rendered actions (keeps object identity stable across change detection). */\nexport function sameAction(a: MmAction, b: MmAction): boolean {\n return a.id === b.id && a.label === b.label && a.menuLabel === b.menuLabel && a.icon === b.icon\n && !!a.danger === !!b.danger && (a.disabledReason ?? null) === (b.disabledReason ?? null)\n && a.visible === b.visible && !!a.overflow === !!b.overflow && sameLink(a.link, b.link);\n}\n\nfunction sameLink(a: MmActionLink | undefined, b: MmActionLink | undefined): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n return JSON.stringify(a) === JSON.stringify(b);\n}\n","import {Pipe, PipeTransform} from '@angular/core';\n\n@Pipe({\n name: 'bytesToSize'\n})\nexport class BytesToSizePipe implements PipeTransform {\n\n public transform(value: number, decimals = 2): string {\n if (value === 0) {\n return '0 Bytes';\n }\n\n const k = 1024; // oder 1000, falls du SI-Berechnung bevorzugst\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n\n // Bestimme, in welcher Größenordnung der Wert liegt:\n const i = Math.floor(Math.log(value) / Math.log(k));\n\n // Umrechnen und Formatieren\n const result = parseFloat((value / Math.pow(k, i)).toFixed(dm));\n return `${result} ${sizes[i]}`;\n }\n}\n","import { Injectable } from '@angular/core';\nimport cronstrue from 'cronstrue';\nimport 'cronstrue/locales/de.js';\nimport 'cronstrue/locales/en.js';\n\n/**\n * Service for converting cron expressions to human-readable text.\n * Supports multiple locales (EN, DE).\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class CronHumanizerService {\n\n /**\n * Convert a cron expression to human-readable text\n * @param expression The cron expression (5 or 6 fields)\n * @param locale The locale for output ('en' | 'de')\n * @returns Human-readable description or error message\n */\n toHumanReadable(expression: string, locale = 'en'): string {\n if (!expression || expression.trim() === '') {\n return 'No schedule configured';\n }\n\n try {\n return cronstrue.toString(expression, {\n locale: this.normalizeLocale(locale),\n use24HourTimeFormat: true,\n verbose: false\n });\n } catch {\n // Return a friendly error message\n return 'Invalid cron expression';\n }\n }\n\n /**\n * Get a detailed description with additional context\n */\n toDetailedDescription(expression: string, locale = 'en'): {\n summary: string;\n frequency: string;\n timing: string;\n } {\n const summary = this.toHumanReadable(expression, locale);\n\n if (summary === 'Invalid cron expression' || summary === 'No schedule configured') {\n return {\n summary,\n frequency: '-',\n timing: '-'\n };\n }\n\n // Try to extract frequency and timing from the expression\n const parts = expression.trim().split(/\\s+/);\n let frequency = 'Custom';\n let timing = '-';\n\n if (parts.length >= 5) {\n const [second, minute, hour, dayOfMonth, , dayOfWeek] = parts;\n\n // Determine frequency\n if (second.includes('/')) {\n frequency = 'Every few seconds';\n } else if (minute.includes('/')) {\n frequency = 'Every few minutes';\n } else if (hour.includes('/')) {\n frequency = 'Hourly';\n } else if (dayOfMonth !== '*' && dayOfWeek === '*') {\n frequency = 'Monthly';\n } else if (dayOfWeek !== '*') {\n if (dayOfWeek === '1-5') {\n frequency = 'Weekdays';\n } else if (dayOfWeek === '0,6' || dayOfWeek === '6,0') {\n frequency = 'Weekends';\n } else {\n frequency = 'Weekly';\n }\n } else {\n frequency = 'Daily';\n }\n\n // Determine timing\n const hourNum = parseInt(hour, 10);\n const minuteNum = parseInt(minute, 10);\n if (!isNaN(hourNum) && !isNaN(minuteNum)) {\n timing = `${hourNum.toString().padStart(2, '0')}:${minuteNum.toString().padStart(2, '0')}`;\n } else if (hour.includes('/')) {\n timing = 'Recurring';\n }\n }\n\n return { summary, frequency, timing };\n }\n\n /**\n * Check if a locale is supported\n */\n isLocaleSupported(locale: string): boolean {\n const supported = ['en', 'de'];\n return supported.includes(this.normalizeLocale(locale));\n }\n\n /**\n * Get list of supported locales\n */\n getSupportedLocales(): { code: string; name: string }[] {\n return [\n { code: 'en', name: 'English' },\n { code: 'de', name: 'German' }\n ];\n }\n\n private normalizeLocale(locale: string): string {\n const normalized = locale.toLowerCase().split('-')[0];\n // Default to English if locale not supported\n return ['en', 'de'].includes(normalized) ? normalized : 'en';\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n InjectionToken,\n PLATFORM_ID,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n signal\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/** The OctoBot animations shipped with shared-ui (AB#3444). */\nexport type OctoBotAnimation = 'idle' | 'blink' | 'look' | 'swim' | 'thinking' | 'wave';\n\n/**\n * Image loading strategy (`loading` attribute): `lazy` (default) defers the request until the\n * figure nears the viewport; `eager` loads it right away — for places where the figure is visible\n * immediately (empty states, 404 / turned-off pages), so it does not pop in late.\n */\nexport type OctoBotLoading = 'lazy' | 'eager';\n\n/** Rendered sizes: `sm` 60 px, `md` 120 px, `lg` 240 px (square). */\nexport type OctoBotSize = 'sm' | 'md' | 'lg';\n\n/** Pixel edge length of each {@link OctoBotSize}. */\nexport const OCTOBOT_SIZE_PX: Readonly<Record<OctoBotSize, number>> = { sm: 60, md: 120, lg: 240 };\n\n/**\n * Length of one loop of each animation in ms (identical for all sizes; read from the WebP frame\n * durations). Used by `playOnce`.\n */\nexport const OCTOBOT_LOOP_MS: Readonly<Record<OctoBotAnimation, number>> = {\n idle: 1900, blink: 2140, look: 2320, swim: 1750, thinking: 3520, wave: 2210\n};\n\n/**\n * Base URL of the OctoBot images, with a trailing slash. Default `assets/octobot/` (relative to\n * the document base). The files ship as library assets in\n * `node_modules/@meshmakers/shared-ui/assets/octobot`; a host app copies them with an\n * `angular.json` assets entry:\n *\n * ```json\n * { \"glob\": \"**\\/*\", \"input\": \"node_modules/@meshmakers/shared-ui/assets/octobot\", \"output\": \"/assets/octobot\" }\n * ```\n *\n * Provide a different value when the app serves them elsewhere (a CDN, a sub path).\n */\nexport const OCTOBOT_ASSET_BASE_URL = new InjectionToken<string>('OCTOBOT_ASSET_BASE_URL', {\n providedIn: 'root',\n factory: () => 'assets/octobot/'\n});\n\n/**\n * App-wide \"show stills only\" switch, e.g. bound to a user setting \"Reduce animations\". When\n * `true`, every `mm-octobot` shows its still frame regardless of `prefers-reduced-motion`.\n */\nexport const OCTOBOT_FORCE_STILL = new InjectionToken<boolean>('OCTOBOT_FORCE_STILL', {\n providedIn: 'root',\n factory: () => false\n});\n\nconst REDUCED_MOTION_QUERY = '(prefers-reduced-motion: reduce)';\n\n/**\n * `mm-octobot` — the meshmakers OctoBot mascot as a small animated pixel-art image (AB#3444).\n *\n * Renders one `<img>` with a fixed width and height (no layout shift), `loading=\"lazy\"` (or\n * `eager` via the `loading` input),\n * `decoding=\"async\"` and `image-rendering: pixelated`. The image is an 8-frame animated WebP\n * loaded by URL from {@link OCTOBOT_ASSET_BASE_URL} — nothing lands in the JS bundle.\n *\n * **Reduced motion:** while the user prefers reduced motion (`prefers-reduced-motion: reduce`,\n * followed live via `matchMedia`), when {@link OCTOBOT_FORCE_STILL} is `true` or when the `still`\n * input is set, the first frame is shown as a static PNG instead.\n *\n * **Accessibility:** without a `label` the figure is decorative (`alt=\"\"`, `aria-hidden=\"true\"`);\n * the surrounding text must carry the meaning (e.g. \"Thinking…\" next to `thinking`). With a\n * `label` the host gets `role=\"img\"` and `aria-label`.\n *\n * **Placement rules (host responsibility, see `docs/actions.md` › OctoBot):** at most one\n * animated OctoBot per view — empty states (once per page), page loading, the assistant panel,\n * 404 / turned-off pages, onboarding. Never inside repeated elements (list rows, table cells,\n * cockpit tiles, buttons) and never in toasts or error messages (a still frame is acceptable\n * there if a figure is wanted at all).\n *\n * @example\n * ```html\n * <mm-octobot animation=\"idle\" size=\"md\" />\n * <mm-octobot animation=\"thinking\" size=\"sm\" label=\"The assistant is thinking\" />\n * ```\n */\n@Component({\n selector: 'mm-octobot',\n template: `<img\n class=\"mm-octobot__img\"\n [attr.loading]=\"loading()\"\n [src]=\"src()\"\n [attr.width]=\"px()\"\n [attr.height]=\"px()\"\n alt=\"\"\n decoding=\"async\"\n draggable=\"false\" />`,\n styles: [`\n :host {\n display: inline-block;\n flex: none;\n line-height: 0;\n }\n .mm-octobot__img {\n display: block;\n max-width: none;\n image-rendering: pixelated;\n user-select: none;\n }\n `],\n host: {\n 'class': 'mm-octobot',\n '[attr.data-size]': 'size()',\n '[attr.role]': 'label() ? \"img\" : null',\n '[attr.aria-label]': 'label() || null',\n '[attr.aria-hidden]': 'label() ? null : \"true\"',\n '[attr.data-animation]': 'animation()',\n '[attr.data-still]': 'showStill() ? \"true\" : null'\n },\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class OctoBotComponent {\n private readonly baseUrl = inject(OCTOBOT_ASSET_BASE_URL);\n private readonly forceStill = inject(OCTOBOT_FORCE_STILL);\n\n /** Which animation to play. Default `idle`. */\n readonly animation = input<OctoBotAnimation>('idle');\n /** Rendered size. Default `md` (120 px). */\n readonly size = input<OctoBotSize>('md');\n /** Accessible name; when empty the figure is decorative. */\n readonly label = input<string | null | undefined>(null);\n /** Image loading strategy; `eager` where the figure is visible right away. Default `lazy`. */\n readonly loading = input<OctoBotLoading>('lazy');\n /** Show the still frame instead of the animation (e.g. after the assistant finished). */\n readonly still = input(false, { transform: booleanAttribute });\n /**\n * Plays the animation once ({@link OCTOBOT_LOOP_MS}) and then rests on the still frame — for\n * greetings (`wave`) that should not loop forever. The WebPs themselves loop endlessly.\n */\n readonly playOnce = input(false, { transform: booleanAttribute });\n\n private readonly prefersReducedMotion = signal(false);\n private readonly played = signal(false);\n\n protected readonly px = computed(() => OCTOBOT_SIZE_PX[this.size()] ?? OCTOBOT_SIZE_PX.md);\n protected readonly showStill = computed(() => this.still() || this.forceStill || this.prefersReducedMotion() || this.played());\n protected readonly src = computed(() => {\n const base = this.baseUrl.endsWith('/') ? this.baseUrl : `${this.baseUrl}/`;\n const file = this.showStill() ? `octo_${this.animation()}_still.png` : `octo_${this.animation()}.webp`;\n return `${base}${this.size()}/${file}`;\n });\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n // Restart the single loop whenever the animation changes while playOnce is set.\n effect((onCleanup) => {\n const animation = this.animation();\n this.played.set(false);\n if (!this.playOnce()) {\n return;\n }\n const timer = setTimeout(() => this.played.set(true), OCTOBOT_LOOP_MS[animation] ?? 2000);\n onCleanup(() => clearTimeout(timer));\n });\n if (!isPlatformBrowser(inject(PLATFORM_ID)) || typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return;\n }\n const query = window.matchMedia(REDUCED_MOTION_QUERY) as MediaQueryList | undefined;\n if (!query) {\n // Stubbed or partial matchMedia (tests, embedded webviews): keep the animation, no live updates.\n return;\n }\n this.prefersReducedMotion.set(!!query.matches);\n const listener = (event: MediaQueryListEvent): void => this.prefersReducedMotion.set(event.matches);\n query.addEventListener?.('change', listener);\n destroyRef.onDestroy(() => query.removeEventListener?.('change', listener));\n }\n}\n","import { ChangeDetectionStrategy, Component, booleanAttribute, computed, input, output } from '@angular/core';\nimport { ButtonComponent } from '@progress/kendo-angular-buttons';\nimport { OctoBotAnimation, OctoBotComponent, OctoBotSize } from '../octobot/octobot.component';\n\n/**\n * - `empty`: a list or page has no records yet → OctoBot `idle`.\n * - `no-results`: a search or filter matches nothing → OctoBot `look`.\n * - `error`: loading failed → no figure (errors stay sober), `role=\"alert\"`, optional \"Try again\".\n */\nexport type EmptyStateVariant = 'empty' | 'no-results' | 'error';\n\n/** Default English \"Try again\" label of {@link EmptyStateComponent}. */\nexport const DEFAULT_EMPTY_STATE_RETRY_LABEL = 'Try again';\n\n/**\n * `mm-empty-state` — the shared empty / no-results / error block of a page or list (AB#3444).\n *\n * One per page or list, never per row. The `empty` and `no-results` variants show one OctoBot\n * (`idle` / `look`, decorative) above the title; the `error` variant shows no figure and announces\n * itself as an alert. Project extra actions (e.g. \"New data flow\") as content.\n *\n * @example\n * ```html\n * <mm-empty-state heading=\"No data flows yet\" text=\"Create your first data flow to start processing data.\" />\n * <mm-empty-state variant=\"error\" heading=\"The blueprints could not be loaded.\" showRetry (retry)=\"load()\" />\n * ```\n */\n@Component({\n selector: 'mm-empty-state',\n imports: [OctoBotComponent, ButtonComponent],\n template: `\n @if (figure(); as animation) {\n <mm-octobot class=\"mm-empty-state__figure\" [animation]=\"animation\" [size]=\"size()\" loading=\"eager\" />\n }\n <p class=\"mm-empty-state__title\" [attr.role]=\"variant() === 'error' ? 'alert' : null\">{{ heading() }}</p>\n @if (text()) {\n <p class=\"mm-empty-state__text\">{{ text() }}</p>\n }\n @if (variant() === 'error' && showRetry()) {\n <button kendoButton type=\"button\" class=\"mm-empty-state__retry\" (click)=\"retry.emit()\">{{ retryLabel() }}</button>\n }\n <ng-content />\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--theme-space-2, 8px);\n padding: var(--theme-space-6, 24px) var(--theme-space-4, 16px);\n text-align: center;\n color: var(--theme-text-secondary);\n }\n .mm-empty-state__title {\n margin: 0;\n color: var(--theme-text-primary);\n font-weight: 600;\n }\n :host([data-variant='error']) .mm-empty-state__title {\n color: var(--theme-status-error);\n }\n .mm-empty-state__text {\n margin: 0;\n max-width: 48ch;\n }\n .mm-empty-state__retry {\n margin-top: var(--theme-space-1, 4px);\n }\n `],\n host: {\n 'class': 'mm-empty-state',\n '[attr.data-variant]': 'variant()'\n },\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EmptyStateComponent {\n readonly variant = input<EmptyStateVariant>('empty');\n readonly heading = input.required<string>();\n readonly text = input<string | null | undefined>(null);\n /** OctoBot size of the `empty` / `no-results` variants. Default `md`. */\n readonly size = input<OctoBotSize>('md');\n /** Shows the \"Try again\" button (error variant only). */\n readonly showRetry = input(false, { transform: booleanAttribute });\n readonly retryLabel = input<string>(DEFAULT_EMPTY_STATE_RETRY_LABEL);\n /** Emitted by the \"Try again\" button. */\n readonly retry = output<void>();\n\n protected readonly figure = computed<OctoBotAnimation | null>(() => {\n switch (this.variant()) {\n case 'empty': return 'idle';\n case 'no-results': return 'look';\n default: return null;\n }\n });\n}\n","import { PopupRef, PopupService } from '@progress/kendo-angular-popup';\nimport { ChangeDetectionStrategy, Component, ContentChild, ElementRef, EventEmitter, HostBinding, Input, NgZone, Output, TemplateRef, ViewChild, inject, OnDestroy, AfterViewInit, signal } from '@angular/core';\nimport {\n BooleanFilterCellComponent,\n CellClickEvent,\n CellTemplateDirective, CheckboxColumnComponent,\n ColumnComponent, CommandColumnComponent, CustomMessagesComponent,\n DateFilterCellComponent,\n ExcelModule,\n FilterCellTemplateDirective,\n GridComponent,\n GridSpacerComponent,\n NoRecordsTemplateDirective,\n NumericFilterCellComponent,\n PageChangeEvent,\n PagerSettings, PDFModule, SelectableSettings, SelectionEvent,\n StringFilterCellComponent,\n ToolbarTemplateDirective\n} from '@progress/kendo-angular-grid';\nimport {DropDownListComponent, ItemTemplateDirective, ValueTemplateDirective} from '@progress/kendo-angular-dropdowns';\nimport {CompositeFilterDescriptor, FilterDescriptor} from '@progress/kendo-data-query';\nimport {ListViewFiltersDirective} from './list-view-filters.directive';\nimport {BadgeMapping, ColumnDefinition, ContextMenuType, ListViewCommand, ListViewMessages, MmListEmptyContext, MmListEmptyState, resolveListViewMessages, RowClassFn, StatusFieldConfig, StatusIconMapping, TableColumn} from './list-view.model';\nimport {DatePipe, DecimalPipe, NgComponentOutlet, NgTemplateOutlet} from '@angular/common';\nimport {PascalCasePipe} from '../pipes/pascal-case.pipe';\nimport {SeparatorComponent, CheckBoxComponent, NumericTextBoxComponent} from '@progress/kendo-angular-inputs';\nimport {checkIcon, fileExcelIcon, filePdfIcon, filterIcon, filterClearIcon, moreVerticalIcon, slidersIcon, arrowRotateCwIcon, xIcon} from '@progress/kendo-svg-icons';\nimport {MmListViewDataBindingDirective} from '../directives/mm-list-view-data-binding.directive';\nimport {SVGIcon} from '@progress/kendo-svg-icons/dist/svg-icon.interface';\nimport {ButtonComponent, DropDownButtonComponent, SplitButtonComponent} from '@progress/kendo-angular-buttons';\nimport {SVGIconModule} from '@progress/kendo-angular-icons';\nimport {\n ContextMenuComponent, ContextMenuPopupEvent,\n ContextMenuSelectEvent,\n HierarchyBindingDirective,\n MenuItem\n} from '@progress/kendo-angular-menu';\nimport {CommandBaseService, CommandItem, CommandSettingsService} from '@meshmakers/shared-services';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {ActionButtonComponent} from '../actions/action-button.component';\nimport {MM_ROW_ACTIONS_MAX_INLINE, MmAction, isActionDisabled, isActionVisible} from '../actions/action.model';\nimport {\n MmListRowAction,\n MmListRowActionEvent,\n ResolvedListRowAction,\n resolveListRowAction,\n resolveListRowLabel,\n sameAction,\n} from './list-view-row-actions';\nimport {BytesToSizePipe} from '../pipes/bytes-to-size.pipe';\nimport {asyncScheduler, Subject} from 'rxjs';\nimport {debounceTime, distinctUntilChanged, observeOn, takeUntil} from 'rxjs/operators';\nimport {CronHumanizerService} from '../cron-builder/services/cron-humanizer.service';\nimport {EmptyStateComponent} from '../empty-state/empty-state.component';\n\n/** Context/overflow menu class of `CommandItem.danger` items (AB#5570); styled globally in the list-view SCSS. */\nconst DANGER_MENU_ITEM_CLASS = 'mm-list-view-menu-item--danger';\n\n/** Row actions of one row, split for rendering (AB#5572). */\nexport interface RowActionsView {\n inline: ResolvedListRowAction[];\n menu: ResolvedListRowAction[];\n /** The \"…\" button is shown (overflowing actions and/or context menu items). */\n hasMenu: boolean;\n}\n\n/** Marker on overflow-menu items that came from the row actions (not from `contextMenuCommandItems`). */\ninterface OverflowRowActionData {\n mmRowAction: true;\n entry: ResolvedListRowAction;\n}\n\nfunction isOverflowRowActionData(data: unknown): data is OverflowRowActionData {\n return !!data && (data as OverflowRowActionData).mmRowAction === true;\n}\n\n/** Menu text: `menuLabel` (\"Delete…\"), plus the disabled reason (\"Delete… — The adapter is deployed\"). */\nfunction entryMenuText(action: MmAction): string {\n const text = action.menuLabel || action.label;\n return isActionDisabled(action) ? `${text} — ${action.disabledReason!.trim()}` : text;\n}\n\n/** Per-instance prefix of the toolbar disabled-reason ids. */\nlet nextListViewId = 0;\n\nfunction sameEntries(a: ResolvedListRowAction[], b: ResolvedListRowAction[]): boolean {\n return a.length === b.length && a.every((entry, i) =>\n entry.commandItem === b[i].commandItem && entry.rowAction === b[i].rowAction && sameAction(entry.action, b[i].action));\n}\n\n@Component({\n selector: 'mm-list-view',\n imports: [\n GridComponent,\n MmListViewDataBindingDirective,\n ColumnComponent,\n PascalCasePipe,\n ToolbarTemplateDirective,\n GridSpacerComponent,\n ExcelModule,\n PDFModule,\n ButtonComponent,\n DropDownButtonComponent,\n SplitButtonComponent,\n CommandColumnComponent,\n CellTemplateDirective,\n ContextMenuComponent,\n HierarchyBindingDirective,\n CheckboxColumnComponent,\n CheckBoxComponent,\n SeparatorComponent,\n DatePipe,\n DecimalPipe,\n BytesToSizePipe,\n SVGIconModule,\n CustomMessagesComponent,\n FilterCellTemplateDirective,\n StringFilterCellComponent,\n NumericFilterCellComponent,\n BooleanFilterCellComponent,\n DateFilterCellComponent,\n DropDownListComponent,\n ValueTemplateDirective,\n ItemTemplateDirective,\n NumericTextBoxComponent,\n NgComponentOutlet,\n NgTemplateOutlet,\n ActionButtonComponent,\n NoRecordsTemplateDirective,\n EmptyStateComponent\n ],\n templateUrl: './list-view.component.html',\n styleUrl: './list-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ListViewComponent extends CommandBaseService implements OnDestroy, AfterViewInit {\n\n private readonly cronHumanizer = inject(CronHumanizerService);\n private readonly popupService = inject(PopupService);\n\n protected _columns: TableColumn[] = [];\n private _actionCommandItems: CommandItem[] = [];\n private _contextMenuCommandItems: CommandItem[] = [];\n private searchSubject = new Subject<string | null>();\n private destroy$ = new Subject<void>();\n protected searchValue = '';\n private _selectedRows: unknown[] = [];\n // action menu (button)\n private _actionMenuSelectedRow: unknown | null = null;\n\n // context menu (right click)\n private _contextMenuSelectedRow: unknown | null = null;\n\n protected _actionMenuItems: MenuItem[] = [];\n private _rowActions: readonly MmListRowAction[] = [];\n /** Per-row resolved actions; identical results keep their identity (no NG0100, no re-render churn). */\n private rowActionCache = new WeakMap<object, RowActionsView>();\n private readonly activatedRoute = inject(ActivatedRoute, {optional: true});\n private readonly routerForActions = inject(Router, {optional: true});\n protected _contextMenuItems: MenuItem[] = [];\n protected _showRowFilter = false;\n\n /** Indicates if the data source is currently loading data */\n protected isLoading = signal(false);\n\n /**\n * Whether the data source reported \"not loading\" at least once (AB#3444). {@link isLoading}\n * follows the data source one macrotask late (asyncScheduler), so the first render would\n * otherwise show the empty state while the first fetch is already in flight.\n */\n protected readonly loadSettled = signal(false);\n\n /**\n * The component's own width in pixels, kept current via ResizeObserver.\n * `null` until the first measurement (before that, all columns render visible\n * and auto-sized). Drives `hideBelow` column hiding and `minWidth` pinning.\n */\n protected readonly containerWidth = signal<number | null>(null);\n private readonly hostElement = inject(ElementRef<HTMLElement>);\n private readonly ngZone = inject(NgZone);\n private resizeObserver?: ResizeObserver;\n\n /** Never auto-page below this many rows, even in a tiny viewport. */\n private static readonly MIN_AUTO_PAGE_SIZE = 5;\n\n /**\n * Minimum change (in rows) before an already-measured `autoPageSize` is\n * re-applied. Rows can vary in height (component cells such as sparklines,\n * wrapping text) so the derived fit-to-height count jitters by ±1 as the user\n * pages through content. Without this dead-band every page change would\n * re-derive the page size and fire an extra fetch with a realigned `skip`,\n * overlapping the page the user actually navigated to. The very first\n * measurement always applies (it converts the initial default into the fitted\n * size); genuine resizes/density changes move by more than this threshold.\n */\n private static readonly AUTO_PAGE_SIZE_HYSTERESIS = 2;\n\n /** Measured fit-to-height page size (`autoPageSize`); null until the first measurement. */\n private readonly autoPageSizeValue = signal<number | null>(null);\n /** Last measured row height — reused while a page renders no rows (e.g. empty filter result). */\n private lastMeasuredRowHeight: number | null = null;\n private readonly autoPageSizeRecompute$ = new Subject<void>();\n\n /**\n * Host-supplied scope/filter controls, rendered in the toolbar rather than in\n * a strip of their own above the grid — see ListViewFiltersDirective.\n */\n @ContentChild(ListViewFiltersDirective) protected filtersTemplate?: ListViewFiltersDirective;\n\n @ViewChild(GridComponent) private gridComponent?: GridComponent;\n @ViewChild(MmListViewDataBindingDirective) private dataBindingDirective?: MmListViewDataBindingDirective;\n @ViewChild('gridmenu') public gridContextMenu?: ContextMenuComponent;\n\n @Output() rowClicked = new EventEmitter<unknown[]>();\n\n @Input() public pageSize = 20;\n @Input() public skip = 0;\n\n /**\n * Fit-to-height paging: when enabled, the page size is derived from the grid's\n * available content height and the measured row height, so a page always fills\n * the viewport instead of leaving a half-empty grid with a detached pager on\n * large screens. The pager's page-size dropdown is hidden (a manual choice\n * would be overridden on the next resize). `pageSize` serves as the initial\n * page size until the first measurement; the minimum auto page size is 5.\n */\n @Input() public autoPageSize = false;\n @Input() public rowIsClickable = true;\n @Input() public showRowCheckBoxes = true;\n @Input() public showRowSelectAllCheckBox = true;\n @Input() public contextMenuType: ContextMenuType = 'actionMenu';\n\n @Input() public leftToolbarActions: CommandItem[] = [];\n @Input() public rightToolbarActions: CommandItem[] = [];\n\n public get actionCommandItems(): CommandItem[] {\n return this._actionCommandItems;\n }\n\n @Input() public set actionCommandItems(commandItems: CommandItem[]) {\n console.debug('actionCommandItems setter called', commandItems);\n this._actionCommandItems = commandItems;\n this._actionMenuItems = this.buildMenuItems(commandItems);\n console.debug('_actionMenuItems built', this._actionMenuItems);\n }\n\n public get contextMenuCommandItems(): CommandItem[] {\n return this._contextMenuCommandItems;\n }\n\n @Input() public set contextMenuCommandItems(commandItems: CommandItem[]) {\n this._contextMenuCommandItems = commandItems;\n this._contextMenuItems = this.buildMenuItems(commandItems);\n }\n\n /**\n * Row actions from the shared action model (AB#5572) — preferred over `actionCommandItems`.\n * Rendered after the `actionCommandItems` (which keep working through an adapter); together they\n * get at most {@link maxInlineRowActions} slots, the rest goes into the row's overflow menu.\n */\n @Input() public set rowActions(actions: readonly MmListRowAction[] | null | undefined) {\n this._rowActions = actions ?? [];\n this.rowActionCache = new WeakMap();\n }\n\n public get rowActions(): readonly MmListRowAction[] {\n return this._rowActions;\n }\n\n /**\n * Row action slots incl. the overflow (\"…\") button (guideline §2.2: 3). When the actions do not\n * fit, the last slot opens the overflow menu with the remaining actions and the context menu items.\n */\n @Input() public maxInlineRowActions = MM_ROW_ACTIONS_MAX_INLINE;\n\n /** An enabled {@link rowActions} action was triggered (inline or from the overflow menu). */\n @Output() public rowAction = new EventEmitter<MmListRowActionEvent>();\n\n @Input() public excelExportFileName = 'Export.xlsx';\n @Input() public pdfExportFileName = 'Export.pdf';\n @Input() public pageable: PagerSettings = {\n buttonCount: 5,\n info: true,\n type: 'numeric',\n pageSizes: [5, 10, 20, 50, 100],\n previousNext: true\n };\n @Input() public sortable = false;\n @Input() public rowFilterEnabled = false;\n @Input() public searchTextBoxEnabled = false;\n\n /**\n * Persist the user's sort/row-filter/page across visits (localStorage) so they\n * are not re-applied every time. On by default. Set `false` to opt a list out\n * (e.g. a transient/embedded list where a remembered filter would confuse).\n */\n @Input() public persistListState = true;\n\n /**\n * Storage key for {@link persistListState}. Defaults to the current route path\n * (without query string), which is stable per list page. Set an explicit key\n * when two lists share a route, or to keep the stored state stable across a\n * route rename.\n */\n @Input() public listStateKey?: string;\n\n private readonly routerRef = inject(Router);\n\n /**\n * Resolves the effective storage key for this list, or `null` when\n * persistence is disabled. Used by {@link MmListViewDataBindingDirective}.\n */\n public resolveListStateKey(): string | null {\n if (!this.persistListState) {\n return null;\n }\n if (this.listStateKey) {\n return this.listStateKey;\n }\n const path = (this.routerRef.url ?? '').split('?')[0].split('#')[0];\n return path || null;\n }\n\n /** The page size the grid actually uses: the measured fit-to-height value in `autoPageSize` mode, `pageSize` otherwise. */\n protected effectivePageSize(): number {\n return (this.autoPageSize ? this.autoPageSizeValue() : null) ?? this.pageSize;\n }\n\n private _cachedAutoPageable?: { source: PagerSettings; result: PagerSettings };\n\n /** Pager settings the grid uses; in `autoPageSize` mode the page-size dropdown is stripped. Cached per source object to keep the input reference stable across change detection. */\n protected get effectivePageable(): PagerSettings {\n if (!this.autoPageSize) {\n return this.pageable;\n }\n if (this._cachedAutoPageable?.source !== this.pageable) {\n this._cachedAutoPageable = {\n source: this.pageable,\n result: {...this.pageable, pageSizes: false}\n };\n }\n return this._cachedAutoPageable.result;\n }\n\n /** Whether users can resize columns by dragging the header edges. */\n @Input() public resizable = true;\n\n /**\n * Width in pixels of the trailing actions command column. The default fits the\n * historical five-button layouts; lists with only an edit button plus the\n * context-menu trigger should pass something around 100.\n */\n @Input() public actionsColumnWidth = 220;\n\n /**\n * Floor for the actions column HEADER. The header is a translated word, and\n * at the grid's header font \"Actions\" needs 73px once the cell's padding is\n * counted, German \"Aktionen\" 83px, Spanish \"Acciones\" 82px.\n */\n private static readonly MIN_ACTIONS_HEADER_WIDTH = 90;\n\n /** Measured geometry of one flat icon button in a command cell. */\n private static readonly ACTION_BUTTON_WIDTH = 36;\n private static readonly ACTION_BUTTON_GAP = 6;\n private static readonly COMMAND_CELL_PADDING = 21;\n\n /**\n * Buttons the actions cell can render at once: one per non-separator action\n * item, plus the context-menu button when that menu is shown inline. Item\n * visibility is evaluated per row, so this is the worst case — which is the\n * case the column has to be wide enough for.\n */\n private get maxActionButtons(): number {\n const candidates = this._actionMenuItems.filter(item => !item.separator).length +\n this._rowActions.filter(a => !a.overflow).length;\n const forcedMenu = this.hasContextMenuButton || this._rowActions.some(a => a.overflow);\n const slots = Math.max(1, Math.floor(this.maxInlineRowActions));\n if (!forcedMenu && candidates <= slots) {\n return candidates;\n }\n return Math.min(candidates, slots - 1) + 1;\n }\n\n /** The context menu is opened from the row's \"…\" button (not by right click). */\n private get hasContextMenuButton(): boolean {\n return this._contextMenuCommandItems.length > 0 && this.contextMenuType === 'actionMenu';\n }\n\n /** The list renders an actions column / card actions at all. */\n protected get hasRowActions(): boolean {\n return this._actionMenuItems.length > 0 || this._rowActions.length > 0 || this.hasContextMenuButton;\n }\n\n /**\n * The actions column width actually used.\n *\n * A host sizes this by eye and gets it wrong in both directions: too narrow\n * for the header (three Studio lists passed 70 and rendered \"ACTIO…\") or too\n * narrow for the buttons (the same 70, and even a 90 that fits the header,\n * clipped the third button off an archives row). Both floors are computed\n * rather than guessed, so the column always fits its own content.\n */\n protected get effectiveActionsColumnWidth(): number {\n const buttons = this.maxActionButtons;\n const contentWidth = buttons === 0\n ? 0\n : ListViewComponent.COMMAND_CELL_PADDING +\n buttons * ListViewComponent.ACTION_BUTTON_WIDTH +\n (buttons - 1) * ListViewComponent.ACTION_BUTTON_GAP;\n\n return Math.max(\n this.actionsColumnWidth,\n ListViewComponent.MIN_ACTIONS_HEADER_WIDTH,\n contentWidth,\n );\n }\n\n /**\n * Hides the row-checkbox column while the list view is narrower than this many\n * pixels — on phone-sized layouts multi-select via checkboxes is impractical and\n * the 40px are better spent on the data columns. Pass `null` to always show them.\n */\n @Input() public hideCheckboxesBelow: number | null = 600;\n\n /**\n * Compact-toolbar breakpoint: below this component width the host gets the\n * `mm-list-view-narrow` class, which wraps the grid toolbar and stretches the\n * search input to a full row instead of stacking every control vertically.\n */\n @HostBinding('class.mm-list-view-narrow')\n protected get isNarrow(): boolean {\n const width = this.containerWidth();\n return width !== null && width < 600;\n }\n\n /**\n * Card mode (AB#4930): below this component width the rows render as\n * stacked cards instead of a horizontally scrolling table — the first\n * column becomes the card title, every other column a labeled line\n * (empty values are skipped, `hideBelow` is ignored because cards have\n * vertical room), and the actions-column buttons move into the card\n * header. Sorting headers and the row filter are unavailable while cards\n * are active; the toolbar search and quick-view bars keep working.\n * `null` (the default) keeps the table at every width.\n */\n @Input() public cardModeBelow: number | null = null;\n\n /**\n * Below this component width the toolbar's command buttons (row filter,\n * exports, reset, refresh) collapse into a single overflow menu. Above it\n * they stay laid out, because reaching a command in one click beats hiding\n * it behind a menu whenever there is room.\n *\n * Measured against the component's OWN width, not the viewport: expanding or\n * collapsing the app drawer changes the space a list has by ~240px without\n * the window ever resizing.\n */\n @Input() public collapseCommandsBelow = 900;\n\n /**\n * Tells the list that the host holds filters of its own (quick-view bars,\n * app-side field filters) that a reset would clear. The toolbar's reset\n * button only shows while something is filtered, and the list cannot see\n * those host filters by itself.\n */\n @Input() public hasExternalFilters = false;\n\n /**\n * Empty state of the list (AB#3444): when set, a list without records shows the shared\n * `mm-empty-state` — one OctoBot `idle` with {@link MmListEmptyState.title} / `text` — instead\n * of the plain \"No records available.\" line; while a search, row filter or host filter\n * ({@link hasExternalFilters}) is active it shows OctoBot `look` with the \"no results\" texts.\n * Nothing is shown while the list loads (including before the first fetch answered). The figure appears once per list, never in rows.\n */\n @Input() public emptyState: MmListEmptyState | null = null;\n\n /**\n * Fully custom empty state (wins over {@link emptyState}). Context: `$implicit` / `filtered`\n * is `true` while a search or filter is active.\n */\n @Input() public emptyTemplate: TemplateRef<MmListEmptyContext> | null = null;\n\n /**\n * Whether a search, row filter or host filter narrows the rows right now (sorting does not),\n * i.e. an empty list means \"no results\" rather than \"no records yet\".\n */\n protected get isFiltered(): boolean {\n if (this.hasExternalFilters || this.searchValue.trim().length > 0) {\n return true;\n }\n return (this.dataBindingDirective?.currentState?.filter?.filters?.length ?? 0) > 0;\n }\n\n protected get emptyContext(): MmListEmptyContext {\n const filtered = this.isFiltered;\n return { $implicit: filtered, filtered };\n }\n\n /**\n * Whether anything narrows or reorders the default view right now: a row\n * filter, a column sort, free-text search, or host-side filters announced\n * through {@link hasExternalFilters}. Paging is deliberately not counted —\n * the pager already gets back to page 1.\n */\n protected get hasActiveFilters(): boolean {\n if (this.hasExternalFilters || this.searchValue.trim().length > 0) {\n return true;\n }\n const state = this.dataBindingDirective?.currentState;\n if (!state) {\n return false;\n }\n const hasRowFilter = (state.filter?.filters?.length ?? 0) > 0;\n const hasSort = (state.sort ?? []).some(descriptor => !!descriptor.dir);\n return hasRowFilter || hasSort;\n }\n\n /** True while the command buttons are collapsed into the overflow menu. */\n protected get commandsCollapsed(): boolean {\n const width = this.containerWidth();\n return width !== null && width < this.collapseCommandsBelow;\n }\n\n /**\n * The commands available right now, in toolbar order. The row filter is\n * omitted in card mode: cards have no column headers for a filter row to\n * appear in, and the grid already drops `filterable` there — leaving the\n * button visible offered to toggle something that cannot exist. Reset shows\n * only while something is actually filtered, sorted or searched (see\n * {@link hasActiveFilters}); on the default view there is nothing to reset,\n * so the button would only be noise. It is independent of card mode, so a\n * filter set before the switch can still be cleared.\n */\n protected get toolbarCommands(): ListViewCommand[] {\n const commands: ListViewCommand[] = [];\n if (this.rowFilterEnabled && !this.isCardMode) {\n commands.push({ id: 'rowFilter', text: this._messages.showRowFilter, svgIcon: this.filterIcon });\n }\n commands.push(\n { id: 'excel', text: this._messages.exportToExcel, svgIcon: this.excelSVG },\n { id: 'pdf', text: this._messages.exportToPdf, svgIcon: this.pdfSVG },\n );\n if (this.hasActiveFilters) {\n commands.push({ id: 'reset', text: this._messages.resetFilters, svgIcon: this.resetFilterIcon });\n }\n commands.push({ id: 'refresh', text: this._messages.refreshData, svgIcon: this.refreshIcon });\n return commands;\n }\n\n /**\n * Runs a command by id. Excel and PDF are driven by Kendo's own\n * `kendoGridExcelCommand` / `kendoGridPDFCommand` directives when the buttons\n * are laid out; from the overflow menu there is no directive to attach to, so\n * the grid API is called directly.\n */\n protected onCommand(id: string): void {\n switch (id) {\n case 'rowFilter': this.onShowRowFilter(); break;\n case 'excel': this.gridComponent?.saveAsExcel(); break;\n case 'pdf': this.gridComponent?.saveAsPDF(); break;\n case 'reset': this.onReset(); break;\n case 'refresh': this.onRefresh(); break;\n }\n }\n\n @HostBinding('class.mm-list-view-cards')\n protected get isCardMode(): boolean {\n const width = this.containerWidth();\n return this.cardModeBelow !== null && width !== null && width < this.cardModeBelow;\n }\n\n /** First column = the card's title/identity line (AB#4930). */\n protected get cardTitleColumn(): TableColumn | null {\n return this._columns.length > 0 ? this._columns[0] : null;\n }\n\n /** Every column after the title one — the card's labeled body lines. */\n protected get cardBodyColumns(): TableColumn[] {\n return this._columns.slice(1);\n }\n\n /** Empty values render no body line, so cards stay tight (AB#4930). */\n protected hasCardValue(element: Record<string, unknown>, column: TableColumn): boolean {\n if (column.dataType === 'statusIcons') {\n return this.getStatusFields(column).some(\n (fieldConfig) => !!this.getStatusIconMapping(element, fieldConfig)\n );\n }\n if (column.formatter) {\n return !!this.getFormattedValue(element, column);\n }\n const value = this.getValue(element, column);\n return value !== null && value !== undefined && value !== '';\n }\n\n /**\n * Callback for applying CSS classes to grid rows based on row data.\n * Passed through to Kendo Grid's [rowClass] input.\n */\n @Input() public rowClass: RowClassFn | undefined;\n\n protected readonly defaultRowClass: RowClassFn = () => ({});\n\n protected _messages: Required<ListViewMessages> = resolveListViewMessages(undefined);\n\n /**\n * Translated messages. Partial: members that are not supplied (or are `undefined`) keep the\n * English default from `DEFAULT_LIST_VIEW_MESSAGES`.\n */\n @Input() public set messages(value: Partial<ListViewMessages> | null | undefined) {\n this._messages = resolveListViewMessages(value);\n }\n\n public get messages(): Required<ListViewMessages> {\n return this._messages;\n }\n\n @Input() public selectable: SelectableSettings = {\n enabled: false\n };\n\n @Input() public set columns(cols: ColumnDefinition[]) {\n if (cols === null || cols === undefined || cols.length === 0) {\n this._columns = [];\n return;\n }\n\n this._columns = [];\n\n for (const column of cols) {\n if (typeof column === 'string') {\n this._columns.push({field: column, dataType: 'text'});\n } else {\n this._columns.push(column);\n }\n }\n }\n\n public get columns(): TableColumn[] {\n return this._columns;\n }\n\n constructor() {\n const commandSettingsService = inject(CommandSettingsService);\n const router = inject(Router);\n\n super(commandSettingsService, router);\n\n // Setup debounce for search\n this.searchSubject.pipe(\n debounceTime(500), // Wait 500 ms after last input\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n ).subscribe((value) => {\n this.onExecuteFilter.emit(value);\n });\n\n // Debounced fit-to-height recomputation (resize bursts, load-completions)\n this.autoPageSizeRecompute$.pipe(\n debounceTime(150),\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.recomputeAutoPageSize();\n });\n }\n\n ngAfterViewInit(): void {\n // Subscribe to loading state from the data binding directive.\n // Use asyncScheduler to defer each emission to a separate macrotask,\n // preventing the signal from changing during Angular's CD verify pass\n // (which causes NG0100 when Apollo returns cached data quickly).\n if (this.dataBindingDirective) {\n this.dataBindingDirective.isLoading$.pipe(\n observeOn(asyncScheduler),\n takeUntil(this.destroy$)\n ).subscribe(loading => {\n this.isLoading.set(loading);\n if (!loading) {\n this.loadSettled.set(true);\n }\n // Measure the fit-to-height page size only ONCE, when data first\n // renders (initial default → fitted). After that, page-size changes come\n // solely from the ResizeObserver (genuine viewport/density changes).\n // Re-measuring after every load would let per-page row-height\n // differences (wrapping descriptions, sparklines) re-derive the page\n // size mid-navigation, firing a second fetch that realigns `skip` and\n // overlaps the page the user just opened.\n if (!loading && this.autoPageSize && this.autoPageSizeValue() === null) {\n this.autoPageSizeRecompute$.next();\n }\n });\n }\n\n // Track the component's own width for hideBelow/minWidth column behavior.\n // The callback fires outside the Angular zone; re-enter it so the signal\n // update schedules change detection for this OnPush component.\n if (typeof ResizeObserver !== 'undefined') {\n const hostNative = this.hostElement.nativeElement;\n this.resizeObserver = new ResizeObserver(entries => {\n let hostWidth: number | undefined;\n let resized = false;\n for (const entry of entries) {\n resized = true;\n if (entry.target === hostNative) {\n hostWidth = entry.contentRect.width;\n }\n }\n this.ngZone.run(() => {\n if (hostWidth !== undefined) {\n this.containerWidth.set(hostWidth);\n }\n if (resized && this.autoPageSize) {\n this.autoPageSizeRecompute$.next();\n }\n });\n });\n this.resizeObserver.observe(hostNative);\n\n // The grid content viewport shrinks/grows independently of the host\n // (toolbar wrap, filter row toggle) — observe it too in auto mode.\n if (this.autoPageSize) {\n const content = hostNative.querySelector('.k-grid-content');\n if (content) {\n this.resizeObserver.observe(content);\n }\n }\n }\n }\n\n /**\n * Measures the grid's content viewport and the rendered row height, derives the\n * number of rows that fit and applies it as the new page size (grid + query state)\n * when it differs from the current one. No-op until a row has been rendered at\n * least once (there is nothing to measure on a fully empty grid).\n */\n private recomputeAutoPageSize(): void {\n if (!this.autoPageSize) {\n return;\n }\n const content = this.hostElement.nativeElement.querySelector('.k-grid-content');\n if (!content) {\n return;\n }\n // Measure the TALLEST rendered row, not just the first one. Rows in a list\n // can vary greatly in height (component cells such as sparklines / last-run,\n // wrapping descriptions), and the first row's height differs from page to\n // page. Measuring only the first row made the derived page size swing\n // between pages; keying off the tallest row keeps it stable and guarantees\n // a full page never overflows into a scrollbar.\n let measuredRowHeight = 0;\n content.querySelectorAll('tbody tr').forEach((row: HTMLElement) => {\n const height = row.getBoundingClientRect().height;\n if (height > measuredRowHeight) {\n measuredRowHeight = height;\n }\n });\n const rowHeight = measuredRowHeight || this.lastMeasuredRowHeight;\n if (!rowHeight || content.clientHeight <= 0) {\n return;\n }\n this.lastMeasuredRowHeight = rowHeight;\n const take = Math.max(ListViewComponent.MIN_AUTO_PAGE_SIZE, Math.floor(content.clientHeight / rowHeight));\n const current = this.effectivePageSize();\n if (take === current) {\n return;\n }\n // After the first measurement, ignore small (±1) changes: they come from\n // per-page row-height jitter, and applying them would fire an extra fetch\n // that realigns `skip` and overlaps the page the user just opened. Genuine\n // resizes/density changes exceed the hysteresis band and still apply.\n if (this.autoPageSizeValue() !== null &&\n Math.abs(take - current) < ListViewComponent.AUTO_PAGE_SIZE_HYSTERESIS) {\n return;\n }\n this.autoPageSizeValue.set(take);\n this.dataBindingDirective?.applyPageSize(take);\n }\n\n ngOnDestroy(): void {\n this.closeToolbarHint();\n this.resizeObserver?.disconnect();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * CSS class carrying the column's `align` to its header and body cells\n * (`mm-col-align-right` …); empty for the default start alignment so the\n * grid's own cell classes stay untouched.\n */\n protected alignClass(column: TableColumn): string {\n return column.align ? `mm-col-align-${column.align}` : '';\n }\n\n /**\n * Below this column width the date and numeric row-filter cells render\n * compact (see `isCompactFilter`). Kendo's date filter cell is a date picker\n * plus an operator picker: in a 120px column the calendar toggle (33px) and\n * the operator (34px) leave the date input 35px — three characters of a\n * dd.MM.yyyy. The threshold is the width at which the full cell fits.\n */\n private static readonly COMPACT_FILTER_BELOW = 180;\n\n /**\n * Whether the column's row-filter cell drops its secondary controls — the\n * calendar toggle of a date filter (Alt+Down still opens the calendar, the\n * masked input stays), the spinners of a numeric filter — and tightens its\n * padding, because the column is narrower than `COMPACT_FILTER_BELOW`.\n * Auto-sized columns without a width are never compact.\n */\n protected isCompactFilter(column: TableColumn): boolean {\n const width = this.getEffectiveWidth(column);\n return width !== undefined && width < ListViewComponent.COMPACT_FILTER_BELOW;\n }\n\n /** Whether the column is hidden at the current component width (`hideBelow`). */\n protected isColumnHidden(column: TableColumn): boolean {\n const width = this.containerWidth();\n return width !== null && column.hideBelow !== undefined && width < column.hideBelow;\n }\n\n /** Whether the row-checkbox column is rendered (selection enabled AND above `hideCheckboxesBelow`). */\n protected showCheckboxColumn(): boolean {\n if (!this.showRowCheckBoxes || !this.selectable.enabled) {\n return false;\n }\n if (this.isCardMode) {\n // Cards keep their checkbox: the compact layout leaves room for it and\n // the selection-dependent toolbar actions stay usable on phones.\n return true;\n }\n const width = this.containerWidth();\n return this.hideCheckboxesBelow === null || width === null || width >= this.hideCheckboxesBelow;\n }\n\n /**\n * Resolves the width passed to the Kendo column. Fixed-width columns keep their\n * configured width. Auto columns normally stay auto (undefined) so they stretch into\n * the remaining space — but once the space left over per auto column drops below the\n * column's `minWidth`, the column is pinned to `minWidth`. The grid's total width then\n * exceeds the container and Kendo shows a horizontal scrollbar instead of silently\n * collapsing the auto columns to zero.\n */\n protected getEffectiveWidth(column: TableColumn): number | undefined {\n if (column.width !== undefined) {\n return column.width;\n }\n if (column.minWidth === undefined) {\n return undefined;\n }\n const containerWidth = this.containerWidth();\n if (containerWidth === null) {\n return undefined;\n }\n\n const visibleColumns = this._columns.filter(c => !this.isColumnHidden(c));\n let fixedWidth = visibleColumns.reduce((sum, c) => sum + (c.width ?? 0), 0);\n if (this.showCheckboxColumn()) {\n fixedWidth += this.checkboxColumnWidth;\n }\n if (this.hasRowActions) {\n fixedWidth += this.effectiveActionsColumnWidth;\n }\n\n const autoColumns = visibleColumns.filter(c => c.width === undefined);\n const widthPerAutoColumn = (containerWidth - fixedWidth) / Math.max(autoColumns.length, 1);\n return widthPerAutoColumn < column.minWidth ? column.minWidth : undefined;\n }\n\n // Wide enough for the largest density tier: at an 18px root font the cell\n // carries 13.5px padding per side plus an 18px checkbox (= 45px). At 40px\n // the cell overflowed and Kendo's ellipsis rendered a stray \"…\" next to\n // every checkbox on xlarge density.\n protected readonly checkboxColumnWidth = 48;\n\n /** Compact checkbox gutter in card mode — the card sits right next to it (AB#4930). */\n protected get effectiveCheckboxColumnWidth(): number {\n return this.isCardMode ? 32 : this.checkboxColumnWidth;\n }\n\n protected getDisplayName(column: TableColumn): string {\n return column.displayName ?? column.field;\n }\n\n protected getIsDisabled(commandItem: CommandItem, dataItem?: unknown): boolean {\n return CommandBaseService.getIsDisabled(commandItem, dataItem);\n }\n\n /**\n * Toolbar variant of {@link getIsDisabled}: an `isDisabled` callback receives\n * the current checkbox selection (always an array of row items, possibly\n * empty), so selection-dependent toolbar actions can disable themselves\n * until rows are selected — instead of answering an empty-selection click\n * with a hint message.\n */\n protected getToolbarItemDisabled(commandItem: CommandItem): boolean {\n return CommandBaseService.getIsDisabled(commandItem, this._selectedRows);\n }\n\n /**\n * Toolbar emphasis (AB#6211, action guideline §9): host toolbar actions are flat and neutral;\n * only an item flagged `primary` renders as the solid primary button. The page's one primary\n * action belongs in the page header, so the flag is for lists without one.\n */\n protected toolbarItemThemeColor(commandItem: CommandItem): 'primary' | 'base' {\n return commandItem.primary ? 'primary' : 'base';\n }\n\n /** Fill mode of a host toolbar action: the item's own `fillMode`, else solid for `primary`, flat otherwise. */\n protected toolbarItemFillMode(commandItem: CommandItem): NonNullable<CommandItem['fillMode']> {\n return commandItem.fillMode ?? (commandItem.primary ? 'solid' : 'flat');\n }\n\n /**\n * Why a disabled toolbar action cannot run (AB#6211, guideline §2.5), or `null`. Only for items\n * with a `disabledReason` (a callback receives the current selection); such a button stays\n * focusable (`aria-disabled`) and announces the reason. Without a reason the button is plainly\n * `disabled` as before.\n */\n protected toolbarItemDisabledReason(commandItem: CommandItem): string | null {\n if (!commandItem.disabledReason || !this.getToolbarItemDisabled(commandItem)) {\n return null;\n }\n const reason = typeof commandItem.disabledReason === 'function'\n ? commandItem.disabledReason(this._selectedRows)\n : commandItem.disabledReason;\n return reason?.trim() ? reason.trim() : null;\n }\n\n private readonly toolbarReasonPrefix = `mm-list-view-toolbar-reason-${nextListViewId++}`;\n\n /**\n * Id of the element carrying a toolbar action's disabled reason: unique per list instance,\n * toolbar band and position (ids of host items may repeat between the bands).\n */\n protected toolbarReasonId(side: 'left' | 'right', index: number): string {\n return `${this.toolbarReasonPrefix}-${side}-${index}`;\n }\n\n /** Tooltip of a host toolbar action: `tooltip` or `text`, plus \" — reason\" while disabled with a reason. */\n protected toolbarItemTitle(commandItem: CommandItem, reason: string | null): string {\n const label = commandItem.tooltip ?? commandItem.text ?? '';\n return reason ? `${label} — ${reason}` : label;\n }\n\n @ViewChild('toolbarHint', {static: true}) private toolbarHintTemplate?: TemplateRef<unknown>;\n /** Text of the open focus hint (read by the hint template). */\n protected readonly toolbarHintText = signal('');\n private toolbarHintRef: PopupRef | null = null;\n private toolbarPointerFocus = false;\n\n /** A pointer press precedes the focus: no hint (keyboard focus only, like :focus-visible). */\n protected onToolbarPointerDown(): void {\n this.toolbarPointerFocus = true;\n }\n\n /**\n * Keyboard focus on a toolbar action disabled with a reason (AB#6211, guideline §2.5): shows the\n * reason as a hint below the control. Rendered through the PopupService under the application\n * root (not inside the grid, whose toolbar clips overflow); closed on blur and Escape.\n */\n protected onToolbarFocusIn(event: FocusEvent, reason: string | null): void {\n const pointer = this.toolbarPointerFocus;\n this.toolbarPointerFocus = false;\n this.closeToolbarHint();\n const anchor = event.target as HTMLElement | null;\n if (!reason || pointer || !anchor || !this.toolbarHintTemplate) {\n return;\n }\n this.toolbarHintText.set(reason);\n this.toolbarHintRef = this.popupService.open({\n anchor,\n content: this.toolbarHintTemplate,\n anchorAlign: {horizontal: 'left', vertical: 'bottom'},\n popupAlign: {horizontal: 'left', vertical: 'top'},\n margin: {horizontal: 0, vertical: 4},\n popupClass: 'mm-list-view-toolbar-hint-popup',\n animate: false,\n });\n }\n\n /** Closes the focus hint (blur, Escape, destroy). */\n protected closeToolbarHint(): void {\n this.toolbarHintRef?.close();\n this.toolbarHintRef = null;\n }\n\n /**\n * Accessible name of a host toolbar action. A button with a visible text is named by that\n * text; an icon-only one (no text) gets its tooltip as `aria-label`, because `title` alone is\n * not reliably announced (action guideline §2.2: icon-only = tooltip + aria-label).\n */\n protected toolbarItemAriaLabel(commandItem: CommandItem): string | null {\n if (commandItem.text?.trim()) {\n return null;\n }\n return commandItem.tooltip?.trim() ? commandItem.tooltip : null;\n }\n\n private readonly buttonAttributesCache = new Map<string, Record<string, string>>();\n private static readonly NO_BUTTON_ATTRIBUTES: Record<string, string> = {};\n\n /**\n * `buttonAttributes` for Kendo split / dropdown buttons: the accessible name (same rule as\n * {@link toolbarItemAriaLabel}) and, while disabled with a reason, `aria-disabled` +\n * `aria-describedby`. Cached per combination so change detection sees a stable object.\n */\n protected toolbarItemButtonAttributes(commandItem: CommandItem, reasonId: string | null = null): Record<string, string> {\n const label = this.toolbarItemAriaLabel(commandItem);\n if (!reasonId) {\n return label ? this.ariaLabelAttributes(label) : ListViewComponent.NO_BUTTON_ATTRIBUTES;\n }\n const key = `${label ?? ''}\\u0000${reasonId}`;\n let attributes = this.buttonAttributesCache.get(key);\n if (!attributes) {\n attributes = { ...(label ? { 'aria-label': label } : {}), 'aria-disabled': 'true', 'aria-describedby': reasonId };\n this.buttonAttributesCache.set(key, attributes);\n }\n return attributes;\n }\n\n /** `buttonAttributes` of the icon-only menu the commands collapse into. */\n protected get commandsMenuButtonAttributes(): Record<string, string> {\n return this.ariaLabelAttributes(this._messages.commands);\n }\n\n private ariaLabelAttributes(label: string): Record<string, string> {\n let attributes = this.buttonAttributesCache.get(label);\n if (!attributes) {\n attributes = { 'aria-label': label };\n this.buttonAttributesCache.set(label, attributes);\n }\n return attributes;\n }\n\n protected getValue(element: Record<string, unknown>, column: TableColumn): unknown {\n if(column.field.indexOf('.') === -1) {\n return element[column.field];\n }\n\n // First check if the field exists as a flat key (e.g., \"contact.firstName\" stored directly)\n if (element[column.field] !== undefined) {\n return element[column.field];\n }\n\n // Otherwise try nested object traversal (e.g., element.contact.firstName)\n const keys = column.field.split('.');\n let value: unknown = element;\n for(const key of keys) {\n if (value === null || value === undefined) {\n return undefined;\n }\n value = (value as Record<string, unknown>)[key];\n }\n return value;\n }\n\n /**\n * Produces the formatted cell content when a column defines a `formatter` callback.\n * Returns `null` when no formatter is configured so the template can fall back to\n * the dataType-driven rendering.\n */\n protected getFormattedValue(element: Record<string, unknown>, column: TableColumn): string | null {\n if (!column.formatter) return null;\n const value = this.getValue(element, column);\n return column.formatter(value, element);\n }\n\n /**\n * Plain-text representation of the cell value used as the `title` attribute on truncated\n * cells so the full string is reachable via the browser's native tooltip on hover.\n * Honours `formatter` first, then falls back to a stringified raw value.\n */\n protected getCellTitle(element: Record<string, unknown>, column: TableColumn): string | null {\n const formatted = this.getFormattedValue(element, column);\n if (formatted !== null && formatted !== undefined) {\n return formatted;\n }\n const value = this.getValue(element, column);\n if (value === null || value === undefined) return null;\n return String(value);\n }\n\n protected getFilterType(column: TableColumn): 'text' | 'numeric' | 'boolean' | 'date' {\n switch (column.dataType) {\n case 'text':\n case 'numeric':\n case 'boolean':\n case 'date':\n return column.dataType;\n case 'booleanIcon':\n return 'boolean';\n case 'numericRange':\n case 'progressBar':\n return 'numeric';\n case 'iso8601':\n return 'date';\n default:\n return 'text';\n }\n }\n\n /**\n * State of a `booleanIcon` cell (AB#5623): `'true'` / `'false'` for booleans (also the strings\n * \"true\" / \"false\"), `null` for an empty or non-boolean value (empty cell).\n */\n protected booleanIconState(element: Record<string, unknown>, column: TableColumn): 'true' | 'false' | null {\n const value = this.getValue(element, column);\n if (value === true || value === 'true') return 'true';\n if (value === false || value === 'false') return 'false';\n return null;\n }\n\n /** Icon of a `booleanIcon` cell: the column's `booleanIcons`, else check / x; `null` = no icon. */\n protected booleanIcon(column: TableColumn, state: 'true' | 'false'): SVGIcon | null {\n const icons = column.booleanIcons;\n if (state === 'true') {\n return icons?.true ?? checkIcon;\n }\n return icons?.false === null ? null : icons?.false ?? xIcon;\n }\n\n /** Accessible name of a `booleanIcon` cell: \"<column>: Yes|No\" from the messages (AB#5623). */\n protected booleanIconLabel(column: TableColumn, state: 'true' | 'false'): string {\n const value = state === 'true' ? this._messages.booleanYes : this._messages.booleanNo;\n const name = this.getDisplayName(column) ?? '';\n return name ? this._messages.booleanIconLabel.replace('{column}', name).replace('{value}', value) : value;\n }\n\n /** Input attributes of a read-only boolean cell, cached per column and name (AB#5621). */\n private readonly booleanCellAttributeCache = new WeakMap<TableColumn, { name: string; attributes: Record<string, string> }>();\n\n /**\n * Input attributes of a `boolean` cell's read-only checkbox: its accessible name is the column's\n * display name (AB#5621), so a screen reader announces \"<column>, checked\" instead of an unnamed\n * checkbox.\n */\n protected booleanCellAttributes(column: TableColumn): Record<string, string> {\n const name = this.getDisplayName(column) ?? '';\n const cached = this.booleanCellAttributeCache.get(column);\n if (cached && cached.name === name) {\n return cached.attributes;\n }\n const attributes: Record<string, string> = name ? { 'aria-label': name } : {};\n this.booleanCellAttributeCache.set(column, { name, attributes });\n return attributes;\n }\n\n /**\n * Gets all status field configurations for a statusIcons column.\n * Returns an array of StatusFieldConfig, whether the column uses single or multi-field configuration.\n */\n protected getStatusFields(column: TableColumn): StatusFieldConfig[] {\n if (column.statusFields && column.statusFields.length > 0) {\n return column.statusFields;\n } else if (column.statusMapping) {\n return [{field: column.field, statusMapping: column.statusMapping}];\n } else {\n return [];\n }\n }\n\n /**\n * Gets the status icon mapping for a specific field value in a data item.\n */\n protected getStatusIconMapping(dataItem: Record<string, unknown>, fieldConfig: StatusFieldConfig): StatusIconMapping | null {\n const value = this.getFieldValue(dataItem, fieldConfig.field);\n if (value === null || value === undefined) {\n return null;\n }\n return fieldConfig.statusMapping[String(value)] ?? null;\n }\n\n /**\n * Resolves the badge appearance for a cell from the column's `badgeMapping`. Returns null when\n * no mapping is configured or no entry matches the cell's value — the template falls back to a\n * neutral default badge in that case so missing-mapping entries don't blank out the column.\n */\n protected getBadgeMapping(dataItem: Record<string, unknown>, column: TableColumn): BadgeMapping | null {\n if (!column.badgeMapping) {\n return null;\n }\n const value = this.getFieldValue(dataItem, column.field);\n if (value === null || value === undefined) {\n return null;\n }\n return column.badgeMapping[String(value)] ?? null;\n }\n\n /**\n * Helper to get a field value from a data item, supporting nested fields.\n */\n private getFieldValue(element: Record<string, unknown>, field: string): unknown {\n if (field.indexOf('.') === -1) {\n return element[field];\n }\n const keys = field.split('.');\n let value: unknown = element;\n for (const key of keys) {\n if (value === null || value === undefined) {\n return null;\n }\n value = (value as Record<string, unknown>)[key];\n }\n return value;\n }\n\n /**\n * Resolves the @Input bindings for a `dataType: 'component'` cell.\n * Returns an empty object when no `cellInputs` factory is configured so\n * `*ngComponentOutlet` still renders the component (with its default state).\n */\n protected getCellInputs(dataItem: Record<string, unknown>, column: TableColumn): Record<string, unknown> {\n return column.cellInputs ? column.cellInputs(dataItem) : {};\n }\n\n /**\n * Gets the human-readable description of a cron expression.\n */\n protected getCronHumanReadable(expression: unknown): string {\n if (!expression || typeof expression !== 'string') return '';\n return this.cronHumanizer.toHumanReadable(expression, 'en');\n }\n\n protected hasFilterOptions(column: TableColumn): boolean {\n return !!column.filterOptions && column.filterOptions.length > 0;\n }\n\n protected getSelectedFilterValue(column: TableColumn): string | null {\n const grid = this.gridComponent;\n if (!grid) return null;\n const filter = grid.filter as CompositeFilterDescriptor;\n if (!filter?.filters) return null;\n const fd = filter.filters.find(\n f => 'field' in f && (f as FilterDescriptor).field === column.field\n ) as FilterDescriptor | undefined;\n return fd?.value as string | null ?? null;\n }\n\n protected onDropdownFilter(value: string | null, column: TableColumn): void {\n const grid = this.gridComponent;\n if (!grid) return;\n\n const currentFilter: CompositeFilterDescriptor = grid.filter as CompositeFilterDescriptor ?? { logic: 'and', filters: [] };\n // Remove existing filter for this field\n const otherFilters = currentFilter.filters.filter(\n f => !('field' in f) || (f as FilterDescriptor).field !== column.field\n );\n\n if (value) {\n otherFilters.push({ field: column.field, operator: 'eq', value });\n }\n\n const newFilter: CompositeFilterDescriptor = { logic: 'and', filters: otherFilters };\n grid.filter = newFilter;\n // Sync filter into directive state and trigger rebind\n this.dataBindingDirective?.notifyFilterChange(newFilter);\n }\n\n protected getRangeFilterValue(column: TableColumn, operator: 'gte' | 'lte'): number | null {\n const grid = this.gridComponent;\n if (!grid?.filter) return null;\n const currentFilter = grid.filter as CompositeFilterDescriptor;\n const fd = currentFilter.filters.find(\n f => 'field' in f && (f as FilterDescriptor).field === column.field &&\n (f as FilterDescriptor).operator === operator\n ) as FilterDescriptor | undefined;\n return fd?.value as number | null ?? null;\n }\n\n protected onRangeFilterChange(value: number | null, column: TableColumn, operator: 'gte' | 'lte'): void {\n const grid = this.gridComponent;\n if (!grid) return;\n\n const currentFilter: CompositeFilterDescriptor = grid.filter as CompositeFilterDescriptor ?? { logic: 'and', filters: [] };\n // Remove existing filter for this field + operator\n const otherFilters = currentFilter.filters.filter(\n f => !('field' in f) || (f as FilterDescriptor).field !== column.field ||\n (f as FilterDescriptor).operator !== operator\n );\n\n if (value !== null && value !== undefined) {\n otherFilters.push({ field: column.field, operator, value });\n }\n\n const newFilter: CompositeFilterDescriptor = { logic: 'and', filters: otherFilters };\n grid.filter = newFilter;\n this.dataBindingDirective?.notifyFilterChange(newFilter);\n }\n\n protected onShowRowFilter() {\n if (this.rowFilterEnabled) {\n this._showRowFilter = !this._showRowFilter;\n }\n }\n\n protected onRefresh() {\n this.onRefreshData.emit();\n }\n\n /**\n * Resets all filtering back to the default view: clears the row filter,\n * column sort, free-text search and page offset, drops the persisted state,\n * and emits {@link onResetFilters} so the host can also reset its own\n * quick-view/bar filters.\n */\n protected onReset(): void {\n this.dataBindingDirective?.resetState();\n this.restoreSearchValue(null);\n this.resetFilters.emit();\n }\n\n public onExecuteFilter = new EventEmitter<string | null>();\n public onRefreshData = new EventEmitter<void>();\n /** Emitted when the toolbar \"Reset Filters\" button is clicked (host resets its bar filters). */\n @Output() public resetFilters = new EventEmitter<void>();\n\n protected async onFilter(value: string | null): Promise<void> {\n this.searchValue = value || '';\n this.searchSubject.next(value);\n }\n\n /**\n * Restores the search box's displayed text without re-triggering a fetch\n * (used by {@link MmListViewDataBindingDirective} when replaying a persisted\n * list state — the directive already carries the value into the initial fetch).\n */\n public restoreSearchValue(value: string | null): void {\n this.searchValue = value || '';\n }\n\n protected readonly filterIcon = filterIcon;\n protected readonly pdfSVG: SVGIcon = filePdfIcon;\n protected readonly excelSVG: SVGIcon = fileExcelIcon;\n protected readonly refreshIcon = arrowRotateCwIcon;\n protected readonly resetFilterIcon = filterClearIcon;\n\n protected onRowSelect(event: SelectionEvent) {\n // _selectedRows is an array of selected rows\n // here all dataItems of the selected Rows are pushed into _selectedRows\n this._selectedRows.push(...event.selectedRows?.map(r => r.dataItem) ?? []);\n // remove event.deselectedRows from _selectedRows\n this._selectedRows = this._selectedRows.filter(r => !event.deselectedRows?.map(r => r.dataItem)?.includes(r));\n\n if (this.rowIsClickable) {\n this.rowClicked.emit(this._selectedRows); // Emit the clicked row data\n }\n }\n\n protected onPageChange(_event: PageChangeEvent) {\n this._selectedRows = [];\n }\n\n protected async onContextMenuSelect(_event: ContextMenuSelectEvent): Promise<void> {\n\n const data = _event.item?.data?.data as CommandItem | OverflowRowActionData | undefined;\n if (!data) {\n return;\n }\n if (isOverflowRowActionData(data)) {\n const row = this._actionMenuSelectedRow;\n if (data.entry.commandItem) {\n await this.navigateAsync(data.entry.commandItem, row);\n } else {\n await this.triggerRowAction(data.entry, row);\n }\n return;\n }\n const commandItem = data;\n\n if (this._actionMenuSelectedRow) {\n await this.navigateAsync(commandItem, this._actionMenuSelectedRow);\n } else if (this._selectedRows.length > 0) {\n if (this._selectedRows.length === 1) {\n await this.navigateAsync(commandItem, this._selectedRows[0]);\n } else {\n await this.navigateAsync(commandItem, this._selectedRows);\n }\n } else if (this._contextMenuSelectedRow) {\n await this.navigateAsync(commandItem, this._contextMenuSelectedRow);\n }\n }\n\n protected onCellClick(e: CellClickEvent): void {\n if (e.type === 'contextmenu' && this.contextMenuType === 'contextMenu') {\n const originalEvent = e.originalEvent;\n originalEvent.preventDefault();\n\n this._contextMenuSelectedRow = e.dataItem;\n\n this.gridContextMenu?.show({\n left: this.clampContextMenuX(originalEvent.pageX),\n top: originalEvent.pageY,\n });\n }\n }\n\n /**\n * On narrow (phone) viewports the context-menu popup opened at the pointer\n * can overflow the right edge — Kendo's collision fit checks against a\n * layout viewport the overflowing popup itself just widened, so it never\n * kicks in. Clamp the anchor so a typically-sized menu stays on screen;\n * wide viewports keep Kendo's own positioning untouched (AB#4930).\n */\n private clampContextMenuX(x: number): number {\n const viewportWidth = document.documentElement.clientWidth;\n if (viewportWidth >= 768) {\n return x;\n }\n const estimatedMenuWidth = Math.min(288, viewportWidth - 16);\n return Math.max(8, Math.min(x, viewportWidth - estimatedMenuWidth));\n }\n\n protected async onSelectOptionActionItem(event: Event, dataItem: unknown, menuItem: MenuItem): Promise<void> {\n // Stop propagation to prevent grid from handling the click (e.g., for selection)\n event.stopPropagation();\n event.preventDefault();\n\n console.debug('onSelectOptionActionItem', { dataItem, menuItem });\n\n const commandItem = menuItem.data as CommandItem;\n if (!commandItem) {\n console.warn('onSelectOptionActionItem: No commandItem found in menuItem.data');\n return;\n }\n\n await this.navigateAsync(commandItem, dataItem);\n }\n\n /**\n * Row field naming a row for assistive technology (row menu \"Actions for <name>\", action\n * buttons \"<action> <name>\"). Falls back to `rtWellKnownName`, then `rtId`. A dotted path\n * (`contact.displayName`) reads a nested value (AB#5623).\n */\n @Input() public rowLabelField = 'name';\n\n /** Human name of a row (`rowLabelField`, `rtWellKnownName`, `rtId`), or '' when unknown. */\n protected rowLabel(dataItem: unknown): string {\n return resolveListRowLabel(dataItem, this.rowLabelField);\n }\n\n /** Accessible name and tooltip of the row menu button. */\n protected rowActionsLabel(dataItem: unknown): string {\n const name = this.rowLabel(dataItem);\n return name ? this.messages.rowActionsFor.replace('{name}', name) : this.messages.rowActions;\n }\n\n protected getMenuItemVisible(menuItem: MenuItem, dataItem: unknown): boolean {\n const commandItem = menuItem.data as CommandItem;\n if (commandItem) {\n return CommandBaseService.getIsVisibleSync(commandItem, dataItem);\n }\n return true;\n }\n\n protected getMenuItemDisabled(menuItem: MenuItem, dataItem: unknown): boolean {\n const commandItem = menuItem.data as CommandItem;\n if (commandItem) {\n return CommandBaseService.getIsDisabled(commandItem, dataItem);\n }\n return menuItem.disabled ?? false;\n }\n\n protected onContextMenu(dataItem: unknown, e: PointerEvent) {\n this._actionMenuSelectedRow = dataItem;\n // Rebuild context menu items with updated disabled state for the current row.\n // A new array reference is needed so Kendo's kendoMenuHierarchyBinding detects the change.\n const overflow = this.rowActionsView(dataItem).menu.map((entry): MenuItem => ({\n text: entryMenuText(entry.action),\n svgIcon: entry.action.icon as SVGIcon,\n data: {mmRowAction: true, entry} satisfies OverflowRowActionData,\n disabled: isActionDisabled(entry.action),\n cssClass: entry.action.danger ? DANGER_MENU_ITEM_CLASS : undefined,\n }));\n const contextItems = this.contextMenuType === 'actionMenu'\n ? this.buildContextMenuItemsWithDisabledState(this._contextMenuCommandItems, dataItem)\n : [];\n this._contextMenuItems = overflow.length && contextItems.length\n ? [...overflow, {separator: true}, ...contextItems]\n : [...overflow, ...contextItems];\n this.gridContextMenu?.show({\n left: this.clampContextMenuX(e.pageX),\n top: e.pageY,\n });\n }\n\n private buildContextMenuItemsWithDisabledState(commandItems: CommandItem[], dataItem: unknown): MenuItem[] {\n const items: MenuItem[] = [];\n for (const commandItem of commandItems) {\n if (commandItem.type === 'separator') {\n items.push({ separator: true });\n } else {\n let childMenuItems: MenuItem[] | undefined;\n if (commandItem.children) {\n childMenuItems = this.buildContextMenuItemsWithDisabledState(commandItem.children, dataItem);\n }\n items.push({\n text: commandItem.text,\n svgIcon: commandItem.svgIcon as SVGIcon,\n data: commandItem,\n items: childMenuItems,\n disabled: CommandBaseService.getIsDisabled(commandItem, dataItem),\n cssClass: commandItem.danger ? DANGER_MENU_ITEM_CLASS : undefined,\n });\n }\n }\n return items;\n }\n\n protected onContextMenuClosed(_event: ContextMenuPopupEvent) {\n this._contextMenuSelectedRow = null;\n this._actionMenuSelectedRow = null;\n // Back to the static items: `hasContextMenuButton` and the column width rely on them.\n this._contextMenuItems = this.buildMenuItems(this._contextMenuCommandItems);\n }\n\n /**\n * Row actions of one row (AB#5572): `actionCommandItems` (adapter) followed by `rowActions`,\n * split into inline buttons and overflow-menu entries (max {@link maxInlineRowActions} slots,\n * context menu items and `overflow: true` actions force the \"…\" button).\n */\n protected rowActionsView(dataItem: unknown): RowActionsView {\n const loadingReason = this.isLoading() ? this._messages.rowActionsLoading : null;\n const resolved: ResolvedListRowAction[] = [];\n for (const commandItem of this._actionCommandItems) {\n if (commandItem.type === 'separator' || !CommandBaseService.getIsVisibleSync(commandItem, dataItem)) {\n continue;\n }\n resolved.push({commandItem, action: this.commandItemAction(commandItem, dataItem, loadingReason)});\n }\n for (const rowAction of this._rowActions) {\n const action = resolveListRowAction(rowAction, dataItem);\n if (!isActionVisible(action)) {\n continue;\n }\n resolved.push({rowAction, action: loadingReason && !isActionDisabled(action) ? {...action, disabledReason: loadingReason} : action});\n }\n\n const candidates = resolved.filter(e => !e.action.overflow);\n const forced = resolved.filter(e => e.action.overflow);\n const slots = Math.max(1, Math.floor(this.maxInlineRowActions));\n const needsMenu = forced.length > 0 || candidates.length > slots || this.hasContextMenuButton;\n const inlineCount = needsMenu ? Math.max(0, slots - 1) : candidates.length;\n const view: RowActionsView = {\n inline: candidates.slice(0, inlineCount),\n menu: [...candidates.slice(inlineCount), ...forced],\n hasMenu: needsMenu,\n };\n return this.stableView(dataItem, view);\n }\n\n /** Accessible name of the row action group: \"Actions for <row>\". */\n protected rowActionsGroupLabel(dataItem: unknown): string {\n return this.rowActionsLabel(dataItem);\n }\n\n protected async onInlineRowAction(entry: ResolvedListRowAction, dataItem: unknown): Promise<void> {\n if (entry.commandItem) {\n // A routerLink-rendered action navigated already; CommandItems never use MmAction.link.\n await this.navigateAsync(entry.commandItem, dataItem);\n return;\n }\n // Inline link actions navigate via their own routerLink.\n await this.triggerRowAction(entry, dataItem, !!entry.action.link);\n }\n\n private async triggerRowAction(entry: ResolvedListRowAction, row: unknown, navigated = false): Promise<void> {\n const action = entry.action;\n if (isActionDisabled(action)) {\n return;\n }\n if (!navigated && action.link && this.routerForActions) {\n const commands = typeof action.link.commands === 'string' ? [action.link.commands] : [...action.link.commands];\n void this.routerForActions.navigate(commands, {queryParams: action.link.queryParams, relativeTo: this.activatedRoute ?? undefined});\n }\n this.rowAction.emit({id: action.id, action, row});\n await entry.rowAction?.run?.(row);\n }\n\n /** `CommandItem` → `MmAction` adapter (AB#5572): `isDisabled` → reason, `danger`, icon, text. */\n private commandItemAction(commandItem: CommandItem, dataItem: unknown, loadingReason: string | null): MmAction {\n let disabledReason: string | null = null;\n if (CommandBaseService.getIsDisabled(commandItem, dataItem)) {\n const reason = typeof commandItem.disabledReason === 'function'\n ? commandItem.disabledReason(dataItem)\n : commandItem.disabledReason;\n disabledReason = reason && reason.trim() ? reason : this._messages.rowActionUnavailable;\n }\n return {\n id: commandItem.id,\n label: commandItem.text || commandItem.tooltip || commandItem.id,\n icon: commandItem.svgIcon as SVGIcon | undefined,\n danger: !!commandItem.danger,\n disabledReason: disabledReason ?? loadingReason,\n };\n }\n\n private stableView(dataItem: unknown, view: RowActionsView): RowActionsView {\n if (typeof dataItem !== 'object' || dataItem === null) {\n return view;\n }\n const previous = this.rowActionCache.get(dataItem);\n if (previous && sameEntries(previous.inline, view.inline) && sameEntries(previous.menu, view.menu)\n && previous.hasMenu === view.hasMenu) {\n return previous;\n }\n this.rowActionCache.set(dataItem, view);\n return view;\n }\n\n\n protected async onToolbarCommand(commandItem: CommandItem): Promise<void> {\n if (this._selectedRows.length === 1) {\n await this.navigateAsync(commandItem, this._selectedRows[0]);\n } else {\n await this.navigateAsync(commandItem, this._selectedRows);\n }\n }\n\n protected async onToolbarDropdownItemClick(childItem: CommandItem): Promise<void> {\n if (this._selectedRows.length === 1) {\n await this.navigateAsync(childItem, this._selectedRows[0]);\n } else {\n await this.navigateAsync(childItem, this._selectedRows);\n }\n }\n\n private buildMenuItems(commandItems: CommandItem[]): MenuItem[] {\n\n const items = new Array<MenuItem>();\n\n for (const commandItem of commandItems) {\n\n if (commandItem.type === 'separator') {\n items.push({separator: true});\n } else {\n\n let childMenuItems: MenuItem[] | undefined = undefined;\n if (commandItem.children) {\n childMenuItems = this.buildMenuItems(commandItem.children)\n }\n\n items.push({\n text: commandItem.text,\n svgIcon: commandItem.svgIcon,\n data: commandItem,\n items: childMenuItems,\n cssClass: commandItem.danger ? DANGER_MENU_ITEM_CLASS : undefined,\n });\n }\n }\n\n return items;\n }\n\n protected getPdfPageText(pageNum: number, totalPages: number): string {\n return this._messages.pdfPageTemplate\n .replace('{pageNum}', String(pageNum))\n .replace('{totalPages}', String(totalPages));\n }\n\n protected readonly moreVerticalIcon = moreVerticalIcon;\n /**\n * Sliders, not an ellipsis. Host toolbars conventionally use the vertical\n * ellipsis for their own overflow group, and two \"more\" menus side by side\n * say nothing about which holds what. These commands are the table's options\n * — filter, exports, refresh — so the icon says \"options\" and the two menus\n * are told apart by meaning rather than by dot orientation.\n */\n protected readonly commandsIcon = slidersIcon;\n\n\n}\n","<!-- Shared cell renderer (AB#4930): used by the regular grid columns AND the\n card-mode body lines, so both render every dataType identically. -->\n<ng-template #cellContent let-element=\"element\" let-column=\"column\">\n @if (column.formatter) {\n {{ getFormattedValue(element, column) }}\n } @else {\n @switch (column.dataType) {\n @case ('boolean') {\n <!-- Read-only marker: named after its column so a screen reader says what is checked (AB#5621). -->\n <kendo-checkbox type=\"checkbox\" [checkedState]=\"$any(getValue(element, column))\" [disabled]=\"true\"\n [inputAttributes]=\"booleanCellAttributes(column)\" />\n }\n @case ('booleanIcon') {\n <!-- Boolean as icon (AB#5623): named \"<column>: Yes|No\" like the status icons (G13). -->\n @if (booleanIconState(element, column); as state) {\n @if (booleanIcon(column, state); as icon) {\n <span\n class=\"boolean-icon\"\n [class.boolean-icon--true]=\"state === 'true'\"\n [class.boolean-icon--false]=\"state === 'false'\"\n role=\"img\"\n [title]=\"booleanIconLabel(column, state)\"\n [attr.aria-label]=\"booleanIconLabel(column, state)\"\n [style.color]=\"state === 'true' ? column.booleanIcons?.trueColor : column.booleanIcons?.falseColor\">\n <kendo-svg-icon [icon]=\"icon\"></kendo-svg-icon>\n </span>\n }\n }\n }\n @case ('iso8601') {\n {{ $any(getValue(element, column)) | date:column.format }}\n }\n @case ('bytes') {\n {{ $any(getValue(element, column)) | bytesToSize }}\n }\n @case ('statusIcons') {\n <span class=\"status-icons-cell\">\n @for (fieldConfig of getStatusFields(column); track fieldConfig.field) {\n @if (getStatusIconMapping(element, fieldConfig); as mapping) {\n <!-- Icon-only status: the mapping's tooltip is also its accessible name (AB#5621). -->\n <span\n class=\"status-icon\"\n role=\"img\"\n [title]=\"mapping.tooltip\"\n [attr.aria-label]=\"mapping.tooltip || null\"\n [style.color]=\"mapping.color\">\n <kendo-svg-icon [icon]=\"mapping.icon\"></kendo-svg-icon>\n </span>\n }\n }\n </span>\n }\n @case ('cronExpression') {\n <span class=\"cron-expression-cell\">\n <code class=\"cron-expression\">{{ getValue(element, column) }}</code>\n <span class=\"cron-description\">{{ getCronHumanReadable(getValue(element, column)) }}</span>\n </span>\n }\n @case ('numeric') {\n {{ $any(getValue(element, column)) | number:column.format }}\n }\n @case ('progressBar') {\n <span class=\"progress-bar-cell\">\n <span class=\"progress-bar-track\">\n <span class=\"progress-bar-fill\" [style.width.%]=\"getValue(element, column)\"></span>\n </span>\n <span class=\"progress-bar-label\">{{ getValue(element, column) }}%</span>\n </span>\n }\n @case ('badge') {\n @if (getBadgeMapping(element, column); as badge) {\n <span\n class=\"badge-cell\"\n [title]=\"badge.tooltip ?? ''\"\n [style.color]=\"badge.color\"\n [style.background]=\"badge.backgroundColor\"\n [style.borderColor]=\"badge.borderColor ?? badge.backgroundColor\">\n {{ badge.label ?? getValue(element, column) }}\n </span>\n } @else if (!column.badgeHideUnmapped) {\n <span class=\"badge-cell badge-cell-default\">{{ getValue(element, column) }}</span>\n }\n }\n @case ('component') {\n @if (column.cellComponent) {\n <ng-container *ngComponentOutlet=\"column.cellComponent; inputs: getCellInputs(element, column)\" />\n }\n }\n @default {\n {{ getValue(element, column) }}\n }\n }\n }\n</ng-template>\n\n<!-- Row actions (AB#4930, AB#5572): shared by the actions column and the card header. One MmAction\n per action (CommandItems via adapter): neutral icon buttons, danger colour only for destructive\n actions, max `maxInlineRowActions` slots, the rest (and the context menu) behind \"…\". Disabled\n actions stay focusable and announce their reason (mm-action-button). -->\n<ng-template #rowActions let-dataItem=\"dataItem\">\n @let view = rowActionsView(dataItem);\n @if (view.inline.length > 0 || view.hasMenu) {\n <span class=\"mm-list-view-row-actions\" role=\"group\" [attr.aria-label]=\"rowActionsGroupLabel(dataItem)\">\n @for (entry of view.inline; track entry.action.id) {\n <!-- Clicks never reach the grid (no row selection / row navigation from an action). -->\n <mm-action-button [action]=\"entry.action\" [targetLabel]=\"rowLabel(dataItem)\" context=\"row\" display=\"icon\"\n (click)=\"$event.stopPropagation()\"\n (triggered)=\"onInlineRowAction(entry, dataItem)\" />\n }\n @if (view.hasMenu) {\n <button kendoButton themeColor=\"base\" fillMode=\"flat\" size=\"small\" class=\"mm-list-view-row-actions__more\"\n [svgIcon]=\"moreVerticalIcon\" data-action=\"more\"\n [title]=\"rowActionsLabel(dataItem)\" [attr.aria-label]=\"rowActionsLabel(dataItem)\" aria-haspopup=\"menu\"\n [disabled]=\"isLoading()\" (click)=\"$event.stopPropagation(); onContextMenu(dataItem, $event)\"></button>\n }\n </span>\n }\n</ng-template>\n\n<!-- One host toolbar action (left or right band). Flat + neutral unless `primary` (AB#6211). With\n `isDisabled` + `disabledReason` the control stays focusable (aria-disabled), announces the reason\n (aria-describedby) and shows it as a hint bubble on keyboard focus (guideline §2.5); clicks and\n menu opening are swallowed. Applies to buttons, split and dropdown buttons alike. -->\n<ng-template #toolbarItem let-commandItem let-side=\"side\" let-index=\"index\">\n @if (commandItem) {\n @switch (commandItem.type) {\n @case ('link') {\n @let reason = toolbarItemDisabledReason(commandItem);\n @let reasonId = toolbarReasonId(side, index);\n <span class=\"mm-list-view-toolbar-action\" [class.mm-list-view-toolbar-action--disabled]=\"!!reason\"\n (pointerdown)=\"onToolbarPointerDown()\"\n (focusin)=\"onToolbarFocusIn($event, reason)\"\n (focusout)=\"closeToolbarHint()\"\n (keydown.escape)=\"closeToolbarHint()\">\n @if (commandItem.children && commandItem.children.length > 0 && commandItem.onClick) {\n <kendo-splitbutton\n [data]=\"commandItem.children\"\n [svgIcon]=\"$any(commandItem.svgIcon)\"\n [disabled]=\"(getToolbarItemDisabled(commandItem) && !reason) || isLoading()\"\n [textField]=\"'text'\"\n [themeColor]=\"toolbarItemThemeColor(commandItem)\"\n [fillMode]=\"$any(toolbarItemFillMode(commandItem))\"\n [title]=\"toolbarItemTitle(commandItem, reason)\"\n [buttonAttributes]=\"toolbarItemButtonAttributes(commandItem, reason ? reasonId : null)\"\n [attr.data-toolbar-action]=\"commandItem.id\"\n (buttonClick)=\"reason ? null : onToolbarCommand(commandItem)\"\n (open)=\"reason ? $event.preventDefault() : null\"\n (itemClick)=\"onToolbarDropdownItemClick($event)\">\n {{ commandItem.text }}\n </kendo-splitbutton>\n } @else if (commandItem.children && commandItem.children.length > 0) {\n <kendo-dropdownbutton\n [data]=\"commandItem.children\"\n [svgIcon]=\"$any(commandItem.svgIcon)\"\n [disabled]=\"(getToolbarItemDisabled(commandItem) && !reason) || isLoading()\"\n [textField]=\"'text'\"\n [themeColor]=\"toolbarItemThemeColor(commandItem)\"\n [fillMode]=\"$any(toolbarItemFillMode(commandItem))\"\n [title]=\"toolbarItemTitle(commandItem, reason)\"\n [buttonAttributes]=\"toolbarItemButtonAttributes(commandItem, reason ? reasonId : null)\"\n [attr.data-toolbar-action]=\"commandItem.id\"\n (open)=\"reason ? $event.preventDefault() : null\"\n (itemClick)=\"onToolbarDropdownItemClick($event)\">\n {{ commandItem.text }}\n </kendo-dropdownbutton>\n } @else {\n <button kendoTooltip kendoButton [svgIcon]=\"$any(commandItem.svgIcon)\"\n [themeColor]=\"toolbarItemThemeColor(commandItem)\"\n [fillMode]=\"$any(toolbarItemFillMode(commandItem))\"\n [attr.data-toolbar-action]=\"commandItem.id\"\n [title]=\"toolbarItemTitle(commandItem, reason)\"\n [attr.aria-label]=\"toolbarItemAriaLabel(commandItem)\"\n [attr.aria-disabled]=\"reason ? 'true' : null\"\n [attr.aria-describedby]=\"reason ? reasonId : null\"\n [disabled]=\"(getToolbarItemDisabled(commandItem) && !reason) || isLoading()\"\n (click)=\"reason ? $event.preventDefault() : onToolbarCommand(commandItem)\">{{ commandItem.text }}\n </button>\n }\n @if (reason) {\n <span class=\"mm-list-view-toolbar-reason\" [id]=\"reasonId\">{{ reason }}</span>\n }\n </span>\n }\n @case ('separator') {\n <kendo-separator></kendo-separator>\n }\n }\n }\n</ng-template>\n\n<!-- Disabled reason shown on keyboard focus (AB#6211): opened with the Kendo PopupService under the\n application root, so the grid / toolbar overflow cannot clip it. -->\n<ng-template #toolbarHint>\n <div class=\"mm-list-view-toolbar-hint\" data-toolbar-hint>{{ toolbarHintText() }}</div>\n</ng-template>\n\n<kendo-grid\n mmListViewDataBinding\n [loading]=\"isLoading()\"\n [pageSize]=\"effectivePageSize()\" [selectable]=\"selectable\" (pageChange)=\"onPageChange($event)\"\n [skip]=\"skip\" (selectionChange)=\"onRowSelect($event)\" (cellClick)=\"onCellClick($event)\"\n [pageable]=\"effectivePageable\"\n [sortable]=\"sortable\"\n [filterable]=\"_showRowFilter && !isCardMode\"\n [resizable]=\"resizable\"\n [rowClass]=\"rowClass ?? defaultRowClass\"\n>\n <kendo-grid-messages\n [pagerItemsPerPage]=\"_messages.pagerItemsPerPage\"\n [pagerOf]=\"_messages.pagerOf\"\n [pagerItems]=\"_messages.pagerItems\"\n [pagerPage]=\"_messages.pagerPage\"\n [pagerFirstPage]=\"_messages.pagerFirstPage\"\n [pagerLastPage]=\"_messages.pagerLastPage\"\n [pagerPreviousPage]=\"_messages.pagerPreviousPage\"\n [pagerNextPage]=\"_messages.pagerNextPage\"\n [noRecords]=\"_messages.noRecords\"\n ></kendo-grid-messages>\n <!-- Empty state (AB#3444): one block per list, never per row. -->\n <ng-template kendoGridNoRecordsTemplate>\n @if (emptyTemplate) {\n <ng-container *ngTemplateOutlet=\"emptyTemplate; context: emptyContext\"></ng-container>\n } @else if (emptyState) {\n @if (loadSettled() && !isLoading()) {\n @if (isFiltered) {\n <mm-empty-state class=\"mm-list-view-empty\" variant=\"no-results\"\n [heading]=\"emptyState.filteredTitle || _messages.noResultsTitle\"\n [text]=\"emptyState.filteredText || _messages.noResultsText\"></mm-empty-state>\n } @else {\n <mm-empty-state class=\"mm-list-view-empty\" variant=\"empty\"\n [heading]=\"emptyState.title\" [text]=\"emptyState.text\"></mm-empty-state>\n }\n }\n } @else {\n {{ _messages.noRecords }}\n }\n </ng-template>\n <ng-template kendoGridToolbarTemplate>\n\n @for (commandItem of leftToolbarActions; track commandItem.id; let i = $index) {\n <ng-container [ngTemplateOutlet]=\"toolbarItem\" [ngTemplateOutletContext]=\"{$implicit: commandItem, side: 'left', index: i}\" />\n }\n\n <!-- Host scope/filter controls (view switches and the like). They steer the\n table, so they sit in the table's own band instead of a second strip\n stacked above the grid. -->\n @if (filtersTemplate) {\n <!-- A rule between the host's actions and its filters: both sit on the\n left of the same band, but one acts on records and the other changes\n what the list shows. Only drawn when actions precede them. -->\n @if (leftToolbarActions.length > 0) {\n <kendo-separator class=\"mm-toolbar-filters-separator\"></kendo-separator>\n }\n <div class=\"mm-toolbar-filters\">\n <ng-container [ngTemplateOutlet]=\"filtersTemplate.templateRef\"></ng-container>\n </div>\n }\n\n <kendo-grid-spacer></kendo-grid-spacer>\n @if (searchTextBoxEnabled) {\n <input\n class=\"k-textbox k-input k-input-md k-rounded-md mm-search-input\"\n [placeholder]=\"_messages.searchPlaceholder\"\n [value]=\"searchValue\"\n (input)=\"onFilter($any($event.target).value || null)\"\n />\n }\n\n @for (commandItem of rightToolbarActions; track commandItem.id; let i = $index) {\n <ng-container [ngTemplateOutlet]=\"toolbarItem\" [ngTemplateOutletContext]=\"{$implicit: commandItem, side: 'right', index: i}\" />\n }\n\n <!-- Commands: laid out while there is room, collapsed into one menu once\n the list gets narrow. Same behaviour in every host app — a list this\n wide has space for five buttons, and a list this narrow does not. -->\n @if (commandsCollapsed) {\n <kendo-dropdownbutton class=\"mm-toolbar-commands\" [data]=\"toolbarCommands\" textField=\"text\" [svgIcon]=\"commandsIcon\"\n fillMode=\"flat\" themeColor=\"primary\" [disabled]=\"isLoading()\"\n [title]=\"_messages.commands\"\n [buttonAttributes]=\"commandsMenuButtonAttributes\"\n (itemClick)=\"onCommand($any($event).id)\"></kendo-dropdownbutton>\n } @else {\n @for (command of toolbarCommands; track command.id) {\n @switch (command.id) {\n @case ('excel') {\n <button kendoTooltip kendoGridExcelCommand themeColor=\"primary\" fillMode=\"flat\"\n [svgIcon]=\"command.svgIcon\" [disabled]=\"isLoading()\" [title]=\"command.text\"\n [attr.aria-label]=\"command.text\" [attr.data-command]=\"command.id\"></button>\n }\n @case ('pdf') {\n <button kendoTooltip kendoGridPDFCommand themeColor=\"primary\" fillMode=\"flat\"\n [svgIcon]=\"command.svgIcon\" [disabled]=\"isLoading()\" [title]=\"command.text\"\n [attr.aria-label]=\"command.text\" [attr.data-command]=\"command.id\"></button>\n }\n @default {\n <!-- The row filter is a toggle: its on state is shown (k-selected) and announced. -->\n <button kendoTooltip kendoButton themeColor=\"primary\" fillMode=\"flat\"\n [svgIcon]=\"command.svgIcon\" (click)=\"onCommand(command.id)\"\n [class.k-selected]=\"command.id === 'rowFilter' && _showRowFilter\"\n [attr.aria-pressed]=\"command.id === 'rowFilter' ? _showRowFilter : null\"\n [attr.data-command]=\"command.id\"\n [disabled]=\"isLoading()\" [title]=\"command.text\" [attr.aria-label]=\"command.text\"></button>\n }\n }\n }\n }\n </ng-template>\n\n @if (showCheckboxColumn()) {\n <kendo-grid-checkbox-column [showSelectAll]=\"showRowSelectAllCheckBox\"\n [width]=\"effectiveCheckboxColumnWidth\"></kendo-grid-checkbox-column>\n }\n\n @if (!isCardMode) {\n @for (column of columns; track column.field) {\n <kendo-grid-column [field]=\"column.field\"\n [filter]=\"getFilterType(column)\" format=\"{{column.format}}\"\n [width]=\"$any(getEffectiveWidth(column))\"\n [minResizableWidth]=\"column.minWidth ?? 10\"\n [hidden]=\"isColumnHidden(column)\"\n [sortable]=\"column.sortable !== false\"\n [filterable]=\"column.filterable !== false\"\n [class]=\"alignClass(column)\"\n [headerClass]=\"alignClass(column)\"\n [title]=\"getDisplayName(column) | pascalCase\">\n <ng-template kendoGridFilterCellTemplate let-filter let-gridColumn=\"column\">\n @if (hasFilterOptions(column)) {\n <kendo-dropdownlist\n class=\"status-filter-dropdown\"\n [data]=\"column.filterOptions!\"\n textField=\"text\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [value]=\"getSelectedFilterValue(column)\"\n [defaultItem]=\"{ text: '', value: null }\"\n [popupSettings]=\"{ width: 'auto' }\"\n (valueChange)=\"onDropdownFilter($event, column)\"\n >\n <ng-template kendoDropDownListValueTemplate let-dataItem>\n @if (dataItem?.value && column.statusMapping?.[dataItem.value]; as mapping) {\n <span class=\"filter-status-item\">\n <span role=\"img\" [attr.aria-label]=\"dataItem.text || mapping.tooltip || null\" [title]=\"dataItem.text || mapping.tooltip\"\n [style.color]=\"mapping.color\">\n <kendo-svg-icon [icon]=\"mapping.icon\" [size]=\"'small'\"></kendo-svg-icon>\n </span>\n </span>\n } @else if (dataItem?.text) {\n <span>{{ dataItem.text }}</span>\n }\n </ng-template>\n <ng-template kendoDropDownListItemTemplate let-dataItem>\n @if (dataItem?.value && column.statusMapping?.[dataItem.value]; as mapping) {\n <span style=\"display: inline-flex; align-items: center; gap: 8px;\">\n <span [style.color]=\"mapping.color\">\n <kendo-svg-icon [icon]=\"mapping.icon\" [size]=\"'small'\"></kendo-svg-icon>\n </span>\n <span>{{ dataItem.text }}</span>\n </span>\n } @else {\n <span>{{ dataItem.text }}</span>\n }\n </ng-template>\n </kendo-dropdownlist>\n } @else if (column.dataType === 'numericRange') {\n <span class=\"numeric-range-filter\">\n <kendo-numerictextbox\n [value]=\"$any(getRangeFilterValue(column, 'gte'))\"\n (valueChange)=\"onRangeFilterChange($event, column, 'gte')\"\n [spinners]=\"false\"\n [decimals]=\"2\"\n placeholder=\"From\"\n size=\"small\"\n ></kendo-numerictextbox>\n <span class=\"range-separator\">–</span>\n <kendo-numerictextbox\n [value]=\"$any(getRangeFilterValue(column, 'lte'))\"\n (valueChange)=\"onRangeFilterChange($event, column, 'lte')\"\n [spinners]=\"false\"\n [decimals]=\"2\"\n placeholder=\"To\"\n size=\"small\"\n ></kendo-numerictextbox>\n </span>\n } @else {\n @switch (getFilterType(column)) {\n @case ('numeric') {\n <kendo-grid-numeric-filter-cell [column]=\"gridColumn\" [filter]=\"filter\" [showOperators]=\"true\" [operator]=\"column.filterOperator || 'eq'\"\n [spinners]=\"!isCompactFilter(column)\" [class.mm-filter-compact]=\"isCompactFilter(column)\"></kendo-grid-numeric-filter-cell>\n }\n @case ('boolean') {\n <kendo-grid-boolean-filter-cell [column]=\"gridColumn\" [filter]=\"filter\"></kendo-grid-boolean-filter-cell>\n }\n @case ('date') {\n <kendo-grid-date-filter-cell [column]=\"gridColumn\" [filter]=\"filter\" [showOperators]=\"true\" [operator]=\"column.filterOperator || 'eq'\"\n [class.mm-filter-compact]=\"isCompactFilter(column)\"></kendo-grid-date-filter-cell>\n }\n @default {\n <kendo-grid-string-filter-cell [column]=\"gridColumn\" [filter]=\"filter\" [showOperators]=\"false\"></kendo-grid-string-filter-cell>\n }\n }\n }\n </ng-template>\n <ng-template kendoGridCellTemplate let-dataItem>\n <span\n [class.mm-cell-truncate]=\"column.truncate\"\n [attr.title]=\"column.truncate ? getCellTitle(dataItem, column) : null\">\n <ng-container\n [ngTemplateOutlet]=\"cellContent\"\n [ngTemplateOutletContext]=\"{ element: dataItem, column: column }\"\n ></ng-container>\n </span>\n </ng-template>\n </kendo-grid-column>\n }\n\n @if (hasRowActions) {\n <kendo-grid-command-column [title]=\"_messages.actionsColumnTitle\" [width]=\"effectiveActionsColumnWidth\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <ng-container\n [ngTemplateOutlet]=\"rowActions\"\n [ngTemplateOutletContext]=\"{ dataItem: dataItem }\"\n ></ng-container>\n </ng-template>\n </kendo-grid-command-column>\n }\n } @else {\n <!-- Card mode (AB#4930): one full-width column renders the whole row as a\n stacked card — title from the first column, labeled lines for the\n rest (empty values skipped), row actions in the card header. -->\n <kendo-grid-column [sortable]=\"false\" [filterable]=\"false\" title=\"\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <div class=\"mm-card\">\n <div class=\"mm-card-header\">\n @if (cardTitleColumn; as titleColumn) {\n <span class=\"mm-card-title\">\n <ng-container\n [ngTemplateOutlet]=\"cellContent\"\n [ngTemplateOutletContext]=\"{ element: dataItem, column: titleColumn }\"\n ></ng-container>\n </span>\n }\n <span class=\"mm-card-actions\">\n <ng-container\n [ngTemplateOutlet]=\"rowActions\"\n [ngTemplateOutletContext]=\"{ dataItem: dataItem }\"\n ></ng-container>\n </span>\n </div>\n <div class=\"mm-card-fields\">\n @for (column of cardBodyColumns; track column.field) {\n @if (hasCardValue(dataItem, column)) {\n <div class=\"mm-card-field\">\n <span class=\"mm-card-label\">{{ getDisplayName(column) | pascalCase }}</span>\n <span class=\"mm-card-value\">\n <ng-container\n [ngTemplateOutlet]=\"cellContent\"\n [ngTemplateOutletContext]=\"{ element: dataItem, column: column }\"\n ></ng-container>\n </span>\n </div>\n }\n }\n </div>\n </div>\n </ng-template>\n </kendo-grid-column>\n }\n\n <kendo-grid-excel fileName=\"{{excelExportFileName}}\">\n @for (column of columns; track column.field) {\n <kendo-excelexport-column [field]=\"column.field\"\n [title]=\"getDisplayName(column) | pascalCase\">\n </kendo-excelexport-column>\n }\n </kendo-grid-excel>\n\n <kendo-grid-pdf fileName=\"{{pdfExportFileName}}\" paperSize=\"A4\" [repeatHeaders]=\"true\"\n [landscape]=\"true\">\n @for (column of columns; track column.field) {\n <kendo-grid-column [field]=\"column.field\"\n [filter]=\"getFilterType(column)\"\n [title]=\"getDisplayName(column) | pascalCase\"></kendo-grid-column>\n }\n <kendo-grid-pdf-margin top=\"1.5cm\" left=\"1cm\" right=\"1cm\" bottom=\"1.5cm\"></kendo-grid-pdf-margin>\n <ng-template kendoGridPDFTemplate let-pageNum=\"pageNum\" let-totalPages=\"totalPages\">\n <div class=\"page-template\">\n <div class=\"footer\" style=\"position: absolute; bottom: 0; width: 100%; text-align: center; font-size: 9px; color: #666;\">\n {{ getPdfPageText(pageNum, totalPages) }}\n </div>\n </div>\n </ng-template>\n </kendo-grid-pdf>\n</kendo-grid>\n\n<kendo-contextmenu\n #gridmenu\n [kendoMenuHierarchyBinding]=\"_contextMenuItems\"\n [textField]=\"['text']\"\n childrenField=\"items\"\n svgIconField=\"svgIcon\"\n separatorField=\"separator\"\n disabledField=\"disabled\"\n cssClassField=\"cssClass\"\n (popupClose)=\"onContextMenuClosed($event)\"\n (select)=\"onContextMenuSelect($event)\"\n></kendo-contextmenu>\n","import { AsyncPipe } from '@angular/common';\nimport { AfterViewInit, ChangeDetectorRef, Component, EventEmitter, inject, Input, OnDestroy, OnInit, Output, ViewChild, ChangeDetectionStrategy } from '@angular/core';\nimport { SVGIconComponent } from '@progress/kendo-angular-icons';\nimport {\n DragAndDropDirective,\n DropPosition,\n ExpandDirective,\n NodeClickEvent,\n NodeTemplateDirective,\n TreeItem,\n TreeItemDropEvent,\n TreeViewComponent\n} from '@progress/kendo-angular-treeview';\nimport { BehaviorSubject, from, Observable } from 'rxjs';\nimport { TreeItemData } from '@meshmakers/shared-services';\nimport { HierarchyDataSource } from '../data-sources/hierarchy-data-source';\nimport { NodeDroppedEvent } from '../models/node-dropped-event';\n\n@Component({\n selector: 'mm-tree-view',\n imports: [\n ExpandDirective,\n TreeViewComponent,\n AsyncPipe,\n NodeTemplateDirective,\n SVGIconComponent,\n DragAndDropDirective\n ],\n templateUrl: './tree.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './tree.component.scss'\n})\nexport class TreeComponent implements OnInit, AfterViewInit, OnDestroy {\n private readonly cdRef = inject(ChangeDetectorRef);\n\n private _timeoutCache: ReturnType<typeof setTimeout> | undefined;\n\n private readonly _rootNodes: BehaviorSubject<TreeItemData[]> = new BehaviorSubject<TreeItemData[]>([]);\n private _isViewInitialized = false;\n protected expandedKeys: string[] = [];\n\n @ViewChild(TreeViewComponent, { static: false })\n protected treeView!: TreeViewComponent;\n\n public async ngOnInit(): Promise<void> {\n if (this.dataSource) {\n this._rootNodes.next( await this.dataSource.fetchRootNodes());\n }\n }\n\n public ngAfterViewInit(): void {\n this._isViewInitialized = true;\n console.debug('🌳 TreeComponent: View initialized, treeView available:', !!this.treeView);\n }\n\n /**\n * Check if the TreeComponent is fully initialized and ready for operations\n */\n public get isReady(): boolean {\n return this._isViewInitialized && !!this.treeView;\n }\n\n @Input()\n public dataSource: HierarchyDataSource | null = null;\n\n @Output()nodeSelected = new EventEmitter<TreeItemData>()\n @Output()nodeClick = new EventEmitter<TreeItemData>()\n @Output()nodeDoubleClick = new EventEmitter<TreeItemData>()\n @Output()nodeDrop = new EventEmitter<NodeDroppedEvent<unknown>>()\n @Output()expand = new EventEmitter<TreeItemData>()\n @Output()collapse = new EventEmitter<TreeItemData>()\n\n protected get rootNodes(): Observable<TreeItemData[]> {\n return this._rootNodes;\n }\n\n protected hasChildren = (item: object) => this.dataSource?.hasChildren(item as TreeItemData) ?? false;\n protected isExpanded = (item: object, _index: string) => this.expandedKeys.includes((item as TreeItemData).id);\n protected fetchChildren = (item: object) : Observable<object[]> => from(this.dataSource?.fetchChildren(item as TreeItemData) ?? []);\n\n protected onNodeSelect(treeItem: TreeItem) {\n\n this.nodeSelected.emit(treeItem.dataItem);\n }\n\n protected onNodeClick(event: NodeClickEvent) {\n\n this.nodeClick.emit(event.item?.dataItem);\n }\n\n protected onNodeDoubleClick(event: NodeClickEvent) {\n\n this.nodeDoubleClick.emit(event.item?.dataItem);\n }\n\n protected onExpand(event: TreeItem) {\n console.debug('Node expanded:', event.dataItem?.text || event.dataItem);\n this.expand.emit(event.dataItem);\n }\n\n protected onCollapse(event: TreeItem) {\n console.debug('Node collapsed:', event.dataItem?.text || event.dataItem);\n this.collapse.emit(event.dataItem);\n }\n\n public async refreshTree(): Promise<void> {\n if (this.dataSource) {\n console.debug('🔄 Refreshing tree root nodes');\n const rootNodes = await this.dataSource.fetchRootNodes();\n this._rootNodes.next(rootNodes);\n console.debug('✅ Tree refreshed with', rootNodes.length, 'root nodes');\n }\n }\n\n public async onNodeDrop(event: TreeItemDropEvent): Promise<void> {\n console.debug('✅ Dropping item:', event);\n\n if (!event.isValid) {\n console.debug('Drop event is not valid in drag and drop end event', event);\n return;\n }\n\n const srcItem = event.sourceItem.item.dataItem.item\n const srcParent = event.sourceItem.parent?.item.dataItem.item\n\n const itemsToRefresh = [];\n\n // If you drop item directly onto existing item, make source item its child. Otherwise set parent as target assoc.\n let dstItem;\n if (event.dropPosition === DropPosition.Over) {\n dstItem = event.destinationItem.item.dataItem.item;\n\n const dstRefreshItem = event.destinationItem.parent?.item.dataItem.item;\n if (dstRefreshItem) {\n itemsToRefresh.push(dstRefreshItem);\n }\n } else {\n dstItem = event.destinationItem.parent?.item.dataItem.item;\n }\n\n itemsToRefresh.unshift(srcItem);\n if (srcParent) {\n itemsToRefresh.unshift(srcParent);\n }\n if (dstItem) {\n itemsToRefresh.unshift(dstItem);\n }\n\n const parent = event.sourceItem.parent;\n const siblings = parent?.children ?? [];\n const hasNoOtherChildren = siblings.every(child => child.dataItem?.item?.rtId === srcItem.rtId);\n if (hasNoOtherChildren) {\n const grandparentItem = parent?.parent?.item?.dataItem?.item;\n if (grandparentItem) {\n itemsToRefresh.push(grandparentItem);\n }\n }\n\n this.nodeDrop.emit({\n\n // source node\n sourceItem: {\n\n rtId: srcItem.rtId,\n\n ckTypeId: srcItem.ckTypeId,\n\n dataItem: event.sourceItem.item.dataItem,\n },\n\n // parent of source node, if exists\n sourceParent: srcParent ? {\n\n rtId: srcParent.rtId,\n\n ckTypeId: srcParent.ckTypeId\n } : undefined,\n\n // destination item, either on same hierarchy level or one level deeper\n destinationItem: dstItem ? {\n\n rtId: dstItem.rtId,\n\n ckTypeId: dstItem.ckTypeId,\n } : undefined,\n\n // items to be refreshed\n refreshItems: itemsToRefresh\n })\n }\n\n /**\n * Refreshes given runtime entity by reloading the data of the children.\n */\n public async refreshRuntimeEntities(nodes: { rtId: string, ckTypeId: string, isRoot: boolean }[]): Promise<void> {\n const keysToRestore: string[] = [];\n const keysToRemove = new Set<string>();\n\n nodes.forEach(({ ckTypeId, rtId, isRoot }) => {\n const keyId = isRoot ? `${ckTypeId}@${rtId}` : rtId;\n const hasKeyId = this.expandedKeys.includes(keyId);\n\n if (hasKeyId) {\n keysToRestore.push(keyId);\n keysToRemove.add(keyId);\n } else {\n console.debug(`Node ${keyId} not refreshed: not currently expanded.`);\n }\n });\n\n if (keysToRestore.length === 0) {\n return;\n }\n\n this.expandedKeys = this.expandedKeys.filter(key => !keysToRemove.has(key));\n\n return new Promise((res) => {\n this._clearTimeouts();\n\n this._timeoutCache = setTimeout(() => {\n this.expandedKeys = [...this.expandedKeys, ...keysToRestore];\n this.cdRef.markForCheck();\n res();\n }, 0);\n });\n }\n\n public getExpandedKeys(): string[] {\n return this.expandedKeys;\n }\n\n public collapseAll(): void {\n this.expandedKeys = [];\n }\n\n public setExpandedKeys(keys: string[]): void {\n this.expandedKeys = keys;\n }\n\n private _clearTimeouts() {\n if (this._timeoutCache) {\n clearTimeout(this._timeoutCache);\n }\n }\n\n public ngOnDestroy(): void {\n this._clearTimeouts();\n }\n}\n","<kendo-treeview\n #kendoTreeViewComponent\n kendoTreeViewExpandable\n kendoTreeViewDragAndDrop\n [loadOnDemand]=\"true\"\n [(expandedKeys)]=\"expandedKeys\"\n [expandBy]=\"'_id'\"\n [nodes]=\"(rootNodes | async) || []\"\n textField=\"text\"\n [children]=\"fetchChildren\"\n [hasChildren]=\"hasChildren\"\n [isExpanded]=\"isExpanded\"\n (selectionChange)=\"onNodeSelect($event)\"\n (nodeClick)=\"onNodeClick($event)\"\n (nodeDblClick)=\"onNodeDoubleClick($event)\"\n (nodeDrop)=\"onNodeDrop($event)\"\n (expand)=\"onExpand($event)\"\n (collapse)=\"onCollapse($event)\"\n>\n <ng-template kendoTreeViewNodeTemplate let-node>\n <kendo-svgicon [icon]=\"node.svgIcon\" size=\"medium\"></kendo-svgicon>\n {{ node.text }}\n </ng-template>\n</kendo-treeview>\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Messages for the unsaved changes confirmation dialog.\n * All properties are optional — English defaults are used for any missing values.\n */\nexport interface UnsavedChangesMessages {\n /** Dialog title (default: \"Unsaved Changes\") */\n title?: string;\n /** Message when component supports saving (default: \"You have unsaved changes. Do you want to save before leaving?\") */\n savePrompt?: string;\n /** Message when component does not support saving (default: \"You have unsaved changes. Are you sure you want to leave? Your changes will be lost.\") */\n discardPrompt?: string;\n /** Label for the \"Yes\" button (default: \"Yes\") */\n yesButton?: string;\n /** Label for the \"No\" button (default: \"No\") */\n noButton?: string;\n /** Label for the \"Cancel\" button (default: \"Cancel\") */\n cancelButton?: string;\n}\n\n/**\n * Interface for components that track unsaved changes.\n * Implement this interface in components that need to warn users before navigating away\n * when there are unsaved changes.\n */\nexport interface HasUnsavedChanges {\n /**\n * Returns true if the component has unsaved changes.\n */\n hasUnsavedChanges(): boolean;\n\n /**\n * Optional method to save changes before navigating away.\n * If implemented, the guard will offer a \"Save\" option in the confirmation dialog.\n * @returns Promise resolving to true if save was successful, false otherwise.\n */\n saveChanges?(): Promise<boolean>;\n\n /**\n * Optional translated messages for the confirmation dialog.\n * If not provided, English defaults are used.\n */\n unsavedChangesMessages?(): UnsavedChangesMessages;\n}\n\n/**\n * Injection token for components implementing HasUnsavedChanges.\n *\n * Components should provide themselves using this token:\n * ```typescript\n * @Component({\n * providers: [{ provide: HAS_UNSAVED_CHANGES, useExisting: MyComponent }]\n * })\n * export class MyComponent implements HasUnsavedChanges { ... }\n * ```\n */\nexport const HAS_UNSAVED_CHANGES = new InjectionToken<HasUnsavedChanges>('HAS_UNSAVED_CHANGES');\n","import { Directive, HostListener, inject } from '@angular/core';\nimport { HasUnsavedChanges, HAS_UNSAVED_CHANGES } from './unsaved-changes.interface';\n\n/**\n * Directive that handles browser beforeunload events for components with unsaved changes.\n *\n * This directive should be used together with the UnsavedChangesGuard on routes.\n * While the guard handles in-app navigation, this directive handles browser events\n * like back/forward buttons, refresh, and tab close.\n *\n * Usage:\n * 1. The host component must implement HasUnsavedChanges interface\n * 2. The component must provide itself via the HAS_UNSAVED_CHANGES token\n * 3. Add the directive to the component's hostDirectives\n *\n * ```typescript\n * @Component({\n * selector: 'my-editor',\n * hostDirectives: [UnsavedChangesDirective],\n * providers: [{ provide: HAS_UNSAVED_CHANGES, useExisting: MyEditorComponent }],\n * ...\n * })\n * export class MyEditorComponent implements HasUnsavedChanges {\n * hasUnsavedChanges(): boolean {\n * return this.form.dirty;\n * }\n * }\n * ```\n */\n@Directive({\n selector: '[mmUnsavedChanges]',\n standalone: true\n})\nexport class UnsavedChangesDirective {\n private readonly host = inject<HasUnsavedChanges>(HAS_UNSAVED_CHANGES, { optional: true });\n\n /**\n * Handles browser beforeunload event (back button, refresh, close tab).\n * Shows browser's native confirmation dialog when there are unsaved changes.\n */\n @HostListener('window:beforeunload', ['$event'])\n onBeforeUnload(event: BeforeUnloadEvent): void {\n if (this.hostHasUnsavedChanges()) {\n // Standard way to trigger browser's \"Leave site?\" dialog\n event.preventDefault();\n // For older browsers\n event.returnValue = '';\n }\n }\n\n private hostHasUnsavedChanges(): boolean {\n if (this.host && typeof this.host.hasUnsavedChanges === 'function') {\n return this.host.hasUnsavedChanges();\n }\n return false;\n }\n}\n","import { Component, ContentChild, Directive, inject, Input, Output, EventEmitter, TemplateRef, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormGroup } from '@angular/forms';\n\n@Directive({ selector: '[mmFormTitleExtra]', standalone: true })\nexport class FormTitleExtraDirective {\n readonly templateRef = inject(TemplateRef<unknown>);\n}\nimport { ButtonModule } from '@progress/kendo-angular-buttons';\nimport { SVGIcon, saveIcon, cancelIcon } from '@progress/kendo-svg-icons';\nimport { HasUnsavedChanges, HAS_UNSAVED_CHANGES } from '../guards/unsaved-changes.interface';\nimport { UnsavedChangesDirective } from '../guards/unsaved-changes.directive';\n\n// ResponsiveFormBreakPoint type for colSpan responsive behavior\nexport interface ResponsiveFormBreakPoint {\n maxWidth: number;\n value: number;\n}\n\n/**\n * Translatable messages for the base form.\n * All properties are optional — English defaults are used as fallbacks.\n */\nexport interface BaseFormMessages {\n /** Default title when isViewMode is true (default: 'View Details') */\n viewTitle?: string;\n /** Default title when isEditMode is true (default: 'Edit') */\n editTitle?: string;\n /** Default title for new items (default: 'New') */\n newTitle?: string;\n /** Save button text when saving is in progress (default: 'Saving...') */\n savingText?: string;\n /** Save button text in edit mode (default: 'Update') */\n updateText?: string;\n /** Save button text in create mode (default: 'Create') */\n createText?: string;\n /** Cancel button text in view mode (default: 'Back') */\n backText?: string;\n /** Cancel button text (default: 'Cancel') */\n cancelText?: string;\n /** Save button text (default: 'Save') */\n saveText?: string;\n /** Badge text for unsaved changes (default: 'Unsaved Changes') */\n unsavedChangesText?: string;\n /** Loading overlay text (default: 'Loading...') */\n loadingText?: string;\n /** Status text when form has changes (default: 'MODIFIED') */\n modifiedText?: string;\n /** Status text when form is clean (default: 'READY') */\n readyText?: string;\n}\n\nexport interface BaseFormConfig {\n title?: string;\n cardWidth?: string;\n showCard?: boolean;\n saveButtonText?: string;\n cancelButtonText?: string;\n isEditMode?: boolean;\n isViewMode?: boolean;\n isLoading?: boolean;\n isSaving?: boolean;\n showCancelButton?: boolean;\n showLoadingOverlay?: boolean;\n /**\n * Whether to show the title row. Defaults to true.\n * Set to false to hide the title (useful when the form is embedded in a tab).\n */\n showTitle?: boolean;\n /**\n * Indicates whether the form has unsaved changes.\n * When true, displays a \"Modified\" indicator in the header and footer.\n */\n hasChanges?: boolean;\n /**\n * Translatable messages for all static texts in the form.\n * Allows consuming applications to provide localized strings.\n */\n messages?: BaseFormMessages;\n}\n\n// Default responsive breakpoint for 2-column to 1-column\nexport const DEFAULT_RESPONSIVE_COLSPAN: ResponsiveFormBreakPoint[] = [\n { maxWidth: 768, value: 2 } // Full width on mobile\n];\n\n@Component({\n selector: 'mm-base-form',\n standalone: true,\n imports: [\n CommonModule,\n ButtonModule\n ],\n hostDirectives: [UnsavedChangesDirective],\n providers: [{ provide: HAS_UNSAVED_CHANGES, useExisting: BaseFormComponent }],\n templateUrl: './base-form.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './base-form.component.scss'\n})\nexport class BaseFormComponent implements HasUnsavedChanges {\n @ContentChild(FormTitleExtraDirective) titleExtra?: FormTitleExtraDirective;\n\n @Input() form!: FormGroup;\n @Input() config: BaseFormConfig = {\n showCard: true,\n cardWidth: '800px',\n saveButtonText: 'Save',\n cancelButtonText: 'Cancel',\n showLoadingOverlay: true\n };\n\n @Output() saveForm = new EventEmitter<void>();\n @Output() cancelForm = new EventEmitter<void>();\n\n protected readonly saveIcon: SVGIcon = saveIcon;\n protected readonly cancelIcon: SVGIcon = cancelIcon;\n\n protected get title(): string {\n if (this.config.showTitle === false) return '';\n if (this.config.title) return this.config.title;\n const msgs = this.config.messages;\n if (this.config.isViewMode) return msgs?.viewTitle ?? 'View Details';\n return this.config.isEditMode ? (msgs?.editTitle ?? 'Edit') : (msgs?.newTitle ?? 'New');\n }\n\n protected get saveButtonText(): string {\n if (this.config.saveButtonText) return this.config.saveButtonText;\n const msgs = this.config.messages;\n if (this.config.isSaving) return msgs?.savingText ?? 'Saving...';\n return this.config.isEditMode ? (msgs?.updateText ?? 'Update') : (msgs?.createText ?? 'Create');\n }\n\n protected get cancelButtonText(): string {\n if (this.config.cancelButtonText) return this.config.cancelButtonText;\n const msgs = this.config.messages;\n return this.config.isViewMode ? (msgs?.backText ?? 'Back') : (msgs?.cancelText ?? 'Cancel');\n }\n\n protected get unsavedChangesText(): string {\n return this.config.messages?.unsavedChangesText ?? 'Unsaved Changes';\n }\n\n protected get loadingText(): string {\n return this.config.messages?.loadingText ?? 'Loading...';\n }\n\n protected get modifiedText(): string {\n return this.config.messages?.modifiedText ?? 'MODIFIED';\n }\n\n protected get readyText(): string {\n return this.config.messages?.readyText ?? 'READY';\n }\n\n protected get showSaveButton(): boolean {\n return !this.config.isViewMode && !this.config.isLoading;\n }\n\n protected get showCancelButton(): boolean {\n return this.config.showCancelButton !== false;\n }\n\n protected get saveButtonDisabled(): boolean {\n return !!this.config.isSaving || !!this.config.isLoading;\n }\n\n protected onSave(): void {\n if (this.form?.valid) {\n this.saveForm.emit();\n } else {\n // Mark all fields as touched to show validation errors\n this.form?.markAllAsTouched();\n }\n }\n\n protected onCancel(): void {\n this.cancelForm.emit();\n }\n\n // === HasUnsavedChanges interface implementation ===\n\n /**\n * Checks if there are unsaved changes.\n * Uses config.hasChanges if provided, otherwise falls back to form.dirty.\n */\n hasUnsavedChanges(): boolean {\n // Prefer explicit hasChanges from config if set\n if (this.config.hasChanges !== undefined) {\n return this.config.hasChanges;\n }\n // Fall back to form dirty state\n return this.form?.dirty ?? false;\n }\n}\n","<div class=\"mm-base-form-container\" [class.with-card]=\"config.showCard\" [class.without-card]=\"!config.showCard\">\n <!-- Title (no card mode) -->\n <div *ngIf=\"!config.showCard && (title || titleExtra)\" class=\"mm-form-title-row mm-form-title-standalone\">\n <h2 *ngIf=\"title\" class=\"mm-form-title\">{{ title }}</h2>\n <ng-container *ngIf=\"titleExtra\" [ngTemplateOutlet]=\"titleExtra.templateRef\"></ng-container>\n <span *ngIf=\"config.hasChanges\" class=\"mm-modified-badge\">{{ unsavedChangesText }}</span>\n </div>\n\n <!-- Main form wrapper - styled as card or plain based on CSS class -->\n <div class=\"mm-form-wrapper\" [style.maxWidth]=\"config.showCard ? (config.cardWidth || '800px') : null\">\n <!-- Card header (only in card mode) -->\n <div *ngIf=\"config.showCard && (title || titleExtra)\" class=\"mm-form-header\">\n <h2 *ngIf=\"title\" class=\"mm-form-title\">{{ title }}</h2>\n <ng-container *ngIf=\"titleExtra\" [ngTemplateOutlet]=\"titleExtra.templateRef\"></ng-container>\n <span *ngIf=\"config.hasChanges\" class=\"mm-modified-badge\">{{ unsavedChangesText }}</span>\n </div>\n\n <!-- Form body with content projection -->\n <div class=\"mm-form-body\">\n <div *ngIf=\"config.isLoading && config.showLoadingOverlay\" class=\"mm-loading-overlay\">\n <div class=\"k-loader k-loader-lg\"></div>\n <p>{{ loadingText }}</p>\n </div>\n <ng-content></ng-content>\n </div>\n\n <!-- Form actions -->\n <div class=\"mm-form-actions\">\n <!-- Status indicator (left side) -->\n <div class=\"mm-form-status\">\n <span class=\"mm-status-indicator\" [class.modified]=\"config.hasChanges\">\n <span class=\"mm-status-dot\"></span>\n <span class=\"mm-status-text\">{{ config.hasChanges ? modifiedText : readyText }}</span>\n </span>\n </div>\n\n <!-- Action buttons (right side) -->\n <div class=\"mm-form-buttons\">\n <button\n *ngIf=\"showSaveButton\"\n kendoButton\n type=\"submit\"\n [svgIcon]=\"saveIcon\"\n themeColor=\"primary\"\n [disabled]=\"saveButtonDisabled\"\n (click)=\"onSave()\">\n {{ saveButtonText }}\n </button>\n <button\n *ngIf=\"showCancelButton\"\n kendoButton\n type=\"button\"\n [svgIcon]=\"cancelIcon\"\n [disabled]=\"!!config.isSaving\"\n (click)=\"onCancel()\">\n {{ cancelButtonText }}\n </button>\n <ng-content select=\"[additionalActions]\"></ng-content>\n </div>\n </div>\n </div>\n</div>\n","import { NgClass } from '@angular/common';\nimport { Component, EventEmitter, inject, Input, Output, ViewChild, ChangeDetectionStrategy } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { CommandBaseService, CommandItem, CommandSettingsService, TreeItemData, TreeItemDataTyped } from '@meshmakers/shared-services';\nimport { ButtonComponent } from '@progress/kendo-angular-buttons';\nimport { SeparatorComponent } from '@progress/kendo-angular-inputs';\nimport { SplitterComponent, SplitterPaneComponent } from '@progress/kendo-angular-layout';\nimport { HierarchyDataSource } from '../data-sources/hierarchy-data-source';\nimport { TreeComponent } from '../tree/tree.component';\nimport { NodeDroppedEvent } from '../models/node-dropped-event';\n\n@Component({\n selector: 'mm-base-tree-detail',\n imports: [\n SplitterComponent,\n SplitterPaneComponent,\n TreeComponent,\n ButtonComponent,\n SeparatorComponent,\n NgClass\n ],\n template: `\n <div class=\"base-tree-detail-container\">\n <!-- Toolbar -->\n @if (hasToolbarActions) {\n <div class=\"toolbar\">\n <div class=\"toolbar-left\">\n @for (commandItem of leftToolbarActions; track commandItem.id) {\n @if (commandItem) {\n @switch (commandItem.type) {\n @case ('link') {\n @if (commandItem.svgIcon) {\n <button kendoButton [svgIcon]=\"commandItem.svgIcon\" [title]=\"commandItem.text\"\n [disabled]=\"getIsDisabled(commandItem)\"\n (click)=\"onToolbarCommand(commandItem)\">{{ commandItem.text }}\n </button>\n } @else {\n <button kendoButton [title]=\"commandItem.text\"\n [disabled]=\"getIsDisabled(commandItem)\"\n (click)=\"onToolbarCommand(commandItem)\">{{ commandItem.text }}\n </button>\n }\n }\n @case ('separator'){\n <kendo-separator></kendo-separator>\n }\n }\n }\n }\n </div>\n\n <div class=\"toolbar-spacer\"></div>\n\n <div class=\"toolbar-right\">\n @for (commandItem of rightToolbarActions; track commandItem.id) {\n @if (commandItem) {\n @switch (commandItem.type) {\n @case ('link') {\n @if (commandItem.svgIcon) {\n <button kendoButton [svgIcon]=\"commandItem.svgIcon\" [title]=\"commandItem.text\"\n [disabled]=\"getIsDisabled(commandItem)\"\n (click)=\"onToolbarCommand(commandItem)\">{{ commandItem.text }}\n </button>\n } @else {\n <button kendoButton [title]=\"commandItem.text\"\n [disabled]=\"getIsDisabled(commandItem)\"\n (click)=\"onToolbarCommand(commandItem)\">{{ commandItem.text }}\n </button>\n }\n }\n @case ('separator'){\n <kendo-separator></kendo-separator>\n }\n }\n }\n }\n </div>\n </div>\n }\n\n <!-- Splitter with tree and detail -->\n <kendo-splitter class=\"octo-full\" orientation=\"horizontal\" [ngClass]=\"{ disabled: isContentDisabled }\">\n <kendo-splitter-pane [size]=\"leftPaneSize\" class=\"tree-pane\">\n <mm-tree-view\n #treeComponent\n [dataSource]=\"treeDataSource\"\n (nodeClick)=\"onNodeClick($event)\"\n (nodeDrop)=\"onNodeDrop($event)\">\n </mm-tree-view>\n </kendo-splitter-pane>\n <kendo-splitter-pane class=\"detail-pane\">\n <ng-content select=\"[slot=detail-panel]\"></ng-content>\n </kendo-splitter-pane>\n </kendo-splitter>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./base-tree-detail.component.scss']\n})\nexport class BaseTreeDetailComponent<T = unknown> extends CommandBaseService {\n @Input() treeDataSource!: HierarchyDataSource;\n @Input() leftPaneSize = '25%';\n @Input() leftToolbarActions: CommandItem[] = [];\n @Input() rightToolbarActions: CommandItem[] = [];\n @Output() nodeSelected = new EventEmitter<TreeItemDataTyped<T>>();\n @Output() nodeDropped = new EventEmitter<NodeDroppedEvent<T>>();\n\n @ViewChild('treeComponent', { static: false })\n treeComponent!: TreeComponent;\n\n protected isContentDisabled = false;\n protected selectedNode: TreeItemDataTyped<T> | null = null;\n\n constructor() {\n const commandSettingsService = inject(CommandSettingsService);\n const router = inject(Router);\n super(commandSettingsService, router);\n }\n\n protected get hasToolbarActions(): boolean {\n return this.leftToolbarActions.length > 0 || this.rightToolbarActions.length > 0;\n }\n\n protected onNodeClick(treeItem: TreeItemData): void {\n this.selectedNode = treeItem as TreeItemDataTyped<T>;\n this.nodeSelected.emit(treeItem as TreeItemDataTyped<T>);\n }\n\n protected onNodeDrop(event: NodeDroppedEvent<unknown>): void {\n this.nodeDropped.emit(event as NodeDroppedEvent<T>);\n }\n\n protected async onToolbarCommand(commandItem: CommandItem): Promise<void> {\n // Pass the selected tree node as context data\n await this.navigateAsync(commandItem, this.selectedNode?.item || null);\n }\n\n protected getIsDisabled(commandItem: CommandItem): boolean {\n // Check if disabled property exists and is true\n if (typeof commandItem.isDisabled === 'function') {\n return commandItem.isDisabled();\n }\n return commandItem.isDisabled ?? false;\n }\n\n /**\n * Wait for the tree component to be ready\n */\n public async waitForTreeReady(): Promise<boolean> {\n const maxAttempts = 50; // 5 seconds max\n let attempts = 0;\n\n while (attempts < maxAttempts) {\n if (this.treeComponent && this.treeComponent.isReady) {\n console.debug('✅ BaseTreeDetailComponent: TreeComponent is ready after', attempts * 100, 'ms');\n return true;\n }\n\n await new Promise(resolve => setTimeout(resolve, 100));\n attempts++;\n }\n\n console.warn('⚠️ BaseTreeDetailComponent: TreeComponent not ready after 5 seconds');\n return false;\n }\n\n /**\n * Refresh the tree by reloading root nodes\n */\n public async refreshTree(): Promise<void> {\n if (this.treeComponent) {\n await this.treeComponent.refreshTree();\n }\n }\n\n /**\n * Sets the state of Tree and Details panes.\n *\n * @description Panes are frozen (unclickable, unselectable) when disabled.\n */\n public setEnabledState(enabled: boolean): void {\n this.isContentDisabled = !enabled;\n }\n\n /**\n * Refreshes given runtime entity on a tree.\n */\n public async refreshRuntimeEntities(nodes: {\n ckTypeId: string,\n rtId: string,\n isRoot: boolean\n }[]): Promise<void> {\n await this.treeComponent.refreshRuntimeEntities(nodes);\n }\n\n public getExpandedKeys(): string[] {\n return this.treeComponent.getExpandedKeys();\n }\n\n public collapseAll(): void {\n this.treeComponent.collapseAll();\n }\n\n public setExpandedKeys(keys: string[]): void {\n this.treeComponent.setExpandedKeys(keys);\n }\n}\n","import {DataSourceBase, FetchDataOptions} from './data-source-base';\nimport {ListViewComponent} from '../list-view/list-view.component';\nimport {Observable} from 'rxjs';\nimport {FetchResultTyped} from '../models/fetchResult';\n\nexport abstract class DataSourceTyped<TDto> extends DataSourceBase {\n\n // noinspection JSUnusedGlobalSymbols\n protected constructor(mmTableComponent: ListViewComponent) {\n super(mmTableComponent);\n }\n\n public abstract override fetchData(queryOptions: FetchDataOptions): Observable<FetchResultTyped<TDto> | null>;\n}\n","import {TreeItemData} from '@meshmakers/shared-services';\n\nexport abstract class HierarchyDataSource {\n\n protected expandAllByDefault = false;\n\n public hasChildren(item: TreeItemData): boolean{\n return item.expandable;\n }\n\n public isExpanded(item: TreeItemData): boolean{\n return item.isExpanded || this.expandAllByDefault;\n }\n\n public abstract fetchChildren(item: TreeItemData): Promise<TreeItemData[]>;\n\n public abstract fetchRootNodes(): Promise<TreeItemData[]>;\n}\n\n","import {HierarchyDataSource} from './hierarchy-data-source';\nimport {TreeItemDataTyped} from '@meshmakers/shared-services';\n\nexport abstract class HierarchyDataSourceBase<TQueryDto> extends HierarchyDataSource {\n\n public abstract override fetchChildren(item: TreeItemDataTyped<TQueryDto>): Promise<TreeItemDataTyped<TQueryDto>[]>;\n\n public abstract override fetchRootNodes(): Promise<TreeItemDataTyped<TQueryDto>[]>;\n}\n\n","export interface FetchResult<T = unknown> {\n get data(): T;\n\n get totalCount(): number;\n}\n\nexport class FetchResultBase<T = unknown> implements FetchResult<T> {\n public constructor(\n private readonly _data: T,\n private readonly _totalCount: number,\n ) {\n }\n\n public get data(): T {\n return this._data;\n }\n\n public get totalCount(): number {\n return this._totalCount;\n }\n}\n\nexport class FetchResultTyped<TDto> implements FetchResult<(TDto | null)[]> {\n public constructor(\n private readonly _data: (TDto | null)[],\n private readonly _totalCount: number,\n ) {\n }\n\n public get data(): (TDto | null)[] {\n return this._data;\n }\n\n public get totalCount(): number {\n return this._totalCount;\n }\n}\n","export class ProgressValue {\n statusText: string | null;\n progressValue: number;\n\n constructor() {\n this.statusText = null;\n this.progressValue = 0;\n }\n}\n","export enum ImportStrategyDto {\n InsertOnly = 0,\n Upsert = 1\n}\n","import { ColumnDefinition } from '../list-view/list-view.model';\nimport { Observable } from 'rxjs';\n\n/**\n * Query options for fetching data in the dialog\n */\nexport interface DialogFetchOptions {\n /** Number of items to skip (for paging) */\n skip: number;\n\n /** Number of items to take (page size) */\n take: number;\n\n /** Text search filter */\n textSearch: string | null;\n}\n\n/**\n * Result from fetching data\n */\nexport interface DialogFetchResult<T> {\n /** Data items */\n data: (T | null)[];\n\n /** Total count of items matching the filter */\n totalCount: number;\n}\n\n/**\n * Interface for entity selection dialog data sources.\n * Combines grid configuration, data fetching, and entity display.\n */\nexport interface EntitySelectDialogDataSource<T> {\n /**\n * Get column definitions for the grid display\n * @returns Array of column definitions\n */\n getColumns(): ColumnDefinition[];\n\n /**\n * Fetch data for the grid with paging and filtering\n * @param options Query options including skip, take, and textSearch\n * @returns Observable of fetch result with data and total count\n */\n fetchData(options: DialogFetchOptions): Observable<DialogFetchResult<T>>;\n\n /**\n * Get display text for an entity\n * @param entity The entity to display\n * @returns String representation of the entity\n */\n onDisplayEntity(entity: T): string;\n\n /**\n * Get unique identifier for an entity\n * @param entity The entity to get ID from\n * @returns Unique identifier for the entity\n */\n getIdEntity(entity: T): string;\n}\n\n/**\n * Options for opening the entity select dialog\n */\nexport interface EntitySelectDialogOptions<T> {\n /** Dialog title */\n title: string;\n\n /** Allow multiple selection */\n multiSelect?: boolean;\n\n /** Pre-selected entities */\n selectedEntities?: T[];\n\n /** Dialog width (default: 800) */\n width?: number;\n\n /** Dialog height (default: 600) */\n height?: number;\n\n /** Translatable messages for the dialog UI */\n messages?: Partial<EntitySelectDialogMessages>;\n}\n\n/**\n * Result returned from the entity select dialog\n */\nexport interface EntitySelectDialogResult<T> {\n /** Selected entities (single item array for single-select) */\n selectedEntities: T[];\n}\n\n/**\n * Translatable messages for the entity select dialog.\n */\nexport interface EntitySelectDialogMessages {\n /** Search textbox placeholder. Default: \"Search...\" */\n searchPlaceholder: string;\n /** Cancel button text. Default: \"Cancel\" */\n cancelButton: string;\n /** Confirm button text. Default: \"OK\" */\n confirmButton: string;\n /** Text appended to the count of selected items (e.g. \"3 selected\"). Default: \"selected\" */\n selectedSuffix: string;\n /** Pager: \"items per page\" label */\n pagerItemsPerPage: string;\n /** Pager: \"of\" label between current and total */\n pagerOf: string;\n /** Pager: \"items\" label */\n pagerItems: string;\n /** Pager: \"Page\" label */\n pagerPage: string;\n /** Pager: tooltip for first page button */\n pagerFirstPage: string;\n /** Pager: tooltip for last page button */\n pagerLastPage: string;\n /** Pager: tooltip for previous page button */\n pagerPreviousPage: string;\n /** Pager: tooltip for next page button */\n pagerNextPage: string;\n}\n\nexport const DEFAULT_ENTITY_SELECT_DIALOG_MESSAGES: EntitySelectDialogMessages = {\n searchPlaceholder: 'Search...',\n cancelButton: 'Cancel',\n confirmButton: 'OK',\n selectedSuffix: 'selected',\n pagerItemsPerPage: 'items per page',\n pagerOf: 'of',\n pagerItems: 'items',\n pagerPage: 'Page',\n pagerFirstPage: 'Go to the first page',\n pagerLastPage: 'Go to the last page',\n pagerPreviousPage: 'Go to the previous page',\n pagerNextPage: 'Go to the next page',\n};\n\n/**\n * Translatable messages for the entity select input.\n */\nexport interface EntitySelectInputMessages {\n /** Autocomplete placeholder. Default: \"Select an entity...\" */\n placeholder: string;\n /** Advanced search link/button label. Default: \"Advanced Search...\" */\n advancedSearchLabel: string;\n /** Default dialog title. Default: \"Select Entity\" */\n dialogTitle: string;\n /** Template for \"no results\" message. Use {0} for the search term. Default: \"No entities found for \\\"{0}\\\"\" */\n noEntitiesFound: string;\n /** Template for minimum characters hint. Use {0} for the minimum count. Default: \"Type at least {0} characters to search...\" */\n minCharactersHint: string;\n /** Text appended to count for multi-select display (e.g. \"3 selected\"). Default: \"selected\" */\n selectedSuffix: string;\n}\n\nexport const DEFAULT_ENTITY_SELECT_INPUT_MESSAGES: EntitySelectInputMessages = {\n placeholder: 'Select an entity...',\n advancedSearchLabel: 'Advanced Search...',\n dialogTitle: 'Select Entity',\n noEntitiesFound: 'No entities found for \"{0}\"',\n minCharactersHint: 'Type at least {0} characters to search...',\n selectedSuffix: 'selected',\n};\n","import { Component, Input, inject, OnInit, OnDestroy, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WindowRef, WindowModule } from '@progress/kendo-angular-dialog';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport {\n GridComponent,\n ColumnComponent,\n PagerSettings,\n SelectableSettings,\n SelectionEvent,\n PageChangeEvent,\n CheckboxColumnComponent,\n CustomMessagesComponent\n} from '@progress/kendo-angular-grid';\nimport { TextBoxComponent } from '@progress/kendo-angular-inputs';\nimport { Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport {\n EntitySelectDialogDataSource,\n EntitySelectDialogResult,\n EntitySelectDialogMessages,\n DEFAULT_ENTITY_SELECT_DIALOG_MESSAGES\n} from './entity-select-dialog-data-source';\nimport { TableColumn } from '../list-view/list-view.model';\nimport { PascalCasePipe } from '../pipes/pascal-case.pipe';\n\n@Component({\n selector: 'mm-entity-select-dialog',\n standalone: true,\n imports: [\n CommonModule,\n ButtonsModule,\n WindowModule,\n GridComponent,\n ColumnComponent,\n CheckboxColumnComponent,\n CustomMessagesComponent,\n TextBoxComponent,\n PascalCasePipe\n ],\n template: `\n <div class=\"entity-select-dialog-content\">\n <div class=\"search-toolbar\">\n <kendo-textbox\n [style.width.px]=\"250\"\n [placeholder]=\"_messages.searchPlaceholder\"\n [value]=\"searchValue\"\n (valueChange)=\"onSearchChange($event ?? '')\">\n </kendo-textbox>\n </div>\n\n <kendo-grid\n [data]=\"gridData\"\n [pageSize]=\"pageSize\"\n [skip]=\"skip\"\n [pageable]=\"pageable\"\n [selectable]=\"selectableSettings\"\n [loading]=\"isLoading\"\n (pageChange)=\"onPageChange($event)\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"entity-grid\">\n\n <kendo-grid-messages\n [pagerItemsPerPage]=\"_messages.pagerItemsPerPage\"\n [pagerOf]=\"_messages.pagerOf\"\n [pagerItems]=\"_messages.pagerItems\"\n [pagerPage]=\"_messages.pagerPage\"\n [pagerFirstPage]=\"_messages.pagerFirstPage\"\n [pagerLastPage]=\"_messages.pagerLastPage\"\n [pagerPreviousPage]=\"_messages.pagerPreviousPage\"\n [pagerNextPage]=\"_messages.pagerNextPage\"\n ></kendo-grid-messages>\n\n <kendo-grid-checkbox-column\n [width]=\"40\"\n [showSelectAll]=\"multiSelect\">\n </kendo-grid-checkbox-column>\n\n <kendo-grid-column\n *ngFor=\"let column of columns\"\n [field]=\"column.field\"\n [title]=\"getDisplayName(column) | pascalCase\"\n [width]=\"column.width!\">\n </kendo-grid-column>\n\n </kendo-grid>\n\n <div class=\"selection-info\" *ngIf=\"selectedEntities.length > 0\">\n {{ selectedEntities.length }} {{ _messages.selectedSuffix }}\n </div>\n\n <div class=\"dialog-actions\">\n <button kendoButton (click)=\"onCancel()\">{{ _messages.cancelButton }}</button>\n <button kendoButton\n themeColor=\"primary\"\n [disabled]=\"selectedEntities.length === 0\"\n (click)=\"onConfirm()\">\n {{ _messages.confirmButton }}\n </button>\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.Eager,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .entity-select-dialog-content {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n padding: 16px 20px;\n box-sizing: border-box;\n gap: 12px;\n }\n\n .search-toolbar {\n flex-shrink: 0;\n }\n\n .entity-grid {\n flex: 1;\n min-height: 200px;\n border: 1px solid var(--kendo-color-border);\n }\n\n .selection-info {\n padding: 8px 0;\n font-size: 12px;\n color: var(--kendo-color-subtle);\n flex-shrink: 0;\n }\n\n .dialog-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n flex-shrink: 0;\n }\n `]\n})\nexport class EntitySelectDialogComponent<T> implements OnInit, OnDestroy {\n private readonly windowRef = inject(WindowRef);\n private searchSubject = new Subject<string>();\n private destroy$ = new Subject<void>();\n\n @Input() dataSource!: EntitySelectDialogDataSource<T>;\n @Input() multiSelect = false;\n @Input() preSelectedEntities: T[] = [];\n\n _messages: EntitySelectDialogMessages = {...DEFAULT_ENTITY_SELECT_DIALOG_MESSAGES};\n\n @Input() set messages(value: Partial<EntitySelectDialogMessages>) {\n this._messages = {...DEFAULT_ENTITY_SELECT_DIALOG_MESSAGES, ...value};\n }\n\n columns: TableColumn[] = [];\n gridData: { data: T[]; total: number } = { data: [], total: 0 };\n selectedEntities: T[] = [];\n selectedKeys: string[] = [];\n isLoading = false;\n searchValue = '';\n pageSize = 10;\n skip = 0;\n\n pageable: PagerSettings = {\n buttonCount: 5,\n info: true,\n type: 'numeric',\n pageSizes: [5, 10, 20, 50],\n previousNext: true\n };\n\n get selectableSettings(): SelectableSettings {\n return {\n enabled: true,\n mode: this.multiSelect ? 'multiple' : 'single',\n checkboxOnly: true\n };\n }\n\n ngOnInit(): void {\n this.initializeColumns();\n this.setupSearch();\n this.loadData();\n\n // Set pre-selected entities\n if (this.preSelectedEntities.length > 0) {\n this.selectedEntities = [...this.preSelectedEntities];\n this.selectedKeys = this.preSelectedEntities.map(e => this.dataSource.getIdEntity(e));\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private initializeColumns(): void {\n const columnDefs = this.dataSource.getColumns();\n this.columns = columnDefs.map(col => {\n if (typeof col === 'string') {\n return { field: col, dataType: 'text' as const };\n }\n return col as TableColumn;\n });\n }\n\n private setupSearch(): void {\n this.searchSubject.pipe(\n debounceTime(400),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.skip = 0;\n this.loadData();\n });\n }\n\n private loadData(): void {\n if (!this.dataSource) return;\n\n this.isLoading = true;\n\n this.dataSource.fetchData({\n skip: this.skip,\n take: this.pageSize,\n textSearch: this.searchValue || null\n }).subscribe({\n next: (result) => {\n this.gridData = {\n data: (result?.data ?? []).filter((item): item is T => item !== null),\n total: result?.totalCount ?? 0\n };\n this.isLoading = false;\n },\n error: (err) => {\n console.error('Error loading data:', err);\n this.gridData = { data: [], total: 0 };\n this.isLoading = false;\n }\n });\n }\n\n getDisplayName(column: TableColumn): string {\n return column.displayName ?? column.field;\n }\n\n onSearchChange(value: string | null): void {\n this.searchValue = value || '';\n this.searchSubject.next(this.searchValue);\n }\n\n onPageChange(event: PageChangeEvent): void {\n this.skip = event.skip;\n this.pageSize = event.take;\n this.loadData();\n }\n\n onSelectionChange(event: SelectionEvent): void {\n // Handle selected rows\n if (event.selectedRows) {\n for (const row of event.selectedRows) {\n if (row.dataItem && !this.selectedEntities.includes(row.dataItem)) {\n if (!this.multiSelect) {\n // Single select: replace selection\n this.selectedEntities = [row.dataItem];\n this.selectedKeys = [this.dataSource.getIdEntity(row.dataItem)];\n } else {\n // Multi select: add to selection\n this.selectedEntities.push(row.dataItem);\n this.selectedKeys.push(this.dataSource.getIdEntity(row.dataItem));\n }\n }\n }\n }\n\n // Handle deselected rows\n if (event.deselectedRows) {\n for (const row of event.deselectedRows) {\n if (row.dataItem) {\n const id = this.dataSource.getIdEntity(row.dataItem);\n const index = this.selectedKeys.indexOf(id);\n if (index > -1) {\n this.selectedEntities.splice(index, 1);\n this.selectedKeys.splice(index, 1);\n }\n }\n }\n }\n }\n\n onConfirm(): void {\n const result: EntitySelectDialogResult<T> = {\n selectedEntities: this.selectedEntities\n };\n this.windowRef.close(result);\n }\n\n onCancel(): void {\n this.windowRef.close();\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { WindowService, WindowCloseResult } from '@progress/kendo-angular-dialog';\nimport { firstValueFrom } from 'rxjs';\nimport { EntitySelectDialogComponent } from './entity-select-dialog.component';\nimport {\n EntitySelectDialogDataSource,\n EntitySelectDialogOptions,\n EntitySelectDialogResult\n} from './entity-select-dialog-data-source';\nimport { WindowStateService } from '../services/window-state.service';\n\n@Injectable()\nexport class EntitySelectDialogService {\n private readonly windowService = inject(WindowService);\n private readonly windowStateService = inject(WindowStateService);\n\n /**\n * Opens the entity select dialog\n * @param dataSource The data source providing grid data and column definitions\n * @param options Dialog configuration options\n * @returns Promise resolving to selected entities or null if cancelled\n */\n async open<T>(\n dataSource: EntitySelectDialogDataSource<T>,\n options: EntitySelectDialogOptions<T>\n ): Promise<EntitySelectDialogResult<T> | null> {\n const defaultWidth = options.width ?? 900;\n const defaultHeight = options.height ?? 640;\n const minWidth = 550;\n const minHeight = 400;\n // Pass min so stale persisted sizes get clamped on the current open too. The\n // applyModalBehavior pass below will also drop sub-min entries from storage.\n const size = this.windowStateService.resolveWindowSize(\n 'entity-select',\n { width: defaultWidth, height: defaultHeight },\n { width: minWidth, height: minHeight }\n );\n\n const windowRef = this.windowService.open({\n title: options.title,\n content: EntitySelectDialogComponent,\n width: size.width,\n height: size.height,\n minWidth,\n minHeight,\n resizable: true\n });\n\n this.windowStateService.applyModalBehavior('entity-select', windowRef);\n\n const contentRef = windowRef.content as { instance?: EntitySelectDialogComponent<T> } | undefined;\n if (contentRef?.instance) {\n contentRef.instance.dataSource = dataSource;\n contentRef.instance.multiSelect = options.multiSelect ?? false;\n contentRef.instance.preSelectedEntities = options.selectedEntities ?? [];\n if (options.messages) {\n contentRef.instance.messages = options.messages;\n }\n }\n\n const result = await firstValueFrom(windowRef.result);\n\n if (result instanceof WindowCloseResult) {\n return null;\n }\n\n if (result && typeof result === 'object' && 'selectedEntities' in result) {\n return result as EntitySelectDialogResult<T>;\n }\n\n return null;\n }\n}\n","import {\n Component,\n OnInit,\n OnDestroy,\n Input,\n Output,\n EventEmitter,\n forwardRef,\n ElementRef,\n ViewChild,\n inject,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {\n FormControl,\n ReactiveFormsModule,\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n Validator,\n AbstractControl,\n ValidationErrors,\n NG_VALIDATORS\n} from '@angular/forms';\nimport {AutoCompleteModule, AutoCompleteComponent} from '@progress/kendo-angular-dropdowns';\nimport {LoaderModule} from '@progress/kendo-angular-indicators';\nimport {ButtonsModule} from '@progress/kendo-angular-buttons';\nimport {IconsModule, SVGIconModule} from '@progress/kendo-angular-icons';\nimport {xIcon, searchIcon} from '@progress/kendo-svg-icons';\nimport {EntitySelectDataSource} from '@meshmakers/shared-services';\nimport {Subject, of} from 'rxjs';\nimport {debounceTime, distinctUntilChanged, switchMap, tap, catchError} from 'rxjs/operators';\nimport {\n EntitySelectDialogDataSource,\n EntitySelectInputMessages,\n DEFAULT_ENTITY_SELECT_INPUT_MESSAGES,\n EntitySelectDialogMessages\n} from '../entity-select-dialog/entity-select-dialog-data-source';\nimport {EntitySelectDialogService} from '../entity-select-dialog/entity-select-dialog.service';\n\n@Component({\n selector: 'mm-entity-select-input',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n AutoCompleteModule,\n LoaderModule,\n ButtonsModule,\n IconsModule,\n SVGIconModule\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => EntitySelectInputComponent),\n multi: true\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => EntitySelectInputComponent),\n multi: true\n }\n ],\n template: `\n <div class=\"entity-select-wrapper\" [class.disabled]=\"disabled\" [class.has-dialog-button]=\"dialogDataSource\">\n <kendo-autocomplete\n #autocomplete\n [formControl]=\"searchFormControl\"\n [data]=\"filteredEntities\"\n [loading]=\"isLoading\"\n [disabled]=\"disabled\"\n [placeholder]=\"placeholder || _messages.placeholder\"\n [suggest]=\"true\"\n [clearButton]=\"true\"\n [filterable]=\"true\"\n (filterChange)=\"onFilterChange($event)\"\n (valueChange)=\"onSelectionChange($event)\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n class=\"entity-autocomplete\">\n\n <!-- Custom item template -->\n <ng-template kendoAutoCompleteItemTemplate let-dataItem>\n <div class=\"entity-item\">\n {{ dataItem }}\n </div>\n </ng-template>\n\n <!-- No data template -->\n <ng-template kendoAutoCompleteNoDataTemplate>\n <div class=\"no-data-message\">\n <span *ngIf=\"!isLoading && searchFormControl.value && searchFormControl.value.length >= minSearchLength\">\n {{ formatMessage(_messages.noEntitiesFound, searchFormControl.value) }}\n </span>\n <span *ngIf=\"!isLoading && (!searchFormControl.value || searchFormControl.value.length < minSearchLength)\">\n {{ formatMessage(_messages.minCharactersHint, minSearchLength) }}\n </span>\n </div>\n </ng-template>\n\n <!-- Footer template with advanced search link -->\n <ng-template kendoAutoCompleteFooterTemplate *ngIf=\"dialogDataSource\">\n <div class=\"advanced-search-footer\" (click)=\"openAdvancedSearch($event)\">\n <kendo-svg-icon [icon]=\"searchIcon\" size=\"small\"></kendo-svg-icon>\n <span>{{ advancedSearchLabel || _messages.advancedSearchLabel }}</span>\n </div>\n </ng-template>\n\n </kendo-autocomplete>\n\n <!-- Dialog button (always visible when dialogDataSource is set) -->\n <button *ngIf=\"dialogDataSource\"\n kendoButton\n type=\"button\"\n fillMode=\"flat\"\n [svgIcon]=\"searchIcon\"\n [disabled]=\"disabled\"\n [title]=\"advancedSearchLabel || _messages.advancedSearchLabel\"\n class=\"dialog-button\"\n (click)=\"openAdvancedSearch()\">\n </button>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.Eager,\n styles: [`\n :host {\n display: block;\n width: 100%;\n }\n\n .entity-select-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n gap: 4px;\n }\n\n .entity-select-wrapper.disabled {\n opacity: 0.6;\n pointer-events: none;\n }\n\n .entity-autocomplete {\n flex: 1;\n min-width: 0;\n }\n\n .dialog-button {\n flex-shrink: 0;\n height: 30px;\n width: 30px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .clear-button {\n position: absolute;\n right: 32px;\n top: 50%;\n transform: translateY(-50%);\n z-index: 1;\n padding: 4px;\n min-width: auto;\n height: 20px;\n width: 20px;\n }\n\n .entity-item {\n padding: 4px 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .no-data-message {\n padding: 8px 12px;\n color: var(--kendo-color-subtle);\n font-style: italic;\n text-align: center;\n }\n\n .advanced-search-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n color: var(--kendo-color-primary);\n border-top: 1px solid var(--kendo-color-border);\n background: var(--kendo-color-surface-alt);\n transition: background-color 0.2s;\n }\n\n .advanced-search-footer:hover {\n background: var(--kendo-color-base-hover);\n }\n\n /* Override Kendo styles for better integration */\n ::ng-deep .entity-autocomplete .k-input-inner {\n padding-right: 60px !important; /* Make room for clear button */\n }\n\n ::ng-deep .entity-autocomplete.k-disabled .k-input-inner {\n padding-right: 32px !important; /* Normal padding when disabled */\n }\n `]\n})\nexport class EntitySelectInputComponent implements OnInit, OnDestroy, ControlValueAccessor, Validator {\n @ViewChild('autocomplete', {static: true}) autocomplete!: AutoCompleteComponent;\n\n // Inputs\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- generic component accepts any entity type\n @Input() dataSource!: EntitySelectDataSource<any>;\n @Input() placeholder = '';\n @Input() minSearchLength = 3;\n @Input() maxResults = 50;\n @Input() debounceMs = 300;\n @Input() prefix = '';\n\n // Initial display value (e.g. when restoring a previously selected entity by name)\n @Input() set initialDisplayValue(value: string | undefined) {\n if (value && !this.selectedEntity) {\n this.searchFormControl.setValue(value, { emitEvent: false });\n }\n }\n\n // Dialog inputs\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- generic component accepts any entity type\n @Input() dialogDataSource?: EntitySelectDialogDataSource<any>;\n @Input() dialogTitle = '';\n @Input() multiSelect = false;\n @Input() advancedSearchLabel = '';\n\n // Dialog messages (passed through to the dialog component)\n @Input() dialogMessages?: Partial<EntitySelectDialogMessages>;\n\n // Messages\n _messages: EntitySelectInputMessages = {...DEFAULT_ENTITY_SELECT_INPUT_MESSAGES};\n\n @Input() set messages(value: Partial<EntitySelectInputMessages>) {\n this._messages = {...DEFAULT_ENTITY_SELECT_INPUT_MESSAGES, ...value};\n }\n\n private _disabled = false;\n @Input()\n get disabled(): boolean {\n return this._disabled;\n }\n\n set disabled(value: boolean) {\n this._disabled = !!value;\n if (this._disabled) {\n this.searchFormControl.disable();\n } else {\n this.searchFormControl.enable();\n }\n }\n\n private _required = false;\n @Input()\n get required(): boolean {\n return this._required;\n }\n\n set required(value: boolean) {\n this._required = !!value;\n }\n\n // Outputs\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- generic component emits any entity type\n @Output() entitySelected = new EventEmitter<any>();\n @Output() entityCleared = new EventEmitter<void>();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- generic component emits any entity type\n @Output() entitiesSelected = new EventEmitter<any[]>(); // For multi-select from dialog\n\n // Form control and state\n public searchFormControl = new FormControl();\n public filteredEntities: string[] = [];\n public selectedEntity: unknown = null;\n public isLoading = false;\n private entityMap = new Map<string, unknown>();\n\n // Private members\n private searchSubject = new Subject<string>();\n private destroy$ = new Subject<void>();\n private onChange: (value: unknown) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n // Icons\n protected readonly clearIcon = xIcon;\n protected readonly searchIcon = searchIcon;\n\n // Injected dependencies\n private elRef = inject(ElementRef);\n private dialogService = inject(EntitySelectDialogService, { optional: true });\n\n formatMessage(template: string, ...args: unknown[]): string {\n return template.replace(/\\{(\\d+)\\}/g, (_, index) => String(args[+index] ?? ''));\n }\n\n ngOnInit(): void {\n this.setupSearch();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ControlValueAccessor implementation\n writeValue(value: unknown): void {\n if (value !== this.selectedEntity) {\n this.selectedEntity = value;\n if (value && this.dataSource) {\n // Set the display value in the input\n const displayText = this.dataSource.onDisplayEntity(value);\n this.searchFormControl.setValue(displayText, {emitEvent: false});\n } else {\n this.searchFormControl.setValue('', {emitEvent: false});\n }\n }\n }\n\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(_isDisabled: boolean): void {\n this.disabled = _isDisabled;\n }\n\n // Validator implementation\n validate(control: AbstractControl): ValidationErrors | null {\n if (this.required && !this.selectedEntity) {\n return {required: true};\n }\n\n // Validate that the value is an actual entity, not just a string\n const value = control.value;\n if (value && typeof value === 'string') {\n return {invalidEntity: true};\n }\n\n return null;\n }\n\n // Event handlers\n onFilterChange(event: string): void {\n const filter = event;\n if (!filter || filter.length < this.minSearchLength) {\n this.filteredEntities = [];\n return;\n }\n\n this.searchSubject.next(filter);\n }\n\n onSelectionChange(value: string): void {\n if (value && typeof value === 'string') {\n // Find the entity that matches the selected display text\n const entity = this.entityMap.get(value);\n if (entity) {\n this.selectEntity(entity);\n }\n }\n }\n\n onFocus(): void {\n // Optional: Trigger search on focus if there's already text\n const currentValue = this.searchFormControl.value;\n if (currentValue && currentValue.length >= this.minSearchLength && this.filteredEntities.length === 0) {\n this.searchSubject.next(currentValue);\n }\n }\n\n onBlur(): void {\n this.onTouched();\n\n // Auto-select if there's exactly one result\n if (this.filteredEntities.length === 1 && !this.selectedEntity) {\n const displayText = this.filteredEntities[0];\n const entity = this.entityMap.get(displayText);\n if (entity) {\n this.selectEntity(entity);\n }\n }\n }\n\n // Public methods\n public clear(): void {\n this.selectedEntity = null;\n this.filteredEntities = [];\n this.entityMap.clear();\n this.searchFormControl.setValue('', {emitEvent: false});\n this.onChange(null);\n this.entityCleared.emit();\n this.autocomplete.focus();\n }\n\n public focus(): void {\n if (this.autocomplete) {\n this.autocomplete.focus();\n }\n }\n\n public reset(): void {\n this.clear();\n }\n\n // Private methods\n private setupSearch(): void {\n this.searchSubject.pipe(\n debounceTime(this.debounceMs),\n distinctUntilChanged(),\n tap(() => {\n this.isLoading = true;\n this.filteredEntities = [];\n }),\n switchMap(filter => {\n if (!this.dataSource) {\n return of({totalCount: 0, items: []});\n }\n\n if (filter.startsWith(this.prefix)) {\n if (typeof filter === 'string') {\n filter = filter.replace(this.prefix, '').trim();\n return this.dataSource.onFilter(filter, this.maxResults).catch(error => {\n console.error('Entity search error:', error);\n return {totalCount: 0, items: []};\n });\n } else {\n return of({totalCount: 0, items: []});\n }\n } else {\n return this.dataSource.onFilter(filter, this.maxResults).catch(error => {\n console.error('Entity search error:', error);\n return {totalCount: 0, items: []};\n });\n }\n }),\n catchError(error => {\n console.error('Search error:', error);\n return of({totalCount: 0, items: []});\n })\n ).subscribe(result => {\n this.isLoading = false;\n\n if (this.prefix && result.items.length === 1) {\n // Auto-select if exactly one match in prefix mode\n this.selectEntity(result.items[0]);\n return;\n }\n // Store both the display strings and the entities\n this.filteredEntities = result.items.map(entity => this.dataSource.onDisplayEntity(entity));\n this.entityMap = new Map(result.items.map(entity => [this.dataSource.onDisplayEntity(entity), entity]));\n });\n }\n\n private selectEntity(entity: unknown): void {\n this.selectedEntity = entity;\n const displayText = this.dataSource.onDisplayEntity(entity);\n this.searchFormControl.setValue(displayText, {emitEvent: false});\n this.filteredEntities = [];\n this.onChange(entity);\n this.entitySelected.emit(entity);\n this.autocomplete.closeActionSheet();\n }\n\n // Advanced search dialog\n public async openAdvancedSearch(event?: Event): Promise<void> {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (!this.dialogDataSource || !this.dialogService) {\n console.warn('Dialog data source or dialog service not available');\n return;\n }\n\n // Close the autocomplete dropdown\n this.autocomplete.toggle(false);\n\n const result = await this.dialogService.open(this.dialogDataSource, {\n title: this.dialogTitle || this._messages.dialogTitle,\n multiSelect: this.multiSelect,\n selectedEntities: this.selectedEntity ? [this.selectedEntity] : [],\n messages: this.dialogMessages,\n });\n\n if (result && result.selectedEntities.length > 0) {\n if (this.multiSelect) {\n // Multi-select: emit all selected entities\n this.entitiesSelected.emit(result.selectedEntities);\n // For form control, set the first entity\n if (result.selectedEntities.length === 1) {\n this.selectEntity(result.selectedEntities[0]);\n } else {\n // Multiple selected - update display to show count\n const displayText = `${result.selectedEntities.length} ${this._messages.selectedSuffix}`;\n this.searchFormControl.setValue(displayText, {emitEvent: false});\n this.selectedEntity = result.selectedEntities;\n this.onChange(result.selectedEntities);\n }\n } else {\n // Single select: use the first (and only) entity\n this.selectEntity(result.selectedEntities[0]);\n }\n }\n }\n}\n","import {inject, Injectable} from '@angular/core';\nimport {CanDeactivate} from '@angular/router';\nimport {HasUnsavedChanges} from './unsaved-changes.interface';\nimport {ConfirmationService} from '../services/confirmation.service';\nimport {ButtonTypes, ConfirmationButtonLabels} from '../models/confirmation';\n\n/**\n * Guard that prevents navigation when a component has unsaved changes.\n * The component must implement the HasUnsavedChanges interface.\n *\n * Usage in routes:\n * ```typescript\n * {\n * path: 'edit/:id',\n * component: MyEditorComponent,\n * canDeactivate: [UnsavedChangesGuard]\n * }\n * ```\n *\n * The component must implement HasUnsavedChanges:\n * ```typescript\n * export class MyEditorComponent implements HasUnsavedChanges {\n * hasUnsavedChanges(): boolean {\n * return this.form.dirty;\n * }\n *\n * async saveChanges(): Promise<boolean> {\n * // Save logic here\n * return true;\n * }\n * }\n * ```\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class UnsavedChangesGuard implements CanDeactivate<HasUnsavedChanges> {\n private readonly confirmationService = inject(ConfirmationService);\n\n async canDeactivate(component: HasUnsavedChanges): Promise<boolean> {\n // If component doesn't implement the interface or has no changes, allow navigation\n if (!component || typeof component.hasUnsavedChanges !== 'function') {\n return true;\n }\n\n if (!component.hasUnsavedChanges()) {\n return true;\n }\n\n // Get optional translated messages from the component\n const msgs = typeof component.unsavedChangesMessages === 'function'\n ? component.unsavedChangesMessages()\n : undefined;\n const title = msgs?.title ?? 'Unsaved Changes';\n const buttonLabels: ConfirmationButtonLabels | undefined = (msgs?.yesButton || msgs?.noButton || msgs?.cancelButton)\n ? { yes: msgs?.yesButton, no: msgs?.noButton, cancel: msgs?.cancelButton }\n : undefined;\n\n // Component has unsaved changes - ask user what to do\n if (typeof component.saveChanges === 'function') {\n // Component supports saving - show Yes/No/Cancel dialog\n const message = msgs?.savePrompt ?? 'You have unsaved changes. Do you want to save before leaving?';\n const result = await this.confirmationService.showYesNoCancelConfirmationDialog(title, message, buttonLabels);\n\n if (result === undefined) {\n // Dialog was closed without selection - cancel navigation\n return false;\n }\n\n switch (result.result) {\n case ButtonTypes.Yes: {\n // Try to save\n const saved = await component.saveChanges();\n return saved; // Allow navigation only if save succeeded\n }\n\n case ButtonTypes.No:\n // Discard changes and navigate\n return true;\n\n case ButtonTypes.Cancel:\n // Cancel navigation\n return false;\n\n default:\n return false;\n }\n } else {\n // Component doesn't support saving - show simple Yes/No dialog\n const message = msgs?.discardPrompt ?? 'You have unsaved changes. Are you sure you want to leave? Your changes will be lost.';\n const confirmed = await this.confirmationService.showYesNoConfirmationDialog(title, message, undefined, buttonLabels);\n\n return confirmed;\n }\n }\n}\n","export interface SaveAsDialogMessages {\n nameLabel: string;\n placeholder: string;\n save: string;\n cancel: string;\n patternError: string;\n nameRequired: string;\n /** `{0}` is replaced with the minimum length. */\n nameTooShort: string;\n /** `{0}` is replaced with the maximum length. */\n nameTooLong: string;\n checkingAvailability: string;\n nameAvailable: string;\n nameAlreadyTaken: string;\n}\n\nexport const DEFAULT_SAVE_AS_DIALOG_MESSAGES: SaveAsDialogMessages = {\n nameLabel: 'Name',\n placeholder: 'Enter name...',\n save: 'Save',\n cancel: 'Cancel',\n patternError: 'Invalid name format',\n nameRequired: 'Name is required',\n nameTooShort: 'Name must be at least {0} characters',\n nameTooLong: 'Name must be at most {0} characters',\n checkingAvailability: 'Checking availability...',\n nameAvailable: 'Name is available',\n nameAlreadyTaken: 'Name is already taken',\n};\n","import { Component, OnInit, OnDestroy, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { DialogRef, DialogModule, DialogContentBase } from '@progress/kendo-angular-dialog';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { LabelModule } from '@progress/kendo-angular-label';\nimport { IndicatorsModule } from '@progress/kendo-angular-indicators';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, switchMap, tap } from 'rxjs/operators';\nimport {\n SaveAsDialogOptions,\n SaveAsDialogResult,\n SaveAsDialogDataSource,\n NameAvailabilityResult\n} from './save-as-dialog-data-source';\nimport {\n SaveAsDialogMessages,\n DEFAULT_SAVE_AS_DIALOG_MESSAGES,\n} from './save-as-dialog.messages';\n\n@Component({\n selector: 'mm-save-as-dialog',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n DialogModule,\n ButtonsModule,\n InputsModule,\n LabelModule,\n IndicatorsModule\n ],\n template: `\n <div class=\"save-as-container\">\n <div class=\"form-group\">\n <kendo-label [for]=\"nameInput\" [text]=\"nameLabel\"></kendo-label>\n <kendo-textbox\n #nameInput\n [formControl]=\"nameControl\"\n [placeholder]=\"placeholder\"\n [maxlength]=\"maxLength\"\n class=\"name-input\">\n </kendo-textbox>\n\n <div class=\"validation-container\">\n <div class=\"validation-message error\" *ngIf=\"nameControl.touched && nameControl.errors?.['required']\">\n {{ _messages.nameRequired }}\n </div>\n <div class=\"validation-message error\" *ngIf=\"nameControl.touched && nameControl.errors?.['minlength']\">\n {{ formatNameTooShort(minLength) }}\n </div>\n <div class=\"validation-message error\" *ngIf=\"nameControl.touched && nameControl.errors?.['maxlength']\">\n {{ formatNameTooLong(maxLength) }}\n </div>\n <div class=\"validation-message error\" *ngIf=\"nameControl.touched && nameControl.errors?.['pattern']\">\n {{ patternErrorMessage }}\n </div>\n <div class=\"validation-message error\" *ngIf=\"nameControl.touched && nameControl.errors?.['nameTaken']\">\n {{ availabilityMessage }}\n </div>\n\n <div class=\"availability-check\" *ngIf=\"isCheckingAvailability\">\n <kendo-loader size=\"small\" type=\"pulsing\"></kendo-loader>\n <span>{{ _messages.checkingAvailability }}</span>\n </div>\n\n <div class=\"validation-message success\" *ngIf=\"isNameAvailable && !isCheckingAvailability && nameControl.valid\">\n {{ _messages.nameAvailable }}\n </div>\n </div>\n </div>\n </div>\n\n <kendo-dialog-actions>\n <button kendoButton (click)=\"onCancel()\">{{ cancelButtonText }}</button>\n <button\n kendoButton\n themeColor=\"primary\"\n [disabled]=\"!canSave()\"\n (click)=\"onSave()\">\n {{ saveButtonText }}\n </button>\n </kendo-dialog-actions>\n `,\n changeDetection: ChangeDetectionStrategy.Eager,\n styles: [`\n .save-as-container {\n padding: 20px;\n min-width: 350px;\n }\n\n .form-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .name-input {\n width: 100%;\n }\n\n .validation-container {\n min-height: 24px;\n }\n\n .validation-message {\n font-size: 12px;\n padding: 4px 0;\n }\n\n .validation-message.error {\n color: var(--kendo-color-error, #dc3545);\n }\n\n .validation-message.success {\n color: var(--kendo-color-success, #28a745);\n }\n\n .availability-check {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: var(--kendo-color-subtle, #6c757d);\n }\n `]\n})\nexport class SaveAsDialogComponent extends DialogContentBase implements OnInit, OnDestroy {\n public nameControl = new FormControl('', { nonNullable: true });\n\n public nameLabel = DEFAULT_SAVE_AS_DIALOG_MESSAGES.nameLabel;\n public placeholder = DEFAULT_SAVE_AS_DIALOG_MESSAGES.placeholder;\n public saveButtonText = DEFAULT_SAVE_AS_DIALOG_MESSAGES.save;\n public cancelButtonText = DEFAULT_SAVE_AS_DIALOG_MESSAGES.cancel;\n public minLength = 1;\n public maxLength = 255;\n public patternErrorMessage = DEFAULT_SAVE_AS_DIALOG_MESSAGES.patternError;\n\n public isCheckingAvailability = false;\n public isNameAvailable = false;\n public availabilityMessage = '';\n\n public _messages: SaveAsDialogMessages = { ...DEFAULT_SAVE_AS_DIALOG_MESSAGES };\n\n private dataSource?: SaveAsDialogDataSource;\n private debounceMs = 300;\n private subscriptions = new Subscription();\n private checkSubject = new Subject<string>();\n\n constructor() {\n super(inject(DialogRef));\n }\n\n ngOnInit(): void {\n const options = (this.dialog.content as { instance?: { options?: SaveAsDialogOptions } })?.instance?.options;\n\n if (options) {\n this._messages = { ...DEFAULT_SAVE_AS_DIALOG_MESSAGES, ...(options.messages ?? {}) };\n this.nameLabel = options.nameLabel || this._messages.nameLabel;\n this.placeholder = options.placeholder || this._messages.placeholder;\n this.saveButtonText = options.saveButtonText || this._messages.save;\n this.cancelButtonText = options.cancelButtonText || this._messages.cancel;\n this.minLength = options.minLength ?? 1;\n this.maxLength = options.maxLength ?? 255;\n this.patternErrorMessage = options.patternErrorMessage || this._messages.patternError;\n this.dataSource = options.dataSource;\n this.debounceMs = options.debounceTime ?? 300;\n\n const validators = [\n Validators.required,\n Validators.minLength(this.minLength),\n Validators.maxLength(this.maxLength)\n ];\n\n if (options.pattern) {\n validators.push(Validators.pattern(options.pattern));\n }\n\n this.nameControl.setValidators(validators);\n\n if (options.suggestedName) {\n this.nameControl.setValue(options.suggestedName);\n }\n }\n\n if (this.dataSource) {\n this.setupAvailabilityCheck();\n }\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n this.checkSubject.complete();\n }\n\n protected formatNameTooShort(min: number): string {\n return this._messages.nameTooShort.replace('{0}', String(min));\n }\n\n protected formatNameTooLong(max: number): string {\n return this._messages.nameTooLong.replace('{0}', String(max));\n }\n\n private setupAvailabilityCheck(): void {\n this.subscriptions.add(\n this.checkSubject.pipe(\n debounceTime(this.debounceMs),\n distinctUntilChanged(),\n tap(() => {\n this.isCheckingAvailability = true;\n this.isNameAvailable = false;\n }),\n switchMap(name => this.dataSource!.checkNameAvailability(name))\n ).subscribe({\n next: (result: NameAvailabilityResult) => {\n this.isCheckingAvailability = false;\n this.isNameAvailable = result.isAvailable;\n this.availabilityMessage = result.message || this._messages.nameAlreadyTaken;\n\n if (!result.isAvailable) {\n this.nameControl.setErrors({ ...this.nameControl.errors, nameTaken: true });\n } else {\n if (this.nameControl.errors?.['nameTaken']) {\n const { nameTaken, ...otherErrors } = this.nameControl.errors;\n this.nameControl.setErrors(Object.keys(otherErrors).length ? otherErrors : null);\n }\n }\n },\n error: () => {\n this.isCheckingAvailability = false;\n }\n })\n );\n\n this.subscriptions.add(\n this.nameControl.valueChanges.subscribe(value => {\n if (value && value.length >= this.minLength && !this.nameControl.errors?.['pattern']) {\n this.checkSubject.next(value);\n } else {\n this.isNameAvailable = false;\n }\n })\n );\n }\n\n public canSave(): boolean {\n if (this.isCheckingAvailability) {\n return false;\n }\n\n if (!this.nameControl.valid) {\n return false;\n }\n\n if (this.dataSource && !this.isNameAvailable) {\n return false;\n }\n\n return true;\n }\n\n public onSave(): void {\n if (!this.canSave()) {\n return;\n }\n\n const result: SaveAsDialogResult = {\n confirmed: true,\n name: this.nameControl.value\n };\n this.dialog.close(result);\n }\n\n public onCancel(): void {\n const result: SaveAsDialogResult = {\n confirmed: false\n };\n this.dialog.close(result);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { DialogService, DialogRef } from '@progress/kendo-angular-dialog';\nimport { firstValueFrom } from 'rxjs';\nimport { SaveAsDialogComponent } from './save-as-dialog.component';\nimport { SaveAsDialogOptions, SaveAsDialogResult } from './save-as-dialog-data-source';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SaveAsDialogService {\n private readonly dialogService = inject(DialogService);\n\n /**\n * Opens a Save As dialog\n * @param options Dialog options including title, suggested name, and optional data source for validation\n * @returns Promise that resolves with the result containing confirmed status and entered name\n */\n public async showSaveAsDialog(options: SaveAsDialogOptions): Promise<SaveAsDialogResult> {\n const dialogRef: DialogRef = this.dialogService.open({\n content: SaveAsDialogComponent,\n width: options.width ?? 450,\n title: options.title\n });\n\n // Pass options to the component\n const contentRef = dialogRef.content as { instance?: { options?: SaveAsDialogOptions } };\n if (contentRef?.instance) {\n contentRef.instance.options = options;\n }\n\n try {\n const result = await firstValueFrom(dialogRef.result);\n\n if (result && typeof result === 'object' && 'confirmed' in result) {\n return result as SaveAsDialogResult;\n } else {\n return { confirmed: false };\n }\n } catch {\n // Dialog was closed without result (e.g., ESC key, X button)\n return { confirmed: false };\n }\n }\n}\n","/**\n * The type of time range selection\n */\nexport type TimeRangeType = 'year' | 'quarter' | 'month' | 'day' | 'relative' | 'custom';\n\n/**\n * The unit for relative time calculations\n */\nexport type RelativeTimeUnit = 'hours' | 'days' | 'weeks' | 'months';\n\n/**\n * Represents a time range with start and end dates\n */\nexport interface TimeRange {\n /** Start of the time range */\n from: Date;\n /** End of the time range */\n to: Date;\n}\n\n/**\n * Represents a time range as ISO 8601 strings\n */\nexport interface TimeRangeISO {\n /** Start of the time range in ISO 8601 format */\n from: string;\n /** End of the time range in ISO 8601 format */\n to: string;\n}\n\n/**\n * Quarter number (1-4)\n */\nexport type Quarter = 1 | 2 | 3 | 4;\n\n/**\n * Timezone basis for resolving calendar boundaries (year/quarter/month/day/custom).\n *\n * - `'local'` (default): boundaries are wall-clock instants in the browser's\n * local timezone — e.g. year 2026 = `[Jan 1 00:00 local, Jan 1 next-year 00:00 local)`.\n * - `'utc'`: boundaries are wall-clock instants in UTC — e.g. year 2026 =\n * `[2026-01-01T00:00:00Z, 2027-01-01T00:00:00Z)`.\n * - any **IANA time-zone id** (e.g. `'Europe/Vienna'`, `'Europe/Lisbon'`): boundaries\n * are wall-clock instants in that zone, resolved DST-correctly regardless of the\n * browser's own zone — so \"yesterday in `Europe/Lisbon`\" is right even from a Vienna\n * browser (AB#4190). A local calendar day across a DST transition is 23 h or 25 h.\n *\n * Relative ranges (last N hours/days) are timezone-independent (a fixed offset\n * from \"now\") and ignore this setting.\n *\n * The `(string & {})` member keeps the `'local'` / `'utc'` literals in editor\n * autocomplete while still accepting an arbitrary IANA id.\n */\nexport type TimeRangeZone = 'local' | 'utc' | (string & {});\n\n/**\n * Configuration for the time range picker\n */\nexport interface TimeRangePickerConfig {\n /** Available range types to show. Defaults to all. */\n availableTypes?: TimeRangeType[];\n /** Minimum selectable year. Defaults to current year - 10. */\n minYear?: number;\n /** Maximum selectable year. Defaults to current year + 1. */\n maxYear?: number;\n /** Default relative time value. Defaults to 24. */\n defaultRelativeValue?: number;\n /** Default relative time unit. Defaults to 'hours'. */\n defaultRelativeUnit?: RelativeTimeUnit;\n /** Minimum date for custom range. */\n minDate?: Date;\n /** Maximum date for custom range. */\n maxDate?: Date;\n /** Show time in custom date pickers. Defaults to false. */\n showTime?: boolean;\n}\n\n/**\n * The current selection state of the time range picker\n */\nexport interface TimeRangeSelection {\n type: TimeRangeType;\n year?: number;\n quarter?: Quarter;\n month?: number;\n /** Day of month (1-31), used with 'day' type */\n day?: number;\n /** Hour from (0-23), optional hour filter for 'day' type */\n hourFrom?: number;\n /** Hour to (1-24), optional hour filter for 'day' type. Exclusive upper bound. */\n hourTo?: number;\n relativeValue?: number;\n relativeUnit?: RelativeTimeUnit;\n customFrom?: Date;\n customTo?: Date;\n}\n\n/**\n * Option for dropdown selections\n */\nexport interface TimeRangeOption<T = string | number> {\n value: T;\n label: string;\n}\n\n/**\n * Labels for the time range picker UI\n */\nexport interface TimeRangePickerLabels {\n rangeType?: string;\n year?: string;\n quarter?: string;\n month?: string;\n day?: string;\n relativeValue?: string;\n relativeUnit?: string;\n hourFrom?: string;\n hourTo?: string;\n customFrom?: string;\n customTo?: string;\n // Type labels\n typeYear?: string;\n typeQuarter?: string;\n typeMonth?: string;\n typeDay?: string;\n typeRelative?: string;\n typeCustom?: string;\n // Relative unit labels\n unitHours?: string;\n unitDays?: string;\n unitWeeks?: string;\n unitMonths?: string;\n // Quarter labels\n quarter1?: string;\n quarter2?: string;\n quarter3?: string;\n quarter4?: string;\n}\n\n/**\n * Default labels for the time range picker\n */\nexport const DEFAULT_TIME_RANGE_LABELS: TimeRangePickerLabels = {\n rangeType: 'Range Type',\n year: 'Year',\n quarter: 'Quarter',\n month: 'Month',\n day: 'Day',\n relativeValue: 'Last',\n relativeUnit: 'Unit',\n hourFrom: 'From Hour',\n hourTo: 'To Hour',\n customFrom: 'From',\n customTo: 'To',\n typeYear: 'Year',\n typeQuarter: 'Quarter',\n typeMonth: 'Month',\n typeDay: 'Day',\n typeRelative: 'Relative',\n typeCustom: 'Custom',\n unitHours: 'Hours',\n unitDays: 'Days',\n unitWeeks: 'Weeks',\n unitMonths: 'Months',\n quarter1: 'Q1 (Jan-Mar)',\n quarter2: 'Q2 (Apr-Jun)',\n quarter3: 'Q3 (Jul-Sep)',\n quarter4: 'Q4 (Oct-Dec)'\n};\n\n/**\n * Utility functions for time range calculations\n */\nexport class TimeRangeUtils {\n /**\n * Offset (wall-clock − UTC), in milliseconds, of an IANA `zone` at the instant `utcMs`.\n * Computed via `Intl.DateTimeFormat` so it is DST-correct and independent of the browser's\n * own zone. Positive east of UTC (e.g. +7 200 000 for `Europe/Vienna` in summer).\n */\n private static zoneOffsetMs(utcMs: number, zone: string): number {\n const dtf = new Intl.DateTimeFormat('en-US', {\n timeZone: zone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hourCycle: 'h23'\n });\n const parts: Record<string, string> = {};\n for (const part of dtf.formatToParts(new Date(utcMs))) {\n parts[part.type] = part.value;\n }\n const asUtc = Date.UTC(\n Number(parts['year']),\n Number(parts['month']) - 1,\n Number(parts['day']),\n Number(parts['hour']),\n Number(parts['minute']),\n Number(parts['second'])\n );\n return asUtc - utcMs;\n }\n\n /**\n * The UTC instant whose wall-clock time in IANA `zone` equals the given civil fields.\n * Two-pass so DST transitions resolve correctly (the offset is re-read at the candidate\n * instant, not just at the naive UTC guess). Field overflow normalizes like `Date.UTC`\n * (e.g. month 12 ⇒ next January, day 32 ⇒ next month).\n */\n private static zonedCivilToUtc(\n year: number,\n month: number,\n day: number,\n hour = 0,\n minute = 0,\n second = 0,\n ms = 0,\n zone: string\n ): Date {\n const guessUtc = Date.UTC(year, month, day, hour, minute, second, ms);\n const offset1 = this.zoneOffsetMs(guessUtc, zone);\n const candidate = guessUtc - offset1;\n const offset2 = this.zoneOffsetMs(candidate, zone);\n return new Date(offset1 === offset2 ? candidate : guessUtc - offset2);\n }\n\n /**\n * Build a calendar-boundary instant for the given civil fields in `zone`.\n * `'utc'` and `'local'` keep the historical `Date.UTC` / browser-local-constructor\n * behaviour byte-for-byte; any other value is treated as an IANA id (AB#4190).\n */\n private static boundary(\n zone: TimeRangeZone,\n year: number,\n month: number,\n day: number,\n hour = 0,\n minute = 0,\n second = 0,\n ms = 0\n ): Date {\n if (zone === 'utc') {\n return new Date(Date.UTC(year, month, day, hour, minute, second, ms));\n }\n if (zone === 'local') {\n return new Date(year, month, day, hour, minute, second, ms);\n }\n return this.zonedCivilToUtc(year, month, day, hour, minute, second, ms, zone);\n }\n\n /**\n * Extract the calendar year/month/day of `date` as seen in `zone`. Used to normalize\n * custom ranges to that zone's civil-day boundaries.\n */\n private static civilDateParts(date: Date, zone: TimeRangeZone): { year: number; month: number; day: number } {\n if (zone === 'utc') {\n return { year: date.getUTCFullYear(), month: date.getUTCMonth(), day: date.getUTCDate() };\n }\n if (zone === 'local') {\n return { year: date.getFullYear(), month: date.getMonth(), day: date.getDate() };\n }\n const dtf = new Intl.DateTimeFormat('en-US', {\n timeZone: zone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n });\n const parts: Record<string, string> = {};\n for (const part of dtf.formatToParts(date)) {\n parts[part.type] = part.value;\n }\n return { year: Number(parts['year']), month: Number(parts['month']) - 1, day: Number(parts['day']) };\n }\n\n /**\n * Calculate time range for a specific year.\n * Uses exclusive end boundary (start of next year) for correct LESS_THAN filtering.\n * @param zone Timezone basis for the boundaries (defaults to `'local'`).\n */\n static getYearRange(year: number, zone: TimeRangeZone = 'local'): TimeRange {\n return {\n from: this.boundary(zone, year, 0, 1),\n to: this.boundary(zone, year + 1, 0, 1)\n };\n }\n\n /**\n * Calculate time range for a specific quarter.\n * Uses exclusive end boundary (start of next quarter) for correct LESS_THAN filtering.\n * @param zone Timezone basis for the boundaries (defaults to `'local'`).\n */\n static getQuarterRange(year: number, quarter: Quarter, zone: TimeRangeZone = 'local'): TimeRange {\n const startMonth = (quarter - 1) * 3;\n return {\n from: this.boundary(zone, year, startMonth, 1),\n to: this.boundary(zone, year, startMonth + 3, 1)\n };\n }\n\n /**\n * Calculate time range for a specific month.\n * Uses exclusive end boundary (start of next month) for correct LESS_THAN filtering.\n * @param zone Timezone basis for the boundaries (defaults to `'local'`).\n */\n static getMonthRange(year: number, month: number, zone: TimeRangeZone = 'local'): TimeRange {\n return {\n from: this.boundary(zone, year, month, 1),\n to: this.boundary(zone, year, month + 1, 1)\n };\n }\n\n /**\n * Calculate time range for a specific day.\n * Uses exclusive end boundary (start of next day) for correct LESS_THAN filtering.\n * Optionally filters to a specific hour range within the day.\n * @param hourFrom Start hour (0-23), defaults to 0\n * @param hourTo End hour (1-24, exclusive), defaults to 24 (= next day 00:00)\n * @param zone Timezone basis for the boundaries (defaults to `'local'`).\n */\n static getDayRange(\n year: number,\n month: number,\n day: number,\n hourFrom?: number,\n hourTo?: number,\n zone: TimeRangeZone = 'local'\n ): TimeRange {\n const fromHour = hourFrom ?? 0;\n const toHour = hourTo ?? 24;\n return {\n from: this.boundary(zone, year, month, day, fromHour),\n to: toHour === 24\n ? this.boundary(zone, year, month, day + 1)\n : this.boundary(zone, year, month, day, toHour)\n };\n }\n\n /**\n * Calculate time range relative to now\n */\n static getRelativeRange(value: number, unit: RelativeTimeUnit): TimeRange {\n const now = new Date();\n const from = new Date(now);\n\n switch (unit) {\n case 'hours':\n from.setHours(from.getHours() - value);\n break;\n case 'days':\n from.setDate(from.getDate() - value);\n break;\n case 'weeks':\n from.setDate(from.getDate() - (value * 7));\n break;\n case 'months':\n from.setMonth(from.getMonth() - value);\n break;\n }\n\n return { from, to: now };\n }\n\n /**\n * Calculate time range from selection.\n * @param selection The current selection state\n * @param showTime If false (default), custom date ranges are normalized to full-day boundaries\n * with exclusive end (from: 00:00:00, to: start of next day 00:00:00)\n * @param zone Timezone basis for calendar boundaries (defaults to `'local'`). Applies to\n * year/quarter/month/day and normalized custom ranges; relative ranges ignore it.\n */\n static getTimeRangeFromSelection(\n selection: TimeRangeSelection,\n showTime = false,\n zone: TimeRangeZone = 'local'\n ): TimeRange | null {\n switch (selection.type) {\n case 'year':\n if (selection.year) {\n return this.getYearRange(selection.year, zone);\n }\n break;\n case 'quarter':\n if (selection.year && selection.quarter) {\n return this.getQuarterRange(selection.year, selection.quarter, zone);\n }\n break;\n case 'month':\n if (selection.year && selection.month !== undefined) {\n return this.getMonthRange(selection.year, selection.month, zone);\n }\n break;\n case 'day':\n if (selection.year && selection.month !== undefined && selection.day !== undefined) {\n return this.getDayRange(selection.year, selection.month, selection.day, selection.hourFrom, selection.hourTo, zone);\n }\n break;\n case 'relative':\n if (selection.relativeValue && selection.relativeUnit) {\n return this.getRelativeRange(selection.relativeValue, selection.relativeUnit);\n }\n break;\n case 'custom':\n if (selection.customFrom && selection.customTo) {\n if (showTime) {\n // Keep the user-selected time as-is\n return {\n from: selection.customFrom,\n to: selection.customTo\n };\n }\n // Normalize to full-day boundaries in `zone` (exclusive end, like year/quarter/month)\n const fromParts = this.civilDateParts(selection.customFrom, zone);\n const toParts = this.civilDateParts(selection.customTo, zone);\n return {\n from: this.boundary(zone, fromParts.year, fromParts.month, fromParts.day),\n to: this.boundary(zone, toParts.year, toParts.month, toParts.day + 1)\n };\n }\n break;\n }\n return null;\n }\n\n /**\n * Convert TimeRange to ISO 8601 format\n */\n static toISO(range: TimeRange): TimeRangeISO {\n return {\n from: range.from.toISOString(),\n to: range.to.toISOString()\n };\n }\n\n /**\n * Get current quarter (1-4)\n */\n static getCurrentQuarter(): Quarter {\n return (Math.floor(new Date().getMonth() / 3) + 1) as Quarter;\n }\n\n /**\n * Generate year options\n */\n static generateYearOptions(minYear: number, maxYear: number): TimeRangeOption<number>[] {\n const options: TimeRangeOption<number>[] = [];\n for (let year = maxYear; year >= minYear; year--) {\n options.push({ value: year, label: year.toString() });\n }\n return options;\n }\n\n /**\n * Generate month options\n */\n static generateMonthOptions(): TimeRangeOption<number>[] {\n const months = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n ];\n return months.map((label, index) => ({ value: index, label }));\n }\n\n /**\n * Generate quarter options with custom labels\n */\n static generateQuarterOptions(labels: TimeRangePickerLabels): TimeRangeOption<Quarter>[] {\n return [\n { value: 1, label: labels.quarter1 || 'Q1' },\n { value: 2, label: labels.quarter2 || 'Q2' },\n { value: 3, label: labels.quarter3 || 'Q3' },\n { value: 4, label: labels.quarter4 || 'Q4' }\n ];\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnChanges,\n SimpleChanges,\n signal,\n computed,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DropDownListModule } from '@progress/kendo-angular-dropdowns';\nimport { DatePickerModule, DateTimePickerModule } from '@progress/kendo-angular-dateinputs';\nimport { NumericTextBoxModule } from '@progress/kendo-angular-inputs';\nimport { LabelModule } from '@progress/kendo-angular-label';\n\nimport {\n TimeRange,\n TimeRangeISO,\n TimeRangeType,\n TimeRangeSelection,\n TimeRangePickerConfig,\n TimeRangePickerLabels,\n TimeRangeOption,\n TimeRangeUtils,\n RelativeTimeUnit,\n Quarter,\n DEFAULT_TIME_RANGE_LABELS\n} from './time-range-picker.models';\n\n/**\n * A flexible time range picker component that supports:\n * - Year selection\n * - Quarter selection (year + quarter)\n * - Month selection (year + month)\n * - Relative time (last N hours/days/weeks/months)\n * - Custom date range\n *\n * @example\n * ```html\n * <mm-time-range-picker\n * [config]=\"{ availableTypes: ['year', 'month', 'relative'] }\"\n * (rangeChange)=\"onRangeChange($event)\">\n * </mm-time-range-picker>\n * ```\n */\n@Component({\n selector: 'mm-time-range-picker',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DropDownListModule,\n DatePickerModule,\n DateTimePickerModule,\n NumericTextBoxModule,\n LabelModule\n ],\n templateUrl: './time-range-picker.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './time-range-picker.component.scss'\n})\nexport class TimeRangePickerComponent implements OnInit, OnChanges {\n /**\n * Configuration for the picker\n */\n @Input() config: TimeRangePickerConfig = {};\n\n /**\n * Custom labels for the UI\n */\n @Input() labels: TimeRangePickerLabels = {};\n\n /**\n * Initial selection to set\n */\n @Input() initialSelection?: TimeRangeSelection;\n\n /**\n * Emits when the time range changes\n */\n @Output() rangeChange = new EventEmitter<TimeRange>();\n\n /**\n * Emits when the time range changes (ISO format)\n */\n @Output() rangeChangeISO = new EventEmitter<TimeRangeISO>();\n\n /**\n * Emits the current selection state\n */\n @Output() selectionChange = new EventEmitter<TimeRangeSelection>();\n\n // Current selection state\n protected selectedType = signal<TimeRangeType>('year');\n protected selectedYear = signal<number>(new Date().getFullYear());\n protected selectedQuarter = signal<Quarter>(TimeRangeUtils.getCurrentQuarter());\n protected selectedMonth = signal<number>(new Date().getMonth());\n protected selectedDay = signal<number>(new Date().getDate());\n protected relativeValue = signal<number>(24);\n protected relativeUnit = signal<RelativeTimeUnit>('hours');\n protected hourFrom = signal<number | null>(null);\n protected hourTo = signal<number | null>(null);\n protected customFrom = signal<Date>(new Date());\n protected customTo = signal<Date>(new Date());\n\n // Merged labels with defaults\n protected mergedLabels = computed(() => ({\n ...DEFAULT_TIME_RANGE_LABELS,\n ...this.labels\n }));\n\n // Options for dropdowns\n protected typeOptions = computed<TimeRangeOption<TimeRangeType>[]>(() => {\n const allTypes: TimeRangeOption<TimeRangeType>[] = [\n { value: 'year', label: this.mergedLabels().typeYear || 'Year' },\n { value: 'quarter', label: this.mergedLabels().typeQuarter || 'Quarter' },\n { value: 'month', label: this.mergedLabels().typeMonth || 'Month' },\n { value: 'day', label: this.mergedLabels().typeDay || 'Day' },\n { value: 'relative', label: this.mergedLabels().typeRelative || 'Relative' },\n { value: 'custom', label: this.mergedLabels().typeCustom || 'Custom' }\n ];\n\n const available = this.config.availableTypes;\n if (available && available.length > 0) {\n return allTypes.filter(opt => available.includes(opt.value));\n }\n return allTypes;\n });\n\n protected yearOptions = computed(() => {\n const currentYear = new Date().getFullYear();\n const minYear = this.config.minYear ?? currentYear - 10;\n const maxYear = this.config.maxYear ?? currentYear + 1;\n return TimeRangeUtils.generateYearOptions(minYear, maxYear);\n });\n\n protected quarterOptions = computed(() =>\n TimeRangeUtils.generateQuarterOptions(this.mergedLabels())\n );\n\n protected monthOptions = computed(() =>\n TimeRangeUtils.generateMonthOptions()\n );\n\n protected dayOptions = computed(() => {\n const year = this.selectedYear();\n const month = this.selectedMonth();\n // Get number of days in the selected month\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const options: TimeRangeOption<number>[] = [];\n for (let d = 1; d <= daysInMonth; d++) {\n options.push({ value: d, label: d.toString() });\n }\n return options;\n });\n\n protected hourFromOptions = computed(() => {\n const options: TimeRangeOption<number>[] = [];\n for (let h = 0; h <= 23; h++) {\n options.push({ value: h, label: h.toString().padStart(2, '0') + ':00' });\n }\n return options;\n });\n\n protected hourToOptions = computed(() => {\n const fromHour = this.hourFrom();\n const minHour = fromHour !== null ? fromHour + 1 : 1;\n const options: TimeRangeOption<number>[] = [];\n for (let h = minHour; h <= 24; h++) {\n const label = h === 24 ? '24:00' : h.toString().padStart(2, '0') + ':00';\n options.push({ value: h, label });\n }\n return options;\n });\n\n protected relativeUnitOptions = computed<TimeRangeOption<RelativeTimeUnit>[]>(() => [\n { value: 'hours', label: this.mergedLabels().unitHours || 'Hours' },\n { value: 'days', label: this.mergedLabels().unitDays || 'Days' },\n { value: 'weeks', label: this.mergedLabels().unitWeeks || 'Weeks' },\n { value: 'months', label: this.mergedLabels().unitMonths || 'Months' }\n ]);\n\n // Computed time range\n protected currentRange = computed<TimeRange | null>(() => {\n const selection: TimeRangeSelection = {\n type: this.selectedType(),\n year: this.selectedYear(),\n quarter: this.selectedQuarter(),\n month: this.selectedMonth(),\n day: this.selectedDay(),\n hourFrom: this.hourFrom() ?? undefined,\n hourTo: this.hourTo() ?? undefined,\n relativeValue: this.relativeValue(),\n relativeUnit: this.relativeUnit(),\n customFrom: this.customFrom(),\n customTo: this.customTo()\n };\n return TimeRangeUtils.getTimeRangeFromSelection(selection, this.config.showTime ?? false);\n });\n\n // Min/Max dates for custom picker\n protected minDate = computed(() => this.config.minDate ?? new Date(1900, 0, 1));\n protected maxDate = computed(() => this.config.maxDate ?? new Date(2100, 11, 31));\n protected showTime = computed(() => this.config.showTime ?? false);\n\n ngOnInit(): void {\n this.initializeDefaults();\n if (this.initialSelection) {\n this.applySelection(this.initialSelection);\n }\n this.emitChange();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['initialSelection'] && !changes['initialSelection'].firstChange) {\n if (this.initialSelection) {\n this.applySelection(this.initialSelection);\n this.emitChange();\n }\n }\n if (changes['labels']) {\n // Labels are handled by computed signal\n }\n }\n\n private initializeDefaults(): void {\n const currentYear = new Date().getFullYear();\n const currentMonth = new Date().getMonth();\n\n this.selectedYear.set(currentYear);\n this.selectedMonth.set(currentMonth);\n this.selectedDay.set(new Date().getDate());\n this.selectedQuarter.set(TimeRangeUtils.getCurrentQuarter());\n this.relativeValue.set(this.config.defaultRelativeValue ?? 24);\n this.relativeUnit.set(this.config.defaultRelativeUnit ?? 'hours');\n\n // Set initial type to first available\n const types = this.typeOptions();\n if (types.length > 0 && !types.find(t => t.value === this.selectedType())) {\n this.selectedType.set(types[0].value);\n }\n\n // Initialize custom dates\n const now = new Date();\n const yesterday = new Date(now);\n yesterday.setDate(yesterday.getDate() - 1);\n this.customFrom.set(yesterday);\n this.customTo.set(now);\n }\n\n private applySelection(selection: TimeRangeSelection): void {\n this.selectedType.set(selection.type);\n\n if (selection.year !== undefined) {\n this.selectedYear.set(selection.year);\n }\n if (selection.quarter !== undefined) {\n this.selectedQuarter.set(selection.quarter);\n }\n if (selection.month !== undefined) {\n this.selectedMonth.set(selection.month);\n }\n if (selection.day !== undefined) {\n this.selectedDay.set(selection.day);\n }\n this.hourFrom.set(selection.hourFrom ?? null);\n this.hourTo.set(selection.hourTo ?? null);\n if (selection.relativeValue !== undefined) {\n this.relativeValue.set(selection.relativeValue);\n }\n if (selection.relativeUnit !== undefined) {\n this.relativeUnit.set(selection.relativeUnit);\n }\n if (selection.customFrom !== undefined) {\n this.customFrom.set(selection.customFrom);\n }\n if (selection.customTo !== undefined) {\n this.customTo.set(selection.customTo);\n }\n }\n\n // Event handlers\n protected onTypeChange(type: TimeRangeType): void {\n this.selectedType.set(type);\n if (type !== 'day') {\n this.hourFrom.set(null);\n this.hourTo.set(null);\n }\n this.emitChange();\n }\n\n protected onYearChange(year: number): void {\n this.selectedYear.set(year);\n this.emitChange();\n }\n\n protected onQuarterChange(quarter: Quarter): void {\n this.selectedQuarter.set(quarter);\n this.emitChange();\n }\n\n protected onMonthChange(month: number): void {\n this.selectedMonth.set(month);\n // Clamp day to valid range for the new month\n const daysInMonth = new Date(this.selectedYear(), month + 1, 0).getDate();\n if (this.selectedDay() > daysInMonth) {\n this.selectedDay.set(daysInMonth);\n }\n this.emitChange();\n }\n\n protected onDayChange(day: number): void {\n this.selectedDay.set(day);\n this.emitChange();\n }\n\n protected onHourFromChange(hour: number | null): void {\n this.hourFrom.set(hour);\n // If hourTo is less than or equal to hourFrom, adjust it\n if (hour !== null && this.hourTo() !== null && this.hourTo()! <= hour) {\n this.hourTo.set(hour + 1);\n }\n // If hourFrom is set but hourTo is not, default hourTo to hourFrom + 1\n if (hour !== null && this.hourTo() === null) {\n this.hourTo.set(hour + 1);\n }\n // If hourFrom is cleared, also clear hourTo\n if (hour === null) {\n this.hourTo.set(null);\n }\n this.emitChange();\n }\n\n protected onHourToChange(hour: number | null): void {\n this.hourTo.set(hour);\n this.emitChange();\n }\n\n protected clearHourFilter(): void {\n this.hourFrom.set(null);\n this.hourTo.set(null);\n this.emitChange();\n }\n\n protected onRelativeValueChange(value: number): void {\n this.relativeValue.set(value || 1);\n this.emitChange();\n }\n\n protected onRelativeUnitChange(unit: RelativeTimeUnit): void {\n this.relativeUnit.set(unit);\n this.emitChange();\n }\n\n protected onCustomFromChange(date: Date): void {\n this.customFrom.set(date);\n this.emitChange();\n }\n\n protected onCustomToChange(date: Date): void {\n this.customTo.set(date);\n this.emitChange();\n }\n\n private emitChange(): void {\n const range = this.currentRange();\n if (range) {\n this.rangeChange.emit(range);\n this.rangeChangeISO.emit(TimeRangeUtils.toISO(range));\n }\n\n const selection: TimeRangeSelection = {\n type: this.selectedType(),\n year: this.selectedYear(),\n quarter: this.selectedQuarter(),\n month: this.selectedMonth(),\n day: this.selectedDay(),\n hourFrom: this.hourFrom() ?? undefined,\n hourTo: this.hourTo() ?? undefined,\n relativeValue: this.relativeValue(),\n relativeUnit: this.relativeUnit(),\n customFrom: this.customFrom(),\n customTo: this.customTo()\n };\n this.selectionChange.emit(selection);\n }\n\n // Helper for template\n protected isType(type: TimeRangeType): boolean {\n return this.selectedType() === type;\n }\n}\n","<div class=\"time-range-picker\">\n <!-- Range Type Selection -->\n <div class=\"picker-field type-field\">\n <kendo-label [text]=\"mergedLabels().rangeType || 'Range Type'\">\n <kendo-dropdownlist\n [data]=\"typeOptions()\"\n [value]=\"selectedType()\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n (valueChange)=\"onTypeChange($event)\">\n </kendo-dropdownlist>\n </kendo-label>\n </div>\n\n <!-- Year Selection (for year, quarter, month, day types) -->\n @if (isType('year') || isType('quarter') || isType('month') || isType('day')) {\n <div class=\"picker-field year-field\">\n <kendo-label [text]=\"mergedLabels().year || 'Year'\">\n <kendo-dropdownlist\n [data]=\"yearOptions()\"\n [value]=\"selectedYear()\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n (valueChange)=\"onYearChange($event)\">\n </kendo-dropdownlist>\n </kendo-label>\n </div>\n }\n\n <!-- Quarter Selection -->\n @if (isType('quarter')) {\n <div class=\"picker-field quarter-field\">\n <kendo-label [text]=\"mergedLabels().quarter || 'Quarter'\">\n <kendo-dropdownlist\n [data]=\"quarterOptions()\"\n [value]=\"selectedQuarter()\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n (valueChange)=\"onQuarterChange($event)\">\n </kendo-dropdownlist>\n </kendo-label>\n </div>\n }\n\n <!-- Month Selection -->\n @if (isType('month') || isType('day')) {\n <div class=\"picker-field month-field\">\n <kendo-label [text]=\"mergedLabels().month || 'Month'\">\n <kendo-dropdownlist\n [data]=\"monthOptions()\"\n [value]=\"selectedMonth()\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n (valueChange)=\"onMonthChange($event)\">\n </kendo-dropdownlist>\n </kendo-label>\n </div>\n }\n\n <!-- Day Selection -->\n @if (isType('day')) {\n <div class=\"picker-field day-field\">\n <kendo-label [text]=\"mergedLabels().day || 'Day'\">\n <kendo-dropdownlist\n [data]=\"dayOptions()\"\n [value]=\"selectedDay()\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n (valueChange)=\"onDayChange($event)\">\n </kendo-dropdownlist>\n </kendo-label>\n </div>\n\n <!-- Hour From Selection (optional) -->\n <div class=\"picker-field hour-from-field\">\n <kendo-label [text]=\"mergedLabels().hourFrom || 'From Hour'\">\n <kendo-dropdownlist\n [data]=\"hourFromOptions()\"\n [value]=\"hourFrom()\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [defaultItem]=\"{ value: null, label: '—' }\"\n (valueChange)=\"onHourFromChange($event)\">\n </kendo-dropdownlist>\n </kendo-label>\n </div>\n\n <!-- Hour To Selection (visible when hourFrom is set) -->\n @if (hourFrom() !== null) {\n <div class=\"picker-field hour-to-field\">\n <kendo-label [text]=\"mergedLabels().hourTo || 'To Hour'\">\n <kendo-dropdownlist\n [data]=\"hourToOptions()\"\n [value]=\"hourTo()\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n (valueChange)=\"onHourToChange($event)\">\n </kendo-dropdownlist>\n </kendo-label>\n </div>\n }\n }\n\n <!-- Relative Time Selection -->\n @if (isType('relative')) {\n <div class=\"picker-field relative-value-field\">\n <kendo-label [text]=\"mergedLabels().relativeValue || 'Last'\">\n <kendo-numerictextbox\n [value]=\"relativeValue()\"\n [min]=\"1\"\n [max]=\"9999\"\n [decimals]=\"0\"\n [format]=\"'n0'\"\n [spinners]=\"true\"\n (valueChange)=\"onRelativeValueChange($event)\">\n </kendo-numerictextbox>\n </kendo-label>\n </div>\n\n <div class=\"picker-field relative-unit-field\">\n <kendo-label [text]=\"mergedLabels().relativeUnit || 'Unit'\">\n <kendo-dropdownlist\n [data]=\"relativeUnitOptions()\"\n [value]=\"relativeUnit()\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n (valueChange)=\"onRelativeUnitChange($event)\">\n </kendo-dropdownlist>\n </kendo-label>\n </div>\n }\n\n <!-- Custom Date Range -->\n @if (isType('custom')) {\n <div class=\"picker-field custom-from-field\">\n <kendo-label [text]=\"mergedLabels().customFrom || 'From'\">\n @if (showTime()) {\n <kendo-datetimepicker\n [value]=\"customFrom()\"\n [min]=\"minDate()\"\n [max]=\"customTo()\"\n (valueChange)=\"onCustomFromChange($event)\">\n </kendo-datetimepicker>\n } @else {\n <kendo-datepicker\n [value]=\"customFrom()\"\n [min]=\"minDate()\"\n [max]=\"customTo()\"\n (valueChange)=\"onCustomFromChange($event)\">\n </kendo-datepicker>\n }\n </kendo-label>\n </div>\n\n <div class=\"picker-field custom-to-field\">\n <kendo-label [text]=\"mergedLabels().customTo || 'To'\">\n @if (showTime()) {\n <kendo-datetimepicker\n [value]=\"customTo()\"\n [min]=\"customFrom()\"\n [max]=\"maxDate()\"\n (valueChange)=\"onCustomToChange($event)\">\n </kendo-datetimepicker>\n } @else {\n <kendo-datepicker\n [value]=\"customTo()\"\n [min]=\"customFrom()\"\n [max]=\"maxDate()\"\n (valueChange)=\"onCustomToChange($event)\">\n </kendo-datepicker>\n }\n </kendo-label>\n </div>\n }\n</div>\n","/**\n * Cron Expression Builder - Type definitions and models\n * Supports 6-field cron format: second minute hour day month weekday\n */\n\nexport type ScheduleType = 'seconds' | 'minutes' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'custom';\n\nexport type Weekday = 0 | 1 | 2 | 3 | 4 | 5 | 6; // 0 = Sunday, 6 = Saturday\n\nexport interface CronBuilderConfig {\n /** Show preset quick-select buttons */\n showPresets?: boolean;\n /** Show human-readable description of the cron expression */\n showHumanReadable?: boolean;\n /** Show next execution times */\n showNextExecutions?: boolean;\n /** Number of next executions to show (default: 3) */\n maxNextExecutions?: number;\n /** Show copy to clipboard button */\n showCopyButton?: boolean;\n /** Allow custom/advanced tab for direct cron editing */\n allowCustom?: boolean;\n /** Default schedule type to show */\n defaultScheduleType?: ScheduleType;\n /** Locale for human-readable output ('en' | 'de') */\n locale?: string;\n}\n\nexport const DEFAULT_CRON_BUILDER_CONFIG: CronBuilderConfig = {\n showPresets: true,\n showHumanReadable: true,\n showNextExecutions: true,\n maxNextExecutions: 3,\n showCopyButton: true,\n allowCustom: true,\n defaultScheduleType: 'daily',\n locale: 'en'\n};\n\nexport interface CronSchedule {\n type: ScheduleType;\n /** For seconds tab: interval in seconds */\n secondInterval?: number;\n /** For minutes tab: interval in minutes */\n minuteInterval?: number;\n /** For hourly tab */\n hourInterval?: number;\n hourMinute?: number;\n hourSecond?: number;\n /** For daily/weekly tab */\n time?: { hour: number; minute: number; second: number };\n /** For daily tab: 'every' | 'weekdays' | 'weekends' | 'specific' */\n dailyMode?: 'every' | 'weekdays' | 'weekends' | 'specific';\n /** For weekly/daily specific: selected days (0-6, 0=Sunday) */\n selectedDays?: Weekday[];\n /** For monthly tab */\n monthlyMode?: 'specific' | 'relative';\n dayOfMonth?: number;\n relativeWeek?: 'first' | 'second' | 'third' | 'fourth' | 'last';\n relativeDay?: Weekday;\n /** For custom tab: raw cron fields */\n customFields?: CronFields;\n}\n\nexport interface CronFields {\n second: string;\n minute: string;\n hour: string;\n dayOfMonth: string;\n month: string;\n dayOfWeek: string;\n}\n\nexport interface CronValidationResult {\n isValid: boolean;\n error?: string;\n errorField?: keyof CronFields;\n}\n\nexport interface CronPreset {\n id: string;\n label: string;\n description: string;\n expression: string;\n category?: 'frequent' | 'hourly' | 'daily' | 'weekly' | 'monthly';\n}\n\nexport const CRON_PRESETS: CronPreset[] = [\n // Frequent\n { id: 'every-minute', label: 'Every minute', description: 'Runs every minute', expression: '0 * * * * *', category: 'frequent' },\n { id: 'every-5-minutes', label: 'Every 5 minutes', description: 'Runs every 5 minutes', expression: '0 */5 * * * *', category: 'frequent' },\n { id: 'every-15-minutes', label: 'Every 15 minutes', description: 'Runs every 15 minutes', expression: '0 */15 * * * *', category: 'frequent' },\n { id: 'every-30-minutes', label: 'Every 30 minutes', description: 'Runs every 30 minutes', expression: '0 */30 * * * *', category: 'frequent' },\n // Hourly\n { id: 'every-hour', label: 'Every hour', description: 'Runs at the start of every hour', expression: '0 0 * * * *', category: 'hourly' },\n { id: 'every-2-hours', label: 'Every 2 hours', description: 'Runs every 2 hours', expression: '0 0 */2 * * *', category: 'hourly' },\n { id: 'every-6-hours', label: 'Every 6 hours', description: 'Runs every 6 hours', expression: '0 0 */6 * * *', category: 'hourly' },\n // Daily\n { id: 'daily-midnight', label: 'Daily at midnight', description: 'Runs every day at 00:00', expression: '0 0 0 * * *', category: 'daily' },\n { id: 'daily-9am', label: 'Daily at 9 AM', description: 'Runs every day at 09:00', expression: '0 0 9 * * *', category: 'daily' },\n { id: 'daily-6pm', label: 'Daily at 6 PM', description: 'Runs every day at 18:00', expression: '0 0 18 * * *', category: 'daily' },\n // Weekly\n { id: 'weekdays-9am', label: 'Weekdays at 9 AM', description: 'Runs Monday-Friday at 09:00', expression: '0 0 9 * * 1-5', category: 'weekly' },\n { id: 'weekly-monday', label: 'Weekly on Monday', description: 'Runs every Monday at 09:00', expression: '0 0 9 * * 1', category: 'weekly' },\n { id: 'weekly-friday', label: 'Weekly on Friday', description: 'Runs every Friday at 18:00', expression: '0 0 18 * * 5', category: 'weekly' },\n // Monthly\n { id: 'monthly-1st', label: 'Monthly on 1st', description: 'Runs on the 1st of every month at 00:00', expression: '0 0 0 1 * *', category: 'monthly' },\n { id: 'monthly-15th', label: 'Monthly on 15th', description: 'Runs on the 15th of every month at 00:00', expression: '0 0 0 15 * *', category: 'monthly' },\n { id: 'monthly-last-day', label: 'Last day of month', description: 'Runs on the last day of every month', expression: '0 0 0 L * *', category: 'monthly' }\n];\n\nexport interface DropdownOption<T = string | number> {\n value: T;\n label: string;\n}\n\nexport const SECOND_INTERVALS: DropdownOption<number>[] = [\n { value: 1, label: 'Every second' },\n { value: 2, label: 'Every 2 seconds' },\n { value: 5, label: 'Every 5 seconds' },\n { value: 10, label: 'Every 10 seconds' },\n { value: 15, label: 'Every 15 seconds' },\n { value: 20, label: 'Every 20 seconds' },\n { value: 30, label: 'Every 30 seconds' }\n];\n\nexport const MINUTE_INTERVALS: DropdownOption<number>[] = [\n { value: 1, label: 'Every minute' },\n { value: 2, label: 'Every 2 minutes' },\n { value: 5, label: 'Every 5 minutes' },\n { value: 10, label: 'Every 10 minutes' },\n { value: 15, label: 'Every 15 minutes' },\n { value: 20, label: 'Every 20 minutes' },\n { value: 30, label: 'Every 30 minutes' }\n];\n\nexport const HOUR_INTERVALS: DropdownOption<number>[] = [\n { value: 1, label: 'Every hour' },\n { value: 2, label: 'Every 2 hours' },\n { value: 3, label: 'Every 3 hours' },\n { value: 4, label: 'Every 4 hours' },\n { value: 6, label: 'Every 6 hours' },\n { value: 8, label: 'Every 8 hours' },\n { value: 12, label: 'Every 12 hours' }\n];\n\nexport const WEEKDAYS: DropdownOption<Weekday>[] = [\n { value: 0, label: 'Sunday' },\n { value: 1, label: 'Monday' },\n { value: 2, label: 'Tuesday' },\n { value: 3, label: 'Wednesday' },\n { value: 4, label: 'Thursday' },\n { value: 5, label: 'Friday' },\n { value: 6, label: 'Saturday' }\n];\n\nexport const WEEKDAY_ABBREVIATIONS: DropdownOption<Weekday>[] = [\n { value: 0, label: 'Sun' },\n { value: 1, label: 'Mon' },\n { value: 2, label: 'Tue' },\n { value: 3, label: 'Wed' },\n { value: 4, label: 'Thu' },\n { value: 5, label: 'Fri' },\n { value: 6, label: 'Sat' }\n];\n\nexport const RELATIVE_WEEKS: DropdownOption<string>[] = [\n { value: 'first', label: 'First' },\n { value: 'second', label: 'Second' },\n { value: 'third', label: 'Third' },\n { value: 'fourth', label: 'Fourth' },\n { value: 'last', label: 'Last' }\n];\n\n/** Generate options for hours (0-23) */\nexport function generateHourOptions(): DropdownOption<number>[] {\n return Array.from({ length: 24 }, (_, i) => ({\n value: i,\n label: i.toString().padStart(2, '0')\n }));\n}\n\n/** Generate options for minutes/seconds (0-59) */\nexport function generateMinuteOptions(): DropdownOption<number>[] {\n return Array.from({ length: 60 }, (_, i) => ({\n value: i,\n label: i.toString().padStart(2, '0')\n }));\n}\n\n/** Generate options for day of month (1-31) */\nexport function generateDayOfMonthOptions(): DropdownOption<number>[] {\n return Array.from({ length: 31 }, (_, i) => ({\n value: i + 1,\n label: (i + 1).toString()\n }));\n}\n","import { Injectable } from '@angular/core';\nimport { CronExpressionParser } from 'cron-parser';\nimport {\n CronFields,\n CronSchedule,\n CronValidationResult,\n ScheduleType,\n Weekday\n} from '../cron-builder.models';\n\n/**\n * Service for parsing, validating, and generating cron expressions.\n * Supports 6-field format: second minute hour dayOfMonth month dayOfWeek\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class CronParserService {\n\n /**\n * Validate a 6-field cron expression\n */\n validate(expression: string): CronValidationResult {\n if (!expression || expression.trim() === '') {\n return { isValid: false, error: 'Cron expression is required' };\n }\n\n const parts = expression.trim().split(/\\s+/);\n\n // Must have exactly 6 fields for our format\n if (parts.length !== 6) {\n return {\n isValid: false,\n error: `Expected 6 fields (second minute hour day month weekday), got ${parts.length}`\n };\n }\n\n // Try to parse with cron-parser (it expects 5 or 6 fields)\n try {\n CronExpressionParser.parse(expression, { currentDate: new Date() });\n return { isValid: true };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Invalid cron expression';\n return { isValid: false, error: errorMessage };\n }\n }\n\n /**\n * Parse a cron expression into a structured CronSchedule object\n */\n parse(expression: string): CronSchedule | null {\n const validation = this.validate(expression);\n if (!validation.isValid) {\n return null;\n }\n\n const parts = expression.trim().split(/\\s+/);\n const fields: CronFields = {\n second: parts[0],\n minute: parts[1],\n hour: parts[2],\n dayOfMonth: parts[3],\n month: parts[4],\n dayOfWeek: parts[5]\n };\n\n // Try to detect the schedule type\n const type = this.detectScheduleType(fields);\n\n const schedule: CronSchedule = {\n type,\n customFields: fields\n };\n\n // Parse specific fields based on detected type\n switch (type) {\n case 'seconds':\n schedule.secondInterval = this.parseInterval(fields.second) || 1;\n break;\n\n case 'minutes':\n schedule.minuteInterval = this.parseInterval(fields.minute) || 1;\n break;\n\n case 'hourly':\n schedule.hourInterval = this.parseInterval(fields.hour) || 1;\n schedule.hourMinute = this.parseSimpleValue(fields.minute) ?? 0;\n schedule.hourSecond = this.parseSimpleValue(fields.second) ?? 0;\n break;\n\n case 'daily':\n case 'weekly':\n schedule.time = {\n hour: this.parseSimpleValue(fields.hour) ?? 0,\n minute: this.parseSimpleValue(fields.minute) ?? 0,\n second: this.parseSimpleValue(fields.second) ?? 0\n };\n schedule.selectedDays = this.parseDaysOfWeek(fields.dayOfWeek);\n schedule.dailyMode = this.detectDailyMode(fields.dayOfWeek);\n break;\n\n case 'monthly':\n schedule.time = {\n hour: this.parseSimpleValue(fields.hour) ?? 0,\n minute: this.parseSimpleValue(fields.minute) ?? 0,\n second: this.parseSimpleValue(fields.second) ?? 0\n };\n schedule.monthlyMode = 'specific';\n schedule.dayOfMonth = this.parseSimpleValue(fields.dayOfMonth) ?? 1;\n break;\n }\n\n return schedule;\n }\n\n /**\n * Generate a cron expression from a CronSchedule object\n */\n generate(schedule: CronSchedule): string {\n switch (schedule.type) {\n case 'seconds':\n return this.generateSecondsExpression(schedule);\n case 'minutes':\n return this.generateMinutesExpression(schedule);\n case 'hourly':\n return this.generateHourlyExpression(schedule);\n case 'daily':\n return this.generateDailyExpression(schedule);\n case 'weekly':\n return this.generateWeeklyExpression(schedule);\n case 'monthly':\n return this.generateMonthlyExpression(schedule);\n case 'custom':\n return this.generateCustomExpression(schedule);\n default:\n return '0 * * * * *';\n }\n }\n\n /**\n * Calculate next execution times for a cron expression\n */\n getNextExecutions(expression: string, count = 3): Date[] {\n const validation = this.validate(expression);\n if (!validation.isValid) {\n return [];\n }\n\n try {\n const interval = CronExpressionParser.parse(expression, { currentDate: new Date() });\n const executions: Date[] = [];\n\n for (let i = 0; i < count; i++) {\n const next = interval.next();\n executions.push(next.toDate());\n }\n\n return executions;\n } catch {\n return [];\n }\n }\n\n // --- Private helper methods ---\n\n private detectScheduleType(fields: CronFields): ScheduleType {\n const { second, minute, hour, dayOfMonth, dayOfWeek } = fields;\n\n // Check for seconds interval (*/N in seconds, * in all others)\n if (second.includes('/') && minute === '*' && hour === '*' && dayOfMonth === '*' && dayOfWeek === '*') {\n return 'seconds';\n }\n\n // Check for minutes interval (0 in seconds, */N in minutes, * in others)\n if ((second === '0' || second === '*') && minute.includes('/') && hour === '*' && dayOfMonth === '*' && dayOfWeek === '*') {\n return 'minutes';\n }\n\n // Check for hourly (specific or */N in hours)\n if (hour.includes('/') || (this.isSimpleValue(hour) && dayOfMonth === '*' && dayOfWeek === '*' && minute !== '*')) {\n if (hour.includes('/')) {\n return 'hourly';\n }\n }\n\n // Check for monthly (specific day of month, * in dayOfWeek)\n if (this.isSimpleValue(dayOfMonth) && dayOfMonth !== '*' && dayOfWeek === '*') {\n return 'monthly';\n }\n\n // Check for weekly/daily (specific days of week or ranges)\n if (dayOfMonth === '*' && (dayOfWeek !== '*' || this.isSimpleValue(hour))) {\n // If specific days of week, it's weekly\n if (dayOfWeek !== '*' && !['0-6', '1-5', '0,6', '6,0'].includes(dayOfWeek)) {\n return 'weekly';\n }\n return 'daily';\n }\n\n return 'custom';\n }\n\n private detectDailyMode(dayOfWeek: string): 'every' | 'weekdays' | 'weekends' | 'specific' {\n if (dayOfWeek === '*' || dayOfWeek === '0-6') {\n return 'every';\n }\n if (dayOfWeek === '1-5') {\n return 'weekdays';\n }\n if (dayOfWeek === '0,6' || dayOfWeek === '6,0') {\n return 'weekends';\n }\n return 'specific';\n }\n\n private parseInterval(field: string): number | null {\n const match = field.match(/^\\*\\/(\\d+)$/);\n return match ? parseInt(match[1], 10) : null;\n }\n\n private parseSimpleValue(field: string): number | null {\n if (field === '*') return null;\n const num = parseInt(field, 10);\n return isNaN(num) ? null : num;\n }\n\n private isSimpleValue(field: string): boolean {\n return /^\\d+$/.test(field);\n }\n\n private parseDaysOfWeek(field: string): Weekday[] {\n if (field === '*') {\n return [0, 1, 2, 3, 4, 5, 6];\n }\n\n const days: Weekday[] = [];\n\n // Handle ranges like 1-5\n const rangeMatch = field.match(/^(\\d)-(\\d)$/);\n if (rangeMatch) {\n const start = parseInt(rangeMatch[1], 10);\n const end = parseInt(rangeMatch[2], 10);\n for (let i = start; i <= end; i++) {\n days.push(i as Weekday);\n }\n return days;\n }\n\n // Handle comma-separated values\n const parts = field.split(',');\n for (const part of parts) {\n const num = parseInt(part.trim(), 10);\n if (!isNaN(num) && num >= 0 && num <= 6) {\n days.push(num as Weekday);\n }\n }\n\n return days;\n }\n\n private generateSecondsExpression(schedule: CronSchedule): string {\n const interval = schedule.secondInterval || 1;\n return `*/${interval} * * * * *`;\n }\n\n private generateMinutesExpression(schedule: CronSchedule): string {\n const interval = schedule.minuteInterval || 1;\n return `0 */${interval} * * * *`;\n }\n\n private generateHourlyExpression(schedule: CronSchedule): string {\n const interval = schedule.hourInterval || 1;\n const minute = schedule.hourMinute ?? 0;\n const second = schedule.hourSecond ?? 0;\n return `${second} ${minute} */${interval} * * *`;\n }\n\n private generateDailyExpression(schedule: CronSchedule): string {\n const time = schedule.time || { hour: 0, minute: 0, second: 0 };\n let dayOfWeek = '*';\n\n switch (schedule.dailyMode) {\n case 'weekdays':\n dayOfWeek = '1-5';\n break;\n case 'weekends':\n dayOfWeek = '0,6';\n break;\n case 'specific':\n if (schedule.selectedDays && schedule.selectedDays.length > 0) {\n dayOfWeek = schedule.selectedDays.sort((a, b) => a - b).join(',');\n }\n break;\n case 'every':\n default:\n dayOfWeek = '*';\n break;\n }\n\n return `${time.second} ${time.minute} ${time.hour} * * ${dayOfWeek}`;\n }\n\n private generateWeeklyExpression(schedule: CronSchedule): string {\n const time = schedule.time || { hour: 9, minute: 0, second: 0 };\n const days = schedule.selectedDays || [1]; // Default to Monday\n\n const dayOfWeek = days.length > 0\n ? days.sort((a, b) => a - b).join(',')\n : '1';\n\n return `${time.second} ${time.minute} ${time.hour} * * ${dayOfWeek}`;\n }\n\n private generateMonthlyExpression(schedule: CronSchedule): string {\n const time = schedule.time || { hour: 0, minute: 0, second: 0 };\n\n if (schedule.monthlyMode === 'relative' && schedule.relativeWeek && schedule.relativeDay !== undefined) {\n // For relative scheduling, we need to use special syntax\n // cron-parser doesn't fully support this, so we approximate\n const weekNum = this.getWeekNumber(schedule.relativeWeek);\n const day = schedule.relativeDay;\n\n if (schedule.relativeWeek === 'last') {\n // Last weekday of month - approximate with last week\n return `${time.second} ${time.minute} ${time.hour} * * ${day}`;\n }\n\n // First X-day, Second X-day, etc. - approximate\n const startDay = (weekNum - 1) * 7 + 1;\n const endDay = weekNum * 7;\n return `${time.second} ${time.minute} ${time.hour} ${startDay}-${endDay} * ${day}`;\n }\n\n // Specific day of month\n const dayOfMonth = schedule.dayOfMonth || 1;\n return `${time.second} ${time.minute} ${time.hour} ${dayOfMonth} * *`;\n }\n\n private generateCustomExpression(schedule: CronSchedule): string {\n const fields = schedule.customFields;\n if (!fields) {\n return '0 * * * * *';\n }\n return `${fields.second} ${fields.minute} ${fields.hour} ${fields.dayOfMonth} ${fields.month} ${fields.dayOfWeek}`;\n }\n\n private getWeekNumber(week: 'first' | 'second' | 'third' | 'fourth' | 'last'): number {\n switch (week) {\n case 'first': return 1;\n case 'second': return 2;\n case 'third': return 3;\n case 'fourth': return 4;\n case 'last': return 5;\n default: return 1;\n }\n }\n}\n","import {\n Component,\n Input,\n OnInit,\n forwardRef,\n signal,\n computed,\n inject,\n effect,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\n\n// Kendo UI imports\nimport { TabStripModule } from '@progress/kendo-angular-layout';\nimport { DropDownListModule } from '@progress/kendo-angular-dropdowns';\nimport { ButtonModule, ButtonGroupModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { LabelModule } from '@progress/kendo-angular-label';\nimport { SVGIconModule } from '@progress/kendo-angular-icons';\nimport { copyIcon, clockIcon, checkIcon, xIcon } from '@progress/kendo-svg-icons';\n\n// Local imports\nimport {\n CronBuilderConfig,\n CronSchedule,\n ScheduleType,\n Weekday,\n DEFAULT_CRON_BUILDER_CONFIG,\n CRON_PRESETS,\n CronPreset,\n SECOND_INTERVALS,\n MINUTE_INTERVALS,\n HOUR_INTERVALS,\n WEEKDAY_ABBREVIATIONS,\n WEEKDAYS,\n RELATIVE_WEEKS,\n DropdownOption,\n generateHourOptions,\n generateMinuteOptions,\n generateDayOfMonthOptions,\n CronFields\n} from './cron-builder.models';\nimport { CronParserService } from './services/cron-parser.service';\nimport { CronHumanizerService } from './services/cron-humanizer.service';\n\n@Component({\n selector: 'mm-cron-builder',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n TabStripModule,\n DropDownListModule,\n ButtonModule,\n ButtonGroupModule,\n InputsModule,\n LabelModule,\n SVGIconModule\n ],\n templateUrl: './cron-builder.component.html',\n styleUrl: './cron-builder.component.scss',\n changeDetection: ChangeDetectionStrategy.Eager,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CronBuilderComponent),\n multi: true\n }\n ]\n})\nexport class CronBuilderComponent implements OnInit, ControlValueAccessor {\n\n // --- Configuration ---\n @Input() config: CronBuilderConfig = {};\n\n // --- Services ---\n private readonly cronParser = inject(CronParserService);\n private readonly cronHumanizer = inject(CronHumanizerService);\n\n // --- Icons ---\n protected readonly copyIcon = copyIcon;\n protected readonly clockIcon = clockIcon;\n protected readonly checkIcon = checkIcon;\n protected readonly xIcon = xIcon;\n\n // --- ControlValueAccessor state (initialized as noop, set by registerOnChange/registerOnTouched) ---\n private onChange: (value: string) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n protected disabled = signal(false);\n\n // --- Internal state ---\n protected readonly expression = signal<string>('0 * * * * *');\n protected readonly selectedTabIndex = signal<number>(3); // Default to Daily tab\n protected readonly copiedRecently = signal(false);\n private suppressOnChange = true; // Suppress onChange until user interacts\n\n // Schedule type state\n protected readonly scheduleType = signal<ScheduleType>('daily');\n\n // Seconds tab\n protected readonly secondInterval = signal<number>(5);\n\n // Minutes tab\n protected readonly minuteInterval = signal<number>(5);\n\n // Hourly tab\n protected readonly hourInterval = signal<number>(1);\n protected readonly hourMinute = signal<number>(0);\n protected readonly hourSecond = signal<number>(0);\n\n // Daily/Weekly tab\n protected readonly timeHour = signal<number>(9);\n protected readonly timeMinute = signal<number>(0);\n protected readonly timeSecond = signal<number>(0);\n protected readonly dailyMode = signal<'every' | 'weekdays' | 'weekends' | 'specific'>('every');\n protected readonly selectedDays = signal<Weekday[]>([]);\n\n // Monthly tab\n protected readonly monthlyMode = signal<'specific' | 'relative'>('specific');\n protected readonly dayOfMonth = signal<number>(1);\n protected readonly relativeWeek = signal<string>('first');\n protected readonly relativeDay = signal<Weekday>(1);\n\n // Custom tab\n protected readonly customSecond = signal<string>('0');\n protected readonly customMinute = signal<string>('*');\n protected readonly customHour = signal<string>('*');\n protected readonly customDayOfMonth = signal<string>('*');\n protected readonly customMonth = signal<string>('*');\n protected readonly customDayOfWeek = signal<string>('*');\n\n // --- Computed values ---\n protected readonly mergedConfig = computed(() => ({\n ...DEFAULT_CRON_BUILDER_CONFIG,\n ...this.config\n }));\n\n protected readonly humanReadable = computed(() => {\n const expr = this.expression();\n const locale = this.mergedConfig().locale || 'en';\n return this.cronHumanizer.toHumanReadable(expr, locale);\n });\n\n protected readonly validationResult = computed(() => {\n return this.cronParser.validate(this.expression());\n });\n\n protected readonly nextExecutions = computed(() => {\n const expr = this.expression();\n const maxCount = this.mergedConfig().maxNextExecutions || 3;\n return this.cronParser.getNextExecutions(expr, maxCount);\n });\n\n protected readonly presets = computed(() => {\n return CRON_PRESETS;\n });\n\n protected readonly presetsByCategory = computed(() => {\n const presets = this.presets();\n return {\n frequent: presets.filter(p => p.category === 'frequent'),\n hourly: presets.filter(p => p.category === 'hourly'),\n daily: presets.filter(p => p.category === 'daily'),\n weekly: presets.filter(p => p.category === 'weekly'),\n monthly: presets.filter(p => p.category === 'monthly')\n };\n });\n\n // --- Dropdown options ---\n protected get secondIntervalOptions(): typeof SECOND_INTERVALS { return SECOND_INTERVALS; }\n protected get minuteIntervalOptions(): typeof MINUTE_INTERVALS { return MINUTE_INTERVALS; }\n protected get hourIntervalOptions(): typeof HOUR_INTERVALS { return HOUR_INTERVALS; }\n protected get weekdayOptions(): typeof WEEKDAYS { return WEEKDAYS; }\n protected get weekdayAbbreviations(): typeof WEEKDAY_ABBREVIATIONS { return WEEKDAY_ABBREVIATIONS; }\n protected get relativeWeekOptions(): typeof RELATIVE_WEEKS { return RELATIVE_WEEKS; }\n protected readonly hourOptions: DropdownOption<number>[];\n protected readonly minuteOptions: DropdownOption<number>[];\n protected readonly dayOfMonthOptions: DropdownOption<number>[];\n\n // --- Tab mapping ---\n protected readonly tabIndexToType: ScheduleType[] = [\n 'seconds', 'minutes', 'hourly', 'daily', 'weekly', 'monthly', 'custom'\n ];\n\n constructor() {\n // Assigned here rather than as field initialisers: a class field initialised from a\n // relative import reads `undefined` under the Vitest module runner, so calling the\n // imported generator at field-init time would throw (see CLAUDE.md,\n // \"Vite/esbuild class-field snapshot\"). A getter is not an option — the template reads\n // these three every change detection cycle and would rebuild the option arrays each time.\n this.hourOptions = generateHourOptions();\n this.minuteOptions = generateMinuteOptions();\n this.dayOfMonthOptions = generateDayOfMonthOptions();\n\n // Effect to generate expression when schedule values change\n effect(() => {\n const type = this.scheduleType();\n const schedule = this.buildScheduleFromState(type);\n const newExpression = this.cronParser.generate(schedule);\n const currentExpression = this.expression();\n\n // Only update if the expression actually changed\n if (newExpression !== currentExpression) {\n this.expression.set(newExpression);\n }\n\n // Only call onChange if not suppressed (user has interacted)\n if (!this.suppressOnChange && newExpression !== currentExpression) {\n this.onChange(newExpression);\n }\n }, { allowSignalWrites: true });\n }\n\n ngOnInit(): void {\n const defaultType = this.mergedConfig().defaultScheduleType || 'daily';\n this.scheduleType.set(defaultType);\n this.selectedTabIndex.set(this.tabIndexToType.indexOf(defaultType));\n }\n\n // --- ControlValueAccessor implementation ---\n\n writeValue(value: string): void {\n if (value) {\n this.expression.set(value);\n this.parseExpressionToState(value);\n }\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n }\n\n // --- Event handlers ---\n\n protected onTabSelect(index: number): void {\n this.suppressOnChange = false;\n this.selectedTabIndex.set(index);\n const type = this.tabIndexToType[index];\n if (type) {\n this.scheduleType.set(type);\n }\n this.onTouched();\n }\n\n protected onPresetSelect(preset: CronPreset): void {\n this.suppressOnChange = false;\n this.expression.set(preset.expression);\n this.parseExpressionToState(preset.expression);\n this.onChange(preset.expression);\n this.onTouched();\n }\n\n protected async onCopyExpression(): Promise<void> {\n const expr = this.expression();\n try {\n await navigator.clipboard.writeText(expr);\n this.copiedRecently.set(true);\n setTimeout(() => this.copiedRecently.set(false), 2000);\n } catch (err) {\n console.error('Failed to copy to clipboard:', err);\n }\n }\n\n // --- Seconds tab handlers ---\n protected onSecondIntervalChange(value: number): void {\n this.suppressOnChange = false;\n this.secondInterval.set(value);\n this.onTouched();\n }\n\n // --- Minutes tab handlers ---\n protected onMinuteIntervalChange(value: number): void {\n this.suppressOnChange = false;\n this.minuteInterval.set(value);\n this.onTouched();\n }\n\n // --- Hourly tab handlers ---\n protected onHourIntervalChange(value: number): void {\n this.suppressOnChange = false;\n this.hourInterval.set(value);\n this.onTouched();\n }\n\n protected onHourMinuteChange(value: number): void {\n this.suppressOnChange = false;\n this.hourMinute.set(value);\n this.onTouched();\n }\n\n protected onHourSecondChange(value: number): void {\n this.suppressOnChange = false;\n this.hourSecond.set(value);\n this.onTouched();\n }\n\n // --- Daily tab handlers ---\n protected onTimeHourChange(value: number): void {\n this.suppressOnChange = false;\n this.timeHour.set(value);\n this.onTouched();\n }\n\n protected onTimeMinuteChange(value: number): void {\n this.suppressOnChange = false;\n this.timeMinute.set(value);\n this.onTouched();\n }\n\n protected onTimeSecondChange(value: number): void {\n this.suppressOnChange = false;\n this.timeSecond.set(value);\n this.onTouched();\n }\n\n protected onDailyModeChange(mode: 'every' | 'weekdays' | 'weekends' | 'specific'): void {\n this.suppressOnChange = false;\n this.dailyMode.set(mode);\n if (mode !== 'specific') {\n this.selectedDays.set([]);\n }\n this.onTouched();\n }\n\n protected onDayToggle(day: Weekday): void {\n this.suppressOnChange = false;\n const current = this.selectedDays();\n if (current.includes(day)) {\n this.selectedDays.set(current.filter(d => d !== day));\n } else {\n this.selectedDays.set([...current, day]);\n }\n this.onTouched();\n }\n\n protected isDaySelected(day: Weekday): boolean {\n return this.selectedDays().includes(day);\n }\n\n // --- Monthly tab handlers ---\n protected onMonthlyModeChange(mode: 'specific' | 'relative'): void {\n this.suppressOnChange = false;\n this.monthlyMode.set(mode);\n this.onTouched();\n }\n\n protected onDayOfMonthChange(value: number): void {\n this.suppressOnChange = false;\n this.dayOfMonth.set(value);\n this.onTouched();\n }\n\n protected onRelativeWeekChange(value: string): void {\n this.suppressOnChange = false;\n this.relativeWeek.set(value);\n this.onTouched();\n }\n\n protected onRelativeDayChange(value: Weekday): void {\n this.suppressOnChange = false;\n this.relativeDay.set(value);\n this.onTouched();\n }\n\n // --- Custom tab handlers ---\n protected onCustomFieldChange(field: keyof CronFields, value: string): void {\n this.suppressOnChange = false;\n switch (field) {\n case 'second': this.customSecond.set(value); break;\n case 'minute': this.customMinute.set(value); break;\n case 'hour': this.customHour.set(value); break;\n case 'dayOfMonth': this.customDayOfMonth.set(value); break;\n case 'month': this.customMonth.set(value); break;\n case 'dayOfWeek': this.customDayOfWeek.set(value); break;\n }\n this.onTouched();\n }\n\n // --- Helper methods ---\n\n protected formatNextExecution(date: Date): string {\n return date.toLocaleString(this.mergedConfig().locale || 'en', {\n weekday: 'short',\n year: 'numeric',\n month: 'short',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false\n });\n }\n\n private buildScheduleFromState(type: ScheduleType): CronSchedule {\n const schedule: CronSchedule = { type };\n\n switch (type) {\n case 'seconds':\n schedule.secondInterval = this.secondInterval();\n break;\n\n case 'minutes':\n schedule.minuteInterval = this.minuteInterval();\n break;\n\n case 'hourly':\n schedule.hourInterval = this.hourInterval();\n schedule.hourMinute = this.hourMinute();\n schedule.hourSecond = this.hourSecond();\n break;\n\n case 'daily':\n schedule.time = {\n hour: this.timeHour(),\n minute: this.timeMinute(),\n second: this.timeSecond()\n };\n schedule.dailyMode = this.dailyMode();\n schedule.selectedDays = this.selectedDays();\n break;\n\n case 'weekly':\n schedule.time = {\n hour: this.timeHour(),\n minute: this.timeMinute(),\n second: this.timeSecond()\n };\n schedule.selectedDays = this.selectedDays().length > 0 ? this.selectedDays() : [1];\n break;\n\n case 'monthly':\n schedule.time = {\n hour: this.timeHour(),\n minute: this.timeMinute(),\n second: this.timeSecond()\n };\n schedule.monthlyMode = this.monthlyMode();\n schedule.dayOfMonth = this.dayOfMonth();\n schedule.relativeWeek = this.relativeWeek() as 'first' | 'second' | 'third' | 'fourth' | 'last';\n schedule.relativeDay = this.relativeDay();\n break;\n\n case 'custom':\n schedule.customFields = {\n second: this.customSecond(),\n minute: this.customMinute(),\n hour: this.customHour(),\n dayOfMonth: this.customDayOfMonth(),\n month: this.customMonth(),\n dayOfWeek: this.customDayOfWeek()\n };\n break;\n }\n\n return schedule;\n }\n\n private parseExpressionToState(expression: string): void {\n const schedule = this.cronParser.parse(expression);\n if (!schedule) return;\n\n this.scheduleType.set(schedule.type);\n this.selectedTabIndex.set(this.tabIndexToType.indexOf(schedule.type));\n\n // Parse custom fields first (always available)\n if (schedule.customFields) {\n this.customSecond.set(schedule.customFields.second);\n this.customMinute.set(schedule.customFields.minute);\n this.customHour.set(schedule.customFields.hour);\n this.customDayOfMonth.set(schedule.customFields.dayOfMonth);\n this.customMonth.set(schedule.customFields.month);\n this.customDayOfWeek.set(schedule.customFields.dayOfWeek);\n }\n\n // Parse type-specific fields\n switch (schedule.type) {\n case 'seconds':\n if (schedule.secondInterval) this.secondInterval.set(schedule.secondInterval);\n break;\n\n case 'minutes':\n if (schedule.minuteInterval) this.minuteInterval.set(schedule.minuteInterval);\n break;\n\n case 'hourly':\n if (schedule.hourInterval) this.hourInterval.set(schedule.hourInterval);\n if (schedule.hourMinute !== undefined) this.hourMinute.set(schedule.hourMinute);\n if (schedule.hourSecond !== undefined) this.hourSecond.set(schedule.hourSecond);\n break;\n\n case 'daily':\n case 'weekly':\n if (schedule.time) {\n this.timeHour.set(schedule.time.hour);\n this.timeMinute.set(schedule.time.minute);\n this.timeSecond.set(schedule.time.second);\n }\n if (schedule.dailyMode) this.dailyMode.set(schedule.dailyMode);\n if (schedule.selectedDays) this.selectedDays.set(schedule.selectedDays);\n break;\n\n case 'monthly':\n if (schedule.time) {\n this.timeHour.set(schedule.time.hour);\n this.timeMinute.set(schedule.time.minute);\n this.timeSecond.set(schedule.time.second);\n }\n if (schedule.monthlyMode) this.monthlyMode.set(schedule.monthlyMode);\n if (schedule.dayOfMonth) this.dayOfMonth.set(schedule.dayOfMonth);\n if (schedule.relativeWeek) this.relativeWeek.set(schedule.relativeWeek);\n if (schedule.relativeDay !== undefined) this.relativeDay.set(schedule.relativeDay);\n break;\n }\n }\n\n // Track by functions for ngFor\n protected trackByValue(_index: number, item: DropdownOption): number | string {\n return item.value;\n }\n\n protected trackByPresetId(_index: number, item: CronPreset): string {\n return item.id;\n }\n}\n","<div class=\"cron-builder\" [class.disabled]=\"disabled()\">\n <!-- Expression Preview Section -->\n <div class=\"expression-section\">\n <div class=\"expression-display\">\n <div class=\"expression-label\">Cron Expression</div>\n <div class=\"expression-value-row\">\n <code class=\"expression-value\" [class.invalid]=\"!validationResult().isValid\">\n {{ expression() }}\n </code>\n @if (mergedConfig().showCopyButton) {\n <button\n kendoButton\n [svgIcon]=\"copiedRecently() ? checkIcon : copyIcon\"\n [title]=\"copiedRecently() ? 'Copied!' : 'Copy to clipboard'\"\n fillMode=\"flat\"\n class=\"copy-button\"\n [class.copied]=\"copiedRecently()\"\n (click)=\"onCopyExpression()\"\n [disabled]=\"disabled()\">\n </button>\n }\n </div>\n @if (!validationResult().isValid) {\n <div class=\"validation-error\">\n <kendo-svg-icon [icon]=\"xIcon\" size=\"small\"></kendo-svg-icon>\n {{ validationResult().error }}\n </div>\n }\n </div>\n\n @if (mergedConfig().showHumanReadable && validationResult().isValid) {\n <div class=\"human-readable\">\n <kendo-svg-icon [icon]=\"clockIcon\" size=\"small\"></kendo-svg-icon>\n <span>{{ humanReadable() }}</span>\n </div>\n }\n </div>\n\n <!-- Preset Buttons -->\n @if (mergedConfig().showPresets) {\n <div class=\"presets-section\">\n <div class=\"presets-label\">Quick Select</div>\n <div class=\"presets-grid\">\n @for (preset of presetsByCategory().frequent; track preset.id) {\n <button\n kendoButton\n size=\"small\"\n fillMode=\"outline\"\n class=\"preset-button\"\n [title]=\"preset.description\"\n [disabled]=\"disabled()\"\n (click)=\"onPresetSelect(preset)\">\n {{ preset.label }}\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Schedule Type Tabs -->\n <kendo-tabstrip\n [animate]=\"false\"\n [tabAlignment]=\"'start'\"\n (tabSelect)=\"onTabSelect($event.index)\">\n\n <!-- Seconds Tab -->\n <kendo-tabstrip-tab [title]=\"'Seconds'\" [selected]=\"selectedTabIndex() === 0\">\n <ng-template kendoTabContent>\n <div class=\"tab-content\">\n <div class=\"form-row\">\n <kendo-label text=\"Run every\"></kendo-label>\n <kendo-dropdownlist\n [data]=\"secondIntervalOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"secondInterval()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onSecondIntervalChange($event)\">\n </kendo-dropdownlist>\n </div>\n <div class=\"preview-text\">\n Generates: <code>*/{{ secondInterval() }} * * * * *</code>\n </div>\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n\n <!-- Minutes Tab -->\n <kendo-tabstrip-tab [title]=\"'Minutes'\" [selected]=\"selectedTabIndex() === 1\">\n <ng-template kendoTabContent>\n <div class=\"tab-content\">\n <div class=\"form-row\">\n <kendo-label text=\"Run every\"></kendo-label>\n <kendo-dropdownlist\n [data]=\"minuteIntervalOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"minuteInterval()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onMinuteIntervalChange($event)\">\n </kendo-dropdownlist>\n </div>\n <div class=\"preview-text\">\n Generates: <code>0 */{{ minuteInterval() }} * * * *</code>\n </div>\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n\n <!-- Hourly Tab -->\n <kendo-tabstrip-tab [title]=\"'Hourly'\" [selected]=\"selectedTabIndex() === 2\">\n <ng-template kendoTabContent>\n <div class=\"tab-content\">\n <div class=\"form-row\">\n <kendo-label text=\"Run every\"></kendo-label>\n <kendo-dropdownlist\n [data]=\"hourIntervalOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"hourInterval()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onHourIntervalChange($event)\">\n </kendo-dropdownlist>\n </div>\n <div class=\"form-row\">\n <kendo-label text=\"At minute\"></kendo-label>\n <kendo-dropdownlist\n [data]=\"minuteOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"hourMinute()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onHourMinuteChange($event)\">\n </kendo-dropdownlist>\n <span class=\"separator\">:</span>\n <kendo-dropdownlist\n [data]=\"minuteOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"hourSecond()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onHourSecondChange($event)\">\n </kendo-dropdownlist>\n <span class=\"time-label\">(mm:ss)</span>\n </div>\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n\n <!-- Daily Tab -->\n <kendo-tabstrip-tab [title]=\"'Daily'\" [selected]=\"selectedTabIndex() === 3\">\n <ng-template kendoTabContent>\n <div class=\"tab-content\">\n <div class=\"form-row time-row\">\n <kendo-label text=\"At\"></kendo-label>\n <kendo-dropdownlist\n [data]=\"hourOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"timeHour()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onTimeHourChange($event)\">\n </kendo-dropdownlist>\n <span class=\"separator\">:</span>\n <kendo-dropdownlist\n [data]=\"minuteOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"timeMinute()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onTimeMinuteChange($event)\">\n </kendo-dropdownlist>\n <span class=\"separator\">:</span>\n <kendo-dropdownlist\n [data]=\"minuteOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"timeSecond()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onTimeSecondChange($event)\">\n </kendo-dropdownlist>\n </div>\n\n <div class=\"form-row mode-row\">\n <kendo-label text=\"On\"></kendo-label>\n <div class=\"mode-buttons\">\n <button\n kendoButton\n [selected]=\"dailyMode() === 'every'\"\n [disabled]=\"disabled()\"\n (click)=\"onDailyModeChange('every')\">\n Every day\n </button>\n <button\n kendoButton\n [selected]=\"dailyMode() === 'weekdays'\"\n [disabled]=\"disabled()\"\n (click)=\"onDailyModeChange('weekdays')\">\n Weekdays\n </button>\n <button\n kendoButton\n [selected]=\"dailyMode() === 'weekends'\"\n [disabled]=\"disabled()\"\n (click)=\"onDailyModeChange('weekends')\">\n Weekends\n </button>\n <button\n kendoButton\n [selected]=\"dailyMode() === 'specific'\"\n [disabled]=\"disabled()\"\n (click)=\"onDailyModeChange('specific')\">\n Specific days\n </button>\n </div>\n </div>\n\n @if (dailyMode() === 'specific') {\n <div class=\"form-row days-row\">\n <div class=\"day-buttons\">\n @for (day of weekdayAbbreviations; track day.value) {\n <button\n kendoButton\n [selected]=\"isDaySelected(day.value)\"\n [disabled]=\"disabled()\"\n class=\"day-button\"\n (click)=\"onDayToggle(day.value)\">\n {{ day.label }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n\n <!-- Weekly Tab -->\n <kendo-tabstrip-tab [title]=\"'Weekly'\" [selected]=\"selectedTabIndex() === 4\">\n <ng-template kendoTabContent>\n <div class=\"tab-content\">\n <div class=\"form-row time-row\">\n <kendo-label text=\"At\"></kendo-label>\n <kendo-dropdownlist\n [data]=\"hourOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"timeHour()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onTimeHourChange($event)\">\n </kendo-dropdownlist>\n <span class=\"separator\">:</span>\n <kendo-dropdownlist\n [data]=\"minuteOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"timeMinute()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onTimeMinuteChange($event)\">\n </kendo-dropdownlist>\n <span class=\"separator\">:</span>\n <kendo-dropdownlist\n [data]=\"minuteOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"timeSecond()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onTimeSecondChange($event)\">\n </kendo-dropdownlist>\n </div>\n\n <div class=\"form-row\">\n <kendo-label text=\"On days\"></kendo-label>\n <div class=\"day-buttons\">\n @for (day of weekdayAbbreviations; track day.value) {\n <button\n kendoButton\n [selected]=\"isDaySelected(day.value)\"\n [disabled]=\"disabled()\"\n class=\"day-button\"\n (click)=\"onDayToggle(day.value)\">\n {{ day.label }}\n </button>\n }\n </div>\n </div>\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n\n <!-- Monthly Tab -->\n <kendo-tabstrip-tab [title]=\"'Monthly'\" [selected]=\"selectedTabIndex() === 5\">\n <ng-template kendoTabContent>\n <div class=\"tab-content\">\n <div class=\"form-row time-row\">\n <kendo-label text=\"At\"></kendo-label>\n <kendo-dropdownlist\n [data]=\"hourOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"timeHour()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onTimeHourChange($event)\">\n </kendo-dropdownlist>\n <span class=\"separator\">:</span>\n <kendo-dropdownlist\n [data]=\"minuteOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"timeMinute()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onTimeMinuteChange($event)\">\n </kendo-dropdownlist>\n <span class=\"separator\">:</span>\n <kendo-dropdownlist\n [data]=\"minuteOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"timeSecond()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onTimeSecondChange($event)\">\n </kendo-dropdownlist>\n </div>\n\n <div class=\"form-row mode-row\">\n <div class=\"mode-buttons\">\n <button\n kendoButton\n [selected]=\"monthlyMode() === 'specific'\"\n [disabled]=\"disabled()\"\n (click)=\"onMonthlyModeChange('specific')\">\n Specific day\n </button>\n <button\n kendoButton\n [selected]=\"monthlyMode() === 'relative'\"\n [disabled]=\"disabled()\"\n (click)=\"onMonthlyModeChange('relative')\">\n Relative day\n </button>\n </div>\n </div>\n\n @if (monthlyMode() === 'specific') {\n <div class=\"form-row\">\n <kendo-label text=\"On day\"></kendo-label>\n <kendo-dropdownlist\n [data]=\"dayOfMonthOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"dayOfMonth()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onDayOfMonthChange($event)\">\n </kendo-dropdownlist>\n <span class=\"suffix-text\">of every month</span>\n </div>\n }\n\n @if (monthlyMode() === 'relative') {\n <div class=\"form-row\">\n <kendo-label text=\"On the\"></kendo-label>\n <kendo-dropdownlist\n [data]=\"relativeWeekOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"relativeWeek()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onRelativeWeekChange($event)\">\n </kendo-dropdownlist>\n <kendo-dropdownlist\n [data]=\"weekdayOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"relativeDay()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onRelativeDayChange($event)\">\n </kendo-dropdownlist>\n <span class=\"suffix-text\">of every month</span>\n </div>\n }\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n\n <!-- Custom/Advanced Tab -->\n @if (mergedConfig().allowCustom) {\n <kendo-tabstrip-tab [title]=\"'Custom'\" [selected]=\"selectedTabIndex() === 6\">\n <ng-template kendoTabContent>\n <div class=\"tab-content custom-tab\">\n <div class=\"custom-fields\">\n <div class=\"custom-field\">\n <kendo-label text=\"Second\"></kendo-label>\n <kendo-textbox\n [value]=\"customSecond()\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onCustomFieldChange('second', $event || '*')\">\n </kendo-textbox>\n <span class=\"field-hint\">0-59, *, /</span>\n </div>\n <div class=\"custom-field\">\n <kendo-label text=\"Minute\"></kendo-label>\n <kendo-textbox\n [value]=\"customMinute()\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onCustomFieldChange('minute', $event || '*')\">\n </kendo-textbox>\n <span class=\"field-hint\">0-59, *, /</span>\n </div>\n <div class=\"custom-field\">\n <kendo-label text=\"Hour\"></kendo-label>\n <kendo-textbox\n [value]=\"customHour()\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onCustomFieldChange('hour', $event || '*')\">\n </kendo-textbox>\n <span class=\"field-hint\">0-23, *, /</span>\n </div>\n <div class=\"custom-field\">\n <kendo-label text=\"Day\"></kendo-label>\n <kendo-textbox\n [value]=\"customDayOfMonth()\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onCustomFieldChange('dayOfMonth', $event || '*')\">\n </kendo-textbox>\n <span class=\"field-hint\">1-31, *, /</span>\n </div>\n <div class=\"custom-field\">\n <kendo-label text=\"Month\"></kendo-label>\n <kendo-textbox\n [value]=\"customMonth()\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onCustomFieldChange('month', $event || '*')\">\n </kendo-textbox>\n <span class=\"field-hint\">1-12, *, /</span>\n </div>\n <div class=\"custom-field\">\n <kendo-label text=\"Weekday\"></kendo-label>\n <kendo-textbox\n [value]=\"customDayOfWeek()\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onCustomFieldChange('dayOfWeek', $event || '*')\">\n </kendo-textbox>\n <span class=\"field-hint\">0-6 (Sun-Sat)</span>\n </div>\n </div>\n\n <div class=\"syntax-reference\">\n <div class=\"reference-title\">Syntax Reference</div>\n <div class=\"reference-items\">\n <span><code>*</code> any</span>\n <span><code>*/N</code> every N</span>\n <span><code>N-M</code> range</span>\n <span><code>N,M</code> list</span>\n </div>\n </div>\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n }\n </kendo-tabstrip>\n\n <!-- Next Executions Section -->\n @if (mergedConfig().showNextExecutions && validationResult().isValid && nextExecutions().length > 0) {\n <div class=\"next-executions-section\">\n <div class=\"next-executions-label\">Next Executions</div>\n <ul class=\"next-executions-list\">\n @for (execution of nextExecutions(); track $index) {\n <li>{{ formatNextExecution(execution) }}</li>\n }\n </ul>\n </div>\n }\n</div>\n","import { Component, Input, Output, EventEmitter, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ButtonModule } from '@progress/kendo-angular-buttons';\nimport { SVGIconModule } from '@progress/kendo-angular-icons';\nimport { copyIcon } from '@progress/kendo-svg-icons';\nimport { NotificationDisplayService } from '../services/notification-display.service';\n\n/**\n * A component that displays a read-only text value with a copy-to-clipboard button.\n *\n * @example\n * ```html\n * <mm-copyable-text\n * [value]=\"rtId\"\n * label=\"Runtime ID\"\n * copyLabel=\"Runtime ID\">\n * </mm-copyable-text>\n * ```\n */\n@Component({\n selector: 'mm-copyable-text',\n standalone: true,\n imports: [CommonModule, ButtonModule, SVGIconModule],\n templateUrl: './copyable-text.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './copyable-text.component.scss'\n})\nexport class CopyableTextComponent {\n /** The value to display and copy. Displays an em-dash when null/undefined/empty. */\n @Input({ required: true }) value!: string | null | undefined;\n\n /** Optional label displayed above the value. */\n @Input() label?: string;\n\n /** Label used in the notification message. Falls back to label, then 'Value'. */\n @Input() copyLabel?: string;\n\n /** Tooltip for the copy button. */\n @Input() buttonTitle = 'Copy to clipboard';\n\n /** Emitted when the value is successfully copied to clipboard. */\n @Output() copied = new EventEmitter<string>();\n\n protected readonly copyIcon = copyIcon;\n private readonly notificationService = inject(NotificationDisplayService);\n\n /** Returns true if the value is non-empty and can be copied. */\n protected get hasValue(): boolean {\n return !!this.value && this.value.trim().length > 0;\n }\n\n /** Copies the value to clipboard and shows a notification. */\n protected copyToClipboard(): void {\n if (!this.hasValue) {\n return;\n }\n\n navigator.clipboard.writeText(this.value!).then(() => {\n const label = this.copyLabel || this.label || 'Value';\n this.notificationService.showSuccess(`${label} copied to clipboard`, 2000);\n this.copied.emit(this.value!);\n }).catch(err => {\n console.error('Failed to copy:', err);\n this.notificationService.showError('Failed to copy to clipboard');\n });\n }\n}\n","<div class=\"mm-copyable-text\">\n @if (label) {\n <label class=\"label\">{{ label }}</label>\n }\n <div class=\"value-container\">\n <span class=\"value\">{{ hasValue ? value : '—' }}</span>\n @if (hasValue) {\n <button\n kendoButton\n type=\"button\"\n fillMode=\"flat\"\n [svgIcon]=\"copyIcon\"\n [title]=\"buttonTitle\"\n class=\"copy-button\"\n (click)=\"copyToClipboard()\">\n </button>\n }\n </div>\n</div>\n","import {Component, inject, Input, ChangeDetectionStrategy} from '@angular/core';\nimport {DialogActionsComponent, DialogContentBase, DialogRef} from '@progress/kendo-angular-dialog';\nimport {ButtonComponent} from '@progress/kendo-angular-buttons';\nimport {FormsModule} from '@angular/forms';\nimport {ImportStrategyDto} from '../models/importStrategyDto';\n\nexport class ImportStrategyDialogResult {\n constructor(public strategy: ImportStrategyDto) {}\n}\n\n@Component({\n selector: 'mm-import-strategy-dialog',\n imports: [\n DialogActionsComponent,\n ButtonComponent,\n FormsModule\n ],\n templateUrl: './import-strategy-dialog.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './import-strategy-dialog.component.css'\n})\nexport class ImportStrategyDialogComponent extends DialogContentBase {\n private readonly dialogRef: DialogRef;\n\n @Input() message = '';\n\n protected selectedStrategy: ImportStrategyDto;\n protected get ImportStrategyDto(): typeof ImportStrategyDto { return ImportStrategyDto; }\n\n constructor() {\n const dialogRef = inject(DialogRef);\n super(dialogRef);\n this.dialogRef = dialogRef;\n // Assigned here rather than as a field initialiser: a class field initialised from a\n // relative import reads `undefined` under the Vitest module runner, so the member access\n // would throw (see CLAUDE.md, \"Vite/esbuild class-field snapshot\").\n this.selectedStrategy = ImportStrategyDto.Upsert;\n }\n\n onImport(): void {\n this.dialogRef.close(new ImportStrategyDialogResult(this.selectedStrategy));\n }\n\n onCancel(): void {\n this.dialogRef.close(null);\n }\n}\n","<div class=\"import-strategy-content\">\n <p class=\"strategy-message\">{{ message }}</p>\n <div class=\"strategy-options\">\n <div class=\"strategy-option\">\n <label class=\"strategy-label\">\n <input type=\"radio\"\n name=\"importStrategy\"\n [value]=\"ImportStrategyDto.InsertOnly\"\n [(ngModel)]=\"selectedStrategy\"/>\n Insert Only\n </label>\n <p class=\"strategy-description\">Only insert new entities. Fails if entities already exist.</p>\n </div>\n <div class=\"strategy-option\">\n <label class=\"strategy-label\">\n <input type=\"radio\"\n name=\"importStrategy\"\n [value]=\"ImportStrategyDto.Upsert\"\n [(ngModel)]=\"selectedStrategy\"/>\n Upsert (Recommended)\n </label>\n <p class=\"strategy-description\">Update existing entities and insert new ones.</p>\n </div>\n </div>\n</div>\n<kendo-dialog-actions>\n <button kendoButton (click)=\"onImport()\" themeColor=\"primary\">Import</button>\n <button kendoButton (click)=\"onCancel()\">Cancel</button>\n</kendo-dialog-actions>\n","import {Injectable, inject} from '@angular/core';\nimport {DialogRef, DialogService} from '@progress/kendo-angular-dialog';\nimport {firstValueFrom} from 'rxjs';\nimport {ImportStrategyDialogComponent, ImportStrategyDialogResult} from './import-strategy-dialog.component';\nimport {ImportStrategyDto} from '../models/importStrategyDto';\n\n@Injectable()\nexport class ImportStrategyDialogService {\n private readonly dialogService = inject(DialogService);\n\n public async showImportStrategyDialog(title = 'Import', message = 'Select an import strategy:'): Promise<ImportStrategyDto | null> {\n const dialogRef: DialogRef = this.dialogService.open({\n title,\n content: ImportStrategyDialogComponent\n });\n\n const component = dialogRef.content.instance as ImportStrategyDialogComponent;\n component.message = message;\n\n const result = await firstValueFrom(dialogRef.result);\n if (result instanceof ImportStrategyDialogResult) {\n return result.strategy;\n }\n return null;\n }\n}\n","import {InjectionToken} from '@angular/core';\n\n/**\n * Texts of `mm-row-actions` (G16). `{name}` is replaced by the row label; the `…For` members are\n * used when the row has a label, the plain ones when it is empty.\n */\nexport interface RowActionsMessages {\n /** Accessible name of the action group: \"Actions for {name}\". */\n actionsFor: string;\n /** Group name without a row label. */\n actions: string;\n /** Accessible name and tooltip of the overflow button: \"More actions for {name}\". */\n moreActionsFor: string;\n /** Overflow button without a row label. */\n moreActions: string;\n}\n\nexport const DEFAULT_ROW_ACTIONS_MESSAGES: RowActionsMessages = {\n actionsFor: 'Actions for {name}',\n actions: 'Actions',\n moreActionsFor: 'More actions for {name}',\n moreActions: 'More actions',\n};\n\n/** App-wide translations of `mm-row-actions`. Partial: members left out keep their English default. */\nexport const MM_ROW_ACTIONS_MESSAGES = new InjectionToken<Partial<RowActionsMessages>>('MM_ROW_ACTIONS_MESSAGES');\n\n/**\n * Merges overrides over {@link DEFAULT_ROW_ACTIONS_MESSAGES}, later sources winning; members that\n * are missing, `undefined` or `null` keep the earlier value.\n */\nexport function resolveRowActionsMessages(\n ...overrides: (Partial<RowActionsMessages> | null | undefined)[]\n): RowActionsMessages {\n const resolved: RowActionsMessages = {...DEFAULT_ROW_ACTIONS_MESSAGES};\n for (const messages of overrides) {\n if (!messages) {\n continue;\n }\n for (const key of Object.keys(messages) as (keyof RowActionsMessages)[]) {\n const value = messages[key];\n if (value !== undefined && value !== null) {\n resolved[key] = value;\n }\n }\n }\n return resolved;\n}\n","import {ChangeDetectionStrategy, Component, ViewEncapsulation, computed, inject, input, numberAttribute, output} from '@angular/core';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {DropDownButtonModule} from '@progress/kendo-angular-buttons';\nimport {SVGIconModule} from '@progress/kendo-angular-icons';\nimport {moreVerticalIcon} from '@progress/kendo-svg-icons';\nimport {ActionButtonComponent} from './action-button.component';\nimport {\n MM_ROW_ACTIONS_MAX_INLINE,\n MmAction,\n MmActionEvent,\n isActionDisabled,\n splitRowActions,\n} from './action.model';\nimport {MM_ROW_ACTIONS_MESSAGES, RowActionsMessages, resolveRowActionsMessages} from './row-actions.messages';\n\n/** Overflow menu item handed to the Kendo DropDownButton. */\ninterface RowActionMenuItem<TId extends string> {\n text: string;\n svgIcon?: MmAction<TId>['icon'];\n disabled: boolean;\n action: MmAction<TId>;\n}\n\n/**\n * The actions of one table row (AB#5570): icon buttons (16 px) with tooltip and an accessible\n * name that includes the row (\"Edit Mesh Adapter\"), from one shared action definition.\n * At most `maxInline` slots (default 3): when the actions do not fit, the last slot becomes a\n * \"More actions for …\" menu. Disabled actions stay focusable and announce their reason;\n * in the menu the reason is shown under the item text.\n *\n * Texts (\"Actions for …\", \"More actions for …\") come from {@link MM_ROW_ACTIONS_MESSAGES} and the\n * `messages` input (the input wins), English by default.\n *\n * The component only emits — destructive handlers confirm first (danger dialog naming the target).\n *\n * ```html\n * <td class=\"actions\">\n * <mm-row-actions [actions]=\"rowActions(run)\" [rowLabel]=\"runLabel(run)\" (triggered)=\"onAction($event, run)\" />\n * </td>\n * ```\n */\n@Component({\n selector: 'mm-row-actions',\n standalone: true,\n imports: [DropDownButtonModule, SVGIconModule, ActionButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'mm-row-actions',\n '[attr.role]': 'hasActions() ? \"group\" : null',\n '[attr.aria-label]': 'hasActions() ? groupLabel() : null',\n },\n template: `\n @for (action of split().inline; track action.id) {\n <mm-action-button [action]=\"action\" [targetLabel]=\"rowLabel()\" context=\"row\" display=\"icon\"\n (triggered)=\"triggered.emit($event)\" />\n }\n @if (menuItems().length) {\n <kendo-dropdownbutton\n class=\"mm-row-actions__more\"\n [data]=\"menuItems()\"\n [svgIcon]=\"moreIcon\"\n size=\"small\"\n fillMode=\"flat\"\n themeColor=\"base\"\n [buttonAttributes]=\"{ title: moreLabel(), 'aria-label': moreLabel(), 'data-action': 'more' }\"\n (itemClick)=\"onMenuItem($event)\"\n >\n <ng-template kendoDropDownButtonItemTemplate let-item>\n <span class=\"mm-row-actions__item\" [class.mm-row-actions__item--danger]=\"!!item.action.danger\"\n [attr.data-action]=\"item.action.id\">\n @if (item.svgIcon) {\n <kendo-svgicon [icon]=\"item.svgIcon\" />\n }\n <span class=\"mm-row-actions__item-text\">\n <span>{{ item.text }}</span>\n @if (item.disabled) {\n <span class=\"mm-row-actions__item-reason\">{{ item.action.disabledReason }}</span>\n }\n </span>\n </span>\n </ng-template>\n </kendo-dropdownbutton>\n }\n `,\n styles: [`\n .mm-row-actions { display: inline-flex; align-items: center; gap: var(--theme-space-1, 4px); }\n .mm-row-actions__item { display: inline-flex; align-items: flex-start; gap: var(--theme-space-2, 8px); }\n .mm-row-actions__item-text { display: inline-flex; flex-direction: column; }\n .mm-row-actions__item-reason { font-size: 0.85em; color: var(--theme-text-muted, #75829a); white-space: normal; max-width: 280px; }\n .mm-row-actions__item--danger { color: var(--theme-status-error, #c0385f); }\n .mm-row-actions__more .k-button:focus-visible {\n outline: none;\n box-shadow: var(--theme-focus-ring, 0 0 0 2px #ffffff, 0 0 0 4px #2e8473);\n }\n `],\n})\nexport class RowActionsComponent<TId extends string = string> {\n /** Action definitions for this row (hidden ones are filtered out). */\n readonly actions = input.required<readonly MmAction<TId>[]>();\n /** Human name of the row (\"Mesh Adapter\", \"Encrypt run 2026-10-06 17:09\"); part of every accessible name. */\n readonly rowLabel = input.required<string>();\n /** Slots incl. the overflow button. */\n readonly maxInline = input(MM_ROW_ACTIONS_MAX_INLINE, {transform: numberAttribute});\n /** Translations for this instance; members left out come from `MM_ROW_ACTIONS_MESSAGES`, else English. */\n readonly messages = input<Partial<RowActionsMessages> | null>(null);\n\n /** Fires for enabled actions only, inline or from the menu. */\n readonly triggered = output<MmActionEvent<TId>>();\n\n private readonly router = inject(Router, {optional: true});\n /** Menu links resolve like the inline `routerLink`: relative to the hosting route. */\n private readonly route = inject(ActivatedRoute, {optional: true});\n private readonly injectedMessages = inject(MM_ROW_ACTIONS_MESSAGES, {optional: true});\n protected readonly moreIcon = moreVerticalIcon;\n private readonly m = computed(() => resolveRowActionsMessages(this.injectedMessages, this.messages()));\n protected readonly split = computed(() => splitRowActions(this.actions(), this.maxInline()));\n protected readonly menuItems = computed<RowActionMenuItem<TId>[]>(() =>\n this.split().menu.map((action) => ({\n text: action.menuLabel || action.label,\n svgIcon: action.icon,\n disabled: isActionDisabled(action),\n action,\n })));\n /** No group semantics for an empty cell (all actions hidden). */\n protected readonly hasActions = computed(() => this.split().inline.length > 0 || this.split().menu.length > 0);\n protected readonly moreLabel = computed(() => this.format(this.m().moreActionsFor, this.m().moreActions));\n protected readonly groupLabel = computed(() => this.format(this.m().actionsFor, this.m().actions));\n\n private format(withName: string, withoutName: string): string {\n const name = (this.rowLabel() ?? '').trim();\n return name ? withName.split('{name}').join(name) : withoutName;\n }\n\n protected onMenuItem(item: RowActionMenuItem<TId>): void {\n if (!item || item.disabled) {\n return;\n }\n const link = item.action.link;\n if (link && this.router) {\n const commands = typeof link.commands === 'string' ? [link.commands] : [...link.commands];\n void this.router.navigate(commands, {queryParams: link.queryParams, relativeTo: this.route ?? undefined});\n }\n this.triggered.emit({id: item.action.id, action: item.action});\n }\n}\n","import { InjectionToken, Provider, Signal, inject, signal } from '@angular/core';\n\n/**\n * Host-agnostic translation hook of the `@meshmakers/*` libraries (Studio i18n concept §2.1,\n * AB#6163). The libraries never depend on a translation framework: they ship English defaults and\n * ask the host app through these tokens. An app that provides nothing keeps the English defaults —\n * there is no behaviour change for apps that do not opt in.\n *\n * - {@link MM_TRANSLATE}: `(key, params?) => string | undefined`. The host answers from its\n * translation store (e.g. `translate.instant` of ngx-translate) and returns `undefined` for a key\n * it does not know, so the library default applies.\n * - {@link MM_LANGUAGE}: the active UI language as a signal (`'en'`, `'de'`, …). Reading it inside a\n * template, `computed()` or the {@link MmTranslatePipe} makes texts follow a language switch\n * without a reload.\n * - {@link MM_TRANSLATE_DEFAULTS}: the English defaults of a library (its `i18n/en.json`, bundled as\n * a TS constant), provided with {@link provideMmTranslateDefaults}.\n *\n * Keys follow the concept's D4 style: `MM.<LIB>.<AREA>.<camelCaseLeaf>`, e.g.\n * `MM.SHARED_UI.LIST_VIEW.refresh`. Parameters use the ngx-translate syntax `{{ name }}`.\n */\n\n/** Interpolation parameters of a translation, e.g. `{ count: 3 }` for `'{{ count }} items'`. */\nexport type MmTranslateParams = Readonly<Record<string, unknown>>;\n\n/** The host's lookup: the translated text, or `undefined` when the host has no translation. */\nexport type MmTranslateFn = (key: string, params?: MmTranslateParams) => string | undefined;\n\n/** A translation table: flat (`{ 'A.b': 'x' }`) or nested (`{ A: { b: 'x' } }`), or both. */\nexport interface MmTranslationTable {\n readonly [key: string]: string | MmTranslationTable;\n}\n\n/** Host lookup for library texts. Optional — without it the English defaults are used. */\nexport const MM_TRANSLATE = new InjectionToken<MmTranslateFn>('MM_TRANSLATE');\n\n/** The active UI language. Optional — without it the language is `'en'`. */\nexport const MM_LANGUAGE = new InjectionToken<Signal<string>>('MM_LANGUAGE');\n\n/** English default tables of the libraries (multi provider, see {@link provideMmTranslateDefaults}). */\nexport const MM_TRANSLATE_DEFAULTS = new InjectionToken<readonly MmTranslationTable[]>('MM_TRANSLATE_DEFAULTS');\n\nconst ENGLISH = signal('en').asReadonly();\n\n/**\n * Registers a library's English defaults. Use it in the library's `provideX()` (environment\n * providers) or in a component's `providers` (element injector).\n */\nexport function provideMmTranslateDefaults(table: MmTranslationTable): Provider {\n return { provide: MM_TRANSLATE_DEFAULTS, useValue: table, multi: true };\n}\n\n/** The value at `key` in a table: the flat entry first, then the dotted path into nested objects. */\nexport function lookupMmTable(table: MmTranslationTable | null | undefined, key: string): string | undefined {\n if (!table) {\n return undefined;\n }\n const flat = table[key];\n if (typeof flat === 'string') {\n return flat;\n }\n let node: string | MmTranslationTable | undefined = table;\n for (const part of key.split('.')) {\n if (!node || typeof node === 'string') {\n return undefined;\n }\n node = node[part];\n }\n return typeof node === 'string' ? node : undefined;\n}\n\n/** Replaces `{{ name }}` placeholders (ngx-translate syntax) with `params`; unknown names stay. */\nexport function interpolateMm(text: string, params?: MmTranslateParams | null): string {\n if (!params) {\n return text;\n }\n return text.replace(/\\{\\{\\s*([\\w.-]+)\\s*\\}\\}/g, (match, name: string) => {\n const value = params[name];\n return value === undefined || value === null ? match : String(value);\n });\n}\n\n/** Translates a key in the current language. */\nexport type MmTranslate = (key: string, params?: MmTranslateParams | null, fallback?: string) => string;\n\n/**\n * Resolution order of a library text:\n * 1. the host ({@link MM_TRANSLATE}), unless it returns `undefined`, an empty string or the key;\n * 2. the library defaults (`defaults` argument, then every {@link MM_TRANSLATE_DEFAULTS} table);\n * 3. the explicit `fallback`;\n * 4. the key itself (a visible gap, never an exception).\n * A host lookup that throws counts as \"no translation\" (fail-safe, concept §6).\n */\nexport function resolveMmTranslation(\n host: MmTranslateFn | null,\n defaults: readonly MmTranslationTable[],\n key: string,\n params?: MmTranslateParams | null,\n fallback?: string\n): string {\n if (host) {\n try {\n const value = host(key, params ?? undefined);\n if (value && value !== key) {\n return value;\n }\n } catch {\n // Fail-safe: a broken host lookup must not break the library UI.\n }\n }\n for (const table of defaults) {\n const value = lookupMmTable(table, key);\n if (value !== undefined) {\n return interpolateMm(value, params);\n }\n }\n return fallback !== undefined ? interpolateMm(fallback, params) : key;\n}\n\n/** The active language signal: {@link MM_LANGUAGE}, or a constant `'en'`. Injection context only. */\nexport function injectMmLanguage(): Signal<string> {\n return inject(MM_LANGUAGE, { optional: true }) ?? ENGLISH;\n}\n\n/**\n * A translate function for TS code (injection context only). It reads {@link MM_LANGUAGE}, so a\n * `computed(() => t('MM.X.y'))` re-runs on a language switch.\n *\n * @param defaults the library's English defaults (its bundled `en.json`), checked before the\n * {@link MM_TRANSLATE_DEFAULTS} tables.\n */\nexport function injectMmT(defaults?: MmTranslationTable): MmTranslate {\n const host = inject(MM_TRANSLATE, { optional: true });\n const language = injectMmLanguage();\n const tables = [...(defaults ? [defaults] : []), ...(inject(MM_TRANSLATE_DEFAULTS, { optional: true }) ?? [])];\n return (key, params, fallback) => {\n language();\n return resolveMmTranslation(host, tables, key, params, fallback);\n };\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport {\n MM_TRANSLATE,\n MM_TRANSLATE_DEFAULTS,\n MmTranslateParams,\n injectMmLanguage,\n resolveMmTranslation,\n} from './mm-translate';\n\n/**\n * `{{ 'MM.SHARED_UI.LIST_VIEW.refresh' | mmT }}` — a library text in the host's language\n * (see `mm-translate.ts`). Optional arguments: interpolation params and an English fallback:\n * `{{ 'MM.X.count' | mmT: { count: n } : '{{ count }} items' }}`.\n *\n * Impure on purpose, but cached: the pipe reads the {@link MM_LANGUAGE} signal, so the template\n * (also an OnPush one) re-renders on a language switch, and it recomputes only when the language,\n * key, params or fallback change. Without host providers it returns the English default.\n */\n@Pipe({ name: 'mmT', pure: false })\nexport class MmTranslatePipe implements PipeTransform {\n private readonly host = inject(MM_TRANSLATE, { optional: true });\n private readonly defaults = inject(MM_TRANSLATE_DEFAULTS, { optional: true }) ?? [];\n private readonly language = injectMmLanguage();\n\n private lastLanguage: string | null = null;\n private lastKey: string | null = null;\n private lastParams: MmTranslateParams | null | undefined = undefined;\n private lastParamsJson = '';\n private lastFallback: string | undefined = undefined;\n private lastValue = '';\n\n transform(key: string | null | undefined, params?: MmTranslateParams | null, fallback?: string): string {\n if (!key) {\n return '';\n }\n const language = this.language();\n const paramsJson = params === this.lastParams ? this.lastParamsJson : safeJson(params);\n if (language === this.lastLanguage && key === this.lastKey && paramsJson === this.lastParamsJson\n && fallback === this.lastFallback) {\n this.lastParams = params;\n return this.lastValue;\n }\n this.lastLanguage = language;\n this.lastKey = key;\n this.lastParams = params;\n this.lastParamsJson = paramsJson;\n this.lastFallback = fallback;\n this.lastValue = resolveMmTranslation(this.host, this.defaults, key, params, fallback);\n return this.lastValue;\n }\n}\n\nlet unserializable = 0;\n\n/** Params as a comparable string; params that cannot be serialised never hit the cache. */\nfunction safeJson(value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n try {\n return JSON.stringify(value);\n } catch {\n return `\\u0000${++unserializable}`;\n }\n}\n","/**\n * Bridges between a host's translation store and the libraries' `*_MESSAGES` objects\n * (`SHELL_MESSAGES`, `COMMAND_PALETTE_MESSAGES`, `ASSISTANT_MESSAGES`, `MM_ROW_ACTIONS_MESSAGES`,\n * `ListViewMessages`, …). Moved here from the meshmakers-app (`shell-messages.i18n.ts`) so every\n * app wires the tokens the same way (Studio i18n concept §6, AB#6163).\n *\n * A key map assigns a translation key to each message member:\n * ```ts\n * const KEYS = { search: 'SHELL.MESSAGES.SEARCH', signOut: 'SHELL.MESSAGES.SIGN_OUT' } as const\n * satisfies Partial<Record<keyof ShellMessages, string>>;\n * { provide: SHELL_MESSAGES, useFactory: () => {\n * const translate = inject(TranslateService);\n * return liveMessages(KEYS, (k) => translate.instant(k) as string);\n * } }\n * ```\n * A member whose lookup returns nothing, an empty string or the key itself (ngx-translate's answer\n * for a missing key) stays `undefined`, so the library's English default applies instead of a raw\n * key.\n */\n\n/** A lookup into the host's translation store. */\nexport type MessageLookup = (key: string) => string | null | undefined;\n\nfunction translated(t: MessageLookup, key: string): string | undefined {\n let value: string | null | undefined;\n try {\n value = t(key);\n } catch {\n return undefined;\n }\n return value && value !== key ? value : undefined;\n}\n\n/**\n * A snapshot of the messages in the active language. Re-run it on every language change and feed\n * the result to a component's `messages` input or a signal-backed messages factory.\n */\nexport function messagesFromTranslate<K extends string>(\n keys: Readonly<Record<K, string>>,\n t: MessageLookup\n): Partial<Record<K, string>> {\n const messages: Partial<Record<K, string>> = {};\n for (const [member, key] of Object.entries(keys) as [K, string][]) {\n const value = translated(t, key);\n if (value !== undefined) {\n messages[member] = value;\n }\n }\n return messages;\n}\n\n/**\n * A messages object whose members are getters over the CURRENT translation — for app-wide tokens\n * that are injected once: a service that reads a member while deriving a text picks up a language\n * switch on its next read, without re-providing the token. Members without a translation are\n * `undefined` (the library keeps its English default).\n */\nexport function liveMessages<K extends string>(\n keys: Readonly<Record<K, string>>,\n t: MessageLookup\n): Partial<Record<K, string>> {\n const messages = {} as Partial<Record<K, string>>;\n for (const [member, key] of Object.entries(keys) as [K, string][]) {\n Object.defineProperty(messages, member, {\n enumerable: true,\n get: (): string | undefined => translated(t, key),\n });\n }\n return messages;\n}\n","/*\n * Public API Surface of shared-ui\n */\n\nimport {EnvironmentProviders, makeEnvironmentProviders} from '@angular/core';\nimport {FileUploadService} from './lib/services/file-upload.service';\nimport {ConfirmationService} from './lib/services/confirmation.service';\nimport {InputService} from './lib/services/input.service';\nimport {ProgressWindowService} from './lib/progress-window/progress-window.service';\nimport {NotificationDisplayService} from './lib/services/notification-display.service';\nimport {MessageDetailsDialogService} from './lib/message-details-dialog/message-details-dialog.service';\nimport {MessageListenerService} from './lib/services/message-listener.service';\nimport { provideMmSharedServices } from '@meshmakers/shared-services';\n\nexport * from './lib/list-view/list-view.component';\nexport * from './lib/list-view/list-view-filters.directive';\nexport * from './lib/upload-file-dialog/upload-file-dialog.component';\nexport * from './lib/input-dialog/input-dialog.component';\nexport * from './lib/input-dialog/input-dialog.messages';\nexport * from './lib/tree/tree.component';\nexport * from './lib/base-form/base-form.component';\nexport * from './lib/base-tree-detail/base-tree-detail.component';\nexport * from './lib/progress-window/progress-window.component';\nexport * from './lib/progress-window/progress-window.service';\nexport * from './lib/progress-window/progress-window.messages';\nexport * from './lib/confirmation-window/confirmation-window.component';\nexport * from './lib/confirmation-window/confirmation-window.messages';\nexport * from './lib/data-sources/data-source-typed';\nexport * from './lib/data-sources/data-source-base';\nexport * from './lib/data-sources/hierarchy-data-source';\nexport * from './lib/data-sources/hierarchy-data-source-base';\nexport * from './lib/directives/mm-list-view-data-binding.directive';\nexport * from './lib/pipes/pascal-case.pipe';\nexport * from './lib/pipes/bytes-to-size.pipe';\nexport * from './lib/models/fetchResult';\nexport * from './lib/models/progressValue';\nexport * from './lib/models/node-dropped-event';\nexport * from './lib/models/importStrategyDto';\nexport * from './lib/models/confirmation';\nexport * from './lib/services/file-upload.service';\nexport * from './lib/services/confirmation.service';\nexport * from './lib/services/input.service';\nexport * from './lib/services/notification-display.service';\nexport * from './lib/services/notification-display.messages';\nexport * from './lib/services/message-listener.service';\nexport * from './lib/services/list-state.service';\nexport * from './lib/message-details-dialog/message-details-dialog.component';\nexport * from './lib/message-details-dialog/message-details-dialog.service';\nexport * from './lib/message-details-dialog/message-details-dialog.messages';\nexport * from './lib/entity-select-input/entity-select-input.component';\nexport * from './lib/entity-select-dialog/entity-select-dialog.component';\nexport * from './lib/entity-select-dialog/entity-select-dialog.service';\nexport * from './lib/entity-select-dialog/entity-select-dialog-data-source';\nexport * from './lib/list-view/list-view.model';\nexport * from './lib/list-view/list-view-row-actions';\nexport * from './lib/danger-confirmation/danger-confirmation.model';\nexport * from './lib/danger-confirmation/danger-confirmation-window.component';\nexport * from './lib/guards/unsaved-changes.interface';\nexport * from './lib/guards/unsaved-changes.guard';\nexport * from './lib/guards/unsaved-changes.directive';\nexport * from './lib/save-as-dialog';\nexport * from './lib/time-range-picker';\nexport * from './lib/cron-builder';\nexport * from './lib/copyable-text/copyable-text.component';\nexport * from './lib/import-strategy-dialog/import-strategy-dialog.component';\nexport * from './lib/import-strategy-dialog/import-strategy-dialog.service';\nexport * from './lib/services/window-state.service';\nexport * from './lib/actions';\nexport * from './lib/octobot/octobot.component';\nexport * from './lib/empty-state/empty-state.component';\nexport * from './lib/i18n';\n\nimport { EntitySelectDialogService } from './lib/entity-select-dialog/entity-select-dialog.service';\nimport { SaveAsDialogService } from './lib/save-as-dialog';\nimport { ImportStrategyDialogService } from './lib/import-strategy-dialog/import-strategy-dialog.service';\n\nexport function provideMmSharedUi(): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideMmSharedServices(),\n FileUploadService,\n ConfirmationService,\n InputService,\n ProgressWindowService,\n NotificationDisplayService,\n MessageListenerService,\n MessageDetailsDialogService,\n EntitySelectDialogService,\n SaveAsDialogService,\n ImportStrategyDialogService,\n ]);\n}\n\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i1.UnsavedChangesDirective","i4","i5","i6"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"meshmakers-shared-ui.mjs","sources":["../../../../projects/meshmakers/shared-ui/src/lib/svg-icons.ts","../../../../projects/meshmakers/shared-ui/src/lib/models/confirmation.ts","../../../../projects/meshmakers/shared-ui/src/lib/dialog-actions/dialog-actions.directive.ts","../../../../projects/meshmakers/shared-ui/src/lib/upload-file-dialog/upload-file-dialog.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/upload-file-dialog/upload-file-dialog.component.html","../../../../projects/meshmakers/shared-ui/src/lib/services/file-upload.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/confirmation-window/confirmation-window.messages.ts","../../../../projects/meshmakers/shared-ui/src/lib/confirmation-window/confirmation-window.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/confirmation-window/confirmation-window.component.html","../../../../projects/meshmakers/shared-ui/src/lib/danger-confirmation/danger-confirmation.model.ts","../../../../projects/meshmakers/shared-ui/src/lib/danger-confirmation/danger-confirmation-window.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/services/confirmation.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/models/inputDialogResult.ts","../../../../projects/meshmakers/shared-ui/src/lib/input-dialog/input-dialog.messages.ts","../../../../projects/meshmakers/shared-ui/src/lib/input-dialog/input-dialog.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/input-dialog/input-dialog.component.html","../../../../projects/meshmakers/shared-ui/src/lib/services/input.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/progress-window/progress-window.messages.ts","../../../../projects/meshmakers/shared-ui/src/lib/progress-window/progress-window.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/progress-window/progress-window.component.html","../../../../projects/meshmakers/shared-ui/src/lib/progress-window/progress-window.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/message-details-dialog/message-details-dialog.messages.ts","../../../../projects/meshmakers/shared-ui/src/lib/message-details-dialog/message-details-dialog.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/services/window-state.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/message-details-dialog/message-details-dialog.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/services/notification-display.messages.ts","../../../../projects/meshmakers/shared-ui/src/lib/services/notification-display.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/services/message-listener.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/list-view/list-view-filters.directive.ts","../../../../projects/meshmakers/shared-ui/src/lib/list-view/list-view.model.ts","../../../../projects/meshmakers/shared-ui/src/lib/pipes/pascal-case.pipe.ts","../../../../projects/meshmakers/shared-ui/src/lib/data-sources/data-source-base.ts","../../../../projects/meshmakers/shared-ui/src/lib/services/list-state.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/directives/mm-list-view-data-binding.directive.ts","../../../../projects/meshmakers/shared-ui/src/lib/actions/action.model.ts","../../../../projects/meshmakers/shared-ui/src/lib/actions/action-button.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/list-view/list-view-row-actions.ts","../../../../projects/meshmakers/shared-ui/src/lib/pipes/bytes-to-size.pipe.ts","../../../../projects/meshmakers/shared-ui/src/lib/cron-builder/services/cron-humanizer.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/octobot/octobot.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/empty-state/empty-state.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/list-view/list-view.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/list-view/list-view.component.html","../../../../projects/meshmakers/shared-ui/src/lib/tree/tree.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/tree/tree.component.html","../../../../projects/meshmakers/shared-ui/src/lib/guards/unsaved-changes.interface.ts","../../../../projects/meshmakers/shared-ui/src/lib/guards/unsaved-changes.directive.ts","../../../../projects/meshmakers/shared-ui/src/lib/base-form/base-form.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/base-form/base-form.component.html","../../../../projects/meshmakers/shared-ui/src/lib/base-tree-detail/base-tree-detail.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/data-sources/data-source-typed.ts","../../../../projects/meshmakers/shared-ui/src/lib/data-sources/hierarchy-data-source.ts","../../../../projects/meshmakers/shared-ui/src/lib/data-sources/hierarchy-data-source-base.ts","../../../../projects/meshmakers/shared-ui/src/lib/models/fetchResult.ts","../../../../projects/meshmakers/shared-ui/src/lib/models/progressValue.ts","../../../../projects/meshmakers/shared-ui/src/lib/models/importStrategyDto.ts","../../../../projects/meshmakers/shared-ui/src/lib/entity-select-dialog/entity-select-dialog-data-source.ts","../../../../projects/meshmakers/shared-ui/src/lib/entity-select-dialog/entity-select-dialog.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/entity-select-dialog/entity-select-dialog.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/entity-select-input/entity-select-input.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/guards/unsaved-changes.guard.ts","../../../../projects/meshmakers/shared-ui/src/lib/save-as-dialog/save-as-dialog.messages.ts","../../../../projects/meshmakers/shared-ui/src/lib/save-as-dialog/save-as-dialog.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/save-as-dialog/save-as-dialog.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/time-range-picker/time-range-picker.models.ts","../../../../projects/meshmakers/shared-ui/src/lib/time-range-picker/time-range-picker.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/time-range-picker/time-range-picker.component.html","../../../../projects/meshmakers/shared-ui/src/lib/cron-builder/cron-builder.models.ts","../../../../projects/meshmakers/shared-ui/src/lib/cron-builder/services/cron-parser.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/cron-builder/cron-builder.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/cron-builder/cron-builder.component.html","../../../../projects/meshmakers/shared-ui/src/lib/copyable-text/copyable-text.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/copyable-text/copyable-text.component.html","../../../../projects/meshmakers/shared-ui/src/lib/import-strategy-dialog/import-strategy-dialog.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/import-strategy-dialog/import-strategy-dialog.component.html","../../../../projects/meshmakers/shared-ui/src/lib/import-strategy-dialog/import-strategy-dialog.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/actions/row-actions.messages.ts","../../../../projects/meshmakers/shared-ui/src/lib/actions/row-actions.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/i18n/mm-translate.ts","../../../../projects/meshmakers/shared-ui/src/lib/i18n/mm-translate.pipe.ts","../../../../projects/meshmakers/shared-ui/src/lib/i18n/live-messages.ts","../../../../projects/meshmakers/shared-ui/src/public-api.ts","../../../../projects/meshmakers/shared-ui/src/meshmakers-shared-ui.ts"],"sourcesContent":["export const upload = {\n name: 'upload',\n content: '<path d=\"M440-200h80v-167l64 64 56-57-160-160-160 160 57 56 63-63v167ZM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h320l240 240v480q0 33-23.5 56.5T720-80H240Zm280-520v-200H240v640h480v-440H520ZM240-800v200-200 640-640Z\"/>',\n viewBox: '0 -960 960 960'\n}\n\nexport const deleteIcon = {\n name: 'delete',\n content: '<path d=\"M280-120q-33 0-56.5-23.5T200-200v-520h-40v-80h200v-40h240v40h200v80h-40v520q0 33-23.5 56.5T680-120H280Zm400-600H280v520h400v-520ZM360-280h80v-360h-80v360Zm160 0h80v-360h-80v360ZM280-720v520-520Z\"/>',\n viewBox: '0 -960 960 960'\n}\n","import type { ConfirmationWindowMessages } from '../confirmation-window/confirmation-window.messages';\n\nexport enum ButtonTypes {\n Ok,\n Cancel,\n Yes,\n No\n}\n\nexport enum DialogType {\n YesNo = 0,\n YesNoCancel = 1,\n OkCancel = 2,\n Ok = 3\n}\n\nexport interface ConfirmationButtonLabels {\n yes?: string;\n no?: string;\n ok?: string;\n cancel?: string;\n}\n\nexport interface ConfirmationWindowData {\n title: string;\n message: string;\n dialogType: DialogType;\n buttonLabels?: ConfirmationButtonLabels;\n messages?: Partial<ConfirmationWindowMessages>;\n /** Destructive confirmation: the confirming (right-most) button is styled as danger (`themeColor=\"error\"`). */\n danger?: boolean;\n}\n\nexport class ConfirmationWindowResult {\n result: ButtonTypes;\n\n constructor(result: ButtonTypes) {\n this.result = result;\n }\n}\n\nexport interface FileUploadData{\n title: string;\n message: string;\n mimeTypes: string;\n fileExtensions: string | null;\n}\n\nexport class FileUploadResult {\n public selectedFile: File | null;\n\n constructor(selectedFile: File) {\n this.selectedFile = selectedFile;\n }\n}\n","import { Directive, OnInit, inject } from '@angular/core';\nimport { DialogActionsComponent } from '@progress/kendo-angular-dialog';\n\n/**\n * CSS class of every dialog action row. The look behind it (right-aligned, 34 px buttons, token\n * gap, danger-styled destructive confirm) is defined once in the octo-ui styles\n * (`runtime-browser/styles/_dialog-actions.scss`); hand-made footers (`<div class=\"mm-dialog-actions\">`)\n * use the same class and need no CSS of their own.\n */\nexport const MM_DIALOG_ACTIONS_CLASS = 'mm-dialog-actions';\n\n/**\n * The one action layout of every dialog (AB#6464, Studio action guideline §2.2 / §2.4).\n *\n * Importing the directive is all a component has to do: it matches every `<kendo-dialog-actions>`\n * of that component's template, switches Kendo's default `stretched` layout (every button as wide\n * as the dialog allows, Cancel and confirm look like twins) to `end` and stamps\n * {@link MM_DIALOG_ACTIONS_CLASS}, so the shared styles apply.\n *\n * Button order is the caller's: dismissing buttons first (Cancel), the confirming action last,\n * labelled verb + object; a destructive confirm uses `themeColor=\"error\"` and is rendered as a\n * danger fill by the shared styles.\n *\n * ```ts\n * @Component({ imports: [DialogActionsComponent, MmDialogActionsDirective, ButtonComponent], ... })\n * ```\n * ```html\n * <kendo-dialog-actions>\n * <button kendoButton>Cancel</button>\n * <button kendoButton themeColor=\"error\">Delete adapter</button>\n * </kendo-dialog-actions>\n * ```\n */\n@Directive({\n // Deliberately an element selector: the directive augments Kendo's own element for every use.\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: 'kendo-dialog-actions',\n host: { class: MM_DIALOG_ACTIONS_CLASS },\n})\nexport class MmDialogActionsDirective implements OnInit {\n private readonly actions = inject(DialogActionsComponent, { self: true });\n\n constructor() {\n this.actions.layout = 'end';\n }\n\n ngOnInit(): void {\n // The layout is fixed Studio-wide. Inputs (a `layout` attribute or binding in the template) are\n // applied after construction and before this hook, so enforce it again here.\n this.actions.layout = 'end';\n }\n}\n","import { Component, ElementRef, Input, signal, ViewChild, inject, ChangeDetectionStrategy } from '@angular/core';\nimport {NotificationService} from '@progress/kendo-angular-notification';\nimport {ButtonComponent} from '@progress/kendo-angular-buttons';\nimport {\n DialogActionsComponent,\n DialogContentBase,\n DialogRef,\n} from '@progress/kendo-angular-dialog';\nimport {NgIf} from '@angular/common';\nimport {SVGIconComponent} from '@progress/kendo-angular-icons';\nimport {deleteIcon, upload} from '../svg-icons';\nimport {FileUploadResult} from '../models/confirmation';\nimport { MmDialogActionsDirective } from '../dialog-actions/dialog-actions.directive';\n\n@Component({\n selector: 'mm-upload-file-dialog',\n imports: [\n MmDialogActionsDirective,\n ButtonComponent,\n DialogActionsComponent,\n NgIf,\n SVGIconComponent\n ],\n templateUrl: './upload-file-dialog.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './upload-file-dialog.component.css'\n})\nexport class UploadFileDialogComponent extends DialogContentBase {\n private readonly dialogRef: DialogRef;\n private readonly notificationService = inject(NotificationService);\n\n @Input() message = '';\n @Input() mimeTypes: string | null = null;\n @Input() fileExtensions: string | null = null;\n\n protected fileName = signal('');\n protected fileSize = signal(0);\n protected uploadProgress = signal(0);\n @ViewChild('fileInput') protected fileInput: ElementRef | undefined;\n protected selectedFile: File | null = null;\n protected uploadSuccess: boolean;\n protected uploadError: boolean;\n\n constructor() {\n const dialogRef = inject(DialogRef);\n\n super(dialogRef);\n this.dialogRef = dialogRef;\n\n this.uploadError = false;\n this.uploadSuccess = false;\n }\n\n\n // Handler for file input change\n onFileChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0] ?? null;\n this.uploadFile(file);\n }\n\n // Handler for the file drop\n onFileDrop(event: DragEvent): void {\n event.preventDefault();\n const file = event.dataTransfer?.files[0] as File | null;\n this.uploadFile(file);\n }\n\n // Prevent default dragover behavior\n onDragOver(event: DragEvent): void {\n event.preventDefault();\n }\n\n // Method to handle file upload\n uploadFile(file: File | null): void {\n const allowedMimeTypes = this.mimeTypes?.split(',').map((mimeType) => mimeType.trim()) ?? [];\n const allowedFileExtensions = this.fileExtensions?.split(',').map((mimeType) => mimeType.trim()) ?? [];\n if (!file) {\n return;\n }\n const extension = file.name.substring(file.name.lastIndexOf('.')).toLowerCase();\n\n if ((allowedFileExtensions.includes(extension) || allowedMimeTypes.includes(file.type)) ||\n allowedFileExtensions.length > 0 && allowedMimeTypes.length > 0) {\n this.selectedFile = file;\n this.fileSize.set(Math.round(file.size / 1024)); // Set file size in KB\n\n this.uploadSuccess = true;\n this.uploadError = false;\n this.fileName.set(file.name); // Set image name\n } else {\n this.uploadSuccess = false;\n this.uploadError = true;\n\n this.notificationService.show({\n content: 'File type not supported!',\n hideAfter: 600,\n position: {horizontal: 'right', vertical: 'top'},\n animation: {type: 'fade', duration: 400},\n type: {style: 'error', icon: true},\n });\n }\n }\n\n // Method to remove a file\n removeFile(): void {\n this.selectedFile = null;\n this.fileName.set('');\n this.fileSize.set(0);\n this.uploadSuccess = false;\n this.uploadError = false;\n this.uploadProgress.set(0);\n }\n\n onOk(): void {\n if (this.selectedFile) {\n this.dialogRef.close(new FileUploadResult(this.selectedFile));\n }\n }\n\n onCancel(): void {\n this.dialogRef.close(null);\n }\n\n protected get upload(): typeof upload { return upload; }\n protected get deleteIcon(): typeof deleteIcon { return deleteIcon; }\n}\n","<div\n class=\"file-upload-wrapper\"\n [class.success]=\"uploadSuccess\"\n [class.error]=\"uploadError\"\n (drop)=\"onFileDrop($event)\"\n (dragover)=\"onDragOver($event)\"\n>\n <input type=\"file\" accept=\"{{fileExtensions}}\" (change)=\"onFileChange($event)\" hidden #fileInput/>\n <div class=\"file-dropper\" (click)=\"fileInput.click()\">\n <kendo-svgicon [icon]=\"upload\" size=\"xxxlarge\"></kendo-svgicon>\n <p>{{ message }}</p>\n <div *ngIf=\"fileName()\">\n <div *ngIf=\"selectedFile\">\n <p>\n <span class=\"image-name\">{{ fileName() }}</span> ({{\n fileSize()\n }} KB)\n </p>\n <kendo-svgicon class=\"delete-icon\" [icon]=\"deleteIcon\" size=\"xlarge\"></kendo-svgicon>\n </div>\n </div>\n </div>\n</div>\n<kendo-dialog-actions>\n <button kendoButton (click)=\"onCancel()\">Cancel</button>\n <button kendoButton (click)=\"onOk()\" [disabled]=\"!selectedFile\" themeColor=\"primary\">Upload</button>\n</kendo-dialog-actions>\n\n\n\n","import { Injectable, inject } from '@angular/core';\nimport {DialogRef, DialogService} from '@progress/kendo-angular-dialog';\nimport {UploadFileDialogComponent} from '../upload-file-dialog/upload-file-dialog.component';\nimport {FileUploadResult} from '../models/confirmation';\n\n@Injectable()\nexport class FileUploadService {\n private readonly dialogService = inject(DialogService);\n\n public async showUploadDialog(title: string, message: string, mimeTypes: string | null = null, fileExtensions: string | null = null): Promise<File | null> {\n\n const dialogRef: DialogRef = this.dialogService.open({\n title,\n content: UploadFileDialogComponent\n });\n\n const component = dialogRef.content.instance as UploadFileDialogComponent;\n component.message = message;\n component.mimeTypes = mimeTypes;\n component.fileExtensions = fileExtensions;\n\n return new Promise<File | null>((resolve) => {\n dialogRef.result.subscribe((result) => {\n if (result instanceof FileUploadResult) {\n resolve(result.selectedFile as File);\n } else {\n resolve(null);\n }\n });\n });\n }\n}\n","export interface ConfirmationWindowMessages {\n ok: string;\n cancel: string;\n yes: string;\n no: string;\n}\n\nexport const DEFAULT_CONFIRMATION_WINDOW_MESSAGES: ConfirmationWindowMessages = {\n ok: 'OK',\n cancel: 'Cancel',\n yes: 'Yes',\n no: 'No',\n};\n","import { Component, ElementRef, Input, OnInit, inject, ChangeDetectionStrategy } from '@angular/core';\nimport {ButtonTypes, ConfirmationWindowData, ConfirmationWindowResult, DialogType} from '../models/confirmation';\nimport {DialogActionsComponent, DialogContentBase, DialogRef} from '@progress/kendo-angular-dialog';\nimport {NgIf} from '@angular/common';\nimport {ButtonComponent} from '@progress/kendo-angular-buttons';\nimport {\n ConfirmationWindowMessages,\n DEFAULT_CONFIRMATION_WINDOW_MESSAGES,\n} from './confirmation-window.messages';\nimport { MmDialogActionsDirective } from '../dialog-actions/dialog-actions.directive';\n\n@Component({\n selector: 'mm-confirmation-window',\n imports: [\n MmDialogActionsDirective,\n DialogActionsComponent,\n NgIf,\n ButtonComponent\n ],\n templateUrl: './confirmation-window.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './confirmation-window.component.css'\n})\nexport class ConfirmationWindowComponent extends DialogContentBase implements OnInit {\n private readonly dialogRef: DialogRef;\n\n @Input() public data?: ConfirmationWindowData;\n\n protected button1Text: string;\n protected button1Result: ButtonTypes;\n protected button2Text: string | null;\n protected button2Result: ButtonTypes | null;\n protected button3Text: string | null;\n protected button3Result: ButtonTypes | null;\n\n constructor() {\n const dialogRef = inject(DialogRef);\n\n super(dialogRef);\n this.dialogRef = dialogRef;\n\n this.button2Text = null;\n this.button2Result = null;\n this.button3Text = null;\n this.button3Result = null;\n this.button1Text = DEFAULT_CONFIRMATION_WINDOW_MESSAGES.ok;\n this.button1Result = ButtonTypes.Ok;\n }\n\n ngOnInit(): void {\n\n if (this.data){\n // Precedence: buttonLabels > messages > English defaults.\n const messages: ConfirmationWindowMessages = {\n ...DEFAULT_CONFIRMATION_WINDOW_MESSAGES,\n ...(this.data.messages ?? {}),\n };\n const labels = this.data.buttonLabels;\n const okLabel = labels?.ok ?? messages.ok;\n const cancelLabel = labels?.cancel ?? messages.cancel;\n const yesLabel = labels?.yes ?? messages.yes;\n const noLabel = labels?.no ?? messages.no;\n\n if (this.data.dialogType === DialogType.OkCancel) {\n this.button1Text = okLabel;\n this.button1Result = ButtonTypes.Ok;\n this.button2Text = cancelLabel;\n this.button2Result = ButtonTypes.Cancel;\n } else if (this.data.dialogType === DialogType.YesNoCancel) {\n this.button1Text = yesLabel;\n this.button1Result = ButtonTypes.Yes;\n this.button2Text = noLabel;\n this.button2Result = ButtonTypes.No;\n this.button3Text = cancelLabel;\n this.button3Result = ButtonTypes.Cancel;\n } else if (this.data.dialogType === DialogType.Ok) {\n this.button1Text = okLabel;\n this.button1Result = ButtonTypes.Ok;\n } else {\n this.button1Text = yesLabel;\n this.button1Result = ButtonTypes.Yes;\n this.button2Text = noLabel;\n this.button2Result = ButtonTypes.No;\n }\n }\n }\n\n private readonly host = inject(ElementRef<HTMLElement>);\n\n /**\n * Destructive confirmations start with the focus on the dismissing button (AB#5578): Enter must\n * never confirm a delete. Backs up the service's `autoFocusedElement`.\n */\n override ngAfterViewInit(): void {\n super.ngAfterViewInit();\n if (this.data?.danger) {\n setTimeout(() => {\n const root = this.host.nativeElement.closest('.k-dialog') ?? this.host.nativeElement;\n (root.querySelector('[data-action=\"dismiss\"], [data-action=\"cancel\"]') as HTMLElement | null)?.focus();\n });\n }\n }\n\n onButton1(): void {\n this.dialogRef.close((new ConfirmationWindowResult(this.button1Result!)));\n }\n\n onButton2(): void {\n this.dialogRef.close((new ConfirmationWindowResult(this.button2Result!)));\n }\n\n onButton3(): void {\n this.dialogRef.close((new ConfirmationWindowResult(this.button3Result!)));\n }\n}\n","<div>{{data?.message}}</div>\n<!-- Button order (Studio action guideline §2.2, app convention): dismissing buttons first (left),\n the confirming / primary button last (right) - also for destructive confirmations. -->\n<kendo-dialog-actions>\n <button kendoButton (click)=\"onButton3()\" *ngIf=\"button3Text\" data-action=\"cancel\">{{button3Text}}</button>\n <button kendoButton (click)=\"onButton2()\" *ngIf=\"button2Text\" data-action=\"dismiss\">{{button2Text}}</button>\n <button kendoButton (click)=\"onButton1()\" [themeColor]=\"data?.danger ? 'error' : 'primary'\" [attr.data-danger]=\"data?.danger ? 'true' : null\" data-action=\"confirm\">{{button1Text}}</button>\n</kendo-dialog-actions>\n","import {InjectionToken} from '@angular/core';\n\n/**\n * Texts of the danger confirmation (AB#5578); apps translate them like the other shared-ui\n * dialogs (`Partial<…Messages>` per call or as `ConfirmationService.defaultDangerMessages`).\n */\nexport interface DangerConfirmationMessages {\n /** Dismissing button. Default: \"Cancel\" */\n cancel: string;\n /** Label of the type-to-confirm input; `{name}` = target name. Default: \"Type {name} to confirm\" */\n typeToConfirm: string;\n /** Environment notice; `{environment}` = environment label. Default: \"{environment} environment. Check the target before you confirm.\" */\n environmentNotice: string;\n /** Label in front of the target. Default: \"Target\" */\n target: string;\n}\n\nexport const DEFAULT_DANGER_CONFIRMATION_MESSAGES: DangerConfirmationMessages = {\n cancel: 'Cancel',\n typeToConfirm: 'Type {name} to confirm',\n environmentNotice: '{environment} environment. Check the target before you confirm.',\n target: 'Target',\n};\n\n/**\n * A destructive action's confirmation (Studio action guideline §2.4, AB#5578): the title names\n * the target, the body says what is lost, the confirming button names the verb + object and is\n * danger-styled on the right, Cancel on the left. Optionally the user has to type the target\n * name before the confirming button enables (production tenants).\n *\n * ```ts\n * const ok = await confirmation.showDangerConfirm({\n * title: 'Delete adapter Mesh Adapter?',\n * targetName: 'Mesh Adapter',\n * consequence: 'The adapter and its configuration are deleted. This cannot be undone.',\n * confirmText: 'Delete adapter',\n * });\n * ```\n */\nexport interface DangerConfirmationOptions {\n /** Dialog title naming the target (\"Delete adapter Mesh Adapter?\"). */\n title: string;\n /** Name of the affected item (\"Mesh Adapter\", \"3 adapters\"); shown emphasised and typed when required. */\n targetName: string;\n /** What is lost and whether it can be undone. */\n consequence: string;\n /** Confirming button: verb + object (\"Delete adapter\"), never \"Yes\" / \"OK\". */\n confirmText: string;\n /** Overrides `messages.cancel`. */\n cancelText?: string;\n /** The confirming button enables only once `targetName` is typed exactly (trimmed). */\n requireTypingName?: boolean;\n /** Environment label (\"PRODUCTION\", \"STAGING\") — shows the environment notice; omit in dev/test tenants. */\n environmentLabel?: string | null;\n messages?: Partial<DangerConfirmationMessages>;\n}\n\n/** Word typed when the target name is empty and no confirm text is set either. */\nexport const DANGER_CONFIRM_FALLBACK_WORD = 'DELETE';\n\n/**\n * The text the user has to type when `requireTypingName` is set: the target name, or — when the\n * target name is empty/whitespace — the confirm button text, else {@link DANGER_CONFIRM_FALLBACK_WORD}.\n * Never empty, so an empty input can never satisfy the type-to-confirm rule.\n */\nexport function dangerConfirmTypingToken(options: Pick<DangerConfirmationOptions, 'targetName' | 'confirmText'>): string {\n return (options.targetName ?? '').trim() || (options.confirmText ?? '').trim() || DANGER_CONFIRM_FALLBACK_WORD;\n}\n\n/**\n * True when `typed` matches the target name (trimmed, case-sensitive). An empty/whitespace target\n * name never matches — use {@link dangerConfirmTypingToken} to get a non-empty word to type.\n */\nexport function dangerConfirmNameMatches(typed: string | null | undefined, targetName: string): boolean {\n const expected = (targetName ?? '').trim();\n return expected.length > 0 && (typed ?? '').trim() === expected;\n}\n\n/**\n * App-wide environment defaults of {@link ConfirmationService.showDangerConfirm} (AB#5578), e.g.\n * \"production tenants type the target name\". Applied whenever a caller — typically a library\n * component — leaves `requireTypingName` / `environmentLabel` unset; explicit caller options win.\n */\nexport interface DangerConfirmEnvironment {\n /** Default of `requireTypingName`. */\n requireTypingName: boolean;\n /** Default of `environmentLabel` (\"PRODUCTION\", \"STAGING\"); `null`/omitted = no notice. */\n environmentLabel?: string | null;\n}\n\n/**\n * Optional hook providing the current {@link DangerConfirmEnvironment}; evaluated each time a\n * danger confirmation opens (so it may read signals). Absent = behaviour unchanged.\n *\n * ```ts\n * { provide: DANGER_CONFIRM_ENVIRONMENT, useFactory: () => {\n * const mode = inject(MyEnvironmentService);\n * return () => ({ requireTypingName: mode.isProduction(), environmentLabel: mode.label() });\n * } }\n * ```\n */\nexport const DANGER_CONFIRM_ENVIRONMENT = new InjectionToken<() => DangerConfirmEnvironment>('DANGER_CONFIRM_ENVIRONMENT');\n\n/** Applies the environment defaults to options that leave `requireTypingName` / `environmentLabel` unset. */\nexport function applyDangerConfirmEnvironment(\n options: DangerConfirmationOptions,\n environment: DangerConfirmEnvironment | null | undefined,\n): DangerConfirmationOptions {\n if (!environment) {\n return options;\n }\n return {\n ...options,\n requireTypingName: options.requireTypingName ?? environment.requireTypingName,\n environmentLabel: options.environmentLabel !== undefined ? options.environmentLabel : (environment.environmentLabel ?? null),\n };\n}\n","import {ChangeDetectionStrategy, Component, ElementRef, computed, inject, signal} from '@angular/core';\nimport {ButtonComponent} from '@progress/kendo-angular-buttons';\nimport {DialogActionsComponent, DialogContentBase, DialogRef} from '@progress/kendo-angular-dialog';\nimport {\n DEFAULT_DANGER_CONFIRMATION_MESSAGES,\n DangerConfirmationMessages,\n DangerConfirmationOptions,\n dangerConfirmNameMatches,\n dangerConfirmTypingToken,\n} from './danger-confirmation.model';\nimport { MmDialogActionsDirective } from '../dialog-actions/dialog-actions.directive';\n\nlet nextId = 0;\n\n/** Selector of the element that gets the initial focus (never the destructive button). */\nexport function DANGER_CONFIRM_SAFE_FOCUS(requireTypingName: boolean): string {\n return requireTypingName ? '[data-type-to-confirm]' : '[data-action=\"cancel\"]';\n}\n\n/** Result of the danger confirmation dialog: `true` only for the confirming button. */\nexport class DangerConfirmationResult {\n constructor(public readonly confirmed: boolean) {}\n}\n\n/**\n * Content of {@link ConfirmationService.showDangerConfirm} (AB#5578): environment notice,\n * target, consequence, optional type-to-confirm input; Cancel left, danger confirm right.\n */\n@Component({\n selector: 'mm-danger-confirmation-window',\n standalone: true,\n imports: [MmDialogActionsDirective, DialogActionsComponent, ButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @let o = options();\n <div class=\"mm-danger-confirmation\" data-dialog=\"danger-confirm\">\n @if (o.environmentLabel) {\n <p class=\"mm-danger-confirmation__environment\" role=\"alert\" data-production-warning>\n {{ environmentNotice() }}\n </p>\n }\n <p class=\"mm-danger-confirmation__target\">\n <span class=\"mm-danger-confirmation__target-label\">{{ messages().target }}:</span>\n <strong data-target>{{ o.targetName }}</strong>\n </p>\n <p class=\"mm-danger-confirmation__consequence\" data-consequence>{{ o.consequence }}</p>\n @if (o.requireTypingName) {\n <label class=\"mm-danger-confirmation__type\" [for]=\"inputId\">{{ typeLabel() }}</label>\n <input\n class=\"k-textbox k-input k-input-md k-rounded-md mm-danger-confirmation__input\"\n [id]=\"inputId\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n data-type-to-confirm\n [value]=\"typed()\"\n (input)=\"typed.set($any($event.target).value)\"\n (keydown.enter)=\"canConfirm() && confirm()\"\n />\n }\n </div>\n <kendo-dialog-actions>\n <button kendoButton data-action=\"cancel\" (click)=\"cancel()\">{{ o.cancelText ?? messages().cancel }}</button>\n <button kendoButton themeColor=\"error\" data-action=\"confirm\" data-danger=\"true\"\n [disabled]=\"!canConfirm()\" (click)=\"confirm()\">{{ o.confirmText }}</button>\n </kendo-dialog-actions>\n `,\n styles: [`\n .mm-danger-confirmation p { margin: 0 0 var(--theme-space-3, 12px); }\n .mm-danger-confirmation__environment {\n padding: var(--theme-space-2, 8px) var(--theme-space-3, 12px);\n border-left: 3px solid var(--theme-status-error, #c0385f);\n border-radius: var(--theme-radius-sm, 4px);\n background: var(--theme-status-error-subtle, rgba(192, 56, 95, 0.08));\n font-weight: 600;\n }\n .mm-danger-confirmation__target-label { color: var(--theme-text-muted, #75829a); margin-right: var(--theme-space-1, 4px); }\n .mm-danger-confirmation__type { display: block; margin-bottom: var(--theme-space-1, 4px); }\n .mm-danger-confirmation__input { width: 100%; }\n `],\n})\nexport class DangerConfirmationWindowComponent extends DialogContentBase {\n private readonly ref: DialogRef;\n\n /** Set by the service right after opening. */\n readonly options = signal<DangerConfirmationOptions>({title: '', targetName: '', consequence: '', confirmText: ''});\n protected readonly typed = signal('');\n protected readonly inputId = `mm-danger-confirm-${nextId++}`;\n\n protected readonly messages = computed<DangerConfirmationMessages>(() => ({\n ...DEFAULT_DANGER_CONFIRMATION_MESSAGES,\n ...(this.options().messages ?? {}),\n }));\n /** What has to be typed: the target name, or a non-empty fallback when it is empty. */\n protected readonly typingToken = computed(() => dangerConfirmTypingToken(this.options()));\n protected readonly typeLabel = computed(() => this.messages().typeToConfirm.replace('{name}', this.typingToken()));\n protected readonly environmentNotice = computed(() =>\n this.messages().environmentNotice.replace('{environment}', this.options().environmentLabel ?? ''));\n protected readonly canConfirm = computed(() =>\n !this.options().requireTypingName || dangerConfirmNameMatches(this.typed(), this.typingToken()));\n\n constructor() {\n const ref = inject(DialogRef);\n super(ref);\n this.ref = ref;\n }\n\n private readonly host = inject(ElementRef<HTMLElement>);\n\n /**\n * Initial focus never on the destructive button (Enter must not delete): the type-to-confirm\n * input when required, else Cancel. The service also passes `autoFocusedElement`; this is the\n * fallback for hosts that render the content themselves.\n */\n override ngAfterViewInit(): void {\n super.ngAfterViewInit();\n setTimeout(() => this.focusSafeElement());\n }\n\n /** Focuses the type-to-confirm input or Cancel (unless focus already sits on one of them). */\n focusSafeElement(): void {\n const root = this.host.nativeElement.closest('.k-dialog') ?? this.host.nativeElement;\n const target = root.querySelector(DANGER_CONFIRM_SAFE_FOCUS(!!this.options().requireTypingName)) as HTMLElement | null;\n target?.focus();\n }\n\n protected cancel(): void {\n this.ref.close(new DangerConfirmationResult(false));\n }\n\n protected confirm(): void {\n if (this.canConfirm()) {\n this.ref.close(new DangerConfirmationResult(true));\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport {DialogRef, DialogService} from '@progress/kendo-angular-dialog';\nimport {firstValueFrom} from 'rxjs';\nimport {ConfirmationWindowComponent} from '../confirmation-window/confirmation-window.component';\nimport {\n ButtonTypes,\n ConfirmationButtonLabels,\n ConfirmationWindowData,\n ConfirmationWindowResult,\n DialogType,\n} from '../models/confirmation';\nimport {ConfirmationWindowMessages} from '../confirmation-window/confirmation-window.messages';\nimport {\n DANGER_CONFIRM_SAFE_FOCUS,\n DangerConfirmationResult,\n DangerConfirmationWindowComponent,\n} from '../danger-confirmation/danger-confirmation-window.component';\nimport {\n DANGER_CONFIRM_ENVIRONMENT,\n DangerConfirmationMessages,\n DangerConfirmationOptions,\n applyDangerConfirmEnvironment,\n} from '../danger-confirmation/danger-confirmation.model';\n\n@Injectable()\nexport class ConfirmationService {\n private readonly dialogService = inject(DialogService);\n /** Optional app-wide environment defaults (e.g. production → type the name), AB#5578. */\n private readonly dangerEnvironment = inject(DANGER_CONFIRM_ENVIRONMENT, {optional: true});\n\n public defaultMessages: Partial<ConfirmationWindowMessages> | undefined;\n /** App-wide translations of {@link showDangerConfirm}; per-call `options.messages` win. */\n public defaultDangerMessages: Partial<DangerConfirmationMessages> | undefined;\n\n /**\n * Danger confirmation that names the target (Studio action guideline §2.4, AB#5578): title +\n * target + consequence, Cancel left / danger confirm right, initial focus on Cancel (or on the\n * type-to-confirm input when `requireTypingName`, e.g. in production tenants). Resolves `true`\n * only when the confirming button was used. Unset `requireTypingName` / `environmentLabel` fall\n * back to the app's {@link DANGER_CONFIRM_ENVIRONMENT}, if provided.\n */\n public async showDangerConfirm(callerOptions: DangerConfirmationOptions): Promise<boolean> {\n const options = applyDangerConfirmEnvironment(callerOptions, this.dangerEnvironment?.());\n const dialogRef: DialogRef = this.dialogService.open({\n title: options.title,\n content: DangerConfirmationWindowComponent,\n cssClass: 'mm-dialog-danger',\n autoFocusedElement: DANGER_CONFIRM_SAFE_FOCUS(!!options.requireTypingName),\n minWidth: 'min(320px, calc(100vw - 32px))',\n maxWidth: 'min(560px, calc(100vw - 32px))',\n });\n const component = dialogRef.content.instance as DangerConfirmationWindowComponent;\n component.options.set({\n ...options,\n messages: {...(this.defaultDangerMessages ?? {}), ...(options.messages ?? {})},\n });\n const result = await firstValueFrom(dialogRef.result);\n return result instanceof DangerConfirmationResult && result.confirmed;\n }\n\n public async showYesNoConfirmationDialog(title: string, message: string, cssClass?: string, buttonLabels?: ConfirmationButtonLabels, messages?: Partial<ConfirmationWindowMessages>): Promise<boolean> {\n\n const dialogRef = this.openDialog(title, message, DialogType.YesNo, cssClass, buttonLabels, messages);\n\n const result = await firstValueFrom(dialogRef.result);\n if (result instanceof ConfirmationWindowResult) {\n return result.result === ButtonTypes.Yes;\n } else {\n return false;\n }\n }\n\n public async showYesNoCancelConfirmationDialog(title: string, message: string, buttonLabels?: ConfirmationButtonLabels, messages?: Partial<ConfirmationWindowMessages>): Promise<ConfirmationWindowResult | undefined> {\n\n const dialogRef = this.openDialog(title, message, DialogType.YesNoCancel, undefined, buttonLabels, messages);\n\n const result = await firstValueFrom(dialogRef.result);\n if (result instanceof ConfirmationWindowResult) {\n return result;\n }\n return undefined;\n }\n\n public async showOkCancelConfirmationDialog(title: string, message: string, messages?: Partial<ConfirmationWindowMessages>): Promise<boolean> {\n\n const dialogRef = this.openDialog(title, message, DialogType.OkCancel, undefined, undefined, messages);\n\n const component = dialogRef.content.instance as ConfirmationWindowComponent;\n component.data = {\n title,\n message,\n dialogType: DialogType.OkCancel,\n messages: messages ?? this.defaultMessages,\n } as ConfirmationWindowData\n\n const result = await firstValueFrom(dialogRef.result);\n if (result instanceof ConfirmationWindowResult) {\n return result.result === ButtonTypes.Ok;\n } else {\n return false;\n }\n }\n\n /**\n * Confirmation of a destructive action: explicit verb labels instead of Yes / No (e.g.\n * \"Rotate\" / \"Cancel\") and the confirming button styled as danger. Resolves `true` only when\n * the confirming button was clicked.\n */\n public async showDestructiveConfirmationDialog(title: string, message: string, confirmLabel: string, cancelLabel = 'Cancel'): Promise<boolean> {\n const dialogRef = this.openDialog(title, message, DialogType.YesNo, undefined, { yes: confirmLabel, no: cancelLabel }, undefined, true);\n const result = await firstValueFrom(dialogRef.result);\n return result instanceof ConfirmationWindowResult && result.result === ButtonTypes.Yes;\n }\n\n public async showOkDialog(title: string, message: string, messages?: Partial<ConfirmationWindowMessages>): Promise<boolean> {\n const dialogRef = this.openDialog(title, message, DialogType.Ok, undefined, undefined, messages);\n\n const result = await firstValueFrom(dialogRef.result);\n if (result instanceof ConfirmationWindowResult) {\n return result.result === ButtonTypes.Ok;\n } else {\n return false;\n }\n }\n\n private openDialog(title: string, message: string, dialogType: DialogType, cssClass?: string, buttonLabels?: ConfirmationButtonLabels, messages?: Partial<ConfirmationWindowMessages>, danger = false) {\n // A confirmation is a short text: cap its width so a long message wraps instead of\n // stretching the dialog over the whole viewport.\n const dialogRef: DialogRef = this.dialogService.open({\n title,\n content: ConfirmationWindowComponent,\n cssClass,\n // Destructive confirmations focus the dismissing button first: Enter must never confirm a\n // delete (AB#5578). Danger = showDestructiveConfirmationDialog, 'mm-dialog-danger' = production check.\n ...(danger || cssClass?.includes('mm-dialog-danger') ? {autoFocusedElement: '[data-action=\"dismiss\"], [data-action=\"cancel\"]'} : {}),\n // Both bounds leave a 16 px gutter on each side, so a phone (< 352 px) never overflows.\n minWidth: 'min(320px, calc(100vw - 32px))',\n maxWidth: 'min(560px, calc(100vw - 32px))'\n });\n\n const component = dialogRef.content.instance as ConfirmationWindowComponent;\n component.data = {\n title,\n message,\n dialogType,\n buttonLabels,\n messages: messages ?? this.defaultMessages,\n ...(danger ? { danger: true } : {}),\n };\n return dialogRef;\n }\n}\n","export class InputDialogResult {\n newValue: unknown;\n\n constructor(newValue: unknown) {\n this.newValue = newValue;\n }\n}\n","export interface InputDialogMessages {\n ok: string;\n cancel: string;\n placeholder: string;\n}\n\nexport const DEFAULT_INPUT_DIALOG_MESSAGES: InputDialogMessages = {\n ok: 'OK',\n cancel: 'Cancel',\n placeholder: 'Enter value',\n};\n","import { Component, Input, inject, ChangeDetectionStrategy } from '@angular/core';\nimport {DialogActionsComponent, DialogContentBase, DialogRef} from '@progress/kendo-angular-dialog';\nimport {ButtonComponent} from '@progress/kendo-angular-buttons';\nimport {FormsModule} from '@angular/forms';\nimport {LabelComponent} from '@progress/kendo-angular-label';\nimport {TextBoxComponent} from '@progress/kendo-angular-inputs';\nimport {InputDialogResult} from '../models/inputDialogResult';\nimport {\n InputDialogMessages,\n DEFAULT_INPUT_DIALOG_MESSAGES,\n} from './input-dialog.messages';\nimport { MmDialogActionsDirective } from '../dialog-actions/dialog-actions.directive';\n\n@Component({\n selector: 'mm-input-dialog',\n imports: [\n MmDialogActionsDirective,\n DialogActionsComponent,\n ButtonComponent,\n FormsModule,\n LabelComponent,\n TextBoxComponent\n ],\n templateUrl: './input-dialog.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './input-dialog.component.scss'\n})\nexport class InputDialogComponent extends DialogContentBase {\n private readonly dialogRef: DialogRef;\n\n @Input() public buttonOkText = DEFAULT_INPUT_DIALOG_MESSAGES.ok;\n @Input() public message = '';\n @Input() public placeholder = DEFAULT_INPUT_DIALOG_MESSAGES.placeholder;\n\n @Input() protected inputValue: string | null = '';\n\n public _messages: InputDialogMessages = { ...DEFAULT_INPUT_DIALOG_MESSAGES };\n\n @Input() set messages(value: Partial<InputDialogMessages> | undefined) {\n this._messages = { ...DEFAULT_INPUT_DIALOG_MESSAGES, ...(value ?? {}) };\n if (this.buttonOkText === DEFAULT_INPUT_DIALOG_MESSAGES.ok) {\n this.buttonOkText = this._messages.ok;\n }\n if (this.placeholder === DEFAULT_INPUT_DIALOG_MESSAGES.placeholder) {\n this.placeholder = this._messages.placeholder;\n }\n }\n\n constructor() {\n const dialogRef = inject(DialogRef);\n\n super(dialogRef);\n\n this.dialogRef = dialogRef;\n }\n\n protected onOk(): void {\n this.dialogRef.close(new InputDialogResult(this.inputValue!));\n }\n\n protected onCancel(): void {\n this.dialogRef.close(null);\n }\n}\n","<kendo-label text=\"{{message}}\">\n<kendo-textbox id=\"input\" [placeholder]=\"placeholder\" [(ngModel)]=\"inputValue\" ></kendo-textbox>\n</kendo-label>\n<kendo-dialog-actions>\n <button kendoButton (click)=\"onCancel()\">{{ _messages.cancel }}</button>\n <button kendoButton (click)=\"onOk()\" themeColor=\"primary\" [disabled]=\"!inputValue\">{{buttonOkText}}</button>\n</kendo-dialog-actions>\n","import { Injectable, inject } from '@angular/core';\nimport {DialogService} from '@progress/kendo-angular-dialog';\nimport {InputDialogComponent} from '../input-dialog/input-dialog.component';\nimport {firstValueFrom} from 'rxjs';\nimport {InputDialogResult} from '../models/inputDialogResult';\nimport {InputDialogMessages} from '../input-dialog/input-dialog.messages';\n\n@Injectable()\nexport class InputService {\n private readonly dialogService = inject(DialogService);\n\n public defaultMessages: Partial<InputDialogMessages> | undefined;\n\n public async showInputDialog(\n title: string,\n message: string,\n placeholder: string,\n buttonOkText: string | null = null,\n messages?: Partial<InputDialogMessages>,\n ): Promise<string | null> {\n const dialogRef = this.dialogService.open({\n title,\n content: InputDialogComponent,\n autoFocusedElement: 'input'\n });\n\n const component = dialogRef.content.instance;\n component.message = message;\n component.placeholder = placeholder;\n if (buttonOkText) {\n component.buttonOkText = buttonOkText;\n }\n const effectiveMessages = messages ?? this.defaultMessages;\n if (effectiveMessages) {\n component.messages = effectiveMessages;\n }\n\n const result = await firstValueFrom(dialogRef.result);\n if (result instanceof InputDialogResult) {\n return result.newValue as string;\n }\n\n return null;\n }\n}\n","export interface ProgressWindowMessages {\n cancel: string;\n}\n\nexport const DEFAULT_PROGRESS_WINDOW_MESSAGES: ProgressWindowMessages = {\n cancel: 'Cancel',\n};\n","import { Component, inject, OnDestroy, AfterViewInit, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ButtonComponent } from '@progress/kendo-angular-buttons';\nimport {\n DialogActionsComponent,\n DialogContentBase,\n DialogRef,\n} from '@progress/kendo-angular-dialog';\nimport { ProgressBarComponent } from '@progress/kendo-angular-progressbar';\nimport { Observable, Subscription } from 'rxjs';\nimport { ProgressValue } from '../models/progressValue';\nimport {\n ProgressWindowMessages,\n DEFAULT_PROGRESS_WINDOW_MESSAGES,\n} from './progress-window.messages';\nimport { MmDialogActionsDirective } from '../dialog-actions/dialog-actions.directive';\n\nexport interface ProgressWindowData {\n title: string;\n isDeterminate: boolean;\n progress: Observable<ProgressValue>;\n isCancelOperationAvailable: boolean;\n cancelOperation: () => void;\n}\n\nexport type ProgressWindowResult = object;\n\n@Component({\n selector: 'mm-progress-window',\n standalone: true,\n imports: [\n MmDialogActionsDirective,\n CommonModule,\n ButtonComponent,\n DialogActionsComponent,\n ProgressBarComponent,\n ],\n templateUrl: './progress-window.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './progress-window.component.scss'\n})\nexport class ProgressWindowComponent extends DialogContentBase implements OnDestroy, AfterViewInit {\n private readonly dialogRef: DialogRef;\n private progressSubscription?: Subscription;\n\n @Input() isDeterminate = true;\n @Input() progress!: Observable<ProgressValue>;\n @Input() isCancelOperationAvailable = false;\n @Input() cancelOperation?: () => void;\n\n public statusText: string | null = null;\n public progressValue = 0;\n\n public _messages: ProgressWindowMessages = { ...DEFAULT_PROGRESS_WINDOW_MESSAGES };\n\n @Input() set messages(value: Partial<ProgressWindowMessages> | undefined) {\n this._messages = { ...DEFAULT_PROGRESS_WINDOW_MESSAGES, ...(value ?? {}) };\n }\n\n constructor() {\n const dialogRef = inject(DialogRef);\n super(dialogRef);\n this.dialogRef = dialogRef;\n }\n\n override ngAfterViewInit(): void {\n // Subscribe to progress updates after view is initialized\n if (this.progress) {\n this.progressSubscription = this.progress.subscribe((value: ProgressValue) => {\n this.statusText = value.statusText;\n this.progressValue = value.progressValue;\n });\n }\n }\n\n ngOnDestroy(): void {\n // Clean up subscription\n if (this.progressSubscription) {\n this.progressSubscription.unsubscribe();\n }\n }\n\n onCancelClick(): void {\n if (this.cancelOperation) {\n this.cancelOperation();\n }\n this.dialogRef.close();\n }\n}\n","<div class=\"progress-content\">\n <div class=\"progress-section\">\n <!-- Determinate progress bar -->\n @if (isDeterminate) {\n <kendo-progressbar\n [value]=\"progressValue\"\n [max]=\"100\" [label]=\"false\"\n class=\"progress-bar\">\n </kendo-progressbar>\n }\n\n <!-- Indeterminate progress bar -->\n @if (!isDeterminate) {\n <kendo-progressbar\n [indeterminate]=\"true\"\n class=\"progress-bar\">\n </kendo-progressbar>\n }\n\n <!-- Status text -->\n @if (statusText) {\n <p class=\"status-text\">{{ statusText }}</p>\n }\n </div>\n</div>\n\n<kendo-dialog-actions>\n @if (isCancelOperationAvailable) {\n <button\n kendoButton\n (click)=\"onCancelClick()\">\n {{ _messages.cancel }}\n </button>\n }\n</kendo-dialog-actions>\n","import { Injectable, inject } from '@angular/core';\nimport { DialogRef, DialogService } from '@progress/kendo-angular-dialog';\nimport { Observable } from 'rxjs';\nimport { ProgressValue } from '../models/progressValue';\nimport { ProgressWindowComponent } from './progress-window.component';\nimport { ProgressWindowMessages } from './progress-window.messages';\n\n@Injectable()\nexport class ProgressWindowService {\n private readonly dialogService = inject(DialogService);\n\n public defaultMessages: Partial<ProgressWindowMessages> | undefined;\n\n showProgress(config: ProgressWindowConfig): DialogRef {\n const dialogRef = this.dialogService.open({\n title: config.title,\n content: ProgressWindowComponent,\n width: config.width ?? 450,\n height: config.height ?? 'auto',\n cssClass: 'mm-progress-window-no-close',\n preventAction: () => true\n });\n\n const component = dialogRef.content.instance;\n component.isDeterminate = config.isDeterminate !== false;\n component.progress = config.progress;\n component.isCancelOperationAvailable = config.isCancelOperationAvailable || false;\n component.cancelOperation = config.cancelOperation || (() => { /* noop */ });\n const messages = config.messages ?? this.defaultMessages;\n if (messages) {\n component.messages = messages;\n }\n\n return dialogRef;\n }\n\n /**\n * Shows a determinate progress window (with percentage)\n * @param title Window title\n * @param progress Observable that emits progress updates\n * @param options Additional options\n * @returns DialogRef for the progress window\n */\n showDeterminateProgress(\n title: string,\n progress: Observable<ProgressValue>,\n options?: Partial<ProgressWindowOptions>\n ): DialogRef {\n return this.showProgress({\n title,\n isDeterminate: true,\n progress,\n ...options\n });\n }\n\n /**\n * Shows an indeterminate progress window (spinning/pulsing animation)\n * @param title Window title\n * @param progress Observable that emits progress updates (statusText only)\n * @param options Additional options\n * @returns DialogRef for the progress window\n */\n showIndeterminateProgress(\n title: string,\n progress: Observable<ProgressValue>,\n options?: Partial<ProgressWindowOptions>\n ): DialogRef {\n return this.showProgress({\n title,\n isDeterminate: false,\n progress,\n ...options\n });\n }\n}\n\nexport interface ProgressWindowConfig {\n title: string;\n progress: Observable<ProgressValue>;\n isDeterminate?: boolean;\n isCancelOperationAvailable?: boolean;\n cancelOperation?: () => void;\n width?: number;\n height?: number | string;\n allowClose?: boolean;\n messages?: Partial<ProgressWindowMessages>;\n}\n\nexport interface ProgressWindowOptions {\n isCancelOperationAvailable?: boolean;\n cancelOperation?: () => void;\n width?: number;\n height?: number | string;\n allowClose?: boolean;\n messages?: Partial<ProgressWindowMessages>;\n}\n","export interface MessageDetailsDialogMessages {\n copyToClipboard: string;\n close: string;\n closeTitle: string;\n minimizeTitle: string;\n maximizeTitle: string;\n restoreTitle: string;\n}\n\nexport const DEFAULT_MESSAGE_DETAILS_DIALOG_MESSAGES: MessageDetailsDialogMessages = {\n copyToClipboard: 'Copy to Clipboard',\n close: 'Close',\n closeTitle: 'Close',\n minimizeTitle: 'Minimize',\n maximizeTitle: 'Maximize',\n restoreTitle: 'Restore',\n};\n","import { Component, inject, OnInit, ChangeDetectionStrategy } from '@angular/core';\nimport { WindowRef } from '@progress/kendo-angular-dialog';\nimport { ButtonModule } from '@progress/kendo-angular-buttons';\nimport { copyIcon, xIcon } from '@progress/kendo-svg-icons';\nimport {\n MessageDetailsDialogMessages,\n DEFAULT_MESSAGE_DETAILS_DIALOG_MESSAGES,\n} from './message-details-dialog.messages';\n\nexport interface MessageDetailsDialogData {\n title: string;\n details: string;\n level: 'error' | 'warning';\n copyLabel?: string;\n closeLabel?: string;\n messages?: Partial<MessageDetailsDialogMessages>;\n}\n\n@Component({\n selector: 'mm-message-details-dialog',\n standalone: true,\n imports: [\n ButtonModule,\n ],\n // No <kendo-window-messages> here: the titlebar tooltips travel through WindowSettings.messages\n // (see MessageDetailsDialogService). WindowService builds this content outside the window, so\n // the directive finds no LocalizationService and the dialog fails to open with NG0201.\n template: `\n <div class=\"message-details-content\">\n @if (!details) {\n <div class=\"loading-section\">\n <span class=\"k-icon k-i-loading\"></span>\n </div>\n } @else {\n <pre class=\"details-pre\">{{ details }}</pre>\n }\n\n <div class=\"mm-dialog-actions\">\n <button\n kendoButton\n [svgIcon]=\"xIcon\"\n themeColor=\"base\"\n (click)=\"onClose()\">\n {{ closeLabel }}\n </button>\n <button\n kendoButton\n [svgIcon]=\"copyIcon\"\n themeColor=\"primary\"\n (click)=\"copyToClipboard()\">\n {{ copyLabel }}\n </button>\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.Eager,\n styles: [`\n .message-details-content {\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 16px;\n box-sizing: border-box;\n overflow: hidden;\n }\n\n .loading-section {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .details-pre {\n flex: 1;\n margin: 0;\n font-family: 'Courier New', monospace;\n font-size: 13px;\n line-height: 1.5;\n border: 1px solid var(--kendo-color-border);\n background: var(--kendo-color-base-subtle);\n border-radius: 4px;\n padding: 12px;\n overflow: scroll;\n white-space: pre;\n min-height: 0;\n }\n\n .details-pre::-webkit-scrollbar {\n width: 10px;\n height: 10px;\n }\n\n .details-pre::-webkit-scrollbar-track {\n background: var(--kendo-color-base-subtle, #f5f5f5);\n border-radius: 4px;\n }\n\n .details-pre::-webkit-scrollbar-thumb {\n background: var(--kendo-color-border, #ccc);\n border-radius: 4px;\n }\n\n .details-pre::-webkit-scrollbar-thumb:hover {\n background: #999;\n }\n\n `]\n})\nexport class MessageDetailsDialogComponent implements OnInit {\n protected readonly copyIcon = copyIcon;\n protected readonly xIcon = xIcon;\n\n private readonly windowRef = inject(WindowRef);\n\n public data!: MessageDetailsDialogData;\n public details = '';\n public copyLabel = DEFAULT_MESSAGE_DETAILS_DIALOG_MESSAGES.copyToClipboard;\n public closeLabel = DEFAULT_MESSAGE_DETAILS_DIALOG_MESSAGES.close;\n public messages: MessageDetailsDialogMessages = { ...DEFAULT_MESSAGE_DETAILS_DIALOG_MESSAGES };\n\n ngOnInit(): void {\n if (this.data) {\n this.details = this.data.details;\n this.messages = {\n ...DEFAULT_MESSAGE_DETAILS_DIALOG_MESSAGES,\n ...(this.data.messages ?? {}),\n };\n this.copyLabel = this.data.copyLabel ?? this.messages.copyToClipboard;\n this.closeLabel = this.data.closeLabel ?? this.messages.close;\n }\n }\n\n onClose(): void {\n this.windowRef.close();\n }\n\n async copyToClipboard(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.details);\n } catch {\n this.fallbackCopyToClipboard(this.details);\n }\n }\n\n private fallbackCopyToClipboard(text: string): void {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n\n try {\n document.execCommand('copy');\n } catch {\n // clipboard fallback failed silently\n } finally {\n document.body.removeChild(textarea);\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { WindowRef } from '@progress/kendo-angular-dialog';\n\nexport interface WindowDimensions {\n width: number;\n height: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class WindowStateService {\n private readonly storageKey = 'mm-window-states';\n private activeBackdrops = 0;\n\n getDimensions(dialogKey: string): WindowDimensions | null {\n const states = this.loadStates();\n return states[dialogKey] ?? null;\n }\n\n saveDimensions(dialogKey: string, dimensions: WindowDimensions): void {\n const states = this.loadStates();\n states[dialogKey] = dimensions;\n this.saveStates(states);\n }\n\n clearDimensions(dialogKey: string): void {\n const states = this.loadStates();\n delete states[dialogKey];\n this.saveStates(states);\n }\n\n resolveWindowSize(\n dialogKey: string,\n defaults: WindowDimensions,\n min?: WindowDimensions\n ): WindowDimensions {\n const stored = this.getDimensions(dialogKey);\n let size = defaults;\n // Sub-min stored values are presumed corrupt (e.g. captured before the dialog's current\n // min was raised, or under a CSS zoom that distorted the saved rect). Fall back to the\n // caller's defaults instead of clamping to min — clamping would trap the dialog at min\n // permanently, since the next captureAndSave would store min and resolveWindowSize would\n // happily return it forever after.\n if (stored && !(min && (stored.width < min.width || stored.height < min.height))) {\n size = stored;\n }\n return this.clampToViewport(size);\n }\n\n /**\n * Keeps a dialog fully on screen: neither a large default nor a size stored\n * on a bigger monitor may exceed the current viewport (minus a margin), or\n * the action bar ends up unreachable below the fold on small resolutions.\n * The clamp deliberately wins over the dialog's minWidth/minHeight — a\n * slightly-too-small dialog is usable, an off-screen one is not. Stored\n * sizes stay untouched, so returning to a larger screen restores them.\n */\n private clampToViewport(size: WindowDimensions): WindowDimensions {\n const viewport = this.viewportSize();\n const margin = 24;\n const maxWidth = Math.max(280, viewport.width - margin * 2);\n const maxHeight = Math.max(240, viewport.height - margin * 2);\n return {\n width: Math.min(size.width, maxWidth),\n height: Math.min(size.height, maxHeight)\n };\n }\n\n /** Seam for tests — window.innerWidth/innerHeight are not assignable in jsdom. */\n protected viewportSize(): WindowDimensions {\n return { width: window.innerWidth, height: window.innerHeight };\n }\n\n captureAndSave(\n dialogKey: string,\n windowElement: HTMLElement,\n min?: WindowDimensions\n ): void {\n // Inline style holds the document-pixel dimensions Kendo sets when the user resizes;\n // getBoundingClientRect would return zoom-adjusted values (e.g. parent CSS zoom: 0.75\n // shrinks the rect by 25%) and saving those would cause the window to shrink on every\n // open/close cycle.\n const styleW = this.parsePixels(windowElement.style.width);\n const styleH = this.parsePixels(windowElement.style.height);\n if (styleW <= 0 || styleH <= 0) {\n return;\n }\n this.saveDimensions(dialogKey, {\n width: Math.max(Math.round(styleW), min?.width ?? 0),\n height: Math.max(Math.round(styleH), min?.height ?? 0)\n });\n }\n\n private parsePixels(value: string | null | undefined): number {\n if (!value) return 0;\n const n = parseFloat(value);\n return Number.isFinite(n) ? n : 0;\n }\n\n /**\n * Applies modal behavior to a Kendo WindowRef: shows a dark backdrop overlay\n * that blocks interaction with the background, and removes it when the window closes.\n * Also captures and saves window dimensions on close.\n *\n * Reads minWidth/minHeight from the Kendo Window instance and clamps stored sizes\n * accordingly — both on save (so future captures never fall below min) and as a\n * self-healing pass on entry (so a previously-stored size below the current min is\n * cleared on first open, falling back to the dialog's configured defaults next time).\n */\n applyModalBehavior(dialogKey: string, windowRef: WindowRef): void {\n const windowEl = windowRef.window.location.nativeElement;\n const min = this.readMinDimensions(windowRef);\n this.healStaleDimensions(dialogKey, min);\n this.showBackdrop();\n\n windowRef.result.subscribe({\n next: () => {\n this.captureAndSave(dialogKey, windowEl, min);\n this.hideBackdrop();\n },\n error: () => {\n this.captureAndSave(dialogKey, windowEl, min);\n this.hideBackdrop();\n }\n });\n }\n\n private readMinDimensions(windowRef: WindowRef): WindowDimensions | undefined {\n const instance = (windowRef.window as { instance?: { minWidth?: number; minHeight?: number } }).instance;\n if (!instance) return undefined;\n const minWidth = instance.minWidth ?? 0;\n const minHeight = instance.minHeight ?? 0;\n if (minWidth <= 0 && minHeight <= 0) return undefined;\n return { width: minWidth, height: minHeight };\n }\n\n /**\n * Drops stored dimensions that fall below the current minimum so the next open uses\n * the caller's defaults instead of a too-small persisted size. The current open is\n * unaffected (it already resolved at open time), but the next one is healed.\n */\n private healStaleDimensions(dialogKey: string, min: WindowDimensions | undefined): void {\n if (!min) return;\n const stored = this.getDimensions(dialogKey);\n if (!stored) return;\n if (stored.width < min.width || stored.height < min.height) {\n this.clearDimensions(dialogKey);\n }\n }\n\n private showBackdrop(): void {\n this.activeBackdrops++;\n if (this.activeBackdrops === 1) {\n this.getOrCreateBackdropElement().style.display = 'block';\n }\n }\n\n private hideBackdrop(): void {\n this.activeBackdrops = Math.max(0, this.activeBackdrops - 1);\n if (this.activeBackdrops === 0) {\n const el = document.querySelector('.mm-window-backdrop') as HTMLElement | null;\n if (el) {\n el.style.display = 'none';\n }\n }\n }\n\n private getOrCreateBackdropElement(): HTMLElement {\n let el = document.querySelector('.mm-window-backdrop') as HTMLElement | null;\n if (!el) {\n el = document.createElement('div');\n el.className = 'mm-window-backdrop';\n // background-color, not the `background` shorthand: jsdom's CSSOM (cssstyle) drops the\n // entire declaration block when the shorthand carries an rgba() value. Same rendering.\n el.style.cssText = 'position:fixed;inset:0;background-color:rgba(0,0,0,0.4);z-index:11499;display:none;';\n document.body.appendChild(el);\n }\n return el;\n }\n\n private loadStates(): Record<string, WindowDimensions> {\n try {\n const raw = sessionStorage.getItem(this.storageKey);\n return raw ? JSON.parse(raw) : {};\n } catch {\n return {};\n }\n }\n\n private saveStates(states: Record<string, WindowDimensions>): void {\n try {\n sessionStorage.setItem(this.storageKey, JSON.stringify(states));\n } catch {\n // sessionStorage full or unavailable\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { WindowService, WindowRef } from '@progress/kendo-angular-dialog';\nimport { MessageDetailsDialogComponent, MessageDetailsDialogData } from './message-details-dialog.component';\nimport { WindowStateService } from '../services/window-state.service';\nimport { MessageDetailsDialogMessages } from './message-details-dialog.messages';\n\n@Injectable()\nexport class MessageDetailsDialogService {\n private readonly windowService = inject(WindowService);\n private readonly windowStateService = inject(WindowStateService);\n\n public defaultMessages: Partial<MessageDetailsDialogMessages> | undefined;\n\n showDetailsDialog(data: MessageDetailsDialogData): WindowRef {\n const size = this.windowStateService.resolveWindowSize('message-details', { width: 900, height: 600 });\n\n const effectiveMessages = data.messages ?? this.defaultMessages;\n\n // Kendo's Window titlebar reads close/minimize/maximize/restore tooltips\n // from WindowSettings.messages at open time - the only way in. The content\n // component cannot carry them: WindowService builds it in the container's\n // injector, outside the window, so a <kendo-window-messages> there finds no\n // LocalizationService (NG0201) and could not reach the titlebar anyway.\n const windowMessages = effectiveMessages\n ? {\n closeTitle: effectiveMessages.closeTitle,\n minimizeTitle: effectiveMessages.minimizeTitle,\n maximizeTitle: effectiveMessages.maximizeTitle,\n restoreTitle: effectiveMessages.restoreTitle,\n }\n : undefined;\n\n const windowRef = this.windowService.open({\n content: MessageDetailsDialogComponent,\n title: data.title,\n width: size.width,\n height: size.height,\n minWidth: 500,\n minHeight: 400,\n resizable: true,\n messages: windowMessages,\n });\n\n this.windowStateService.applyModalBehavior('message-details', windowRef);\n\n const contentRef = windowRef.content as { instance?: MessageDetailsDialogComponent } | undefined;\n if (contentRef?.instance) {\n contentRef.instance.data = effectiveMessages\n ? { ...data, messages: effectiveMessages }\n : data;\n }\n\n return windowRef;\n }\n}\n","export interface NotificationDisplayMessages {\n showDetails: string;\n}\n\nexport const DEFAULT_NOTIFICATION_DISPLAY_MESSAGES: NotificationDisplayMessages = {\n showDetails: 'Show details',\n};\n","import {Injectable, inject, InjectionToken, OnDestroy, NgZone} from '@angular/core';\nimport {NotificationService, NotificationSettings, NotificationRef} from '@progress/kendo-angular-notification';\nimport { MessageDetailsDialogService } from '../message-details-dialog/message-details-dialog.service';\nimport { Router, NavigationEnd } from '@angular/router';\nimport { Subscription, fromEvent } from 'rxjs';\nimport { filter, debounceTime } from 'rxjs/operators';\nimport {\n NotificationDisplayMessages,\n DEFAULT_NOTIFICATION_DISPLAY_MESSAGES,\n} from './notification-display.messages';\n\n/**\n * How the {@link NotificationDisplayService} stacks its toasts. Provide it with\n * {@link NOTIFICATION_DISPLAY_OPTIONS}; without a provider the defaults keep the former behaviour\n * except for de-duplication, which is always safe.\n */\nexport interface NotificationDisplayOptions {\n /**\n * Milliseconds after which an error hides itself when the caller passes no `hideAfter`.\n * 0 (default) keeps errors until user interaction or navigation. A caller passing\n * `hideAfter: 0` explicitly always gets a sticky (critical) error.\n */\n errorHideAfter?: number;\n /** Same as {@link errorHideAfter} for warnings. */\n warningHideAfter?: number;\n /**\n * Errors and warnings that come with details (the \"show details\" button) stay until closed,\n * whatever {@link errorHideAfter} / {@link warningHideAfter} say. Default false.\n */\n stickyWithDetails?: boolean;\n /** Most toasts shown at once; beyond it the oldest toast of the LOWEST severity is hidden\n * (an error or warning is never dropped in favour of a success or info). 0 (default) = no limit. */\n maxVisible?: number;\n /** A toast with the same type, text and details as a visible one is not stacked again; the visible one's timer restarts. Default true. */\n dedupe?: boolean;\n}\n\nexport const NOTIFICATION_DISPLAY_OPTIONS = new InjectionToken<NotificationDisplayOptions>('NOTIFICATION_DISPLAY_OPTIONS');\n\nconst DEFAULT_OPTIONS: Required<NotificationDisplayOptions> = {\n errorHideAfter: 0,\n warningHideAfter: 0,\n maxVisible: 0,\n dedupe: true,\n stickyWithDetails: false,\n};\n\n/** Eviction order of the stack cap: lower goes first. */\nconst SEVERITY: Record<'success' | 'info' | 'warning' | 'error', number> = { success: 0, info: 0, warning: 1, error: 2 };\n\ntype ToastStyle = 'success' | 'info' | 'warning' | 'error';\n\n/** One visible toast. */\ninterface ActiveToast {\n id: string;\n key: string;\n style: ToastStyle;\n title: string;\n ref: NotificationRef;\n hideAfter: number;\n timer?: ReturnType<typeof setTimeout>;\n /** Hover / keyboard focus on the toast: the auto-hide timer waits until both are gone. */\n hovered: boolean;\n focused: boolean;\n}\n\n@Injectable()\nexport class NotificationDisplayService implements OnDestroy {\n private readonly notificationService = inject(NotificationService);\n private readonly messageDetailsDialogService = inject(MessageDetailsDialogService);\n private readonly router = inject(Router);\n private readonly ngZone = inject(NgZone);\n\n private readonly options: Required<NotificationDisplayOptions> = {\n ...DEFAULT_OPTIONS,\n ...(inject(NOTIFICATION_DISPLAY_OPTIONS, { optional: true }) ?? {}),\n };\n\n private notificationCounter = 0;\n private activeNotifications = new Map<string, NotificationRef>();\n /** Every visible toast, oldest first (dedupe, stack cap, auto-hide timers). */\n private toasts: ActiveToast[] = [];\n private subscriptions: Subscription[] = [];\n private interactionDebounceTime = 300; // ms\n private gracePeriod = 1000; // ms - prevent immediate closure after opening\n private notificationOpenTimes = new Map<string, number>();\n\n public messages: NotificationDisplayMessages = { ...DEFAULT_NOTIFICATION_DISPLAY_MESSAGES };\n\n public setMessages(value: Partial<NotificationDisplayMessages>): void {\n this.messages = { ...DEFAULT_NOTIFICATION_DISPLAY_MESSAGES, ...value };\n }\n\n private readonly defaultSettings: NotificationSettings = {\n content: '',\n type: {style: 'success', icon: true},\n animation: {type: 'slide', duration: 400},\n hideAfter: 3000,\n closable: true,\n position: { horizontal: 'center', vertical: 'top' }\n };\n\n constructor() {\n this.setupNavigationListener();\n this.setupGlobalInteractionListeners();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach(sub => sub.unsubscribe());\n this.clearAllNotifications();\n }\n\n private setupNavigationListener(): void {\n const navigationSubscription = this.router.events\n .pipe(filter(event => event instanceof NavigationEnd))\n .subscribe(() => {\n this.clearErrorAndWarningNotifications();\n });\n this.subscriptions.push(navigationSubscription);\n }\n\n private setupGlobalInteractionListeners(): void {\n this.ngZone.runOutsideAngular(() => {\n const events = ['click', 'keydown', 'touchstart'];\n\n events.forEach(eventType => {\n const subscription = fromEvent(document, eventType)\n .pipe(\n debounceTime(this.interactionDebounceTime),\n filter(() => this.hasActiveErrorOrWarning()), // Only process events if we have error/warning notifications\n filter((event) => this.shouldCloseOnInteraction(event as Event))\n )\n .subscribe(() => {\n this.ngZone.run(() => {\n this.clearErrorAndWarningNotifications();\n });\n });\n this.subscriptions.push(subscription);\n });\n });\n }\n\n private hasActiveErrorOrWarning(): boolean {\n for (const [id, _] of this.activeNotifications) {\n if (id.includes('error') || id.includes('warning')) {\n return true;\n }\n }\n return false;\n }\n\n private shouldCloseOnInteraction(event: Event): boolean {\n const target = event.target as Element;\n\n // Don't close if clicking on the notification itself\n const notificationElements = document.querySelectorAll('.k-notification');\n for (const element of Array.from(notificationElements)) {\n if (element.contains(target)) {\n return false;\n }\n }\n\n // Don't close if clicking on navigation elements\n const navElements = document.querySelectorAll('nav, .navigation, .navbar, .menu, .sidebar');\n for (const element of Array.from(navElements)) {\n if (element.contains(target)) {\n return false;\n }\n }\n\n // Check grace period for recent error/warning notifications\n for (const [id, openTime] of this.notificationOpenTimes) {\n if (id.includes('error') || id.includes('warning')) {\n const timeSinceOpen = Date.now() - openTime;\n if (timeSinceOpen < this.gracePeriod) {\n return false;\n }\n }\n }\n\n // Don't close on certain key presses\n if (event.type === 'keydown') {\n const keyEvent = event as KeyboardEvent;\n const excludedKeys = ['Tab', 'Shift', 'Control', 'Alt', 'Meta'];\n return !excludedKeys.includes(keyEvent.key);\n }\n\n return true;\n }\n\n private clearErrorAndWarningNotifications(): void {\n const toRemove: string[] = [];\n for (const [id, ref] of this.activeNotifications) {\n if (id.includes('error') || id.includes('warning')) {\n ref.hide();\n toRemove.push(id);\n }\n }\n toRemove.forEach(id => {\n this.activeNotifications.delete(id);\n this.notificationOpenTimes.delete(id);\n this.forget(id);\n });\n }\n\n private clearAllNotifications(): void {\n for (const [_, ref] of this.activeNotifications) {\n ref.hide();\n }\n this.activeNotifications.clear();\n this.notificationOpenTimes.clear();\n this.toasts.forEach(toast => clearTimeout(toast.timer));\n this.toasts = [];\n }\n\n /**\n * Helper method to create SVG icon HTML\n */\n private createSvgIcon(): string {\n return '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\"' +\n ' d=\"M12 9a3 3 0 0 0-3 3a3 3 0 0 0 3 3a3 3 0 0 0 3-3a3 3 0 0 0-3-3m0 8a5 5 0 0 1-5-5a5 5 0 0 1 5-5a5 5 0 0 1 5 5a5 5 0 0 1-5 5m0-12.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5\"/></svg>';\n }\n\n\n /**\n * Shows a success notification (auto-closes after 3 seconds)\n */\n showSuccess(title: string, hideAfter?: number): void {\n this.present('success', title, undefined, hideAfter ?? 3000);\n }\n\n /**\n * Shows an error notification. It persists until user interaction or navigation, or hides\n * after `hideAfter` ms (default: `errorHideAfter` of the options; `0` = sticky).\n */\n showError(title: string, details?: string, hideAfter?: number): void {\n this.present('error', title, details, hideAfter ?? this.options.errorHideAfter);\n }\n\n /**\n * Shows a warning notification. It persists until user interaction or navigation, or hides\n * after `hideAfter` ms (default: `warningHideAfter` of the options; `0` = sticky).\n */\n showWarning(title: string, details?: string, hideAfter?: number): void {\n this.present('warning', title, details, hideAfter ?? this.options.warningHideAfter);\n }\n\n /**\n * Shows an info notification (auto-closes after 3 seconds)\n */\n showInfo(title: string, hideAfter?: number): void {\n this.present('info', title, undefined, hideAfter ?? 3000);\n }\n\n /** The visible toasts as `[style, text]`, oldest first — for tests and diagnostics. */\n visibleToasts(): [ToastStyle, string][] {\n return this.toasts.map(toast => [toast.style, toast.title]);\n }\n\n private present(style: ToastStyle, title: string, details: string | undefined, hideAfter: number): void {\n const key = `${style}\\u0000${title}\\u0000${details ?? ''}`;\n if (this.options.dedupe) {\n const same = this.toasts.find(toast => toast.key === key);\n if (same) {\n // Already on screen: no second copy, the visible one just stays a while longer.\n this.schedule(same);\n return;\n }\n }\n\n const sticky = style === 'error' || style === 'warning';\n // An error or warning with details is read in the details dialog: it waits for the user.\n const duration = sticky && details && this.options.stickyWithDetails ? 0 : hideAfter;\n const notificationId = `${style}-${++this.notificationCounter}-${Date.now()}`;\n const settings: NotificationSettings = {\n ...this.defaultSettings,\n content: title,\n type: { style, icon: true },\n // Kendo ignores hideAfter on closable notifications: hiding is done by schedule().\n hideAfter: 0,\n closable: true,\n cssClass: `notification-${notificationId}`,\n };\n\n const notificationRef = this.notificationService.show(settings);\n if (!notificationRef) {\n return;\n }\n\n if (sticky) {\n this.activeNotifications.set(notificationId, notificationRef);\n this.notificationOpenTimes.set(notificationId, Date.now());\n }\n const toast: ActiveToast = { id: notificationId, key, style, title, ref: notificationRef, hideAfter: duration, hovered: false, focused: false };\n this.toasts.push(toast);\n notificationRef.afterHide?.subscribe(() => this.forget(notificationId));\n this.schedule(toast);\n this.enforceLimit();\n\n // The toast element exists once Kendo has rendered it.\n setTimeout(() => {\n this.watchPointerAndFocus(toast);\n if (details && sticky) {\n this.addDetailsButton(notificationId, title, details, style);\n }\n }, 50);\n }\n\n /** (Re)starts the auto-hide timer of a toast; a toast with `hideAfter` 0 stays, a hovered or focused one waits. */\n private schedule(toast: ActiveToast): void {\n clearTimeout(toast.timer);\n toast.timer = undefined;\n if (toast.hideAfter > 0 && !toast.hovered && !toast.focused) {\n toast.timer = setTimeout(() => this.hideToast(toast), toast.hideAfter);\n }\n }\n\n /** Pauses the auto-hide while the pointer is over the toast or focus is inside it; restarts it afterwards. */\n private watchPointerAndFocus(toast: ActiveToast): void {\n const element = document.querySelector<HTMLElement>(`.notification-${toast.id}`);\n if (!element || !this.toasts.includes(toast)) {\n return;\n }\n const update = (change: Partial<Pick<ActiveToast, 'hovered' | 'focused'>>) => {\n Object.assign(toast, change);\n if (this.toasts.includes(toast)) {\n this.schedule(toast);\n }\n };\n element.addEventListener('mouseenter', () => update({ hovered: true }));\n element.addEventListener('mouseleave', () => update({ hovered: false }));\n element.addEventListener('focusin', () => update({ focused: true }));\n element.addEventListener('focusout', (event: FocusEvent) => {\n if (!(event.relatedTarget instanceof Node && element.contains(event.relatedTarget))) {\n update({ focused: false });\n }\n });\n }\n\n /** Beyond `maxVisible`, hides the oldest toast of the lowest severity (success/info before warning before error). */\n private enforceLimit(): void {\n const max = this.options.maxVisible;\n while (max > 0 && this.toasts.length > max) {\n const lowest = Math.min(...this.toasts.map(toast => SEVERITY[toast.style]));\n const victim = this.toasts.find(toast => SEVERITY[toast.style] === lowest);\n if (!victim) {\n return;\n }\n this.hideToast(victim);\n }\n }\n\n private hideToast(toast: ActiveToast): void {\n toast.ref.hide();\n this.activeNotifications.delete(toast.id);\n this.notificationOpenTimes.delete(toast.id);\n this.forget(toast.id);\n }\n\n private forget(id: string): void {\n const toast = this.toasts.find(entry => entry.id === id);\n if (toast) {\n clearTimeout(toast.timer);\n this.toasts = this.toasts.filter(entry => entry !== toast);\n }\n }\n\n private addDetailsButton(notificationId: string, title: string, details: string, level: 'error' | 'warning'): void {\n // Called once the notification is rendered: find it by the unique class and modify its content\n {\n const notification = document.querySelector(`.notification-${notificationId}`);\n if (notification) {\n const contentEl = notification.querySelector('.k-notification-content');\n if (contentEl && !contentEl.querySelector('.notification-details-btn')) {\n // Create wrapper div\n const wrapper = document.createElement('div');\n wrapper.style.cssText = 'display: flex; align-items: center; justify-content: space-between; width: 100%; gap: 10px;';\n\n // Create text span\n const textSpan = document.createElement('span');\n textSpan.style.cssText = 'flex: 1; overflow: hidden; text-overflow: ellipsis;';\n textSpan.textContent = title;\n\n // Create details button with icon only\n const detailsBtn = document.createElement('button');\n detailsBtn.className = 'k-button k-button-sm k-button-flat k-button-flat-base notification-details-btn';\n detailsBtn.style.cssText = 'flex-shrink: 0; width: 32px; height: 32px; padding: 8px; display: flex; align-items: center; justify-content: center;';\n detailsBtn.innerHTML = this.createSvgIcon();\n // Icon-only: tooltip and accessible name (AB#6222, action guideline §2.2).\n detailsBtn.type = 'button';\n detailsBtn.title = this.messages.showDetails;\n detailsBtn.setAttribute('aria-label', this.messages.showDetails);\n detailsBtn.onclick = (event) => {\n event.stopPropagation();\n this.messageDetailsDialogService.showDetailsDialog({\n title,\n details,\n level\n });\n };\n\n // Assemble the elements\n wrapper.appendChild(textSpan);\n wrapper.appendChild(detailsBtn);\n\n // Replace content\n contentEl.innerHTML = '';\n contentEl.appendChild(wrapper);\n }\n }\n }\n }\n}\n","import { Injectable, inject, OnDestroy } from '@angular/core';\nimport { MessageService } from '@meshmakers/shared-services';\nimport { NotificationDisplayService } from './notification-display.service';\nimport { Subscription } from 'rxjs';\n\n/**\n * Service that listens to MessageService events and displays them as UI notifications.\n * This service should be initialized at app startup to ensure all messages are displayed.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class MessageListenerService implements OnDestroy {\n private readonly messageService = inject(MessageService);\n private readonly notificationDisplay = inject(NotificationDisplayService);\n private subscription?: Subscription;\n\n /**\n * Starts listening to messages from MessageService and displays them as notifications.\n * Call this once at application startup.\n */\n initialize(): void {\n if (this.subscription) {\n return; // Already initialized\n }\n\n // Subscribe to the new message stream\n this.subscription = this.messageService.messages$.subscribe(message => {\n switch (message.level) {\n case 'error':\n this.notificationDisplay.showError(message.message, message.details);\n break;\n case 'warning':\n this.notificationDisplay.showWarning(message.message, message.details);\n break;\n case 'info':\n this.notificationDisplay.showInfo(message.message);\n break;\n case 'success':\n this.notificationDisplay.showSuccess(message.message);\n break;\n }\n });\n }\n\n /**\n * Stops listening to messages\n */\n stop(): void {\n this.subscription?.unsubscribe();\n this.subscription = undefined;\n }\n\n ngOnDestroy(): void {\n this.stop();\n }\n}\n","import {Directive, TemplateRef, inject} from '@angular/core';\n\n/**\n * Marks an `<ng-template>` whose contents the list view renders inside its\n * toolbar, between the host's toolbar actions and the search box.\n *\n * It exists so a page can put its own scope/filter controls — view switches,\n * \"only in clarification\" toggles and the like — in the SAME band as the\n * table's search and options, instead of stacking a second strip above the\n * grid. Those controls steer the table, so they belong with the table's own\n * controls.\n *\n * A directive rather than plain `<ng-content>`: the toolbar itself lives in a\n * `kendoGridToolbarTemplate`, and content projected with `<ng-content>` cannot\n * be placed inside an `<ng-template>`. Capturing a TemplateRef and rendering it\n * with `ngTemplateOutlet` is the way to reach that spot.\n *\n * ```html\n * <mm-list-view ...>\n * <ng-template mmListViewFilters>\n * <kendo-buttongroup selection=\"single\" [attr.aria-label]=\"'Ansicht'\">…</kendo-buttongroup>\n * </ng-template>\n * </mm-list-view>\n * ```\n */\n@Directive({\n selector: '[mmListViewFilters]',\n standalone: true,\n})\nexport class ListViewFiltersDirective {\n public readonly templateRef = inject(TemplateRef<unknown>);\n}\n","import {Type} from '@angular/core';\nimport {SVGIcon} from '@progress/kendo-svg-icons';\n\n/**\n * Mapping configuration for a single status value to its visual representation\n */\nexport interface StatusIconMapping {\n /** The Kendo SVG icon to display */\n icon: SVGIcon;\n /** Tooltip text shown on hover */\n tooltip: string;\n /** Optional CSS color for the icon (e.g., 'green', '#28a745', 'var(--success-color)') */\n color?: string;\n}\n\n/**\n * Maps enum/status values to their icon representations\n * Key is the enum value (e.g., 'OK', 'MAINTENANCE'), value is the visual config\n */\nexport type StatusMapping = Record<string, StatusIconMapping>;\n\n/**\n * Configuration for a single field in a multi-field status icons column\n */\nexport interface StatusFieldConfig {\n /** The field name in the data object */\n field: string;\n /** Mapping of field values to icons */\n statusMapping: StatusMapping;\n}\n\n/**\n * Visual configuration for one possible value in a `badge` column. Lets host apps map enum-style\n * cell values onto a tinted text pill — e.g. health states, lifecycle statuses, severity levels —\n * without forcing every consumer to roll their own custom cell template.\n */\nexport interface BadgeMapping {\n /** Foreground text colour (CSS colour). Defaults to the host theme's `--badge-text-default`. */\n color?: string;\n /** Background colour (CSS colour). Defaults to the host theme's `--badge-bg-default`. */\n backgroundColor?: string;\n /** Border colour. Defaults to the resolved background. */\n borderColor?: string;\n /** Optional tooltip shown on hover. */\n tooltip?: string;\n /** Override the displayed label. When omitted, the cell renders the raw field value. */\n label?: string;\n}\n\n/** Maps an enum-style cell value to its badge appearance. Keys compared with the raw value via String(). */\nexport type BadgeMappingTable = Record<string, BadgeMapping>;\n\nexport interface TableColumn {\n displayName?: string | null;\n field: string;\n /**\n * How the cell renders and filters. `booleanIcon` (AB#5623) shows a boolean as a check / x icon\n * named \"<column>: Yes|No\" for screen readers (`role=\"img\"` + `aria-label`, texts from\n * `messages.booleanYes` / `booleanNo`) and filters like `boolean`; see {@link booleanIcons}.\n */\n dataType?: 'text' | 'numeric' | 'numericRange' | 'boolean' | 'booleanIcon' | 'date' | 'iso8601' | 'bytes' | 'statusIcons' | 'cronExpression' | 'progressBar' | 'badge' | 'component';\n format?: string;\n /**\n * Column width in pixels. If not set, the column will auto-size.\n */\n width?: number;\n /**\n * Minimum width in pixels for auto-sized columns (columns without `width`).\n * Without it, fixed-width siblings can squeeze an auto column to zero on narrow\n * viewports. When the available space per auto column drops below this value, the\n * column is pinned to `minWidth` and the grid overflows into a horizontal scrollbar\n * instead of collapsing the column. Also applied as the Kendo `minResizableWidth`,\n * so user resizing cannot shrink the column below it either.\n */\n minWidth?: number;\n /**\n * Hides the column while the list view is narrower than this many pixels.\n * Measured against the component's own width (not the browser viewport), so the\n * column set also adapts when surrounding layout (drawer, split panes) takes space.\n * Use it to declare column priority: give low-value detail columns a breakpoint so\n * the identifying columns keep their room on small screens.\n */\n hideBelow?: number;\n /**\n * Horizontal alignment of the column's header and cells. Defaults to the\n * grid's start alignment. Amount and quantity columns should be `'right'`:\n * right-aligned figures line up on the decimal separator so magnitudes can\n * be compared down the column, and the cell additionally renders with\n * tabular (fixed-width) digits so the digits themselves line up too.\n */\n align?: 'left' | 'center' | 'right';\n /**\n * Status mapping for single-field statusIcons columns.\n * Use this when the column displays icons for a single field.\n */\n statusMapping?: StatusMapping;\n /**\n * Configuration for multi-field statusIcons columns.\n * Use this when multiple fields should be displayed as icons in a single column.\n * When set, 'field' is ignored and each entry in 'statusFields' defines its own field.\n */\n statusFields?: StatusFieldConfig[];\n /**\n * Whether sorting is enabled for this column.\n * When not set, inherits from the grid-level sortable setting.\n * Set to false to disable sorting for computed or client-side-only columns.\n */\n sortable?: boolean;\n /**\n * Whether filtering is enabled for this column.\n * When not set, defaults to true (filterable).\n * Set to false to hide the filter cell for this column when row filtering is active.\n */\n filterable?: boolean;\n /**\n * Default filter operator for the row filter.\n * For numeric columns, defaults to 'eq'. Set to 'gte' for range-style filtering.\n */\n filterOperator?: string;\n /**\n * Dropdown filter options for the row filter.\n * When set, the column's row filter renders a dropdown instead of a text input.\n * Each option has a display text and a value used for filtering.\n */\n filterOptions?: { text: string; value: string }[];\n /**\n * Mapping of raw cell values to badge appearances (only consulted for `dataType: 'badge'`).\n * Values not in the mapping fall back to the neutral default badge styling, so callers don't\n * have to handle every possible enum value explicitly.\n */\n badgeMapping?: BadgeMappingTable;\n /**\n * When true, values without a `badgeMapping` entry render an empty cell instead of the\n * neutral raw-value pill (only consulted for `dataType: 'badge'`). Use for flag-style\n * columns where only some values carry a badge — e.g. a boolean marker column that shows\n * a pill for `true` and nothing (rather than a \"false\" pill) for `false`.\n */\n badgeHideUnmapped?: boolean;\n /**\n * Icons of a `booleanIcon` column (AB#5623). Default: a check for `true`, an x for `false`.\n * Set `false: null` to leave `false` cells empty (flag columns); `null` / `undefined` values\n * always render an empty cell. Colours default to the theme tokens\n * `--mm-list-boolean-true-color` / `--mm-list-boolean-false-color`.\n */\n booleanIcons?: BooleanIconMapping;\n /**\n * Optional callback that produces the cell's display string.\n * When set, this overrides the default rendering selected by `dataType`.\n * Filter/sort behaviour still follow `dataType` and the underlying `field` value,\n * so sorting on a numeric column with a currency formatter still sorts numerically.\n *\n * @example\n * ```ts\n * { field: 'grossTotal', dataType: 'numeric',\n * formatter: (value) => new Intl.NumberFormat('de-AT', { style: 'currency', currency: 'EUR' })\n * .format(Number(value)) }\n * ```\n */\n formatter?: (value: unknown, item: unknown) => string;\n /**\n * When true, cell content is rendered on a single line and clipped with an ellipsis.\n * The full value is exposed via a native `title` tooltip on hover, so long strings\n * (e.g. error messages, log lines) stay readable without bloating row heights.\n * Intended for text-style cells; has no visual effect on columns whose content is\n * already a fixed-size widget (statusIcons, progressBar, badge, …).\n */\n truncate?: boolean;\n /**\n * Standalone component to instantiate inside the cell for `dataType: 'component'` columns.\n * The grid renders the component via `*ngComponentOutlet`, with `cellInputs` supplying\n * its `@Input()` bindings per row. Use this when the cell needs internal state\n * (polling, async data, animation) that a static formatter cannot provide.\n */\n cellComponent?: Type<unknown>;\n /**\n * Builds the `@Input()` bindings for the component instance from the row's data item.\n * Called once per row when the cell is rendered. Return values are forwarded verbatim\n * to `*ngComponentOutlet`'s `inputs` map (keyed by the @Input() property name).\n */\n cellInputs?: (item: unknown) => Record<string, unknown>;\n}\n\n/** Icons of a `booleanIcon` column (AB#5623). */\nexport interface BooleanIconMapping {\n /** Icon for `true`. Default: a check icon. */\n true?: SVGIcon;\n /** Icon for `false`; `null` = no icon (empty cell). Default: an x icon. */\n false?: SVGIcon | null;\n /** CSS colour of the `true` icon. Default: `var(--mm-list-boolean-true-color, var(--kendo-color-success))`. */\n trueColor?: string;\n /** CSS colour of the `false` icon. Default: `var(--mm-list-boolean-false-color, var(--kendo-color-subtle))`. */\n falseColor?: string;\n}\n\nexport type ColumnDefinition =\n | string\n | TableColumn;\n\nexport type ContextMenuType = 'contextMenu' | 'actionMenu';\n\n/**\n * Callback for applying CSS classes to individual grid rows based on data.\n * Mirrors Kendo Grid's RowClassFn signature.\n *\n * @example\n * ```typescript\n * rowClassFn = (context: { dataItem: any; index: number }) => ({\n * 'row-warning': context.dataItem.status === 'warn',\n * 'row-error': context.dataItem.status === 'error'\n * });\n * ```\n */\nexport type RowClassFn = (context: { dataItem: unknown; index: number }) => string | string[] | Set<string> | Record<string, boolean>;\n\n/**\n * Translatable messages for the ListViewComponent.\n * Pass translated strings to override the English defaults.\n *\n * Members added after the interface was first published are optional, so an app that builds a\n * complete `ListViewMessages` object for an older library version keeps compiling; a member that\n * is missing (or `undefined`) falls back to {@link DEFAULT_LIST_VIEW_MESSAGES}. New members must\n * be added as optional for the same reason.\n */\nexport interface ListViewMessages {\n /** Search input placeholder. Default: \"Search in all columns...\" */\n searchPlaceholder: string;\n /** Tooltip for \"Show Row Filter\" button. Default: \"Show Row Filter\" */\n showRowFilter: string;\n /** Tooltip for \"Export to Excel\" button. Default: \"Export to Excel\" */\n exportToExcel: string;\n /** Tooltip for \"Export to PDF\" button. Default: \"Export to PDF\" */\n exportToPdf: string;\n /** Tooltip for \"Refresh Data\" button. Default: \"Refresh Data\" */\n refreshData: string;\n /** Tooltip for the \"Reset Filters\" button. Default: \"Reset Filters\". Optional (added in 3.4). */\n resetFilters?: string;\n /** Tooltip for the collapsed command menu. Default: \"Commands\". Optional (added in 3.4). */\n commands?: string;\n /** Title for the actions command column. Default: \"Actions\" */\n actionsColumnTitle: string;\n /** Accessible name of a row's menu button; `{name}` = the row's name. Default: \"Actions for {name}\" */\n rowActionsFor?: string;\n /** Accessible name of a row's menu button when the row has no name. Default: \"Row actions\" */\n rowActions?: string;\n /** Disabled reason of a row action whose `CommandItem` has no `disabledReason` (AB#5572). Default: \"Not available for this row\" */\n rowActionUnavailable?: string;\n /** Disabled reason of every row action while the list loads (AB#5572). Default: \"The list is loading\" */\n rowActionsLoading?: string;\n /** PDF footer page template. Default: \"Page {pageNum} of {totalPages}\" */\n pdfPageTemplate: string;\n\n // Kendo Grid pager messages\n /** Pager: text after page size selector. Default: \"items per page\" */\n pagerItemsPerPage: string;\n /** Pager: \"of\" text between page number and total. Default: \"of\" */\n pagerOf: string;\n /** Pager: text after total count. Default: \"items\" */\n pagerItems: string;\n /** Pager: text before page input. Default: \"Page\" */\n pagerPage: string;\n /** Pager: first page button tooltip. Default: \"Go to the first page\" */\n pagerFirstPage: string;\n /** Pager: last page button tooltip. Default: \"Go to the last page\" */\n pagerLastPage: string;\n /** Pager: previous page button tooltip. Default: \"Go to the previous page\" */\n pagerPreviousPage: string;\n /** Pager: next page button tooltip. Default: \"Go to the next page\" */\n pagerNextPage: string;\n /** Grid: no records message. Default: \"No records available.\" */\n noRecords: string;\n /** Empty state title while a search or filter matches nothing (`emptyState` set, AB#3444). Default: \"No results\". Optional. */\n noResultsTitle?: string;\n /** Empty state text while a search or filter matches nothing (AB#3444). Default: \"Nothing matches the current search or filter.\" Optional. */\n noResultsText?: string;\n /** Accessible value of a `booleanIcon` cell that is true (AB#5623). Default: \"Yes\". Optional. */\n booleanYes?: string;\n /** Accessible value of a `booleanIcon` cell that is false (AB#5623). Default: \"No\". Optional. */\n booleanNo?: string;\n /** Accessible name of a `booleanIcon` cell; `{column}` = column name, `{value}` = Yes / No (AB#5623). Default: \"{column}: {value}\". Optional. */\n booleanIconLabel?: string;\n}\n\n/**\n * Texts of the list's shared empty state (`mm-list-view [emptyState]`, AB#3444). `title` / `text`\n * describe a list without records (\"No data flows yet\"); the `filtered*` texts override the\n * \"no results\" texts of {@link ListViewMessages} while a search or filter is active.\n */\nexport interface MmListEmptyState {\n title: string;\n text?: string | null;\n filteredTitle?: string | null;\n filteredText?: string | null;\n}\n\n/** Template context of `mm-list-view [emptyTemplate]` (AB#3444). */\nexport interface MmListEmptyContext {\n /** Same as `filtered`. */\n $implicit: boolean;\n /** A search, row filter or host filter is active (an empty list means \"no results\"). */\n filtered: boolean;\n}\n\n/**\n * One entry of the list toolbar's command group (row filter, exports, reset,\n * refresh). Rendered as a laid-out icon button when the list is wide enough,\n * and as a menu item once the commands collapse.\n */\nexport interface ListViewCommand {\n id: 'rowFilter' | 'excel' | 'pdf' | 'reset' | 'refresh';\n text: string;\n svgIcon: SVGIcon;\n}\n\n/**\n * Default English messages for the ListViewComponent. Complete: every member, including the\n * optional ones, has a value.\n */\nexport const DEFAULT_LIST_VIEW_MESSAGES: Required<ListViewMessages> = {\n searchPlaceholder: 'Search in all columns...',\n showRowFilter: 'Show Row Filter',\n exportToExcel: 'Export to Excel',\n exportToPdf: 'Export to PDF',\n refreshData: 'Refresh Data',\n resetFilters: 'Reset Filters',\n commands: 'Commands',\n actionsColumnTitle: 'Actions',\n rowActionsFor: 'Actions for {name}',\n rowActions: 'Row actions',\n rowActionUnavailable: 'Not available for this row',\n rowActionsLoading: 'The list is loading',\n pdfPageTemplate: 'Page {pageNum} of {totalPages}',\n pagerItemsPerPage: 'items per page',\n pagerOf: 'of',\n pagerItems: 'items',\n pagerPage: 'Page',\n pagerFirstPage: 'Go to the first page',\n pagerLastPage: 'Go to the last page',\n pagerPreviousPage: 'Go to the previous page',\n pagerNextPage: 'Go to the next page',\n noRecords: 'No records available.',\n noResultsTitle: 'No results',\n noResultsText: 'Nothing matches the current search or filter.',\n booleanYes: 'Yes',\n booleanNo: 'No',\n booleanIconLabel: '{column}: {value}',\n};\n\n/**\n * Merges app-supplied list-view messages over {@link DEFAULT_LIST_VIEW_MESSAGES}. Members that\n * are missing, `undefined` or `null` keep their default, so an app compiled against an older\n * `ListViewMessages` shape (or one that leaves a translation unset) never renders an empty label.\n */\nexport function resolveListViewMessages(\n messages: Partial<ListViewMessages> | null | undefined\n): Required<ListViewMessages> {\n const resolved: Required<ListViewMessages> = { ...DEFAULT_LIST_VIEW_MESSAGES };\n if (!messages) {\n return resolved;\n }\n for (const key of Object.keys(messages) as (keyof ListViewMessages)[]) {\n const value = messages[key];\n if (value !== undefined && value !== null) {\n resolved[key] = value;\n }\n }\n return resolved;\n}\n","import {Pipe, PipeTransform} from '@angular/core';\n\n@Pipe({\n standalone: true,\n name: 'pascalCase'\n})\nexport class PascalCasePipe implements PipeTransform {\n transform(value: string): string {\n if (!value) return value;\n return value.charAt(0).toUpperCase() + value.slice(1);\n }\n}\n","import {State} from '@progress/kendo-data-query/dist/npm/state';\nimport {BehaviorSubject, Observable} from 'rxjs';\nimport {ListViewComponent} from '../list-view/list-view.component';\nimport {EventEmitter, signal} from '@angular/core';\nimport {FetchResult} from '../models/fetchResult';\n\nexport interface FetchDataOptions {\n state: State;\n textSearch: string | null;\n /** When true, bypass cache and fetch fresh data from the server */\n forceRefresh?: boolean;\n}\n\nexport interface FetchAgainOptions {\n /**\n * Reset paging to page 1 before refetching. Pass `true` whenever the data\n * source's own filters (quick-view/bar filters outside the Kendo grid state)\n * changed: the result set changes, so the current page offset would point\n * into stale data or past the end — mirroring `notifyFilterChange()` and the\n * text-search path, which already reset the page.\n */\n resetSkip?: boolean;\n}\n\nexport abstract class DataSourceBase {\n\n public readonly fetchAgainEvent = new EventEmitter<FetchAgainOptions | undefined>()\n\n private readonly _isLoading$ = new BehaviorSubject<boolean>(false);\n\n /** Observable indicating if the data source is currently loading data */\n public readonly isLoading$ = this._isLoading$.asObservable();\n\n /** Current loading state */\n public get isLoading(): boolean {\n return this._isLoading$.value;\n }\n\n private readonly _totalCount = signal<number | null>(null);\n\n /**\n * Total row count reported by the last fetch (`null` before the first result).\n * Kept current by MmListViewDataBindingDirective; lets host pages show the\n * overall count (e.g. in a header badge) without a second query.\n */\n public readonly totalCount = this._totalCount.asReadonly();\n\n /** Set the total row count (called by MmListViewDataBindingDirective) */\n public setTotalCount(count: number | null): void {\n this._totalCount.set(count);\n }\n\n protected constructor(public readonly listViewComponent: ListViewComponent) {\n }\n\n /** Set the loading state (called by MmListViewDataBindingDirective) */\n public setLoading(loading: boolean): void {\n this._isLoading$.next(loading);\n }\n\n public fetchAgain(options?: FetchAgainOptions): void {\n this.fetchAgainEvent.emit(options);\n }\n\n /**\n * Whether a failed fetch means the requested page offset lies beyond the\n * (shrunken) result set. MmListViewDataBindingDirective then recovers by\n * resetting to page 1 and refetching once instead of silently keeping the\n * previous rows on screen. Protocol-specific subclasses (e.g. the OctoMesh\n * GraphQL data source) override this; the default cannot tell and says no.\n */\n public isPageOutOfRangeError(_error: unknown): boolean {\n return false;\n }\n\n public abstract fetchData(queryOptions: FetchDataOptions): Observable<FetchResult | null>;\n}\n","import { Injectable } from '@angular/core';\nimport {\n CompositeFilterDescriptor,\n FilterDescriptor,\n SortDescriptor,\n State,\n isCompositeFilterDescriptor,\n} from '@progress/kendo-data-query';\n\n/**\n * The slice of a Kendo grid {@link State} that is worth persisting for a list\n * view: the user's sort, row filter and current page offset. `take`/`pageSize`\n * is deliberately excluded — in `autoPageSize` mode it is re-derived from the\n * viewport on every load, so persisting it is pointless (and restoring it would\n * fight the measurement).\n */\nexport interface PersistedListState {\n sort?: SortDescriptor[];\n filter?: CompositeFilterDescriptor;\n skip?: number;\n /** Free-text \"search all columns\" value — lives outside the Kendo state. */\n textSearch?: string | null;\n /**\n * App-owned extra state stored under the same list key — e.g. the coarse\n * \"quick view\" / bar filters (category, view, date range) that live in app\n * signals rather than the Kendo grid state. Opaque to this service; the host\n * app defines the shape. Written via {@link ListStateService.saveExtra} and\n * preserved by the directive's own {@link ListStateService.save}.\n */\n extra?: unknown;\n}\n\n/** Matches ISO-8601 date/date-time strings that JSON.stringify produces from a Date. */\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/;\n\n/**\n * Persists list-view sort/filter/paging per list so users do not have to\n * re-apply them on every visit. Central to shared-ui so every app gets the\n * behaviour for free (see {@link ListViewComponent.listStateKey}).\n *\n * Storage is a single namespaced blob in localStorage (survives reloads and\n * browser restarts), keyed by list — mirroring {@link WindowStateService}'s\n * `mm-window-states` map pattern. Every access is guarded: a corrupt or\n * unavailable store must never break a list, it just falls back to no state.\n */\n@Injectable({ providedIn: 'root' })\nexport class ListStateService {\n private readonly storageKey = 'mm-list-view-state';\n\n /** Returns the persisted state for `key`, with date filter values re-hydrated to `Date`. */\n load(key: string): PersistedListState | null {\n const all = this.loadAll();\n const entry = all[key];\n if (!entry) {\n return null;\n }\n // JSON round-trips Date -> ISO string; the Kendo date filter cell needs a\n // real Date back or date filtering/display breaks after restore.\n if (entry.filter) {\n this.reviveFilterDates(entry.filter);\n }\n return entry;\n }\n\n /**\n * Stores the sort/filter/skip slice of `state` for `key` plus the free-text\n * search (which lives outside the Kendo state). `take` is intentionally dropped.\n */\n save(key: string, state: State, textSearch?: string | null): void {\n const all = this.loadAll();\n all[key] = {\n // Preserve any app-owned `extra` (bar filters) written via saveExtra().\n ...all[key],\n sort: state.sort,\n filter: state.filter,\n skip: state.skip,\n textSearch: textSearch ?? null,\n };\n this.saveAll(all);\n }\n\n /**\n * Stores app-owned extra state (e.g. quick-view/bar filters) under `key`,\n * merging into the same entry as the grid state without clobbering it.\n */\n saveExtra(key: string, extra: unknown): void {\n const all = this.loadAll();\n all[key] = { ...all[key], extra };\n this.saveAll(all);\n }\n\n /** Returns the app-owned extra state stored under `key`, or null. */\n loadExtra<T>(key: string): T | null {\n const all = this.loadAll();\n return (all[key]?.extra as T) ?? null;\n }\n\n /** Drops the stored state for `key`. */\n clear(key: string): void {\n const all = this.loadAll();\n if (key in all) {\n delete all[key];\n this.saveAll(all);\n }\n }\n\n private reviveFilterDates(filter: CompositeFilterDescriptor): void {\n for (const f of filter.filters) {\n if (isCompositeFilterDescriptor(f)) {\n this.reviveFilterDates(f);\n continue;\n }\n const leaf = f as FilterDescriptor;\n if (typeof leaf.value === 'string' && ISO_DATE.test(leaf.value)) {\n const parsed = new Date(leaf.value);\n if (!Number.isNaN(parsed.getTime())) {\n leaf.value = parsed;\n }\n }\n }\n }\n\n private loadAll(): Record<string, PersistedListState> {\n try {\n const raw = localStorage.getItem(this.storageKey);\n return raw ? (JSON.parse(raw) as Record<string, PersistedListState>) : {};\n } catch {\n return {};\n }\n }\n\n private saveAll(all: Record<string, PersistedListState>): void {\n try {\n localStorage.setItem(this.storageKey, JSON.stringify(all));\n } catch {\n // localStorage full or unavailable — persistence is best-effort.\n }\n }\n}\n","import { ChangeDetectorRef, Directive, OnDestroy, OnInit, inject } from '@angular/core';\nimport {DataBindingDirective, DataStateChangeEvent, GridComponent} from '@progress/kendo-angular-grid';\nimport {CompositeFilterDescriptor, State} from '@progress/kendo-data-query';\nimport {Observable, of, Subscription} from 'rxjs';\nimport {DataSourceBase, FetchAgainOptions} from '../data-sources/data-source-base';\nimport {ListStateService} from '../services/list-state.service';\n\n@Directive({\n selector: '[mmListViewDataBinding]',\n})\nexport class MmListViewDataBindingDirective extends DataBindingDirective implements OnInit, OnDestroy {\n private readonly dataSource = inject(DataSourceBase, { optional: true, skipSelf: true })!;\n private readonly listStateService = inject(ListStateService);\n\n /** Observable indicating if the data source is currently loading data */\n public get isLoading$(): Observable<boolean> {\n return this.dataSource?.isLoading$ ?? of(false);\n }\n\n /** Current loading state */\n public get isLoading(): boolean {\n return this.dataSource?.isLoading ?? false;\n }\n\n /**\n * Read-only view of the grid state (filter, sort, skip, take) Kendo keeps\n * protected on the base directive. The list view consults it to decide\n * whether anything is filtered right now.\n */\n public get currentState(): State {\n return this.state;\n }\n\n private _serviceSubscription: Subscription | null;\n private _executeFilterSubscription: Subscription | null;\n private _fetchAgainSubscription: Subscription | null;\n private _refreshDataSubscription: Subscription | null;\n private _textSearchValue: string | null = null;\n private _forceRefresh = false;\n\n constructor() {\n const grid = inject(GridComponent);\n const changeDetector = inject(ChangeDetectorRef);\n\n super(grid, changeDetector);\n this._serviceSubscription = null;\n this._executeFilterSubscription = null;\n this._fetchAgainSubscription = null;\n this._refreshDataSubscription = null;\n }\n\n public override ngOnInit(): void {\n super.ngOnInit();\n\n if (!this.dataSource) {\n return;\n }\n\n this._fetchAgainSubscription = this.dataSource.fetchAgainEvent.subscribe((options?: FetchAgainOptions) => {\n this._forceRefresh = true;\n // A data source refetching because its own (bar/quick-view) filters\n // changed must return to page 1 — same invariant as notifyFilterChange()\n // and the text-search path. A plain refresh keeps the current page.\n if (options?.resetSkip) {\n this.skip = 0;\n }\n this.rebind();\n if (options?.resetSkip) {\n this.persistState();\n }\n });\n\n this._executeFilterSubscription = this.dataSource.listViewComponent.onExecuteFilter.subscribe((value: string | null) => {\n this._textSearchValue = value;\n // A changed search term changes the result set — the current page offset\n // would point into stale data (or past the end), so return to page 1.\n this.skip = 0;\n this.rebind();\n this.persistState();\n });\n\n this._refreshDataSubscription = this.dataSource.listViewComponent.onRefreshData.subscribe(() => {\n this._forceRefresh = true;\n this.rebind();\n });\n\n // Restore the persisted sort/filter/page BEFORE the first fetch so the\n // initial rebind() already reflects the user's remembered view.\n this.restoreState();\n\n this.rebind();\n }\n\n public override ngOnDestroy(): void {\n this._serviceSubscription?.unsubscribe();\n this._executeFilterSubscription?.unsubscribe();\n this._fetchAgainSubscription?.unsubscribe();\n this._refreshDataSubscription?.unsubscribe();\n super.ngOnDestroy();\n }\n\n // noinspection JSUnusedGlobalSymbols\n\n /**\n * Triggers a rebind when the filter state changes programmatically.\n * Syncs the grid's filter into the DataBindingDirective state before rebinding.\n * Resets `skip` to page 1: a changed filter changes the result set, so the\n * current page offset would point into stale data or past the end (Kendo's\n * own filter-row path does the same reset via its dataStateChange event).\n */\n public notifyFilterChange(filter: CompositeFilterDescriptor): void {\n this.state.filter = filter;\n this.skip = 0;\n this.rebind();\n this.persistState();\n }\n\n /**\n * Applies a programmatic page-size change (fit-to-height mode of mm-list-view).\n * The inherited setters sync grid and query state; `skip` is realigned to the\n * new page grid so the pager stays on a valid page, then the data is refetched.\n */\n public applyPageSize(take: number): void {\n const skip = this.state.skip ?? 0;\n this.pageSize = take;\n this.skip = Math.floor(skip / take) * take;\n this.rebind();\n this.persistState();\n }\n\n /**\n * Kendo emits this for header-sort clicks, the built-in filter row and the\n * pager. Persist the resulting state so those interactions survive a revisit.\n */\n public override onStateChange(state: DataStateChangeEvent): void {\n super.onStateChange(state);\n this.persistState();\n }\n\n /** Effective per-list storage key, or null when persistence is disabled/unavailable. */\n private stateKey(): string | null {\n return this.dataSource?.listViewComponent?.resolveListStateKey() ?? null;\n }\n\n /**\n * Restores the persisted sort/filter/page into the grid state via the\n * inherited setters (which sync both the Kendo grid and the query state).\n * `take`/`pageSize` is intentionally not restored — it is the caller's\n * initial pageSize or the autoPageSize measurement.\n */\n private restoreState(): void {\n const key = this.stateKey();\n if (!key) {\n return;\n }\n const stored = this.listStateService.load(key);\n if (!stored) {\n return;\n }\n if (stored.sort) {\n this.sort = stored.sort;\n }\n if (stored.filter) {\n this.filter = stored.filter;\n }\n if (typeof stored.skip === 'number') {\n this.skip = stored.skip;\n }\n if (stored.textSearch) {\n // Drive the fetch and mirror the value into the search box display.\n this._textSearchValue = stored.textSearch;\n this.dataSource?.listViewComponent?.restoreSearchValue(stored.textSearch);\n }\n }\n\n /**\n * Clears all filtering for this list back to the default view: row filter,\n * column sort, free-text search and page offset, and drops the persisted\n * entry (incl. any app-owned bar filters) so nothing is restored next visit.\n * The app-side bar filters are reset by the host via\n * {@link ListViewComponent.onResetFilters}.\n */\n public resetState(): void {\n this.sort = [];\n this.filter = { logic: 'and', filters: [] };\n this.skip = 0;\n this._textSearchValue = null;\n const key = this.stateKey();\n if (key) {\n this.listStateService.clear(key);\n }\n this.rebind();\n }\n\n /** Writes the current sort/filter/skip + free-text search for this list to storage (best-effort). */\n private persistState(): void {\n const key = this.stateKey();\n if (!key) {\n return;\n }\n this.listStateService.save(key, this.state, this._textSearchValue);\n }\n\n public override rebind(): void {\n try {\n if (!this.dataSource) {\n return;\n }\n // Cancel a still-running fetch before starting a new one. Without this,\n // overlapping fetches (sort/page click while a load is in flight, or the\n // autoPageSize measurement refetch) race: whichever response arrives LAST\n // wins, so a stale response could overwrite newer data — e.g. an unsorted\n // page replacing the sorted one the user just requested.\n this._serviceSubscription?.unsubscribe();\n // Only use dataSource.setLoading() (tracked via isLoading$ / isLoading signal).\n // Do NOT set grid.loading directly — it triggers Kendo's internal loading overlay.\n this.dataSource.setLoading(true);\n const forceRefresh = this._forceRefresh;\n this._forceRefresh = false; // Reset for next call\n\n this._serviceSubscription = this.dataSource.fetchData({\n state: this.state,\n textSearch: this._textSearchValue,\n forceRefresh\n }).subscribe({\n next: value => {\n this.dataSource.setLoading(false);\n this.dataSource.setTotalCount(value?.totalCount ?? 0);\n this.grid.data = {\n data: (value?.data ?? []) as unknown[],\n total: value?.totalCount || 0\n }\n this.notifyDataChange();\n },\n error: (err) => {\n console.error('[MmListViewDataBinding] fetchData error:', err);\n this.dataSource.setLoading(false);\n // A restored/stale page offset can lie beyond the current result set\n // (persisted skip + changed filters, or data shrunk since the last\n // visit) — the server rejects the fetch and the grid would silently\n // keep showing the PREVIOUS rows under the NEW filters. Recover by\n // returning to page 1 once; skip === 0 cannot be out of range, so\n // this cannot loop.\n if ((this.state.skip ?? 0) > 0 && this.dataSource.isPageOutOfRangeError(err)) {\n this.skip = 0;\n this._forceRefresh = true;\n this.rebind();\n this.persistState();\n }\n }\n });\n } catch (e) {\n console.error('[MmListViewDataBinding] rebind() caught error:', e);\n this.dataSource.setLoading(false);\n }\n }\n}\n","import {SVGIcon} from '@progress/kendo-svg-icons';\nimport {\n arrowRotateCwIcon,\n calculatorIcon,\n cellsMergeIcon,\n clockArrowRotateIcon,\n copyIcon,\n downloadIcon,\n eraserIcon,\n exportIcon,\n eyeIcon,\n fileDataIcon,\n fileReportIcon,\n hyperlinkOpenIcon,\n importIcon,\n passwordIcon,\n pencilIcon,\n pinIcon,\n playIcon,\n plusIcon,\n stopIcon,\n trashIcon,\n undoIcon,\n unpinIcon,\n uploadIcon,\n xCircleIcon,\n} from '@progress/kendo-svg-icons';\n\n/**\n * One user action (AB#5570): a row action, a toolbar action or a page action. The same\n * definition drives the inline icon button, the overflow menu item and the text button, so\n * label, icon, danger styling and the disabled reason never diverge between them.\n *\n * See `octo-frontend-refinery-studio/docs/concepts/studio-action-guideline.md`.\n */\nexport interface MmAction<TId extends string = string> {\n /** Stable id, emitted with the event and rendered as `data-action` (tests, analytics). */\n id: TId;\n /**\n * Verb phrase in sentence case (\"Edit\", \"Delete dump\", \"Set value\"). Used as tooltip,\n * menu/button text (unless `menuLabel` is set) and — together with the row label — as the\n * accessible name. Never ends with \"…\"; put that into `menuLabel`.\n */\n label: string;\n /**\n * Visible text in menus and text buttons when it differs from `label` — typically the \"…\" of\n * actions that open a dialog (\"Delete dump…\"). Tooltips and accessible names keep `label`.\n * Falls back to `label`.\n */\n menuLabel?: string;\n /** Kendo SVG icon; take it from {@link MM_ACTION_ICONS} where a canonical icon exists. */\n icon?: SVGIcon;\n /** Destructive action: danger styling; the handler must confirm (danger dialog, named target). */\n danger?: boolean;\n /**\n * Why the action is not available right now. A non-empty reason disables the action\n * (`aria-disabled`, still focusable) and is announced via `aria-describedby` and shown in\n * the tooltip. `null`/`undefined`/`''` = enabled.\n */\n disabledReason?: string | null;\n /** `false` hides the action (no permission, not applicable to this row). Default: visible. */\n visible?: boolean;\n /** Always place the action in the overflow menu, even when there is room inline. */\n overflow?: boolean;\n /**\n * Navigation target. Inline the action renders as a real link (`routerLink`, open in new tab\n * works); in the overflow menu it navigates with the Router. `triggered` still fires.\n */\n link?: MmActionLink;\n}\n\n/** Router target of a navigating action (`Router.navigate(commands, {queryParams})`). */\nexport interface MmActionLink {\n commands: readonly unknown[] | string;\n queryParams?: Record<string, string>;\n}\n\n/** Emitted when an enabled action is triggered. */\nexport interface MmActionEvent<TId extends string = string> {\n id: TId;\n action: MmAction<TId>;\n}\n\n/** Default number of row action slots (inline buttons incl. the overflow button). */\nexport const MM_ROW_ACTIONS_MAX_INLINE = 3;\n\n/**\n * Canonical action icons (AB#5570). One verb, one icon, everywhere: pick from this map\n * instead of importing a Kendo icon ad hoc, so \"Edit\" never shows a gear in one list and a\n * pencil in the next.\n */\nexport const MM_ACTION_ICONS = {\n /** Create a new item (\"New adapter\", \"Add mapping\"). */\n add: plusIcon,\n /** Edit / open the editable form of the item. */\n edit: pencilIcon,\n /** Read-only view / preview. */\n view: eyeIcon,\n /** Open the item (or a related page) in its own view / new tab. */\n open: hyperlinkOpenIcon,\n /** Delete / remove the item (always `danger`). */\n delete: trashIcon,\n /** Clear a stored value without deleting the item (\"Not needed\", \"Clear secret\"). */\n clear: eraserIcon,\n /** Copy an id or value to the clipboard. */\n copy: copyIcon,\n /** Duplicate the item as a new item. */\n duplicate: fileDataIcon,\n /** Reload data. */\n refresh: arrowRotateCwIcon,\n /** Deploy to a pool / cluster. */\n deploy: uploadIcon,\n /** Undeploy. */\n undeploy: xCircleIcon,\n /** Run / execute / start. */\n run: playIcon,\n /** Stop / cancel a running job. */\n stop: stopIcon,\n /** Export data (file the user saves). */\n export: exportIcon,\n /** Import data. */\n import: importIcon,\n /** Download a file. */\n download: downloadIcon,\n /** Show a report / log. */\n report: fileReportIcon,\n /** Restore / roll back to a stored state (e.g. restore a dump); destructive restores are `danger`. */\n restore: undoIcon,\n /** Pin to a start page / favourites (\"Pin to Home\"). */\n pin: pinIcon,\n /** Remove a pin (\"Unpin from Home\"). */\n unpin: unpinIcon,\n /** Merge one item into another (e.g. merge users); usually `danger`. */\n merge: cellsMergeIcon,\n /** Reset / set a password. */\n resetPassword: passwordIcon,\n /** Fill a past time range from the source data (e.g. rollup backfill). */\n backfill: clockArrowRotateIcon,\n /** Recalculate derived values for a range (e.g. rollup recompute); not the same as `refresh`. */\n recompute: calculatorIcon,\n} as const satisfies Record<string, SVGIcon>;\n\nexport type MmActionIconName = keyof typeof MM_ACTION_ICONS;\n\n/** True when the action is disabled (non-empty {@link MmAction.disabledReason}). */\nexport function isActionDisabled(action: MmAction): boolean {\n return !!action.disabledReason && action.disabledReason.trim().length > 0;\n}\n\n/** True unless the action is explicitly hidden. */\nexport function isActionVisible(action: MmAction): boolean {\n return action.visible !== false;\n}\n\n/**\n * Accessible name of an action on a named target: \"Delete dump Encrypt run 2026-10-06 17:09\".\n * Without a target the label alone.\n */\nexport function actionAccessibleName(action: MmAction, targetLabel?: string | null): string {\n const target = (targetLabel ?? '').trim();\n return target ? `${action.label} ${target}` : action.label;\n}\n\n/** Tooltip: the label, plus the reason when disabled (\"Delete dump — Requires SecretManagement\"). */\nexport function actionTooltip(action: MmAction): string {\n return isActionDisabled(action) ? `${action.label} — ${action.disabledReason!.trim()}` : action.label;\n}\n\n/**\n * Splits visible actions into inline buttons and overflow-menu items. At most `maxInline`\n * slots are rendered: when the actions do not fit, the last slot becomes the overflow\n * button. Actions with `overflow: true` always go to the menu (and need the overflow slot).\n */\nexport function splitRowActions<TId extends string>(\n actions: readonly MmAction<TId>[],\n maxInline: number = MM_ROW_ACTIONS_MAX_INLINE,\n): { inline: MmAction<TId>[]; menu: MmAction<TId>[] } {\n const visible = actions.filter(isActionVisible);\n const forced = visible.filter((a) => a.overflow);\n const candidates = visible.filter((a) => !a.overflow);\n const slots = Math.max(1, Math.floor(maxInline));\n const needsMenu = forced.length > 0 || candidates.length > slots;\n if (!needsMenu) {\n return {inline: candidates, menu: []};\n }\n const inlineCount = Math.max(0, slots - 1);\n return {\n inline: candidates.slice(0, inlineCount),\n menu: [...candidates.slice(inlineCount), ...forced],\n };\n}\n","import {ChangeDetectionStrategy, booleanAttribute, Component, ViewEncapsulation, computed, input, output} from '@angular/core';\nimport {RouterLink} from '@angular/router';\nimport {ButtonModule} from '@progress/kendo-angular-buttons';\nimport {SVGIconModule} from '@progress/kendo-angular-icons';\nimport {\n MmAction,\n MmActionEvent,\n actionAccessibleName,\n actionTooltip,\n isActionDisabled,\n} from './action.model';\n\n/** Where the button sits; drives size, icon size (16 px rows, 20 px toolbars) and emphasis. */\nexport type MmActionContext = 'row' | 'toolbar' | 'page';\n\n/** What the button shows. Icon-only buttons always get a tooltip and an accessible name. */\nexport type MmActionDisplay = 'icon' | 'text' | 'icon-text';\n\nlet nextReasonId = 0;\n\n/**\n * One action as a button (AB#5570), rendered from a shared {@link MmAction} definition.\n *\n * - `display=\"icon\"`: icon-only, native tooltip = label (+ disabled reason), `aria-label`\n * = label + `targetLabel` (\"Delete dump Encrypt run 2026-10-06 17:09\").\n * - `display=\"text\"` / `\"icon-text\"`: visible label; `targetLabel` still extends the\n * accessible name when the same label repeats (one per row).\n * - Disabled (`disabledReason`): stays focusable, `aria-disabled=\"true\"`, the reason is\n * linked via `aria-describedby` and shown in the tooltip; clicks are swallowed.\n * - `danger`: Kendo `themeColor=\"error\"`. The consumer confirms before acting.\n * - `primary` (page/toolbar context only): solid primary button for the one main action.\n * - `link`: rendered as a real router link (`<a kendoButton [routerLink]>`, so open-in-new-tab\n * works); a disabled link action renders as a disabled button.\n *\n * ```html\n * <mm-action-button [action]=\"refresh\" context=\"toolbar\" (triggered)=\"reload()\" />\n * <mm-action-button [action]=\"newAdapter\" context=\"page\" display=\"icon-text\" primary (triggered)=\"create()\" />\n * ```\n */\n@Component({\n selector: 'mm-action-button',\n standalone: true,\n imports: [ButtonModule, RouterLink, SVGIconModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {class: 'mm-action-button-host', '[class.mm-action-button-host--disabled]': 'disabled()'},\n template: `\n @if (action().link && !disabled()) {\n <!-- kendoButton only matches <button>: the link carries the same Kendo button classes itself. -->\n <a\n class=\"mm-action-button\"\n [class]=\"linkClasses()\"\n [class.mm-action-button--danger]=\"!!action().danger\"\n [class.mm-action-button--icon-only]=\"iconOnly()\"\n [class.mm-action-button--toolbar]=\"context() !== 'row'\"\n [attr.title]=\"tooltip()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.data-action]=\"action().id\"\n [routerLink]=\"$any(action().link!.commands)\"\n [queryParams]=\"action().link!.queryParams ?? null\"\n (click)=\"onClick($event)\"\n >@if (showIcon()) {<kendo-svgicon class=\"k-button-icon\" [icon]=\"action().icon!\" />}@if (!iconOnly()) {<span class=\"k-button-text\">{{ visibleLabel() }}</span>}</a>\n } @else {\n <button\n kendoButton\n type=\"button\"\n class=\"mm-action-button\"\n [class.mm-action-button--disabled]=\"disabled()\"\n [class.mm-action-button--danger]=\"!!action().danger\"\n [class.mm-action-button--icon-only]=\"iconOnly()\"\n [class.mm-action-button--toolbar]=\"context() !== 'row'\"\n [svgIcon]=\"showIcon() ? action().icon! : $any(undefined)\"\n [size]=\"context() === 'row' ? 'small' : 'medium'\"\n [fillMode]=\"primary() && !action().danger ? 'solid' : 'flat'\"\n [themeColor]=\"action().danger ? 'error' : primary() ? 'primary' : 'base'\"\n [attr.title]=\"tooltip()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.data-action]=\"action().id\"\n [attr.aria-disabled]=\"disabled() ? 'true' : null\"\n [attr.aria-describedby]=\"disabled() ? reasonId : null\"\n (click)=\"onClick($event)\"\n >@if (!iconOnly()) { {{ visibleLabel() }} }</button>\n }\n @if (disabled()) {\n <span class=\"mm-action-button__reason\" [id]=\"reasonId\">{{ action().disabledReason }}</span>\n }\n `,\n styles: [`\n .mm-action-button-host { display: inline-flex; position: relative; }\n .mm-action-button--toolbar.mm-action-button--icon-only .k-svg-icon { width: 20px; height: 20px; }\n .mm-action-button--disabled { opacity: 0.45; cursor: not-allowed; }\n /* Keyboard focus ring from the theme (guideline §2.6), above Kendo's own focus shadow. */\n .mm-action-button-host .mm-action-button:focus-visible {\n outline: none;\n box-shadow: var(--theme-focus-ring, 0 0 0 2px #ffffff, 0 0 0 4px #2e8473);\n }\n /* Disabled reason: announced via aria-describedby, visually hidden ... */\n .mm-action-button__reason {\n position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;\n overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;\n }\n /* ... and shown as a hint bubble while the disabled action has keyboard focus (guideline §2.5). */\n .mm-action-button-host--disabled:has(.mm-action-button:focus-visible) .mm-action-button__reason {\n top: calc(100% + 4px); left: 0; z-index: 20;\n width: max-content; max-width: 280px; height: auto; margin: 0; overflow: visible; clip: auto;\n padding: var(--theme-space-1, 4px) var(--theme-space-2, 8px);\n white-space: normal; font-size: 0.75rem; line-height: 1.4;\n color: var(--theme-text-primary, #0f1c2e);\n background: var(--theme-bg-overlay, #ffffff);\n border: 1px solid var(--theme-border-default, rgba(7, 23, 43, 0.12));\n border-radius: var(--theme-radius-sm, 4px);\n box-shadow: var(--theme-shadow-popup, 0 8px 24px rgba(7, 23, 43, 0.14));\n pointer-events: none;\n }\n `],\n})\nexport class ActionButtonComponent<TId extends string = string> {\n /** The action definition. */\n readonly action = input.required<MmAction<TId>>();\n /** Name of the target (row) for the accessible name; required for repeated row actions. */\n readonly targetLabel = input<string | null | undefined>(undefined);\n readonly context = input<MmActionContext>('row');\n readonly display = input<MmActionDisplay>('icon');\n /** Solid primary emphasis — at most one per page header / toolbar. */\n readonly primary = input(false, {transform: booleanAttribute});\n\n /** Fires for enabled actions only. */\n readonly triggered = output<MmActionEvent<TId>>();\n\n protected readonly reasonId = `mm-action-reason-${nextReasonId++}`;\n protected readonly disabled = computed(() => isActionDisabled(this.action()));\n /** Icon-only needs an icon; without one the button falls back to its text. */\n protected readonly iconOnly = computed(() => this.display() === 'icon' && !!this.action().icon);\n /** Visible text: `menuLabel` (\"Delete dump…\") when set, else the label. */\n protected readonly visibleLabel = computed(() => this.action().menuLabel || this.action().label);\n protected readonly showIcon = computed(() => this.display() !== 'text' && !!this.action().icon);\n protected readonly tooltip = computed(() =>\n this.iconOnly() || this.disabled() ? actionTooltip(this.action()) : null);\n protected readonly ariaLabel = computed(() =>\n this.iconOnly() || this.targetLabel() ? actionAccessibleName(this.action(), this.targetLabel()) : null);\n\n /** Kendo button classes for the link variant (same look as `button[kendoButton]`). */\n protected readonly linkClasses = computed(() => {\n const size = this.context() === 'row' ? 'sm' : 'md';\n const fill = this.primary() && !this.action().danger ? 'solid' : 'flat';\n const theme = this.action().danger ? 'error' : this.primary() ? 'primary' : 'base';\n return ['k-button', `k-button-${size}`, `k-button-${fill}`, `k-button-${theme}`, 'k-rounded-md',\n this.iconOnly() ? 'k-icon-button' : ''].filter(Boolean).join(' ');\n });\n\n protected onClick(event: Event): void {\n if (this.disabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n const action = this.action();\n this.triggered.emit({id: action.id, action});\n }\n}\n","import {CommandItem} from '@meshmakers/shared-services';\nimport {MmAction, MmActionLink} from '../actions/action.model';\n\n/* eslint-disable @typescript-eslint/no-explicit-any -- row callbacks are declared by the host with its own row type */\n\n/**\n * A row action of `mm-list-view` (AB#5572), declared once per list from the shared action model\n * ({@link MmAction}): the per-row parts (`disabledReason`, `visible`, `link`) may be callbacks that\n * receive the row. Rendered with the guideline rules — neutral icon buttons (danger colour only for\n * `danger` actions), tooltip = label, accessible name = label + row name, at most\n * `maxInlineRowActions` slots (default 3; the last one becomes \"More actions for …\"), disabled\n * actions stay focusable and announce their reason.\n *\n * ```ts\n * protected readonly rowActions: MmListRowAction<AdapterDto>[] = [\n * { id: 'edit', label: 'Edit', icon: MM_ACTION_ICONS.edit, link: (row) => ({ commands: ['details', row.rtId] }) },\n * { id: 'delete', label: 'Delete', menuLabel: 'Delete…', icon: MM_ACTION_ICONS.delete, danger: true,\n * disabledReason: (row) => row.deployed ? 'Undeploy the adapter first' : null, run: (row) => this.delete(row) },\n * ];\n * ```\n * ```html\n * <mm-list-view [rowActions]=\"rowActions\" (rowAction)=\"onRowAction($event)\" … />\n * ```\n */\nexport interface MmListRowAction<TRow = any, TId extends string = string>\n extends Omit<MmAction<TId>, 'disabledReason' | 'visible' | 'link'> {\n /** Why the action is unavailable for this row; non-empty = disabled (focusable, announced). */\n disabledReason?: string | null | ((row: TRow) => string | null | undefined);\n /** `false` (or a callback returning false) hides the action for the row. */\n visible?: boolean | ((row: TRow) => boolean);\n /** Navigation target (inline: real router link; overflow menu: Router.navigate relative to the host route). */\n link?: MmActionLink | ((row: TRow) => MmActionLink | null | undefined);\n /** Optional handler; `(rowAction)` fires as well. Destructive handlers confirm first (danger dialog). */\n run?: (row: TRow) => void | Promise<void>;\n}\n\n/** Emitted by `(rowAction)` for an enabled row action. */\nexport interface MmListRowActionEvent<TRow = any, TId extends string = string> {\n id: TId;\n action: MmAction<TId>;\n row: TRow;\n}\n\n/**\n * One row action resolved for a concrete row: the rendered {@link MmAction} plus where it came from —\n * a legacy `CommandItem` (`actionCommandItems`, handled via the CommandItem's link / onClick) or a\n * {@link MmListRowAction} (`rowActions`).\n */\nexport interface ResolvedListRowAction {\n action: MmAction;\n commandItem?: CommandItem;\n rowAction?: MmListRowAction;\n}\n\n/**\n * Human label of a list row (AB#5623) — the row's name in row action names (\"Actions for <label>\"),\n * dialog titles and danger confirmations. Reads `field` (a dotted path such as `contact.displayName`\n * also works, a flat key with dots wins), then each of `fallbacks` (default `rtWellKnownName`,\n * `rtId`); the first non-blank value wins. `''` when none is set.\n */\nexport function resolveListRowLabel(\n row: unknown,\n field: string | null | undefined,\n fallbacks: readonly string[] = ['rtWellKnownName', 'rtId'],\n): string {\n const record = (row ?? {}) as Record<string, unknown>;\n for (const key of field ? [field, ...fallbacks] : fallbacks) {\n const value = readRowPath(record, key);\n if (value !== null && value !== undefined && typeof value !== 'object' && typeof value !== 'function' && String(value).trim() !== '') {\n return String(value);\n }\n }\n return '';\n}\n\nfunction readRowPath(row: Record<string, unknown>, path: string): unknown {\n if (path in row || path.indexOf('.') === -1) {\n return row[path];\n }\n let value: unknown = row;\n for (const key of path.split('.')) {\n if (value === null || value === undefined || typeof value !== 'object') {\n return undefined;\n }\n value = (value as Record<string, unknown>)[key];\n }\n return value;\n}\n\n/** Resolves the per-row callbacks of a {@link MmListRowAction}. */\nexport function resolveListRowAction(definition: MmListRowAction, row: unknown): MmAction {\n const {disabledReason, visible, link, run: _run, ...rest} = definition;\n return {\n ...rest,\n disabledReason: typeof disabledReason === 'function' ? disabledReason(row) ?? null : disabledReason ?? null,\n visible: typeof visible === 'function' ? visible(row) : visible,\n link: typeof link === 'function' ? link(row) ?? undefined : link,\n };\n}\n\n/** Structural equality of two rendered actions (keeps object identity stable across change detection). */\nexport function sameAction(a: MmAction, b: MmAction): boolean {\n return a.id === b.id && a.label === b.label && a.menuLabel === b.menuLabel && a.icon === b.icon\n && !!a.danger === !!b.danger && (a.disabledReason ?? null) === (b.disabledReason ?? null)\n && a.visible === b.visible && !!a.overflow === !!b.overflow && sameLink(a.link, b.link);\n}\n\nfunction sameLink(a: MmActionLink | undefined, b: MmActionLink | undefined): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n return JSON.stringify(a) === JSON.stringify(b);\n}\n","import {Pipe, PipeTransform} from '@angular/core';\n\n@Pipe({\n name: 'bytesToSize'\n})\nexport class BytesToSizePipe implements PipeTransform {\n\n public transform(value: number, decimals = 2): string {\n if (value === 0) {\n return '0 Bytes';\n }\n\n const k = 1024; // oder 1000, falls du SI-Berechnung bevorzugst\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n\n // Bestimme, in welcher Größenordnung der Wert liegt:\n const i = Math.floor(Math.log(value) / Math.log(k));\n\n // Umrechnen und Formatieren\n const result = parseFloat((value / Math.pow(k, i)).toFixed(dm));\n return `${result} ${sizes[i]}`;\n }\n}\n","import { Injectable } from '@angular/core';\nimport cronstrue from 'cronstrue';\nimport 'cronstrue/locales/de.js';\nimport 'cronstrue/locales/en.js';\n\n/**\n * Service for converting cron expressions to human-readable text.\n * Supports multiple locales (EN, DE).\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class CronHumanizerService {\n\n /**\n * Convert a cron expression to human-readable text\n * @param expression The cron expression (5 or 6 fields)\n * @param locale The locale for output ('en' | 'de')\n * @returns Human-readable description or error message\n */\n toHumanReadable(expression: string, locale = 'en'): string {\n if (!expression || expression.trim() === '') {\n return 'No schedule configured';\n }\n\n try {\n return cronstrue.toString(expression, {\n locale: this.normalizeLocale(locale),\n use24HourTimeFormat: true,\n verbose: false\n });\n } catch {\n // Return a friendly error message\n return 'Invalid cron expression';\n }\n }\n\n /**\n * Get a detailed description with additional context\n */\n toDetailedDescription(expression: string, locale = 'en'): {\n summary: string;\n frequency: string;\n timing: string;\n } {\n const summary = this.toHumanReadable(expression, locale);\n\n if (summary === 'Invalid cron expression' || summary === 'No schedule configured') {\n return {\n summary,\n frequency: '-',\n timing: '-'\n };\n }\n\n // Try to extract frequency and timing from the expression\n const parts = expression.trim().split(/\\s+/);\n let frequency = 'Custom';\n let timing = '-';\n\n if (parts.length >= 5) {\n const [second, minute, hour, dayOfMonth, , dayOfWeek] = parts;\n\n // Determine frequency\n if (second.includes('/')) {\n frequency = 'Every few seconds';\n } else if (minute.includes('/')) {\n frequency = 'Every few minutes';\n } else if (hour.includes('/')) {\n frequency = 'Hourly';\n } else if (dayOfMonth !== '*' && dayOfWeek === '*') {\n frequency = 'Monthly';\n } else if (dayOfWeek !== '*') {\n if (dayOfWeek === '1-5') {\n frequency = 'Weekdays';\n } else if (dayOfWeek === '0,6' || dayOfWeek === '6,0') {\n frequency = 'Weekends';\n } else {\n frequency = 'Weekly';\n }\n } else {\n frequency = 'Daily';\n }\n\n // Determine timing\n const hourNum = parseInt(hour, 10);\n const minuteNum = parseInt(minute, 10);\n if (!isNaN(hourNum) && !isNaN(minuteNum)) {\n timing = `${hourNum.toString().padStart(2, '0')}:${minuteNum.toString().padStart(2, '0')}`;\n } else if (hour.includes('/')) {\n timing = 'Recurring';\n }\n }\n\n return { summary, frequency, timing };\n }\n\n /**\n * Check if a locale is supported\n */\n isLocaleSupported(locale: string): boolean {\n const supported = ['en', 'de'];\n return supported.includes(this.normalizeLocale(locale));\n }\n\n /**\n * Get list of supported locales\n */\n getSupportedLocales(): { code: string; name: string }[] {\n return [\n { code: 'en', name: 'English' },\n { code: 'de', name: 'German' }\n ];\n }\n\n private normalizeLocale(locale: string): string {\n const normalized = locale.toLowerCase().split('-')[0];\n // Default to English if locale not supported\n return ['en', 'de'].includes(normalized) ? normalized : 'en';\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n InjectionToken,\n PLATFORM_ID,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n signal\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/** The OctoBot animations shipped with shared-ui (AB#3444). */\nexport type OctoBotAnimation = 'idle' | 'blink' | 'look' | 'swim' | 'thinking' | 'wave';\n\n/**\n * Image loading strategy (`loading` attribute): `lazy` (default) defers the request until the\n * figure nears the viewport; `eager` loads it right away — for places where the figure is visible\n * immediately (empty states, 404 / turned-off pages), so it does not pop in late.\n */\nexport type OctoBotLoading = 'lazy' | 'eager';\n\n/** Rendered sizes: `sm` 60 px, `md` 120 px, `lg` 240 px (square). */\nexport type OctoBotSize = 'sm' | 'md' | 'lg';\n\n/** Pixel edge length of each {@link OctoBotSize}. */\nexport const OCTOBOT_SIZE_PX: Readonly<Record<OctoBotSize, number>> = { sm: 60, md: 120, lg: 240 };\n\n/**\n * Length of one loop of each animation in ms (identical for all sizes; read from the WebP frame\n * durations). Used by `playOnce`.\n */\nexport const OCTOBOT_LOOP_MS: Readonly<Record<OctoBotAnimation, number>> = {\n idle: 1900, blink: 2140, look: 2320, swim: 1750, thinking: 3520, wave: 2210\n};\n\n/**\n * Base URL of the OctoBot images, with a trailing slash. Default `assets/octobot/` (relative to\n * the document base). The files ship as library assets in\n * `node_modules/@meshmakers/shared-ui/assets/octobot`; a host app copies them with an\n * `angular.json` assets entry:\n *\n * ```json\n * { \"glob\": \"**\\/*\", \"input\": \"node_modules/@meshmakers/shared-ui/assets/octobot\", \"output\": \"/assets/octobot\" }\n * ```\n *\n * Provide a different value when the app serves them elsewhere (a CDN, a sub path).\n */\nexport const OCTOBOT_ASSET_BASE_URL = new InjectionToken<string>('OCTOBOT_ASSET_BASE_URL', {\n providedIn: 'root',\n factory: () => 'assets/octobot/'\n});\n\n/**\n * App-wide \"show stills only\" switch, e.g. bound to a user setting \"Reduce animations\". When\n * `true`, every `mm-octobot` shows its still frame regardless of `prefers-reduced-motion`.\n */\nexport const OCTOBOT_FORCE_STILL = new InjectionToken<boolean>('OCTOBOT_FORCE_STILL', {\n providedIn: 'root',\n factory: () => false\n});\n\nconst REDUCED_MOTION_QUERY = '(prefers-reduced-motion: reduce)';\n\n/**\n * `mm-octobot` — the meshmakers OctoBot mascot as a small animated pixel-art image (AB#3444).\n *\n * Renders one `<img>` with a fixed width and height (no layout shift), `loading=\"lazy\"` (or\n * `eager` via the `loading` input),\n * `decoding=\"async\"` and `image-rendering: pixelated`. The image is an 8-frame animated WebP\n * loaded by URL from {@link OCTOBOT_ASSET_BASE_URL} — nothing lands in the JS bundle.\n *\n * **Reduced motion:** while the user prefers reduced motion (`prefers-reduced-motion: reduce`,\n * followed live via `matchMedia`), when {@link OCTOBOT_FORCE_STILL} is `true` or when the `still`\n * input is set, the first frame is shown as a static PNG instead.\n *\n * **Accessibility:** without a `label` the figure is decorative (`alt=\"\"`, `aria-hidden=\"true\"`);\n * the surrounding text must carry the meaning (e.g. \"Thinking…\" next to `thinking`). With a\n * `label` the host gets `role=\"img\"` and `aria-label`.\n *\n * **Placement rules (host responsibility, see `docs/actions.md` › OctoBot):** at most one\n * animated OctoBot per view — empty states (once per page), page loading, the assistant panel,\n * 404 / turned-off pages, onboarding. Never inside repeated elements (list rows, table cells,\n * cockpit tiles, buttons) and never in toasts or error messages (a still frame is acceptable\n * there if a figure is wanted at all).\n *\n * @example\n * ```html\n * <mm-octobot animation=\"idle\" size=\"md\" />\n * <mm-octobot animation=\"thinking\" size=\"sm\" label=\"The assistant is thinking\" />\n * ```\n */\n@Component({\n selector: 'mm-octobot',\n template: `<img\n class=\"mm-octobot__img\"\n [attr.loading]=\"loading()\"\n [src]=\"src()\"\n [attr.width]=\"px()\"\n [attr.height]=\"px()\"\n alt=\"\"\n decoding=\"async\"\n draggable=\"false\" />`,\n styles: [`\n :host {\n display: inline-block;\n flex: none;\n line-height: 0;\n }\n .mm-octobot__img {\n display: block;\n max-width: none;\n image-rendering: pixelated;\n user-select: none;\n }\n `],\n host: {\n 'class': 'mm-octobot',\n '[attr.data-size]': 'size()',\n '[attr.role]': 'label() ? \"img\" : null',\n '[attr.aria-label]': 'label() || null',\n '[attr.aria-hidden]': 'label() ? null : \"true\"',\n '[attr.data-animation]': 'animation()',\n '[attr.data-still]': 'showStill() ? \"true\" : null'\n },\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class OctoBotComponent {\n private readonly baseUrl = inject(OCTOBOT_ASSET_BASE_URL);\n private readonly forceStill = inject(OCTOBOT_FORCE_STILL);\n\n /** Which animation to play. Default `idle`. */\n readonly animation = input<OctoBotAnimation>('idle');\n /** Rendered size. Default `md` (120 px). */\n readonly size = input<OctoBotSize>('md');\n /** Accessible name; when empty the figure is decorative. */\n readonly label = input<string | null | undefined>(null);\n /** Image loading strategy; `eager` where the figure is visible right away. Default `lazy`. */\n readonly loading = input<OctoBotLoading>('lazy');\n /** Show the still frame instead of the animation (e.g. after the assistant finished). */\n readonly still = input(false, { transform: booleanAttribute });\n /**\n * Plays the animation once ({@link OCTOBOT_LOOP_MS}) and then rests on the still frame — for\n * greetings (`wave`) that should not loop forever. The WebPs themselves loop endlessly.\n */\n readonly playOnce = input(false, { transform: booleanAttribute });\n\n private readonly prefersReducedMotion = signal(false);\n private readonly played = signal(false);\n\n protected readonly px = computed(() => OCTOBOT_SIZE_PX[this.size()] ?? OCTOBOT_SIZE_PX.md);\n protected readonly showStill = computed(() => this.still() || this.forceStill || this.prefersReducedMotion() || this.played());\n protected readonly src = computed(() => {\n const base = this.baseUrl.endsWith('/') ? this.baseUrl : `${this.baseUrl}/`;\n const file = this.showStill() ? `octo_${this.animation()}_still.png` : `octo_${this.animation()}.webp`;\n return `${base}${this.size()}/${file}`;\n });\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n // Restart the single loop whenever the animation changes while playOnce is set.\n effect((onCleanup) => {\n const animation = this.animation();\n this.played.set(false);\n if (!this.playOnce()) {\n return;\n }\n const timer = setTimeout(() => this.played.set(true), OCTOBOT_LOOP_MS[animation] ?? 2000);\n onCleanup(() => clearTimeout(timer));\n });\n if (!isPlatformBrowser(inject(PLATFORM_ID)) || typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return;\n }\n const query = window.matchMedia(REDUCED_MOTION_QUERY) as MediaQueryList | undefined;\n if (!query) {\n // Stubbed or partial matchMedia (tests, embedded webviews): keep the animation, no live updates.\n return;\n }\n this.prefersReducedMotion.set(!!query.matches);\n const listener = (event: MediaQueryListEvent): void => this.prefersReducedMotion.set(event.matches);\n query.addEventListener?.('change', listener);\n destroyRef.onDestroy(() => query.removeEventListener?.('change', listener));\n }\n}\n","import { ChangeDetectionStrategy, Component, booleanAttribute, computed, input, output } from '@angular/core';\nimport { ButtonComponent } from '@progress/kendo-angular-buttons';\nimport { OctoBotAnimation, OctoBotComponent, OctoBotSize } from '../octobot/octobot.component';\n\n/**\n * - `empty`: a list or page has no records yet → OctoBot `idle`.\n * - `no-results`: a search or filter matches nothing → OctoBot `look`.\n * - `error`: loading failed → no figure (errors stay sober), `role=\"alert\"`, optional \"Try again\".\n */\nexport type EmptyStateVariant = 'empty' | 'no-results' | 'error';\n\n/** Default English \"Try again\" label of {@link EmptyStateComponent}. */\nexport const DEFAULT_EMPTY_STATE_RETRY_LABEL = 'Try again';\n\n/**\n * `mm-empty-state` — the shared empty / no-results / error block of a page or list (AB#3444).\n *\n * One per page or list, never per row. The `empty` and `no-results` variants show one OctoBot\n * (`idle` / `look`, decorative) above the title; the `error` variant shows no figure and announces\n * itself as an alert. Project extra actions (e.g. \"New data flow\") as content.\n *\n * @example\n * ```html\n * <mm-empty-state heading=\"No data flows yet\" text=\"Create your first data flow to start processing data.\" />\n * <mm-empty-state variant=\"error\" heading=\"The blueprints could not be loaded.\" showRetry (retry)=\"load()\" />\n * ```\n */\n@Component({\n selector: 'mm-empty-state',\n imports: [OctoBotComponent, ButtonComponent],\n template: `\n @if (figure(); as animation) {\n <mm-octobot class=\"mm-empty-state__figure\" [animation]=\"animation\" [size]=\"size()\" loading=\"eager\" />\n }\n <p class=\"mm-empty-state__title\" [attr.role]=\"variant() === 'error' ? 'alert' : null\">{{ heading() }}</p>\n @if (text()) {\n <p class=\"mm-empty-state__text\">{{ text() }}</p>\n }\n @if (variant() === 'error' && showRetry()) {\n <button kendoButton type=\"button\" class=\"mm-empty-state__retry\" (click)=\"retry.emit()\">{{ retryLabel() }}</button>\n }\n <ng-content />\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--theme-space-2, 8px);\n padding: var(--theme-space-6, 24px) var(--theme-space-4, 16px);\n text-align: center;\n color: var(--theme-text-secondary);\n }\n .mm-empty-state__title {\n margin: 0;\n color: var(--theme-text-primary);\n font-weight: 600;\n }\n :host([data-variant='error']) .mm-empty-state__title {\n color: var(--theme-status-error);\n }\n .mm-empty-state__text {\n margin: 0;\n max-width: 48ch;\n }\n .mm-empty-state__retry {\n margin-top: var(--theme-space-1, 4px);\n }\n `],\n host: {\n 'class': 'mm-empty-state',\n '[attr.data-variant]': 'variant()'\n },\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EmptyStateComponent {\n readonly variant = input<EmptyStateVariant>('empty');\n readonly heading = input.required<string>();\n readonly text = input<string | null | undefined>(null);\n /** OctoBot size of the `empty` / `no-results` variants. Default `md`. */\n readonly size = input<OctoBotSize>('md');\n /** Shows the \"Try again\" button (error variant only). */\n readonly showRetry = input(false, { transform: booleanAttribute });\n readonly retryLabel = input<string>(DEFAULT_EMPTY_STATE_RETRY_LABEL);\n /** Emitted by the \"Try again\" button. */\n readonly retry = output<void>();\n\n protected readonly figure = computed<OctoBotAnimation | null>(() => {\n switch (this.variant()) {\n case 'empty': return 'idle';\n case 'no-results': return 'look';\n default: return null;\n }\n });\n}\n","import { PopupRef, PopupService } from '@progress/kendo-angular-popup';\nimport { ChangeDetectionStrategy, Component, ContentChild, ElementRef, EventEmitter, HostBinding, Input, NgZone, Output, TemplateRef, ViewChild, inject, OnDestroy, AfterViewInit, signal } from '@angular/core';\nimport {\n BooleanFilterCellComponent,\n CellClickEvent,\n CellTemplateDirective, CheckboxColumnComponent,\n ColumnComponent, CommandColumnComponent, CustomMessagesComponent,\n DateFilterCellComponent,\n ExcelModule,\n FilterCellTemplateDirective,\n GridComponent,\n GridSpacerComponent,\n NoRecordsTemplateDirective,\n NumericFilterCellComponent,\n PageChangeEvent,\n PagerSettings, PDFModule, SelectableSettings, SelectionEvent,\n StringFilterCellComponent,\n ToolbarTemplateDirective\n} from '@progress/kendo-angular-grid';\nimport {DropDownListComponent, ItemTemplateDirective, ValueTemplateDirective} from '@progress/kendo-angular-dropdowns';\nimport {CompositeFilterDescriptor, FilterDescriptor} from '@progress/kendo-data-query';\nimport {ListViewFiltersDirective} from './list-view-filters.directive';\nimport {BadgeMapping, ColumnDefinition, ContextMenuType, ListViewCommand, ListViewMessages, MmListEmptyContext, MmListEmptyState, resolveListViewMessages, RowClassFn, StatusFieldConfig, StatusIconMapping, TableColumn} from './list-view.model';\nimport {DatePipe, DecimalPipe, NgComponentOutlet, NgTemplateOutlet} from '@angular/common';\nimport {PascalCasePipe} from '../pipes/pascal-case.pipe';\nimport {SeparatorComponent, CheckBoxComponent, NumericTextBoxComponent} from '@progress/kendo-angular-inputs';\nimport {checkIcon, fileExcelIcon, filePdfIcon, filterIcon, filterClearIcon, moreVerticalIcon, slidersIcon, arrowRotateCwIcon, xIcon} from '@progress/kendo-svg-icons';\nimport {MmListViewDataBindingDirective} from '../directives/mm-list-view-data-binding.directive';\nimport {SVGIcon} from '@progress/kendo-svg-icons/dist/svg-icon.interface';\nimport {ButtonComponent, DropDownButtonComponent, SplitButtonComponent} from '@progress/kendo-angular-buttons';\nimport {SVGIconModule} from '@progress/kendo-angular-icons';\nimport {\n ContextMenuComponent, ContextMenuPopupEvent,\n ContextMenuSelectEvent,\n HierarchyBindingDirective,\n MenuItem\n} from '@progress/kendo-angular-menu';\nimport {CommandBaseService, CommandItem, CommandSettingsService} from '@meshmakers/shared-services';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {ActionButtonComponent} from '../actions/action-button.component';\nimport {MM_ROW_ACTIONS_MAX_INLINE, MmAction, isActionDisabled, isActionVisible} from '../actions/action.model';\nimport {\n MmListRowAction,\n MmListRowActionEvent,\n ResolvedListRowAction,\n resolveListRowAction,\n resolveListRowLabel,\n sameAction,\n} from './list-view-row-actions';\nimport {BytesToSizePipe} from '../pipes/bytes-to-size.pipe';\nimport {asyncScheduler, Subject} from 'rxjs';\nimport {debounceTime, distinctUntilChanged, observeOn, takeUntil} from 'rxjs/operators';\nimport {CronHumanizerService} from '../cron-builder/services/cron-humanizer.service';\nimport {EmptyStateComponent} from '../empty-state/empty-state.component';\n\n/** Context/overflow menu class of `CommandItem.danger` items (AB#5570); styled globally in the list-view SCSS. */\nconst DANGER_MENU_ITEM_CLASS = 'mm-list-view-menu-item--danger';\n\n/** Row actions of one row, split for rendering (AB#5572). */\nexport interface RowActionsView {\n inline: ResolvedListRowAction[];\n menu: ResolvedListRowAction[];\n /** The \"…\" button is shown (overflowing actions and/or context menu items). */\n hasMenu: boolean;\n}\n\n/** Marker on overflow-menu items that came from the row actions (not from `contextMenuCommandItems`). */\ninterface OverflowRowActionData {\n mmRowAction: true;\n entry: ResolvedListRowAction;\n}\n\nfunction isOverflowRowActionData(data: unknown): data is OverflowRowActionData {\n return !!data && (data as OverflowRowActionData).mmRowAction === true;\n}\n\n/** Menu text: `menuLabel` (\"Delete…\"), plus the disabled reason (\"Delete… — The adapter is deployed\"). */\nfunction entryMenuText(action: MmAction): string {\n const text = action.menuLabel || action.label;\n return isActionDisabled(action) ? `${text} — ${action.disabledReason!.trim()}` : text;\n}\n\n/** Per-instance prefix of the toolbar disabled-reason ids. */\nlet nextListViewId = 0;\n\nfunction sameEntries(a: ResolvedListRowAction[], b: ResolvedListRowAction[]): boolean {\n return a.length === b.length && a.every((entry, i) =>\n entry.commandItem === b[i].commandItem && entry.rowAction === b[i].rowAction && sameAction(entry.action, b[i].action));\n}\n\n@Component({\n selector: 'mm-list-view',\n imports: [\n GridComponent,\n MmListViewDataBindingDirective,\n ColumnComponent,\n PascalCasePipe,\n ToolbarTemplateDirective,\n GridSpacerComponent,\n ExcelModule,\n PDFModule,\n ButtonComponent,\n DropDownButtonComponent,\n SplitButtonComponent,\n CommandColumnComponent,\n CellTemplateDirective,\n ContextMenuComponent,\n HierarchyBindingDirective,\n CheckboxColumnComponent,\n CheckBoxComponent,\n SeparatorComponent,\n DatePipe,\n DecimalPipe,\n BytesToSizePipe,\n SVGIconModule,\n CustomMessagesComponent,\n FilterCellTemplateDirective,\n StringFilterCellComponent,\n NumericFilterCellComponent,\n BooleanFilterCellComponent,\n DateFilterCellComponent,\n DropDownListComponent,\n ValueTemplateDirective,\n ItemTemplateDirective,\n NumericTextBoxComponent,\n NgComponentOutlet,\n NgTemplateOutlet,\n ActionButtonComponent,\n NoRecordsTemplateDirective,\n EmptyStateComponent\n ],\n templateUrl: './list-view.component.html',\n styleUrl: './list-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ListViewComponent extends CommandBaseService implements OnDestroy, AfterViewInit {\n\n private readonly cronHumanizer = inject(CronHumanizerService);\n private readonly popupService = inject(PopupService);\n\n protected _columns: TableColumn[] = [];\n private _actionCommandItems: CommandItem[] = [];\n private _contextMenuCommandItems: CommandItem[] = [];\n private searchSubject = new Subject<string | null>();\n private destroy$ = new Subject<void>();\n protected searchValue = '';\n private _selectedRows: unknown[] = [];\n // action menu (button)\n private _actionMenuSelectedRow: unknown | null = null;\n\n // context menu (right click)\n private _contextMenuSelectedRow: unknown | null = null;\n\n protected _actionMenuItems: MenuItem[] = [];\n private _rowActions: readonly MmListRowAction[] = [];\n /** Per-row resolved actions; identical results keep their identity (no NG0100, no re-render churn). */\n private rowActionCache = new WeakMap<object, RowActionsView>();\n private readonly activatedRoute = inject(ActivatedRoute, {optional: true});\n private readonly routerForActions = inject(Router, {optional: true});\n protected _contextMenuItems: MenuItem[] = [];\n protected _showRowFilter = false;\n\n /** Indicates if the data source is currently loading data */\n protected isLoading = signal(false);\n\n /**\n * Whether the data source reported \"not loading\" at least once (AB#3444). {@link isLoading}\n * follows the data source one macrotask late (asyncScheduler), so the first render would\n * otherwise show the empty state while the first fetch is already in flight.\n */\n protected readonly loadSettled = signal(false);\n\n /**\n * The component's own width in pixels, kept current via ResizeObserver.\n * `null` until the first measurement (before that, all columns render visible\n * and auto-sized). Drives `hideBelow` column hiding and `minWidth` pinning.\n */\n protected readonly containerWidth = signal<number | null>(null);\n private readonly hostElement = inject(ElementRef<HTMLElement>);\n private readonly ngZone = inject(NgZone);\n private resizeObserver?: ResizeObserver;\n\n /** Never auto-page below this many rows, even in a tiny viewport. */\n private static readonly MIN_AUTO_PAGE_SIZE = 5;\n\n /**\n * Minimum change (in rows) before an already-measured `autoPageSize` is\n * re-applied. Rows can vary in height (component cells such as sparklines,\n * wrapping text) so the derived fit-to-height count jitters by ±1 as the user\n * pages through content. Without this dead-band every page change would\n * re-derive the page size and fire an extra fetch with a realigned `skip`,\n * overlapping the page the user actually navigated to. The very first\n * measurement always applies (it converts the initial default into the fitted\n * size); genuine resizes/density changes move by more than this threshold.\n */\n private static readonly AUTO_PAGE_SIZE_HYSTERESIS = 2;\n\n /** Measured fit-to-height page size (`autoPageSize`); null until the first measurement. */\n private readonly autoPageSizeValue = signal<number | null>(null);\n /** Last measured row height — reused while a page renders no rows (e.g. empty filter result). */\n private lastMeasuredRowHeight: number | null = null;\n private readonly autoPageSizeRecompute$ = new Subject<void>();\n\n /**\n * Host-supplied scope/filter controls, rendered in the toolbar rather than in\n * a strip of their own above the grid — see ListViewFiltersDirective.\n */\n @ContentChild(ListViewFiltersDirective) protected filtersTemplate?: ListViewFiltersDirective;\n\n @ViewChild(GridComponent) private gridComponent?: GridComponent;\n @ViewChild(MmListViewDataBindingDirective) private dataBindingDirective?: MmListViewDataBindingDirective;\n @ViewChild('gridmenu') public gridContextMenu?: ContextMenuComponent;\n\n @Output() rowClicked = new EventEmitter<unknown[]>();\n\n @Input() public pageSize = 20;\n @Input() public skip = 0;\n\n /**\n * Fit-to-height paging: when enabled, the page size is derived from the grid's\n * available content height and the measured row height, so a page always fills\n * the viewport instead of leaving a half-empty grid with a detached pager on\n * large screens. The pager's page-size dropdown is hidden (a manual choice\n * would be overridden on the next resize). `pageSize` serves as the initial\n * page size until the first measurement; the minimum auto page size is 5.\n */\n @Input() public autoPageSize = false;\n @Input() public rowIsClickable = true;\n @Input() public showRowCheckBoxes = true;\n @Input() public showRowSelectAllCheckBox = true;\n @Input() public contextMenuType: ContextMenuType = 'actionMenu';\n\n @Input() public leftToolbarActions: CommandItem[] = [];\n @Input() public rightToolbarActions: CommandItem[] = [];\n\n public get actionCommandItems(): CommandItem[] {\n return this._actionCommandItems;\n }\n\n @Input() public set actionCommandItems(commandItems: CommandItem[]) {\n console.debug('actionCommandItems setter called', commandItems);\n this._actionCommandItems = commandItems;\n this._actionMenuItems = this.buildMenuItems(commandItems);\n console.debug('_actionMenuItems built', this._actionMenuItems);\n }\n\n public get contextMenuCommandItems(): CommandItem[] {\n return this._contextMenuCommandItems;\n }\n\n @Input() public set contextMenuCommandItems(commandItems: CommandItem[]) {\n this._contextMenuCommandItems = commandItems;\n this._contextMenuItems = this.buildMenuItems(commandItems);\n }\n\n /**\n * Row actions from the shared action model (AB#5572) — preferred over `actionCommandItems`.\n * Rendered after the `actionCommandItems` (which keep working through an adapter); together they\n * get at most {@link maxInlineRowActions} slots, the rest goes into the row's overflow menu.\n */\n @Input() public set rowActions(actions: readonly MmListRowAction[] | null | undefined) {\n this._rowActions = actions ?? [];\n this.rowActionCache = new WeakMap();\n }\n\n public get rowActions(): readonly MmListRowAction[] {\n return this._rowActions;\n }\n\n /**\n * Row action slots incl. the overflow (\"…\") button (guideline §2.2: 3). When the actions do not\n * fit, the last slot opens the overflow menu with the remaining actions and the context menu items.\n */\n @Input() public maxInlineRowActions = MM_ROW_ACTIONS_MAX_INLINE;\n\n /** An enabled {@link rowActions} action was triggered (inline or from the overflow menu). */\n @Output() public rowAction = new EventEmitter<MmListRowActionEvent>();\n\n @Input() public excelExportFileName = 'Export.xlsx';\n @Input() public pdfExportFileName = 'Export.pdf';\n @Input() public pageable: PagerSettings = {\n buttonCount: 5,\n info: true,\n type: 'numeric',\n pageSizes: [5, 10, 20, 50, 100],\n previousNext: true\n };\n @Input() public sortable = false;\n @Input() public rowFilterEnabled = false;\n @Input() public searchTextBoxEnabled = false;\n\n /**\n * Persist the user's sort/row-filter/page across visits (localStorage) so they\n * are not re-applied every time. On by default. Set `false` to opt a list out\n * (e.g. a transient/embedded list where a remembered filter would confuse).\n */\n @Input() public persistListState = true;\n\n /**\n * Storage key for {@link persistListState}. Defaults to the current route path\n * (without query string), which is stable per list page. Set an explicit key\n * when two lists share a route, or to keep the stored state stable across a\n * route rename.\n */\n @Input() public listStateKey?: string;\n\n private readonly routerRef = inject(Router);\n\n /**\n * Resolves the effective storage key for this list, or `null` when\n * persistence is disabled. Used by {@link MmListViewDataBindingDirective}.\n */\n public resolveListStateKey(): string | null {\n if (!this.persistListState) {\n return null;\n }\n if (this.listStateKey) {\n return this.listStateKey;\n }\n const path = (this.routerRef.url ?? '').split('?')[0].split('#')[0];\n return path || null;\n }\n\n /** The page size the grid actually uses: the measured fit-to-height value in `autoPageSize` mode, `pageSize` otherwise. */\n protected effectivePageSize(): number {\n return (this.autoPageSize ? this.autoPageSizeValue() : null) ?? this.pageSize;\n }\n\n private _cachedAutoPageable?: { source: PagerSettings; result: PagerSettings };\n\n /** Pager settings the grid uses; in `autoPageSize` mode the page-size dropdown is stripped. Cached per source object to keep the input reference stable across change detection. */\n protected get effectivePageable(): PagerSettings {\n if (!this.autoPageSize) {\n return this.pageable;\n }\n if (this._cachedAutoPageable?.source !== this.pageable) {\n this._cachedAutoPageable = {\n source: this.pageable,\n result: {...this.pageable, pageSizes: false}\n };\n }\n return this._cachedAutoPageable.result;\n }\n\n /** Whether users can resize columns by dragging the header edges. */\n @Input() public resizable = true;\n\n /**\n * Width in pixels of the trailing actions command column. The default fits the\n * historical five-button layouts; lists with only an edit button plus the\n * context-menu trigger should pass something around 100.\n */\n @Input() public actionsColumnWidth = 220;\n\n /**\n * Floor for the actions column HEADER. The header is a translated word, and\n * at the grid's header font \"Actions\" needs 73px once the cell's padding is\n * counted, German \"Aktionen\" 83px, Spanish \"Acciones\" 82px.\n */\n private static readonly MIN_ACTIONS_HEADER_WIDTH = 90;\n\n /** Measured geometry of one flat icon button in a command cell. */\n private static readonly ACTION_BUTTON_WIDTH = 36;\n private static readonly ACTION_BUTTON_GAP = 6;\n private static readonly COMMAND_CELL_PADDING = 21;\n\n /**\n * Buttons the actions cell can render at once: one per non-separator action\n * item, plus the context-menu button when that menu is shown inline. Item\n * visibility is evaluated per row, so this is the worst case — which is the\n * case the column has to be wide enough for.\n */\n private get maxActionButtons(): number {\n const candidates = this._actionMenuItems.filter(item => !item.separator).length +\n this._rowActions.filter(a => !a.overflow).length;\n const forcedMenu = this.hasContextMenuButton || this._rowActions.some(a => a.overflow);\n const slots = Math.max(1, Math.floor(this.maxInlineRowActions));\n if (!forcedMenu && candidates <= slots) {\n return candidates;\n }\n return Math.min(candidates, slots - 1) + 1;\n }\n\n /** The context menu is opened from the row's \"…\" button (not by right click). */\n private get hasContextMenuButton(): boolean {\n return this._contextMenuCommandItems.length > 0 && this.contextMenuType === 'actionMenu';\n }\n\n /** The list renders an actions column / card actions at all. */\n protected get hasRowActions(): boolean {\n return this._actionMenuItems.length > 0 || this._rowActions.length > 0 || this.hasContextMenuButton;\n }\n\n /**\n * The actions column width actually used.\n *\n * A host sizes this by eye and gets it wrong in both directions: too narrow\n * for the header (three Studio lists passed 70 and rendered \"ACTIO…\") or too\n * narrow for the buttons (the same 70, and even a 90 that fits the header,\n * clipped the third button off an archives row). Both floors are computed\n * rather than guessed, so the column always fits its own content.\n */\n protected get effectiveActionsColumnWidth(): number {\n const buttons = this.maxActionButtons;\n const contentWidth = buttons === 0\n ? 0\n : ListViewComponent.COMMAND_CELL_PADDING +\n buttons * ListViewComponent.ACTION_BUTTON_WIDTH +\n (buttons - 1) * ListViewComponent.ACTION_BUTTON_GAP;\n\n return Math.max(\n this.actionsColumnWidth,\n ListViewComponent.MIN_ACTIONS_HEADER_WIDTH,\n contentWidth,\n );\n }\n\n /**\n * Hides the row-checkbox column while the list view is narrower than this many\n * pixels — on phone-sized layouts multi-select via checkboxes is impractical and\n * the 40px are better spent on the data columns. Pass `null` to always show them.\n */\n @Input() public hideCheckboxesBelow: number | null = 600;\n\n /**\n * Compact-toolbar breakpoint: below this component width the host gets the\n * `mm-list-view-narrow` class, which wraps the grid toolbar and stretches the\n * search input to a full row instead of stacking every control vertically.\n */\n @HostBinding('class.mm-list-view-narrow')\n protected get isNarrow(): boolean {\n const width = this.containerWidth();\n return width !== null && width < 600;\n }\n\n /**\n * Card mode (AB#4930): below this component width the rows render as\n * stacked cards instead of a horizontally scrolling table — the first\n * column becomes the card title, every other column a labeled line\n * (empty values are skipped, `hideBelow` is ignored because cards have\n * vertical room), and the actions-column buttons move into the card\n * header. Sorting headers and the row filter are unavailable while cards\n * are active; the toolbar search and quick-view bars keep working.\n * `null` (the default) keeps the table at every width.\n */\n @Input() public cardModeBelow: number | null = null;\n\n /**\n * Below this component width the toolbar's command buttons (row filter,\n * exports, reset, refresh) collapse into a single overflow menu. Above it\n * they stay laid out, because reaching a command in one click beats hiding\n * it behind a menu whenever there is room.\n *\n * Measured against the component's OWN width, not the viewport: expanding or\n * collapsing the app drawer changes the space a list has by ~240px without\n * the window ever resizing.\n */\n @Input() public collapseCommandsBelow = 900;\n\n /**\n * Tells the list that the host holds filters of its own (quick-view bars,\n * app-side field filters) that a reset would clear. The toolbar's reset\n * button only shows while something is filtered, and the list cannot see\n * those host filters by itself.\n */\n @Input() public hasExternalFilters = false;\n\n /**\n * Empty state of the list (AB#3444): when set, a list without records shows the shared\n * `mm-empty-state` — one OctoBot `idle` with {@link MmListEmptyState.title} / `text` — instead\n * of the plain \"No records available.\" line; while a search, row filter or host filter\n * ({@link hasExternalFilters}) is active it shows OctoBot `look` with the \"no results\" texts.\n * Nothing is shown while the list loads (including before the first fetch answered). The figure appears once per list, never in rows.\n */\n @Input() public emptyState: MmListEmptyState | null = null;\n\n /**\n * Fully custom empty state (wins over {@link emptyState}). Context: `$implicit` / `filtered`\n * is `true` while a search or filter is active.\n */\n @Input() public emptyTemplate: TemplateRef<MmListEmptyContext> | null = null;\n\n /**\n * Whether a search, row filter or host filter narrows the rows right now (sorting does not),\n * i.e. an empty list means \"no results\" rather than \"no records yet\".\n */\n protected get isFiltered(): boolean {\n if (this.hasExternalFilters || this.searchValue.trim().length > 0) {\n return true;\n }\n return (this.dataBindingDirective?.currentState?.filter?.filters?.length ?? 0) > 0;\n }\n\n protected get emptyContext(): MmListEmptyContext {\n const filtered = this.isFiltered;\n return { $implicit: filtered, filtered };\n }\n\n /**\n * Whether anything narrows or reorders the default view right now: a row\n * filter, a column sort, free-text search, or host-side filters announced\n * through {@link hasExternalFilters}. Paging is deliberately not counted —\n * the pager already gets back to page 1.\n */\n protected get hasActiveFilters(): boolean {\n if (this.hasExternalFilters || this.searchValue.trim().length > 0) {\n return true;\n }\n const state = this.dataBindingDirective?.currentState;\n if (!state) {\n return false;\n }\n const hasRowFilter = (state.filter?.filters?.length ?? 0) > 0;\n const hasSort = (state.sort ?? []).some(descriptor => !!descriptor.dir);\n return hasRowFilter || hasSort;\n }\n\n /** True while the command buttons are collapsed into the overflow menu. */\n protected get commandsCollapsed(): boolean {\n const width = this.containerWidth();\n return width !== null && width < this.collapseCommandsBelow;\n }\n\n /**\n * The commands available right now, in toolbar order. The row filter is\n * omitted in card mode: cards have no column headers for a filter row to\n * appear in, and the grid already drops `filterable` there — leaving the\n * button visible offered to toggle something that cannot exist. Reset shows\n * only while something is actually filtered, sorted or searched (see\n * {@link hasActiveFilters}); on the default view there is nothing to reset,\n * so the button would only be noise. It is independent of card mode, so a\n * filter set before the switch can still be cleared.\n */\n protected get toolbarCommands(): ListViewCommand[] {\n const commands: ListViewCommand[] = [];\n if (this.rowFilterEnabled && !this.isCardMode) {\n commands.push({ id: 'rowFilter', text: this._messages.showRowFilter, svgIcon: this.filterIcon });\n }\n commands.push(\n { id: 'excel', text: this._messages.exportToExcel, svgIcon: this.excelSVG },\n { id: 'pdf', text: this._messages.exportToPdf, svgIcon: this.pdfSVG },\n );\n if (this.hasActiveFilters) {\n commands.push({ id: 'reset', text: this._messages.resetFilters, svgIcon: this.resetFilterIcon });\n }\n commands.push({ id: 'refresh', text: this._messages.refreshData, svgIcon: this.refreshIcon });\n return commands;\n }\n\n /**\n * Runs a command by id. Excel and PDF are driven by Kendo's own\n * `kendoGridExcelCommand` / `kendoGridPDFCommand` directives when the buttons\n * are laid out; from the overflow menu there is no directive to attach to, so\n * the grid API is called directly.\n */\n protected onCommand(id: string): void {\n switch (id) {\n case 'rowFilter': this.onShowRowFilter(); break;\n case 'excel': this.gridComponent?.saveAsExcel(); break;\n case 'pdf': this.gridComponent?.saveAsPDF(); break;\n case 'reset': this.onReset(); break;\n case 'refresh': this.onRefresh(); break;\n }\n }\n\n @HostBinding('class.mm-list-view-cards')\n protected get isCardMode(): boolean {\n const width = this.containerWidth();\n return this.cardModeBelow !== null && width !== null && width < this.cardModeBelow;\n }\n\n /** First column = the card's title/identity line (AB#4930). */\n protected get cardTitleColumn(): TableColumn | null {\n return this._columns.length > 0 ? this._columns[0] : null;\n }\n\n /** Every column after the title one — the card's labeled body lines. */\n protected get cardBodyColumns(): TableColumn[] {\n return this._columns.slice(1);\n }\n\n /** Empty values render no body line, so cards stay tight (AB#4930). */\n protected hasCardValue(element: Record<string, unknown>, column: TableColumn): boolean {\n if (column.dataType === 'statusIcons') {\n return this.getStatusFields(column).some(\n (fieldConfig) => !!this.getStatusIconMapping(element, fieldConfig)\n );\n }\n if (column.formatter) {\n return !!this.getFormattedValue(element, column);\n }\n const value = this.getValue(element, column);\n return value !== null && value !== undefined && value !== '';\n }\n\n /**\n * Callback for applying CSS classes to grid rows based on row data.\n * Passed through to Kendo Grid's [rowClass] input.\n */\n @Input() public rowClass: RowClassFn | undefined;\n\n protected readonly defaultRowClass: RowClassFn = () => ({});\n\n protected _messages: Required<ListViewMessages> = resolveListViewMessages(undefined);\n\n /**\n * Translated messages. Partial: members that are not supplied (or are `undefined`) keep the\n * English default from `DEFAULT_LIST_VIEW_MESSAGES`.\n */\n @Input() public set messages(value: Partial<ListViewMessages> | null | undefined) {\n this._messages = resolveListViewMessages(value);\n }\n\n public get messages(): Required<ListViewMessages> {\n return this._messages;\n }\n\n @Input() public selectable: SelectableSettings = {\n enabled: false\n };\n\n @Input() public set columns(cols: ColumnDefinition[]) {\n if (cols === null || cols === undefined || cols.length === 0) {\n this._columns = [];\n return;\n }\n\n this._columns = [];\n\n for (const column of cols) {\n if (typeof column === 'string') {\n this._columns.push({field: column, dataType: 'text'});\n } else {\n this._columns.push(column);\n }\n }\n }\n\n public get columns(): TableColumn[] {\n return this._columns;\n }\n\n constructor() {\n const commandSettingsService = inject(CommandSettingsService);\n const router = inject(Router);\n\n super(commandSettingsService, router);\n\n // Setup debounce for search\n this.searchSubject.pipe(\n debounceTime(500), // Wait 500 ms after last input\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n ).subscribe((value) => {\n this.onExecuteFilter.emit(value);\n });\n\n // Debounced fit-to-height recomputation (resize bursts, load-completions)\n this.autoPageSizeRecompute$.pipe(\n debounceTime(150),\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.recomputeAutoPageSize();\n });\n }\n\n ngAfterViewInit(): void {\n // Subscribe to loading state from the data binding directive.\n // Use asyncScheduler to defer each emission to a separate macrotask,\n // preventing the signal from changing during Angular's CD verify pass\n // (which causes NG0100 when Apollo returns cached data quickly).\n if (this.dataBindingDirective) {\n this.dataBindingDirective.isLoading$.pipe(\n observeOn(asyncScheduler),\n takeUntil(this.destroy$)\n ).subscribe(loading => {\n this.isLoading.set(loading);\n if (!loading) {\n this.loadSettled.set(true);\n }\n // Measure the fit-to-height page size only ONCE, when data first\n // renders (initial default → fitted). After that, page-size changes come\n // solely from the ResizeObserver (genuine viewport/density changes).\n // Re-measuring after every load would let per-page row-height\n // differences (wrapping descriptions, sparklines) re-derive the page\n // size mid-navigation, firing a second fetch that realigns `skip` and\n // overlaps the page the user just opened.\n if (!loading && this.autoPageSize && this.autoPageSizeValue() === null) {\n this.autoPageSizeRecompute$.next();\n }\n });\n }\n\n // Track the component's own width for hideBelow/minWidth column behavior.\n // The callback fires outside the Angular zone; re-enter it so the signal\n // update schedules change detection for this OnPush component.\n if (typeof ResizeObserver !== 'undefined') {\n const hostNative = this.hostElement.nativeElement;\n this.resizeObserver = new ResizeObserver(entries => {\n let hostWidth: number | undefined;\n let resized = false;\n for (const entry of entries) {\n resized = true;\n if (entry.target === hostNative) {\n hostWidth = entry.contentRect.width;\n }\n }\n this.ngZone.run(() => {\n if (hostWidth !== undefined) {\n this.containerWidth.set(hostWidth);\n }\n if (resized && this.autoPageSize) {\n this.autoPageSizeRecompute$.next();\n }\n });\n });\n this.resizeObserver.observe(hostNative);\n\n // The grid content viewport shrinks/grows independently of the host\n // (toolbar wrap, filter row toggle) — observe it too in auto mode.\n if (this.autoPageSize) {\n const content = hostNative.querySelector('.k-grid-content');\n if (content) {\n this.resizeObserver.observe(content);\n }\n }\n }\n }\n\n /**\n * Measures the grid's content viewport and the rendered row height, derives the\n * number of rows that fit and applies it as the new page size (grid + query state)\n * when it differs from the current one. No-op until a row has been rendered at\n * least once (there is nothing to measure on a fully empty grid).\n */\n private recomputeAutoPageSize(): void {\n if (!this.autoPageSize) {\n return;\n }\n const content = this.hostElement.nativeElement.querySelector('.k-grid-content');\n if (!content) {\n return;\n }\n // Measure the TALLEST rendered row, not just the first one. Rows in a list\n // can vary greatly in height (component cells such as sparklines / last-run,\n // wrapping descriptions), and the first row's height differs from page to\n // page. Measuring only the first row made the derived page size swing\n // between pages; keying off the tallest row keeps it stable and guarantees\n // a full page never overflows into a scrollbar.\n let measuredRowHeight = 0;\n content.querySelectorAll('tbody tr').forEach((row: HTMLElement) => {\n const height = row.getBoundingClientRect().height;\n if (height > measuredRowHeight) {\n measuredRowHeight = height;\n }\n });\n const rowHeight = measuredRowHeight || this.lastMeasuredRowHeight;\n if (!rowHeight || content.clientHeight <= 0) {\n return;\n }\n this.lastMeasuredRowHeight = rowHeight;\n const take = Math.max(ListViewComponent.MIN_AUTO_PAGE_SIZE, Math.floor(content.clientHeight / rowHeight));\n const current = this.effectivePageSize();\n if (take === current) {\n return;\n }\n // After the first measurement, ignore small (±1) changes: they come from\n // per-page row-height jitter, and applying them would fire an extra fetch\n // that realigns `skip` and overlaps the page the user just opened. Genuine\n // resizes/density changes exceed the hysteresis band and still apply.\n if (this.autoPageSizeValue() !== null &&\n Math.abs(take - current) < ListViewComponent.AUTO_PAGE_SIZE_HYSTERESIS) {\n return;\n }\n this.autoPageSizeValue.set(take);\n this.dataBindingDirective?.applyPageSize(take);\n }\n\n ngOnDestroy(): void {\n this.closeToolbarHint();\n this.resizeObserver?.disconnect();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * CSS class carrying the column's `align` to its header and body cells\n * (`mm-col-align-right` …); empty for the default start alignment so the\n * grid's own cell classes stay untouched.\n */\n protected alignClass(column: TableColumn): string {\n return column.align ? `mm-col-align-${column.align}` : '';\n }\n\n /**\n * Below this column width the date and numeric row-filter cells render\n * compact (see `isCompactFilter`). Kendo's date filter cell is a date picker\n * plus an operator picker: in a 120px column the calendar toggle (33px) and\n * the operator (34px) leave the date input 35px — three characters of a\n * dd.MM.yyyy. The threshold is the width at which the full cell fits.\n */\n private static readonly COMPACT_FILTER_BELOW = 180;\n\n /**\n * Whether the column's row-filter cell drops its secondary controls — the\n * calendar toggle of a date filter (Alt+Down still opens the calendar, the\n * masked input stays), the spinners of a numeric filter — and tightens its\n * padding, because the column is narrower than `COMPACT_FILTER_BELOW`.\n * Auto-sized columns without a width are never compact.\n */\n protected isCompactFilter(column: TableColumn): boolean {\n const width = this.getEffectiveWidth(column);\n return width !== undefined && width < ListViewComponent.COMPACT_FILTER_BELOW;\n }\n\n /** Whether the column is hidden at the current component width (`hideBelow`). */\n protected isColumnHidden(column: TableColumn): boolean {\n const width = this.containerWidth();\n return width !== null && column.hideBelow !== undefined && width < column.hideBelow;\n }\n\n /** Whether the row-checkbox column is rendered (selection enabled AND above `hideCheckboxesBelow`). */\n protected showCheckboxColumn(): boolean {\n if (!this.showRowCheckBoxes || !this.selectable.enabled) {\n return false;\n }\n if (this.isCardMode) {\n // Cards keep their checkbox: the compact layout leaves room for it and\n // the selection-dependent toolbar actions stay usable on phones.\n return true;\n }\n const width = this.containerWidth();\n return this.hideCheckboxesBelow === null || width === null || width >= this.hideCheckboxesBelow;\n }\n\n /**\n * Resolves the width passed to the Kendo column. Fixed-width columns keep their\n * configured width. Auto columns normally stay auto (undefined) so they stretch into\n * the remaining space — but once the space left over per auto column drops below the\n * column's `minWidth`, the column is pinned to `minWidth`. The grid's total width then\n * exceeds the container and Kendo shows a horizontal scrollbar instead of silently\n * collapsing the auto columns to zero.\n */\n protected getEffectiveWidth(column: TableColumn): number | undefined {\n if (column.width !== undefined) {\n return column.width;\n }\n if (column.minWidth === undefined) {\n return undefined;\n }\n const containerWidth = this.containerWidth();\n if (containerWidth === null) {\n return undefined;\n }\n\n const visibleColumns = this._columns.filter(c => !this.isColumnHidden(c));\n let fixedWidth = visibleColumns.reduce((sum, c) => sum + (c.width ?? 0), 0);\n if (this.showCheckboxColumn()) {\n fixedWidth += this.checkboxColumnWidth;\n }\n if (this.hasRowActions) {\n fixedWidth += this.effectiveActionsColumnWidth;\n }\n\n const autoColumns = visibleColumns.filter(c => c.width === undefined);\n const widthPerAutoColumn = (containerWidth - fixedWidth) / Math.max(autoColumns.length, 1);\n return widthPerAutoColumn < column.minWidth ? column.minWidth : undefined;\n }\n\n // Wide enough for the largest density tier: at an 18px root font the cell\n // carries 13.5px padding per side plus an 18px checkbox (= 45px). At 40px\n // the cell overflowed and Kendo's ellipsis rendered a stray \"…\" next to\n // every checkbox on xlarge density.\n protected readonly checkboxColumnWidth = 48;\n\n /** Compact checkbox gutter in card mode — the card sits right next to it (AB#4930). */\n protected get effectiveCheckboxColumnWidth(): number {\n return this.isCardMode ? 32 : this.checkboxColumnWidth;\n }\n\n protected getDisplayName(column: TableColumn): string {\n return column.displayName ?? column.field;\n }\n\n protected getIsDisabled(commandItem: CommandItem, dataItem?: unknown): boolean {\n return CommandBaseService.getIsDisabled(commandItem, dataItem);\n }\n\n /**\n * Toolbar variant of {@link getIsDisabled}: an `isDisabled` callback receives\n * the current checkbox selection (always an array of row items, possibly\n * empty), so selection-dependent toolbar actions can disable themselves\n * until rows are selected — instead of answering an empty-selection click\n * with a hint message.\n */\n protected getToolbarItemDisabled(commandItem: CommandItem): boolean {\n return CommandBaseService.getIsDisabled(commandItem, this._selectedRows);\n }\n\n /**\n * Toolbar emphasis (AB#6211, action guideline §9): host toolbar actions are flat and neutral;\n * only an item flagged `primary` renders as the solid primary button. The page's one primary\n * action belongs in the page header, so the flag is for lists without one.\n */\n protected toolbarItemThemeColor(commandItem: CommandItem): 'primary' | 'base' {\n return commandItem.primary ? 'primary' : 'base';\n }\n\n /** Fill mode of a host toolbar action: the item's own `fillMode`, else solid for `primary`, flat otherwise. */\n protected toolbarItemFillMode(commandItem: CommandItem): NonNullable<CommandItem['fillMode']> {\n return commandItem.fillMode ?? (commandItem.primary ? 'solid' : 'flat');\n }\n\n /**\n * Why a disabled toolbar action cannot run (AB#6211, guideline §2.5), or `null`. Only for items\n * with a `disabledReason` (a callback receives the current selection); such a button stays\n * focusable (`aria-disabled`) and announces the reason. Without a reason the button is plainly\n * `disabled` as before.\n */\n protected toolbarItemDisabledReason(commandItem: CommandItem): string | null {\n if (!commandItem.disabledReason || !this.getToolbarItemDisabled(commandItem)) {\n return null;\n }\n const reason = typeof commandItem.disabledReason === 'function'\n ? commandItem.disabledReason(this._selectedRows)\n : commandItem.disabledReason;\n return reason?.trim() ? reason.trim() : null;\n }\n\n private readonly toolbarReasonPrefix = `mm-list-view-toolbar-reason-${nextListViewId++}`;\n\n /**\n * Id of the element carrying a toolbar action's disabled reason: unique per list instance,\n * toolbar band and position (ids of host items may repeat between the bands).\n */\n protected toolbarReasonId(side: 'left' | 'right', index: number): string {\n return `${this.toolbarReasonPrefix}-${side}-${index}`;\n }\n\n /** Tooltip of a host toolbar action: `tooltip` or `text`, plus \" — reason\" while disabled with a reason. */\n protected toolbarItemTitle(commandItem: CommandItem, reason: string | null): string {\n const label = commandItem.tooltip ?? commandItem.text ?? '';\n return reason ? `${label} — ${reason}` : label;\n }\n\n @ViewChild('toolbarHint', {static: true}) private toolbarHintTemplate?: TemplateRef<unknown>;\n /** Text of the open focus hint (read by the hint template). */\n protected readonly toolbarHintText = signal('');\n private toolbarHintRef: PopupRef | null = null;\n private toolbarPointerFocus = false;\n\n /** A pointer press precedes the focus: no hint (keyboard focus only, like :focus-visible). */\n protected onToolbarPointerDown(): void {\n this.toolbarPointerFocus = true;\n }\n\n /**\n * Keyboard focus on a toolbar action disabled with a reason (AB#6211, guideline §2.5): shows the\n * reason as a hint below the control. Rendered through the PopupService under the application\n * root (not inside the grid, whose toolbar clips overflow); closed on blur and Escape.\n */\n protected onToolbarFocusIn(event: FocusEvent, reason: string | null): void {\n const pointer = this.toolbarPointerFocus;\n this.toolbarPointerFocus = false;\n this.closeToolbarHint();\n const anchor = event.target as HTMLElement | null;\n if (!reason || pointer || !anchor || !this.toolbarHintTemplate) {\n return;\n }\n this.toolbarHintText.set(reason);\n this.toolbarHintRef = this.popupService.open({\n anchor,\n content: this.toolbarHintTemplate,\n anchorAlign: {horizontal: 'left', vertical: 'bottom'},\n popupAlign: {horizontal: 'left', vertical: 'top'},\n margin: {horizontal: 0, vertical: 4},\n popupClass: 'mm-list-view-toolbar-hint-popup',\n animate: false,\n });\n }\n\n /** Closes the focus hint (blur, Escape, destroy). */\n protected closeToolbarHint(): void {\n this.toolbarHintRef?.close();\n this.toolbarHintRef = null;\n }\n\n /**\n * Accessible name of a host toolbar action. A button with a visible text is named by that\n * text; an icon-only one (no text) gets its tooltip as `aria-label`, because `title` alone is\n * not reliably announced (action guideline §2.2: icon-only = tooltip + aria-label).\n */\n protected toolbarItemAriaLabel(commandItem: CommandItem): string | null {\n if (commandItem.text?.trim()) {\n return null;\n }\n return commandItem.tooltip?.trim() ? commandItem.tooltip : null;\n }\n\n private readonly buttonAttributesCache = new Map<string, Record<string, string>>();\n private static readonly NO_BUTTON_ATTRIBUTES: Record<string, string> = {};\n\n /**\n * `buttonAttributes` for Kendo split / dropdown buttons: the accessible name (same rule as\n * {@link toolbarItemAriaLabel}) and, while disabled with a reason, `aria-disabled` +\n * `aria-describedby`. Cached per combination so change detection sees a stable object.\n */\n protected toolbarItemButtonAttributes(commandItem: CommandItem, reasonId: string | null = null): Record<string, string> {\n const label = this.toolbarItemAriaLabel(commandItem);\n if (!reasonId) {\n return label ? this.ariaLabelAttributes(label) : ListViewComponent.NO_BUTTON_ATTRIBUTES;\n }\n const key = `${label ?? ''}\\u0000${reasonId}`;\n let attributes = this.buttonAttributesCache.get(key);\n if (!attributes) {\n attributes = { ...(label ? { 'aria-label': label } : {}), 'aria-disabled': 'true', 'aria-describedby': reasonId };\n this.buttonAttributesCache.set(key, attributes);\n }\n return attributes;\n }\n\n /** `buttonAttributes` of the icon-only menu the commands collapse into. */\n protected get commandsMenuButtonAttributes(): Record<string, string> {\n return this.ariaLabelAttributes(this._messages.commands);\n }\n\n private ariaLabelAttributes(label: string): Record<string, string> {\n let attributes = this.buttonAttributesCache.get(label);\n if (!attributes) {\n attributes = { 'aria-label': label };\n this.buttonAttributesCache.set(label, attributes);\n }\n return attributes;\n }\n\n protected getValue(element: Record<string, unknown>, column: TableColumn): unknown {\n if(column.field.indexOf('.') === -1) {\n return element[column.field];\n }\n\n // First check if the field exists as a flat key (e.g., \"contact.firstName\" stored directly)\n if (element[column.field] !== undefined) {\n return element[column.field];\n }\n\n // Otherwise try nested object traversal (e.g., element.contact.firstName)\n const keys = column.field.split('.');\n let value: unknown = element;\n for(const key of keys) {\n if (value === null || value === undefined) {\n return undefined;\n }\n value = (value as Record<string, unknown>)[key];\n }\n return value;\n }\n\n /**\n * Produces the formatted cell content when a column defines a `formatter` callback.\n * Returns `null` when no formatter is configured so the template can fall back to\n * the dataType-driven rendering.\n */\n protected getFormattedValue(element: Record<string, unknown>, column: TableColumn): string | null {\n if (!column.formatter) return null;\n const value = this.getValue(element, column);\n return column.formatter(value, element);\n }\n\n /**\n * Plain-text representation of the cell value used as the `title` attribute on truncated\n * cells so the full string is reachable via the browser's native tooltip on hover.\n * Honours `formatter` first, then falls back to a stringified raw value.\n */\n protected getCellTitle(element: Record<string, unknown>, column: TableColumn): string | null {\n const formatted = this.getFormattedValue(element, column);\n if (formatted !== null && formatted !== undefined) {\n return formatted;\n }\n const value = this.getValue(element, column);\n if (value === null || value === undefined) return null;\n return String(value);\n }\n\n protected getFilterType(column: TableColumn): 'text' | 'numeric' | 'boolean' | 'date' {\n switch (column.dataType) {\n case 'text':\n case 'numeric':\n case 'boolean':\n case 'date':\n return column.dataType;\n case 'booleanIcon':\n return 'boolean';\n case 'numericRange':\n case 'progressBar':\n return 'numeric';\n case 'iso8601':\n return 'date';\n default:\n return 'text';\n }\n }\n\n /**\n * State of a `booleanIcon` cell (AB#5623): `'true'` / `'false'` for booleans (also the strings\n * \"true\" / \"false\"), `null` for an empty or non-boolean value (empty cell).\n */\n protected booleanIconState(element: Record<string, unknown>, column: TableColumn): 'true' | 'false' | null {\n const value = this.getValue(element, column);\n if (value === true || value === 'true') return 'true';\n if (value === false || value === 'false') return 'false';\n return null;\n }\n\n /** Icon of a `booleanIcon` cell: the column's `booleanIcons`, else check / x; `null` = no icon. */\n protected booleanIcon(column: TableColumn, state: 'true' | 'false'): SVGIcon | null {\n const icons = column.booleanIcons;\n if (state === 'true') {\n return icons?.true ?? checkIcon;\n }\n return icons?.false === null ? null : icons?.false ?? xIcon;\n }\n\n /** Accessible name of a `booleanIcon` cell: \"<column>: Yes|No\" from the messages (AB#5623). */\n protected booleanIconLabel(column: TableColumn, state: 'true' | 'false'): string {\n const value = state === 'true' ? this._messages.booleanYes : this._messages.booleanNo;\n const name = this.getDisplayName(column) ?? '';\n return name ? this._messages.booleanIconLabel.replace('{column}', name).replace('{value}', value) : value;\n }\n\n /** Input attributes of a read-only boolean cell, cached per column and name (AB#5621). */\n private readonly booleanCellAttributeCache = new WeakMap<TableColumn, { name: string; attributes: Record<string, string> }>();\n\n /**\n * Input attributes of a `boolean` cell's read-only checkbox: its accessible name is the column's\n * display name (AB#5621), so a screen reader announces \"<column>, checked\" instead of an unnamed\n * checkbox.\n */\n protected booleanCellAttributes(column: TableColumn): Record<string, string> {\n const name = this.getDisplayName(column) ?? '';\n const cached = this.booleanCellAttributeCache.get(column);\n if (cached && cached.name === name) {\n return cached.attributes;\n }\n const attributes: Record<string, string> = name ? { 'aria-label': name } : {};\n this.booleanCellAttributeCache.set(column, { name, attributes });\n return attributes;\n }\n\n /**\n * Gets all status field configurations for a statusIcons column.\n * Returns an array of StatusFieldConfig, whether the column uses single or multi-field configuration.\n */\n protected getStatusFields(column: TableColumn): StatusFieldConfig[] {\n if (column.statusFields && column.statusFields.length > 0) {\n return column.statusFields;\n } else if (column.statusMapping) {\n return [{field: column.field, statusMapping: column.statusMapping}];\n } else {\n return [];\n }\n }\n\n /**\n * Gets the status icon mapping for a specific field value in a data item.\n */\n protected getStatusIconMapping(dataItem: Record<string, unknown>, fieldConfig: StatusFieldConfig): StatusIconMapping | null {\n const value = this.getFieldValue(dataItem, fieldConfig.field);\n if (value === null || value === undefined) {\n return null;\n }\n return fieldConfig.statusMapping[String(value)] ?? null;\n }\n\n /**\n * Resolves the badge appearance for a cell from the column's `badgeMapping`. Returns null when\n * no mapping is configured or no entry matches the cell's value — the template falls back to a\n * neutral default badge in that case so missing-mapping entries don't blank out the column.\n */\n protected getBadgeMapping(dataItem: Record<string, unknown>, column: TableColumn): BadgeMapping | null {\n if (!column.badgeMapping) {\n return null;\n }\n const value = this.getFieldValue(dataItem, column.field);\n if (value === null || value === undefined) {\n return null;\n }\n return column.badgeMapping[String(value)] ?? null;\n }\n\n /**\n * Helper to get a field value from a data item, supporting nested fields.\n */\n private getFieldValue(element: Record<string, unknown>, field: string): unknown {\n if (field.indexOf('.') === -1) {\n return element[field];\n }\n const keys = field.split('.');\n let value: unknown = element;\n for (const key of keys) {\n if (value === null || value === undefined) {\n return null;\n }\n value = (value as Record<string, unknown>)[key];\n }\n return value;\n }\n\n /**\n * Resolves the @Input bindings for a `dataType: 'component'` cell.\n * Returns an empty object when no `cellInputs` factory is configured so\n * `*ngComponentOutlet` still renders the component (with its default state).\n */\n protected getCellInputs(dataItem: Record<string, unknown>, column: TableColumn): Record<string, unknown> {\n return column.cellInputs ? column.cellInputs(dataItem) : {};\n }\n\n /**\n * Gets the human-readable description of a cron expression.\n */\n protected getCronHumanReadable(expression: unknown): string {\n if (!expression || typeof expression !== 'string') return '';\n return this.cronHumanizer.toHumanReadable(expression, 'en');\n }\n\n protected hasFilterOptions(column: TableColumn): boolean {\n return !!column.filterOptions && column.filterOptions.length > 0;\n }\n\n protected getSelectedFilterValue(column: TableColumn): string | null {\n const grid = this.gridComponent;\n if (!grid) return null;\n const filter = grid.filter as CompositeFilterDescriptor;\n if (!filter?.filters) return null;\n const fd = filter.filters.find(\n f => 'field' in f && (f as FilterDescriptor).field === column.field\n ) as FilterDescriptor | undefined;\n return fd?.value as string | null ?? null;\n }\n\n protected onDropdownFilter(value: string | null, column: TableColumn): void {\n const grid = this.gridComponent;\n if (!grid) return;\n\n const currentFilter: CompositeFilterDescriptor = grid.filter as CompositeFilterDescriptor ?? { logic: 'and', filters: [] };\n // Remove existing filter for this field\n const otherFilters = currentFilter.filters.filter(\n f => !('field' in f) || (f as FilterDescriptor).field !== column.field\n );\n\n if (value) {\n otherFilters.push({ field: column.field, operator: 'eq', value });\n }\n\n const newFilter: CompositeFilterDescriptor = { logic: 'and', filters: otherFilters };\n grid.filter = newFilter;\n // Sync filter into directive state and trigger rebind\n this.dataBindingDirective?.notifyFilterChange(newFilter);\n }\n\n protected getRangeFilterValue(column: TableColumn, operator: 'gte' | 'lte'): number | null {\n const grid = this.gridComponent;\n if (!grid?.filter) return null;\n const currentFilter = grid.filter as CompositeFilterDescriptor;\n const fd = currentFilter.filters.find(\n f => 'field' in f && (f as FilterDescriptor).field === column.field &&\n (f as FilterDescriptor).operator === operator\n ) as FilterDescriptor | undefined;\n return fd?.value as number | null ?? null;\n }\n\n protected onRangeFilterChange(value: number | null, column: TableColumn, operator: 'gte' | 'lte'): void {\n const grid = this.gridComponent;\n if (!grid) return;\n\n const currentFilter: CompositeFilterDescriptor = grid.filter as CompositeFilterDescriptor ?? { logic: 'and', filters: [] };\n // Remove existing filter for this field + operator\n const otherFilters = currentFilter.filters.filter(\n f => !('field' in f) || (f as FilterDescriptor).field !== column.field ||\n (f as FilterDescriptor).operator !== operator\n );\n\n if (value !== null && value !== undefined) {\n otherFilters.push({ field: column.field, operator, value });\n }\n\n const newFilter: CompositeFilterDescriptor = { logic: 'and', filters: otherFilters };\n grid.filter = newFilter;\n this.dataBindingDirective?.notifyFilterChange(newFilter);\n }\n\n protected onShowRowFilter() {\n if (this.rowFilterEnabled) {\n this._showRowFilter = !this._showRowFilter;\n }\n }\n\n protected onRefresh() {\n this.onRefreshData.emit();\n }\n\n /**\n * Resets all filtering back to the default view: clears the row filter,\n * column sort, free-text search and page offset, drops the persisted state,\n * and emits {@link onResetFilters} so the host can also reset its own\n * quick-view/bar filters.\n */\n protected onReset(): void {\n this.dataBindingDirective?.resetState();\n this.restoreSearchValue(null);\n this.resetFilters.emit();\n }\n\n public onExecuteFilter = new EventEmitter<string | null>();\n public onRefreshData = new EventEmitter<void>();\n /** Emitted when the toolbar \"Reset Filters\" button is clicked (host resets its bar filters). */\n @Output() public resetFilters = new EventEmitter<void>();\n\n protected async onFilter(value: string | null): Promise<void> {\n this.searchValue = value || '';\n this.searchSubject.next(value);\n }\n\n /**\n * Restores the search box's displayed text without re-triggering a fetch\n * (used by {@link MmListViewDataBindingDirective} when replaying a persisted\n * list state — the directive already carries the value into the initial fetch).\n */\n public restoreSearchValue(value: string | null): void {\n this.searchValue = value || '';\n }\n\n protected readonly filterIcon = filterIcon;\n protected readonly pdfSVG: SVGIcon = filePdfIcon;\n protected readonly excelSVG: SVGIcon = fileExcelIcon;\n protected readonly refreshIcon = arrowRotateCwIcon;\n protected readonly resetFilterIcon = filterClearIcon;\n\n protected onRowSelect(event: SelectionEvent) {\n // _selectedRows is an array of selected rows\n // here all dataItems of the selected Rows are pushed into _selectedRows\n this._selectedRows.push(...event.selectedRows?.map(r => r.dataItem) ?? []);\n // remove event.deselectedRows from _selectedRows\n this._selectedRows = this._selectedRows.filter(r => !event.deselectedRows?.map(r => r.dataItem)?.includes(r));\n\n if (this.rowIsClickable) {\n this.rowClicked.emit(this._selectedRows); // Emit the clicked row data\n }\n }\n\n protected onPageChange(_event: PageChangeEvent) {\n this._selectedRows = [];\n }\n\n protected async onContextMenuSelect(_event: ContextMenuSelectEvent): Promise<void> {\n\n const data = _event.item?.data?.data as CommandItem | OverflowRowActionData | undefined;\n if (!data) {\n return;\n }\n if (isOverflowRowActionData(data)) {\n const row = this._actionMenuSelectedRow;\n if (data.entry.commandItem) {\n await this.navigateAsync(data.entry.commandItem, row);\n } else {\n await this.triggerRowAction(data.entry, row);\n }\n return;\n }\n const commandItem = data;\n\n if (this._actionMenuSelectedRow) {\n await this.navigateAsync(commandItem, this._actionMenuSelectedRow);\n } else if (this._selectedRows.length > 0) {\n if (this._selectedRows.length === 1) {\n await this.navigateAsync(commandItem, this._selectedRows[0]);\n } else {\n await this.navigateAsync(commandItem, this._selectedRows);\n }\n } else if (this._contextMenuSelectedRow) {\n await this.navigateAsync(commandItem, this._contextMenuSelectedRow);\n }\n }\n\n protected onCellClick(e: CellClickEvent): void {\n if (e.type === 'contextmenu' && this.contextMenuType === 'contextMenu') {\n const originalEvent = e.originalEvent;\n originalEvent.preventDefault();\n\n this._contextMenuSelectedRow = e.dataItem;\n\n this.gridContextMenu?.show({\n left: this.clampContextMenuX(originalEvent.pageX),\n top: originalEvent.pageY,\n });\n }\n }\n\n /**\n * On narrow (phone) viewports the context-menu popup opened at the pointer\n * can overflow the right edge — Kendo's collision fit checks against a\n * layout viewport the overflowing popup itself just widened, so it never\n * kicks in. Clamp the anchor so a typically-sized menu stays on screen;\n * wide viewports keep Kendo's own positioning untouched (AB#4930).\n */\n private clampContextMenuX(x: number): number {\n const viewportWidth = document.documentElement.clientWidth;\n if (viewportWidth >= 768) {\n return x;\n }\n const estimatedMenuWidth = Math.min(288, viewportWidth - 16);\n return Math.max(8, Math.min(x, viewportWidth - estimatedMenuWidth));\n }\n\n protected async onSelectOptionActionItem(event: Event, dataItem: unknown, menuItem: MenuItem): Promise<void> {\n // Stop propagation to prevent grid from handling the click (e.g., for selection)\n event.stopPropagation();\n event.preventDefault();\n\n console.debug('onSelectOptionActionItem', { dataItem, menuItem });\n\n const commandItem = menuItem.data as CommandItem;\n if (!commandItem) {\n console.warn('onSelectOptionActionItem: No commandItem found in menuItem.data');\n return;\n }\n\n await this.navigateAsync(commandItem, dataItem);\n }\n\n /**\n * Row field naming a row for assistive technology (row menu \"Actions for <name>\", action\n * buttons \"<action> <name>\"). Falls back to `rtWellKnownName`, then `rtId`. A dotted path\n * (`contact.displayName`) reads a nested value (AB#5623).\n */\n @Input() public rowLabelField = 'name';\n\n /** Human name of a row (`rowLabelField`, `rtWellKnownName`, `rtId`), or '' when unknown. */\n protected rowLabel(dataItem: unknown): string {\n return resolveListRowLabel(dataItem, this.rowLabelField);\n }\n\n /** Accessible name and tooltip of the row menu button. */\n protected rowActionsLabel(dataItem: unknown): string {\n const name = this.rowLabel(dataItem);\n return name ? this.messages.rowActionsFor.replace('{name}', name) : this.messages.rowActions;\n }\n\n protected getMenuItemVisible(menuItem: MenuItem, dataItem: unknown): boolean {\n const commandItem = menuItem.data as CommandItem;\n if (commandItem) {\n return CommandBaseService.getIsVisibleSync(commandItem, dataItem);\n }\n return true;\n }\n\n protected getMenuItemDisabled(menuItem: MenuItem, dataItem: unknown): boolean {\n const commandItem = menuItem.data as CommandItem;\n if (commandItem) {\n return CommandBaseService.getIsDisabled(commandItem, dataItem);\n }\n return menuItem.disabled ?? false;\n }\n\n protected onContextMenu(dataItem: unknown, e: PointerEvent) {\n this._actionMenuSelectedRow = dataItem;\n // Rebuild context menu items with updated disabled state for the current row.\n // A new array reference is needed so Kendo's kendoMenuHierarchyBinding detects the change.\n const overflow = this.rowActionsView(dataItem).menu.map((entry): MenuItem => ({\n text: entryMenuText(entry.action),\n svgIcon: entry.action.icon as SVGIcon,\n data: {mmRowAction: true, entry} satisfies OverflowRowActionData,\n disabled: isActionDisabled(entry.action),\n cssClass: entry.action.danger ? DANGER_MENU_ITEM_CLASS : undefined,\n }));\n const contextItems = this.contextMenuType === 'actionMenu'\n ? this.buildContextMenuItemsWithDisabledState(this._contextMenuCommandItems, dataItem)\n : [];\n this._contextMenuItems = overflow.length && contextItems.length\n ? [...overflow, {separator: true}, ...contextItems]\n : [...overflow, ...contextItems];\n this.gridContextMenu?.show({\n left: this.clampContextMenuX(e.pageX),\n top: e.pageY,\n });\n }\n\n private buildContextMenuItemsWithDisabledState(commandItems: CommandItem[], dataItem: unknown): MenuItem[] {\n const items: MenuItem[] = [];\n for (const commandItem of commandItems) {\n if (commandItem.type === 'separator') {\n items.push({ separator: true });\n } else {\n let childMenuItems: MenuItem[] | undefined;\n if (commandItem.children) {\n childMenuItems = this.buildContextMenuItemsWithDisabledState(commandItem.children, dataItem);\n }\n items.push({\n text: commandItem.text,\n svgIcon: commandItem.svgIcon as SVGIcon,\n data: commandItem,\n items: childMenuItems,\n disabled: CommandBaseService.getIsDisabled(commandItem, dataItem),\n cssClass: commandItem.danger ? DANGER_MENU_ITEM_CLASS : undefined,\n });\n }\n }\n return items;\n }\n\n protected onContextMenuClosed(_event: ContextMenuPopupEvent) {\n this._contextMenuSelectedRow = null;\n this._actionMenuSelectedRow = null;\n // Back to the static items: `hasContextMenuButton` and the column width rely on them.\n this._contextMenuItems = this.buildMenuItems(this._contextMenuCommandItems);\n }\n\n /**\n * Row actions of one row (AB#5572): `actionCommandItems` (adapter) followed by `rowActions`,\n * split into inline buttons and overflow-menu entries (max {@link maxInlineRowActions} slots,\n * context menu items and `overflow: true` actions force the \"…\" button).\n */\n protected rowActionsView(dataItem: unknown): RowActionsView {\n const loadingReason = this.isLoading() ? this._messages.rowActionsLoading : null;\n const resolved: ResolvedListRowAction[] = [];\n for (const commandItem of this._actionCommandItems) {\n if (commandItem.type === 'separator' || !CommandBaseService.getIsVisibleSync(commandItem, dataItem)) {\n continue;\n }\n resolved.push({commandItem, action: this.commandItemAction(commandItem, dataItem, loadingReason)});\n }\n for (const rowAction of this._rowActions) {\n const action = resolveListRowAction(rowAction, dataItem);\n if (!isActionVisible(action)) {\n continue;\n }\n resolved.push({rowAction, action: loadingReason && !isActionDisabled(action) ? {...action, disabledReason: loadingReason} : action});\n }\n\n const candidates = resolved.filter(e => !e.action.overflow);\n const forced = resolved.filter(e => e.action.overflow);\n const slots = Math.max(1, Math.floor(this.maxInlineRowActions));\n const needsMenu = forced.length > 0 || candidates.length > slots || this.hasContextMenuButton;\n const inlineCount = needsMenu ? Math.max(0, slots - 1) : candidates.length;\n const view: RowActionsView = {\n inline: candidates.slice(0, inlineCount),\n menu: [...candidates.slice(inlineCount), ...forced],\n hasMenu: needsMenu,\n };\n return this.stableView(dataItem, view);\n }\n\n /** Accessible name of the row action group: \"Actions for <row>\". */\n protected rowActionsGroupLabel(dataItem: unknown): string {\n return this.rowActionsLabel(dataItem);\n }\n\n protected async onInlineRowAction(entry: ResolvedListRowAction, dataItem: unknown): Promise<void> {\n if (entry.commandItem) {\n // A routerLink-rendered action navigated already; CommandItems never use MmAction.link.\n await this.navigateAsync(entry.commandItem, dataItem);\n return;\n }\n // Inline link actions navigate via their own routerLink.\n await this.triggerRowAction(entry, dataItem, !!entry.action.link);\n }\n\n private async triggerRowAction(entry: ResolvedListRowAction, row: unknown, navigated = false): Promise<void> {\n const action = entry.action;\n if (isActionDisabled(action)) {\n return;\n }\n if (!navigated && action.link && this.routerForActions) {\n const commands = typeof action.link.commands === 'string' ? [action.link.commands] : [...action.link.commands];\n void this.routerForActions.navigate(commands, {queryParams: action.link.queryParams, relativeTo: this.activatedRoute ?? undefined});\n }\n this.rowAction.emit({id: action.id, action, row});\n await entry.rowAction?.run?.(row);\n }\n\n /** `CommandItem` → `MmAction` adapter (AB#5572): `isDisabled` → reason, `danger`, icon, text. */\n private commandItemAction(commandItem: CommandItem, dataItem: unknown, loadingReason: string | null): MmAction {\n let disabledReason: string | null = null;\n if (CommandBaseService.getIsDisabled(commandItem, dataItem)) {\n const reason = typeof commandItem.disabledReason === 'function'\n ? commandItem.disabledReason(dataItem)\n : commandItem.disabledReason;\n disabledReason = reason && reason.trim() ? reason : this._messages.rowActionUnavailable;\n }\n return {\n id: commandItem.id,\n label: commandItem.text || commandItem.tooltip || commandItem.id,\n icon: commandItem.svgIcon as SVGIcon | undefined,\n danger: !!commandItem.danger,\n disabledReason: disabledReason ?? loadingReason,\n };\n }\n\n private stableView(dataItem: unknown, view: RowActionsView): RowActionsView {\n if (typeof dataItem !== 'object' || dataItem === null) {\n return view;\n }\n const previous = this.rowActionCache.get(dataItem);\n if (previous && sameEntries(previous.inline, view.inline) && sameEntries(previous.menu, view.menu)\n && previous.hasMenu === view.hasMenu) {\n return previous;\n }\n this.rowActionCache.set(dataItem, view);\n return view;\n }\n\n\n protected async onToolbarCommand(commandItem: CommandItem): Promise<void> {\n if (this._selectedRows.length === 1) {\n await this.navigateAsync(commandItem, this._selectedRows[0]);\n } else {\n await this.navigateAsync(commandItem, this._selectedRows);\n }\n }\n\n protected async onToolbarDropdownItemClick(childItem: CommandItem): Promise<void> {\n if (this._selectedRows.length === 1) {\n await this.navigateAsync(childItem, this._selectedRows[0]);\n } else {\n await this.navigateAsync(childItem, this._selectedRows);\n }\n }\n\n private buildMenuItems(commandItems: CommandItem[]): MenuItem[] {\n\n const items = new Array<MenuItem>();\n\n for (const commandItem of commandItems) {\n\n if (commandItem.type === 'separator') {\n items.push({separator: true});\n } else {\n\n let childMenuItems: MenuItem[] | undefined = undefined;\n if (commandItem.children) {\n childMenuItems = this.buildMenuItems(commandItem.children)\n }\n\n items.push({\n text: commandItem.text,\n svgIcon: commandItem.svgIcon,\n data: commandItem,\n items: childMenuItems,\n cssClass: commandItem.danger ? DANGER_MENU_ITEM_CLASS : undefined,\n });\n }\n }\n\n return items;\n }\n\n protected getPdfPageText(pageNum: number, totalPages: number): string {\n return this._messages.pdfPageTemplate\n .replace('{pageNum}', String(pageNum))\n .replace('{totalPages}', String(totalPages));\n }\n\n protected readonly moreVerticalIcon = moreVerticalIcon;\n /**\n * Sliders, not an ellipsis. Host toolbars conventionally use the vertical\n * ellipsis for their own overflow group, and two \"more\" menus side by side\n * say nothing about which holds what. These commands are the table's options\n * — filter, exports, refresh — so the icon says \"options\" and the two menus\n * are told apart by meaning rather than by dot orientation.\n */\n protected readonly commandsIcon = slidersIcon;\n\n\n}\n","<!-- Shared cell renderer (AB#4930): used by the regular grid columns AND the\n card-mode body lines, so both render every dataType identically. -->\n<ng-template #cellContent let-element=\"element\" let-column=\"column\">\n @if (column.formatter) {\n {{ getFormattedValue(element, column) }}\n } @else {\n @switch (column.dataType) {\n @case ('boolean') {\n <!-- Read-only marker: named after its column so a screen reader says what is checked (AB#5621). -->\n <kendo-checkbox type=\"checkbox\" [checkedState]=\"$any(getValue(element, column))\" [disabled]=\"true\"\n [inputAttributes]=\"booleanCellAttributes(column)\" />\n }\n @case ('booleanIcon') {\n <!-- Boolean as icon (AB#5623): named \"<column>: Yes|No\" like the status icons (G13). -->\n @if (booleanIconState(element, column); as state) {\n @if (booleanIcon(column, state); as icon) {\n <span\n class=\"boolean-icon\"\n [class.boolean-icon--true]=\"state === 'true'\"\n [class.boolean-icon--false]=\"state === 'false'\"\n role=\"img\"\n [title]=\"booleanIconLabel(column, state)\"\n [attr.aria-label]=\"booleanIconLabel(column, state)\"\n [style.color]=\"state === 'true' ? column.booleanIcons?.trueColor : column.booleanIcons?.falseColor\">\n <kendo-svg-icon [icon]=\"icon\"></kendo-svg-icon>\n </span>\n }\n }\n }\n @case ('iso8601') {\n {{ $any(getValue(element, column)) | date:column.format }}\n }\n @case ('bytes') {\n {{ $any(getValue(element, column)) | bytesToSize }}\n }\n @case ('statusIcons') {\n <span class=\"status-icons-cell\">\n @for (fieldConfig of getStatusFields(column); track fieldConfig.field) {\n @if (getStatusIconMapping(element, fieldConfig); as mapping) {\n <!-- Icon-only status: the mapping's tooltip is also its accessible name (AB#5621). -->\n <span\n class=\"status-icon\"\n role=\"img\"\n [title]=\"mapping.tooltip\"\n [attr.aria-label]=\"mapping.tooltip || null\"\n [style.color]=\"mapping.color\">\n <kendo-svg-icon [icon]=\"mapping.icon\"></kendo-svg-icon>\n </span>\n }\n }\n </span>\n }\n @case ('cronExpression') {\n <span class=\"cron-expression-cell\">\n <code class=\"cron-expression\">{{ getValue(element, column) }}</code>\n <span class=\"cron-description\">{{ getCronHumanReadable(getValue(element, column)) }}</span>\n </span>\n }\n @case ('numeric') {\n {{ $any(getValue(element, column)) | number:column.format }}\n }\n @case ('progressBar') {\n <span class=\"progress-bar-cell\">\n <span class=\"progress-bar-track\">\n <span class=\"progress-bar-fill\" [style.width.%]=\"getValue(element, column)\"></span>\n </span>\n <span class=\"progress-bar-label\">{{ getValue(element, column) }}%</span>\n </span>\n }\n @case ('badge') {\n @if (getBadgeMapping(element, column); as badge) {\n <span\n class=\"badge-cell\"\n [title]=\"badge.tooltip ?? ''\"\n [style.color]=\"badge.color\"\n [style.background]=\"badge.backgroundColor\"\n [style.borderColor]=\"badge.borderColor ?? badge.backgroundColor\">\n {{ badge.label ?? getValue(element, column) }}\n </span>\n } @else if (!column.badgeHideUnmapped) {\n <span class=\"badge-cell badge-cell-default\">{{ getValue(element, column) }}</span>\n }\n }\n @case ('component') {\n @if (column.cellComponent) {\n <ng-container *ngComponentOutlet=\"column.cellComponent; inputs: getCellInputs(element, column)\" />\n }\n }\n @default {\n {{ getValue(element, column) }}\n }\n }\n }\n</ng-template>\n\n<!-- Row actions (AB#4930, AB#5572): shared by the actions column and the card header. One MmAction\n per action (CommandItems via adapter): neutral icon buttons, danger colour only for destructive\n actions, max `maxInlineRowActions` slots, the rest (and the context menu) behind \"…\". Disabled\n actions stay focusable and announce their reason (mm-action-button). -->\n<ng-template #rowActions let-dataItem=\"dataItem\">\n @let view = rowActionsView(dataItem);\n @if (view.inline.length > 0 || view.hasMenu) {\n <span class=\"mm-list-view-row-actions\" role=\"group\" [attr.aria-label]=\"rowActionsGroupLabel(dataItem)\">\n @for (entry of view.inline; track entry.action.id) {\n <!-- Clicks never reach the grid (no row selection / row navigation from an action). -->\n <mm-action-button [action]=\"entry.action\" [targetLabel]=\"rowLabel(dataItem)\" context=\"row\" display=\"icon\"\n (click)=\"$event.stopPropagation()\"\n (triggered)=\"onInlineRowAction(entry, dataItem)\" />\n }\n @if (view.hasMenu) {\n <button kendoButton themeColor=\"base\" fillMode=\"flat\" size=\"small\" class=\"mm-list-view-row-actions__more\"\n [svgIcon]=\"moreVerticalIcon\" data-action=\"more\"\n [title]=\"rowActionsLabel(dataItem)\" [attr.aria-label]=\"rowActionsLabel(dataItem)\" aria-haspopup=\"menu\"\n [disabled]=\"isLoading()\" (click)=\"$event.stopPropagation(); onContextMenu(dataItem, $event)\"></button>\n }\n </span>\n }\n</ng-template>\n\n<!-- One host toolbar action (left or right band). Flat + neutral unless `primary` (AB#6211). With\n `isDisabled` + `disabledReason` the control stays focusable (aria-disabled), announces the reason\n (aria-describedby) and shows it as a hint bubble on keyboard focus (guideline §2.5); clicks and\n menu opening are swallowed. Applies to buttons, split and dropdown buttons alike. -->\n<ng-template #toolbarItem let-commandItem let-side=\"side\" let-index=\"index\">\n @if (commandItem) {\n @switch (commandItem.type) {\n @case ('link') {\n @let reason = toolbarItemDisabledReason(commandItem);\n @let reasonId = toolbarReasonId(side, index);\n <span class=\"mm-list-view-toolbar-action\" [class.mm-list-view-toolbar-action--disabled]=\"!!reason\"\n (pointerdown)=\"onToolbarPointerDown()\"\n (focusin)=\"onToolbarFocusIn($event, reason)\"\n (focusout)=\"closeToolbarHint()\"\n (keydown.escape)=\"closeToolbarHint()\">\n @if (commandItem.children && commandItem.children.length > 0 && commandItem.onClick) {\n <kendo-splitbutton\n [data]=\"commandItem.children\"\n [svgIcon]=\"$any(commandItem.svgIcon)\"\n [disabled]=\"(getToolbarItemDisabled(commandItem) && !reason) || isLoading()\"\n [textField]=\"'text'\"\n [themeColor]=\"toolbarItemThemeColor(commandItem)\"\n [fillMode]=\"$any(toolbarItemFillMode(commandItem))\"\n [title]=\"toolbarItemTitle(commandItem, reason)\"\n [buttonAttributes]=\"toolbarItemButtonAttributes(commandItem, reason ? reasonId : null)\"\n [attr.data-toolbar-action]=\"commandItem.id\"\n (buttonClick)=\"reason ? null : onToolbarCommand(commandItem)\"\n (open)=\"reason ? $event.preventDefault() : null\"\n (itemClick)=\"onToolbarDropdownItemClick($event)\">\n {{ commandItem.text }}\n </kendo-splitbutton>\n } @else if (commandItem.children && commandItem.children.length > 0) {\n <kendo-dropdownbutton\n [data]=\"commandItem.children\"\n [svgIcon]=\"$any(commandItem.svgIcon)\"\n [disabled]=\"(getToolbarItemDisabled(commandItem) && !reason) || isLoading()\"\n [textField]=\"'text'\"\n [themeColor]=\"toolbarItemThemeColor(commandItem)\"\n [fillMode]=\"$any(toolbarItemFillMode(commandItem))\"\n [title]=\"toolbarItemTitle(commandItem, reason)\"\n [buttonAttributes]=\"toolbarItemButtonAttributes(commandItem, reason ? reasonId : null)\"\n [attr.data-toolbar-action]=\"commandItem.id\"\n (open)=\"reason ? $event.preventDefault() : null\"\n (itemClick)=\"onToolbarDropdownItemClick($event)\">\n {{ commandItem.text }}\n </kendo-dropdownbutton>\n } @else {\n <button kendoTooltip kendoButton [svgIcon]=\"$any(commandItem.svgIcon)\"\n [themeColor]=\"toolbarItemThemeColor(commandItem)\"\n [fillMode]=\"$any(toolbarItemFillMode(commandItem))\"\n [attr.data-toolbar-action]=\"commandItem.id\"\n [title]=\"toolbarItemTitle(commandItem, reason)\"\n [attr.aria-label]=\"toolbarItemAriaLabel(commandItem)\"\n [attr.aria-disabled]=\"reason ? 'true' : null\"\n [attr.aria-describedby]=\"reason ? reasonId : null\"\n [disabled]=\"(getToolbarItemDisabled(commandItem) && !reason) || isLoading()\"\n (click)=\"reason ? $event.preventDefault() : onToolbarCommand(commandItem)\">{{ commandItem.text }}\n </button>\n }\n @if (reason) {\n <span class=\"mm-list-view-toolbar-reason\" [id]=\"reasonId\">{{ reason }}</span>\n }\n </span>\n }\n @case ('separator') {\n <kendo-separator></kendo-separator>\n }\n }\n }\n</ng-template>\n\n<!-- Disabled reason shown on keyboard focus (AB#6211): opened with the Kendo PopupService under the\n application root, so the grid / toolbar overflow cannot clip it. -->\n<ng-template #toolbarHint>\n <div class=\"mm-list-view-toolbar-hint\" data-toolbar-hint>{{ toolbarHintText() }}</div>\n</ng-template>\n\n<kendo-grid\n mmListViewDataBinding\n [loading]=\"isLoading()\"\n [pageSize]=\"effectivePageSize()\" [selectable]=\"selectable\" (pageChange)=\"onPageChange($event)\"\n [skip]=\"skip\" (selectionChange)=\"onRowSelect($event)\" (cellClick)=\"onCellClick($event)\"\n [pageable]=\"effectivePageable\"\n [sortable]=\"sortable\"\n [filterable]=\"_showRowFilter && !isCardMode\"\n [resizable]=\"resizable\"\n [rowClass]=\"rowClass ?? defaultRowClass\"\n>\n <kendo-grid-messages\n [pagerItemsPerPage]=\"_messages.pagerItemsPerPage\"\n [pagerOf]=\"_messages.pagerOf\"\n [pagerItems]=\"_messages.pagerItems\"\n [pagerPage]=\"_messages.pagerPage\"\n [pagerFirstPage]=\"_messages.pagerFirstPage\"\n [pagerLastPage]=\"_messages.pagerLastPage\"\n [pagerPreviousPage]=\"_messages.pagerPreviousPage\"\n [pagerNextPage]=\"_messages.pagerNextPage\"\n [noRecords]=\"_messages.noRecords\"\n ></kendo-grid-messages>\n <!-- Empty state (AB#3444): one block per list, never per row. -->\n <ng-template kendoGridNoRecordsTemplate>\n @if (emptyTemplate) {\n <ng-container *ngTemplateOutlet=\"emptyTemplate; context: emptyContext\"></ng-container>\n } @else if (emptyState) {\n @if (loadSettled() && !isLoading()) {\n @if (isFiltered) {\n <mm-empty-state class=\"mm-list-view-empty\" variant=\"no-results\"\n [heading]=\"emptyState.filteredTitle || _messages.noResultsTitle\"\n [text]=\"emptyState.filteredText || _messages.noResultsText\"></mm-empty-state>\n } @else {\n <mm-empty-state class=\"mm-list-view-empty\" variant=\"empty\"\n [heading]=\"emptyState.title\" [text]=\"emptyState.text\"></mm-empty-state>\n }\n }\n } @else {\n {{ _messages.noRecords }}\n }\n </ng-template>\n <ng-template kendoGridToolbarTemplate>\n\n @for (commandItem of leftToolbarActions; track commandItem.id; let i = $index) {\n <ng-container [ngTemplateOutlet]=\"toolbarItem\" [ngTemplateOutletContext]=\"{$implicit: commandItem, side: 'left', index: i}\" />\n }\n\n <!-- Host scope/filter controls (view switches and the like). They steer the\n table, so they sit in the table's own band instead of a second strip\n stacked above the grid. -->\n @if (filtersTemplate) {\n <!-- A rule between the host's actions and its filters: both sit on the\n left of the same band, but one acts on records and the other changes\n what the list shows. Only drawn when actions precede them. -->\n @if (leftToolbarActions.length > 0) {\n <kendo-separator class=\"mm-toolbar-filters-separator\"></kendo-separator>\n }\n <div class=\"mm-toolbar-filters\">\n <ng-container [ngTemplateOutlet]=\"filtersTemplate.templateRef\"></ng-container>\n </div>\n }\n\n <kendo-grid-spacer></kendo-grid-spacer>\n @if (searchTextBoxEnabled) {\n <input\n class=\"k-textbox k-input k-input-md k-rounded-md mm-search-input\"\n [placeholder]=\"_messages.searchPlaceholder\"\n [value]=\"searchValue\"\n (input)=\"onFilter($any($event.target).value || null)\"\n />\n }\n\n @for (commandItem of rightToolbarActions; track commandItem.id; let i = $index) {\n <ng-container [ngTemplateOutlet]=\"toolbarItem\" [ngTemplateOutletContext]=\"{$implicit: commandItem, side: 'right', index: i}\" />\n }\n\n <!-- Commands: laid out while there is room, collapsed into one menu once\n the list gets narrow. Same behaviour in every host app — a list this\n wide has space for five buttons, and a list this narrow does not. -->\n @if (commandsCollapsed) {\n <kendo-dropdownbutton class=\"mm-toolbar-commands\" [data]=\"toolbarCommands\" textField=\"text\" [svgIcon]=\"commandsIcon\"\n fillMode=\"flat\" themeColor=\"primary\" [disabled]=\"isLoading()\"\n [title]=\"_messages.commands\"\n [buttonAttributes]=\"commandsMenuButtonAttributes\"\n (itemClick)=\"onCommand($any($event).id)\"></kendo-dropdownbutton>\n } @else {\n @for (command of toolbarCommands; track command.id) {\n @switch (command.id) {\n @case ('excel') {\n <button kendoTooltip kendoGridExcelCommand themeColor=\"primary\" fillMode=\"flat\"\n [svgIcon]=\"command.svgIcon\" [disabled]=\"isLoading()\" [title]=\"command.text\"\n [attr.aria-label]=\"command.text\" [attr.data-command]=\"command.id\"></button>\n }\n @case ('pdf') {\n <button kendoTooltip kendoGridPDFCommand themeColor=\"primary\" fillMode=\"flat\"\n [svgIcon]=\"command.svgIcon\" [disabled]=\"isLoading()\" [title]=\"command.text\"\n [attr.aria-label]=\"command.text\" [attr.data-command]=\"command.id\"></button>\n }\n @default {\n <!-- The row filter is a toggle: its on state is shown (k-selected) and announced. -->\n <button kendoTooltip kendoButton themeColor=\"primary\" fillMode=\"flat\"\n [svgIcon]=\"command.svgIcon\" (click)=\"onCommand(command.id)\"\n [class.k-selected]=\"command.id === 'rowFilter' && _showRowFilter\"\n [attr.aria-pressed]=\"command.id === 'rowFilter' ? _showRowFilter : null\"\n [attr.data-command]=\"command.id\"\n [disabled]=\"isLoading()\" [title]=\"command.text\" [attr.aria-label]=\"command.text\"></button>\n }\n }\n }\n }\n </ng-template>\n\n @if (showCheckboxColumn()) {\n <kendo-grid-checkbox-column [showSelectAll]=\"showRowSelectAllCheckBox\"\n [width]=\"effectiveCheckboxColumnWidth\"></kendo-grid-checkbox-column>\n }\n\n @if (!isCardMode) {\n @for (column of columns; track column.field) {\n <kendo-grid-column [field]=\"column.field\"\n [filter]=\"getFilterType(column)\" format=\"{{column.format}}\"\n [width]=\"$any(getEffectiveWidth(column))\"\n [minResizableWidth]=\"column.minWidth ?? 10\"\n [hidden]=\"isColumnHidden(column)\"\n [sortable]=\"column.sortable !== false\"\n [filterable]=\"column.filterable !== false\"\n [class]=\"alignClass(column)\"\n [headerClass]=\"alignClass(column)\"\n [title]=\"getDisplayName(column) | pascalCase\">\n <ng-template kendoGridFilterCellTemplate let-filter let-gridColumn=\"column\">\n @if (hasFilterOptions(column)) {\n <kendo-dropdownlist\n class=\"status-filter-dropdown\"\n [data]=\"column.filterOptions!\"\n textField=\"text\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [value]=\"getSelectedFilterValue(column)\"\n [defaultItem]=\"{ text: '', value: null }\"\n [popupSettings]=\"{ width: 'auto' }\"\n (valueChange)=\"onDropdownFilter($event, column)\"\n >\n <ng-template kendoDropDownListValueTemplate let-dataItem>\n @if (dataItem?.value && column.statusMapping?.[dataItem.value]; as mapping) {\n <span class=\"filter-status-item\">\n <span role=\"img\" [attr.aria-label]=\"dataItem.text || mapping.tooltip || null\" [title]=\"dataItem.text || mapping.tooltip\"\n [style.color]=\"mapping.color\">\n <kendo-svg-icon [icon]=\"mapping.icon\" [size]=\"'small'\"></kendo-svg-icon>\n </span>\n </span>\n } @else if (dataItem?.text) {\n <span>{{ dataItem.text }}</span>\n }\n </ng-template>\n <ng-template kendoDropDownListItemTemplate let-dataItem>\n @if (dataItem?.value && column.statusMapping?.[dataItem.value]; as mapping) {\n <span style=\"display: inline-flex; align-items: center; gap: 8px;\">\n <span [style.color]=\"mapping.color\">\n <kendo-svg-icon [icon]=\"mapping.icon\" [size]=\"'small'\"></kendo-svg-icon>\n </span>\n <span>{{ dataItem.text }}</span>\n </span>\n } @else {\n <span>{{ dataItem.text }}</span>\n }\n </ng-template>\n </kendo-dropdownlist>\n } @else if (column.dataType === 'numericRange') {\n <span class=\"numeric-range-filter\">\n <kendo-numerictextbox\n [value]=\"$any(getRangeFilterValue(column, 'gte'))\"\n (valueChange)=\"onRangeFilterChange($event, column, 'gte')\"\n [spinners]=\"false\"\n [decimals]=\"2\"\n placeholder=\"From\"\n size=\"small\"\n ></kendo-numerictextbox>\n <span class=\"range-separator\">–</span>\n <kendo-numerictextbox\n [value]=\"$any(getRangeFilterValue(column, 'lte'))\"\n (valueChange)=\"onRangeFilterChange($event, column, 'lte')\"\n [spinners]=\"false\"\n [decimals]=\"2\"\n placeholder=\"To\"\n size=\"small\"\n ></kendo-numerictextbox>\n </span>\n } @else {\n @switch (getFilterType(column)) {\n @case ('numeric') {\n <kendo-grid-numeric-filter-cell [column]=\"gridColumn\" [filter]=\"filter\" [showOperators]=\"true\" [operator]=\"column.filterOperator || 'eq'\"\n [spinners]=\"!isCompactFilter(column)\" [class.mm-filter-compact]=\"isCompactFilter(column)\"></kendo-grid-numeric-filter-cell>\n }\n @case ('boolean') {\n <kendo-grid-boolean-filter-cell [column]=\"gridColumn\" [filter]=\"filter\"></kendo-grid-boolean-filter-cell>\n }\n @case ('date') {\n <kendo-grid-date-filter-cell [column]=\"gridColumn\" [filter]=\"filter\" [showOperators]=\"true\" [operator]=\"column.filterOperator || 'eq'\"\n [class.mm-filter-compact]=\"isCompactFilter(column)\"></kendo-grid-date-filter-cell>\n }\n @default {\n <kendo-grid-string-filter-cell [column]=\"gridColumn\" [filter]=\"filter\" [showOperators]=\"false\"></kendo-grid-string-filter-cell>\n }\n }\n }\n </ng-template>\n <ng-template kendoGridCellTemplate let-dataItem>\n <span\n [class.mm-cell-truncate]=\"column.truncate\"\n [attr.title]=\"column.truncate ? getCellTitle(dataItem, column) : null\">\n <ng-container\n [ngTemplateOutlet]=\"cellContent\"\n [ngTemplateOutletContext]=\"{ element: dataItem, column: column }\"\n ></ng-container>\n </span>\n </ng-template>\n </kendo-grid-column>\n }\n\n @if (hasRowActions) {\n <kendo-grid-command-column [title]=\"_messages.actionsColumnTitle\" [width]=\"effectiveActionsColumnWidth\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <ng-container\n [ngTemplateOutlet]=\"rowActions\"\n [ngTemplateOutletContext]=\"{ dataItem: dataItem }\"\n ></ng-container>\n </ng-template>\n </kendo-grid-command-column>\n }\n } @else {\n <!-- Card mode (AB#4930): one full-width column renders the whole row as a\n stacked card — title from the first column, labeled lines for the\n rest (empty values skipped), row actions in the card header. -->\n <kendo-grid-column [sortable]=\"false\" [filterable]=\"false\" title=\"\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <div class=\"mm-card\">\n <div class=\"mm-card-header\">\n @if (cardTitleColumn; as titleColumn) {\n <span class=\"mm-card-title\">\n <ng-container\n [ngTemplateOutlet]=\"cellContent\"\n [ngTemplateOutletContext]=\"{ element: dataItem, column: titleColumn }\"\n ></ng-container>\n </span>\n }\n <span class=\"mm-card-actions\">\n <ng-container\n [ngTemplateOutlet]=\"rowActions\"\n [ngTemplateOutletContext]=\"{ dataItem: dataItem }\"\n ></ng-container>\n </span>\n </div>\n <div class=\"mm-card-fields\">\n @for (column of cardBodyColumns; track column.field) {\n @if (hasCardValue(dataItem, column)) {\n <div class=\"mm-card-field\">\n <span class=\"mm-card-label\">{{ getDisplayName(column) | pascalCase }}</span>\n <span class=\"mm-card-value\">\n <ng-container\n [ngTemplateOutlet]=\"cellContent\"\n [ngTemplateOutletContext]=\"{ element: dataItem, column: column }\"\n ></ng-container>\n </span>\n </div>\n }\n }\n </div>\n </div>\n </ng-template>\n </kendo-grid-column>\n }\n\n <kendo-grid-excel fileName=\"{{excelExportFileName}}\">\n @for (column of columns; track column.field) {\n <kendo-excelexport-column [field]=\"column.field\"\n [title]=\"getDisplayName(column) | pascalCase\">\n </kendo-excelexport-column>\n }\n </kendo-grid-excel>\n\n <kendo-grid-pdf fileName=\"{{pdfExportFileName}}\" paperSize=\"A4\" [repeatHeaders]=\"true\"\n [landscape]=\"true\">\n @for (column of columns; track column.field) {\n <kendo-grid-column [field]=\"column.field\"\n [filter]=\"getFilterType(column)\"\n [title]=\"getDisplayName(column) | pascalCase\"></kendo-grid-column>\n }\n <kendo-grid-pdf-margin top=\"1.5cm\" left=\"1cm\" right=\"1cm\" bottom=\"1.5cm\"></kendo-grid-pdf-margin>\n <ng-template kendoGridPDFTemplate let-pageNum=\"pageNum\" let-totalPages=\"totalPages\">\n <div class=\"page-template\">\n <div class=\"footer\" style=\"position: absolute; bottom: 0; width: 100%; text-align: center; font-size: 9px; color: #666;\">\n {{ getPdfPageText(pageNum, totalPages) }}\n </div>\n </div>\n </ng-template>\n </kendo-grid-pdf>\n</kendo-grid>\n\n<kendo-contextmenu\n #gridmenu\n [kendoMenuHierarchyBinding]=\"_contextMenuItems\"\n [textField]=\"['text']\"\n childrenField=\"items\"\n svgIconField=\"svgIcon\"\n separatorField=\"separator\"\n disabledField=\"disabled\"\n cssClassField=\"cssClass\"\n (popupClose)=\"onContextMenuClosed($event)\"\n (select)=\"onContextMenuSelect($event)\"\n></kendo-contextmenu>\n","import { AsyncPipe } from '@angular/common';\nimport { AfterViewInit, ChangeDetectorRef, Component, EventEmitter, inject, Input, OnDestroy, OnInit, Output, ViewChild, ChangeDetectionStrategy } from '@angular/core';\nimport { SVGIconComponent } from '@progress/kendo-angular-icons';\nimport {\n DragAndDropDirective,\n DropPosition,\n ExpandDirective,\n NodeClickEvent,\n NodeTemplateDirective,\n TreeItem,\n TreeItemDropEvent,\n TreeViewComponent\n} from '@progress/kendo-angular-treeview';\nimport { BehaviorSubject, from, Observable } from 'rxjs';\nimport { TreeItemData } from '@meshmakers/shared-services';\nimport { HierarchyDataSource } from '../data-sources/hierarchy-data-source';\nimport { NodeDroppedEvent } from '../models/node-dropped-event';\n\n@Component({\n selector: 'mm-tree-view',\n imports: [\n ExpandDirective,\n TreeViewComponent,\n AsyncPipe,\n NodeTemplateDirective,\n SVGIconComponent,\n DragAndDropDirective\n ],\n templateUrl: './tree.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './tree.component.scss'\n})\nexport class TreeComponent implements OnInit, AfterViewInit, OnDestroy {\n private readonly cdRef = inject(ChangeDetectorRef);\n\n private _timeoutCache: ReturnType<typeof setTimeout> | undefined;\n\n private readonly _rootNodes: BehaviorSubject<TreeItemData[]> = new BehaviorSubject<TreeItemData[]>([]);\n private _isViewInitialized = false;\n protected expandedKeys: string[] = [];\n\n @ViewChild(TreeViewComponent, { static: false })\n protected treeView!: TreeViewComponent;\n\n public async ngOnInit(): Promise<void> {\n if (this.dataSource) {\n this._rootNodes.next( await this.dataSource.fetchRootNodes());\n }\n }\n\n public ngAfterViewInit(): void {\n this._isViewInitialized = true;\n console.debug('🌳 TreeComponent: View initialized, treeView available:', !!this.treeView);\n }\n\n /**\n * Check if the TreeComponent is fully initialized and ready for operations\n */\n public get isReady(): boolean {\n return this._isViewInitialized && !!this.treeView;\n }\n\n @Input()\n public dataSource: HierarchyDataSource | null = null;\n\n @Output()nodeSelected = new EventEmitter<TreeItemData>()\n @Output()nodeClick = new EventEmitter<TreeItemData>()\n @Output()nodeDoubleClick = new EventEmitter<TreeItemData>()\n @Output()nodeDrop = new EventEmitter<NodeDroppedEvent<unknown>>()\n @Output()expand = new EventEmitter<TreeItemData>()\n @Output()collapse = new EventEmitter<TreeItemData>()\n\n protected get rootNodes(): Observable<TreeItemData[]> {\n return this._rootNodes;\n }\n\n protected hasChildren = (item: object) => this.dataSource?.hasChildren(item as TreeItemData) ?? false;\n protected isExpanded = (item: object, _index: string) => this.expandedKeys.includes((item as TreeItemData).id);\n protected fetchChildren = (item: object) : Observable<object[]> => from(this.dataSource?.fetchChildren(item as TreeItemData) ?? []);\n\n protected onNodeSelect(treeItem: TreeItem) {\n\n this.nodeSelected.emit(treeItem.dataItem);\n }\n\n protected onNodeClick(event: NodeClickEvent) {\n\n this.nodeClick.emit(event.item?.dataItem);\n }\n\n protected onNodeDoubleClick(event: NodeClickEvent) {\n\n this.nodeDoubleClick.emit(event.item?.dataItem);\n }\n\n protected onExpand(event: TreeItem) {\n console.debug('Node expanded:', event.dataItem?.text || event.dataItem);\n this.expand.emit(event.dataItem);\n }\n\n protected onCollapse(event: TreeItem) {\n console.debug('Node collapsed:', event.dataItem?.text || event.dataItem);\n this.collapse.emit(event.dataItem);\n }\n\n public async refreshTree(): Promise<void> {\n if (this.dataSource) {\n console.debug('🔄 Refreshing tree root nodes');\n const rootNodes = await this.dataSource.fetchRootNodes();\n this._rootNodes.next(rootNodes);\n console.debug('✅ Tree refreshed with', rootNodes.length, 'root nodes');\n }\n }\n\n public async onNodeDrop(event: TreeItemDropEvent): Promise<void> {\n console.debug('✅ Dropping item:', event);\n\n if (!event.isValid) {\n console.debug('Drop event is not valid in drag and drop end event', event);\n return;\n }\n\n const srcItem = event.sourceItem.item.dataItem.item\n const srcParent = event.sourceItem.parent?.item.dataItem.item\n\n const itemsToRefresh = [];\n\n // If you drop item directly onto existing item, make source item its child. Otherwise set parent as target assoc.\n let dstItem;\n if (event.dropPosition === DropPosition.Over) {\n dstItem = event.destinationItem.item.dataItem.item;\n\n const dstRefreshItem = event.destinationItem.parent?.item.dataItem.item;\n if (dstRefreshItem) {\n itemsToRefresh.push(dstRefreshItem);\n }\n } else {\n dstItem = event.destinationItem.parent?.item.dataItem.item;\n }\n\n itemsToRefresh.unshift(srcItem);\n if (srcParent) {\n itemsToRefresh.unshift(srcParent);\n }\n if (dstItem) {\n itemsToRefresh.unshift(dstItem);\n }\n\n const parent = event.sourceItem.parent;\n const siblings = parent?.children ?? [];\n const hasNoOtherChildren = siblings.every(child => child.dataItem?.item?.rtId === srcItem.rtId);\n if (hasNoOtherChildren) {\n const grandparentItem = parent?.parent?.item?.dataItem?.item;\n if (grandparentItem) {\n itemsToRefresh.push(grandparentItem);\n }\n }\n\n this.nodeDrop.emit({\n\n // source node\n sourceItem: {\n\n rtId: srcItem.rtId,\n\n ckTypeId: srcItem.ckTypeId,\n\n dataItem: event.sourceItem.item.dataItem,\n },\n\n // parent of source node, if exists\n sourceParent: srcParent ? {\n\n rtId: srcParent.rtId,\n\n ckTypeId: srcParent.ckTypeId\n } : undefined,\n\n // destination item, either on same hierarchy level or one level deeper\n destinationItem: dstItem ? {\n\n rtId: dstItem.rtId,\n\n ckTypeId: dstItem.ckTypeId,\n } : undefined,\n\n // items to be refreshed\n refreshItems: itemsToRefresh\n })\n }\n\n /**\n * Refreshes given runtime entity by reloading the data of the children.\n */\n public async refreshRuntimeEntities(nodes: { rtId: string, ckTypeId: string, isRoot: boolean }[]): Promise<void> {\n const keysToRestore: string[] = [];\n const keysToRemove = new Set<string>();\n\n nodes.forEach(({ ckTypeId, rtId, isRoot }) => {\n const keyId = isRoot ? `${ckTypeId}@${rtId}` : rtId;\n const hasKeyId = this.expandedKeys.includes(keyId);\n\n if (hasKeyId) {\n keysToRestore.push(keyId);\n keysToRemove.add(keyId);\n } else {\n console.debug(`Node ${keyId} not refreshed: not currently expanded.`);\n }\n });\n\n if (keysToRestore.length === 0) {\n return;\n }\n\n this.expandedKeys = this.expandedKeys.filter(key => !keysToRemove.has(key));\n\n return new Promise((res) => {\n this._clearTimeouts();\n\n this._timeoutCache = setTimeout(() => {\n this.expandedKeys = [...this.expandedKeys, ...keysToRestore];\n this.cdRef.markForCheck();\n res();\n }, 0);\n });\n }\n\n public getExpandedKeys(): string[] {\n return this.expandedKeys;\n }\n\n public collapseAll(): void {\n this.expandedKeys = [];\n }\n\n public setExpandedKeys(keys: string[]): void {\n this.expandedKeys = keys;\n }\n\n private _clearTimeouts() {\n if (this._timeoutCache) {\n clearTimeout(this._timeoutCache);\n }\n }\n\n public ngOnDestroy(): void {\n this._clearTimeouts();\n }\n}\n","<kendo-treeview\n #kendoTreeViewComponent\n kendoTreeViewExpandable\n kendoTreeViewDragAndDrop\n [loadOnDemand]=\"true\"\n [(expandedKeys)]=\"expandedKeys\"\n [expandBy]=\"'_id'\"\n [nodes]=\"(rootNodes | async) || []\"\n textField=\"text\"\n [children]=\"fetchChildren\"\n [hasChildren]=\"hasChildren\"\n [isExpanded]=\"isExpanded\"\n (selectionChange)=\"onNodeSelect($event)\"\n (nodeClick)=\"onNodeClick($event)\"\n (nodeDblClick)=\"onNodeDoubleClick($event)\"\n (nodeDrop)=\"onNodeDrop($event)\"\n (expand)=\"onExpand($event)\"\n (collapse)=\"onCollapse($event)\"\n>\n <ng-template kendoTreeViewNodeTemplate let-node>\n <kendo-svgicon [icon]=\"node.svgIcon\" size=\"medium\"></kendo-svgicon>\n {{ node.text }}\n </ng-template>\n</kendo-treeview>\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Messages for the unsaved changes confirmation dialog.\n * All properties are optional — English defaults are used for any missing values.\n */\nexport interface UnsavedChangesMessages {\n /** Dialog title (default: \"Unsaved Changes\") */\n title?: string;\n /** Message when component supports saving (default: \"You have unsaved changes. Do you want to save before leaving?\") */\n savePrompt?: string;\n /** Message when component does not support saving (default: \"You have unsaved changes. Are you sure you want to leave? Your changes will be lost.\") */\n discardPrompt?: string;\n /** Label for the \"Yes\" button (default: \"Yes\") */\n yesButton?: string;\n /** Label for the \"No\" button (default: \"No\") */\n noButton?: string;\n /** Label for the \"Cancel\" button (default: \"Cancel\") */\n cancelButton?: string;\n}\n\n/**\n * Interface for components that track unsaved changes.\n * Implement this interface in components that need to warn users before navigating away\n * when there are unsaved changes.\n */\nexport interface HasUnsavedChanges {\n /**\n * Returns true if the component has unsaved changes.\n */\n hasUnsavedChanges(): boolean;\n\n /**\n * Optional method to save changes before navigating away.\n * If implemented, the guard will offer a \"Save\" option in the confirmation dialog.\n * @returns Promise resolving to true if save was successful, false otherwise.\n */\n saveChanges?(): Promise<boolean>;\n\n /**\n * Optional translated messages for the confirmation dialog.\n * If not provided, English defaults are used.\n */\n unsavedChangesMessages?(): UnsavedChangesMessages;\n}\n\n/**\n * Injection token for components implementing HasUnsavedChanges.\n *\n * Components should provide themselves using this token:\n * ```typescript\n * @Component({\n * providers: [{ provide: HAS_UNSAVED_CHANGES, useExisting: MyComponent }]\n * })\n * export class MyComponent implements HasUnsavedChanges { ... }\n * ```\n */\nexport const HAS_UNSAVED_CHANGES = new InjectionToken<HasUnsavedChanges>('HAS_UNSAVED_CHANGES');\n","import { Directive, HostListener, inject } from '@angular/core';\nimport { HasUnsavedChanges, HAS_UNSAVED_CHANGES } from './unsaved-changes.interface';\n\n/**\n * Directive that handles browser beforeunload events for components with unsaved changes.\n *\n * This directive should be used together with the UnsavedChangesGuard on routes.\n * While the guard handles in-app navigation, this directive handles browser events\n * like back/forward buttons, refresh, and tab close.\n *\n * Usage:\n * 1. The host component must implement HasUnsavedChanges interface\n * 2. The component must provide itself via the HAS_UNSAVED_CHANGES token\n * 3. Add the directive to the component's hostDirectives\n *\n * ```typescript\n * @Component({\n * selector: 'my-editor',\n * hostDirectives: [UnsavedChangesDirective],\n * providers: [{ provide: HAS_UNSAVED_CHANGES, useExisting: MyEditorComponent }],\n * ...\n * })\n * export class MyEditorComponent implements HasUnsavedChanges {\n * hasUnsavedChanges(): boolean {\n * return this.form.dirty;\n * }\n * }\n * ```\n */\n@Directive({\n selector: '[mmUnsavedChanges]',\n standalone: true\n})\nexport class UnsavedChangesDirective {\n private readonly host = inject<HasUnsavedChanges>(HAS_UNSAVED_CHANGES, { optional: true });\n\n /**\n * Handles browser beforeunload event (back button, refresh, close tab).\n * Shows browser's native confirmation dialog when there are unsaved changes.\n */\n @HostListener('window:beforeunload', ['$event'])\n onBeforeUnload(event: BeforeUnloadEvent): void {\n if (this.hostHasUnsavedChanges()) {\n // Standard way to trigger browser's \"Leave site?\" dialog\n event.preventDefault();\n // For older browsers\n event.returnValue = '';\n }\n }\n\n private hostHasUnsavedChanges(): boolean {\n if (this.host && typeof this.host.hasUnsavedChanges === 'function') {\n return this.host.hasUnsavedChanges();\n }\n return false;\n }\n}\n","import { Component, ContentChild, Directive, inject, Input, Output, EventEmitter, TemplateRef, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormGroup } from '@angular/forms';\n\n@Directive({ selector: '[mmFormTitleExtra]', standalone: true })\nexport class FormTitleExtraDirective {\n readonly templateRef = inject(TemplateRef<unknown>);\n}\nimport { ButtonModule } from '@progress/kendo-angular-buttons';\nimport { SVGIcon, saveIcon, cancelIcon } from '@progress/kendo-svg-icons';\nimport { HasUnsavedChanges, HAS_UNSAVED_CHANGES } from '../guards/unsaved-changes.interface';\nimport { UnsavedChangesDirective } from '../guards/unsaved-changes.directive';\n\n// ResponsiveFormBreakPoint type for colSpan responsive behavior\nexport interface ResponsiveFormBreakPoint {\n maxWidth: number;\n value: number;\n}\n\n/**\n * Translatable messages for the base form.\n * All properties are optional — English defaults are used as fallbacks.\n */\nexport interface BaseFormMessages {\n /** Default title when isViewMode is true (default: 'View Details') */\n viewTitle?: string;\n /** Default title when isEditMode is true (default: 'Edit') */\n editTitle?: string;\n /** Default title for new items (default: 'New') */\n newTitle?: string;\n /** Save button text when saving is in progress (default: 'Saving...') */\n savingText?: string;\n /** Save button text in edit mode (default: 'Update') */\n updateText?: string;\n /** Save button text in create mode (default: 'Create') */\n createText?: string;\n /** Cancel button text in view mode (default: 'Back') */\n backText?: string;\n /** Cancel button text (default: 'Cancel') */\n cancelText?: string;\n /** Save button text (default: 'Save') */\n saveText?: string;\n /** Badge text for unsaved changes (default: 'Unsaved Changes') */\n unsavedChangesText?: string;\n /** Loading overlay text (default: 'Loading...') */\n loadingText?: string;\n /** Status text when form has changes (default: 'MODIFIED') */\n modifiedText?: string;\n /** Status text when form is clean (default: 'READY') */\n readyText?: string;\n}\n\nexport interface BaseFormConfig {\n title?: string;\n cardWidth?: string;\n showCard?: boolean;\n saveButtonText?: string;\n cancelButtonText?: string;\n isEditMode?: boolean;\n isViewMode?: boolean;\n isLoading?: boolean;\n isSaving?: boolean;\n showCancelButton?: boolean;\n showLoadingOverlay?: boolean;\n /**\n * Whether to show the title row. Defaults to true.\n * Set to false to hide the title (useful when the form is embedded in a tab).\n */\n showTitle?: boolean;\n /**\n * Indicates whether the form has unsaved changes.\n * When true, displays a \"Modified\" indicator in the header and footer.\n */\n hasChanges?: boolean;\n /**\n * Translatable messages for all static texts in the form.\n * Allows consuming applications to provide localized strings.\n */\n messages?: BaseFormMessages;\n}\n\n// Default responsive breakpoint for 2-column to 1-column\nexport const DEFAULT_RESPONSIVE_COLSPAN: ResponsiveFormBreakPoint[] = [\n { maxWidth: 768, value: 2 } // Full width on mobile\n];\n\n@Component({\n selector: 'mm-base-form',\n standalone: true,\n imports: [\n CommonModule,\n ButtonModule\n ],\n hostDirectives: [UnsavedChangesDirective],\n providers: [{ provide: HAS_UNSAVED_CHANGES, useExisting: BaseFormComponent }],\n templateUrl: './base-form.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './base-form.component.scss'\n})\nexport class BaseFormComponent implements HasUnsavedChanges {\n @ContentChild(FormTitleExtraDirective) titleExtra?: FormTitleExtraDirective;\n\n @Input() form!: FormGroup;\n @Input() config: BaseFormConfig = {\n showCard: true,\n cardWidth: '800px',\n saveButtonText: 'Save',\n cancelButtonText: 'Cancel',\n showLoadingOverlay: true\n };\n\n @Output() saveForm = new EventEmitter<void>();\n @Output() cancelForm = new EventEmitter<void>();\n\n protected readonly saveIcon: SVGIcon = saveIcon;\n protected readonly cancelIcon: SVGIcon = cancelIcon;\n\n protected get title(): string {\n if (this.config.showTitle === false) return '';\n if (this.config.title) return this.config.title;\n const msgs = this.config.messages;\n if (this.config.isViewMode) return msgs?.viewTitle ?? 'View Details';\n return this.config.isEditMode ? (msgs?.editTitle ?? 'Edit') : (msgs?.newTitle ?? 'New');\n }\n\n protected get saveButtonText(): string {\n if (this.config.saveButtonText) return this.config.saveButtonText;\n const msgs = this.config.messages;\n if (this.config.isSaving) return msgs?.savingText ?? 'Saving...';\n return this.config.isEditMode ? (msgs?.updateText ?? 'Update') : (msgs?.createText ?? 'Create');\n }\n\n protected get cancelButtonText(): string {\n if (this.config.cancelButtonText) return this.config.cancelButtonText;\n const msgs = this.config.messages;\n return this.config.isViewMode ? (msgs?.backText ?? 'Back') : (msgs?.cancelText ?? 'Cancel');\n }\n\n protected get unsavedChangesText(): string {\n return this.config.messages?.unsavedChangesText ?? 'Unsaved Changes';\n }\n\n protected get loadingText(): string {\n return this.config.messages?.loadingText ?? 'Loading...';\n }\n\n protected get modifiedText(): string {\n return this.config.messages?.modifiedText ?? 'MODIFIED';\n }\n\n protected get readyText(): string {\n return this.config.messages?.readyText ?? 'READY';\n }\n\n protected get showSaveButton(): boolean {\n return !this.config.isViewMode && !this.config.isLoading;\n }\n\n protected get showCancelButton(): boolean {\n return this.config.showCancelButton !== false;\n }\n\n protected get saveButtonDisabled(): boolean {\n return !!this.config.isSaving || !!this.config.isLoading;\n }\n\n protected onSave(): void {\n if (this.form?.valid) {\n this.saveForm.emit();\n } else {\n // Mark all fields as touched to show validation errors\n this.form?.markAllAsTouched();\n }\n }\n\n protected onCancel(): void {\n this.cancelForm.emit();\n }\n\n // === HasUnsavedChanges interface implementation ===\n\n /**\n * Checks if there are unsaved changes.\n * Uses config.hasChanges if provided, otherwise falls back to form.dirty.\n */\n hasUnsavedChanges(): boolean {\n // Prefer explicit hasChanges from config if set\n if (this.config.hasChanges !== undefined) {\n return this.config.hasChanges;\n }\n // Fall back to form dirty state\n return this.form?.dirty ?? false;\n }\n}\n","<div class=\"mm-base-form-container\" [class.with-card]=\"config.showCard\" [class.without-card]=\"!config.showCard\">\n <!-- Title (no card mode) -->\n <div *ngIf=\"!config.showCard && (title || titleExtra)\" class=\"mm-form-title-row mm-form-title-standalone\">\n <h2 *ngIf=\"title\" class=\"mm-form-title\">{{ title }}</h2>\n <ng-container *ngIf=\"titleExtra\" [ngTemplateOutlet]=\"titleExtra.templateRef\"></ng-container>\n <span *ngIf=\"config.hasChanges\" class=\"mm-modified-badge\">{{ unsavedChangesText }}</span>\n </div>\n\n <!-- Main form wrapper - styled as card or plain based on CSS class -->\n <div class=\"mm-form-wrapper\" [style.maxWidth]=\"config.showCard ? (config.cardWidth || '800px') : null\">\n <!-- Card header (only in card mode) -->\n <div *ngIf=\"config.showCard && (title || titleExtra)\" class=\"mm-form-header\">\n <h2 *ngIf=\"title\" class=\"mm-form-title\">{{ title }}</h2>\n <ng-container *ngIf=\"titleExtra\" [ngTemplateOutlet]=\"titleExtra.templateRef\"></ng-container>\n <span *ngIf=\"config.hasChanges\" class=\"mm-modified-badge\">{{ unsavedChangesText }}</span>\n </div>\n\n <!-- Form body with content projection -->\n <div class=\"mm-form-body\">\n <div *ngIf=\"config.isLoading && config.showLoadingOverlay\" class=\"mm-loading-overlay\">\n <div class=\"k-loader k-loader-lg\"></div>\n <p>{{ loadingText }}</p>\n </div>\n <ng-content></ng-content>\n </div>\n\n <!-- Form actions -->\n <div class=\"mm-form-actions\">\n <!-- Status indicator (left side) -->\n <div class=\"mm-form-status\">\n <span class=\"mm-status-indicator\" [class.modified]=\"config.hasChanges\">\n <span class=\"mm-status-dot\"></span>\n <span class=\"mm-status-text\">{{ config.hasChanges ? modifiedText : readyText }}</span>\n </span>\n </div>\n\n <!-- Action buttons (right side) -->\n <div class=\"mm-form-buttons\">\n <button\n *ngIf=\"showSaveButton\"\n kendoButton\n type=\"submit\"\n [svgIcon]=\"saveIcon\"\n themeColor=\"primary\"\n [disabled]=\"saveButtonDisabled\"\n (click)=\"onSave()\">\n {{ saveButtonText }}\n </button>\n <button\n *ngIf=\"showCancelButton\"\n kendoButton\n type=\"button\"\n [svgIcon]=\"cancelIcon\"\n [disabled]=\"!!config.isSaving\"\n (click)=\"onCancel()\">\n {{ cancelButtonText }}\n </button>\n <ng-content select=\"[additionalActions]\"></ng-content>\n </div>\n </div>\n </div>\n</div>\n","import { NgClass } from '@angular/common';\nimport { Component, EventEmitter, inject, Input, Output, ViewChild, ChangeDetectionStrategy } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { CommandBaseService, CommandItem, CommandSettingsService, TreeItemData, TreeItemDataTyped } from '@meshmakers/shared-services';\nimport { ButtonComponent } from '@progress/kendo-angular-buttons';\nimport { SeparatorComponent } from '@progress/kendo-angular-inputs';\nimport { SplitterComponent, SplitterPaneComponent } from '@progress/kendo-angular-layout';\nimport { HierarchyDataSource } from '../data-sources/hierarchy-data-source';\nimport { TreeComponent } from '../tree/tree.component';\nimport { NodeDroppedEvent } from '../models/node-dropped-event';\n\n@Component({\n selector: 'mm-base-tree-detail',\n imports: [\n SplitterComponent,\n SplitterPaneComponent,\n TreeComponent,\n ButtonComponent,\n SeparatorComponent,\n NgClass\n ],\n template: `\n <div class=\"base-tree-detail-container\">\n <!-- Toolbar -->\n @if (hasToolbarActions) {\n <div class=\"toolbar\">\n <div class=\"toolbar-left\">\n @for (commandItem of leftToolbarActions; track commandItem.id) {\n @if (commandItem) {\n @switch (commandItem.type) {\n @case ('link') {\n @if (commandItem.svgIcon) {\n <button kendoButton [svgIcon]=\"commandItem.svgIcon\" [title]=\"commandItem.text\"\n [disabled]=\"getIsDisabled(commandItem)\"\n (click)=\"onToolbarCommand(commandItem)\">{{ commandItem.text }}\n </button>\n } @else {\n <button kendoButton [title]=\"commandItem.text\"\n [disabled]=\"getIsDisabled(commandItem)\"\n (click)=\"onToolbarCommand(commandItem)\">{{ commandItem.text }}\n </button>\n }\n }\n @case ('separator'){\n <kendo-separator></kendo-separator>\n }\n }\n }\n }\n </div>\n\n <div class=\"toolbar-spacer\"></div>\n\n <div class=\"toolbar-right\">\n @for (commandItem of rightToolbarActions; track commandItem.id) {\n @if (commandItem) {\n @switch (commandItem.type) {\n @case ('link') {\n @if (commandItem.svgIcon) {\n <button kendoButton [svgIcon]=\"commandItem.svgIcon\" [title]=\"commandItem.text\"\n [disabled]=\"getIsDisabled(commandItem)\"\n (click)=\"onToolbarCommand(commandItem)\">{{ commandItem.text }}\n </button>\n } @else {\n <button kendoButton [title]=\"commandItem.text\"\n [disabled]=\"getIsDisabled(commandItem)\"\n (click)=\"onToolbarCommand(commandItem)\">{{ commandItem.text }}\n </button>\n }\n }\n @case ('separator'){\n <kendo-separator></kendo-separator>\n }\n }\n }\n }\n </div>\n </div>\n }\n\n <!-- Splitter with tree and detail -->\n <kendo-splitter class=\"octo-full\" orientation=\"horizontal\" [ngClass]=\"{ disabled: isContentDisabled }\">\n <kendo-splitter-pane [size]=\"leftPaneSize\" class=\"tree-pane\">\n <mm-tree-view\n #treeComponent\n [dataSource]=\"treeDataSource\"\n (nodeClick)=\"onNodeClick($event)\"\n (nodeDrop)=\"onNodeDrop($event)\">\n </mm-tree-view>\n </kendo-splitter-pane>\n <kendo-splitter-pane class=\"detail-pane\">\n <ng-content select=\"[slot=detail-panel]\"></ng-content>\n </kendo-splitter-pane>\n </kendo-splitter>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./base-tree-detail.component.scss']\n})\nexport class BaseTreeDetailComponent<T = unknown> extends CommandBaseService {\n @Input() treeDataSource!: HierarchyDataSource;\n @Input() leftPaneSize = '25%';\n @Input() leftToolbarActions: CommandItem[] = [];\n @Input() rightToolbarActions: CommandItem[] = [];\n @Output() nodeSelected = new EventEmitter<TreeItemDataTyped<T>>();\n @Output() nodeDropped = new EventEmitter<NodeDroppedEvent<T>>();\n\n @ViewChild('treeComponent', { static: false })\n treeComponent!: TreeComponent;\n\n protected isContentDisabled = false;\n protected selectedNode: TreeItemDataTyped<T> | null = null;\n\n constructor() {\n const commandSettingsService = inject(CommandSettingsService);\n const router = inject(Router);\n super(commandSettingsService, router);\n }\n\n protected get hasToolbarActions(): boolean {\n return this.leftToolbarActions.length > 0 || this.rightToolbarActions.length > 0;\n }\n\n protected onNodeClick(treeItem: TreeItemData): void {\n this.selectedNode = treeItem as TreeItemDataTyped<T>;\n this.nodeSelected.emit(treeItem as TreeItemDataTyped<T>);\n }\n\n protected onNodeDrop(event: NodeDroppedEvent<unknown>): void {\n this.nodeDropped.emit(event as NodeDroppedEvent<T>);\n }\n\n protected async onToolbarCommand(commandItem: CommandItem): Promise<void> {\n // Pass the selected tree node as context data\n await this.navigateAsync(commandItem, this.selectedNode?.item || null);\n }\n\n protected getIsDisabled(commandItem: CommandItem): boolean {\n // Check if disabled property exists and is true\n if (typeof commandItem.isDisabled === 'function') {\n return commandItem.isDisabled();\n }\n return commandItem.isDisabled ?? false;\n }\n\n /**\n * Wait for the tree component to be ready\n */\n public async waitForTreeReady(): Promise<boolean> {\n const maxAttempts = 50; // 5 seconds max\n let attempts = 0;\n\n while (attempts < maxAttempts) {\n if (this.treeComponent && this.treeComponent.isReady) {\n console.debug('✅ BaseTreeDetailComponent: TreeComponent is ready after', attempts * 100, 'ms');\n return true;\n }\n\n await new Promise(resolve => setTimeout(resolve, 100));\n attempts++;\n }\n\n console.warn('⚠️ BaseTreeDetailComponent: TreeComponent not ready after 5 seconds');\n return false;\n }\n\n /**\n * Refresh the tree by reloading root nodes\n */\n public async refreshTree(): Promise<void> {\n if (this.treeComponent) {\n await this.treeComponent.refreshTree();\n }\n }\n\n /**\n * Sets the state of Tree and Details panes.\n *\n * @description Panes are frozen (unclickable, unselectable) when disabled.\n */\n public setEnabledState(enabled: boolean): void {\n this.isContentDisabled = !enabled;\n }\n\n /**\n * Refreshes given runtime entity on a tree.\n */\n public async refreshRuntimeEntities(nodes: {\n ckTypeId: string,\n rtId: string,\n isRoot: boolean\n }[]): Promise<void> {\n await this.treeComponent.refreshRuntimeEntities(nodes);\n }\n\n public getExpandedKeys(): string[] {\n return this.treeComponent.getExpandedKeys();\n }\n\n public collapseAll(): void {\n this.treeComponent.collapseAll();\n }\n\n public setExpandedKeys(keys: string[]): void {\n this.treeComponent.setExpandedKeys(keys);\n }\n}\n","import {DataSourceBase, FetchDataOptions} from './data-source-base';\nimport {ListViewComponent} from '../list-view/list-view.component';\nimport {Observable} from 'rxjs';\nimport {FetchResultTyped} from '../models/fetchResult';\n\nexport abstract class DataSourceTyped<TDto> extends DataSourceBase {\n\n // noinspection JSUnusedGlobalSymbols\n protected constructor(mmTableComponent: ListViewComponent) {\n super(mmTableComponent);\n }\n\n public abstract override fetchData(queryOptions: FetchDataOptions): Observable<FetchResultTyped<TDto> | null>;\n}\n","import {TreeItemData} from '@meshmakers/shared-services';\n\nexport abstract class HierarchyDataSource {\n\n protected expandAllByDefault = false;\n\n public hasChildren(item: TreeItemData): boolean{\n return item.expandable;\n }\n\n public isExpanded(item: TreeItemData): boolean{\n return item.isExpanded || this.expandAllByDefault;\n }\n\n public abstract fetchChildren(item: TreeItemData): Promise<TreeItemData[]>;\n\n public abstract fetchRootNodes(): Promise<TreeItemData[]>;\n}\n\n","import {HierarchyDataSource} from './hierarchy-data-source';\nimport {TreeItemDataTyped} from '@meshmakers/shared-services';\n\nexport abstract class HierarchyDataSourceBase<TQueryDto> extends HierarchyDataSource {\n\n public abstract override fetchChildren(item: TreeItemDataTyped<TQueryDto>): Promise<TreeItemDataTyped<TQueryDto>[]>;\n\n public abstract override fetchRootNodes(): Promise<TreeItemDataTyped<TQueryDto>[]>;\n}\n\n","export interface FetchResult<T = unknown> {\n get data(): T;\n\n get totalCount(): number;\n}\n\nexport class FetchResultBase<T = unknown> implements FetchResult<T> {\n public constructor(\n private readonly _data: T,\n private readonly _totalCount: number,\n ) {\n }\n\n public get data(): T {\n return this._data;\n }\n\n public get totalCount(): number {\n return this._totalCount;\n }\n}\n\nexport class FetchResultTyped<TDto> implements FetchResult<(TDto | null)[]> {\n public constructor(\n private readonly _data: (TDto | null)[],\n private readonly _totalCount: number,\n ) {\n }\n\n public get data(): (TDto | null)[] {\n return this._data;\n }\n\n public get totalCount(): number {\n return this._totalCount;\n }\n}\n","export class ProgressValue {\n statusText: string | null;\n progressValue: number;\n\n constructor() {\n this.statusText = null;\n this.progressValue = 0;\n }\n}\n","export enum ImportStrategyDto {\n InsertOnly = 0,\n Upsert = 1\n}\n","import { ColumnDefinition } from '../list-view/list-view.model';\nimport { Observable } from 'rxjs';\n\n/**\n * Query options for fetching data in the dialog\n */\nexport interface DialogFetchOptions {\n /** Number of items to skip (for paging) */\n skip: number;\n\n /** Number of items to take (page size) */\n take: number;\n\n /** Text search filter */\n textSearch: string | null;\n}\n\n/**\n * Result from fetching data\n */\nexport interface DialogFetchResult<T> {\n /** Data items */\n data: (T | null)[];\n\n /** Total count of items matching the filter */\n totalCount: number;\n}\n\n/**\n * Interface for entity selection dialog data sources.\n * Combines grid configuration, data fetching, and entity display.\n */\nexport interface EntitySelectDialogDataSource<T> {\n /**\n * Get column definitions for the grid display\n * @returns Array of column definitions\n */\n getColumns(): ColumnDefinition[];\n\n /**\n * Fetch data for the grid with paging and filtering\n * @param options Query options including skip, take, and textSearch\n * @returns Observable of fetch result with data and total count\n */\n fetchData(options: DialogFetchOptions): Observable<DialogFetchResult<T>>;\n\n /**\n * Get display text for an entity\n * @param entity The entity to display\n * @returns String representation of the entity\n */\n onDisplayEntity(entity: T): string;\n\n /**\n * Get unique identifier for an entity\n * @param entity The entity to get ID from\n * @returns Unique identifier for the entity\n */\n getIdEntity(entity: T): string;\n}\n\n/**\n * Options for opening the entity select dialog\n */\nexport interface EntitySelectDialogOptions<T> {\n /** Dialog title */\n title: string;\n\n /** Allow multiple selection */\n multiSelect?: boolean;\n\n /** Pre-selected entities */\n selectedEntities?: T[];\n\n /** Dialog width (default: 800) */\n width?: number;\n\n /** Dialog height (default: 600) */\n height?: number;\n\n /** Translatable messages for the dialog UI */\n messages?: Partial<EntitySelectDialogMessages>;\n}\n\n/**\n * Result returned from the entity select dialog\n */\nexport interface EntitySelectDialogResult<T> {\n /** Selected entities (single item array for single-select) */\n selectedEntities: T[];\n}\n\n/**\n * Translatable messages for the entity select dialog.\n */\nexport interface EntitySelectDialogMessages {\n /** Search textbox placeholder. Default: \"Search...\" */\n searchPlaceholder: string;\n /** Cancel button text. Default: \"Cancel\" */\n cancelButton: string;\n /** Confirm button text. Default: \"OK\" */\n confirmButton: string;\n /** Text appended to the count of selected items (e.g. \"3 selected\"). Default: \"selected\" */\n selectedSuffix: string;\n /** Pager: \"items per page\" label */\n pagerItemsPerPage: string;\n /** Pager: \"of\" label between current and total */\n pagerOf: string;\n /** Pager: \"items\" label */\n pagerItems: string;\n /** Pager: \"Page\" label */\n pagerPage: string;\n /** Pager: tooltip for first page button */\n pagerFirstPage: string;\n /** Pager: tooltip for last page button */\n pagerLastPage: string;\n /** Pager: tooltip for previous page button */\n pagerPreviousPage: string;\n /** Pager: tooltip for next page button */\n pagerNextPage: string;\n}\n\nexport const DEFAULT_ENTITY_SELECT_DIALOG_MESSAGES: EntitySelectDialogMessages = {\n searchPlaceholder: 'Search...',\n cancelButton: 'Cancel',\n confirmButton: 'OK',\n selectedSuffix: 'selected',\n pagerItemsPerPage: 'items per page',\n pagerOf: 'of',\n pagerItems: 'items',\n pagerPage: 'Page',\n pagerFirstPage: 'Go to the first page',\n pagerLastPage: 'Go to the last page',\n pagerPreviousPage: 'Go to the previous page',\n pagerNextPage: 'Go to the next page',\n};\n\n/**\n * Translatable messages for the entity select input.\n */\nexport interface EntitySelectInputMessages {\n /** Autocomplete placeholder. Default: \"Select an entity...\" */\n placeholder: string;\n /** Advanced search link/button label. Default: \"Advanced Search...\" */\n advancedSearchLabel: string;\n /** Default dialog title. Default: \"Select Entity\" */\n dialogTitle: string;\n /** Template for \"no results\" message. Use {0} for the search term. Default: \"No entities found for \\\"{0}\\\"\" */\n noEntitiesFound: string;\n /** Template for minimum characters hint. Use {0} for the minimum count. Default: \"Type at least {0} characters to search...\" */\n minCharactersHint: string;\n /** Text appended to count for multi-select display (e.g. \"3 selected\"). Default: \"selected\" */\n selectedSuffix: string;\n}\n\nexport const DEFAULT_ENTITY_SELECT_INPUT_MESSAGES: EntitySelectInputMessages = {\n placeholder: 'Select an entity...',\n advancedSearchLabel: 'Advanced Search...',\n dialogTitle: 'Select Entity',\n noEntitiesFound: 'No entities found for \"{0}\"',\n minCharactersHint: 'Type at least {0} characters to search...',\n selectedSuffix: 'selected',\n};\n","import { Component, Input, inject, OnInit, OnDestroy, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WindowRef, WindowModule } from '@progress/kendo-angular-dialog';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport {\n GridComponent,\n ColumnComponent,\n PagerSettings,\n SelectableSettings,\n SelectionEvent,\n PageChangeEvent,\n CheckboxColumnComponent,\n CustomMessagesComponent\n} from '@progress/kendo-angular-grid';\nimport { TextBoxComponent } from '@progress/kendo-angular-inputs';\nimport { Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport {\n EntitySelectDialogDataSource,\n EntitySelectDialogResult,\n EntitySelectDialogMessages,\n DEFAULT_ENTITY_SELECT_DIALOG_MESSAGES\n} from './entity-select-dialog-data-source';\nimport { TableColumn } from '../list-view/list-view.model';\nimport { PascalCasePipe } from '../pipes/pascal-case.pipe';\n\n@Component({\n selector: 'mm-entity-select-dialog',\n standalone: true,\n imports: [\n CommonModule,\n ButtonsModule,\n WindowModule,\n GridComponent,\n ColumnComponent,\n CheckboxColumnComponent,\n CustomMessagesComponent,\n TextBoxComponent,\n PascalCasePipe\n ],\n template: `\n <div class=\"entity-select-dialog-content\">\n <div class=\"search-toolbar\">\n <kendo-textbox\n [style.width.px]=\"250\"\n [placeholder]=\"_messages.searchPlaceholder\"\n [value]=\"searchValue\"\n (valueChange)=\"onSearchChange($event ?? '')\">\n </kendo-textbox>\n </div>\n\n <kendo-grid\n [data]=\"gridData\"\n [pageSize]=\"pageSize\"\n [skip]=\"skip\"\n [pageable]=\"pageable\"\n [selectable]=\"selectableSettings\"\n [loading]=\"isLoading\"\n (pageChange)=\"onPageChange($event)\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"entity-grid\">\n\n <kendo-grid-messages\n [pagerItemsPerPage]=\"_messages.pagerItemsPerPage\"\n [pagerOf]=\"_messages.pagerOf\"\n [pagerItems]=\"_messages.pagerItems\"\n [pagerPage]=\"_messages.pagerPage\"\n [pagerFirstPage]=\"_messages.pagerFirstPage\"\n [pagerLastPage]=\"_messages.pagerLastPage\"\n [pagerPreviousPage]=\"_messages.pagerPreviousPage\"\n [pagerNextPage]=\"_messages.pagerNextPage\"\n ></kendo-grid-messages>\n\n <kendo-grid-checkbox-column\n [width]=\"40\"\n [showSelectAll]=\"multiSelect\">\n </kendo-grid-checkbox-column>\n\n <kendo-grid-column\n *ngFor=\"let column of columns\"\n [field]=\"column.field\"\n [title]=\"getDisplayName(column) | pascalCase\"\n [width]=\"column.width!\">\n </kendo-grid-column>\n\n </kendo-grid>\n\n <div class=\"selection-info\" *ngIf=\"selectedEntities.length > 0\">\n {{ selectedEntities.length }} {{ _messages.selectedSuffix }}\n </div>\n\n <div class=\"mm-dialog-actions\">\n <button kendoButton (click)=\"onCancel()\">{{ _messages.cancelButton }}</button>\n <button kendoButton\n themeColor=\"primary\"\n [disabled]=\"selectedEntities.length === 0\"\n (click)=\"onConfirm()\">\n {{ _messages.confirmButton }}\n </button>\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.Eager,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .entity-select-dialog-content {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n padding: 16px 20px;\n box-sizing: border-box;\n gap: 12px;\n }\n\n .search-toolbar {\n flex-shrink: 0;\n }\n\n .entity-grid {\n flex: 1;\n min-height: 200px;\n border: 1px solid var(--kendo-color-border);\n }\n\n .selection-info {\n padding: 8px 0;\n font-size: 12px;\n color: var(--kendo-color-subtle);\n flex-shrink: 0;\n }\n\n `]\n})\nexport class EntitySelectDialogComponent<T> implements OnInit, OnDestroy {\n private readonly windowRef = inject(WindowRef);\n private searchSubject = new Subject<string>();\n private destroy$ = new Subject<void>();\n\n @Input() dataSource!: EntitySelectDialogDataSource<T>;\n @Input() multiSelect = false;\n @Input() preSelectedEntities: T[] = [];\n\n _messages: EntitySelectDialogMessages = {...DEFAULT_ENTITY_SELECT_DIALOG_MESSAGES};\n\n @Input() set messages(value: Partial<EntitySelectDialogMessages>) {\n this._messages = {...DEFAULT_ENTITY_SELECT_DIALOG_MESSAGES, ...value};\n }\n\n columns: TableColumn[] = [];\n gridData: { data: T[]; total: number } = { data: [], total: 0 };\n selectedEntities: T[] = [];\n selectedKeys: string[] = [];\n isLoading = false;\n searchValue = '';\n pageSize = 10;\n skip = 0;\n\n pageable: PagerSettings = {\n buttonCount: 5,\n info: true,\n type: 'numeric',\n pageSizes: [5, 10, 20, 50],\n previousNext: true\n };\n\n get selectableSettings(): SelectableSettings {\n return {\n enabled: true,\n mode: this.multiSelect ? 'multiple' : 'single',\n checkboxOnly: true\n };\n }\n\n ngOnInit(): void {\n this.initializeColumns();\n this.setupSearch();\n this.loadData();\n\n // Set pre-selected entities\n if (this.preSelectedEntities.length > 0) {\n this.selectedEntities = [...this.preSelectedEntities];\n this.selectedKeys = this.preSelectedEntities.map(e => this.dataSource.getIdEntity(e));\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private initializeColumns(): void {\n const columnDefs = this.dataSource.getColumns();\n this.columns = columnDefs.map(col => {\n if (typeof col === 'string') {\n return { field: col, dataType: 'text' as const };\n }\n return col as TableColumn;\n });\n }\n\n private setupSearch(): void {\n this.searchSubject.pipe(\n debounceTime(400),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.skip = 0;\n this.loadData();\n });\n }\n\n private loadData(): void {\n if (!this.dataSource) return;\n\n this.isLoading = true;\n\n this.dataSource.fetchData({\n skip: this.skip,\n take: this.pageSize,\n textSearch: this.searchValue || null\n }).subscribe({\n next: (result) => {\n this.gridData = {\n data: (result?.data ?? []).filter((item): item is T => item !== null),\n total: result?.totalCount ?? 0\n };\n this.isLoading = false;\n },\n error: (err) => {\n console.error('Error loading data:', err);\n this.gridData = { data: [], total: 0 };\n this.isLoading = false;\n }\n });\n }\n\n getDisplayName(column: TableColumn): string {\n return column.displayName ?? column.field;\n }\n\n onSearchChange(value: string | null): void {\n this.searchValue = value || '';\n this.searchSubject.next(this.searchValue);\n }\n\n onPageChange(event: PageChangeEvent): void {\n this.skip = event.skip;\n this.pageSize = event.take;\n this.loadData();\n }\n\n onSelectionChange(event: SelectionEvent): void {\n // Handle selected rows\n if (event.selectedRows) {\n for (const row of event.selectedRows) {\n if (row.dataItem && !this.selectedEntities.includes(row.dataItem)) {\n if (!this.multiSelect) {\n // Single select: replace selection\n this.selectedEntities = [row.dataItem];\n this.selectedKeys = [this.dataSource.getIdEntity(row.dataItem)];\n } else {\n // Multi select: add to selection\n this.selectedEntities.push(row.dataItem);\n this.selectedKeys.push(this.dataSource.getIdEntity(row.dataItem));\n }\n }\n }\n }\n\n // Handle deselected rows\n if (event.deselectedRows) {\n for (const row of event.deselectedRows) {\n if (row.dataItem) {\n const id = this.dataSource.getIdEntity(row.dataItem);\n const index = this.selectedKeys.indexOf(id);\n if (index > -1) {\n this.selectedEntities.splice(index, 1);\n this.selectedKeys.splice(index, 1);\n }\n }\n }\n }\n }\n\n onConfirm(): void {\n const result: EntitySelectDialogResult<T> = {\n selectedEntities: this.selectedEntities\n };\n this.windowRef.close(result);\n }\n\n onCancel(): void {\n this.windowRef.close();\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { WindowService, WindowCloseResult } from '@progress/kendo-angular-dialog';\nimport { firstValueFrom } from 'rxjs';\nimport { EntitySelectDialogComponent } from './entity-select-dialog.component';\nimport {\n EntitySelectDialogDataSource,\n EntitySelectDialogOptions,\n EntitySelectDialogResult\n} from './entity-select-dialog-data-source';\nimport { WindowStateService } from '../services/window-state.service';\n\n@Injectable()\nexport class EntitySelectDialogService {\n private readonly windowService = inject(WindowService);\n private readonly windowStateService = inject(WindowStateService);\n\n /**\n * Opens the entity select dialog\n * @param dataSource The data source providing grid data and column definitions\n * @param options Dialog configuration options\n * @returns Promise resolving to selected entities or null if cancelled\n */\n async open<T>(\n dataSource: EntitySelectDialogDataSource<T>,\n options: EntitySelectDialogOptions<T>\n ): Promise<EntitySelectDialogResult<T> | null> {\n const defaultWidth = options.width ?? 900;\n const defaultHeight = options.height ?? 640;\n const minWidth = 550;\n const minHeight = 400;\n // Pass min so stale persisted sizes get clamped on the current open too. The\n // applyModalBehavior pass below will also drop sub-min entries from storage.\n const size = this.windowStateService.resolveWindowSize(\n 'entity-select',\n { width: defaultWidth, height: defaultHeight },\n { width: minWidth, height: minHeight }\n );\n\n const windowRef = this.windowService.open({\n title: options.title,\n content: EntitySelectDialogComponent,\n width: size.width,\n height: size.height,\n minWidth,\n minHeight,\n resizable: true\n });\n\n this.windowStateService.applyModalBehavior('entity-select', windowRef);\n\n const contentRef = windowRef.content as { instance?: EntitySelectDialogComponent<T> } | undefined;\n if (contentRef?.instance) {\n contentRef.instance.dataSource = dataSource;\n contentRef.instance.multiSelect = options.multiSelect ?? false;\n contentRef.instance.preSelectedEntities = options.selectedEntities ?? [];\n if (options.messages) {\n contentRef.instance.messages = options.messages;\n }\n }\n\n const result = await firstValueFrom(windowRef.result);\n\n if (result instanceof WindowCloseResult) {\n return null;\n }\n\n if (result && typeof result === 'object' && 'selectedEntities' in result) {\n return result as EntitySelectDialogResult<T>;\n }\n\n return null;\n }\n}\n","import {\n Component,\n OnInit,\n OnDestroy,\n Input,\n Output,\n EventEmitter,\n forwardRef,\n ElementRef,\n ViewChild,\n inject,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {\n FormControl,\n ReactiveFormsModule,\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n Validator,\n AbstractControl,\n ValidationErrors,\n NG_VALIDATORS\n} from '@angular/forms';\nimport {AutoCompleteModule, AutoCompleteComponent} from '@progress/kendo-angular-dropdowns';\nimport {LoaderModule} from '@progress/kendo-angular-indicators';\nimport {ButtonsModule} from '@progress/kendo-angular-buttons';\nimport {IconsModule, SVGIconModule} from '@progress/kendo-angular-icons';\nimport {xIcon, searchIcon} from '@progress/kendo-svg-icons';\nimport {EntitySelectDataSource} from '@meshmakers/shared-services';\nimport {Subject, of} from 'rxjs';\nimport {debounceTime, distinctUntilChanged, switchMap, tap, catchError} from 'rxjs/operators';\nimport {\n EntitySelectDialogDataSource,\n EntitySelectInputMessages,\n DEFAULT_ENTITY_SELECT_INPUT_MESSAGES,\n EntitySelectDialogMessages\n} from '../entity-select-dialog/entity-select-dialog-data-source';\nimport {EntitySelectDialogService} from '../entity-select-dialog/entity-select-dialog.service';\n\n@Component({\n selector: 'mm-entity-select-input',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n AutoCompleteModule,\n LoaderModule,\n ButtonsModule,\n IconsModule,\n SVGIconModule\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => EntitySelectInputComponent),\n multi: true\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => EntitySelectInputComponent),\n multi: true\n }\n ],\n template: `\n <div class=\"entity-select-wrapper\" [class.disabled]=\"disabled\" [class.has-dialog-button]=\"dialogDataSource\">\n <kendo-autocomplete\n #autocomplete\n [formControl]=\"searchFormControl\"\n [data]=\"filteredEntities\"\n [loading]=\"isLoading\"\n [disabled]=\"disabled\"\n [placeholder]=\"placeholder || _messages.placeholder\"\n [suggest]=\"true\"\n [clearButton]=\"true\"\n [filterable]=\"true\"\n (filterChange)=\"onFilterChange($event)\"\n (valueChange)=\"onSelectionChange($event)\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n class=\"entity-autocomplete\">\n\n <!-- Custom item template -->\n <ng-template kendoAutoCompleteItemTemplate let-dataItem>\n <div class=\"entity-item\">\n {{ dataItem }}\n </div>\n </ng-template>\n\n <!-- No data template -->\n <ng-template kendoAutoCompleteNoDataTemplate>\n <div class=\"no-data-message\">\n <span *ngIf=\"!isLoading && searchFormControl.value && searchFormControl.value.length >= minSearchLength\">\n {{ formatMessage(_messages.noEntitiesFound, searchFormControl.value) }}\n </span>\n <span *ngIf=\"!isLoading && (!searchFormControl.value || searchFormControl.value.length < minSearchLength)\">\n {{ formatMessage(_messages.minCharactersHint, minSearchLength) }}\n </span>\n </div>\n </ng-template>\n\n <!-- Footer template with advanced search link -->\n <ng-template kendoAutoCompleteFooterTemplate *ngIf=\"dialogDataSource\">\n <div class=\"advanced-search-footer\" (click)=\"openAdvancedSearch($event)\">\n <kendo-svg-icon [icon]=\"searchIcon\" size=\"small\"></kendo-svg-icon>\n <span>{{ advancedSearchLabel || _messages.advancedSearchLabel }}</span>\n </div>\n </ng-template>\n\n </kendo-autocomplete>\n\n <!-- Dialog button (always visible when dialogDataSource is set) -->\n <button *ngIf=\"dialogDataSource\"\n kendoButton\n type=\"button\"\n fillMode=\"flat\"\n [svgIcon]=\"searchIcon\"\n [disabled]=\"disabled\"\n [title]=\"advancedSearchLabel || _messages.advancedSearchLabel\"\n class=\"dialog-button\"\n (click)=\"openAdvancedSearch()\">\n </button>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.Eager,\n styles: [`\n :host {\n display: block;\n width: 100%;\n }\n\n .entity-select-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n gap: 4px;\n }\n\n .entity-select-wrapper.disabled {\n opacity: 0.6;\n pointer-events: none;\n }\n\n .entity-autocomplete {\n flex: 1;\n min-width: 0;\n }\n\n .dialog-button {\n flex-shrink: 0;\n height: 30px;\n width: 30px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .clear-button {\n position: absolute;\n right: 32px;\n top: 50%;\n transform: translateY(-50%);\n z-index: 1;\n padding: 4px;\n min-width: auto;\n height: 20px;\n width: 20px;\n }\n\n .entity-item {\n padding: 4px 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .no-data-message {\n padding: 8px 12px;\n color: var(--kendo-color-subtle);\n font-style: italic;\n text-align: center;\n }\n\n .advanced-search-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n color: var(--kendo-color-primary);\n border-top: 1px solid var(--kendo-color-border);\n background: var(--kendo-color-surface-alt);\n transition: background-color 0.2s;\n }\n\n .advanced-search-footer:hover {\n background: var(--kendo-color-base-hover);\n }\n\n /* Override Kendo styles for better integration */\n ::ng-deep .entity-autocomplete .k-input-inner {\n padding-right: 60px !important; /* Make room for clear button */\n }\n\n ::ng-deep .entity-autocomplete.k-disabled .k-input-inner {\n padding-right: 32px !important; /* Normal padding when disabled */\n }\n `]\n})\nexport class EntitySelectInputComponent implements OnInit, OnDestroy, ControlValueAccessor, Validator {\n @ViewChild('autocomplete', {static: true}) autocomplete!: AutoCompleteComponent;\n\n // Inputs\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- generic component accepts any entity type\n @Input() dataSource!: EntitySelectDataSource<any>;\n @Input() placeholder = '';\n @Input() minSearchLength = 3;\n @Input() maxResults = 50;\n @Input() debounceMs = 300;\n @Input() prefix = '';\n\n // Initial display value (e.g. when restoring a previously selected entity by name)\n @Input() set initialDisplayValue(value: string | undefined) {\n if (value && !this.selectedEntity) {\n this.searchFormControl.setValue(value, { emitEvent: false });\n }\n }\n\n // Dialog inputs\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- generic component accepts any entity type\n @Input() dialogDataSource?: EntitySelectDialogDataSource<any>;\n @Input() dialogTitle = '';\n @Input() multiSelect = false;\n @Input() advancedSearchLabel = '';\n\n // Dialog messages (passed through to the dialog component)\n @Input() dialogMessages?: Partial<EntitySelectDialogMessages>;\n\n // Messages\n _messages: EntitySelectInputMessages = {...DEFAULT_ENTITY_SELECT_INPUT_MESSAGES};\n\n @Input() set messages(value: Partial<EntitySelectInputMessages>) {\n this._messages = {...DEFAULT_ENTITY_SELECT_INPUT_MESSAGES, ...value};\n }\n\n private _disabled = false;\n @Input()\n get disabled(): boolean {\n return this._disabled;\n }\n\n set disabled(value: boolean) {\n this._disabled = !!value;\n if (this._disabled) {\n this.searchFormControl.disable();\n } else {\n this.searchFormControl.enable();\n }\n }\n\n private _required = false;\n @Input()\n get required(): boolean {\n return this._required;\n }\n\n set required(value: boolean) {\n this._required = !!value;\n }\n\n // Outputs\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- generic component emits any entity type\n @Output() entitySelected = new EventEmitter<any>();\n @Output() entityCleared = new EventEmitter<void>();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- generic component emits any entity type\n @Output() entitiesSelected = new EventEmitter<any[]>(); // For multi-select from dialog\n\n // Form control and state\n public searchFormControl = new FormControl();\n public filteredEntities: string[] = [];\n public selectedEntity: unknown = null;\n public isLoading = false;\n private entityMap = new Map<string, unknown>();\n\n // Private members\n private searchSubject = new Subject<string>();\n private destroy$ = new Subject<void>();\n private onChange: (value: unknown) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n // Icons\n protected readonly clearIcon = xIcon;\n protected readonly searchIcon = searchIcon;\n\n // Injected dependencies\n private elRef = inject(ElementRef);\n private dialogService = inject(EntitySelectDialogService, { optional: true });\n\n formatMessage(template: string, ...args: unknown[]): string {\n return template.replace(/\\{(\\d+)\\}/g, (_, index) => String(args[+index] ?? ''));\n }\n\n ngOnInit(): void {\n this.setupSearch();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ControlValueAccessor implementation\n writeValue(value: unknown): void {\n if (value !== this.selectedEntity) {\n this.selectedEntity = value;\n if (value && this.dataSource) {\n // Set the display value in the input\n const displayText = this.dataSource.onDisplayEntity(value);\n this.searchFormControl.setValue(displayText, {emitEvent: false});\n } else {\n this.searchFormControl.setValue('', {emitEvent: false});\n }\n }\n }\n\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(_isDisabled: boolean): void {\n this.disabled = _isDisabled;\n }\n\n // Validator implementation\n validate(control: AbstractControl): ValidationErrors | null {\n if (this.required && !this.selectedEntity) {\n return {required: true};\n }\n\n // Validate that the value is an actual entity, not just a string\n const value = control.value;\n if (value && typeof value === 'string') {\n return {invalidEntity: true};\n }\n\n return null;\n }\n\n // Event handlers\n onFilterChange(event: string): void {\n const filter = event;\n if (!filter || filter.length < this.minSearchLength) {\n this.filteredEntities = [];\n return;\n }\n\n this.searchSubject.next(filter);\n }\n\n onSelectionChange(value: string): void {\n if (value && typeof value === 'string') {\n // Find the entity that matches the selected display text\n const entity = this.entityMap.get(value);\n if (entity) {\n this.selectEntity(entity);\n }\n }\n }\n\n onFocus(): void {\n // Optional: Trigger search on focus if there's already text\n const currentValue = this.searchFormControl.value;\n if (currentValue && currentValue.length >= this.minSearchLength && this.filteredEntities.length === 0) {\n this.searchSubject.next(currentValue);\n }\n }\n\n onBlur(): void {\n this.onTouched();\n\n // Auto-select if there's exactly one result\n if (this.filteredEntities.length === 1 && !this.selectedEntity) {\n const displayText = this.filteredEntities[0];\n const entity = this.entityMap.get(displayText);\n if (entity) {\n this.selectEntity(entity);\n }\n }\n }\n\n // Public methods\n public clear(): void {\n this.selectedEntity = null;\n this.filteredEntities = [];\n this.entityMap.clear();\n this.searchFormControl.setValue('', {emitEvent: false});\n this.onChange(null);\n this.entityCleared.emit();\n this.autocomplete.focus();\n }\n\n public focus(): void {\n if (this.autocomplete) {\n this.autocomplete.focus();\n }\n }\n\n public reset(): void {\n this.clear();\n }\n\n // Private methods\n private setupSearch(): void {\n this.searchSubject.pipe(\n debounceTime(this.debounceMs),\n distinctUntilChanged(),\n tap(() => {\n this.isLoading = true;\n this.filteredEntities = [];\n }),\n switchMap(filter => {\n if (!this.dataSource) {\n return of({totalCount: 0, items: []});\n }\n\n if (filter.startsWith(this.prefix)) {\n if (typeof filter === 'string') {\n filter = filter.replace(this.prefix, '').trim();\n return this.dataSource.onFilter(filter, this.maxResults).catch(error => {\n console.error('Entity search error:', error);\n return {totalCount: 0, items: []};\n });\n } else {\n return of({totalCount: 0, items: []});\n }\n } else {\n return this.dataSource.onFilter(filter, this.maxResults).catch(error => {\n console.error('Entity search error:', error);\n return {totalCount: 0, items: []};\n });\n }\n }),\n catchError(error => {\n console.error('Search error:', error);\n return of({totalCount: 0, items: []});\n })\n ).subscribe(result => {\n this.isLoading = false;\n\n if (this.prefix && result.items.length === 1) {\n // Auto-select if exactly one match in prefix mode\n this.selectEntity(result.items[0]);\n return;\n }\n // Store both the display strings and the entities\n this.filteredEntities = result.items.map(entity => this.dataSource.onDisplayEntity(entity));\n this.entityMap = new Map(result.items.map(entity => [this.dataSource.onDisplayEntity(entity), entity]));\n });\n }\n\n private selectEntity(entity: unknown): void {\n this.selectedEntity = entity;\n const displayText = this.dataSource.onDisplayEntity(entity);\n this.searchFormControl.setValue(displayText, {emitEvent: false});\n this.filteredEntities = [];\n this.onChange(entity);\n this.entitySelected.emit(entity);\n this.autocomplete.closeActionSheet();\n }\n\n // Advanced search dialog\n public async openAdvancedSearch(event?: Event): Promise<void> {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (!this.dialogDataSource || !this.dialogService) {\n console.warn('Dialog data source or dialog service not available');\n return;\n }\n\n // Close the autocomplete dropdown\n this.autocomplete.toggle(false);\n\n const result = await this.dialogService.open(this.dialogDataSource, {\n title: this.dialogTitle || this._messages.dialogTitle,\n multiSelect: this.multiSelect,\n selectedEntities: this.selectedEntity ? [this.selectedEntity] : [],\n messages: this.dialogMessages,\n });\n\n if (result && result.selectedEntities.length > 0) {\n if (this.multiSelect) {\n // Multi-select: emit all selected entities\n this.entitiesSelected.emit(result.selectedEntities);\n // For form control, set the first entity\n if (result.selectedEntities.length === 1) {\n this.selectEntity(result.selectedEntities[0]);\n } else {\n // Multiple selected - update display to show count\n const displayText = `${result.selectedEntities.length} ${this._messages.selectedSuffix}`;\n this.searchFormControl.setValue(displayText, {emitEvent: false});\n this.selectedEntity = result.selectedEntities;\n this.onChange(result.selectedEntities);\n }\n } else {\n // Single select: use the first (and only) entity\n this.selectEntity(result.selectedEntities[0]);\n }\n }\n }\n}\n","import {inject, Injectable} from '@angular/core';\nimport {CanDeactivate} from '@angular/router';\nimport {HasUnsavedChanges} from './unsaved-changes.interface';\nimport {ConfirmationService} from '../services/confirmation.service';\nimport {ButtonTypes, ConfirmationButtonLabels} from '../models/confirmation';\n\n/**\n * Guard that prevents navigation when a component has unsaved changes.\n * The component must implement the HasUnsavedChanges interface.\n *\n * Usage in routes:\n * ```typescript\n * {\n * path: 'edit/:id',\n * component: MyEditorComponent,\n * canDeactivate: [UnsavedChangesGuard]\n * }\n * ```\n *\n * The component must implement HasUnsavedChanges:\n * ```typescript\n * export class MyEditorComponent implements HasUnsavedChanges {\n * hasUnsavedChanges(): boolean {\n * return this.form.dirty;\n * }\n *\n * async saveChanges(): Promise<boolean> {\n * // Save logic here\n * return true;\n * }\n * }\n * ```\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class UnsavedChangesGuard implements CanDeactivate<HasUnsavedChanges> {\n private readonly confirmationService = inject(ConfirmationService);\n\n async canDeactivate(component: HasUnsavedChanges): Promise<boolean> {\n // If component doesn't implement the interface or has no changes, allow navigation\n if (!component || typeof component.hasUnsavedChanges !== 'function') {\n return true;\n }\n\n if (!component.hasUnsavedChanges()) {\n return true;\n }\n\n // Get optional translated messages from the component\n const msgs = typeof component.unsavedChangesMessages === 'function'\n ? component.unsavedChangesMessages()\n : undefined;\n const title = msgs?.title ?? 'Unsaved Changes';\n const buttonLabels: ConfirmationButtonLabels | undefined = (msgs?.yesButton || msgs?.noButton || msgs?.cancelButton)\n ? { yes: msgs?.yesButton, no: msgs?.noButton, cancel: msgs?.cancelButton }\n : undefined;\n\n // Component has unsaved changes - ask user what to do\n if (typeof component.saveChanges === 'function') {\n // Component supports saving - show Yes/No/Cancel dialog\n const message = msgs?.savePrompt ?? 'You have unsaved changes. Do you want to save before leaving?';\n const result = await this.confirmationService.showYesNoCancelConfirmationDialog(title, message, buttonLabels);\n\n if (result === undefined) {\n // Dialog was closed without selection - cancel navigation\n return false;\n }\n\n switch (result.result) {\n case ButtonTypes.Yes: {\n // Try to save\n const saved = await component.saveChanges();\n return saved; // Allow navigation only if save succeeded\n }\n\n case ButtonTypes.No:\n // Discard changes and navigate\n return true;\n\n case ButtonTypes.Cancel:\n // Cancel navigation\n return false;\n\n default:\n return false;\n }\n } else {\n // Component doesn't support saving - show simple Yes/No dialog\n const message = msgs?.discardPrompt ?? 'You have unsaved changes. Are you sure you want to leave? Your changes will be lost.';\n const confirmed = await this.confirmationService.showYesNoConfirmationDialog(title, message, undefined, buttonLabels);\n\n return confirmed;\n }\n }\n}\n","export interface SaveAsDialogMessages {\n nameLabel: string;\n placeholder: string;\n save: string;\n cancel: string;\n patternError: string;\n nameRequired: string;\n /** `{0}` is replaced with the minimum length. */\n nameTooShort: string;\n /** `{0}` is replaced with the maximum length. */\n nameTooLong: string;\n checkingAvailability: string;\n nameAvailable: string;\n nameAlreadyTaken: string;\n}\n\nexport const DEFAULT_SAVE_AS_DIALOG_MESSAGES: SaveAsDialogMessages = {\n nameLabel: 'Name',\n placeholder: 'Enter name...',\n save: 'Save',\n cancel: 'Cancel',\n patternError: 'Invalid name format',\n nameRequired: 'Name is required',\n nameTooShort: 'Name must be at least {0} characters',\n nameTooLong: 'Name must be at most {0} characters',\n checkingAvailability: 'Checking availability...',\n nameAvailable: 'Name is available',\n nameAlreadyTaken: 'Name is already taken',\n};\n","import { Component, OnInit, OnDestroy, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { DialogRef, DialogModule, DialogContentBase } from '@progress/kendo-angular-dialog';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { LabelModule } from '@progress/kendo-angular-label';\nimport { IndicatorsModule } from '@progress/kendo-angular-indicators';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, switchMap, tap } from 'rxjs/operators';\nimport {\n SaveAsDialogOptions,\n SaveAsDialogResult,\n SaveAsDialogDataSource,\n NameAvailabilityResult\n} from './save-as-dialog-data-source';\nimport {\n SaveAsDialogMessages,\n DEFAULT_SAVE_AS_DIALOG_MESSAGES,\n} from './save-as-dialog.messages';\nimport { MmDialogActionsDirective } from '../dialog-actions/dialog-actions.directive';\n\n@Component({\n selector: 'mm-save-as-dialog',\n standalone: true,\n imports: [\n MmDialogActionsDirective,\n CommonModule,\n ReactiveFormsModule,\n DialogModule,\n ButtonsModule,\n InputsModule,\n LabelModule,\n IndicatorsModule\n ],\n template: `\n <div class=\"save-as-container\">\n <div class=\"form-group\">\n <kendo-label [for]=\"nameInput\" [text]=\"nameLabel\"></kendo-label>\n <kendo-textbox\n #nameInput\n [formControl]=\"nameControl\"\n [placeholder]=\"placeholder\"\n [maxlength]=\"maxLength\"\n class=\"name-input\">\n </kendo-textbox>\n\n <div class=\"validation-container\">\n <div class=\"validation-message error\" *ngIf=\"nameControl.touched && nameControl.errors?.['required']\">\n {{ _messages.nameRequired }}\n </div>\n <div class=\"validation-message error\" *ngIf=\"nameControl.touched && nameControl.errors?.['minlength']\">\n {{ formatNameTooShort(minLength) }}\n </div>\n <div class=\"validation-message error\" *ngIf=\"nameControl.touched && nameControl.errors?.['maxlength']\">\n {{ formatNameTooLong(maxLength) }}\n </div>\n <div class=\"validation-message error\" *ngIf=\"nameControl.touched && nameControl.errors?.['pattern']\">\n {{ patternErrorMessage }}\n </div>\n <div class=\"validation-message error\" *ngIf=\"nameControl.touched && nameControl.errors?.['nameTaken']\">\n {{ availabilityMessage }}\n </div>\n\n <div class=\"availability-check\" *ngIf=\"isCheckingAvailability\">\n <kendo-loader size=\"small\" type=\"pulsing\"></kendo-loader>\n <span>{{ _messages.checkingAvailability }}</span>\n </div>\n\n <div class=\"validation-message success\" *ngIf=\"isNameAvailable && !isCheckingAvailability && nameControl.valid\">\n {{ _messages.nameAvailable }}\n </div>\n </div>\n </div>\n </div>\n\n <kendo-dialog-actions>\n <button kendoButton (click)=\"onCancel()\">{{ cancelButtonText }}</button>\n <button\n kendoButton\n themeColor=\"primary\"\n [disabled]=\"!canSave()\"\n (click)=\"onSave()\">\n {{ saveButtonText }}\n </button>\n </kendo-dialog-actions>\n `,\n changeDetection: ChangeDetectionStrategy.Eager,\n styles: [`\n .save-as-container {\n padding: 20px;\n min-width: 350px;\n }\n\n .form-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .name-input {\n width: 100%;\n }\n\n .validation-container {\n min-height: 24px;\n }\n\n .validation-message {\n font-size: 12px;\n padding: 4px 0;\n }\n\n .validation-message.error {\n color: var(--kendo-color-error, #dc3545);\n }\n\n .validation-message.success {\n color: var(--kendo-color-success, #28a745);\n }\n\n .availability-check {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: var(--kendo-color-subtle, #6c757d);\n }\n `]\n})\nexport class SaveAsDialogComponent extends DialogContentBase implements OnInit, OnDestroy {\n public nameControl = new FormControl('', { nonNullable: true });\n\n public nameLabel = DEFAULT_SAVE_AS_DIALOG_MESSAGES.nameLabel;\n public placeholder = DEFAULT_SAVE_AS_DIALOG_MESSAGES.placeholder;\n public saveButtonText = DEFAULT_SAVE_AS_DIALOG_MESSAGES.save;\n public cancelButtonText = DEFAULT_SAVE_AS_DIALOG_MESSAGES.cancel;\n public minLength = 1;\n public maxLength = 255;\n public patternErrorMessage = DEFAULT_SAVE_AS_DIALOG_MESSAGES.patternError;\n\n public isCheckingAvailability = false;\n public isNameAvailable = false;\n public availabilityMessage = '';\n\n public _messages: SaveAsDialogMessages = { ...DEFAULT_SAVE_AS_DIALOG_MESSAGES };\n\n private dataSource?: SaveAsDialogDataSource;\n private debounceMs = 300;\n private subscriptions = new Subscription();\n private checkSubject = new Subject<string>();\n\n constructor() {\n super(inject(DialogRef));\n }\n\n ngOnInit(): void {\n const options = (this.dialog.content as { instance?: { options?: SaveAsDialogOptions } })?.instance?.options;\n\n if (options) {\n this._messages = { ...DEFAULT_SAVE_AS_DIALOG_MESSAGES, ...(options.messages ?? {}) };\n this.nameLabel = options.nameLabel || this._messages.nameLabel;\n this.placeholder = options.placeholder || this._messages.placeholder;\n this.saveButtonText = options.saveButtonText || this._messages.save;\n this.cancelButtonText = options.cancelButtonText || this._messages.cancel;\n this.minLength = options.minLength ?? 1;\n this.maxLength = options.maxLength ?? 255;\n this.patternErrorMessage = options.patternErrorMessage || this._messages.patternError;\n this.dataSource = options.dataSource;\n this.debounceMs = options.debounceTime ?? 300;\n\n const validators = [\n Validators.required,\n Validators.minLength(this.minLength),\n Validators.maxLength(this.maxLength)\n ];\n\n if (options.pattern) {\n validators.push(Validators.pattern(options.pattern));\n }\n\n this.nameControl.setValidators(validators);\n\n if (options.suggestedName) {\n this.nameControl.setValue(options.suggestedName);\n }\n }\n\n if (this.dataSource) {\n this.setupAvailabilityCheck();\n }\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n this.checkSubject.complete();\n }\n\n protected formatNameTooShort(min: number): string {\n return this._messages.nameTooShort.replace('{0}', String(min));\n }\n\n protected formatNameTooLong(max: number): string {\n return this._messages.nameTooLong.replace('{0}', String(max));\n }\n\n private setupAvailabilityCheck(): void {\n this.subscriptions.add(\n this.checkSubject.pipe(\n debounceTime(this.debounceMs),\n distinctUntilChanged(),\n tap(() => {\n this.isCheckingAvailability = true;\n this.isNameAvailable = false;\n }),\n switchMap(name => this.dataSource!.checkNameAvailability(name))\n ).subscribe({\n next: (result: NameAvailabilityResult) => {\n this.isCheckingAvailability = false;\n this.isNameAvailable = result.isAvailable;\n this.availabilityMessage = result.message || this._messages.nameAlreadyTaken;\n\n if (!result.isAvailable) {\n this.nameControl.setErrors({ ...this.nameControl.errors, nameTaken: true });\n } else {\n if (this.nameControl.errors?.['nameTaken']) {\n const { nameTaken, ...otherErrors } = this.nameControl.errors;\n this.nameControl.setErrors(Object.keys(otherErrors).length ? otherErrors : null);\n }\n }\n },\n error: () => {\n this.isCheckingAvailability = false;\n }\n })\n );\n\n this.subscriptions.add(\n this.nameControl.valueChanges.subscribe(value => {\n if (value && value.length >= this.minLength && !this.nameControl.errors?.['pattern']) {\n this.checkSubject.next(value);\n } else {\n this.isNameAvailable = false;\n }\n })\n );\n }\n\n public canSave(): boolean {\n if (this.isCheckingAvailability) {\n return false;\n }\n\n if (!this.nameControl.valid) {\n return false;\n }\n\n if (this.dataSource && !this.isNameAvailable) {\n return false;\n }\n\n return true;\n }\n\n public onSave(): void {\n if (!this.canSave()) {\n return;\n }\n\n const result: SaveAsDialogResult = {\n confirmed: true,\n name: this.nameControl.value\n };\n this.dialog.close(result);\n }\n\n public onCancel(): void {\n const result: SaveAsDialogResult = {\n confirmed: false\n };\n this.dialog.close(result);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { DialogService, DialogRef } from '@progress/kendo-angular-dialog';\nimport { firstValueFrom } from 'rxjs';\nimport { SaveAsDialogComponent } from './save-as-dialog.component';\nimport { SaveAsDialogOptions, SaveAsDialogResult } from './save-as-dialog-data-source';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SaveAsDialogService {\n private readonly dialogService = inject(DialogService);\n\n /**\n * Opens a Save As dialog\n * @param options Dialog options including title, suggested name, and optional data source for validation\n * @returns Promise that resolves with the result containing confirmed status and entered name\n */\n public async showSaveAsDialog(options: SaveAsDialogOptions): Promise<SaveAsDialogResult> {\n const dialogRef: DialogRef = this.dialogService.open({\n content: SaveAsDialogComponent,\n width: options.width ?? 450,\n title: options.title\n });\n\n // Pass options to the component\n const contentRef = dialogRef.content as { instance?: { options?: SaveAsDialogOptions } };\n if (contentRef?.instance) {\n contentRef.instance.options = options;\n }\n\n try {\n const result = await firstValueFrom(dialogRef.result);\n\n if (result && typeof result === 'object' && 'confirmed' in result) {\n return result as SaveAsDialogResult;\n } else {\n return { confirmed: false };\n }\n } catch {\n // Dialog was closed without result (e.g., ESC key, X button)\n return { confirmed: false };\n }\n }\n}\n","/**\n * The type of time range selection\n */\nexport type TimeRangeType = 'year' | 'quarter' | 'month' | 'day' | 'relative' | 'custom';\n\n/**\n * The unit for relative time calculations\n */\nexport type RelativeTimeUnit = 'hours' | 'days' | 'weeks' | 'months';\n\n/**\n * Represents a time range with start and end dates\n */\nexport interface TimeRange {\n /** Start of the time range */\n from: Date;\n /** End of the time range */\n to: Date;\n}\n\n/**\n * Represents a time range as ISO 8601 strings\n */\nexport interface TimeRangeISO {\n /** Start of the time range in ISO 8601 format */\n from: string;\n /** End of the time range in ISO 8601 format */\n to: string;\n}\n\n/**\n * Quarter number (1-4)\n */\nexport type Quarter = 1 | 2 | 3 | 4;\n\n/**\n * Timezone basis for resolving calendar boundaries (year/quarter/month/day/custom).\n *\n * - `'local'` (default): boundaries are wall-clock instants in the browser's\n * local timezone — e.g. year 2026 = `[Jan 1 00:00 local, Jan 1 next-year 00:00 local)`.\n * - `'utc'`: boundaries are wall-clock instants in UTC — e.g. year 2026 =\n * `[2026-01-01T00:00:00Z, 2027-01-01T00:00:00Z)`.\n * - any **IANA time-zone id** (e.g. `'Europe/Vienna'`, `'Europe/Lisbon'`): boundaries\n * are wall-clock instants in that zone, resolved DST-correctly regardless of the\n * browser's own zone — so \"yesterday in `Europe/Lisbon`\" is right even from a Vienna\n * browser (AB#4190). A local calendar day across a DST transition is 23 h or 25 h.\n *\n * Relative ranges (last N hours/days) are timezone-independent (a fixed offset\n * from \"now\") and ignore this setting.\n *\n * The `(string & {})` member keeps the `'local'` / `'utc'` literals in editor\n * autocomplete while still accepting an arbitrary IANA id.\n */\nexport type TimeRangeZone = 'local' | 'utc' | (string & {});\n\n/**\n * Configuration for the time range picker\n */\nexport interface TimeRangePickerConfig {\n /** Available range types to show. Defaults to all. */\n availableTypes?: TimeRangeType[];\n /** Minimum selectable year. Defaults to current year - 10. */\n minYear?: number;\n /** Maximum selectable year. Defaults to current year + 1. */\n maxYear?: number;\n /** Default relative time value. Defaults to 24. */\n defaultRelativeValue?: number;\n /** Default relative time unit. Defaults to 'hours'. */\n defaultRelativeUnit?: RelativeTimeUnit;\n /** Minimum date for custom range. */\n minDate?: Date;\n /** Maximum date for custom range. */\n maxDate?: Date;\n /** Show time in custom date pickers. Defaults to false. */\n showTime?: boolean;\n}\n\n/**\n * The current selection state of the time range picker\n */\nexport interface TimeRangeSelection {\n type: TimeRangeType;\n year?: number;\n quarter?: Quarter;\n month?: number;\n /** Day of month (1-31), used with 'day' type */\n day?: number;\n /** Hour from (0-23), optional hour filter for 'day' type */\n hourFrom?: number;\n /** Hour to (1-24), optional hour filter for 'day' type. Exclusive upper bound. */\n hourTo?: number;\n relativeValue?: number;\n relativeUnit?: RelativeTimeUnit;\n customFrom?: Date;\n customTo?: Date;\n}\n\n/**\n * Option for dropdown selections\n */\nexport interface TimeRangeOption<T = string | number> {\n value: T;\n label: string;\n}\n\n/**\n * Labels for the time range picker UI\n */\nexport interface TimeRangePickerLabels {\n rangeType?: string;\n year?: string;\n quarter?: string;\n month?: string;\n day?: string;\n relativeValue?: string;\n relativeUnit?: string;\n hourFrom?: string;\n hourTo?: string;\n customFrom?: string;\n customTo?: string;\n // Type labels\n typeYear?: string;\n typeQuarter?: string;\n typeMonth?: string;\n typeDay?: string;\n typeRelative?: string;\n typeCustom?: string;\n // Relative unit labels\n unitHours?: string;\n unitDays?: string;\n unitWeeks?: string;\n unitMonths?: string;\n // Quarter labels\n quarter1?: string;\n quarter2?: string;\n quarter3?: string;\n quarter4?: string;\n}\n\n/**\n * Default labels for the time range picker\n */\nexport const DEFAULT_TIME_RANGE_LABELS: TimeRangePickerLabels = {\n rangeType: 'Range Type',\n year: 'Year',\n quarter: 'Quarter',\n month: 'Month',\n day: 'Day',\n relativeValue: 'Last',\n relativeUnit: 'Unit',\n hourFrom: 'From Hour',\n hourTo: 'To Hour',\n customFrom: 'From',\n customTo: 'To',\n typeYear: 'Year',\n typeQuarter: 'Quarter',\n typeMonth: 'Month',\n typeDay: 'Day',\n typeRelative: 'Relative',\n typeCustom: 'Custom',\n unitHours: 'Hours',\n unitDays: 'Days',\n unitWeeks: 'Weeks',\n unitMonths: 'Months',\n quarter1: 'Q1 (Jan-Mar)',\n quarter2: 'Q2 (Apr-Jun)',\n quarter3: 'Q3 (Jul-Sep)',\n quarter4: 'Q4 (Oct-Dec)'\n};\n\n/**\n * Utility functions for time range calculations\n */\nexport class TimeRangeUtils {\n /**\n * Offset (wall-clock − UTC), in milliseconds, of an IANA `zone` at the instant `utcMs`.\n * Computed via `Intl.DateTimeFormat` so it is DST-correct and independent of the browser's\n * own zone. Positive east of UTC (e.g. +7 200 000 for `Europe/Vienna` in summer).\n */\n private static zoneOffsetMs(utcMs: number, zone: string): number {\n const dtf = new Intl.DateTimeFormat('en-US', {\n timeZone: zone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hourCycle: 'h23'\n });\n const parts: Record<string, string> = {};\n for (const part of dtf.formatToParts(new Date(utcMs))) {\n parts[part.type] = part.value;\n }\n const asUtc = Date.UTC(\n Number(parts['year']),\n Number(parts['month']) - 1,\n Number(parts['day']),\n Number(parts['hour']),\n Number(parts['minute']),\n Number(parts['second'])\n );\n return asUtc - utcMs;\n }\n\n /**\n * The UTC instant whose wall-clock time in IANA `zone` equals the given civil fields.\n * Two-pass so DST transitions resolve correctly (the offset is re-read at the candidate\n * instant, not just at the naive UTC guess). Field overflow normalizes like `Date.UTC`\n * (e.g. month 12 ⇒ next January, day 32 ⇒ next month).\n */\n private static zonedCivilToUtc(\n year: number,\n month: number,\n day: number,\n hour = 0,\n minute = 0,\n second = 0,\n ms = 0,\n zone: string\n ): Date {\n const guessUtc = Date.UTC(year, month, day, hour, minute, second, ms);\n const offset1 = this.zoneOffsetMs(guessUtc, zone);\n const candidate = guessUtc - offset1;\n const offset2 = this.zoneOffsetMs(candidate, zone);\n return new Date(offset1 === offset2 ? candidate : guessUtc - offset2);\n }\n\n /**\n * Build a calendar-boundary instant for the given civil fields in `zone`.\n * `'utc'` and `'local'` keep the historical `Date.UTC` / browser-local-constructor\n * behaviour byte-for-byte; any other value is treated as an IANA id (AB#4190).\n */\n private static boundary(\n zone: TimeRangeZone,\n year: number,\n month: number,\n day: number,\n hour = 0,\n minute = 0,\n second = 0,\n ms = 0\n ): Date {\n if (zone === 'utc') {\n return new Date(Date.UTC(year, month, day, hour, minute, second, ms));\n }\n if (zone === 'local') {\n return new Date(year, month, day, hour, minute, second, ms);\n }\n return this.zonedCivilToUtc(year, month, day, hour, minute, second, ms, zone);\n }\n\n /**\n * Extract the calendar year/month/day of `date` as seen in `zone`. Used to normalize\n * custom ranges to that zone's civil-day boundaries.\n */\n private static civilDateParts(date: Date, zone: TimeRangeZone): { year: number; month: number; day: number } {\n if (zone === 'utc') {\n return { year: date.getUTCFullYear(), month: date.getUTCMonth(), day: date.getUTCDate() };\n }\n if (zone === 'local') {\n return { year: date.getFullYear(), month: date.getMonth(), day: date.getDate() };\n }\n const dtf = new Intl.DateTimeFormat('en-US', {\n timeZone: zone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n });\n const parts: Record<string, string> = {};\n for (const part of dtf.formatToParts(date)) {\n parts[part.type] = part.value;\n }\n return { year: Number(parts['year']), month: Number(parts['month']) - 1, day: Number(parts['day']) };\n }\n\n /**\n * Calculate time range for a specific year.\n * Uses exclusive end boundary (start of next year) for correct LESS_THAN filtering.\n * @param zone Timezone basis for the boundaries (defaults to `'local'`).\n */\n static getYearRange(year: number, zone: TimeRangeZone = 'local'): TimeRange {\n return {\n from: this.boundary(zone, year, 0, 1),\n to: this.boundary(zone, year + 1, 0, 1)\n };\n }\n\n /**\n * Calculate time range for a specific quarter.\n * Uses exclusive end boundary (start of next quarter) for correct LESS_THAN filtering.\n * @param zone Timezone basis for the boundaries (defaults to `'local'`).\n */\n static getQuarterRange(year: number, quarter: Quarter, zone: TimeRangeZone = 'local'): TimeRange {\n const startMonth = (quarter - 1) * 3;\n return {\n from: this.boundary(zone, year, startMonth, 1),\n to: this.boundary(zone, year, startMonth + 3, 1)\n };\n }\n\n /**\n * Calculate time range for a specific month.\n * Uses exclusive end boundary (start of next month) for correct LESS_THAN filtering.\n * @param zone Timezone basis for the boundaries (defaults to `'local'`).\n */\n static getMonthRange(year: number, month: number, zone: TimeRangeZone = 'local'): TimeRange {\n return {\n from: this.boundary(zone, year, month, 1),\n to: this.boundary(zone, year, month + 1, 1)\n };\n }\n\n /**\n * Calculate time range for a specific day.\n * Uses exclusive end boundary (start of next day) for correct LESS_THAN filtering.\n * Optionally filters to a specific hour range within the day.\n * @param hourFrom Start hour (0-23), defaults to 0\n * @param hourTo End hour (1-24, exclusive), defaults to 24 (= next day 00:00)\n * @param zone Timezone basis for the boundaries (defaults to `'local'`).\n */\n static getDayRange(\n year: number,\n month: number,\n day: number,\n hourFrom?: number,\n hourTo?: number,\n zone: TimeRangeZone = 'local'\n ): TimeRange {\n const fromHour = hourFrom ?? 0;\n const toHour = hourTo ?? 24;\n return {\n from: this.boundary(zone, year, month, day, fromHour),\n to: toHour === 24\n ? this.boundary(zone, year, month, day + 1)\n : this.boundary(zone, year, month, day, toHour)\n };\n }\n\n /**\n * Calculate time range relative to now\n */\n static getRelativeRange(value: number, unit: RelativeTimeUnit): TimeRange {\n const now = new Date();\n const from = new Date(now);\n\n switch (unit) {\n case 'hours':\n from.setHours(from.getHours() - value);\n break;\n case 'days':\n from.setDate(from.getDate() - value);\n break;\n case 'weeks':\n from.setDate(from.getDate() - (value * 7));\n break;\n case 'months':\n from.setMonth(from.getMonth() - value);\n break;\n }\n\n return { from, to: now };\n }\n\n /**\n * Calculate time range from selection.\n * @param selection The current selection state\n * @param showTime If false (default), custom date ranges are normalized to full-day boundaries\n * with exclusive end (from: 00:00:00, to: start of next day 00:00:00)\n * @param zone Timezone basis for calendar boundaries (defaults to `'local'`). Applies to\n * year/quarter/month/day and normalized custom ranges; relative ranges ignore it.\n */\n static getTimeRangeFromSelection(\n selection: TimeRangeSelection,\n showTime = false,\n zone: TimeRangeZone = 'local'\n ): TimeRange | null {\n switch (selection.type) {\n case 'year':\n if (selection.year) {\n return this.getYearRange(selection.year, zone);\n }\n break;\n case 'quarter':\n if (selection.year && selection.quarter) {\n return this.getQuarterRange(selection.year, selection.quarter, zone);\n }\n break;\n case 'month':\n if (selection.year && selection.month !== undefined) {\n return this.getMonthRange(selection.year, selection.month, zone);\n }\n break;\n case 'day':\n if (selection.year && selection.month !== undefined && selection.day !== undefined) {\n return this.getDayRange(selection.year, selection.month, selection.day, selection.hourFrom, selection.hourTo, zone);\n }\n break;\n case 'relative':\n if (selection.relativeValue && selection.relativeUnit) {\n return this.getRelativeRange(selection.relativeValue, selection.relativeUnit);\n }\n break;\n case 'custom':\n if (selection.customFrom && selection.customTo) {\n if (showTime) {\n // Keep the user-selected time as-is\n return {\n from: selection.customFrom,\n to: selection.customTo\n };\n }\n // Normalize to full-day boundaries in `zone` (exclusive end, like year/quarter/month)\n const fromParts = this.civilDateParts(selection.customFrom, zone);\n const toParts = this.civilDateParts(selection.customTo, zone);\n return {\n from: this.boundary(zone, fromParts.year, fromParts.month, fromParts.day),\n to: this.boundary(zone, toParts.year, toParts.month, toParts.day + 1)\n };\n }\n break;\n }\n return null;\n }\n\n /**\n * Convert TimeRange to ISO 8601 format\n */\n static toISO(range: TimeRange): TimeRangeISO {\n return {\n from: range.from.toISOString(),\n to: range.to.toISOString()\n };\n }\n\n /**\n * Get current quarter (1-4)\n */\n static getCurrentQuarter(): Quarter {\n return (Math.floor(new Date().getMonth() / 3) + 1) as Quarter;\n }\n\n /**\n * Generate year options\n */\n static generateYearOptions(minYear: number, maxYear: number): TimeRangeOption<number>[] {\n const options: TimeRangeOption<number>[] = [];\n for (let year = maxYear; year >= minYear; year--) {\n options.push({ value: year, label: year.toString() });\n }\n return options;\n }\n\n /**\n * Generate month options\n */\n static generateMonthOptions(): TimeRangeOption<number>[] {\n const months = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n ];\n return months.map((label, index) => ({ value: index, label }));\n }\n\n /**\n * Generate quarter options with custom labels\n */\n static generateQuarterOptions(labels: TimeRangePickerLabels): TimeRangeOption<Quarter>[] {\n return [\n { value: 1, label: labels.quarter1 || 'Q1' },\n { value: 2, label: labels.quarter2 || 'Q2' },\n { value: 3, label: labels.quarter3 || 'Q3' },\n { value: 4, label: labels.quarter4 || 'Q4' }\n ];\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnChanges,\n SimpleChanges,\n signal,\n computed,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DropDownListModule } from '@progress/kendo-angular-dropdowns';\nimport { DatePickerModule, DateTimePickerModule } from '@progress/kendo-angular-dateinputs';\nimport { NumericTextBoxModule } from '@progress/kendo-angular-inputs';\nimport { LabelModule } from '@progress/kendo-angular-label';\n\nimport {\n TimeRange,\n TimeRangeISO,\n TimeRangeType,\n TimeRangeSelection,\n TimeRangePickerConfig,\n TimeRangePickerLabels,\n TimeRangeOption,\n TimeRangeUtils,\n RelativeTimeUnit,\n Quarter,\n DEFAULT_TIME_RANGE_LABELS\n} from './time-range-picker.models';\n\n/**\n * A flexible time range picker component that supports:\n * - Year selection\n * - Quarter selection (year + quarter)\n * - Month selection (year + month)\n * - Relative time (last N hours/days/weeks/months)\n * - Custom date range\n *\n * @example\n * ```html\n * <mm-time-range-picker\n * [config]=\"{ availableTypes: ['year', 'month', 'relative'] }\"\n * (rangeChange)=\"onRangeChange($event)\">\n * </mm-time-range-picker>\n * ```\n */\n@Component({\n selector: 'mm-time-range-picker',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DropDownListModule,\n DatePickerModule,\n DateTimePickerModule,\n NumericTextBoxModule,\n LabelModule\n ],\n templateUrl: './time-range-picker.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './time-range-picker.component.scss'\n})\nexport class TimeRangePickerComponent implements OnInit, OnChanges {\n /**\n * Configuration for the picker\n */\n @Input() config: TimeRangePickerConfig = {};\n\n /**\n * Custom labels for the UI\n */\n @Input() labels: TimeRangePickerLabels = {};\n\n /**\n * Initial selection to set\n */\n @Input() initialSelection?: TimeRangeSelection;\n\n /**\n * Emits when the time range changes\n */\n @Output() rangeChange = new EventEmitter<TimeRange>();\n\n /**\n * Emits when the time range changes (ISO format)\n */\n @Output() rangeChangeISO = new EventEmitter<TimeRangeISO>();\n\n /**\n * Emits the current selection state\n */\n @Output() selectionChange = new EventEmitter<TimeRangeSelection>();\n\n // Current selection state\n protected selectedType = signal<TimeRangeType>('year');\n protected selectedYear = signal<number>(new Date().getFullYear());\n protected selectedQuarter = signal<Quarter>(TimeRangeUtils.getCurrentQuarter());\n protected selectedMonth = signal<number>(new Date().getMonth());\n protected selectedDay = signal<number>(new Date().getDate());\n protected relativeValue = signal<number>(24);\n protected relativeUnit = signal<RelativeTimeUnit>('hours');\n protected hourFrom = signal<number | null>(null);\n protected hourTo = signal<number | null>(null);\n protected customFrom = signal<Date>(new Date());\n protected customTo = signal<Date>(new Date());\n\n // Merged labels with defaults\n protected mergedLabels = computed(() => ({\n ...DEFAULT_TIME_RANGE_LABELS,\n ...this.labels\n }));\n\n // Options for dropdowns\n protected typeOptions = computed<TimeRangeOption<TimeRangeType>[]>(() => {\n const allTypes: TimeRangeOption<TimeRangeType>[] = [\n { value: 'year', label: this.mergedLabels().typeYear || 'Year' },\n { value: 'quarter', label: this.mergedLabels().typeQuarter || 'Quarter' },\n { value: 'month', label: this.mergedLabels().typeMonth || 'Month' },\n { value: 'day', label: this.mergedLabels().typeDay || 'Day' },\n { value: 'relative', label: this.mergedLabels().typeRelative || 'Relative' },\n { value: 'custom', label: this.mergedLabels().typeCustom || 'Custom' }\n ];\n\n const available = this.config.availableTypes;\n if (available && available.length > 0) {\n return allTypes.filter(opt => available.includes(opt.value));\n }\n return allTypes;\n });\n\n protected yearOptions = computed(() => {\n const currentYear = new Date().getFullYear();\n const minYear = this.config.minYear ?? currentYear - 10;\n const maxYear = this.config.maxYear ?? currentYear + 1;\n return TimeRangeUtils.generateYearOptions(minYear, maxYear);\n });\n\n protected quarterOptions = computed(() =>\n TimeRangeUtils.generateQuarterOptions(this.mergedLabels())\n );\n\n protected monthOptions = computed(() =>\n TimeRangeUtils.generateMonthOptions()\n );\n\n protected dayOptions = computed(() => {\n const year = this.selectedYear();\n const month = this.selectedMonth();\n // Get number of days in the selected month\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const options: TimeRangeOption<number>[] = [];\n for (let d = 1; d <= daysInMonth; d++) {\n options.push({ value: d, label: d.toString() });\n }\n return options;\n });\n\n protected hourFromOptions = computed(() => {\n const options: TimeRangeOption<number>[] = [];\n for (let h = 0; h <= 23; h++) {\n options.push({ value: h, label: h.toString().padStart(2, '0') + ':00' });\n }\n return options;\n });\n\n protected hourToOptions = computed(() => {\n const fromHour = this.hourFrom();\n const minHour = fromHour !== null ? fromHour + 1 : 1;\n const options: TimeRangeOption<number>[] = [];\n for (let h = minHour; h <= 24; h++) {\n const label = h === 24 ? '24:00' : h.toString().padStart(2, '0') + ':00';\n options.push({ value: h, label });\n }\n return options;\n });\n\n protected relativeUnitOptions = computed<TimeRangeOption<RelativeTimeUnit>[]>(() => [\n { value: 'hours', label: this.mergedLabels().unitHours || 'Hours' },\n { value: 'days', label: this.mergedLabels().unitDays || 'Days' },\n { value: 'weeks', label: this.mergedLabels().unitWeeks || 'Weeks' },\n { value: 'months', label: this.mergedLabels().unitMonths || 'Months' }\n ]);\n\n // Computed time range\n protected currentRange = computed<TimeRange | null>(() => {\n const selection: TimeRangeSelection = {\n type: this.selectedType(),\n year: this.selectedYear(),\n quarter: this.selectedQuarter(),\n month: this.selectedMonth(),\n day: this.selectedDay(),\n hourFrom: this.hourFrom() ?? undefined,\n hourTo: this.hourTo() ?? undefined,\n relativeValue: this.relativeValue(),\n relativeUnit: this.relativeUnit(),\n customFrom: this.customFrom(),\n customTo: this.customTo()\n };\n return TimeRangeUtils.getTimeRangeFromSelection(selection, this.config.showTime ?? false);\n });\n\n // Min/Max dates for custom picker\n protected minDate = computed(() => this.config.minDate ?? new Date(1900, 0, 1));\n protected maxDate = computed(() => this.config.maxDate ?? new Date(2100, 11, 31));\n protected showTime = computed(() => this.config.showTime ?? false);\n\n ngOnInit(): void {\n this.initializeDefaults();\n if (this.initialSelection) {\n this.applySelection(this.initialSelection);\n }\n this.emitChange();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['initialSelection'] && !changes['initialSelection'].firstChange) {\n if (this.initialSelection) {\n this.applySelection(this.initialSelection);\n this.emitChange();\n }\n }\n if (changes['labels']) {\n // Labels are handled by computed signal\n }\n }\n\n private initializeDefaults(): void {\n const currentYear = new Date().getFullYear();\n const currentMonth = new Date().getMonth();\n\n this.selectedYear.set(currentYear);\n this.selectedMonth.set(currentMonth);\n this.selectedDay.set(new Date().getDate());\n this.selectedQuarter.set(TimeRangeUtils.getCurrentQuarter());\n this.relativeValue.set(this.config.defaultRelativeValue ?? 24);\n this.relativeUnit.set(this.config.defaultRelativeUnit ?? 'hours');\n\n // Set initial type to first available\n const types = this.typeOptions();\n if (types.length > 0 && !types.find(t => t.value === this.selectedType())) {\n this.selectedType.set(types[0].value);\n }\n\n // Initialize custom dates\n const now = new Date();\n const yesterday = new Date(now);\n yesterday.setDate(yesterday.getDate() - 1);\n this.customFrom.set(yesterday);\n this.customTo.set(now);\n }\n\n private applySelection(selection: TimeRangeSelection): void {\n this.selectedType.set(selection.type);\n\n if (selection.year !== undefined) {\n this.selectedYear.set(selection.year);\n }\n if (selection.quarter !== undefined) {\n this.selectedQuarter.set(selection.quarter);\n }\n if (selection.month !== undefined) {\n this.selectedMonth.set(selection.month);\n }\n if (selection.day !== undefined) {\n this.selectedDay.set(selection.day);\n }\n this.hourFrom.set(selection.hourFrom ?? null);\n this.hourTo.set(selection.hourTo ?? null);\n if (selection.relativeValue !== undefined) {\n this.relativeValue.set(selection.relativeValue);\n }\n if (selection.relativeUnit !== undefined) {\n this.relativeUnit.set(selection.relativeUnit);\n }\n if (selection.customFrom !== undefined) {\n this.customFrom.set(selection.customFrom);\n }\n if (selection.customTo !== undefined) {\n this.customTo.set(selection.customTo);\n }\n }\n\n // Event handlers\n protected onTypeChange(type: TimeRangeType): void {\n this.selectedType.set(type);\n if (type !== 'day') {\n this.hourFrom.set(null);\n this.hourTo.set(null);\n }\n this.emitChange();\n }\n\n protected onYearChange(year: number): void {\n this.selectedYear.set(year);\n this.emitChange();\n }\n\n protected onQuarterChange(quarter: Quarter): void {\n this.selectedQuarter.set(quarter);\n this.emitChange();\n }\n\n protected onMonthChange(month: number): void {\n this.selectedMonth.set(month);\n // Clamp day to valid range for the new month\n const daysInMonth = new Date(this.selectedYear(), month + 1, 0).getDate();\n if (this.selectedDay() > daysInMonth) {\n this.selectedDay.set(daysInMonth);\n }\n this.emitChange();\n }\n\n protected onDayChange(day: number): void {\n this.selectedDay.set(day);\n this.emitChange();\n }\n\n protected onHourFromChange(hour: number | null): void {\n this.hourFrom.set(hour);\n // If hourTo is less than or equal to hourFrom, adjust it\n if (hour !== null && this.hourTo() !== null && this.hourTo()! <= hour) {\n this.hourTo.set(hour + 1);\n }\n // If hourFrom is set but hourTo is not, default hourTo to hourFrom + 1\n if (hour !== null && this.hourTo() === null) {\n this.hourTo.set(hour + 1);\n }\n // If hourFrom is cleared, also clear hourTo\n if (hour === null) {\n this.hourTo.set(null);\n }\n this.emitChange();\n }\n\n protected onHourToChange(hour: number | null): void {\n this.hourTo.set(hour);\n this.emitChange();\n }\n\n protected clearHourFilter(): void {\n this.hourFrom.set(null);\n this.hourTo.set(null);\n this.emitChange();\n }\n\n protected onRelativeValueChange(value: number): void {\n this.relativeValue.set(value || 1);\n this.emitChange();\n }\n\n protected onRelativeUnitChange(unit: RelativeTimeUnit): void {\n this.relativeUnit.set(unit);\n this.emitChange();\n }\n\n protected onCustomFromChange(date: Date): void {\n this.customFrom.set(date);\n this.emitChange();\n }\n\n protected onCustomToChange(date: Date): void {\n this.customTo.set(date);\n this.emitChange();\n }\n\n private emitChange(): void {\n const range = this.currentRange();\n if (range) {\n this.rangeChange.emit(range);\n this.rangeChangeISO.emit(TimeRangeUtils.toISO(range));\n }\n\n const selection: TimeRangeSelection = {\n type: this.selectedType(),\n year: this.selectedYear(),\n quarter: this.selectedQuarter(),\n month: this.selectedMonth(),\n day: this.selectedDay(),\n hourFrom: this.hourFrom() ?? undefined,\n hourTo: this.hourTo() ?? undefined,\n relativeValue: this.relativeValue(),\n relativeUnit: this.relativeUnit(),\n customFrom: this.customFrom(),\n customTo: this.customTo()\n };\n this.selectionChange.emit(selection);\n }\n\n // Helper for template\n protected isType(type: TimeRangeType): boolean {\n return this.selectedType() === type;\n }\n}\n","<div class=\"time-range-picker\">\n <!-- Range Type Selection -->\n <div class=\"picker-field type-field\">\n <kendo-label [text]=\"mergedLabels().rangeType || 'Range Type'\">\n <kendo-dropdownlist\n [data]=\"typeOptions()\"\n [value]=\"selectedType()\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n (valueChange)=\"onTypeChange($event)\">\n </kendo-dropdownlist>\n </kendo-label>\n </div>\n\n <!-- Year Selection (for year, quarter, month, day types) -->\n @if (isType('year') || isType('quarter') || isType('month') || isType('day')) {\n <div class=\"picker-field year-field\">\n <kendo-label [text]=\"mergedLabels().year || 'Year'\">\n <kendo-dropdownlist\n [data]=\"yearOptions()\"\n [value]=\"selectedYear()\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n (valueChange)=\"onYearChange($event)\">\n </kendo-dropdownlist>\n </kendo-label>\n </div>\n }\n\n <!-- Quarter Selection -->\n @if (isType('quarter')) {\n <div class=\"picker-field quarter-field\">\n <kendo-label [text]=\"mergedLabels().quarter || 'Quarter'\">\n <kendo-dropdownlist\n [data]=\"quarterOptions()\"\n [value]=\"selectedQuarter()\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n (valueChange)=\"onQuarterChange($event)\">\n </kendo-dropdownlist>\n </kendo-label>\n </div>\n }\n\n <!-- Month Selection -->\n @if (isType('month') || isType('day')) {\n <div class=\"picker-field month-field\">\n <kendo-label [text]=\"mergedLabels().month || 'Month'\">\n <kendo-dropdownlist\n [data]=\"monthOptions()\"\n [value]=\"selectedMonth()\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n (valueChange)=\"onMonthChange($event)\">\n </kendo-dropdownlist>\n </kendo-label>\n </div>\n }\n\n <!-- Day Selection -->\n @if (isType('day')) {\n <div class=\"picker-field day-field\">\n <kendo-label [text]=\"mergedLabels().day || 'Day'\">\n <kendo-dropdownlist\n [data]=\"dayOptions()\"\n [value]=\"selectedDay()\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n (valueChange)=\"onDayChange($event)\">\n </kendo-dropdownlist>\n </kendo-label>\n </div>\n\n <!-- Hour From Selection (optional) -->\n <div class=\"picker-field hour-from-field\">\n <kendo-label [text]=\"mergedLabels().hourFrom || 'From Hour'\">\n <kendo-dropdownlist\n [data]=\"hourFromOptions()\"\n [value]=\"hourFrom()\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [defaultItem]=\"{ value: null, label: '—' }\"\n (valueChange)=\"onHourFromChange($event)\">\n </kendo-dropdownlist>\n </kendo-label>\n </div>\n\n <!-- Hour To Selection (visible when hourFrom is set) -->\n @if (hourFrom() !== null) {\n <div class=\"picker-field hour-to-field\">\n <kendo-label [text]=\"mergedLabels().hourTo || 'To Hour'\">\n <kendo-dropdownlist\n [data]=\"hourToOptions()\"\n [value]=\"hourTo()\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n (valueChange)=\"onHourToChange($event)\">\n </kendo-dropdownlist>\n </kendo-label>\n </div>\n }\n }\n\n <!-- Relative Time Selection -->\n @if (isType('relative')) {\n <div class=\"picker-field relative-value-field\">\n <kendo-label [text]=\"mergedLabels().relativeValue || 'Last'\">\n <kendo-numerictextbox\n [value]=\"relativeValue()\"\n [min]=\"1\"\n [max]=\"9999\"\n [decimals]=\"0\"\n [format]=\"'n0'\"\n [spinners]=\"true\"\n (valueChange)=\"onRelativeValueChange($event)\">\n </kendo-numerictextbox>\n </kendo-label>\n </div>\n\n <div class=\"picker-field relative-unit-field\">\n <kendo-label [text]=\"mergedLabels().relativeUnit || 'Unit'\">\n <kendo-dropdownlist\n [data]=\"relativeUnitOptions()\"\n [value]=\"relativeUnit()\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n (valueChange)=\"onRelativeUnitChange($event)\">\n </kendo-dropdownlist>\n </kendo-label>\n </div>\n }\n\n <!-- Custom Date Range -->\n @if (isType('custom')) {\n <div class=\"picker-field custom-from-field\">\n <kendo-label [text]=\"mergedLabels().customFrom || 'From'\">\n @if (showTime()) {\n <kendo-datetimepicker\n [value]=\"customFrom()\"\n [min]=\"minDate()\"\n [max]=\"customTo()\"\n (valueChange)=\"onCustomFromChange($event)\">\n </kendo-datetimepicker>\n } @else {\n <kendo-datepicker\n [value]=\"customFrom()\"\n [min]=\"minDate()\"\n [max]=\"customTo()\"\n (valueChange)=\"onCustomFromChange($event)\">\n </kendo-datepicker>\n }\n </kendo-label>\n </div>\n\n <div class=\"picker-field custom-to-field\">\n <kendo-label [text]=\"mergedLabels().customTo || 'To'\">\n @if (showTime()) {\n <kendo-datetimepicker\n [value]=\"customTo()\"\n [min]=\"customFrom()\"\n [max]=\"maxDate()\"\n (valueChange)=\"onCustomToChange($event)\">\n </kendo-datetimepicker>\n } @else {\n <kendo-datepicker\n [value]=\"customTo()\"\n [min]=\"customFrom()\"\n [max]=\"maxDate()\"\n (valueChange)=\"onCustomToChange($event)\">\n </kendo-datepicker>\n }\n </kendo-label>\n </div>\n }\n</div>\n","/**\n * Cron Expression Builder - Type definitions and models\n * Supports 6-field cron format: second minute hour day month weekday\n */\n\nexport type ScheduleType = 'seconds' | 'minutes' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'custom';\n\nexport type Weekday = 0 | 1 | 2 | 3 | 4 | 5 | 6; // 0 = Sunday, 6 = Saturday\n\nexport interface CronBuilderConfig {\n /** Show preset quick-select buttons */\n showPresets?: boolean;\n /** Show human-readable description of the cron expression */\n showHumanReadable?: boolean;\n /** Show next execution times */\n showNextExecutions?: boolean;\n /** Number of next executions to show (default: 3) */\n maxNextExecutions?: number;\n /** Show copy to clipboard button */\n showCopyButton?: boolean;\n /** Allow custom/advanced tab for direct cron editing */\n allowCustom?: boolean;\n /** Default schedule type to show */\n defaultScheduleType?: ScheduleType;\n /** Locale for human-readable output ('en' | 'de') */\n locale?: string;\n}\n\nexport const DEFAULT_CRON_BUILDER_CONFIG: CronBuilderConfig = {\n showPresets: true,\n showHumanReadable: true,\n showNextExecutions: true,\n maxNextExecutions: 3,\n showCopyButton: true,\n allowCustom: true,\n defaultScheduleType: 'daily',\n locale: 'en'\n};\n\nexport interface CronSchedule {\n type: ScheduleType;\n /** For seconds tab: interval in seconds */\n secondInterval?: number;\n /** For minutes tab: interval in minutes */\n minuteInterval?: number;\n /** For hourly tab */\n hourInterval?: number;\n hourMinute?: number;\n hourSecond?: number;\n /** For daily/weekly tab */\n time?: { hour: number; minute: number; second: number };\n /** For daily tab: 'every' | 'weekdays' | 'weekends' | 'specific' */\n dailyMode?: 'every' | 'weekdays' | 'weekends' | 'specific';\n /** For weekly/daily specific: selected days (0-6, 0=Sunday) */\n selectedDays?: Weekday[];\n /** For monthly tab */\n monthlyMode?: 'specific' | 'relative';\n dayOfMonth?: number;\n relativeWeek?: 'first' | 'second' | 'third' | 'fourth' | 'last';\n relativeDay?: Weekday;\n /** For custom tab: raw cron fields */\n customFields?: CronFields;\n}\n\nexport interface CronFields {\n second: string;\n minute: string;\n hour: string;\n dayOfMonth: string;\n month: string;\n dayOfWeek: string;\n}\n\nexport interface CronValidationResult {\n isValid: boolean;\n error?: string;\n errorField?: keyof CronFields;\n}\n\nexport interface CronPreset {\n id: string;\n label: string;\n description: string;\n expression: string;\n category?: 'frequent' | 'hourly' | 'daily' | 'weekly' | 'monthly';\n}\n\nexport const CRON_PRESETS: CronPreset[] = [\n // Frequent\n { id: 'every-minute', label: 'Every minute', description: 'Runs every minute', expression: '0 * * * * *', category: 'frequent' },\n { id: 'every-5-minutes', label: 'Every 5 minutes', description: 'Runs every 5 minutes', expression: '0 */5 * * * *', category: 'frequent' },\n { id: 'every-15-minutes', label: 'Every 15 minutes', description: 'Runs every 15 minutes', expression: '0 */15 * * * *', category: 'frequent' },\n { id: 'every-30-minutes', label: 'Every 30 minutes', description: 'Runs every 30 minutes', expression: '0 */30 * * * *', category: 'frequent' },\n // Hourly\n { id: 'every-hour', label: 'Every hour', description: 'Runs at the start of every hour', expression: '0 0 * * * *', category: 'hourly' },\n { id: 'every-2-hours', label: 'Every 2 hours', description: 'Runs every 2 hours', expression: '0 0 */2 * * *', category: 'hourly' },\n { id: 'every-6-hours', label: 'Every 6 hours', description: 'Runs every 6 hours', expression: '0 0 */6 * * *', category: 'hourly' },\n // Daily\n { id: 'daily-midnight', label: 'Daily at midnight', description: 'Runs every day at 00:00', expression: '0 0 0 * * *', category: 'daily' },\n { id: 'daily-9am', label: 'Daily at 9 AM', description: 'Runs every day at 09:00', expression: '0 0 9 * * *', category: 'daily' },\n { id: 'daily-6pm', label: 'Daily at 6 PM', description: 'Runs every day at 18:00', expression: '0 0 18 * * *', category: 'daily' },\n // Weekly\n { id: 'weekdays-9am', label: 'Weekdays at 9 AM', description: 'Runs Monday-Friday at 09:00', expression: '0 0 9 * * 1-5', category: 'weekly' },\n { id: 'weekly-monday', label: 'Weekly on Monday', description: 'Runs every Monday at 09:00', expression: '0 0 9 * * 1', category: 'weekly' },\n { id: 'weekly-friday', label: 'Weekly on Friday', description: 'Runs every Friday at 18:00', expression: '0 0 18 * * 5', category: 'weekly' },\n // Monthly\n { id: 'monthly-1st', label: 'Monthly on 1st', description: 'Runs on the 1st of every month at 00:00', expression: '0 0 0 1 * *', category: 'monthly' },\n { id: 'monthly-15th', label: 'Monthly on 15th', description: 'Runs on the 15th of every month at 00:00', expression: '0 0 0 15 * *', category: 'monthly' },\n { id: 'monthly-last-day', label: 'Last day of month', description: 'Runs on the last day of every month', expression: '0 0 0 L * *', category: 'monthly' }\n];\n\nexport interface DropdownOption<T = string | number> {\n value: T;\n label: string;\n}\n\nexport const SECOND_INTERVALS: DropdownOption<number>[] = [\n { value: 1, label: 'Every second' },\n { value: 2, label: 'Every 2 seconds' },\n { value: 5, label: 'Every 5 seconds' },\n { value: 10, label: 'Every 10 seconds' },\n { value: 15, label: 'Every 15 seconds' },\n { value: 20, label: 'Every 20 seconds' },\n { value: 30, label: 'Every 30 seconds' }\n];\n\nexport const MINUTE_INTERVALS: DropdownOption<number>[] = [\n { value: 1, label: 'Every minute' },\n { value: 2, label: 'Every 2 minutes' },\n { value: 5, label: 'Every 5 minutes' },\n { value: 10, label: 'Every 10 minutes' },\n { value: 15, label: 'Every 15 minutes' },\n { value: 20, label: 'Every 20 minutes' },\n { value: 30, label: 'Every 30 minutes' }\n];\n\nexport const HOUR_INTERVALS: DropdownOption<number>[] = [\n { value: 1, label: 'Every hour' },\n { value: 2, label: 'Every 2 hours' },\n { value: 3, label: 'Every 3 hours' },\n { value: 4, label: 'Every 4 hours' },\n { value: 6, label: 'Every 6 hours' },\n { value: 8, label: 'Every 8 hours' },\n { value: 12, label: 'Every 12 hours' }\n];\n\nexport const WEEKDAYS: DropdownOption<Weekday>[] = [\n { value: 0, label: 'Sunday' },\n { value: 1, label: 'Monday' },\n { value: 2, label: 'Tuesday' },\n { value: 3, label: 'Wednesday' },\n { value: 4, label: 'Thursday' },\n { value: 5, label: 'Friday' },\n { value: 6, label: 'Saturday' }\n];\n\nexport const WEEKDAY_ABBREVIATIONS: DropdownOption<Weekday>[] = [\n { value: 0, label: 'Sun' },\n { value: 1, label: 'Mon' },\n { value: 2, label: 'Tue' },\n { value: 3, label: 'Wed' },\n { value: 4, label: 'Thu' },\n { value: 5, label: 'Fri' },\n { value: 6, label: 'Sat' }\n];\n\nexport const RELATIVE_WEEKS: DropdownOption<string>[] = [\n { value: 'first', label: 'First' },\n { value: 'second', label: 'Second' },\n { value: 'third', label: 'Third' },\n { value: 'fourth', label: 'Fourth' },\n { value: 'last', label: 'Last' }\n];\n\n/** Generate options for hours (0-23) */\nexport function generateHourOptions(): DropdownOption<number>[] {\n return Array.from({ length: 24 }, (_, i) => ({\n value: i,\n label: i.toString().padStart(2, '0')\n }));\n}\n\n/** Generate options for minutes/seconds (0-59) */\nexport function generateMinuteOptions(): DropdownOption<number>[] {\n return Array.from({ length: 60 }, (_, i) => ({\n value: i,\n label: i.toString().padStart(2, '0')\n }));\n}\n\n/** Generate options for day of month (1-31) */\nexport function generateDayOfMonthOptions(): DropdownOption<number>[] {\n return Array.from({ length: 31 }, (_, i) => ({\n value: i + 1,\n label: (i + 1).toString()\n }));\n}\n","import { Injectable } from '@angular/core';\nimport { CronExpressionParser } from 'cron-parser';\nimport {\n CronFields,\n CronSchedule,\n CronValidationResult,\n ScheduleType,\n Weekday\n} from '../cron-builder.models';\n\n/**\n * Service for parsing, validating, and generating cron expressions.\n * Supports 6-field format: second minute hour dayOfMonth month dayOfWeek\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class CronParserService {\n\n /**\n * Validate a 6-field cron expression\n */\n validate(expression: string): CronValidationResult {\n if (!expression || expression.trim() === '') {\n return { isValid: false, error: 'Cron expression is required' };\n }\n\n const parts = expression.trim().split(/\\s+/);\n\n // Must have exactly 6 fields for our format\n if (parts.length !== 6) {\n return {\n isValid: false,\n error: `Expected 6 fields (second minute hour day month weekday), got ${parts.length}`\n };\n }\n\n // Try to parse with cron-parser (it expects 5 or 6 fields)\n try {\n CronExpressionParser.parse(expression, { currentDate: new Date() });\n return { isValid: true };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Invalid cron expression';\n return { isValid: false, error: errorMessage };\n }\n }\n\n /**\n * Parse a cron expression into a structured CronSchedule object\n */\n parse(expression: string): CronSchedule | null {\n const validation = this.validate(expression);\n if (!validation.isValid) {\n return null;\n }\n\n const parts = expression.trim().split(/\\s+/);\n const fields: CronFields = {\n second: parts[0],\n minute: parts[1],\n hour: parts[2],\n dayOfMonth: parts[3],\n month: parts[4],\n dayOfWeek: parts[5]\n };\n\n // Try to detect the schedule type\n const type = this.detectScheduleType(fields);\n\n const schedule: CronSchedule = {\n type,\n customFields: fields\n };\n\n // Parse specific fields based on detected type\n switch (type) {\n case 'seconds':\n schedule.secondInterval = this.parseInterval(fields.second) || 1;\n break;\n\n case 'minutes':\n schedule.minuteInterval = this.parseInterval(fields.minute) || 1;\n break;\n\n case 'hourly':\n schedule.hourInterval = this.parseInterval(fields.hour) || 1;\n schedule.hourMinute = this.parseSimpleValue(fields.minute) ?? 0;\n schedule.hourSecond = this.parseSimpleValue(fields.second) ?? 0;\n break;\n\n case 'daily':\n case 'weekly':\n schedule.time = {\n hour: this.parseSimpleValue(fields.hour) ?? 0,\n minute: this.parseSimpleValue(fields.minute) ?? 0,\n second: this.parseSimpleValue(fields.second) ?? 0\n };\n schedule.selectedDays = this.parseDaysOfWeek(fields.dayOfWeek);\n schedule.dailyMode = this.detectDailyMode(fields.dayOfWeek);\n break;\n\n case 'monthly':\n schedule.time = {\n hour: this.parseSimpleValue(fields.hour) ?? 0,\n minute: this.parseSimpleValue(fields.minute) ?? 0,\n second: this.parseSimpleValue(fields.second) ?? 0\n };\n schedule.monthlyMode = 'specific';\n schedule.dayOfMonth = this.parseSimpleValue(fields.dayOfMonth) ?? 1;\n break;\n }\n\n return schedule;\n }\n\n /**\n * Generate a cron expression from a CronSchedule object\n */\n generate(schedule: CronSchedule): string {\n switch (schedule.type) {\n case 'seconds':\n return this.generateSecondsExpression(schedule);\n case 'minutes':\n return this.generateMinutesExpression(schedule);\n case 'hourly':\n return this.generateHourlyExpression(schedule);\n case 'daily':\n return this.generateDailyExpression(schedule);\n case 'weekly':\n return this.generateWeeklyExpression(schedule);\n case 'monthly':\n return this.generateMonthlyExpression(schedule);\n case 'custom':\n return this.generateCustomExpression(schedule);\n default:\n return '0 * * * * *';\n }\n }\n\n /**\n * Calculate next execution times for a cron expression\n */\n getNextExecutions(expression: string, count = 3): Date[] {\n const validation = this.validate(expression);\n if (!validation.isValid) {\n return [];\n }\n\n try {\n const interval = CronExpressionParser.parse(expression, { currentDate: new Date() });\n const executions: Date[] = [];\n\n for (let i = 0; i < count; i++) {\n const next = interval.next();\n executions.push(next.toDate());\n }\n\n return executions;\n } catch {\n return [];\n }\n }\n\n // --- Private helper methods ---\n\n private detectScheduleType(fields: CronFields): ScheduleType {\n const { second, minute, hour, dayOfMonth, dayOfWeek } = fields;\n\n // Check for seconds interval (*/N in seconds, * in all others)\n if (second.includes('/') && minute === '*' && hour === '*' && dayOfMonth === '*' && dayOfWeek === '*') {\n return 'seconds';\n }\n\n // Check for minutes interval (0 in seconds, */N in minutes, * in others)\n if ((second === '0' || second === '*') && minute.includes('/') && hour === '*' && dayOfMonth === '*' && dayOfWeek === '*') {\n return 'minutes';\n }\n\n // Check for hourly (specific or */N in hours)\n if (hour.includes('/') || (this.isSimpleValue(hour) && dayOfMonth === '*' && dayOfWeek === '*' && minute !== '*')) {\n if (hour.includes('/')) {\n return 'hourly';\n }\n }\n\n // Check for monthly (specific day of month, * in dayOfWeek)\n if (this.isSimpleValue(dayOfMonth) && dayOfMonth !== '*' && dayOfWeek === '*') {\n return 'monthly';\n }\n\n // Check for weekly/daily (specific days of week or ranges)\n if (dayOfMonth === '*' && (dayOfWeek !== '*' || this.isSimpleValue(hour))) {\n // If specific days of week, it's weekly\n if (dayOfWeek !== '*' && !['0-6', '1-5', '0,6', '6,0'].includes(dayOfWeek)) {\n return 'weekly';\n }\n return 'daily';\n }\n\n return 'custom';\n }\n\n private detectDailyMode(dayOfWeek: string): 'every' | 'weekdays' | 'weekends' | 'specific' {\n if (dayOfWeek === '*' || dayOfWeek === '0-6') {\n return 'every';\n }\n if (dayOfWeek === '1-5') {\n return 'weekdays';\n }\n if (dayOfWeek === '0,6' || dayOfWeek === '6,0') {\n return 'weekends';\n }\n return 'specific';\n }\n\n private parseInterval(field: string): number | null {\n const match = field.match(/^\\*\\/(\\d+)$/);\n return match ? parseInt(match[1], 10) : null;\n }\n\n private parseSimpleValue(field: string): number | null {\n if (field === '*') return null;\n const num = parseInt(field, 10);\n return isNaN(num) ? null : num;\n }\n\n private isSimpleValue(field: string): boolean {\n return /^\\d+$/.test(field);\n }\n\n private parseDaysOfWeek(field: string): Weekday[] {\n if (field === '*') {\n return [0, 1, 2, 3, 4, 5, 6];\n }\n\n const days: Weekday[] = [];\n\n // Handle ranges like 1-5\n const rangeMatch = field.match(/^(\\d)-(\\d)$/);\n if (rangeMatch) {\n const start = parseInt(rangeMatch[1], 10);\n const end = parseInt(rangeMatch[2], 10);\n for (let i = start; i <= end; i++) {\n days.push(i as Weekday);\n }\n return days;\n }\n\n // Handle comma-separated values\n const parts = field.split(',');\n for (const part of parts) {\n const num = parseInt(part.trim(), 10);\n if (!isNaN(num) && num >= 0 && num <= 6) {\n days.push(num as Weekday);\n }\n }\n\n return days;\n }\n\n private generateSecondsExpression(schedule: CronSchedule): string {\n const interval = schedule.secondInterval || 1;\n return `*/${interval} * * * * *`;\n }\n\n private generateMinutesExpression(schedule: CronSchedule): string {\n const interval = schedule.minuteInterval || 1;\n return `0 */${interval} * * * *`;\n }\n\n private generateHourlyExpression(schedule: CronSchedule): string {\n const interval = schedule.hourInterval || 1;\n const minute = schedule.hourMinute ?? 0;\n const second = schedule.hourSecond ?? 0;\n return `${second} ${minute} */${interval} * * *`;\n }\n\n private generateDailyExpression(schedule: CronSchedule): string {\n const time = schedule.time || { hour: 0, minute: 0, second: 0 };\n let dayOfWeek = '*';\n\n switch (schedule.dailyMode) {\n case 'weekdays':\n dayOfWeek = '1-5';\n break;\n case 'weekends':\n dayOfWeek = '0,6';\n break;\n case 'specific':\n if (schedule.selectedDays && schedule.selectedDays.length > 0) {\n dayOfWeek = schedule.selectedDays.sort((a, b) => a - b).join(',');\n }\n break;\n case 'every':\n default:\n dayOfWeek = '*';\n break;\n }\n\n return `${time.second} ${time.minute} ${time.hour} * * ${dayOfWeek}`;\n }\n\n private generateWeeklyExpression(schedule: CronSchedule): string {\n const time = schedule.time || { hour: 9, minute: 0, second: 0 };\n const days = schedule.selectedDays || [1]; // Default to Monday\n\n const dayOfWeek = days.length > 0\n ? days.sort((a, b) => a - b).join(',')\n : '1';\n\n return `${time.second} ${time.minute} ${time.hour} * * ${dayOfWeek}`;\n }\n\n private generateMonthlyExpression(schedule: CronSchedule): string {\n const time = schedule.time || { hour: 0, minute: 0, second: 0 };\n\n if (schedule.monthlyMode === 'relative' && schedule.relativeWeek && schedule.relativeDay !== undefined) {\n // For relative scheduling, we need to use special syntax\n // cron-parser doesn't fully support this, so we approximate\n const weekNum = this.getWeekNumber(schedule.relativeWeek);\n const day = schedule.relativeDay;\n\n if (schedule.relativeWeek === 'last') {\n // Last weekday of month - approximate with last week\n return `${time.second} ${time.minute} ${time.hour} * * ${day}`;\n }\n\n // First X-day, Second X-day, etc. - approximate\n const startDay = (weekNum - 1) * 7 + 1;\n const endDay = weekNum * 7;\n return `${time.second} ${time.minute} ${time.hour} ${startDay}-${endDay} * ${day}`;\n }\n\n // Specific day of month\n const dayOfMonth = schedule.dayOfMonth || 1;\n return `${time.second} ${time.minute} ${time.hour} ${dayOfMonth} * *`;\n }\n\n private generateCustomExpression(schedule: CronSchedule): string {\n const fields = schedule.customFields;\n if (!fields) {\n return '0 * * * * *';\n }\n return `${fields.second} ${fields.minute} ${fields.hour} ${fields.dayOfMonth} ${fields.month} ${fields.dayOfWeek}`;\n }\n\n private getWeekNumber(week: 'first' | 'second' | 'third' | 'fourth' | 'last'): number {\n switch (week) {\n case 'first': return 1;\n case 'second': return 2;\n case 'third': return 3;\n case 'fourth': return 4;\n case 'last': return 5;\n default: return 1;\n }\n }\n}\n","import {\n Component,\n Input,\n OnInit,\n forwardRef,\n signal,\n computed,\n inject,\n effect,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\n\n// Kendo UI imports\nimport { TabStripModule } from '@progress/kendo-angular-layout';\nimport { DropDownListModule } from '@progress/kendo-angular-dropdowns';\nimport { ButtonModule, ButtonGroupModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { LabelModule } from '@progress/kendo-angular-label';\nimport { SVGIconModule } from '@progress/kendo-angular-icons';\nimport { copyIcon, clockIcon, checkIcon, xIcon } from '@progress/kendo-svg-icons';\n\n// Local imports\nimport {\n CronBuilderConfig,\n CronSchedule,\n ScheduleType,\n Weekday,\n DEFAULT_CRON_BUILDER_CONFIG,\n CRON_PRESETS,\n CronPreset,\n SECOND_INTERVALS,\n MINUTE_INTERVALS,\n HOUR_INTERVALS,\n WEEKDAY_ABBREVIATIONS,\n WEEKDAYS,\n RELATIVE_WEEKS,\n DropdownOption,\n generateHourOptions,\n generateMinuteOptions,\n generateDayOfMonthOptions,\n CronFields\n} from './cron-builder.models';\nimport { CronParserService } from './services/cron-parser.service';\nimport { CronHumanizerService } from './services/cron-humanizer.service';\n\n@Component({\n selector: 'mm-cron-builder',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n TabStripModule,\n DropDownListModule,\n ButtonModule,\n ButtonGroupModule,\n InputsModule,\n LabelModule,\n SVGIconModule\n ],\n templateUrl: './cron-builder.component.html',\n styleUrl: './cron-builder.component.scss',\n changeDetection: ChangeDetectionStrategy.Eager,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CronBuilderComponent),\n multi: true\n }\n ]\n})\nexport class CronBuilderComponent implements OnInit, ControlValueAccessor {\n\n // --- Configuration ---\n @Input() config: CronBuilderConfig = {};\n\n // --- Services ---\n private readonly cronParser = inject(CronParserService);\n private readonly cronHumanizer = inject(CronHumanizerService);\n\n // --- Icons ---\n protected readonly copyIcon = copyIcon;\n protected readonly clockIcon = clockIcon;\n protected readonly checkIcon = checkIcon;\n protected readonly xIcon = xIcon;\n\n // --- ControlValueAccessor state (initialized as noop, set by registerOnChange/registerOnTouched) ---\n private onChange: (value: string) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n protected disabled = signal(false);\n\n // --- Internal state ---\n protected readonly expression = signal<string>('0 * * * * *');\n protected readonly selectedTabIndex = signal<number>(3); // Default to Daily tab\n protected readonly copiedRecently = signal(false);\n private suppressOnChange = true; // Suppress onChange until user interacts\n\n // Schedule type state\n protected readonly scheduleType = signal<ScheduleType>('daily');\n\n // Seconds tab\n protected readonly secondInterval = signal<number>(5);\n\n // Minutes tab\n protected readonly minuteInterval = signal<number>(5);\n\n // Hourly tab\n protected readonly hourInterval = signal<number>(1);\n protected readonly hourMinute = signal<number>(0);\n protected readonly hourSecond = signal<number>(0);\n\n // Daily/Weekly tab\n protected readonly timeHour = signal<number>(9);\n protected readonly timeMinute = signal<number>(0);\n protected readonly timeSecond = signal<number>(0);\n protected readonly dailyMode = signal<'every' | 'weekdays' | 'weekends' | 'specific'>('every');\n protected readonly selectedDays = signal<Weekday[]>([]);\n\n // Monthly tab\n protected readonly monthlyMode = signal<'specific' | 'relative'>('specific');\n protected readonly dayOfMonth = signal<number>(1);\n protected readonly relativeWeek = signal<string>('first');\n protected readonly relativeDay = signal<Weekday>(1);\n\n // Custom tab\n protected readonly customSecond = signal<string>('0');\n protected readonly customMinute = signal<string>('*');\n protected readonly customHour = signal<string>('*');\n protected readonly customDayOfMonth = signal<string>('*');\n protected readonly customMonth = signal<string>('*');\n protected readonly customDayOfWeek = signal<string>('*');\n\n // --- Computed values ---\n protected readonly mergedConfig = computed(() => ({\n ...DEFAULT_CRON_BUILDER_CONFIG,\n ...this.config\n }));\n\n protected readonly humanReadable = computed(() => {\n const expr = this.expression();\n const locale = this.mergedConfig().locale || 'en';\n return this.cronHumanizer.toHumanReadable(expr, locale);\n });\n\n protected readonly validationResult = computed(() => {\n return this.cronParser.validate(this.expression());\n });\n\n protected readonly nextExecutions = computed(() => {\n const expr = this.expression();\n const maxCount = this.mergedConfig().maxNextExecutions || 3;\n return this.cronParser.getNextExecutions(expr, maxCount);\n });\n\n protected readonly presets = computed(() => {\n return CRON_PRESETS;\n });\n\n protected readonly presetsByCategory = computed(() => {\n const presets = this.presets();\n return {\n frequent: presets.filter(p => p.category === 'frequent'),\n hourly: presets.filter(p => p.category === 'hourly'),\n daily: presets.filter(p => p.category === 'daily'),\n weekly: presets.filter(p => p.category === 'weekly'),\n monthly: presets.filter(p => p.category === 'monthly')\n };\n });\n\n // --- Dropdown options ---\n protected get secondIntervalOptions(): typeof SECOND_INTERVALS { return SECOND_INTERVALS; }\n protected get minuteIntervalOptions(): typeof MINUTE_INTERVALS { return MINUTE_INTERVALS; }\n protected get hourIntervalOptions(): typeof HOUR_INTERVALS { return HOUR_INTERVALS; }\n protected get weekdayOptions(): typeof WEEKDAYS { return WEEKDAYS; }\n protected get weekdayAbbreviations(): typeof WEEKDAY_ABBREVIATIONS { return WEEKDAY_ABBREVIATIONS; }\n protected get relativeWeekOptions(): typeof RELATIVE_WEEKS { return RELATIVE_WEEKS; }\n protected readonly hourOptions: DropdownOption<number>[];\n protected readonly minuteOptions: DropdownOption<number>[];\n protected readonly dayOfMonthOptions: DropdownOption<number>[];\n\n // --- Tab mapping ---\n protected readonly tabIndexToType: ScheduleType[] = [\n 'seconds', 'minutes', 'hourly', 'daily', 'weekly', 'monthly', 'custom'\n ];\n\n constructor() {\n // Assigned here rather than as field initialisers: a class field initialised from a\n // relative import reads `undefined` under the Vitest module runner, so calling the\n // imported generator at field-init time would throw (see CLAUDE.md,\n // \"Vite/esbuild class-field snapshot\"). A getter is not an option — the template reads\n // these three every change detection cycle and would rebuild the option arrays each time.\n this.hourOptions = generateHourOptions();\n this.minuteOptions = generateMinuteOptions();\n this.dayOfMonthOptions = generateDayOfMonthOptions();\n\n // Effect to generate expression when schedule values change\n effect(() => {\n const type = this.scheduleType();\n const schedule = this.buildScheduleFromState(type);\n const newExpression = this.cronParser.generate(schedule);\n const currentExpression = this.expression();\n\n // Only update if the expression actually changed\n if (newExpression !== currentExpression) {\n this.expression.set(newExpression);\n }\n\n // Only call onChange if not suppressed (user has interacted)\n if (!this.suppressOnChange && newExpression !== currentExpression) {\n this.onChange(newExpression);\n }\n }, { allowSignalWrites: true });\n }\n\n ngOnInit(): void {\n const defaultType = this.mergedConfig().defaultScheduleType || 'daily';\n this.scheduleType.set(defaultType);\n this.selectedTabIndex.set(this.tabIndexToType.indexOf(defaultType));\n }\n\n // --- ControlValueAccessor implementation ---\n\n writeValue(value: string): void {\n if (value) {\n this.expression.set(value);\n this.parseExpressionToState(value);\n }\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n }\n\n // --- Event handlers ---\n\n protected onTabSelect(index: number): void {\n this.suppressOnChange = false;\n this.selectedTabIndex.set(index);\n const type = this.tabIndexToType[index];\n if (type) {\n this.scheduleType.set(type);\n }\n this.onTouched();\n }\n\n protected onPresetSelect(preset: CronPreset): void {\n this.suppressOnChange = false;\n this.expression.set(preset.expression);\n this.parseExpressionToState(preset.expression);\n this.onChange(preset.expression);\n this.onTouched();\n }\n\n protected async onCopyExpression(): Promise<void> {\n const expr = this.expression();\n try {\n await navigator.clipboard.writeText(expr);\n this.copiedRecently.set(true);\n setTimeout(() => this.copiedRecently.set(false), 2000);\n } catch (err) {\n console.error('Failed to copy to clipboard:', err);\n }\n }\n\n // --- Seconds tab handlers ---\n protected onSecondIntervalChange(value: number): void {\n this.suppressOnChange = false;\n this.secondInterval.set(value);\n this.onTouched();\n }\n\n // --- Minutes tab handlers ---\n protected onMinuteIntervalChange(value: number): void {\n this.suppressOnChange = false;\n this.minuteInterval.set(value);\n this.onTouched();\n }\n\n // --- Hourly tab handlers ---\n protected onHourIntervalChange(value: number): void {\n this.suppressOnChange = false;\n this.hourInterval.set(value);\n this.onTouched();\n }\n\n protected onHourMinuteChange(value: number): void {\n this.suppressOnChange = false;\n this.hourMinute.set(value);\n this.onTouched();\n }\n\n protected onHourSecondChange(value: number): void {\n this.suppressOnChange = false;\n this.hourSecond.set(value);\n this.onTouched();\n }\n\n // --- Daily tab handlers ---\n protected onTimeHourChange(value: number): void {\n this.suppressOnChange = false;\n this.timeHour.set(value);\n this.onTouched();\n }\n\n protected onTimeMinuteChange(value: number): void {\n this.suppressOnChange = false;\n this.timeMinute.set(value);\n this.onTouched();\n }\n\n protected onTimeSecondChange(value: number): void {\n this.suppressOnChange = false;\n this.timeSecond.set(value);\n this.onTouched();\n }\n\n protected onDailyModeChange(mode: 'every' | 'weekdays' | 'weekends' | 'specific'): void {\n this.suppressOnChange = false;\n this.dailyMode.set(mode);\n if (mode !== 'specific') {\n this.selectedDays.set([]);\n }\n this.onTouched();\n }\n\n protected onDayToggle(day: Weekday): void {\n this.suppressOnChange = false;\n const current = this.selectedDays();\n if (current.includes(day)) {\n this.selectedDays.set(current.filter(d => d !== day));\n } else {\n this.selectedDays.set([...current, day]);\n }\n this.onTouched();\n }\n\n protected isDaySelected(day: Weekday): boolean {\n return this.selectedDays().includes(day);\n }\n\n // --- Monthly tab handlers ---\n protected onMonthlyModeChange(mode: 'specific' | 'relative'): void {\n this.suppressOnChange = false;\n this.monthlyMode.set(mode);\n this.onTouched();\n }\n\n protected onDayOfMonthChange(value: number): void {\n this.suppressOnChange = false;\n this.dayOfMonth.set(value);\n this.onTouched();\n }\n\n protected onRelativeWeekChange(value: string): void {\n this.suppressOnChange = false;\n this.relativeWeek.set(value);\n this.onTouched();\n }\n\n protected onRelativeDayChange(value: Weekday): void {\n this.suppressOnChange = false;\n this.relativeDay.set(value);\n this.onTouched();\n }\n\n // --- Custom tab handlers ---\n protected onCustomFieldChange(field: keyof CronFields, value: string): void {\n this.suppressOnChange = false;\n switch (field) {\n case 'second': this.customSecond.set(value); break;\n case 'minute': this.customMinute.set(value); break;\n case 'hour': this.customHour.set(value); break;\n case 'dayOfMonth': this.customDayOfMonth.set(value); break;\n case 'month': this.customMonth.set(value); break;\n case 'dayOfWeek': this.customDayOfWeek.set(value); break;\n }\n this.onTouched();\n }\n\n // --- Helper methods ---\n\n protected formatNextExecution(date: Date): string {\n return date.toLocaleString(this.mergedConfig().locale || 'en', {\n weekday: 'short',\n year: 'numeric',\n month: 'short',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false\n });\n }\n\n private buildScheduleFromState(type: ScheduleType): CronSchedule {\n const schedule: CronSchedule = { type };\n\n switch (type) {\n case 'seconds':\n schedule.secondInterval = this.secondInterval();\n break;\n\n case 'minutes':\n schedule.minuteInterval = this.minuteInterval();\n break;\n\n case 'hourly':\n schedule.hourInterval = this.hourInterval();\n schedule.hourMinute = this.hourMinute();\n schedule.hourSecond = this.hourSecond();\n break;\n\n case 'daily':\n schedule.time = {\n hour: this.timeHour(),\n minute: this.timeMinute(),\n second: this.timeSecond()\n };\n schedule.dailyMode = this.dailyMode();\n schedule.selectedDays = this.selectedDays();\n break;\n\n case 'weekly':\n schedule.time = {\n hour: this.timeHour(),\n minute: this.timeMinute(),\n second: this.timeSecond()\n };\n schedule.selectedDays = this.selectedDays().length > 0 ? this.selectedDays() : [1];\n break;\n\n case 'monthly':\n schedule.time = {\n hour: this.timeHour(),\n minute: this.timeMinute(),\n second: this.timeSecond()\n };\n schedule.monthlyMode = this.monthlyMode();\n schedule.dayOfMonth = this.dayOfMonth();\n schedule.relativeWeek = this.relativeWeek() as 'first' | 'second' | 'third' | 'fourth' | 'last';\n schedule.relativeDay = this.relativeDay();\n break;\n\n case 'custom':\n schedule.customFields = {\n second: this.customSecond(),\n minute: this.customMinute(),\n hour: this.customHour(),\n dayOfMonth: this.customDayOfMonth(),\n month: this.customMonth(),\n dayOfWeek: this.customDayOfWeek()\n };\n break;\n }\n\n return schedule;\n }\n\n private parseExpressionToState(expression: string): void {\n const schedule = this.cronParser.parse(expression);\n if (!schedule) return;\n\n this.scheduleType.set(schedule.type);\n this.selectedTabIndex.set(this.tabIndexToType.indexOf(schedule.type));\n\n // Parse custom fields first (always available)\n if (schedule.customFields) {\n this.customSecond.set(schedule.customFields.second);\n this.customMinute.set(schedule.customFields.minute);\n this.customHour.set(schedule.customFields.hour);\n this.customDayOfMonth.set(schedule.customFields.dayOfMonth);\n this.customMonth.set(schedule.customFields.month);\n this.customDayOfWeek.set(schedule.customFields.dayOfWeek);\n }\n\n // Parse type-specific fields\n switch (schedule.type) {\n case 'seconds':\n if (schedule.secondInterval) this.secondInterval.set(schedule.secondInterval);\n break;\n\n case 'minutes':\n if (schedule.minuteInterval) this.minuteInterval.set(schedule.minuteInterval);\n break;\n\n case 'hourly':\n if (schedule.hourInterval) this.hourInterval.set(schedule.hourInterval);\n if (schedule.hourMinute !== undefined) this.hourMinute.set(schedule.hourMinute);\n if (schedule.hourSecond !== undefined) this.hourSecond.set(schedule.hourSecond);\n break;\n\n case 'daily':\n case 'weekly':\n if (schedule.time) {\n this.timeHour.set(schedule.time.hour);\n this.timeMinute.set(schedule.time.minute);\n this.timeSecond.set(schedule.time.second);\n }\n if (schedule.dailyMode) this.dailyMode.set(schedule.dailyMode);\n if (schedule.selectedDays) this.selectedDays.set(schedule.selectedDays);\n break;\n\n case 'monthly':\n if (schedule.time) {\n this.timeHour.set(schedule.time.hour);\n this.timeMinute.set(schedule.time.minute);\n this.timeSecond.set(schedule.time.second);\n }\n if (schedule.monthlyMode) this.monthlyMode.set(schedule.monthlyMode);\n if (schedule.dayOfMonth) this.dayOfMonth.set(schedule.dayOfMonth);\n if (schedule.relativeWeek) this.relativeWeek.set(schedule.relativeWeek);\n if (schedule.relativeDay !== undefined) this.relativeDay.set(schedule.relativeDay);\n break;\n }\n }\n\n // Track by functions for ngFor\n protected trackByValue(_index: number, item: DropdownOption): number | string {\n return item.value;\n }\n\n protected trackByPresetId(_index: number, item: CronPreset): string {\n return item.id;\n }\n}\n","<div class=\"cron-builder\" [class.disabled]=\"disabled()\">\n <!-- Expression Preview Section -->\n <div class=\"expression-section\">\n <div class=\"expression-display\">\n <div class=\"expression-label\">Cron Expression</div>\n <div class=\"expression-value-row\">\n <code class=\"expression-value\" [class.invalid]=\"!validationResult().isValid\">\n {{ expression() }}\n </code>\n @if (mergedConfig().showCopyButton) {\n <button\n kendoButton\n [svgIcon]=\"copiedRecently() ? checkIcon : copyIcon\"\n [title]=\"copiedRecently() ? 'Copied!' : 'Copy to clipboard'\"\n fillMode=\"flat\"\n class=\"copy-button\"\n [class.copied]=\"copiedRecently()\"\n (click)=\"onCopyExpression()\"\n [disabled]=\"disabled()\">\n </button>\n }\n </div>\n @if (!validationResult().isValid) {\n <div class=\"validation-error\">\n <kendo-svg-icon [icon]=\"xIcon\" size=\"small\"></kendo-svg-icon>\n {{ validationResult().error }}\n </div>\n }\n </div>\n\n @if (mergedConfig().showHumanReadable && validationResult().isValid) {\n <div class=\"human-readable\">\n <kendo-svg-icon [icon]=\"clockIcon\" size=\"small\"></kendo-svg-icon>\n <span>{{ humanReadable() }}</span>\n </div>\n }\n </div>\n\n <!-- Preset Buttons -->\n @if (mergedConfig().showPresets) {\n <div class=\"presets-section\">\n <div class=\"presets-label\">Quick Select</div>\n <div class=\"presets-grid\">\n @for (preset of presetsByCategory().frequent; track preset.id) {\n <button\n kendoButton\n size=\"small\"\n fillMode=\"outline\"\n class=\"preset-button\"\n [title]=\"preset.description\"\n [disabled]=\"disabled()\"\n (click)=\"onPresetSelect(preset)\">\n {{ preset.label }}\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Schedule Type Tabs -->\n <kendo-tabstrip\n [animate]=\"false\"\n [tabAlignment]=\"'start'\"\n (tabSelect)=\"onTabSelect($event.index)\">\n\n <!-- Seconds Tab -->\n <kendo-tabstrip-tab [title]=\"'Seconds'\" [selected]=\"selectedTabIndex() === 0\">\n <ng-template kendoTabContent>\n <div class=\"tab-content\">\n <div class=\"form-row\">\n <kendo-label text=\"Run every\"></kendo-label>\n <kendo-dropdownlist\n [data]=\"secondIntervalOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"secondInterval()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onSecondIntervalChange($event)\">\n </kendo-dropdownlist>\n </div>\n <div class=\"preview-text\">\n Generates: <code>*/{{ secondInterval() }} * * * * *</code>\n </div>\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n\n <!-- Minutes Tab -->\n <kendo-tabstrip-tab [title]=\"'Minutes'\" [selected]=\"selectedTabIndex() === 1\">\n <ng-template kendoTabContent>\n <div class=\"tab-content\">\n <div class=\"form-row\">\n <kendo-label text=\"Run every\"></kendo-label>\n <kendo-dropdownlist\n [data]=\"minuteIntervalOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"minuteInterval()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onMinuteIntervalChange($event)\">\n </kendo-dropdownlist>\n </div>\n <div class=\"preview-text\">\n Generates: <code>0 */{{ minuteInterval() }} * * * *</code>\n </div>\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n\n <!-- Hourly Tab -->\n <kendo-tabstrip-tab [title]=\"'Hourly'\" [selected]=\"selectedTabIndex() === 2\">\n <ng-template kendoTabContent>\n <div class=\"tab-content\">\n <div class=\"form-row\">\n <kendo-label text=\"Run every\"></kendo-label>\n <kendo-dropdownlist\n [data]=\"hourIntervalOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"hourInterval()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onHourIntervalChange($event)\">\n </kendo-dropdownlist>\n </div>\n <div class=\"form-row\">\n <kendo-label text=\"At minute\"></kendo-label>\n <kendo-dropdownlist\n [data]=\"minuteOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"hourMinute()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onHourMinuteChange($event)\">\n </kendo-dropdownlist>\n <span class=\"separator\">:</span>\n <kendo-dropdownlist\n [data]=\"minuteOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"hourSecond()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onHourSecondChange($event)\">\n </kendo-dropdownlist>\n <span class=\"time-label\">(mm:ss)</span>\n </div>\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n\n <!-- Daily Tab -->\n <kendo-tabstrip-tab [title]=\"'Daily'\" [selected]=\"selectedTabIndex() === 3\">\n <ng-template kendoTabContent>\n <div class=\"tab-content\">\n <div class=\"form-row time-row\">\n <kendo-label text=\"At\"></kendo-label>\n <kendo-dropdownlist\n [data]=\"hourOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"timeHour()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onTimeHourChange($event)\">\n </kendo-dropdownlist>\n <span class=\"separator\">:</span>\n <kendo-dropdownlist\n [data]=\"minuteOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"timeMinute()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onTimeMinuteChange($event)\">\n </kendo-dropdownlist>\n <span class=\"separator\">:</span>\n <kendo-dropdownlist\n [data]=\"minuteOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"timeSecond()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onTimeSecondChange($event)\">\n </kendo-dropdownlist>\n </div>\n\n <div class=\"form-row mode-row\">\n <kendo-label text=\"On\"></kendo-label>\n <div class=\"mode-buttons\">\n <button\n kendoButton\n [selected]=\"dailyMode() === 'every'\"\n [disabled]=\"disabled()\"\n (click)=\"onDailyModeChange('every')\">\n Every day\n </button>\n <button\n kendoButton\n [selected]=\"dailyMode() === 'weekdays'\"\n [disabled]=\"disabled()\"\n (click)=\"onDailyModeChange('weekdays')\">\n Weekdays\n </button>\n <button\n kendoButton\n [selected]=\"dailyMode() === 'weekends'\"\n [disabled]=\"disabled()\"\n (click)=\"onDailyModeChange('weekends')\">\n Weekends\n </button>\n <button\n kendoButton\n [selected]=\"dailyMode() === 'specific'\"\n [disabled]=\"disabled()\"\n (click)=\"onDailyModeChange('specific')\">\n Specific days\n </button>\n </div>\n </div>\n\n @if (dailyMode() === 'specific') {\n <div class=\"form-row days-row\">\n <div class=\"day-buttons\">\n @for (day of weekdayAbbreviations; track day.value) {\n <button\n kendoButton\n [selected]=\"isDaySelected(day.value)\"\n [disabled]=\"disabled()\"\n class=\"day-button\"\n (click)=\"onDayToggle(day.value)\">\n {{ day.label }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n\n <!-- Weekly Tab -->\n <kendo-tabstrip-tab [title]=\"'Weekly'\" [selected]=\"selectedTabIndex() === 4\">\n <ng-template kendoTabContent>\n <div class=\"tab-content\">\n <div class=\"form-row time-row\">\n <kendo-label text=\"At\"></kendo-label>\n <kendo-dropdownlist\n [data]=\"hourOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"timeHour()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onTimeHourChange($event)\">\n </kendo-dropdownlist>\n <span class=\"separator\">:</span>\n <kendo-dropdownlist\n [data]=\"minuteOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"timeMinute()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onTimeMinuteChange($event)\">\n </kendo-dropdownlist>\n <span class=\"separator\">:</span>\n <kendo-dropdownlist\n [data]=\"minuteOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"timeSecond()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onTimeSecondChange($event)\">\n </kendo-dropdownlist>\n </div>\n\n <div class=\"form-row\">\n <kendo-label text=\"On days\"></kendo-label>\n <div class=\"day-buttons\">\n @for (day of weekdayAbbreviations; track day.value) {\n <button\n kendoButton\n [selected]=\"isDaySelected(day.value)\"\n [disabled]=\"disabled()\"\n class=\"day-button\"\n (click)=\"onDayToggle(day.value)\">\n {{ day.label }}\n </button>\n }\n </div>\n </div>\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n\n <!-- Monthly Tab -->\n <kendo-tabstrip-tab [title]=\"'Monthly'\" [selected]=\"selectedTabIndex() === 5\">\n <ng-template kendoTabContent>\n <div class=\"tab-content\">\n <div class=\"form-row time-row\">\n <kendo-label text=\"At\"></kendo-label>\n <kendo-dropdownlist\n [data]=\"hourOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"timeHour()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onTimeHourChange($event)\">\n </kendo-dropdownlist>\n <span class=\"separator\">:</span>\n <kendo-dropdownlist\n [data]=\"minuteOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"timeMinute()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onTimeMinuteChange($event)\">\n </kendo-dropdownlist>\n <span class=\"separator\">:</span>\n <kendo-dropdownlist\n [data]=\"minuteOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"timeSecond()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onTimeSecondChange($event)\">\n </kendo-dropdownlist>\n </div>\n\n <div class=\"form-row mode-row\">\n <div class=\"mode-buttons\">\n <button\n kendoButton\n [selected]=\"monthlyMode() === 'specific'\"\n [disabled]=\"disabled()\"\n (click)=\"onMonthlyModeChange('specific')\">\n Specific day\n </button>\n <button\n kendoButton\n [selected]=\"monthlyMode() === 'relative'\"\n [disabled]=\"disabled()\"\n (click)=\"onMonthlyModeChange('relative')\">\n Relative day\n </button>\n </div>\n </div>\n\n @if (monthlyMode() === 'specific') {\n <div class=\"form-row\">\n <kendo-label text=\"On day\"></kendo-label>\n <kendo-dropdownlist\n [data]=\"dayOfMonthOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"dayOfMonth()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onDayOfMonthChange($event)\">\n </kendo-dropdownlist>\n <span class=\"suffix-text\">of every month</span>\n </div>\n }\n\n @if (monthlyMode() === 'relative') {\n <div class=\"form-row\">\n <kendo-label text=\"On the\"></kendo-label>\n <kendo-dropdownlist\n [data]=\"relativeWeekOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"relativeWeek()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onRelativeWeekChange($event)\">\n </kendo-dropdownlist>\n <kendo-dropdownlist\n [data]=\"weekdayOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [value]=\"relativeDay()\"\n [valuePrimitive]=\"true\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onRelativeDayChange($event)\">\n </kendo-dropdownlist>\n <span class=\"suffix-text\">of every month</span>\n </div>\n }\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n\n <!-- Custom/Advanced Tab -->\n @if (mergedConfig().allowCustom) {\n <kendo-tabstrip-tab [title]=\"'Custom'\" [selected]=\"selectedTabIndex() === 6\">\n <ng-template kendoTabContent>\n <div class=\"tab-content custom-tab\">\n <div class=\"custom-fields\">\n <div class=\"custom-field\">\n <kendo-label text=\"Second\"></kendo-label>\n <kendo-textbox\n [value]=\"customSecond()\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onCustomFieldChange('second', $event || '*')\">\n </kendo-textbox>\n <span class=\"field-hint\">0-59, *, /</span>\n </div>\n <div class=\"custom-field\">\n <kendo-label text=\"Minute\"></kendo-label>\n <kendo-textbox\n [value]=\"customMinute()\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onCustomFieldChange('minute', $event || '*')\">\n </kendo-textbox>\n <span class=\"field-hint\">0-59, *, /</span>\n </div>\n <div class=\"custom-field\">\n <kendo-label text=\"Hour\"></kendo-label>\n <kendo-textbox\n [value]=\"customHour()\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onCustomFieldChange('hour', $event || '*')\">\n </kendo-textbox>\n <span class=\"field-hint\">0-23, *, /</span>\n </div>\n <div class=\"custom-field\">\n <kendo-label text=\"Day\"></kendo-label>\n <kendo-textbox\n [value]=\"customDayOfMonth()\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onCustomFieldChange('dayOfMonth', $event || '*')\">\n </kendo-textbox>\n <span class=\"field-hint\">1-31, *, /</span>\n </div>\n <div class=\"custom-field\">\n <kendo-label text=\"Month\"></kendo-label>\n <kendo-textbox\n [value]=\"customMonth()\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onCustomFieldChange('month', $event || '*')\">\n </kendo-textbox>\n <span class=\"field-hint\">1-12, *, /</span>\n </div>\n <div class=\"custom-field\">\n <kendo-label text=\"Weekday\"></kendo-label>\n <kendo-textbox\n [value]=\"customDayOfWeek()\"\n [disabled]=\"disabled()\"\n (valueChange)=\"onCustomFieldChange('dayOfWeek', $event || '*')\">\n </kendo-textbox>\n <span class=\"field-hint\">0-6 (Sun-Sat)</span>\n </div>\n </div>\n\n <div class=\"syntax-reference\">\n <div class=\"reference-title\">Syntax Reference</div>\n <div class=\"reference-items\">\n <span><code>*</code> any</span>\n <span><code>*/N</code> every N</span>\n <span><code>N-M</code> range</span>\n <span><code>N,M</code> list</span>\n </div>\n </div>\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n }\n </kendo-tabstrip>\n\n <!-- Next Executions Section -->\n @if (mergedConfig().showNextExecutions && validationResult().isValid && nextExecutions().length > 0) {\n <div class=\"next-executions-section\">\n <div class=\"next-executions-label\">Next Executions</div>\n <ul class=\"next-executions-list\">\n @for (execution of nextExecutions(); track $index) {\n <li>{{ formatNextExecution(execution) }}</li>\n }\n </ul>\n </div>\n }\n</div>\n","import { Component, Input, Output, EventEmitter, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ButtonModule } from '@progress/kendo-angular-buttons';\nimport { SVGIconModule } from '@progress/kendo-angular-icons';\nimport { copyIcon } from '@progress/kendo-svg-icons';\nimport { NotificationDisplayService } from '../services/notification-display.service';\n\n/**\n * A component that displays a read-only text value with a copy-to-clipboard button.\n *\n * @example\n * ```html\n * <mm-copyable-text\n * [value]=\"rtId\"\n * label=\"Runtime ID\"\n * copyLabel=\"Runtime ID\">\n * </mm-copyable-text>\n * ```\n */\n@Component({\n selector: 'mm-copyable-text',\n standalone: true,\n imports: [CommonModule, ButtonModule, SVGIconModule],\n templateUrl: './copyable-text.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './copyable-text.component.scss'\n})\nexport class CopyableTextComponent {\n /** The value to display and copy. Displays an em-dash when null/undefined/empty. */\n @Input({ required: true }) value!: string | null | undefined;\n\n /** Optional label displayed above the value. */\n @Input() label?: string;\n\n /** Label used in the notification message. Falls back to label, then 'Value'. */\n @Input() copyLabel?: string;\n\n /** Tooltip for the copy button. */\n @Input() buttonTitle = 'Copy to clipboard';\n\n /** Emitted when the value is successfully copied to clipboard. */\n @Output() copied = new EventEmitter<string>();\n\n protected readonly copyIcon = copyIcon;\n private readonly notificationService = inject(NotificationDisplayService);\n\n /** Returns true if the value is non-empty and can be copied. */\n protected get hasValue(): boolean {\n return !!this.value && this.value.trim().length > 0;\n }\n\n /** Copies the value to clipboard and shows a notification. */\n protected copyToClipboard(): void {\n if (!this.hasValue) {\n return;\n }\n\n navigator.clipboard.writeText(this.value!).then(() => {\n const label = this.copyLabel || this.label || 'Value';\n this.notificationService.showSuccess(`${label} copied to clipboard`, 2000);\n this.copied.emit(this.value!);\n }).catch(err => {\n console.error('Failed to copy:', err);\n this.notificationService.showError('Failed to copy to clipboard');\n });\n }\n}\n","<div class=\"mm-copyable-text\">\n @if (label) {\n <label class=\"label\">{{ label }}</label>\n }\n <div class=\"value-container\">\n <span class=\"value\">{{ hasValue ? value : '—' }}</span>\n @if (hasValue) {\n <button\n kendoButton\n type=\"button\"\n fillMode=\"flat\"\n [svgIcon]=\"copyIcon\"\n [title]=\"buttonTitle\"\n class=\"copy-button\"\n (click)=\"copyToClipboard()\">\n </button>\n }\n </div>\n</div>\n","import {Component, inject, Input, ChangeDetectionStrategy} from '@angular/core';\nimport {DialogActionsComponent, DialogContentBase, DialogRef} from '@progress/kendo-angular-dialog';\nimport {ButtonComponent} from '@progress/kendo-angular-buttons';\nimport {FormsModule} from '@angular/forms';\nimport {ImportStrategyDto} from '../models/importStrategyDto';\nimport { MmDialogActionsDirective } from '../dialog-actions/dialog-actions.directive';\n\nexport class ImportStrategyDialogResult {\n constructor(public strategy: ImportStrategyDto) {}\n}\n\n@Component({\n selector: 'mm-import-strategy-dialog',\n imports: [\n MmDialogActionsDirective,\n DialogActionsComponent,\n ButtonComponent,\n FormsModule\n ],\n templateUrl: './import-strategy-dialog.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './import-strategy-dialog.component.css'\n})\nexport class ImportStrategyDialogComponent extends DialogContentBase {\n private readonly dialogRef: DialogRef;\n\n @Input() message = '';\n\n protected selectedStrategy: ImportStrategyDto;\n protected get ImportStrategyDto(): typeof ImportStrategyDto { return ImportStrategyDto; }\n\n constructor() {\n const dialogRef = inject(DialogRef);\n super(dialogRef);\n this.dialogRef = dialogRef;\n // Assigned here rather than as a field initialiser: a class field initialised from a\n // relative import reads `undefined` under the Vitest module runner, so the member access\n // would throw (see CLAUDE.md, \"Vite/esbuild class-field snapshot\").\n this.selectedStrategy = ImportStrategyDto.Upsert;\n }\n\n onImport(): void {\n this.dialogRef.close(new ImportStrategyDialogResult(this.selectedStrategy));\n }\n\n onCancel(): void {\n this.dialogRef.close(null);\n }\n}\n","<div class=\"import-strategy-content\">\n <p class=\"strategy-message\">{{ message }}</p>\n <div class=\"strategy-options\">\n <div class=\"strategy-option\">\n <label class=\"strategy-label\">\n <input type=\"radio\"\n name=\"importStrategy\"\n [value]=\"ImportStrategyDto.InsertOnly\"\n [(ngModel)]=\"selectedStrategy\"/>\n Insert Only\n </label>\n <p class=\"strategy-description\">Only insert new entities. Fails if entities already exist.</p>\n </div>\n <div class=\"strategy-option\">\n <label class=\"strategy-label\">\n <input type=\"radio\"\n name=\"importStrategy\"\n [value]=\"ImportStrategyDto.Upsert\"\n [(ngModel)]=\"selectedStrategy\"/>\n Upsert (Recommended)\n </label>\n <p class=\"strategy-description\">Update existing entities and insert new ones.</p>\n </div>\n </div>\n</div>\n<kendo-dialog-actions>\n <button kendoButton (click)=\"onCancel()\">Cancel</button>\n <button kendoButton (click)=\"onImport()\" themeColor=\"primary\">Import</button>\n</kendo-dialog-actions>\n","import {Injectable, inject} from '@angular/core';\nimport {DialogRef, DialogService} from '@progress/kendo-angular-dialog';\nimport {firstValueFrom} from 'rxjs';\nimport {ImportStrategyDialogComponent, ImportStrategyDialogResult} from './import-strategy-dialog.component';\nimport {ImportStrategyDto} from '../models/importStrategyDto';\n\n@Injectable()\nexport class ImportStrategyDialogService {\n private readonly dialogService = inject(DialogService);\n\n public async showImportStrategyDialog(title = 'Import', message = 'Select an import strategy:'): Promise<ImportStrategyDto | null> {\n const dialogRef: DialogRef = this.dialogService.open({\n title,\n content: ImportStrategyDialogComponent\n });\n\n const component = dialogRef.content.instance as ImportStrategyDialogComponent;\n component.message = message;\n\n const result = await firstValueFrom(dialogRef.result);\n if (result instanceof ImportStrategyDialogResult) {\n return result.strategy;\n }\n return null;\n }\n}\n","import {InjectionToken} from '@angular/core';\n\n/**\n * Texts of `mm-row-actions` (G16). `{name}` is replaced by the row label; the `…For` members are\n * used when the row has a label, the plain ones when it is empty.\n */\nexport interface RowActionsMessages {\n /** Accessible name of the action group: \"Actions for {name}\". */\n actionsFor: string;\n /** Group name without a row label. */\n actions: string;\n /** Accessible name and tooltip of the overflow button: \"More actions for {name}\". */\n moreActionsFor: string;\n /** Overflow button without a row label. */\n moreActions: string;\n}\n\nexport const DEFAULT_ROW_ACTIONS_MESSAGES: RowActionsMessages = {\n actionsFor: 'Actions for {name}',\n actions: 'Actions',\n moreActionsFor: 'More actions for {name}',\n moreActions: 'More actions',\n};\n\n/** App-wide translations of `mm-row-actions`. Partial: members left out keep their English default. */\nexport const MM_ROW_ACTIONS_MESSAGES = new InjectionToken<Partial<RowActionsMessages>>('MM_ROW_ACTIONS_MESSAGES');\n\n/**\n * Merges overrides over {@link DEFAULT_ROW_ACTIONS_MESSAGES}, later sources winning; members that\n * are missing, `undefined` or `null` keep the earlier value.\n */\nexport function resolveRowActionsMessages(\n ...overrides: (Partial<RowActionsMessages> | null | undefined)[]\n): RowActionsMessages {\n const resolved: RowActionsMessages = {...DEFAULT_ROW_ACTIONS_MESSAGES};\n for (const messages of overrides) {\n if (!messages) {\n continue;\n }\n for (const key of Object.keys(messages) as (keyof RowActionsMessages)[]) {\n const value = messages[key];\n if (value !== undefined && value !== null) {\n resolved[key] = value;\n }\n }\n }\n return resolved;\n}\n","import {ChangeDetectionStrategy, Component, ViewEncapsulation, computed, inject, input, numberAttribute, output} from '@angular/core';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {DropDownButtonModule} from '@progress/kendo-angular-buttons';\nimport {SVGIconModule} from '@progress/kendo-angular-icons';\nimport {moreVerticalIcon} from '@progress/kendo-svg-icons';\nimport {ActionButtonComponent} from './action-button.component';\nimport {\n MM_ROW_ACTIONS_MAX_INLINE,\n MmAction,\n MmActionEvent,\n isActionDisabled,\n splitRowActions,\n} from './action.model';\nimport {MM_ROW_ACTIONS_MESSAGES, RowActionsMessages, resolveRowActionsMessages} from './row-actions.messages';\n\n/** Overflow menu item handed to the Kendo DropDownButton. */\ninterface RowActionMenuItem<TId extends string> {\n text: string;\n svgIcon?: MmAction<TId>['icon'];\n disabled: boolean;\n action: MmAction<TId>;\n}\n\n/**\n * The actions of one table row (AB#5570): icon buttons (16 px) with tooltip and an accessible\n * name that includes the row (\"Edit Mesh Adapter\"), from one shared action definition.\n * At most `maxInline` slots (default 3): when the actions do not fit, the last slot becomes a\n * \"More actions for …\" menu. Disabled actions stay focusable and announce their reason;\n * in the menu the reason is shown under the item text.\n *\n * Texts (\"Actions for …\", \"More actions for …\") come from {@link MM_ROW_ACTIONS_MESSAGES} and the\n * `messages` input (the input wins), English by default.\n *\n * The component only emits — destructive handlers confirm first (danger dialog naming the target).\n *\n * ```html\n * <td class=\"actions\">\n * <mm-row-actions [actions]=\"rowActions(run)\" [rowLabel]=\"runLabel(run)\" (triggered)=\"onAction($event, run)\" />\n * </td>\n * ```\n */\n@Component({\n selector: 'mm-row-actions',\n standalone: true,\n imports: [DropDownButtonModule, SVGIconModule, ActionButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'mm-row-actions',\n '[attr.role]': 'hasActions() ? \"group\" : null',\n '[attr.aria-label]': 'hasActions() ? groupLabel() : null',\n },\n template: `\n @for (action of split().inline; track action.id) {\n <mm-action-button [action]=\"action\" [targetLabel]=\"rowLabel()\" context=\"row\" display=\"icon\"\n (triggered)=\"triggered.emit($event)\" />\n }\n @if (menuItems().length) {\n <kendo-dropdownbutton\n class=\"mm-row-actions__more\"\n [data]=\"menuItems()\"\n [svgIcon]=\"moreIcon\"\n size=\"small\"\n fillMode=\"flat\"\n themeColor=\"base\"\n [buttonAttributes]=\"{ title: moreLabel(), 'aria-label': moreLabel(), 'data-action': 'more' }\"\n (itemClick)=\"onMenuItem($event)\"\n >\n <ng-template kendoDropDownButtonItemTemplate let-item>\n <span class=\"mm-row-actions__item\" [class.mm-row-actions__item--danger]=\"!!item.action.danger\"\n [attr.data-action]=\"item.action.id\">\n @if (item.svgIcon) {\n <kendo-svgicon [icon]=\"item.svgIcon\" />\n }\n <span class=\"mm-row-actions__item-text\">\n <span>{{ item.text }}</span>\n @if (item.disabled) {\n <span class=\"mm-row-actions__item-reason\">{{ item.action.disabledReason }}</span>\n }\n </span>\n </span>\n </ng-template>\n </kendo-dropdownbutton>\n }\n `,\n styles: [`\n .mm-row-actions { display: inline-flex; align-items: center; gap: var(--theme-space-1, 4px); }\n .mm-row-actions__item { display: inline-flex; align-items: flex-start; gap: var(--theme-space-2, 8px); }\n .mm-row-actions__item-text { display: inline-flex; flex-direction: column; }\n .mm-row-actions__item-reason { font-size: 0.85em; color: var(--theme-text-muted, #75829a); white-space: normal; max-width: 280px; }\n .mm-row-actions__item--danger { color: var(--theme-status-error, #c0385f); }\n .mm-row-actions__more .k-button:focus-visible {\n outline: none;\n box-shadow: var(--theme-focus-ring, 0 0 0 2px #ffffff, 0 0 0 4px #2e8473);\n }\n `],\n})\nexport class RowActionsComponent<TId extends string = string> {\n /** Action definitions for this row (hidden ones are filtered out). */\n readonly actions = input.required<readonly MmAction<TId>[]>();\n /** Human name of the row (\"Mesh Adapter\", \"Encrypt run 2026-10-06 17:09\"); part of every accessible name. */\n readonly rowLabel = input.required<string>();\n /** Slots incl. the overflow button. */\n readonly maxInline = input(MM_ROW_ACTIONS_MAX_INLINE, {transform: numberAttribute});\n /** Translations for this instance; members left out come from `MM_ROW_ACTIONS_MESSAGES`, else English. */\n readonly messages = input<Partial<RowActionsMessages> | null>(null);\n\n /** Fires for enabled actions only, inline or from the menu. */\n readonly triggered = output<MmActionEvent<TId>>();\n\n private readonly router = inject(Router, {optional: true});\n /** Menu links resolve like the inline `routerLink`: relative to the hosting route. */\n private readonly route = inject(ActivatedRoute, {optional: true});\n private readonly injectedMessages = inject(MM_ROW_ACTIONS_MESSAGES, {optional: true});\n protected readonly moreIcon = moreVerticalIcon;\n private readonly m = computed(() => resolveRowActionsMessages(this.injectedMessages, this.messages()));\n protected readonly split = computed(() => splitRowActions(this.actions(), this.maxInline()));\n protected readonly menuItems = computed<RowActionMenuItem<TId>[]>(() =>\n this.split().menu.map((action) => ({\n text: action.menuLabel || action.label,\n svgIcon: action.icon,\n disabled: isActionDisabled(action),\n action,\n })));\n /** No group semantics for an empty cell (all actions hidden). */\n protected readonly hasActions = computed(() => this.split().inline.length > 0 || this.split().menu.length > 0);\n protected readonly moreLabel = computed(() => this.format(this.m().moreActionsFor, this.m().moreActions));\n protected readonly groupLabel = computed(() => this.format(this.m().actionsFor, this.m().actions));\n\n private format(withName: string, withoutName: string): string {\n const name = (this.rowLabel() ?? '').trim();\n return name ? withName.split('{name}').join(name) : withoutName;\n }\n\n protected onMenuItem(item: RowActionMenuItem<TId>): void {\n if (!item || item.disabled) {\n return;\n }\n const link = item.action.link;\n if (link && this.router) {\n const commands = typeof link.commands === 'string' ? [link.commands] : [...link.commands];\n void this.router.navigate(commands, {queryParams: link.queryParams, relativeTo: this.route ?? undefined});\n }\n this.triggered.emit({id: item.action.id, action: item.action});\n }\n}\n","import { InjectionToken, Provider, Signal, inject, signal } from '@angular/core';\n\n/**\n * Host-agnostic translation hook of the `@meshmakers/*` libraries (Studio i18n concept §2.1,\n * AB#6163). The libraries never depend on a translation framework: they ship English defaults and\n * ask the host app through these tokens. An app that provides nothing keeps the English defaults —\n * there is no behaviour change for apps that do not opt in.\n *\n * - {@link MM_TRANSLATE}: `(key, params?) => string | undefined`. The host answers from its\n * translation store (e.g. `translate.instant` of ngx-translate) and returns `undefined` for a key\n * it does not know, so the library default applies.\n * - {@link MM_LANGUAGE}: the active UI language as a signal (`'en'`, `'de'`, …). Reading it inside a\n * template, `computed()` or the {@link MmTranslatePipe} makes texts follow a language switch\n * without a reload.\n * - {@link MM_TRANSLATE_DEFAULTS}: the English defaults of a library (its `i18n/en.json`, bundled as\n * a TS constant), provided with {@link provideMmTranslateDefaults}.\n *\n * Keys follow the concept's D4 style: `MM.<LIB>.<AREA>.<camelCaseLeaf>`, e.g.\n * `MM.SHARED_UI.LIST_VIEW.refresh`. Parameters use the ngx-translate syntax `{{ name }}`.\n */\n\n/** Interpolation parameters of a translation, e.g. `{ count: 3 }` for `'{{ count }} items'`. */\nexport type MmTranslateParams = Readonly<Record<string, unknown>>;\n\n/** The host's lookup: the translated text, or `undefined` when the host has no translation. */\nexport type MmTranslateFn = (key: string, params?: MmTranslateParams) => string | undefined;\n\n/** A translation table: flat (`{ 'A.b': 'x' }`) or nested (`{ A: { b: 'x' } }`), or both. */\nexport interface MmTranslationTable {\n readonly [key: string]: string | MmTranslationTable;\n}\n\n/** Host lookup for library texts. Optional — without it the English defaults are used. */\nexport const MM_TRANSLATE = new InjectionToken<MmTranslateFn>('MM_TRANSLATE');\n\n/** The active UI language. Optional — without it the language is `'en'`. */\nexport const MM_LANGUAGE = new InjectionToken<Signal<string>>('MM_LANGUAGE');\n\n/** English default tables of the libraries (multi provider, see {@link provideMmTranslateDefaults}). */\nexport const MM_TRANSLATE_DEFAULTS = new InjectionToken<readonly MmTranslationTable[]>('MM_TRANSLATE_DEFAULTS');\n\nconst ENGLISH = signal('en').asReadonly();\n\n/**\n * Registers a library's English defaults. Use it in the library's `provideX()` (environment\n * providers) or in a component's `providers` (element injector).\n */\nexport function provideMmTranslateDefaults(table: MmTranslationTable): Provider {\n return { provide: MM_TRANSLATE_DEFAULTS, useValue: table, multi: true };\n}\n\n/** The value at `key` in a table: the flat entry first, then the dotted path into nested objects. */\nexport function lookupMmTable(table: MmTranslationTable | null | undefined, key: string): string | undefined {\n if (!table) {\n return undefined;\n }\n const flat = table[key];\n if (typeof flat === 'string') {\n return flat;\n }\n let node: string | MmTranslationTable | undefined = table;\n for (const part of key.split('.')) {\n if (!node || typeof node === 'string') {\n return undefined;\n }\n node = node[part];\n }\n return typeof node === 'string' ? node : undefined;\n}\n\n/** Replaces `{{ name }}` placeholders (ngx-translate syntax) with `params`; unknown names stay. */\nexport function interpolateMm(text: string, params?: MmTranslateParams | null): string {\n if (!params) {\n return text;\n }\n return text.replace(/\\{\\{\\s*([\\w.-]+)\\s*\\}\\}/g, (match, name: string) => {\n const value = params[name];\n return value === undefined || value === null ? match : String(value);\n });\n}\n\n/** Translates a key in the current language. */\nexport type MmTranslate = (key: string, params?: MmTranslateParams | null, fallback?: string) => string;\n\n/**\n * Resolution order of a library text:\n * 1. the host ({@link MM_TRANSLATE}), unless it returns `undefined`, an empty string or the key;\n * 2. the library defaults (`defaults` argument, then every {@link MM_TRANSLATE_DEFAULTS} table);\n * 3. the explicit `fallback`;\n * 4. the key itself (a visible gap, never an exception).\n * A host lookup that throws counts as \"no translation\" (fail-safe, concept §6).\n */\nexport function resolveMmTranslation(\n host: MmTranslateFn | null,\n defaults: readonly MmTranslationTable[],\n key: string,\n params?: MmTranslateParams | null,\n fallback?: string\n): string {\n if (host) {\n try {\n const value = host(key, params ?? undefined);\n if (value && value !== key) {\n return value;\n }\n } catch {\n // Fail-safe: a broken host lookup must not break the library UI.\n }\n }\n for (const table of defaults) {\n const value = lookupMmTable(table, key);\n if (value !== undefined) {\n return interpolateMm(value, params);\n }\n }\n return fallback !== undefined ? interpolateMm(fallback, params) : key;\n}\n\n/** The active language signal: {@link MM_LANGUAGE}, or a constant `'en'`. Injection context only. */\nexport function injectMmLanguage(): Signal<string> {\n return inject(MM_LANGUAGE, { optional: true }) ?? ENGLISH;\n}\n\n/**\n * A translate function for TS code (injection context only). It reads {@link MM_LANGUAGE}, so a\n * `computed(() => t('MM.X.y'))` re-runs on a language switch.\n *\n * @param defaults the library's English defaults (its bundled `en.json`), checked before the\n * {@link MM_TRANSLATE_DEFAULTS} tables.\n */\nexport function injectMmT(defaults?: MmTranslationTable): MmTranslate {\n const host = inject(MM_TRANSLATE, { optional: true });\n const language = injectMmLanguage();\n const tables = [...(defaults ? [defaults] : []), ...(inject(MM_TRANSLATE_DEFAULTS, { optional: true }) ?? [])];\n return (key, params, fallback) => {\n language();\n return resolveMmTranslation(host, tables, key, params, fallback);\n };\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport {\n MM_TRANSLATE,\n MM_TRANSLATE_DEFAULTS,\n MmTranslateParams,\n injectMmLanguage,\n resolveMmTranslation,\n} from './mm-translate';\n\n/**\n * `{{ 'MM.SHARED_UI.LIST_VIEW.refresh' | mmT }}` — a library text in the host's language\n * (see `mm-translate.ts`). Optional arguments: interpolation params and an English fallback:\n * `{{ 'MM.X.count' | mmT: { count: n } : '{{ count }} items' }}`.\n *\n * Impure on purpose, but cached: the pipe reads the {@link MM_LANGUAGE} signal, so the template\n * (also an OnPush one) re-renders on a language switch, and it recomputes only when the language,\n * key, params or fallback change. Without host providers it returns the English default.\n */\n@Pipe({ name: 'mmT', pure: false })\nexport class MmTranslatePipe implements PipeTransform {\n private readonly host = inject(MM_TRANSLATE, { optional: true });\n private readonly defaults = inject(MM_TRANSLATE_DEFAULTS, { optional: true }) ?? [];\n private readonly language = injectMmLanguage();\n\n private lastLanguage: string | null = null;\n private lastKey: string | null = null;\n private lastParams: MmTranslateParams | null | undefined = undefined;\n private lastParamsJson = '';\n private lastFallback: string | undefined = undefined;\n private lastValue = '';\n\n transform(key: string | null | undefined, params?: MmTranslateParams | null, fallback?: string): string {\n if (!key) {\n return '';\n }\n const language = this.language();\n const paramsJson = params === this.lastParams ? this.lastParamsJson : safeJson(params);\n if (language === this.lastLanguage && key === this.lastKey && paramsJson === this.lastParamsJson\n && fallback === this.lastFallback) {\n this.lastParams = params;\n return this.lastValue;\n }\n this.lastLanguage = language;\n this.lastKey = key;\n this.lastParams = params;\n this.lastParamsJson = paramsJson;\n this.lastFallback = fallback;\n this.lastValue = resolveMmTranslation(this.host, this.defaults, key, params, fallback);\n return this.lastValue;\n }\n}\n\nlet unserializable = 0;\n\n/** Params as a comparable string; params that cannot be serialised never hit the cache. */\nfunction safeJson(value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n try {\n return JSON.stringify(value);\n } catch {\n return `\\u0000${++unserializable}`;\n }\n}\n","/**\n * Bridges between a host's translation store and the libraries' `*_MESSAGES` objects\n * (`SHELL_MESSAGES`, `COMMAND_PALETTE_MESSAGES`, `ASSISTANT_MESSAGES`, `MM_ROW_ACTIONS_MESSAGES`,\n * `ListViewMessages`, …). Moved here from the meshmakers-app (`shell-messages.i18n.ts`) so every\n * app wires the tokens the same way (Studio i18n concept §6, AB#6163).\n *\n * A key map assigns a translation key to each message member:\n * ```ts\n * const KEYS = { search: 'SHELL.MESSAGES.SEARCH', signOut: 'SHELL.MESSAGES.SIGN_OUT' } as const\n * satisfies Partial<Record<keyof ShellMessages, string>>;\n * { provide: SHELL_MESSAGES, useFactory: () => {\n * const translate = inject(TranslateService);\n * return liveMessages(KEYS, (k) => translate.instant(k) as string);\n * } }\n * ```\n * A member whose lookup returns nothing, an empty string or the key itself (ngx-translate's answer\n * for a missing key) stays `undefined`, so the library's English default applies instead of a raw\n * key.\n */\n\n/** A lookup into the host's translation store. */\nexport type MessageLookup = (key: string) => string | null | undefined;\n\nfunction translated(t: MessageLookup, key: string): string | undefined {\n let value: string | null | undefined;\n try {\n value = t(key);\n } catch {\n return undefined;\n }\n return value && value !== key ? value : undefined;\n}\n\n/**\n * A snapshot of the messages in the active language. Re-run it on every language change and feed\n * the result to a component's `messages` input or a signal-backed messages factory.\n */\nexport function messagesFromTranslate<K extends string>(\n keys: Readonly<Record<K, string>>,\n t: MessageLookup\n): Partial<Record<K, string>> {\n const messages: Partial<Record<K, string>> = {};\n for (const [member, key] of Object.entries(keys) as [K, string][]) {\n const value = translated(t, key);\n if (value !== undefined) {\n messages[member] = value;\n }\n }\n return messages;\n}\n\n/**\n * A messages object whose members are getters over the CURRENT translation — for app-wide tokens\n * that are injected once: a service that reads a member while deriving a text picks up a language\n * switch on its next read, without re-providing the token. Members without a translation are\n * `undefined` (the library keeps its English default).\n */\nexport function liveMessages<K extends string>(\n keys: Readonly<Record<K, string>>,\n t: MessageLookup\n): Partial<Record<K, string>> {\n const messages = {} as Partial<Record<K, string>>;\n for (const [member, key] of Object.entries(keys) as [K, string][]) {\n Object.defineProperty(messages, member, {\n enumerable: true,\n get: (): string | undefined => translated(t, key),\n });\n }\n return messages;\n}\n","/*\n * Public API Surface of shared-ui\n */\n\nimport {EnvironmentProviders, makeEnvironmentProviders} from '@angular/core';\nimport {FileUploadService} from './lib/services/file-upload.service';\nimport {ConfirmationService} from './lib/services/confirmation.service';\nimport {InputService} from './lib/services/input.service';\nimport {ProgressWindowService} from './lib/progress-window/progress-window.service';\nimport {NotificationDisplayService} from './lib/services/notification-display.service';\nimport {MessageDetailsDialogService} from './lib/message-details-dialog/message-details-dialog.service';\nimport {MessageListenerService} from './lib/services/message-listener.service';\nimport { provideMmSharedServices } from '@meshmakers/shared-services';\n\nexport * from './lib/list-view/list-view.component';\nexport * from './lib/list-view/list-view-filters.directive';\nexport * from './lib/upload-file-dialog/upload-file-dialog.component';\nexport * from './lib/input-dialog/input-dialog.component';\nexport * from './lib/input-dialog/input-dialog.messages';\nexport * from './lib/tree/tree.component';\nexport * from './lib/base-form/base-form.component';\nexport * from './lib/base-tree-detail/base-tree-detail.component';\nexport * from './lib/progress-window/progress-window.component';\nexport * from './lib/progress-window/progress-window.service';\nexport * from './lib/progress-window/progress-window.messages';\nexport * from './lib/confirmation-window/confirmation-window.component';\nexport * from './lib/confirmation-window/confirmation-window.messages';\nexport * from './lib/data-sources/data-source-typed';\nexport * from './lib/data-sources/data-source-base';\nexport * from './lib/data-sources/hierarchy-data-source';\nexport * from './lib/data-sources/hierarchy-data-source-base';\nexport * from './lib/directives/mm-list-view-data-binding.directive';\nexport * from './lib/pipes/pascal-case.pipe';\nexport * from './lib/pipes/bytes-to-size.pipe';\nexport * from './lib/models/fetchResult';\nexport * from './lib/models/progressValue';\nexport * from './lib/models/node-dropped-event';\nexport * from './lib/models/importStrategyDto';\nexport * from './lib/models/confirmation';\nexport * from './lib/services/file-upload.service';\nexport * from './lib/services/confirmation.service';\nexport * from './lib/services/input.service';\nexport * from './lib/services/notification-display.service';\nexport * from './lib/services/notification-display.messages';\nexport * from './lib/services/message-listener.service';\nexport * from './lib/services/list-state.service';\nexport * from './lib/message-details-dialog/message-details-dialog.component';\nexport * from './lib/message-details-dialog/message-details-dialog.service';\nexport * from './lib/message-details-dialog/message-details-dialog.messages';\nexport * from './lib/entity-select-input/entity-select-input.component';\nexport * from './lib/entity-select-dialog/entity-select-dialog.component';\nexport * from './lib/entity-select-dialog/entity-select-dialog.service';\nexport * from './lib/entity-select-dialog/entity-select-dialog-data-source';\nexport * from './lib/list-view/list-view.model';\nexport * from './lib/list-view/list-view-row-actions';\nexport * from './lib/danger-confirmation/danger-confirmation.model';\nexport * from './lib/danger-confirmation/danger-confirmation-window.component';\nexport * from './lib/dialog-actions/dialog-actions.directive';\nexport * from './lib/guards/unsaved-changes.interface';\nexport * from './lib/guards/unsaved-changes.guard';\nexport * from './lib/guards/unsaved-changes.directive';\nexport * from './lib/save-as-dialog';\nexport * from './lib/time-range-picker';\nexport * from './lib/cron-builder';\nexport * from './lib/copyable-text/copyable-text.component';\nexport * from './lib/import-strategy-dialog/import-strategy-dialog.component';\nexport * from './lib/import-strategy-dialog/import-strategy-dialog.service';\nexport * from './lib/services/window-state.service';\nexport * from './lib/actions';\nexport * from './lib/octobot/octobot.component';\nexport * from './lib/empty-state/empty-state.component';\nexport * from './lib/i18n';\n\nimport { EntitySelectDialogService } from './lib/entity-select-dialog/entity-select-dialog.service';\nimport { SaveAsDialogService } from './lib/save-as-dialog';\nimport { ImportStrategyDialogService } from './lib/import-strategy-dialog/import-strategy-dialog.service';\n\nexport function provideMmSharedUi(): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideMmSharedServices(),\n FileUploadService,\n ConfirmationService,\n InputService,\n ProgressWindowService,\n NotificationDisplayService,\n MessageListenerService,\n MessageDetailsDialogService,\n EntitySelectDialogService,\n SaveAsDialogService,\n ImportStrategyDialogService,\n ]);\n}\n\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i1.UnsavedChangesDirective","i4","i5","i6"],"mappings":"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"}
|