@fuentis/phoenix-ui 0.0.9-alpha.62 → 0.0.9-alpha.620

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.
Files changed (28) hide show
  1. package/fesm2022/fuentis-phoenix-ui.mjs +10208 -1066
  2. package/fesm2022/fuentis-phoenix-ui.mjs.map +1 -1
  3. package/index.d.ts +1601 -3
  4. package/package.json +30 -12
  5. package/styles/flag.css +1 -0
  6. package/styles/global.css +58 -1
  7. package/lib/components/data-table/phoenix-data-table/isSelected.pipe.d.ts +0 -7
  8. package/lib/components/data-table/phoenix-data-table/phoenix-data-table.component.d.ts +0 -84
  9. package/lib/components/data-table/phoenix-data-table-action/phoenix-data-table-action.component.d.ts +0 -28
  10. package/lib/components/data-table/phoenix-data-table-tabs/phoenix-data-table-tabs.component.d.ts +0 -16
  11. package/lib/components/data-table/table/table.component.d.ts +0 -40
  12. package/lib/components/data-table/table-caption/table-caption.component.d.ts +0 -32
  13. package/lib/components/data-table/utils/data-cell-value.pipe.d.ts +0 -16
  14. package/lib/components/data-table/utils/dataTable.enum.d.ts +0 -62
  15. package/lib/components/data-table/utils/dataTable.interface.d.ts +0 -44
  16. package/lib/components/data-table/utils/export-type.util.d.ts +0 -4
  17. package/lib/components/data-table/utils/remove-html-tags.pipe.d.ts +0 -7
  18. package/lib/components/data-table/utils/table-cell.pipe.d.ts +0 -10
  19. package/lib/components/search-bar/search-bar.component.d.ts +0 -30
  20. package/lib/components/shell/shell.component.d.ts +0 -9
  21. package/lib/components/sidebar/sidebar.component.d.ts +0 -12
  22. package/lib/components/sidebar-item/sidebar-item.component.d.ts +0 -12
  23. package/lib/components/status-header/status-header.component.d.ts +0 -45
  24. package/lib/components/topbar/topbar.component.d.ts +0 -46
  25. package/lib/components/user/user.component.d.ts +0 -15
  26. package/lib/models/shell-config.model.d.ts +0 -26
  27. package/lib/utils/date-format.service.d.ts +0 -14
  28. package/public-api.d.ts +0 -11
