@flusys/ng-iam 4.1.0 → 5.0.0

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 (20) hide show
  1. package/README.md +26 -382
  2. package/fesm2022/{flusys-ng-iam-action-form-page.component-DJbMu2aV.mjs → flusys-ng-iam-action-form-page.component-D_vwcCjG.mjs} +14 -26
  3. package/fesm2022/flusys-ng-iam-action-form-page.component-D_vwcCjG.mjs.map +1 -0
  4. package/fesm2022/{flusys-ng-iam-action-list-page.component-DYnYC7Nn.mjs → flusys-ng-iam-action-list-page.component-DRK79zUR.mjs} +4 -4
  5. package/fesm2022/{flusys-ng-iam-action-list-page.component-DYnYC7Nn.mjs.map → flusys-ng-iam-action-list-page.component-DRK79zUR.mjs.map} +1 -1
  6. package/fesm2022/{flusys-ng-iam-flusys-ng-iam-CnVOy_4s.mjs → flusys-ng-iam-flusys-ng-iam-C6I4k78L.mjs} +1140 -1340
  7. package/fesm2022/flusys-ng-iam-flusys-ng-iam-C6I4k78L.mjs.map +1 -0
  8. package/fesm2022/{flusys-ng-iam-permission-page.component-_cLVilgz.mjs → flusys-ng-iam-permission-page.component-CZebeUhC.mjs} +2 -2
  9. package/fesm2022/{flusys-ng-iam-permission-page.component-_cLVilgz.mjs.map → flusys-ng-iam-permission-page.component-CZebeUhC.mjs.map} +1 -1
  10. package/fesm2022/{flusys-ng-iam-role-form-page.component-BuZmko2b.mjs → flusys-ng-iam-role-form-page.component-49dKMKOj.mjs} +11 -20
  11. package/fesm2022/flusys-ng-iam-role-form-page.component-49dKMKOj.mjs.map +1 -0
  12. package/fesm2022/{flusys-ng-iam-role-list-page.component-C7GVYYIn.mjs → flusys-ng-iam-role-list-page.component-CT7CvvHj.mjs} +114 -39
  13. package/fesm2022/flusys-ng-iam-role-list-page.component-CT7CvvHj.mjs.map +1 -0
  14. package/fesm2022/flusys-ng-iam.mjs +1 -1
  15. package/package.json +4 -4
  16. package/types/flusys-ng-iam.d.ts +44 -250
  17. package/fesm2022/flusys-ng-iam-action-form-page.component-DJbMu2aV.mjs.map +0 -1
  18. package/fesm2022/flusys-ng-iam-flusys-ng-iam-CnVOy_4s.mjs.map +0 -1
  19. package/fesm2022/flusys-ng-iam-role-form-page.component-BuZmko2b.mjs.map +0 -1
  20. package/fesm2022/flusys-ng-iam-role-list-page.component-C7GVYYIn.mjs.map +0 -1
