@meshmakers/shared-ui 3.3.34 → 3.3.390

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.
@@ -0,0 +1,1644 @@
1
+ import * as i0 from '@angular/core';
2
+ import { OnDestroy, AfterViewInit, EventEmitter, ElementRef, OnInit, InjectionToken, PipeTransform, OnChanges, SimpleChanges, EnvironmentProviders } from '@angular/core';
3
+ import { FormGroup, ControlValueAccessor, Validator, FormControl, AbstractControl, ValidationErrors } from '@angular/forms';
4
+ import * as _progress_kendo_svg_icons from '@progress/kendo-svg-icons';
5
+ import { SVGIcon } from '@progress/kendo-svg-icons';
6
+ import { CommandBaseService, CommandItem, TreeItemData, TreeItemDataTyped, EntitySelectDataSource } from '@meshmakers/shared-services';
7
+ import { TreeViewComponent, TreeItem, NodeClickEvent, TreeItemDropEvent } from '@progress/kendo-angular-treeview';
8
+ import { Observable } from 'rxjs';
9
+ import * as _meshmakers_shared_ui from '@meshmakers/shared-ui';
10
+ import { State } from '@progress/kendo-data-query/dist/npm/state';
11
+ import { PagerSettings, SelectableSettings, SelectionEvent, PageChangeEvent, CellClickEvent, DataBindingDirective } from '@progress/kendo-angular-grid';
12
+ import { SVGIcon as SVGIcon$1 } from '@progress/kendo-svg-icons/dist/svg-icon.interface';
13
+ import { MenuItem, ContextMenuComponent, ContextMenuSelectEvent, ContextMenuPopupEvent } from '@progress/kendo-angular-menu';
14
+ import { DialogContentBase, DialogRef } from '@progress/kendo-angular-dialog';
15
+ import { AutoCompleteComponent } from '@progress/kendo-angular-dropdowns';
16
+ import { CanDeactivate } from '@angular/router';
17
+
18
+ /**
19
+ * Mapping configuration for a single status value to its visual representation
20
+ */
21
+ interface StatusIconMapping {
22
+ /** The Kendo SVG icon to display */
23
+ icon: SVGIcon;
24
+ /** Tooltip text shown on hover */
25
+ tooltip: string;
26
+ /** Optional CSS color for the icon (e.g., 'green', '#28a745', 'var(--success-color)') */
27
+ color?: string;
28
+ }
29
+ /**
30
+ * Maps enum/status values to their icon representations
31
+ * Key is the enum value (e.g., 'OK', 'MAINTENANCE'), value is the visual config
32
+ */
33
+ type StatusMapping = Record<string, StatusIconMapping>;
34
+ /**
35
+ * Configuration for a single field in a multi-field status icons column
36
+ */
37
+ interface StatusFieldConfig {
38
+ /** The field name in the data object */
39
+ field: string;
40
+ /** Mapping of field values to icons */
41
+ statusMapping: StatusMapping;
42
+ }
43
+ interface TableColumn {
44
+ displayName?: string | null;
45
+ field: string;
46
+ dataType?: 'text' | 'numeric' | 'boolean' | 'date' | 'iso8601' | 'bytes' | 'statusIcons' | 'cronExpression';
47
+ format?: any;
48
+ /**
49
+ * Column width in pixels. If not set, the column will auto-size.
50
+ */
51
+ width?: number;
52
+ /**
53
+ * Status mapping for single-field statusIcons columns.
54
+ * Use this when the column displays icons for a single field.
55
+ */
56
+ statusMapping?: StatusMapping;
57
+ /**
58
+ * Configuration for multi-field statusIcons columns.
59
+ * Use this when multiple fields should be displayed as icons in a single column.
60
+ * When set, 'field' is ignored and each entry in 'statusFields' defines its own field.
61
+ */
62
+ statusFields?: StatusFieldConfig[];
63
+ /**
64
+ * Whether sorting is enabled for this column.
65
+ * When not set, inherits from the grid-level sortable setting.
66
+ * Set to false to disable sorting for computed or client-side-only columns.
67
+ */
68
+ sortable?: boolean;
69
+ }
70
+ type ColumnDefinition = string | TableColumn;
71
+ type ContextMenuType = 'contextMenu' | 'actionMenu';
72
+
73
+ declare class ListViewComponent extends CommandBaseService implements OnDestroy, AfterViewInit {
74
+ private readonly cronHumanizer;
75
+ protected _columns: TableColumn[];
76
+ private _actionCommandItems;
77
+ private _contextMenuCommandItems;
78
+ private searchSubject;
79
+ private destroy$;
80
+ protected searchValue: string;
81
+ private _selectedRows;
82
+ private _actionMenuSelectedRow;
83
+ private _contextMenuSelectedRow;
84
+ protected _actionMenuItems: MenuItem[];
85
+ protected _contextMenuItems: MenuItem[];
86
+ protected _showRowFilter: boolean;
87
+ /** Indicates if the data source is currently loading data */
88
+ protected isLoading: boolean;
89
+ private gridComponent?;
90
+ private dataBindingDirective?;
91
+ gridContextMenu?: ContextMenuComponent;
92
+ rowClicked: EventEmitter<any[]>;
93
+ pageSize: number;
94
+ skip: number;
95
+ rowIsClickable: boolean;
96
+ showRowCheckBoxes: boolean;
97
+ showRowSelectAllCheckBox: boolean;
98
+ contextMenuType: ContextMenuType;
99
+ leftToolbarActions: CommandItem[];
100
+ rightToolbarActions: CommandItem[];
101
+ get actionCommandItems(): CommandItem[];
102
+ set actionCommandItems(commandItems: CommandItem[]);
103
+ get contextMenuCommandItems(): CommandItem[];
104
+ set contextMenuCommandItems(commandItems: CommandItem[]);
105
+ excelExportFileName: string;
106
+ pdfExportFileName: string;
107
+ pageable: PagerSettings;
108
+ sortable: boolean;
109
+ rowFilterEnabled: boolean;
110
+ searchTextBoxEnabled: boolean;
111
+ selectable: SelectableSettings;
112
+ set columns(cols: ColumnDefinition[]);
113
+ get columns(): TableColumn[];
114
+ private readonly cdr;
115
+ constructor();
116
+ ngAfterViewInit(): void;
117
+ ngOnDestroy(): void;
118
+ protected getDisplayName(column: TableColumn): string;
119
+ protected getIsDisabled(commandItem: CommandItem): boolean;
120
+ protected getValue(element: any, column: TableColumn): any;
121
+ protected getFilterType(column: TableColumn): 'text' | 'numeric' | 'boolean' | 'date';
122
+ /**
123
+ * Gets all status field configurations for a statusIcons column.
124
+ * Returns an array of StatusFieldConfig, whether the column uses single or multi-field configuration.
125
+ */
126
+ protected getStatusFields(column: TableColumn): StatusFieldConfig[];
127
+ /**
128
+ * Gets the status icon mapping for a specific field value in a data item.
129
+ */
130
+ protected getStatusIconMapping(dataItem: any, fieldConfig: StatusFieldConfig): StatusIconMapping | null;
131
+ /**
132
+ * Helper to get a field value from a data item, supporting nested fields.
133
+ */
134
+ private getFieldValue;
135
+ /**
136
+ * Gets the human-readable description of a cron expression.
137
+ */
138
+ protected getCronHumanReadable(expression: string): string;
139
+ protected onShowRowFilter(): void;
140
+ protected onRefresh(): void;
141
+ onExecuteFilter: EventEmitter<any>;
142
+ onRefreshData: EventEmitter<void>;
143
+ protected onFilter(value: string | null): Promise<void>;
144
+ protected readonly filterIcon: SVGIcon$1;
145
+ protected readonly pdfSVG: SVGIcon$1;
146
+ protected readonly excelSVG: SVGIcon$1;
147
+ protected readonly refreshIcon: SVGIcon$1;
148
+ protected onRowSelect(event: SelectionEvent): void;
149
+ protected onPageChange(_event: PageChangeEvent): void;
150
+ protected onContextMenuSelect(_event: ContextMenuSelectEvent): Promise<void>;
151
+ protected onCellClick(e: CellClickEvent): void;
152
+ protected onSelectOptionActionItem(event: Event, dataItem: any, menuItem: MenuItem): Promise<void>;
153
+ protected onContextMenu(dataItem: any, e: PointerEvent): void;
154
+ protected onContextMenuClosed(_event: ContextMenuPopupEvent): void;
155
+ protected onToolbarCommand(commandItem: CommandItem): Promise<void>;
156
+ private buildMenuItems;
157
+ protected readonly moreVerticalIcon: SVGIcon$1;
158
+ static ɵfac: i0.ɵɵFactoryDeclaration<ListViewComponent, never>;
159
+ static ɵcmp: i0.ɵɵComponentDeclaration<ListViewComponent, "mm-list-view", never, { "pageSize": { "alias": "pageSize"; "required": false; }; "skip": { "alias": "skip"; "required": false; }; "rowIsClickable": { "alias": "rowIsClickable"; "required": false; }; "showRowCheckBoxes": { "alias": "showRowCheckBoxes"; "required": false; }; "showRowSelectAllCheckBox": { "alias": "showRowSelectAllCheckBox"; "required": false; }; "contextMenuType": { "alias": "contextMenuType"; "required": false; }; "leftToolbarActions": { "alias": "leftToolbarActions"; "required": false; }; "rightToolbarActions": { "alias": "rightToolbarActions"; "required": false; }; "actionCommandItems": { "alias": "actionCommandItems"; "required": false; }; "contextMenuCommandItems": { "alias": "contextMenuCommandItems"; "required": false; }; "excelExportFileName": { "alias": "excelExportFileName"; "required": false; }; "pdfExportFileName": { "alias": "pdfExportFileName"; "required": false; }; "pageable": { "alias": "pageable"; "required": false; }; "sortable": { "alias": "sortable"; "required": false; }; "rowFilterEnabled": { "alias": "rowFilterEnabled"; "required": false; }; "searchTextBoxEnabled": { "alias": "searchTextBoxEnabled"; "required": false; }; "selectable": { "alias": "selectable"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; }, { "rowClicked": "rowClicked"; }, never, never, true, never>;
160
+ }
161
+
162
+ declare class UploadFileDialogComponent extends DialogContentBase {
163
+ private readonly dialogRef;
164
+ private readonly notificationService;
165
+ message: string;
166
+ mimeTypes: string | null;
167
+ fileExtensions: string | null;
168
+ protected fileName: i0.WritableSignal<string>;
169
+ protected fileSize: i0.WritableSignal<number>;
170
+ protected uploadProgress: i0.WritableSignal<number>;
171
+ protected fileInput: ElementRef | undefined;
172
+ protected selectedFile: File | null;
173
+ protected uploadSuccess: boolean;
174
+ protected uploadError: boolean;
175
+ constructor();
176
+ onFileChange(event: any): void;
177
+ onFileDrop(event: DragEvent): void;
178
+ onDragOver(event: DragEvent): void;
179
+ uploadFile(file: File | null): void;
180
+ removeFile(): void;
181
+ onOk(): void;
182
+ onCancel(): void;
183
+ protected readonly upload: {
184
+ name: string;
185
+ content: string;
186
+ viewBox: string;
187
+ };
188
+ protected readonly deleteIcon: {
189
+ name: string;
190
+ content: string;
191
+ viewBox: string;
192
+ };
193
+ static ɵfac: i0.ɵɵFactoryDeclaration<UploadFileDialogComponent, never>;
194
+ static ɵcmp: i0.ɵɵComponentDeclaration<UploadFileDialogComponent, "mm-upload-file-dialog", never, { "message": { "alias": "message"; "required": false; }; "mimeTypes": { "alias": "mimeTypes"; "required": false; }; "fileExtensions": { "alias": "fileExtensions"; "required": false; }; }, {}, never, never, true, never>;
195
+ }
196
+
197
+ declare class InputDialogComponent extends DialogContentBase {
198
+ private readonly dialogRef;
199
+ buttonOkText: string;
200
+ message: string;
201
+ placeholder: string;
202
+ protected inputValue: any | null;
203
+ constructor();
204
+ protected onOk(): void;
205
+ protected onCancel(): void;
206
+ static ɵfac: i0.ɵɵFactoryDeclaration<InputDialogComponent, never>;
207
+ static ɵcmp: i0.ɵɵComponentDeclaration<InputDialogComponent, "mm-input-dialog", never, { "buttonOkText": { "alias": "buttonOkText"; "required": false; }; "message": { "alias": "message"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "inputValue": { "alias": "inputValue"; "required": false; }; }, {}, never, never, true, never>;
208
+ }
209
+
210
+ declare abstract class HierarchyDataSource {
211
+ protected expandAllByDefault: boolean;
212
+ hasChildren(item: TreeItemData): boolean;
213
+ isExpanded(item: TreeItemData): boolean;
214
+ abstract fetchChildren(item: TreeItemData): Promise<TreeItemData[]>;
215
+ abstract fetchRootNodes(): Promise<TreeItemData[]>;
216
+ }
217
+
218
+ /**
219
+ * Metadata for a tree drag-and-drop operation.
220
+ */
221
+ interface NodeInfo {
222
+ /**
223
+ * The unique Runtime Identity of the node.
224
+ */
225
+ rtId: string;
226
+ /**
227
+ * The Content Kind Type ID (schema definition) of the node.
228
+ */
229
+ ckTypeId: string;
230
+ }
231
+ /**
232
+ * Event emitted when a tree node is successfully dropped.
233
+ */
234
+ interface NodeDroppedEvent<T> {
235
+ /**
236
+ * The specific node being moved.
237
+ */
238
+ sourceItem: NodeInfo & {
239
+ dataItem: TreeItemDataTyped<T>;
240
+ };
241
+ /**
242
+ * The original parent from which the node was dragged.
243
+ */
244
+ sourceParent?: NodeInfo | undefined;
245
+ /**
246
+ * The new target node where the item was dropped.
247
+ *
248
+ * If dropping *into* a folder, this is the folder.
249
+ * If dropping *between* items, this may be the new sibling or parent.
250
+ */
251
+ destinationItem?: NodeInfo | undefined;
252
+ /**
253
+ * List of items to refresh after drop.
254
+ */
255
+ refreshItems: NodeInfo[];
256
+ }
257
+
258
+ declare class TreeComponent implements OnInit, AfterViewInit, OnDestroy {
259
+ private readonly cdRef;
260
+ private _timeoutCache;
261
+ private readonly _rootNodes;
262
+ private _isViewInitialized;
263
+ protected expandedKeys: any[];
264
+ protected treeView: TreeViewComponent;
265
+ ngOnInit(): Promise<void>;
266
+ ngAfterViewInit(): void;
267
+ /**
268
+ * Check if the TreeComponent is fully initialized and ready for operations
269
+ */
270
+ get isReady(): boolean;
271
+ dataSource: HierarchyDataSource | null;
272
+ nodeSelected: EventEmitter<any>;
273
+ nodeClick: EventEmitter<any>;
274
+ nodeDoubleClick: EventEmitter<any>;
275
+ nodeDrop: EventEmitter<NodeDroppedEvent<any>>;
276
+ expand: EventEmitter<any>;
277
+ collapse: EventEmitter<any>;
278
+ protected get rootNodes(): Observable<any[]>;
279
+ protected hasChildren: (item: any) => boolean;
280
+ protected isExpanded: (item: any, _index: string) => boolean;
281
+ protected fetchChildren: (item: any) => Observable<any[]>;
282
+ protected onNodeSelect(treeItem: TreeItem): void;
283
+ protected onNodeClick(event: NodeClickEvent): void;
284
+ protected onNodeDoubleClick(event: NodeClickEvent): void;
285
+ protected onExpand(event: any): void;
286
+ protected onCollapse(event: any): void;
287
+ refreshTree(): Promise<void>;
288
+ onNodeDrop(event: TreeItemDropEvent): Promise<void>;
289
+ /**
290
+ * Refreshes given runtime entity by reloading the data of the children.
291
+ */
292
+ refreshRuntimeEntities(nodes: {
293
+ rtId: string;
294
+ ckTypeId: string;
295
+ isRoot: boolean;
296
+ }[]): Promise<void>;
297
+ getExpandedKeys(): any[];
298
+ collapseAll(): void;
299
+ setExpandedKeys(keys: any[]): void;
300
+ private _clearTimeouts;
301
+ ngOnDestroy(): void;
302
+ static ɵfac: i0.ɵɵFactoryDeclaration<TreeComponent, never>;
303
+ static ɵcmp: i0.ɵɵComponentDeclaration<TreeComponent, "mm-tree-view", never, { "dataSource": { "alias": "dataSource"; "required": false; }; }, { "nodeSelected": "nodeSelected"; "nodeClick": "nodeClick"; "nodeDoubleClick": "nodeDoubleClick"; "nodeDrop": "nodeDrop"; "expand": "expand"; "collapse": "collapse"; }, never, never, true, never>;
304
+ }
305
+
306
+ /**
307
+ * Interface for components that track unsaved changes.
308
+ * Implement this interface in components that need to warn users before navigating away
309
+ * when there are unsaved changes.
310
+ */
311
+ interface HasUnsavedChanges {
312
+ /**
313
+ * Returns true if the component has unsaved changes.
314
+ */
315
+ hasUnsavedChanges(): boolean;
316
+ /**
317
+ * Optional method to save changes before navigating away.
318
+ * If implemented, the guard will offer a "Save" option in the confirmation dialog.
319
+ * @returns Promise resolving to true if save was successful, false otherwise.
320
+ */
321
+ saveChanges?(): Promise<boolean>;
322
+ }
323
+ /**
324
+ * Injection token for components implementing HasUnsavedChanges.
325
+ *
326
+ * Components should provide themselves using this token:
327
+ * ```typescript
328
+ * @Component({
329
+ * providers: [{ provide: HAS_UNSAVED_CHANGES, useExisting: MyComponent }]
330
+ * })
331
+ * export class MyComponent implements HasUnsavedChanges { ... }
332
+ * ```
333
+ */
334
+ declare const HAS_UNSAVED_CHANGES: InjectionToken<HasUnsavedChanges>;
335
+
336
+ /**
337
+ * Directive that handles browser beforeunload events for components with unsaved changes.
338
+ *
339
+ * This directive should be used together with the UnsavedChangesGuard on routes.
340
+ * While the guard handles in-app navigation, this directive handles browser events
341
+ * like back/forward buttons, refresh, and tab close.
342
+ *
343
+ * Usage:
344
+ * 1. The host component must implement HasUnsavedChanges interface
345
+ * 2. The component must provide itself via the HAS_UNSAVED_CHANGES token
346
+ * 3. Add the directive to the component's hostDirectives
347
+ *
348
+ * ```typescript
349
+ * @Component({
350
+ * selector: 'my-editor',
351
+ * hostDirectives: [UnsavedChangesDirective],
352
+ * providers: [{ provide: HAS_UNSAVED_CHANGES, useExisting: MyEditorComponent }],
353
+ * ...
354
+ * })
355
+ * export class MyEditorComponent implements HasUnsavedChanges {
356
+ * hasUnsavedChanges(): boolean {
357
+ * return this.form.dirty;
358
+ * }
359
+ * }
360
+ * ```
361
+ */
362
+ declare class UnsavedChangesDirective {
363
+ private readonly host;
364
+ /**
365
+ * Handles browser beforeunload event (back button, refresh, close tab).
366
+ * Shows browser's native confirmation dialog when there are unsaved changes.
367
+ */
368
+ onBeforeUnload(event: BeforeUnloadEvent): void;
369
+ private hostHasUnsavedChanges;
370
+ static ɵfac: i0.ɵɵFactoryDeclaration<UnsavedChangesDirective, never>;
371
+ static ɵdir: i0.ɵɵDirectiveDeclaration<UnsavedChangesDirective, "[mmUnsavedChanges]", never, {}, {}, never, never, true, never>;
372
+ }
373
+
374
+ interface ResponsiveFormBreakPoint {
375
+ maxWidth: number;
376
+ value: number;
377
+ }
378
+ interface BaseFormConfig {
379
+ title?: string;
380
+ cardWidth?: string;
381
+ showCard?: boolean;
382
+ saveButtonText?: string;
383
+ cancelButtonText?: string;
384
+ isEditMode?: boolean;
385
+ isViewMode?: boolean;
386
+ isLoading?: boolean;
387
+ isSaving?: boolean;
388
+ showLoadingOverlay?: boolean;
389
+ /**
390
+ * Indicates whether the form has unsaved changes.
391
+ * When true, displays a "Modified" indicator in the header and footer.
392
+ */
393
+ hasChanges?: boolean;
394
+ }
395
+ declare const DEFAULT_RESPONSIVE_COLSPAN: ResponsiveFormBreakPoint[];
396
+ declare class BaseFormComponent implements HasUnsavedChanges {
397
+ form: FormGroup;
398
+ config: BaseFormConfig;
399
+ saveForm: EventEmitter<void>;
400
+ cancelForm: EventEmitter<void>;
401
+ protected readonly saveIcon: SVGIcon;
402
+ protected readonly cancelIcon: SVGIcon;
403
+ protected get title(): string;
404
+ protected get saveButtonText(): string;
405
+ protected get cancelButtonText(): string;
406
+ protected get showSaveButton(): boolean;
407
+ protected get saveButtonDisabled(): boolean;
408
+ protected onSave(): void;
409
+ protected onCancel(): void;
410
+ /**
411
+ * Checks if there are unsaved changes.
412
+ * Uses config.hasChanges if provided, otherwise falls back to form.dirty.
413
+ */
414
+ hasUnsavedChanges(): boolean;
415
+ static ɵfac: i0.ɵɵFactoryDeclaration<BaseFormComponent, never>;
416
+ static ɵcmp: i0.ɵɵComponentDeclaration<BaseFormComponent, "mm-base-form", never, { "form": { "alias": "form"; "required": false; }; "config": { "alias": "config"; "required": false; }; }, { "saveForm": "saveForm"; "cancelForm": "cancelForm"; }, never, ["*", "[additionalActions]"], true, [{ directive: typeof UnsavedChangesDirective; inputs: {}; outputs: {}; }]>;
417
+ }
418
+
419
+ declare class BaseTreeDetailComponent<T = any> extends CommandBaseService {
420
+ treeDataSource: HierarchyDataSource;
421
+ leftPaneSize: string;
422
+ leftToolbarActions: CommandItem[];
423
+ rightToolbarActions: CommandItem[];
424
+ nodeSelected: EventEmitter<TreeItemDataTyped<T>>;
425
+ nodeDropped: EventEmitter<NodeDroppedEvent<T>>;
426
+ treeComponent: TreeComponent;
427
+ protected isContentDisabled: boolean;
428
+ protected selectedNode: TreeItemDataTyped<T> | null;
429
+ constructor();
430
+ protected get hasToolbarActions(): boolean;
431
+ protected onNodeClick(treeItem: TreeItemDataTyped<T>): void;
432
+ protected onNodeDrop(event: NodeDroppedEvent<T>): void;
433
+ protected onToolbarCommand(commandItem: CommandItem): Promise<void>;
434
+ protected getIsDisabled(commandItem: CommandItem): boolean;
435
+ /**
436
+ * Wait for the tree component to be ready
437
+ */
438
+ waitForTreeReady(): Promise<boolean>;
439
+ /**
440
+ * Refresh the tree by reloading root nodes
441
+ */
442
+ refreshTree(): Promise<void>;
443
+ /**
444
+ * Sets the state of Tree and Details panes.
445
+ *
446
+ * @description Panes are frozen (unclickable, unselectable) when disabled.
447
+ */
448
+ setEnabledState(enabled: boolean): void;
449
+ /**
450
+ * Refreshes given runtime entity on a tree.
451
+ */
452
+ refreshRuntimeEntities(nodes: {
453
+ ckTypeId: string;
454
+ rtId: string;
455
+ isRoot: boolean;
456
+ }[]): Promise<void>;
457
+ getExpandedKeys(): any[];
458
+ collapseAll(): void;
459
+ setExpandedKeys(keys: any[]): void;
460
+ static ɵfac: i0.ɵɵFactoryDeclaration<BaseTreeDetailComponent<any>, never>;
461
+ static ɵcmp: i0.ɵɵComponentDeclaration<BaseTreeDetailComponent<any>, "mm-base-tree-detail", never, { "treeDataSource": { "alias": "treeDataSource"; "required": false; }; "leftPaneSize": { "alias": "leftPaneSize"; "required": false; }; "leftToolbarActions": { "alias": "leftToolbarActions"; "required": false; }; "rightToolbarActions": { "alias": "rightToolbarActions"; "required": false; }; }, { "nodeSelected": "nodeSelected"; "nodeDropped": "nodeDropped"; }, never, ["[slot=detail-panel]"], true, never>;
462
+ }
463
+
464
+ declare class ProgressValue {
465
+ statusText: string | null;
466
+ progressValue: number;
467
+ constructor();
468
+ }
469
+
470
+ interface ProgressWindowData {
471
+ title: string;
472
+ isDeterminate: boolean;
473
+ progress: Observable<ProgressValue>;
474
+ isCancelOperationAvailable: boolean;
475
+ cancelOperation: () => void;
476
+ }
477
+ type ProgressWindowResult = object;
478
+ declare class ProgressWindowComponent extends DialogContentBase implements OnDestroy, AfterViewInit {
479
+ private readonly dialogRef;
480
+ private progressSubscription?;
481
+ isDeterminate: boolean;
482
+ progress: Observable<ProgressValue>;
483
+ isCancelOperationAvailable: boolean;
484
+ cancelOperation?: () => void;
485
+ statusText: string | null;
486
+ progressValue: number;
487
+ constructor();
488
+ ngAfterViewInit(): void;
489
+ ngOnDestroy(): void;
490
+ onCancelClick(): void;
491
+ static ɵfac: i0.ɵɵFactoryDeclaration<ProgressWindowComponent, never>;
492
+ static ɵcmp: i0.ɵɵComponentDeclaration<ProgressWindowComponent, "mm-progress-window", never, { "isDeterminate": { "alias": "isDeterminate"; "required": false; }; "progress": { "alias": "progress"; "required": false; }; "isCancelOperationAvailable": { "alias": "isCancelOperationAvailable"; "required": false; }; "cancelOperation": { "alias": "cancelOperation"; "required": false; }; }, {}, never, never, true, never>;
493
+ }
494
+
495
+ declare class ProgressWindowService {
496
+ private readonly dialogService;
497
+ /**
498
+ * Opens a progress window dialog
499
+ * @param config Configuration for the progress window
500
+ * @returns DialogRef for the progress window
501
+ */
502
+ showProgress(config: ProgressWindowConfig): DialogRef;
503
+ /**
504
+ * Shows a determinate progress window (with percentage)
505
+ * @param title Window title
506
+ * @param progress Observable that emits progress updates
507
+ * @param options Additional options
508
+ * @returns DialogRef for the progress window
509
+ */
510
+ showDeterminateProgress(title: string, progress: Observable<ProgressValue>, options?: Partial<ProgressWindowOptions>): DialogRef;
511
+ /**
512
+ * Shows an indeterminate progress window (spinning/pulsing animation)
513
+ * @param title Window title
514
+ * @param progress Observable that emits progress updates (statusText only)
515
+ * @param options Additional options
516
+ * @returns DialogRef for the progress window
517
+ */
518
+ showIndeterminateProgress(title: string, progress: Observable<ProgressValue>, options?: Partial<ProgressWindowOptions>): DialogRef;
519
+ static ɵfac: i0.ɵɵFactoryDeclaration<ProgressWindowService, never>;
520
+ static ɵprov: i0.ɵɵInjectableDeclaration<ProgressWindowService>;
521
+ }
522
+ interface ProgressWindowConfig {
523
+ title: string;
524
+ progress: Observable<ProgressValue>;
525
+ isDeterminate?: boolean;
526
+ isCancelOperationAvailable?: boolean;
527
+ cancelOperation?: () => void;
528
+ width?: number;
529
+ height?: number | string;
530
+ allowClose?: boolean;
531
+ }
532
+ interface ProgressWindowOptions {
533
+ isCancelOperationAvailable?: boolean;
534
+ cancelOperation?: () => void;
535
+ width?: number;
536
+ height?: number | string;
537
+ allowClose?: boolean;
538
+ }
539
+
540
+ interface FetchResult {
541
+ get data(): any;
542
+ get totalCount(): number;
543
+ }
544
+ declare class FetchResultBase implements FetchResult {
545
+ private readonly _data;
546
+ private readonly _totalCount;
547
+ constructor(_data: any, _totalCount: number);
548
+ get data(): any;
549
+ get totalCount(): number;
550
+ }
551
+ declare class FetchResultTyped<TDto> implements FetchResult {
552
+ private readonly _data;
553
+ private readonly _totalCount;
554
+ constructor(_data: (TDto | null)[], _totalCount: number);
555
+ get data(): (TDto | null)[];
556
+ get totalCount(): number;
557
+ }
558
+
559
+ interface FetchDataOptions {
560
+ state: State;
561
+ textSearch: string | null;
562
+ /** When true, bypass cache and fetch fresh data from the server */
563
+ forceRefresh?: boolean;
564
+ }
565
+ declare abstract class DataSourceBase {
566
+ readonly listViewComponent: ListViewComponent;
567
+ readonly fetchAgainEvent: EventEmitter<void>;
568
+ private readonly _isLoading$;
569
+ /** Observable indicating if the data source is currently loading data */
570
+ readonly isLoading$: Observable<boolean>;
571
+ /** Current loading state */
572
+ get isLoading(): boolean;
573
+ protected constructor(listViewComponent: ListViewComponent);
574
+ /** Set the loading state (called by MmListViewDataBindingDirective) */
575
+ setLoading(loading: boolean): void;
576
+ fetchAgain(): void;
577
+ abstract fetchData(queryOptions: FetchDataOptions): Observable<FetchResult | null>;
578
+ }
579
+
580
+ declare abstract class DataSourceTyped<TDto> extends DataSourceBase {
581
+ protected constructor(mmTableComponent: ListViewComponent);
582
+ abstract fetchData(queryOptions: FetchDataOptions): Observable<FetchResultTyped<TDto> | null>;
583
+ }
584
+
585
+ declare abstract class HierarchyDataSourceBase<TQueryDto> extends HierarchyDataSource {
586
+ abstract fetchChildren(item: TreeItemDataTyped<TQueryDto>): Promise<TreeItemDataTyped<TQueryDto>[]>;
587
+ abstract fetchRootNodes(): Promise<TreeItemDataTyped<TQueryDto>[]>;
588
+ }
589
+
590
+ declare class MmListViewDataBindingDirective extends DataBindingDirective implements OnInit, OnDestroy {
591
+ private readonly dataSource;
592
+ /** Observable indicating if the data source is currently loading data */
593
+ get isLoading$(): Observable<boolean>;
594
+ /** Current loading state */
595
+ get isLoading(): boolean;
596
+ private _serviceSubscription;
597
+ private _executeFilterSubscription;
598
+ private _fetchAgainSubscription;
599
+ private _refreshDataSubscription;
600
+ private _textSearchValue;
601
+ private _forceRefresh;
602
+ constructor();
603
+ ngOnInit(): Promise<void>;
604
+ ngOnDestroy(): void;
605
+ rebind(): void;
606
+ static ɵfac: i0.ɵɵFactoryDeclaration<MmListViewDataBindingDirective, never>;
607
+ static ɵdir: i0.ɵɵDirectiveDeclaration<MmListViewDataBindingDirective, "[mmListViewDataBinding]", never, {}, {}, never, never, true, never>;
608
+ }
609
+
610
+ declare class PascalCasePipe implements PipeTransform {
611
+ transform(value: string): string;
612
+ static ɵfac: i0.ɵɵFactoryDeclaration<PascalCasePipe, never>;
613
+ static ɵpipe: i0.ɵɵPipeDeclaration<PascalCasePipe, "pascalCase", true>;
614
+ }
615
+
616
+ declare class BytesToSizePipe implements PipeTransform {
617
+ transform(value: number, decimals?: number): string;
618
+ static ɵfac: i0.ɵɵFactoryDeclaration<BytesToSizePipe, never>;
619
+ static ɵpipe: i0.ɵɵPipeDeclaration<BytesToSizePipe, "bytesToSize", true>;
620
+ }
621
+
622
+ declare enum ImportStrategyDto {
623
+ InsertOnly = 0,
624
+ Upsert = 1
625
+ }
626
+
627
+ declare class FileUploadService {
628
+ private readonly dialogService;
629
+ showUploadDialog(title: string, message: string, mimeTypes?: string | null, fileExtensions?: string | null): Promise<File | null>;
630
+ static ɵfac: i0.ɵɵFactoryDeclaration<FileUploadService, never>;
631
+ static ɵprov: i0.ɵɵInjectableDeclaration<FileUploadService>;
632
+ }
633
+
634
+ declare enum ButtonTypes {
635
+ Ok = 0,
636
+ Cancel = 1,
637
+ Yes = 2,
638
+ No = 3
639
+ }
640
+ declare class ConfirmationWindowResult {
641
+ result: ButtonTypes;
642
+ constructor(result: ButtonTypes);
643
+ }
644
+
645
+ declare class ConfirmationService {
646
+ private readonly dialogService;
647
+ showYesNoConfirmationDialog(title: string, message: string): Promise<boolean>;
648
+ showYesNoCancelConfirmationDialog(title: string, message: string): Promise<ConfirmationWindowResult | undefined>;
649
+ showOkCancelConfirmationDialog(title: string, message: string): Promise<boolean>;
650
+ showOkDialog(title: string, message: string): Promise<boolean>;
651
+ private openDialog;
652
+ static ɵfac: i0.ɵɵFactoryDeclaration<ConfirmationService, never>;
653
+ static ɵprov: i0.ɵɵInjectableDeclaration<ConfirmationService>;
654
+ }
655
+
656
+ declare class InputService {
657
+ private readonly dialogService;
658
+ showInputDialog(title: string, message: string, placeholder: string, buttonOkText?: string | null): Promise<string | null>;
659
+ static ɵfac: i0.ɵɵFactoryDeclaration<InputService, never>;
660
+ static ɵprov: i0.ɵɵInjectableDeclaration<InputService>;
661
+ }
662
+
663
+ declare class NotificationDisplayService implements OnDestroy {
664
+ private readonly notificationService;
665
+ private readonly messageDetailsDialogService;
666
+ private readonly router;
667
+ private readonly ngZone;
668
+ private notificationCounter;
669
+ private activeNotifications;
670
+ private subscriptions;
671
+ private interactionDebounceTime;
672
+ private gracePeriod;
673
+ private notificationOpenTimes;
674
+ private readonly defaultSettings;
675
+ constructor();
676
+ ngOnDestroy(): void;
677
+ private setupNavigationListener;
678
+ private setupGlobalInteractionListeners;
679
+ private hasActiveErrorOrWarning;
680
+ private shouldCloseOnInteraction;
681
+ private clearErrorAndWarningNotifications;
682
+ private clearAllNotifications;
683
+ /**
684
+ * Helper method to create SVG icon HTML
685
+ */
686
+ private createSvgIcon;
687
+ /**
688
+ * Shows a success notification (auto-closes after 3 seconds)
689
+ */
690
+ showSuccess(title: string, hideAfter?: number): void;
691
+ /**
692
+ * Shows an error notification (persists until user interaction or navigation)
693
+ */
694
+ showError(title: string, details?: string, hideAfter?: number): void;
695
+ /**
696
+ * Shows a warning notification (persists until user interaction or navigation)
697
+ */
698
+ showWarning(title: string, details?: string, hideAfter?: number): void;
699
+ /**
700
+ * Shows an info notification (auto-closes after 3 seconds)
701
+ */
702
+ showInfo(title: string, hideAfter?: number): void;
703
+ static ɵfac: i0.ɵɵFactoryDeclaration<NotificationDisplayService, never>;
704
+ static ɵprov: i0.ɵɵInjectableDeclaration<NotificationDisplayService>;
705
+ }
706
+
707
+ /**
708
+ * Service that listens to MessageService events and displays them as UI notifications.
709
+ * This service should be initialized at app startup to ensure all messages are displayed.
710
+ */
711
+ declare class MessageListenerService implements OnDestroy {
712
+ private readonly messageService;
713
+ private readonly notificationDisplay;
714
+ private subscription?;
715
+ /**
716
+ * Starts listening to messages from MessageService and displays them as notifications.
717
+ * Call this once at application startup.
718
+ */
719
+ initialize(): void;
720
+ /**
721
+ * Stops listening to messages
722
+ */
723
+ stop(): void;
724
+ ngOnDestroy(): void;
725
+ static ɵfac: i0.ɵɵFactoryDeclaration<MessageListenerService, never>;
726
+ static ɵprov: i0.ɵɵInjectableDeclaration<MessageListenerService>;
727
+ }
728
+
729
+ interface MessageDetailsDialogData {
730
+ title: string;
731
+ details: string;
732
+ level: 'error' | 'warning';
733
+ }
734
+ declare class MessageDetailsDialogComponent implements OnInit {
735
+ protected readonly copyIcon: _progress_kendo_svg_icons.SVGIcon;
736
+ protected readonly xIcon: _progress_kendo_svg_icons.SVGIcon;
737
+ private readonly dialogRef;
738
+ data: MessageDetailsDialogData;
739
+ title: string;
740
+ details: string;
741
+ level: 'error' | 'warning';
742
+ ngOnInit(): void;
743
+ get dialogTitle(): string;
744
+ onClose(): void;
745
+ copyToClipboard(): Promise<void>;
746
+ private fallbackCopyToClipboard;
747
+ static ɵfac: i0.ɵɵFactoryDeclaration<MessageDetailsDialogComponent, never>;
748
+ static ɵcmp: i0.ɵɵComponentDeclaration<MessageDetailsDialogComponent, "mm-message-details-dialog", never, {}, {}, never, never, true, never>;
749
+ }
750
+
751
+ declare class MessageDetailsDialogService {
752
+ private readonly dialogService;
753
+ /**
754
+ * Opens a modal dialog to show message details with copy-to-clipboard functionality
755
+ */
756
+ showDetailsDialog(data: MessageDetailsDialogData): DialogRef;
757
+ static ɵfac: i0.ɵɵFactoryDeclaration<MessageDetailsDialogService, never>;
758
+ static ɵprov: i0.ɵɵInjectableDeclaration<MessageDetailsDialogService>;
759
+ }
760
+
761
+ /**
762
+ * Query options for fetching data in the dialog
763
+ */
764
+ interface DialogFetchOptions {
765
+ /** Number of items to skip (for paging) */
766
+ skip: number;
767
+ /** Number of items to take (page size) */
768
+ take: number;
769
+ /** Text search filter */
770
+ textSearch: string | null;
771
+ }
772
+ /**
773
+ * Result from fetching data
774
+ */
775
+ interface DialogFetchResult<T> {
776
+ /** Data items */
777
+ data: (T | null)[];
778
+ /** Total count of items matching the filter */
779
+ totalCount: number;
780
+ }
781
+ /**
782
+ * Interface for entity selection dialog data sources.
783
+ * Combines grid configuration, data fetching, and entity display.
784
+ */
785
+ interface EntitySelectDialogDataSource<T> {
786
+ /**
787
+ * Get column definitions for the grid display
788
+ * @returns Array of column definitions
789
+ */
790
+ getColumns(): ColumnDefinition[];
791
+ /**
792
+ * Fetch data for the grid with paging and filtering
793
+ * @param options Query options including skip, take, and textSearch
794
+ * @returns Observable of fetch result with data and total count
795
+ */
796
+ fetchData(options: DialogFetchOptions): Observable<DialogFetchResult<T>>;
797
+ /**
798
+ * Get display text for an entity
799
+ * @param entity The entity to display
800
+ * @returns String representation of the entity
801
+ */
802
+ onDisplayEntity(entity: T): string;
803
+ /**
804
+ * Get unique identifier for an entity
805
+ * @param entity The entity to get ID from
806
+ * @returns Unique identifier for the entity
807
+ */
808
+ getIdEntity(entity: T): any;
809
+ }
810
+ /**
811
+ * Options for opening the entity select dialog
812
+ */
813
+ interface EntitySelectDialogOptions<T> {
814
+ /** Dialog title */
815
+ title: string;
816
+ /** Allow multiple selection */
817
+ multiSelect?: boolean;
818
+ /** Pre-selected entities */
819
+ selectedEntities?: T[];
820
+ /** Dialog width (default: 800) */
821
+ width?: number;
822
+ /** Dialog height (default: 600) */
823
+ height?: number;
824
+ }
825
+ /**
826
+ * Result returned from the entity select dialog
827
+ */
828
+ interface EntitySelectDialogResult<T> {
829
+ /** Selected entities (single item array for single-select) */
830
+ selectedEntities: T[];
831
+ }
832
+
833
+ declare class EntitySelectInputComponent implements OnInit, OnDestroy, ControlValueAccessor, Validator {
834
+ autocomplete: AutoCompleteComponent;
835
+ dataSource: EntitySelectDataSource<any>;
836
+ placeholder: string;
837
+ minSearchLength: number;
838
+ maxResults: number;
839
+ debounceMs: number;
840
+ prefix: string;
841
+ dialogDataSource?: EntitySelectDialogDataSource<any>;
842
+ dialogTitle: string;
843
+ multiSelect: boolean;
844
+ advancedSearchLabel: string;
845
+ private _disabled;
846
+ get disabled(): boolean;
847
+ set disabled(value: boolean);
848
+ private _required;
849
+ get required(): boolean;
850
+ set required(value: boolean);
851
+ entitySelected: EventEmitter<any>;
852
+ entityCleared: EventEmitter<void>;
853
+ entitiesSelected: EventEmitter<any[]>;
854
+ searchFormControl: FormControl<any>;
855
+ filteredEntities: string[];
856
+ selectedEntity: any;
857
+ isLoading: boolean;
858
+ private entityMap;
859
+ private searchSubject;
860
+ private destroy$;
861
+ private onChange;
862
+ private onTouched;
863
+ protected readonly clearIcon: _progress_kendo_svg_icons.SVGIcon;
864
+ protected readonly searchIcon: _progress_kendo_svg_icons.SVGIcon;
865
+ private elRef;
866
+ private dialogService;
867
+ ngOnInit(): void;
868
+ ngOnDestroy(): void;
869
+ writeValue(value: any): void;
870
+ registerOnChange(fn: any): void;
871
+ registerOnTouched(fn: any): void;
872
+ setDisabledState(_isDisabled: boolean): void;
873
+ validate(control: AbstractControl): ValidationErrors | null;
874
+ onFilterChange(event: any): void;
875
+ onSelectionChange(value: any): void;
876
+ onFocus(): void;
877
+ onBlur(): void;
878
+ clear(): void;
879
+ focus(): void;
880
+ reset(): void;
881
+ private setupSearch;
882
+ private selectEntity;
883
+ openAdvancedSearch(event?: Event): Promise<void>;
884
+ static ɵfac: i0.ɵɵFactoryDeclaration<EntitySelectInputComponent, never>;
885
+ static ɵcmp: i0.ɵɵComponentDeclaration<EntitySelectInputComponent, "mm-entity-select-input", never, { "dataSource": { "alias": "dataSource"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "minSearchLength": { "alias": "minSearchLength"; "required": false; }; "maxResults": { "alias": "maxResults"; "required": false; }; "debounceMs": { "alias": "debounceMs"; "required": false; }; "prefix": { "alias": "prefix"; "required": false; }; "dialogDataSource": { "alias": "dialogDataSource"; "required": false; }; "dialogTitle": { "alias": "dialogTitle"; "required": false; }; "multiSelect": { "alias": "multiSelect"; "required": false; }; "advancedSearchLabel": { "alias": "advancedSearchLabel"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "required": { "alias": "required"; "required": false; }; }, { "entitySelected": "entitySelected"; "entityCleared": "entityCleared"; "entitiesSelected": "entitiesSelected"; }, never, never, true, never>;
886
+ }
887
+
888
+ declare class EntitySelectDialogComponent<T> extends DialogContentBase implements OnInit, OnDestroy {
889
+ private readonly dialogRef;
890
+ private searchSubject;
891
+ private destroy$;
892
+ dataSource: EntitySelectDialogDataSource<T>;
893
+ multiSelect: boolean;
894
+ preSelectedEntities: T[];
895
+ columns: TableColumn[];
896
+ gridData: {
897
+ data: T[];
898
+ total: number;
899
+ };
900
+ selectedEntities: T[];
901
+ selectedKeys: any[];
902
+ isLoading: boolean;
903
+ searchValue: string;
904
+ pageSize: number;
905
+ skip: number;
906
+ pageable: PagerSettings;
907
+ get selectableSettings(): SelectableSettings;
908
+ constructor();
909
+ ngOnInit(): void;
910
+ ngOnDestroy(): void;
911
+ private initializeColumns;
912
+ private setupSearch;
913
+ private loadData;
914
+ getDisplayName(column: TableColumn): string;
915
+ onSearchChange(value: string | null): void;
916
+ onPageChange(event: PageChangeEvent): void;
917
+ onSelectionChange(event: SelectionEvent): void;
918
+ onConfirm(): void;
919
+ onCancel(): void;
920
+ static ɵfac: i0.ɵɵFactoryDeclaration<EntitySelectDialogComponent<any>, never>;
921
+ static ɵcmp: i0.ɵɵComponentDeclaration<EntitySelectDialogComponent<any>, "mm-entity-select-dialog", never, { "dataSource": { "alias": "dataSource"; "required": false; }; "multiSelect": { "alias": "multiSelect"; "required": false; }; "preSelectedEntities": { "alias": "preSelectedEntities"; "required": false; }; }, {}, never, never, true, never>;
922
+ }
923
+
924
+ declare class EntitySelectDialogService {
925
+ private readonly dialogService;
926
+ /**
927
+ * Opens the entity select dialog
928
+ * @param dataSource The data source providing grid data and column definitions
929
+ * @param options Dialog configuration options
930
+ * @returns Promise resolving to selected entities or null if cancelled
931
+ */
932
+ open<T>(dataSource: EntitySelectDialogDataSource<T>, options: EntitySelectDialogOptions<T>): Promise<EntitySelectDialogResult<T> | null>;
933
+ static ɵfac: i0.ɵɵFactoryDeclaration<EntitySelectDialogService, never>;
934
+ static ɵprov: i0.ɵɵInjectableDeclaration<EntitySelectDialogService>;
935
+ }
936
+
937
+ /**
938
+ * Guard that prevents navigation when a component has unsaved changes.
939
+ * The component must implement the HasUnsavedChanges interface.
940
+ *
941
+ * Usage in routes:
942
+ * ```typescript
943
+ * {
944
+ * path: 'edit/:id',
945
+ * component: MyEditorComponent,
946
+ * canDeactivate: [UnsavedChangesGuard]
947
+ * }
948
+ * ```
949
+ *
950
+ * The component must implement HasUnsavedChanges:
951
+ * ```typescript
952
+ * export class MyEditorComponent implements HasUnsavedChanges {
953
+ * hasUnsavedChanges(): boolean {
954
+ * return this.form.dirty;
955
+ * }
956
+ *
957
+ * async saveChanges(): Promise<boolean> {
958
+ * // Save logic here
959
+ * return true;
960
+ * }
961
+ * }
962
+ * ```
963
+ */
964
+ declare class UnsavedChangesGuard implements CanDeactivate<HasUnsavedChanges> {
965
+ private readonly confirmationService;
966
+ canDeactivate(component: HasUnsavedChanges): Promise<boolean>;
967
+ static ɵfac: i0.ɵɵFactoryDeclaration<UnsavedChangesGuard, never>;
968
+ static ɵprov: i0.ɵɵInjectableDeclaration<UnsavedChangesGuard>;
969
+ }
970
+
971
+ /**
972
+ * Result from checking if a name is available
973
+ */
974
+ interface NameAvailabilityResult {
975
+ /** Whether the name is available */
976
+ isAvailable: boolean;
977
+ /** Optional message to display (e.g., "Name already exists") */
978
+ message?: string;
979
+ }
980
+ /**
981
+ * Interface for Save As dialog data sources.
982
+ * Provides name validation functionality.
983
+ */
984
+ interface SaveAsDialogDataSource {
985
+ /**
986
+ * Check if a name is available (not already taken)
987
+ * @param name The name to check
988
+ * @returns Observable of availability result
989
+ */
990
+ checkNameAvailability(name: string): Observable<NameAvailabilityResult>;
991
+ }
992
+ /**
993
+ * Options for opening the Save As dialog
994
+ */
995
+ interface SaveAsDialogOptions {
996
+ /** Dialog title */
997
+ title: string;
998
+ /** Label for the name input field */
999
+ nameLabel?: string;
1000
+ /** Placeholder text for the name input */
1001
+ placeholder?: string;
1002
+ /** Suggested/default name */
1003
+ suggestedName?: string;
1004
+ /** Text for the save button */
1005
+ saveButtonText?: string;
1006
+ /** Text for the cancel button */
1007
+ cancelButtonText?: string;
1008
+ /** Minimum name length (default: 1) */
1009
+ minLength?: number;
1010
+ /** Maximum name length (default: 255) */
1011
+ maxLength?: number;
1012
+ /** Regex pattern for name validation */
1013
+ pattern?: RegExp;
1014
+ /** Error message when pattern doesn't match */
1015
+ patternErrorMessage?: string;
1016
+ /** Dialog width (default: 450) */
1017
+ width?: number;
1018
+ /** Data source for checking name availability (optional) */
1019
+ dataSource?: SaveAsDialogDataSource;
1020
+ /** Debounce time in ms for name availability check (default: 300) */
1021
+ debounceTime?: number;
1022
+ }
1023
+ /**
1024
+ * Result returned from the Save As dialog
1025
+ */
1026
+ interface SaveAsDialogResult {
1027
+ /** Whether the user confirmed (clicked Save) */
1028
+ confirmed: boolean;
1029
+ /** The entered name (only set if confirmed) */
1030
+ name?: string;
1031
+ }
1032
+
1033
+ declare class SaveAsDialogComponent extends DialogContentBase implements OnInit, OnDestroy {
1034
+ nameControl: FormControl<string>;
1035
+ nameLabel: string;
1036
+ placeholder: string;
1037
+ saveButtonText: string;
1038
+ cancelButtonText: string;
1039
+ minLength: number;
1040
+ maxLength: number;
1041
+ patternErrorMessage: string;
1042
+ isCheckingAvailability: boolean;
1043
+ isNameAvailable: boolean;
1044
+ availabilityMessage: string;
1045
+ private dataSource?;
1046
+ private debounceMs;
1047
+ private subscriptions;
1048
+ private checkSubject;
1049
+ constructor();
1050
+ ngOnInit(): void;
1051
+ ngOnDestroy(): void;
1052
+ private setupAvailabilityCheck;
1053
+ canSave(): boolean;
1054
+ onSave(): void;
1055
+ onCancel(): void;
1056
+ static ɵfac: i0.ɵɵFactoryDeclaration<SaveAsDialogComponent, never>;
1057
+ static ɵcmp: i0.ɵɵComponentDeclaration<SaveAsDialogComponent, "mm-save-as-dialog", never, {}, {}, never, never, true, never>;
1058
+ }
1059
+
1060
+ declare class SaveAsDialogService {
1061
+ private readonly dialogService;
1062
+ /**
1063
+ * Opens a Save As dialog
1064
+ * @param options Dialog options including title, suggested name, and optional data source for validation
1065
+ * @returns Promise that resolves with the result containing confirmed status and entered name
1066
+ */
1067
+ showSaveAsDialog(options: SaveAsDialogOptions): Promise<SaveAsDialogResult>;
1068
+ static ɵfac: i0.ɵɵFactoryDeclaration<SaveAsDialogService, never>;
1069
+ static ɵprov: i0.ɵɵInjectableDeclaration<SaveAsDialogService>;
1070
+ }
1071
+
1072
+ /**
1073
+ * The type of time range selection
1074
+ */
1075
+ type TimeRangeType = 'year' | 'quarter' | 'month' | 'relative' | 'custom';
1076
+ /**
1077
+ * The unit for relative time calculations
1078
+ */
1079
+ type RelativeTimeUnit = 'hours' | 'days' | 'weeks' | 'months';
1080
+ /**
1081
+ * Represents a time range with start and end dates
1082
+ */
1083
+ interface TimeRange {
1084
+ /** Start of the time range */
1085
+ from: Date;
1086
+ /** End of the time range */
1087
+ to: Date;
1088
+ }
1089
+ /**
1090
+ * Represents a time range as ISO 8601 strings
1091
+ */
1092
+ interface TimeRangeISO {
1093
+ /** Start of the time range in ISO 8601 format */
1094
+ from: string;
1095
+ /** End of the time range in ISO 8601 format */
1096
+ to: string;
1097
+ }
1098
+ /**
1099
+ * Quarter number (1-4)
1100
+ */
1101
+ type Quarter = 1 | 2 | 3 | 4;
1102
+ /**
1103
+ * Configuration for the time range picker
1104
+ */
1105
+ interface TimeRangePickerConfig {
1106
+ /** Available range types to show. Defaults to all. */
1107
+ availableTypes?: TimeRangeType[];
1108
+ /** Minimum selectable year. Defaults to current year - 10. */
1109
+ minYear?: number;
1110
+ /** Maximum selectable year. Defaults to current year + 1. */
1111
+ maxYear?: number;
1112
+ /** Default relative time value. Defaults to 24. */
1113
+ defaultRelativeValue?: number;
1114
+ /** Default relative time unit. Defaults to 'hours'. */
1115
+ defaultRelativeUnit?: RelativeTimeUnit;
1116
+ /** Minimum date for custom range. */
1117
+ minDate?: Date;
1118
+ /** Maximum date for custom range. */
1119
+ maxDate?: Date;
1120
+ /** Show time in custom date pickers. Defaults to false. */
1121
+ showTime?: boolean;
1122
+ }
1123
+ /**
1124
+ * The current selection state of the time range picker
1125
+ */
1126
+ interface TimeRangeSelection {
1127
+ type: TimeRangeType;
1128
+ year?: number;
1129
+ quarter?: Quarter;
1130
+ month?: number;
1131
+ relativeValue?: number;
1132
+ relativeUnit?: RelativeTimeUnit;
1133
+ customFrom?: Date;
1134
+ customTo?: Date;
1135
+ }
1136
+ /**
1137
+ * Option for dropdown selections
1138
+ */
1139
+ interface TimeRangeOption<T = string | number> {
1140
+ value: T;
1141
+ label: string;
1142
+ }
1143
+ /**
1144
+ * Labels for the time range picker UI
1145
+ */
1146
+ interface TimeRangePickerLabels {
1147
+ rangeType?: string;
1148
+ year?: string;
1149
+ quarter?: string;
1150
+ month?: string;
1151
+ relativeValue?: string;
1152
+ relativeUnit?: string;
1153
+ customFrom?: string;
1154
+ customTo?: string;
1155
+ typeYear?: string;
1156
+ typeQuarter?: string;
1157
+ typeMonth?: string;
1158
+ typeRelative?: string;
1159
+ typeCustom?: string;
1160
+ unitHours?: string;
1161
+ unitDays?: string;
1162
+ unitWeeks?: string;
1163
+ unitMonths?: string;
1164
+ quarter1?: string;
1165
+ quarter2?: string;
1166
+ quarter3?: string;
1167
+ quarter4?: string;
1168
+ }
1169
+ /**
1170
+ * Default labels for the time range picker
1171
+ */
1172
+ declare const DEFAULT_TIME_RANGE_LABELS: TimeRangePickerLabels;
1173
+ /**
1174
+ * Utility functions for time range calculations
1175
+ */
1176
+ declare class TimeRangeUtils {
1177
+ /**
1178
+ * Calculate time range for a specific year
1179
+ */
1180
+ static getYearRange(year: number): TimeRange;
1181
+ /**
1182
+ * Calculate time range for a specific quarter
1183
+ */
1184
+ static getQuarterRange(year: number, quarter: Quarter): TimeRange;
1185
+ /**
1186
+ * Calculate time range for a specific month
1187
+ */
1188
+ static getMonthRange(year: number, month: number): TimeRange;
1189
+ /**
1190
+ * Calculate time range relative to now
1191
+ */
1192
+ static getRelativeRange(value: number, unit: RelativeTimeUnit): TimeRange;
1193
+ /**
1194
+ * Calculate time range from selection
1195
+ */
1196
+ static getTimeRangeFromSelection(selection: TimeRangeSelection): TimeRange | null;
1197
+ /**
1198
+ * Convert TimeRange to ISO 8601 format
1199
+ */
1200
+ static toISO(range: TimeRange): TimeRangeISO;
1201
+ /**
1202
+ * Get current quarter (1-4)
1203
+ */
1204
+ static getCurrentQuarter(): Quarter;
1205
+ /**
1206
+ * Generate year options
1207
+ */
1208
+ static generateYearOptions(minYear: number, maxYear: number): TimeRangeOption<number>[];
1209
+ /**
1210
+ * Generate month options
1211
+ */
1212
+ static generateMonthOptions(): TimeRangeOption<number>[];
1213
+ /**
1214
+ * Generate quarter options with custom labels
1215
+ */
1216
+ static generateQuarterOptions(labels: TimeRangePickerLabels): TimeRangeOption<Quarter>[];
1217
+ }
1218
+
1219
+ /**
1220
+ * A flexible time range picker component that supports:
1221
+ * - Year selection
1222
+ * - Quarter selection (year + quarter)
1223
+ * - Month selection (year + month)
1224
+ * - Relative time (last N hours/days/weeks/months)
1225
+ * - Custom date range
1226
+ *
1227
+ * @example
1228
+ * ```html
1229
+ * <mm-time-range-picker
1230
+ * [config]="{ availableTypes: ['year', 'month', 'relative'] }"
1231
+ * (rangeChange)="onRangeChange($event)">
1232
+ * </mm-time-range-picker>
1233
+ * ```
1234
+ */
1235
+ declare class TimeRangePickerComponent implements OnInit, OnChanges {
1236
+ /**
1237
+ * Configuration for the picker
1238
+ */
1239
+ config: TimeRangePickerConfig;
1240
+ /**
1241
+ * Custom labels for the UI
1242
+ */
1243
+ labels: TimeRangePickerLabels;
1244
+ /**
1245
+ * Initial selection to set
1246
+ */
1247
+ initialSelection?: TimeRangeSelection;
1248
+ /**
1249
+ * Emits when the time range changes
1250
+ */
1251
+ rangeChange: EventEmitter<TimeRange>;
1252
+ /**
1253
+ * Emits when the time range changes (ISO format)
1254
+ */
1255
+ rangeChangeISO: EventEmitter<TimeRangeISO>;
1256
+ /**
1257
+ * Emits the current selection state
1258
+ */
1259
+ selectionChange: EventEmitter<TimeRangeSelection>;
1260
+ protected selectedType: i0.WritableSignal<TimeRangeType>;
1261
+ protected selectedYear: i0.WritableSignal<number>;
1262
+ protected selectedQuarter: i0.WritableSignal<Quarter>;
1263
+ protected selectedMonth: i0.WritableSignal<number>;
1264
+ protected relativeValue: i0.WritableSignal<number>;
1265
+ protected relativeUnit: i0.WritableSignal<RelativeTimeUnit>;
1266
+ protected customFrom: i0.WritableSignal<Date>;
1267
+ protected customTo: i0.WritableSignal<Date>;
1268
+ protected mergedLabels: i0.Signal<{
1269
+ rangeType?: string;
1270
+ year?: string;
1271
+ quarter?: string;
1272
+ month?: string;
1273
+ relativeValue?: string;
1274
+ relativeUnit?: string;
1275
+ customFrom?: string;
1276
+ customTo?: string;
1277
+ typeYear?: string;
1278
+ typeQuarter?: string;
1279
+ typeMonth?: string;
1280
+ typeRelative?: string;
1281
+ typeCustom?: string;
1282
+ unitHours?: string;
1283
+ unitDays?: string;
1284
+ unitWeeks?: string;
1285
+ unitMonths?: string;
1286
+ quarter1?: string;
1287
+ quarter2?: string;
1288
+ quarter3?: string;
1289
+ quarter4?: string;
1290
+ }>;
1291
+ protected typeOptions: i0.Signal<TimeRangeOption<TimeRangeType>[]>;
1292
+ protected yearOptions: i0.Signal<TimeRangeOption<number>[]>;
1293
+ protected quarterOptions: i0.Signal<TimeRangeOption<Quarter>[]>;
1294
+ protected monthOptions: i0.Signal<TimeRangeOption<number>[]>;
1295
+ protected relativeUnitOptions: i0.Signal<TimeRangeOption<RelativeTimeUnit>[]>;
1296
+ protected currentRange: i0.Signal<TimeRange | null>;
1297
+ protected minDate: i0.Signal<Date>;
1298
+ protected maxDate: i0.Signal<Date>;
1299
+ protected showTime: i0.Signal<boolean>;
1300
+ ngOnInit(): void;
1301
+ ngOnChanges(changes: SimpleChanges): void;
1302
+ private initializeDefaults;
1303
+ private applySelection;
1304
+ protected onTypeChange(type: TimeRangeType): void;
1305
+ protected onYearChange(year: number): void;
1306
+ protected onQuarterChange(quarter: Quarter): void;
1307
+ protected onMonthChange(month: number): void;
1308
+ protected onRelativeValueChange(value: number): void;
1309
+ protected onRelativeUnitChange(unit: RelativeTimeUnit): void;
1310
+ protected onCustomFromChange(date: Date): void;
1311
+ protected onCustomToChange(date: Date): void;
1312
+ private emitChange;
1313
+ protected isType(type: TimeRangeType): boolean;
1314
+ static ɵfac: i0.ɵɵFactoryDeclaration<TimeRangePickerComponent, never>;
1315
+ static ɵcmp: i0.ɵɵComponentDeclaration<TimeRangePickerComponent, "mm-time-range-picker", never, { "config": { "alias": "config"; "required": false; }; "labels": { "alias": "labels"; "required": false; }; "initialSelection": { "alias": "initialSelection"; "required": false; }; }, { "rangeChange": "rangeChange"; "rangeChangeISO": "rangeChangeISO"; "selectionChange": "selectionChange"; }, never, never, true, never>;
1316
+ }
1317
+
1318
+ /**
1319
+ * Cron Expression Builder - Type definitions and models
1320
+ * Supports 6-field cron format: second minute hour day month weekday
1321
+ */
1322
+ type ScheduleType = 'seconds' | 'minutes' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'custom';
1323
+ type Weekday = 0 | 1 | 2 | 3 | 4 | 5 | 6;
1324
+ interface CronBuilderConfig {
1325
+ /** Show preset quick-select buttons */
1326
+ showPresets?: boolean;
1327
+ /** Show human-readable description of the cron expression */
1328
+ showHumanReadable?: boolean;
1329
+ /** Show next execution times */
1330
+ showNextExecutions?: boolean;
1331
+ /** Number of next executions to show (default: 3) */
1332
+ maxNextExecutions?: number;
1333
+ /** Show copy to clipboard button */
1334
+ showCopyButton?: boolean;
1335
+ /** Allow custom/advanced tab for direct cron editing */
1336
+ allowCustom?: boolean;
1337
+ /** Default schedule type to show */
1338
+ defaultScheduleType?: ScheduleType;
1339
+ /** Locale for human-readable output ('en' | 'de') */
1340
+ locale?: string;
1341
+ }
1342
+ declare const DEFAULT_CRON_BUILDER_CONFIG: CronBuilderConfig;
1343
+ interface CronSchedule {
1344
+ type: ScheduleType;
1345
+ /** For seconds tab: interval in seconds */
1346
+ secondInterval?: number;
1347
+ /** For minutes tab: interval in minutes */
1348
+ minuteInterval?: number;
1349
+ /** For hourly tab */
1350
+ hourInterval?: number;
1351
+ hourMinute?: number;
1352
+ hourSecond?: number;
1353
+ /** For daily/weekly tab */
1354
+ time?: {
1355
+ hour: number;
1356
+ minute: number;
1357
+ second: number;
1358
+ };
1359
+ /** For daily tab: 'every' | 'weekdays' | 'weekends' | 'specific' */
1360
+ dailyMode?: 'every' | 'weekdays' | 'weekends' | 'specific';
1361
+ /** For weekly/daily specific: selected days (0-6, 0=Sunday) */
1362
+ selectedDays?: Weekday[];
1363
+ /** For monthly tab */
1364
+ monthlyMode?: 'specific' | 'relative';
1365
+ dayOfMonth?: number;
1366
+ relativeWeek?: 'first' | 'second' | 'third' | 'fourth' | 'last';
1367
+ relativeDay?: Weekday;
1368
+ /** For custom tab: raw cron fields */
1369
+ customFields?: CronFields;
1370
+ }
1371
+ interface CronFields {
1372
+ second: string;
1373
+ minute: string;
1374
+ hour: string;
1375
+ dayOfMonth: string;
1376
+ month: string;
1377
+ dayOfWeek: string;
1378
+ }
1379
+ interface CronValidationResult {
1380
+ isValid: boolean;
1381
+ error?: string;
1382
+ errorField?: keyof CronFields;
1383
+ }
1384
+ interface CronPreset {
1385
+ id: string;
1386
+ label: string;
1387
+ description: string;
1388
+ expression: string;
1389
+ category?: 'frequent' | 'hourly' | 'daily' | 'weekly' | 'monthly';
1390
+ }
1391
+ declare const CRON_PRESETS: CronPreset[];
1392
+ interface DropdownOption<T = string | number> {
1393
+ value: T;
1394
+ label: string;
1395
+ }
1396
+ declare const SECOND_INTERVALS: DropdownOption<number>[];
1397
+ declare const MINUTE_INTERVALS: DropdownOption<number>[];
1398
+ declare const HOUR_INTERVALS: DropdownOption<number>[];
1399
+ declare const WEEKDAYS: DropdownOption<Weekday>[];
1400
+ declare const WEEKDAY_ABBREVIATIONS: DropdownOption<Weekday>[];
1401
+ declare const RELATIVE_WEEKS: DropdownOption<string>[];
1402
+ /** Generate options for hours (0-23) */
1403
+ declare function generateHourOptions(): DropdownOption<number>[];
1404
+ /** Generate options for minutes/seconds (0-59) */
1405
+ declare function generateMinuteOptions(): DropdownOption<number>[];
1406
+ /** Generate options for day of month (1-31) */
1407
+ declare function generateDayOfMonthOptions(): DropdownOption<number>[];
1408
+
1409
+ declare class CronBuilderComponent implements OnInit, ControlValueAccessor {
1410
+ config: CronBuilderConfig;
1411
+ private readonly cronParser;
1412
+ private readonly cronHumanizer;
1413
+ protected readonly copyIcon: _progress_kendo_svg_icons.SVGIcon;
1414
+ protected readonly clockIcon: _progress_kendo_svg_icons.SVGIcon;
1415
+ protected readonly checkIcon: _progress_kendo_svg_icons.SVGIcon;
1416
+ protected readonly xIcon: _progress_kendo_svg_icons.SVGIcon;
1417
+ private onChange;
1418
+ private onTouched;
1419
+ protected disabled: i0.WritableSignal<boolean>;
1420
+ protected readonly expression: i0.WritableSignal<string>;
1421
+ protected readonly selectedTabIndex: i0.WritableSignal<number>;
1422
+ protected readonly copiedRecently: i0.WritableSignal<boolean>;
1423
+ private suppressOnChange;
1424
+ protected readonly scheduleType: i0.WritableSignal<ScheduleType>;
1425
+ protected readonly secondInterval: i0.WritableSignal<number>;
1426
+ protected readonly minuteInterval: i0.WritableSignal<number>;
1427
+ protected readonly hourInterval: i0.WritableSignal<number>;
1428
+ protected readonly hourMinute: i0.WritableSignal<number>;
1429
+ protected readonly hourSecond: i0.WritableSignal<number>;
1430
+ protected readonly timeHour: i0.WritableSignal<number>;
1431
+ protected readonly timeMinute: i0.WritableSignal<number>;
1432
+ protected readonly timeSecond: i0.WritableSignal<number>;
1433
+ protected readonly dailyMode: i0.WritableSignal<"every" | "weekdays" | "weekends" | "specific">;
1434
+ protected readonly selectedDays: i0.WritableSignal<Weekday[]>;
1435
+ protected readonly monthlyMode: i0.WritableSignal<"relative" | "specific">;
1436
+ protected readonly dayOfMonth: i0.WritableSignal<number>;
1437
+ protected readonly relativeWeek: i0.WritableSignal<string>;
1438
+ protected readonly relativeDay: i0.WritableSignal<Weekday>;
1439
+ protected readonly customSecond: i0.WritableSignal<string>;
1440
+ protected readonly customMinute: i0.WritableSignal<string>;
1441
+ protected readonly customHour: i0.WritableSignal<string>;
1442
+ protected readonly customDayOfMonth: i0.WritableSignal<string>;
1443
+ protected readonly customMonth: i0.WritableSignal<string>;
1444
+ protected readonly customDayOfWeek: i0.WritableSignal<string>;
1445
+ protected readonly mergedConfig: i0.Signal<{
1446
+ showPresets?: boolean;
1447
+ showHumanReadable?: boolean;
1448
+ showNextExecutions?: boolean;
1449
+ maxNextExecutions?: number;
1450
+ showCopyButton?: boolean;
1451
+ allowCustom?: boolean;
1452
+ defaultScheduleType?: ScheduleType;
1453
+ locale?: string;
1454
+ }>;
1455
+ protected readonly humanReadable: i0.Signal<string>;
1456
+ protected readonly validationResult: i0.Signal<_meshmakers_shared_ui.CronValidationResult>;
1457
+ protected readonly nextExecutions: i0.Signal<Date[]>;
1458
+ protected readonly presets: i0.Signal<CronPreset[]>;
1459
+ protected readonly presetsByCategory: i0.Signal<{
1460
+ frequent: CronPreset[];
1461
+ hourly: CronPreset[];
1462
+ daily: CronPreset[];
1463
+ weekly: CronPreset[];
1464
+ monthly: CronPreset[];
1465
+ }>;
1466
+ protected readonly secondIntervalOptions: DropdownOption<number>[];
1467
+ protected readonly minuteIntervalOptions: DropdownOption<number>[];
1468
+ protected readonly hourIntervalOptions: DropdownOption<number>[];
1469
+ protected readonly weekdayOptions: DropdownOption<Weekday>[];
1470
+ protected readonly weekdayAbbreviations: DropdownOption<Weekday>[];
1471
+ protected readonly relativeWeekOptions: DropdownOption<string>[];
1472
+ protected readonly hourOptions: DropdownOption<number>[];
1473
+ protected readonly minuteOptions: DropdownOption<number>[];
1474
+ protected readonly dayOfMonthOptions: DropdownOption<number>[];
1475
+ protected readonly tabIndexToType: ScheduleType[];
1476
+ constructor();
1477
+ ngOnInit(): void;
1478
+ writeValue(value: string): void;
1479
+ registerOnChange(fn: (value: string) => void): void;
1480
+ registerOnTouched(fn: () => void): void;
1481
+ setDisabledState(isDisabled: boolean): void;
1482
+ protected onTabSelect(index: number): void;
1483
+ protected onPresetSelect(preset: CronPreset): void;
1484
+ protected onCopyExpression(): Promise<void>;
1485
+ protected onSecondIntervalChange(value: number): void;
1486
+ protected onMinuteIntervalChange(value: number): void;
1487
+ protected onHourIntervalChange(value: number): void;
1488
+ protected onHourMinuteChange(value: number): void;
1489
+ protected onHourSecondChange(value: number): void;
1490
+ protected onTimeHourChange(value: number): void;
1491
+ protected onTimeMinuteChange(value: number): void;
1492
+ protected onTimeSecondChange(value: number): void;
1493
+ protected onDailyModeChange(mode: 'every' | 'weekdays' | 'weekends' | 'specific'): void;
1494
+ protected onDayToggle(day: Weekday): void;
1495
+ protected isDaySelected(day: Weekday): boolean;
1496
+ protected onMonthlyModeChange(mode: 'specific' | 'relative'): void;
1497
+ protected onDayOfMonthChange(value: number): void;
1498
+ protected onRelativeWeekChange(value: string): void;
1499
+ protected onRelativeDayChange(value: Weekday): void;
1500
+ protected onCustomFieldChange(field: keyof CronFields, value: string): void;
1501
+ protected formatNextExecution(date: Date): string;
1502
+ private buildScheduleFromState;
1503
+ private parseExpressionToState;
1504
+ protected trackByValue(_index: number, item: DropdownOption): number | string;
1505
+ protected trackByPresetId(_index: number, item: CronPreset): string;
1506
+ static ɵfac: i0.ɵɵFactoryDeclaration<CronBuilderComponent, never>;
1507
+ static ɵcmp: i0.ɵɵComponentDeclaration<CronBuilderComponent, "mm-cron-builder", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
1508
+ }
1509
+
1510
+ /**
1511
+ * Service for parsing, validating, and generating cron expressions.
1512
+ * Supports 6-field format: second minute hour dayOfMonth month dayOfWeek
1513
+ */
1514
+ declare class CronParserService {
1515
+ /**
1516
+ * Validate a 6-field cron expression
1517
+ */
1518
+ validate(expression: string): CronValidationResult;
1519
+ /**
1520
+ * Parse a cron expression into a structured CronSchedule object
1521
+ */
1522
+ parse(expression: string): CronSchedule | null;
1523
+ /**
1524
+ * Generate a cron expression from a CronSchedule object
1525
+ */
1526
+ generate(schedule: CronSchedule): string;
1527
+ /**
1528
+ * Calculate next execution times for a cron expression
1529
+ */
1530
+ getNextExecutions(expression: string, count?: number): Date[];
1531
+ private detectScheduleType;
1532
+ private detectDailyMode;
1533
+ private parseInterval;
1534
+ private parseSimpleValue;
1535
+ private isSimpleValue;
1536
+ private parseDaysOfWeek;
1537
+ private generateSecondsExpression;
1538
+ private generateMinutesExpression;
1539
+ private generateHourlyExpression;
1540
+ private generateDailyExpression;
1541
+ private generateWeeklyExpression;
1542
+ private generateMonthlyExpression;
1543
+ private generateCustomExpression;
1544
+ private getWeekNumber;
1545
+ static ɵfac: i0.ɵɵFactoryDeclaration<CronParserService, never>;
1546
+ static ɵprov: i0.ɵɵInjectableDeclaration<CronParserService>;
1547
+ }
1548
+
1549
+ /**
1550
+ * Service for converting cron expressions to human-readable text.
1551
+ * Supports multiple locales (EN, DE).
1552
+ */
1553
+ declare class CronHumanizerService {
1554
+ /**
1555
+ * Convert a cron expression to human-readable text
1556
+ * @param expression The cron expression (5 or 6 fields)
1557
+ * @param locale The locale for output ('en' | 'de')
1558
+ * @returns Human-readable description or error message
1559
+ */
1560
+ toHumanReadable(expression: string, locale?: string): string;
1561
+ /**
1562
+ * Get a detailed description with additional context
1563
+ */
1564
+ toDetailedDescription(expression: string, locale?: string): {
1565
+ summary: string;
1566
+ frequency: string;
1567
+ timing: string;
1568
+ };
1569
+ /**
1570
+ * Check if a locale is supported
1571
+ */
1572
+ isLocaleSupported(locale: string): boolean;
1573
+ /**
1574
+ * Get list of supported locales
1575
+ */
1576
+ getSupportedLocales(): {
1577
+ code: string;
1578
+ name: string;
1579
+ }[];
1580
+ private normalizeLocale;
1581
+ static ɵfac: i0.ɵɵFactoryDeclaration<CronHumanizerService, never>;
1582
+ static ɵprov: i0.ɵɵInjectableDeclaration<CronHumanizerService>;
1583
+ }
1584
+
1585
+ /**
1586
+ * A component that displays a read-only text value with a copy-to-clipboard button.
1587
+ *
1588
+ * @example
1589
+ * ```html
1590
+ * <mm-copyable-text
1591
+ * [value]="rtId"
1592
+ * label="Runtime ID"
1593
+ * copyLabel="Runtime ID">
1594
+ * </mm-copyable-text>
1595
+ * ```
1596
+ */
1597
+ declare class CopyableTextComponent {
1598
+ /** The value to display and copy. Displays an em-dash when null/undefined/empty. */
1599
+ value: string | null | undefined;
1600
+ /** Optional label displayed above the value. */
1601
+ label?: string;
1602
+ /** Label used in the notification message. Falls back to label, then 'Value'. */
1603
+ copyLabel?: string;
1604
+ /** Tooltip for the copy button. */
1605
+ buttonTitle: string;
1606
+ /** Emitted when the value is successfully copied to clipboard. */
1607
+ copied: EventEmitter<string>;
1608
+ protected readonly copyIcon: _progress_kendo_svg_icons.SVGIcon;
1609
+ private readonly notificationService;
1610
+ /** Returns true if the value is non-empty and can be copied. */
1611
+ protected get hasValue(): boolean;
1612
+ /** Copies the value to clipboard and shows a notification. */
1613
+ protected copyToClipboard(): void;
1614
+ static ɵfac: i0.ɵɵFactoryDeclaration<CopyableTextComponent, never>;
1615
+ static ɵcmp: i0.ɵɵComponentDeclaration<CopyableTextComponent, "mm-copyable-text", never, { "value": { "alias": "value"; "required": true; }; "label": { "alias": "label"; "required": false; }; "copyLabel": { "alias": "copyLabel"; "required": false; }; "buttonTitle": { "alias": "buttonTitle"; "required": false; }; }, { "copied": "copied"; }, never, never, true, never>;
1616
+ }
1617
+
1618
+ declare class ImportStrategyDialogResult {
1619
+ strategy: ImportStrategyDto;
1620
+ constructor(strategy: ImportStrategyDto);
1621
+ }
1622
+ declare class ImportStrategyDialogComponent extends DialogContentBase {
1623
+ private readonly dialogRef;
1624
+ message: string;
1625
+ protected selectedStrategy: ImportStrategyDto;
1626
+ protected readonly ImportStrategyDto: typeof ImportStrategyDto;
1627
+ constructor();
1628
+ onImport(): void;
1629
+ onCancel(): void;
1630
+ static ɵfac: i0.ɵɵFactoryDeclaration<ImportStrategyDialogComponent, never>;
1631
+ static ɵcmp: i0.ɵɵComponentDeclaration<ImportStrategyDialogComponent, "mm-import-strategy-dialog", never, { "message": { "alias": "message"; "required": false; }; }, {}, never, never, true, never>;
1632
+ }
1633
+
1634
+ declare class ImportStrategyDialogService {
1635
+ private readonly dialogService;
1636
+ showImportStrategyDialog(title?: string, message?: string): Promise<ImportStrategyDto | null>;
1637
+ static ɵfac: i0.ɵɵFactoryDeclaration<ImportStrategyDialogService, never>;
1638
+ static ɵprov: i0.ɵɵInjectableDeclaration<ImportStrategyDialogService>;
1639
+ }
1640
+
1641
+ declare function provideMmSharedUi(): EnvironmentProviders;
1642
+
1643
+ export { BaseFormComponent, BaseTreeDetailComponent, BytesToSizePipe, CRON_PRESETS, ConfirmationService, CopyableTextComponent, CronBuilderComponent, CronHumanizerService, CronParserService, DEFAULT_CRON_BUILDER_CONFIG, DEFAULT_RESPONSIVE_COLSPAN, DEFAULT_TIME_RANGE_LABELS, DataSourceBase, DataSourceTyped, EntitySelectDialogComponent, EntitySelectDialogService, EntitySelectInputComponent, FetchResultBase, FetchResultTyped, FileUploadService, HAS_UNSAVED_CHANGES, HOUR_INTERVALS, HierarchyDataSource, HierarchyDataSourceBase, ImportStrategyDialogComponent, ImportStrategyDialogResult, ImportStrategyDialogService, ImportStrategyDto, InputDialogComponent, InputService, ListViewComponent, MINUTE_INTERVALS, MessageDetailsDialogComponent, MessageDetailsDialogService, MessageListenerService, MmListViewDataBindingDirective, NotificationDisplayService, PascalCasePipe, ProgressValue, ProgressWindowComponent, ProgressWindowService, RELATIVE_WEEKS, SECOND_INTERVALS, SaveAsDialogComponent, SaveAsDialogService, TimeRangePickerComponent, TimeRangeUtils, TreeComponent, UnsavedChangesDirective, UnsavedChangesGuard, UploadFileDialogComponent, WEEKDAYS, WEEKDAY_ABBREVIATIONS, generateDayOfMonthOptions, generateHourOptions, generateMinuteOptions, provideMmSharedUi };
1644
+ export type { BaseFormConfig, ColumnDefinition, ContextMenuType, CronBuilderConfig, CronFields, CronPreset, CronSchedule, CronValidationResult, DialogFetchOptions, DialogFetchResult, DropdownOption, EntitySelectDialogDataSource, EntitySelectDialogOptions, EntitySelectDialogResult, FetchDataOptions, FetchResult, HasUnsavedChanges, MessageDetailsDialogData, NameAvailabilityResult, NodeDroppedEvent, NodeInfo, ProgressWindowConfig, ProgressWindowData, ProgressWindowOptions, ProgressWindowResult, Quarter, RelativeTimeUnit, ResponsiveFormBreakPoint, SaveAsDialogDataSource, SaveAsDialogOptions, SaveAsDialogResult, ScheduleType, StatusFieldConfig, StatusIconMapping, StatusMapping, TableColumn, TimeRange, TimeRangeISO, TimeRangeOption, TimeRangePickerConfig, TimeRangePickerLabels, TimeRangeSelection, TimeRangeType, Weekday };