package/index.d.ts CHANGED
@@ -1,5 +1,1603 @@
1
+ import * as i0 from '@angular/core';
2
+ import { EventEmitter, ElementRef, OnChanges, SimpleChanges, QueryList, OnDestroy, OnInit, InjectionToken } from '@angular/core';
3
+ import { ButtonProps } from 'primeng/button';
4
+ import { Popover } from 'primeng/popover';
5
+ import { TranslateService } from '@ngx-translate/core';
6
+ import * as rxjs from 'rxjs';
7
+ import { Subject, Subscription, Observable } from 'rxjs';
8
+ import { Router } from '@angular/router';
9
+ import { Table } from 'primeng/table';
10
+ import * as _angular_forms from '@angular/forms';
11
+ import { FormGroup, FormBuilder, AbstractControl } from '@angular/forms';
12
+ import { HttpClient } from '@angular/common/http';
13
+ import { DynamicDialogRef, DynamicDialogConfig } from 'primeng/dynamicdialog';
14
+ import { Drawer } from 'primeng/drawer';
15
+
16
+ declare class InnerHeaderComponent {
17
+ title: string;
18
+ tooltipContent: string;
19
+ static ɵfac: i0.ɵɵFactoryDeclaration<InnerHeaderComponent, never>;
20
+ static ɵcmp: i0.ɵɵComponentDeclaration<InnerHeaderComponent, "pho-inner-header", never, { "title": { "alias": "title"; "required": false; }; "tooltipContent": { "alias": "tooltipContent"; "required": false; }; }, {}, never, ["*"], true, never>;
21
+ }
22
+
23
+ declare class SidebarComponent {
24
+ toggleSidebar: EventEmitter<boolean>;
25
+ sliderClick: EventEmitter<any>;
26
+ classname: string;
27
+ mainItems: any;
28
+ footerItem: any;
29
+ isHovered: boolean;
30
+ isSlim: boolean;
31
+ get hoverState(): "default" | "hovered";
32
+ onMouseEnter(): void;
33
+ onMouseLeave(): void;
34
+ onToggleSidebar(): void;
35
+ static ɵfac: i0.ɵɵFactoryDeclaration<SidebarComponent, never>;
36
+ static ɵcmp: i0.ɵɵComponentDeclaration<SidebarComponent, "pho-sidebar", never, { "classname": { "alias": "classname"; "required": false; }; "mainItems": { "alias": "mainItems"; "required": false; }; "footerItem": { "alias": "footerItem"; "required": false; }; }, { "toggleSidebar": "toggleSidebar"; "sliderClick": "sliderClick"; }, never, never, true, never>;
37
+ }
38
+
39
+ declare class ActionStateService {
40
+ private _disabledActions;
41
+ get disabledActions(): i0.Signal<Set<string>>;
42
+ disableAction(id: string): void;
43
+ enableAction(id: string): void;
44
+ isDisabled(id: string): boolean;
45
+ static ɵfac: i0.ɵɵFactoryDeclaration<ActionStateService, never>;
46
+ static ɵprov: i0.ɵɵInjectableDeclaration<ActionStateService>;
47
+ }
48
+
49
+ declare enum ActionTypes {
50
+ BASIC = "BASIC",
51
+ SELECT = "SELECT"
52
+ }
53
+ interface Actions {
54
+ }
55
+ type RegisteredActionEnums = Actions[keyof Actions];
56
+ type AllActionValues = RegisteredActionEnums[keyof RegisteredActionEnums];
57
+ interface Action<T = AllActionValues> {
58
+ id?: string;
59
+ actionId: T;
60
+ label: string;
61
+ icon: string;
62
+ severity: Exclude<ButtonProps['severity'], 'warning'> | 'warn';
63
+ iconPos?: 'right' | 'left';
64
+ type: keyof typeof ActionTypes;
65
+ text?: boolean;
66
+ tooltip?: string;
67
+ key?: string;
68
+ requiredPermission?: string;
69
+ data?: any;
70
+ disabled?: boolean;
71
+ visible?: boolean;
72
+ loading?: boolean;
73
+ class?: string;
74
+ items?: {
75
+ key?: string;
76
+ actionId?: T;
77
+ label?: string;
78
+ separator?: boolean;
79
+ icon?: string;
80
+ requiredPermission?: string;
81
+ }[];
82
+ }
83
+ declare class ActionsComponent {
84
+ actionStateService: ActionStateService;
85
+ actions: Action[];
86
+ actionClick: EventEmitter<Action<never>>;
87
+ onActionClick($event: any, action: Action, menuRef?: Popover): void;
88
+ static ɵfac: i0.ɵɵFactoryDeclaration<ActionsComponent, never>;
89
+ static ɵcmp: i0.ɵɵComponentDeclaration<ActionsComponent, "pho-actions", never, { "actions": { "alias": "actions"; "required": false; }; }, { "actionClick": "actionClick"; }, never, never, true, never>;
90
+ }
91
+
92
+ declare enum ActionKinds {
93
+ CREATE = "CREATE",
94
+ SUBMIT = "SUBMIT",
95
+ ASSIGN = "ASSIGN",
96
+ NEW = "NEW",
97
+ UPDATE = "UPDATE",
98
+ RELOAD = "RELOAD",
99
+ CLOSE = "CLOSE",
100
+ OPEN = "OPEN",
101
+ EDIT = "EDIT",
102
+ DELETE = "DELETE",
103
+ EDIT_TRANSITION = "EDIT_TRANSITION",
104
+ ADD_TRANSITION = "ADD_TRANSITION",
105
+ READ = "READ"
106
+ }
107
+
108
+ interface cardConfig {
109
+ name: string;
110
+ subName: string;
111
+ description: string;
112
+ actions: any[];
113
+ additional: any[];
114
+ }
115
+ declare class CardComponent<T extends Record<string, any>> {
116
+ card: i0.InputSignal<T>;
117
+ cardEventEmmiter: i0.OutputEmitterRef<{
118
+ data: T;
119
+ action: string;
120
+ }>;
121
+ actionEnum: typeof ActionKinds;
122
+ cardActions: i0.InputSignal<any>;
123
+ getObjectValueByKey(obj: any, key: string): any;
124
+ descEl: ElementRef<HTMLElement>;
125
+ showTooltip: boolean;
126
+ ngAfterViewInit(): void;
127
+ onCardClick(event: any, actionType?: string): void;
128
+ shouldShowTitleTooltip(): boolean;
129
+ static ɵfac: i0.ɵɵFactoryDeclaration<CardComponent<any>, never>;
130
+ static ɵcmp: i0.ɵɵComponentDeclaration<CardComponent<any>, "phoenix-card", never, { "card": { "alias": "card"; "required": true; "isSignal": true; }; "cardActions": { "alias": "cardActions"; "required": false; "isSignal": true; }; }, { "cardEventEmmiter": "cardEventEmmiter"; }, never, ["[custom]", "[footer]"], true, never>;
131
+ }
132
+
133
+ interface SearchTabs {
134
+ id: number;
135
+ apiUrl: string;
136
+ header: string;
137
+ linkUrl: string;
138
+ }
139
+
140
+ interface SidebarItem {
141
+ module: string;
142
+ items: any;
143
+ }
144
+ interface TopbarItem {
145
+ label: string;
146
+ icon?: string;
147
+ url?: string;
148
+ routerLink?: string[];
149
+ disabled?: boolean;
150
+ path: string;
151
+ }
152
+ interface User {
153
+ email: string;
154
+ username: string;
155
+ imageUrl: string;
156
+ bindImageUrl: string;
157
+ firstname?: string;
158
+ lastname?: string;
159
+ }
160
+ interface ShellConfig {
161
+ user: User;
162
+ mainItems: SidebarItem[][];
163
+ shortModuleName: string;
164
+ footerItem: TopbarItem[];
165
+ topbarModulesMenu: any[];
166
+ searchConfig?: SearchTabs[];
167
+ }
168
+
169
+ interface TopbarModuleItem {
170
+ label: string;
171
+ fullName?: string;
172
+ icon?: string;
173
+ url?: string;
174
+ routerLink?: string[];
175
+ disabled?: boolean;
176
+ }
177
+ interface TopbarModuleGroup {
178
+ label: string;
179
+ layout: 'full' | 'grid';
180
+ showIconBackground: boolean;
181
+ items: TopbarModuleItem[];
182
+ }
183
+ interface TopbarFooterConfig {
184
+ companyName: string;
185
+ companyUrl: string;
186
+ guideLabel: string;
187
+ guideUrl: string;
188
+ copyrightText: string;
189
+ }
190
+ interface UrlConfig {
191
+ url: string | null;
192
+ disabled?: boolean;
193
+ }
194
+ declare class TopbarComponent {
195
+ sidebarConfig: {
196
+ visible: boolean;
197
+ type: string;
198
+ };
199
+ currentYear: number;
200
+ isSidebarVisible: boolean;
201
+ homeUrl: string;
202
+ user: User;
203
+ shortModuleName?: string;
204
+ hidelogo?: boolean;
205
+ topbarModulesMenu: any[];
206
+ darkModeSelector: any;
207
+ urlConfig?: UrlConfig;
208
+ footerConfig: TopbarFooterConfig;
209
+ onDarkModeSelect: EventEmitter<void>;
210
+ onUserPopoverAction: EventEmitter<string>;
211
+ closeCallback(event: any): void;
212
+ searchConfig: i0.InputSignal<SearchTabs[] | undefined>;
213
+ openSidebarPanel(): void;
214
+ private messageService;
215
+ private translateService;
216
+ /** ✅ Zatvara sidebar */
217
+ closeSidebar(): void;
218
+ ngOnInit(): void;
219
+ onDarkModeSelectEmit(): void;
220
+ goToHome(): void;
221
+ goToTicketCenter(): void;
222
+ copyToClipboard($event: any, linkUrl: any): void;
223
+ get bindImageUrl(): string;
224
+ static ɵfac: i0.ɵɵFactoryDeclaration<TopbarComponent, never>;
225
+ static ɵcmp: i0.ɵɵComponentDeclaration<TopbarComponent, "pho-topbar", never, { "homeUrl": { "alias": "homeUrl"; "required": false; }; "user": { "alias": "user"; "required": false; }; "shortModuleName": { "alias": "shortModuleName"; "required": false; }; "hidelogo": { "alias": "hidelogo"; "required": false; }; "topbarModulesMenu": { "alias": "topbarModulesMenu"; "required": false; }; "darkModeSelector": { "alias": "darkModeSelector"; "required": false; }; "urlConfig": { "alias": "urlConfig"; "required": false; }; "footerConfig": { "alias": "footerConfig"; "required": false; }; "searchConfig": { "alias": "searchConfig"; "required": false; "isSignal": true; }; }, { "onDarkModeSelect": "onDarkModeSelect"; "onUserPopoverAction": "onUserPopoverAction"; }, never, ["*"], true, never>;
226
+ }
227
+
228
+ declare class BaseObject {
229
+ name: string;
230
+ uuid: string;
231
+ constructor(partial: Partial<BaseObject>);
232
+ }
233
+ declare class BaseObjectType {
234
+ id: number;
235
+ labelKey: string;
236
+ labelKeyValEn: string;
237
+ labelKeyValDe: string;
238
+ labelKeyValSr?: string;
239
+ labelKeyVal?: string;
240
+ [key: string]: any;
241
+ constructor(partial: Partial<BaseObjectType>);
242
+ }
243
+
244
+ declare class SearchResult {
245
+ name: string;
246
+ title: string;
247
+ uuid: string;
248
+ type?: BaseObjectType;
249
+ entity?: BaseObject;
250
+ scopes?: BaseObject[];
251
+ asset?: BaseObject;
252
+ score?: number;
253
+ togType?: string;
254
+ url?: string;
255
+ constructor(partial: Partial<SearchResult>);
256
+ }
257
+
258
+ interface TypesFilter {
259
+ title: string;
260
+ checkboxes: any;
261
+ }
262
+ declare class SearchBarComponent {
263
+ translate: TranslateService;
264
+ op: any;
265
+ elm: ElementRef;
266
+ private crudService;
267
+ tabs: i0.InputSignal<SearchTabs[] | undefined>;
268
+ isOpen: boolean;
269
+ valueChanges: Subject<Event>;
270
+ inputEvent: Event;
271
+ clonedData?: SearchResult[];
272
+ searchData?: SearchResult[];
273
+ size: number;
274
+ tabIndex: number;
275
+ trigg: boolean;
276
+ inputText?: string;
277
+ textValue: string;
278
+ checkboxes: {
279
+ [key: string]: boolean;
280
+ };
281
+ valueSub$: Subscription;
282
+ reloadSubscription$?: Subscription;
283
+ mocekedFilters: TypesFilter[];
284
+ constructor(translate: TranslateService);
285
+ expand(): void;
286
+ onParentClick(event: Event): void;
287
+ onTabClick(id: number): void;
288
+ onScroll(scrollObj: Event): void;
289
+ populateFilters(data?: SearchResult[]): void;
290
+ onClick(data: {
291
+ value: {
292
+ checked: boolean;
293
+ };
294
+ name: string;
295
+ }): void;
296
+ filterData(makeNewFilters?: boolean): void;
297
+ setCheckBoxes(): void;
298
+ setLinkUrl(data?: any): void;
299
+ ngOnDestroy(): void;
300
+ static ɵfac: i0.ɵɵFactoryDeclaration<SearchBarComponent, never>;
301
+ static ɵcmp: i0.ɵɵComponentDeclaration<SearchBarComponent, "pho-search-bar", never, { "tabs": { "alias": "tabs"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
302
+ }
303
+
304
+ declare class SidebarItemComponent implements OnChanges {
305
+ private router;
306
+ item: any;
307
+ classname: string;
308
+ sliderClick: EventEmitter<any>;
309
+ constructor(router: Router);
310
+ onSliderClick($event: any, menu: any): void;
311
+ onSliderItemsClick(event: any): void;
312
+ ngOnChanges(_: SimpleChanges): void;
313
+ static ɵfac: i0.ɵɵFactoryDeclaration<SidebarItemComponent, never>;
314
+ static ɵcmp: i0.ɵɵComponentDeclaration<SidebarItemComponent, "pho-sidebar-item", never, { "item": { "alias": "item"; "required": false; }; "classname": { "alias": "classname"; "required": false; }; }, { "sliderClick": "sliderClick"; }, never, never, true, never>;
315
+ }
316
+
317
+ declare class UserComponent {
318
+ user: User;
319
+ actionEmmiter: EventEmitter<string>;
320
+ static ɵfac: i0.ɵɵFactoryDeclaration<UserComponent, never>;
321
+ static ɵcmp: i0.ɵɵComponentDeclaration<UserComponent, "pho-user", never, { "user": { "alias": "user"; "required": false; }; }, { "actionEmmiter": "actionEmmiter"; }, never, never, true, never>;
322
+ }
323
+
324
+ declare class StatusHeaderComponent {
325
+ onQuickPickClickEmiter: EventEmitter<void>;
326
+ onToggleClickEmmiter: EventEmitter<"forward" | "back">;
327
+ onCloseEvent: EventEmitter<void>;
328
+ type: any;
329
+ items: any;
330
+ name: string;
331
+ title: string;
332
+ tag?: {
333
+ icon?: string;
334
+ text?: string;
335
+ variant?: string;
336
+ };
337
+ tags?: Array<{
338
+ icon?: string;
339
+ value?: string;
340
+ variant?: string;
341
+ color?: string;
342
+ tooltip?: string;
343
+ }>;
344
+ enableQuickPick: boolean;
345
+ actions: any[];
346
+ panelState: boolean;
347
+ customClose: boolean;
348
+ validSeverities: string[];
349
+ onToggleClick(direction: 'forward' | 'back'): void;
350
+ toggleSidePanel(): void;
351
+ closePanel(): void;
352
+ static ɵfac: i0.ɵɵFactoryDeclaration<StatusHeaderComponent, never>;
353
+ static ɵcmp: i0.ɵɵComponentDeclaration<StatusHeaderComponent, "phoenix-status-header", never, { "type": { "alias": "type"; "required": false; }; "items": { "alias": "items"; "required": false; }; "name": { "alias": "name"; "required": false; }; "title": { "alias": "title"; "required": false; }; "tag": { "alias": "tag"; "required": false; }; "tags": { "alias": "tags"; "required": false; }; "enableQuickPick": { "alias": "enableQuickPick"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; "panelState": { "alias": "panelState"; "required": false; }; "customClose": { "alias": "customClose"; "required": false; }; }, { "onQuickPickClickEmiter": "onQuickPickClickEmiter"; "onToggleClickEmmiter": "onToggleClickEmmiter"; "onCloseEvent": "onCloseEvent"; }, never, never, true, never>;
354
+ }
355
+
356
+ declare enum StatusColType {
357
+ TAG = "TAG",
358
+ STRING = "STRING",
359
+ PERSON = "PERSON",
360
+ LINK = "LINK",
361
+ DATE = "DATE",
362
+ DATE_ONLY = "DATE_ONLY",
363
+ LIST = "LIST",
364
+ COUNTRY = "COUNTRY",
365
+ COPY_TO_CLIPBOARD = "COPY_TO_CLIPBOARD"
366
+ }
367
+
368
+ declare enum StatusTooltipType {
369
+ TAG = "TAG",
370
+ STRING = "STRING",
371
+ PERSON = "PERSON",
372
+ LINK = "LINK",
373
+ DATE = "DATE",
374
+ DATE_ONLY = "DATE_ONLY",
375
+ COPY_TO_CLIPBOARD = "COPY_TO_CLIPBOARD",
376
+ DATE_PERSON = "DATE_PERSON"
377
+ }
378
+ interface StatusTooltipItem {
379
+ label: string;
380
+ value: string | null;
381
+ type: StatusTooltipType;
382
+ value1?: string;
383
+ value2?: string;
384
+ }
385
+ interface StatusAttribute {
386
+ type: StatusColType;
387
+ label: string;
388
+ value: any;
389
+ dateFormat?: string;
390
+ key?: string;
391
+ color?: string;
392
+ icon?: string;
393
+ value1?: string;
394
+ value2?: string;
395
+ tooltip?: StatusTooltipItem[];
396
+ url?: string;
397
+ item?: {
398
+ name: string;
399
+ url?: string;
400
+ disabled?: boolean;
401
+ }[] | string | null;
402
+ }
403
+
404
+ interface ContextObjectTag {
405
+ text: string;
406
+ icon?: string;
407
+ variant?: string;
408
+ color?: string;
409
+ label?: string;
410
+ group?: string;
411
+ }
412
+ interface ContextObjectConfig {
413
+ showHeader?: boolean;
414
+ type?: string;
415
+ name?: string;
416
+ title?: string;
417
+ tags?: ContextObjectTag[];
418
+ labels?: ContextObjectTag[];
419
+ otherInfo?: StatusAttribute[];
420
+ backRoute?: any[];
421
+ }
422
+
423
+ declare class ContexObjectComponent {
424
+ config?: ContextObjectConfig;
425
+ dateFormat: string;
426
+ dateOnlyFormat: string;
427
+ router: Router;
428
+ statusTooltipType: typeof StatusTooltipType;
429
+ validSeverities: string[];
430
+ get ctxType(): string | undefined;
431
+ get ctxName(): string;
432
+ get ctxTitle(): string;
433
+ get ctxTags(): ContextObjectTag[];
434
+ /**
435
+ * Groups tags by their `group` property.
436
+ * Ungrouped tags are returned as-is.
437
+ * Grouped tags collapse into one display entry showing the first tag + remaining count.
438
+ */
439
+ get displayTags(): {
440
+ tag: ContextObjectTag;
441
+ groupedTags: ContextObjectTag[];
442
+ remainingCount: number;
443
+ }[];
444
+ get ctxLabels(): {
445
+ text: string;
446
+ }[];
447
+ get ctxBackRoute(): any[] | undefined;
448
+ get ctxOtherInfo(): StatusAttribute[];
449
+ tagPopovers: QueryList<Popover>;
450
+ onTagPopoverEnter(event: Event, currentPopover: Popover): void;
451
+ onTagPopoverLeave(event: Event, currentPopover: Popover): void;
452
+ onBackClick(): void;
453
+ getFullUrl(path: string): string;
454
+ static ɵfac: i0.ɵɵFactoryDeclaration<ContexObjectComponent, never>;
455
+ static ɵcmp: i0.ɵɵComponentDeclaration<ContexObjectComponent, "phoenix-contex-object", never, { "config": { "alias": "config"; "required": false; }; "dateFormat": { "alias": "dateFormat"; "required": false; }; "dateOnlyFormat": { "alias": "dateOnlyFormat"; "required": false; }; }, {}, never, never, true, never>;
456
+ }
457
+
458
+ interface ShellTheme {
459
+ mode: 'light' | 'dark' | 'system';
460
+ }
461
+ declare class ShellComponent {
462
+ config: {
463
+ user: any;
464
+ shortModuleName: string;
465
+ hidelogo?: boolean;
466
+ /** header control */
467
+ headerContext?: ContextObjectConfig;
468
+ searchConfig?: any;
469
+ topbarModulesMenu?: any;
470
+ urlConfig?: {
471
+ url: string | null;
472
+ disabled?: boolean;
473
+ };
474
+ mainItems?: any[];
475
+ footerItem?: any;
476
+ };
477
+ darkModeSelector: {
478
+ mode: string;
479
+ };
480
+ theme: ShellTheme;
481
+ onDarkModeSelect: EventEmitter<any>;
482
+ onIsSlimSelect: EventEmitter<any>;
483
+ onUserAction: EventEmitter<string>;
484
+ sliderClick: EventEmitter<any>;
485
+ themeChange: EventEmitter<ShellTheme>;
486
+ isSlim: boolean;
487
+ readonly gridTemplateColumns = "auto 1fr";
488
+ /** if showHeader=true adding additional row between topbar and content */
489
+ get gridTemplateRows(): string;
490
+ toggleSidebar(isSlim: boolean): void;
491
+ onThemeChange(mode: ShellTheme['mode']): void;
492
+ selectDarkMode(): void;
493
+ static ɵfac: i0.ɵɵFactoryDeclaration<ShellComponent, never>;
494
+ static ɵcmp: i0.ɵɵComponentDeclaration<ShellComponent, "pho-shell", never, { "config": { "alias": "config"; "required": false; }; "darkModeSelector": { "alias": "darkModeSelector"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; }, { "onDarkModeSelect": "onDarkModeSelect"; "onIsSlimSelect": "onIsSlimSelect"; "onUserAction": "onUserAction"; "sliderClick": "sliderClick"; "themeChange": "themeChange"; }, never, ["*"], true, never>;
495
+ }
496
+
497
+ declare enum tableActionType {
498
+ CREATE = "create",
499
+ EDIT = "edit",
500
+ BULK_EDIT = "bulk_edit",
501
+ DELETE = "delete",
502
+ DETAILS = "details",
503
+ ASSIGN = "assign",
504
+ APPLY = "apply",
505
+ OPEN_IN_NEW_TAB = "open_in_new_tab",
506
+ TAB = "tab",
507
+ OPEN_FULL_SCREEN = "open_full_screen",
508
+ ADD_LINK = "add_link",
509
+ DISCONNECT = "disconnect",
510
+ REMOVE = "remove",
511
+ SYNC = "sync",
512
+ MENU = "menu",
513
+ DROP = "drop",
514
+ OVERVIEW = "overview",
515
+ HISTORY = "syncHistory",
516
+ DOWNLOAD = "download",
517
+ ATTACH = "attach",
518
+ IMPORT = "import",
519
+ ROW_DELETE = "row_delete",
520
+ RUN = "run",
521
+ ASSIGN_FROM_CATALOG = "ASSIGN_FROM_CATALOG",
522
+ ASSIGN_FROM_ITEM = "ASSIGN_FROM_ITEM",
523
+ ASSIGN_CONTROLS = "ASSING_CONTROLS",
524
+ ASSIGN_MEASURE = "ASSGIN_MEASURE",
525
+ CREATE_ADITIONAL_MEASURE = "CREATE_ADITIONAL_MEASURE"
526
+ }
527
+ declare enum tableButtonFormat {
528
+ TEXT_ICON = "TEXT_ICON",
529
+ TEXT = "TEXT",
530
+ ICON = "ICON",
531
+ ICON_ROUNDED = "ICON_ROUNDED"
532
+ }
533
+ declare enum tableButtonContext {
534
+ GLOBAL = "GLOBAL",
535
+ MORE = "MORE",
536
+ BULK = "BULK",
537
+ ROW = "ROW"
538
+ }
539
+ declare enum tableColumnType {
540
+ TEXT = "TEXT",
541
+ TIMEPERIOD = "TIMEPERIOD",
542
+ RICH_TEXT = "RICH_TEXT",
543
+ TEXT_AREA = "TEXT_AREA",
544
+ DATE = "DATE",
545
+ DATE_COMPLEX = "DATE_COMPLEX",//Date and time
546
+ TAG = "TAG",
547
+ OBJ_TAG = "OBJ_TAG",
548
+ LIST_TAG = "LIST_TAG",
549
+ NUMBER = "NUMBER",
550
+ PERSON = "PERSON",
551
+ COMPLETNESS = "COMPLETNESS",
552
+ BOOLEAN = "BOOLEAN",
553
+ LIST = "LIST",
554
+ CUSTOM = "CUSTOM",
555
+ EMAIL = "EMAIL"
556
+ }
557
+ declare enum tableSelectionType {
558
+ CHECKBOX = "checkbox",
559
+ RADIO_BTN = "radio_btn"
560
+ }
561
+ declare enum tableFilterType {
562
+ DATE = "date",
563
+ BOOLEAN = "boolean",
564
+ MULTISELECT = "multiselect",
565
+ COMPLETNESS = "completness"
566
+ }
567
+
568
+ type SortOrder = 1 | -1;
569
+ interface InitialSortMeta {
570
+ /**
571
+ * Column field used for initial sorting.
572
+ * Must match TableColumn.field (dot paths allowed if your table supports it).
573
+ */
574
+ field: string;
575
+ /**
576
+ * Sort direction:
577
+ * 1 => ASC
578
+ * -1 => DESC
579
+ * Defaults to ASC (1).
580
+ */
581
+ order?: SortOrder;
582
+ }
583
+ interface TableConfiguration {
584
+ /**
585
+ * Unique table key (used for caching filters/columns state, analytics, etc).
586
+ * NOTE: you already use `key` for checkbox id override; keep that,
587
+ * but consider also adding tableKey if you want to separate concerns.
588
+ */
589
+ key?: string;
590
+ /**
591
+ * Alternative unique key ONLY for localStorage/state (recommended).
592
+ * If not provided, fallback to `key`.
593
+ */
594
+ stateKey?: string;
595
+ /**
596
+ * Row identity field used by PrimeNG dataKey (default: 'id').
597
+ * Use this when records don’t have `id` (e.g. GAP tab).
598
+ */
599
+ dataKey?: string;
600
+ /** Actions rendered in bulk mode (when selection exists). */
601
+ bulkActions?: TableAction[];
602
+ /** Actions rendered per row (right-side action column). */
603
+ rowActions?: TableAction[];
604
+ /** Actions rendered in caption left side (near tabs). */
605
+ globalActions?: TableAction[];
606
+ /** “More” dropdown action config (menu/split button). */
607
+ moreActions?: TableAction;
608
+ /** Tabs in table (if exists). */
609
+ tabs?: TabAction[];
610
+ /** Enables export buttons / export actions. */
611
+ exportTable: boolean;
612
+ /** Enables filter popover + filter icon. */
613
+ hasFilter?: boolean;
614
+ /** Enables column visibility popover + columns icon. */
615
+ hasColumns?: boolean;
616
+ /** Enables global search input. */
617
+ hasSearch?: boolean;
618
+ /** Enables “More” dropdown area. */
619
+ hasMore?: boolean;
620
+ /** Show/hide columns feature (legacy) */
621
+ toggleColumns?: boolean;
622
+ toogleColumnsData?: TableColumn[];
623
+ /** Enables row cell click behavior (open details etc). */
624
+ hasCellClick?: boolean;
625
+ /**
626
+ * How many left-most columns are clickable (default: 1).
627
+ * If hasCellClick = true, only first N columns will trigger row click.
628
+ */
629
+ clickableColumnCount?: number;
630
+ /** Table height, required for scroll/virtual scroll. */
631
+ scrollHeight?: string;
632
+ /** Number of rows per page (PrimeNG paginator / virtual scroll configs). */
633
+ rows?: number;
634
+ /** Checkbox / radio selection behavior. */
635
+ selectionType?: tableSelectionType;
636
+ /**
637
+ * If you need click on row table use 'single'.
638
+ * If using radio/checkbox selection, omit or manage carefully.
639
+ */
640
+ selectionMode?: 'single' | 'multiple';
641
+ /** Enables global filter (legacy flag). */
642
+ globalFilter?: boolean;
643
+ /** Filter config shown in caption/popover (your old config). */
644
+ filterConfiguration?: any[];
645
+ /**
646
+ * Initial sort configuration.
647
+ * - Single column: { field: 'createdAt', order: -1 }
648
+ * - Multi-sort: [{ field: 'status', order: 1 }, { field: 'createdAt', order: -1 }]
649
+ */
650
+ initialSort?: InitialSortMeta | InitialSortMeta[];
651
+ /**
652
+ * @deprecated Legacy single-field initial sort support.
653
+ * Prefer `initialSort`.
654
+ */
655
+ initialSortField?: string;
656
+ /**
657
+ * @deprecated Legacy order for initialSortField.
658
+ * 1 = ASC, -1 = DESC
659
+ */
660
+ initialSortOrder?: SortOrder;
661
+ }
662
+ interface TableAction {
663
+ key?: string;
664
+ label: string;
665
+ format?: tableButtonFormat;
666
+ context: tableButtonContext;
667
+ type: tableActionType;
668
+ disabled?: boolean;
669
+ notauthorized?: boolean;
670
+ buttonType?: string;
671
+ ui?: 'button' | 'menu' | 'switch' | 'checkbox';
672
+ /** Action menu items (type-safe version recommended later). */
673
+ items?: any;
674
+ checkboxrelatedauth?: boolean;
675
+ icon?: string;
676
+ /** Optional confirmation behavior. */
677
+ confirmationMsgKey?: string;
678
+ confirmationMode?: ConfirmationMode;
679
+ typing?: TypingConfirmationConfig;
680
+ }
681
+ interface TabAction {
682
+ key?: string;
683
+ label: string;
684
+ type: tableActionType;
685
+ badgeCount?: number;
686
+ disabled?: boolean;
687
+ }
688
+ type ConfirmationMode = 'DEFAULT' | 'TYPING';
689
+ interface TypingConfirmationConfig {
690
+ confirmText?: string;
691
+ warningKey?: string;
692
+ typeBelowKey?: string;
693
+ submitLabelKey?: string;
694
+ cancelLabelKey?: string;
695
+ subtitleKey?: string;
696
+ caseInsensitive?: boolean;
697
+ }
698
+ interface TableColumn {
699
+ header: string;
700
+ field: string;
701
+ columnType: string;
702
+ filter?: string;
703
+ filterOptions?: any;
704
+ /** Enables/disables sorting for the column. */
705
+ sortable?: boolean;
706
+ /** Custom HTML renderer for the cell (if you use it). */
707
+ customRenderer?: (rowData: any) => string;
708
+ }
709
+
710
+ type SortMeta = {
711
+ field: string;
712
+ order: 1 | -1;
713
+ };
714
+ type ColumnTypeMap = Record<string, string>;
715
+ interface SortRequest {
716
+ reqId: number;
717
+ data: any[];
718
+ multiSortMeta: SortMeta[];
719
+ columnTypeMap: ColumnTypeMap;
720
+ dateTypeKey?: string;
721
+ }
722
+ interface SortResponse {
723
+ reqId: number;
724
+ sorted: any[];
725
+ }
726
+ declare class TableComponent implements OnChanges, OnDestroy {
727
+ /** PrimeNG Table reference (used for sort meta + virtual scroll helpers). */
728
+ dt: Table;
729
+ translateService: TranslateService;
730
+ private cdr;
731
+ /**
732
+ * originalData:
733
+ * The raw dataset received through @Input() set data().
734
+ * We never mutate this array; it is the "source of truth".
735
+ */
736
+ originalData: any[];
737
+ /**
738
+ * allData:
739
+ * The dataset after applying filters and global search.
740
+ * This is the "base dataset" that sorting runs on.
741
+ */
742
+ allData: any[];
743
+ /**
744
+ * tableData:
745
+ * The final dataset rendered by the table.
746
+ * IMPORTANT: This is still the full array; PrimeNG virtual scroll renders only visible rows.
747
+ */
748
+ tableData: any[];
749
+ /** Total record count shown (used in footer and table metadata). */
750
+ totalRecords: number;
751
+ /** Selected rows (signal so UI updates fast). */
752
+ selectedItems: i0.WritableSignal<any[]>;
753
+ /** Currently visible columns (based on table-caption selection). */
754
+ selectedColumns: any[];
755
+ searchQuery: string;
756
+ bulkMode: boolean;
757
+ selectionTypeEnum: typeof tableSelectionType;
758
+ columnTypeEnum: typeof tableColumnType;
759
+ /** Latest active filters coming from table-caption. */
760
+ private currentFilters;
761
+ /**
762
+ * columnTypeMap:
763
+ * field -> columnType (DATE/BOOLEAN/TEXT/etc).
764
+ * The sort worker uses this to normalize values correctly (e.g., DATE parsing, BOOLEAN 0/1).
765
+ */
766
+ columnTypeMap: Record<string, string>;
767
+ dateFormat: string;
768
+ columns: any[];
769
+ selectedColumnsInput: any[];
770
+ tableConfiguration: TableConfiguration;
771
+ filters: any;
772
+ actionClick: EventEmitter<any>;
773
+ rowSelection: EventEmitter<any>;
774
+ checkBoxSelection: EventEmitter<any>;
775
+ saveColumns: EventEmitter<string[]>;
776
+ private sortWorker;
777
+ /**
778
+ * reqId counters ensure we can ignore outdated results
779
+ * if user triggers multiple sorts quickly.
780
+ */
781
+ private workerReqId;
782
+ private latestWorkerReqId;
783
+ /**
784
+ * lastSortKey prevents re-sorting when PrimeNG emits same multiSortMeta repeatedly.
785
+ */
786
+ private lastSortKey;
787
+ /** Ensures initial sort runs only once per dataset/config change */
788
+ private initialSortApplied;
789
+ /** Remembers which field was used last time for initial sort (optional safety) */
790
+ private initialSortFieldApplied;
791
+ /** True while initial sort is running to avoid "flash" of unsorted data */
792
+ initialSortLoading: boolean;
793
+ private createSortWorkerInline;
794
+ constructor();
795
+ ngOnDestroy(): void;
796
+ /**
797
+ * Whenever parent sets data, we reset base datasets and invalidate sort cache.
798
+ */
799
+ set data(value: any[]);
800
+ ngOnChanges(changes: SimpleChanges): void;
801
+ /**
802
+ * PrimeNG calls this when sorting changes.
803
+ * We run worker sort only when meta changes.
804
+ */
805
+ onCustomSort(event: any): void;
806
+ /**
807
+ * Dispatches sort request to the worker (or sync fallback).
808
+ */
809
+ private runWorkerSort;
810
+ /**
811
+ * Synchronous sort fallback (used if WebWorker is not available).
812
+ * Uses the same normalization logic as your worker approach.
813
+ */
814
+ private sortSync;
815
+ private normalizeInitialSort;
816
+ /**
817
+ * Applies initial sort once:
818
+ * - Uses tableConfiguration.initialSortField if provided
819
+ * - Otherwise uses the first available column field
820
+ * - Always ASC (order = 1)
821
+ *
822
+ * Runs only when:
823
+ * - we have data
824
+ * - we have columns/selectedColumns
825
+ * - it hasn't been applied yet for current dataset
826
+ */
827
+ private applyInitialSortIfNeeded;
828
+ /**
829
+ * Applies global search over the currently filtered dataset.
830
+ * Then re-applies sort if any sort is active.
831
+ */
832
+ onSearch(query: string): void;
833
+ /**
834
+ * Called from table-caption when filter form changes.
835
+ * Rebuilds allData and re-applies current sorting.
836
+ */
837
+ applyFilters(filters: Record<string, any>): void;
838
+ /**
839
+ * If table is currently sorted, re-run sort on new base dataset.
840
+ * Otherwise just render base dataset.
841
+ */
842
+ private applyCurrentSortOrReset;
843
+ private getValueByPath;
844
+ private matchesQuery;
845
+ /**
846
+ * Applies currentFilters to originalData and returns the filtered result.
847
+ * Supports:
848
+ * - single value (primitive or {key,...})
849
+ * - multi-select arrays (primitives or objects with .key)
850
+ * - empty filters mean "match all"
851
+ */
852
+ private getFilteredData;
853
+ /**
854
+ * Reads nested values using dot paths and unwraps `.key` when present.
855
+ */
856
+ private getNestedValue;
857
+ /**
858
+ * Produces comparable primitives for sorting (sync fallback).
859
+ * The worker uses its own copy of this logic.
860
+ */
861
+ private getComparableValue;
862
+ private compareStringsNatural;
863
+ onSelectionChange(selected: any[]): void;
864
+ onRowClick(event: Event, rowData: any): void;
865
+ clearSelection(): void;
866
+ /**
867
+ * Handles export actions locally, otherwise bubbles up to parent.
868
+ */
869
+ handleActionClick(event: any): void;
870
+ /**
871
+ * Used by checkbox template to disable selection on specific rows.
872
+ */
873
+ isRowSelectable(event: any): boolean;
874
+ /**
875
+ * Some tables allow click on first N columns to open details.
876
+ */
877
+ isColumnClickable(columnIndex: number): boolean;
878
+ /**
879
+ * Utility for copy icons inside cells (prevents row-click).
880
+ */
881
+ copyToClipboard(event: Event, text: string): void;
882
+ /**
883
+ * Generic nested getter used by templates (flags etc).
884
+ */
885
+ getNested(obj: any, path?: string): any;
886
+ /**
887
+ * Applies column selection coming from table-caption (array of field names).
888
+ */
889
+ applyColumns(selected: any[]): void;
890
+ static ɵfac: i0.ɵɵFactoryDeclaration<TableComponent, never>;
891
+ static ɵcmp: i0.ɵɵComponentDeclaration<TableComponent, "phoenix-table", never, { "columns": { "alias": "columns"; "required": false; }; "selectedColumnsInput": { "alias": "selectedColumnsInput"; "required": false; }; "tableConfiguration": { "alias": "tableConfiguration"; "required": false; }; "filters": { "alias": "filters"; "required": false; }; "data": { "alias": "data"; "required": false; }; }, { "actionClick": "actionClick"; "rowSelection": "rowSelection"; "checkBoxSelection": "checkBoxSelection"; "saveColumns": "saveColumns"; }, never, never, true, never>;
892
+ }
893
+
894
+ interface MetaControl {
895
+ id: any;
896
+ position: number;
897
+ readOnly?: boolean;
898
+ userFriendlyMessage: string;
899
+ mandatory: boolean;
900
+ hidden?: boolean;
901
+ style: {
902
+ colWidth: number;
903
+ };
904
+ configuration: {
905
+ id?: number;
906
+ key: string;
907
+ type: string;
908
+ options?: {
909
+ key: string;
910
+ userFriendlyMessage: string;
911
+ }[];
912
+ };
913
+ validators?: any;
914
+ }
915
+
916
+ declare class MetaFormService {
917
+ router: Router;
918
+ private formEvent;
919
+ private formReadOnlySubject;
920
+ private formTabContent;
921
+ private formDirtyStatus;
922
+ private formBuildCompletedSubject;
923
+ currentFormState: rxjs.Observable<any>;
924
+ formReadOnlyState: rxjs.Observable<boolean>;
925
+ currentFormTabContent: rxjs.Observable<string>;
926
+ currentFormDirtyStatus: rxjs.Observable<boolean>;
927
+ /**
928
+ * Notify when form is completed
929
+ * @description Notifies you about when form bild is completed in meta-form component class. Usefull when you need to attach some listeners on form controls or any other action related to form when all controls are avaiable
930
+ * @returns {boolean}
931
+ */
932
+ formBuildCompleted: rxjs.Observable<boolean>;
933
+ constructor();
934
+ setFormEvent(event: any): void;
935
+ setFormReadOnlyState(state: boolean): void;
936
+ setFormTabContent(tabContent: string): void;
937
+ setFormDirtyStatus(status: boolean): void;
938
+ /**
939
+ * Sets the form build completion status to indicate when the form is created.
940
+ *
941
+ * @param {boolean} isCompleted - A boolean value to indicate whether the form build is completed.
942
+ * Set to `true` when the form is fully created.
943
+ *
944
+ * @description This method is used to notify when the form is created and ready for use.
945
+ */
946
+ setFormBuildCompletition(isCompleted: boolean): void;
947
+ static ɵfac: i0.ɵɵFactoryDeclaration<MetaFormService, never>;
948
+ static ɵprov: i0.ɵɵInjectableDeclaration<MetaFormService>;
949
+ }
950
+
951
+ declare abstract class MetaFormAbstract {
952
+ private fb;
953
+ metaService: MetaFormService;
954
+ private translateService;
955
+ private http;
956
+ metaForm: FormGroup;
957
+ metaFormValues: any;
958
+ metaFormControls: any;
959
+ loading: boolean;
960
+ disableForm: boolean;
961
+ formButtons: boolean;
962
+ groupForm: boolean;
963
+ formStyle: any;
964
+ onFormSubmit: EventEmitter<any>;
965
+ onFormCancel: EventEmitter<any>;
966
+ formActive$: Observable<boolean>;
967
+ formSub$: Subscription;
968
+ constructor(fb: FormBuilder, metaService: MetaFormService, translateService: TranslateService, http: HttpClient);
969
+ createForm(controls: MetaControl[] | any): void;
970
+ activateForm(): void;
971
+ addControlValidators(control: any): void;
972
+ onSubmit(): void;
973
+ onCancel(): void;
974
+ /**
975
+ * Resets form to initial state
976
+ *
977
+ * @description Useful when user interact with form (edit some inputs) and than clicks CANCEL. This method patch original values to FormGroup again
978
+ *
979
+ */
980
+ resetToInitialValues(): void;
981
+ ngOnDestroy(): void;
982
+ static ɵfac: i0.ɵɵFactoryDeclaration<MetaFormAbstract, never>;
983
+ static ɵdir: i0.ɵɵDirectiveDeclaration<MetaFormAbstract, never, never, { "metaForm": { "alias": "metaForm"; "required": false; }; "metaFormValues": { "alias": "metaFormValues"; "required": false; }; "metaFormControls": { "alias": "metaFormControls"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "disableForm": { "alias": "disableForm"; "required": false; }; "formButtons": { "alias": "formButtons"; "required": false; }; "groupForm": { "alias": "groupForm"; "required": false; }; "formStyle": { "alias": "formStyle"; "required": false; }; }, { "onFormSubmit": "onFormSubmit"; "onFormCancel": "onFormCancel"; }, never, never, true, never>;
984
+ }
985
+
986
+ declare enum ControlType {
987
+ TEXT = "TEXT",
988
+ NUMBER = "NUMBER",
989
+ MS_OPTION = "MS_OPTION",
990
+ SS_OPTION = "SS_OPTION",
991
+ TEXT_AREA = "TEXT_AREA",
992
+ TEXT_EDITOR = "TEXT_EDITOR",
993
+ DATE = "DATE",
994
+ START_DUE_DATE = "START_DUE_DATE",
995
+ CHECKBOX = "CHECKBOX",
996
+ CHECKBOX_COLOR = "CHECKBOX_COLOR",
997
+ LINKS_DATA = "LINKS_DATA",
998
+ PASSWORD = "PASSWORD",
999
+ SWITCH = "SWITCH",
1000
+ TIMEPERIOD = "TIMEPERIOD",
1001
+ CURRENCY = "CURRENCY",
1002
+ ASSIGN = "ASSIGN",
1003
+ ASSIGN_ASSET = "ASSIGN_ASSET",
1004
+ COLOR = "COLOR",
1005
+ SELECT_BUTTON = "SELECT_BUTTON",
1006
+ UPLOAD = "UPLOAD",
1007
+ UPLOAD_DRAG_DROP = "UPLOAD_DRAG_DROP",
1008
+ SLOT = "SLOT",
1009
+ SS_OPTION_OBJECT_BASED = "SS_OPTION_OBJECT_BASED"
1010
+ }
1011
+
1012
+ declare class MetaFormComponent extends MetaFormAbstract implements OnChanges {
1013
+ constructor(fb: FormBuilder, metaService: MetaFormService, translateService: TranslateService, http: HttpClient);
1014
+ ControlType: typeof ControlType;
1015
+ optionLabel: string;
1016
+ ngOnChanges(simpleChanges: SimpleChanges): void;
1017
+ static ɵfac: i0.ɵɵFactoryDeclaration<MetaFormComponent, never>;
1018
+ static ɵcmp: i0.ɵɵComponentDeclaration<MetaFormComponent, "phoenix-meta-form", never, {}, {}, never, ["*"], true, never>;
1019
+ }
1020
+
1021
+ declare class MetaFormButtonsComponent implements OnInit, OnDestroy {
1022
+ private metaFormService;
1023
+ isDisabled: i0.InputSignal<boolean | undefined>;
1024
+ isCreateAnother: i0.InputSignal<boolean>;
1025
+ isLoading: i0.InputSignal<boolean>;
1026
+ handleSave: EventEmitter<any>;
1027
+ handleCancel: EventEmitter<any>;
1028
+ display: boolean;
1029
+ formActive$: Observable<boolean>;
1030
+ createAnother: boolean;
1031
+ sub$: Subscription;
1032
+ constructor(metaFormService: MetaFormService);
1033
+ ngOnInit(): void;
1034
+ ngOnDestroy(): void;
1035
+ static ɵfac: i0.ɵɵFactoryDeclaration<MetaFormButtonsComponent, never>;
1036
+ static ɵcmp: i0.ɵɵComponentDeclaration<MetaFormButtonsComponent, "phoenix-meta-form-buttons", never, { "isDisabled": { "alias": "isDisabled"; "required": false; "isSignal": true; }; "isCreateAnother": { "alias": "isCreateAnother"; "required": false; "isSignal": true; }; "isLoading": { "alias": "isLoading"; "required": false; "isSignal": true; }; }, { "handleSave": "handleSave"; "handleCancel": "handleCancel"; }, never, never, true, never>;
1037
+ }
1038
+
1039
+ declare class GroupsFormComponent extends MetaFormAbstract implements OnChanges {
1040
+ activePanelsIndex: number[];
1041
+ ControlType: typeof ControlType;
1042
+ optionLabel: string;
1043
+ notiffication?: any;
1044
+ private trans;
1045
+ ngOnChanges(simpleChanges?: SimpleChanges): void;
1046
+ static ɵfac: i0.ɵɵFactoryDeclaration<GroupsFormComponent, never>;
1047
+ static ɵcmp: i0.ɵɵComponentDeclaration<GroupsFormComponent, "phoenix-groups-form", never, { "activePanelsIndex": { "alias": "activePanelsIndex"; "required": false; }; }, {}, never, never, true, never>;
1048
+ }
1049
+
1050
+ declare enum SimpleButtonType {
1051
+ REGULAR = "regular",
1052
+ SPLIT = "split"
1053
+ }
1054
+ type Severity = 'success' | 'info' | 'warn' | 'danger' | 'help' | 'primary' | 'secondary' | 'contrast' | null | undefined;
1055
+ interface ActionButton {
1056
+ id?: number | string;
1057
+ label: string;
1058
+ icon?: string;
1059
+ disabled?: boolean;
1060
+ type?: SimpleButtonType;
1061
+ severity?: Severity;
1062
+ tooltip?: string;
1063
+ action?: () => void;
1064
+ splitItems?: {
1065
+ label: string;
1066
+ icon?: string;
1067
+ command: () => void;
1068
+ }[];
1069
+ }
1070
+
1071
+ declare class ObjectItemDialogComponent implements OnInit {
1072
+ ref: DynamicDialogRef;
1073
+ config: DynamicDialogConfig;
1074
+ table: TableComponent;
1075
+ columns: any;
1076
+ disableButton: boolean;
1077
+ tableData: never[];
1078
+ hasSelection: boolean;
1079
+ constructor(ref: DynamicDialogRef, config: DynamicDialogConfig);
1080
+ ngOnInit(): void;
1081
+ actions: ActionButton[];
1082
+ onSelectionChanged(selectedItem: any): void;
1083
+ actionClick(key: any): void;
1084
+ tableConfiguration: {
1085
+ lazy: boolean;
1086
+ scrollHeight: string;
1087
+ hasSearch: boolean;
1088
+ hasFilter: boolean;
1089
+ key: string;
1090
+ rows: number;
1091
+ selectionType: tableSelectionType;
1092
+ actions: never[];
1093
+ exportTable: boolean;
1094
+ filterConfiguration: never[];
1095
+ };
1096
+ static ɵfac: i0.ɵɵFactoryDeclaration<ObjectItemDialogComponent, never>;
1097
+ static ɵcmp: i0.ɵɵComponentDeclaration<ObjectItemDialogComponent, "phoenix-object-item-dialog", never, {}, {}, never, never, true, never>;
1098
+ }
1099
+
1100
+ declare class QuickPickComponent {
1101
+ onBack: EventEmitter<void>;
1102
+ onQuickPick: EventEmitter<void>;
1103
+ onForward: EventEmitter<void>;
1104
+ static ɵfac: i0.ɵɵFactoryDeclaration<QuickPickComponent, never>;
1105
+ static ɵcmp: i0.ɵɵComponentDeclaration<QuickPickComponent, "phoenix-quick-pick", never, {}, { "onBack": "onBack"; "onQuickPick": "onQuickPick"; "onForward": "onForward"; }, never, never, true, never>;
1106
+ }
1107
+
1108
+ interface StatusBarConfig {
1109
+ type?: string;
1110
+ icon?: string;
1111
+ name: string;
1112
+ title: string;
1113
+ description?: {
1114
+ label: string;
1115
+ value: any;
1116
+ icon?: string;
1117
+ type?: StatusColType;
1118
+ dateFormat?: string;
1119
+ }[];
1120
+ attributes?: StatusAttribute[];
1121
+ }
1122
+
1123
+ declare class StatusBarComponent {
1124
+ statusBarConfig: StatusBarConfig;
1125
+ iconEnable: boolean;
1126
+ enableClosing: boolean;
1127
+ description: boolean;
1128
+ dateFormat: string;
1129
+ onListItemClick: EventEmitter<any>;
1130
+ StatusColType: typeof StatusColType;
1131
+ iconStyle: {
1132
+ height: number;
1133
+ width: number;
1134
+ };
1135
+ static ɵfac: i0.ɵɵFactoryDeclaration<StatusBarComponent, never>;
1136
+ static ɵcmp: i0.ɵɵComponentDeclaration<StatusBarComponent, "phoenix-status-bar", never, { "statusBarConfig": { "alias": "statusBarConfig"; "required": false; }; "iconEnable": { "alias": "iconEnable"; "required": false; }; "enableClosing": { "alias": "enableClosing"; "required": false; }; "description": { "alias": "description"; "required": false; }; "dateFormat": { "alias": "dateFormat"; "required": false; }; }, { "onListItemClick": "onListItemClick"; }, never, never, true, never>;
1137
+ }
1138
+
1139
+ declare class QuickPickSidePanelComponent {
1140
+ drawer: Drawer;
1141
+ title: string;
1142
+ data: any[];
1143
+ columns: any[];
1144
+ tableConfiguration: any;
1145
+ widthClass: string;
1146
+ isFullScreen: boolean;
1147
+ private _panelVisible;
1148
+ set panelState(value: boolean);
1149
+ panelStateChange: EventEmitter<boolean>;
1150
+ onRowClick: EventEmitter<any>;
1151
+ lazyLoadData: EventEmitter<void>;
1152
+ handlePanelFullScreen: EventEmitter<void>;
1153
+ drawerVisible: i0.Signal<boolean>;
1154
+ visibleChange(newVal: boolean): void;
1155
+ onDrawerShow(): void;
1156
+ onTableRowClick(row: any): void;
1157
+ static ɵfac: i0.ɵɵFactoryDeclaration<QuickPickSidePanelComponent, never>;
1158
+ static ɵcmp: i0.ɵɵComponentDeclaration<QuickPickSidePanelComponent, "phoenix-quick-pick-sidepanel", never, { "title": { "alias": "title"; "required": false; }; "data": { "alias": "data"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; "tableConfiguration": { "alias": "tableConfiguration"; "required": false; }; "widthClass": { "alias": "widthClass"; "required": false; }; "isFullScreen": { "alias": "isFullScreen"; "required": false; }; "panelState": { "alias": "panelState"; "required": false; }; }, { "panelStateChange": "panelStateChange"; "onRowClick": "onRowClick"; "lazyLoadData": "lazyLoadData"; "handlePanelFullScreen": "handlePanelFullScreen"; }, never, never, true, never>;
1159
+ }
1160
+
1161
+ type MetaFieldType = 'TEXT' | 'URL' | 'NUMBER' | 'TIMEPERIOD' | 'CURRENCY' | 'TEXT_AREA' | 'SS_OPTION' | 'SS_OPTION_OBJECT_BASED' | 'MS_OPTION' | 'START_DUE_DATE' | 'DATE' | 'TEXT_EDITOR' | 'CHECKBOX' | 'CHECKBOX_COLOR' | 'SWITCH' | 'SELECT_BUTTON' | 'ASSIGN' | 'ASSIGN_ASSET' | 'PASSWORD' | 'COLOR' | 'UPLOAD' | 'UPLOAD_DRAG_DROP' | 'LINKS_DATA' | 'SLOT';
1162
+ type MetaOption = {
1163
+ label: string;
1164
+ value: any;
1165
+ disabled?: boolean;
1166
+ };
1167
+ type MetaValidators = {
1168
+ min?: number;
1169
+ max?: number;
1170
+ minLength?: number;
1171
+ maxLength?: number;
1172
+ email?: boolean;
1173
+ regex?: {
1174
+ regexType: string;
1175
+ };
1176
+ phone?: boolean;
1177
+ timeperiod?: boolean;
1178
+ tpMin?: number;
1179
+ dueDate?: boolean;
1180
+ };
1181
+ interface MetaFieldConfig {
1182
+ id?: string | number;
1183
+ order?: number;
1184
+ hidden?: boolean;
1185
+ userFriendlyMessage: string;
1186
+ configuration: {
1187
+ key: string;
1188
+ type: MetaFieldType;
1189
+ placeholderKey?: string;
1190
+ options?: MetaOption[];
1191
+ extra?: Record<string, any>;
1192
+ };
1193
+ mandatory?: boolean;
1194
+ disable?: boolean;
1195
+ readOnly?: boolean;
1196
+ validators?: MetaValidators;
1197
+ style: {
1198
+ colWidth: string;
1199
+ };
1200
+ }
1201
+ type AssignExtra = {
1202
+ items: any[];
1203
+ dialogHeaderKey?: string;
1204
+ columns?: Array<{
1205
+ field: string;
1206
+ header: string;
1207
+ columnType: any;
1208
+ }>;
1209
+ dialog?: {
1210
+ width?: string;
1211
+ modal?: boolean;
1212
+ };
1213
+ };
1214
+
1215
+ type UniqueValidationResponse = {
1216
+ isValid: boolean;
1217
+ control?: string;
1218
+ message?: string;
1219
+ };
1220
+ interface MetaSubmitValidatorConfig {
1221
+ /**
1222
+ * Which control should receive the error when invalid.
1223
+ * If backend returns {control}, that wins.
1224
+ */
1225
+ controlKey: string;
1226
+ /**
1227
+ * Called ONLY on submit validation.
1228
+ * If returns null/undefined => skip validator (e.g. empty value).
1229
+ */
1230
+ buildRequest: (form: FormGroup) => {
1231
+ url: string;
1232
+ body?: any;
1233
+ } | null;
1234
+ /**
1235
+ * Optional: map raw response to standard format.
1236
+ * Default expects {isValid, control?}.
1237
+ */
1238
+ mapResponse?: (raw: any) => UniqueValidationResponse;
1239
+ /**
1240
+ * Error key to set on the target control.
1241
+ * Default: 'unique'
1242
+ */
1243
+ errorKey?: string;
1244
+ }
1245
+
1246
+ interface MetaFormGroupConfig {
1247
+ id?: string | number;
1248
+ groupName?: string;
1249
+ collapsed?: boolean;
1250
+ ctrl: MetaFieldConfig[];
1251
+ }
1252
+ type MetaFormControls = MetaFieldConfig[] | MetaFormGroupConfig[];
1253
+ interface MetaFormV2Config {
1254
+ controls: MetaFormControls;
1255
+ initialValues?: any;
1256
+ /**
1257
+ * Submit-only async validators (unique name/title etc).
1258
+ * They DO NOT run on valueChanges, only when parent triggers submit validation.
1259
+ */
1260
+ submitValidators?: MetaSubmitValidatorConfig[];
1261
+ /**
1262
+ * Dependency hook (category -> color, entity -> assignees etc.)
1263
+ * V2 will bind once and clean up on meta change.
1264
+ */
1265
+ setupDependencies?: (ctx: {
1266
+ form: FormGroup;
1267
+ flatControls: MetaFieldConfig[];
1268
+ initialValues: any;
1269
+ getControl: (key: string) => AbstractControl | null;
1270
+ findField: (key: string) => MetaFieldConfig | null;
1271
+ }) => void | (() => void);
1272
+ }
1273
+
1274
+ type AccordionValue = string | number | string[] | number[] | null | undefined;
1275
+ declare class MetaFormV2Component implements OnChanges, OnDestroy {
1276
+ /** Form instance created/owned by the parent (dialog/page) */
1277
+ form: FormGroup;
1278
+ /**
1279
+ * V2 metadata/config:
1280
+ * - controls (grouped or flat)
1281
+ * - initialValues
1282
+ * - submitValidators (run on submit only)
1283
+ * - setupDependencies (optional runtime bindings)
1284
+ */
1285
+ config: MetaFormV2Config;
1286
+ /**
1287
+ * Page-level readOnly state controlled by parent.
1288
+ * Used both for rendering and for "enter edit mode" behavior.
1289
+ */
1290
+ readOnly: boolean;
1291
+ /** Optional layout customization for inner content wrapper */
1292
+ contentStyle: Record<string, any> | null;
1293
+ /** Optional class name(s) applied to inner content wrapper */
1294
+ contentClass: string | null;
1295
+ /** Builds/ensures controls exist (ensures validators & default values are wired) */
1296
+ private fb;
1297
+ /** Registers and executes submit-only validators (async validation on submit) */
1298
+ private submitValidator;
1299
+ /** Used for validator localization (lang-dependent validators / messages) */
1300
+ private translate;
1301
+ /**
1302
+ * A lightweight signature of the current metadata structure.
1303
+ * Used to detect when the form schema changes (and avoid unnecessary resets).
1304
+ */
1305
+ private lastSignature;
1306
+ /**
1307
+ * Cleanup function returned by setupDependencies (if any).
1308
+ * Called only when metadata structure changes or on destroy.
1309
+ */
1310
+ private depCleanup?;
1311
+ /**
1312
+ * PrimeNG Accordion "value" for opened panels.
1313
+ * For multiple panels, PrimeNG expects an array of ids.
1314
+ */
1315
+ expandedGroupIds: string[];
1316
+ ngOnChanges(changes: SimpleChanges): void;
1317
+ /**
1318
+ * PrimeNG Accordion emits value as:
1319
+ * - single id (string/number)
1320
+ * - array of ids
1321
+ * We normalize everything into string[] for stable internal state.
1322
+ */
1323
+ onAccordionValueChange(v: AccordionValue): void;
1324
+ /** Normalizes Accordion value into a stable string[] representation */
1325
+ private normalizeAccordionValue;
1326
+ /** True when metadata contains at least one control definition */
1327
+ get hasControls(): boolean;
1328
+ /**
1329
+ * Heuristic: grouped config has "ctrl" on first element.
1330
+ * (Keeps template simple and avoids extra schema fields.)
1331
+ */
1332
+ get isGrouped(): boolean;
1333
+ /** Returns grouped schema structure (accordion groups) */
1334
+ get groupedControls(): any[];
1335
+ /** Returns flat schema structure (grid mode) */
1336
+ get flatControls(): any[];
1337
+ /** TrackBy for group rendering */
1338
+ groupTrack(g: any, idx: number): any;
1339
+ /**
1340
+ * PrimeNG accordion panel `value` must match accordion `value` type.
1341
+ * We always convert group id to string for consistent behavior.
1342
+ */
1343
+ panelValue(g: any): string;
1344
+ /**
1345
+ * Marks & validates ONLY controls that already have meaningful values.
1346
+ * This is used when switching from readOnly -> edit mode to avoid:
1347
+ * - triggering "required" errors for empty fields
1348
+ * - expanding groups based on empty mandatory fields on CREATE dialogs
1349
+ */
1350
+ private touchAndValidateOnlyFilledControls;
1351
+ /**
1352
+ * Defines what counts as a "meaningful" value:
1353
+ * - non-empty strings
1354
+ * - numbers / booleans
1355
+ * - non-empty arrays
1356
+ * - objects with common identifiers (key/uuid/id) or any own keys
1357
+ */
1358
+ private hasMeaningfulValue;
1359
+ /**
1360
+ * "Visible invalid" means:
1361
+ * - invalid
1362
+ * - AND user has interacted with it (touched or dirty)
1363
+ * This matches typical UI behavior: show errors only after interaction.
1364
+ */
1365
+ private isVisibleInvalid;
1366
+ /**
1367
+ * Checks if a group contains at least one visible invalid control.
1368
+ * Used to auto-expand groups when entering edit mode.
1369
+ */
1370
+ private groupHasVisibleInvalid;
1371
+ /**
1372
+ * Expands all groups that contain visible invalid controls,
1373
+ * while preserving any groups already expanded by the user.
1374
+ */
1375
+ private expandVisibleInvalidGroupsUnion;
1376
+ /** Cleanup dependency subscriptions when component is destroyed */
1377
+ ngOnDestroy(): void;
1378
+ static ɵfac: i0.ɵɵFactoryDeclaration<MetaFormV2Component, never>;
1379
+ static ɵcmp: i0.ɵɵComponentDeclaration<MetaFormV2Component, "phoenix-meta-form-v2", never, { "form": { "alias": "form"; "required": true; }; "config": { "alias": "config"; "required": true; }; "readOnly": { "alias": "readOnly"; "required": false; }; "contentStyle": { "alias": "contentStyle"; "required": false; }; "contentClass": { "alias": "contentClass"; "required": false; }; }, {}, never, never, true, never>;
1380
+ }
1381
+
1382
+ declare class MetaFormFieldV2Component {
1383
+ /** Metadata definition of the field (type, key, options, styles, flags, etc.) */
1384
+ field: MetaFieldConfig;
1385
+ /** Parent FormGroup that contains the FormControl for this field */
1386
+ form: FormGroup;
1387
+ /**
1388
+ * Page-level read-only flag.
1389
+ * When true, the component renders ReadOnlyInputV2Component instead of editable controls.
1390
+ */
1391
+ readOnly: boolean;
1392
+ /**
1393
+ * Global disable flag (e.g. parent dialog toggles entire form disabled).
1394
+ * This is merged with field-level disable configuration.
1395
+ */
1396
+ disableForm: boolean;
1397
+ /** Used to manually trigger change detection for OnPush strategy */
1398
+ private cdr;
1399
+ /** Used to automatically unsubscribe from value/status streams on destroy */
1400
+ private dr;
1401
+ /** Translation service for validation and display labels */
1402
+ private translate;
1403
+ /**
1404
+ * Exposed enum-like mapping of MetaFieldType for template usage.
1405
+ * Keeps templates readable and avoids magic strings.
1406
+ */
1407
+ readonly MetaFieldType: Readonly<{
1408
+ TEXT: "TEXT";
1409
+ URL: "URL";
1410
+ NUMBER: "NUMBER";
1411
+ TIMEPERIOD: "TIMEPERIOD";
1412
+ CURRENCY: "CURRENCY";
1413
+ TEXT_AREA: "TEXT_AREA";
1414
+ SS_OPTION: "SS_OPTION";
1415
+ SS_OPTION_OBJECT_BASED: "SS_OPTION_OBJECT_BASED";
1416
+ MS_OPTION: "MS_OPTION";
1417
+ START_DUE_DATE: "START_DUE_DATE";
1418
+ DATE: "DATE";
1419
+ TEXT_EDITOR: "TEXT_EDITOR";
1420
+ CHECKBOX: "CHECKBOX";
1421
+ CHECKBOX_COLOR: "CHECKBOX_COLOR";
1422
+ SWITCH: "SWITCH";
1423
+ SELECT_BUTTON: "SELECT_BUTTON";
1424
+ ASSIGN: "ASSIGN";
1425
+ ASSIGN_ASSET: "ASSIGN_ASSET";
1426
+ PASSWORD: "PASSWORD";
1427
+ COLOR: "COLOR";
1428
+ UPLOAD: "UPLOAD";
1429
+ UPLOAD_DRAG_DROP: "UPLOAD_DRAG_DROP";
1430
+ LINKS_DATA: "LINKS_DATA";
1431
+ SLOT: "SLOT";
1432
+ }>;
1433
+ /** Control key resolved from MetaFieldConfig */
1434
+ get key(): string;
1435
+ /** Field type resolved from MetaFieldConfig */
1436
+ get type(): MetaFieldType;
1437
+ /** Column width class for grid layout (falls back to default if not provided) */
1438
+ get colClass(): string;
1439
+ ngOnInit(): void;
1440
+ /** Human-friendly label defined in metadata (already localized key) */
1441
+ userFriendlyMessage(): string | null;
1442
+ /** Optional placeholder i18n key defined in metadata */
1443
+ placeholderKey(): string | null;
1444
+ /**
1445
+ * Resolves final read-only state for this field:
1446
+ * - page-level readOnly OR field-level readOnly
1447
+ */
1448
+ isReadOnly(): boolean;
1449
+ /**
1450
+ * Resolves final disabled state for this field:
1451
+ * - page-level disable OR field-level disable
1452
+ */
1453
+ isDisabled(): boolean;
1454
+ /** Shortcut to underlying FormControl */
1455
+ ctrl(): _angular_forms.AbstractControl<any, any, any> | null;
1456
+ /**
1457
+ * Minimal value formatter for legacy read-only rendering.
1458
+ * Kept intentionally simple to match V1 behavior.
1459
+ */
1460
+ displayValue(): any;
1461
+ /**
1462
+ * Determines whether validation error should be displayed.
1463
+ * Errors are shown only after user interaction (touched or dirty).
1464
+ */
1465
+ showError(): boolean;
1466
+ /**
1467
+ * Maps control error object to a normalized error key.
1468
+ * Supports:
1469
+ * - Angular built-in validators
1470
+ * - Phoenix custom validators
1471
+ * - Submit-only async validators
1472
+ */
1473
+ errorKey(): string | null;
1474
+ /**
1475
+ * Resolves translated error message based on errorKey().
1476
+ * This is the single place responsible for validation message UX.
1477
+ */
1478
+ errorText(): string;
1479
+ /**
1480
+ * Lightweight text formatter for simple read-only display use cases.
1481
+ * This is used mainly for inline displays and summary UIs.
1482
+ */
1483
+ valueText(): string;
1484
+ isCheckbox(): boolean;
1485
+ onDateSelected(val: any): void;
1486
+ onDateCleared(): void;
1487
+ static ɵfac: i0.ɵɵFactoryDeclaration<MetaFormFieldV2Component, never>;
1488
+ static ɵcmp: i0.ɵɵComponentDeclaration<MetaFormFieldV2Component, "phoenix-meta-form-field-v2", never, { "field": { "alias": "field"; "required": true; }; "form": { "alias": "form"; "required": true; }; "readOnly": { "alias": "readOnly"; "required": false; }; "disableForm": { "alias": "disableForm"; "required": false; }; }, {}, never, never, true, never>;
1489
+ }
1490
+
1491
+ declare class MetaFormGroupV2Component {
1492
+ group: MetaFormGroupConfig;
1493
+ form: FormGroup;
1494
+ readOnly: boolean;
1495
+ static ɵfac: i0.ɵɵFactoryDeclaration<MetaFormGroupV2Component, never>;
1496
+ static ɵcmp: i0.ɵɵComponentDeclaration<MetaFormGroupV2Component, "phoenix-meta-form-group-v2", never, { "group": { "alias": "group"; "required": true; }; "form": { "alias": "form"; "required": true; }; "readOnly": { "alias": "readOnly"; "required": false; }; }, {}, never, never, true, never>;
1497
+ }
1498
+
1499
+ declare class MetaFormButtonsV2Component {
1500
+ /**
1501
+ * Disabled state for Save button (usually: form invalid or readOnly or loading)
1502
+ */
1503
+ isDisabled: i0.InputSignal<boolean>;
1504
+ /**
1505
+ * Optional feature: "Create another" checkbox.
1506
+ * If false => checkbox is not rendered.
1507
+ */
1508
+ isCreateAnother: i0.InputSignal<boolean>;
1509
+ /**
1510
+ * Loading indicator for Save button.
1511
+ */
1512
+ isLoading: i0.InputSignal<boolean>;
1513
+ /**
1514
+ * Emits when user clicks Save.
1515
+ * Payload matches existing contract: { isAnother: boolean }
1516
+ */
1517
+ handleSave: EventEmitter<{
1518
+ isAnother: boolean;
1519
+ }>;
1520
+ /**
1521
+ * Emits when user clicks Cancel.
1522
+ */
1523
+ handleCancel: EventEmitter<"CANCEL">;
1524
+ /**
1525
+ * Local checkbox model (kept only in this component).
1526
+ */
1527
+ createAnother: boolean;
1528
+ onSaveClick(): void;
1529
+ onCancelClick(): void;
1530
+ static ɵfac: i0.ɵɵFactoryDeclaration<MetaFormButtonsV2Component, never>;
1531
+ static ɵcmp: i0.ɵɵComponentDeclaration<MetaFormButtonsV2Component, "phoenix-meta-form-buttons-v2", never, { "isDisabled": { "alias": "isDisabled"; "required": false; "isSignal": true; }; "isCreateAnother": { "alias": "isCreateAnother"; "required": false; "isSignal": true; }; "isLoading": { "alias": "isLoading"; "required": false; "isSignal": true; }; }, { "handleSave": "handleSave"; "handleCancel": "handleCancel"; }, never, never, true, never>;
1532
+ }
1533
+
1534
+ type MetaAsyncExecutor = (url: string, body?: any) => Observable<any>;
1
1535
  /**
2
- * Generated bundle index. Do not edit.
1536
+ * You provide this from app (or phoenix-config) so V2 lib doesn't depend on CrudService directly.
1537
+ * Example impl: (url, body) => this.crud.post(url, body)
3
1538
  */
4
- /// <amd-module name="@fuentis/phoenix-ui" />
5
- export * from './public-api';
1539
+ declare const META_FORM_ASYNC_EXECUTOR: InjectionToken<MetaAsyncExecutor>;
1540
+
1541
+ declare class MetaSubmitValidatorService {
1542
+ /**
1543
+ * Optional async executor abstraction used to perform server-side validation
1544
+ * (e.g. uniqueness checks).
1545
+ *
1546
+ * If not provided, submit-only validators will be skipped gracefully.
1547
+ */
1548
+ private executor?;
1549
+ /** Used to automatically clean up subscriptions when the service is destroyed */
1550
+ private dr;
1551
+ constructor(
1552
+ /**
1553
+ * Optional async executor abstraction used to perform server-side validation
1554
+ * (e.g. uniqueness checks).
1555
+ *
1556
+ * If not provided, submit-only validators will be skipped gracefully.
1557
+ */
1558
+ executor?: MetaAsyncExecutor | undefined);
1559
+ /**
1560
+ * Registers submit-only validators on the given form.
1561
+ *
1562
+ * - Attaches validator metadata to the form instance (via Symbols)
1563
+ * - Cleans up any previous subscriptions
1564
+ * - Subscribes to valueChanges in order to auto-clear submit-only errors
1565
+ * when the user modifies the field after a failed submit
1566
+ */
1567
+ register(form: FormGroup, validators: MetaSubmitValidatorConfig[] | null | undefined): void;
1568
+ /**
1569
+ * Executes submit-only validators.
1570
+ *
1571
+ * Flow:
1572
+ * 1) Mark all controls as touched/dirty so sync validation messages become visible
1573
+ * 2) If form is sync-invalid, skip async validation
1574
+ * 3) Clear previous submit-only errors
1575
+ * 4) Execute async validators sequentially
1576
+ * 5) Apply mapped errors back to controls
1577
+ *
1578
+ * Returns:
1579
+ * - true → form is valid (sync + submit-only async)
1580
+ * - false → at least one submit-only validator failed
1581
+ */
1582
+ run(form: FormGroup): Promise<boolean>;
1583
+ /**
1584
+ * Removes a specific submit-only error from the control without
1585
+ * touching other validation errors.
1586
+ */
1587
+ private removeError;
1588
+ /**
1589
+ * Clears submit-only errors for all controls involved in submit validators.
1590
+ * This does NOT trigger updateValueAndValidity to avoid unnecessary re-validation.
1591
+ */
1592
+ private clearSubmitErrors;
1593
+ /**
1594
+ * Marks all form controls as touched and dirty.
1595
+ * This is used on submit to make validation errors visible to the user.
1596
+ */
1597
+ private markAllTouchedOnSubmit;
1598
+ static ɵfac: i0.ɵɵFactoryDeclaration<MetaSubmitValidatorService, [{ optional: true; }]>;
1599
+ static ɵprov: i0.ɵɵInjectableDeclaration<MetaSubmitValidatorService>;
1600
+ }
1601
+
1602
+ export { ActionTypes, ActionsComponent, CardComponent, ContexObjectComponent, ControlType, GroupsFormComponent, InnerHeaderComponent, META_FORM_ASYNC_EXECUTOR, MetaFormButtonsComponent, MetaFormButtonsV2Component, MetaFormComponent, MetaFormFieldV2Component, MetaFormGroupV2Component, MetaFormService, MetaFormV2Component, MetaSubmitValidatorService, ObjectItemDialogComponent, QuickPickComponent, QuickPickSidePanelComponent, SearchBarComponent, ShellComponent, SidebarComponent, SidebarItemComponent, SimpleButtonType, StatusBarComponent, StatusColType, StatusHeaderComponent, StatusTooltipType, TableComponent, TopbarComponent, UserComponent, tableActionType, tableButtonContext, tableButtonFormat, tableColumnType, tableFilterType, tableSelectionType };
1603
+ export type { Action, ActionButton, Actions, AllActionValues, AssignExtra, ColumnTypeMap, ConfirmationMode, ContextObjectConfig, ContextObjectTag, InitialSortMeta, MetaAsyncExecutor, MetaFieldConfig, MetaFieldType, MetaFormControls, MetaFormGroupConfig, MetaFormV2Config, MetaOption, MetaSubmitValidatorConfig, MetaValidators, RegisteredActionEnums, Severity, ShellConfig, ShellTheme, SidebarItem, SortMeta, SortOrder, SortRequest, SortResponse, StatusAttribute, StatusBarConfig, StatusTooltipItem, TabAction, TableAction, TableColumn, TableConfiguration, TopbarFooterConfig, TopbarItem, TopbarModuleGroup, TopbarModuleItem, TypingConfirmationConfig, UniqueValidationResponse, UrlConfig, User, cardConfig };