@@ -2,6 +2,7 @@ import { IBaseEntity, ILogicNode, ApiResourceService, ISingleResponse, IProfileP
2
2
  import * as _angular_core from '@angular/core';
3
3
  import { Provider } from '@angular/core';
4
4
  import { Observable } from 'rxjs';
5
+ import * as _flusys_ng_core from '@flusys/ng-core';
5
6
  import { BaseApiService } from '@flusys/ng-core';
6
7
  export { PermissionMode } from '@flusys/ng-core';
7
8
  import * as primeng_api from 'primeng/api';
@@ -43,7 +44,6 @@ interface IRole extends IBaseEntity {
43
44
  companyId: string | null;
44
45
  isActive: boolean;
45
46
  serial: number | null;
46
- metadata: Record<string, unknown> | null;
47
47
  }
48
48
  interface ICreateRoleDto {
49
49
  name: string;
@@ -51,7 +51,6 @@ interface ICreateRoleDto {
51
51
  companyId?: string;
52
52
  isActive?: boolean;
53
53
  serial?: number;
54
- metadata?: Record<string, unknown>;
55
54
  }
56
55
  interface IUpdateRoleDto extends Partial<ICreateRoleDto> {
57
56
  id: string;
@@ -77,7 +76,6 @@ interface IAction extends IBaseEntity {
77
76
  parentId: string | null;
78
77
  serial: number | null;
79
78
  isActive: boolean;
80
- metadata: Record<string, unknown> | null;
81
79
  }
82
80
  interface IActionTreeDto extends IAction {
83
81
  children: IActionTreeDto[];
@@ -91,7 +89,6 @@ interface ICreateActionDto {
91
89
  parentId?: string;
92
90
  serial?: number;
93
91
  isActive?: boolean;
94
- metadata?: Record<string, unknown>;
95
92
  }
96
93
  interface IUpdateActionDto extends Partial<ICreateActionDto> {
97
94
  id: string;
@@ -151,7 +148,6 @@ interface IUserRoleResponseDto {
151
148
  id: string;
152
149
  userId: string;
153
150
  roleId: string;
154
- roleCode: string;
155
151
  roleName: string;
156
152
  branchId: string | null;
157
153
  createdAt: Date;
@@ -181,6 +177,7 @@ interface IPermissionOperationResultDto {
181
177
  added: number;
182
178
  removed: number;
183
179
  message: string;
180
+ messageKey?: string;
184
181
  prerequisiteErrors?: IPrerequisiteValidationError[];
185
182
  }
186
183
  interface IGetUserActionsDto {
@@ -342,64 +339,19 @@ declare class LogicBuilderComponent {
342
339
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<LogicBuilderComponent, "lib-logic-builder", never, { "logic": { "alias": "logic"; "required": false; "isSignal": true; }; "actions": { "alias": "actions"; "required": false; "isSignal": true; }; }, { "logicChange": "logicChange"; }, never, never, true, never>;
343
340
  }
344
341
 
345
- /**
346
- * Role-Action Selector Component
347
- *
348
- * Manages role action permissions with hierarchical tree view and intelligent dependency management.
349
- *
350
- * **Architecture:**
351
- * - Presentation: TreeTable for hierarchical display
352
- * - Business Logic: Flat action list for selection/validation
353
- * - State: Signals with computed dependencies
354
- *
355
- * **Core Features:**
356
- * - Role dropdown with async loading
357
- * - Hierarchical TreeTable with expand/collapse
358
- * - Action permission assignment (add/remove)
359
- * - Real-time change tracking
360
- *
361
- * **Dependency Management:**
362
- * - Auto-selection with AND/OR logic
363
- * - Dependency detection on uncheck
364
- * - Cascade remove for AND dependencies
365
- * - Visual warnings for unmet prerequisites
366
- * - Pre-save validation with auto-fix
367
- *
368
- * **Performance:**
369
- * - Computed signals for reactive updates
370
- * - Memoized prerequisite validation
371
- * - AbortController for request cancellation
372
- *
373
- * @example
374
- * ```html
375
- * <flusys-role-action-selector />
376
- * ```
377
- */
378
- declare class RoleActionSelectorComponent {
379
- readonly ROLE_ACTION_PERMISSIONS: {
380
- readonly READ: "role-action.read";
381
- readonly ASSIGN: "role-action.assign";
382
- };
383
- private readonly destroyRef;
384
- private readonly roleApi;
385
- private readonly actionApi;
386
- private readonly permissionApi;
387
- private readonly messageService;
388
- private readonly permissionLogic;
389
- private readonly translateAdapter;
390
- private translate;
391
- readonly selectedRoleId: _angular_core.WritableSignal<string | undefined>;
392
- readonly roles: _angular_core.WritableSignal<IRole[]>;
342
+ declare abstract class BaseActionSelectorComponent {
343
+ protected readonly permissionLogic: ActionPermissionLogicService;
344
+ protected readonly translateAdapter: _flusys_ng_core.ITranslateAdapter | null;
393
345
  readonly loading: _angular_core.WritableSignal<boolean>;
394
346
  readonly saving: _angular_core.WritableSignal<boolean>;
395
- private readonly _actions;
347
+ protected readonly _actions: _angular_core.WritableSignal<IAction[]>;
396
348
  readonly actions: _angular_core.Signal<IAction[]>;
397
- private readonly _actionsTree;
398
- private readonly actionsTree;
399
- private readonly _selectionMap;
349
+ protected readonly _actionsTree: _angular_core.WritableSignal<IActionTreeDto[]>;
350
+ protected readonly actionsTree: _angular_core.Signal<IActionTreeDto[]>;
351
+ protected readonly _selectionMap: _angular_core.WritableSignal<Record<string, boolean>>;
400
352
  readonly selectionMap: _angular_core.Signal<Record<string, boolean>>;
401
- private readonly _initialSelection;
402
- private readonly initialSelection;
353
+ protected readonly _initialSelection: _angular_core.WritableSignal<Record<string, boolean>>;
354
+ protected readonly initialSelection: _angular_core.Signal<Record<string, boolean>>;
403
355
  readonly treeNodes: _angular_core.Signal<primeng_api.TreeNode<IAction>[]>;
404
356
  readonly allSelected: _angular_core.Signal<boolean>;
405
357
  readonly hasChanges: _angular_core.Signal<boolean>;
@@ -408,77 +360,46 @@ declare class RoleActionSelectorComponent {
408
360
  readonly pendingAdd: _angular_core.Signal<IAction[]>;
409
361
  readonly pendingRemove: _angular_core.Signal<IAction[]>;
410
362
  readonly canSave: _angular_core.Signal<boolean>;
411
- private loadDataAbortController;
412
- constructor();
413
- /**
414
- * Load roles from API
415
- */
416
- private loadRoles;
417
- /**
418
- * Load actions and assignments for selected role
419
- */
420
- private onRoleChange;
421
- /**
422
- * Get tooltip for action checkbox
423
- */
424
- getTooltip(action: IAction): string;
425
- /**
426
- * Check if action has unmet prerequisites
427
- */
363
+ protected translate(key: string, vars?: Record<string, string | number>): string;
428
364
  hasUnmetPrerequisites(action: IAction): boolean;
429
- /**
430
- * Handle action toggle with dependency management
431
- */
365
+ getTooltip(action: IAction): string;
366
+ protected abstract getDefaultTooltip(isSelected: boolean): string;
432
367
  onActionToggle(action: IAction, newValue: boolean): void;
433
368
  toggleAll(): void;
434
369
  selectAll(): void;
435
370
  deselectAll(): void;
436
- private setAllSelection;
437
- /**
438
- * Save changes to backend
439
- */
371
+ protected setAllSelection(value: boolean): void;
372
+ protected buildSelectionMap(actions: IAction[], predicate: (action: IAction) => boolean): Record<string, boolean>;
373
+ protected buildPayloadItems(): Array<{
374
+ id: string;
375
+ action: PermissionAction;
376
+ }>;
377
+ protected resetState(): void;
378
+ }
379
+
380
+ declare class RoleActionSelectorComponent extends BaseActionSelectorComponent {
381
+ readonly ROLE_ACTION_PERMISSIONS: {
382
+ readonly READ: "role-action.read";
383
+ readonly ASSIGN: "role-action.assign";
384
+ };
385
+ private readonly destroyRef;
386
+ private readonly roleApi;
387
+ private readonly actionApi;
388
+ private readonly permissionApi;
389
+ private readonly messageService;
390
+ readonly selectedRoleId: _angular_core.WritableSignal<string | undefined>;
391
+ readonly roles: _angular_core.WritableSignal<IRole[]>;
392
+ private loadDataAbortController;
393
+ constructor();
394
+ protected getDefaultTooltip(isSelected: boolean): string;
395
+ private loadRoles;
396
+ private onRoleChange;
440
397
  saveChanges(): Promise<void>;
441
- private applySelection;
442
- private buildPayloadItems;
443
- private resetState;
444
398
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RoleActionSelectorComponent, never>;
445
399
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<RoleActionSelectorComponent, "flusys-role-action-selector", never, {}, {}, never, never, true, never>;
446
400
  }
447
401
 
448
- /**
449
- * Company-Action Selector Component
450
- *
451
- * Manages company action whitelisting with hierarchical tree view and intelligent dependency management.
452
- *
453
- * **Architecture:**
454
- * - Presentation: TreeTable for hierarchical display
455
- * - Business Logic: Flat action list for selection/validation
456
- * - State: Signals with computed dependencies
457
- *
458
- * **Core Features:**
459
- * - Company dropdown with async loading
460
- * - Hierarchical TreeTable with expand/collapse
461
- * - Action whitelist management (add/remove)
462
- * - Real-time change tracking
463
- *
464
- * **Dependency Management:**
465
- * - Auto-selection with AND/OR logic
466
- * - Dependency detection on uncheck
467
- * - Cascade remove for AND dependencies
468
- * - Visual warnings for unmet prerequisites
469
- * - Pre-save validation with auto-fix
470
- *
471
- * **Performance:**
472
- * - Computed signals for reactive updates
473
- * - Memoized prerequisite validation
474
- * - AbortController for request cancellation
475
- *
476
- * @example
477
- * ```html
478
- * <flusys-company-action-selector />
479
- * ```
480
- */
481
- declare class CompanyActionSelectorComponent {
402
+ declare class CompanyActionSelectorComponent extends BaseActionSelectorComponent {
482
403
  readonly COMPANY_ACTION_PERMISSIONS: {
483
404
  readonly READ: "company-action.read";
484
405
  readonly ASSIGN: "company-action.assign";
@@ -488,68 +409,16 @@ declare class CompanyActionSelectorComponent {
488
409
  private readonly permissionApi;
489
410
  private readonly messageService;
490
411
  private readonly confirmationService;
491
- private readonly permissionLogic;
492
412
  private readonly destroyRef;
493
- private readonly translateAdapter;
494
- private translate;
495
413
  readonly selectedCompanyId: _angular_core.WritableSignal<string | undefined>;
496
414
  readonly companies: _angular_core.WritableSignal<ICompany[]>;
497
- readonly loading: _angular_core.WritableSignal<boolean>;
498
- readonly saving: _angular_core.WritableSignal<boolean>;
499
- private readonly _actions;
500
- readonly actions: _angular_core.Signal<IAction[]>;
501
- private readonly _actionsTree;
502
- private readonly actionsTree;
503
- private readonly _selectionMap;
504
- readonly selectionMap: _angular_core.Signal<Record<string, boolean>>;
505
- private readonly _initialSelection;
506
- private readonly initialSelection;
507
- readonly treeNodes: _angular_core.Signal<primeng_api.TreeNode<IAction>[]>;
508
- readonly allSelected: _angular_core.Signal<boolean>;
509
- readonly hasChanges: _angular_core.Signal<boolean>;
510
- readonly actionsWithUnmetPrerequisites: _angular_core.Signal<Set<string>>;
511
- readonly invalidActionsCount: _angular_core.Signal<number>;
512
- readonly pendingAdd: _angular_core.Signal<IAction[]>;
513
- readonly pendingRemove: _angular_core.Signal<IAction[]>;
514
- readonly canSave: _angular_core.Signal<boolean>;
515
415
  private loadDataAbortController;
516
416
  constructor();
517
- /**
518
- * Load companies from API
519
- */
417
+ protected getDefaultTooltip(isSelected: boolean): string;
520
418
  private loadCompanies;
521
- /**
522
- * Load actions and assignments for selected company
523
- */
524
419
  private loadData;
525
- /**
526
- * Check if action has unmet prerequisites
527
- */
528
- hasUnmetPrerequisites(action: IAction): boolean;
529
- /**
530
- * Get tooltip for action checkbox
531
- */
532
- getTooltip(action: IAction): string;
533
- /**
534
- * Handle action checkbox toggle
535
- */
536
- onActionToggle(action: IAction, newValue: boolean): void;
537
- toggleAll(): void;
538
- selectAll(): void;
539
- deselectAll(): void;
540
- private setAllSelection;
541
- /**
542
- * Save changes to backend
543
- */
544
420
  saveChanges(): Promise<void>;
545
- /**
546
- * Handle backend prerequisite validation errors
547
- * Shows confirmation dialog with auto-fix option
548
- */
549
421
  private handleBackendPrerequisiteErrors;
550
- private resetState;
551
- private buildSelectionMap;
552
- private buildPayloadItems;
553
422
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CompanyActionSelectorComponent, never>;
554
423
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CompanyActionSelectorComponent, "flusys-company-action-selector", never, {}, {}, never, never, true, never>;
555
424
  }
@@ -659,37 +528,7 @@ declare class UserRoleSelectorComponent {
659
528
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UserRoleSelectorComponent, "flusys-user-role-selector", never, {}, {}, never, never, true, never>;
660
529
  }
661
530
 
662
- /**
663
- * User-Action Selector Component
664
- *
665
- * Manages direct user action permissions with hierarchical tree view.
666
- *
667
- * **Architecture:**
668
- * - Presentation: TreeTable for hierarchical display
669
- * - Business Logic: Flat action list for selection/validation
670
- * - State: Signals with computed dependencies
671
- *
672
- * **Core Features:**
673
- * - User dropdown with async loading
674
- * - Branch selector (if company feature enabled)
675
- * - Hierarchical TreeTable with expand/collapse
676
- * - Direct user-action permission assignment (bypassing roles)
677
- * - Real-time change tracking
678
- *
679
- * **Granularity:**
680
- * - Company-wide: branchId = undefined
681
- * - Branch-specific: branchId = selected value
682
- *
683
- * **Performance:**
684
- * - Computed signals for reactive updates
685
- * - Branch filtering on company context change
686
- *
687
- * @example
688
- * ```html
689
- * <flusys-user-action-selector />
690
- * ```
691
- */
692
- declare class UserActionSelectorComponent {
531
+ declare class UserActionSelectorComponent extends BaseActionSelectorComponent {
693
532
  readonly USER_ACTION_PERMISSIONS: {
694
533
  readonly READ: "user-action.read";
695
534
  readonly ASSIGN: "user-action.assign";
@@ -699,63 +538,18 @@ declare class UserActionSelectorComponent {
699
538
  private readonly userPermissionProvider;
700
539
  private readonly actionApi;
701
540
  private readonly permissionApi;
702
- private readonly permissionLogic;
703
541
  private readonly messageService;
704
- private readonly translateAdapter;
705
- private translate;
706
542
  readonly selectedUserId: _angular_core.WritableSignal<string | null>;
707
543
  readonly selectedBranchId: _angular_core.WritableSignal<string | undefined>;
708
544
  readonly branches: _angular_core.WritableSignal<IBranch[]>;
709
- readonly loading: _angular_core.WritableSignal<boolean>;
710
- readonly saving: _angular_core.WritableSignal<boolean>;
711
- private readonly _actions;
712
- readonly actions: _angular_core.Signal<IAction[]>;
713
- private readonly _actionsTree;
714
- private readonly actionsTree;
715
- private readonly _selectionMap;
716
- readonly selectionMap: _angular_core.Signal<Record<string, boolean>>;
717
- private readonly _initialSelection;
718
- private readonly initialSelection;
719
545
  private readonly isCompanyFeatureActive;
720
546
  readonly showBranchSelector: _angular_core.Signal<boolean>;
721
547
  readonly filteredBranches: _angular_core.Signal<IBranch[]>;
722
- readonly treeNodes: _angular_core.Signal<primeng_api.TreeNode<IAction>[]>;
723
- readonly allSelected: _angular_core.Signal<boolean>;
724
- readonly hasChanges: _angular_core.Signal<boolean>;
725
- readonly actionsWithUnmetPrerequisites: _angular_core.Signal<Set<string>>;
726
- readonly invalidActionsCount: _angular_core.Signal<number>;
727
- readonly pendingAdd: _angular_core.Signal<IAction[]>;
728
- readonly pendingRemove: _angular_core.Signal<IAction[]>;
729
- readonly canSave: _angular_core.Signal<boolean>;
730
548
  constructor();
731
- /**
732
- * Load user's permitted branches
733
- */
549
+ protected getDefaultTooltip(isSelected: boolean): string;
734
550
  private loadUserBranches;
735
- /**
736
- * Load actions and assignments for selected user
737
- */
738
551
  private loadData;
739
- /**
740
- * Get tooltip for action checkbox
741
- */
742
- getTooltip(action: IAction): string;
743
- /**
744
- * Check if action has unmet prerequisites
745
- */
746
- hasUnmetPrerequisites(action: IAction): boolean;
747
- /**
748
- * Handle action toggle with dependency management
749
- */
750
- onActionToggle(action: IAction, newValue: boolean): void;
751
- toggleAll(): void;
752
- selectAll(): void;
753
- deselectAll(): void;
754
- private setAllActions;
755
552
  saveChanges(): Promise<void>;
756
- private resetState;
757
- private buildSelectionMap;
758
- private buildPermissionItems;
759
553
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserActionSelectorComponent, never>;
760
554
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UserActionSelectorComponent, "flusys-user-action-selector", never, {}, {}, never, never, true, never>;
761
555
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"flusys-ng-iam-action-form-page.component-DJbMu2aV.mjs","sources":["../../../projects/ng-iam/pages/action/action-form-page.component.ts"],"sourcesContent":["import { Component, computed, effect, inject, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { AngularModule, ILogicNode, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { firstValueFrom } from 'rxjs';\nimport { LogicBuilderComponent } from '../../components/logic-builder.component';\nimport { ActionType, IAction } from '../../interfaces/action.interface';\nimport { ActionApiService } from '../../services/action-api.service';\n\ninterface IActionFormModel {\n id: string;\n name: string;\n description: string;\n code: string;\n actionType: ActionType;\n permissionLogic: ILogicNode | null;\n parentId: string;\n serial: string;\n isActive: boolean;\n metadata: Record<string, unknown> | null;\n}\n\n@Component({\n selector: 'lib-action-form-page',\n imports: [AngularModule, PrimeModule, FormField, LogicBuilderComponent, TranslatePipe],\n template: `\n <div class=\"card\">\n <h3 class=\"text-lg sm:text-xl font-semibold mb-4\">\n {{ isEditMode() ? ('iam.action.edit' | translate) : ('iam.action.new' | translate) }}\n </h3>\n\n <form (ngSubmit)=\"onSubmit()\" class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <!-- Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\">{{ 'iam.action.name' | translate }} *</label>\n <input\n pInputText\n id=\"name\"\n [formField]=\"actionForm.name\"\n [placeholder]=\"'iam.action.name.placeholder' | translate\" />\n </div>\n\n <!-- Code -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"code\" class=\"font-medium\">{{ 'iam.action.code' | translate }}</label>\n <input\n pInputText\n id=\"code\"\n [formField]=\"actionForm.code\"\n [placeholder]=\"'iam.action.code.placeholder' | translate\" />\n </div>\n\n <!-- Description -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"description\" class=\"font-medium\">{{ 'shared.description' | translate }}</label>\n <input\n pInputText\n id=\"description\"\n [formField]=\"actionForm.description\"\n [placeholder]=\"'shared.description.placeholder' | translate\" />\n </div>\n\n <!-- Action Type -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"actionType\" class=\"font-medium\">{{ 'iam.action.type' | translate }} *</label>\n <select\n id=\"actionType\"\n class=\"p-inputtext w-full\"\n [formField]=\"actionForm.actionType\">\n @for (type of actionTypes(); track type.value) {\n <option [value]=\"type.value\">{{ type.label }}</option>\n }\n </select>\n </div>\n\n <!-- Parent Action -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"parentId\" class=\"font-medium\">{{ 'iam.action.parent' | translate }}</label>\n <select\n id=\"parentId\"\n class=\"p-inputtext w-full\"\n [formField]=\"actionForm.parentId\">\n <option value=\"\">{{ 'iam.action.select.parent' | translate }}</option>\n @for (action of availableActions(); track action.id) {\n <option [value]=\"action.id\">{{ action.name }}</option>\n }\n </select>\n </div>\n\n <!-- Order -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"serial\" class=\"font-medium\">{{ 'shared.display.order' | translate }}</label>\n <input\n pInputText\n id=\"serial\"\n type=\"number\"\n [formField]=\"actionForm.serial\"\n [placeholder]=\"'shared.display.order.placeholder' | translate\" />\n </div>\n\n <!-- Is Active -->\n <div class=\"flex items-end gap-2 pb-1 md:col-span-2\">\n <p-checkbox\n [formField]=\"actionForm.isActive\"\n [binary]=\"true\"\n inputId=\"isActive\" />\n <label for=\"isActive\">{{ 'shared.active' | translate }}</label>\n </div>\n\n <!-- Permission Logic Builder -->\n <div class=\"md:col-span-2\">\n <lib-logic-builder\n [logic]=\"formModel().permissionLogic\"\n [actions]=\"allActionsForLogic()\"\n (logicChange)=\"onLogicChange($event)\" />\n </div>\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-2 md:col-span-2 pt-4\">\n <p-button\n [label]=\"'shared.cancel' | translate\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onBack()\" />\n <p-button\n [label]=\"isEditMode() ? ('shared.update' | translate) : ('shared.create' | translate)\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\" />\n </div>\n </form>\n </div>\n `,\n})\nexport class ActionFormPageComponent {\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly actionApi = inject(ActionApiService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n private readonly routeParams = toSignal(this.route.paramMap);\n private initialized = false;\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly isLoading = signal(false);\n readonly existingAction = signal<IAction | null>(null);\n readonly isEditMode = computed(() => !!this.existingAction());\n readonly allActionsForLogic = signal<Array<{ id: string; name: string }>>([]);\n readonly allActions = signal<IAction[]>([]);\n\n readonly availableActions = computed(() => {\n const actions = this.allActions();\n const currentId = this.existingAction()?.id;\n return currentId ? actions.filter((a) => a.id !== currentId) : actions;\n });\n\n readonly formModel = signal<IActionFormModel>({\n id: '',\n name: '',\n description: '',\n code: '',\n actionType: ActionType.BACKEND,\n permissionLogic: null,\n parentId: '',\n serial: '',\n isActive: true,\n metadata: null,\n });\n\n readonly actionTypes = computed(() => [\n { label: this.translate('iam.action.type.backend.label'), value: ActionType.BACKEND },\n { label: this.translate('iam.action.type.frontend.label'), value: ActionType.FRONTEND },\n { label: this.translate('iam.action.type.both.label'), value: ActionType.BOTH },\n ]);\n\n readonly actionForm = form(this.formModel, (f) => {\n required(f.name, { message: this.translate('shared.validation.required', { field: this.translate('iam.action.name') }) });\n });\n\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return model.name.trim().length > 0;\n });\n\n constructor() {\n effect(() => {\n const params = this.routeParams();\n if (!params || this.initialized) return;\n\n this.initialized = true;\n this.initializeForm(params.get('id'));\n });\n }\n\n private async initializeForm(id: string | null): Promise<void> {\n try {\n const response = await firstValueFrom(\n this.actionApi.getAll('', {\n pagination: { currentPage: 0, pageSize: 10000 },\n select: ['id', 'name', 'code', 'actionType', 'permissionLogic'],\n }),\n );\n if (response?.success && response.data) {\n this.allActionsForLogic.set(response.data.map((a) => ({ id: a.id!, name: a.name ?? this.translate('shared.unnamed') })));\n this.allActions.set(response.data);\n }\n } catch {\n // Ignored - form will show empty parent dropdown\n }\n\n if (id && id !== 'new') {\n await this.loadAction(id);\n }\n }\n\n async loadAction(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.actionApi.findByIdAsync(id, [\n 'id', 'name', 'description', 'code', 'actionType',\n 'permissionLogic', 'parentId', 'serial', 'isActive', 'metadata',\n ]);\n\n if (response?.success && response.data) {\n const action = response.data;\n this.existingAction.set(action);\n this.formModel.set({\n id: action.id ?? '',\n name: action.name ?? '',\n description: action.description ?? '',\n code: action.code ?? '',\n actionType: action.actionType ?? ActionType.BACKEND,\n permissionLogic: action.permissionLogic ?? null,\n parentId: action.parentId ?? '',\n serial: action.serial?.toString() ?? '',\n isActive: action.isActive ?? true,\n metadata: action.metadata ?? null,\n });\n } else {\n this.router.navigate(['/iam/actions']);\n }\n } catch {\n this.router.navigate(['/iam/actions']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n async onSubmit(): Promise<void> {\n if (!this.isFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('shared.fill.required.fields'),\n });\n return;\n }\n\n this.isLoading.set(true);\n\n try {\n const formValue = this.formModel();\n const dto = {\n ...formValue,\n description: formValue.description || undefined,\n code: formValue.code || undefined,\n parentId: formValue.parentId || undefined,\n serial: formValue.serial ? parseInt(formValue.serial, 10) : undefined,\n metadata: formValue.metadata ?? undefined,\n permissionLogic: formValue.permissionLogic ?? undefined,\n };\n\n if (this.isEditMode()) {\n await this.actionApi.updateAsync(dto);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('iam.action.update.success'),\n });\n } else {\n await this.actionApi.insertAsync(dto);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('iam.action.create.success'),\n });\n }\n\n this.router.navigate(['/iam/actions']);\n } catch {\n // Handled by global interceptor\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onBack(): void {\n this.router.navigate(['/iam/actions']);\n }\n\n onLogicChange(logic: ILogicNode | null): void {\n this.formModel.update((model) => ({ ...model, permissionLogic: logic }));\n }\n}\n"],"names":[],"mappings":"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"}