@unifylib/ui-lib 1.0.74 → 1.0.76
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/esm2022/lib/components/base-form-canvas/base-form-canvas.component.mjs +15 -1
- package/esm2022/lib/components/permission-matrix/permission-matrix.component.mjs +46 -4
- package/fesm2022/unifylib-ui-lib.mjs +59 -3
- package/fesm2022/unifylib-ui-lib.mjs.map +1 -1
- package/lib/components/permission-matrix/permission-matrix.component.d.ts +5 -1
- package/package.json +1 -1
- package/esm2022/iq-ui-lib.mjs +0 -5
- package/fesm2022/iq-ui-lib.mjs +0 -6725
- package/fesm2022/iq-ui-lib.mjs.map +0 -1
|
@@ -21,6 +21,7 @@ export class PermissionMatrixComponent {
|
|
|
21
21
|
this.expandAllLabelKey = 'GROUPS.expandAll';
|
|
22
22
|
this.collapseAllLabelKey = 'GROUPS.collapseAll';
|
|
23
23
|
this.readonly = false;
|
|
24
|
+
this.autoLockView = false;
|
|
24
25
|
this.itemsChange = new EventEmitter();
|
|
25
26
|
this.permissionChange = new EventEmitter();
|
|
26
27
|
}
|
|
@@ -59,6 +60,9 @@ export class PermissionMatrixComponent {
|
|
|
59
60
|
item.permissions[perm.key] = newValue;
|
|
60
61
|
}
|
|
61
62
|
});
|
|
63
|
+
if (this.autoLockView) {
|
|
64
|
+
this.syncViewPermission(item);
|
|
65
|
+
}
|
|
62
66
|
this.emitItemsChange();
|
|
63
67
|
}
|
|
64
68
|
isPermissionSelected(item, permission) {
|
|
@@ -67,9 +71,19 @@ export class PermissionMatrixComponent {
|
|
|
67
71
|
}
|
|
68
72
|
return item.permissions[permission.key];
|
|
69
73
|
}
|
|
74
|
+
isPermissionDisabled(item, permission) {
|
|
75
|
+
if (this.readonly) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
if (this.autoLockView && permission.key === 'view') {
|
|
79
|
+
return this.hasNonViewPermission(item);
|
|
80
|
+
}
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
70
83
|
togglePermission(item, permission) {
|
|
71
|
-
if (this.
|
|
84
|
+
if (this.isPermissionDisabled(item, permission)) {
|
|
72
85
|
return;
|
|
86
|
+
}
|
|
73
87
|
const currentValue = this.isPermissionSelected(item, permission);
|
|
74
88
|
const newValue = !currentValue;
|
|
75
89
|
if (permission.combinedKeys) {
|
|
@@ -80,6 +94,9 @@ export class PermissionMatrixComponent {
|
|
|
80
94
|
else {
|
|
81
95
|
item.permissions[permission.key] = newValue;
|
|
82
96
|
}
|
|
97
|
+
if (this.autoLockView) {
|
|
98
|
+
this.syncViewPermission(item);
|
|
99
|
+
}
|
|
83
100
|
this.permissionChange.emit({
|
|
84
101
|
item,
|
|
85
102
|
permissionKey: permission.key,
|
|
@@ -87,7 +104,30 @@ export class PermissionMatrixComponent {
|
|
|
87
104
|
});
|
|
88
105
|
this.emitItemsChange();
|
|
89
106
|
}
|
|
107
|
+
hasNonViewPermission(item) {
|
|
108
|
+
return this.permissions.some(perm => {
|
|
109
|
+
if (perm.key === 'view') {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
if (perm.combinedKeys) {
|
|
113
|
+
return perm.combinedKeys.some(key => item.permissions[key]);
|
|
114
|
+
}
|
|
115
|
+
return !!item.permissions[perm.key];
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
syncViewPermission(item) {
|
|
119
|
+
const viewKey = this.permissions.find(p => p.key === 'view' && !p.combinedKeys)?.key;
|
|
120
|
+
if (!viewKey) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (this.hasNonViewPermission(item)) {
|
|
124
|
+
item.permissions[viewKey] = true;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
90
127
|
emitItemsChange() {
|
|
128
|
+
if (this.autoLockView) {
|
|
129
|
+
this.items.forEach(item => this.syncViewPermission(item));
|
|
130
|
+
}
|
|
91
131
|
this.itemsChange.emit([...this.items]);
|
|
92
132
|
}
|
|
93
133
|
trackByItem(index, item) {
|
|
@@ -97,7 +137,7 @@ export class PermissionMatrixComponent {
|
|
|
97
137
|
return permission.key;
|
|
98
138
|
}
|
|
99
139
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PermissionMatrixComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
100
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PermissionMatrixComponent, isStandalone: true, selector: "lib-permission-matrix", inputs: { items: "items", permissions: "permissions", titleKey: "titleKey", selectAllLabelKey: "selectAllLabelKey", expandAllLabelKey: "expandAllLabelKey", collapseAllLabelKey: "collapseAllLabelKey", readonly: "readonly" }, outputs: { itemsChange: "itemsChange", permissionChange: "permissionChange" }, ngImport: i0, template: "<div class=\"permission-matrix-card\">\r\n <div class=\"matrix-header\">\r\n <h3 class=\"matrix-title\">{{ titleKey | translate }}</h3>\r\n <button\r\n class=\"expand-all-btn\"\r\n type=\"button\"\r\n (click)=\"expandAllGroups()\"\r\n [attr.aria-label]=\"(areAllExpanded() ? collapseAllLabelKey : expandAllLabelKey) | translate\">\r\n <mat-icon class=\"expand-icon\" [class.rotated]=\"areAllExpanded()\">unfold_more</mat-icon>\r\n <span>{{ (areAllExpanded() ? collapseAllLabelKey : expandAllLabelKey) | translate }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"matrix-divider\"></div>\r\n\r\n <div class=\"matrix-accordion-list\">\r\n <div\r\n *ngFor=\"let item of items; trackBy: trackByItem\"\r\n class=\"matrix-accordion-item\"\r\n [class.expanded]=\"item.expanded\">\r\n\r\n <!-- Accordion Header -->\r\n <div\r\n class=\"accordion-header\"\r\n (click)=\"toggleGroup(item)\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-expanded]=\"item.expanded\"\r\n (keydown.enter)=\"toggleGroup(item)\"\r\n (keydown.space)=\"toggleGroup(item); $event.preventDefault()\">\r\n <div class=\"accordion-content\">\r\n <h4 class=\"accordion-title\">{{ item.title }}</h4>\r\n <p *ngIf=\"item.description\" class=\"accordion-description\">{{ item.description }}</p>\r\n </div>\r\n <mat-icon class=\"accordion-icon\" [class.rotated]=\"item.expanded\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n\r\n <!-- Accordion Body -->\r\n <ng-container *ngIf=\"item.expanded\">\r\n <div class=\"accordion-divider\"></div>\r\n <div class=\"accordion-body\">\r\n <!-- Permission Header Row -->\r\n <div class=\"permission-header-row\">\r\n <span class=\"permission-group-label\">{{ item.title }}</span>\r\n <div class=\"permission-separator\"></div>\r\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\r\n <span class=\"select-all-label\">{{ selectAllLabelKey | translate }}</span>\r\n <mat-checkbox\r\n [checked]=\"isAllPermissionsSelected(item)\"\r\n [disabled]=\"readonly\"\r\n (change)=\"toggleSelectAll(item)\"\r\n color=\"primary\"\r\n class=\"select-all-checkbox\">\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n\r\n <!-- Permissions Row -->\r\n <div class=\"permissions-row\" (click)=\"$event.stopPropagation()\">\r\n <div\r\n *ngFor=\"let permission of permissions; trackBy: trackByPermission\"\r\n class=\"permission-item\">\r\n <mat-checkbox\r\n [checked]=\"isPermissionSelected(item, permission)\"\r\n [disabled]=\"
|
|
140
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PermissionMatrixComponent, isStandalone: true, selector: "lib-permission-matrix", inputs: { items: "items", permissions: "permissions", titleKey: "titleKey", selectAllLabelKey: "selectAllLabelKey", expandAllLabelKey: "expandAllLabelKey", collapseAllLabelKey: "collapseAllLabelKey", readonly: "readonly", autoLockView: "autoLockView" }, outputs: { itemsChange: "itemsChange", permissionChange: "permissionChange" }, ngImport: i0, template: "<div class=\"permission-matrix-card\">\r\n <div class=\"matrix-header\">\r\n <h3 class=\"matrix-title\">{{ titleKey | translate }}</h3>\r\n <button\r\n class=\"expand-all-btn\"\r\n type=\"button\"\r\n (click)=\"expandAllGroups()\"\r\n [attr.aria-label]=\"(areAllExpanded() ? collapseAllLabelKey : expandAllLabelKey) | translate\">\r\n <mat-icon class=\"expand-icon\" [class.rotated]=\"areAllExpanded()\">unfold_more</mat-icon>\r\n <span>{{ (areAllExpanded() ? collapseAllLabelKey : expandAllLabelKey) | translate }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"matrix-divider\"></div>\r\n\r\n <div class=\"matrix-accordion-list\">\r\n <div\r\n *ngFor=\"let item of items; trackBy: trackByItem\"\r\n class=\"matrix-accordion-item\"\r\n [class.expanded]=\"item.expanded\">\r\n\r\n <!-- Accordion Header -->\r\n <div\r\n class=\"accordion-header\"\r\n (click)=\"toggleGroup(item)\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-expanded]=\"item.expanded\"\r\n (keydown.enter)=\"toggleGroup(item)\"\r\n (keydown.space)=\"toggleGroup(item); $event.preventDefault()\">\r\n <div class=\"accordion-content\">\r\n <h4 class=\"accordion-title\">{{ item.title }}</h4>\r\n <p *ngIf=\"item.description\" class=\"accordion-description\">{{ item.description }}</p>\r\n </div>\r\n <mat-icon class=\"accordion-icon\" [class.rotated]=\"item.expanded\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n\r\n <!-- Accordion Body -->\r\n <ng-container *ngIf=\"item.expanded\">\r\n <div class=\"accordion-divider\"></div>\r\n <div class=\"accordion-body\">\r\n <!-- Permission Header Row -->\r\n <div class=\"permission-header-row\">\r\n <span class=\"permission-group-label\">{{ item.title }}</span>\r\n <div class=\"permission-separator\"></div>\r\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\r\n <span class=\"select-all-label\">{{ selectAllLabelKey | translate }}</span>\r\n <mat-checkbox\r\n [checked]=\"isAllPermissionsSelected(item)\"\r\n [disabled]=\"readonly\"\r\n (change)=\"toggleSelectAll(item)\"\r\n color=\"primary\"\r\n class=\"select-all-checkbox\">\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n\r\n <!-- Permissions Row -->\r\n <div class=\"permissions-row\" (click)=\"$event.stopPropagation()\">\r\n <div\r\n *ngFor=\"let permission of permissions; trackBy: trackByPermission\"\r\n class=\"permission-item\">\r\n <mat-checkbox\r\n [checked]=\"isPermissionSelected(item, permission)\"\r\n [disabled]=\"isPermissionDisabled(item, permission)\"\r\n (change)=\"togglePermission(item, permission)\"\r\n color=\"primary\">\r\n </mat-checkbox>\r\n <span class=\"permission-label\">{{ permission.labelKey | translate }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>", styles: [".permission-matrix-card{background:#fff;border:1px solid #f0eeee;border-radius:8px;padding:16px;display:flex;flex-direction:column;gap:20px}.matrix-header{display:flex;align-items:center;justify-content:space-between;min-height:27px}.matrix-title{font-family:lusail-bold,sans-serif;font-weight:700;font-size:24px;line-height:1.2;color:#000;margin:0}.expand-all-btn{display:flex;align-items:center;gap:4px;background:transparent;border:none;cursor:pointer;padding:0;font-family:lusail-regular,sans-serif;font-weight:400;font-size:20px;line-height:1.2;color:#000;transition:all .2s ease}.expand-all-btn:hover{color:#0d4261}.expand-all-btn:focus-visible{outline:2px solid #0d4261;outline-offset:2px;border-radius:4px}.expand-icon{font-size:24px;width:24px;height:24px;color:#000;transition:transform .3s ease}.expand-icon.rotated{transform:rotate(180deg)}.matrix-divider{height:2px;background-color:#0d4261;width:100%}.matrix-accordion-list{display:flex;flex-direction:column;gap:0}.matrix-accordion-item{background:#fff;border:1px solid #f0eeee;border-radius:8px;padding:16px;margin-bottom:0;transition:all .2s ease}.matrix-accordion-item:not(:last-child){margin-bottom:20px}.accordion-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;width:100%}.accordion-header:focus-visible{outline:2px solid #0d4261;outline-offset:2px;border-radius:4px}.accordion-content{flex:1;display:flex;flex-direction:column;gap:0}.accordion-title{font-family:lusail-bold,sans-serif;font-weight:700;font-size:20px;line-height:1.2;color:#000;margin:0 0 4px}.accordion-description{font-family:lusail-light,sans-serif;font-weight:300;font-size:16px;line-height:1.2;color:#888;margin:0}.accordion-icon{font-size:24px;width:24px;height:24px;color:#222;transition:transform .3s ease;flex-shrink:0}.accordion-icon.rotated{transform:rotate(180deg)}.accordion-divider{margin-top:16px;height:1px;background-color:#f0eeee;width:calc(100% + 32px);margin-left:-16px;margin-right:-16px;border:none}.accordion-body{padding-top:16px;display:flex;flex-direction:column;gap:12px;margin-left:-16px;margin-right:-16px;padding-left:16px;padding-right:16px}.permission-header-row{display:flex;align-items:center;gap:4px;width:100%}.permission-group-label{font-family:lusail-regular,sans-serif;font-weight:400;font-size:16px;line-height:1.2;color:#5c5c5c;flex-shrink:0}.permission-separator{flex:1;height:1px;background-color:#f0eeee;margin:0 4px}.select-all-container{display:flex;align-items:center;gap:4px;flex-shrink:0;flex-direction:row-reverse}.select-all-label{font-family:lusail-regular,sans-serif;font-weight:400;font-size:20px;line-height:1.2;color:#000}.select-all-checkbox{flex-shrink:0}.permissions-row{display:flex;gap:20px;align-items:center;flex-wrap:wrap}.permission-item{display:flex;align-items:center;gap:4px;min-height:19px}.permission-label{font-family:lusail-medium,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#222;white-space:nowrap}::ng-deep .select-all-checkbox .mdc-checkbox__background,::ng-deep .permission-item .mdc-checkbox__background{border-color:#b7b7b7!important;border-radius:4px!important}::ng-deep .select-all-checkbox.mat-mdc-checkbox-checked .mdc-checkbox__background,::ng-deep .permission-item.mat-mdc-checkbox-checked .mdc-checkbox__background{background-color:#0d4261!important;border-color:#0d4261!important}::ng-deep .mdc-checkbox__checkmark{color:#fff!important}::ng-deep .mdc-checkbox{display:inline-block;position:relative;flex:0 0 18px;box-sizing:content-box;width:18px;height:28px!important;line-height:0;white-space:nowrap;cursor:pointer;vertical-align:bottom;padding:calc((var(--mdc-checkbox-state-layer-size) - 25px) / 2)!important;margin:calc((var(--mdc-checkbox-state-layer-size) - var(--mdc-checkbox-state-layer-size)) / 2)}:host-context([dir=rtl]) .matrix-header{direction:rtl}:host-context([dir=rtl]) .accordion-header{direction:rtl}:host-context([dir=rtl]) .select-all-container{flex-direction:row}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i3.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }] }); }
|
|
101
141
|
}
|
|
102
142
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PermissionMatrixComponent, decorators: [{
|
|
103
143
|
type: Component,
|
|
@@ -106,7 +146,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
106
146
|
MatIconModule,
|
|
107
147
|
MatCheckboxModule,
|
|
108
148
|
TranslateModule
|
|
109
|
-
], template: "<div class=\"permission-matrix-card\">\r\n <div class=\"matrix-header\">\r\n <h3 class=\"matrix-title\">{{ titleKey | translate }}</h3>\r\n <button\r\n class=\"expand-all-btn\"\r\n type=\"button\"\r\n (click)=\"expandAllGroups()\"\r\n [attr.aria-label]=\"(areAllExpanded() ? collapseAllLabelKey : expandAllLabelKey) | translate\">\r\n <mat-icon class=\"expand-icon\" [class.rotated]=\"areAllExpanded()\">unfold_more</mat-icon>\r\n <span>{{ (areAllExpanded() ? collapseAllLabelKey : expandAllLabelKey) | translate }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"matrix-divider\"></div>\r\n\r\n <div class=\"matrix-accordion-list\">\r\n <div\r\n *ngFor=\"let item of items; trackBy: trackByItem\"\r\n class=\"matrix-accordion-item\"\r\n [class.expanded]=\"item.expanded\">\r\n\r\n <!-- Accordion Header -->\r\n <div\r\n class=\"accordion-header\"\r\n (click)=\"toggleGroup(item)\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-expanded]=\"item.expanded\"\r\n (keydown.enter)=\"toggleGroup(item)\"\r\n (keydown.space)=\"toggleGroup(item); $event.preventDefault()\">\r\n <div class=\"accordion-content\">\r\n <h4 class=\"accordion-title\">{{ item.title }}</h4>\r\n <p *ngIf=\"item.description\" class=\"accordion-description\">{{ item.description }}</p>\r\n </div>\r\n <mat-icon class=\"accordion-icon\" [class.rotated]=\"item.expanded\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n\r\n <!-- Accordion Body -->\r\n <ng-container *ngIf=\"item.expanded\">\r\n <div class=\"accordion-divider\"></div>\r\n <div class=\"accordion-body\">\r\n <!-- Permission Header Row -->\r\n <div class=\"permission-header-row\">\r\n <span class=\"permission-group-label\">{{ item.title }}</span>\r\n <div class=\"permission-separator\"></div>\r\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\r\n <span class=\"select-all-label\">{{ selectAllLabelKey | translate }}</span>\r\n <mat-checkbox\r\n [checked]=\"isAllPermissionsSelected(item)\"\r\n [disabled]=\"readonly\"\r\n (change)=\"toggleSelectAll(item)\"\r\n color=\"primary\"\r\n class=\"select-all-checkbox\">\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n\r\n <!-- Permissions Row -->\r\n <div class=\"permissions-row\" (click)=\"$event.stopPropagation()\">\r\n <div\r\n *ngFor=\"let permission of permissions; trackBy: trackByPermission\"\r\n class=\"permission-item\">\r\n <mat-checkbox\r\n [checked]=\"isPermissionSelected(item, permission)\"\r\n [disabled]=\"
|
|
149
|
+
], template: "<div class=\"permission-matrix-card\">\r\n <div class=\"matrix-header\">\r\n <h3 class=\"matrix-title\">{{ titleKey | translate }}</h3>\r\n <button\r\n class=\"expand-all-btn\"\r\n type=\"button\"\r\n (click)=\"expandAllGroups()\"\r\n [attr.aria-label]=\"(areAllExpanded() ? collapseAllLabelKey : expandAllLabelKey) | translate\">\r\n <mat-icon class=\"expand-icon\" [class.rotated]=\"areAllExpanded()\">unfold_more</mat-icon>\r\n <span>{{ (areAllExpanded() ? collapseAllLabelKey : expandAllLabelKey) | translate }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"matrix-divider\"></div>\r\n\r\n <div class=\"matrix-accordion-list\">\r\n <div\r\n *ngFor=\"let item of items; trackBy: trackByItem\"\r\n class=\"matrix-accordion-item\"\r\n [class.expanded]=\"item.expanded\">\r\n\r\n <!-- Accordion Header -->\r\n <div\r\n class=\"accordion-header\"\r\n (click)=\"toggleGroup(item)\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-expanded]=\"item.expanded\"\r\n (keydown.enter)=\"toggleGroup(item)\"\r\n (keydown.space)=\"toggleGroup(item); $event.preventDefault()\">\r\n <div class=\"accordion-content\">\r\n <h4 class=\"accordion-title\">{{ item.title }}</h4>\r\n <p *ngIf=\"item.description\" class=\"accordion-description\">{{ item.description }}</p>\r\n </div>\r\n <mat-icon class=\"accordion-icon\" [class.rotated]=\"item.expanded\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n\r\n <!-- Accordion Body -->\r\n <ng-container *ngIf=\"item.expanded\">\r\n <div class=\"accordion-divider\"></div>\r\n <div class=\"accordion-body\">\r\n <!-- Permission Header Row -->\r\n <div class=\"permission-header-row\">\r\n <span class=\"permission-group-label\">{{ item.title }}</span>\r\n <div class=\"permission-separator\"></div>\r\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\r\n <span class=\"select-all-label\">{{ selectAllLabelKey | translate }}</span>\r\n <mat-checkbox\r\n [checked]=\"isAllPermissionsSelected(item)\"\r\n [disabled]=\"readonly\"\r\n (change)=\"toggleSelectAll(item)\"\r\n color=\"primary\"\r\n class=\"select-all-checkbox\">\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n\r\n <!-- Permissions Row -->\r\n <div class=\"permissions-row\" (click)=\"$event.stopPropagation()\">\r\n <div\r\n *ngFor=\"let permission of permissions; trackBy: trackByPermission\"\r\n class=\"permission-item\">\r\n <mat-checkbox\r\n [checked]=\"isPermissionSelected(item, permission)\"\r\n [disabled]=\"isPermissionDisabled(item, permission)\"\r\n (change)=\"togglePermission(item, permission)\"\r\n color=\"primary\">\r\n </mat-checkbox>\r\n <span class=\"permission-label\">{{ permission.labelKey | translate }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>", styles: [".permission-matrix-card{background:#fff;border:1px solid #f0eeee;border-radius:8px;padding:16px;display:flex;flex-direction:column;gap:20px}.matrix-header{display:flex;align-items:center;justify-content:space-between;min-height:27px}.matrix-title{font-family:lusail-bold,sans-serif;font-weight:700;font-size:24px;line-height:1.2;color:#000;margin:0}.expand-all-btn{display:flex;align-items:center;gap:4px;background:transparent;border:none;cursor:pointer;padding:0;font-family:lusail-regular,sans-serif;font-weight:400;font-size:20px;line-height:1.2;color:#000;transition:all .2s ease}.expand-all-btn:hover{color:#0d4261}.expand-all-btn:focus-visible{outline:2px solid #0d4261;outline-offset:2px;border-radius:4px}.expand-icon{font-size:24px;width:24px;height:24px;color:#000;transition:transform .3s ease}.expand-icon.rotated{transform:rotate(180deg)}.matrix-divider{height:2px;background-color:#0d4261;width:100%}.matrix-accordion-list{display:flex;flex-direction:column;gap:0}.matrix-accordion-item{background:#fff;border:1px solid #f0eeee;border-radius:8px;padding:16px;margin-bottom:0;transition:all .2s ease}.matrix-accordion-item:not(:last-child){margin-bottom:20px}.accordion-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;width:100%}.accordion-header:focus-visible{outline:2px solid #0d4261;outline-offset:2px;border-radius:4px}.accordion-content{flex:1;display:flex;flex-direction:column;gap:0}.accordion-title{font-family:lusail-bold,sans-serif;font-weight:700;font-size:20px;line-height:1.2;color:#000;margin:0 0 4px}.accordion-description{font-family:lusail-light,sans-serif;font-weight:300;font-size:16px;line-height:1.2;color:#888;margin:0}.accordion-icon{font-size:24px;width:24px;height:24px;color:#222;transition:transform .3s ease;flex-shrink:0}.accordion-icon.rotated{transform:rotate(180deg)}.accordion-divider{margin-top:16px;height:1px;background-color:#f0eeee;width:calc(100% + 32px);margin-left:-16px;margin-right:-16px;border:none}.accordion-body{padding-top:16px;display:flex;flex-direction:column;gap:12px;margin-left:-16px;margin-right:-16px;padding-left:16px;padding-right:16px}.permission-header-row{display:flex;align-items:center;gap:4px;width:100%}.permission-group-label{font-family:lusail-regular,sans-serif;font-weight:400;font-size:16px;line-height:1.2;color:#5c5c5c;flex-shrink:0}.permission-separator{flex:1;height:1px;background-color:#f0eeee;margin:0 4px}.select-all-container{display:flex;align-items:center;gap:4px;flex-shrink:0;flex-direction:row-reverse}.select-all-label{font-family:lusail-regular,sans-serif;font-weight:400;font-size:20px;line-height:1.2;color:#000}.select-all-checkbox{flex-shrink:0}.permissions-row{display:flex;gap:20px;align-items:center;flex-wrap:wrap}.permission-item{display:flex;align-items:center;gap:4px;min-height:19px}.permission-label{font-family:lusail-medium,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#222;white-space:nowrap}::ng-deep .select-all-checkbox .mdc-checkbox__background,::ng-deep .permission-item .mdc-checkbox__background{border-color:#b7b7b7!important;border-radius:4px!important}::ng-deep .select-all-checkbox.mat-mdc-checkbox-checked .mdc-checkbox__background,::ng-deep .permission-item.mat-mdc-checkbox-checked .mdc-checkbox__background{background-color:#0d4261!important;border-color:#0d4261!important}::ng-deep .mdc-checkbox__checkmark{color:#fff!important}::ng-deep .mdc-checkbox{display:inline-block;position:relative;flex:0 0 18px;box-sizing:content-box;width:18px;height:28px!important;line-height:0;white-space:nowrap;cursor:pointer;vertical-align:bottom;padding:calc((var(--mdc-checkbox-state-layer-size) - 25px) / 2)!important;margin:calc((var(--mdc-checkbox-state-layer-size) - var(--mdc-checkbox-state-layer-size)) / 2)}:host-context([dir=rtl]) .matrix-header{direction:rtl}:host-context([dir=rtl]) .accordion-header{direction:rtl}:host-context([dir=rtl]) .select-all-container{flex-direction:row}\n"] }]
|
|
110
150
|
}], propDecorators: { items: [{
|
|
111
151
|
type: Input
|
|
112
152
|
}], permissions: [{
|
|
@@ -121,9 +161,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
121
161
|
type: Input
|
|
122
162
|
}], readonly: [{
|
|
123
163
|
type: Input
|
|
164
|
+
}], autoLockView: [{
|
|
165
|
+
type: Input
|
|
124
166
|
}], itemsChange: [{
|
|
125
167
|
type: Output
|
|
126
168
|
}], permissionChange: [{
|
|
127
169
|
type: Output
|
|
128
170
|
}] } });
|
|
129
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi1tYXRyaXguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW52b2ljZXEvdWktbGliL3NyYy9saWIvY29tcG9uZW50cy9wZXJtaXNzaW9uLW1hdHJpeC9wZXJtaXNzaW9uLW1hdHJpeC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL3Blcm1pc3Npb24tbWF0cml4L3Blcm1pc3Npb24tbWF0cml4LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7OztBQWV0RCxNQUFNLE9BQU8seUJBQXlCO0lBWnRDO1FBY1csVUFBSyxHQUEyQixFQUFFLENBQUM7UUFDbkMsZ0JBQVcsR0FBdUI7WUFDekMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUU7WUFDeEMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUU7WUFDeEMsRUFBRSxHQUFHLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLDZCQUE2QixFQUFFLFlBQVksRUFBRSxDQUFDLG9CQUFvQixFQUFFLHFCQUFxQixDQUFDLEVBQUU7U0FDdEksQ0FBQztRQUNPLGFBQVEsR0FBVyxvQkFBb0IsQ0FBQztR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LFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixhQUFhO3dCQUNiLGlCQUFpQjt3QkFDakIsZUFBZTtxQkFDaEI7OEJBTVEsS0FBSztzQkFBYixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IFBlcm1pc3Npb25Db25maWcsIFBlcm1pc3Npb25NYXRyaXhJdGVtLCBQZXJtaXNzaW9uQ2hhbmdlRXZlbnQgfSBmcm9tICcuLi8uLi9iYXNlLW1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXBlcm1pc3Npb24tbWF0cml4JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIE1hdEljb25Nb2R1bGUsXHJcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcclxuICAgIFRyYW5zbGF0ZU1vZHVsZVxyXG4gIF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3Blcm1pc3Npb24tbWF0cml4LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vcGVybWlzc2lvbi1tYXRyaXguY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQZXJtaXNzaW9uTWF0cml4Q29tcG9uZW50IHtcclxuXHJcbiAgQElucHV0KCkgaXRlbXM6IFBlcm1pc3Npb25NYXRyaXhJdGVtW10gPSBbXTtcclxuICBASW5wdXQoKSBwZXJtaXNzaW9uczogUGVybWlzc2lvbkNvbmZpZ1tdID0gW1xyXG4gICAgeyBrZXk6ICd2aWV3JywgbGFiZWxLZXk6ICdHUk9VUFMudmlldycgfSxcclxuICAgIHsga2V5OiAnZWRpdCcsIGxhYmVsS2V5OiAnR1JPVVBTLmVkaXQnIH0sXHJcbiAgICB7IGtleTogJ2NvbXBsZXRlQW5kVGVybWluYXRlJywgbGFiZWxLZXk6ICdHUk9VUFMuY29tcGxldGVBbmRUZXJtaW5hdGUnLCBjb21iaW5lZEtleXM6IFsnY29tcGxldGVQZXJtaXNzaW9uJywgJ3Rlcm1pbmF0ZVBlcm1pc3Npb24nXSB9XHJcbiAgXTtcclxuICBASW5wdXQoKSB0aXRsZUtleTogc3RyaW5nID0gJ0dST1VQUy5ncm91cE1hdHJpeCc7XHJcbiAgQElucHV0KCkgc2VsZWN0QWxsTGFiZWxLZXk6IHN0cmluZyA9ICdHUk9VUFMuc2VsZWN0QWxsJztcclxuICBASW5wdXQoKSBleHBhbmRBbGxMYWJlbEtleTogc3RyaW5nID0gJ0dST1VQUy5leHBhbmRBbGwnO1xyXG4gIEBJbnB1dCgpIGNvbGxhcHNlQWxsTGFiZWxLZXk6IHN0cmluZyA9ICdHUk9VUFMuY29sbGFwc2VBbGwnO1xyXG4gIEBJbnB1dCgpIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQE91dHB1dCgpIGl0ZW1zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQZXJtaXNzaW9uTWF0cml4SXRlbVtdPigpO1xyXG4gIEBPdXRwdXQoKSBwZXJtaXNzaW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQZXJtaXNzaW9uQ2hhbmdlRXZlbnQ+KCk7XHJcblxyXG4gIGFyZUFsbEV4cGFuZGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RoID4gMCAmJiB0aGlzLml0ZW1zLmV2ZXJ5KGl0ZW0gPT4gaXRlbS5leHBhbmRlZCk7XHJcbiAgfVxyXG5cclxuICBleHBhbmRBbGxHcm91cHMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBleHBhbmQgPSAhdGhpcy5hcmVBbGxFeHBhbmRlZCgpO1xyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5leHBhbmRlZCA9IGV4cGFuZCk7XHJcbiAgICB0aGlzLmVtaXRJdGVtc0NoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlR3JvdXAoaXRlbTogUGVybWlzc2lvbk1hdHJpeEl0ZW0pOiB2b2lkIHtcclxuICAgIGl0ZW0uZXhwYW5kZWQgPSAhaXRlbS5leHBhbmRlZDtcclxuICAgIHRoaXMuZW1pdEl0ZW1zQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBpc0FsbFBlcm1pc3Npb25zU2VsZWN0ZWQoaXRlbTogUGVybWlzc2lvbk1hdHJpeEl0ZW0pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnBlcm1pc3Npb25zLmV2ZXJ5KHBlcm0gPT4ge1xyXG4gICAgICBpZiAocGVybS5jb21iaW5lZEtleXMpIHtcclxuICAgICAgICByZXR1cm4gcGVybS5jb21iaW5lZEtleXMuZXZlcnkoa2V5ID0+IGl0ZW0ucGVybWlzc2lvbnNba2V5XSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGl0ZW0ucGVybWlzc2lvbnNbcGVybS5rZXldO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTZWxlY3RBbGwoaXRlbTogUGVybWlzc2lvbk1hdHJpeEl0ZW0pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnJlYWRvbmx5KSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgYWxsU2VsZWN0ZWQgPSB0aGlzLmlzQWxsUGVybWlzc2lvbnNTZWxlY3RlZChpdGVtKTtcclxuICAgIGNvbnN0IG5ld1ZhbHVlID0gIWFsbFNlbGVjdGVkO1xyXG5cclxuICAgIHRoaXMucGVybWlzc2lvbnMuZm9yRWFjaChwZXJtID0+IHtcclxuICAgICAgaWYgKHBlcm0uY29tYmluZWRLZXlzKSB7XHJcbiAgICAgICAgcGVybS5jb21iaW5lZEtleXMuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgaXRlbS5wZXJtaXNzaW9uc1trZXldID0gbmV3VmFsdWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaXRlbS5wZXJtaXNzaW9uc1twZXJtLmtleV0gPSBuZXdWYWx1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5lbWl0SXRlbXNDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIGlzUGVybWlzc2lvblNlbGVjdGVkKGl0ZW06IFBlcm1pc3Npb25NYXRyaXhJdGVtLCBwZXJtaXNzaW9uOiBQZXJtaXNzaW9uQ29uZmlnKTogYm9vbGVhbiB7XHJcbiAgICBpZiAocGVybWlzc2lvbi5jb21iaW5lZEtleXMpIHtcclxuICAgICAgcmV0dXJuIHBlcm1pc3Npb24uY29tYmluZWRLZXlzLmV2ZXJ5KGtleSA9PiBpdGVtLnBlcm1pc3Npb25zW2tleV0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGl0ZW0ucGVybWlzc2lvbnNbcGVybWlzc2lvbi5rZXldO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlUGVybWlzc2lvbihpdGVtOiBQZXJtaXNzaW9uTWF0cml4SXRlbSwgcGVybWlzc2lvbjogUGVybWlzc2lvbkNvbmZpZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucmVhZG9ubHkpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmlzUGVybWlzc2lvblNlbGVjdGVkKGl0ZW0sIHBlcm1pc3Npb24pO1xyXG4gICAgY29uc3QgbmV3VmFsdWUgPSAhY3VycmVudFZhbHVlO1xyXG5cclxuICAgIGlmIChwZXJtaXNzaW9uLmNvbWJpbmVkS2V5cykge1xyXG4gICAgICBwZXJtaXNzaW9uLmNvbWJpbmVkS2V5cy5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgaXRlbS5wZXJtaXNzaW9uc1trZXldID0gbmV3VmFsdWU7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaXRlbS5wZXJtaXNzaW9uc1twZXJtaXNzaW9uLmtleV0gPSBuZXdWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnBlcm1pc3Npb25DaGFuZ2UuZW1pdCh7XHJcbiAgICAgIGl0ZW0sXHJcbiAgICAgIHBlcm1pc3Npb25LZXk6IHBlcm1pc3Npb24ua2V5LFxyXG4gICAgICBuZXdWYWx1ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5lbWl0SXRlbXNDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW1pdEl0ZW1zQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pdGVtc0NoYW5nZS5lbWl0KFsuLi50aGlzLml0ZW1zXSk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5SXRlbShpbmRleDogbnVtYmVyLCBpdGVtOiBQZXJtaXNzaW9uTWF0cml4SXRlbSk6IHN0cmluZyB8IG51bWJlciB7XHJcbiAgICByZXR1cm4gaXRlbS5pZCA/PyBpbmRleDtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlQZXJtaXNzaW9uKGluZGV4OiBudW1iZXIsIHBlcm1pc3Npb246IFBlcm1pc3Npb25Db25maWcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHBlcm1pc3Npb24ua2V5O1xyXG4gIH1cclxufSIsIjxkaXYgY2xhc3M9XCJwZXJtaXNzaW9uLW1hdHJpeC1jYXJkXCI+XHJcbiAgPGRpdiBjbGFzcz1cIm1hdHJpeC1oZWFkZXJcIj5cclxuICAgIDxoMyBjbGFzcz1cIm1hdHJpeC10aXRsZVwiPnt7IHRpdGxlS2V5IHwgdHJhbnNsYXRlIH19PC9oMz5cclxuICAgIDxidXR0b25cclxuICAgICAgY2xhc3M9XCJleHBhbmQtYWxsLWJ0blwiXHJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAoY2xpY2spPVwiZXhwYW5kQWxsR3JvdXBzKClcIlxyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihhcmVBbGxFeHBhbmRlZCgpID8gY29sbGFwc2VBbGxMYWJlbEtleSA6IGV4cGFuZEFsbExhYmVsS2V5KSB8IHRyYW5zbGF0ZVwiPlxyXG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJleHBhbmQtaWNvblwiIFtjbGFzcy5yb3RhdGVkXT1cImFyZUFsbEV4cGFuZGVkKClcIj51bmZvbGRfbW9yZTwvbWF0LWljb24+XHJcbiAgICAgIDxzcGFuPnt7IChhcmVBbGxFeHBhbmRlZCgpID8gY29sbGFwc2VBbGxMYWJlbEtleSA6IGV4cGFuZEFsbExhYmVsS2V5KSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwibWF0cml4LWRpdmlkZXJcIj48L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cIm1hdHJpeC1hY2NvcmRpb24tbGlzdFwiPlxyXG4gICAgPGRpdlxyXG4gICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtczsgdHJhY2tCeTogdHJhY2tCeUl0ZW1cIlxyXG4gICAgICBjbGFzcz1cIm1hdHJpeC1hY2NvcmRpb24taXRlbVwiXHJcbiAgICAgIFtjbGFzcy5leHBhbmRlZF09XCJpdGVtLmV4cGFuZGVkXCI+XHJcblxyXG4gICAgICA8IS0tIEFjY29yZGlvbiBIZWFkZXIgLS0+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXJcIlxyXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVHcm91cChpdGVtKVwiXHJcbiAgICAgICAgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcclxuICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIml0ZW0uZXhwYW5kZWRcIlxyXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cInRvZ2dsZUdyb3VwKGl0ZW0pXCJcclxuICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJ0b2dnbGVHcm91cChpdGVtKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWNvbnRlbnRcIj5cclxuICAgICAgICAgIDxoNCBjbGFzcz1cImFjY29yZGlvbi10aXRsZVwiPnt7IGl0ZW0udGl0bGUgfX08L2g0PlxyXG4gICAgICAgICAgPHAgKm5nSWY9XCJpdGVtLmRlc2NyaXB0aW9uXCIgY2xhc3M9XCJhY2NvcmRpb24tZGVzY3JpcHRpb25cIj57eyBpdGVtLmRlc2NyaXB0aW9uIH19PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFjY29yZGlvbi1pY29uXCIgW2NsYXNzLnJvdGF0ZWRdPVwiaXRlbS5leHBhbmRlZFwiPmtleWJvYXJkX2Fycm93X2Rvd248L21hdC1pY29uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gQWNjb3JkaW9uIEJvZHkgLS0+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLmV4cGFuZGVkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1kaXZpZGVyXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1ib2R5XCI+XHJcbiAgICAgICAgICA8IS0tIFBlcm1pc3Npb24gSGVhZGVyIFJvdyAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwZXJtaXNzaW9uLWhlYWRlci1yb3dcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwZXJtaXNzaW9uLWdyb3VwLWxhYmVsXCI+e3sgaXRlbS50aXRsZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcm1pc3Npb24tc2VwYXJhdG9yXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QtYWxsLWNvbnRhaW5lclwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdC1hbGwtbGFiZWxcIj57eyBzZWxlY3RBbGxMYWJlbEtleSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0FsbFBlcm1pc3Npb25zU2VsZWN0ZWQoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsKGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdC1hbGwtY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIFBlcm1pc3Npb25zIFJvdyAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwZXJtaXNzaW9ucy1yb3dcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcGVybWlzc2lvbiBvZiBwZXJtaXNzaW9uczsgdHJhY2tCeTogdHJhY2tCeVBlcm1pc3Npb25cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwicGVybWlzc2lvbi1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1jaGVja2JveFxyXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNQZXJtaXNzaW9uU2VsZWN0ZWQoaXRlbSwgcGVybWlzc2lvbilcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlUGVybWlzc2lvbihpdGVtLCBwZXJtaXNzaW9uKVwiXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIj5cclxuICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBlcm1pc3Npb24tbGFiZWxcIj57eyBwZXJtaXNzaW9uLmxhYmVsS2V5IHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi1tYXRyaXguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW52b2ljZXEvdWktbGliL3NyYy9saWIvY29tcG9uZW50cy9wZXJtaXNzaW9uLW1hdHJpeC9wZXJtaXNzaW9uLW1hdHJpeC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL3Blcm1pc3Npb24tbWF0cml4L3Blcm1pc3Npb24tbWF0cml4LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7OztBQWV0RCxNQUFNLE9BQU8seUJBQXlCO0lBWnRDO1FBY1csVUFBSyxHQUEyQixFQUFFLENBQUM7UUFDbkMsZ0JBQVcsR0FBdUI7WUFDekMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUU7WUFDeEMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUU7WUFDeEMsRUFBRSxHQUFHLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLDZCQUE2QixFQUFFLFlBQVksRUFBRSxDQUFDLG9CQUFvQixFQUFFLHFCQUFxQixDQUFDLEVBQUU7U0FDdEksQ0FBQztRQUNPLGFBQVEsR0FBVyxvQkFBb0IsQ0FBQztR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QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFhLEVBQUUsSUFBMEI7UUFDbkQsT0FBTyxJQUFJLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsS0FBYSxFQUFFLFVBQTRCO1FBQzNELE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQztJQUN4QixDQUFDOytHQWpKVSx5QkFBeUI7bUdBQXpCLHlCQUF5Qiw4WkNuQnRDLDB1R0EyRU0sdTdIRGhFRixZQUFZLCtQQUNaLGFBQWEsbUxBQ2IsaUJBQWlCLDZXQUNqQixlQUFlOzs0RkFLTix5QkFBeUI7a0JBWnJDLFNBQVM7K0JBQ0UsdUJBQXVCLGNBQ3JCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLGFBQWE7d0JBQ2IsaUJBQWlCO3dCQUNqQixlQUFlO3FCQUNoQjs4QkFNUSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFLRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBQZXJtaXNzaW9uQ29uZmlnLCBQZXJtaXNzaW9uTWF0cml4SXRlbSwgUGVybWlzc2lvbkNoYW5nZUV2ZW50IH0gZnJvbSAnLi4vLi4vYmFzZS1tb2RlbCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1wZXJtaXNzaW9uLW1hdHJpeCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXHJcbiAgICBUcmFuc2xhdGVNb2R1bGVcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wZXJtaXNzaW9uLW1hdHJpeC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3Blcm1pc3Npb24tbWF0cml4LmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvbk1hdHJpeENvbXBvbmVudCB7XHJcblxyXG4gIEBJbnB1dCgpIGl0ZW1zOiBQZXJtaXNzaW9uTWF0cml4SXRlbVtdID0gW107XHJcbiAgQElucHV0KCkgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25Db25maWdbXSA9IFtcclxuICAgIHsga2V5OiAndmlldycsIGxhYmVsS2V5OiAnR1JPVVBTLnZpZXcnIH0sXHJcbiAgICB7IGtleTogJ2VkaXQnLCBsYWJlbEtleTogJ0dST1VQUy5lZGl0JyB9LFxyXG4gICAgeyBrZXk6ICdjb21wbGV0ZUFuZFRlcm1pbmF0ZScsIGxhYmVsS2V5OiAnR1JPVVBTLmNvbXBsZXRlQW5kVGVybWluYXRlJywgY29tYmluZWRLZXlzOiBbJ2NvbXBsZXRlUGVybWlzc2lvbicsICd0ZXJtaW5hdGVQZXJtaXNzaW9uJ10gfVxyXG4gIF07XHJcbiAgQElucHV0KCkgdGl0bGVLZXk6IHN0cmluZyA9ICdHUk9VUFMuZ3JvdXBNYXRyaXgnO1xyXG4gIEBJbnB1dCgpIHNlbGVjdEFsbExhYmVsS2V5OiBzdHJpbmcgPSAnR1JPVVBTLnNlbGVjdEFsbCc7XHJcbiAgQElucHV0KCkgZXhwYW5kQWxsTGFiZWxLZXk6IHN0cmluZyA9ICdHUk9VUFMuZXhwYW5kQWxsJztcclxuICBASW5wdXQoKSBjb2xsYXBzZUFsbExhYmVsS2V5OiBzdHJpbmcgPSAnR1JPVVBTLmNvbGxhcHNlQWxsJztcclxuICBASW5wdXQoKSByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGF1dG9Mb2NrVmlldzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSBpdGVtc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UGVybWlzc2lvbk1hdHJpeEl0ZW1bXT4oKTtcclxuICBAT3V0cHV0KCkgcGVybWlzc2lvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UGVybWlzc2lvbkNoYW5nZUV2ZW50PigpO1xyXG5cclxuICBhcmVBbGxFeHBhbmRlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLml0ZW1zLmxlbmd0aCA+IDAgJiYgdGhpcy5pdGVtcy5ldmVyeShpdGVtID0+IGl0ZW0uZXhwYW5kZWQpO1xyXG4gIH1cclxuXHJcbiAgZXhwYW5kQWxsR3JvdXBzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZXhwYW5kID0gIXRoaXMuYXJlQWxsRXhwYW5kZWQoKTtcclxuICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IGl0ZW0uZXhwYW5kZWQgPSBleHBhbmQpO1xyXG4gICAgdGhpcy5lbWl0SXRlbXNDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUdyb3VwKGl0ZW06IFBlcm1pc3Npb25NYXRyaXhJdGVtKTogdm9pZCB7XHJcbiAgICBpdGVtLmV4cGFuZGVkID0gIWl0ZW0uZXhwYW5kZWQ7XHJcbiAgICB0aGlzLmVtaXRJdGVtc0NoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgaXNBbGxQZXJtaXNzaW9uc1NlbGVjdGVkKGl0ZW06IFBlcm1pc3Npb25NYXRyaXhJdGVtKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9ucy5ldmVyeShwZXJtID0+IHtcclxuICAgICAgaWYgKHBlcm0uY29tYmluZWRLZXlzKSB7XHJcbiAgICAgICAgcmV0dXJuIHBlcm0uY29tYmluZWRLZXlzLmV2ZXJ5KGtleSA9PiBpdGVtLnBlcm1pc3Npb25zW2tleV0pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBpdGVtLnBlcm1pc3Npb25zW3Blcm0ua2V5XTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VsZWN0QWxsKGl0ZW06IFBlcm1pc3Npb25NYXRyaXhJdGVtKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5yZWFkb25seSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGFsbFNlbGVjdGVkID0gdGhpcy5pc0FsbFBlcm1pc3Npb25zU2VsZWN0ZWQoaXRlbSk7XHJcbiAgICBjb25zdCBuZXdWYWx1ZSA9ICFhbGxTZWxlY3RlZDtcclxuXHJcbiAgICB0aGlzLnBlcm1pc3Npb25zLmZvckVhY2gocGVybSA9PiB7XHJcbiAgICAgIGlmIChwZXJtLmNvbWJpbmVkS2V5cykge1xyXG4gICAgICAgIHBlcm0uY29tYmluZWRLZXlzLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgIGl0ZW0ucGVybWlzc2lvbnNba2V5XSA9IG5ld1ZhbHVlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGl0ZW0ucGVybWlzc2lvbnNbcGVybS5rZXldID0gbmV3VmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLmF1dG9Mb2NrVmlldykge1xyXG4gICAgICB0aGlzLnN5bmNWaWV3UGVybWlzc2lvbihpdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVtaXRJdGVtc0NoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgaXNQZXJtaXNzaW9uU2VsZWN0ZWQoaXRlbTogUGVybWlzc2lvbk1hdHJpeEl0ZW0sIHBlcm1pc3Npb246IFBlcm1pc3Npb25Db25maWcpOiBib29sZWFuIHtcclxuICAgIGlmIChwZXJtaXNzaW9uLmNvbWJpbmVkS2V5cykge1xyXG4gICAgICByZXR1cm4gcGVybWlzc2lvbi5jb21iaW5lZEtleXMuZXZlcnkoa2V5ID0+IGl0ZW0ucGVybWlzc2lvbnNba2V5XSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXRlbS5wZXJtaXNzaW9uc1twZXJtaXNzaW9uLmtleV07XHJcbiAgfVxyXG5cclxuICBpc1Blcm1pc3Npb25EaXNhYmxlZChpdGVtOiBQZXJtaXNzaW9uTWF0cml4SXRlbSwgcGVybWlzc2lvbjogUGVybWlzc2lvbkNvbmZpZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5hdXRvTG9ja1ZpZXcgJiYgcGVybWlzc2lvbi5rZXkgPT09ICd2aWV3Jykge1xyXG4gICAgICByZXR1cm4gdGhpcy5oYXNOb25WaWV3UGVybWlzc2lvbihpdGVtKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVBlcm1pc3Npb24oaXRlbTogUGVybWlzc2lvbk1hdHJpeEl0ZW0sIHBlcm1pc3Npb246IFBlcm1pc3Npb25Db25maWcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzUGVybWlzc2lvbkRpc2FibGVkKGl0ZW0sIHBlcm1pc3Npb24pKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmlzUGVybWlzc2lvblNlbGVjdGVkKGl0ZW0sIHBlcm1pc3Npb24pO1xyXG4gICAgY29uc3QgbmV3VmFsdWUgPSAhY3VycmVudFZhbHVlO1xyXG5cclxuICAgIGlmIChwZXJtaXNzaW9uLmNvbWJpbmVkS2V5cykge1xyXG4gICAgICBwZXJtaXNzaW9uLmNvbWJpbmVkS2V5cy5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgaXRlbS5wZXJtaXNzaW9uc1trZXldID0gbmV3VmFsdWU7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaXRlbS5wZXJtaXNzaW9uc1twZXJtaXNzaW9uLmtleV0gPSBuZXdWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5hdXRvTG9ja1ZpZXcpIHtcclxuICAgICAgdGhpcy5zeW5jVmlld1Blcm1pc3Npb24oaXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wZXJtaXNzaW9uQ2hhbmdlLmVtaXQoe1xyXG4gICAgICBpdGVtLFxyXG4gICAgICBwZXJtaXNzaW9uS2V5OiBwZXJtaXNzaW9uLmtleSxcclxuICAgICAgbmV3VmFsdWVcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZW1pdEl0ZW1zQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhc05vblZpZXdQZXJtaXNzaW9uKGl0ZW06IFBlcm1pc3Npb25NYXRyaXhJdGVtKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9ucy5zb21lKHBlcm0gPT4ge1xyXG4gICAgICBpZiAocGVybS5rZXkgPT09ICd2aWV3Jykge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocGVybS5jb21iaW5lZEtleXMpIHtcclxuICAgICAgICByZXR1cm4gcGVybS5jb21iaW5lZEtleXMuc29tZShrZXkgPT4gaXRlbS5wZXJtaXNzaW9uc1trZXldKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gISFpdGVtLnBlcm1pc3Npb25zW3Blcm0ua2V5XTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzeW5jVmlld1Blcm1pc3Npb24oaXRlbTogUGVybWlzc2lvbk1hdHJpeEl0ZW0pOiB2b2lkIHtcclxuICAgIGNvbnN0IHZpZXdLZXkgPSB0aGlzLnBlcm1pc3Npb25zLmZpbmQocCA9PiBwLmtleSA9PT0gJ3ZpZXcnICYmICFwLmNvbWJpbmVkS2V5cyk/LmtleTtcclxuICAgIGlmICghdmlld0tleSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5oYXNOb25WaWV3UGVybWlzc2lvbihpdGVtKSkge1xyXG4gICAgICBpdGVtLnBlcm1pc3Npb25zW3ZpZXdLZXldID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW1pdEl0ZW1zQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYXV0b0xvY2tWaWV3KSB7XHJcbiAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IHRoaXMuc3luY1ZpZXdQZXJtaXNzaW9uKGl0ZW0pKTtcclxuICAgIH1cclxuICAgIHRoaXMuaXRlbXNDaGFuZ2UuZW1pdChbLi4udGhpcy5pdGVtc10pO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeUl0ZW0oaW5kZXg6IG51bWJlciwgaXRlbTogUGVybWlzc2lvbk1hdHJpeEl0ZW0pOiBzdHJpbmcgfCBudW1iZXIge1xyXG4gICAgcmV0dXJuIGl0ZW0uaWQgPz8gaW5kZXg7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5UGVybWlzc2lvbihpbmRleDogbnVtYmVyLCBwZXJtaXNzaW9uOiBQZXJtaXNzaW9uQ29uZmlnKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBwZXJtaXNzaW9uLmtleTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInBlcm1pc3Npb24tbWF0cml4LWNhcmRcIj5cclxuICA8ZGl2IGNsYXNzPVwibWF0cml4LWhlYWRlclwiPlxyXG4gICAgPGgzIGNsYXNzPVwibWF0cml4LXRpdGxlXCI+e3sgdGl0bGVLZXkgfCB0cmFuc2xhdGUgfX08L2gzPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICBjbGFzcz1cImV4cGFuZC1hbGwtYnRuXCJcclxuICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIChjbGljayk9XCJleHBhbmRBbGxHcm91cHMoKVwiXHJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGFyZUFsbEV4cGFuZGVkKCkgPyBjb2xsYXBzZUFsbExhYmVsS2V5IDogZXhwYW5kQWxsTGFiZWxLZXkpIHwgdHJhbnNsYXRlXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImV4cGFuZC1pY29uXCIgW2NsYXNzLnJvdGF0ZWRdPVwiYXJlQWxsRXhwYW5kZWQoKVwiPnVuZm9sZF9tb3JlPC9tYXQtaWNvbj5cclxuICAgICAgPHNwYW4+e3sgKGFyZUFsbEV4cGFuZGVkKCkgPyBjb2xsYXBzZUFsbExhYmVsS2V5IDogZXhwYW5kQWxsTGFiZWxLZXkpIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJtYXRyaXgtZGl2aWRlclwiPjwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwibWF0cml4LWFjY29yZGlvbi1saXN0XCI+XHJcbiAgICA8ZGl2XHJcbiAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyB0cmFja0J5OiB0cmFja0J5SXRlbVwiXHJcbiAgICAgIGNsYXNzPVwibWF0cml4LWFjY29yZGlvbi1pdGVtXCJcclxuICAgICAgW2NsYXNzLmV4cGFuZGVkXT1cIml0ZW0uZXhwYW5kZWRcIj5cclxuXHJcbiAgICAgIDwhLS0gQWNjb3JkaW9uIEhlYWRlciAtLT5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRlclwiXHJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUdyb3VwKGl0ZW0pXCJcclxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcclxuICAgICAgICB0YWJpbmRleD1cIjBcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXRlbS5leHBhbmRlZFwiXHJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwidG9nZ2xlR3JvdXAoaXRlbSlcIlxyXG4gICAgICAgIChrZXlkb3duLnNwYWNlKT1cInRvZ2dsZUdyb3VwKGl0ZW0pOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24tY29udGVudFwiPlxyXG4gICAgICAgICAgPGg0IGNsYXNzPVwiYWNjb3JkaW9uLXRpdGxlXCI+e3sgaXRlbS50aXRsZSB9fTwvaDQ+XHJcbiAgICAgICAgICA8cCAqbmdJZj1cIml0ZW0uZGVzY3JpcHRpb25cIiBjbGFzcz1cImFjY29yZGlvbi1kZXNjcmlwdGlvblwiPnt7IGl0ZW0uZGVzY3JpcHRpb24gfX08L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYWNjb3JkaW9uLWljb25cIiBbY2xhc3Mucm90YXRlZF09XCJpdGVtLmV4cGFuZGVkXCI+a2V5Ym9hcmRfYXJyb3dfZG93bjwvbWF0LWljb24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBBY2NvcmRpb24gQm9keSAtLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0uZXhwYW5kZWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWRpdmlkZXJcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWJvZHlcIj5cclxuICAgICAgICAgIDwhLS0gUGVybWlzc2lvbiBIZWFkZXIgUm93IC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBlcm1pc3Npb24taGVhZGVyLXJvd1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBlcm1pc3Npb24tZ3JvdXAtbGFiZWxcIj57eyBpdGVtLnRpdGxlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVybWlzc2lvbi1zZXBhcmF0b3JcIj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC1hbGwtY29udGFpbmVyXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0LWFsbC1sYWJlbFwiPnt7IHNlbGVjdEFsbExhYmVsS2V5IHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzQWxsUGVybWlzc2lvbnNTZWxlY3RlZChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3RBbGwoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0LWFsbC1jaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gUGVybWlzc2lvbnMgUm93IC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBlcm1pc3Npb25zLXJvd1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBwZXJtaXNzaW9uIG9mIHBlcm1pc3Npb25zOyB0cmFja0J5OiB0cmFja0J5UGVybWlzc2lvblwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwZXJtaXNzaW9uLWl0ZW1cIj5cclxuICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc1Blcm1pc3Npb25TZWxlY3RlZChpdGVtLCBwZXJtaXNzaW9uKVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNQZXJtaXNzaW9uRGlzYWJsZWQoaXRlbSwgcGVybWlzc2lvbilcIlxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVQZXJtaXNzaW9uKGl0ZW0sIHBlcm1pc3Npb24pXCJcclxuICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiPlxyXG4gICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGVybWlzc2lvbi1sYWJlbFwiPnt7IHBlcm1pc3Npb24ubGFiZWxLZXkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
|
|
@@ -2293,11 +2293,19 @@ class BaseFormCanvasComponent {
|
|
|
2293
2293
|
}
|
|
2294
2294
|
const field = this.fields.find(f => f.property === prop);
|
|
2295
2295
|
if (!field?.validationMessages) {
|
|
2296
|
+
if (field?.type === 'phone-number' && control.touched && control.dirty && !control.value) {
|
|
2297
|
+
const prefix = this.pageInfo.labelsSection + ".";
|
|
2298
|
+
return prefix + 'INVALID_PHONE_NUMBER';
|
|
2299
|
+
}
|
|
2296
2300
|
if (control.value && control.status !== 'VALID' && this.getFirstErrorKey) {
|
|
2297
2301
|
return this.getFirstErrorKey(prop);
|
|
2298
2302
|
}
|
|
2299
2303
|
return '';
|
|
2300
2304
|
}
|
|
2305
|
+
if (field?.type === 'phone-number' && control.touched && control.dirty && !control.value) {
|
|
2306
|
+
const prefix = this.pageInfo.labelsSection + ".";
|
|
2307
|
+
return prefix + (field.validationMessages?.validatePhoneNumber || 'INVALID_PHONE_NUMBER');
|
|
2308
|
+
}
|
|
2301
2309
|
if (control.invalid) {
|
|
2302
2310
|
const errors = control.errors || {};
|
|
2303
2311
|
const prefix = this.pageInfo.labelsSection + ".";
|
|
@@ -2315,6 +2323,8 @@ class BaseFormCanvasComponent {
|
|
|
2315
2323
|
return prefix + (field.validationMessages?.decimalMax || 'DECIMAL_MAX');
|
|
2316
2324
|
if (errors['pattern'])
|
|
2317
2325
|
return prefix + (field.validationMessages?.pattern || 'INVALID_FORMAT');
|
|
2326
|
+
if (errors['validatePhoneNumber'])
|
|
2327
|
+
return prefix + (field.validationMessages?.validatePhoneNumber || 'INVALID_PHONE_NUMBER');
|
|
2318
2328
|
if (errors['invalidMathExpression'])
|
|
2319
2329
|
return prefix + 'INVALID_MATH';
|
|
2320
2330
|
if (errors['dateRangeInvalid'])
|
|
@@ -2357,6 +2367,10 @@ class BaseFormCanvasComponent {
|
|
|
2357
2367
|
}
|
|
2358
2368
|
showError(prop) {
|
|
2359
2369
|
const CONTROL = this.formParam?.get([prop]);
|
|
2370
|
+
const field = this.fields.find(f => f.property === prop);
|
|
2371
|
+
if (field?.type === 'phone-number') {
|
|
2372
|
+
return CONTROL?.touched && CONTROL?.dirty && !CONTROL?.value;
|
|
2373
|
+
}
|
|
2360
2374
|
return (CONTROL?.value || CONTROL?.value === 0) && CONTROL?.status === 'INVALID';
|
|
2361
2375
|
}
|
|
2362
2376
|
clearFieldValue(prop) {
|
|
@@ -6607,6 +6621,7 @@ class PermissionMatrixComponent {
|
|
|
6607
6621
|
this.expandAllLabelKey = 'GROUPS.expandAll';
|
|
6608
6622
|
this.collapseAllLabelKey = 'GROUPS.collapseAll';
|
|
6609
6623
|
this.readonly = false;
|
|
6624
|
+
this.autoLockView = false;
|
|
6610
6625
|
this.itemsChange = new EventEmitter();
|
|
6611
6626
|
this.permissionChange = new EventEmitter();
|
|
6612
6627
|
}
|
|
@@ -6645,6 +6660,9 @@ class PermissionMatrixComponent {
|
|
|
6645
6660
|
item.permissions[perm.key] = newValue;
|
|
6646
6661
|
}
|
|
6647
6662
|
});
|
|
6663
|
+
if (this.autoLockView) {
|
|
6664
|
+
this.syncViewPermission(item);
|
|
6665
|
+
}
|
|
6648
6666
|
this.emitItemsChange();
|
|
6649
6667
|
}
|
|
6650
6668
|
isPermissionSelected(item, permission) {
|
|
@@ -6653,9 +6671,19 @@ class PermissionMatrixComponent {
|
|
|
6653
6671
|
}
|
|
6654
6672
|
return item.permissions[permission.key];
|
|
6655
6673
|
}
|
|
6674
|
+
isPermissionDisabled(item, permission) {
|
|
6675
|
+
if (this.readonly) {
|
|
6676
|
+
return true;
|
|
6677
|
+
}
|
|
6678
|
+
if (this.autoLockView && permission.key === 'view') {
|
|
6679
|
+
return this.hasNonViewPermission(item);
|
|
6680
|
+
}
|
|
6681
|
+
return false;
|
|
6682
|
+
}
|
|
6656
6683
|
togglePermission(item, permission) {
|
|
6657
|
-
if (this.
|
|
6684
|
+
if (this.isPermissionDisabled(item, permission)) {
|
|
6658
6685
|
return;
|
|
6686
|
+
}
|
|
6659
6687
|
const currentValue = this.isPermissionSelected(item, permission);
|
|
6660
6688
|
const newValue = !currentValue;
|
|
6661
6689
|
if (permission.combinedKeys) {
|
|
@@ -6666,6 +6694,9 @@ class PermissionMatrixComponent {
|
|
|
6666
6694
|
else {
|
|
6667
6695
|
item.permissions[permission.key] = newValue;
|
|
6668
6696
|
}
|
|
6697
|
+
if (this.autoLockView) {
|
|
6698
|
+
this.syncViewPermission(item);
|
|
6699
|
+
}
|
|
6669
6700
|
this.permissionChange.emit({
|
|
6670
6701
|
item,
|
|
6671
6702
|
permissionKey: permission.key,
|
|
@@ -6673,7 +6704,30 @@ class PermissionMatrixComponent {
|
|
|
6673
6704
|
});
|
|
6674
6705
|
this.emitItemsChange();
|
|
6675
6706
|
}
|
|
6707
|
+
hasNonViewPermission(item) {
|
|
6708
|
+
return this.permissions.some(perm => {
|
|
6709
|
+
if (perm.key === 'view') {
|
|
6710
|
+
return false;
|
|
6711
|
+
}
|
|
6712
|
+
if (perm.combinedKeys) {
|
|
6713
|
+
return perm.combinedKeys.some(key => item.permissions[key]);
|
|
6714
|
+
}
|
|
6715
|
+
return !!item.permissions[perm.key];
|
|
6716
|
+
});
|
|
6717
|
+
}
|
|
6718
|
+
syncViewPermission(item) {
|
|
6719
|
+
const viewKey = this.permissions.find(p => p.key === 'view' && !p.combinedKeys)?.key;
|
|
6720
|
+
if (!viewKey) {
|
|
6721
|
+
return;
|
|
6722
|
+
}
|
|
6723
|
+
if (this.hasNonViewPermission(item)) {
|
|
6724
|
+
item.permissions[viewKey] = true;
|
|
6725
|
+
}
|
|
6726
|
+
}
|
|
6676
6727
|
emitItemsChange() {
|
|
6728
|
+
if (this.autoLockView) {
|
|
6729
|
+
this.items.forEach(item => this.syncViewPermission(item));
|
|
6730
|
+
}
|
|
6677
6731
|
this.itemsChange.emit([...this.items]);
|
|
6678
6732
|
}
|
|
6679
6733
|
trackByItem(index, item) {
|
|
@@ -6683,7 +6737,7 @@ class PermissionMatrixComponent {
|
|
|
6683
6737
|
return permission.key;
|
|
6684
6738
|
}
|
|
6685
6739
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PermissionMatrixComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6686
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PermissionMatrixComponent, isStandalone: true, selector: "lib-permission-matrix", inputs: { items: "items", permissions: "permissions", titleKey: "titleKey", selectAllLabelKey: "selectAllLabelKey", expandAllLabelKey: "expandAllLabelKey", collapseAllLabelKey: "collapseAllLabelKey", readonly: "readonly" }, outputs: { itemsChange: "itemsChange", permissionChange: "permissionChange" }, ngImport: i0, template: "<div class=\"permission-matrix-card\">\r\n <div class=\"matrix-header\">\r\n <h3 class=\"matrix-title\">{{ titleKey | translate }}</h3>\r\n <button\r\n class=\"expand-all-btn\"\r\n type=\"button\"\r\n (click)=\"expandAllGroups()\"\r\n [attr.aria-label]=\"(areAllExpanded() ? collapseAllLabelKey : expandAllLabelKey) | translate\">\r\n <mat-icon class=\"expand-icon\" [class.rotated]=\"areAllExpanded()\">unfold_more</mat-icon>\r\n <span>{{ (areAllExpanded() ? collapseAllLabelKey : expandAllLabelKey) | translate }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"matrix-divider\"></div>\r\n\r\n <div class=\"matrix-accordion-list\">\r\n <div\r\n *ngFor=\"let item of items; trackBy: trackByItem\"\r\n class=\"matrix-accordion-item\"\r\n [class.expanded]=\"item.expanded\">\r\n\r\n <!-- Accordion Header -->\r\n <div\r\n class=\"accordion-header\"\r\n (click)=\"toggleGroup(item)\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-expanded]=\"item.expanded\"\r\n (keydown.enter)=\"toggleGroup(item)\"\r\n (keydown.space)=\"toggleGroup(item); $event.preventDefault()\">\r\n <div class=\"accordion-content\">\r\n <h4 class=\"accordion-title\">{{ item.title }}</h4>\r\n <p *ngIf=\"item.description\" class=\"accordion-description\">{{ item.description }}</p>\r\n </div>\r\n <mat-icon class=\"accordion-icon\" [class.rotated]=\"item.expanded\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n\r\n <!-- Accordion Body -->\r\n <ng-container *ngIf=\"item.expanded\">\r\n <div class=\"accordion-divider\"></div>\r\n <div class=\"accordion-body\">\r\n <!-- Permission Header Row -->\r\n <div class=\"permission-header-row\">\r\n <span class=\"permission-group-label\">{{ item.title }}</span>\r\n <div class=\"permission-separator\"></div>\r\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\r\n <span class=\"select-all-label\">{{ selectAllLabelKey | translate }}</span>\r\n <mat-checkbox\r\n [checked]=\"isAllPermissionsSelected(item)\"\r\n [disabled]=\"readonly\"\r\n (change)=\"toggleSelectAll(item)\"\r\n color=\"primary\"\r\n class=\"select-all-checkbox\">\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n\r\n <!-- Permissions Row -->\r\n <div class=\"permissions-row\" (click)=\"$event.stopPropagation()\">\r\n <div\r\n *ngFor=\"let permission of permissions; trackBy: trackByPermission\"\r\n class=\"permission-item\">\r\n <mat-checkbox\r\n [checked]=\"isPermissionSelected(item, permission)\"\r\n [disabled]=\"
|
|
6740
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PermissionMatrixComponent, isStandalone: true, selector: "lib-permission-matrix", inputs: { items: "items", permissions: "permissions", titleKey: "titleKey", selectAllLabelKey: "selectAllLabelKey", expandAllLabelKey: "expandAllLabelKey", collapseAllLabelKey: "collapseAllLabelKey", readonly: "readonly", autoLockView: "autoLockView" }, outputs: { itemsChange: "itemsChange", permissionChange: "permissionChange" }, ngImport: i0, template: "<div class=\"permission-matrix-card\">\r\n <div class=\"matrix-header\">\r\n <h3 class=\"matrix-title\">{{ titleKey | translate }}</h3>\r\n <button\r\n class=\"expand-all-btn\"\r\n type=\"button\"\r\n (click)=\"expandAllGroups()\"\r\n [attr.aria-label]=\"(areAllExpanded() ? collapseAllLabelKey : expandAllLabelKey) | translate\">\r\n <mat-icon class=\"expand-icon\" [class.rotated]=\"areAllExpanded()\">unfold_more</mat-icon>\r\n <span>{{ (areAllExpanded() ? collapseAllLabelKey : expandAllLabelKey) | translate }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"matrix-divider\"></div>\r\n\r\n <div class=\"matrix-accordion-list\">\r\n <div\r\n *ngFor=\"let item of items; trackBy: trackByItem\"\r\n class=\"matrix-accordion-item\"\r\n [class.expanded]=\"item.expanded\">\r\n\r\n <!-- Accordion Header -->\r\n <div\r\n class=\"accordion-header\"\r\n (click)=\"toggleGroup(item)\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-expanded]=\"item.expanded\"\r\n (keydown.enter)=\"toggleGroup(item)\"\r\n (keydown.space)=\"toggleGroup(item); $event.preventDefault()\">\r\n <div class=\"accordion-content\">\r\n <h4 class=\"accordion-title\">{{ item.title }}</h4>\r\n <p *ngIf=\"item.description\" class=\"accordion-description\">{{ item.description }}</p>\r\n </div>\r\n <mat-icon class=\"accordion-icon\" [class.rotated]=\"item.expanded\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n\r\n <!-- Accordion Body -->\r\n <ng-container *ngIf=\"item.expanded\">\r\n <div class=\"accordion-divider\"></div>\r\n <div class=\"accordion-body\">\r\n <!-- Permission Header Row -->\r\n <div class=\"permission-header-row\">\r\n <span class=\"permission-group-label\">{{ item.title }}</span>\r\n <div class=\"permission-separator\"></div>\r\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\r\n <span class=\"select-all-label\">{{ selectAllLabelKey | translate }}</span>\r\n <mat-checkbox\r\n [checked]=\"isAllPermissionsSelected(item)\"\r\n [disabled]=\"readonly\"\r\n (change)=\"toggleSelectAll(item)\"\r\n color=\"primary\"\r\n class=\"select-all-checkbox\">\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n\r\n <!-- Permissions Row -->\r\n <div class=\"permissions-row\" (click)=\"$event.stopPropagation()\">\r\n <div\r\n *ngFor=\"let permission of permissions; trackBy: trackByPermission\"\r\n class=\"permission-item\">\r\n <mat-checkbox\r\n [checked]=\"isPermissionSelected(item, permission)\"\r\n [disabled]=\"isPermissionDisabled(item, permission)\"\r\n (change)=\"togglePermission(item, permission)\"\r\n color=\"primary\">\r\n </mat-checkbox>\r\n <span class=\"permission-label\">{{ permission.labelKey | translate }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>", styles: [".permission-matrix-card{background:#fff;border:1px solid #f0eeee;border-radius:8px;padding:16px;display:flex;flex-direction:column;gap:20px}.matrix-header{display:flex;align-items:center;justify-content:space-between;min-height:27px}.matrix-title{font-family:lusail-bold,sans-serif;font-weight:700;font-size:24px;line-height:1.2;color:#000;margin:0}.expand-all-btn{display:flex;align-items:center;gap:4px;background:transparent;border:none;cursor:pointer;padding:0;font-family:lusail-regular,sans-serif;font-weight:400;font-size:20px;line-height:1.2;color:#000;transition:all .2s ease}.expand-all-btn:hover{color:#0d4261}.expand-all-btn:focus-visible{outline:2px solid #0d4261;outline-offset:2px;border-radius:4px}.expand-icon{font-size:24px;width:24px;height:24px;color:#000;transition:transform .3s ease}.expand-icon.rotated{transform:rotate(180deg)}.matrix-divider{height:2px;background-color:#0d4261;width:100%}.matrix-accordion-list{display:flex;flex-direction:column;gap:0}.matrix-accordion-item{background:#fff;border:1px solid #f0eeee;border-radius:8px;padding:16px;margin-bottom:0;transition:all .2s ease}.matrix-accordion-item:not(:last-child){margin-bottom:20px}.accordion-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;width:100%}.accordion-header:focus-visible{outline:2px solid #0d4261;outline-offset:2px;border-radius:4px}.accordion-content{flex:1;display:flex;flex-direction:column;gap:0}.accordion-title{font-family:lusail-bold,sans-serif;font-weight:700;font-size:20px;line-height:1.2;color:#000;margin:0 0 4px}.accordion-description{font-family:lusail-light,sans-serif;font-weight:300;font-size:16px;line-height:1.2;color:#888;margin:0}.accordion-icon{font-size:24px;width:24px;height:24px;color:#222;transition:transform .3s ease;flex-shrink:0}.accordion-icon.rotated{transform:rotate(180deg)}.accordion-divider{margin-top:16px;height:1px;background-color:#f0eeee;width:calc(100% + 32px);margin-left:-16px;margin-right:-16px;border:none}.accordion-body{padding-top:16px;display:flex;flex-direction:column;gap:12px;margin-left:-16px;margin-right:-16px;padding-left:16px;padding-right:16px}.permission-header-row{display:flex;align-items:center;gap:4px;width:100%}.permission-group-label{font-family:lusail-regular,sans-serif;font-weight:400;font-size:16px;line-height:1.2;color:#5c5c5c;flex-shrink:0}.permission-separator{flex:1;height:1px;background-color:#f0eeee;margin:0 4px}.select-all-container{display:flex;align-items:center;gap:4px;flex-shrink:0;flex-direction:row-reverse}.select-all-label{font-family:lusail-regular,sans-serif;font-weight:400;font-size:20px;line-height:1.2;color:#000}.select-all-checkbox{flex-shrink:0}.permissions-row{display:flex;gap:20px;align-items:center;flex-wrap:wrap}.permission-item{display:flex;align-items:center;gap:4px;min-height:19px}.permission-label{font-family:lusail-medium,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#222;white-space:nowrap}::ng-deep .select-all-checkbox .mdc-checkbox__background,::ng-deep .permission-item .mdc-checkbox__background{border-color:#b7b7b7!important;border-radius:4px!important}::ng-deep .select-all-checkbox.mat-mdc-checkbox-checked .mdc-checkbox__background,::ng-deep .permission-item.mat-mdc-checkbox-checked .mdc-checkbox__background{background-color:#0d4261!important;border-color:#0d4261!important}::ng-deep .mdc-checkbox__checkmark{color:#fff!important}::ng-deep .mdc-checkbox{display:inline-block;position:relative;flex:0 0 18px;box-sizing:content-box;width:18px;height:28px!important;line-height:0;white-space:nowrap;cursor:pointer;vertical-align:bottom;padding:calc((var(--mdc-checkbox-state-layer-size) - 25px) / 2)!important;margin:calc((var(--mdc-checkbox-state-layer-size) - var(--mdc-checkbox-state-layer-size)) / 2)}:host-context([dir=rtl]) .matrix-header{direction:rtl}:host-context([dir=rtl]) .accordion-header{direction:rtl}:host-context([dir=rtl]) .select-all-container{flex-direction:row}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i3$4.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] }); }
|
|
6687
6741
|
}
|
|
6688
6742
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PermissionMatrixComponent, decorators: [{
|
|
6689
6743
|
type: Component,
|
|
@@ -6692,7 +6746,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
6692
6746
|
MatIconModule,
|
|
6693
6747
|
MatCheckboxModule,
|
|
6694
6748
|
TranslateModule
|
|
6695
|
-
], template: "<div class=\"permission-matrix-card\">\r\n <div class=\"matrix-header\">\r\n <h3 class=\"matrix-title\">{{ titleKey | translate }}</h3>\r\n <button\r\n class=\"expand-all-btn\"\r\n type=\"button\"\r\n (click)=\"expandAllGroups()\"\r\n [attr.aria-label]=\"(areAllExpanded() ? collapseAllLabelKey : expandAllLabelKey) | translate\">\r\n <mat-icon class=\"expand-icon\" [class.rotated]=\"areAllExpanded()\">unfold_more</mat-icon>\r\n <span>{{ (areAllExpanded() ? collapseAllLabelKey : expandAllLabelKey) | translate }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"matrix-divider\"></div>\r\n\r\n <div class=\"matrix-accordion-list\">\r\n <div\r\n *ngFor=\"let item of items; trackBy: trackByItem\"\r\n class=\"matrix-accordion-item\"\r\n [class.expanded]=\"item.expanded\">\r\n\r\n <!-- Accordion Header -->\r\n <div\r\n class=\"accordion-header\"\r\n (click)=\"toggleGroup(item)\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-expanded]=\"item.expanded\"\r\n (keydown.enter)=\"toggleGroup(item)\"\r\n (keydown.space)=\"toggleGroup(item); $event.preventDefault()\">\r\n <div class=\"accordion-content\">\r\n <h4 class=\"accordion-title\">{{ item.title }}</h4>\r\n <p *ngIf=\"item.description\" class=\"accordion-description\">{{ item.description }}</p>\r\n </div>\r\n <mat-icon class=\"accordion-icon\" [class.rotated]=\"item.expanded\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n\r\n <!-- Accordion Body -->\r\n <ng-container *ngIf=\"item.expanded\">\r\n <div class=\"accordion-divider\"></div>\r\n <div class=\"accordion-body\">\r\n <!-- Permission Header Row -->\r\n <div class=\"permission-header-row\">\r\n <span class=\"permission-group-label\">{{ item.title }}</span>\r\n <div class=\"permission-separator\"></div>\r\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\r\n <span class=\"select-all-label\">{{ selectAllLabelKey | translate }}</span>\r\n <mat-checkbox\r\n [checked]=\"isAllPermissionsSelected(item)\"\r\n [disabled]=\"readonly\"\r\n (change)=\"toggleSelectAll(item)\"\r\n color=\"primary\"\r\n class=\"select-all-checkbox\">\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n\r\n <!-- Permissions Row -->\r\n <div class=\"permissions-row\" (click)=\"$event.stopPropagation()\">\r\n <div\r\n *ngFor=\"let permission of permissions; trackBy: trackByPermission\"\r\n class=\"permission-item\">\r\n <mat-checkbox\r\n [checked]=\"isPermissionSelected(item, permission)\"\r\n [disabled]=\"
|
|
6749
|
+
], template: "<div class=\"permission-matrix-card\">\r\n <div class=\"matrix-header\">\r\n <h3 class=\"matrix-title\">{{ titleKey | translate }}</h3>\r\n <button\r\n class=\"expand-all-btn\"\r\n type=\"button\"\r\n (click)=\"expandAllGroups()\"\r\n [attr.aria-label]=\"(areAllExpanded() ? collapseAllLabelKey : expandAllLabelKey) | translate\">\r\n <mat-icon class=\"expand-icon\" [class.rotated]=\"areAllExpanded()\">unfold_more</mat-icon>\r\n <span>{{ (areAllExpanded() ? collapseAllLabelKey : expandAllLabelKey) | translate }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"matrix-divider\"></div>\r\n\r\n <div class=\"matrix-accordion-list\">\r\n <div\r\n *ngFor=\"let item of items; trackBy: trackByItem\"\r\n class=\"matrix-accordion-item\"\r\n [class.expanded]=\"item.expanded\">\r\n\r\n <!-- Accordion Header -->\r\n <div\r\n class=\"accordion-header\"\r\n (click)=\"toggleGroup(item)\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-expanded]=\"item.expanded\"\r\n (keydown.enter)=\"toggleGroup(item)\"\r\n (keydown.space)=\"toggleGroup(item); $event.preventDefault()\">\r\n <div class=\"accordion-content\">\r\n <h4 class=\"accordion-title\">{{ item.title }}</h4>\r\n <p *ngIf=\"item.description\" class=\"accordion-description\">{{ item.description }}</p>\r\n </div>\r\n <mat-icon class=\"accordion-icon\" [class.rotated]=\"item.expanded\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n\r\n <!-- Accordion Body -->\r\n <ng-container *ngIf=\"item.expanded\">\r\n <div class=\"accordion-divider\"></div>\r\n <div class=\"accordion-body\">\r\n <!-- Permission Header Row -->\r\n <div class=\"permission-header-row\">\r\n <span class=\"permission-group-label\">{{ item.title }}</span>\r\n <div class=\"permission-separator\"></div>\r\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\r\n <span class=\"select-all-label\">{{ selectAllLabelKey | translate }}</span>\r\n <mat-checkbox\r\n [checked]=\"isAllPermissionsSelected(item)\"\r\n [disabled]=\"readonly\"\r\n (change)=\"toggleSelectAll(item)\"\r\n color=\"primary\"\r\n class=\"select-all-checkbox\">\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n\r\n <!-- Permissions Row -->\r\n <div class=\"permissions-row\" (click)=\"$event.stopPropagation()\">\r\n <div\r\n *ngFor=\"let permission of permissions; trackBy: trackByPermission\"\r\n class=\"permission-item\">\r\n <mat-checkbox\r\n [checked]=\"isPermissionSelected(item, permission)\"\r\n [disabled]=\"isPermissionDisabled(item, permission)\"\r\n (change)=\"togglePermission(item, permission)\"\r\n color=\"primary\">\r\n </mat-checkbox>\r\n <span class=\"permission-label\">{{ permission.labelKey | translate }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>", styles: [".permission-matrix-card{background:#fff;border:1px solid #f0eeee;border-radius:8px;padding:16px;display:flex;flex-direction:column;gap:20px}.matrix-header{display:flex;align-items:center;justify-content:space-between;min-height:27px}.matrix-title{font-family:lusail-bold,sans-serif;font-weight:700;font-size:24px;line-height:1.2;color:#000;margin:0}.expand-all-btn{display:flex;align-items:center;gap:4px;background:transparent;border:none;cursor:pointer;padding:0;font-family:lusail-regular,sans-serif;font-weight:400;font-size:20px;line-height:1.2;color:#000;transition:all .2s ease}.expand-all-btn:hover{color:#0d4261}.expand-all-btn:focus-visible{outline:2px solid #0d4261;outline-offset:2px;border-radius:4px}.expand-icon{font-size:24px;width:24px;height:24px;color:#000;transition:transform .3s ease}.expand-icon.rotated{transform:rotate(180deg)}.matrix-divider{height:2px;background-color:#0d4261;width:100%}.matrix-accordion-list{display:flex;flex-direction:column;gap:0}.matrix-accordion-item{background:#fff;border:1px solid #f0eeee;border-radius:8px;padding:16px;margin-bottom:0;transition:all .2s ease}.matrix-accordion-item:not(:last-child){margin-bottom:20px}.accordion-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;width:100%}.accordion-header:focus-visible{outline:2px solid #0d4261;outline-offset:2px;border-radius:4px}.accordion-content{flex:1;display:flex;flex-direction:column;gap:0}.accordion-title{font-family:lusail-bold,sans-serif;font-weight:700;font-size:20px;line-height:1.2;color:#000;margin:0 0 4px}.accordion-description{font-family:lusail-light,sans-serif;font-weight:300;font-size:16px;line-height:1.2;color:#888;margin:0}.accordion-icon{font-size:24px;width:24px;height:24px;color:#222;transition:transform .3s ease;flex-shrink:0}.accordion-icon.rotated{transform:rotate(180deg)}.accordion-divider{margin-top:16px;height:1px;background-color:#f0eeee;width:calc(100% + 32px);margin-left:-16px;margin-right:-16px;border:none}.accordion-body{padding-top:16px;display:flex;flex-direction:column;gap:12px;margin-left:-16px;margin-right:-16px;padding-left:16px;padding-right:16px}.permission-header-row{display:flex;align-items:center;gap:4px;width:100%}.permission-group-label{font-family:lusail-regular,sans-serif;font-weight:400;font-size:16px;line-height:1.2;color:#5c5c5c;flex-shrink:0}.permission-separator{flex:1;height:1px;background-color:#f0eeee;margin:0 4px}.select-all-container{display:flex;align-items:center;gap:4px;flex-shrink:0;flex-direction:row-reverse}.select-all-label{font-family:lusail-regular,sans-serif;font-weight:400;font-size:20px;line-height:1.2;color:#000}.select-all-checkbox{flex-shrink:0}.permissions-row{display:flex;gap:20px;align-items:center;flex-wrap:wrap}.permission-item{display:flex;align-items:center;gap:4px;min-height:19px}.permission-label{font-family:lusail-medium,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#222;white-space:nowrap}::ng-deep .select-all-checkbox .mdc-checkbox__background,::ng-deep .permission-item .mdc-checkbox__background{border-color:#b7b7b7!important;border-radius:4px!important}::ng-deep .select-all-checkbox.mat-mdc-checkbox-checked .mdc-checkbox__background,::ng-deep .permission-item.mat-mdc-checkbox-checked .mdc-checkbox__background{background-color:#0d4261!important;border-color:#0d4261!important}::ng-deep .mdc-checkbox__checkmark{color:#fff!important}::ng-deep .mdc-checkbox{display:inline-block;position:relative;flex:0 0 18px;box-sizing:content-box;width:18px;height:28px!important;line-height:0;white-space:nowrap;cursor:pointer;vertical-align:bottom;padding:calc((var(--mdc-checkbox-state-layer-size) - 25px) / 2)!important;margin:calc((var(--mdc-checkbox-state-layer-size) - var(--mdc-checkbox-state-layer-size)) / 2)}:host-context([dir=rtl]) .matrix-header{direction:rtl}:host-context([dir=rtl]) .accordion-header{direction:rtl}:host-context([dir=rtl]) .select-all-container{flex-direction:row}\n"] }]
|
|
6696
6750
|
}], propDecorators: { items: [{
|
|
6697
6751
|
type: Input
|
|
6698
6752
|
}], permissions: [{
|
|
@@ -6707,6 +6761,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
6707
6761
|
type: Input
|
|
6708
6762
|
}], readonly: [{
|
|
6709
6763
|
type: Input
|
|
6764
|
+
}], autoLockView: [{
|
|
6765
|
+
type: Input
|
|
6710
6766
|
}], itemsChange: [{
|
|
6711
6767
|
type: Output
|
|
6712
6768
|
}], permissionChange: [{
|