@flusys/ng-iam 1.1.1-beta → 1.2.0-rc.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 +44 -1027
- package/fesm2022/flusys-ng-iam-action-form-page.component-Vc5Toouu.mjs +502 -0
- package/fesm2022/flusys-ng-iam-action-form-page.component-Vc5Toouu.mjs.map +1 -0
- package/fesm2022/flusys-ng-iam-action-list-page.component-UGKclpFx.mjs +348 -0
- package/fesm2022/flusys-ng-iam-action-list-page.component-UGKclpFx.mjs.map +1 -0
- package/fesm2022/flusys-ng-iam-flusys-ng-iam-CrycDULz.mjs +4561 -0
- package/fesm2022/flusys-ng-iam-flusys-ng-iam-CrycDULz.mjs.map +1 -0
- package/fesm2022/flusys-ng-iam-iam-container.component-D0m8u6nu.mjs +105 -0
- package/fesm2022/flusys-ng-iam-iam-container.component-D0m8u6nu.mjs.map +1 -0
- package/fesm2022/flusys-ng-iam-permission-page.component-x88X4AgJ.mjs +143 -0
- package/fesm2022/flusys-ng-iam-permission-page.component-x88X4AgJ.mjs.map +1 -0
- package/fesm2022/flusys-ng-iam-role-form-page.component-InsxdriD.mjs +335 -0
- package/fesm2022/flusys-ng-iam-role-form-page.component-InsxdriD.mjs.map +1 -0
- package/fesm2022/flusys-ng-iam-role-list-page.component-8NGXCeSZ.mjs +389 -0
- package/fesm2022/flusys-ng-iam-role-list-page.component-8NGXCeSZ.mjs.map +1 -0
- package/fesm2022/flusys-ng-iam.mjs +1 -1
- package/package.json +11 -10
- package/types/flusys-ng-iam.d.ts +107 -686
- package/fesm2022/flusys-ng-iam-action-form-page.component-C1j10Qhw.mjs +0 -467
- package/fesm2022/flusys-ng-iam-action-form-page.component-C1j10Qhw.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-action-list-page.component-BCzSardO.mjs +0 -281
- package/fesm2022/flusys-ng-iam-action-list-page.component-BCzSardO.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-flusys-ng-iam-DISrddPh.mjs +0 -4940
- package/fesm2022/flusys-ng-iam-flusys-ng-iam-DISrddPh.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-iam-container.component-BkhqmzLi.mjs +0 -97
- package/fesm2022/flusys-ng-iam-iam-container.component-BkhqmzLi.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-permission-page.component-BSQFPt_N.mjs +0 -143
- package/fesm2022/flusys-ng-iam-permission-page.component-BSQFPt_N.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-role-form-page.component-Cqziu_BM.mjs +0 -314
- package/fesm2022/flusys-ng-iam-role-form-page.component-Cqziu_BM.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-role-list-page.component-BObCxHiB.mjs +0 -266
- package/fesm2022/flusys-ng-iam-role-list-page.component-BObCxHiB.mjs.map +0 -1
package/types/flusys-ng-iam.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { IBaseEntity, ILogicNode, ApiResourceService, ISingleResponse, IProfilePermissionProvider, IProfileRoleInfo, IProfileActionInfo } from '@flusys/ng-shared';
|
|
1
|
+
import { IBaseEntity, ILogicNode, ApiResourceService, ISingleResponse, TranslateService, IProfilePermissionProvider, IProfileRoleInfo, IProfileActionInfo } from '@flusys/ng-shared';
|
|
2
2
|
import * as _angular_core from '@angular/core';
|
|
3
|
-
import {
|
|
3
|
+
import { Provider } from '@angular/core';
|
|
4
4
|
import { Observable } from 'rxjs';
|
|
5
5
|
import { BaseApiService } from '@flusys/ng-core';
|
|
6
|
-
|
|
6
|
+
export { PermissionMode } from '@flusys/ng-core';
|
|
7
|
+
import * as __________flusys_ng_ui_types_flusys_ng_ui from '../../@flusys/ng-ui/types/flusys-ng-ui';
|
|
7
8
|
import { Routes } from '@angular/router';
|
|
8
9
|
|
|
9
10
|
/**
|
|
@@ -35,10 +36,6 @@ interface IBranch {
|
|
|
35
36
|
companyId: string;
|
|
36
37
|
}
|
|
37
38
|
|
|
38
|
-
/**
|
|
39
|
-
* Role Response DTO
|
|
40
|
-
* Matches backend RoleResponseDto
|
|
41
|
-
*/
|
|
42
39
|
interface IRole extends IBaseEntity {
|
|
43
40
|
readOnly: boolean;
|
|
44
41
|
name: string;
|
|
@@ -46,49 +43,28 @@ interface IRole extends IBaseEntity {
|
|
|
46
43
|
companyId: string | null;
|
|
47
44
|
isActive: boolean;
|
|
48
45
|
serial: number | null;
|
|
49
|
-
metadata: Record<string, any> | null;
|
|
50
46
|
}
|
|
51
|
-
/**
|
|
52
|
-
* Create Role DTO
|
|
53
|
-
* Matches backend CreateRoleDto
|
|
54
|
-
*/
|
|
55
47
|
interface ICreateRoleDto {
|
|
56
48
|
name: string;
|
|
57
49
|
description?: string;
|
|
58
50
|
companyId?: string;
|
|
59
51
|
isActive?: boolean;
|
|
60
52
|
serial?: number;
|
|
61
|
-
metadata?: Record<string, any>;
|
|
62
53
|
}
|
|
63
|
-
/**
|
|
64
|
-
* Update Role DTO
|
|
65
|
-
* Matches backend UpdateRoleDto
|
|
66
|
-
*/
|
|
67
54
|
interface IUpdateRoleDto extends Partial<ICreateRoleDto> {
|
|
68
55
|
id: string;
|
|
69
56
|
}
|
|
70
|
-
/**
|
|
71
|
-
* Role Query DTO
|
|
72
|
-
* Matches backend RoleQueryDto
|
|
73
|
-
*/
|
|
74
57
|
interface IRoleQueryDto {
|
|
75
58
|
companyId?: string;
|
|
76
59
|
isActive?: boolean;
|
|
77
60
|
}
|
|
78
61
|
|
|
79
|
-
/**
|
|
80
|
-
* Action Type - determines how action is used
|
|
81
|
-
* CRITICAL: Must match backend ActionType enum exactly
|
|
82
|
-
*/
|
|
62
|
+
/** Must match backend ActionType enum */
|
|
83
63
|
declare enum ActionType {
|
|
84
|
-
BACKEND = "backend"
|
|
85
|
-
FRONTEND = "frontend"
|
|
64
|
+
BACKEND = "backend",
|
|
65
|
+
FRONTEND = "frontend",
|
|
86
66
|
BOTH = "both"
|
|
87
67
|
}
|
|
88
|
-
/**
|
|
89
|
-
* Action Response DTO
|
|
90
|
-
* Matches backend ActionResponseDto
|
|
91
|
-
*/
|
|
92
68
|
interface IAction extends IBaseEntity {
|
|
93
69
|
readOnly: boolean;
|
|
94
70
|
name: string;
|
|
@@ -99,19 +75,10 @@ interface IAction extends IBaseEntity {
|
|
|
99
75
|
parentId: string | null;
|
|
100
76
|
serial: number | null;
|
|
101
77
|
isActive: boolean;
|
|
102
|
-
metadata: Record<string, any> | null;
|
|
103
78
|
}
|
|
104
|
-
/**
|
|
105
|
-
* Action Tree DTO
|
|
106
|
-
* Hierarchical action structure
|
|
107
|
-
*/
|
|
108
79
|
interface IActionTreeDto extends IAction {
|
|
109
80
|
children: IActionTreeDto[];
|
|
110
81
|
}
|
|
111
|
-
/**
|
|
112
|
-
* Create Action DTO
|
|
113
|
-
* Matches backend CreateActionDto
|
|
114
|
-
*/
|
|
115
82
|
interface ICreateActionDto {
|
|
116
83
|
name: string;
|
|
117
84
|
description?: string;
|
|
@@ -121,82 +88,36 @@ interface ICreateActionDto {
|
|
|
121
88
|
parentId?: string;
|
|
122
89
|
serial?: number;
|
|
123
90
|
isActive?: boolean;
|
|
124
|
-
metadata?: Record<string, any>;
|
|
125
91
|
}
|
|
126
|
-
/**
|
|
127
|
-
* Update Action DTO
|
|
128
|
-
* Matches backend UpdateActionDto
|
|
129
|
-
*/
|
|
130
92
|
interface IUpdateActionDto extends Partial<ICreateActionDto> {
|
|
131
93
|
id: string;
|
|
132
94
|
}
|
|
133
95
|
|
|
134
|
-
/**
|
|
135
|
-
* Permission Action - 'add' or 'remove'
|
|
136
|
-
*/
|
|
137
96
|
type PermissionAction = 'add' | 'remove';
|
|
138
|
-
/**
|
|
139
|
-
* Permission Mode - matches backend IAMPermissionMode
|
|
140
|
-
*/
|
|
141
|
-
type PermissionMode = 'rbac' | 'direct' | 'full';
|
|
142
|
-
/**
|
|
143
|
-
* Permission Item DTO
|
|
144
|
-
* Used in all assignment operations
|
|
145
|
-
*/
|
|
146
97
|
interface IPermissionItemDto {
|
|
147
98
|
id: string;
|
|
148
99
|
action: PermissionAction;
|
|
149
100
|
}
|
|
150
|
-
/**
|
|
151
|
-
* Assign User Actions DTO
|
|
152
|
-
* Assign/remove actions directly to/from user (DIRECT/FULL mode)
|
|
153
|
-
*
|
|
154
|
-
* Permission Granularity:
|
|
155
|
-
* - companyId + branchId = undefined: Global (super admin)
|
|
156
|
-
* - companyId set + branchId = undefined: Company-wide (all branches)
|
|
157
|
-
* - companyId set + branchId set: Branch-specific
|
|
158
|
-
*/
|
|
159
101
|
interface IAssignUserActionsDto {
|
|
160
102
|
userId: string;
|
|
161
103
|
companyId?: string;
|
|
162
104
|
branchId?: string;
|
|
163
105
|
items: IPermissionItemDto[];
|
|
164
106
|
}
|
|
165
|
-
/**
|
|
166
|
-
* Assign Company Actions DTO
|
|
167
|
-
* Whitelist actions for company (if company feature enabled)
|
|
168
|
-
*/
|
|
169
107
|
interface IAssignCompanyActionsDto {
|
|
170
108
|
companyId: string;
|
|
171
109
|
items: IPermissionItemDto[];
|
|
172
110
|
}
|
|
173
|
-
/**
|
|
174
|
-
* Assign Role Actions DTO
|
|
175
|
-
* Assign/remove actions to/from role (RBAC/FULL mode)
|
|
176
|
-
*/
|
|
177
111
|
interface IAssignRoleActionsDto {
|
|
178
112
|
roleId: string;
|
|
179
113
|
items: IPermissionItemDto[];
|
|
180
114
|
}
|
|
181
|
-
/**
|
|
182
|
-
* Assign User Roles DTO
|
|
183
|
-
* Assign/remove roles to/from user (RBAC/FULL mode)
|
|
184
|
-
*
|
|
185
|
-
* Permission Granularity:
|
|
186
|
-
* - companyId + branchId = undefined: Global (super admin)
|
|
187
|
-
* - companyId set + branchId = undefined: Company-wide (all branches)
|
|
188
|
-
* - companyId set + branchId set: Branch-specific
|
|
189
|
-
*/
|
|
190
115
|
interface IAssignUserRolesDto {
|
|
191
116
|
userId: string;
|
|
192
117
|
companyId?: string;
|
|
193
118
|
branchId?: string;
|
|
194
119
|
items: IPermissionItemDto[];
|
|
195
120
|
}
|
|
196
|
-
/**
|
|
197
|
-
* User Action Response DTO
|
|
198
|
-
* Direct user → action permissions (branch-scoped if company feature enabled)
|
|
199
|
-
*/
|
|
200
121
|
interface IUserActionResponseDto {
|
|
201
122
|
id: string;
|
|
202
123
|
userId: string;
|
|
@@ -206,10 +127,6 @@ interface IUserActionResponseDto {
|
|
|
206
127
|
branchId: string | null;
|
|
207
128
|
createdAt: Date;
|
|
208
129
|
}
|
|
209
|
-
/**
|
|
210
|
-
* Role Action Response DTO
|
|
211
|
-
* Role → action permissions (NOT branch-scoped)
|
|
212
|
-
*/
|
|
213
130
|
interface IRoleActionResponseDto {
|
|
214
131
|
id: string;
|
|
215
132
|
roleId: string;
|
|
@@ -218,10 +135,6 @@ interface IRoleActionResponseDto {
|
|
|
218
135
|
actionName: string;
|
|
219
136
|
createdAt: Date;
|
|
220
137
|
}
|
|
221
|
-
/**
|
|
222
|
-
* Company Action Response DTO
|
|
223
|
-
* Company → action whitelist
|
|
224
|
-
*/
|
|
225
138
|
interface ICompanyActionResponseDto {
|
|
226
139
|
id: string;
|
|
227
140
|
companyId: string;
|
|
@@ -230,37 +143,14 @@ interface ICompanyActionResponseDto {
|
|
|
230
143
|
actionName: string;
|
|
231
144
|
createdAt: Date;
|
|
232
145
|
}
|
|
233
|
-
/**
|
|
234
|
-
* User Role Response DTO
|
|
235
|
-
* User → role assignments (NOT branch-scoped)
|
|
236
|
-
*/
|
|
237
146
|
interface IUserRoleResponseDto {
|
|
238
147
|
id: string;
|
|
239
148
|
userId: string;
|
|
240
149
|
roleId: string;
|
|
241
|
-
roleCode: string;
|
|
242
150
|
roleName: string;
|
|
243
151
|
branchId: string | null;
|
|
244
152
|
createdAt: Date;
|
|
245
153
|
}
|
|
246
|
-
/**
|
|
247
|
-
* Menu item from IAM permissions (menu-type actions)
|
|
248
|
-
*/
|
|
249
|
-
interface IMenuAction {
|
|
250
|
-
id: string;
|
|
251
|
-
code: string;
|
|
252
|
-
name: string;
|
|
253
|
-
route: string | null;
|
|
254
|
-
icon: string | null;
|
|
255
|
-
iconType: number | null;
|
|
256
|
-
serial: number | null;
|
|
257
|
-
parentId: string | null;
|
|
258
|
-
children?: IMenuAction[];
|
|
259
|
-
}
|
|
260
|
-
/**
|
|
261
|
-
* My Permissions Response DTO
|
|
262
|
-
* Complete user permissions (frontend actions, cached endpoints, menus)
|
|
263
|
-
*/
|
|
264
154
|
interface IMyPermissionsResponseDto {
|
|
265
155
|
frontendActions: Array<{
|
|
266
156
|
id: string;
|
|
@@ -270,248 +160,83 @@ interface IMyPermissionsResponseDto {
|
|
|
270
160
|
}>;
|
|
271
161
|
cachedEndpoints: number;
|
|
272
162
|
}
|
|
273
|
-
/**
|
|
274
|
-
* Prerequisite Action DTO
|
|
275
|
-
* Action required as a prerequisite
|
|
276
|
-
*/
|
|
277
163
|
interface IPrerequisiteActionDto {
|
|
278
164
|
actionId: string;
|
|
279
165
|
actionCode: string;
|
|
280
166
|
actionName: string;
|
|
281
167
|
}
|
|
282
|
-
/**
|
|
283
|
-
* Prerequisite Validation Error
|
|
284
|
-
* Describes an action that failed prerequisite validation
|
|
285
|
-
*/
|
|
286
168
|
interface IPrerequisiteValidationError {
|
|
287
169
|
actionId: string;
|
|
288
170
|
actionCode: string;
|
|
289
171
|
actionName: string;
|
|
290
172
|
requiredActions: IPrerequisiteActionDto[];
|
|
291
173
|
}
|
|
292
|
-
/**
|
|
293
|
-
* Permission Operation Result DTO
|
|
294
|
-
* Result of assignment operations
|
|
295
|
-
*/
|
|
296
174
|
interface IPermissionOperationResultDto {
|
|
297
175
|
success: boolean;
|
|
298
176
|
added: number;
|
|
299
177
|
removed: number;
|
|
300
178
|
message: string;
|
|
179
|
+
messageKey?: string;
|
|
301
180
|
prerequisiteErrors?: IPrerequisiteValidationError[];
|
|
302
181
|
}
|
|
303
|
-
/**
|
|
304
|
-
* Get User Actions DTO
|
|
305
|
-
* Optional branchId filter
|
|
306
|
-
*/
|
|
307
182
|
interface IGetUserActionsDto {
|
|
308
183
|
branchId?: string;
|
|
309
184
|
}
|
|
310
|
-
/**
|
|
311
|
-
* Get Role Actions DTO
|
|
312
|
-
* No parameters
|
|
313
|
-
*/
|
|
314
185
|
interface IGetRoleActionsDto {
|
|
315
186
|
}
|
|
316
|
-
/**
|
|
317
|
-
* Get User Roles DTO
|
|
318
|
-
* Optional branchId filter (ignored - roles are NOT branch-scoped)
|
|
319
|
-
*/
|
|
320
187
|
interface IGetUserRolesDto {
|
|
321
188
|
branchId?: string;
|
|
322
189
|
}
|
|
323
|
-
/**
|
|
324
|
-
* Get My Permissions DTO
|
|
325
|
-
* Optional parentCodes filter for frontend actions
|
|
326
|
-
*/
|
|
327
190
|
interface IGetMyPermissionsDto {
|
|
328
191
|
parentCodes?: string[];
|
|
329
192
|
}
|
|
330
193
|
|
|
331
|
-
/**
|
|
332
|
-
* Pagination Constants
|
|
333
|
-
*
|
|
334
|
-
* Standard pagination limits for IAM components.
|
|
335
|
-
* Prevents excessive data loading and potential DoS.
|
|
336
|
-
*/
|
|
337
|
-
/**
|
|
338
|
-
* Maximum items to fetch for dropdown lists
|
|
339
|
-
* Used for: companies, roles, users, branches
|
|
340
|
-
*
|
|
341
|
-
* Security: Prevents memory exhaustion from loading excessive records
|
|
342
|
-
*/
|
|
194
|
+
/** Maximum items for dropdown lists (companies, roles, users, branches) */
|
|
343
195
|
declare const MAX_DROPDOWN_ITEMS = 100;
|
|
344
196
|
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
* Handles role CRUD operations
|
|
348
|
-
* Endpoint: POST /iam/roles/*
|
|
349
|
-
* Conditional: Only available in RBAC/FULL mode
|
|
350
|
-
*/
|
|
197
|
+
declare const IAM_MESSAGES: Record<string, string>;
|
|
198
|
+
|
|
351
199
|
declare class RoleApiService extends ApiResourceService<IUpdateRoleDto, IRole> {
|
|
352
200
|
constructor();
|
|
353
201
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<RoleApiService, never>;
|
|
354
202
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<RoleApiService>;
|
|
355
203
|
}
|
|
356
204
|
|
|
357
|
-
/**
|
|
358
|
-
* Action API Service
|
|
359
|
-
* Handles action CRUD operations
|
|
360
|
-
* Endpoint: POST /iam/actions/*
|
|
361
|
-
*/
|
|
362
205
|
declare class ActionApiService extends ApiResourceService<IUpdateActionDto, IAction> {
|
|
363
206
|
private readonly appConfig;
|
|
364
207
|
constructor();
|
|
365
|
-
/**
|
|
366
|
-
* Get actions for permission assignment
|
|
367
|
-
* GET /iam/actions/tree-for-permission
|
|
368
|
-
* Returns actions filtered by company whitelist if enabled
|
|
369
|
-
*/
|
|
208
|
+
/** Get actions filtered by company whitelist for permission assignment */
|
|
370
209
|
getActionsForPermission(): Observable<ISingleResponse<IActionTreeDto[]>>;
|
|
371
|
-
/**
|
|
372
|
-
* Get actions in hierarchical tree structure
|
|
373
|
-
* POST /iam/actions/tree
|
|
374
|
-
* Returns all actions organized in parent-child tree
|
|
375
|
-
*
|
|
376
|
-
* @param search - Optional search term (name or code)
|
|
377
|
-
* @param isActive - Optional filter by active status
|
|
378
|
-
* @param withDeleted - Include deleted actions (default: false)
|
|
379
|
-
* @returns Observable of action tree response
|
|
380
|
-
*/
|
|
210
|
+
/** Get actions in hierarchical tree structure */
|
|
381
211
|
getTree(search?: string, isActive?: boolean, withDeleted?: boolean): Observable<ISingleResponse<IActionTreeDto[]>>;
|
|
382
212
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ActionApiService, never>;
|
|
383
213
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<ActionApiService>;
|
|
384
214
|
}
|
|
385
215
|
|
|
386
|
-
/**
|
|
387
|
-
* Action Permission Logic Service
|
|
388
|
-
*
|
|
389
|
-
* Shared service for handling smart dependency management across all action selectors:
|
|
390
|
-
* - Company-Action Selector
|
|
391
|
-
* - Role-Action Selector
|
|
392
|
-
* - User-Action Selector
|
|
393
|
-
*
|
|
394
|
-
* **Core Features:**
|
|
395
|
-
* - Smart auto-selection (AND/OR optimization)
|
|
396
|
-
* - Dependency detection and management
|
|
397
|
-
* - Alternative suggestion for OR logic
|
|
398
|
-
* - Visual formatting of permission logic trees
|
|
399
|
-
* - Prerequisite validation
|
|
400
|
-
*
|
|
401
|
-
* @example
|
|
402
|
-
* constructor() {
|
|
403
|
-
* this.permissionLogic = inject(ActionPermissionLogicService);
|
|
404
|
-
* }
|
|
405
|
-
*
|
|
406
|
-
* onActionToggle(action: IAction, newValue: boolean) {
|
|
407
|
-
* if (!newValue) {
|
|
408
|
-
* this.permissionLogic.handleUncheck(
|
|
409
|
-
* action,
|
|
410
|
-
* this.selectionMap(),
|
|
411
|
-
* this.actions(),
|
|
412
|
-
* (newMap) => this.selectionMap.set(newMap)
|
|
413
|
-
* );
|
|
414
|
-
* } else {
|
|
415
|
-
* this.permissionLogic.handleCheck(
|
|
416
|
-
* action,
|
|
417
|
-
* this.selectionMap(),
|
|
418
|
-
* this.actions(),
|
|
419
|
-
* (newMap) => this.selectionMap.set(newMap),
|
|
420
|
-
* (previousState) => this.selectionMap.set(previousState)
|
|
421
|
-
* );
|
|
422
|
-
* }
|
|
423
|
-
* }
|
|
424
|
-
*/
|
|
216
|
+
/** Shared service for smart dependency management across action selectors */
|
|
425
217
|
declare class ActionPermissionLogicService {
|
|
426
218
|
private readonly confirmationService;
|
|
427
219
|
private readonly messageService;
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
* Uses recursive deep scan to find ALL missing prerequisites at all levels,
|
|
432
|
-
* not just direct dependencies. This ensures cascading dependencies are
|
|
433
|
-
* resolved in a single step.
|
|
434
|
-
*
|
|
435
|
-
* @param action - Action being checked
|
|
436
|
-
* @param currentSelection - Current selection map
|
|
437
|
-
* @param allActions - All available actions
|
|
438
|
-
* @param onUpdate - Callback to update selection
|
|
439
|
-
* @param onCancel - Callback when user cancels
|
|
440
|
-
*/
|
|
220
|
+
private readonly translateAdapter;
|
|
221
|
+
private t;
|
|
222
|
+
/** Handle checking an action with prerequisite validation (recursive deep scan) */
|
|
441
223
|
handleCheck(action: IAction, currentSelection: Record<string, boolean>, allActions: IAction[], onUpdate: (newSelection: Record<string, boolean>) => void, onCancel: (previousState: Record<string, boolean>) => void): void;
|
|
442
|
-
/**
|
|
443
|
-
* Handle unchecking an action with dependency detection
|
|
444
|
-
*
|
|
445
|
-
* @param action - Action being unchecked
|
|
446
|
-
* @param currentSelection - Current selection map
|
|
447
|
-
* @param allActions - All available actions
|
|
448
|
-
* @param onUpdate - Callback to update selection
|
|
449
|
-
*/
|
|
224
|
+
/** Handle unchecking an action with dependency detection */
|
|
450
225
|
handleUncheck(action: IAction, currentSelection: Record<string, boolean>, allActions: IAction[], onUpdate: (newSelection: Record<string, boolean>) => void): void;
|
|
451
|
-
/**
|
|
452
|
-
* Check if an action has unmet prerequisites
|
|
453
|
-
*
|
|
454
|
-
* @param action - Action to check
|
|
455
|
-
* @param currentSelection - Current selection map
|
|
456
|
-
* @param allActions - All available actions
|
|
457
|
-
* @returns True if action has unmet prerequisites
|
|
458
|
-
*/
|
|
226
|
+
/** Check if an action has unmet prerequisites */
|
|
459
227
|
hasUnmetPrerequisites(action: IAction, currentSelection: Record<string, boolean>, allActions: IAction[]): boolean;
|
|
460
|
-
/**
|
|
461
|
-
* Get all selected actions that have unmet prerequisites
|
|
462
|
-
*
|
|
463
|
-
* @param currentSelection - Current selection map
|
|
464
|
-
* @param allActions - All available actions
|
|
465
|
-
* @returns Array of actions with unmet prerequisites
|
|
466
|
-
*/
|
|
228
|
+
/** Get all selected actions that have unmet prerequisites */
|
|
467
229
|
getActionsWithUnmetPrerequisites(currentSelection: Record<string, boolean>, allActions: IAction[]): IAction[];
|
|
468
|
-
/**
|
|
469
|
-
* Show validation error dialog with auto-fix options
|
|
470
|
-
*
|
|
471
|
-
* @param invalidActions - Actions with unmet prerequisites
|
|
472
|
-
* @param currentSelection - Current selection map
|
|
473
|
-
* @param allActions - All available actions
|
|
474
|
-
* @param onUpdate - Callback to update selection
|
|
475
|
-
*/
|
|
230
|
+
/** Show validation error dialog with auto-fix options */
|
|
476
231
|
showValidationErrorDialog(invalidActions: IAction[], currentSelection: Record<string, boolean>, allActions: IAction[], onUpdate: (newSelection: Record<string, boolean>) => void): void;
|
|
477
|
-
/**
|
|
478
|
-
* Get prerequisite description for tooltip display
|
|
479
|
-
*
|
|
480
|
-
* @param action - Action to get prerequisites for
|
|
481
|
-
* @param currentSelection - Current selection map
|
|
482
|
-
* @param allActions - All available actions
|
|
483
|
-
* @returns Plain text prerequisite description
|
|
484
|
-
*/
|
|
232
|
+
/** Get prerequisite description for tooltip display */
|
|
485
233
|
getPrerequisiteTooltip(action: IAction, currentSelection: Record<string, boolean>, allActions: IAction[]): string;
|
|
486
|
-
/**
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
* @param missingActions - Actions that are missing
|
|
491
|
-
* @param allActions - All available actions
|
|
492
|
-
* @param currentSelection - Current selection map for accurate status
|
|
493
|
-
* @returns HTML formatted logic tree
|
|
494
|
-
*/
|
|
495
|
-
buildLogicMessage(logic: ILogicNode, missingActions: IAction[], allActions: IAction[], currentSelection?: Record<string, boolean>): string;
|
|
234
|
+
/** Build dynamic logic tree message with AND/OR operators and nesting */
|
|
235
|
+
buildLogicMessage(logic: ILogicNode, _missingActions: IAction[], allActions: IAction[], currentSelection?: Record<string, boolean>): string;
|
|
236
|
+
/** Extract selected action IDs from selection map */
|
|
237
|
+
private getSelectedIds;
|
|
496
238
|
private sanitizeHtml;
|
|
497
|
-
/**
|
|
498
|
-
* Recursively collect ALL missing prerequisites at all dependency levels
|
|
499
|
-
*
|
|
500
|
-
* This prevents cascading prerequisite dialogs by finding the complete
|
|
501
|
-
* dependency chain upfront.
|
|
502
|
-
*
|
|
503
|
-
* **Example:**
|
|
504
|
-
* - Action 4 requires Action 3
|
|
505
|
-
* - Action 3 requires Action 2
|
|
506
|
-
* - Action 2 requires Action 1
|
|
507
|
-
*
|
|
508
|
-
* Instead of showing 3 separate dialogs, this returns: [Action 3, Action 2, Action 1]
|
|
509
|
-
*
|
|
510
|
-
* @param action - Starting action to check
|
|
511
|
-
* @param currentSelection - Current selection map
|
|
512
|
-
* @param allActions - All available actions
|
|
513
|
-
* @returns Complete set of missing prerequisites across all levels
|
|
514
|
-
*/
|
|
239
|
+
/** Recursively collect ALL missing prerequisites at all dependency levels */
|
|
515
240
|
private getAllMissingPrerequisitesRecursive;
|
|
516
241
|
private showPrerequisiteDialog;
|
|
517
242
|
private showDependencyDialog;
|
|
@@ -523,66 +248,21 @@ declare class ActionPermissionLogicService {
|
|
|
523
248
|
private findRequiredActionIds;
|
|
524
249
|
private buildSimpleMessage;
|
|
525
250
|
private formatLogicNode;
|
|
526
|
-
/**
|
|
527
|
-
* Build clean text-based logic tree for tooltips
|
|
528
|
-
*/
|
|
251
|
+
/** Build clean text-based logic tree for tooltips */
|
|
529
252
|
private buildTooltipLogicTree;
|
|
530
253
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ActionPermissionLogicService, never>;
|
|
531
254
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<ActionPermissionLogicService>;
|
|
532
255
|
}
|
|
533
256
|
|
|
534
|
-
/**
|
|
535
|
-
* Consolidated Permission API Service
|
|
536
|
-
* Handles all permission-related operations in one service
|
|
537
|
-
* Supports:
|
|
538
|
-
* - User → Action (direct permissions)
|
|
539
|
-
* - User → Role (role assignments)
|
|
540
|
-
* - Role → Action (role permissions)
|
|
541
|
-
* - Company → Action (company whitelisting)
|
|
542
|
-
*
|
|
543
|
-
* Endpoint: POST /permissions/*
|
|
544
|
-
*/
|
|
545
257
|
declare class PermissionApiService extends BaseApiService {
|
|
546
258
|
constructor();
|
|
547
|
-
/**
|
|
548
|
-
* Assign/remove actions directly to/from user
|
|
549
|
-
* POST /permissions/user-actions/assign
|
|
550
|
-
*/
|
|
551
259
|
assignUserActions(data: IAssignUserActionsDto): Observable<ISingleResponse<IPermissionOperationResultDto>>;
|
|
552
|
-
/**
|
|
553
|
-
* Get user's direct action permissions
|
|
554
|
-
* GET /permissions/user-actions/:userId
|
|
555
|
-
*/
|
|
556
260
|
getUserActions(userId: string, query?: IGetUserActionsDto): Observable<ISingleResponse<IUserActionResponseDto[]>>;
|
|
557
|
-
/**
|
|
558
|
-
* Assign/remove roles to/from user
|
|
559
|
-
* POST /permissions/user-roles/assign
|
|
560
|
-
*/
|
|
561
261
|
assignUserRoles(data: IAssignUserRolesDto): Observable<ISingleResponse<IPermissionOperationResultDto>>;
|
|
562
|
-
/**
|
|
563
|
-
* Get user's role assignments
|
|
564
|
-
* GET /permissions/user-roles/:userId
|
|
565
|
-
*/
|
|
566
262
|
getUserRoles(userId: string, query?: IGetUserRolesDto): Observable<ISingleResponse<IUserRoleResponseDto[]>>;
|
|
567
|
-
/**
|
|
568
|
-
* Assign/remove actions to/from role
|
|
569
|
-
* POST /permissions/role-actions/assign
|
|
570
|
-
*/
|
|
571
263
|
assignRoleActions(data: IAssignRoleActionsDto): Observable<ISingleResponse<IPermissionOperationResultDto>>;
|
|
572
|
-
|
|
573
|
-
* Get role's action permissions
|
|
574
|
-
* GET /permissions/role-actions/:roleId
|
|
575
|
-
*/
|
|
576
|
-
getRoleActions(roleId: string, query?: IGetRoleActionsDto): Observable<ISingleResponse<IRoleActionResponseDto[]>>;
|
|
577
|
-
/**
|
|
578
|
-
* Assign/remove actions to/from company (whitelisting)
|
|
579
|
-
* POST /permissions/company-actions/assign
|
|
580
|
-
*/
|
|
264
|
+
getRoleActions(roleId: string): Observable<ISingleResponse<IRoleActionResponseDto[]>>;
|
|
581
265
|
assignCompanyActions(data: IAssignCompanyActionsDto): Observable<ISingleResponse<IPermissionOperationResultDto>>;
|
|
582
|
-
/**
|
|
583
|
-
* Get company's whitelisted actions
|
|
584
|
-
* GET /permissions/company-actions/:companyId
|
|
585
|
-
*/
|
|
586
266
|
getCompanyActions(companyId: string): Observable<ISingleResponse<ICompanyActionResponseDto[]>>;
|
|
587
267
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<PermissionApiService, never>;
|
|
588
268
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<PermissionApiService>;
|
|
@@ -598,7 +278,6 @@ declare class MyPermissionsApiService {
|
|
|
598
278
|
private readonly http;
|
|
599
279
|
private readonly appConfig;
|
|
600
280
|
private readonly baseUrl;
|
|
601
|
-
constructor();
|
|
602
281
|
/**
|
|
603
282
|
* Get current user's complete permissions
|
|
604
283
|
* POST /iam/permissions/my-permissions
|
|
@@ -610,45 +289,14 @@ declare class MyPermissionsApiService {
|
|
|
610
289
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<MyPermissionsApiService>;
|
|
611
290
|
}
|
|
612
291
|
|
|
613
|
-
/**
|
|
614
|
-
* Permission State Service
|
|
615
|
-
* Manages user permissions state and provides permission checking methods
|
|
616
|
-
*
|
|
617
|
-
* Uses shared PermissionValidatorService for centralized permission checking.
|
|
618
|
-
*
|
|
619
|
-
* @example
|
|
620
|
-
* ```typescript
|
|
621
|
-
* // In component
|
|
622
|
-
* readonly permissionState = inject(PermissionStateService);
|
|
623
|
-
*
|
|
624
|
-
* ngOnInit() {
|
|
625
|
-
* this.permissionState.loadPermissions();
|
|
626
|
-
* }
|
|
627
|
-
*
|
|
628
|
-
* // Check permission
|
|
629
|
-
* if (this.permissionState.hasAction('user.create')) {
|
|
630
|
-
* // Show create button
|
|
631
|
-
* }
|
|
632
|
-
* ```
|
|
633
|
-
*/
|
|
634
292
|
declare class PermissionStateService {
|
|
635
293
|
private readonly permissionApi;
|
|
636
294
|
private readonly permissionValidator;
|
|
637
295
|
private readonly _permissions;
|
|
638
|
-
readonly permissions: Signal<IMyPermissionsResponseDto | null>;
|
|
296
|
+
readonly permissions: _angular_core.Signal<IMyPermissionsResponseDto | null>;
|
|
639
297
|
private readonly _isLoading;
|
|
640
|
-
readonly isLoading: Signal<boolean>;
|
|
641
|
-
/**
|
|
642
|
-
* Load current user's permissions from API
|
|
643
|
-
* Call this on app initialization or after login
|
|
644
|
-
* Returns Observable for reactive composition
|
|
645
|
-
*/
|
|
298
|
+
readonly isLoading: _angular_core.Signal<boolean>;
|
|
646
299
|
loadPermissions(dto?: IGetMyPermissionsDto): Observable<void>;
|
|
647
|
-
/**
|
|
648
|
-
* Check if permissions are loaded
|
|
649
|
-
*
|
|
650
|
-
* @returns true if permissions are loaded
|
|
651
|
-
*/
|
|
652
300
|
isLoaded(): boolean;
|
|
653
301
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<PermissionStateService, never>;
|
|
654
302
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<PermissionStateService>;
|
|
@@ -670,78 +318,40 @@ declare class LogicBuilderComponent {
|
|
|
670
318
|
name: string;
|
|
671
319
|
}[]>;
|
|
672
320
|
readonly logicChange: _angular_core.OutputEmitterRef<ILogicNode | null>;
|
|
673
|
-
readonly
|
|
674
|
-
|
|
675
|
-
name: string;
|
|
676
|
-
}[]>;
|
|
677
|
-
private builderTree;
|
|
321
|
+
/** Internal builder tree state (private writable + public readonly pattern) */
|
|
322
|
+
private readonly _builderTree;
|
|
678
323
|
readonly builderLogic: _angular_core.Signal<IBuilderNode | null>;
|
|
324
|
+
constructor();
|
|
679
325
|
initializeLogic(): void;
|
|
680
326
|
clearLogic(): void;
|
|
681
327
|
toggleOperator(nodeId: string): void;
|
|
682
328
|
addChildNode(parentId: string, type: 'group' | 'action'): void;
|
|
683
329
|
removeNode(nodeId: string): void;
|
|
684
330
|
updateActionId(nodeId: string, actionId: string): void;
|
|
685
|
-
|
|
331
|
+
/** Updates a node in the tree and emits the change */
|
|
332
|
+
private updateNode;
|
|
333
|
+
/** Sets the tree and emits the change */
|
|
334
|
+
private updateTreeAndEmit;
|
|
686
335
|
private updateNodeInTree;
|
|
687
336
|
private removeNodeFromTree;
|
|
688
337
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<LogicBuilderComponent, never>;
|
|
689
338
|
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>;
|
|
690
339
|
}
|
|
691
340
|
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
* Manages role action permissions with hierarchical tree view and intelligent dependency management.
|
|
696
|
-
*
|
|
697
|
-
* **Architecture:**
|
|
698
|
-
* - Presentation: TreeTable for hierarchical display
|
|
699
|
-
* - Business Logic: Flat action list for selection/validation
|
|
700
|
-
* - State: Signals with computed dependencies
|
|
701
|
-
*
|
|
702
|
-
* **Core Features:**
|
|
703
|
-
* - Role dropdown with async loading
|
|
704
|
-
* - Hierarchical TreeTable with expand/collapse
|
|
705
|
-
* - Action permission assignment (add/remove)
|
|
706
|
-
* - Real-time change tracking
|
|
707
|
-
*
|
|
708
|
-
* **Dependency Management:**
|
|
709
|
-
* - Auto-selection with AND/OR logic
|
|
710
|
-
* - Dependency detection on uncheck
|
|
711
|
-
* - Cascade remove for AND dependencies
|
|
712
|
-
* - Visual warnings for unmet prerequisites
|
|
713
|
-
* - Pre-save validation with auto-fix
|
|
714
|
-
*
|
|
715
|
-
* **Performance:**
|
|
716
|
-
* - OnPush change detection
|
|
717
|
-
* - Computed signals for reactive updates
|
|
718
|
-
* - Memoized prerequisite validation
|
|
719
|
-
* - AbortController for request cancellation
|
|
720
|
-
*
|
|
721
|
-
* @example
|
|
722
|
-
* ```html
|
|
723
|
-
* <flusys-role-action-selector />
|
|
724
|
-
* ```
|
|
725
|
-
*/
|
|
726
|
-
declare class RoleActionSelectorComponent implements OnDestroy {
|
|
727
|
-
private readonly roleApi;
|
|
728
|
-
private readonly actionApi;
|
|
729
|
-
private readonly permissionApi;
|
|
730
|
-
private readonly messageService;
|
|
731
|
-
private readonly permissionLogic;
|
|
732
|
-
readonly selectedRoleId: _angular_core.WritableSignal<string | undefined>;
|
|
733
|
-
readonly roles: _angular_core.WritableSignal<IRole[]>;
|
|
341
|
+
declare abstract class BaseActionSelectorComponent {
|
|
342
|
+
protected readonly permissionLogic: ActionPermissionLogicService;
|
|
343
|
+
protected readonly translateAdapter: TranslateService | null;
|
|
734
344
|
readonly loading: _angular_core.WritableSignal<boolean>;
|
|
735
345
|
readonly saving: _angular_core.WritableSignal<boolean>;
|
|
736
|
-
|
|
346
|
+
protected readonly _actions: _angular_core.WritableSignal<IAction[]>;
|
|
737
347
|
readonly actions: _angular_core.Signal<IAction[]>;
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
348
|
+
protected readonly _actionsTree: _angular_core.WritableSignal<IActionTreeDto[]>;
|
|
349
|
+
protected readonly actionsTree: _angular_core.Signal<IActionTreeDto[]>;
|
|
350
|
+
protected readonly _selectionMap: _angular_core.WritableSignal<Record<string, boolean>>;
|
|
741
351
|
readonly selectionMap: _angular_core.Signal<Record<string, boolean>>;
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
readonly treeNodes: _angular_core.Signal<
|
|
352
|
+
protected readonly _initialSelection: _angular_core.WritableSignal<Record<string, boolean>>;
|
|
353
|
+
protected readonly initialSelection: _angular_core.Signal<Record<string, boolean>>;
|
|
354
|
+
readonly treeNodes: _angular_core.Signal<__________flusys_ng_ui_types_flusys_ng_ui.TreeNode<IAction>[]>;
|
|
745
355
|
readonly allSelected: _angular_core.Signal<boolean>;
|
|
746
356
|
readonly hasChanges: _angular_core.Signal<boolean>;
|
|
747
357
|
readonly actionsWithUnmetPrerequisites: _angular_core.Signal<Set<string>>;
|
|
@@ -749,162 +359,65 @@ declare class RoleActionSelectorComponent implements OnDestroy {
|
|
|
749
359
|
readonly pendingAdd: _angular_core.Signal<IAction[]>;
|
|
750
360
|
readonly pendingRemove: _angular_core.Signal<IAction[]>;
|
|
751
361
|
readonly canSave: _angular_core.Signal<boolean>;
|
|
752
|
-
|
|
753
|
-
constructor();
|
|
754
|
-
ngOnDestroy(): void;
|
|
755
|
-
/**
|
|
756
|
-
* Load roles from API
|
|
757
|
-
*/
|
|
758
|
-
private loadRoles;
|
|
759
|
-
/**
|
|
760
|
-
* Load actions and assignments for selected role
|
|
761
|
-
*/
|
|
762
|
-
private onRoleChange;
|
|
763
|
-
/**
|
|
764
|
-
* Get tooltip for action checkbox
|
|
765
|
-
*/
|
|
766
|
-
getTooltip(action: IAction): string;
|
|
767
|
-
/**
|
|
768
|
-
* Check if action has unmet prerequisites
|
|
769
|
-
*/
|
|
362
|
+
protected translate(key: string, vars?: Record<string, string | number>): string;
|
|
770
363
|
hasUnmetPrerequisites(action: IAction): boolean;
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
*/
|
|
364
|
+
getTooltip(action: IAction): string;
|
|
365
|
+
protected abstract getDefaultTooltip(isSelected: boolean): string;
|
|
774
366
|
onActionToggle(action: IAction, newValue: boolean): void;
|
|
775
|
-
/**
|
|
776
|
-
* Toggle all actions
|
|
777
|
-
*/
|
|
778
367
|
toggleAll(): void;
|
|
779
|
-
/**
|
|
780
|
-
* Select all actions
|
|
781
|
-
*/
|
|
782
368
|
selectAll(): void;
|
|
783
|
-
/**
|
|
784
|
-
* Deselect all actions
|
|
785
|
-
*/
|
|
786
369
|
deselectAll(): void;
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
370
|
+
protected setAllSelection(value: boolean): void;
|
|
371
|
+
protected buildSelectionMap(actions: IAction[], predicate: (action: IAction) => boolean): Record<string, boolean>;
|
|
372
|
+
protected buildPayloadItems(): Array<{
|
|
373
|
+
id: string;
|
|
374
|
+
action: PermissionAction;
|
|
375
|
+
}>;
|
|
376
|
+
protected resetState(): void;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
declare class RoleActionSelectorComponent extends BaseActionSelectorComponent {
|
|
380
|
+
readonly ROLE_ACTION_PERMISSIONS: {
|
|
381
|
+
readonly READ: "role-action.read";
|
|
382
|
+
readonly ASSIGN: "role-action.assign";
|
|
383
|
+
};
|
|
384
|
+
private readonly destroyRef;
|
|
385
|
+
private readonly roleApi;
|
|
386
|
+
private readonly actionApi;
|
|
387
|
+
private readonly permissionApi;
|
|
388
|
+
private readonly messageService;
|
|
389
|
+
readonly selectedRoleId: _angular_core.WritableSignal<string | undefined>;
|
|
390
|
+
readonly roles: _angular_core.WritableSignal<IRole[]>;
|
|
391
|
+
private loadDataAbortController;
|
|
392
|
+
constructor();
|
|
393
|
+
protected getDefaultTooltip(isSelected: boolean): string;
|
|
394
|
+
private loadRoles;
|
|
395
|
+
private onRoleChange;
|
|
790
396
|
saveChanges(): Promise<void>;
|
|
791
|
-
/**
|
|
792
|
-
* Reset component state
|
|
793
|
-
*/
|
|
794
|
-
private resetState;
|
|
795
397
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<RoleActionSelectorComponent, never>;
|
|
796
398
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<RoleActionSelectorComponent, "flusys-role-action-selector", never, {}, {}, never, never, true, never>;
|
|
797
399
|
}
|
|
798
400
|
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
* **Architecture:**
|
|
805
|
-
* - Presentation: TreeTable for hierarchical display
|
|
806
|
-
* - Business Logic: Flat action list for selection/validation
|
|
807
|
-
* - State: Signals with computed dependencies
|
|
808
|
-
*
|
|
809
|
-
* **Core Features:**
|
|
810
|
-
* - Company dropdown with async loading
|
|
811
|
-
* - Hierarchical TreeTable with expand/collapse
|
|
812
|
-
* - Action whitelist management (add/remove)
|
|
813
|
-
* - Real-time change tracking
|
|
814
|
-
*
|
|
815
|
-
* **Dependency Management:**
|
|
816
|
-
* - Auto-selection with AND/OR logic
|
|
817
|
-
* - Dependency detection on uncheck
|
|
818
|
-
* - Cascade remove for AND dependencies
|
|
819
|
-
* - Visual warnings for unmet prerequisites
|
|
820
|
-
* - Pre-save validation with auto-fix
|
|
821
|
-
*
|
|
822
|
-
* **Performance:**
|
|
823
|
-
* - OnPush change detection
|
|
824
|
-
* - Computed signals for reactive updates
|
|
825
|
-
* - Memoized prerequisite validation
|
|
826
|
-
* - AbortController for request cancellation
|
|
827
|
-
*
|
|
828
|
-
* @example
|
|
829
|
-
* ```html
|
|
830
|
-
* <flusys-company-action-selector />
|
|
831
|
-
* ```
|
|
832
|
-
*/
|
|
833
|
-
declare class CompanyActionSelectorComponent implements OnDestroy {
|
|
401
|
+
declare class CompanyActionSelectorComponent extends BaseActionSelectorComponent {
|
|
402
|
+
readonly COMPANY_ACTION_PERMISSIONS: {
|
|
403
|
+
readonly READ: "company-action.read";
|
|
404
|
+
readonly ASSIGN: "company-action.assign";
|
|
405
|
+
};
|
|
834
406
|
private readonly companyApiProvider;
|
|
835
407
|
private readonly actionApi;
|
|
836
408
|
private readonly permissionApi;
|
|
837
409
|
private readonly messageService;
|
|
838
410
|
private readonly confirmationService;
|
|
839
|
-
private readonly
|
|
411
|
+
private readonly destroyRef;
|
|
840
412
|
readonly selectedCompanyId: _angular_core.WritableSignal<string | undefined>;
|
|
841
413
|
readonly companies: _angular_core.WritableSignal<ICompany[]>;
|
|
842
|
-
readonly loading: _angular_core.WritableSignal<boolean>;
|
|
843
|
-
readonly saving: _angular_core.WritableSignal<boolean>;
|
|
844
|
-
private readonly _actions;
|
|
845
|
-
readonly actions: _angular_core.Signal<IAction[]>;
|
|
846
|
-
private readonly _actionsTree;
|
|
847
|
-
private readonly actionsTree;
|
|
848
|
-
private readonly _selectionMap;
|
|
849
|
-
readonly selectionMap: _angular_core.Signal<Record<string, boolean>>;
|
|
850
|
-
private readonly _initialSelection;
|
|
851
|
-
private readonly initialSelection;
|
|
852
|
-
readonly treeNodes: _angular_core.Signal<primeng_api.TreeNode<IAction>[]>;
|
|
853
|
-
readonly allSelected: _angular_core.Signal<boolean>;
|
|
854
|
-
readonly hasChanges: _angular_core.Signal<boolean>;
|
|
855
|
-
readonly actionsWithUnmetPrerequisites: _angular_core.Signal<Set<string>>;
|
|
856
|
-
readonly invalidActionsCount: _angular_core.Signal<number>;
|
|
857
|
-
readonly pendingAdd: _angular_core.Signal<IAction[]>;
|
|
858
|
-
readonly pendingRemove: _angular_core.Signal<IAction[]>;
|
|
859
|
-
readonly canSave: _angular_core.Signal<boolean>;
|
|
860
414
|
private loadDataAbortController;
|
|
861
415
|
constructor();
|
|
862
|
-
|
|
863
|
-
/**
|
|
864
|
-
* Load companies from API
|
|
865
|
-
*/
|
|
416
|
+
protected getDefaultTooltip(isSelected: boolean): string;
|
|
866
417
|
private loadCompanies;
|
|
867
|
-
/**
|
|
868
|
-
* Load actions and assignments for selected company
|
|
869
|
-
*/
|
|
870
418
|
private loadData;
|
|
871
|
-
/**
|
|
872
|
-
* Check if action has unmet prerequisites
|
|
873
|
-
*/
|
|
874
|
-
hasUnmetPrerequisites(action: IAction): boolean;
|
|
875
|
-
/**
|
|
876
|
-
* Get tooltip for action checkbox
|
|
877
|
-
*/
|
|
878
|
-
getTooltip(action: IAction): string;
|
|
879
|
-
/**
|
|
880
|
-
* Handle action checkbox toggle
|
|
881
|
-
*/
|
|
882
|
-
onActionToggle(action: IAction, newValue: boolean): void;
|
|
883
|
-
/**
|
|
884
|
-
* Toggle all actions
|
|
885
|
-
*/
|
|
886
|
-
toggleAll(): void;
|
|
887
|
-
/**
|
|
888
|
-
* Select all actions
|
|
889
|
-
*/
|
|
890
|
-
selectAll(): void;
|
|
891
|
-
/**
|
|
892
|
-
* Deselect all actions
|
|
893
|
-
*/
|
|
894
|
-
deselectAll(): void;
|
|
895
|
-
/**
|
|
896
|
-
* Save changes to backend
|
|
897
|
-
*/
|
|
898
419
|
saveChanges(): Promise<void>;
|
|
899
|
-
/**
|
|
900
|
-
* Handle backend prerequisite validation errors
|
|
901
|
-
* Shows confirmation dialog with auto-fix option
|
|
902
|
-
*/
|
|
903
420
|
private handleBackendPrerequisiteErrors;
|
|
904
|
-
/**
|
|
905
|
-
* Reset component state
|
|
906
|
-
*/
|
|
907
|
-
private resetState;
|
|
908
421
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<CompanyActionSelectorComponent, never>;
|
|
909
422
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<CompanyActionSelectorComponent, "flusys-company-action-selector", never, {}, {}, never, never, true, never>;
|
|
910
423
|
}
|
|
@@ -930,7 +443,6 @@ declare class CompanyActionSelectorComponent implements OnDestroy {
|
|
|
930
443
|
* - Branch-specific: branchId = selected value
|
|
931
444
|
*
|
|
932
445
|
* **Performance:**
|
|
933
|
-
* - OnPush change detection
|
|
934
446
|
* - Computed signals for reactive updates
|
|
935
447
|
* - Branch filtering on company context change
|
|
936
448
|
*
|
|
@@ -940,12 +452,18 @@ declare class CompanyActionSelectorComponent implements OnDestroy {
|
|
|
940
452
|
* ```
|
|
941
453
|
*/
|
|
942
454
|
declare class UserRoleSelectorComponent {
|
|
455
|
+
readonly USER_ROLE_PERMISSIONS: {
|
|
456
|
+
readonly READ: "user-role.read";
|
|
457
|
+
readonly ASSIGN: "user-role.assign";
|
|
458
|
+
};
|
|
943
459
|
private readonly appConfig;
|
|
944
460
|
private readonly companyContext;
|
|
945
461
|
private readonly userPermissionProvider;
|
|
946
462
|
private readonly roleApi;
|
|
947
463
|
private readonly permissionApi;
|
|
948
464
|
private readonly messageService;
|
|
465
|
+
private readonly translateAdapter;
|
|
466
|
+
private translate;
|
|
949
467
|
readonly selectedUserId: _angular_core.WritableSignal<string | null>;
|
|
950
468
|
readonly selectedBranchId: _angular_core.WritableSignal<string | undefined>;
|
|
951
469
|
readonly branches: _angular_core.WritableSignal<IBranch[]>;
|
|
@@ -993,6 +511,10 @@ declare class UserRoleSelectorComponent {
|
|
|
993
511
|
* Deselect all roles
|
|
994
512
|
*/
|
|
995
513
|
deselectAll(): void;
|
|
514
|
+
/**
|
|
515
|
+
* Set all role selections to a given value
|
|
516
|
+
*/
|
|
517
|
+
private setAllSelections;
|
|
996
518
|
/**
|
|
997
519
|
* Save changes to backend
|
|
998
520
|
*/
|
|
@@ -1005,109 +527,28 @@ declare class UserRoleSelectorComponent {
|
|
|
1005
527
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UserRoleSelectorComponent, "flusys-user-role-selector", never, {}, {}, never, never, true, never>;
|
|
1006
528
|
}
|
|
1007
529
|
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
* **Architecture:**
|
|
1014
|
-
* - Presentation: TreeTable for hierarchical display
|
|
1015
|
-
* - Business Logic: Flat action list for selection/validation
|
|
1016
|
-
* - State: Signals with computed dependencies
|
|
1017
|
-
*
|
|
1018
|
-
* **Core Features:**
|
|
1019
|
-
* - User dropdown with async loading
|
|
1020
|
-
* - Branch selector (if company feature enabled)
|
|
1021
|
-
* - Hierarchical TreeTable with expand/collapse
|
|
1022
|
-
* - Direct user-action permission assignment (bypassing roles)
|
|
1023
|
-
* - Real-time change tracking
|
|
1024
|
-
*
|
|
1025
|
-
* **Granularity:**
|
|
1026
|
-
* - Company-wide: branchId = undefined
|
|
1027
|
-
* - Branch-specific: branchId = selected value
|
|
1028
|
-
*
|
|
1029
|
-
* **Performance:**
|
|
1030
|
-
* - OnPush change detection
|
|
1031
|
-
* - Computed signals for reactive updates
|
|
1032
|
-
* - Branch filtering on company context change
|
|
1033
|
-
*
|
|
1034
|
-
* @example
|
|
1035
|
-
* ```html
|
|
1036
|
-
* <flusys-user-action-selector />
|
|
1037
|
-
* ```
|
|
1038
|
-
*/
|
|
1039
|
-
declare class UserActionSelectorComponent {
|
|
530
|
+
declare class UserActionSelectorComponent extends BaseActionSelectorComponent {
|
|
531
|
+
readonly USER_ACTION_PERMISSIONS: {
|
|
532
|
+
readonly READ: "user-action.read";
|
|
533
|
+
readonly ASSIGN: "user-action.assign";
|
|
534
|
+
};
|
|
1040
535
|
private readonly appConfig;
|
|
1041
536
|
private readonly companyContext;
|
|
1042
537
|
private readonly userPermissionProvider;
|
|
1043
538
|
private readonly actionApi;
|
|
1044
539
|
private readonly permissionApi;
|
|
1045
|
-
private readonly permissionLogic;
|
|
1046
540
|
private readonly messageService;
|
|
1047
541
|
readonly selectedUserId: _angular_core.WritableSignal<string | null>;
|
|
1048
542
|
readonly selectedBranchId: _angular_core.WritableSignal<string | undefined>;
|
|
1049
543
|
readonly branches: _angular_core.WritableSignal<IBranch[]>;
|
|
1050
|
-
readonly
|
|
1051
|
-
readonly saving: _angular_core.WritableSignal<boolean>;
|
|
1052
|
-
private readonly _actions;
|
|
1053
|
-
readonly actions: _angular_core.Signal<IAction[]>;
|
|
1054
|
-
private readonly _actionsTree;
|
|
1055
|
-
private readonly actionsTree;
|
|
1056
|
-
private readonly _selectionMap;
|
|
1057
|
-
readonly selectionMap: _angular_core.Signal<Record<string, boolean>>;
|
|
1058
|
-
private readonly _initialSelection;
|
|
1059
|
-
private readonly initialSelection;
|
|
544
|
+
private readonly isCompanyFeatureActive;
|
|
1060
545
|
readonly showBranchSelector: _angular_core.Signal<boolean>;
|
|
1061
546
|
readonly filteredBranches: _angular_core.Signal<IBranch[]>;
|
|
1062
|
-
readonly treeNodes: _angular_core.Signal<primeng_api.TreeNode<IAction>[]>;
|
|
1063
|
-
readonly allSelected: _angular_core.Signal<boolean>;
|
|
1064
|
-
readonly hasChanges: _angular_core.Signal<boolean>;
|
|
1065
|
-
readonly actionsWithUnmetPrerequisites: _angular_core.Signal<Set<string>>;
|
|
1066
|
-
readonly invalidActionsCount: _angular_core.Signal<number>;
|
|
1067
|
-
readonly pendingAdd: _angular_core.Signal<IAction[]>;
|
|
1068
|
-
readonly pendingRemove: _angular_core.Signal<IAction[]>;
|
|
1069
|
-
readonly canSave: _angular_core.Signal<boolean>;
|
|
1070
547
|
constructor();
|
|
1071
|
-
|
|
1072
|
-
* Load user's permitted branches
|
|
1073
|
-
*/
|
|
548
|
+
protected getDefaultTooltip(isSelected: boolean): string;
|
|
1074
549
|
private loadUserBranches;
|
|
1075
|
-
/**
|
|
1076
|
-
* Load actions and assignments for selected user
|
|
1077
|
-
*/
|
|
1078
550
|
private loadData;
|
|
1079
|
-
/**
|
|
1080
|
-
* Get tooltip for action checkbox
|
|
1081
|
-
*/
|
|
1082
|
-
getTooltip(action: IAction): string;
|
|
1083
|
-
/**
|
|
1084
|
-
* Check if action has unmet prerequisites
|
|
1085
|
-
*/
|
|
1086
|
-
hasUnmetPrerequisites(action: IAction): boolean;
|
|
1087
|
-
/**
|
|
1088
|
-
* Handle action checkbox toggle
|
|
1089
|
-
*/
|
|
1090
|
-
onActionToggle(action: IAction, newValue: boolean): void;
|
|
1091
|
-
/**
|
|
1092
|
-
* Toggle all actions
|
|
1093
|
-
*/
|
|
1094
|
-
toggleAll(): void;
|
|
1095
|
-
/**
|
|
1096
|
-
* Select all actions
|
|
1097
|
-
*/
|
|
1098
|
-
selectAll(): void;
|
|
1099
|
-
/**
|
|
1100
|
-
* Deselect all actions
|
|
1101
|
-
*/
|
|
1102
|
-
deselectAll(): void;
|
|
1103
|
-
/**
|
|
1104
|
-
* Save changes to backend
|
|
1105
|
-
*/
|
|
1106
551
|
saveChanges(): Promise<void>;
|
|
1107
|
-
/**
|
|
1108
|
-
* Reset component state
|
|
1109
|
-
*/
|
|
1110
|
-
private resetState;
|
|
1111
552
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserActionSelectorComponent, never>;
|
|
1112
553
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UserActionSelectorComponent, "flusys-user-action-selector", never, {}, {}, never, never, true, never>;
|
|
1113
554
|
}
|
|
@@ -1136,38 +577,18 @@ declare class ProfilePermissionProviderAdapter implements IProfilePermissionProv
|
|
|
1136
577
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<ProfilePermissionProviderAdapter>;
|
|
1137
578
|
}
|
|
1138
579
|
|
|
1139
|
-
/**
|
|
1140
|
-
* Provide IAM Provider Adapters
|
|
1141
|
-
*
|
|
1142
|
-
* Registers IAM implementations for provider interfaces from ng-shared.
|
|
1143
|
-
* This allows ng-auth profile page to display permissions without direct dependencies.
|
|
1144
|
-
*
|
|
1145
|
-
* @example
|
|
1146
|
-
* // In app.config.ts
|
|
1147
|
-
* import { provideIamProviders } from '@flusys/ng-iam';
|
|
1148
|
-
*
|
|
1149
|
-
* export const appConfig: ApplicationConfig = {
|
|
1150
|
-
* providers: [
|
|
1151
|
-
* ...provideIamProviders(),
|
|
1152
|
-
* // ... other providers
|
|
1153
|
-
* ]
|
|
1154
|
-
* };
|
|
1155
|
-
*
|
|
1156
|
-
* @returns Array of Angular providers
|
|
1157
|
-
*/
|
|
580
|
+
/** Registers IAM provider adapters for ng-shared interfaces */
|
|
1158
581
|
declare function provideIamProviders(): Provider[];
|
|
1159
582
|
|
|
1160
583
|
/**
|
|
1161
584
|
* IAM Routes Configuration
|
|
1162
585
|
*
|
|
1163
|
-
* Identity and Access Management routing
|
|
1164
|
-
* - Actions: Permission actions
|
|
586
|
+
* Identity and Access Management routing with permission guards.
|
|
587
|
+
* - Actions: Permission actions management
|
|
1165
588
|
* - Roles: Role management (conditional on RBAC/FULL mode)
|
|
1166
|
-
* - Permissions: User permission assignments
|
|
1167
|
-
*
|
|
1168
|
-
* All routes are protected by permission guards to prevent direct URL access.
|
|
589
|
+
* - Permissions: User permission assignments
|
|
1169
590
|
*/
|
|
1170
591
|
declare const IAM_ROUTES: Routes;
|
|
1171
592
|
|
|
1172
|
-
export { ActionApiService, ActionPermissionLogicService, ActionType, CompanyActionSelectorComponent, IAM_ROUTES, LogicBuilderComponent, MAX_DROPDOWN_ITEMS, MyPermissionsApiService, PermissionApiService, PermissionStateService, ProfilePermissionProviderAdapter, RoleActionSelectorComponent, RoleApiService, UserActionSelectorComponent, UserRoleSelectorComponent, provideIamProviders };
|
|
1173
|
-
export type { IAction, IActionTreeDto, IAssignCompanyActionsDto, IAssignRoleActionsDto, IAssignUserActionsDto, IAssignUserRolesDto, IBranch, ICompany, ICompanyActionResponseDto, ICreateActionDto, ICreateRoleDto, IGetMyPermissionsDto, IGetRoleActionsDto, IGetUserActionsDto, IGetUserRolesDto,
|
|
593
|
+
export { ActionApiService, ActionPermissionLogicService, ActionType, CompanyActionSelectorComponent, IAM_MESSAGES, IAM_ROUTES, LogicBuilderComponent, MAX_DROPDOWN_ITEMS, MyPermissionsApiService, PermissionApiService, PermissionStateService, ProfilePermissionProviderAdapter, RoleActionSelectorComponent, RoleApiService, UserActionSelectorComponent, UserRoleSelectorComponent, provideIamProviders };
|
|
594
|
+
export type { IAction, IActionTreeDto, IAssignCompanyActionsDto, IAssignRoleActionsDto, IAssignUserActionsDto, IAssignUserRolesDto, IBranch, ICompany, ICompanyActionResponseDto, ICreateActionDto, ICreateRoleDto, IGetMyPermissionsDto, IGetRoleActionsDto, IGetUserActionsDto, IGetUserRolesDto, IMyPermissionsResponseDto, IPermissionItemDto, IPermissionOperationResultDto, IPrerequisiteActionDto, IPrerequisiteValidationError, IRole, IRoleActionResponseDto, IRoleQueryDto, IUpdateActionDto, IUpdateRoleDto, IUser, IUserActionResponseDto, IUserRoleResponseDto, PermissionAction };
|