@masterteam/permissions 0.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.
|
@@ -0,0 +1,971 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, Injectable, input, output, signal, effect, Component, DestroyRef, linkedSignal, computed } from '@angular/core';
|
|
3
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
+
import { CommonModule } from '@angular/common';
|
|
5
|
+
import * as i1 from '@angular/forms';
|
|
6
|
+
import { FormControl, ReactiveFormsModule, FormsModule } from '@angular/forms';
|
|
7
|
+
import { ActivatedRoute, Router } from '@angular/router';
|
|
8
|
+
import { Avatar } from '@masterteam/components/avatar';
|
|
9
|
+
import { Button } from '@masterteam/components/button';
|
|
10
|
+
import { Card } from '@masterteam/components/card';
|
|
11
|
+
import { ModalService } from '@masterteam/components/modal';
|
|
12
|
+
import { ToggleField } from '@masterteam/components/toggle-field';
|
|
13
|
+
import * as i2 from '@jsverse/transloco';
|
|
14
|
+
import { TranslocoModule, TranslocoService } from '@jsverse/transloco';
|
|
15
|
+
import * as i2$1 from 'primeng/skeleton';
|
|
16
|
+
import { SkeletonModule } from 'primeng/skeleton';
|
|
17
|
+
import { Action, Selector, State, Store } from '@ngxs/store';
|
|
18
|
+
import { HttpClient } from '@angular/common/http';
|
|
19
|
+
import { map, tap, catchError, finalize } from 'rxjs';
|
|
20
|
+
import { ModalRef } from '@masterteam/components/dialog';
|
|
21
|
+
import { Tabs } from '@masterteam/components/tabs';
|
|
22
|
+
import { AccessibilitiesFacade } from '@masterteam/accessibilities';
|
|
23
|
+
|
|
24
|
+
var ModuleType;
|
|
25
|
+
(function (ModuleType) {
|
|
26
|
+
ModuleType["LEVEL"] = "level";
|
|
27
|
+
ModuleType["LOG"] = "log";
|
|
28
|
+
ModuleType["LEVELLOG"] = "levelLog";
|
|
29
|
+
})(ModuleType || (ModuleType = {}));
|
|
30
|
+
|
|
31
|
+
class LoadRoles {
|
|
32
|
+
static type = '[Permissions] Load Roles';
|
|
33
|
+
constructor() { }
|
|
34
|
+
}
|
|
35
|
+
class LoadRolesSuccess {
|
|
36
|
+
roles;
|
|
37
|
+
static type = '[Permissions] Load Roles Success';
|
|
38
|
+
constructor(roles) {
|
|
39
|
+
this.roles = roles;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
class LoadRolesFail {
|
|
43
|
+
error;
|
|
44
|
+
static type = '[Permissions] Load Roles Fail';
|
|
45
|
+
constructor(error) {
|
|
46
|
+
this.error = error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
class SelectRole {
|
|
50
|
+
roleValue;
|
|
51
|
+
static type = '[Permissions] Select Role';
|
|
52
|
+
constructor(roleValue) {
|
|
53
|
+
this.roleValue = roleValue;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
class SelectGroup {
|
|
57
|
+
groupId;
|
|
58
|
+
static type = '[Permissions] Select Group';
|
|
59
|
+
constructor(groupId) {
|
|
60
|
+
this.groupId = groupId;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
class LoadPermissions {
|
|
64
|
+
roleValue;
|
|
65
|
+
levelId;
|
|
66
|
+
static type = '[Permissions] Load Permissions';
|
|
67
|
+
constructor(roleValue, levelId) {
|
|
68
|
+
this.roleValue = roleValue;
|
|
69
|
+
this.levelId = levelId;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
class LoadGroupPermissions {
|
|
73
|
+
groupId;
|
|
74
|
+
levelId;
|
|
75
|
+
static type = '[Permissions] Load Group Permissions';
|
|
76
|
+
constructor(groupId, levelId) {
|
|
77
|
+
this.groupId = groupId;
|
|
78
|
+
this.levelId = levelId;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
class LoadPermissionsSuccess {
|
|
82
|
+
permissions;
|
|
83
|
+
static type = '[Permissions] Load Permissions Success';
|
|
84
|
+
constructor(permissions) {
|
|
85
|
+
this.permissions = permissions;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
class LoadGroupPermissionsSuccess {
|
|
89
|
+
permissions;
|
|
90
|
+
static type = '[Permissions] Load Group Permissions Success';
|
|
91
|
+
constructor(permissions) {
|
|
92
|
+
this.permissions = permissions;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
class LoadPermissionsFail {
|
|
96
|
+
error;
|
|
97
|
+
static type = '[Permissions] Load Permissions Fail';
|
|
98
|
+
constructor(error) {
|
|
99
|
+
this.error = error;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
class UpdatePermissionLocally {
|
|
103
|
+
roleValue;
|
|
104
|
+
levelId;
|
|
105
|
+
actionId;
|
|
106
|
+
isSelected;
|
|
107
|
+
static type = '[Permissions] Update Permission Locally';
|
|
108
|
+
constructor(roleValue, levelId, actionId, isSelected) {
|
|
109
|
+
this.roleValue = roleValue;
|
|
110
|
+
this.levelId = levelId;
|
|
111
|
+
this.actionId = actionId;
|
|
112
|
+
this.isSelected = isSelected;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
class UpdateGroupPermissionLocally {
|
|
116
|
+
roleValue;
|
|
117
|
+
levelId;
|
|
118
|
+
actionId;
|
|
119
|
+
isSelected;
|
|
120
|
+
static type = '[Permissions] Update Group Permission Locally';
|
|
121
|
+
constructor(roleValue, levelId, actionId, isSelected) {
|
|
122
|
+
this.roleValue = roleValue;
|
|
123
|
+
this.levelId = levelId;
|
|
124
|
+
this.actionId = actionId;
|
|
125
|
+
this.isSelected = isSelected;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
class UpdatePermission {
|
|
129
|
+
roleValue;
|
|
130
|
+
levelId;
|
|
131
|
+
static type = '[Permissions] Update Permission';
|
|
132
|
+
constructor(roleValue, levelId) {
|
|
133
|
+
this.roleValue = roleValue;
|
|
134
|
+
this.levelId = levelId;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
class UpdateGroupPermission {
|
|
138
|
+
groupId;
|
|
139
|
+
permissionLogs;
|
|
140
|
+
levelId;
|
|
141
|
+
static type = '[Permissions] Update Group Permission';
|
|
142
|
+
constructor(groupId, permissionLogs, levelId) {
|
|
143
|
+
this.groupId = groupId;
|
|
144
|
+
this.permissionLogs = permissionLogs;
|
|
145
|
+
this.levelId = levelId;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
class UpdatePermissionSuccess {
|
|
149
|
+
static type = '[Permissions] Update Permission Success';
|
|
150
|
+
}
|
|
151
|
+
class UpdatePermissionFail {
|
|
152
|
+
error;
|
|
153
|
+
static type = '[Permissions] Update Permission Fail';
|
|
154
|
+
constructor(error) {
|
|
155
|
+
this.error = error;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
class ToggleAllLevelPermissions {
|
|
159
|
+
roleValue;
|
|
160
|
+
levelId;
|
|
161
|
+
levelName;
|
|
162
|
+
enabled;
|
|
163
|
+
static type = '[Permissions] Toggle All Level Permissions';
|
|
164
|
+
constructor(roleValue, levelId, levelName, enabled) {
|
|
165
|
+
this.roleValue = roleValue;
|
|
166
|
+
this.levelId = levelId;
|
|
167
|
+
this.levelName = levelName;
|
|
168
|
+
this.enabled = enabled;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
class ToggleAllGroupPermissions {
|
|
172
|
+
levelId;
|
|
173
|
+
groupId;
|
|
174
|
+
enabled;
|
|
175
|
+
static type = '[Permissions] Toggle All Group Permissions';
|
|
176
|
+
constructor(levelId, groupId, enabled) {
|
|
177
|
+
this.levelId = levelId;
|
|
178
|
+
this.groupId = groupId;
|
|
179
|
+
this.enabled = enabled;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
class SetModuleInfo {
|
|
183
|
+
moduleType;
|
|
184
|
+
moduleId;
|
|
185
|
+
parentModuleType;
|
|
186
|
+
parentModuleId;
|
|
187
|
+
parentPath;
|
|
188
|
+
static type = '[Permissions] Set Module Info';
|
|
189
|
+
constructor(moduleType, moduleId, parentModuleType, parentModuleId, parentPath) {
|
|
190
|
+
this.moduleType = moduleType;
|
|
191
|
+
this.moduleId = moduleId;
|
|
192
|
+
this.parentModuleType = parentModuleType;
|
|
193
|
+
this.parentModuleId = parentModuleId;
|
|
194
|
+
this.parentPath = parentPath;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
class Reset {
|
|
198
|
+
static type = '[Permissions] Reset Module Info';
|
|
199
|
+
constructor() { }
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
203
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
204
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
205
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
206
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
207
|
+
};
|
|
208
|
+
let PermissionsState = class PermissionsState {
|
|
209
|
+
http = inject(HttpClient);
|
|
210
|
+
static roles(state) {
|
|
211
|
+
return state.roles;
|
|
212
|
+
}
|
|
213
|
+
static selectedRoleValue(state) {
|
|
214
|
+
return state.selectedRoleValue;
|
|
215
|
+
}
|
|
216
|
+
static selectedGroupValue(state) {
|
|
217
|
+
return state.selectedGroupValue;
|
|
218
|
+
}
|
|
219
|
+
static permissions(state) {
|
|
220
|
+
return state.permissions;
|
|
221
|
+
}
|
|
222
|
+
static groupPermissions(state) {
|
|
223
|
+
return state.groupPermissions;
|
|
224
|
+
}
|
|
225
|
+
static loading(state) {
|
|
226
|
+
return state.loading;
|
|
227
|
+
}
|
|
228
|
+
static permissionsLoading(state) {
|
|
229
|
+
return state.permissionsLoading;
|
|
230
|
+
}
|
|
231
|
+
static addPermissionsLoading(state) {
|
|
232
|
+
return state.addPermissionsLoading;
|
|
233
|
+
}
|
|
234
|
+
static moduleType(state) {
|
|
235
|
+
return state.moduleType;
|
|
236
|
+
}
|
|
237
|
+
static moduleId(state) {
|
|
238
|
+
return state.moduleId;
|
|
239
|
+
}
|
|
240
|
+
static levelId(state) {
|
|
241
|
+
return state.moduleType === 'module'
|
|
242
|
+
? state.parentModuleId.toString()
|
|
243
|
+
: state.moduleId.toString();
|
|
244
|
+
}
|
|
245
|
+
static error(state) {
|
|
246
|
+
return state.error;
|
|
247
|
+
}
|
|
248
|
+
loadRoles(ctx) {
|
|
249
|
+
ctx.patchState({
|
|
250
|
+
loading: true,
|
|
251
|
+
error: null,
|
|
252
|
+
currentLevelId: ctx.getState().moduleId.toString() || '',
|
|
253
|
+
});
|
|
254
|
+
return this.http
|
|
255
|
+
.get(`identity/roles/scopes/${ctx.getState().moduleType}/${ctx.getState().moduleId}?inherited=true`)
|
|
256
|
+
.pipe(map((response) => response.data), tap((roles) => {
|
|
257
|
+
ctx.dispatch(new LoadRolesSuccess(roles));
|
|
258
|
+
}), catchError((error) => {
|
|
259
|
+
ctx.dispatch(new LoadRolesFail(error.message || 'Failed to load roles'));
|
|
260
|
+
throw error;
|
|
261
|
+
}));
|
|
262
|
+
}
|
|
263
|
+
loadRolesSuccess(ctx, action) {
|
|
264
|
+
ctx.patchState({
|
|
265
|
+
roles: action.roles,
|
|
266
|
+
loading: false,
|
|
267
|
+
error: null,
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
loadRolesFail(ctx, action) {
|
|
271
|
+
ctx.patchState({
|
|
272
|
+
loading: false,
|
|
273
|
+
error: action.error,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
selectRole(ctx, action) {
|
|
277
|
+
const state = ctx.getState();
|
|
278
|
+
ctx.patchState({ selectedRoleValue: action.roleValue });
|
|
279
|
+
if (state.currentLevelId) {
|
|
280
|
+
ctx.dispatch(new LoadPermissions(action.roleValue, state.currentLevelId));
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
selectGroup(ctx, action) {
|
|
284
|
+
const state = ctx.getState();
|
|
285
|
+
ctx.patchState({ selectedGroupValue: action.groupId });
|
|
286
|
+
if (state.currentLevelId) {
|
|
287
|
+
ctx.dispatch(new LoadGroupPermissions(action.groupId, state.currentLevelId));
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
loadPermissions(ctx, action) {
|
|
291
|
+
ctx.patchState({ permissionsLoading: true, error: null });
|
|
292
|
+
// identity/roles/${action.roleValue}/permissions
|
|
293
|
+
return this.http
|
|
294
|
+
.get(`identity/roles/level/${ctx.getState().moduleType === 'module'
|
|
295
|
+
? ctx.getState().parentModuleId
|
|
296
|
+
: ctx.getState().moduleId}/${ctx.getState().moduleType === 'module' ? 'module/' : ''}${ctx.getState().moduleType === 'module'
|
|
297
|
+
? `${ctx.getState().moduleId}/`
|
|
298
|
+
: ''}${action.roleValue}/permissions`, {
|
|
299
|
+
params: {
|
|
300
|
+
scopeId: ctx.getState().moduleType === 'module'
|
|
301
|
+
? ctx.getState().parentModuleId
|
|
302
|
+
: ctx.getState().moduleId,
|
|
303
|
+
scopeType: ModuleType.LEVEL,
|
|
304
|
+
},
|
|
305
|
+
})
|
|
306
|
+
.pipe(map((response) => response.data.permissions), tap((permissions) => {
|
|
307
|
+
ctx.dispatch(new LoadPermissionsSuccess(permissions));
|
|
308
|
+
}), catchError((error) => {
|
|
309
|
+
ctx.dispatch(new LoadPermissionsFail(error.message || 'Failed to load permissions'));
|
|
310
|
+
throw error;
|
|
311
|
+
}));
|
|
312
|
+
}
|
|
313
|
+
loadGroupPermissions(ctx, action) {
|
|
314
|
+
ctx.patchState({ permissionsLoading: true, error: null });
|
|
315
|
+
return this.http
|
|
316
|
+
.get(`identity/groups/level/${ctx.getState().moduleType === 'module'
|
|
317
|
+
? ctx.getState().parentModuleId
|
|
318
|
+
: ctx.getState().moduleId}/${ctx.getState().moduleType === 'module' ? 'module/' : ''}${ctx.getState().moduleType === 'module'
|
|
319
|
+
? `${ctx.getState().moduleId}/`
|
|
320
|
+
: ''}${action.groupId}/permissions`)
|
|
321
|
+
.pipe(map((response) => response.data), tap((permissions) => {
|
|
322
|
+
ctx.dispatch(new LoadGroupPermissionsSuccess(permissions));
|
|
323
|
+
}), catchError((error) => {
|
|
324
|
+
ctx.dispatch(new LoadPermissionsFail(error.message || 'Failed to load permissions'));
|
|
325
|
+
throw error;
|
|
326
|
+
}));
|
|
327
|
+
}
|
|
328
|
+
loadPermissionsSuccess(ctx, action) {
|
|
329
|
+
ctx.patchState({
|
|
330
|
+
permissions: action.permissions,
|
|
331
|
+
permissionsLoading: false,
|
|
332
|
+
error: null,
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
loadGroupPermissionsSuccess(ctx, action) {
|
|
336
|
+
ctx.patchState({
|
|
337
|
+
groupPermissions: action.permissions,
|
|
338
|
+
permissionsLoading: false,
|
|
339
|
+
error: null,
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
loadPermissionsFail(ctx, action) {
|
|
343
|
+
ctx.patchState({
|
|
344
|
+
permissionsLoading: false,
|
|
345
|
+
error: action.error,
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
updatePermissionLocally(ctx, action) {
|
|
349
|
+
const state = ctx.getState();
|
|
350
|
+
const updatedPermissions = state.permissions.map((log) => ({
|
|
351
|
+
...log,
|
|
352
|
+
actions: log.actions.map((act) => act.id === action.actionId
|
|
353
|
+
? { ...act, isSelected: action.isSelected }
|
|
354
|
+
: act),
|
|
355
|
+
}));
|
|
356
|
+
ctx.patchState({ permissions: updatedPermissions });
|
|
357
|
+
}
|
|
358
|
+
updateGroupPermissionLocally(ctx, action) {
|
|
359
|
+
const state = ctx.getState();
|
|
360
|
+
const updatedPermissions = state.groupPermissions.map((permission) => ({
|
|
361
|
+
...permission,
|
|
362
|
+
logs: permission.logs.map((log) => ({
|
|
363
|
+
...log,
|
|
364
|
+
actions: log.actions.map((act) => act.id === action.actionId
|
|
365
|
+
? { ...act, isSelected: action.isSelected }
|
|
366
|
+
: act),
|
|
367
|
+
})),
|
|
368
|
+
}));
|
|
369
|
+
ctx.patchState({ groupPermissions: updatedPermissions });
|
|
370
|
+
}
|
|
371
|
+
updatePermission(ctx, action) {
|
|
372
|
+
const state = ctx.getState();
|
|
373
|
+
ctx.patchState({ addPermissionsLoading: true, error: null });
|
|
374
|
+
const updatedPermissions = state.permissions;
|
|
375
|
+
ctx.patchState({ permissions: updatedPermissions });
|
|
376
|
+
return this.http
|
|
377
|
+
.put(`identity/roles/${action.roleValue}/setAllPermissions`, { permissions: updatedPermissions }, {
|
|
378
|
+
params: {
|
|
379
|
+
scopeId: ctx.getState().moduleType === 'module'
|
|
380
|
+
? ctx.getState().parentModuleId
|
|
381
|
+
: ctx.getState().moduleId,
|
|
382
|
+
scopeType: ModuleType.LEVEL,
|
|
383
|
+
},
|
|
384
|
+
})
|
|
385
|
+
.pipe(tap(() => {
|
|
386
|
+
ctx.dispatch(new UpdatePermissionSuccess());
|
|
387
|
+
}), finalize(() => {
|
|
388
|
+
ctx.patchState({ addPermissionsLoading: false });
|
|
389
|
+
}), catchError((error) => {
|
|
390
|
+
// Rollback on error
|
|
391
|
+
ctx.patchState({
|
|
392
|
+
permissions: state.permissions,
|
|
393
|
+
addPermissionsLoading: false,
|
|
394
|
+
});
|
|
395
|
+
ctx.dispatch(new UpdatePermissionFail(error.message || 'Failed to update permission'));
|
|
396
|
+
throw error;
|
|
397
|
+
}));
|
|
398
|
+
}
|
|
399
|
+
updateGroupPermission(ctx, action) {
|
|
400
|
+
const state = ctx.getState();
|
|
401
|
+
ctx.patchState({ addPermissionsLoading: true, error: null });
|
|
402
|
+
const updatedPermissions = state.groupPermissions;
|
|
403
|
+
ctx.patchState({ groupPermissions: updatedPermissions });
|
|
404
|
+
return this.http
|
|
405
|
+
.put(`identity/groups/${action.groupId}/setAllPermissions`, { permissions: updatedPermissions[0].logs || [] })
|
|
406
|
+
.pipe(tap(() => {
|
|
407
|
+
ctx.dispatch(new UpdatePermissionSuccess());
|
|
408
|
+
}), finalize(() => {
|
|
409
|
+
ctx.patchState({ addPermissionsLoading: false });
|
|
410
|
+
}), catchError((error) => {
|
|
411
|
+
// Rollback on error
|
|
412
|
+
ctx.patchState({
|
|
413
|
+
groupPermissions: state.groupPermissions,
|
|
414
|
+
addPermissionsLoading: false,
|
|
415
|
+
});
|
|
416
|
+
ctx.dispatch(new UpdatePermissionFail(error.message || 'Failed to update permission'));
|
|
417
|
+
throw error;
|
|
418
|
+
}));
|
|
419
|
+
}
|
|
420
|
+
toggleAllLevelPermissions(ctx, action) {
|
|
421
|
+
const state = ctx.getState();
|
|
422
|
+
const updatedPermissions = state.permissions.map((log) => ({
|
|
423
|
+
...log,
|
|
424
|
+
actions: log.actions.map((act) => ({
|
|
425
|
+
...act,
|
|
426
|
+
isSelected: action.enabled,
|
|
427
|
+
})),
|
|
428
|
+
}));
|
|
429
|
+
ctx.patchState({ permissions: updatedPermissions });
|
|
430
|
+
return this.http
|
|
431
|
+
.put(`identity/roles/${action.roleValue}/setAllPermissions`, { permissions: updatedPermissions }, {
|
|
432
|
+
params: {
|
|
433
|
+
scopeId: ctx.getState().moduleType === 'module'
|
|
434
|
+
? ctx.getState().parentModuleId
|
|
435
|
+
: ctx.getState().moduleId,
|
|
436
|
+
scopeType: ModuleType.LEVEL,
|
|
437
|
+
},
|
|
438
|
+
})
|
|
439
|
+
.pipe(tap(() => {
|
|
440
|
+
ctx.dispatch(new UpdatePermissionSuccess());
|
|
441
|
+
}), catchError((error) => {
|
|
442
|
+
ctx.patchState({ permissions: state.permissions });
|
|
443
|
+
ctx.dispatch(new UpdatePermissionFail(error.message || 'Failed to toggle all permissions'));
|
|
444
|
+
throw error;
|
|
445
|
+
}));
|
|
446
|
+
}
|
|
447
|
+
toggleAllGroupPermissions(ctx, action) {
|
|
448
|
+
const state = ctx.getState();
|
|
449
|
+
const updatedPermissions = state.groupPermissions.map((permission) => ({
|
|
450
|
+
...permission,
|
|
451
|
+
logs: permission.logs.map((log) => ({
|
|
452
|
+
...log,
|
|
453
|
+
actions: log.actions.map((act) => ({
|
|
454
|
+
...act,
|
|
455
|
+
isSelected: action.enabled,
|
|
456
|
+
})),
|
|
457
|
+
})),
|
|
458
|
+
}));
|
|
459
|
+
ctx.patchState({ groupPermissions: updatedPermissions });
|
|
460
|
+
return this.http
|
|
461
|
+
.put(`identity/groups/${action.groupId}/setAllPermissions`, { permissions: updatedPermissions[0].logs || [] })
|
|
462
|
+
.pipe(tap(() => {
|
|
463
|
+
ctx.dispatch(new UpdatePermissionSuccess());
|
|
464
|
+
}), catchError((error) => {
|
|
465
|
+
ctx.patchState({ groupPermissions: state.groupPermissions });
|
|
466
|
+
ctx.dispatch(new UpdatePermissionFail(error.message || 'Failed to toggle all permissions'));
|
|
467
|
+
throw error;
|
|
468
|
+
}));
|
|
469
|
+
}
|
|
470
|
+
setModuleInfo(ctx, action) {
|
|
471
|
+
let parentPath = '';
|
|
472
|
+
if (action.parentModuleType && action.parentModuleId) {
|
|
473
|
+
parentPath = `/${action.parentModuleType}/${action.parentModuleId}`;
|
|
474
|
+
}
|
|
475
|
+
else if (action.parentPath) {
|
|
476
|
+
parentPath = action.parentPath;
|
|
477
|
+
}
|
|
478
|
+
ctx.patchState({
|
|
479
|
+
moduleType: action.moduleType,
|
|
480
|
+
moduleId: action.moduleId,
|
|
481
|
+
parentModuleType: action.parentModuleType ?? null,
|
|
482
|
+
parentModuleId: action.parentModuleId ?? null,
|
|
483
|
+
parentPath: parentPath ?? '',
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
reset(ctx) {
|
|
487
|
+
ctx.patchState({
|
|
488
|
+
moduleType: '',
|
|
489
|
+
moduleId: '',
|
|
490
|
+
parentModuleType: null,
|
|
491
|
+
parentModuleId: null,
|
|
492
|
+
parentPath: '',
|
|
493
|
+
roles: [],
|
|
494
|
+
selectedRoleValue: null,
|
|
495
|
+
selectedGroupValue: null,
|
|
496
|
+
permissions: [],
|
|
497
|
+
groupPermissions: [],
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: PermissionsState, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
501
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: PermissionsState });
|
|
502
|
+
};
|
|
503
|
+
__decorate([
|
|
504
|
+
Action(LoadRoles)
|
|
505
|
+
], PermissionsState.prototype, "loadRoles", null);
|
|
506
|
+
__decorate([
|
|
507
|
+
Action(LoadRolesSuccess)
|
|
508
|
+
], PermissionsState.prototype, "loadRolesSuccess", null);
|
|
509
|
+
__decorate([
|
|
510
|
+
Action(LoadRolesFail)
|
|
511
|
+
], PermissionsState.prototype, "loadRolesFail", null);
|
|
512
|
+
__decorate([
|
|
513
|
+
Action(SelectRole)
|
|
514
|
+
], PermissionsState.prototype, "selectRole", null);
|
|
515
|
+
__decorate([
|
|
516
|
+
Action(SelectGroup)
|
|
517
|
+
], PermissionsState.prototype, "selectGroup", null);
|
|
518
|
+
__decorate([
|
|
519
|
+
Action(LoadPermissions)
|
|
520
|
+
], PermissionsState.prototype, "loadPermissions", null);
|
|
521
|
+
__decorate([
|
|
522
|
+
Action(LoadGroupPermissions)
|
|
523
|
+
], PermissionsState.prototype, "loadGroupPermissions", null);
|
|
524
|
+
__decorate([
|
|
525
|
+
Action(LoadPermissionsSuccess)
|
|
526
|
+
], PermissionsState.prototype, "loadPermissionsSuccess", null);
|
|
527
|
+
__decorate([
|
|
528
|
+
Action(LoadGroupPermissionsSuccess)
|
|
529
|
+
], PermissionsState.prototype, "loadGroupPermissionsSuccess", null);
|
|
530
|
+
__decorate([
|
|
531
|
+
Action(LoadPermissionsFail)
|
|
532
|
+
], PermissionsState.prototype, "loadPermissionsFail", null);
|
|
533
|
+
__decorate([
|
|
534
|
+
Action(UpdatePermissionLocally)
|
|
535
|
+
], PermissionsState.prototype, "updatePermissionLocally", null);
|
|
536
|
+
__decorate([
|
|
537
|
+
Action(UpdateGroupPermissionLocally)
|
|
538
|
+
], PermissionsState.prototype, "updateGroupPermissionLocally", null);
|
|
539
|
+
__decorate([
|
|
540
|
+
Action(UpdatePermission)
|
|
541
|
+
], PermissionsState.prototype, "updatePermission", null);
|
|
542
|
+
__decorate([
|
|
543
|
+
Action(UpdateGroupPermission)
|
|
544
|
+
], PermissionsState.prototype, "updateGroupPermission", null);
|
|
545
|
+
__decorate([
|
|
546
|
+
Action(ToggleAllLevelPermissions)
|
|
547
|
+
], PermissionsState.prototype, "toggleAllLevelPermissions", null);
|
|
548
|
+
__decorate([
|
|
549
|
+
Action(ToggleAllGroupPermissions)
|
|
550
|
+
], PermissionsState.prototype, "toggleAllGroupPermissions", null);
|
|
551
|
+
__decorate([
|
|
552
|
+
Action(SetModuleInfo)
|
|
553
|
+
], PermissionsState.prototype, "setModuleInfo", null);
|
|
554
|
+
__decorate([
|
|
555
|
+
Action(Reset)
|
|
556
|
+
], PermissionsState.prototype, "reset", null);
|
|
557
|
+
__decorate([
|
|
558
|
+
Selector()
|
|
559
|
+
], PermissionsState, "roles", null);
|
|
560
|
+
__decorate([
|
|
561
|
+
Selector()
|
|
562
|
+
], PermissionsState, "selectedRoleValue", null);
|
|
563
|
+
__decorate([
|
|
564
|
+
Selector()
|
|
565
|
+
], PermissionsState, "selectedGroupValue", null);
|
|
566
|
+
__decorate([
|
|
567
|
+
Selector()
|
|
568
|
+
], PermissionsState, "permissions", null);
|
|
569
|
+
__decorate([
|
|
570
|
+
Selector()
|
|
571
|
+
], PermissionsState, "groupPermissions", null);
|
|
572
|
+
__decorate([
|
|
573
|
+
Selector()
|
|
574
|
+
], PermissionsState, "loading", null);
|
|
575
|
+
__decorate([
|
|
576
|
+
Selector()
|
|
577
|
+
], PermissionsState, "permissionsLoading", null);
|
|
578
|
+
__decorate([
|
|
579
|
+
Selector()
|
|
580
|
+
], PermissionsState, "addPermissionsLoading", null);
|
|
581
|
+
__decorate([
|
|
582
|
+
Selector()
|
|
583
|
+
], PermissionsState, "moduleType", null);
|
|
584
|
+
__decorate([
|
|
585
|
+
Selector()
|
|
586
|
+
], PermissionsState, "moduleId", null);
|
|
587
|
+
__decorate([
|
|
588
|
+
Selector()
|
|
589
|
+
], PermissionsState, "levelId", null);
|
|
590
|
+
__decorate([
|
|
591
|
+
Selector()
|
|
592
|
+
], PermissionsState, "error", null);
|
|
593
|
+
PermissionsState = __decorate([
|
|
594
|
+
State({
|
|
595
|
+
name: 'permissions',
|
|
596
|
+
defaults: {
|
|
597
|
+
roles: [],
|
|
598
|
+
selectedRoleValue: null,
|
|
599
|
+
selectedGroupValue: null,
|
|
600
|
+
permissions: [],
|
|
601
|
+
groupPermissions: [],
|
|
602
|
+
currentLevelId: null,
|
|
603
|
+
loading: false,
|
|
604
|
+
permissionsLoading: false,
|
|
605
|
+
addPermissionsLoading: false,
|
|
606
|
+
error: null,
|
|
607
|
+
moduleType: '',
|
|
608
|
+
moduleId: '',
|
|
609
|
+
parentModuleType: '',
|
|
610
|
+
parentModuleId: '',
|
|
611
|
+
parentPath: '',
|
|
612
|
+
},
|
|
613
|
+
})
|
|
614
|
+
], PermissionsState);
|
|
615
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: PermissionsState, decorators: [{
|
|
616
|
+
type: Injectable
|
|
617
|
+
}], propDecorators: { loadRoles: [], loadRolesSuccess: [], loadRolesFail: [], selectRole: [], selectGroup: [], loadPermissions: [], loadGroupPermissions: [], loadPermissionsSuccess: [], loadGroupPermissionsSuccess: [], loadPermissionsFail: [], updatePermissionLocally: [], updateGroupPermissionLocally: [], updatePermission: [], updateGroupPermission: [], toggleAllLevelPermissions: [], toggleAllGroupPermissions: [], setModuleInfo: [], reset: [] } });
|
|
618
|
+
|
|
619
|
+
class PermissionsFacade {
|
|
620
|
+
store = inject(Store);
|
|
621
|
+
selectors = {
|
|
622
|
+
roles: this.store.selectSignal(PermissionsState.roles),
|
|
623
|
+
selectedRoleValue: this.store.selectSignal(PermissionsState.selectedRoleValue),
|
|
624
|
+
selectedGroupValue: this.store.selectSignal(PermissionsState.selectedGroupValue),
|
|
625
|
+
permissions: this.store.selectSignal(PermissionsState.permissions),
|
|
626
|
+
groupPermissions: this.store.selectSignal(PermissionsState.groupPermissions),
|
|
627
|
+
loading: this.store.selectSignal(PermissionsState.loading),
|
|
628
|
+
permissionsLoading: this.store.selectSignal(PermissionsState.permissionsLoading),
|
|
629
|
+
addPermissionsLoading: this.store.selectSignal(PermissionsState.addPermissionsLoading),
|
|
630
|
+
error: this.store.selectSignal(PermissionsState.error),
|
|
631
|
+
levelId: this.store.selectSignal(PermissionsState.levelId),
|
|
632
|
+
};
|
|
633
|
+
loadRoles() {
|
|
634
|
+
return this.store.dispatch(new LoadRoles());
|
|
635
|
+
}
|
|
636
|
+
selectRole(roleValue) {
|
|
637
|
+
if (roleValue) {
|
|
638
|
+
return this.store.dispatch(new SelectRole(roleValue));
|
|
639
|
+
}
|
|
640
|
+
return;
|
|
641
|
+
}
|
|
642
|
+
selectGroup(groupId) {
|
|
643
|
+
if (groupId) {
|
|
644
|
+
return this.store.dispatch(new SelectGroup(groupId));
|
|
645
|
+
}
|
|
646
|
+
return;
|
|
647
|
+
}
|
|
648
|
+
loadPermissions(roleValue, levelId) {
|
|
649
|
+
return this.store.dispatch(new LoadPermissions(roleValue, levelId));
|
|
650
|
+
}
|
|
651
|
+
loadGroupPermissions(groupId, levelId) {
|
|
652
|
+
return this.store.dispatch(new LoadGroupPermissions(groupId, levelId));
|
|
653
|
+
}
|
|
654
|
+
updatePermissionLocally(roleValue, levelId, actionId, isSelected) {
|
|
655
|
+
return this.store.dispatch(new UpdatePermissionLocally(roleValue, levelId, actionId, isSelected));
|
|
656
|
+
}
|
|
657
|
+
updateGroupPermissionLocally(roleValue, levelId, actionId, isSelected) {
|
|
658
|
+
return this.store.dispatch(new UpdateGroupPermissionLocally(roleValue, levelId, actionId, isSelected));
|
|
659
|
+
}
|
|
660
|
+
updatePermission(roleValue, levelId) {
|
|
661
|
+
return this.store.dispatch(new UpdatePermission(roleValue, levelId));
|
|
662
|
+
}
|
|
663
|
+
updateGroupPermission(groupId, permissionLogs, levelId) {
|
|
664
|
+
return this.store.dispatch(new UpdateGroupPermission(groupId, permissionLogs, levelId));
|
|
665
|
+
}
|
|
666
|
+
toggleAllLevelPermissions(roleValue, levelId, levelName, enabled) {
|
|
667
|
+
return this.store.dispatch(new ToggleAllLevelPermissions(roleValue, levelId, levelName, enabled));
|
|
668
|
+
}
|
|
669
|
+
toggleAllGroupPermissions(levelId, groupId, enabled) {
|
|
670
|
+
return this.store.dispatch(new ToggleAllGroupPermissions(levelId, groupId, enabled));
|
|
671
|
+
}
|
|
672
|
+
setModuleInfo(moduleType, moduleId, parentModuleType, parentModuleId, parentPath) {
|
|
673
|
+
return this.store.dispatch(new SetModuleInfo(moduleType, moduleId, parentModuleType, parentModuleId, parentPath));
|
|
674
|
+
}
|
|
675
|
+
reset() {
|
|
676
|
+
return this.store.dispatch(new Reset());
|
|
677
|
+
}
|
|
678
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: PermissionsFacade, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
679
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: PermissionsFacade, providedIn: 'root' });
|
|
680
|
+
}
|
|
681
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: PermissionsFacade, decorators: [{
|
|
682
|
+
type: Injectable,
|
|
683
|
+
args: [{ providedIn: 'root' }]
|
|
684
|
+
}] });
|
|
685
|
+
|
|
686
|
+
class PermissionsEditDialog {
|
|
687
|
+
permissionsFacade = inject(PermissionsFacade);
|
|
688
|
+
modal = inject(ModalService);
|
|
689
|
+
ref = inject(ModalRef);
|
|
690
|
+
// permissionGroup = input.required<PermissionLog | null>();
|
|
691
|
+
permissionGroup = input(null, ...(ngDevMode ? [{ debugName: "permissionGroup" }] : []));
|
|
692
|
+
addPermissionsLoading = this.permissionsFacade.selectors.addPermissionsLoading;
|
|
693
|
+
addPermissionsError = this.permissionsFacade.selectors.error;
|
|
694
|
+
levelId = input.required(...(ngDevMode ? [{ debugName: "levelId" }] : []));
|
|
695
|
+
roleValue = input.required(...(ngDevMode ? [{ debugName: "roleValue" }] : []));
|
|
696
|
+
isGroup = input.required(...(ngDevMode ? [{ debugName: "isGroup" }] : []));
|
|
697
|
+
closeDialog = output();
|
|
698
|
+
actionControls = signal(new Map(), ...(ngDevMode ? [{ debugName: "actionControls" }] : []));
|
|
699
|
+
toggleAll = signal(false, ...(ngDevMode ? [{ debugName: "toggleAll" }] : []));
|
|
700
|
+
constructor() {
|
|
701
|
+
effect(() => {
|
|
702
|
+
const group = this.permissionGroup();
|
|
703
|
+
if (group) {
|
|
704
|
+
const controls = new Map();
|
|
705
|
+
group.actions.forEach((action) => {
|
|
706
|
+
const control = new FormControl(action.isSelected);
|
|
707
|
+
control.valueChanges.subscribe((value) => {
|
|
708
|
+
if (value !== null) {
|
|
709
|
+
this.onPermissionToggle(action.id, value);
|
|
710
|
+
}
|
|
711
|
+
});
|
|
712
|
+
controls.set(action.id, control);
|
|
713
|
+
});
|
|
714
|
+
this.actionControls.set(controls);
|
|
715
|
+
this.toggleAll.set(group.actions.every((action) => action.isSelected));
|
|
716
|
+
}
|
|
717
|
+
});
|
|
718
|
+
}
|
|
719
|
+
onPermissionToggle(actionId, isSelected) {
|
|
720
|
+
const levelId = this.levelId();
|
|
721
|
+
const roleValue = this.roleValue();
|
|
722
|
+
if (levelId && roleValue) {
|
|
723
|
+
if (this.isGroup()) {
|
|
724
|
+
this.permissionsFacade.updateGroupPermissionLocally(roleValue, levelId, actionId, isSelected);
|
|
725
|
+
return;
|
|
726
|
+
}
|
|
727
|
+
this.permissionsFacade.updatePermissionLocally(roleValue, levelId, actionId, isSelected);
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
onClose() {
|
|
731
|
+
// this.closeDialog.emit();
|
|
732
|
+
this.ref.close();
|
|
733
|
+
}
|
|
734
|
+
trackByActionId(_index, action) {
|
|
735
|
+
return action.id;
|
|
736
|
+
}
|
|
737
|
+
getControl(actionId) {
|
|
738
|
+
return this.actionControls().get(actionId) || new FormControl(false);
|
|
739
|
+
}
|
|
740
|
+
onSave() {
|
|
741
|
+
const levelId = this.levelId();
|
|
742
|
+
const roleValue = this.roleValue();
|
|
743
|
+
const isGroup = this.isGroup();
|
|
744
|
+
if (levelId && roleValue) {
|
|
745
|
+
let subscription;
|
|
746
|
+
if (isGroup) {
|
|
747
|
+
subscription = this.permissionsFacade.updateGroupPermission(roleValue, [this.permissionGroup()], levelId);
|
|
748
|
+
}
|
|
749
|
+
else {
|
|
750
|
+
subscription = this.permissionsFacade.updatePermission(roleValue, levelId);
|
|
751
|
+
}
|
|
752
|
+
subscription.subscribe({
|
|
753
|
+
next: () => {
|
|
754
|
+
this.onClose();
|
|
755
|
+
},
|
|
756
|
+
error: (error) => {
|
|
757
|
+
console.error('Failed to save accessibility permissions:', error);
|
|
758
|
+
},
|
|
759
|
+
});
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
selectAll() {
|
|
763
|
+
const group = this.permissionGroup();
|
|
764
|
+
const actions = group?.actions || [];
|
|
765
|
+
for (let i = 0; i < actions?.length; i++) {
|
|
766
|
+
const control = this.actionControls().get(actions[i].id);
|
|
767
|
+
control?.setValue(this.toggleAll());
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: PermissionsEditDialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
771
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: PermissionsEditDialog, isStandalone: true, selector: "mt-permissions-edit-dialog", inputs: { permissionGroup: { classPropertyName: "permissionGroup", publicName: "permissionGroup", isSignal: true, isRequired: false, transformFunction: null }, levelId: { classPropertyName: "levelId", publicName: "levelId", isSignal: true, isRequired: true, transformFunction: null }, roleValue: { classPropertyName: "roleValue", publicName: "roleValue", isSignal: true, isRequired: true, transformFunction: null }, isGroup: { classPropertyName: "isGroup", publicName: "isGroup", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { closeDialog: "closeDialog" }, ngImport: i0, template: "<div [class]=\"'flex flex-col gap-3 p-4 ' + modal.contentClass\">\r\n @if (permissionGroup(); as group) {\r\n <div\r\n class=\"flex items-center justify-between border rounded-lg p-3 border-surface mb-4\"\r\n >\r\n <span class=\"text-sm font-medium\">{{\r\n \"permissions.selectAll\" | transloco\r\n }}</span>\r\n <mt-toggle-field\r\n [(ngModel)]=\"toggleAll\"\r\n (onChange)=\"selectAll()\"\r\n ></mt-toggle-field>\r\n </div>\r\n @for (action of group.actions; track trackByActionId($index, action)) {\r\n <div\r\n class=\"flex items-center justify-between border rounded-lg p-3 border-surface\"\r\n >\r\n <span class=\"text-sm font-medium\">{{ action.name }}</span>\r\n <mt-toggle-field\r\n [formControl]=\"getControl(action.id)\"\r\n ></mt-toggle-field>\r\n </div>\r\n }\r\n }\r\n</div>\r\n<div [class]=\"modal.footerClass\">\r\n <mt-button\r\n [label]=\"'save'\"\r\n (click)=\"onSave()\"\r\n [loading]=\"addPermissionsLoading()\"\r\n />\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: ToggleField, selector: "mt-toggle-field", inputs: ["label", "labelPosition", "placeholder", "readonly", "pInputs", "required", "toggleShape", "size", "icon", "descriptionCard"], outputs: ["onChange"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "pipe", type: i2.TranslocoPipe, name: "transloco" }] });
|
|
772
|
+
}
|
|
773
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: PermissionsEditDialog, decorators: [{
|
|
774
|
+
type: Component,
|
|
775
|
+
args: [{ selector: 'mt-permissions-edit-dialog', standalone: true, imports: [
|
|
776
|
+
CommonModule,
|
|
777
|
+
ReactiveFormsModule,
|
|
778
|
+
ToggleField,
|
|
779
|
+
TranslocoModule,
|
|
780
|
+
FormsModule,
|
|
781
|
+
Button,
|
|
782
|
+
], template: "<div [class]=\"'flex flex-col gap-3 p-4 ' + modal.contentClass\">\r\n @if (permissionGroup(); as group) {\r\n <div\r\n class=\"flex items-center justify-between border rounded-lg p-3 border-surface mb-4\"\r\n >\r\n <span class=\"text-sm font-medium\">{{\r\n \"permissions.selectAll\" | transloco\r\n }}</span>\r\n <mt-toggle-field\r\n [(ngModel)]=\"toggleAll\"\r\n (onChange)=\"selectAll()\"\r\n ></mt-toggle-field>\r\n </div>\r\n @for (action of group.actions; track trackByActionId($index, action)) {\r\n <div\r\n class=\"flex items-center justify-between border rounded-lg p-3 border-surface\"\r\n >\r\n <span class=\"text-sm font-medium\">{{ action.name }}</span>\r\n <mt-toggle-field\r\n [formControl]=\"getControl(action.id)\"\r\n ></mt-toggle-field>\r\n </div>\r\n }\r\n }\r\n</div>\r\n<div [class]=\"modal.footerClass\">\r\n <mt-button\r\n [label]=\"'save'\"\r\n (click)=\"onSave()\"\r\n [loading]=\"addPermissionsLoading()\"\r\n />\r\n</div>\r\n" }]
|
|
783
|
+
}], ctorParameters: () => [], propDecorators: { permissionGroup: [{ type: i0.Input, args: [{ isSignal: true, alias: "permissionGroup", required: false }] }], levelId: [{ type: i0.Input, args: [{ isSignal: true, alias: "levelId", required: true }] }], roleValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "roleValue", required: true }] }], isGroup: [{ type: i0.Input, args: [{ isSignal: true, alias: "isGroup", required: true }] }], closeDialog: [{ type: i0.Output, args: ["closeDialog"] }] } });
|
|
784
|
+
|
|
785
|
+
class PermissionsPage {
|
|
786
|
+
permissionsFacade = inject(PermissionsFacade);
|
|
787
|
+
accessibilitiesFacade = inject(AccessibilitiesFacade);
|
|
788
|
+
route = inject(ActivatedRoute);
|
|
789
|
+
router = inject(Router);
|
|
790
|
+
translocoService = inject(TranslocoService);
|
|
791
|
+
modal = inject(ModalService);
|
|
792
|
+
destroyRef = inject(DestroyRef);
|
|
793
|
+
defaultLevelName = 'Project';
|
|
794
|
+
levelRoles = this.permissionsFacade.selectors.roles;
|
|
795
|
+
selectedRoleValue = this.permissionsFacade.selectors.selectedRoleValue;
|
|
796
|
+
selectedRole = linkedSignal(this.selectedRoleValue, ...(ngDevMode ? [{ debugName: "selectedRole" }] : []));
|
|
797
|
+
selectedGroupValue = this.permissionsFacade.selectors.selectedGroupValue;
|
|
798
|
+
selectedGroup = linkedSignal(this.selectedGroupValue, ...(ngDevMode ? [{ debugName: "selectedGroup" }] : []));
|
|
799
|
+
permissions = this.permissionsFacade.selectors.permissions;
|
|
800
|
+
groupPermissions = this.permissionsFacade.selectors.groupPermissions;
|
|
801
|
+
loading = this.permissionsFacade.selectors.loading;
|
|
802
|
+
permissionsLoading = this.permissionsFacade.selectors.permissionsLoading;
|
|
803
|
+
levelId = this.permissionsFacade.selectors.levelId;
|
|
804
|
+
groups = this.accessibilitiesFacade.groups;
|
|
805
|
+
allPermissionsToggle = new FormControl(false);
|
|
806
|
+
groupOrRoleId = computed(() => {
|
|
807
|
+
const idParam = this.route.snapshot.firstChild?.paramMap.get('id');
|
|
808
|
+
return idParam ? idParam : '';
|
|
809
|
+
}, ...(ngDevMode ? [{ debugName: "groupOrRoleId" }] : []));
|
|
810
|
+
selectedTabFromParams = computed(() => {
|
|
811
|
+
const idParam = this.route.snapshot.firstChild?.data['selectedTab'];
|
|
812
|
+
return idParam ? idParam : 'roles';
|
|
813
|
+
}, ...(ngDevMode ? [{ debugName: "selectedTabFromParams" }] : []));
|
|
814
|
+
selectedTab = linkedSignal(this.selectedTabFromParams, ...(ngDevMode ? [{ debugName: "selectedTab" }] : []));
|
|
815
|
+
tabsList = signal([
|
|
816
|
+
{
|
|
817
|
+
label: this.translocoService.translate('permissions.roles'),
|
|
818
|
+
value: 'roles',
|
|
819
|
+
},
|
|
820
|
+
{
|
|
821
|
+
label: this.translocoService.translate('permissions.groups'),
|
|
822
|
+
value: 'groups',
|
|
823
|
+
},
|
|
824
|
+
], ...(ngDevMode ? [{ debugName: "tabsList" }] : []));
|
|
825
|
+
firstLoad = signal(true, ...(ngDevMode ? [{ debugName: "firstLoad" }] : []));
|
|
826
|
+
constructor() {
|
|
827
|
+
effect(() => {
|
|
828
|
+
const allEnabled = this.isAllPermissionsEnabled();
|
|
829
|
+
this.allPermissionsToggle.setValue(allEnabled, { emitEvent: false });
|
|
830
|
+
});
|
|
831
|
+
effect(() => {
|
|
832
|
+
if (this.selectedTab() == 'roles') {
|
|
833
|
+
if (this.levelRoles().length == 0) {
|
|
834
|
+
if (this.firstLoad() && !this.loading()) {
|
|
835
|
+
this.permissionsFacade.loadRoles();
|
|
836
|
+
this.firstLoad.set(false);
|
|
837
|
+
}
|
|
838
|
+
return;
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
if (this.groupOrRoleId() && this.groupPermissions().length == 0) {
|
|
842
|
+
this.selectedGroup.set(+this.groupOrRoleId());
|
|
843
|
+
this.permissionsFacade.selectGroup(+this.groupOrRoleId());
|
|
844
|
+
}
|
|
845
|
+
if (this.permissions().length == 0 && this.selectedTab() == 'roles') {
|
|
846
|
+
if (this.groupOrRoleId() && this.levelRoles().length > 0) {
|
|
847
|
+
const role = this.levelRoles()
|
|
848
|
+
.map((levelRoles) => levelRoles.roles)
|
|
849
|
+
.flat()
|
|
850
|
+
.find((r) => r?.value === this.groupOrRoleId()?.toString());
|
|
851
|
+
if (role) {
|
|
852
|
+
this.selectedRole.set(this.groupOrRoleId().toString());
|
|
853
|
+
this.permissionsFacade.selectRole(role.value);
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
});
|
|
858
|
+
}
|
|
859
|
+
ngOnInit() {
|
|
860
|
+
this.permissionsFacade.selectRole('');
|
|
861
|
+
this.route.parent?.paramMap
|
|
862
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
863
|
+
.subscribe((params) => {
|
|
864
|
+
const levelIdFromRoute = params.get('levelId');
|
|
865
|
+
if (levelIdFromRoute) {
|
|
866
|
+
this.permissionsFacade.reset();
|
|
867
|
+
this.permissionsFacade.setModuleInfo('level', levelIdFromRoute);
|
|
868
|
+
this.permissionsFacade.loadRoles();
|
|
869
|
+
}
|
|
870
|
+
});
|
|
871
|
+
this.permissionsFacade.loadRoles();
|
|
872
|
+
this.accessibilitiesFacade.getGroups();
|
|
873
|
+
this.allPermissionsToggle.valueChanges
|
|
874
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
875
|
+
.subscribe((value) => {
|
|
876
|
+
if (value !== null) {
|
|
877
|
+
this.onToggleAllLevel(this.defaultLevelName, value);
|
|
878
|
+
}
|
|
879
|
+
});
|
|
880
|
+
}
|
|
881
|
+
selectRole(roleValue) {
|
|
882
|
+
this.router.navigate(['roles', roleValue], { relativeTo: this.route });
|
|
883
|
+
this.permissionsFacade.selectRole(roleValue);
|
|
884
|
+
}
|
|
885
|
+
selectGroup(groupId) {
|
|
886
|
+
this.router.navigate(['groups', groupId], { relativeTo: this.route });
|
|
887
|
+
this.permissionsFacade.selectGroup(groupId);
|
|
888
|
+
}
|
|
889
|
+
openPermissionDialog(group) {
|
|
890
|
+
if (this.levelId() && (this.selectedRoleValue() || this.selectedGroup())) {
|
|
891
|
+
this.modal.openModal(PermissionsEditDialog, 'drawer', {
|
|
892
|
+
header: this.translocoService.translate('permissions.setPermissions'),
|
|
893
|
+
position: 'end',
|
|
894
|
+
styleClass: '!w-[24%] !absolute !shadow-none',
|
|
895
|
+
appendTo: 'page-content',
|
|
896
|
+
inputValues: {
|
|
897
|
+
permissionGroup: group,
|
|
898
|
+
levelId: this.levelId(),
|
|
899
|
+
roleValue: this.selectedTab() == 'roles'
|
|
900
|
+
? this.selectedRoleValue()
|
|
901
|
+
: this.selectedGroup(),
|
|
902
|
+
isGroup: this.selectedTab() != 'roles',
|
|
903
|
+
},
|
|
904
|
+
dismissible: true,
|
|
905
|
+
});
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
onToggleAllLevel(levelName, enabled) {
|
|
909
|
+
const levelId = this.levelId();
|
|
910
|
+
const roleValue = this.selectedRoleValue();
|
|
911
|
+
if (levelId) {
|
|
912
|
+
if (this.selectedTab() != 'roles') {
|
|
913
|
+
this.permissionsFacade.toggleAllGroupPermissions(levelId, this.selectedGroup().toString(), enabled);
|
|
914
|
+
return;
|
|
915
|
+
}
|
|
916
|
+
else {
|
|
917
|
+
if (!!roleValue) {
|
|
918
|
+
this.permissionsFacade.toggleAllLevelPermissions(roleValue, levelId, levelName, enabled);
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
isAllPermissionsEnabled() {
|
|
924
|
+
const groupsLogs = this.groupPermissions()
|
|
925
|
+
.map((group) => group.logs)
|
|
926
|
+
.flat();
|
|
927
|
+
const perms = (this.selectedTab() == 'roles' ? this.permissions() : groupsLogs) || [];
|
|
928
|
+
if (perms.length === 0)
|
|
929
|
+
return false;
|
|
930
|
+
return perms.every((log) => log.actions.every((action) => action.isSelected));
|
|
931
|
+
}
|
|
932
|
+
trackByRoleValue(_index, role) {
|
|
933
|
+
return role.value;
|
|
934
|
+
}
|
|
935
|
+
onTabChange($event) {
|
|
936
|
+
if ($event == 'roles') {
|
|
937
|
+
this.router.navigate(['roles'], { relativeTo: this.route });
|
|
938
|
+
}
|
|
939
|
+
else if ($event == 'groups') {
|
|
940
|
+
this.router.navigate(['groups'], { relativeTo: this.route });
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
ngOnDestroy() {
|
|
944
|
+
this.permissionsFacade.reset();
|
|
945
|
+
}
|
|
946
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: PermissionsPage, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
947
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: PermissionsPage, isStandalone: true, selector: "mt-permissions-page", ngImport: i0, template: "<div id=\"permissions-page-card\" class=\"flex gap-4 p-1\">\r\n <div class=\"w-1/5 flex-shrink-0\">\r\n <mt-card class=\"h-full flex flex-col\">\r\n <ng-template #headless>\r\n <div class=\"flex flex-col h-full\">\r\n <div\r\n class=\"p-4 pb-0 bg-surface-50 rounded-t-2xl border-b border-surface\"\r\n >\r\n <h2 class=\"text-lg font-semibold mb-3\">\r\n {{ \"permissions.rolesAndGroups\" | transloco }}\r\n </h2>\r\n\r\n <mt-tabs\r\n [(active)]=\"selectedTab\"\r\n [options]=\"tabsList()\"\r\n size=\"large\"\r\n (onChange)=\"onTabChange($event)\"\r\n />\r\n </div>\r\n\r\n <div class=\"flex-1 overflow-y-auto p-4\">\r\n @if (loading()) {\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n } @else {\r\n @if (selectedTab() === \"roles\") {\r\n @for (level of levelRoles(); track level.levelKey) {\r\n <div class=\"flex flex-col gap-2 mb-4\">\r\n <h2 class=\"font-semibold\">{{ level.level }}</h2>\r\n @for (role of level.roles; track role.value) {\r\n <div\r\n class=\"p-3 border-2 border-dashed border-gray-300 rounded-lg cursor-pointer transition-colors flex items-center gap-3\"\r\n [class.bg-primary-50]=\"selectedRole() === role.value\"\r\n [class.hover:bg-surface]=\"selectedRole() !== role.value\"\r\n [class.border-primary-400]=\"\r\n selectedRole() === role.value\r\n \"\r\n [style.--p-avatar-background]=\"\r\n selectedRole() === role.value\r\n ? 'var(--p-primary-color)'\r\n : 'var(--p-surface-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n selectedRole() === role.value ? '#ffffff' : ''\r\n \"\r\n (click)=\"selectRole(role.value)\"\r\n >\r\n <mt-avatar [icon]=\"'user.user-check-01'\" shape=\"square\">\r\n </mt-avatar>\r\n <div class=\"flex-1 min-w-0\">\r\n <div class=\"font-medium truncate\">\r\n {{ role.name }}\r\n </div>\r\n </div>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noRolesFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noLevelRolesFound\" | transloco }}\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"flex flex-col gap-2 mb-4\">\r\n @for (group of groups(); track group.name) {\r\n <div\r\n class=\"p-3 border-2 border-dashed border-gray-300 rounded-lg cursor-pointer transition-colors flex items-center gap-3\"\r\n [class.bg-primary-50]=\"selectedGroup() === group.id\"\r\n [class.hover:bg-surface]=\"selectedGroup() !== group.id\"\r\n [class.border-primary-400]=\"selectedGroup() === group.id\"\r\n [style.--p-avatar-background]=\"\r\n selectedGroup() === group.id\r\n ? 'var(--p-primary-color)'\r\n : 'var(--p-surface-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n selectedGroup() === group.id ? '#ffffff' : ''\r\n \"\r\n (click)=\"selectGroup(group.id)\"\r\n >\r\n <mt-avatar [icon]=\"'user.users-check'\" shape=\"square\">\r\n </mt-avatar>\r\n <div class=\"flex-1 min-w-0\">\r\n <div class=\"font-medium truncate\">{{ group.name }}</div>\r\n </div>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noGroupsFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n </div>\r\n\r\n <div class=\"min-w-0 w-1/2\">\r\n @if (!selectedRole() && !selectedGroup()) {\r\n <mt-card class=\"h-full\">\r\n <ng-template #headless>\r\n <div class=\"flex items-center justify-center h-full text-muted-color\">\r\n {{ \"permissions.selectRoleToViewPermissions\" | transloco }}\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n } @else {\r\n <mt-card class=\"h-full\">\r\n <div class=\"flex flex-col h-full\">\r\n <ng-template #headless>\r\n <div class=\"p-4 pb-2 mb-5 border-b border-surface\">\r\n <h2 class=\"text-lg font-semibold mb-3\">\r\n {{\r\n (selectedTab() === \"roles\"\r\n ? \"permissions.levelPermissions\"\r\n : \"permissions.groupsPermissions\"\r\n ) | transloco\r\n }}\r\n </h2>\r\n </div>\r\n @if (permissionsLoading()) {\r\n <div class=\"mx-4\">\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n </div>\r\n } @else {\r\n <div\r\n class=\"mb-5 p-3 mx-4 rounded-lg border-1 border-surface flex items-center justify-between\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n [icon]=\"'security.lock-unlocked-01'\"\r\n shape=\"square\"\r\n size=\"large\"\r\n [style.--p-avatar-background]=\"\r\n 'var(--p-' + 'surface' + '-100)'\r\n \"\r\n [style.--p-avatar-color]=\"'var(--p-' + 'primary' + '-600)'\"\r\n >\r\n </mt-avatar>\r\n <div>\r\n <div class=\"text-sm font-semibold\">\r\n {{\r\n (selectedTab() === \"roles\"\r\n ? \"permissions.setAllProjectPermissions\"\r\n : \"permissions.setAllGroupPermissions\"\r\n ) | transloco\r\n }}\r\n </div>\r\n <div class=\"text-xs text-muted-color\">\r\n {{ \"permissions.recommendedForSimpleForms\" | transloco }}\r\n </div>\r\n </div>\r\n </div>\r\n <mt-toggle-field\r\n [formControl]=\"allPermissionsToggle\"\r\n ></mt-toggle-field>\r\n </div>\r\n\r\n <div class=\"flex-1 px-4 overflow-y-auto border-t border-surface\">\r\n <div class=\"space-y-3 my-5\">\r\n @if (selectedTab() === \"roles\") {\r\n @for (group of permissions(); track group.name) {\r\n <div\r\n class=\"p-2 border-1 border-surface rounded-lg flex items-center justify-between hover:bg-surface-100 transition-colors\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n [icon]=\"'editor.dotpoints-02'\"\r\n shape=\"square\"\r\n size=\"normal\"\r\n [style.--p-avatar-background]=\"\r\n 'var(--p-' + 'surface' + '-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n 'var(--p-' + 'primary' + '-600)'\r\n \"\r\n >\r\n </mt-avatar>\r\n <span class=\"text-sm\">{{ group.name }}</span>\r\n </div>\r\n <mt-button\r\n [text]=\"true\"\r\n icon=\"custom.pencil\"\r\n severity=\"primary\"\r\n (click)=\"openPermissionDialog(group)\"\r\n >\r\n </mt-button>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noPermissionsFound\" | transloco }}\r\n </div>\r\n }\r\n } @else {\r\n @for (group of groupPermissions(); track group.levelName) {\r\n <div class=\"flex flex-col justify-between gap-3\">\r\n @for (log of group.logs; track log.name) {\r\n <div\r\n class=\"p-2 border-1 border-surface rounded-lg flex items-center justify-between hover:bg-surface-100 transition-colors\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n [icon]=\"'editor.dotpoints-02'\"\r\n shape=\"square\"\r\n size=\"normal\"\r\n [style.--p-avatar-background]=\"\r\n 'var(--p-' + 'surface' + '-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n 'var(--p-' + 'primary' + '-600)'\r\n \"\r\n >\r\n </mt-avatar>\r\n <span class=\"text-sm\">{{ log.name }}</span>\r\n </div>\r\n <mt-button\r\n [text]=\"true\"\r\n icon=\"custom.pencil\"\r\n severity=\"primary\"\r\n (click)=\"openPermissionDialog(log)\"\r\n >\r\n </mt-button>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{\r\n \"permissions.noPermissionsFoundForSelectedGroup\"\r\n | transloco\r\n }}\r\n </div>\r\n }\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noPermissionsFound\" | transloco }}\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n </ng-template>\r\n </div>\r\n </mt-card>\r\n }\r\n </div>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: ToggleField, selector: "mt-toggle-field", inputs: ["label", "labelPosition", "placeholder", "readonly", "pInputs", "required", "toggleShape", "size", "icon", "descriptionCard"], outputs: ["onChange"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "component", type: Avatar, selector: "mt-avatar", inputs: ["label", "icon", "image", "styleClass", "size", "shape", "badge", "badgeSize", "badgeSeverity"], outputs: ["onImageError"] }, { kind: "ngmodule", type: SkeletonModule }, { kind: "component", type: i2$1.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: Tabs, selector: "mt-tabs", inputs: ["options", "optionLabel", "optionValue", "active", "size", "fluid", "disabled"], outputs: ["activeChange", "onChange"] }, { kind: "pipe", type: i2.TranslocoPipe, name: "transloco" }] });
|
|
948
|
+
}
|
|
949
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: PermissionsPage, decorators: [{
|
|
950
|
+
type: Component,
|
|
951
|
+
args: [{ selector: 'mt-permissions-page', imports: [
|
|
952
|
+
CommonModule,
|
|
953
|
+
ReactiveFormsModule,
|
|
954
|
+
Card,
|
|
955
|
+
Button,
|
|
956
|
+
ToggleField,
|
|
957
|
+
TranslocoModule,
|
|
958
|
+
Avatar,
|
|
959
|
+
SkeletonModule,
|
|
960
|
+
Tabs,
|
|
961
|
+
], template: "<div id=\"permissions-page-card\" class=\"flex gap-4 p-1\">\r\n <div class=\"w-1/5 flex-shrink-0\">\r\n <mt-card class=\"h-full flex flex-col\">\r\n <ng-template #headless>\r\n <div class=\"flex flex-col h-full\">\r\n <div\r\n class=\"p-4 pb-0 bg-surface-50 rounded-t-2xl border-b border-surface\"\r\n >\r\n <h2 class=\"text-lg font-semibold mb-3\">\r\n {{ \"permissions.rolesAndGroups\" | transloco }}\r\n </h2>\r\n\r\n <mt-tabs\r\n [(active)]=\"selectedTab\"\r\n [options]=\"tabsList()\"\r\n size=\"large\"\r\n (onChange)=\"onTabChange($event)\"\r\n />\r\n </div>\r\n\r\n <div class=\"flex-1 overflow-y-auto p-4\">\r\n @if (loading()) {\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n } @else {\r\n @if (selectedTab() === \"roles\") {\r\n @for (level of levelRoles(); track level.levelKey) {\r\n <div class=\"flex flex-col gap-2 mb-4\">\r\n <h2 class=\"font-semibold\">{{ level.level }}</h2>\r\n @for (role of level.roles; track role.value) {\r\n <div\r\n class=\"p-3 border-2 border-dashed border-gray-300 rounded-lg cursor-pointer transition-colors flex items-center gap-3\"\r\n [class.bg-primary-50]=\"selectedRole() === role.value\"\r\n [class.hover:bg-surface]=\"selectedRole() !== role.value\"\r\n [class.border-primary-400]=\"\r\n selectedRole() === role.value\r\n \"\r\n [style.--p-avatar-background]=\"\r\n selectedRole() === role.value\r\n ? 'var(--p-primary-color)'\r\n : 'var(--p-surface-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n selectedRole() === role.value ? '#ffffff' : ''\r\n \"\r\n (click)=\"selectRole(role.value)\"\r\n >\r\n <mt-avatar [icon]=\"'user.user-check-01'\" shape=\"square\">\r\n </mt-avatar>\r\n <div class=\"flex-1 min-w-0\">\r\n <div class=\"font-medium truncate\">\r\n {{ role.name }}\r\n </div>\r\n </div>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noRolesFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noLevelRolesFound\" | transloco }}\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"flex flex-col gap-2 mb-4\">\r\n @for (group of groups(); track group.name) {\r\n <div\r\n class=\"p-3 border-2 border-dashed border-gray-300 rounded-lg cursor-pointer transition-colors flex items-center gap-3\"\r\n [class.bg-primary-50]=\"selectedGroup() === group.id\"\r\n [class.hover:bg-surface]=\"selectedGroup() !== group.id\"\r\n [class.border-primary-400]=\"selectedGroup() === group.id\"\r\n [style.--p-avatar-background]=\"\r\n selectedGroup() === group.id\r\n ? 'var(--p-primary-color)'\r\n : 'var(--p-surface-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n selectedGroup() === group.id ? '#ffffff' : ''\r\n \"\r\n (click)=\"selectGroup(group.id)\"\r\n >\r\n <mt-avatar [icon]=\"'user.users-check'\" shape=\"square\">\r\n </mt-avatar>\r\n <div class=\"flex-1 min-w-0\">\r\n <div class=\"font-medium truncate\">{{ group.name }}</div>\r\n </div>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noGroupsFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n </div>\r\n\r\n <div class=\"min-w-0 w-1/2\">\r\n @if (!selectedRole() && !selectedGroup()) {\r\n <mt-card class=\"h-full\">\r\n <ng-template #headless>\r\n <div class=\"flex items-center justify-center h-full text-muted-color\">\r\n {{ \"permissions.selectRoleToViewPermissions\" | transloco }}\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n } @else {\r\n <mt-card class=\"h-full\">\r\n <div class=\"flex flex-col h-full\">\r\n <ng-template #headless>\r\n <div class=\"p-4 pb-2 mb-5 border-b border-surface\">\r\n <h2 class=\"text-lg font-semibold mb-3\">\r\n {{\r\n (selectedTab() === \"roles\"\r\n ? \"permissions.levelPermissions\"\r\n : \"permissions.groupsPermissions\"\r\n ) | transloco\r\n }}\r\n </h2>\r\n </div>\r\n @if (permissionsLoading()) {\r\n <div class=\"mx-4\">\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n </div>\r\n } @else {\r\n <div\r\n class=\"mb-5 p-3 mx-4 rounded-lg border-1 border-surface flex items-center justify-between\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n [icon]=\"'security.lock-unlocked-01'\"\r\n shape=\"square\"\r\n size=\"large\"\r\n [style.--p-avatar-background]=\"\r\n 'var(--p-' + 'surface' + '-100)'\r\n \"\r\n [style.--p-avatar-color]=\"'var(--p-' + 'primary' + '-600)'\"\r\n >\r\n </mt-avatar>\r\n <div>\r\n <div class=\"text-sm font-semibold\">\r\n {{\r\n (selectedTab() === \"roles\"\r\n ? \"permissions.setAllProjectPermissions\"\r\n : \"permissions.setAllGroupPermissions\"\r\n ) | transloco\r\n }}\r\n </div>\r\n <div class=\"text-xs text-muted-color\">\r\n {{ \"permissions.recommendedForSimpleForms\" | transloco }}\r\n </div>\r\n </div>\r\n </div>\r\n <mt-toggle-field\r\n [formControl]=\"allPermissionsToggle\"\r\n ></mt-toggle-field>\r\n </div>\r\n\r\n <div class=\"flex-1 px-4 overflow-y-auto border-t border-surface\">\r\n <div class=\"space-y-3 my-5\">\r\n @if (selectedTab() === \"roles\") {\r\n @for (group of permissions(); track group.name) {\r\n <div\r\n class=\"p-2 border-1 border-surface rounded-lg flex items-center justify-between hover:bg-surface-100 transition-colors\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n [icon]=\"'editor.dotpoints-02'\"\r\n shape=\"square\"\r\n size=\"normal\"\r\n [style.--p-avatar-background]=\"\r\n 'var(--p-' + 'surface' + '-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n 'var(--p-' + 'primary' + '-600)'\r\n \"\r\n >\r\n </mt-avatar>\r\n <span class=\"text-sm\">{{ group.name }}</span>\r\n </div>\r\n <mt-button\r\n [text]=\"true\"\r\n icon=\"custom.pencil\"\r\n severity=\"primary\"\r\n (click)=\"openPermissionDialog(group)\"\r\n >\r\n </mt-button>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noPermissionsFound\" | transloco }}\r\n </div>\r\n }\r\n } @else {\r\n @for (group of groupPermissions(); track group.levelName) {\r\n <div class=\"flex flex-col justify-between gap-3\">\r\n @for (log of group.logs; track log.name) {\r\n <div\r\n class=\"p-2 border-1 border-surface rounded-lg flex items-center justify-between hover:bg-surface-100 transition-colors\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n [icon]=\"'editor.dotpoints-02'\"\r\n shape=\"square\"\r\n size=\"normal\"\r\n [style.--p-avatar-background]=\"\r\n 'var(--p-' + 'surface' + '-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n 'var(--p-' + 'primary' + '-600)'\r\n \"\r\n >\r\n </mt-avatar>\r\n <span class=\"text-sm\">{{ log.name }}</span>\r\n </div>\r\n <mt-button\r\n [text]=\"true\"\r\n icon=\"custom.pencil\"\r\n severity=\"primary\"\r\n (click)=\"openPermissionDialog(log)\"\r\n >\r\n </mt-button>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{\r\n \"permissions.noPermissionsFoundForSelectedGroup\"\r\n | transloco\r\n }}\r\n </div>\r\n }\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noPermissionsFound\" | transloco }}\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n </ng-template>\r\n </div>\r\n </mt-card>\r\n }\r\n </div>\r\n</div>\r\n" }]
|
|
962
|
+
}], ctorParameters: () => [] });
|
|
963
|
+
|
|
964
|
+
// store/index.ts
|
|
965
|
+
|
|
966
|
+
/**
|
|
967
|
+
* Generated bundle index. Do not edit.
|
|
968
|
+
*/
|
|
969
|
+
|
|
970
|
+
export { LoadGroupPermissions, LoadGroupPermissionsSuccess, LoadPermissions, LoadPermissionsFail, LoadPermissionsSuccess, LoadRoles, LoadRolesFail, LoadRolesSuccess, ModuleType, PermissionsEditDialog, PermissionsFacade, PermissionsPage, PermissionsState, Reset, SelectGroup, SelectRole, SetModuleInfo, ToggleAllGroupPermissions, ToggleAllLevelPermissions, UpdateGroupPermission, UpdateGroupPermissionLocally, UpdatePermission, UpdatePermissionFail, UpdatePermissionLocally, UpdatePermissionSuccess };
|
|
971
|
+
//# sourceMappingURL=masterteam-permissions.mjs.map
|