@firestitch/app-acl 12.3.6 → 12.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/components/acl-entries/acl-entries.component.d.ts +33 -33
- package/app/components/acl-entry/acl-entry.component.d.ts +31 -31
- package/app/components/acl-object-roles/acl-object-roles.component.d.ts +18 -18
- package/app/components/acl-permission-popover/acl-permission-popover.component.d.ts +12 -12
- package/app/components/acl-role/acl-role.component.d.ts +46 -46
- package/app/components/acl-role-popover/acl-role-popover.component.d.ts +13 -13
- package/app/components/acl-roles/acl-roles.component.d.ts +35 -35
- package/app/consts/acl-role-accesses.d.ts +5 -5
- package/app/enums/acl-role-access.d.ts +6 -6
- package/app/fs-app-acl.module.d.ts +31 -31
- package/app/injectors/app-acl-config.injector.d.ts +2 -2
- package/app/interfaces/acl-entry-data.d.ts +11 -11
- package/app/interfaces/acl-entry.d.ts +18 -18
- package/app/interfaces/acl-level.d.ts +3 -3
- package/app/interfaces/acl-object-entry.d.ts +11 -11
- package/app/interfaces/acl-object-role.d.ts +6 -6
- package/app/interfaces/acl-object.d.ts +4 -4
- package/app/interfaces/acl-permission.d.ts +7 -7
- package/app/interfaces/acl-role.d.ts +15 -15
- package/app/interfaces/app-acl-config.d.ts +7 -7
- package/app/interfaces/name-value.d.ts +4 -4
- package/app/services/app-acl.service.d.ts +16 -16
- package/bundles/firestitch-app-acl.umd.js +1137 -1134
- package/bundles/firestitch-app-acl.umd.js.map +1 -1
- package/esm2015/app/components/acl-entries/acl-entries.component.js +172 -172
- package/esm2015/app/components/acl-entry/acl-entry.component.js +89 -89
- package/esm2015/app/components/acl-object-roles/acl-object-roles.component.js +56 -56
- package/esm2015/app/components/acl-permission-popover/acl-permission-popover.component.js +32 -32
- package/esm2015/app/components/acl-role/acl-role.component.js +200 -200
- package/esm2015/app/components/acl-role-popover/acl-role-popover.component.js +37 -37
- package/esm2015/app/components/acl-roles/acl-roles.component.js +149 -146
- package/esm2015/app/consts/acl-role-accesses.js +7 -7
- package/esm2015/app/enums/acl-role-access.js +7 -7
- package/esm2015/app/fs-app-acl.module.js +123 -123
- package/esm2015/app/injectors/app-acl-config.injector.js +2 -2
- package/esm2015/app/interfaces/acl-entry-data.js +1 -1
- package/esm2015/app/interfaces/acl-entry.js +1 -1
- package/esm2015/app/interfaces/acl-level.js +1 -1
- package/esm2015/app/interfaces/acl-object-entry.js +1 -1
- package/esm2015/app/interfaces/acl-object-role.js +1 -1
- package/esm2015/app/interfaces/acl-object.js +1 -1
- package/esm2015/app/interfaces/acl-permission.js +1 -1
- package/esm2015/app/interfaces/acl-role.js +1 -1
- package/esm2015/app/interfaces/app-acl-config.js +1 -1
- package/esm2015/app/interfaces/name-value.js +1 -1
- package/esm2015/app/services/app-acl.service.js +50 -50
- package/esm2015/firestitch-app-acl.js +4 -4
- package/esm2015/public_api.js +10 -10
- package/fesm2015/firestitch-app-acl.js +779 -776
- package/fesm2015/firestitch-app-acl.js.map +1 -1
- package/firestitch-app-acl.d.ts +5 -5
- package/package.json +1 -1
- package/public_api.d.ts +20 -20
|
@@ -1,173 +1,173 @@
|
|
|
1
|
-
import { takeUntil } from 'rxjs/operators';
|
|
2
|
-
import { Component, ViewChild, Input } from '@angular/core';
|
|
3
|
-
import { MatDialog } from '@angular/material/dialog';
|
|
4
|
-
import { Subject, Observable } from 'rxjs';
|
|
5
|
-
import { sortBy, groupBy } from 'lodash-es';
|
|
6
|
-
import { FsListComponent } from '@firestitch/list';
|
|
7
|
-
import { FsPrompt } from '@firestitch/prompt';
|
|
8
|
-
import { FsAppAclService } from '../../services/app-acl.service';
|
|
9
|
-
import { FsAclEntryComponent } from '../acl-entry/acl-entry.component';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "../../services/app-acl.service";
|
|
12
|
-
import * as i2 from "@angular/material/dialog";
|
|
13
|
-
import * as i3 from "@firestitch/prompt";
|
|
14
|
-
import * as i4 from "@firestitch/list";
|
|
15
|
-
import * as i5 from "@firestitch/badge";
|
|
16
|
-
import * as i6 from "../acl-role-popover/acl-role-popover.component";
|
|
17
|
-
import * as i7 from "@angular/common";
|
|
18
|
-
import * as i8 from "@angular/flex-layout/flex";
|
|
19
|
-
export class FsAclEntriesComponent {
|
|
20
|
-
constructor(_appAclService, _dialog, _confirm) {
|
|
21
|
-
this._appAclService = _appAclService;
|
|
22
|
-
this._dialog = _dialog;
|
|
23
|
-
this._confirm = _confirm;
|
|
24
|
-
this.environmentShow = true;
|
|
25
|
-
this.environmentLabel = 'Environment';
|
|
26
|
-
this.environmentKey = 'environment';
|
|
27
|
-
this.actions = [];
|
|
28
|
-
this.aclEntriesList = null;
|
|
29
|
-
this.aclEntriesConfig = null;
|
|
30
|
-
this.permissions = [];
|
|
31
|
-
this._destroy$ = new Subject();
|
|
32
|
-
}
|
|
33
|
-
ngOnInit() {
|
|
34
|
-
this._appAclService.getPermissions()
|
|
35
|
-
.subscribe(response => {
|
|
36
|
-
this.permissions = response;
|
|
37
|
-
});
|
|
38
|
-
this.aclEntriesConfig = {
|
|
39
|
-
status: false,
|
|
40
|
-
paging: false,
|
|
41
|
-
actions: this.actions,
|
|
42
|
-
rowActions: [
|
|
43
|
-
{
|
|
44
|
-
label: 'Remove All Roles',
|
|
45
|
-
click: (aclObjectEntry) => {
|
|
46
|
-
this._confirm
|
|
47
|
-
.confirm({
|
|
48
|
-
title: 'Remove All Roles',
|
|
49
|
-
template: 'Are you sure you would like to remove all roles?',
|
|
50
|
-
}).subscribe(() => {
|
|
51
|
-
const data = Object.assign(Object.assign({}, aclObjectEntry), { aclEntries: [] });
|
|
52
|
-
this.saveAclObjectEntry(data)
|
|
53
|
-
.subscribe(() => {
|
|
54
|
-
this.aclEntriesList.reload();
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
],
|
|
60
|
-
fetch: () => {
|
|
61
|
-
return new Observable((observer) => {
|
|
62
|
-
this.loadAclEntries({
|
|
63
|
-
aclRoles: true,
|
|
64
|
-
aclRolePermissions: true,
|
|
65
|
-
objects: true,
|
|
66
|
-
aclRoleState: 'active',
|
|
67
|
-
})
|
|
68
|
-
.subscribe((aclEntries) => {
|
|
69
|
-
const objects = aclEntries
|
|
70
|
-
.filter((aclEntry) => (!!aclEntry.object))
|
|
71
|
-
.reduce((items, item) => {
|
|
72
|
-
return Object.assign(Object.assign({}, items), { [item.object.id]: item.object });
|
|
73
|
-
}, {});
|
|
74
|
-
const environments = aclEntries
|
|
75
|
-
.filter((aclEntry) => (!!aclEntry[this.environmentKey]))
|
|
76
|
-
.reduce((items, item) => {
|
|
77
|
-
const environment = item[this.environmentKey];
|
|
78
|
-
return Object.assign(Object.assign({}, items), { [environment.id]: environment });
|
|
79
|
-
}, {});
|
|
80
|
-
const groupedAclEntries = groupBy(aclEntries, (item) => {
|
|
81
|
-
var _a;
|
|
82
|
-
const environmentId = (_a = (item[this.environmentKey])) === null || _a === void 0 ? void 0 : _a.id;
|
|
83
|
-
return [item.aclRole.level, environmentId, item.objectId];
|
|
84
|
-
});
|
|
85
|
-
let aclObjectEntries = Object.keys(groupedAclEntries)
|
|
86
|
-
.reduce((accum, key) => {
|
|
87
|
-
const parts = key.split(',');
|
|
88
|
-
return [
|
|
89
|
-
...accum,
|
|
90
|
-
{
|
|
91
|
-
object: objects[parts[2]],
|
|
92
|
-
level: parts[0],
|
|
93
|
-
[`${this.environmentKey}Id`]: parts[1] ? parseInt(parts[1]) : null,
|
|
94
|
-
[this.environmentKey]: environments[parts[1]],
|
|
95
|
-
aclEntries: groupedAclEntries[key],
|
|
96
|
-
}
|
|
97
|
-
];
|
|
98
|
-
}, []);
|
|
99
|
-
const hasApp = aclObjectEntries.some((item) => {
|
|
100
|
-
return item.aclEntries.some((entry) => {
|
|
101
|
-
return !entry.objectId;
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
if (!hasApp) {
|
|
105
|
-
aclObjectEntries.unshift({
|
|
106
|
-
object: null,
|
|
107
|
-
aclEntries: [],
|
|
108
|
-
level: 'app',
|
|
109
|
-
environmentId: null,
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
aclObjectEntries = sortBy(aclObjectEntries, (item) => {
|
|
113
|
-
return item.object ? item.level : '';
|
|
114
|
-
});
|
|
115
|
-
observer.next({ data: aclObjectEntries });
|
|
116
|
-
observer.complete();
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
},
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
update(aclObjectEntry) {
|
|
123
|
-
const data = {
|
|
124
|
-
aclObjectEntry,
|
|
125
|
-
required: false,
|
|
126
|
-
loadAclRoles: this.loadAclRoles,
|
|
127
|
-
saveAclObjectEntry: this.saveAclObjectEntry
|
|
128
|
-
};
|
|
129
|
-
this._dialog.open(FsAclEntryComponent, {
|
|
130
|
-
data: data
|
|
131
|
-
})
|
|
132
|
-
.afterClosed()
|
|
133
|
-
.pipe(takeUntil(this._destroy$))
|
|
134
|
-
.subscribe(() => {
|
|
135
|
-
this.aclEntriesList.reload();
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
ngOnDestroy() {
|
|
139
|
-
this._destroy$.next();
|
|
140
|
-
this._destroy$.complete();
|
|
141
|
-
}
|
|
142
|
-
reload() {
|
|
143
|
-
this.aclEntriesList.reload();
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
FsAclEntriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsAclEntriesComponent, deps: [{ token: i1.FsAppAclService }, { token: i2.MatDialog }, { token: i3.FsPrompt }], target: i0.ɵɵFactoryTarget.Component });
|
|
147
|
-
FsAclEntriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", 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 fxLayout=\"row\"\n fxLayoutAlign=\"start center\"\n fxLayoutGap=\"10px\">\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 fxLayout=\"column\" fxLayoutGap=\"10px\">\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: i4.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { type: i5.FsBadgeComponent, selector: "fs-badge", inputs: ["color", "text", "tooltip", "size", "shape", "image", "icon", "iconSize", "iconColor", "backgroundSize"] }, { type: i6.FsAclRolePopoverComponent, selector: "fs-acl-role-popover", inputs: ["aclRole", "objectName"] }], directives: [{ type: i4.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customize", "sortable", "sortableDefault", "direction", "align", "width", "class"] }, { type: i4.FsListHeaderDirective, selector: "[fs-list-header]", inputs: ["colspan", "align", "class"] }, { type: i4.FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i8.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i8.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i7.NgSwitchDefault, selector: "[ngSwitchDefault]" }] });
|
|
148
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsAclEntriesComponent, decorators: [{
|
|
149
|
-
type: Component,
|
|
150
|
-
args: [{
|
|
151
|
-
selector: 'fs-acl-entries',
|
|
152
|
-
templateUrl: './acl-entries.component.html',
|
|
153
|
-
styleUrls: ['./acl-entries.component.scss']
|
|
154
|
-
}]
|
|
155
|
-
}], ctorParameters: function () { return [{ type: i1.FsAppAclService }, { type: i2.MatDialog }, { type: i3.FsPrompt }]; }, propDecorators: { loadAclEntries: [{
|
|
156
|
-
type: Input
|
|
157
|
-
}], loadAclRoles: [{
|
|
158
|
-
type: Input
|
|
159
|
-
}], saveAclObjectEntry: [{
|
|
160
|
-
type: Input
|
|
161
|
-
}], environmentShow: [{
|
|
162
|
-
type: Input
|
|
163
|
-
}], environmentLabel: [{
|
|
164
|
-
type: Input
|
|
165
|
-
}], environmentKey: [{
|
|
166
|
-
type: Input
|
|
167
|
-
}], actions: [{
|
|
168
|
-
type: Input
|
|
169
|
-
}], aclEntriesList: [{
|
|
170
|
-
type: ViewChild,
|
|
171
|
-
args: [FsListComponent]
|
|
172
|
-
}] } });
|
|
1
|
+
import { takeUntil } from 'rxjs/operators';
|
|
2
|
+
import { Component, ViewChild, Input } from '@angular/core';
|
|
3
|
+
import { MatDialog } from '@angular/material/dialog';
|
|
4
|
+
import { Subject, Observable } from 'rxjs';
|
|
5
|
+
import { sortBy, groupBy } from 'lodash-es';
|
|
6
|
+
import { FsListComponent } from '@firestitch/list';
|
|
7
|
+
import { FsPrompt } from '@firestitch/prompt';
|
|
8
|
+
import { FsAppAclService } from '../../services/app-acl.service';
|
|
9
|
+
import { FsAclEntryComponent } from '../acl-entry/acl-entry.component';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "../../services/app-acl.service";
|
|
12
|
+
import * as i2 from "@angular/material/dialog";
|
|
13
|
+
import * as i3 from "@firestitch/prompt";
|
|
14
|
+
import * as i4 from "@firestitch/list";
|
|
15
|
+
import * as i5 from "@firestitch/badge";
|
|
16
|
+
import * as i6 from "../acl-role-popover/acl-role-popover.component";
|
|
17
|
+
import * as i7 from "@angular/common";
|
|
18
|
+
import * as i8 from "@angular/flex-layout/flex";
|
|
19
|
+
export class FsAclEntriesComponent {
|
|
20
|
+
constructor(_appAclService, _dialog, _confirm) {
|
|
21
|
+
this._appAclService = _appAclService;
|
|
22
|
+
this._dialog = _dialog;
|
|
23
|
+
this._confirm = _confirm;
|
|
24
|
+
this.environmentShow = true;
|
|
25
|
+
this.environmentLabel = 'Environment';
|
|
26
|
+
this.environmentKey = 'environment';
|
|
27
|
+
this.actions = [];
|
|
28
|
+
this.aclEntriesList = null;
|
|
29
|
+
this.aclEntriesConfig = null;
|
|
30
|
+
this.permissions = [];
|
|
31
|
+
this._destroy$ = new Subject();
|
|
32
|
+
}
|
|
33
|
+
ngOnInit() {
|
|
34
|
+
this._appAclService.getPermissions()
|
|
35
|
+
.subscribe(response => {
|
|
36
|
+
this.permissions = response;
|
|
37
|
+
});
|
|
38
|
+
this.aclEntriesConfig = {
|
|
39
|
+
status: false,
|
|
40
|
+
paging: false,
|
|
41
|
+
actions: this.actions,
|
|
42
|
+
rowActions: [
|
|
43
|
+
{
|
|
44
|
+
label: 'Remove All Roles',
|
|
45
|
+
click: (aclObjectEntry) => {
|
|
46
|
+
this._confirm
|
|
47
|
+
.confirm({
|
|
48
|
+
title: 'Remove All Roles',
|
|
49
|
+
template: 'Are you sure you would like to remove all roles?',
|
|
50
|
+
}).subscribe(() => {
|
|
51
|
+
const data = Object.assign(Object.assign({}, aclObjectEntry), { aclEntries: [] });
|
|
52
|
+
this.saveAclObjectEntry(data)
|
|
53
|
+
.subscribe(() => {
|
|
54
|
+
this.aclEntriesList.reload();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
fetch: () => {
|
|
61
|
+
return new Observable((observer) => {
|
|
62
|
+
this.loadAclEntries({
|
|
63
|
+
aclRoles: true,
|
|
64
|
+
aclRolePermissions: true,
|
|
65
|
+
objects: true,
|
|
66
|
+
aclRoleState: 'active',
|
|
67
|
+
})
|
|
68
|
+
.subscribe((aclEntries) => {
|
|
69
|
+
const objects = aclEntries
|
|
70
|
+
.filter((aclEntry) => (!!aclEntry.object))
|
|
71
|
+
.reduce((items, item) => {
|
|
72
|
+
return Object.assign(Object.assign({}, items), { [item.object.id]: item.object });
|
|
73
|
+
}, {});
|
|
74
|
+
const environments = aclEntries
|
|
75
|
+
.filter((aclEntry) => (!!aclEntry[this.environmentKey]))
|
|
76
|
+
.reduce((items, item) => {
|
|
77
|
+
const environment = item[this.environmentKey];
|
|
78
|
+
return Object.assign(Object.assign({}, items), { [environment.id]: environment });
|
|
79
|
+
}, {});
|
|
80
|
+
const groupedAclEntries = groupBy(aclEntries, (item) => {
|
|
81
|
+
var _a;
|
|
82
|
+
const environmentId = (_a = (item[this.environmentKey])) === null || _a === void 0 ? void 0 : _a.id;
|
|
83
|
+
return [item.aclRole.level, environmentId, item.objectId];
|
|
84
|
+
});
|
|
85
|
+
let aclObjectEntries = Object.keys(groupedAclEntries)
|
|
86
|
+
.reduce((accum, key) => {
|
|
87
|
+
const parts = key.split(',');
|
|
88
|
+
return [
|
|
89
|
+
...accum,
|
|
90
|
+
{
|
|
91
|
+
object: objects[parts[2]],
|
|
92
|
+
level: parts[0],
|
|
93
|
+
[`${this.environmentKey}Id`]: parts[1] ? parseInt(parts[1]) : null,
|
|
94
|
+
[this.environmentKey]: environments[parts[1]],
|
|
95
|
+
aclEntries: groupedAclEntries[key],
|
|
96
|
+
}
|
|
97
|
+
];
|
|
98
|
+
}, []);
|
|
99
|
+
const hasApp = aclObjectEntries.some((item) => {
|
|
100
|
+
return item.aclEntries.some((entry) => {
|
|
101
|
+
return !entry.objectId;
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
if (!hasApp) {
|
|
105
|
+
aclObjectEntries.unshift({
|
|
106
|
+
object: null,
|
|
107
|
+
aclEntries: [],
|
|
108
|
+
level: 'app',
|
|
109
|
+
environmentId: null,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
aclObjectEntries = sortBy(aclObjectEntries, (item) => {
|
|
113
|
+
return item.object ? item.level : '';
|
|
114
|
+
});
|
|
115
|
+
observer.next({ data: aclObjectEntries });
|
|
116
|
+
observer.complete();
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
update(aclObjectEntry) {
|
|
123
|
+
const data = {
|
|
124
|
+
aclObjectEntry,
|
|
125
|
+
required: false,
|
|
126
|
+
loadAclRoles: this.loadAclRoles,
|
|
127
|
+
saveAclObjectEntry: this.saveAclObjectEntry
|
|
128
|
+
};
|
|
129
|
+
this._dialog.open(FsAclEntryComponent, {
|
|
130
|
+
data: data
|
|
131
|
+
})
|
|
132
|
+
.afterClosed()
|
|
133
|
+
.pipe(takeUntil(this._destroy$))
|
|
134
|
+
.subscribe(() => {
|
|
135
|
+
this.aclEntriesList.reload();
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
ngOnDestroy() {
|
|
139
|
+
this._destroy$.next();
|
|
140
|
+
this._destroy$.complete();
|
|
141
|
+
}
|
|
142
|
+
reload() {
|
|
143
|
+
this.aclEntriesList.reload();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
FsAclEntriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsAclEntriesComponent, deps: [{ token: i1.FsAppAclService }, { token: i2.MatDialog }, { token: i3.FsPrompt }], target: i0.ɵɵFactoryTarget.Component });
|
|
147
|
+
FsAclEntriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", 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 fxLayout=\"row\"\n fxLayoutAlign=\"start center\"\n fxLayoutGap=\"10px\">\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 fxLayout=\"column\" fxLayoutGap=\"10px\">\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: i4.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { type: i5.FsBadgeComponent, selector: "fs-badge", inputs: ["color", "text", "tooltip", "size", "shape", "image", "icon", "iconSize", "iconColor", "backgroundSize"] }, { type: i6.FsAclRolePopoverComponent, selector: "fs-acl-role-popover", inputs: ["aclRole", "objectName"] }], directives: [{ type: i4.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customize", "sortable", "sortableDefault", "direction", "align", "width", "class"] }, { type: i4.FsListHeaderDirective, selector: "[fs-list-header]", inputs: ["colspan", "align", "class"] }, { type: i4.FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i8.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i8.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i7.NgSwitchDefault, selector: "[ngSwitchDefault]" }] });
|
|
148
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsAclEntriesComponent, decorators: [{
|
|
149
|
+
type: Component,
|
|
150
|
+
args: [{
|
|
151
|
+
selector: 'fs-acl-entries',
|
|
152
|
+
templateUrl: './acl-entries.component.html',
|
|
153
|
+
styleUrls: ['./acl-entries.component.scss']
|
|
154
|
+
}]
|
|
155
|
+
}], ctorParameters: function () { return [{ type: i1.FsAppAclService }, { type: i2.MatDialog }, { type: i3.FsPrompt }]; }, propDecorators: { loadAclEntries: [{
|
|
156
|
+
type: Input
|
|
157
|
+
}], loadAclRoles: [{
|
|
158
|
+
type: Input
|
|
159
|
+
}], saveAclObjectEntry: [{
|
|
160
|
+
type: Input
|
|
161
|
+
}], environmentShow: [{
|
|
162
|
+
type: Input
|
|
163
|
+
}], environmentLabel: [{
|
|
164
|
+
type: Input
|
|
165
|
+
}], environmentKey: [{
|
|
166
|
+
type: Input
|
|
167
|
+
}], actions: [{
|
|
168
|
+
type: Input
|
|
169
|
+
}], aclEntriesList: [{
|
|
170
|
+
type: ViewChild,
|
|
171
|
+
args: [FsListComponent]
|
|
172
|
+
}] } });
|
|
173
173
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNsLWVudHJpZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb21wb25lbnRzL2FjbC1lbnRyaWVzL2FjbC1lbnRyaWVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9hY2wtZW50cmllcy9hY2wtZW50cmllcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFPLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQWEsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBVSxNQUFNLFdBQVcsQ0FBQztBQUVwRCxPQUFPLEVBQWdCLGVBQWUsRUFBZ0IsTUFBTSxrQkFBa0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBS2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7Ozs7Ozs7O0FBUXZFLE1BQU0sT0FBTyxxQkFBcUI7SUFrQmhDLFlBQ21CLGNBQStCLEVBQy9CLE9BQWtCLEVBQzNCLFFBQWtCO1FBRlQsbUJBQWMsR0FBZCxjQUFjLENBQWlCO1FBQy9CLFlBQU8sR0FBUCxPQUFPLENBQVc7UUFDM0IsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQWhCWixvQkFBZSxHQUFHLElBQUksQ0FBQztRQUN2QixxQkFBZ0IsR0FBRyxhQUFhLENBQUM7UUFDakMsbUJBQWMsR0FBRyxhQUFh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QUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVNLE1BQU07UUFDWCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQy9CLENBQUM7O21IQTFKVSxxQkFBcUI7dUdBQXJCLHFCQUFxQiw0VkFVckIsZUFBZSxnRENsQzVCLGkyREFrREE7NEZEMUJhLHFCQUFxQjtrQkFMakMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixXQUFXLEVBQUUsOEJBQThCO29CQUMzQyxTQUFTLEVBQUUsQ0FBQyw4QkFBOEIsQ0FBQztpQkFDNUM7cUpBR2lCLGNBQWM7c0JBQTdCLEtBQUs7Z0JBQ1UsWUFBWTtzQkFBM0IsS0FBSztnQkFDVSxrQkFBa0I7c0JBQWpDLEtBQUs7Z0JBQ1UsZUFBZTtzQkFBOUIsS0FBSztnQkFDVSxnQkFBZ0I7c0JBQS9CLEtBQUs7Z0JBQ1UsY0FBYztzQkFBN0IsS0FBSztnQkFDVSxPQUFPO3NCQUF0QixLQUFLO2dCQUdDLGNBQWM7c0JBRHBCLFNBQVM7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHRha2VVbnRpbCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgT25EZXN0cm95LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuaW1wb3J0IHsgU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBzb3J0QnksIGdyb3VwQnksIGZvck93biB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbmltcG9ydCB7IEZzTGlzdEFjdGlvbiwgRnNMaXN0Q29tcG9uZW50LCBGc0xpc3RDb25maWcgfSBmcm9tICdAZmlyZXN0aXRjaC9saXN0JztcbmltcG9ydCB7IEZzUHJvbXB0IH0gZnJvbSAnQGZpcmVzdGl0Y2gvcHJvbXB0JztcblxuaW1wb3J0IHsgRnNBcHBBY2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXBwLWFjbC5zZXJ2aWNlJztcbmltcG9ydCB7IEFjbEVudHJ5RGF0YSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvYWNsLWVudHJ5LWRhdGEnO1xuaW1wb3J0IHsgQWNsRW50cnkgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2FjbC1lbnRyeSc7XG5pbXBvcnQgeyBBY2xSb2xlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9hY2wtcm9sZSc7XG5pbXBvcnQgeyBBY2xPYmplY3RFbnRyeSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvYWNsLW9iamVjdC1lbnRyeSc7XG5pbXBvcnQgeyBGc0FjbEVudHJ5Q29tcG9uZW50IH0gZnJvbSAnLi4vYWNsLWVudHJ5L2FjbC1lbnRyeS5jb21wb25lbnQnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZzLWFjbC1lbnRyaWVzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FjbC1lbnRyaWVzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYWNsLWVudHJpZXMuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBGc0FjbEVudHJpZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KCkgcHVibGljIGxvYWRBY2xFbnRyaWVzOiAocXVlcnk6IGFueSkgPT4gT2JzZXJ2YWJsZTxBY2xFbnRyeVtdPjtcbiAgQElucHV0KCkgcHVibGljIGxvYWRBY2xSb2xlczogKHF1ZXJ5OiBhbnkpID0+IE9ic2VydmFibGU8QWNsUm9sZVtdPjtcbiAgQElucHV0KCkgcHVibGljIHNhdmVBY2xPYmplY3RFbnRyeTogKGFjbE9iamVjdEVudHJ5OiBBY2xPYmplY3RFbnRyeSkgPT4gT2JzZXJ2YWJsZTxhbnk+O1xuICBASW5wdXQoKSBwdWJsaWMgZW52aXJvbm1lbnRTaG93ID0gdHJ1ZTtcbiAgQElucHV0KCkgcHVibGljIGVudmlyb25tZW50TGFiZWwgPSAnRW52aXJvbm1lbnQnO1xuICBASW5wdXQoKSBwdWJsaWMgZW52aXJvbm1lbnRLZXkgPSAnZW52aXJvbm1lbnQnO1xuICBASW5wdXQoKSBwdWJsaWMgYWN0aW9uczogRnNMaXN0QWN0aW9uW10gPSBbXTtcblxuICBAVmlld0NoaWxkKEZzTGlzdENvbXBvbmVudClcbiAgcHVibGljIGFjbEVudHJpZXNMaXN0OiBGc0xpc3RDb21wb25lbnQgPSBudWxsO1xuXG4gIHB1YmxpYyBhY2xFbnRyaWVzQ29uZmlnOiBGc0xpc3RDb25maWcgPSBudWxsO1xuICBwdWJsaWMgcGVybWlzc2lvbnM6IGFueVtdID0gW107XG5cbiAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2FwcEFjbFNlcnZpY2U6IEZzQXBwQWNsU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIF9jb25maXJtOiBGc1Byb21wdCxcbiAgKSB7fVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9hcHBBY2xTZXJ2aWNlLmdldFBlcm1pc3Npb25zKClcbiAgICAgIC5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gcmVzcG9uc2U7XG4gICAgICB9KTtcblxuICAgIHRoaXMuYWNsRW50cmllc0NvbmZpZyA9IHtcbiAgICAgIHN0YXR1czogZmFsc2UsXG4gICAgICBwYWdpbmc6IGZhbHNlLFxuICAgICAgYWN0aW9uczogdGhpcy5hY3Rpb25zLFxuICAgICAgcm93QWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdSZW1vdmUgQWxsIFJvbGVzJyxcbiAgICAgICAgICBjbGljazogKGFjbE9iamVjdEVudHJ5OiBBY2xPYmplY3RFbnRyeSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fY29uZmlybVxuICAgICAgICAgICAgICAuY29uZmlybSh7XG4gICAgICAgICAgICAgICAgdGl0bGU6ICdSZW1vdmUgQWxsIFJvbGVzJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogJ0FyZSB5b3Ugc3VyZSB5b3Ugd291bGQgbGlrZSB0byByZW1vdmUgYWxsIHJvbGVzPycsXG4gICAgICAgICAgICAgIH0pLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHsgLi4uYWNsT2JqZWN0RW50cnksIGFjbEVudHJpZXM6IFtdIH07XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlQWNsT2JqZWN0RW50cnkoZGF0YSlcbiAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjbEVudHJpZXNMaXN0LnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIGZldGNoOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRBY2xFbnRyaWVzKHtcbiAgICAgICAgICAgIGFjbFJvbGVzOiB0cnVlLFxuICAgICAgICAgICAgYWNsUm9sZVBlcm1pc3Npb25zOiB0cnVlLFxuICAgICAgICAgICAgb2JqZWN0czogdHJ1ZSxcbiAgICAgICAgICAgIGFjbFJvbGVTdGF0ZTogJ2FjdGl2ZScsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGFjbEVudHJpZXM6IEFjbEVudHJ5W10pID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0cyA9IGFjbEVudHJpZXNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChhY2xFbnRyeSkgPT4gKCEhYWNsRW50cnkub2JqZWN0KSlcbiAgICAgICAgICAgICAgICAucmVkdWNlKChpdGVtcywgaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uaXRlbXMsXG4gICAgICAgICAgICAgICAgICAgIFtpdGVtLm9iamVjdC5pZF06IGl0ZW0ub2JqZWN0LFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LCB7fSk7XG5cbiAgICAgICAgICAgICAgY29uc3QgZW52aXJvbm1lbnRzID0gYWNsRW50cmllc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGFjbEVudHJ5KSA9PiAoISFhY2xFbnRyeVt0aGlzLmVudmlyb25tZW50S2V5XSkpXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgoaXRlbXMsIGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVudmlyb25tZW50ID0gaXRlbVt0aGlzLmVudmlyb25tZW50S2V5XTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLml0ZW1zLFxuICAgICAgICAgICAgICAgICAgICBbZW52aXJvbm1lbnQuaWRdOiBlbnZpcm9ubWVudCxcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSwge30pO1xuXG4gICAgICAgICAgICAgIGNvbnN0IGdyb3VwZWRBY2xFbnRyaWVzID0gZ3JvdXBCeShhY2xFbnRyaWVzLCAoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudmlyb25tZW50SWQgPSAoaXRlbVt0aGlzLmVudmlyb25tZW50S2V5XSk/LmlkO1xuICAgICAgICAgICAgICAgIHJldHVybiBbaXRlbS5hY2xSb2xlLmxldmVsLCBlbnZpcm9ubWVudElkLCBpdGVtLm9iamVjdElkXTtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgbGV0IGFjbE9iamVjdEVudHJpZXM6IEFjbE9iamVjdEVudHJ5W10gPSBPYmplY3Qua2V5cyhncm91cGVkQWNsRW50cmllcylcbiAgICAgICAgICAgICAgICAucmVkdWNlKChhY2N1bSwga2V5OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRzID0ga2V5LnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAuLi5hY2N1bSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogb2JqZWN0c1twYXJ0c1syXV0sXG4gICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IHBhcnRzWzBdLFxuICAgICAgICAgICAgICAgICAgICAgIFtgJHt0aGlzLmVudmlyb25tZW50S2V5fUlkYF06IHBhcnRzWzFdID8gcGFyc2VJbnQocGFydHNbMV0pIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICBbdGhpcy5lbnZpcm9ubWVudEtleV06IGVudmlyb25tZW50c1twYXJ0c1sxXV0sXG4gICAgICAgICAgICAgICAgICAgICAgYWNsRW50cmllczogZ3JvdXBlZEFjbEVudHJpZXNba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgICAgICAgY29uc3QgaGFzQXBwID0gYWNsT2JqZWN0RW50cmllcy5zb21lKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uYWNsRW50cmllcy5zb21lKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuICFlbnRyeS5vYmplY3RJZDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgaWYgKCFoYXNBcHApIHtcbiAgICAgICAgICAgICAgICBhY2xPYmplY3RFbnRyaWVzLnVuc2hpZnQoe1xuICAgICAgICAgICAgICAgICAgb2JqZWN0OiBudWxsLCBcbiAgICAgICAgICAgICAgICAgIGFjbEVudHJpZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdhcHAnLFxuICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRJZDogbnVsbCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGFjbE9iamVjdEVudHJpZXMgPSBzb3J0QnkoYWNsT2JqZWN0RW50cmllcywgKGl0ZW06IEFjbE9iamVjdEVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0ub2JqZWN0ID8gaXRlbS5sZXZlbCA6ICcnO1xuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZGF0YTogYWNsT2JqZWN0RW50cmllcyB9KTtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGUoYWNsT2JqZWN0RW50cnk6IEFjbE9iamVjdEVudHJ5KSB7XG4gICAgY29uc3QgZGF0YTogQWNsRW50cnlEYXRhID0ge1xuICAgICAgYWNsT2JqZWN0RW50cnksXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICBsb2FkQWNsUm9sZXM6IHRoaXMubG9hZEFjbFJvbGVzLFxuICAgICAgc2F2ZUFjbE9iamVjdEVudHJ5OiB0aGlzLnNhdmVBY2xPYmplY3RFbnRyeVxuICAgIH1cblxuICAgIHRoaXMuX2RpYWxvZy5vcGVuKEZzQWNsRW50cnlDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KVxuICAgICAgLmFmdGVyQ2xvc2VkKClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuYWNsRW50cmllc0xpc3QucmVsb2FkKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5hY2xFbnRyaWVzTGlzdC5yZWxvYWQoKTtcbiAgfVxuXG59XG4iLCJcbjxmcy1saXN0IFtjb25maWddPVwiYWNsRW50cmllc0NvbmZpZ1wiPlxuICA8ZnMtbGlzdC1jb2x1bW4+XG4gICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtaGVhZGVyPkNvbnRleHQ8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWNlbGwgbGV0LXJvdz1cInJvd1wiPlxuICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwicm93Lm9iamVjdDsgZWxzZSBlbHNlT2JqZWN0XCJcbiAgICAgICAgICBmeExheW91dD1cInJvd1wiXG4gICAgICAgICAgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiXG4gICAgICAgICAgZnhMYXlvdXRHYXA9XCIxMHB4XCI+XG4gICAgICAgIDxmcy1iYWRnZSAqbmdJZj1cInJvdy5vYmplY3QuaW1hZ2VVcmxcIiBzaGFwZT1cImNpcmNsZVwiIGltYWdlPVwie3sgcm93Lm9iamVjdC5pbWFnZVVybCB9fVwiPjwvZnMtYmFkZ2U+XG4gICAgICAgIDxzcGFuPlxuICAgICAgICAgIDxkaXY+PHNtYWxsPnt7IHJvdy5vYmplY3QuY2xhc3NOYW1lIH19PC9zbWFsbD48L2Rpdj5cbiAgICAgICAgICA8YSAoY2xpY2spPVwidXBkYXRlKHJvdylcIj57eyByb3cub2JqZWN0Lm5hbWUgfX08L2E+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8bmctdGVtcGxhdGUgI2Vsc2VPYmplY3Q+XG4gICAgICAgIDxhIChjbGljayk9XCJ1cGRhdGUocm93KVwiPkFwcDwvYT5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9mcy1saXN0LWNvbHVtbj5cblxuICA8ZnMtbGlzdC1jb2x1bW4gW3Nob3ddPVwiZW52aXJvbm1lbnRTaG93XCI+XG4gICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtaGVhZGVyPnt7ZW52aXJvbm1lbnRMYWJlbH19PC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1jZWxsIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgIHt7cm93LmVudmlyb25tZW50Py5uYW1lfX1cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2ZzLWxpc3QtY29sdW1uPlxuXG4gIDxmcy1saXN0LWNvbHVtbj5cbiAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1oZWFkZXI+Um9sZXM8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWNlbGwgbGV0LXJvdz1cInJvd1wiPlxuICAgICAgPGRpdiBmeExheW91dD1cImNvbHVtblwiIGZ4TGF5b3V0R2FwPVwiMTBweFwiPlxuICAgICAgICA8ZGl2IGRpdiAqbmdGb3I9XCJsZXQgYWNsRW50cnkgb2Ygcm93LmFjbEVudHJpZXNcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJyb3cubGV2ZWxcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidhcHAnXCI+XG4gICAgICAgICAgICAgIDxmcy1hY2wtcm9sZS1wb3BvdmVyIFthY2xSb2xlXT1cImFjbEVudHJ5LmFjbFJvbGVcIiBvYmplY3ROYW1lPVwiQXBwXCI+e3thY2xFbnRyeS5hY2xSb2xlLm5hbWV9fTwvZnMtYWNsLXJvbGUtcG9wb3Zlcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93Lm9iamVjdFwiPlxuICAgICAgICAgICAgICAgIDxmcy1hY2wtcm9sZS1wb3BvdmVyIFthY2xSb2xlXT1cImFjbEVudHJ5LmFjbFJvbGVcIj57e2FjbEVudHJ5LmFjbFJvbGUubmFtZX19PC9mcy1hY2wtcm9sZS1wb3BvdmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZnMtbGlzdC1jb2x1bW4+XG48L2ZzLWxpc3Q+XG4iXX0=
|
|
@@ -1,90 +1,90 @@
|
|
|
1
|
-
import { Component, Inject } from '@angular/core';
|
|
2
|
-
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
3
|
-
import { FsMessage } from '@firestitch/message';
|
|
4
|
-
import { forkJoin } from 'rxjs';
|
|
5
|
-
import { FsAppAclService } from './../../services/app-acl.service';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "./../../services/app-acl.service";
|
|
8
|
-
import * as i2 from "@angular/material/dialog";
|
|
9
|
-
import * as i3 from "@firestitch/message";
|
|
10
|
-
import * as i4 from "@firestitch/dialog";
|
|
11
|
-
import * as i5 from "@firestitch/label";
|
|
12
|
-
import * as i6 from "../acl-object-roles/acl-object-roles.component";
|
|
13
|
-
import * as i7 from "@angular/material/button";
|
|
14
|
-
import * as i8 from "@angular/forms";
|
|
15
|
-
import * as i9 from "@firestitch/form";
|
|
16
|
-
import * as i10 from "@angular/common";
|
|
17
|
-
export class FsAclEntryComponent {
|
|
18
|
-
constructor(_appAclService, _dialogRef, _message, _data) {
|
|
19
|
-
var _a;
|
|
20
|
-
this._appAclService = _appAclService;
|
|
21
|
-
this._dialogRef = _dialogRef;
|
|
22
|
-
this._message = _message;
|
|
23
|
-
this._data = _data;
|
|
24
|
-
this.aclRoles = [];
|
|
25
|
-
this.aclEntries = [];
|
|
26
|
-
this.indexedAclRoleLevels = {};
|
|
27
|
-
this.titleEdit = 'Edit Roles';
|
|
28
|
-
this.titleAdd = 'Assign Roles';
|
|
29
|
-
this.required = true;
|
|
30
|
-
this.save = () => {
|
|
31
|
-
const aclObjectEntry = Object.assign(Object.assign({}, this.aclObjectEntry), { aclEntries: this.aclEntries });
|
|
32
|
-
return this._data.saveAclObjectEntry(aclObjectEntry)
|
|
33
|
-
.subscribe((data) => {
|
|
34
|
-
this._message.success('Saved Changes');
|
|
35
|
-
this.close(data);
|
|
36
|
-
});
|
|
37
|
-
};
|
|
38
|
-
this.aclObjectEntry = Object.assign({}, _data.aclObjectEntry);
|
|
39
|
-
this.required = (_a = _data.required) !== null && _a !== void 0 ? _a : true;
|
|
40
|
-
if (_data.titleEdit) {
|
|
41
|
-
this.titleEdit = _data.titleEdit;
|
|
42
|
-
}
|
|
43
|
-
if (_data.titleAdd) {
|
|
44
|
-
this.titleAdd = _data.titleAdd;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
ngOnInit() {
|
|
48
|
-
forkJoin(this._data.loadAclRoles(this.aclObjectEntry), this._appAclService.getIndexedLevels())
|
|
49
|
-
.subscribe(([aclRoles, levels,]) => {
|
|
50
|
-
this.aclRoles = aclRoles;
|
|
51
|
-
this.indexedAclRoleLevels = levels;
|
|
52
|
-
this.aclObjectRole = {
|
|
53
|
-
object: this.aclObjectEntry.object,
|
|
54
|
-
aclRoles: this.aclObjectEntry.aclEntries
|
|
55
|
-
.map((aclEntry) => {
|
|
56
|
-
return aclEntry.aclRole;
|
|
57
|
-
}),
|
|
58
|
-
};
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
aclObjectRoleChange(aclObjectRoles) {
|
|
62
|
-
this.aclEntries = aclObjectRoles.reduce((aclEntries, aclObjectRole) => {
|
|
63
|
-
aclObjectRole.aclRoles.forEach(aclRole => {
|
|
64
|
-
aclEntries.push({
|
|
65
|
-
aclRoleId: aclRole.id,
|
|
66
|
-
aclRole: aclRole,
|
|
67
|
-
objectId: aclObjectRole.object ? aclObjectRole.object.id : null,
|
|
68
|
-
object: aclObjectRole.object || null
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
return aclEntries;
|
|
72
|
-
}, []);
|
|
73
|
-
}
|
|
74
|
-
close(data = null) {
|
|
75
|
-
this._dialogRef.close(data);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
FsAclEntryComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsAclEntryComponent, deps: [{ token: i1.FsAppAclService }, { token: i2.MatDialogRef }, { token: i3.FsMessage }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
|
|
79
|
-
FsAclEntryComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", 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"] }, { type: i5.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { type: i5.FsLabelComponent, selector: "fs-label" }, { type: i6.FsAclObjectRolesComponent, selector: "fs-acl-object-roles", inputs: ["aclRoles", "required", "multiple", "disabled", "aclObjectRoles", "rolesLabel", "levelLabel"], outputs: ["change"] }, { type: i7.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: i8.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i8.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i9.FsFormDirective, selector: "[fsForm]", inputs: ["wrapperSelector", "messageSelector", "hintSelector", "labelSelector", "autocomplete", "shortcuts", "confirm", "confirmDialog", "confirmDrawer", "confirmBrowser", "confirmTabs", "dirtySubmitButton", "submit", "successDelay", "errorDelay", "tabGroup"], 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: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i9.FsSubmitButtonDirective, selector: "button[type=\"submit\"]", inputs: ["name", "dirtySubmit"] }, { type: i2.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["type", "mat-dialog-close", "aria-label", "matDialogClose"], exportAs: ["matDialogClose"] }] });
|
|
80
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsAclEntryComponent, decorators: [{
|
|
81
|
-
type: Component,
|
|
82
|
-
args: [{
|
|
83
|
-
templateUrl: './acl-entry.component.html',
|
|
84
|
-
styleUrls: ['./acl-entry.component.scss'],
|
|
85
|
-
}]
|
|
86
|
-
}], ctorParameters: function () { return [{ type: i1.FsAppAclService }, { type: i2.MatDialogRef }, { type: i3.FsMessage }, { type: undefined, decorators: [{
|
|
87
|
-
type: Inject,
|
|
88
|
-
args: [MAT_DIALOG_DATA]
|
|
89
|
-
}] }]; } });
|
|
1
|
+
import { Component, Inject } from '@angular/core';
|
|
2
|
+
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
3
|
+
import { FsMessage } from '@firestitch/message';
|
|
4
|
+
import { forkJoin } from 'rxjs';
|
|
5
|
+
import { FsAppAclService } from './../../services/app-acl.service';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "./../../services/app-acl.service";
|
|
8
|
+
import * as i2 from "@angular/material/dialog";
|
|
9
|
+
import * as i3 from "@firestitch/message";
|
|
10
|
+
import * as i4 from "@firestitch/dialog";
|
|
11
|
+
import * as i5 from "@firestitch/label";
|
|
12
|
+
import * as i6 from "../acl-object-roles/acl-object-roles.component";
|
|
13
|
+
import * as i7 from "@angular/material/button";
|
|
14
|
+
import * as i8 from "@angular/forms";
|
|
15
|
+
import * as i9 from "@firestitch/form";
|
|
16
|
+
import * as i10 from "@angular/common";
|
|
17
|
+
export class FsAclEntryComponent {
|
|
18
|
+
constructor(_appAclService, _dialogRef, _message, _data) {
|
|
19
|
+
var _a;
|
|
20
|
+
this._appAclService = _appAclService;
|
|
21
|
+
this._dialogRef = _dialogRef;
|
|
22
|
+
this._message = _message;
|
|
23
|
+
this._data = _data;
|
|
24
|
+
this.aclRoles = [];
|
|
25
|
+
this.aclEntries = [];
|
|
26
|
+
this.indexedAclRoleLevels = {};
|
|
27
|
+
this.titleEdit = 'Edit Roles';
|
|
28
|
+
this.titleAdd = 'Assign Roles';
|
|
29
|
+
this.required = true;
|
|
30
|
+
this.save = () => {
|
|
31
|
+
const aclObjectEntry = Object.assign(Object.assign({}, this.aclObjectEntry), { aclEntries: this.aclEntries });
|
|
32
|
+
return this._data.saveAclObjectEntry(aclObjectEntry)
|
|
33
|
+
.subscribe((data) => {
|
|
34
|
+
this._message.success('Saved Changes');
|
|
35
|
+
this.close(data);
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
this.aclObjectEntry = Object.assign({}, _data.aclObjectEntry);
|
|
39
|
+
this.required = (_a = _data.required) !== null && _a !== void 0 ? _a : true;
|
|
40
|
+
if (_data.titleEdit) {
|
|
41
|
+
this.titleEdit = _data.titleEdit;
|
|
42
|
+
}
|
|
43
|
+
if (_data.titleAdd) {
|
|
44
|
+
this.titleAdd = _data.titleAdd;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
ngOnInit() {
|
|
48
|
+
forkJoin(this._data.loadAclRoles(this.aclObjectEntry), this._appAclService.getIndexedLevels())
|
|
49
|
+
.subscribe(([aclRoles, levels,]) => {
|
|
50
|
+
this.aclRoles = aclRoles;
|
|
51
|
+
this.indexedAclRoleLevels = levels;
|
|
52
|
+
this.aclObjectRole = {
|
|
53
|
+
object: this.aclObjectEntry.object,
|
|
54
|
+
aclRoles: this.aclObjectEntry.aclEntries
|
|
55
|
+
.map((aclEntry) => {
|
|
56
|
+
return aclEntry.aclRole;
|
|
57
|
+
}),
|
|
58
|
+
};
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
aclObjectRoleChange(aclObjectRoles) {
|
|
62
|
+
this.aclEntries = aclObjectRoles.reduce((aclEntries, aclObjectRole) => {
|
|
63
|
+
aclObjectRole.aclRoles.forEach(aclRole => {
|
|
64
|
+
aclEntries.push({
|
|
65
|
+
aclRoleId: aclRole.id,
|
|
66
|
+
aclRole: aclRole,
|
|
67
|
+
objectId: aclObjectRole.object ? aclObjectRole.object.id : null,
|
|
68
|
+
object: aclObjectRole.object || null
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
return aclEntries;
|
|
72
|
+
}, []);
|
|
73
|
+
}
|
|
74
|
+
close(data = null) {
|
|
75
|
+
this._dialogRef.close(data);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
FsAclEntryComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsAclEntryComponent, deps: [{ token: i1.FsAppAclService }, { token: i2.MatDialogRef }, { token: i3.FsMessage }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
|
|
79
|
+
FsAclEntryComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", 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"] }, { type: i5.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { type: i5.FsLabelComponent, selector: "fs-label" }, { type: i6.FsAclObjectRolesComponent, selector: "fs-acl-object-roles", inputs: ["aclRoles", "required", "multiple", "disabled", "aclObjectRoles", "rolesLabel", "levelLabel"], outputs: ["change"] }, { type: i7.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: i8.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i8.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i9.FsFormDirective, selector: "[fsForm]", inputs: ["wrapperSelector", "messageSelector", "hintSelector", "labelSelector", "autocomplete", "shortcuts", "confirm", "confirmDialog", "confirmDrawer", "confirmBrowser", "confirmTabs", "dirtySubmitButton", "submit", "successDelay", "errorDelay", "tabGroup"], 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: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i9.FsSubmitButtonDirective, selector: "button[type=\"submit\"]", inputs: ["name", "dirtySubmit"] }, { type: i2.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["type", "mat-dialog-close", "aria-label", "matDialogClose"], exportAs: ["matDialogClose"] }] });
|
|
80
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsAclEntryComponent, decorators: [{
|
|
81
|
+
type: Component,
|
|
82
|
+
args: [{
|
|
83
|
+
templateUrl: './acl-entry.component.html',
|
|
84
|
+
styleUrls: ['./acl-entry.component.scss'],
|
|
85
|
+
}]
|
|
86
|
+
}], ctorParameters: function () { return [{ type: i1.FsAppAclService }, { type: i2.MatDialogRef }, { type: i3.FsMessage }, { type: undefined, decorators: [{
|
|
87
|
+
type: Inject,
|
|
88
|
+
args: [MAT_DIALOG_DATA]
|
|
89
|
+
}] }]; } });
|
|
90
90
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNsLWVudHJ5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9hY2wtZW50cnkvYWNsLWVudHJ5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9hY2wtZW50cnkvYWNsLWVudHJ5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFekUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWhELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFPaEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7Ozs7Ozs7Ozs7QUFPbkUsTUFBTSxPQUFPLG1CQUFtQjtJQVc5QixZQUNtQixjQUErQixFQUMvQixVQUE2QyxFQUM3QyxRQUFtQixFQUNNLEtBQW1COztRQUg1QyxtQkFBYyxHQUFkLGNBQWMsQ0FBaUI7UUFDL0IsZUFBVSxHQUFWLFVBQVUsQ0FBbUM7UUFDN0MsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNNLFVBQUssR0FBTCxLQUFLLENBQWM7UUFieEQsYUFBUSxHQUFjLEVBQUUsQ0FBQztRQUd6QixlQUFVLEdBQWUsRUFBRSxDQUFDO1FBQzVCLHlCQUFvQixHQUFHLEVBQUUsQ0FBQztRQUMxQixjQUFTLEdBQUcsWUFBWSxDQUFDO1FBQ3pCLGFBQVEsR0FBRyxjQUFjLENBQUM7UUFDMUIsYUFBUSxHQUFHLElBQUksQ0FBQztRQTBEaEIsU0FBSSxHQUFHLEdBQUcsRUFBRTtZQUNqQixNQUFNLGNBQWMsbUNBQ2YsSUFBSSxDQUFDLGNBQWMsS0FDdEIsVUFBVSxFQUFFLElB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fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiwgTUFUX0RJQUxPR19EQVRBIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuaW1wb3J0IHsgRnNNZXNzYWdlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWVzc2FnZSc7XG5cbmltcG9ydCB7IGZvcmtKb2luIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEFjbFJvbGV9IGZyb20gJy4vLi4vLi4vaW50ZXJmYWNlcy9hY2wtcm9sZSc7XG5pbXBvcnQgeyBBY2xFbnRyeURhdGEgfSBmcm9tICcuLy4uLy4uL2ludGVyZmFjZXMvYWNsLWVudHJ5LWRhdGEnO1xuaW1wb3J0IHsgQWNsT2JqZWN0Um9sZSB9IGZyb20gJy4vLi4vLi4vaW50ZXJmYWNlcy9hY2wtb2JqZWN0LXJvbGUnO1xuaW1wb3J0IHsgQWNsT2JqZWN0RW50cnkgfSBmcm9tICcuLy4uLy4uL2ludGVyZmFjZXMvYWNsLW9iamVjdC1lbnRyeSc7XG5pbXBvcnQgeyBBY2xFbnRyeSB9IGZyb20gJy4vLi4vLi4vaW50ZXJmYWNlcy9hY2wtZW50cnknO1xuaW1wb3J0IHsgRnNBcHBBY2xTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9hcHAtYWNsLnNlcnZpY2UnO1xuXG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJy4vYWNsLWVudHJ5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYWNsLWVudHJ5LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEZzQWNsRW50cnlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHB1YmxpYyBhY2xSb2xlczogQWNsUm9sZVtdID0gW107XG4gIHB1YmxpYyBhY2xPYmplY3RFbnRyeTogQWNsT2JqZWN0RW50cnk7XG4gIHB1YmxpYyBhY2xPYmplY3RSb2xlOiBBY2xPYmplY3RSb2xlO1xuICBwdWJsaWMgYWNsRW50cmllczogQWNsRW50cnlbXSA9IFtdO1xuICBwdWJsaWMgaW5kZXhlZEFjbFJvbGVMZXZlbHMgPSB7fTtcbiAgcHVibGljIHRpdGxlRWRpdCA9ICdFZGl0IFJvbGVzJztcbiAgcHVibGljIHRpdGxlQWRkID0gJ0Fzc2lnbiBSb2xlcyc7XG4gIHB1YmxpYyByZXF1aXJlZCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfYXBwQWNsU2VydmljZTogRnNBcHBBY2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPEZzQWNsRW50cnlDb21wb25lbnQ+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21lc3NhZ2U6IEZzTWVzc2FnZSxcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHJpdmF0ZSByZWFkb25seSBfZGF0YTogQWNsRW50cnlEYXRhXG4gICkge1xuICAgIHRoaXMuYWNsT2JqZWN0RW50cnkgPSB7IC4uLl9kYXRhLmFjbE9iamVjdEVudHJ5IH07XG4gICAgdGhpcy5yZXF1aXJlZCA9IF9kYXRhLnJlcXVpcmVkID8/IHRydWU7XG5cbiAgICBpZiAoX2RhdGEudGl0bGVFZGl0KSB7XG4gICAgICB0aGlzLnRpdGxlRWRpdCA9IF9kYXRhLnRpdGxlRWRpdDtcbiAgICB9XG5cbiAgICBpZiAoX2RhdGEudGl0bGVBZGQpIHtcbiAgICAgIHRoaXMudGl0bGVBZGQgPSBfZGF0YS50aXRsZUFkZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgZm9ya0pvaW4oXG4gICAgICB0aGlzLl9kYXRhLmxvYWRBY2xSb2xlcyh0aGlzLmFjbE9iamVjdEVudHJ5KSxcbiAgICAgIHRoaXMuX2FwcEFjbFNlcnZpY2UuZ2V0SW5kZXhlZExldmVscygpXG4gICAgKVxuICAgICAgLnN1YnNjcmliZSgoW1xuICAgICAgICBhY2xSb2xlcyxcbiAgICAgICAgbGV2ZWxzLFxuICAgICAgXSkgPT4ge1xuXG4gICAgICAgIHRoaXMuYWNsUm9sZXMgPSBhY2xSb2xlcztcbiAgICAgICAgdGhpcy5pbmRleGVkQWNsUm9sZUxldmVscyA9IGxldmVscztcblxuICAgICAgICB0aGlzLmFjbE9iamVjdFJvbGUgPSB7XG4gICAgICAgICAgb2JqZWN0OiB0aGlzLmFjbE9iamVjdEVudHJ5Lm9iamVjdCxcbiAgICAgICAgICBhY2xSb2xlczogdGhpcy5hY2xPYmplY3RFbnRyeS5hY2xFbnRyaWVzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGFjbEVudHJ5OiBBY2xFbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2xFbnRyeS5hY2xSb2xlO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFjbE9iamVjdFJvbGVDaGFuZ2UoYWNsT2JqZWN0Um9sZXM6IEFjbE9iamVjdFJvbGVbXSkge1xuICAgIHRoaXMuYWNsRW50cmllcyA9IGFjbE9iamVjdFJvbGVzLnJlZHVjZSgoYWNsRW50cmllcywgYWNsT2JqZWN0Um9sZSkgPT4ge1xuICAgICAgYWNsT2JqZWN0Um9sZS5hY2xSb2xlcy5mb3JFYWNoKGFjbFJvbGUgPT4ge1xuICAgICAgICBhY2xFbnRyaWVzLnB1c2goe1xuICAgICAgICAgIGFjbFJvbGVJZDogYWNsUm9sZS5pZCxcbiAgICAgICAgICBhY2xSb2xlOiBhY2xSb2xlLFxuICAgICAgICAgIG9iamVjdElkOiBhY2xPYmplY3RSb2xlLm9iamVjdCA/IGFjbE9iamVjdFJvbGUub2JqZWN0LmlkIDogbnVsbCxcbiAgICAgICAgICBvYmplY3Q6IGFjbE9iamVjdFJvbGUub2JqZWN0IHx8IG51bGxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGFjbEVudHJpZXM7XG4gICAgfSwgW10pO1xuICB9XG5cbiAgcHVibGljIHNhdmUgPSAoKSA9PiB7XG4gICAgY29uc3QgYWNsT2JqZWN0RW50cnkgPSB7XG4gICAgICAuLi50aGlzLmFjbE9iamVjdEVudHJ5LFxuICAgICAgYWNsRW50cmllczogdGhpcy5hY2xFbnRyaWVzLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5fZGF0YS5zYXZlQWNsT2JqZWN0RW50cnkoYWNsT2JqZWN0RW50cnkpXG4gICAgICAuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnU2F2ZWQgQ2hhbmdlcycpO1xuICAgICAgICB0aGlzLmNsb3NlKGRhdGEpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2UoZGF0YSA9IG51bGwpIHtcbiAgICB0aGlzLl9kaWFsb2dSZWYuY2xvc2UoZGF0YSk7XG4gIH1cblxufVxuIiwiPGZvcm0gZnNGb3JtIFtzdWJtaXRdPVwic2F2ZVwiPlxuICA8ZnMtZGlhbG9nPlxuICAgIDxkaXYgbWF0LWRpYWxvZy10aXRsZT57eyB0aXRsZUVkaXQ/IHRpdGxlRWRpdCA6IHRpdGxlQWRkIH19PC9kaXY+XG4gICAgPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICAgIDxkaXYgKm5nSWY9XCJhY2xPYmplY3RSb2xlXCI+XG4gICAgICAgIDxmcy1sYWJlbC1maWVsZCAqbmdJZj1cImFjbE9iamVjdEVudHJ5Lm9iamVjdFwiPlxuICAgICAgICAgIDxmcy1sYWJlbD57e2luZGV4ZWRBY2xSb2xlTGV2ZWxzW2FjbE9iamVjdEVudHJ5LmxldmVsXX19PC9mcy1sYWJlbD5cbiAgICAgICAgICB7e2FjbE9iamVjdEVudHJ5Lm9iamVjdC5uYW1lfX1cbiAgICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgICA8ZnMtYWNsLW9iamVjdC1yb2xlc1xuICAgICAgICAgIFthY2xSb2xlc109XCJhY2xSb2xlc1wiXG4gICAgICAgICAgW2FjbE9iamVjdFJvbGVzXT1cIlthY2xPYmplY3RSb2xlXVwiXG4gICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICAoY2hhbmdlKT1cImFjbE9iamVjdFJvbGVDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICA8L2ZzLWFjbC1vYmplY3Qtcm9sZXM+XG4gICAgICA8L2Rpdj5cbiAgICA8L21hdC1kaWFsb2ctY29udGVudD5cbiAgICA8bWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjb2xvcj1cInByaW1hcnlcIj5TYXZlPC9idXR0b24+XG4gICAgICA8YnV0dG9uIG1hdC1idXR0b24gbWF0LWRpYWxvZy1jbG9zZSB0eXBlPVwiYnV0dG9uXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG4gIDwvZnMtZGlhbG9nPlxuPC9mb3JtPlxuIl19
|