@flusys/ng-iam 4.1.1 → 5.0.1
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.
- package/README.md +26 -382
- package/fesm2022/{flusys-ng-iam-action-form-page.component-DJbMu2aV.mjs → flusys-ng-iam-action-form-page.component-D_vwcCjG.mjs} +14 -26
- package/fesm2022/flusys-ng-iam-action-form-page.component-D_vwcCjG.mjs.map +1 -0
- package/fesm2022/{flusys-ng-iam-action-list-page.component-DYnYC7Nn.mjs → flusys-ng-iam-action-list-page.component-DRK79zUR.mjs} +4 -4
- package/fesm2022/{flusys-ng-iam-action-list-page.component-DYnYC7Nn.mjs.map → flusys-ng-iam-action-list-page.component-DRK79zUR.mjs.map} +1 -1
- package/fesm2022/{flusys-ng-iam-flusys-ng-iam-CnVOy_4s.mjs → flusys-ng-iam-flusys-ng-iam-C6I4k78L.mjs} +1140 -1340
- package/fesm2022/flusys-ng-iam-flusys-ng-iam-C6I4k78L.mjs.map +1 -0
- package/fesm2022/{flusys-ng-iam-permission-page.component-_cLVilgz.mjs → flusys-ng-iam-permission-page.component-CZebeUhC.mjs} +2 -2
- package/fesm2022/{flusys-ng-iam-permission-page.component-_cLVilgz.mjs.map → flusys-ng-iam-permission-page.component-CZebeUhC.mjs.map} +1 -1
- package/fesm2022/{flusys-ng-iam-role-form-page.component-BuZmko2b.mjs → flusys-ng-iam-role-form-page.component-49dKMKOj.mjs} +11 -20
- package/fesm2022/flusys-ng-iam-role-form-page.component-49dKMKOj.mjs.map +1 -0
- package/fesm2022/{flusys-ng-iam-role-list-page.component-C7GVYYIn.mjs → flusys-ng-iam-role-list-page.component-CT7CvvHj.mjs} +114 -39
- package/fesm2022/flusys-ng-iam-role-list-page.component-CT7CvvHj.mjs.map +1 -0
- package/fesm2022/flusys-ng-iam.mjs +1 -1
- package/package.json +4 -4
- package/types/flusys-ng-iam.d.ts +44 -250
- package/fesm2022/flusys-ng-iam-action-form-page.component-DJbMu2aV.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-flusys-ng-iam-CnVOy_4s.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-role-form-page.component-BuZmko2b.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-role-list-page.component-C7GVYYIn.mjs.map +0 -1
package/types/flusys-ng-iam.d.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
347
|
+
protected readonly _actions: _angular_core.WritableSignal<IAction[]>;
|
|
396
348
|
readonly actions: _angular_core.Signal<IAction[]>;
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
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
|
-
|
|
402
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
437
|
-
|
|
438
|
-
|
|
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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"}
|