@firestitch/app-acl 12.5.1 → 12.6.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.
Files changed (50) hide show
  1. package/app/components/acl-role/acl-role.component.d.ts +3 -0
  2. package/app/fs-app-acl.module.d.ts +20 -19
  3. package/app/pipes/acl-role-permission-available.pipe.d.ts +7 -0
  4. package/app/pipes/index.d.ts +2 -0
  5. package/esm2020/app/components/acl-entries/acl-entries.component.mjs +176 -0
  6. package/esm2020/app/components/acl-entry/acl-entry.component.mjs +93 -0
  7. package/esm2020/app/components/acl-object-roles/acl-object-roles.component.mjs +52 -0
  8. package/esm2020/app/components/acl-permission-popover/acl-permission-popover.component.mjs +29 -0
  9. package/esm2020/app/components/acl-role/acl-role.component.mjs +254 -0
  10. package/esm2020/app/components/acl-role-popover/acl-role-popover.component.mjs +34 -0
  11. package/esm2020/app/components/acl-roles/acl-roles.component.mjs +170 -0
  12. package/{esm2015/app/fs-app-acl.module.js → esm2020/app/fs-app-acl.module.mjs} +9 -7
  13. package/esm2020/app/pipes/acl-role-permission-available.pipe.mjs +21 -0
  14. package/{esm2015/app/pipes/bulk-options-filter.pipe.js → esm2020/app/pipes/bulk-options-filter.pipe.mjs} +4 -4
  15. package/esm2020/app/pipes/index.mjs +3 -0
  16. package/{esm2015/app/services/app-acl.service.js → esm2020/app/services/app-acl.service.mjs} +4 -4
  17. package/fesm2015/firestitch-app-acl.mjs +952 -0
  18. package/fesm2015/firestitch-app-acl.mjs.map +1 -0
  19. package/fesm2020/firestitch-app-acl.mjs +965 -0
  20. package/fesm2020/firestitch-app-acl.mjs.map +1 -0
  21. package/package.json +20 -7
  22. package/bundles/firestitch-app-acl.umd.js +0 -1464
  23. package/bundles/firestitch-app-acl.umd.js.map +0 -1
  24. package/esm2015/app/components/acl-entries/acl-entries.component.js +0 -175
  25. package/esm2015/app/components/acl-entry/acl-entry.component.js +0 -94
  26. package/esm2015/app/components/acl-object-roles/acl-object-roles.component.js +0 -57
  27. package/esm2015/app/components/acl-permission-popover/acl-permission-popover.component.js +0 -33
  28. package/esm2015/app/components/acl-role/acl-role.component.js +0 -232
  29. package/esm2015/app/components/acl-role-popover/acl-role-popover.component.js +0 -38
  30. package/esm2015/app/components/acl-roles/acl-roles.component.js +0 -175
  31. package/fesm2015/firestitch-app-acl.js +0 -942
  32. package/fesm2015/firestitch-app-acl.js.map +0 -1
  33. /package/{esm2015/app/consts/acl-role-accesses.js → esm2020/app/consts/acl-role-accesses.mjs} +0 -0
  34. /package/{esm2015/app/enums/acl-role-access.js → esm2020/app/enums/acl-role-access.mjs} +0 -0
  35. /package/{esm2015/app/injectors/app-acl-config.injector.js → esm2020/app/injectors/app-acl-config.injector.mjs} +0 -0
  36. /package/{esm2015/app/interfaces/acl-entry-data.js → esm2020/app/interfaces/acl-entry-data.mjs} +0 -0
  37. /package/{esm2015/app/interfaces/acl-entry.js → esm2020/app/interfaces/acl-entry.mjs} +0 -0
  38. /package/{esm2015/app/interfaces/acl-level.js → esm2020/app/interfaces/acl-level.mjs} +0 -0
  39. /package/{esm2015/app/interfaces/acl-object-entry.js → esm2020/app/interfaces/acl-object-entry.mjs} +0 -0
  40. /package/{esm2015/app/interfaces/acl-object-role.js → esm2020/app/interfaces/acl-object-role.mjs} +0 -0
  41. /package/{esm2015/app/interfaces/acl-object.js → esm2020/app/interfaces/acl-object.mjs} +0 -0
  42. /package/{esm2015/app/interfaces/acl-permission.js → esm2020/app/interfaces/acl-permission.mjs} +0 -0
  43. /package/{esm2015/app/interfaces/acl-role-config.js → esm2020/app/interfaces/acl-role-config.mjs} +0 -0
  44. /package/{esm2015/app/interfaces/acl-role.js → esm2020/app/interfaces/acl-role.mjs} +0 -0
  45. /package/{esm2015/app/interfaces/app-acl-config.js → esm2020/app/interfaces/app-acl-config.mjs} +0 -0
  46. /package/{esm2015/app/interfaces/index.js → esm2020/app/interfaces/index.mjs} +0 -0
  47. /package/{esm2015/app/interfaces/name-value.js → esm2020/app/interfaces/name-value.mjs} +0 -0
  48. /package/{esm2015/app/interfaces/role-config.js → esm2020/app/interfaces/role-config.mjs} +0 -0
  49. /package/{esm2015/firestitch-app-acl.js → esm2020/firestitch-app-acl.mjs} +0 -0
  50. /package/{esm2015/public_api.js → esm2020/public_api.mjs} +0 -0
