@meshmakers/shared-ui 3.3.34 → 3.3.380

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"meshmakers-shared-ui.mjs","sources":["../../../../projects/meshmakers/shared-ui/src/lib/mm-message-details/mm-message-details.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/mm-message-details/mm-message-details.component.html","../../../../projects/meshmakers/shared-ui/src/lib/mm-notification-bar/notification-snack-bar/notification-snack-bar.ts","../../../../projects/meshmakers/shared-ui/src/lib/mm-notification-bar/notification-snack-bar/notification-snack-bar.html","../../../../projects/meshmakers/shared-ui/src/lib/mm-notification-bar/mm-notification-bar.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/mm-notification-bar/mm-notification-bar.component.html","../../../../projects/meshmakers/shared-ui/src/lib/mm-autocomplete-input/mm-autocomplete-input.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/mm-autocomplete-input/mm-autocomplete-input.component.html","../../../../projects/meshmakers/shared-ui/src/lib/mm-entity-select-input/mm-entity-select-input.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/mm-entity-select-input/mm-entity-select-input.component.html","../../../../projects/meshmakers/shared-ui/src/lib/mm-multiple-entity-select-input/mm-multiple-entity-select-input.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/mm-multiple-entity-select-input/mm-multiple-entity-select-input.component.html","../../../../projects/meshmakers/shared-ui/src/lib/services/breadcrumbData.ts","../../../../projects/meshmakers/shared-ui/src/lib/mm-breadcrumb/mm-breadcrumb.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/mm-breadcrumb/mm-breadcrumb.component.html","../../../../projects/meshmakers/shared-ui/src/lib/models/confirmation.ts","../../../../projects/meshmakers/shared-ui/src/lib/mm-confirmation-window/mm-confirmation-window.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/mm-confirmation-window/mm-confirmation-window.component.html","../../../../projects/meshmakers/shared-ui/src/lib/mm-progress-window/mm-progress-window.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/mm-progress-window/mm-progress-window.component.html","../../../../projects/meshmakers/shared-ui/src/lib/services/confirmation.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/services/progress-notifier.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/mm-file-upload/mm-file-upload.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/mm-file-upload/mm-file-upload.component.html","../../../../projects/meshmakers/shared-ui/src/lib/services/file-upload.service.ts","../../../../projects/meshmakers/shared-ui/src/lib/mm-table-simple/mm-table-simple.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/mm-table-simple/mm-table-simple.component.html","../../../../projects/meshmakers/shared-ui/src/lib/mm-qr-scan-window/mm-qr-scan-window.component.ts","../../../../projects/meshmakers/shared-ui/src/lib/mm-qr-scan-window/mm-qr-scan-window.component.html","../../../../projects/meshmakers/shared-ui/src/lib/mm-shared-ui.module.ts","../../../../projects/meshmakers/shared-ui/src/lib/models/commonValidators.ts","../../../../projects/meshmakers/shared-ui/src/lib/models/abstractDetailsComponent.ts","../../../../projects/meshmakers/shared-ui/src/public-api.ts","../../../../projects/meshmakers/shared-ui/src/meshmakers-shared-ui.ts"],"sourcesContent":["import { Component, OnInit, inject } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { ErrorMessage } from '@meshmakers/shared-services';\nimport { Clipboard } from '@angular/cdk/clipboard';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'mm-message-details',\n standalone: false,\n templateUrl: './mm-message-details.component.html',\n styleUrls: ['./mm-message-details.component.css']\n})\nexport class MmMessageDetailsComponent implements OnInit {\n dialogRef = inject<MatDialogRef<MmMessageDetailsComponent>>(MatDialogRef);\n data = inject(MAT_DIALOG_DATA);\n clipboard = inject(Clipboard);\n snackBar = inject(MatSnackBar);\n\n errorMessage: ErrorMessage;\n\n constructor() {\n const data = this.data;\n\n this.errorMessage = data.errorMessage;\n }\n\n ngOnInit(): void {}\n\n copyToClipboard(): void {\n const success = this.clipboard.copy(this.errorMessage.message || '');\n if (success) {\n this.snackBar.open('Copied to clipboard', 'Close', {\n duration: 2000,\n });\n }\n }\n}\n","<mat-dialog-content>\n\n <h2>{{errorMessage.title}}</h2>\n <mat-form-field appearance=\"outline\" class=\"message-field\">\n <textarea\n matInput\n [value]=\"errorMessage.message\"\n readonly\n rows=\"8\"\n class=\"message-textarea\">\n </textarea>\n </mat-form-field>\n\n\n</mat-dialog-content>\n<mat-dialog-actions align=\"end\">\n <button mat-flat-button (click)=\"copyToClipboard()\">\n <mat-icon class=\"material-symbols-outlined\">content_copy</mat-icon>\n Copy\n </button>\n <button class=\"primary-button\" mat-dialog-close mat-flat-button>OK</button>\n</mat-dialog-actions>\n","import { Component, inject } from '@angular/core';\nimport {\n MAT_SNACK_BAR_DATA,\n MatSnackBarAction,\n MatSnackBarActions,\n MatSnackBarRef\n} from \"@angular/material/snack-bar\";\nimport {MatButton} from \"@angular/material/button\";\nimport {ErrorMessage} from \"@meshmakers/shared-services\";\nimport {MatDialog} from \"@angular/material/dialog\";\nimport {MmMessageDetailsComponent} from \"../../mm-message-details/mm-message-details.component\";\nimport {MatIcon} from \"@angular/material/icon\";\n\n@Component({\n selector: 'mm-notification-snack-bar',\n imports: [\n MatSnackBarActions,\n MatButton,\n MatSnackBarAction,\n MatIcon\n ],\n templateUrl: './notification-snack-bar.html',\n styleUrl: './notification-snack-bar.scss'\n})\nexport class NotificationSnackBar {\n readonly errorMessage = inject<ErrorMessage>(MAT_SNACK_BAR_DATA);\n\n protected readonly snackBarRef = inject(MatSnackBarRef);\n private readonly dialog = inject(MatDialog);\n\n onShowDetails(): void {\n this.dialog.open(MmMessageDetailsComponent, {\n data: {\n errorMessage: this.errorMessage\n },\n width: '50vw',\n maxWidth: '90vw',\n maxHeight: '80vh'\n });\n }\n}\n"," <a (click)=\"onShowDetails()\" class=\"notification-text\">\n <span>\n {{ errorMessage?.title }}\n </span>\n </a>\n <span matSnackBarActions>\n <button matButton matSnackBarAction (click)=\"onShowDetails()\"><mat-icon class=\"material-symbols-outlined\">bug_report</mat-icon>Details</button>\n <button matButton matSnackBarAction (click)=\"snackBarRef.dismissWithAction()\"><mat-icon class=\"material-symbols-outlined\">close</mat-icon>Close</button>\n </span>\n","import { Component, OnInit, OnDestroy, inject, NgZone } from '@angular/core';\nimport { ErrorMessage, MessageService } from '@meshmakers/shared-services';\nimport { MatSnackBar, MatSnackBarRef } from \"@angular/material/snack-bar\";\nimport { NotificationSnackBar } from \"./notification-snack-bar/notification-snack-bar\";\nimport { Router, NavigationEnd } from '@angular/router';\nimport { Subscription, fromEvent } from 'rxjs';\nimport { filter, debounceTime } from 'rxjs/operators';\n\n@Component({\n selector: 'mm-notification-bar',\n standalone: false,\n templateUrl: './mm-notification-bar.component.html',\n styleUrls: ['./mm-notification-bar.component.scss']\n})\nexport class MmNotificationBarComponent implements OnInit, OnDestroy {\n private readonly snackBar = inject(MatSnackBar);\n private readonly messageService = inject(MessageService);\n private readonly router = inject(Router);\n private readonly ngZone = inject(NgZone);\n\n public errorMessage: ErrorMessage | null;\n private currentSnackBarRef: MatSnackBarRef<NotificationSnackBar> | null = null;\n private subscriptions: Subscription[] = [];\n private autoCloseOnInteraction = true;\n private interactionDebounceTime = 500; // ms\n private snackBarOpenTime = 0;\n private gracePeriod = 1000; // ms - prevent immediate closure after opening\n\n constructor() {\n this.errorMessage = null;\n }\n\n ngOnInit(): void {\n // Subscribe to error messages\n const errorSubscription = this.messageService.getLatestErrorMessage().subscribe((value) => {\n this.errorMessage = value;\n if (this.errorMessage) {\n // Close previous snack bar if exists\n this.closeCurrentSnackBar();\n\n // Open new snack bar\n this.currentSnackBarRef = this.snackBar.openFromComponent(NotificationSnackBar, {\n data: this.errorMessage,\n horizontalPosition: \"center\",\n verticalPosition: \"top\"\n });\n\n // Record when the snack bar was opened\n this.snackBarOpenTime = Date.now();\n }\n });\n\n // Subscribe to navigation events to auto-close snack bar\n const navigationSubscription = this.router.events\n .pipe(filter(event => event instanceof NavigationEnd))\n .subscribe(() => {\n this.closeCurrentSnackBar();\n });\n\n // Subscribe to global user interactions to auto-close snack bar\n this.setupGlobalInteractionListeners();\n\n this.subscriptions.push(errorSubscription, navigationSubscription);\n }\n\n ngOnDestroy(): void {\n // Clean up subscriptions\n this.subscriptions.forEach(sub => sub.unsubscribe());\n this.closeCurrentSnackBar();\n }\n\n private closeCurrentSnackBar(): void {\n if (this.currentSnackBarRef) {\n this.currentSnackBarRef.dismiss();\n this.currentSnackBarRef = null;\n }\n }\n\n private setupGlobalInteractionListeners(): void {\n if (!this.autoCloseOnInteraction) return;\n\n this.ngZone.runOutsideAngular(() => {\n // Listen for various user interaction events\n const events = ['click', 'keydown', 'scroll', 'touchstart'];\n\n events.forEach(eventType => {\n const subscription = fromEvent(document, eventType)\n .pipe(\n debounceTime(this.interactionDebounceTime),\n filter(() => this.currentSnackBarRef !== null),\n filter((event) => this.shouldCloseOnInteraction(event as Event))\n )\n .subscribe(() => {\n this.ngZone.run(() => {\n this.closeCurrentSnackBar();\n });\n });\n\n this.subscriptions.push(subscription);\n });\n });\n }\n\n private shouldCloseOnInteraction(event: Event): boolean {\n if (!this.currentSnackBarRef) return false;\n\n // Don't close if we're still in the grace period after opening\n const timeSinceOpen = Date.now() - this.snackBarOpenTime;\n if (timeSinceOpen < this.gracePeriod) {\n return false;\n }\n\n const target = event.target as Element;\n\n // Don't close if the interaction is within the snack bar itself\n const snackBarElement = document.querySelector('mm-notification-snack-bar') ||\n document.querySelector('.mat-mdc-snack-bar-container');\n\n if (snackBarElement && snackBarElement.contains(target)) {\n return false;\n }\n\n // Don't close on certain key presses (like Tab for accessibility)\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","<div></div>\n","import { Component, DoCheck, ElementRef, EventEmitter, forwardRef, HostBinding, Injector, Input, OnDestroy, OnInit, ViewChild, inject } from \"@angular/core\";\nimport { MatFormFieldControl } from \"@angular/material/form-field\";\nimport {\n AbstractControl,\n ControlValueAccessor,\n FormControl,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n NgControl,\n ValidationErrors,\n Validator\n} from \"@angular/forms\";\nimport { coerceBooleanProperty } from \"@angular/cdk/coercion\";\nimport { debounceTime, filter, map, switchMap, tap } from \"rxjs/operators\";\nimport { MatAutocompleteActivatedEvent, MatAutocompleteSelectedEvent } from \"@angular/material/autocomplete\";\nimport { MatInput } from \"@angular/material/input\";\nimport { of, Subject } from \"rxjs\";\nimport { FocusMonitor } from \"@angular/cdk/a11y\";\nimport { AutoCompleteDataSource } from \"@meshmakers/shared-services\";\n\n@Component({\n selector: \"mm-autocomplete\",\n standalone: false,\n templateUrl: \"./mm-autocomplete-input.component.html\",\n styleUrls: [\"./mm-autocomplete-input.component.css\"],\n host: {\n \"[id]\": \"id\",\n \"[attr.aria-describedby]\": \"describedBy\"\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MmAutocompleteInputComponent),\n multi: true\n },\n {\n provide: MatFormFieldControl,\n useExisting: MmAutocompleteInputComponent\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => MmAutocompleteInputComponent),\n multi: true\n }\n ]\n})\nexport class MmAutocompleteInputComponent implements OnInit, OnDestroy, DoCheck, ControlValueAccessor, MatFormFieldControl<any>, Validator {\n elRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n private readonly fm = inject(FocusMonitor);\n\n private static nextId = 0;\n public readonly searchFormControl: FormControl;\n public isLoading: boolean;\n public filteredStrings: string[] = [];\n public ngControl: NgControl | null;\n public errorState: boolean;\n public focused: boolean;\n public readonly stateChanges = new Subject<void>();\n @HostBinding()\n public readonly id = `ia-autocomplete-${MmAutocompleteInputComponent.nextId++}`;\n\n public valueChange: EventEmitter<any> = new EventEmitter<any>();\n private _selectedString: string | null;\n @ViewChild(\"input\") private readonly inputField: MatInput | null;\n @HostBinding(\"attr.aria-describedby\") private describedBy = \"\";\n private activatedValue: any;\n\n constructor() {\n const elRef = this.elRef;\n const fm = this.fm;\n\n this.ngControl = null;\n this.errorState = false;\n this._selectedString = null;\n this.inputField = null;\n this._dataSource = null;\n this._placeholder = \"\";\n this._prefix = \"\";\n\n this.searchFormControl = new FormControl();\n this.isLoading = false;\n this._disabled = false;\n this.focused = false;\n fm.monitor(elRef.nativeElement, true).subscribe((origin) => {\n this.focused = !!origin;\n this.stateChanges.next();\n });\n }\n\n private _dataSource: AutoCompleteDataSource | null;\n\n public get dataSource(): AutoCompleteDataSource | null {\n return this._dataSource;\n }\n\n @Input()\n public set dataSource(value: AutoCompleteDataSource | null) {\n this._dataSource = value;\n }\n\n private _disabled = false;\n\n @Input()\n public get disabled(): boolean {\n return this._disabled;\n }\n\n public set disabled(dis) {\n this._disabled = coerceBooleanProperty(dis);\n if (this._disabled) {\n this.searchFormControl.disable();\n } else {\n this.searchFormControl.enable();\n }\n this.stateChanges.next();\n }\n\n private _placeholder: string;\n\n @Input()\n public get placeholder(): string {\n return this._placeholder;\n }\n\n public set placeholder(plh: string) {\n this._placeholder = plh;\n this.stateChanges.next();\n }\n\n private _required = false;\n\n @Input()\n public get required(): boolean {\n return this._required;\n }\n\n public set required(req) {\n this._required = coerceBooleanProperty(req);\n if (this.inputField != null) {\n this.inputField.required = this._required;\n }\n this.stateChanges.next();\n }\n\n private _prefix: string;\n\n @Input()\n public get prefix(): string {\n return this._prefix;\n }\n\n public set prefix(value: string) {\n if (value !== this._prefix) {\n this._prefix = value;\n }\n }\n\n public get value(): any {\n return this._selectedString;\n }\n\n public set value(value: any) {\n if (value !== this._selectedString) {\n this._selectedString = value;\n this.searchFormControl.setValue(value);\n this.valueChange.emit(value);\n this._propagateChange(this._selectedString);\n this.stateChanges.next();\n }\n }\n\n public get empty(): boolean {\n const n = this.searchFormControl.value;\n return !n;\n }\n\n @HostBinding(\"class.floating\")\n public get shouldLabelFloat(): boolean {\n return this.focused || !this.empty;\n }\n\n ngOnInit(): void {\n this.ngControl = this.injector.get(NgControl, null);\n if (this.ngControl != null) {\n this.ngControl.valueAccessor = this;\n }\n\n // If prefix defined, usually this is used for a code scanner.\n // The goal is to select the entity in direct way.\n if (this._prefix) {\n this.searchFormControl.valueChanges\n .pipe(\n debounceTime(300),\n filter((value) => typeof value === \"string\"),\n filter((value) => value.startsWith(this._prefix)),\n tap(() => (this.value = null)),\n tap(() => (this.isLoading = true)),\n map((value: string) => this._dataSource?.onPreprocessSearchString(value) ?? \"\"),\n switchMap((value) => this._dataSource?.onFilter(value) ?? of(null))\n )\n .subscribe((resultSet) => {\n if (resultSet?.list != null) {\n if (resultSet.list.length === 1) {\n this.value = resultSet.list[0];\n } else {\n this.filteredStrings = resultSet.list;\n this.searchFormControl.patchValue(resultSet.searchTerm, {\n emitEvent: false\n });\n }\n }\n this.isLoading = false;\n });\n }\n\n // This is the search functionality when search by human.\n this.searchFormControl.valueChanges\n .pipe(\n debounceTime(300),\n tap((_) => {\n this.filteredStrings = [];\n }),\n filter((value) => value != null && value.toString().length >= 1),\n tap(() => (this.isLoading = true)),\n map((value: string) => this._dataSource?.onPreprocessSearchString(value)),\n tap((value) => (this.value = value)),\n switchMap((value) => {\n if (value !== null) {\n return this._dataSource?.onFilter(String(value)) ?? of(null);\n }\n return of(null);\n })\n )\n .subscribe((resultSet) => {\n if (resultSet?.list != null) {\n this.filteredStrings = resultSet.list;\n this.searchFormControl.patchValue(resultSet.searchTerm, {\n emitEvent: false\n });\n }\n this.isLoading = false;\n });\n }\n\n ngOnDestroy(): void {\n this.stateChanges.complete();\n this.fm.stopMonitoring(this.elRef.nativeElement);\n }\n\n ngDoCheck(): void {\n if (this.ngControl != null) {\n this.errorState = (this.ngControl.invalid && this.ngControl.touched) ?? false;\n this.stateChanges.next();\n }\n }\n\n public clear(): void {\n this.filteredStrings = [];\n this.searchFormControl.reset(null);\n }\n\n public focus(): void {\n this.elRef.nativeElement.querySelector(\"input\")?.focus();\n }\n\n public onOptionSelected(event: MatAutocompleteSelectedEvent): void {\n this.value = event.option.value;\n this.filteredStrings = [];\n }\n\n public onOptionActivated(event: MatAutocompleteActivatedEvent): void {\n this.activatedValue = event.option?.value;\n }\n\n public onAutoCompleteClosed(): void {\n if (this.activatedValue) {\n this.value = this.activatedValue;\n this.activatedValue = null;\n }\n }\n\n public reset(): void {\n this.value = null;\n }\n\n public onFocusOut(): void {\n if (this.filteredStrings.length === 1) {\n this.activatedValue = this.filteredStrings[0];\n this.value = this.filteredStrings[0];\n }\n }\n\n public onTouched(): void {\n this._onTouched();\n this.stateChanges.next();\n }\n\n public registerOnChange(fn: any): void {\n this._propagateChange = fn;\n }\n\n public registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n public writeValue(obj: any): void {\n this.clear();\n this.value = obj;\n }\n\n public setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n public onContainerClick(event: MouseEvent): void {\n if ((event.target as Element).tagName.toLowerCase() !== \"input\") {\n this.focus();\n }\n }\n\n public setDescribedByIds(ids: string[]): void {\n this.describedBy = ids.join(\" \");\n }\n\n validate(control: AbstractControl): ValidationErrors | null {\n const selection: any = control.value;\n if (typeof selection === \"string\" && selection.length < 1) {\n return { incorrect: true };\n }\n return null;\n }\n\n private _propagateChange = (_: any): void => {\n };\n\n private readonly _onTouched = (): void => {\n };\n}\n","<input #input (blur)=\"onTouched()\" (focusout)=\"onFocusOut()\" [formControl]=\"searchFormControl\" [matAutocomplete]=\"auto\"\n [placeholder]=\"placeholder\" matInput>\n<mat-autocomplete #auto=\"matAutocomplete\"\n (closed)=\"onAutoCompleteClosed()\" (optionActivated)=\"onOptionActivated($event)\"\n (optionSelected)=\"onOptionSelected($event)\">\n <mat-option *ngIf=\"isLoading\" class=\"is-loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n </mat-option>\n <ng-container *ngIf=\"!isLoading\">\n <mat-option *ngFor=\"let str of filteredStrings\" [value]=\"str\">\n {{str}}\n </mat-option>\n </ng-container>\n</mat-autocomplete>\n","import { Component, DoCheck, ElementRef, EventEmitter, forwardRef, HostBinding, Injector, Input, OnDestroy, OnInit, ViewChild, inject } from \"@angular/core\";\nimport {\n AbstractControl,\n ControlValueAccessor,\n FormControl,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n NgControl,\n ValidationErrors,\n Validator\n} from \"@angular/forms\";\nimport { MatFormFieldControl } from \"@angular/material/form-field\";\nimport { MatInput } from \"@angular/material/input\";\nimport { EntitySelectDataSource } from \"@meshmakers/shared-services\";\nimport { Subject } from \"rxjs\";\nimport { FocusMonitor } from \"@angular/cdk/a11y\";\nimport { debounceTime, filter, tap } from \"rxjs/operators\";\nimport { MatAutocompleteActivatedEvent, MatAutocompleteSelectedEvent } from \"@angular/material/autocomplete\";\nimport { coerceBooleanProperty } from \"@angular/cdk/coercion\";\n\n@Component({\n selector: \"mm-entity-select\",\n standalone: false,\n templateUrl: \"./mm-entity-select-input.component.html\",\n styleUrls: [\"./mm-entity-select-input.component.css\"],\n host: {\n \"[id]\": \"id\",\n \"[attr.aria-describedby]\": \"describedBy\"\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MmEntitySelectInputComponent),\n multi: true\n },\n {\n provide: MatFormFieldControl,\n useExisting: MmEntitySelectInputComponent\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => MmEntitySelectInputComponent),\n multi: true\n }\n ]\n})\nexport class MmEntitySelectInputComponent implements OnInit, OnDestroy, DoCheck, ControlValueAccessor, MatFormFieldControl<any>, Validator {\n elRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n private readonly fm = inject(FocusMonitor);\n\n private static nextId = 0;\n public readonly searchFormControl: FormControl;\n public isLoading: boolean;\n public filteredEntities: any[] = [];\n public ngControl: NgControl | null;\n public errorState: boolean;\n public focused: boolean;\n public readonly stateChanges = new Subject<void>();\n @HostBinding()\n public readonly id = `ia-entity-select-${MmEntitySelectInputComponent.nextId++}`;\n\n public valueChange: EventEmitter<any> = new EventEmitter<any>();\n private _selectedEntity: any;\n @ViewChild(\"input\") private readonly inputField: MatInput | null;\n @HostBinding(\"attr.aria-describedby\") private describedBy = \"\";\n private activatedValue: any;\n\n constructor() {\n const elRef = this.elRef;\n const fm = this.fm;\n\n this.ngControl = null;\n this.errorState = false;\n this.inputField = null;\n this._dataSource = null;\n this._placeholder = \"\";\n this._prefix = \"\";\n\n this.searchFormControl = new FormControl();\n this.isLoading = false;\n this._disabled = false;\n this.focused = false;\n fm.monitor(elRef.nativeElement, true).subscribe((origin) => {\n this.focused = !!origin;\n this.stateChanges.next();\n });\n }\n\n private _dataSource: EntitySelectDataSource<any> | null;\n\n public get dataSource(): EntitySelectDataSource<any> | null {\n return this._dataSource;\n }\n\n @Input()\n public set dataSource(value: EntitySelectDataSource<any> | null) {\n this._dataSource = value;\n }\n\n private _disabled = false;\n\n @Input()\n public get disabled(): boolean {\n return this._disabled;\n }\n\n public set disabled(dis) {\n this._disabled = coerceBooleanProperty(dis);\n if (this._disabled) {\n this.searchFormControl.disable();\n } else {\n this.searchFormControl.enable();\n }\n this.stateChanges.next();\n }\n\n private _placeholder: string;\n\n @Input()\n public get placeholder(): string {\n return this._placeholder;\n }\n\n public set placeholder(plh) {\n this._placeholder = plh;\n this.stateChanges.next();\n }\n\n private _required = false;\n\n @Input()\n public get required(): boolean {\n return this._required;\n }\n\n public set required(req) {\n this._required = coerceBooleanProperty(req);\n if (this.inputField != null) {\n this.inputField.required = this._required;\n }\n this.stateChanges.next();\n }\n\n private _prefix: string;\n\n @Input()\n public get prefix(): string {\n return this._prefix;\n }\n\n public set prefix(value: string) {\n if (value !== this._prefix) {\n this._prefix = value;\n }\n }\n\n public get value(): any {\n return this._selectedEntity;\n }\n\n public set value(value: any) {\n if (value !== this._selectedEntity) {\n this.searchFormControl.setValue(value);\n this.setValue(value);\n }\n }\n\n public get empty(): boolean {\n const n = this.searchFormControl.value;\n return !n;\n }\n\n @HostBinding(\"class.floating\")\n public get shouldLabelFloat(): boolean {\n return this.focused || !this.empty;\n }\n\n ngOnInit(): void {\n this.ngControl = this.injector.get(NgControl, null);\n if (this.ngControl != null) {\n this.ngControl.valueAccessor = this;\n }\n\n // If prefix defined, usually this is used for a code scanner.\n // The goal is to select the entity in direct way.\n if (this._prefix) {\n this.searchFormControl.valueChanges\n .pipe(\n debounceTime(300),\n filter((value) => typeof value === \"string\"),\n filter((value) => value.startsWith(this._prefix)),\n tap(() => (this.value = null)),\n tap(() => (this.isLoading = true))\n )\n .subscribe(async (value: string) => {\n\n if (!this._dataSource)\n {\n this.isLoading = false;\n return;\n }\n\n const resultSet = await this._dataSource?.onFilter(value.replace(this._prefix, \"\").trim());\n\n if (resultSet.list) {\n if (resultSet.list.length === 1) {\n this.value = resultSet.list[0];\n } else {\n this.filteredEntities = resultSet.list;\n }\n }\n this.isLoading = false;\n });\n }\n\n // This is the search functionality when search by human.\n this.searchFormControl.valueChanges\n .pipe(\n debounceTime(300),\n tap(() => (this.filteredEntities = [])),\n filter((value: any) => typeof value === \"string\"),\n tap(() => {\n this.setValue(null);\n }),\n filter((value) => value.toString().length >= 3),\n tap(() => (this.isLoading = true))\n )\n .subscribe(async (value : string) => {\n\n if (!this._dataSource)\n {\n this.isLoading = false;\n return;\n }\n\n const resultSet = await this._dataSource.onFilter(value);\n\n if (resultSet?.list) {\n this.filteredEntities = resultSet.list;\n }\n this.isLoading = false;\n });\n }\n\n ngOnDestroy(): void {\n this.stateChanges.complete();\n this.fm.stopMonitoring(this.elRef.nativeElement);\n }\n\n ngDoCheck(): void {\n if (this.ngControl != null) {\n this.errorState = (this.ngControl.invalid && this.ngControl.touched) ?? false;\n this.stateChanges.next();\n }\n }\n\n public clear(): void {\n this.filteredEntities = [];\n this.searchFormControl.reset(null);\n }\n\n public focus(): void {\n this.elRef.nativeElement.querySelector(\"input\")?.focus();\n }\n\n public onEntitySelected(event: MatAutocompleteSelectedEvent): void {\n this.value = event.option.value;\n this.filteredEntities = [];\n }\n\n public onEntityActivated(event: MatAutocompleteActivatedEvent): void {\n this.activatedValue = event.option?.value;\n }\n\n public onEntityClosed(): void {\n if (this.activatedValue) {\n this.value = this.activatedValue;\n this.activatedValue = null;\n }\n }\n\n public reset(): void {\n this.value = null;\n }\n\n public onFocusOut(): void {\n if (this.filteredEntities.length === 1) {\n this.activatedValue = this.filteredEntities[0];\n this.value = this.filteredEntities[0];\n }\n }\n\n public onTouched(): void {\n this._onTouched();\n this.stateChanges.next();\n }\n\n public registerOnChange(fn: any): void {\n this._propagateChange = fn;\n }\n\n public registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n public writeValue(obj: any): void {\n this.clear();\n this.value = obj;\n }\n\n public setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n public onContainerClick(event: MouseEvent): void {\n if ((event.target as Element).tagName.toLowerCase() !== \"input\") {\n this.focus();\n }\n }\n\n public setDescribedByIds(ids: string[]): void {\n this.describedBy = ids.join(\" \");\n }\n\n validate(control: AbstractControl): ValidationErrors | null {\n const selection: any = control.value;\n if (typeof selection === \"string\") {\n return { incorrect: true };\n }\n return null;\n }\n\n private _propagateChange = (_: any): void => {\n };\n\n private readonly _onTouched = (): void => {\n };\n\n private setValue(value: any): void {\n if (value !== this._selectedEntity) {\n this._selectedEntity = value;\n this.valueChange.emit(value);\n this._propagateChange(this._selectedEntity);\n this.stateChanges.next();\n }\n }\n}\n","<input #input (blur)=\"onTouched()\" (focusout)=\"onFocusOut()\" [formControl]=\"searchFormControl\" [matAutocomplete]=\"auto\"\n [placeholder]=\"placeholder\" matInput>\n<mat-autocomplete #auto=\"matAutocomplete\" (closed)=\"onEntityClosed()\"\n (optionActivated)=\"onEntityActivated($event)\" (optionSelected)=\"onEntitySelected($event)\"\n [displayWith]=\"dataSource?.onDisplayEntity ?? null\">\n <mat-option *ngIf=\"isLoading\" class=\"is-loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n </mat-option>\n <ng-container *ngIf=\"!isLoading\">\n <mat-option *ngFor=\"let entity of filteredEntities\" [value]=\"entity\">\n {{dataSource?.onDisplayEntity(entity) ?? null}}\n </mat-option>\n </ng-container>\n</mat-autocomplete>\n","import { Component, DoCheck, ElementRef, EventEmitter, forwardRef, HostBinding, Injector, Input, OnDestroy, OnInit, ViewChild, inject } from '@angular/core';\nimport { EntitySelectDataSource } from '@meshmakers/shared-services';\nimport {\n AbstractControl,\n ControlValueAccessor,\n FormControl,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n NgControl,\n ValidationErrors,\n Validator\n} from '@angular/forms';\nimport { of, Subject } from 'rxjs';\nimport { MatInput } from '@angular/material/input';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { debounceTime, filter, switchMap, tap } from 'rxjs/operators';\nimport { MatAutocompleteActivatedEvent, MatAutocompleteSelectedEvent } from '@angular/material/autocomplete';\nimport { MatFormFieldControl } from '@angular/material/form-field';\nimport { COMMA, ENTER } from '@angular/cdk/keycodes';\n\n@Component({\n selector: 'mm-multiple-entity-select',\n standalone: false,\n templateUrl: './mm-multiple-entity-select-input.component.html',\n styleUrls: ['./mm-multiple-entity-select-input.component.css'],\n host: {\n '[id]': 'id',\n '[attr.aria-describedby]': 'describedBy'\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MmMultipleEntitySelectInputComponent),\n multi: true\n },\n {\n provide: MatFormFieldControl,\n useExisting: MmMultipleEntitySelectInputComponent\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => MmMultipleEntitySelectInputComponent),\n multi: true\n }\n ]\n})\nexport class MmMultipleEntitySelectInputComponent\n implements OnInit, OnDestroy, DoCheck, ControlValueAccessor, MatFormFieldControl<any[]>, Validator\n{\n elRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n private readonly fm = inject(FocusMonitor);\n\n private static nextId = 0;\n public readonly valuesFormControl: FormControl;\n public readonly searchFormControl: FormControl;\n public isLoading: boolean;\n public filteredEntities: any[] = [];\n public ngControl: NgControl | null;\n public errorState: boolean;\n public focused: boolean;\n public readonly stateChanges = new Subject<void>();\n @HostBinding()\n public readonly id = `ia-multiple-entity-select-${MmMultipleEntitySelectInputComponent.nextId++}`;\n\n public valuesChange: EventEmitter<any[]> = new EventEmitter<any[]>();\n private _selectedEntities: any[] | null;\n @ViewChild('input') private readonly inputField: MatInput | null;\n @HostBinding('attr.aria-describedby') private describedBy = '';\n private activatedValue: any;\n readonly separatorKeysCodes = [ENTER, COMMA] as const;\n\n constructor() {\n const elRef = this.elRef;\n const fm = this.fm;\n\n this.ngControl = null;\n this.errorState = false;\n this.inputField = null;\n this._dataSource = null;\n this._placeholder = '';\n this._prefix = '';\n this._selectedEntities = null;\n\n this.valuesFormControl = new FormControl();\n this.searchFormControl = new FormControl();\n this.isLoading = false;\n this._disabled = false;\n this.focused = false;\n fm.monitor(elRef.nativeElement, true).subscribe((origin) => {\n this.focused = !!origin;\n this.stateChanges.next();\n });\n }\n\n private _dataSource: EntitySelectDataSource<any> | null;\n\n public get dataSource(): EntitySelectDataSource<any> | null {\n return this._dataSource;\n }\n\n @Input()\n public set dataSource(value: EntitySelectDataSource<any> | null) {\n this._dataSource = value;\n }\n\n private _disabled = false;\n\n @Input()\n public get disabled(): boolean {\n return this._disabled;\n }\n\n public set disabled(dis) {\n this._disabled = coerceBooleanProperty(dis);\n if (this._disabled) {\n this.searchFormControl.disable();\n } else {\n this.searchFormControl.enable();\n }\n this.stateChanges.next();\n }\n\n private _placeholder: string;\n\n @Input()\n public get placeholder(): string {\n return this._placeholder;\n }\n\n public set placeholder(plh) {\n this._placeholder = plh;\n this.stateChanges.next();\n }\n\n private _required = false;\n\n @Input()\n public get required(): boolean {\n return this._required;\n }\n\n public set required(req) {\n this._required = coerceBooleanProperty(req);\n if (this.inputField != null) {\n this.inputField.required = this._required;\n }\n this.stateChanges.next();\n }\n\n private _prefix: string;\n\n @Input()\n public get prefix(): string {\n return this._prefix;\n }\n\n public set prefix(value: string) {\n if (value !== this._prefix) {\n this._prefix = value;\n }\n }\n\n public get value(): any[] | null {\n return this._selectedEntities;\n }\n\n public set value(value: any[] | null) {\n if (value !== this._selectedEntities) {\n this.valuesFormControl.setValue(value);\n this.setValue(value);\n }\n }\n\n public get empty(): boolean {\n const n = this.valuesFormControl.value;\n return !n;\n }\n\n @HostBinding('class.floating')\n public get shouldLabelFloat(): boolean {\n return this.focused || !this.empty;\n }\n\n ngOnInit(): void {\n this.ngControl = this.injector.get(NgControl, null);\n if (this.ngControl != null) {\n this.ngControl.valueAccessor = this;\n }\n\n // If prefix defined, usually this is used for a code scanner.\n // The goal is to select the entity in direct way.\n if (this._prefix) {\n this.searchFormControl.valueChanges\n .pipe(\n debounceTime(300),\n filter((value) => typeof value === 'string'),\n filter((value: string) => value.startsWith(this._prefix)),\n tap(() => (this.isLoading = true)),\n switchMap((value) => this._dataSource?.onFilter(value.replace(this._prefix, '').trim()) ?? of(null))\n )\n .subscribe((resultSet) => {\n if (resultSet?.list) {\n this.filteredEntities = resultSet.list;\n }\n this.isLoading = false;\n });\n }\n\n // This is the search functionality when search by human.\n this.searchFormControl.valueChanges\n .pipe(\n debounceTime(300),\n tap(() => (this.filteredEntities = [])),\n filter((value) => typeof value === 'string'),\n filter((value) => value.toString().length >= 3),\n tap(() => (this.isLoading = true)),\n switchMap((value: string) => this._dataSource?.onFilter(value) ?? of(null))\n )\n .subscribe((resultSet) => {\n const resultList = new Array<any>();\n\n if (resultSet?.list) {\n resultSet.list.forEach((value1) => {\n if (!this.value?.find((value2) => this._dataSource?.getIdEntity(value2) === this._dataSource?.getIdEntity(value1))) {\n resultList.push(value1);\n }\n });\n }\n\n this.filteredEntities = resultList;\n this.isLoading = false;\n });\n }\n\n ngOnDestroy(): void {\n this.stateChanges.complete();\n this.fm.stopMonitoring(this.elRef.nativeElement);\n }\n\n ngDoCheck(): void {\n if (this.ngControl != null) {\n this.errorState = (this.ngControl.invalid && this.ngControl.touched) ?? false;\n this.stateChanges.next();\n }\n }\n\n public clear(): void {\n this.filteredEntities = [];\n this.searchFormControl.reset(null);\n }\n\n public focus(): void {\n this.elRef.nativeElement.querySelector('input')?.focus();\n }\n\n public onEntitySelected(event: MatAutocompleteSelectedEvent): void {\n let list = this.value;\n if (list == null) {\n list = new Array<any>();\n }\n list.push(event.option.value);\n this.value = list;\n\n this.filteredEntities = [];\n this.searchFormControl.setValue(null);\n this.valuesFormControl.updateValueAndValidity();\n }\n\n public onEntityActivated(event: MatAutocompleteActivatedEvent): void {\n this.activatedValue = event.option?.value;\n }\n\n public onEntityClosed(): void {\n if (this.activatedValue) {\n this.value = this.activatedValue;\n this.activatedValue = null;\n }\n }\n\n public reset(): void {\n this.value = new Array<any>();\n }\n\n public onFocusOut(): void {\n // if (this.filteredEntities.length === 1) {\n // this.activatedValue = this.filteredEntities[0];\n // this.value = this.filteredEntities[0];\n // }\n }\n\n public onTouched(): void {\n this._onTouched();\n this.stateChanges.next();\n }\n\n public registerOnChange(fn: any): void {\n this._propagateChange = fn;\n }\n\n public registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n public writeValue(obj: any): void {\n this.clear();\n this.value = obj;\n }\n\n public setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n public onContainerClick(event: MouseEvent): void {\n if ((event.target as Element).tagName.toLowerCase() !== 'input') {\n this.focus();\n }\n }\n\n public setDescribedByIds(ids: string[]): void {\n this.describedBy = ids.join(' ');\n }\n\n validate(control: AbstractControl): ValidationErrors | null {\n const selection: any = control.value;\n if (typeof selection === 'string') {\n return { incorrect: true };\n }\n return null;\n }\n\n remove(value: any): void {\n const list = this.value;\n if (list != null) {\n const index = list.indexOf(value);\n if (index !== -1) {\n list.splice(index, 1);\n }\n this.valuesFormControl.updateValueAndValidity();\n }\n }\n\n private _propagateChange = (_: any[]): void => {};\n\n private readonly _onTouched = (): void => {};\n\n private setValue(values: any[] | null): void {\n if (values !== this._selectedEntities) {\n this._selectedEntities = values;\n this.valuesChange.emit(values ?? []);\n this._propagateChange(this._selectedEntities ?? []);\n this.stateChanges.next();\n }\n }\n}\n","<mat-chip-grid #list>\n <mat-chip-row *ngFor=\"let entity of valuesFormControl.value\"\n (removed)=\"remove(entity)\"\n [editable]=\"false\"\n [aria-description]=\"'press enter to edit ' + dataSource?.onDisplayEntity(entity) ?? null\">\n {{dataSource?.onDisplayEntity(entity) ?? null}}\n <button matChipRemove [attr.aria-label]=\"'remove ' + dataSource?.onDisplayEntity(entity) ?? null\">\n <mat-icon class=\"material-symbols-outlined\">cancel</mat-icon>\n </button>\n </mat-chip-row>\n <input #input (blur)=\"onTouched()\" (focusout)=\"onFocusOut()\" [formControl]=\"searchFormControl\"\n [matAutocomplete]=\"auto\"\n [matChipInputFor]=\"list\"\n matChipInputAddOnBlur=\"true\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n [placeholder]=\"placeholder\" matInput>\n <mat-autocomplete #auto=\"matAutocomplete\" (closed)=\"onEntityClosed()\"\n (optionActivated)=\"onEntityActivated($event)\" (optionSelected)=\"onEntitySelected($event)\"\n [displayWith]=\"dataSource?.onDisplayEntity ?? null\">\n <mat-option *ngIf=\"isLoading\" class=\"is-loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n </mat-option>\n <ng-container *ngIf=\"!isLoading\">\n <mat-option *ngFor=\"let entity of filteredEntities\" [value]=\"entity\">\n {{dataSource?.onDisplayEntity(entity) ?? null}}\n </mat-option>\n </ng-container>\n </mat-autocomplete>\n</mat-chip-grid>\n","export class BreadcrumbData {\n\n constructor(label: string, labelTemplate: string, url: string) {\n this.label = label;\n this.labelTemplate = labelTemplate;\n this.url = url;\n }\n\n label: string;\n labelTemplate: string\n url: string;\n}\n","import { Component, Input, OnInit, inject } from '@angular/core';\nimport { ActivatedRoute, NavigationEnd, PRIMARY_OUTLET, Router } from '@angular/router';\nimport { Breadcrumb, BreadcrumbService } from '@meshmakers/shared-services';\nimport { filter, map } from 'rxjs/operators';\nimport { BreadcrumbData } from \"../services/breadcrumbData\";\n\n@Component({\n selector: 'mm-breadcrumb',\n standalone: false,\n templateUrl: './mm-breadcrumb.component.html',\n styleUrl: './mm-breadcrumb.component.css'\n})\nexport class MmBreadcrumbComponent implements OnInit {\n private readonly activatedRoute = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly breadcrumbService = inject(BreadcrumbService);\n\n protected breadcrumbData: BreadcrumbData[] = [];\n @Input() fontSize = '18px';\n @Input() fontColor = '#0275d8';\n @Input() lastLinkColor = '#000';\n @Input() symbol = ' / ';\n\n constructor() {\n this.breadCrumbData();\n }\n\n ngOnInit(): void {\n this.breadcrumbService.breadcrumbLabels.subscribe((labelData: object) => {\n Object.entries(labelData).forEach(([key, value]) => {\n this.breadcrumbData.forEach((breadcrumbData: BreadcrumbData) => {\n const labelParams = breadcrumbData.labelTemplate.match(/[^{{]+(?=}})/g);\n if (labelParams) {\n for (const labelParam of labelParams) {\n if (labelParam === key) {\n breadcrumbData.label = breadcrumbData.labelTemplate.replace('{{' + labelParam + '}}', (value as string));\n }\n }\n }\n });\n });\n });\n\n this.breadcrumbService.newBreadcrumb.subscribe((breadcrumb: Breadcrumb[]) => {\n if (breadcrumb.length > 0) {\n this.updateData(this.activatedRoute, breadcrumb);\n }\n });\n }\n\n breadCrumbData(): void {\n this.router.events\n .pipe(filter((event) => event instanceof NavigationEnd))\n .pipe(map(() => this.activatedRoute))\n .pipe(\n map((route) => {\n while (route.firstChild) {\n route = route.firstChild;\n }\n return route;\n })\n )\n .pipe(filter((route) => route.outlet === PRIMARY_OUTLET))\n .subscribe((route) => {\n this.updateData(route, null);\n });\n }\n\n private updateData(route: ActivatedRoute, newBreadcrumb: Breadcrumb[] | null): void {\n if (route.snapshot.data['breadcrumb'] || newBreadcrumb) {\n const data = route.snapshot.data['breadcrumb'] ? route.snapshot.data['breadcrumb'] : newBreadcrumb;\n const breadcrumb = JSON.parse(JSON.stringify(data)) as Breadcrumb[];\n const breadcrumbData = new Array<BreadcrumbData>();\n breadcrumb.forEach((crumb : Breadcrumb) => {\n const breadcrumbDataItem = new BreadcrumbData(crumb.label, crumb.label, crumb.url);\n breadcrumbData.push(breadcrumbDataItem);\n\n if (breadcrumbDataItem.url) {\n const urlChunks = breadcrumbDataItem.url.split('/');\n for (const chunk of urlChunks) {\n if (chunk.includes(':')) {\n const paramID = chunk.replace(':', '');\n const routerParamID = route.snapshot.params[paramID] as string;\n breadcrumbDataItem.url = crumb.url.replace(`:${paramID}`, routerParamID);\n }\n }\n }\n\n const labelParams = breadcrumbDataItem.labelTemplate.match(/[^{{]+(?=}})/g);\n if (labelParams) {\n for (const labelParam of labelParams) {\n const routerParamID = decodeURIComponent((route.snapshot.params[labelParam.trim()] as string));\n if (routerParamID) {\n breadcrumbDataItem.label = breadcrumbDataItem.labelTemplate.replace('{{' + labelParam + '}}', routerParamID);\n } else {\n breadcrumbDataItem.label = breadcrumbDataItem.labelTemplate.replace('{{' + labelParam + '}}', '');\n }\n }\n }\n });\n this.breadcrumbData = breadcrumbData;\n } else {\n this.breadcrumbData = [];\n }\n }\n}\n","<mat-list class=\"mat-bread-crumb-list\" *ngIf=\"breadcrumbData.length\">\n <mat-list-item>\n <span class=\"mat-bread-crumb-spacer\">\n <span *ngFor=\"let item of breadcrumbData; let i = index\">\n <a *ngIf=\"item?.url\" [routerLink]=\"item?.url\"\n class=\"mat-bread-crumb-list-item\">{{ item.label }}</a>\n <span *ngIf=\"!item?.url\" class=\"mat-bread-crumb-list-item\">{{ item.label }}</span>\n <span *ngIf=\"breadcrumbData.length !== i+1\" class=\"mat-bread-crumb-list-item\">{{symbol}}</span>\n </span>\n </span>\n </mat-list-item>\n</mat-list>\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 ConfirmationWindowData {\n title: string;\n message: string;\n dialogType: DialogType;\n okButtonText?: string\n cancelButtonText?: string;\n yesButtonText?: string;\n noButtonText?: string;\n}\n\nexport interface ConfirmationWindowResult {\n result: ButtonTypes;\n}\n\nexport interface FileUploadData{\n title: string;\n message: string;\n mimeTypes: string;\n fileExtensions: string | null;\n}\n\nexport interface FileUploadResult {\n success: boolean;\n selectedFile: File | null;\n}\n","import {Component, OnInit, inject} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {ButtonTypes, ConfirmationWindowData, ConfirmationWindowResult, DialogType} from \"../models/confirmation\";\n\n@Component({\n selector: 'mm-confirmation-window',\n standalone: false,\n templateUrl: './mm-confirmation-window.component.html',\n styleUrls: ['./mm-confirmation-window.component.css']\n})\nexport class MmConfirmationWindowComponent implements OnInit {\n private readonly dialogRef = inject<MatDialogRef<MmConfirmationWindowComponent>>(MatDialogRef);\n data = inject<ConfirmationWindowData>(MAT_DIALOG_DATA);\n\n button1Text: string;\n button1Result: ButtonTypes;\n button2Text: string | null;\n button2Result: ButtonTypes | null;\n button3Text: string | null;\n button3Result: ButtonTypes | null;\n\n constructor() {\n const data = this.data;\n\n this.button2Text = null;\n this.button2Result = null;\n this.button3Text = null;\n this.button3Result = null;\n\n if (data.dialogType === DialogType.OkCancel) {\n this.button1Text = data.okButtonText ?? 'OK';\n this.button1Result = ButtonTypes.Ok;\n this.button2Text = data.cancelButtonText ?? 'Cancel';\n this.button2Result = ButtonTypes.Cancel;\n } else if (data.dialogType === DialogType.YesNoCancel) {\n this.button1Text = data.yesButtonText ?? 'Yes';\n this.button1Result = ButtonTypes.Yes;\n this.button2Text = data.noButtonText ?? 'No';\n this.button2Result = ButtonTypes.No;\n this.button3Text = data.cancelButtonText ?? 'Cancel';\n this.button3Result = ButtonTypes.Cancel;\n } else if (data.dialogType === DialogType.Ok) {\n this.button1Text = data.okButtonText ?? 'OK';\n this.button1Result = ButtonTypes.Ok;\n } else {\n this.button1Text = data.yesButtonText ?? 'Yes';\n this.button1Result = ButtonTypes.Yes;\n this.button2Text = data.noButtonText ?? 'No';\n this.button2Result = ButtonTypes.No;\n }\n }\n\n ngOnInit(): void {\n }\n\n onButton1(): void {\n this.dialogRef.close(({\n result: this.button1Result\n } as ConfirmationWindowResult));\n }\n\n onButton2(): void {\n this.dialogRef.close(({\n result: this.button2Result\n } as ConfirmationWindowResult));\n }\n\n onButton3(): void {\n this.dialogRef.close(({\n result: this.button3Result\n } as ConfirmationWindowResult));\n }\n}\n","<h1 mat-dialog-title>{{data.title}}</h1>\n<div mat-dialog-content>{{data.message}}</div>\n<div style=\"justify-content: flex-end;\" mat-dialog-actions>\n <button (click)=\"onButton1()\" class=\"primary-button\" mat-flat-button>{{button1Text}}</button>\n <button (click)=\"onButton2()\" *ngIf=\"button2Text\" mat-flat-button>{{button2Text}}</button>\n <button (click)=\"onButton3()\" *ngIf=\"button3Text\" mat-flat-button>{{button3Text}}</button>\n</div>\n","import { Component, OnInit, inject } from '@angular/core';\nimport { MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { Observable } 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: false,\n templateUrl: './mm-progress-window.component.html',\n styleUrls: ['./mm-progress-window.component.css']\n})\nexport class MmProgressWindowComponent implements OnInit {\n data = inject<ProgressWindowData>(MAT_DIALOG_DATA);\n\n public statusText: string | null;\n public progressValue: number;\n\n constructor() {\n const data = this.data;\n\n this.statusText = null;\n this.progressValue = 0;\n\n data.progress.subscribe((value) => {\n this.statusText = value.statusText;\n this.progressValue = value.progressValue;\n });\n }\n\n ngOnInit(): void {}\n\n onCancelClick(): void {\n this.data.cancelOperation();\n }\n}\n","<h1 mat-dialog-title>{{data.title}}</h1>\n<div mat-dialog-content>\n <div>\n <mat-progress-bar *ngIf=\"data.isDeterminate\" [value]=\"progressValue\" mode=\"determinate\"></mat-progress-bar>\n <mat-progress-bar *ngIf=\"!data.isDeterminate\" mode=\"indeterminate\"></mat-progress-bar>\n <p>{{statusText}}</p>\n </div>\n</div>\n<div style=\"justify-content: flex-end;\" mat-dialog-actions>\n <button (click)=\"onCancelClick()\" *ngIf=\"data.isCancelOperationAvailable\" mat-button>Cancel</button>\n</div>\n","// noinspection JSUnusedGlobalSymbols\n\nimport {Injectable, inject} from '@angular/core';\nimport {Observable} from 'rxjs';\nimport {MatDialog} from '@angular/material/dialog';\nimport {map} from 'rxjs/operators';\nimport {MmConfirmationWindowComponent} from \"../mm-confirmation-window/mm-confirmation-window.component\";\nimport {ButtonTypes, ConfirmationWindowData, ConfirmationWindowResult, DialogType} from \"../models/confirmation\";\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ConfirmationService {\n private readonly dialog = inject(MatDialog);\n\n showYesNoConfirmationDialog(title: string, message: string, yesButtonText?: string, noButtonText?: string): Observable<boolean> {\n const dialogRef = this.dialog.open<MmConfirmationWindowComponent, ConfirmationWindowData, ConfirmationWindowResult>(\n MmConfirmationWindowComponent,\n {\n width: '50vw',\n maxWidth: '50vw',\n data: {\n title,\n message,\n yesButtonText,\n noButtonText,\n dialogType: DialogType.YesNo\n } as ConfirmationWindowData\n }\n );\n\n return dialogRef.afterClosed().pipe(map((value) => value?.result === ButtonTypes.Yes));\n }\n\n showYesNoCancelConfirmationDialog(title: string, message: string, yesButtonText?: string, noButtonText?: string, cancelButtonText?: string): Observable<ConfirmationWindowResult | undefined> {\n const dialogRef = this.dialog.open<MmConfirmationWindowComponent, ConfirmationWindowData, ConfirmationWindowResult>(\n MmConfirmationWindowComponent,\n {\n width: '50vw',\n maxWidth: '50vw',\n data: {\n title,\n message,\n yesButtonText,\n noButtonText,\n cancelButtonText,\n dialogType: DialogType.YesNoCancel\n } as ConfirmationWindowData\n }\n );\n\n return dialogRef.afterClosed();\n }\n\n showOkCancelConfirmationDialog(title: string, message: string, okButtonText?: string, cancelButtonText?: string): Observable<boolean> {\n const dialogRef = this.dialog.open<MmConfirmationWindowComponent, ConfirmationWindowData, ConfirmationWindowResult>(\n MmConfirmationWindowComponent,\n {\n width: '50vw',\n maxWidth: '50vw',\n data: {\n title,\n message,\n okButtonText,\n cancelButtonText,\n dialogType: DialogType.OkCancel\n } as ConfirmationWindowData\n }\n );\n\n return dialogRef.afterClosed().pipe(map((value) => value?.result === ButtonTypes.Ok));\n }\n\n showOkDialog(title: string, message: string, okButtonText?: string): Observable<boolean> {\n const dialogRef = this.dialog.open<MmConfirmationWindowComponent, ConfirmationWindowData, ConfirmationWindowResult>(\n MmConfirmationWindowComponent,\n {\n width: '50vw',\n maxWidth: '50vw',\n data: {\n title,\n message,\n okButtonText,\n dialogType: DialogType.Ok\n } as ConfirmationWindowData\n }\n );\n\n return dialogRef.afterClosed().pipe(map((value) => value?.result === ButtonTypes.Ok));\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { ProgressValue } from '../models/progressValue';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MmProgressWindowComponent, ProgressWindowData, ProgressWindowResult } from '../mm-progress-window/mm-progress-window.component';\n\n@Injectable()\nexport class ProgressNotifierService {\n private readonly dialog = inject(MatDialog);\n\n private readonly _currentProgressValue: BehaviorSubject<ProgressValue | null>;\n private currentDialogRef: MatDialogRef<MmProgressWindowComponent, ProgressWindowResult> | null;\n\n constructor() {\n this._currentProgressValue = new BehaviorSubject<ProgressValue | null>(null);\n this.currentDialogRef = null;\n this._isCanceled = false;\n }\n\n private _isCanceled: boolean;\n\n get isCanceled(): boolean {\n return this._isCanceled;\n }\n\n set isCanceled(value) {\n this._isCanceled = value;\n }\n\n start(title: string, isDeterminate: boolean, isCancelOperationAvailable: boolean): void {\n this.isCanceled = false;\n this.reportProgressDeterminate(0, 100, 'Working...');\n\n this.currentDialogRef = this.dialog.open<MmProgressWindowComponent, ProgressWindowData, ProgressWindowResult>(MmProgressWindowComponent, {\n width: '50vw',\n maxWidth: '50vw',\n data: {\n title,\n isDeterminate,\n progress: this._currentProgressValue.asObservable(),\n isCancelOperationAvailable,\n cancelOperation: () => {\n this.reportProgressIndeterminate('Canceling operation...');\n this.isCanceled = true;\n }\n } as ProgressWindowData\n });\n }\n\n reportProgressDeterminate(progressCurrent: number, progressMax: number, statusText: string): void {\n const progressPercentage = progressMax > 0 ? (progressCurrent / progressMax) * 100 : 0;\n\n this._currentProgressValue.next(({\n statusText,\n progressValue: progressPercentage\n } as ProgressValue));\n }\n\n reportProgressIndeterminate(statusText: string): void {\n this._currentProgressValue.next(({\n statusText,\n progressValue: 0\n } as ProgressValue));\n }\n\n complete(): void {\n this.currentDialogRef?.close();\n }\n}\n","import { Component, ElementRef, signal, ViewChild, inject } from \"@angular/core\";\nimport { MAT_DIALOG_DATA, MatDialogRef } from \"@angular/material/dialog\";\nimport { FileUploadData, FileUploadResult } from \"../models/confirmation\";\nimport { MatSnackBar } from \"@angular/material/snack-bar\";\n\n@Component({\n selector: 'mm-mm-file-upload',\n standalone: false,\n templateUrl: './mm-file-upload.component.html',\n styleUrl: './mm-file-upload.component.css'\n})\nexport class MmFileUploadComponent {\n private readonly dialogRef = inject<MatDialogRef<MmFileUploadComponent>>(MatDialogRef);\n protected data = inject<FileUploadData>(MAT_DIALOG_DATA);\n private snackBar = inject(MatSnackBar);\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\n constructor() {\n this.uploadError = false;\n this.uploadSuccess = false;\n }\n\n // Handler for file input change\n onFileChange(event: any): void {\n const file = event.target.files[0] as File | 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.data.mimeTypes.split(',').map((mimeType) => mimeType.trim());\n const allowedFileExtensions = this.data.fileExtensions?.split(',').map((mimeType) => mimeType.trim()) ?? [];\n if (!file) {\n return;\n }\n console.log(\"type: \" + file.type);\n console.log(\"name: \" + file.name);\n const extension = file.name.substring(file.name.lastIndexOf('.')).toLowerCase();\n console.log(\"extension: \" + extension);\n\n if (allowedFileExtensions.includes(extension) || allowedMimeTypes.includes(file.type)) {\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 this.snackBar.open('File type not supported!', 'Close', {\n duration: 3000,\n panelClass: 'error',\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 this.dialogRef.close(({\n success: true,\n selectedFile: this.selectedFile\n } as FileUploadResult));\n }\n\n onCancel(): void {\n this.dialogRef.close(({\n success: false,\n selectedFile: null\n } as FileUploadResult));\n }\n}\n","<h1 mat-dialog-title>{{data.title}}</h1>\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\n type=\"file\"\n accept=\"{{data.fileExtensions}}\"\n (change)=\"onFileChange($event)\"\n hidden\n #fileInput\n />\n <div class=\"file-dropper\" (click)=\"fileInput.click()\">\n <mat-icon class=\"material-symbols-outlined\">upload</mat-icon>\n <p>{{data.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 <mat-icon class=\"material-symbols-outlined delete-icon\" (click)=\"removeFile()\">delete</mat-icon>\n </div>\n </div>\n </div>\n</div>\n<div style=\"justify-content: flex-end;\" mat-dialog-actions>\n <button (click)=\"onOk()\" [disabled]=\"!selectedFile\" mat-flat-button>Upload</button>\n <button (click)=\"onCancel()\" mat-button>Cancel</button>\n</div>\n\n","import { Injectable, inject } from '@angular/core';\nimport { firstValueFrom } from \"rxjs\";\nimport {\n FileUploadData,\n FileUploadResult\n} from \"../models/confirmation\";\nimport { MatDialog } from \"@angular/material/dialog\";\nimport { MmFileUploadComponent } from \"../mm-file-upload/mm-file-upload.component\";\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FileUploadService {\n private readonly dialog = inject(MatDialog);\n\n\n\n async showUploadDialog(title: string, message: string, mimeTypes: string, fileExtensions: string | null = null): Promise<File | null> {\n const dialogRef = this.dialog.open<MmFileUploadComponent, FileUploadData, FileUploadResult>(\n MmFileUploadComponent,\n {\n width: '50vw',\n maxWidth: '50vw',\n data: {\n title,\n message,\n mimeTypes,\n fileExtensions\n } as FileUploadData\n }\n );\n\n const r = await firstValueFrom(dialogRef.afterClosed());\n const success = r?.success ?? false;\n if (success){\n return r?.selectedFile ?? null;\n }\n return null;\n }\n}\n","import { Component, Input } from \"@angular/core\";\nimport {\n MatCell, MatCellDef,\n MatColumnDef,\n MatHeaderCell,\n MatHeaderCellDef,\n MatHeaderRow,\n MatHeaderRowDef,\n MatRow,\n MatRowDef,\n MatTable\n} from \"@angular/material/table\";\nimport { NgForOf } from \"@angular/common\";\n import { MatSort, MatSortHeader } from '@angular/material/sort';\nimport {MatFormFieldModule} from '@angular/material/form-field';\n\n@Component({\n selector: 'mm-table-simple',\n standalone: true,\n imports: [\n MatTable,\n MatColumnDef,\n MatHeaderCell,\n MatCell,\n MatHeaderRow,\n MatRow,\n MatHeaderRowDef,\n MatRowDef,\n MatHeaderCellDef,\n MatCellDef,\n NgForOf,\n MatSort,\n MatSortHeader,\n MatFormFieldModule\n ],\n templateUrl: './mm-table-simple.component.html',\n styleUrl: './mm-table-simple.component.scss'\n})\nexport class MmTableSimpleComponent {\n @Input() sortColumn = '';\n @Input() items: any[] = [];\n @Input() columns: { key: string, header: string }[] = [];\n\n get displayedColumns(): string[] {\n return this.columns.map(col => col.key);\n }\n\n}\n","<div>\n <table mat-table [dataSource]=\"items\" matSort matSortActive=\"{{sortColumn}}\" matSortDirection=\"asc\" matSortDisableClear>\n\n <!-- Dynamic Column Definitions -->\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.key\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{ column.header }}</th>\n <td mat-cell *matCellDef=\"let element\">{{ element[column.key] }}</td>\n </ng-container>\n\n <!-- Header Row -->\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <!-- Data Rows -->\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n</div>\n","import { Component, ElementRef, ViewChild, OnDestroy, OnInit, Output, EventEmitter, inject } from \"@angular/core\";\nimport { MatDialog, MatDialogRef } from \"@angular/material/dialog\";\nimport { QrCodeScannerService } from '@meshmakers/shared-services';\nimport { MatSnackBar } from \"@angular/material/snack-bar\";\nimport { firstValueFrom } from \"rxjs\";\n\n@Component({\n selector: 'mm-qr-code-scanner',\n templateUrl: './mm-qr-scan-window.component.html',\n styleUrls: ['./mm-qr-scan-window.component.css']\n})\nexport class MmQrCodeScannerComponent implements OnInit, OnDestroy {\n @ViewChild('video', { static: true }) videoRef!: ElementRef<HTMLVideoElement>;\n\n @Output() scanComplete = new EventEmitter<string | null>();\n\n //Allows skipping MatDialog for inline usage in eg Telerik\n private dialogRef = inject(MatDialogRef<MmQrCodeScannerComponent>, { optional: true, skipSelf: true });\n private snackBar = inject(MatSnackBar);\n private scannerService = inject(QrCodeScannerService);\n\n scanning = false;\n\n private async checkCameraPermission(): Promise<boolean> {\n if (!navigator.permissions || !navigator.mediaDevices) return true;\n\n try {\n const status = await navigator.permissions.query({ name: 'camera' as PermissionName });\n return status.state !== 'denied';\n\n } catch {\n return true; // fallback for Safari or unsupported browsers\n }\n }\n\n private close(result: string | null) {\n this.scanComplete.emit(result);\n\n if (this.dialogRef) {\n this.dialogRef.close(result);\n }\n }\n\n static open(dialog: MatDialog): Promise<string | null> {\n const ref = dialog.open(MmQrCodeScannerComponent, {\n width: '100%',\n height: '100%',\n panelClass: 'full-screen-dialog',\n disableClose: true\n });\n\n return firstValueFrom(ref.afterClosed());\n }\n\n async ngOnInit() {\n\n const hasPermission = await this.checkCameraPermission();\n\n if (!hasPermission) {\n this.snackBar.open(\n 'Camera access is blocked. Please enable it in your browser settings.',\n 'OK',\n {\n duration: 5000,\n horizontalPosition: 'center',\n verticalPosition: 'top',\n }\n );\n this.close(null);\n return;\n }\n\n const supported = await this.scannerService.isSupported();\n if (!supported) {\n this.snackBar.open(\n 'QR scanning is not supported in this browser.',\n 'OK',\n {\n duration: 5000,\n horizontalPosition: 'center',\n verticalPosition: 'top',\n }\n );\n this.close(null);\n return;\n }\n\n try {\n const result = await this.scannerService.scan(this.videoRef.nativeElement);\n this.close(result); // Return result to parent\n this.scanning = false;\n } catch (err) {\n console.error(\"QR scan error:\", err);\n this.close(null);\n } finally {\n this.scanning = false;\n }\n }\n\n onCancel() {\n this.scannerService.stop();\n this.close(null);\n }\n\n ngOnDestroy() {\n this.scannerService.stop();\n }\n}\n","<div class=\"scanner-container\">\n <video #video autoplay muted playsinline></video>\n <button class=\"close-btn\" (click)=\"onCancel()\">×</button>\n</div>\n","import { ModuleWithProviders, NgModule } from \"@angular/core\";\nimport { CommonModule } from '@angular/common';\nimport { MmNotificationBarComponent } from './mm-notification-bar/mm-notification-bar.component';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MmMessageDetailsComponent } from './mm-message-details/mm-message-details.component';\nimport { MmAutocompleteInputComponent } from './mm-autocomplete-input/mm-autocomplete-input.component';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MmEntitySelectInputComponent } from './mm-entity-select-input/mm-entity-select-input.component';\nimport { MmMultipleEntitySelectInputComponent } from './mm-multiple-entity-select-input/mm-multiple-entity-select-input.component';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatIcon, MatIconModule } from \"@angular/material/icon\";\nimport {MmBreadcrumbComponent} from \"./mm-breadcrumb/mm-breadcrumb.component\";\nimport {MmConfirmationWindowComponent} from \"./mm-confirmation-window/mm-confirmation-window.component\";\nimport {MmProgressWindowComponent} from \"./mm-progress-window/mm-progress-window.component\";\nimport { ConfirmationService } from \"./services/confirmation.service\";\nimport { ProgressNotifierService } from \"./services/progress-notifier.service\";\nimport { FileUploadService } from \"./services/file-upload.service\";\nimport { MmFileUploadComponent } from \"./mm-file-upload/mm-file-upload.component\";\nimport { MatListModule } from \"@angular/material/list\";\nimport { RouterLink } from \"@angular/router\";\nimport { MmTableSimpleComponent } from \"./mm-table-simple/mm-table-simple.component\";\nimport { MatProgressBar } from \"@angular/material/progress-bar\";\nimport { MmQrCodeScannerComponent } from \"./mm-qr-scan-window/mm-qr-scan-window.component\";\n\n@NgModule({\n declarations: [\n MmBreadcrumbComponent,\n MmConfirmationWindowComponent,\n MmProgressWindowComponent,\n MmNotificationBarComponent,\n MmMessageDetailsComponent,\n MmAutocompleteInputComponent,\n MmEntitySelectInputComponent,\n MmMultipleEntitySelectInputComponent,\n MmFileUploadComponent\n ],\n exports: [\n MmBreadcrumbComponent,\n MmConfirmationWindowComponent,\n MmNotificationBarComponent,\n MmAutocompleteInputComponent,\n MmEntitySelectInputComponent,\n MmMultipleEntitySelectInputComponent,\n MmFileUploadComponent,\n MmTableSimpleComponent,\n MmQrCodeScannerComponent\n ],\n imports: [\n CommonModule,\n MatToolbarModule,\n MatButtonModule,\n MatSnackBarModule,\n MatDialogModule,\n MatAutocompleteModule,\n MatInputModule,\n MatProgressSpinnerModule,\n MatChipsModule,\n MatIconModule,\n ReactiveFormsModule,\n MatIcon,\n MatListModule,\n RouterLink,\n MmTableSimpleComponent,\n MatProgressBar,\n MmQrCodeScannerComponent\n ]\n})\nexport class MmSharedUiModule {\n static forRoot(): ModuleWithProviders<MmSharedUiModule> {\n return {\n ngModule: MmSharedUiModule,\n providers: [\n FileUploadService,\n ConfirmationService,\n ProgressNotifierService\n ]\n };\n }\n}\n","import { AbstractControl, ValidatorFn, Validators } from '@angular/forms';\n\nexport type CompareValueFn<TValue> = (value: TValue) => boolean;\n\nfunction isEmptyInputValue(value: any): boolean {\n // we don't check for string here so it also works with arrays\n return value == null || value.length === 0;\n}\n\nexport class CommonValidators {\n public static phoneNumber(): ValidatorFn {\n return Validators.pattern('^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\\\\s\\\\./0-9]*$');\n }\n\n public static httpUri(): ValidatorFn {\n return Validators.pattern(\n '^(http:\\\\/\\\\/|https:\\\\/\\\\/)([a-zA-Z0-9-_]+\\\\.)*[a-zA-Z0-9][a-zA-Z0-9-_]+(\\\\.[a-zA-Z]{2,11}?)*(:[0-9]{2,5}){0,1}\\\\/{0,1}$'\n );\n }\n\n public static ensureSameValue(sourceControlName: string): ValidatorFn {\n return (control: AbstractControl) => {\n const value = control.value;\n return value === control.parent?.get(sourceControlName)?.value ? null : { notSame: true };\n };\n }\n\n public static conditionalRequired<TCompareValue>(\n sourceControlName: string,\n sourceValueCompareExpression: CompareValueFn<TCompareValue>\n ): ValidatorFn {\n return (control: AbstractControl) => {\n if (control.parent != null && sourceValueCompareExpression((control.parent.get(sourceControlName)?.value as TCompareValue))) {\n return isEmptyInputValue(control.value) ? { required: true } : null;\n }\n return null;\n };\n }\n\n public static dependentControls(controlNames: string[]): ValidatorFn {\n return (control: AbstractControl) => {\n controlNames.forEach((controlName) => {\n control.parent?.get(controlName)?.updateValueAndValidity();\n });\n return null;\n };\n }\n}\n","import { FormGroup } from '@angular/forms';\nimport { IsoDateTime } from '@meshmakers/shared-services';\n\nexport abstract class AbstractDetailsComponent<TEntity> {\n private _loading: boolean;\n private readonly _ownerForm: FormGroup;\n private _entity: TEntity | null;\n\n protected constructor(formGroup: FormGroup) {\n this._loading = true;\n this._entity = null;\n this._ownerForm = formGroup;\n }\n\n public get loading(): boolean {\n return this._loading;\n }\n\n public set loading(value: boolean) {\n this._loading = value;\n }\n\n public get entity(): TEntity | null {\n return this._entity;\n }\n\n public set entity(value: TEntity | null) {\n this._entity = value;\n }\n\n public get ownerForm(): FormGroup {\n return this._ownerForm;\n }\n\n public get isLoaded(): boolean {\n return this._entity !== null;\n }\n\n public hasError = (controlName: string, errorName: string): boolean => {\n return this.ownerForm?.controls[controlName].hasError(errorName);\n };\n\n public hasFormError = (errorName: string): boolean => {\n return this.ownerForm?.hasError(errorName);\n };\n\n public updateDateTime(controlName: string): void {\n this.ownerForm?.get(controlName)?.setValue(IsoDateTime.utcToLocalDateTimeIso(IsoDateTime.currentUtcDateTimeIso()));\n }\n\n public copyInputMessage(inputElement: any): void {\n inputElement.select();\n document.execCommand('copy');\n inputElement.setSelectionRange(0, 0);\n }\n\n protected onProgressStarting(): void {\n this._loading = true;\n this.ownerForm?.disable();\n this.ownerForm?.updateValueAndValidity();\n }\n\n protected onProgressCompleted(): void {\n this.ownerForm?.enable();\n this._loading = false;\n }\n}\n","/*\n * Public API Surface of shared-ui\n */\n\nexport * from './lib/mm-shared-ui.module';\nexport * from './lib/mm-notification-bar/mm-notification-bar.component';\nexport * from './lib/mm-autocomplete-input/mm-autocomplete-input.component';\nexport * from './lib/mm-entity-select-input/mm-entity-select-input.component';\nexport * from './lib/mm-multiple-entity-select-input/mm-multiple-entity-select-input.component';\nexport * from './lib/mm-confirmation-window/mm-confirmation-window.component';\nexport * from './lib/mm-breadcrumb/mm-breadcrumb.component';\nexport * from './lib/mm-file-upload/mm-file-upload.component';\nexport * from './lib/mm-table-simple/mm-table-simple.component';\nexport * from './lib/mm-qr-scan-window/mm-qr-scan-window.component';\n\nexport * from './lib/services/confirmation.service';\nexport * from './lib/services/progress-notifier.service';\nexport * from './lib/services/file-upload.service';\n\nexport * from './lib/models/confirmation';\nexport * from './lib/models/commonValidators';\nexport * from './lib/models/abstractDetailsComponent';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i4","i5","i6","i7"],"mappings":"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"}
1
+ {"version":3,"file":"meshmakers-shared-ui.mjs","sources":["../../../../projects/meshmakers/shared-ui/src/lib/svg-icons.ts","../../../../projects/meshmakers/shared-ui/src/lib/models/confirmation.ts","../../../../projects/meshmakers/shared-ui/src/lib/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/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/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.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 ConfirmationWindowData {\n title: string;\n message: string;\n dialogType: DialogType;\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: any): void {\n const file = event.target.files[0] as File | 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 if (this.data.dialogType === DialogType.OkCancel) {\n this.button1Text = 'OK';\n this.button1Result = ButtonTypes.Ok;\n this.button2Text = 'Cancel';\n this.button2Result = ButtonTypes.Cancel;\n } else if (this.data.dialogType === DialogType.YesNoCancel) {\n this.button1Text = 'Yes';\n this.button1Result = ButtonTypes.Yes;\n this.button2Text = 'No';\n this.button2Result = ButtonTypes.No;\n this.button3Text = 'Cancel';\n this.button3Result = ButtonTypes.Cancel;\n } else if (this.data.dialogType === DialogType.Ok) {\n this.button1Text = 'OK';\n this.button1Result = ButtonTypes.Ok;\n } else {\n this.button1Text = 'Yes';\n this.button1Result = ButtonTypes.Yes;\n this.button2Text = '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 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): Promise<boolean> {\n\n const dialogRef = this.openDialog(title, message, DialogType.YesNo);\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): Promise<ConfirmationWindowResult | undefined> {\n\n const dialogRef = this.openDialog(title, message, DialogType.YesNoCancel);\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) {\n const dialogRef: DialogRef = this.dialogService.open({\n title,\n content: ConfirmationWindowComponent\n });\n\n const component = dialogRef.content.instance as ConfirmationWindowComponent;\n component.data = {\n title,\n message,\n dialogType: dialogType\n } as ConfirmationWindowData\n return dialogRef;\n }\n}\n","export class InputDialogResult {\n newValue: any;\n\n constructor(newValue: any) {\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: any | 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\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 { CommonModule } from '@angular/common';\nimport { DialogRef, DialogModule } from '@progress/kendo-angular-dialog';\nimport { ButtonModule } from '@progress/kendo-angular-buttons';\nimport { TextAreaModule } from '@progress/kendo-angular-inputs';\nimport { FormsModule } from '@angular/forms';\nimport { copyIcon, xIcon } from '@progress/kendo-svg-icons';\n\nexport interface MessageDetailsDialogData {\n title: string;\n details: string;\n level: 'error' | 'warning';\n}\n\n@Component({\n selector: 'mm-message-details-dialog',\n standalone: true,\n imports: [\n CommonModule,\n DialogModule,\n ButtonModule,\n TextAreaModule,\n FormsModule\n ],\n template: `\n <div class=\"message-details-content\">\n <div class=\"dialog-header\">\n <h3>{{dialogTitle}}</h3>\n </div>\n\n <div class=\"details-section\">\n <label class=\"details-label\">Details:</label>\n <textarea\n kendoTextArea\n [(ngModel)]=\"details\"\n [readonly]=\"true\"\n class=\"details-textarea\">\n </textarea>\n </div>\n\n <div class=\"dialog-actions\">\n <button\n kendoButton\n [svgIcon]=\"copyIcon\"\n themeColor=\"primary\"\n (click)=\"copyToClipboard()\">\n Copy to Clipboard\n </button>\n <button\n kendoButton\n [svgIcon]=\"xIcon\"\n themeColor=\"base\"\n (click)=\"onClose()\">\n Close\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: 20px;\n box-sizing: border-box;\n overflow: hidden;\n }\n\n .dialog-header {\n flex-shrink: 0;\n border-bottom: 1px solid var(--kendo-color-border);\n padding-bottom: 12px;\n margin-bottom: 16px;\n }\n\n .dialog-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n }\n\n .details-section {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-height: 0; /* Important for flex child with overflow */\n overflow: hidden;\n }\n\n .details-label {\n flex-shrink: 0;\n font-weight: 600;\n font-size: 14px;\n }\n\n .details-textarea {\n flex: 1;\n font-family: 'Courier New', monospace;\n font-size: 13px;\n resize: none;\n border: 1px solid var(--kendo-color-border);\n background: var(--kendo-color-base-subtle);\n border-radius: 4px;\n padding: 12px;\n line-height: 1.5;\n width: 100%;\n box-sizing: border-box;\n overflow-y: auto;\n overflow-x: auto;\n white-space: pre-wrap;\n word-wrap: break-word;\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 /* Ensure proper scrollbar styling */\n .details-textarea::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n }\n\n .details-textarea::-webkit-scrollbar-track {\n background: var(--kendo-color-base-subtle);\n border-radius: 4px;\n }\n\n .details-textarea::-webkit-scrollbar-thumb {\n background: var(--kendo-color-base-subtle);\n border-radius: 4px;\n }\n\n .details-textarea::-webkit-scrollbar-thumb:hover {\n background: var(--kendo-color-base-subtle);\n }\n `]\n})\nexport class MessageDetailsDialogComponent implements OnInit {\n protected readonly copyIcon = copyIcon;\n protected readonly xIcon = xIcon;\n\n private readonly dialogRef = inject(DialogRef);\n\n // These will be injected by the dialog service\n public data!: MessageDetailsDialogData;\n public title = '';\n public details = '';\n public level: 'error' | 'warning' = 'error';\n\n ngOnInit(): void {\n // Data is injected by the dialog service\n if (this.data) {\n this.title = this.data.title;\n this.details = this.data.details;\n this.level = this.data.level;\n }\n }\n\n get dialogTitle(): string {\n const levelText = this.level === 'error' ? 'Error' : 'Warning';\n return `${levelText} Details: ${this.title}`;\n }\n\n onClose(): void {\n this.dialogRef.close();\n }\n\n async copyToClipboard(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.details);\n\n // Could show a brief success message here\n console.log('Details copied to clipboard');\n\n // Optionally show a brief success indication\n // this.showSuccessIndicator();\n } catch (error) {\n console.error('Failed to copy to clipboard:', error);\n\n // Fallback for older browsers\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 console.log('Details copied to clipboard (fallback)');\n } catch (error) {\n console.error('Fallback copy failed:', error);\n } finally {\n document.body.removeChild(textarea);\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { DialogService, DialogRef } from '@progress/kendo-angular-dialog';\nimport { MessageDetailsDialogComponent, MessageDetailsDialogData } from './message-details-dialog.component';\n\n@Injectable()\nexport class MessageDetailsDialogService {\n private readonly dialogService = inject(DialogService);\n\n /**\n * Opens a modal dialog to show message details with copy-to-clipboard functionality\n */\n showDetailsDialog(data: MessageDetailsDialogData): DialogRef {\n const dialogRef = this.dialogService.open({\n content: MessageDetailsDialogComponent,\n actions: [], // Actions are handled by the component itself\n minWidth: 700,\n maxWidth: 900,\n width: '70%',\n minHeight: 400,\n maxHeight: '80vh',\n height: '60vh'\n });\n\n // Pass data to the component instance\n if (dialogRef.content.instance) {\n dialogRef.content.instance.data = data;\n }\n\n return dialogRef;\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 {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 { Directive, OnDestroy, OnInit, inject } from \"@angular/core\";\nimport {DataBindingDirective, GridComponent} from \"@progress/kendo-angular-grid\";\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\n super(grid);\n this._serviceSubscription = null;\n this._executeFilterSubscription = null;\n this._fetchAgainSubscription = null;\n this._refreshDataSubscription = null;\n }\n\n public override async ngOnInit(): Promise<void> {\n super.ngOnInit();\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 public override rebind(): void {\n try {\n if (!this.dataSource) {\n return;\n }\n this.grid.loading = true;\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.grid.loading = false;\n this.dataSource.setLoading(false);\n this.grid.data = {\n data: value?.data || [],\n total: value?.totalCount || 0\n }\n this.notifyDataChange();\n },\n error: () => {\n this.grid.loading = false;\n this.dataSource.setLoading(false);\n }\n });\n } catch {\n this.grid.loading = false;\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 { Component, EventEmitter, Input, Output, ViewChild, inject, OnDestroy, AfterViewInit, ChangeDetectorRef } from '@angular/core';\nimport {\n CellClickEvent,\n CellTemplateDirective, CheckboxColumnComponent,\n ColumnComponent, CommandColumnComponent, ExcelModule,\n GridComponent,\n GridSpacerComponent, PageChangeEvent,\n PagerSettings, PDFModule, SelectableSettings, SelectionEvent,\n ToolbarTemplateDirective\n} from '@progress/kendo-angular-grid';\nimport {ColumnDefinition, ContextMenuType, StatusFieldConfig, StatusIconMapping, TableColumn} from './list-view.model';\nimport {DatePipe} from '@angular/common';\nimport {PascalCasePipe} from '../pipes/pascal-case.pipe';\nimport {SeparatorComponent, TextBoxComponent, CheckBoxComponent} 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} 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 {Subject} from 'rxjs';\nimport {debounceTime, distinctUntilChanged, 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 TextBoxComponent,\n GridSpacerComponent,\n ExcelModule,\n PDFModule,\n ButtonComponent,\n CommandColumnComponent,\n CellTemplateDirective,\n ContextMenuComponent,\n HierarchyBindingDirective,\n CheckboxColumnComponent,\n CheckBoxComponent,\n SeparatorComponent,\n DatePipe,\n BytesToSizePipe,\n SVGIconModule\n ],\n templateUrl: './list-view.component.html',\n styleUrl: './list-view.component.scss'\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: any[] = [];\n // action menu (button)\n private _actionMenuSelectedRow: any | null = null;\n\n // context menu (right click)\n private _contextMenuSelectedRow: any | 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 = 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<any[]>();\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 @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 private readonly cdr = inject(ChangeDetectorRef);\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 if (this.dataBindingDirective) {\n this.dataBindingDirective.isLoading$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(loading => {\n // Use setTimeout to defer the update to the next tick,\n // avoiding ExpressionChangedAfterItHasBeenCheckedError\n setTimeout(() => {\n this.isLoading = loading;\n this.cdr.markForCheck();\n });\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): boolean {\n return CommandBaseService.getIsDisabled(commandItem);\n }\n\n protected getValue(element:any, column: TableColumn): any {\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 = element;\n for(const key of keys) {\n if (value === null || value === undefined) {\n return undefined;\n }\n value = value[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 '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: any, 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[value] ?? null;\n }\n\n /**\n * Helper to get a field value from a data item, supporting nested fields.\n */\n private getFieldValue(element: any, field: string): any {\n if (field.indexOf('.') === -1) {\n return element[field];\n }\n const keys = field.split('.');\n let value = element;\n for (const key of keys) {\n if (value === null || value === undefined) {\n return null;\n }\n value = value[key];\n }\n return value;\n }\n\n /**\n * Gets the human-readable description of a cron expression.\n */\n protected getCronHumanReadable(expression: string): string {\n if (!expression) return '';\n return this.cronHumanizer.toHumanReadable(expression, 'en');\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<any>();\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: any, 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 onContextMenu(dataItem: any, e: PointerEvent) {\n\n this._actionMenuSelectedRow = dataItem;\n this.gridContextMenu?.show({\n left: e.pageX,\n top: e.pageY,\n });\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 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 readonly moreVerticalIcon = moreVerticalIcon;\n\n\n}\n","<kendo-grid\n mmListViewDataBinding\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>\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.svgIcon) {\n <button kendoTooltip kendoButton [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 [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 <kendo-textbox\n [style.width.px]=\"165\"\n placeholder=\"Search in all columns...\"\n [value]=\"searchValue\"\n [disabled]=\"isLoading\"\n (valueChange)=\"onFilter($event)\"\n ></kendo-textbox>\n }\n\n @for (commandItem of rightToolbarActions; track commandItem.id) {\n @if (commandItem) {\n @switch (commandItem.type) {\n @case ('link') {\n @if (commandItem.svgIcon) {\n <button kendoTooltip kendoButton [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 [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 [svgIcon]=\"filterIcon\" (click)=\"onShowRowFilter()\"\n [disabled]=\"isLoading\" title=\"Show Row Filter\"></button>\n }\n <button kendoTooltip kendoGridExcelCommand [svgIcon]=\"excelSVG\" [disabled]=\"isLoading\" title=\"Export to Excel\"></button>\n <button kendoTooltip kendoGridPDFCommand [svgIcon]=\"pdfSVG\" [disabled]=\"isLoading\" title=\"Export to PDF\"></button>\n <button kendoTooltip kendoButton [svgIcon]=\"refreshIcon\" (click)=\"onRefresh()\" [disabled]=\"isLoading\" title=\"Refresh Data\"></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 [title]=\"getDisplayName(column) | pascalCase\">\n <ng-template kendoGridCellTemplate let-dataItem>\n @switch (column.dataType) {\n @case ('boolean') {\n <kendo-checkbox type=\"checkbox\" [checkedState]=\"getValue(dataItem, column)\" [disabled]=\"true\" />\n }\n @case ('iso8601') {\n {{ getValue(dataItem, column) | date:column.format }}\n }\n @case ('bytes') {\n {{ 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 @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=\"Actions\" [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) {\n <button\n type=\"button\"\n class=\"k-button k-button-md k-rounded-md k-button-solid k-button-solid-base\"\n [title]=\"menuItem.text ?? ''\"\n [disabled]=\"(menuItem.disabled ?? false) || isLoading\"\n (click)=\"onSelectOptionActionItem($event, dataItem, menuItem)\">\n @if (menuItem.svgIcon) {\n <kendo-svg-icon [icon]=\"menuItem.svgIcon\"></kendo-svg-icon>\n }\n </button>\n }\n }\n }\n\n @if (_contextMenuItems.length > 0 && contextMenuType == 'actionMenu') {\n <button kendoButton [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 Page {{ pageNum }} of {{ 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\" (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 { 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<any[]> = new BehaviorSubject<any[]>([]);\n private _isViewInitialized = false;\n protected expandedKeys: any[] = [];\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<any>()\n @Output()nodeClick = new EventEmitter<any>()\n @Output()nodeDoubleClick = new EventEmitter<any>()\n @Output()nodeDrop = new EventEmitter<NodeDroppedEvent<any>>()\n @Output()expand = new EventEmitter<any>()\n @Output()collapse = new EventEmitter<any>()\n\n protected get rootNodes(): Observable<any[]> {\n return this._rootNodes;\n }\n\n protected hasChildren = (item: any) => this.dataSource?.hasChildren(item) ?? false;\n protected isExpanded = (item: any, _index: string) => this.expandedKeys.includes(item.id);\n protected fetchChildren = (item: any) : Observable<any[]> => from(this.dataSource?.fetchChildren(item) ?? []);\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: any) {\n console.debug('🌳 Node expanded:', event.dataItem?.text || event.dataItem);\n this.expand.emit(event.dataItem);\n }\n\n protected onCollapse(event: any) {\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(): any[] {\n return this.expandedKeys;\n }\n\n public collapseAll(): void {\n this.expandedKeys = [];\n }\n\n public setExpandedKeys(keys: any[]): 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 * 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/**\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, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormGroup } from '@angular/forms';\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\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 showLoadingOverlay?: 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\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 @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.title) return this.config.title;\n if (this.config.isViewMode) return 'View Details';\n return this.config.isEditMode ? 'Edit' : 'New';\n }\n\n protected get saveButtonText(): string {\n if (this.config.saveButtonText) return this.config.saveButtonText;\n if (this.config.isSaving) return 'Saving...';\n return this.config.isEditMode ? 'Update' : 'Create';\n }\n\n protected get cancelButtonText(): string {\n if (this.config.cancelButtonText) return this.config.cancelButtonText;\n return this.config.isViewMode ? 'Back' : 'Cancel';\n }\n\n protected get showSaveButton(): boolean {\n return !this.config.isViewMode && !this.config.isLoading;\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\" class=\"mm-form-title-row mm-form-title-standalone\">\n <h2 class=\"mm-form-title\">{{ title }}</h2>\n <span *ngIf=\"config.hasChanges\" class=\"mm-modified-badge\">Unsaved Changes</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\" class=\"mm-form-header\">\n <h2 class=\"mm-form-title\">{{ title }}</h2>\n <span *ngIf=\"config.hasChanges\" class=\"mm-modified-badge\">Unsaved Changes</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>Loading...</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 ? 'MODIFIED' : 'READY' }}</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 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, 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 = any> 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: TreeItemDataTyped<T>): void {\n this.selectedNode = treeItem;\n this.nodeSelected.emit(treeItem);\n }\n\n protected onNodeDrop(event: NodeDroppedEvent<T>): void {\n this.nodeDropped.emit(event);\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(): any[] {\n return this.treeComponent.getExpandedKeys();\n }\n\n public collapseAll(): void {\n this.treeComponent.collapseAll();\n }\n\n public setExpandedKeys(keys: any[]): 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 {\n get data(): any;\n\n get totalCount(): number;\n}\n\nexport class FetchResultBase implements FetchResult {\n public constructor(\n private readonly _data: any,\n private readonly _totalCount: number,\n ) {\n }\n\n public get data(): any {\n return this._data;\n }\n\n public get totalCount(): number {\n return this._totalCount;\n }\n}\n\nexport class FetchResultTyped<TDto> implements FetchResult {\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 { Component, Input, inject, OnInit, OnDestroy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DialogContentBase, DialogRef, DialogModule } 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} from '@progress/kendo-angular-grid';\nimport { TextBoxComponent } from '@progress/kendo-angular-inputs';\nimport { Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport { EntitySelectDialogDataSource, EntitySelectDialogResult } 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 DialogModule,\n GridComponent,\n ColumnComponent,\n CheckboxColumnComponent,\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=\"Search...\"\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-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 }} selected\n </div>\n </div>\n\n <kendo-dialog-actions>\n <button kendoButton (click)=\"onCancel()\">Cancel</button>\n <button kendoButton\n themeColor=\"primary\"\n [disabled]=\"selectedEntities.length === 0\"\n (click)=\"onConfirm()\">\n OK\n </button>\n </kendo-dialog-actions>\n `,\n styles: [`\n .entity-select-dialog-content {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 400px;\n box-sizing: border-box;\n }\n\n .search-toolbar {\n padding: 8px 0 16px 0;\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})\nexport class EntitySelectDialogComponent<T> extends DialogContentBase implements OnInit, OnDestroy {\n private readonly dialogRef: DialogRef;\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 columns: TableColumn[] = [];\n gridData: { data: T[]; total: number } = { data: [], total: 0 };\n selectedEntities: T[] = [];\n selectedKeys: any[] = [];\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 constructor() {\n const dialogRef = inject(DialogRef);\n super(dialogRef);\n this.dialogRef = dialogRef;\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.dialogRef.close(result);\n }\n\n onCancel(): void {\n this.dialogRef.close(null);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { DialogService } 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';\n\n@Injectable()\nexport class EntitySelectDialogService {\n private readonly dialogService = inject(DialogService);\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 dialogRef = this.dialogService.open({\n title: options.title,\n content: EntitySelectDialogComponent,\n width: options.width ?? 800,\n height: options.height ?? 600\n });\n\n const component = dialogRef.content.instance as EntitySelectDialogComponent<T>;\n component.dataSource = dataSource;\n component.multiSelect = options.multiSelect ?? false;\n component.preSelectedEntities = options.selectedEntities ?? [];\n\n const result = await firstValueFrom(dialogRef.result);\n\n if (result instanceof 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 {EntitySelectDialogDataSource} 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\"\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 No entities found for \"{{ searchFormControl.value }}\"\n </span>\n <span *ngIf=\"!isLoading && (!searchFormControl.value || searchFormControl.value.length < minSearchLength)\">\n Type at least {{ minSearchLength }} characters to search...\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 }}</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 [svgIcon]=\"searchIcon\"\n [disabled]=\"disabled\"\n [title]=\"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 @Input() dataSource!: EntitySelectDataSource<any>;\n @Input() placeholder = 'Select an entity...';\n @Input() minSearchLength = 3;\n @Input() maxResults = 50;\n @Input() debounceMs = 300;\n @Input() prefix = '';\n\n // Dialog inputs\n @Input() dialogDataSource?: EntitySelectDialogDataSource<any>;\n @Input() dialogTitle = 'Select Entity';\n @Input() multiSelect = false;\n @Input() advancedSearchLabel = 'Advanced Search...';\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 @Output() entitySelected = new EventEmitter<any>();\n @Output() entityCleared = new EventEmitter<void>();\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: any = null;\n public isLoading = false;\n private entityMap = new Map<string, any>();\n\n // Private members\n private searchSubject = new Subject<string>();\n private destroy$ = new Subject<void>();\n private onChange: (value: any) => 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 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: any): 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: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): 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: any): 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: any): 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: any): 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,\n multiSelect: this.multiSelect,\n selectedEntities: this.selectedEntity ? [this.selectedEntity] : []\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} selected`;\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} 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 // 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 result = await this.confirmationService.showYesNoCancelConfirmationDialog(\n 'Unsaved Changes',\n 'You have unsaved changes. Do you want to save before leaving?'\n );\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 confirmed = await this.confirmationService.showYesNoConfirmationDialog(\n 'Unsaved Changes',\n 'You have unsaved changes. Are you sure you want to leave? Your changes will be lost.'\n );\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 any)?.instance?.options as SaveAsDialogOptions;\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 if ((dialogRef.content as any)?.instance) {\n (dialogRef.content as any).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' | '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 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 relativeValue?: string;\n relativeUnit?: string;\n customFrom?: string;\n customTo?: string;\n // Type labels\n typeYear?: string;\n typeQuarter?: string;\n typeMonth?: 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 relativeValue: 'Last',\n relativeUnit: 'Unit',\n customFrom: 'From',\n customTo: 'To',\n typeYear: 'Year',\n typeQuarter: 'Quarter',\n typeMonth: 'Month',\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 */\n static getYearRange(year: number): TimeRange {\n return {\n from: new Date(year, 0, 1, 0, 0, 0, 0),\n to: new Date(year, 11, 31, 23, 59, 59, 999)\n };\n }\n\n /**\n * Calculate time range for a specific quarter\n */\n static getQuarterRange(year: number, quarter: Quarter): TimeRange {\n const startMonth = (quarter - 1) * 3;\n const endMonth = startMonth + 2;\n return {\n from: new Date(year, startMonth, 1, 0, 0, 0, 0),\n to: new Date(year, endMonth + 1, 0, 23, 59, 59, 999) // Last day of end month\n };\n }\n\n /**\n * Calculate time range for a specific month\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, 0, 23, 59, 59, 999) // Last day of month\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 */\n static getTimeRangeFromSelection(selection: TimeRangeSelection): 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 '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 return {\n from: selection.customFrom,\n to: selection.customTo\n };\n }\n break;\n }\n return null;\n }\n\n /**\n * Convert TimeRange to ISO 8601 format\n */\n static toISO(range: TimeRange): TimeRangeISO {\n return {\n from: range.from.toISOString(),\n to: range.to.toISOString()\n };\n }\n\n /**\n * Get current quarter (1-4)\n */\n static getCurrentQuarter(): Quarter {\n return (Math.floor(new Date().getMonth() / 3) + 1) as Quarter;\n }\n\n /**\n * Generate year options\n */\n static generateYearOptions(minYear: number, maxYear: number): TimeRangeOption<number>[] {\n const options: TimeRangeOption<number>[] = [];\n for (let year = maxYear; year >= minYear; year--) {\n options.push({ value: year, label: year.toString() });\n }\n return options;\n }\n\n /**\n * Generate month options\n */\n static generateMonthOptions(): TimeRangeOption<number>[] {\n const months = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n ];\n return months.map((label, index) => ({ value: index, label }));\n }\n\n /**\n * Generate quarter options with custom labels\n */\n static generateQuarterOptions(labels: TimeRangePickerLabels): TimeRangeOption<Quarter>[] {\n return [\n { value: 1, label: labels.quarter1 || 'Q1' },\n { value: 2, label: labels.quarter2 || 'Q2' },\n { value: 3, label: labels.quarter3 || 'Q3' },\n { value: 4, label: labels.quarter4 || 'Q4' }\n ];\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnChanges,\n SimpleChanges,\n signal,\n computed\n} 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 relativeValue = signal<number>(24);\n protected relativeUnit = signal<RelativeTimeUnit>('hours');\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: '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 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 relativeValue: this.relativeValue(),\n relativeUnit: this.relativeUnit(),\n customFrom: this.customFrom(),\n customTo: this.customTo()\n };\n return TimeRangeUtils.getTimeRangeFromSelection(selection);\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.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.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 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 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 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 types) -->\n @if (isType('year') || isType('quarter') || isType('month')) {\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')) {\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 <!-- 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/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';\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","i3","i2","i1.UnsavedChangesDirective","i5","i4","i6"],"mappings":"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"}