{"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.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/confirmation-window/confirmation-window.component.html","../../../../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.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.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.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.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/services/message-listener.service.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/directives/mm-list-view-data-binding.directive.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/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.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/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","export 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}\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 } 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  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    console.debug(\"type: \" + file.type);\n    console.debug(\"name: \" + file.name);\n    const extension = file.name.substring(file.name.lastIndexOf('.')).toLowerCase();\n    console.debug(\"extension: \" + extension);\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 readonly upload = upload;\n  protected readonly deleteIcon = 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","import { Component, Input, OnInit, inject } 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';\n\n@Component({\n  selector: 'mm-confirmation-window',\n  imports: [\n    DialogActionsComponent,\n    NgIf,\n    ButtonComponent\n  ],\n  templateUrl: './confirmation-window.component.html',\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 = 'OK';\n    this.button1Result = ButtonTypes.Ok;\n  }\n\n  ngOnInit(): void {\n\n    if (this.data){\n      const labels = this.data.buttonLabels;\n      if (this.data.dialogType === DialogType.OkCancel) {\n        this.button1Text = labels?.ok ?? 'OK';\n        this.button1Result = ButtonTypes.Ok;\n        this.button2Text = labels?.cancel ?? 'Cancel';\n        this.button2Result = ButtonTypes.Cancel;\n      } else if (this.data.dialogType === DialogType.YesNoCancel) {\n        this.button1Text = labels?.yes ?? 'Yes';\n        this.button1Result = ButtonTypes.Yes;\n        this.button2Text = labels?.no ?? 'No';\n        this.button2Result = ButtonTypes.No;\n        this.button3Text = labels?.cancel ?? 'Cancel';\n        this.button3Result = ButtonTypes.Cancel;\n      } else if (this.data.dialogType === DialogType.Ok) {\n        this.button1Text = labels?.ok ?? 'OK';\n        this.button1Result = ButtonTypes.Ok;\n      } else {\n        this.button1Text = labels?.yes ?? 'Yes';\n        this.button1Result = ButtonTypes.Yes;\n        this.button2Text = labels?.no ?? 'No';\n        this.button2Result = ButtonTypes.No;\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<kendo-dialog-actions>\n  <button kendoButton (click)=\"onButton1()\" themeColor=\"primary\">{{button1Text}}</button>\n  <button kendoButton (click)=\"onButton2()\" *ngIf=\"button2Text\">{{button2Text}}</button>\n  <button kendoButton (click)=\"onButton3()\" *ngIf=\"button3Text\">{{button3Text}}</button>\n</kendo-dialog-actions>\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';\n\n@Injectable()\nexport class ConfirmationService {\n  private readonly dialogService = inject(DialogService);\n\n  public async showYesNoConfirmationDialog(title: string, message: string, cssClass?: string, buttonLabels?: ConfirmationButtonLabels): Promise<boolean> {\n\n    const dialogRef = this.openDialog(title, message, DialogType.YesNo, cssClass, buttonLabels);\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): Promise<ConfirmationWindowResult | undefined> {\n\n    const dialogRef = this.openDialog(title, message, DialogType.YesNoCancel, undefined, buttonLabels);\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): Promise<boolean> {\n\n    const dialogRef = this.openDialog(title, message, DialogType.OkCancel);\n\n    const component = dialogRef.content.instance as ConfirmationWindowComponent;\n    component.data = {\n      title,\n      message,\n      dialogType: DialogType.OkCancel\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  public async showOkDialog(title: string, message: string): Promise<boolean> {\n    const dialogRef = this.openDialog(title, message, DialogType.Ok);\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) {\n    const dialogRef: DialogRef = this.dialogService.open({\n      title,\n      content: ConfirmationWindowComponent,\n      cssClass\n    });\n\n    const component = dialogRef.content.instance as ConfirmationWindowComponent;\n    component.data = {\n      title,\n      message,\n      dialogType,\n      buttonLabels,\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","import { Component, Input, inject } 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';\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  styleUrl: './input-dialog.component.scss'\n})\nexport class InputDialogComponent extends DialogContentBase {\n  private readonly dialogRef: DialogRef;\n\n  @Input() public buttonOkText = \"OK\";\n  @Input() public message = \"\";\n  @Input() public placeholder = \"Enter value\";\n\n  @Input() protected inputValue: string | null = \"\";\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()\">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';\n\n@Injectable()\nexport class InputService {\n  private readonly dialogService = inject(DialogService);\n\n  public async showInputDialog(title: string, message: string, placeholder: string, buttonOkText: string | null = null): 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\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","import { Component, inject, OnDestroy, AfterViewInit, Input } 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';\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  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  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}","<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      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';\n\n@Injectable()\nexport class ProgressWindowService {\n  private readonly dialogService = inject(DialogService);\n\n  /**\n   * Opens a progress window dialog\n   * @param config Configuration for the progress window\n   * @returns DialogRef for the progress window\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 // Always prevent closing via X button or ESC\n    });\n\n    // Set component input properties\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\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}\n\nexport interface ProgressWindowOptions {\n  isCancelOperationAvailable?: boolean;\n  cancelOperation?: () => void;\n  width?: number;\n  height?: number | string;\n  allowClose?: boolean;\n}\n","import { Component, inject, OnInit } 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';\n\nexport interface MessageDetailsDialogData {\n  title: string;\n  details: string;\n  level: 'error' | 'warning';\n  copyLabel?: string;\n  closeLabel?: string;\n}\n\n@Component({\n  selector: 'mm-message-details-dialog',\n  standalone: true,\n  imports: [\n    ButtonModule,\n  ],\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  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 = 'Copy to Clipboard';\n  public closeLabel = 'Close';\n\n  ngOnInit(): void {\n    if (this.data) {\n      this.details = this.data.details;\n      if (this.data.copyLabel) this.copyLabel = this.data.copyLabel;\n      if (this.data.closeLabel) this.closeLabel = this.data.closeLabel;\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(dialogKey: string, defaults: WindowDimensions): WindowDimensions {\n    return this.getDimensions(dialogKey) ?? defaults;\n  }\n\n  captureAndSave(dialogKey: string, windowElement: HTMLElement): void {\n    const rect = windowElement.getBoundingClientRect();\n    if (rect.width > 0 && rect.height > 0) {\n      this.saveDimensions(dialogKey, {\n        width: Math.round(rect.width),\n        height: Math.round(rect.height)\n      });\n    }\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  applyModalBehavior(dialogKey: string, windowRef: WindowRef): void {\n    const windowEl = windowRef.window.location.nativeElement;\n    this.showBackdrop();\n\n    windowRef.result.subscribe({\n      next: () => {\n        this.captureAndSave(dialogKey, windowEl);\n        this.hideBackdrop();\n      },\n      error: () => {\n        this.captureAndSave(dialogKey, windowEl);\n        this.hideBackdrop();\n      }\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      el.style.cssText = 'position:fixed;inset:0;background: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';\n\n@Injectable()\nexport class MessageDetailsDialogService {\n  private readonly windowService = inject(WindowService);\n  private readonly windowStateService = inject(WindowStateService);\n\n  /**\n   * Opens a resizable window to show message details with copy-to-clipboard functionality\n   */\n  showDetailsDialog(data: MessageDetailsDialogData): WindowRef {\n    const size = this.windowStateService.resolveWindowSize('message-details', { width: 900, height: 600 });\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    });\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 = data;\n    }\n\n    return windowRef;\n  }\n}\n","import {Injectable, inject, 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';\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 notificationCounter = 0;\n  private activeNotifications = new Map<string, NotificationRef>();\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  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    });\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  }\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    console.log('showSuccess called with:', { title, hideAfter });\n\n    const autoHideTime = hideAfter ?? 3000;\n\n    const settings: NotificationSettings = {\n      content: title,\n      type: {\n        style: 'success',\n        icon: true\n      },\n      animation: { type: 'slide', duration: 400 },\n      hideAfter: 0, // Disable Kendo's auto-hide, we'll handle it manually\n      closable: true,\n      position: { horizontal: 'center', vertical: 'top' }\n    };\n\n    console.log('Success notification settings:', settings);\n\n    const notificationRef = this.notificationService.show(settings);\n    console.log('Notification ref created:', notificationRef);\n\n    if (notificationRef) {\n      console.log(`Success notification will auto-hide after ${autoHideTime}ms (manual)`);\n\n      // Manually hide the notification after the specified time\n      setTimeout(() => {\n        console.log('Manually hiding success notification');\n        notificationRef.hide();\n      }, autoHideTime);\n    }\n  }\n\n  /**\n   * Shows an error notification (persists until user interaction or navigation)\n   */\n  showError(title: string, details?: string, hideAfter?: number): void {\n    // Generate unique ID for this notification\n    const notificationId = `error-${++this.notificationCounter}-${Date.now()}`;\n\n    // Start with plain text content\n    const settings: NotificationSettings = {\n      ...this.defaultSettings,\n      content: title,\n      type: {\n        style: 'error',\n        icon: true\n      },\n      hideAfter: hideAfter ?? 0, // 0 means no auto-hide for errors\n      closable: true,\n      cssClass: `notification-${notificationId}` // Add unique class for targeting\n    };\n\n    const notificationRef = this.notificationService.show(settings);\n\n    if (notificationRef) {\n      this.activeNotifications.set(notificationId, notificationRef);\n      this.notificationOpenTimes.set(notificationId, Date.now());\n    }\n\n    if (details && notificationRef) {\n      // After notification is shown, find it by the unique class and modify its content\n      setTimeout(() => {\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            detailsBtn.title = 'Show Details';\n            detailsBtn.onclick = (event) => {\n              event.stopPropagation();\n              this.messageDetailsDialogService.showDetailsDialog({\n                title,\n                details,\n                level: 'error'\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      }, 50);\n    }\n  }\n\n\n\n  /**\n   * Shows a warning notification (persists until user interaction or navigation)\n   */\n  showWarning(title: string, details?: string, hideAfter?: number): void {\n    // Generate unique ID for this notification\n    const notificationId = `warning-${++this.notificationCounter}-${Date.now()}`;\n\n    // Start with plain text content\n    const settings: NotificationSettings = {\n      ...this.defaultSettings,\n      content: title,\n      type: {\n        style: 'warning',\n        icon: true\n      },\n      hideAfter: hideAfter ?? 0, // 0 means no auto-hide for warnings\n      closable: true,\n      cssClass: `notification-${notificationId}` // Add unique class for targeting\n    };\n\n    const notificationRef = this.notificationService.show(settings);\n\n    if (notificationRef) {\n      this.activeNotifications.set(notificationId, notificationRef);\n      this.notificationOpenTimes.set(notificationId, Date.now());\n    }\n\n    if (details && notificationRef) {\n      // After notification is shown, find it by the unique class and modify its content\n      setTimeout(() => {\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            detailsBtn.title = 'Show Details';\n            detailsBtn.onclick = (event) => {\n              event.stopPropagation();\n              this.messageDetailsDialogService.showDetailsDialog({\n                title,\n                details,\n                level: 'warning'\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      }, 50);\n    }\n  }\n\n  /**\n   * Shows an info notification (auto-closes after 3 seconds)\n   */\n  showInfo(title: string, hideAfter?: number): void {\n    console.log('showInfo called with:', { title, hideAfter });\n\n    const autoHideTime = hideAfter ?? 3000;\n\n    const settings: NotificationSettings = {\n      content: title,\n      type: {\n        style: 'info',\n        icon: true\n      },\n      animation: { type: 'slide', duration: 400 },\n      hideAfter: 0, // Disable Kendo's auto-hide, we'll handle it manually\n      closable: true,\n      position: { horizontal: 'center', vertical: 'top' }\n    };\n\n    console.log('Info notification settings:', settings);\n\n    const notificationRef = this.notificationService.show(settings);\n    console.log('Notification ref created:', notificationRef);\n\n    if (notificationRef) {\n      console.log(`Info notification will auto-hide after ${autoHideTime}ms (manual)`);\n\n      // Manually hide the notification after the specified time\n      setTimeout(() => {\n        console.log('Manually hiding info notification');\n        notificationRef.hide();\n      }, autoHideTime);\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 {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\nexport interface TableColumn {\n  displayName?: string | null;\n  field: string;\n  dataType?: 'text' | 'numeric' | 'numericRange' | 'boolean' | 'date' | 'iso8601' | 'bytes' | 'statusIcons' | 'cronExpression' | 'progressBar';\n  format?: string;\n  /**\n   * Column width in pixels. If not set, the column will auto-size.\n   */\n  width?: number;\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\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 */\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  /** Title for the actions command column. Default: \"Actions\" */\n  actionsColumnTitle: 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}\n\n/**\n * Default English messages for the ListViewComponent.\n */\nexport const DEFAULT_LIST_VIEW_MESSAGES: 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  actionsColumnTitle: 'Actions',\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};\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} 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 abstract class DataSourceBase {\n\n  public readonly fetchAgainEvent = new EventEmitter<void>()\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  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(): void {\n    this.fetchAgainEvent.emit();\n  }\n\n  public abstract fetchData(queryOptions: FetchDataOptions): Observable<FetchResult | null>;\n}\n","import { ChangeDetectorRef, Directive, OnDestroy, OnInit, inject } from \"@angular/core\";\nimport {DataBindingDirective, GridComponent} from \"@progress/kendo-angular-grid\";\nimport {CompositeFilterDescriptor} from \"@progress/kendo-data-query\";\nimport {Observable, of, Subscription} from \"rxjs\";\nimport {DataSourceBase} from \"../data-sources/data-source-base\";\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\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  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(() => {\n      this._forceRefresh = true;\n      this.rebind();\n    });\n\n    this._executeFilterSubscription = this.dataSource.listViewComponent.onExecuteFilter.subscribe((value: string | null) => {\n      this._textSearchValue = value;\n      this.rebind();\n    });\n\n    this._refreshDataSubscription = this.dataSource.listViewComponent.onRefreshData.subscribe(() => {\n      this._forceRefresh = true;\n      this.rebind();\n    });\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   */\n  public notifyFilterChange(filter: CompositeFilterDescriptor): void {\n    this.state.filter = filter;\n    this.rebind();\n  }\n\n  public override rebind(): void {\n    try {\n      if (!this.dataSource) {\n        return;\n      }\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.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        }\n      });\n    } catch (e) {\n      console.error('[MmListViewDataBinding] rebind() caught error:', e);\n      this.dataSource.setLoading(false);\n    }\n  }\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';\nimport 'cronstrue/locales/en';\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 { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, 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  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 {ColumnDefinition, ContextMenuType, DEFAULT_LIST_VIEW_MESSAGES, ListViewMessages, RowClassFn, StatusFieldConfig, StatusIconMapping, TableColumn} from './list-view.model';\nimport {DatePipe, DecimalPipe} from '@angular/common';\nimport {PascalCasePipe} from '../pipes/pascal-case.pipe';\nimport {SeparatorComponent, CheckBoxComponent, NumericTextBoxComponent} from '@progress/kendo-angular-inputs';\nimport {fileExcelIcon, filePdfIcon, filterIcon, moreVerticalIcon, arrowRotateCwIcon} 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} 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 {Router} from '@angular/router';\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';\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    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  ],\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\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  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  @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 = 10;\n  @Input() public skip = 0;\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  @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   * 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: ListViewMessages = {...DEFAULT_LIST_VIEW_MESSAGES};\n\n  @Input() public set messages(value: Partial<ListViewMessages>) {\n    this._messages = {...DEFAULT_LIST_VIEW_MESSAGES, ...value};\n  }\n\n  public get messages(): 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\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      });\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\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  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  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 'numericRange':\n      case 'progressBar':\n        return 'numeric';\n      case 'iso8601':\n        return 'date';\n      default:\n        return 'text';\n    }\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   * 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   * 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  public onExecuteFilter = new EventEmitter<string | null>();\n  public onRefreshData = 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  protected readonly filterIcon = filterIcon;\n  protected readonly pdfSVG: SVGIcon = filePdfIcon;\n  protected readonly excelSVG: SVGIcon = fileExcelIcon;\n  protected readonly refreshIcon = arrowRotateCwIcon;\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 commandItem = _event.item?.data?.data as CommandItem;\n    if (!commandItem) {\n      return;\n    }\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: originalEvent.pageX,\n        top: originalEvent.pageY,\n      });\n    }\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  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    this._contextMenuItems = this.buildContextMenuItemsWithDisabledState(this._contextMenuCommandItems, dataItem);\n    this.gridContextMenu?.show({\n      left: 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        });\n      }\n    }\n    return items;\n  }\n\n  protected onContextMenuClosed(_event: ContextMenuPopupEvent) {\n    this._contextMenuSelectedRow = null;\n    this._actionMenuSelectedRow = null;\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        });\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\n}\n","<kendo-grid\n  mmListViewDataBinding\n  [loading]=\"isLoading()\"\n  [pageSize]=\"pageSize\" [selectable]=\"selectable\" (pageChange)=\"onPageChange($event)\"\n  [skip]=\"skip\" (selectionChange)=\"onRowSelect($event)\" (cellClick)=\"onCellClick($event)\"\n  [pageable]=\"pageable\"\n  [sortable]=\"sortable\"\n  [filterable]=\"_showRowFilter\"\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  <ng-template kendoGridToolbarTemplate>\n\n    @for (commandItem of leftToolbarActions; track commandItem.id) {\n      @if (commandItem) {\n        @switch (commandItem.type) {\n          @case ('link') {\n            @if (commandItem.children && commandItem.children.length > 0) {\n              <kendo-dropdownbutton\n                [data]=\"commandItem.children\"\n                [svgIcon]=\"$any(commandItem.svgIcon)\"\n                [disabled]=\"getIsDisabled(commandItem) || isLoading()\"\n                [textField]=\"'text'\"\n                themeColor=\"primary\"\n                (itemClick)=\"onToolbarDropdownItemClick($event)\">\n                {{ commandItem.text }}\n              </kendo-dropdownbutton>\n            } @else if (commandItem.svgIcon) {\n              <button kendoTooltip kendoButton themeColor=\"primary\" [svgIcon]=\"commandItem.svgIcon\" [title]=\"commandItem.text\"\n                      [disabled]=\"getIsDisabled(commandItem) || isLoading()\"\n                      (click)=\"onToolbarCommand(commandItem)\">{{ commandItem.text }}\n              </button>\n            } @else {\n              <button kendoTooltip kendoButton themeColor=\"primary\" [title]=\"commandItem.text\"\n                      [disabled]=\"getIsDisabled(commandItem) || isLoading()\"\n                      (click)=\"onToolbarCommand(commandItem)\">{{ commandItem.text }}\n              </button>\n            }\n          }\n          @case ('separator'){\n            <kendo-separator></kendo-separator>\n          }\n        }\n      }\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\"\n        [style.width.px]=\"165\"\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) {\n      @if (commandItem) {\n        @switch (commandItem.type) {\n          @case ('link') {\n            @if (commandItem.children && commandItem.children.length > 0) {\n              <kendo-dropdownbutton\n                [data]=\"commandItem.children\"\n                [svgIcon]=\"$any(commandItem.svgIcon)\"\n                [disabled]=\"getIsDisabled(commandItem) || isLoading()\"\n                [textField]=\"'text'\"\n                themeColor=\"primary\"\n                (itemClick)=\"onToolbarDropdownItemClick($event)\">\n                {{ commandItem.text }}\n              </kendo-dropdownbutton>\n            } @else if (commandItem.svgIcon) {\n              <button kendoTooltip kendoButton themeColor=\"primary\" [svgIcon]=\"commandItem.svgIcon\" [title]=\"commandItem.text\"\n                      [disabled]=\"getIsDisabled(commandItem) || isLoading()\"\n                      (click)=\"onToolbarCommand(commandItem)\">{{ commandItem.text }}\n              </button>\n            } @else {\n              <button kendoTooltip kendoButton themeColor=\"primary\" [title]=\"commandItem.text\"\n                      [disabled]=\"getIsDisabled(commandItem) || isLoading()\"\n                      (click)=\"onToolbarCommand(commandItem)\">{{ commandItem.text }}\n              </button>\n            }\n          }\n          @case ('separator'){\n            <kendo-separator></kendo-separator>\n          }\n        }\n      }\n    }\n\n    @if (rowFilterEnabled) {\n      <button kendoTooltip kendoButton themeColor=\"primary\" fillMode=\"flat\" [svgIcon]=\"filterIcon\" (click)=\"onShowRowFilter()\"\n              [disabled]=\"isLoading()\" [title]=\"_messages.showRowFilter\"></button>\n    }\n    <button kendoTooltip kendoGridExcelCommand themeColor=\"primary\" fillMode=\"flat\" [svgIcon]=\"excelSVG\" [disabled]=\"isLoading()\" [title]=\"_messages.exportToExcel\"></button>\n    <button kendoTooltip kendoGridPDFCommand themeColor=\"primary\" fillMode=\"flat\" [svgIcon]=\"pdfSVG\" [disabled]=\"isLoading()\" [title]=\"_messages.exportToPdf\"></button>\n    <button kendoTooltip kendoButton themeColor=\"primary\" fillMode=\"flat\" [svgIcon]=\"refreshIcon\" (click)=\"onRefresh()\" [disabled]=\"isLoading()\" [title]=\"_messages.refreshData\"></button>\n  </ng-template>\n\n  @if (showRowCheckBoxes && selectable.enabled) {\n    <kendo-grid-checkbox-column [showSelectAll]=\"showRowSelectAllCheckBox\"\n                                [width]=\"40\"></kendo-grid-checkbox-column>\n  }\n\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(column.width)\"\n                       [sortable]=\"column.sortable !== false\"\n                       [filterable]=\"column.filterable !== false\"\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 [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'\"></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'\"></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        @switch (column.dataType) {\n          @case ('boolean') {\n            <kendo-checkbox type=\"checkbox\" [checkedState]=\"$any(getValue(dataItem, column))\" [disabled]=\"true\" />\n          }\n          @case ('iso8601') {\n            {{ $any(getValue(dataItem, column)) | date:column.format }}\n          }\n          @case ('bytes') {\n            {{ $any(getValue(dataItem, column)) | bytesToSize }}\n          }\n          @case ('statusIcons') {\n            <span class=\"status-icons-cell\">\n              @for (fieldConfig of getStatusFields(column); track fieldConfig.field) {\n                @if (getStatusIconMapping(dataItem, fieldConfig); as mapping) {\n                  <span\n                    class=\"status-icon\"\n                    [title]=\"mapping.tooltip\"\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(dataItem, column) }}</code>\n              <span class=\"cron-description\">{{ getCronHumanReadable(getValue(dataItem, column)) }}</span>\n            </span>\n          }\n          @case ('numeric') {\n            {{ $any(getValue(dataItem, 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(dataItem, column)\"></span>\n              </span>\n              <span class=\"progress-bar-label\">{{ getValue(dataItem, column) }}%</span>\n            </span>\n          }\n          @default {\n            {{ getValue(dataItem, column) }}\n          }\n        }\n      </ng-template>\n    </kendo-grid-column>\n  }\n\n  @if (_actionMenuItems.length > 0 || (_contextMenuItems.length > 0 &&  contextMenuType == 'actionMenu')) {\n    <kendo-grid-command-column [title]=\"_messages.actionsColumnTitle\" [width]=\"220\">\n      <ng-template kendoGridCellTemplate let-dataItem>\n        @if (_actionMenuItems.length > 0) {\n          @for (menuItem of _actionMenuItems; track menuItem.text) {\n            @if (!menuItem.separator && getMenuItemVisible(menuItem, dataItem)) {\n              <button kendoButton themeColor=\"primary\" fillMode=\"flat\"\n                [svgIcon]=\"menuItem.svgIcon!\"\n                [title]=\"menuItem.text ?? ''\"\n                [disabled]=\"getMenuItemDisabled(menuItem, dataItem) || isLoading()\"\n                (click)=\"onSelectOptionActionItem($event, dataItem, menuItem)\">\n              </button>\n            }\n          }\n        }\n\n        @if (_contextMenuItems.length > 0 && contextMenuType == 'actionMenu') {\n          <button kendoButton themeColor=\"primary\" fillMode=\"flat\" [svgIcon]=\"moreVerticalIcon\" [disabled]=\"isLoading()\" (click)=\"onContextMenu(dataItem, $event)\"></button>\n        }\n      </ng-template>\n    </kendo-grid-command-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  (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 } 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  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 } 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  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 } 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  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}","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 } 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        </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  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 ?? 800;\n    const defaultHeight = options.height ?? 600;\n    const size = this.windowStateService.resolveWindowSize('entity-select', { width: defaultWidth, height: defaultHeight });\n\n    const windowRef = this.windowService.open({\n      title: options.title,\n      content: EntitySelectDialogComponent,\n      width: size.width,\n      height: size.height,\n      minWidth: 550,\n      minHeight: 400,\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} 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  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","import { Component, OnInit, OnDestroy, inject } 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';\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            Name is required\n          </div>\n          <div class=\"validation-message error\" *ngIf=\"nameControl.touched && nameControl.errors?.['minlength']\">\n            Name must be at least {{ minLength }} characters\n          </div>\n          <div class=\"validation-message error\" *ngIf=\"nameControl.touched && nameControl.errors?.['maxlength']\">\n            Name must be at most {{ maxLength }} characters\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>Checking availability...</span>\n          </div>\n\n          <div class=\"validation-message success\" *ngIf=\"isNameAvailable && !isCheckingAvailability && nameControl.valid\">\n            Name is available\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  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 = 'Name';\n  public placeholder = 'Enter name...';\n  public saveButtonText = 'Save';\n  public cancelButtonText = 'Cancel';\n  public minLength = 1;\n  public maxLength = 255;\n  public patternErrorMessage = 'Invalid name format';\n\n  public isCheckingAvailability = false;\n  public isNameAvailable = false;\n  public availabilityMessage = '';\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.nameLabel = options.nameLabel || 'Name';\n      this.placeholder = options.placeholder || 'Enter name...';\n      this.saveButtonText = options.saveButtonText || 'Save';\n      this.cancelButtonText = options.cancelButtonText || 'Cancel';\n      this.minLength = options.minLength ?? 1;\n      this.maxLength = options.maxLength ?? 255;\n      this.patternErrorMessage = options.patternErrorMessage || 'Invalid name format';\n      this.dataSource = options.dataSource;\n      this.debounceMs = options.debounceTime ?? 300;\n\n      // Set up validators\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      // Set suggested name\n      if (options.suggestedName) {\n        this.nameControl.setValue(options.suggestedName);\n      }\n    }\n\n    // Set up availability checking if data source provided\n    if (this.dataSource) {\n      this.setupAvailabilityCheck();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.subscriptions.unsubscribe();\n    this.checkSubject.complete();\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 || 'Name is already taken';\n\n          if (!result.isAvailable) {\n            this.nameControl.setErrors({ ...this.nameControl.errors, nameTaken: true });\n          } else {\n            // Remove nameTaken error if it exists\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    // Listen to value changes\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 we have a data source, require availability check to pass\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 * 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   * Calculate time range for a specific year.\n   * Uses exclusive end boundary (start of next year) for correct LESS_THAN filtering.\n   */\n  static getYearRange(year: number): TimeRange {\n    return {\n      from: new Date(year, 0, 1, 0, 0, 0, 0),\n      to: new Date(year + 1, 0, 1, 0, 0, 0, 0)\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   */\n  static getQuarterRange(year: number, quarter: Quarter): TimeRange {\n    const startMonth = (quarter - 1) * 3;\n    return {\n      from: new Date(year, startMonth, 1, 0, 0, 0, 0),\n      to: new Date(year, startMonth + 3, 1, 0, 0, 0, 0)\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   */\n  static getMonthRange(year: number, month: number): TimeRange {\n    return {\n      from: new Date(year, month, 1, 0, 0, 0, 0),\n      to: new Date(year, month + 1, 1, 0, 0, 0, 0)\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   */\n  static getDayRange(year: number, month: number, day: number, hourFrom?: number, hourTo?: number): TimeRange {\n    const fromHour = hourFrom ?? 0;\n    const toHour = hourTo ?? 24;\n    return {\n      from: new Date(Date.UTC(year, month, day, fromHour, 0, 0, 0)),\n      to: toHour === 24\n        ? new Date(Date.UTC(year, month, day + 1, 0, 0, 0, 0))\n        : new Date(Date.UTC(year, month, day, toHour, 0, 0, 0))\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 UTC, to: start of next day 00:00:00 UTC)\n   */\n  static getTimeRangeFromSelection(selection: TimeRangeSelection, showTime = false): TimeRange | null {\n    switch (selection.type) {\n      case 'year':\n        if (selection.year) {\n          return this.getYearRange(selection.year);\n        }\n        break;\n      case 'quarter':\n        if (selection.year && selection.quarter) {\n          return this.getQuarterRange(selection.year, selection.quarter);\n        }\n        break;\n      case 'month':\n        if (selection.year && selection.month !== undefined) {\n          return this.getMonthRange(selection.year, selection.month);\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);\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 UTC (exclusive end, like year/quarter/month)\n          const from = new Date(selection.customFrom);\n          from.setUTCHours(0, 0, 0, 0);\n          const to = new Date(selection.customTo);\n          to.setUTCHours(0, 0, 0, 0);\n          to.setUTCDate(to.getUTCDate() + 1);\n          return { from, to };\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} 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  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} 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  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 readonly secondIntervalOptions = SECOND_INTERVALS;\n  protected readonly minuteIntervalOptions = MINUTE_INTERVALS;\n  protected readonly hourIntervalOptions = HOUR_INTERVALS;\n  protected readonly weekdayOptions = WEEKDAYS;\n  protected readonly weekdayAbbreviations = WEEKDAY_ABBREVIATIONS;\n  protected readonly relativeWeekOptions = RELATIVE_WEEKS;\n  protected readonly hourOptions = generateHourOptions();\n  protected readonly minuteOptions = generateMinuteOptions();\n  protected readonly dayOfMonthOptions = generateDayOfMonthOptions();\n\n  // --- Tab mapping ---\n  protected readonly tabIndexToType: ScheduleType[] = [\n    'seconds', 'minutes', 'hourly', 'daily', 'weekly', 'monthly', 'custom'\n  ];\n\n  constructor() {\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 } 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  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} 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  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.Upsert;\n  protected readonly ImportStrategyDto = ImportStrategyDto;\n\n  constructor() {\n    const dialogRef = inject(DialogRef);\n    super(dialogRef);\n    this.dialogRef = dialogRef;\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","/*\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/upload-file-dialog/upload-file-dialog.component';\nexport * from './lib/input-dialog/input-dialog.component';\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/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/message-listener.service';\nexport * from './lib/message-details-dialog/message-details-dialog.component';\nexport * from './lib/message-details-dialog/message-details-dialog.service';\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/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';\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","i1.UnsavedChangesDirective","i3","i2","i5","i4","i6"],"mappings":"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"}