@@ -1,942 +0,0 @@
1
- import * as i18 from '@angular/material/input';
2
- import { MatInputModule } from '@angular/material/input';
3
- import * as i8 from '@angular/material/radio';
4
- import { MatRadioModule } from '@angular/material/radio';
5
- import * as i14 from '@angular/material/button';
6
- import { MatButtonModule } from '@angular/material/button';
7
- import * as i10 from '@angular/material/select';
8
- import { MatSelectModule } from '@angular/material/select';
9
- import * as i9 from '@angular/material/checkbox';
10
- import { MatCheckboxModule } from '@angular/material/checkbox';
11
- import * as i2 from '@angular/material/dialog';
12
- import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
13
- import * as i0 from '@angular/core';
14
- import { InjectionToken, Injectable, Inject, Pipe, Component, ChangeDetectionStrategy, ViewChild, Input, QueryList, ViewChildren, EventEmitter, Output, NgModule } from '@angular/core';
15
- import * as i7$1 from '@angular/common';
16
- import { CommonModule } from '@angular/common';
17
- import * as i12 from '@firestitch/list';
18
- import { FsListComponent, FsListModule } from '@firestitch/list';
19
- import * as i2$1 from '@firestitch/popover';
20
- import { FsPopoverModule } from '@firestitch/popover';
21
- import * as i4 from '@firestitch/dialog';
22
- import { FsDialogModule } from '@firestitch/dialog';
23
- import * as i16 from '@firestitch/form';
24
- import { FsFormModule } from '@firestitch/form';
25
- import * as i6 from '@firestitch/label';
26
- import { FsLabelModule } from '@firestitch/label';
27
- import * as i7 from '@firestitch/radiogroup';
28
- import { FsRadioGroupModule } from '@firestitch/radiogroup';
29
- import * as i5$1 from '@firestitch/badge';
30
- import { FsBadgeModule } from '@firestitch/badge';
31
- import * as i1 from '@firestitch/checkboxgroup';
32
- import { FsCheckboxGroupModule } from '@firestitch/checkboxgroup';
33
- import * as i13 from '@firestitch/menu';
34
- import { FsMenuModule } from '@firestitch/menu';
35
- import { map, tap, takeUntil, filter } from 'rxjs/operators';
36
- import { ItemType } from '@firestitch/filter';
37
- import { list } from '@firestitch/common';
38
- import { ReplaySubject, Subject, forkJoin, of, Observable } from 'rxjs';
39
- import * as i3 from '@firestitch/message';
40
- import * as i5 from '@angular/material/form-field';
41
- import { MatFormFieldModule } from '@angular/material/form-field';
42
- import * as i11 from '@angular/material/core';
43
- import * as i15 from '@angular/forms';
44
- import { ControlContainer, NgForm, FormsModule } from '@angular/forms';
45
- import { groupBy, sortBy } from 'lodash-es';
46
- import * as i3$1 from '@firestitch/prompt';
47
-
48
- var AclRoleAccess;
49
- (function (AclRoleAccess) {
50
- AclRoleAccess[AclRoleAccess["None"] = 0] = "None";
51
- AclRoleAccess[AclRoleAccess["Read"] = 5] = "Read";
52
- AclRoleAccess[AclRoleAccess["Write"] = 10] = "Write";
53
- AclRoleAccess[AclRoleAccess["Full"] = 15] = "Full";
54
- })(AclRoleAccess || (AclRoleAccess = {}));
55
-
56
- const AclRoleAccesses = [
57
- { name: 'None', value: AclRoleAccess.None },
58
- { name: 'Read', value: AclRoleAccess.Read },
59
- { name: 'Write', value: AclRoleAccess.Write },
60
- { name: 'Full', value: AclRoleAccess.Full }
61
- ];
62
-
63
- const FS_APP_ACL_CONFIG = new InjectionToken('fs-app-acl-config');
64
-
65
- class FsAppAclService {
66
- constructor(_appAclConfig) {
67
- this._appAclConfig = _appAclConfig;
68
- }
69
- getPermissions() {
70
- if (!this._permissions$) {
71
- this._permissions$ = new ReplaySubject();
72
- this._appAclConfig.permissions
73
- .subscribe((permissions) => {
74
- this._permissions$.next(permissions);
75
- this._permissions$.complete();
76
- });
77
- }
78
- return this._permissions$;
79
- }
80
- getLevels() {
81
- if (!this._levels$) {
82
- this._levels$ = new ReplaySubject();
83
- this._appAclConfig.levels
84
- .subscribe((levels) => {
85
- this._levels$.next(levels);
86
- this._levels$.complete();
87
- });
88
- }
89
- return this._levels$;
90
- }
91
- getIndexedLevels() {
92
- return this.getLevels()
93
- .pipe(map((data) => {
94
- return list(data, 'name', 'value');
95
- }));
96
- }
97
- }
98
- FsAppAclService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FsAppAclService, deps: [{ token: FS_APP_ACL_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
99
- FsAppAclService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FsAppAclService, providedIn: 'root' });
100
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FsAppAclService, decorators: [{
101
- type: Injectable,
102
- args: [{
103
- providedIn: 'root',
104
- }]
105
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
106
- type: Inject,
107
- args: [FS_APP_ACL_CONFIG]
108
- }] }]; } });
109
-
110
- class BulkOptionsFilterPipe {
111
- transform(rolesList, children) {
112
- const accessLevels = this._uniqListOfAccessLevels(children);
113
- return rolesList.filter((permission) => {
114
- return permission.value === 0 || accessLevels.has(permission.value);
115
- });
116
- }
117
- _uniqListOfAccessLevels(children) {
118
- return children.reduce((acc, value) => {
119
- value.accesses.forEach((access) => {
120
- acc.add(access);
121
- });
122
- return acc;
123
- }, (new Set));
124
- }
125
- }
126
- BulkOptionsFilterPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BulkOptionsFilterPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
127
- BulkOptionsFilterPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BulkOptionsFilterPipe, name: "builkOptionsFilter" });
128
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BulkOptionsFilterPipe, decorators: [{
129
- type: Pipe,
130
- args: [{
131
- name: 'builkOptionsFilter'
132
- }]
133
- }] });
134
-
135
- class FsAclRoleComponent {
136
- constructor(_data, _appAclService, _dialogRef, _message, _cdRef) {
137
- this._data = _data;
138
- this._appAclService = _appAclService;
139
- this._dialogRef = _dialogRef;
140
- this._message = _message;
141
- this._cdRef = _cdRef;
142
- this.aclRole = null;
143
- this.permissions = [];
144
- this.levelPermissions = [];
145
- this.AclRoleAccesses = AclRoleAccesses;
146
- this.indexedAccesses = {};
147
- this.aclLevels = [];
148
- this.indexedAclLevels = {};
149
- this.onlyFullAccess = false;
150
- this.AclLevels = {};
151
- this.roleConfigs = [];
152
- this.aclRoleConfigValues = {};
153
- this.aclRolePermissions = {};
154
- this._destroy$ = new Subject();
155
- this.save = () => {
156
- const aclRoleConfigs = this.roleConfigs
157
- .map((roleConfig) => {
158
- return {
159
- name: roleConfig.name,
160
- value: this.aclRoleConfigValues[roleConfig.name],
161
- };
162
- });
163
- const aclRole = Object.assign(Object.assign({}, this.aclRole), { permissions: this.levelPermissions.map((permission) => {
164
- return {
165
- value: permission.value,
166
- access: this.aclRolePermissions[permission.value] || 0,
167
- };
168
- }), aclRoleConfigs });
169
- return this._data.saveAclRole(aclRole)
170
- .pipe(tap((response) => {
171
- this._message.success('Saved Changes');
172
- this.close(response);
173
- }));
174
- };
175
- }
176
- ngOnInit() {
177
- forkJoin(this.getRole(), this._appAclService.getPermissions())
178
- .pipe(takeUntil(this._destroy$))
179
- .subscribe(([aclRole, aclPermissions,]) => {
180
- this.permissions = aclPermissions;
181
- this.aclLevels = this._data.aclLevels;
182
- this.disabled = this._data.disabled;
183
- this.indexedAclLevels = list(this.aclLevels, 'name', 'value');
184
- this.indexedAccesses = list(AclRoleAccesses, 'name', 'value');
185
- this.aclRole = Object.assign({
186
- aclPermissions: [],
187
- allPermissions: true,
188
- aclRoleConfigs: [],
189
- permissions: {},
190
- level: this.aclLevels[0].value,
191
- }, aclRole);
192
- this.aclRoleConfigValues = (aclRole.aclRoleConfigs || [])
193
- .reduce((accum, aclRoleConfig) => {
194
- return Object.assign(Object.assign({}, accum), { [aclRoleConfig.name]: aclRoleConfig.value });
195
- }, {});
196
- if (this.aclRole.id) {
197
- this.permissions.forEach((permission) => {
198
- let access = 0;
199
- const aclPermission = this.aclRole.aclPermissions.find((item) => {
200
- return item.permission === permission.value;
201
- });
202
- if (aclPermission) {
203
- access = aclPermission.access;
204
- }
205
- this.aclRolePermissions[permission.value] = access;
206
- });
207
- }
208
- if (this.aclRole.allPermissions) {
209
- this._applyMaxPermissionAccess();
210
- }
211
- this._updatePermissions();
212
- this._updateRoleConfigs();
213
- this._cdRef.markForCheck();
214
- });
215
- this.listConfig = {
216
- status: false,
217
- paging: false,
218
- noResults: {
219
- message: '',
220
- },
221
- group: {
222
- initialExpand: true,
223
- groupBy: (data) => {
224
- return data;
225
- },
226
- compareBy: (data) => {
227
- return data.category || 'General';
228
- },
229
- },
230
- fetch: () => {
231
- return of({
232
- data: this.levelPermissions.sort((a, b) => {
233
- a = a.name.toUpperCase();
234
- b = b.name.toUpperCase();
235
- if (a < b) {
236
- return -1;
237
- }
238
- else if (a > b) {
239
- return 1;
240
- }
241
- return 0;
242
- }),
243
- });
244
- },
245
- };
246
- }
247
- bulkChange(value, groupChildren, group) {
248
- groupChildren
249
- .forEach((permission) => {
250
- const access = permission.accesses
251
- .find((access) => value === access);
252
- if (access || !value) {
253
- this.aclRolePermissions[permission.value] = value;
254
- }
255
- });
256
- }
257
- levelChange() {
258
- this._updatePermissions();
259
- this._updateRoleConfigs();
260
- this.list.reload();
261
- }
262
- getRole() {
263
- if (!this._data.aclRole.id) {
264
- return of(this._data.aclRole);
265
- }
266
- const query = {
267
- aclPermissions: true,
268
- aclRoleConfigs: true,
269
- };
270
- if (!this.environment) {
271
- query.environmentId = null;
272
- }
273
- return this._data.loadAclRole(this._data.aclRole, query);
274
- }
275
- close(data = null) {
276
- this._dialogRef.close(data);
277
- }
278
- allPermissionsChange(all) {
279
- this._updatePermissions();
280
- if (all) {
281
- this._applyMaxPermissionAccess();
282
- }
283
- else {
284
- this._applyNonePermissionAccess();
285
- }
286
- }
287
- ngOnDestroy() {
288
- this._destroy$.next();
289
- this._destroy$.complete();
290
- }
291
- _updatePermissions() {
292
- this.levelPermissions = this.permissions
293
- .filter((permission) => {
294
- return permission.levels.some((item) => {
295
- return item === this.aclRole.level;
296
- });
297
- });
298
- }
299
- _updateRoleConfigs() {
300
- if (this._data.loadRoleConfigs) {
301
- this._data.loadRoleConfigs()
302
- .subscribe((roleConfigs) => {
303
- this.roleConfigs = roleConfigs
304
- .filter((roleConfig) => roleConfig.level === this.aclRole.level);
305
- this._cdRef.markForCheck();
306
- });
307
- }
308
- }
309
- _applyMaxPermissionAccess() {
310
- this.permissions.forEach((permission) => {
311
- this.aclRolePermissions[permission.value] = Math.max(...permission.accesses);
312
- });
313
- }
314
- _applyNonePermissionAccess() {
315
- this.permissions.forEach((permission) => {
316
- this.aclRolePermissions[permission.value] = AclRoleAccess.None;
317
- });
318
- }
319
- }
320
- FsAclRoleComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FsAclRoleComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: FsAppAclService }, { token: i2.MatDialogRef }, { token: i3.FsMessage }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
321
- FsAclRoleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: FsAclRoleComponent, selector: "ng-component", viewQueries: [{ propertyName: "list", first: true, predicate: FsListComponent, descendants: true }], ngImport: i0, template: "<form fsForm [submit]=\"save\">\n <fs-dialog>\n <ng-container *ngIf=\"aclRole\">\n <div mat-dialog-title>\n <ng-container *ngIf=\"!disabled\">{{ aclRole.id ? 'Edit' : 'Create' }}</ng-container>\n <ng-container *ngIf=\"disabled\">View</ng-container>\n Role\n </div>\n <mat-dialog-content>\n <div class=\"fs-row.gap-large.align-start\">\n <div class=\"fs-column left-column\">\n <mat-form-field> \n <mat-label>Name</mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.name\"\n [disabled]=\"disabled\"\n name=\"name\"\n fsFormRequired>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Description</mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.description\"\n [disabled]=\"disabled\"\n name=\"description\">\n </mat-form-field>\n\n <fs-label-field *ngIf=\"aclRole.id || aclLevels.length === 1; else levels\">\n <fs-label>Level</fs-label>\n {{indexedAclLevels[aclRole.level]}}\n </fs-label-field>\n\n <ng-template #levels>\n <div class=\"level\">\n <fs-radio-group\n [(ngModel)]=\"aclRole.level\"\n [disabled]=\"disabled\"\n (ngModelChange)=\"levelChange()\"\n fsFormRequired\n label=\"Level\"\n orientation=\"vertical\"\n name=\"level\">\n <mat-radio-button\n *ngFor=\"let item of aclLevels\"\n [value]=\"item.value\"\n [disabled]=\"!!aclRole.protected\">\n {{ item.name }}\n </mat-radio-button>\n </fs-radio-group>\n </div>\n </ng-template>\n\n <fs-label-field *ngIf=\"levelPermissions.length\">\n <fs-label>All Permissions</fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRole.allPermissions\"\n (ngModelChange)=\"allPermissionsChange($event)\"\n [disabled]=\"!!aclRole.protected || disabled\"\n name=\"allPermissions\">\n Enable\n </mat-checkbox>\n </fs-label-field>\n\n <div class=\"fs-column\" *ngFor=\"let roleConfig of roleConfigs\">\n <fs-label-field *ngIf=\"roleConfig.type === 'checkbox'\">\n <fs-label>{{roleConfig.label}}</fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [disabled]=\"disabled\"\n [name]=\"roleConfig.name\">\n Enable\n </mat-checkbox>\n <fs-label-message>\n <mat-hint>{{roleConfig.description}}</mat-hint>\n </fs-label-message>\n </fs-label-field>\n\n <mat-form-field *ngIf=\"roleConfig.type === 'select'\">\n <mat-select\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [name]=\"roleConfig.name\"\n [required]=\"roleConfig.required\"\n [disabled]=\"disabled\"\n [placeholder]=\"roleConfig.label\">\n <mat-option\n *ngFor=\"let item of roleConfig.values\"\n [value]=\"item.value\">\n {{ item.name }}\n </mat-option>\n </mat-select>\n <mat-hint>{{roleConfig.description}}</mat-hint>\n </mat-form-field>\n </div>\n </div>\n\n <div *ngIf=\"aclRole.level\" [hidden]=\"!levelPermissions.length\" class=\"permissions fs-column\">\n <fs-list [config]=\"listConfig\">\n <fs-list-column title=\"Permissions\">\n <ng-template fs-list-group-cell let-row=\"row\" class=\"permission-group\">\n <small><b>{{row.category || 'General'}}</b></small>\n </ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <div class=\"permission\">{{ row.name }}</div>\n <div class=\"description small\">{{ row.description }}</div>\n </ng-template>\n </fs-list-column>\n <fs-list-column title=\"Access\" width=\"1%\" class=\"access\">\n <ng-template \n fs-list-group-cell\n let-row=\"row\"\n let-group=\"group\"\n let-groupChildren=\"groupChildren\"\n class=\"permission-group\"\n align=\"right\">\n <ng-container *ngIf=\"!aclRole.allPermissions && !disabled\">\n <fs-menu>\n <ng-container *ngFor=\"let access of AclRoleAccesses | builkOptionsFilter: groupChildren\">\n <ng-template\n fs-menu-item\n (click)=\"bulkChange(access.value, groupChildren, group)\">\n {{ access.name }}\n </ng-template>\n </ng-container>\n </fs-menu>\n </ng-container>\n </ng-template>\n <ng-template fs-list-cell let-row=\"permission\" let-permission=\"row\">\n <span *ngIf=\"aclRole.allPermissions || disabled; else elseAll\">\n {{ indexedAccesses[aclRolePermissions[permission.value]] }}\n </span>\n <ng-template #elseAll>\n <mat-form-field>\n <mat-select\n [(ngModel)]=\"aclRolePermissions[permission.value]\"\n [disabled]=\"!!aclRole.protected\"\n required\n name=\"access-{{ permission.value }}\">\n <ng-container *ngFor=\"let access of AclRoleAccesses\">\n <mat-option\n *ngIf=\"access.value === 0 || permission.accesses.indexOf(access.value) !== -1\"\n [value]=\"access.value\">\n {{ access.name }}\n </mat-option>\n </ng-container>\n </mat-select>\n </mat-form-field>\n </ng-template>\n </ng-template>\n </fs-list-column>\n </fs-list>\n </div>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n *ngIf=\"!disabled\"\n mat-button\n type=\"submit\"\n color=\"primary\">\n {{ aclRole.id ? 'Save' : 'Create' }}\n </button>\n <button mat-button [mat-dialog-close]=\"null\" type=\"button\">{{ disabled ? 'Done' : 'Cancel' }}</button>\n </mat-dialog-actions>\n </ng-container>\n </fs-dialog>\n</form>\n", styles: [".permissions{flex:1}.permissions ::ng-deep .fs-list-row-group{background-color:#f6f6f6}.permissions ::ng-deep fs-list .access{white-space:nowrap}.permissions ::ng-deep .mat-form-field{width:100px}.permissions ::ng-deep .mat-form-field .mat-form-field-wrapper{padding-bottom:0}.permissions ::ng-deep .mat-form-field .mat-form-field-infix{border-top:0}.permissions ::ng-deep .mat-form-field .mat-form-field-underline{bottom:0}.permissions ::ng-deep fs-radio-group{width:100%}.permissions ::ng-deep fs-label-field{width:100%}.permissions .level{width:100%}.left-column{width:40%;max-width:400px}\n"], components: [{ type: i4.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileActionPlacement", "mobileWidth", "mode"] }, { type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i6.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { type: i6.FsLabelComponent, selector: "fs-label" }, { type: i7.FsRadioGroupComponent, selector: "fs-radio-group", inputs: ["orientation", "label", "name", "disabled", "radioPosition", "compareWith", "required"] }, { type: i8.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { type: i9.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "id", "labelPosition", "name", "required", "checked", "disabled", "indeterminate", "aria-describedby", "value"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i6.FsLabelMessageComponent, selector: "fs-label-message" }, { type: i10.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i11.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i12.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { type: i13.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { type: i14.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i15.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i15.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i15.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i16.FsFormDirective, selector: "[fsForm]", inputs: ["wrapperSelector", "messageSelector", "hintSelector", "labelSelector", "autocomplete", "shortcuts", "confirm", "confirmDialog", "confirmDrawer", "confirmBrowser", "confirmTabs", "dirtySubmitButton", "submit", "successDelay", "errorDelay", "tabGroup", "deactivationGuard"], outputs: ["fsForm", "invalid", "valid", "submitted", "reseted", "cleared"] }, { type: i7$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i5.MatLabel, selector: "mat-label" }, { type: i18.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i15.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i16.FsFormRequiredDirective, selector: "[fsFormRequired],[ngModel][required]", inputs: ["fsFormRequired", "required", "fsFormRequiredMessage"] }, { type: i15.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i15.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i16.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }, { type: i7$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { type: i15.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i12.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customize", "sortable", "sortableDefault", "direction", "align", "width", "class"] }, { type: i12.FsListGroupHeaderDirective, selector: "[fs-list-group-cell],[fs-list-group-header]" }, { type: i12.FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }, { type: i13.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { type: i2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i16.FsButtonDirective, selector: "[mat-raised-button],[mat-button],[mat-flat-button],[mat-stroked-button]", inputs: ["name", "dirtySubmit", "form"] }, { type: i2.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["type", "mat-dialog-close", "aria-label", "matDialogClose"], exportAs: ["matDialogClose"] }], pipes: { "builkOptionsFilter": BulkOptionsFilterPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
322
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FsAclRoleComponent, decorators: [{
323
- type: Component,
324
- args: [{
325
- templateUrl: './acl-role.component.html',
326
- styleUrls: ['./acl-role.component.scss'],
327
- changeDetection: ChangeDetectionStrategy.OnPush,
328
- }]
329
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
330
- type: Inject,
331
- args: [MAT_DIALOG_DATA]
332
- }] }, { type: FsAppAclService }, { type: i2.MatDialogRef }, { type: i3.FsMessage }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { list: [{
333
- type: ViewChild,
334
- args: [FsListComponent]
335
- }] } });
336
-
337
- class FsAclPermissionPopoverComponent {
338
- constructor(_appAclService) {
339
- this._appAclService = _appAclService;
340
- }
341
- ngOnInit() {
342
- this._appAclService.getPermissions()
343
- .subscribe(permissions => {
344
- this.description = permissions.filter(item => {
345
- return item.value === this.permission.value;
346
- }).map(item => {
347
- return item.description;
348
- })[0];
349
- });
350
- }
351
- }
352
- FsAclPermissionPopoverComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FsAclPermissionPopoverComponent, deps: [{ token: FsAppAclService }], target: i0.ɵɵFactoryTarget.Component });
353
- FsAclPermissionPopoverComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: FsAclPermissionPopoverComponent, selector: "acl-permission-popover", inputs: { permission: "permission" }, ngImport: i0, template: "\n<fs-popover [template]=\"popover\" [maxWidth]=\"400\">\n <ng-content></ng-content>\n</fs-popover>\n\n<ng-template #popover>\n {{permission.name}}\n <div class=\"small\">{{description}}</div>\n</ng-template>\n\n", styles: [":host{cursor:pointer}\n"], components: [{ type: i2$1.FsPopoverComponent, selector: "fs-popover" }] });
354
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FsAclPermissionPopoverComponent, decorators: [{
355
- type: Component,
356
- args: [{
357
- selector: 'acl-permission-popover',
358
- templateUrl: './acl-permission-popover.component.html',
359
- styleUrls: ['./acl-permission-popover.component.scss']
360
- }]
361
- }], ctorParameters: function () { return [{ type: FsAppAclService }]; }, propDecorators: { permission: [{
362
- type: Input
363
- }] } });
364
-
365
- class FsAclRolesComponent {
366
- constructor(_appAclService, _dialog) {
367
- this._appAclService = _appAclService;
368
- this._dialog = _dialog;
369
- this.aclLevels = [];
370
- this.list = new QueryList();
371
- this.indexedAclRoleLevels = {};
372
- this._destroy$ = new Subject();
373
- }
374
- ngOnInit() {
375
- new Observable(observer => {
376
- if (this.aclLevels.length) {
377
- observer.next(this.aclLevels);
378
- observer.complete();
379
- }
380
- else {
381
- this._appAclService.getLevels()
382
- .subscribe((aclLevels) => {
383
- observer.next(aclLevels);
384
- observer.complete();
385
- });
386
- }
387
- })
388
- .subscribe((aclLevels) => {
389
- this.aclLevels = aclLevels;
390
- this.indexedAclRoleLevels = list(this.aclLevels, 'name', 'value');
391
- this._loadListConfig();
392
- });
393
- }
394
- openDialog(aclRole = { id: null }) {
395
- this._dialog.open(FsAclRoleComponent, {
396
- width: '70%',
397
- data: {
398
- aclRole,
399
- aclLevels: this.aclLevels,
400
- loadAclRole: this.loadAclRole,
401
- saveAclRole: this.saveAclRole,
402
- loadRoleConfigs: this.loadRoleConfigs,
403
- disabled: this.disabledAclRole
404
- ? this.disabledAclRole(aclRole)
405
- : false,
406
- },
407
- })
408
- .afterClosed()
409
- .pipe(takeUntil(this._destroy$), filter((response) => !!response))
410
- .subscribe((response) => {
411
- this.list.forEach((list) => {
412
- list.reload();
413
- });
414
- });
415
- }
416
- ngOnDestroy() {
417
- this._destroy$.next();
418
- this._destroy$.complete();
419
- }
420
- _loadListConfig() {
421
- this.listConfig = {
422
- sort: { value: 'hierarchy' },
423
- filters: [
424
- {
425
- name: 'keyword',
426
- type: ItemType.Keyword,
427
- label: 'Search',
428
- },
429
- {
430
- name: 'level',
431
- label: 'Level',
432
- type: ItemType.Select,
433
- values: this.aclLevels,
434
- hide: this.aclLevels.length <= 1
435
- },
436
- {
437
- name: 'state',
438
- label: 'Show Deleted',
439
- type: ItemType.Checkbox,
440
- unchecked: 'active',
441
- checked: 'deleted',
442
- },
443
- ],
444
- actions: [
445
- {
446
- click: (event) => {
447
- this.openDialog();
448
- },
449
- label: 'Create',
450
- },
451
- ],
452
- rowActions: [
453
- {
454
- click: (data) => {
455
- return this.deleteAclRole(data);
456
- },
457
- remove: {
458
- title: 'Confirm',
459
- template: 'Are you sure you would like to delete this role?',
460
- },
461
- menu: true,
462
- label: 'Delete',
463
- show: (row) => {
464
- const hideDelete = !!this.disabledAclRole
465
- ? this.disabledAclRole(row)
466
- : false;
467
- return !!this.deleteAclRole
468
- && row.state !== 'deleted'
469
- && !hideDelete;
470
- },
471
- },
472
- {
473
- click: (data) => {
474
- return this.restoreAclRole(data)
475
- .pipe(tap(() => {
476
- this.list.forEach((l) => {
477
- l.reload();
478
- });
479
- }), takeUntil(this._destroy$))
480
- .subscribe();
481
- },
482
- label: 'Restore',
483
- show: (row) => !!this.restoreAclRole && row.state === 'deleted',
484
- },
485
- ],
486
- fetch: (query) => {
487
- query.permissions = true;
488
- return this.loadAclRoles(query)
489
- .pipe(map((data) => data));
490
- },
491
- };
492
- }
493
- }
494
- FsAclRolesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FsAclRolesComponent, deps: [{ token: FsAppAclService }, { token: i2.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
495
- FsAclRolesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: FsAclRolesComponent, selector: "fs-acl-roles", inputs: { deleteAclRole: "deleteAclRole", restoreAclRole: "restoreAclRole", saveAclRole: "saveAclRole", loadAclRoles: "loadAclRoles", loadAclRole: "loadAclRole", loadRoleConfigs: "loadRoleConfigs", aclLevels: "aclLevels", disabledAclRole: "disabledAclRole" }, viewQueries: [{ propertyName: "list", predicate: FsListComponent, descendants: true }], ngImport: i0, template: "<fs-list [config]=\"listConfig\" *ngIf=\"listConfig\">\n <fs-list-column title=\"Name\" name=\"name\" [sortable]=\"true\">\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.state !== 'deleted' else deletedRole\">\n <a (click)=\"openDialog(row)\">{{ row.name }}</a>\n </ng-container>\n <ng-template #deletedRole>\n {{ row.name }}\n </ng-template>\n <div class=\"small\">{{row.description}}</div>\n </ng-template>\n </fs-list-column>\n <fs-list-column name=\"hierarchy\" title=\"Level\" [sortable]=\"true\">\n <ng-template fs-list-cell let-row=\"row\">\n {{ indexedAclRoleLevels[row.level] }}\n </ng-template>\n </fs-list-column>\n <fs-list-column title=\"Permissions\">\n <ng-template fs-list-cell let-row=\"row\">\n <div class=\"permissions\">\n <ng-container *ngFor=\"let permission of row.permissions\">\n <span *ngIf=\"permission.access\" class=\"permission\">\n <acl-permission-popover [permission]=\"permission\">{{permission.name}}</acl-permission-popover>\n </span>\n </ng-container>\n </div>\n </ng-template>\n </fs-list-column>\n</fs-list>\n", styles: [".permissions .permission+.permission:before{content:\", \"}\n"], components: [{ type: i12.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { type: FsAclPermissionPopoverComponent, selector: "acl-permission-popover", inputs: ["permission"] }], directives: [{ type: i7$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i12.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customize", "sortable", "sortableDefault", "direction", "align", "width", "class"] }, { type: i12.FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }, { type: i7$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
496
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FsAclRolesComponent, decorators: [{
497
- type: Component,
498
- args: [{
499
- selector: 'fs-acl-roles',
500
- templateUrl: 'acl-roles.component.html',
501
- styleUrls: ['acl-roles.component.scss'],
502
- changeDetection: ChangeDetectionStrategy.OnPush,
503
- }]
504
- }], ctorParameters: function () { return [{ type: FsAppAclService }, { type: i2.MatDialog }]; }, propDecorators: { deleteAclRole: [{
505
- type: Input
506
- }], restoreAclRole: [{
507
- type: Input
508
- }], saveAclRole: [{
509
- type: Input
510
- }], loadAclRoles: [{
511
- type: Input
512
- }], loadAclRole: [{
513
- type: Input
514
- }], loadRoleConfigs: [{
515
- type: Input
516
- }], aclLevels: [{
517
- type: Input
518
- }], disabledAclRole: [{
519
- type: Input
520
- }], list: [{
521
- type: ViewChildren,
522
- args: [FsListComponent]
523
- }] } });
524
-
525
- class FsAclRolePopoverComponent {
526
- constructor(_appAclService) {
527
- this._appAclService = _appAclService;
528
- this.permissions = [];
529
- }
530
- ngOnInit() {
531
- const aclRolePermissions = this.aclRole.permissions || [];
532
- this._appAclService.getPermissions()
533
- .subscribe((response) => {
534
- this.permissions = response.filter(item => {
535
- return aclRolePermissions.some(permission => {
536
- return item.value === permission.value;
537
- });
538
- });
539
- });
540
- }
541
- }
542
- FsAclRolePopoverComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FsAclRolePopoverComponent, deps: [{ token: FsAppAclService }], target: i0.ɵɵFactoryTarget.Component });
543
- FsAclRolePopoverComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: FsAclRolePopoverComponent, selector: "fs-acl-role-popover", inputs: { aclRole: "aclRole", objectName: "objectName" }, ngImport: i0, template: "\n<fs-popover [template]=\"popover\" [maxWidth]=\"400\">\n <ng-content></ng-content>\n</fs-popover>\n\n<ng-template #popover>\n <div class=\"name small\">{{aclRole.name}}<span *ngIf=\"objectName\">: {{objectName}}</span></div>\n\n <ng-container *ngIf=\"permissions.length; else nonePermission\">\n <div *ngFor=\"let permission of permissions\" class=\"permission\">\n <div>{{permission.name}}</div>\n <div class=\"small\">{{permission.description}}</div>\n </div>\n </ng-container>\n\n <ng-template #nonePermission>\n None\n </ng-template>\n</ng-template>\n", styles: [".name{padding-bottom:10px}.permission+.permission{padding-top:5px}:host{cursor:pointer}\n"], components: [{ type: i2$1.FsPopoverComponent, selector: "fs-popover" }], directives: [{ type: i7$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
544
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FsAclRolePopoverComponent, decorators: [{
545
- type: Component,
546
- args: [{
547
- selector: 'fs-acl-role-popover',
548
- templateUrl: './acl-role-popover.component.html',
549
- styleUrls: ['./acl-role-popover.component.scss']
550
- }]
551
- }], ctorParameters: function () { return [{ type: FsAppAclService }]; }, propDecorators: { aclRole: [{
552
- type: Input
553
- }], objectName: [{
554
- type: Input
555
- }] } });
556
-
557
- class FsAclObjectRolesComponent {
558
- constructor() {
559
- this.aclRoles = [];
560
- this.required = false;
561
- this.multiple = false;
562
- this.disabled = false;
563
- this.aclObjectRoles = [];
564
- this.rolesLabel = 'Roles';
565
- this.levelLabel = '';
566
- this.change = new EventEmitter();
567
- this.compareAclRole = (o1, o2) => {
568
- return o1 && o2 && o1.id === o2.id;
569
- };
570
- }
571
- changed() {
572
- this.change.emit(this.aclObjectRoles);
573
- }
574
- }
575
- FsAclObjectRolesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FsAclObjectRolesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
576
- FsAclObjectRolesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: FsAclObjectRolesComponent, selector: "fs-acl-object-roles", inputs: { aclRoles: "aclRoles", required: "required", multiple: "multiple", disabled: "disabled", aclObjectRoles: "aclObjectRoles", rolesLabel: "rolesLabel", levelLabel: "levelLabel" }, outputs: { change: "change" }, ngImport: i0, template: "<ng-container *ngIf=\"!multiple\">\n <ng-container *ngFor=\"let aclObjectRole of aclObjectRoles\">\n <fs-checkbox-group\n [(ngModel)]=\"aclObjectRole.aclRoles\"\n (ngModelChange)=\"changed()\"\n name=\"roles\"\n [compareWith]=\"compareAclRole\"\n [disabled]=\"disabled\"\n [label]=\"rolesLabel\"\n [fsFormRequired]=\"required\"\n orientation=\"vertical\">\n <mat-checkbox [disabled]=\"disabled\" *ngFor=\"let aclRole of aclRoles\" [value]=\"$any(aclRole)\">\n {{ aclRole.name }}\n </mat-checkbox>\n </fs-checkbox-group>\n </ng-container>\n</ng-container>\n\n<ng-container *ngIf=\"multiple\">\n <table>\n <tr>\n <td>\n <small>{{levelLabel}}</small>\n </td>\n <td>\n <small>{{rolesLabel}}</small>\n </td>\n </tr>\n <tr *ngFor=\"let aclObjectRole of aclObjectRoles\">\n <td>{{aclObjectRole.object.name}}</td>\n <td>\n <mat-form-field class=\"form-field-padless\">\n <mat-select\n [(ngModel)]=\"aclObjectRole.aclRoles\"\n multiple=\"true\"\n [disabled]=\"disabled\"\n [compareWith]=\"compareAclRole\"\n (ngModelChange)=\"changed()\"\n name=\"aclRole_{{ aclObjectRole.object.id }}\">\n <mat-option *ngFor=\"let aclRole of aclRoles\" [value]=\"aclRole\">\n {{ aclRole.name }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </td>\n </tr>\n </table>\n</ng-container>\n", styles: ["table tr td:first-child{padding-right:15px}\n"], components: [{ type: i1.FsCheckboxGroupComponent, selector: "fs-checkbox-group", inputs: ["orientation", "position", "label", "disabled", "compareWith"], outputs: ["change"] }, { type: i9.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "id", "labelPosition", "name", "required", "checked", "disabled", "indeterminate", "aria-describedby", "value"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i10.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i11.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i7$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i15.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i15.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i16.FsFormRequiredDirective, selector: "[fsFormRequired],[ngModel][required]", inputs: ["fsFormRequired", "required", "fsFormRequiredMessage"] }, { type: i16.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] });
577
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FsAclObjectRolesComponent, decorators: [{
578
- type: Component,
579
- args: [{
580
- selector: 'fs-acl-object-roles',
581
- templateUrl: './acl-object-roles.component.html',
582
- styleUrls: ['./acl-object-roles.component.scss'],
583
- viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]
584
- }]
585
- }], propDecorators: { aclRoles: [{
586
- type: Input
587
- }], required: [{
588
- type: Input
589
- }], multiple: [{
590
- type: Input
591
- }], disabled: [{
592
- type: Input
593
- }], aclObjectRoles: [{
594
- type: Input
595
- }], rolesLabel: [{
596
- type: Input
597
- }], levelLabel: [{
598
- type: Input
599
- }], change: [{
600
- type: Output
601
- }] } });
602
-
603
- class FsAclEntryComponent {
604
- constructor(_appAclService, _dialogRef, _message, _data) {
605
- var _a;
606
- this._appAclService = _appAclService;
607
- this._dialogRef = _dialogRef;
608
- this._message = _message;
609
- this._data = _data;
610
- this.aclRoles = [];
611
- this.aclEntries = [];
612
- this.indexedAclRoleLevels = {};
613
- this.titleEdit = 'Edit Roles';
614
- this.titleAdd = 'Assign Roles';
615
- this.required = true;
616
- this.save = () => {
617
- const aclObjectEntry = Object.assign(Object.assign({}, this.aclObjectEntry), { aclEntries: this.aclEntries });
618
- return this._data.saveAclObjectEntry(aclObjectEntry)
619
- .pipe(tap((data) => {
620
- this._message.success('Saved Changes');
621
- this.close(data);
622
- }));
623
- };
624
- this.aclObjectEntry = Object.assign({}, _data.aclObjectEntry);
625
- this.required = (_a = _data.required) !== null && _a !== void 0 ? _a : true;
626
- if (_data.titleEdit) {
627
- this.titleEdit = _data.titleEdit;
628
- }
629
- if (_data.titleAdd) {
630
- this.titleAdd = _data.titleAdd;
631
- }
632
- }
633
- ngOnInit() {
634
- forkJoin(this._data.loadAclRoles({
635
- level: this.aclObjectEntry.level,
636
- environmentId: this.aclObjectEntry.environmentId || null,
637
- }), this._appAclService.getIndexedLevels())
638
- .subscribe(([aclRoles, levels,]) => {
639
- this.aclRoles = aclRoles;
640
- this.indexedAclRoleLevels = levels;
641
- this.aclObjectRole = {
642
- object: this.aclObjectEntry.object,
643
- aclRoles: this.aclObjectEntry.aclEntries
644
- .map((aclEntry) => {
645
- return aclEntry.aclRole;
646
- }),
647
- };
648
- });
649
- }
650
- aclObjectRoleChange(aclObjectRoles) {
651
- this.aclEntries = aclObjectRoles.reduce((aclEntries, aclObjectRole) => {
652
- aclObjectRole.aclRoles.forEach(aclRole => {
653
- aclEntries.push({
654
- aclRoleId: aclRole.id,
655
- aclRole: aclRole,
656
- objectId: aclObjectRole.object ? aclObjectRole.object.id : null,
657
- object: aclObjectRole.object || null
658
- });
659
- });
660
- return aclEntries;
661
- }, []);
662
- }
663
- close(data = null) {
664
- this._dialogRef.close(data);
665
- }
666
- }
667
- FsAclEntryComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FsAclEntryComponent, deps: [{ token: FsAppAclService }, { token: i2.MatDialogRef }, { token: i3.FsMessage }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
668
- FsAclEntryComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: FsAclEntryComponent, selector: "ng-component", ngImport: i0, template: "<form fsForm [submit]=\"save\">\n <fs-dialog>\n <div mat-dialog-title>{{ titleEdit? titleEdit : titleAdd }}</div>\n <mat-dialog-content>\n <div *ngIf=\"aclObjectRole\">\n <fs-label-field *ngIf=\"aclObjectEntry.object\">\n <fs-label>{{indexedAclRoleLevels[aclObjectEntry.level]}}</fs-label>\n {{aclObjectEntry.object.name}}\n </fs-label-field>\n\n <fs-acl-object-roles\n [aclRoles]=\"aclRoles\"\n [aclObjectRoles]=\"[aclObjectRole]\"\n [required]=\"required\"\n (change)=\"aclObjectRoleChange($event)\">\n </fs-acl-object-roles>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button mat-button type=\"submit\" color=\"primary\">Save</button>\n <button mat-button mat-dialog-close type=\"button\">Cancel</button>\n </mat-dialog-actions>\n </fs-dialog>\n</form>\n", styles: ["::ng-deep .account-roles-autocomplete-panel .mat-option{line-height:normal}::ng-deep .account-roles-autocomplete-panel .mat-option .mat-option-text{display:flex;flex-direction:row;align-items:center}::ng-deep .account-roles-autocomplete-panel .mat-option .mat-option-text fs-badge{margin-right:5px}\n"], components: [{ type: i4.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileActionPlacement", "mobileWidth", "mode"] }, { type: i6.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { type: i6.FsLabelComponent, selector: "fs-label" }, { type: FsAclObjectRolesComponent, selector: "fs-acl-object-roles", inputs: ["aclRoles", "required", "multiple", "disabled", "aclObjectRoles", "rolesLabel", "levelLabel"], outputs: ["change"] }, { type: i14.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i15.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i15.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i15.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i16.FsFormDirective, selector: "[fsForm]", inputs: ["wrapperSelector", "messageSelector", "hintSelector", "labelSelector", "autocomplete", "shortcuts", "confirm", "confirmDialog", "confirmDrawer", "confirmBrowser", "confirmTabs", "dirtySubmitButton", "submit", "successDelay", "errorDelay", "tabGroup", "deactivationGuard"], outputs: ["fsForm", "invalid", "valid", "submitted", "reseted", "cleared"] }, { type: i2.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i7$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i16.FsButtonDirective, selector: "[mat-raised-button],[mat-button],[mat-flat-button],[mat-stroked-button]", inputs: ["name", "dirtySubmit", "form"] }, { type: i2.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["type", "mat-dialog-close", "aria-label", "matDialogClose"], exportAs: ["matDialogClose"] }] });
669
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FsAclEntryComponent, decorators: [{
670
- type: Component,
671
- args: [{
672
- templateUrl: './acl-entry.component.html',
673
- styleUrls: ['./acl-entry.component.scss'],
674
- }]
675
- }], ctorParameters: function () { return [{ type: FsAppAclService }, { type: i2.MatDialogRef }, { type: i3.FsMessage }, { type: undefined, decorators: [{
676
- type: Inject,
677
- args: [MAT_DIALOG_DATA]
678
- }] }]; } });
679
-
680
- class FsAclEntriesComponent {
681
- constructor(_appAclService, _dialog, _confirm) {
682
- this._appAclService = _appAclService;
683
- this._dialog = _dialog;
684
- this._confirm = _confirm;
685
- this.environmentShow = true;
686
- this.environmentLabel = 'Environment';
687
- this.environmentKey = 'environment';
688
- this.actions = [];
689
- this.aclEntriesList = null;
690
- this.aclEntriesConfig = null;
691
- this.permissions = [];
692
- this._destroy$ = new Subject();
693
- }
694
- ngOnInit() {
695
- this._appAclService.getPermissions()
696
- .subscribe(response => {
697
- this.permissions = response;
698
- });
699
- this.aclEntriesConfig = {
700
- status: false,
701
- paging: false,
702
- actions: this.actions,
703
- rowActions: [
704
- {
705
- label: 'Remove All Roles',
706
- click: (aclObjectEntry) => {
707
- this._confirm
708
- .confirm({
709
- title: 'Remove All Roles',
710
- commitLabel: 'Save',
711
- template: `Please note that removing roles may prevent users from being able to successfully login.<br>
712
- These changes are effective immediately.<br>
713
- Are you sure you would like to continue?`,
714
- }).subscribe(() => {
715
- const data = Object.assign(Object.assign({}, aclObjectEntry), { aclEntries: [] });
716
- this.saveAclObjectEntry(data)
717
- .subscribe(() => {
718
- this.aclEntriesList.reload();
719
- });
720
- });
721
- }
722
- }
723
- ],
724
- fetch: () => {
725
- return new Observable((observer) => {
726
- this.loadAclEntries({
727
- aclRoles: true,
728
- aclRolePermissions: true,
729
- objects: true,
730
- aclRoleState: 'active',
731
- })
732
- .subscribe((aclEntries) => {
733
- const objects = aclEntries
734
- .filter((aclEntry) => (!!aclEntry.object))
735
- .reduce((items, item) => {
736
- return Object.assign(Object.assign({}, items), { [item.object.id]: item.object });
737
- }, {});
738
- const environments = aclEntries
739
- .filter((aclEntry) => (!!aclEntry[this.environmentKey]))
740
- .reduce((items, item) => {
741
- const environment = item[this.environmentKey];
742
- return Object.assign(Object.assign({}, items), { [environment.id]: environment });
743
- }, {});
744
- const groupedAclEntries = groupBy(aclEntries, (item) => {
745
- var _a;
746
- const environmentId = (_a = (item[this.environmentKey])) === null || _a === void 0 ? void 0 : _a.id;
747
- return [item.aclRole.level, environmentId, item.objectId];
748
- });
749
- let aclObjectEntries = Object.keys(groupedAclEntries)
750
- .reduce((accum, key) => {
751
- const parts = key.split(',');
752
- return [
753
- ...accum,
754
- {
755
- object: objects[parts[2]],
756
- level: parts[0],
757
- [`${this.environmentKey}Id`]: parts[1] ? parseInt(parts[1]) : null,
758
- [this.environmentKey]: environments[parts[1]],
759
- aclEntries: groupedAclEntries[key],
760
- }
761
- ];
762
- }, []);
763
- const hasApp = aclObjectEntries.some((item) => {
764
- return item.aclEntries.some((entry) => {
765
- return !entry.objectId;
766
- });
767
- });
768
- if (!hasApp) {
769
- aclObjectEntries.unshift({
770
- object: null,
771
- aclEntries: [],
772
- level: 'app',
773
- environmentId: null,
774
- });
775
- }
776
- aclObjectEntries = sortBy(aclObjectEntries, (item) => {
777
- return item.object ? item.level : '';
778
- });
779
- observer.next({ data: aclObjectEntries });
780
- observer.complete();
781
- });
782
- });
783
- },
784
- };
785
- }
786
- update(aclObjectEntry) {
787
- const data = {
788
- aclObjectEntry,
789
- required: false,
790
- loadAclRoles: this.loadAclRoles,
791
- saveAclObjectEntry: this.saveAclObjectEntry
792
- };
793
- this._dialog.open(FsAclEntryComponent, {
794
- data: data
795
- })
796
- .afterClosed()
797
- .pipe(takeUntil(this._destroy$))
798
- .subscribe(() => {
799
- this.aclEntriesList.reload();
800
- });
801
- }
802
- ngOnDestroy() {
803
- this._destroy$.next();
804
- this._destroy$.complete();
805
- }
806
- reload() {
807
- this.aclEntriesList.reload();
808
- }
809
- }
810
- FsAclEntriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FsAclEntriesComponent, deps: [{ token: FsAppAclService }, { token: i2.MatDialog }, { token: i3$1.FsPrompt }], target: i0.ɵɵFactoryTarget.Component });
811
- FsAclEntriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: FsAclEntriesComponent, selector: "fs-acl-entries", inputs: { loadAclEntries: "loadAclEntries", loadAclRoles: "loadAclRoles", saveAclObjectEntry: "saveAclObjectEntry", environmentShow: "environmentShow", environmentLabel: "environmentLabel", environmentKey: "environmentKey", actions: "actions" }, viewQueries: [{ propertyName: "aclEntriesList", first: true, predicate: FsListComponent, descendants: true }], ngImport: i0, template: "\n<fs-list [config]=\"aclEntriesConfig\">\n <fs-list-column>\n <ng-template fs-list-header>Context</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <div\n *ngIf=\"row.object; else elseObject\"\n class=\"fs-row.gap-small\">\n <fs-badge *ngIf=\"row.object.imageUrl\" shape=\"circle\" image=\"{{ row.object.imageUrl }}\"></fs-badge>\n <span>\n <div><small>{{ row.object.className }}</small></div>\n <a (click)=\"update(row)\">{{ row.object.name }}</a>\n </span>\n </div>\n\n <ng-template #elseObject>\n <a (click)=\"update(row)\">App</a>\n </ng-template>\n </ng-template>\n </fs-list-column>\n\n <fs-list-column [show]=\"environmentShow\">\n <ng-template fs-list-header>{{environmentLabel}}</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n {{row.environment?.name}}\n </ng-template>\n </fs-list-column>\n\n <fs-list-column>\n <ng-template fs-list-header>Roles</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <div class=\"fs-column\">\n <div div *ngFor=\"let aclEntry of row.aclEntries\">\n <ng-container [ngSwitch]=\"row.level\">\n <ng-container *ngSwitchCase=\"'app'\">\n <fs-acl-role-popover [aclRole]=\"aclEntry.aclRole\" objectName=\"App\">{{aclEntry.aclRole.name}}</fs-acl-role-popover>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"row.object\">\n <fs-acl-role-popover [aclRole]=\"aclEntry.aclRole\">{{aclEntry.aclRole.name}}</fs-acl-role-popover>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </ng-template>\n </fs-list-column>\n</fs-list>\n", styles: [""], components: [{ type: i12.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { type: i5$1.FsBadgeComponent, selector: "fs-badge", inputs: ["color", "text", "tooltip", "size", "shape", "image", "icon", "iconSize", "iconColor", "backgroundSize"] }, { type: FsAclRolePopoverComponent, selector: "fs-acl-role-popover", inputs: ["aclRole", "objectName"] }], directives: [{ type: i12.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customize", "sortable", "sortableDefault", "direction", "align", "width", "class"] }, { type: i12.FsListHeaderDirective, selector: "[fs-list-header]", inputs: ["colspan", "align", "class"] }, { type: i12.FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }, { type: i7$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i7$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i7$1.NgSwitchDefault, selector: "[ngSwitchDefault]" }] });
812
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FsAclEntriesComponent, decorators: [{
813
- type: Component,
814
- args: [{
815
- selector: 'fs-acl-entries',
816
- templateUrl: './acl-entries.component.html',
817
- styleUrls: ['./acl-entries.component.scss']
818
- }]
819
- }], ctorParameters: function () { return [{ type: FsAppAclService }, { type: i2.MatDialog }, { type: i3$1.FsPrompt }]; }, propDecorators: { loadAclEntries: [{
820
- type: Input
821
- }], loadAclRoles: [{
822
- type: Input
823
- }], saveAclObjectEntry: [{
824
- type: Input
825
- }], environmentShow: [{
826
- type: Input
827
- }], environmentLabel: [{
828
- type: Input
829
- }], environmentKey: [{
830
- type: Input
831
- }], actions: [{
832
- type: Input
833
- }], aclEntriesList: [{
834
- type: ViewChild,
835
- args: [FsListComponent]
836
- }] } });
837
-
838
- class FsAppAclModule {
839
- }
840
- FsAppAclModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FsAppAclModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
841
- FsAppAclModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FsAppAclModule, declarations: [FsAclRolesComponent,
842
- FsAclPermissionPopoverComponent,
843
- FsAclRoleComponent,
844
- FsAclEntriesComponent,
845
- FsAclRolePopoverComponent,
846
- FsAclObjectRolesComponent,
847
- FsAclEntryComponent,
848
- BulkOptionsFilterPipe], imports: [CommonModule,
849
- FormsModule,
850
- MatDialogModule,
851
- MatFormFieldModule,
852
- MatCheckboxModule,
853
- MatSelectModule,
854
- MatButtonModule,
855
- MatRadioModule,
856
- MatInputModule,
857
- FsListModule,
858
- FsPopoverModule,
859
- FsDialogModule,
860
- FsFormModule,
861
- FsLabelModule,
862
- FsRadioGroupModule,
863
- FsBadgeModule,
864
- FsCheckboxGroupModule,
865
- FsMenuModule], exports: [FsAclRolesComponent,
866
- FsAclPermissionPopoverComponent,
867
- FsAclRoleComponent,
868
- FsAclEntriesComponent,
869
- FsAclRolePopoverComponent,
870
- FsAclObjectRolesComponent,
871
- FsAclEntryComponent] });
872
- FsAppAclModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FsAppAclModule, imports: [[
873
- CommonModule,
874
- FormsModule,
875
- MatDialogModule,
876
- MatFormFieldModule,
877
- MatCheckboxModule,
878
- MatSelectModule,
879
- MatButtonModule,
880
- MatRadioModule,
881
- MatInputModule,
882
- FsListModule,
883
- FsPopoverModule,
884
- FsDialogModule,
885
- FsFormModule,
886
- FsLabelModule,
887
- FsRadioGroupModule,
888
- FsBadgeModule,
889
- FsCheckboxGroupModule,
890
- FsMenuModule,
891
- ]] });
892
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FsAppAclModule, decorators: [{
893
- type: NgModule,
894
- args: [{
895
- imports: [
896
- CommonModule,
897
- FormsModule,
898
- MatDialogModule,
899
- MatFormFieldModule,
900
- MatCheckboxModule,
901
- MatSelectModule,
902
- MatButtonModule,
903
- MatRadioModule,
904
- MatInputModule,
905
- FsListModule,
906
- FsPopoverModule,
907
- FsDialogModule,
908
- FsFormModule,
909
- FsLabelModule,
910
- FsRadioGroupModule,
911
- FsBadgeModule,
912
- FsCheckboxGroupModule,
913
- FsMenuModule,
914
- ],
915
- declarations: [
916
- FsAclRolesComponent,
917
- FsAclPermissionPopoverComponent,
918
- FsAclRoleComponent,
919
- FsAclEntriesComponent,
920
- FsAclRolePopoverComponent,
921
- FsAclObjectRolesComponent,
922
- FsAclEntryComponent,
923
- BulkOptionsFilterPipe,
924
- ],
925
- exports: [
926
- FsAclRolesComponent,
927
- FsAclPermissionPopoverComponent,
928
- FsAclRoleComponent,
929
- FsAclEntriesComponent,
930
- FsAclRolePopoverComponent,
931
- FsAclObjectRolesComponent,
932
- FsAclEntryComponent,
933
- ],
934
- }]
935
- }] });
936
-
937
- /**
938
- * Generated bundle index. Do not edit.
939
- */
940
-
941
- export { FS_APP_ACL_CONFIG, FsAclEntriesComponent, FsAclEntryComponent, FsAclObjectRolesComponent, FsAclPermissionPopoverComponent, FsAclRoleComponent, FsAclRolePopoverComponent, FsAclRolesComponent, FsAppAclModule, FsAppAclService };
942
- //# sourceMappingURL=firestitch-app-acl.js.map