@flusys/ng-iam 5.4.1 → 6.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{flusys-ng-iam-action-form-page.component-BQJkl9pU.mjs → flusys-ng-iam-action-form-page.component-DTJT8Dc-.mjs} +102 -91
- package/fesm2022/flusys-ng-iam-action-form-page.component-DTJT8Dc-.mjs.map +1 -0
- package/fesm2022/{flusys-ng-iam-action-list-page.component-BJ-tu6vu.mjs → flusys-ng-iam-action-list-page.component-B1hUE4lD.mjs} +71 -64
- package/fesm2022/flusys-ng-iam-action-list-page.component-B1hUE4lD.mjs.map +1 -0
- package/fesm2022/{flusys-ng-iam-flusys-ng-iam-Bb39q1Bu.mjs → flusys-ng-iam-flusys-ng-iam-DzIO0zsO.mjs} +632 -547
- package/fesm2022/flusys-ng-iam-flusys-ng-iam-DzIO0zsO.mjs.map +1 -0
- package/fesm2022/flusys-ng-iam-iam-container.component-D0m8u6nu.mjs +105 -0
- package/fesm2022/flusys-ng-iam-iam-container.component-D0m8u6nu.mjs.map +1 -0
- package/fesm2022/{flusys-ng-iam-permission-page.component-D4IHueFW.mjs → flusys-ng-iam-permission-page.component-rcijgKmE.mjs} +33 -28
- package/fesm2022/flusys-ng-iam-permission-page.component-rcijgKmE.mjs.map +1 -0
- package/fesm2022/{flusys-ng-iam-role-form-page.component-CX8LxsdO.mjs → flusys-ng-iam-role-form-page.component-DrUQ0taO.mjs} +62 -47
- package/fesm2022/flusys-ng-iam-role-form-page.component-DrUQ0taO.mjs.map +1 -0
- package/fesm2022/{flusys-ng-iam-role-list-page.component-CNOsO-gH.mjs → flusys-ng-iam-role-list-page.component-BcS9_ysT.mjs} +77 -65
- package/fesm2022/flusys-ng-iam-role-list-page.component-BcS9_ysT.mjs.map +1 -0
- package/fesm2022/flusys-ng-iam.mjs +1 -1
- package/package.json +10 -11
- package/types/flusys-ng-iam.d.ts +2 -2
- package/fesm2022/flusys-ng-iam-action-form-page.component-BQJkl9pU.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-action-list-page.component-BJ-tu6vu.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-flusys-ng-iam-Bb39q1Bu.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-iam-container.component-DAiS1Mtk.mjs +0 -118
- package/fesm2022/flusys-ng-iam-iam-container.component-DAiS1Mtk.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-permission-page.component-D4IHueFW.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-role-form-page.component-CX8LxsdO.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-role-list-page.component-CNOsO-gH.mjs.map +0 -1
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { Injectable, inject, signal, input, output, effect, Component, computed, DestroyRef } from '@angular/core';
|
|
3
|
-
import { ApiResourceService, TranslateService, PermissionValidatorService, AngularModule,
|
|
3
|
+
import { ApiResourceService, TranslateService, PermissionValidatorService, AngularModule, TranslatePipe, ROLE_ACTION_PERMISSIONS, HasPermissionDirective, COMPANY_ACTION_PERMISSIONS, COMPANY_API_PROVIDER, USER_ROLE_PERMISSIONS, USER_PERMISSION_PROVIDER, UserSelectComponent, USER_ACTION_PERMISSIONS, PROFILE_PERMISSION_PROVIDER, permissionGuard, ACTION_PERMISSIONS, ROLE_PERMISSIONS, anyPermissionGuard, resolveTranslationModule, SHARED_MESSAGES } from '@flusys/ng-shared';
|
|
4
4
|
import { APP_CONFIG, getServiceUrl, BaseApiService, isCompanyFeatureEnabled } from '@flusys/ng-core';
|
|
5
|
-
import
|
|
5
|
+
import * as i2 from '@flusys/ng-ui';
|
|
6
|
+
import { ConfirmationService, MessageService, UiModule } from '@flusys/ng-ui';
|
|
6
7
|
import { HttpClient } from '@angular/common/http';
|
|
7
8
|
import { of, firstValueFrom, map as map$1 } from 'rxjs';
|
|
8
9
|
import { tap, catchError, map } from 'rxjs/operators';
|
|
@@ -10,14 +11,7 @@ import * as i1 from '@angular/common';
|
|
|
10
11
|
import { CommonModule } from '@angular/common';
|
|
11
12
|
import * as i1$1 from '@angular/forms';
|
|
12
13
|
import { FormsModule } from '@angular/forms';
|
|
13
|
-
import * as i2 from 'primeng/button';
|
|
14
|
-
import * as i6 from 'primeng/tooltip';
|
|
15
|
-
import * as i3 from 'primeng/checkbox';
|
|
16
|
-
import * as i4 from 'primeng/select';
|
|
17
|
-
import * as i5 from 'primeng/tag';
|
|
18
|
-
import * as i7 from 'primeng/treetable';
|
|
19
14
|
import { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';
|
|
20
|
-
import * as i5$1 from 'primeng/table';
|
|
21
15
|
|
|
22
16
|
/** Must match backend ActionType enum */
|
|
23
17
|
var ActionType;
|
|
@@ -227,10 +221,10 @@ class RoleApiService extends ApiResourceService {
|
|
|
227
221
|
constructor() {
|
|
228
222
|
super('roles', 'iam');
|
|
229
223
|
}
|
|
230
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
231
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
224
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: RoleApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
225
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: RoleApiService, providedIn: 'root' });
|
|
232
226
|
}
|
|
233
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
227
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: RoleApiService, decorators: [{
|
|
234
228
|
type: Injectable,
|
|
235
229
|
args: [{ providedIn: 'root' }]
|
|
236
230
|
}], ctorParameters: () => [] });
|
|
@@ -257,10 +251,10 @@ class ActionApiService extends ApiResourceService {
|
|
|
257
251
|
const iamBaseUrl = getServiceUrl(this.appConfig, 'iam');
|
|
258
252
|
return this.http.post(`${iamBaseUrl}/actions/tree`, body);
|
|
259
253
|
}
|
|
260
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
261
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
254
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: ActionApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
255
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: ActionApiService, providedIn: 'root' });
|
|
262
256
|
}
|
|
263
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
257
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: ActionApiService, decorators: [{
|
|
264
258
|
type: Injectable,
|
|
265
259
|
args: [{ providedIn: 'root' }]
|
|
266
260
|
}], ctorParameters: () => [] });
|
|
@@ -403,11 +397,11 @@ class ActionPermissionLogicService {
|
|
|
403
397
|
this.confirmationService.confirm({
|
|
404
398
|
header: this.t('iam.logic.validation.failed'),
|
|
405
399
|
message: `${this.t('iam.logic.validation.failed.message')}<br/><br/><ul class="pl-4">${errorList}</ul><br/>${this.t('iam.logic.validation.failed.prompt')}`,
|
|
406
|
-
icon: '
|
|
400
|
+
icon: 'exclamation-triangle',
|
|
407
401
|
acceptLabel: this.t('iam.logic.auto.fix'),
|
|
408
402
|
rejectLabel: this.t('shared.cancel'),
|
|
409
|
-
acceptIcon: '
|
|
410
|
-
rejectIcon: '
|
|
403
|
+
acceptIcon: 'trash',
|
|
404
|
+
rejectIcon: 'times',
|
|
411
405
|
acceptButtonStyleClass: 'p-button-warning',
|
|
412
406
|
closeOnEscape: false,
|
|
413
407
|
closable: false,
|
|
@@ -419,7 +413,7 @@ class ActionPermissionLogicService {
|
|
|
419
413
|
});
|
|
420
414
|
onUpdate(selMap);
|
|
421
415
|
this.messageService.add({
|
|
422
|
-
severity: '
|
|
416
|
+
severity: 'warn',
|
|
423
417
|
summary: this.t('iam.logic.invalid.actions.removed'),
|
|
424
418
|
detail: this.t('iam.logic.removed.actions.detail', {
|
|
425
419
|
count: invalidActions.length,
|
|
@@ -532,11 +526,11 @@ class ActionPermissionLogicService {
|
|
|
532
526
|
this.confirmationService.confirm({
|
|
533
527
|
header: this.t('iam.logic.missing.prerequisites'),
|
|
534
528
|
message: `<strong>${sanitizedActionName}</strong> ${this.t('iam.logic.requires.conditions')}<br/><br/>${logicMessage}<br/><br/><strong>${autoSelectPrompt}</strong><br/>${this.t('iam.logic.would.you.continue')}`,
|
|
535
|
-
icon: '
|
|
529
|
+
icon: 'exclamation-triangle',
|
|
536
530
|
acceptLabel,
|
|
537
531
|
rejectLabel: this.t('shared.cancel'),
|
|
538
|
-
acceptIcon: '
|
|
539
|
-
rejectIcon: '
|
|
532
|
+
acceptIcon: 'check',
|
|
533
|
+
rejectIcon: 'times',
|
|
540
534
|
closeOnEscape: false,
|
|
541
535
|
closable: false,
|
|
542
536
|
accept: () => {
|
|
@@ -584,13 +578,13 @@ class ActionPermissionLogicService {
|
|
|
584
578
|
this.confirmationService.confirm({
|
|
585
579
|
header: this.t('iam.logic.dependency.warning'),
|
|
586
580
|
message,
|
|
587
|
-
icon: '
|
|
581
|
+
icon: 'exclamation-triangle',
|
|
588
582
|
acceptLabel: alternatives.length > 0
|
|
589
583
|
? this.t('iam.logic.use.alternatives')
|
|
590
584
|
: this.t('iam.logic.remove.all'),
|
|
591
585
|
rejectLabel: this.t('shared.cancel'),
|
|
592
|
-
acceptIcon: '
|
|
593
|
-
rejectIcon: '
|
|
586
|
+
acceptIcon: 'check',
|
|
587
|
+
rejectIcon: 'times',
|
|
594
588
|
closeOnEscape: false,
|
|
595
589
|
closable: false,
|
|
596
590
|
accept: () => {
|
|
@@ -794,10 +788,10 @@ class ActionPermissionLogicService {
|
|
|
794
788
|
}
|
|
795
789
|
return `${indent}${this.t('iam.logic.invalid')}`;
|
|
796
790
|
}
|
|
797
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
798
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
791
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: ActionPermissionLogicService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
792
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: ActionPermissionLogicService, providedIn: 'root' });
|
|
799
793
|
}
|
|
800
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
794
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: ActionPermissionLogicService, decorators: [{
|
|
801
795
|
type: Injectable,
|
|
802
796
|
args: [{ providedIn: 'root' }]
|
|
803
797
|
}] });
|
|
@@ -830,10 +824,10 @@ class PermissionApiService extends BaseApiService {
|
|
|
830
824
|
getCompanyActions(companyId) {
|
|
831
825
|
return this.http.post(this.getUrl('permissions/get-company-actions'), { companyId });
|
|
832
826
|
}
|
|
833
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
834
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
827
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: PermissionApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
828
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: PermissionApiService, providedIn: 'root' });
|
|
835
829
|
}
|
|
836
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
830
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: PermissionApiService, decorators: [{
|
|
837
831
|
type: Injectable,
|
|
838
832
|
args: [{ providedIn: 'root' }]
|
|
839
833
|
}], ctorParameters: () => [] });
|
|
@@ -857,10 +851,10 @@ class MyPermissionsApiService {
|
|
|
857
851
|
getMyPermissions(dto = {}) {
|
|
858
852
|
return this.http.post(`${this.baseUrl}/my-permissions`, dto);
|
|
859
853
|
}
|
|
860
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
861
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
854
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: MyPermissionsApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
855
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: MyPermissionsApiService, providedIn: 'root' });
|
|
862
856
|
}
|
|
863
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
857
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: MyPermissionsApiService, decorators: [{
|
|
864
858
|
type: Injectable,
|
|
865
859
|
args: [{
|
|
866
860
|
providedIn: 'root',
|
|
@@ -870,9 +864,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
870
864
|
class PermissionStateService {
|
|
871
865
|
permissionApi = inject(MyPermissionsApiService);
|
|
872
866
|
permissionValidator = inject(PermissionValidatorService);
|
|
873
|
-
_permissions = signal(null,
|
|
867
|
+
_permissions = signal(null, /* @ts-ignore */
|
|
868
|
+
...(ngDevMode ? [{ debugName: "_permissions" }] : /* istanbul ignore next */ []));
|
|
874
869
|
permissions = this._permissions.asReadonly();
|
|
875
|
-
_isLoading = signal(false,
|
|
870
|
+
_isLoading = signal(false, /* @ts-ignore */
|
|
871
|
+
...(ngDevMode ? [{ debugName: "_isLoading" }] : /* istanbul ignore next */ []));
|
|
876
872
|
isLoading = this._isLoading.asReadonly();
|
|
877
873
|
loadPermissions(dto) {
|
|
878
874
|
this._isLoading.set(true);
|
|
@@ -891,10 +887,10 @@ class PermissionStateService {
|
|
|
891
887
|
isLoaded() {
|
|
892
888
|
return this._permissions() !== null && this.permissionValidator.isPermissionsLoaded();
|
|
893
889
|
}
|
|
894
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
895
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
890
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: PermissionStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
891
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: PermissionStateService, providedIn: 'root' });
|
|
896
892
|
}
|
|
897
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
893
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: PermissionStateService, decorators: [{
|
|
898
894
|
type: Injectable,
|
|
899
895
|
args: [{ providedIn: 'root' }]
|
|
900
896
|
}] });
|
|
@@ -928,11 +924,14 @@ function createActionNode(actionId = '') {
|
|
|
928
924
|
}
|
|
929
925
|
/** Visual builder for AND/OR permission logic trees */
|
|
930
926
|
class LogicBuilderComponent {
|
|
931
|
-
logic = input(null,
|
|
932
|
-
|
|
927
|
+
logic = input(null, /* @ts-ignore */
|
|
928
|
+
...(ngDevMode ? [{ debugName: "logic" }] : /* istanbul ignore next */ []));
|
|
929
|
+
actions = input([], /* @ts-ignore */
|
|
930
|
+
...(ngDevMode ? [{ debugName: "actions" }] : /* istanbul ignore next */ []));
|
|
933
931
|
logicChange = output();
|
|
934
932
|
/** Internal builder tree state (private writable + public readonly pattern) */
|
|
935
|
-
_builderTree = signal(null,
|
|
933
|
+
_builderTree = signal(null, /* @ts-ignore */
|
|
934
|
+
...(ngDevMode ? [{ debugName: "_builderTree" }] : /* istanbul ignore next */ []));
|
|
936
935
|
builderLogic = this._builderTree.asReadonly();
|
|
937
936
|
constructor() {
|
|
938
937
|
effect(() => {
|
|
@@ -943,7 +942,7 @@ class LogicBuilderComponent {
|
|
|
943
942
|
else if (!this._builderTree()) {
|
|
944
943
|
this._builderTree.set(toBuilderNode(logic));
|
|
945
944
|
}
|
|
946
|
-
}
|
|
945
|
+
});
|
|
947
946
|
}
|
|
948
947
|
initializeLogic() {
|
|
949
948
|
this.updateTreeAndEmit(createGroupNode());
|
|
@@ -1010,29 +1009,33 @@ class LogicBuilderComponent {
|
|
|
1010
1009
|
.map((child) => this.removeNodeFromTree(child, targetId)),
|
|
1011
1010
|
};
|
|
1012
1011
|
}
|
|
1013
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1014
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
1012
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: LogicBuilderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1013
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: LogicBuilderComponent, isStandalone: true, selector: "lib-logic-builder", inputs: { logic: { classPropertyName: "logic", publicName: "logic", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { logicChange: "logicChange" }, ngImport: i0, template: `
|
|
1015
1014
|
<div class="logic-builder">
|
|
1016
1015
|
<div class="flex justify-between items-center mb-3">
|
|
1017
1016
|
<h4 class="text-sm font-semibold m-0">
|
|
1018
1017
|
{{ 'iam.logic.title' | translate }}
|
|
1019
1018
|
</h4>
|
|
1020
1019
|
@if (!builderLogic()) {
|
|
1021
|
-
<
|
|
1022
|
-
|
|
1023
|
-
icon="pi pi-plus"
|
|
1020
|
+
<button
|
|
1021
|
+
fButton
|
|
1024
1022
|
size="small"
|
|
1025
|
-
(
|
|
1026
|
-
|
|
1023
|
+
(click)="initializeLogic()"
|
|
1024
|
+
>
|
|
1025
|
+
<ui-icon pButtonIcon name="plus"></ui-icon>
|
|
1026
|
+
<span pButtonLabel>{{ 'iam.logic.add.logic' | translate }}</span>
|
|
1027
|
+
</button>
|
|
1027
1028
|
} @else {
|
|
1028
|
-
<
|
|
1029
|
-
|
|
1030
|
-
icon="pi pi-trash"
|
|
1029
|
+
<button
|
|
1030
|
+
fButton
|
|
1031
1031
|
size="small"
|
|
1032
1032
|
severity="danger"
|
|
1033
1033
|
[outlined]="true"
|
|
1034
|
-
(
|
|
1035
|
-
|
|
1034
|
+
(click)="clearLogic()"
|
|
1035
|
+
>
|
|
1036
|
+
<ui-icon pButtonIcon name="trash"></ui-icon>
|
|
1037
|
+
<span pButtonLabel>{{ 'iam.logic.clear.logic' | translate }}</span>
|
|
1038
|
+
</button>
|
|
1036
1039
|
}
|
|
1037
1040
|
</div>
|
|
1038
1041
|
|
|
@@ -1059,21 +1062,26 @@ class LogicBuilderComponent {
|
|
|
1059
1062
|
<ng-template #nodeTemplate let-node let-depth="depth">
|
|
1060
1063
|
<div
|
|
1061
1064
|
class="p-3 border-b border-surface"
|
|
1062
|
-
[
|
|
1065
|
+
[class.bg-surface-0]="depth % 2 === 0"
|
|
1066
|
+
[class.bg-surface-50]="depth % 2 !== 0"
|
|
1063
1067
|
>
|
|
1064
1068
|
<div class="flex items-center gap-3 mb-2">
|
|
1065
|
-
<span
|
|
1066
|
-
node
|
|
1067
|
-
|
|
1069
|
+
<span
|
|
1070
|
+
class="node-type"
|
|
1071
|
+
[class.group]="node.type === 'group'"
|
|
1072
|
+
[class.action]="node.type === 'action'"
|
|
1073
|
+
>{{ node.type.toUpperCase() }}</span
|
|
1074
|
+
>
|
|
1068
1075
|
|
|
1069
1076
|
<div class="flex-1 flex items-center gap-2">
|
|
1070
1077
|
@if (node.type === 'group') {
|
|
1071
1078
|
<!-- Group: show operator toggle -->
|
|
1072
1079
|
<span
|
|
1073
1080
|
class="operator-badge"
|
|
1074
|
-
[
|
|
1081
|
+
[class.and]="node.operator === 'AND'"
|
|
1082
|
+
[class.or]="node.operator !== 'AND'"
|
|
1075
1083
|
(click)="toggleOperator(node.id)"
|
|
1076
|
-
[
|
|
1084
|
+
[fTooltip]="'iam.logic.click.to.toggle' | translate"
|
|
1077
1085
|
>
|
|
1078
1086
|
{{ node.operator }}
|
|
1079
1087
|
</span>
|
|
@@ -1086,34 +1094,30 @@ class LogicBuilderComponent {
|
|
|
1086
1094
|
}
|
|
1087
1095
|
|
|
1088
1096
|
@if (node.type === 'action') {
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1097
|
+
<f-select
|
|
1098
|
+
class="flex-1"
|
|
1099
|
+
[options]="actions()"
|
|
1100
|
+
optionLabel="name"
|
|
1101
|
+
optionValue="id"
|
|
1092
1102
|
[ngModel]="node.actionId"
|
|
1093
1103
|
(ngModelChange)="updateActionId(node.id, $event)"
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
'iam.logic.actions.available'
|
|
1098
|
-
| translate: { count: actions().length }
|
|
1099
|
-
}})
|
|
1100
|
-
</option>
|
|
1101
|
-
@for (action of actions(); track action.id) {
|
|
1102
|
-
<option [ngValue]="action.id">{{ action.name }}</option>
|
|
1103
|
-
}
|
|
1104
|
-
</select>
|
|
1104
|
+
[placeholder]="'iam.logic.select.action' | translate"
|
|
1105
|
+
[filter]="true"
|
|
1106
|
+
/>
|
|
1105
1107
|
}
|
|
1106
1108
|
</div>
|
|
1107
1109
|
|
|
1108
1110
|
<div class="flex gap-1">
|
|
1109
|
-
<
|
|
1110
|
-
|
|
1111
|
+
<button
|
|
1112
|
+
fButton
|
|
1111
1113
|
[text]="true"
|
|
1112
1114
|
severity="danger"
|
|
1113
1115
|
size="small"
|
|
1114
|
-
(
|
|
1115
|
-
[
|
|
1116
|
-
|
|
1116
|
+
(click)="removeNode(node.id)"
|
|
1117
|
+
[fTooltip]="'shared.remove' | translate"
|
|
1118
|
+
>
|
|
1119
|
+
<ui-icon pButtonIcon name="trash"></ui-icon>
|
|
1120
|
+
</button>
|
|
1117
1121
|
</div>
|
|
1118
1122
|
</div>
|
|
1119
1123
|
|
|
@@ -1142,52 +1146,60 @@ class LogicBuilderComponent {
|
|
|
1142
1146
|
{{ 'iam.logic.add.condition' | translate }}
|
|
1143
1147
|
</div>
|
|
1144
1148
|
<div class="flex gap-2 flex-wrap">
|
|
1145
|
-
<
|
|
1146
|
-
|
|
1147
|
-
icon="pi pi-sitemap"
|
|
1149
|
+
<button
|
|
1150
|
+
fButton
|
|
1148
1151
|
size="small"
|
|
1149
1152
|
[outlined]="true"
|
|
1150
|
-
(
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1153
|
+
(click)="addChildNode(node.id, 'group')"
|
|
1154
|
+
>
|
|
1155
|
+
<ui-icon pButtonIcon name="sitemap"></ui-icon>
|
|
1156
|
+
<span pButtonLabel>{{ 'iam.logic.group' | translate }}</span>
|
|
1157
|
+
</button>
|
|
1158
|
+
<button
|
|
1159
|
+
fButton
|
|
1155
1160
|
size="small"
|
|
1156
1161
|
severity="success"
|
|
1157
1162
|
[outlined]="true"
|
|
1158
|
-
(
|
|
1159
|
-
|
|
1163
|
+
(click)="addChildNode(node.id, 'action')"
|
|
1164
|
+
>
|
|
1165
|
+
<ui-icon pButtonIcon name="bolt"></ui-icon>
|
|
1166
|
+
<span pButtonLabel>{{ 'iam.logic.action' | translate }}</span>
|
|
1167
|
+
</button>
|
|
1160
1168
|
</div>
|
|
1161
1169
|
</div>
|
|
1162
1170
|
}
|
|
1163
1171
|
</div>
|
|
1164
1172
|
</ng-template>
|
|
1165
|
-
`, isInline: true, styles: [":host{display:block}.node-type{display:inline-flex;align-items:center;padding:.25rem .5rem;border-radius:.25rem;font-weight:600;font-size:.75rem;text-transform:uppercase}.node-type.group{background-color:var(--
|
|
1173
|
+
`, isInline: true, styles: [":host{display:block}.node-type{display:inline-flex;align-items:center;padding:.25rem .5rem;border-radius:.25rem;font-weight:600;font-size:.75rem;text-transform:uppercase}.node-type.group{background-color:var(--f-blue-100, #dbeafe);color:var(--f-blue-700, #1e40af)}.node-type.action{background-color:var(--f-green-100, #d1fae5);color:var(--f-green-700, #065f46)}:host-context(.p-dark) .node-type.group{background-color:#3b82f633;color:var(--f-blue-400, #60a5fa)}:host-context(.p-dark) .node-type.action{background-color:#22c55e33;color:var(--f-green-400, #4ade80)}.operator-badge{display:inline-flex;align-items:center;padding:.125rem .5rem;border-radius:9999px;font-weight:600;font-size:.75rem;cursor:pointer;transition:opacity .2s}.operator-badge.and{background-color:var(--f-yellow-100, #fef3c7);color:var(--f-yellow-700, #92400e)}.operator-badge.or{background-color:var(--f-indigo-100, #e0e7ff);color:var(--f-indigo-700, #3730a3)}:host-context(.p-dark) .operator-badge.and{background-color:#eab30833;color:var(--f-yellow-400, #facc15)}:host-context(.p-dark) .operator-badge.or{background-color:#6366f133;color:var(--f-indigo-400, #818cf8)}.operator-badge:hover{opacity:.8}.action-select{background-color:var(--f-surface-0, #ffffff);color:var(--f-text-color, #1f2937)}:host-context(.p-dark) .action-select{background-color:var(--f-surface-900, #1f2937);color:var(--f-text-color, #f9fafb)}.action-select:focus{outline:none;border-color:var(--f-primary-color, #3b82f6)}\n"], dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: UiModule }, { kind: "directive", type: i2.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "rounded", "raised", "fluid", "disabled", "loading", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i2.SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "showClear", "loading", "inputId", "invalid", "touched", "styleClass", "editable"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur"] }, { kind: "directive", type: i2.TooltipDirective, selector: "[fTooltip]", inputs: ["fTooltip", "tooltipPosition", "tooltipStyleClass", "disabled", "tooltipEvent", "showDelay", "hideDelay"] }, { kind: "component", type: i2.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
1166
1174
|
}
|
|
1167
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1175
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: LogicBuilderComponent, decorators: [{
|
|
1168
1176
|
type: Component,
|
|
1169
|
-
args: [{ selector: 'lib-logic-builder', imports: [AngularModule,
|
|
1177
|
+
args: [{ selector: 'lib-logic-builder', imports: [AngularModule, UiModule, TranslatePipe], template: `
|
|
1170
1178
|
<div class="logic-builder">
|
|
1171
1179
|
<div class="flex justify-between items-center mb-3">
|
|
1172
1180
|
<h4 class="text-sm font-semibold m-0">
|
|
1173
1181
|
{{ 'iam.logic.title' | translate }}
|
|
1174
1182
|
</h4>
|
|
1175
1183
|
@if (!builderLogic()) {
|
|
1176
|
-
<
|
|
1177
|
-
|
|
1178
|
-
icon="pi pi-plus"
|
|
1184
|
+
<button
|
|
1185
|
+
fButton
|
|
1179
1186
|
size="small"
|
|
1180
|
-
(
|
|
1181
|
-
|
|
1187
|
+
(click)="initializeLogic()"
|
|
1188
|
+
>
|
|
1189
|
+
<ui-icon pButtonIcon name="plus"></ui-icon>
|
|
1190
|
+
<span pButtonLabel>{{ 'iam.logic.add.logic' | translate }}</span>
|
|
1191
|
+
</button>
|
|
1182
1192
|
} @else {
|
|
1183
|
-
<
|
|
1184
|
-
|
|
1185
|
-
icon="pi pi-trash"
|
|
1193
|
+
<button
|
|
1194
|
+
fButton
|
|
1186
1195
|
size="small"
|
|
1187
1196
|
severity="danger"
|
|
1188
1197
|
[outlined]="true"
|
|
1189
|
-
(
|
|
1190
|
-
|
|
1198
|
+
(click)="clearLogic()"
|
|
1199
|
+
>
|
|
1200
|
+
<ui-icon pButtonIcon name="trash"></ui-icon>
|
|
1201
|
+
<span pButtonLabel>{{ 'iam.logic.clear.logic' | translate }}</span>
|
|
1202
|
+
</button>
|
|
1191
1203
|
}
|
|
1192
1204
|
</div>
|
|
1193
1205
|
|
|
@@ -1214,21 +1226,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
1214
1226
|
<ng-template #nodeTemplate let-node let-depth="depth">
|
|
1215
1227
|
<div
|
|
1216
1228
|
class="p-3 border-b border-surface"
|
|
1217
|
-
[
|
|
1229
|
+
[class.bg-surface-0]="depth % 2 === 0"
|
|
1230
|
+
[class.bg-surface-50]="depth % 2 !== 0"
|
|
1218
1231
|
>
|
|
1219
1232
|
<div class="flex items-center gap-3 mb-2">
|
|
1220
|
-
<span
|
|
1221
|
-
node
|
|
1222
|
-
|
|
1233
|
+
<span
|
|
1234
|
+
class="node-type"
|
|
1235
|
+
[class.group]="node.type === 'group'"
|
|
1236
|
+
[class.action]="node.type === 'action'"
|
|
1237
|
+
>{{ node.type.toUpperCase() }}</span
|
|
1238
|
+
>
|
|
1223
1239
|
|
|
1224
1240
|
<div class="flex-1 flex items-center gap-2">
|
|
1225
1241
|
@if (node.type === 'group') {
|
|
1226
1242
|
<!-- Group: show operator toggle -->
|
|
1227
1243
|
<span
|
|
1228
1244
|
class="operator-badge"
|
|
1229
|
-
[
|
|
1245
|
+
[class.and]="node.operator === 'AND'"
|
|
1246
|
+
[class.or]="node.operator !== 'AND'"
|
|
1230
1247
|
(click)="toggleOperator(node.id)"
|
|
1231
|
-
[
|
|
1248
|
+
[fTooltip]="'iam.logic.click.to.toggle' | translate"
|
|
1232
1249
|
>
|
|
1233
1250
|
{{ node.operator }}
|
|
1234
1251
|
</span>
|
|
@@ -1241,34 +1258,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
1241
1258
|
}
|
|
1242
1259
|
|
|
1243
1260
|
@if (node.type === 'action') {
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1261
|
+
<f-select
|
|
1262
|
+
class="flex-1"
|
|
1263
|
+
[options]="actions()"
|
|
1264
|
+
optionLabel="name"
|
|
1265
|
+
optionValue="id"
|
|
1247
1266
|
[ngModel]="node.actionId"
|
|
1248
1267
|
(ngModelChange)="updateActionId(node.id, $event)"
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
'iam.logic.actions.available'
|
|
1253
|
-
| translate: { count: actions().length }
|
|
1254
|
-
}})
|
|
1255
|
-
</option>
|
|
1256
|
-
@for (action of actions(); track action.id) {
|
|
1257
|
-
<option [ngValue]="action.id">{{ action.name }}</option>
|
|
1258
|
-
}
|
|
1259
|
-
</select>
|
|
1268
|
+
[placeholder]="'iam.logic.select.action' | translate"
|
|
1269
|
+
[filter]="true"
|
|
1270
|
+
/>
|
|
1260
1271
|
}
|
|
1261
1272
|
</div>
|
|
1262
1273
|
|
|
1263
1274
|
<div class="flex gap-1">
|
|
1264
|
-
<
|
|
1265
|
-
|
|
1275
|
+
<button
|
|
1276
|
+
fButton
|
|
1266
1277
|
[text]="true"
|
|
1267
1278
|
severity="danger"
|
|
1268
1279
|
size="small"
|
|
1269
|
-
(
|
|
1270
|
-
[
|
|
1271
|
-
|
|
1280
|
+
(click)="removeNode(node.id)"
|
|
1281
|
+
[fTooltip]="'shared.remove' | translate"
|
|
1282
|
+
>
|
|
1283
|
+
<ui-icon pButtonIcon name="trash"></ui-icon>
|
|
1284
|
+
</button>
|
|
1272
1285
|
</div>
|
|
1273
1286
|
</div>
|
|
1274
1287
|
|
|
@@ -1297,27 +1310,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
1297
1310
|
{{ 'iam.logic.add.condition' | translate }}
|
|
1298
1311
|
</div>
|
|
1299
1312
|
<div class="flex gap-2 flex-wrap">
|
|
1300
|
-
<
|
|
1301
|
-
|
|
1302
|
-
icon="pi pi-sitemap"
|
|
1313
|
+
<button
|
|
1314
|
+
fButton
|
|
1303
1315
|
size="small"
|
|
1304
1316
|
[outlined]="true"
|
|
1305
|
-
(
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1317
|
+
(click)="addChildNode(node.id, 'group')"
|
|
1318
|
+
>
|
|
1319
|
+
<ui-icon pButtonIcon name="sitemap"></ui-icon>
|
|
1320
|
+
<span pButtonLabel>{{ 'iam.logic.group' | translate }}</span>
|
|
1321
|
+
</button>
|
|
1322
|
+
<button
|
|
1323
|
+
fButton
|
|
1310
1324
|
size="small"
|
|
1311
1325
|
severity="success"
|
|
1312
1326
|
[outlined]="true"
|
|
1313
|
-
(
|
|
1314
|
-
|
|
1327
|
+
(click)="addChildNode(node.id, 'action')"
|
|
1328
|
+
>
|
|
1329
|
+
<ui-icon pButtonIcon name="bolt"></ui-icon>
|
|
1330
|
+
<span pButtonLabel>{{ 'iam.logic.action' | translate }}</span>
|
|
1331
|
+
</button>
|
|
1315
1332
|
</div>
|
|
1316
1333
|
</div>
|
|
1317
1334
|
}
|
|
1318
1335
|
</div>
|
|
1319
1336
|
</ng-template>
|
|
1320
|
-
`, styles: [":host{display:block}.node-type{display:inline-flex;align-items:center;padding:.25rem .5rem;border-radius:.25rem;font-weight:600;font-size:.75rem;text-transform:uppercase}.node-type.group{background-color:var(--
|
|
1337
|
+
`, styles: [":host{display:block}.node-type{display:inline-flex;align-items:center;padding:.25rem .5rem;border-radius:.25rem;font-weight:600;font-size:.75rem;text-transform:uppercase}.node-type.group{background-color:var(--f-blue-100, #dbeafe);color:var(--f-blue-700, #1e40af)}.node-type.action{background-color:var(--f-green-100, #d1fae5);color:var(--f-green-700, #065f46)}:host-context(.p-dark) .node-type.group{background-color:#3b82f633;color:var(--f-blue-400, #60a5fa)}:host-context(.p-dark) .node-type.action{background-color:#22c55e33;color:var(--f-green-400, #4ade80)}.operator-badge{display:inline-flex;align-items:center;padding:.125rem .5rem;border-radius:9999px;font-weight:600;font-size:.75rem;cursor:pointer;transition:opacity .2s}.operator-badge.and{background-color:var(--f-yellow-100, #fef3c7);color:var(--f-yellow-700, #92400e)}.operator-badge.or{background-color:var(--f-indigo-100, #e0e7ff);color:var(--f-indigo-700, #3730a3)}:host-context(.p-dark) .operator-badge.and{background-color:#eab30833;color:var(--f-yellow-400, #facc15)}:host-context(.p-dark) .operator-badge.or{background-color:#6366f133;color:var(--f-indigo-400, #818cf8)}.operator-badge:hover{opacity:.8}.action-select{background-color:var(--f-surface-0, #ffffff);color:var(--f-text-color, #1f2937)}:host-context(.p-dark) .action-select{background-color:var(--f-surface-900, #1f2937);color:var(--f-text-color, #f9fafb)}.action-select:focus{outline:none;border-color:var(--f-primary-color, #3b82f6)}\n"] }]
|
|
1321
1338
|
}], ctorParameters: () => [], propDecorators: { logic: [{ type: i0.Input, args: [{ isSignal: true, alias: "logic", required: false }] }], actions: [{ type: i0.Input, args: [{ isSignal: true, alias: "actions", required: false }] }], logicChange: [{ type: i0.Output, args: ["logicChange"] }] } });
|
|
1322
1339
|
|
|
1323
1340
|
function flattenTree(tree) {
|
|
@@ -1384,24 +1401,32 @@ class BaseActionSelectorComponent {
|
|
|
1384
1401
|
translateAdapter = inject(TranslateService, {
|
|
1385
1402
|
optional: true,
|
|
1386
1403
|
});
|
|
1387
|
-
loading = signal(false,
|
|
1388
|
-
|
|
1389
|
-
|
|
1404
|
+
loading = signal(false, /* @ts-ignore */
|
|
1405
|
+
...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
1406
|
+
saving = signal(false, /* @ts-ignore */
|
|
1407
|
+
...(ngDevMode ? [{ debugName: "saving" }] : /* istanbul ignore next */ []));
|
|
1408
|
+
_actions = signal([], /* @ts-ignore */
|
|
1409
|
+
...(ngDevMode ? [{ debugName: "_actions" }] : /* istanbul ignore next */ []));
|
|
1390
1410
|
actions = this._actions.asReadonly();
|
|
1391
|
-
_actionsTree = signal([],
|
|
1411
|
+
_actionsTree = signal([], /* @ts-ignore */
|
|
1412
|
+
...(ngDevMode ? [{ debugName: "_actionsTree" }] : /* istanbul ignore next */ []));
|
|
1392
1413
|
actionsTree = this._actionsTree.asReadonly();
|
|
1393
|
-
_selectionMap = signal({},
|
|
1414
|
+
_selectionMap = signal({}, /* @ts-ignore */
|
|
1415
|
+
...(ngDevMode ? [{ debugName: "_selectionMap" }] : /* istanbul ignore next */ []));
|
|
1394
1416
|
selectionMap = this._selectionMap.asReadonly();
|
|
1395
|
-
_initialSelection = signal({},
|
|
1417
|
+
_initialSelection = signal({}, /* @ts-ignore */
|
|
1418
|
+
...(ngDevMode ? [{ debugName: "_initialSelection" }] : /* istanbul ignore next */ []));
|
|
1396
1419
|
initialSelection = this._initialSelection.asReadonly();
|
|
1397
|
-
treeNodes = computed(() => convertActionToTreeNode(this.actionsTree()),
|
|
1420
|
+
treeNodes = computed(() => convertActionToTreeNode(this.actionsTree()), /* @ts-ignore */
|
|
1421
|
+
...(ngDevMode ? [{ debugName: "treeNodes" }] : /* istanbul ignore next */ []));
|
|
1398
1422
|
allSelected = computed(() => {
|
|
1399
1423
|
const selMap = this.selectionMap();
|
|
1400
1424
|
const total = this.actions().length;
|
|
1401
1425
|
if (total === 0)
|
|
1402
1426
|
return false;
|
|
1403
1427
|
return Object.values(selMap).filter((v) => v).length === total;
|
|
1404
|
-
},
|
|
1428
|
+
}, /* @ts-ignore */
|
|
1429
|
+
...(ngDevMode ? [{ debugName: "allSelected" }] : /* istanbul ignore next */ []));
|
|
1405
1430
|
hasChanges = computed(() => {
|
|
1406
1431
|
const current = this.selectionMap();
|
|
1407
1432
|
const initial = this.initialSelection();
|
|
@@ -1409,7 +1434,8 @@ class BaseActionSelectorComponent {
|
|
|
1409
1434
|
if (currentKeys.length !== Object.keys(initial).length)
|
|
1410
1435
|
return true;
|
|
1411
1436
|
return currentKeys.some((key) => current[key] !== initial[key]);
|
|
1412
|
-
},
|
|
1437
|
+
}, /* @ts-ignore */
|
|
1438
|
+
...(ngDevMode ? [{ debugName: "hasChanges" }] : /* istanbul ignore next */ []));
|
|
1413
1439
|
actionsWithUnmetPrerequisites = computed(() => {
|
|
1414
1440
|
const selMap = this.selectionMap();
|
|
1415
1441
|
const allActions = this.actions();
|
|
@@ -1421,19 +1447,24 @@ class BaseActionSelectorComponent {
|
|
|
1421
1447
|
}
|
|
1422
1448
|
}
|
|
1423
1449
|
return unmetSet;
|
|
1424
|
-
},
|
|
1425
|
-
|
|
1450
|
+
}, /* @ts-ignore */
|
|
1451
|
+
...(ngDevMode ? [{ debugName: "actionsWithUnmetPrerequisites" }] : /* istanbul ignore next */ []));
|
|
1452
|
+
invalidActionsCount = computed(() => this.actionsWithUnmetPrerequisites().size, /* @ts-ignore */
|
|
1453
|
+
...(ngDevMode ? [{ debugName: "invalidActionsCount" }] : /* istanbul ignore next */ []));
|
|
1426
1454
|
pendingAdd = computed(() => {
|
|
1427
1455
|
const current = this.selectionMap();
|
|
1428
1456
|
const initial = this.initialSelection();
|
|
1429
1457
|
return this.actions().filter((a) => current[a.id] && !initial[a.id]);
|
|
1430
|
-
},
|
|
1458
|
+
}, /* @ts-ignore */
|
|
1459
|
+
...(ngDevMode ? [{ debugName: "pendingAdd" }] : /* istanbul ignore next */ []));
|
|
1431
1460
|
pendingRemove = computed(() => {
|
|
1432
1461
|
const current = this.selectionMap();
|
|
1433
1462
|
const initial = this.initialSelection();
|
|
1434
1463
|
return this.actions().filter((a) => !current[a.id] && initial[a.id]);
|
|
1435
|
-
},
|
|
1436
|
-
|
|
1464
|
+
}, /* @ts-ignore */
|
|
1465
|
+
...(ngDevMode ? [{ debugName: "pendingRemove" }] : /* istanbul ignore next */ []));
|
|
1466
|
+
canSave = computed(() => this.hasChanges() && !this.saving() && this.invalidActionsCount() === 0, /* @ts-ignore */
|
|
1467
|
+
...(ngDevMode ? [{ debugName: "canSave" }] : /* istanbul ignore next */ []));
|
|
1437
1468
|
translate(key, vars) {
|
|
1438
1469
|
return this.translateAdapter?.translate(key, vars) ?? key;
|
|
1439
1470
|
}
|
|
@@ -1508,8 +1539,10 @@ class RoleActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
1508
1539
|
actionApi = inject(ActionApiService);
|
|
1509
1540
|
permissionApi = inject(PermissionApiService);
|
|
1510
1541
|
messageService = inject(MessageService);
|
|
1511
|
-
selectedRoleId = signal(undefined,
|
|
1512
|
-
|
|
1542
|
+
selectedRoleId = signal(undefined, /* @ts-ignore */
|
|
1543
|
+
...(ngDevMode ? [{ debugName: "selectedRoleId" }] : /* istanbul ignore next */ []));
|
|
1544
|
+
roles = signal([], /* @ts-ignore */
|
|
1545
|
+
...(ngDevMode ? [{ debugName: "roles" }] : /* istanbul ignore next */ []));
|
|
1513
1546
|
loadDataAbortController = null;
|
|
1514
1547
|
constructor() {
|
|
1515
1548
|
super();
|
|
@@ -1605,8 +1638,8 @@ class RoleActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
1605
1638
|
this.saving.set(false);
|
|
1606
1639
|
}
|
|
1607
1640
|
}
|
|
1608
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1609
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
1641
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: RoleActionSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1642
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: RoleActionSelectorComponent, isStandalone: true, selector: "flusys-role-action-selector", usesInheritance: true, ngImport: i0, template: `
|
|
1610
1643
|
<div class="role-action-selector">
|
|
1611
1644
|
<div class="mb-4">
|
|
1612
1645
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
@@ -1614,7 +1647,7 @@ class RoleActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
1614
1647
|
<label class="block font-semibold mb-2">{{
|
|
1615
1648
|
'iam.permission.select.role' | translate
|
|
1616
1649
|
}}</label>
|
|
1617
|
-
<
|
|
1650
|
+
<f-select
|
|
1618
1651
|
[ngModel]="selectedRoleId()"
|
|
1619
1652
|
(ngModelChange)="selectedRoleId.set($event)"
|
|
1620
1653
|
[options]="roles()"
|
|
@@ -1636,7 +1669,7 @@ class RoleActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
1636
1669
|
<div
|
|
1637
1670
|
class="surface-card p-5 rounded-border shadow-sm flex justify-center"
|
|
1638
1671
|
>
|
|
1639
|
-
<
|
|
1672
|
+
<ui-icon name="loader-circle" spin class="text-primary text-5xl"></ui-icon>
|
|
1640
1673
|
</div>
|
|
1641
1674
|
}
|
|
1642
1675
|
|
|
@@ -1657,38 +1690,47 @@ class RoleActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
1657
1690
|
</p>
|
|
1658
1691
|
</div>
|
|
1659
1692
|
<div class="flex flex-wrap gap-2">
|
|
1660
|
-
<
|
|
1661
|
-
|
|
1662
|
-
icon="pi pi-check"
|
|
1693
|
+
<button
|
|
1694
|
+
fButton
|
|
1663
1695
|
[outlined]="true"
|
|
1664
1696
|
size="small"
|
|
1665
1697
|
severity="secondary"
|
|
1666
|
-
(
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1698
|
+
(click)="selectAll()"
|
|
1699
|
+
>
|
|
1700
|
+
<ui-icon pButtonIcon name="check"></ui-icon>
|
|
1701
|
+
<span pButtonLabel>{{ 'shared.select.all' | translate }}</span>
|
|
1702
|
+
</button>
|
|
1703
|
+
<button
|
|
1704
|
+
fButton
|
|
1671
1705
|
[outlined]="true"
|
|
1672
1706
|
size="small"
|
|
1673
1707
|
severity="secondary"
|
|
1674
|
-
(
|
|
1675
|
-
|
|
1676
|
-
|
|
1708
|
+
(click)="deselectAll()"
|
|
1709
|
+
>
|
|
1710
|
+
<ui-icon pButtonIcon name="times"></ui-icon>
|
|
1711
|
+
<span pButtonLabel>{{ 'shared.deselect.all' | translate }}</span>
|
|
1712
|
+
</button>
|
|
1713
|
+
<button
|
|
1714
|
+
fButton
|
|
1677
1715
|
*hasPermission="ROLE_ACTION_PERMISSIONS.ASSIGN"
|
|
1678
|
-
[
|
|
1679
|
-
icon="pi pi-save"
|
|
1680
|
-
[disabled]="!canSave()"
|
|
1681
|
-
[loading]="saving()"
|
|
1716
|
+
[disabled]="!canSave() || saving()"
|
|
1682
1717
|
size="small"
|
|
1683
|
-
(
|
|
1684
|
-
|
|
1718
|
+
(click)="saveChanges()"
|
|
1719
|
+
>
|
|
1720
|
+
@if (saving()) {
|
|
1721
|
+
<ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
|
|
1722
|
+
} @else {
|
|
1723
|
+
<ui-icon pButtonIcon name="save"></ui-icon>
|
|
1724
|
+
}
|
|
1725
|
+
<span pButtonLabel>{{ 'shared.save.changes' | translate }}</span>
|
|
1726
|
+
</button>
|
|
1685
1727
|
</div>
|
|
1686
1728
|
</div>
|
|
1687
1729
|
|
|
1688
1730
|
@if (invalidActionsCount() > 0) {
|
|
1689
1731
|
<div class="validation-warning rounded-border p-3 mb-4">
|
|
1690
1732
|
<div class="flex items-start gap-2">
|
|
1691
|
-
<
|
|
1733
|
+
<ui-icon name="exclamation-triangle" class="text-xl"></ui-icon>
|
|
1692
1734
|
<div class="flex-1">
|
|
1693
1735
|
<span class="font-semibold"
|
|
1694
1736
|
>{{ 'iam.validation.warning.title' | translate }}:</span
|
|
@@ -1707,20 +1749,19 @@ class RoleActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
1707
1749
|
}
|
|
1708
1750
|
|
|
1709
1751
|
<div class="overflow-x-auto -mx-4 sm:mx-0">
|
|
1710
|
-
<
|
|
1752
|
+
<f-treetable
|
|
1711
1753
|
[value]="treeNodes()"
|
|
1712
1754
|
dataKey="id"
|
|
1713
|
-
class="p-treetable-sm"
|
|
1714
1755
|
[tableStyle]="{ 'min-width': '50rem' }"
|
|
1715
1756
|
>
|
|
1716
1757
|
<ng-template #header>
|
|
1717
1758
|
<tr>
|
|
1718
1759
|
<th class="w-12">
|
|
1719
|
-
<
|
|
1760
|
+
<f-checkbox
|
|
1720
1761
|
[ngModel]="allSelected()"
|
|
1721
1762
|
[binary]="true"
|
|
1722
1763
|
(ngModelChange)="toggleAll()"
|
|
1723
|
-
[
|
|
1764
|
+
[fTooltip]="'shared.select.deselect.all' | translate"
|
|
1724
1765
|
tooltipPosition="top"
|
|
1725
1766
|
/>
|
|
1726
1767
|
</th>
|
|
@@ -1739,27 +1780,24 @@ class RoleActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
1739
1780
|
@let tooltip = getTooltip(rowData);
|
|
1740
1781
|
<tr [class.highlight-warning]="hasUnmet">
|
|
1741
1782
|
<td class="w-12">
|
|
1742
|
-
<
|
|
1783
|
+
<f-checkbox
|
|
1743
1784
|
[ngModel]="selectionMap()[rowData.id]"
|
|
1744
1785
|
[binary]="true"
|
|
1745
1786
|
(ngModelChange)="onActionToggle(rowData, $event)"
|
|
1746
|
-
[
|
|
1787
|
+
[fTooltip]="tooltip"
|
|
1747
1788
|
tooltipPosition="top"
|
|
1748
1789
|
/>
|
|
1749
1790
|
</td>
|
|
1750
1791
|
<td>
|
|
1751
|
-
<
|
|
1792
|
+
<f-treetabletoggler [rowNode]="rowNode" />
|
|
1752
1793
|
<span class="inline-flex items-center gap-2">
|
|
1753
1794
|
{{ rowData.name }}
|
|
1754
1795
|
@if (hasUnmet) {
|
|
1755
|
-
<
|
|
1756
|
-
class="pi pi-exclamation-triangle text-orange-500"
|
|
1757
|
-
[pTooltip]="
|
|
1796
|
+
<ui-icon name="exclamation-triangle" class="text-orange-500" [fTooltip]="
|
|
1758
1797
|
'iam.validation.unmet.prerequisites.tooltip'
|
|
1759
1798
|
| translate
|
|
1760
1799
|
"
|
|
1761
|
-
tooltipPosition="top"
|
|
1762
|
-
></i>
|
|
1800
|
+
tooltipPosition="top"></ui-icon>
|
|
1763
1801
|
}
|
|
1764
1802
|
</span>
|
|
1765
1803
|
</td>
|
|
@@ -1767,7 +1805,7 @@ class RoleActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
1767
1805
|
{{ rowData.code || '-' }}
|
|
1768
1806
|
</td>
|
|
1769
1807
|
<td>
|
|
1770
|
-
<
|
|
1808
|
+
<f-tag
|
|
1771
1809
|
[value]="rowData.actionType"
|
|
1772
1810
|
[severity]="
|
|
1773
1811
|
rowData.actionType === 'backend' ? 'info' : 'success'
|
|
@@ -1789,7 +1827,7 @@ class RoleActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
1789
1827
|
<tr>
|
|
1790
1828
|
<td colspan="5" class="text-center p-4 text-muted-color">
|
|
1791
1829
|
@if (loading()) {
|
|
1792
|
-
<
|
|
1830
|
+
<ui-icon name="loader-circle" spin></ui-icon>
|
|
1793
1831
|
{{ 'shared.loading.actions' | translate }}
|
|
1794
1832
|
} @else {
|
|
1795
1833
|
{{ 'iam.permission.no.actions.available' | translate }}
|
|
@@ -1797,14 +1835,14 @@ class RoleActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
1797
1835
|
</td>
|
|
1798
1836
|
</tr>
|
|
1799
1837
|
</ng-template>
|
|
1800
|
-
</
|
|
1838
|
+
</f-treetable>
|
|
1801
1839
|
</div>
|
|
1802
1840
|
</div>
|
|
1803
1841
|
|
|
1804
1842
|
@if (hasChanges()) {
|
|
1805
1843
|
<div class="border border-surface rounded-border p-3 mt-4">
|
|
1806
1844
|
<div class="flex items-center gap-2 mb-3">
|
|
1807
|
-
<
|
|
1845
|
+
<ui-icon name="info-circle" class="text-primary"></ui-icon>
|
|
1808
1846
|
<span class="font-bold">{{
|
|
1809
1847
|
'shared.pending.changes' | translate
|
|
1810
1848
|
}}</span>
|
|
@@ -1813,7 +1851,7 @@ class RoleActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
1813
1851
|
@if (pendingAdd().length > 0) {
|
|
1814
1852
|
<div>
|
|
1815
1853
|
<div class="flex items-center gap-2 mb-2">
|
|
1816
|
-
<
|
|
1854
|
+
<ui-icon name="plus-circle" class="text-green-500"></ui-icon>
|
|
1817
1855
|
<strong class="text-sm"
|
|
1818
1856
|
>{{ 'shared.to.add' | translate }} ({{
|
|
1819
1857
|
pendingAdd().length
|
|
@@ -1830,7 +1868,7 @@ class RoleActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
1830
1868
|
@if (pendingRemove().length > 0) {
|
|
1831
1869
|
<div>
|
|
1832
1870
|
<div class="flex items-center gap-2 mb-2">
|
|
1833
|
-
<
|
|
1871
|
+
<ui-icon name="minus-circle" class="text-red-500"></ui-icon>
|
|
1834
1872
|
<strong class="text-sm"
|
|
1835
1873
|
>{{ 'shared.to.remove' | translate }} ({{
|
|
1836
1874
|
pendingRemove().length
|
|
@@ -1851,9 +1889,7 @@ class RoleActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
1851
1889
|
|
|
1852
1890
|
@if (!loading() && actions().length === 0) {
|
|
1853
1891
|
<div class="surface-card p-5 rounded-border shadow-sm text-center">
|
|
1854
|
-
<
|
|
1855
|
-
class="pi pi-info-circle text-muted-color mb-3 block text-5xl"
|
|
1856
|
-
></i>
|
|
1892
|
+
<ui-icon name="info-circle" class="text-muted-color mb-3 block text-5xl"></ui-icon>
|
|
1857
1893
|
<p class="text-muted-color m-0">
|
|
1858
1894
|
{{ 'iam.permission.no.actions.for.role' | translate }}
|
|
1859
1895
|
</p>
|
|
@@ -1861,11 +1897,11 @@ class RoleActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
1861
1897
|
}
|
|
1862
1898
|
}
|
|
1863
1899
|
</div>
|
|
1864
|
-
`, isInline: true, styles: [":host{display:block}.validation-warning{background-color:var(--
|
|
1900
|
+
`, isInline: true, styles: [":host{display:block}.validation-warning{background-color:var(--f-yellow-50, #fefce8);border-left:4px solid var(--f-yellow-500, #eab308);color:var(--f-yellow-700, #a16207)}:host-context(.p-dark) .validation-warning{background-color:#eab3081a;color:var(--f-yellow-400, #facc15)}:host ::ng-deep tr.highlight-warning{background-color:var(--f-red-50, rgba(239, 68, 68, .1))!important}:host-context(.p-dark) ::ng-deep tr.highlight-warning{background-color:#ef444426!important}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: UiModule }, { kind: "directive", type: i2.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "rounded", "raised", "fluid", "disabled", "loading", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i2.TagComponent, selector: "f-tag", inputs: ["value", "severity", "icon", "rounded", "color"] }, { kind: "component", type: i2.CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "inputId", "invalid", "indeterminate", "touched", "styleClass", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "component", type: i2.SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "showClear", "loading", "inputId", "invalid", "touched", "styleClass", "editable"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur"] }, { kind: "directive", type: i2.TooltipDirective, selector: "[fTooltip]", inputs: ["fTooltip", "tooltipPosition", "tooltipStyleClass", "disabled", "tooltipEvent", "showDelay", "hideDelay"] }, { kind: "component", type: i2.TreeTableComponent, selector: "f-treetable", inputs: ["value", "loading", "dataKey", "styleClass", "tableStyle", "scrollable"] }, { kind: "component", type: i2.TreeTableTogglerComponent, selector: "f-treetabletoggler", inputs: ["rowNode"] }, { kind: "component", type: i2.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill"] }, { kind: "directive", type: HasPermissionDirective, selector: "[hasPermission]", inputs: ["hasPermission"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
1865
1901
|
}
|
|
1866
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1902
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: RoleActionSelectorComponent, decorators: [{
|
|
1867
1903
|
type: Component,
|
|
1868
|
-
args: [{ selector: 'flusys-role-action-selector', imports: [FormsModule,
|
|
1904
|
+
args: [{ selector: 'flusys-role-action-selector', imports: [FormsModule, UiModule, HasPermissionDirective, TranslatePipe], template: `
|
|
1869
1905
|
<div class="role-action-selector">
|
|
1870
1906
|
<div class="mb-4">
|
|
1871
1907
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
@@ -1873,7 +1909,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
1873
1909
|
<label class="block font-semibold mb-2">{{
|
|
1874
1910
|
'iam.permission.select.role' | translate
|
|
1875
1911
|
}}</label>
|
|
1876
|
-
<
|
|
1912
|
+
<f-select
|
|
1877
1913
|
[ngModel]="selectedRoleId()"
|
|
1878
1914
|
(ngModelChange)="selectedRoleId.set($event)"
|
|
1879
1915
|
[options]="roles()"
|
|
@@ -1895,7 +1931,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
1895
1931
|
<div
|
|
1896
1932
|
class="surface-card p-5 rounded-border shadow-sm flex justify-center"
|
|
1897
1933
|
>
|
|
1898
|
-
<
|
|
1934
|
+
<ui-icon name="loader-circle" spin class="text-primary text-5xl"></ui-icon>
|
|
1899
1935
|
</div>
|
|
1900
1936
|
}
|
|
1901
1937
|
|
|
@@ -1916,38 +1952,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
1916
1952
|
</p>
|
|
1917
1953
|
</div>
|
|
1918
1954
|
<div class="flex flex-wrap gap-2">
|
|
1919
|
-
<
|
|
1920
|
-
|
|
1921
|
-
icon="pi pi-check"
|
|
1955
|
+
<button
|
|
1956
|
+
fButton
|
|
1922
1957
|
[outlined]="true"
|
|
1923
1958
|
size="small"
|
|
1924
1959
|
severity="secondary"
|
|
1925
|
-
(
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1960
|
+
(click)="selectAll()"
|
|
1961
|
+
>
|
|
1962
|
+
<ui-icon pButtonIcon name="check"></ui-icon>
|
|
1963
|
+
<span pButtonLabel>{{ 'shared.select.all' | translate }}</span>
|
|
1964
|
+
</button>
|
|
1965
|
+
<button
|
|
1966
|
+
fButton
|
|
1930
1967
|
[outlined]="true"
|
|
1931
1968
|
size="small"
|
|
1932
1969
|
severity="secondary"
|
|
1933
|
-
(
|
|
1934
|
-
|
|
1935
|
-
|
|
1970
|
+
(click)="deselectAll()"
|
|
1971
|
+
>
|
|
1972
|
+
<ui-icon pButtonIcon name="times"></ui-icon>
|
|
1973
|
+
<span pButtonLabel>{{ 'shared.deselect.all' | translate }}</span>
|
|
1974
|
+
</button>
|
|
1975
|
+
<button
|
|
1976
|
+
fButton
|
|
1936
1977
|
*hasPermission="ROLE_ACTION_PERMISSIONS.ASSIGN"
|
|
1937
|
-
[
|
|
1938
|
-
icon="pi pi-save"
|
|
1939
|
-
[disabled]="!canSave()"
|
|
1940
|
-
[loading]="saving()"
|
|
1978
|
+
[disabled]="!canSave() || saving()"
|
|
1941
1979
|
size="small"
|
|
1942
|
-
(
|
|
1943
|
-
|
|
1980
|
+
(click)="saveChanges()"
|
|
1981
|
+
>
|
|
1982
|
+
@if (saving()) {
|
|
1983
|
+
<ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
|
|
1984
|
+
} @else {
|
|
1985
|
+
<ui-icon pButtonIcon name="save"></ui-icon>
|
|
1986
|
+
}
|
|
1987
|
+
<span pButtonLabel>{{ 'shared.save.changes' | translate }}</span>
|
|
1988
|
+
</button>
|
|
1944
1989
|
</div>
|
|
1945
1990
|
</div>
|
|
1946
1991
|
|
|
1947
1992
|
@if (invalidActionsCount() > 0) {
|
|
1948
1993
|
<div class="validation-warning rounded-border p-3 mb-4">
|
|
1949
1994
|
<div class="flex items-start gap-2">
|
|
1950
|
-
<
|
|
1995
|
+
<ui-icon name="exclamation-triangle" class="text-xl"></ui-icon>
|
|
1951
1996
|
<div class="flex-1">
|
|
1952
1997
|
<span class="font-semibold"
|
|
1953
1998
|
>{{ 'iam.validation.warning.title' | translate }}:</span
|
|
@@ -1966,20 +2011,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
1966
2011
|
}
|
|
1967
2012
|
|
|
1968
2013
|
<div class="overflow-x-auto -mx-4 sm:mx-0">
|
|
1969
|
-
<
|
|
2014
|
+
<f-treetable
|
|
1970
2015
|
[value]="treeNodes()"
|
|
1971
2016
|
dataKey="id"
|
|
1972
|
-
class="p-treetable-sm"
|
|
1973
2017
|
[tableStyle]="{ 'min-width': '50rem' }"
|
|
1974
2018
|
>
|
|
1975
2019
|
<ng-template #header>
|
|
1976
2020
|
<tr>
|
|
1977
2021
|
<th class="w-12">
|
|
1978
|
-
<
|
|
2022
|
+
<f-checkbox
|
|
1979
2023
|
[ngModel]="allSelected()"
|
|
1980
2024
|
[binary]="true"
|
|
1981
2025
|
(ngModelChange)="toggleAll()"
|
|
1982
|
-
[
|
|
2026
|
+
[fTooltip]="'shared.select.deselect.all' | translate"
|
|
1983
2027
|
tooltipPosition="top"
|
|
1984
2028
|
/>
|
|
1985
2029
|
</th>
|
|
@@ -1998,27 +2042,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
1998
2042
|
@let tooltip = getTooltip(rowData);
|
|
1999
2043
|
<tr [class.highlight-warning]="hasUnmet">
|
|
2000
2044
|
<td class="w-12">
|
|
2001
|
-
<
|
|
2045
|
+
<f-checkbox
|
|
2002
2046
|
[ngModel]="selectionMap()[rowData.id]"
|
|
2003
2047
|
[binary]="true"
|
|
2004
2048
|
(ngModelChange)="onActionToggle(rowData, $event)"
|
|
2005
|
-
[
|
|
2049
|
+
[fTooltip]="tooltip"
|
|
2006
2050
|
tooltipPosition="top"
|
|
2007
2051
|
/>
|
|
2008
2052
|
</td>
|
|
2009
2053
|
<td>
|
|
2010
|
-
<
|
|
2054
|
+
<f-treetabletoggler [rowNode]="rowNode" />
|
|
2011
2055
|
<span class="inline-flex items-center gap-2">
|
|
2012
2056
|
{{ rowData.name }}
|
|
2013
2057
|
@if (hasUnmet) {
|
|
2014
|
-
<
|
|
2015
|
-
class="pi pi-exclamation-triangle text-orange-500"
|
|
2016
|
-
[pTooltip]="
|
|
2058
|
+
<ui-icon name="exclamation-triangle" class="text-orange-500" [fTooltip]="
|
|
2017
2059
|
'iam.validation.unmet.prerequisites.tooltip'
|
|
2018
2060
|
| translate
|
|
2019
2061
|
"
|
|
2020
|
-
tooltipPosition="top"
|
|
2021
|
-
></i>
|
|
2062
|
+
tooltipPosition="top"></ui-icon>
|
|
2022
2063
|
}
|
|
2023
2064
|
</span>
|
|
2024
2065
|
</td>
|
|
@@ -2026,7 +2067,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2026
2067
|
{{ rowData.code || '-' }}
|
|
2027
2068
|
</td>
|
|
2028
2069
|
<td>
|
|
2029
|
-
<
|
|
2070
|
+
<f-tag
|
|
2030
2071
|
[value]="rowData.actionType"
|
|
2031
2072
|
[severity]="
|
|
2032
2073
|
rowData.actionType === 'backend' ? 'info' : 'success'
|
|
@@ -2048,7 +2089,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2048
2089
|
<tr>
|
|
2049
2090
|
<td colspan="5" class="text-center p-4 text-muted-color">
|
|
2050
2091
|
@if (loading()) {
|
|
2051
|
-
<
|
|
2092
|
+
<ui-icon name="loader-circle" spin></ui-icon>
|
|
2052
2093
|
{{ 'shared.loading.actions' | translate }}
|
|
2053
2094
|
} @else {
|
|
2054
2095
|
{{ 'iam.permission.no.actions.available' | translate }}
|
|
@@ -2056,14 +2097,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2056
2097
|
</td>
|
|
2057
2098
|
</tr>
|
|
2058
2099
|
</ng-template>
|
|
2059
|
-
</
|
|
2100
|
+
</f-treetable>
|
|
2060
2101
|
</div>
|
|
2061
2102
|
</div>
|
|
2062
2103
|
|
|
2063
2104
|
@if (hasChanges()) {
|
|
2064
2105
|
<div class="border border-surface rounded-border p-3 mt-4">
|
|
2065
2106
|
<div class="flex items-center gap-2 mb-3">
|
|
2066
|
-
<
|
|
2107
|
+
<ui-icon name="info-circle" class="text-primary"></ui-icon>
|
|
2067
2108
|
<span class="font-bold">{{
|
|
2068
2109
|
'shared.pending.changes' | translate
|
|
2069
2110
|
}}</span>
|
|
@@ -2072,7 +2113,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2072
2113
|
@if (pendingAdd().length > 0) {
|
|
2073
2114
|
<div>
|
|
2074
2115
|
<div class="flex items-center gap-2 mb-2">
|
|
2075
|
-
<
|
|
2116
|
+
<ui-icon name="plus-circle" class="text-green-500"></ui-icon>
|
|
2076
2117
|
<strong class="text-sm"
|
|
2077
2118
|
>{{ 'shared.to.add' | translate }} ({{
|
|
2078
2119
|
pendingAdd().length
|
|
@@ -2089,7 +2130,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2089
2130
|
@if (pendingRemove().length > 0) {
|
|
2090
2131
|
<div>
|
|
2091
2132
|
<div class="flex items-center gap-2 mb-2">
|
|
2092
|
-
<
|
|
2133
|
+
<ui-icon name="minus-circle" class="text-red-500"></ui-icon>
|
|
2093
2134
|
<strong class="text-sm"
|
|
2094
2135
|
>{{ 'shared.to.remove' | translate }} ({{
|
|
2095
2136
|
pendingRemove().length
|
|
@@ -2110,9 +2151,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2110
2151
|
|
|
2111
2152
|
@if (!loading() && actions().length === 0) {
|
|
2112
2153
|
<div class="surface-card p-5 rounded-border shadow-sm text-center">
|
|
2113
|
-
<
|
|
2114
|
-
class="pi pi-info-circle text-muted-color mb-3 block text-5xl"
|
|
2115
|
-
></i>
|
|
2154
|
+
<ui-icon name="info-circle" class="text-muted-color mb-3 block text-5xl"></ui-icon>
|
|
2116
2155
|
<p class="text-muted-color m-0">
|
|
2117
2156
|
{{ 'iam.permission.no.actions.for.role' | translate }}
|
|
2118
2157
|
</p>
|
|
@@ -2120,7 +2159,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2120
2159
|
}
|
|
2121
2160
|
}
|
|
2122
2161
|
</div>
|
|
2123
|
-
`, styles: [":host{display:block}.validation-warning{background-color:var(--
|
|
2162
|
+
`, styles: [":host{display:block}.validation-warning{background-color:var(--f-yellow-50, #fefce8);border-left:4px solid var(--f-yellow-500, #eab308);color:var(--f-yellow-700, #a16207)}:host-context(.p-dark) .validation-warning{background-color:#eab3081a;color:var(--f-yellow-400, #facc15)}:host ::ng-deep tr.highlight-warning{background-color:var(--f-red-50, rgba(239, 68, 68, .1))!important}:host-context(.p-dark) ::ng-deep tr.highlight-warning{background-color:#ef444426!important}\n"] }]
|
|
2124
2163
|
}], ctorParameters: () => [] });
|
|
2125
2164
|
|
|
2126
2165
|
class CompanyActionSelectorComponent extends BaseActionSelectorComponent {
|
|
@@ -2131,8 +2170,10 @@ class CompanyActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
2131
2170
|
messageService = inject(MessageService);
|
|
2132
2171
|
confirmationService = inject(ConfirmationService);
|
|
2133
2172
|
destroyRef = inject(DestroyRef);
|
|
2134
|
-
selectedCompanyId = signal(undefined,
|
|
2135
|
-
|
|
2173
|
+
selectedCompanyId = signal(undefined, /* @ts-ignore */
|
|
2174
|
+
...(ngDevMode ? [{ debugName: "selectedCompanyId" }] : /* istanbul ignore next */ []));
|
|
2175
|
+
companies = signal([], /* @ts-ignore */
|
|
2176
|
+
...(ngDevMode ? [{ debugName: "companies" }] : /* istanbul ignore next */ []));
|
|
2136
2177
|
loadDataAbortController = null;
|
|
2137
2178
|
constructor() {
|
|
2138
2179
|
super();
|
|
@@ -2246,11 +2287,11 @@ class CompanyActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
2246
2287
|
this.confirmationService.confirm({
|
|
2247
2288
|
header: this.translate('iam.permission.prerequisite.validation.failed'),
|
|
2248
2289
|
message: `${this.translate('iam.permission.prerequisite.error.message')}\n\n${errorList}\n\n${this.translate('iam.permission.auto.select.prompt')}`,
|
|
2249
|
-
icon: '
|
|
2290
|
+
icon: 'exclamation-triangle',
|
|
2250
2291
|
acceptLabel: this.translate('iam.permission.auto.select.required'),
|
|
2251
2292
|
rejectLabel: this.translate('shared.cancel'),
|
|
2252
|
-
acceptIcon: '
|
|
2253
|
-
rejectIcon: '
|
|
2293
|
+
acceptIcon: 'check',
|
|
2294
|
+
rejectIcon: 'times',
|
|
2254
2295
|
accept: () => {
|
|
2255
2296
|
const selMap = { ...this.selectionMap() };
|
|
2256
2297
|
prerequisiteErrors.forEach((error) => {
|
|
@@ -2275,8 +2316,8 @@ class CompanyActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
2275
2316
|
},
|
|
2276
2317
|
});
|
|
2277
2318
|
}
|
|
2278
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
2279
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
2319
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: CompanyActionSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2320
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: CompanyActionSelectorComponent, isStandalone: true, selector: "flusys-company-action-selector", usesInheritance: true, ngImport: i0, template: `
|
|
2280
2321
|
<div class="company-action-selector">
|
|
2281
2322
|
<div class="mb-4">
|
|
2282
2323
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
@@ -2284,7 +2325,7 @@ class CompanyActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
2284
2325
|
<label class="block font-semibold mb-2">{{
|
|
2285
2326
|
'iam.permission.select.company' | translate
|
|
2286
2327
|
}}</label>
|
|
2287
|
-
<
|
|
2328
|
+
<f-select
|
|
2288
2329
|
[ngModel]="selectedCompanyId()"
|
|
2289
2330
|
(ngModelChange)="selectedCompanyId.set($event)"
|
|
2290
2331
|
[options]="companies()"
|
|
@@ -2306,7 +2347,7 @@ class CompanyActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
2306
2347
|
<div
|
|
2307
2348
|
class="surface-card p-5 rounded-border shadow-sm flex justify-center"
|
|
2308
2349
|
>
|
|
2309
|
-
<
|
|
2350
|
+
<ui-icon name="loader-circle" spin class="text-primary text-5xl"></ui-icon>
|
|
2310
2351
|
</div>
|
|
2311
2352
|
}
|
|
2312
2353
|
|
|
@@ -2327,38 +2368,47 @@ class CompanyActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
2327
2368
|
</p>
|
|
2328
2369
|
</div>
|
|
2329
2370
|
<div class="flex flex-wrap gap-2">
|
|
2330
|
-
<
|
|
2331
|
-
|
|
2332
|
-
icon="pi pi-check"
|
|
2371
|
+
<button
|
|
2372
|
+
fButton
|
|
2333
2373
|
[outlined]="true"
|
|
2334
2374
|
size="small"
|
|
2335
2375
|
severity="secondary"
|
|
2336
|
-
(
|
|
2337
|
-
|
|
2338
|
-
|
|
2339
|
-
|
|
2340
|
-
|
|
2376
|
+
(click)="selectAll()"
|
|
2377
|
+
>
|
|
2378
|
+
<ui-icon pButtonIcon name="check"></ui-icon>
|
|
2379
|
+
<span pButtonLabel>{{ 'shared.select.all' | translate }}</span>
|
|
2380
|
+
</button>
|
|
2381
|
+
<button
|
|
2382
|
+
fButton
|
|
2341
2383
|
[outlined]="true"
|
|
2342
2384
|
size="small"
|
|
2343
2385
|
severity="secondary"
|
|
2344
|
-
(
|
|
2345
|
-
|
|
2346
|
-
|
|
2386
|
+
(click)="deselectAll()"
|
|
2387
|
+
>
|
|
2388
|
+
<ui-icon pButtonIcon name="times"></ui-icon>
|
|
2389
|
+
<span pButtonLabel>{{ 'shared.deselect.all' | translate }}</span>
|
|
2390
|
+
</button>
|
|
2391
|
+
<button
|
|
2392
|
+
fButton
|
|
2347
2393
|
*hasPermission="COMPANY_ACTION_PERMISSIONS.ASSIGN"
|
|
2348
|
-
[
|
|
2349
|
-
icon="pi pi-save"
|
|
2350
|
-
[disabled]="!canSave()"
|
|
2351
|
-
[loading]="saving()"
|
|
2394
|
+
[disabled]="!canSave() || saving()"
|
|
2352
2395
|
size="small"
|
|
2353
|
-
(
|
|
2354
|
-
|
|
2396
|
+
(click)="saveChanges()"
|
|
2397
|
+
>
|
|
2398
|
+
@if (saving()) {
|
|
2399
|
+
<ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
|
|
2400
|
+
} @else {
|
|
2401
|
+
<ui-icon pButtonIcon name="save"></ui-icon>
|
|
2402
|
+
}
|
|
2403
|
+
<span pButtonLabel>{{ 'shared.save.changes' | translate }}</span>
|
|
2404
|
+
</button>
|
|
2355
2405
|
</div>
|
|
2356
2406
|
</div>
|
|
2357
2407
|
|
|
2358
2408
|
@if (invalidActionsCount() > 0) {
|
|
2359
2409
|
<div class="validation-warning rounded-border p-3 mb-4">
|
|
2360
2410
|
<div class="flex items-start gap-2">
|
|
2361
|
-
<
|
|
2411
|
+
<ui-icon name="exclamation-triangle" class="text-xl"></ui-icon>
|
|
2362
2412
|
<div class="flex-1">
|
|
2363
2413
|
<span class="font-semibold"
|
|
2364
2414
|
>{{ 'iam.validation.warning.title' | translate }}:</span
|
|
@@ -2377,20 +2427,19 @@ class CompanyActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
2377
2427
|
}
|
|
2378
2428
|
|
|
2379
2429
|
<div class="overflow-x-auto -mx-4 sm:mx-0">
|
|
2380
|
-
<
|
|
2430
|
+
<f-treetable
|
|
2381
2431
|
[value]="treeNodes()"
|
|
2382
2432
|
dataKey="id"
|
|
2383
|
-
class="p-treetable-sm"
|
|
2384
2433
|
[tableStyle]="{ 'min-width': '50rem' }"
|
|
2385
2434
|
>
|
|
2386
2435
|
<ng-template #header>
|
|
2387
2436
|
<tr>
|
|
2388
2437
|
<th class="w-12">
|
|
2389
|
-
<
|
|
2438
|
+
<f-checkbox
|
|
2390
2439
|
[ngModel]="allSelected()"
|
|
2391
2440
|
[binary]="true"
|
|
2392
2441
|
(ngModelChange)="toggleAll()"
|
|
2393
|
-
[
|
|
2442
|
+
[fTooltip]="'shared.select.deselect.all' | translate"
|
|
2394
2443
|
tooltipPosition="top"
|
|
2395
2444
|
/>
|
|
2396
2445
|
</th>
|
|
@@ -2408,27 +2457,24 @@ class CompanyActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
2408
2457
|
@let hasUnmet = hasUnmetPrerequisites(rowData);
|
|
2409
2458
|
<tr [class.highlight-warning]="hasUnmet">
|
|
2410
2459
|
<td class="w-12">
|
|
2411
|
-
<
|
|
2460
|
+
<f-checkbox
|
|
2412
2461
|
[ngModel]="selectionMap()[rowData.id]"
|
|
2413
2462
|
[binary]="true"
|
|
2414
2463
|
(ngModelChange)="onActionToggle(rowData, $event)"
|
|
2415
|
-
[
|
|
2464
|
+
[fTooltip]="getTooltip(rowData)"
|
|
2416
2465
|
tooltipPosition="top"
|
|
2417
2466
|
/>
|
|
2418
2467
|
</td>
|
|
2419
2468
|
<td>
|
|
2420
|
-
<
|
|
2469
|
+
<f-treetabletoggler [rowNode]="rowNode" />
|
|
2421
2470
|
<span class="inline-flex items-center gap-2">
|
|
2422
2471
|
{{ rowData.name }}
|
|
2423
2472
|
@if (hasUnmet) {
|
|
2424
|
-
<
|
|
2425
|
-
class="pi pi-exclamation-triangle text-orange-500"
|
|
2426
|
-
[pTooltip]="
|
|
2473
|
+
<ui-icon name="exclamation-triangle" class="text-orange-500" [fTooltip]="
|
|
2427
2474
|
'iam.validation.unmet.prerequisites.tooltip'
|
|
2428
2475
|
| translate
|
|
2429
2476
|
"
|
|
2430
|
-
tooltipPosition="top"
|
|
2431
|
-
></i>
|
|
2477
|
+
tooltipPosition="top"></ui-icon>
|
|
2432
2478
|
}
|
|
2433
2479
|
</span>
|
|
2434
2480
|
</td>
|
|
@@ -2436,7 +2482,7 @@ class CompanyActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
2436
2482
|
{{ rowData.code || '-' }}
|
|
2437
2483
|
</td>
|
|
2438
2484
|
<td>
|
|
2439
|
-
<
|
|
2485
|
+
<f-tag
|
|
2440
2486
|
[value]="rowData.actionType"
|
|
2441
2487
|
[severity]="
|
|
2442
2488
|
rowData.actionType === 'backend' ? 'info' : 'success'
|
|
@@ -2452,7 +2498,7 @@ class CompanyActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
2452
2498
|
<tr>
|
|
2453
2499
|
<td colspan="5" class="text-center p-4 text-muted-color">
|
|
2454
2500
|
@if (loading()) {
|
|
2455
|
-
<
|
|
2501
|
+
<ui-icon name="loader-circle" spin></ui-icon>
|
|
2456
2502
|
{{ 'shared.loading.actions' | translate }}
|
|
2457
2503
|
} @else {
|
|
2458
2504
|
{{ 'iam.permission.no.actions.available' | translate }}
|
|
@@ -2460,14 +2506,14 @@ class CompanyActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
2460
2506
|
</td>
|
|
2461
2507
|
</tr>
|
|
2462
2508
|
</ng-template>
|
|
2463
|
-
</
|
|
2509
|
+
</f-treetable>
|
|
2464
2510
|
</div>
|
|
2465
2511
|
</div>
|
|
2466
2512
|
|
|
2467
2513
|
@if (hasChanges()) {
|
|
2468
2514
|
<div class="border border-surface rounded-border p-3 mt-4">
|
|
2469
2515
|
<div class="flex items-center gap-2 mb-3">
|
|
2470
|
-
<
|
|
2516
|
+
<ui-icon name="info-circle" class="text-primary"></ui-icon>
|
|
2471
2517
|
<span class="font-bold">{{
|
|
2472
2518
|
'shared.pending.changes' | translate
|
|
2473
2519
|
}}</span>
|
|
@@ -2476,7 +2522,7 @@ class CompanyActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
2476
2522
|
@if (pendingAdd().length > 0) {
|
|
2477
2523
|
<div>
|
|
2478
2524
|
<div class="flex items-center gap-2 mb-2">
|
|
2479
|
-
<
|
|
2525
|
+
<ui-icon name="plus-circle" class="text-green-500"></ui-icon>
|
|
2480
2526
|
<strong class="text-sm"
|
|
2481
2527
|
>{{ 'shared.to.whitelist' | translate }} ({{
|
|
2482
2528
|
pendingAdd().length
|
|
@@ -2493,7 +2539,7 @@ class CompanyActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
2493
2539
|
@if (pendingRemove().length > 0) {
|
|
2494
2540
|
<div>
|
|
2495
2541
|
<div class="flex items-center gap-2 mb-2">
|
|
2496
|
-
<
|
|
2542
|
+
<ui-icon name="minus-circle" class="text-red-500"></ui-icon>
|
|
2497
2543
|
<strong class="text-sm"
|
|
2498
2544
|
>{{ 'shared.to.remove' | translate }} ({{
|
|
2499
2545
|
pendingRemove().length
|
|
@@ -2514,9 +2560,7 @@ class CompanyActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
2514
2560
|
|
|
2515
2561
|
@if (!loading() && actions().length === 0) {
|
|
2516
2562
|
<div class="surface-card p-5 rounded-border shadow-sm text-center">
|
|
2517
|
-
<
|
|
2518
|
-
class="pi pi-info-circle text-muted-color mb-3 block text-5xl"
|
|
2519
|
-
></i>
|
|
2563
|
+
<ui-icon name="info-circle" class="text-muted-color mb-3 block text-5xl"></ui-icon>
|
|
2520
2564
|
<p class="text-muted-color m-0">
|
|
2521
2565
|
{{ 'iam.permission.no.actions.for.company' | translate }}
|
|
2522
2566
|
</p>
|
|
@@ -2524,11 +2568,11 @@ class CompanyActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
2524
2568
|
}
|
|
2525
2569
|
}
|
|
2526
2570
|
</div>
|
|
2527
|
-
`, isInline: true, styles: [":host{display:block}.validation-warning{background-color:var(--
|
|
2571
|
+
`, isInline: true, styles: [":host{display:block}.validation-warning{background-color:var(--f-yellow-50, #fefce8);border-left:4px solid var(--f-yellow-500, #eab308);color:var(--f-yellow-700, #a16207)}:host-context(.p-dark) .validation-warning{background-color:#eab3081a;color:var(--f-yellow-400, #facc15)}:host ::ng-deep tr.highlight-warning{background-color:var(--f-red-50, rgba(239, 68, 68, .1))!important}:host-context(.p-dark) ::ng-deep tr.highlight-warning{background-color:#ef444426!important}\n"], dependencies: [{ kind: "ngmodule", type: UiModule }, { kind: "directive", type: i2.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "rounded", "raised", "fluid", "disabled", "loading", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i2.TagComponent, selector: "f-tag", inputs: ["value", "severity", "icon", "rounded", "color"] }, { kind: "component", type: i2.CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "inputId", "invalid", "indeterminate", "touched", "styleClass", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "component", type: i2.SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "showClear", "loading", "inputId", "invalid", "touched", "styleClass", "editable"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur"] }, { kind: "directive", type: i2.TooltipDirective, selector: "[fTooltip]", inputs: ["fTooltip", "tooltipPosition", "tooltipStyleClass", "disabled", "tooltipEvent", "showDelay", "hideDelay"] }, { kind: "component", type: i2.TreeTableComponent, selector: "f-treetable", inputs: ["value", "loading", "dataKey", "styleClass", "tableStyle", "scrollable"] }, { kind: "component", type: i2.TreeTableTogglerComponent, selector: "f-treetabletoggler", inputs: ["rowNode"] }, { kind: "component", type: i2.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: HasPermissionDirective, selector: "[hasPermission]", inputs: ["hasPermission"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
2528
2572
|
}
|
|
2529
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
2573
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: CompanyActionSelectorComponent, decorators: [{
|
|
2530
2574
|
type: Component,
|
|
2531
|
-
args: [{ selector: 'flusys-company-action-selector', imports: [
|
|
2575
|
+
args: [{ selector: 'flusys-company-action-selector', imports: [UiModule, FormsModule, HasPermissionDirective, TranslatePipe], template: `
|
|
2532
2576
|
<div class="company-action-selector">
|
|
2533
2577
|
<div class="mb-4">
|
|
2534
2578
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
@@ -2536,7 +2580,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2536
2580
|
<label class="block font-semibold mb-2">{{
|
|
2537
2581
|
'iam.permission.select.company' | translate
|
|
2538
2582
|
}}</label>
|
|
2539
|
-
<
|
|
2583
|
+
<f-select
|
|
2540
2584
|
[ngModel]="selectedCompanyId()"
|
|
2541
2585
|
(ngModelChange)="selectedCompanyId.set($event)"
|
|
2542
2586
|
[options]="companies()"
|
|
@@ -2558,7 +2602,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2558
2602
|
<div
|
|
2559
2603
|
class="surface-card p-5 rounded-border shadow-sm flex justify-center"
|
|
2560
2604
|
>
|
|
2561
|
-
<
|
|
2605
|
+
<ui-icon name="loader-circle" spin class="text-primary text-5xl"></ui-icon>
|
|
2562
2606
|
</div>
|
|
2563
2607
|
}
|
|
2564
2608
|
|
|
@@ -2579,38 +2623,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2579
2623
|
</p>
|
|
2580
2624
|
</div>
|
|
2581
2625
|
<div class="flex flex-wrap gap-2">
|
|
2582
|
-
<
|
|
2583
|
-
|
|
2584
|
-
icon="pi pi-check"
|
|
2626
|
+
<button
|
|
2627
|
+
fButton
|
|
2585
2628
|
[outlined]="true"
|
|
2586
2629
|
size="small"
|
|
2587
2630
|
severity="secondary"
|
|
2588
|
-
(
|
|
2589
|
-
|
|
2590
|
-
|
|
2591
|
-
|
|
2592
|
-
|
|
2631
|
+
(click)="selectAll()"
|
|
2632
|
+
>
|
|
2633
|
+
<ui-icon pButtonIcon name="check"></ui-icon>
|
|
2634
|
+
<span pButtonLabel>{{ 'shared.select.all' | translate }}</span>
|
|
2635
|
+
</button>
|
|
2636
|
+
<button
|
|
2637
|
+
fButton
|
|
2593
2638
|
[outlined]="true"
|
|
2594
2639
|
size="small"
|
|
2595
2640
|
severity="secondary"
|
|
2596
|
-
(
|
|
2597
|
-
|
|
2598
|
-
|
|
2641
|
+
(click)="deselectAll()"
|
|
2642
|
+
>
|
|
2643
|
+
<ui-icon pButtonIcon name="times"></ui-icon>
|
|
2644
|
+
<span pButtonLabel>{{ 'shared.deselect.all' | translate }}</span>
|
|
2645
|
+
</button>
|
|
2646
|
+
<button
|
|
2647
|
+
fButton
|
|
2599
2648
|
*hasPermission="COMPANY_ACTION_PERMISSIONS.ASSIGN"
|
|
2600
|
-
[
|
|
2601
|
-
icon="pi pi-save"
|
|
2602
|
-
[disabled]="!canSave()"
|
|
2603
|
-
[loading]="saving()"
|
|
2649
|
+
[disabled]="!canSave() || saving()"
|
|
2604
2650
|
size="small"
|
|
2605
|
-
(
|
|
2606
|
-
|
|
2651
|
+
(click)="saveChanges()"
|
|
2652
|
+
>
|
|
2653
|
+
@if (saving()) {
|
|
2654
|
+
<ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
|
|
2655
|
+
} @else {
|
|
2656
|
+
<ui-icon pButtonIcon name="save"></ui-icon>
|
|
2657
|
+
}
|
|
2658
|
+
<span pButtonLabel>{{ 'shared.save.changes' | translate }}</span>
|
|
2659
|
+
</button>
|
|
2607
2660
|
</div>
|
|
2608
2661
|
</div>
|
|
2609
2662
|
|
|
2610
2663
|
@if (invalidActionsCount() > 0) {
|
|
2611
2664
|
<div class="validation-warning rounded-border p-3 mb-4">
|
|
2612
2665
|
<div class="flex items-start gap-2">
|
|
2613
|
-
<
|
|
2666
|
+
<ui-icon name="exclamation-triangle" class="text-xl"></ui-icon>
|
|
2614
2667
|
<div class="flex-1">
|
|
2615
2668
|
<span class="font-semibold"
|
|
2616
2669
|
>{{ 'iam.validation.warning.title' | translate }}:</span
|
|
@@ -2629,20 +2682,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2629
2682
|
}
|
|
2630
2683
|
|
|
2631
2684
|
<div class="overflow-x-auto -mx-4 sm:mx-0">
|
|
2632
|
-
<
|
|
2685
|
+
<f-treetable
|
|
2633
2686
|
[value]="treeNodes()"
|
|
2634
2687
|
dataKey="id"
|
|
2635
|
-
class="p-treetable-sm"
|
|
2636
2688
|
[tableStyle]="{ 'min-width': '50rem' }"
|
|
2637
2689
|
>
|
|
2638
2690
|
<ng-template #header>
|
|
2639
2691
|
<tr>
|
|
2640
2692
|
<th class="w-12">
|
|
2641
|
-
<
|
|
2693
|
+
<f-checkbox
|
|
2642
2694
|
[ngModel]="allSelected()"
|
|
2643
2695
|
[binary]="true"
|
|
2644
2696
|
(ngModelChange)="toggleAll()"
|
|
2645
|
-
[
|
|
2697
|
+
[fTooltip]="'shared.select.deselect.all' | translate"
|
|
2646
2698
|
tooltipPosition="top"
|
|
2647
2699
|
/>
|
|
2648
2700
|
</th>
|
|
@@ -2660,27 +2712,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2660
2712
|
@let hasUnmet = hasUnmetPrerequisites(rowData);
|
|
2661
2713
|
<tr [class.highlight-warning]="hasUnmet">
|
|
2662
2714
|
<td class="w-12">
|
|
2663
|
-
<
|
|
2715
|
+
<f-checkbox
|
|
2664
2716
|
[ngModel]="selectionMap()[rowData.id]"
|
|
2665
2717
|
[binary]="true"
|
|
2666
2718
|
(ngModelChange)="onActionToggle(rowData, $event)"
|
|
2667
|
-
[
|
|
2719
|
+
[fTooltip]="getTooltip(rowData)"
|
|
2668
2720
|
tooltipPosition="top"
|
|
2669
2721
|
/>
|
|
2670
2722
|
</td>
|
|
2671
2723
|
<td>
|
|
2672
|
-
<
|
|
2724
|
+
<f-treetabletoggler [rowNode]="rowNode" />
|
|
2673
2725
|
<span class="inline-flex items-center gap-2">
|
|
2674
2726
|
{{ rowData.name }}
|
|
2675
2727
|
@if (hasUnmet) {
|
|
2676
|
-
<
|
|
2677
|
-
class="pi pi-exclamation-triangle text-orange-500"
|
|
2678
|
-
[pTooltip]="
|
|
2728
|
+
<ui-icon name="exclamation-triangle" class="text-orange-500" [fTooltip]="
|
|
2679
2729
|
'iam.validation.unmet.prerequisites.tooltip'
|
|
2680
2730
|
| translate
|
|
2681
2731
|
"
|
|
2682
|
-
tooltipPosition="top"
|
|
2683
|
-
></i>
|
|
2732
|
+
tooltipPosition="top"></ui-icon>
|
|
2684
2733
|
}
|
|
2685
2734
|
</span>
|
|
2686
2735
|
</td>
|
|
@@ -2688,7 +2737,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2688
2737
|
{{ rowData.code || '-' }}
|
|
2689
2738
|
</td>
|
|
2690
2739
|
<td>
|
|
2691
|
-
<
|
|
2740
|
+
<f-tag
|
|
2692
2741
|
[value]="rowData.actionType"
|
|
2693
2742
|
[severity]="
|
|
2694
2743
|
rowData.actionType === 'backend' ? 'info' : 'success'
|
|
@@ -2704,7 +2753,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2704
2753
|
<tr>
|
|
2705
2754
|
<td colspan="5" class="text-center p-4 text-muted-color">
|
|
2706
2755
|
@if (loading()) {
|
|
2707
|
-
<
|
|
2756
|
+
<ui-icon name="loader-circle" spin></ui-icon>
|
|
2708
2757
|
{{ 'shared.loading.actions' | translate }}
|
|
2709
2758
|
} @else {
|
|
2710
2759
|
{{ 'iam.permission.no.actions.available' | translate }}
|
|
@@ -2712,14 +2761,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2712
2761
|
</td>
|
|
2713
2762
|
</tr>
|
|
2714
2763
|
</ng-template>
|
|
2715
|
-
</
|
|
2764
|
+
</f-treetable>
|
|
2716
2765
|
</div>
|
|
2717
2766
|
</div>
|
|
2718
2767
|
|
|
2719
2768
|
@if (hasChanges()) {
|
|
2720
2769
|
<div class="border border-surface rounded-border p-3 mt-4">
|
|
2721
2770
|
<div class="flex items-center gap-2 mb-3">
|
|
2722
|
-
<
|
|
2771
|
+
<ui-icon name="info-circle" class="text-primary"></ui-icon>
|
|
2723
2772
|
<span class="font-bold">{{
|
|
2724
2773
|
'shared.pending.changes' | translate
|
|
2725
2774
|
}}</span>
|
|
@@ -2728,7 +2777,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2728
2777
|
@if (pendingAdd().length > 0) {
|
|
2729
2778
|
<div>
|
|
2730
2779
|
<div class="flex items-center gap-2 mb-2">
|
|
2731
|
-
<
|
|
2780
|
+
<ui-icon name="plus-circle" class="text-green-500"></ui-icon>
|
|
2732
2781
|
<strong class="text-sm"
|
|
2733
2782
|
>{{ 'shared.to.whitelist' | translate }} ({{
|
|
2734
2783
|
pendingAdd().length
|
|
@@ -2745,7 +2794,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2745
2794
|
@if (pendingRemove().length > 0) {
|
|
2746
2795
|
<div>
|
|
2747
2796
|
<div class="flex items-center gap-2 mb-2">
|
|
2748
|
-
<
|
|
2797
|
+
<ui-icon name="minus-circle" class="text-red-500"></ui-icon>
|
|
2749
2798
|
<strong class="text-sm"
|
|
2750
2799
|
>{{ 'shared.to.remove' | translate }} ({{
|
|
2751
2800
|
pendingRemove().length
|
|
@@ -2766,9 +2815,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2766
2815
|
|
|
2767
2816
|
@if (!loading() && actions().length === 0) {
|
|
2768
2817
|
<div class="surface-card p-5 rounded-border shadow-sm text-center">
|
|
2769
|
-
<
|
|
2770
|
-
class="pi pi-info-circle text-muted-color mb-3 block text-5xl"
|
|
2771
|
-
></i>
|
|
2818
|
+
<ui-icon name="info-circle" class="text-muted-color mb-3 block text-5xl"></ui-icon>
|
|
2772
2819
|
<p class="text-muted-color m-0">
|
|
2773
2820
|
{{ 'iam.permission.no.actions.for.company' | translate }}
|
|
2774
2821
|
</p>
|
|
@@ -2776,7 +2823,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2776
2823
|
}
|
|
2777
2824
|
}
|
|
2778
2825
|
</div>
|
|
2779
|
-
`, styles: [":host{display:block}.validation-warning{background-color:var(--
|
|
2826
|
+
`, styles: [":host{display:block}.validation-warning{background-color:var(--f-yellow-50, #fefce8);border-left:4px solid var(--f-yellow-500, #eab308);color:var(--f-yellow-700, #a16207)}:host-context(.p-dark) .validation-warning{background-color:#eab3081a;color:var(--f-yellow-400, #facc15)}:host ::ng-deep tr.highlight-warning{background-color:var(--f-red-50, rgba(239, 68, 68, .1))!important}:host-context(.p-dark) ::ng-deep tr.highlight-warning{background-color:#ef444426!important}\n"] }]
|
|
2780
2827
|
}], ctorParameters: () => [] });
|
|
2781
2828
|
|
|
2782
2829
|
/**
|
|
@@ -2825,28 +2872,38 @@ class UserRoleSelectorComponent {
|
|
|
2825
2872
|
return this.translateAdapter?.translate(key, vars) ?? key;
|
|
2826
2873
|
}
|
|
2827
2874
|
// State - User/Branch Selection
|
|
2828
|
-
selectedUserId = signal(null,
|
|
2829
|
-
|
|
2830
|
-
|
|
2875
|
+
selectedUserId = signal(null, /* @ts-ignore */
|
|
2876
|
+
...(ngDevMode ? [{ debugName: "selectedUserId" }] : /* istanbul ignore next */ []));
|
|
2877
|
+
selectedBranchId = signal(undefined, /* @ts-ignore */
|
|
2878
|
+
...(ngDevMode ? [{ debugName: "selectedBranchId" }] : /* istanbul ignore next */ []));
|
|
2879
|
+
branches = signal([], /* @ts-ignore */
|
|
2880
|
+
...(ngDevMode ? [{ debugName: "branches" }] : /* istanbul ignore next */ []));
|
|
2831
2881
|
// State - Loading/Saving
|
|
2832
|
-
loading = signal(false,
|
|
2833
|
-
|
|
2882
|
+
loading = signal(false, /* @ts-ignore */
|
|
2883
|
+
...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
2884
|
+
saving = signal(false, /* @ts-ignore */
|
|
2885
|
+
...(ngDevMode ? [{ debugName: "saving" }] : /* istanbul ignore next */ []));
|
|
2834
2886
|
// State - Roles (Business Logic)
|
|
2835
|
-
_roles = signal([],
|
|
2887
|
+
_roles = signal([], /* @ts-ignore */
|
|
2888
|
+
...(ngDevMode ? [{ debugName: "_roles" }] : /* istanbul ignore next */ []));
|
|
2836
2889
|
roles = this._roles.asReadonly();
|
|
2837
2890
|
// State - Selection
|
|
2838
|
-
_selectionMap = signal({},
|
|
2891
|
+
_selectionMap = signal({}, /* @ts-ignore */
|
|
2892
|
+
...(ngDevMode ? [{ debugName: "_selectionMap" }] : /* istanbul ignore next */ []));
|
|
2839
2893
|
selectionMap = this._selectionMap.asReadonly();
|
|
2840
|
-
_initialSelection = signal({},
|
|
2894
|
+
_initialSelection = signal({}, /* @ts-ignore */
|
|
2895
|
+
...(ngDevMode ? [{ debugName: "_initialSelection" }] : /* istanbul ignore next */ []));
|
|
2841
2896
|
initialSelection = this._initialSelection.asReadonly();
|
|
2842
2897
|
// Computed - UI Flags
|
|
2843
|
-
showBranchSelector = computed(() => isCompanyFeatureEnabled(this.appConfig) === true,
|
|
2898
|
+
showBranchSelector = computed(() => isCompanyFeatureEnabled(this.appConfig) === true, /* @ts-ignore */
|
|
2899
|
+
...(ngDevMode ? [{ debugName: "showBranchSelector" }] : /* istanbul ignore next */ []));
|
|
2844
2900
|
filteredBranches = computed(() => {
|
|
2845
2901
|
const currentCompanyId = this.companyContext.currentCompanyInfo()?.id || undefined;
|
|
2846
2902
|
if (!currentCompanyId)
|
|
2847
2903
|
return this.branches();
|
|
2848
2904
|
return this.branches().filter((b) => b.companyId === currentCompanyId);
|
|
2849
|
-
},
|
|
2905
|
+
}, /* @ts-ignore */
|
|
2906
|
+
...(ngDevMode ? [{ debugName: "filteredBranches" }] : /* istanbul ignore next */ []));
|
|
2850
2907
|
// Computed - Selection State
|
|
2851
2908
|
allSelected = computed(() => {
|
|
2852
2909
|
const selMap = this.selectionMap();
|
|
@@ -2855,7 +2912,8 @@ class UserRoleSelectorComponent {
|
|
|
2855
2912
|
return false;
|
|
2856
2913
|
const selected = Object.values(selMap).filter((v) => v).length;
|
|
2857
2914
|
return selected === total;
|
|
2858
|
-
},
|
|
2915
|
+
}, /* @ts-ignore */
|
|
2916
|
+
...(ngDevMode ? [{ debugName: "allSelected" }] : /* istanbul ignore next */ []));
|
|
2859
2917
|
// Computed - Change Detection
|
|
2860
2918
|
hasChanges = computed(() => {
|
|
2861
2919
|
const current = this.selectionMap();
|
|
@@ -2865,24 +2923,28 @@ class UserRoleSelectorComponent {
|
|
|
2865
2923
|
if (currentKeys.length !== initialKeys.length)
|
|
2866
2924
|
return true;
|
|
2867
2925
|
return currentKeys.some((key) => current[key] !== initial[key]);
|
|
2868
|
-
},
|
|
2926
|
+
}, /* @ts-ignore */
|
|
2927
|
+
...(ngDevMode ? [{ debugName: "hasChanges" }] : /* istanbul ignore next */ []));
|
|
2869
2928
|
// Computed - Pending Changes
|
|
2870
2929
|
pendingAdd = computed(() => {
|
|
2871
2930
|
const current = this.selectionMap();
|
|
2872
2931
|
const initial = this.initialSelection();
|
|
2873
2932
|
const allRoles = this.roles();
|
|
2874
2933
|
return allRoles.filter((role) => current[role.id] && !initial[role.id]);
|
|
2875
|
-
},
|
|
2934
|
+
}, /* @ts-ignore */
|
|
2935
|
+
...(ngDevMode ? [{ debugName: "pendingAdd" }] : /* istanbul ignore next */ []));
|
|
2876
2936
|
pendingRemove = computed(() => {
|
|
2877
2937
|
const current = this.selectionMap();
|
|
2878
2938
|
const initial = this.initialSelection();
|
|
2879
2939
|
const allRoles = this.roles();
|
|
2880
2940
|
return allRoles.filter((role) => !current[role.id] && initial[role.id]);
|
|
2881
|
-
},
|
|
2941
|
+
}, /* @ts-ignore */
|
|
2942
|
+
...(ngDevMode ? [{ debugName: "pendingRemove" }] : /* istanbul ignore next */ []));
|
|
2882
2943
|
// Computed - Save Button State
|
|
2883
2944
|
canSave = computed(() => {
|
|
2884
2945
|
return this.hasChanges() && !this.saving();
|
|
2885
|
-
},
|
|
2946
|
+
}, /* @ts-ignore */
|
|
2947
|
+
...(ngDevMode ? [{ debugName: "canSave" }] : /* istanbul ignore next */ []));
|
|
2886
2948
|
constructor() {
|
|
2887
2949
|
// Effect: Load user branches and data when user changes
|
|
2888
2950
|
effect(() => {
|
|
@@ -3081,15 +3143,15 @@ class UserRoleSelectorComponent {
|
|
|
3081
3143
|
this._selectionMap.set({});
|
|
3082
3144
|
this._initialSelection.set({});
|
|
3083
3145
|
}
|
|
3084
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
3085
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
3146
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: UserRoleSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3147
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: UserRoleSelectorComponent, isStandalone: true, selector: "flusys-user-role-selector", ngImport: i0, template: `
|
|
3086
3148
|
<div class="user-role-selector">
|
|
3087
3149
|
<!-- User and Branch Selectors -->
|
|
3088
3150
|
<div class="surface-card p-4 rounded-border mb-4 shadow-sm">
|
|
3089
3151
|
<div class="grid grid-cols-1 sm:grid-cols-2 gap-5">
|
|
3090
3152
|
<div>
|
|
3091
3153
|
<label class="block font-semibold mb-2">
|
|
3092
|
-
<
|
|
3154
|
+
<ui-icon name="user" class="mr-2 text-primary"></ui-icon>
|
|
3093
3155
|
{{ 'iam.permission.select.user' | translate }}
|
|
3094
3156
|
</label>
|
|
3095
3157
|
<lib-user-select
|
|
@@ -3105,10 +3167,10 @@ class UserRoleSelectorComponent {
|
|
|
3105
3167
|
@if (showBranchSelector()) {
|
|
3106
3168
|
<div>
|
|
3107
3169
|
<label class="block font-semibold mb-2">
|
|
3108
|
-
<
|
|
3170
|
+
<ui-icon name="building" class="mr-2 text-primary"></ui-icon>
|
|
3109
3171
|
{{ 'iam.permission.select.branch' | translate }}
|
|
3110
3172
|
</label>
|
|
3111
|
-
<
|
|
3173
|
+
<f-select
|
|
3112
3174
|
[ngModel]="selectedBranchId()"
|
|
3113
3175
|
(ngModelChange)="selectedBranchId.set($event)"
|
|
3114
3176
|
[options]="filteredBranches()"
|
|
@@ -3124,18 +3186,18 @@ class UserRoleSelectorComponent {
|
|
|
3124
3186
|
<ng-template #selectedItem let-branch>
|
|
3125
3187
|
@if (branch) {
|
|
3126
3188
|
<div class="flex items-center gap-2">
|
|
3127
|
-
<
|
|
3189
|
+
<ui-icon name="building" class="text-primary"></ui-icon>
|
|
3128
3190
|
<span class="font-semibold">{{ branch.name }}</span>
|
|
3129
3191
|
</div>
|
|
3130
3192
|
}
|
|
3131
3193
|
</ng-template>
|
|
3132
3194
|
<ng-template #item let-branch>
|
|
3133
3195
|
<div class="flex items-center gap-2">
|
|
3134
|
-
<
|
|
3196
|
+
<ui-icon name="building" class="text-muted-color"></ui-icon>
|
|
3135
3197
|
<span>{{ branch.name }}</span>
|
|
3136
3198
|
</div>
|
|
3137
3199
|
</ng-template>
|
|
3138
|
-
</
|
|
3200
|
+
</f-select>
|
|
3139
3201
|
<small class="text-muted-color block mt-1">
|
|
3140
3202
|
{{
|
|
3141
3203
|
(filteredBranches().length !== 1
|
|
@@ -3155,7 +3217,7 @@ class UserRoleSelectorComponent {
|
|
|
3155
3217
|
<div
|
|
3156
3218
|
class="surface-card p-5 rounded-border shadow-sm flex justify-center"
|
|
3157
3219
|
>
|
|
3158
|
-
<
|
|
3220
|
+
<ui-icon name="loader-circle" spin class="text-primary text-5xl"></ui-icon>
|
|
3159
3221
|
</div>
|
|
3160
3222
|
}
|
|
3161
3223
|
|
|
@@ -3177,37 +3239,46 @@ class UserRoleSelectorComponent {
|
|
|
3177
3239
|
</p>
|
|
3178
3240
|
</div>
|
|
3179
3241
|
<div class="flex flex-wrap gap-2">
|
|
3180
|
-
<
|
|
3181
|
-
|
|
3182
|
-
icon="pi pi-check"
|
|
3242
|
+
<button
|
|
3243
|
+
fButton
|
|
3183
3244
|
[outlined]="true"
|
|
3184
3245
|
size="small"
|
|
3185
3246
|
severity="secondary"
|
|
3186
|
-
(
|
|
3187
|
-
|
|
3188
|
-
|
|
3189
|
-
|
|
3190
|
-
|
|
3247
|
+
(click)="selectAll()"
|
|
3248
|
+
>
|
|
3249
|
+
<ui-icon pButtonIcon name="check"></ui-icon>
|
|
3250
|
+
<span pButtonLabel>{{ 'shared.select.all' | translate }}</span>
|
|
3251
|
+
</button>
|
|
3252
|
+
<button
|
|
3253
|
+
fButton
|
|
3191
3254
|
[outlined]="true"
|
|
3192
3255
|
size="small"
|
|
3193
3256
|
severity="secondary"
|
|
3194
|
-
(
|
|
3195
|
-
|
|
3196
|
-
|
|
3257
|
+
(click)="deselectAll()"
|
|
3258
|
+
>
|
|
3259
|
+
<ui-icon pButtonIcon name="times"></ui-icon>
|
|
3260
|
+
<span pButtonLabel>{{ 'shared.deselect.all' | translate }}</span>
|
|
3261
|
+
</button>
|
|
3262
|
+
<button
|
|
3263
|
+
fButton
|
|
3197
3264
|
*hasPermission="USER_ROLE_PERMISSIONS.ASSIGN"
|
|
3198
|
-
[
|
|
3199
|
-
icon="pi pi-save"
|
|
3200
|
-
[disabled]="!canSave()"
|
|
3201
|
-
[loading]="saving()"
|
|
3265
|
+
[disabled]="!canSave() || saving()"
|
|
3202
3266
|
size="small"
|
|
3203
|
-
(
|
|
3204
|
-
|
|
3267
|
+
(click)="saveChanges()"
|
|
3268
|
+
>
|
|
3269
|
+
@if (saving()) {
|
|
3270
|
+
<ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
|
|
3271
|
+
} @else {
|
|
3272
|
+
<ui-icon pButtonIcon name="save"></ui-icon>
|
|
3273
|
+
}
|
|
3274
|
+
<span pButtonLabel>{{ 'shared.save.changes' | translate }}</span>
|
|
3275
|
+
</button>
|
|
3205
3276
|
</div>
|
|
3206
3277
|
</div>
|
|
3207
3278
|
|
|
3208
3279
|
<!-- Role Table -->
|
|
3209
3280
|
<div class="overflow-x-auto -mx-4 sm:mx-0">
|
|
3210
|
-
<
|
|
3281
|
+
<f-table
|
|
3211
3282
|
[value]="roles()"
|
|
3212
3283
|
[rows]="10"
|
|
3213
3284
|
[paginator]="roles().length > 10"
|
|
@@ -3217,17 +3288,16 @@ class UserRoleSelectorComponent {
|
|
|
3217
3288
|
[currentPageReportTemplate]="
|
|
3218
3289
|
'iam.pagination.roles.template' | translate
|
|
3219
3290
|
"
|
|
3220
|
-
styleClass="p-datatable-sm"
|
|
3221
3291
|
[tableStyle]="{ 'min-width': '35rem' }"
|
|
3222
3292
|
>
|
|
3223
3293
|
<ng-template #header>
|
|
3224
3294
|
<tr>
|
|
3225
3295
|
<th style="width: 3rem">
|
|
3226
|
-
<
|
|
3296
|
+
<f-checkbox
|
|
3227
3297
|
[ngModel]="allSelected()"
|
|
3228
3298
|
[binary]="true"
|
|
3229
3299
|
(ngModelChange)="toggleAll()"
|
|
3230
|
-
[
|
|
3300
|
+
[fTooltip]="'shared.select.deselect.all' | translate"
|
|
3231
3301
|
tooltipPosition="top"
|
|
3232
3302
|
/>
|
|
3233
3303
|
</th>
|
|
@@ -3243,11 +3313,11 @@ class UserRoleSelectorComponent {
|
|
|
3243
3313
|
<ng-template #body let-role>
|
|
3244
3314
|
<tr>
|
|
3245
3315
|
<td>
|
|
3246
|
-
<
|
|
3316
|
+
<f-checkbox
|
|
3247
3317
|
[ngModel]="selectionMap()[role.id]"
|
|
3248
3318
|
[binary]="true"
|
|
3249
3319
|
(ngModelChange)="onRoleToggle(role, $event)"
|
|
3250
|
-
[
|
|
3320
|
+
[fTooltip]="getTooltip(role)"
|
|
3251
3321
|
tooltipPosition="top"
|
|
3252
3322
|
/>
|
|
3253
3323
|
</td>
|
|
@@ -3262,7 +3332,7 @@ class UserRoleSelectorComponent {
|
|
|
3262
3332
|
<tr>
|
|
3263
3333
|
<td colspan="4" class="text-center p-4 text-muted-color">
|
|
3264
3334
|
@if (loading()) {
|
|
3265
|
-
<
|
|
3335
|
+
<ui-icon name="loader-circle" spin></ui-icon>
|
|
3266
3336
|
{{ 'shared.loading.roles' | translate }}
|
|
3267
3337
|
} @else {
|
|
3268
3338
|
{{ 'iam.permission.no.roles.available' | translate }}
|
|
@@ -3270,7 +3340,7 @@ class UserRoleSelectorComponent {
|
|
|
3270
3340
|
</td>
|
|
3271
3341
|
</tr>
|
|
3272
3342
|
</ng-template>
|
|
3273
|
-
</
|
|
3343
|
+
</f-table>
|
|
3274
3344
|
</div>
|
|
3275
3345
|
</div>
|
|
3276
3346
|
|
|
@@ -3278,7 +3348,7 @@ class UserRoleSelectorComponent {
|
|
|
3278
3348
|
@if (hasChanges()) {
|
|
3279
3349
|
<div class="border border-surface rounded-border p-3 mt-4">
|
|
3280
3350
|
<div class="flex items-center gap-2 mb-3">
|
|
3281
|
-
<
|
|
3351
|
+
<ui-icon name="info-circle" class="text-primary"></ui-icon>
|
|
3282
3352
|
<span class="font-bold">{{
|
|
3283
3353
|
'shared.pending.changes' | translate
|
|
3284
3354
|
}}</span>
|
|
@@ -3287,7 +3357,7 @@ class UserRoleSelectorComponent {
|
|
|
3287
3357
|
@if (pendingAdd().length > 0) {
|
|
3288
3358
|
<div>
|
|
3289
3359
|
<div class="flex items-center gap-2 mb-2">
|
|
3290
|
-
<
|
|
3360
|
+
<ui-icon name="plus-circle" class="text-green-500"></ui-icon>
|
|
3291
3361
|
<strong class="text-sm"
|
|
3292
3362
|
>{{ 'shared.to.assign' | translate }} ({{
|
|
3293
3363
|
pendingAdd().length
|
|
@@ -3304,7 +3374,7 @@ class UserRoleSelectorComponent {
|
|
|
3304
3374
|
@if (pendingRemove().length > 0) {
|
|
3305
3375
|
<div>
|
|
3306
3376
|
<div class="flex items-center gap-2 mb-2">
|
|
3307
|
-
<
|
|
3377
|
+
<ui-icon name="minus-circle" class="text-red-500"></ui-icon>
|
|
3308
3378
|
<strong class="text-sm"
|
|
3309
3379
|
>{{ 'shared.to.remove' | translate }} ({{
|
|
3310
3380
|
pendingRemove().length
|
|
@@ -3325,9 +3395,7 @@ class UserRoleSelectorComponent {
|
|
|
3325
3395
|
|
|
3326
3396
|
@if (!loading() && roles().length === 0) {
|
|
3327
3397
|
<div class="surface-card p-5 rounded-border shadow-sm text-center">
|
|
3328
|
-
<
|
|
3329
|
-
class="pi pi-info-circle text-muted-color mb-3 block text-5xl"
|
|
3330
|
-
></i>
|
|
3398
|
+
<ui-icon name="info-circle" class="text-muted-color mb-3 block text-5xl"></ui-icon>
|
|
3331
3399
|
<p class="text-muted-color m-0">
|
|
3332
3400
|
{{ 'iam.permission.no.roles.for.user' | translate }}
|
|
3333
3401
|
</p>
|
|
@@ -3335,14 +3403,14 @@ class UserRoleSelectorComponent {
|
|
|
3335
3403
|
}
|
|
3336
3404
|
}
|
|
3337
3405
|
</div>
|
|
3338
|
-
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type:
|
|
3406
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: UiModule }, { kind: "directive", type: i2.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "rounded", "raised", "fluid", "disabled", "loading", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i2.CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "inputId", "invalid", "indeterminate", "touched", "styleClass", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "component", type: i2.SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "showClear", "loading", "inputId", "invalid", "touched", "styleClass", "editable"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur"] }, { kind: "component", type: i2.TableComponent, selector: "f-table", inputs: ["value", "lazy", "loading", "rows", "totalRecords", "rowHover", "dataKey", "scrollable", "paginator", "first", "rowsPerPageOptions", "showCurrentPageReport", "currentPageReportTemplate", "tableStyle", "styleClass", "globalFilterFields", "sortField", "sortOrder"], outputs: ["sortFieldChange", "sortOrderChange", "onLazyLoad", "onSort"] }, { kind: "directive", type: i2.TooltipDirective, selector: "[fTooltip]", inputs: ["fTooltip", "tooltipPosition", "tooltipStyleClass", "disabled", "tooltipEvent", "showDelay", "hideDelay"] }, { kind: "component", type: i2.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill"] }, { kind: "directive", type: HasPermissionDirective, selector: "[hasPermission]", inputs: ["hasPermission"] }, { kind: "component", type: UserSelectComponent, selector: "lib-user-select", inputs: ["showClear", "value"], outputs: ["valueChange", "userSelected"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
3339
3407
|
}
|
|
3340
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
3408
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: UserRoleSelectorComponent, decorators: [{
|
|
3341
3409
|
type: Component,
|
|
3342
3410
|
args: [{ selector: 'flusys-user-role-selector', imports: [
|
|
3343
3411
|
CommonModule,
|
|
3344
3412
|
FormsModule,
|
|
3345
|
-
|
|
3413
|
+
UiModule,
|
|
3346
3414
|
HasPermissionDirective,
|
|
3347
3415
|
UserSelectComponent,
|
|
3348
3416
|
TranslatePipe,
|
|
@@ -3353,7 +3421,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3353
3421
|
<div class="grid grid-cols-1 sm:grid-cols-2 gap-5">
|
|
3354
3422
|
<div>
|
|
3355
3423
|
<label class="block font-semibold mb-2">
|
|
3356
|
-
<
|
|
3424
|
+
<ui-icon name="user" class="mr-2 text-primary"></ui-icon>
|
|
3357
3425
|
{{ 'iam.permission.select.user' | translate }}
|
|
3358
3426
|
</label>
|
|
3359
3427
|
<lib-user-select
|
|
@@ -3369,10 +3437,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3369
3437
|
@if (showBranchSelector()) {
|
|
3370
3438
|
<div>
|
|
3371
3439
|
<label class="block font-semibold mb-2">
|
|
3372
|
-
<
|
|
3440
|
+
<ui-icon name="building" class="mr-2 text-primary"></ui-icon>
|
|
3373
3441
|
{{ 'iam.permission.select.branch' | translate }}
|
|
3374
3442
|
</label>
|
|
3375
|
-
<
|
|
3443
|
+
<f-select
|
|
3376
3444
|
[ngModel]="selectedBranchId()"
|
|
3377
3445
|
(ngModelChange)="selectedBranchId.set($event)"
|
|
3378
3446
|
[options]="filteredBranches()"
|
|
@@ -3388,18 +3456,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3388
3456
|
<ng-template #selectedItem let-branch>
|
|
3389
3457
|
@if (branch) {
|
|
3390
3458
|
<div class="flex items-center gap-2">
|
|
3391
|
-
<
|
|
3459
|
+
<ui-icon name="building" class="text-primary"></ui-icon>
|
|
3392
3460
|
<span class="font-semibold">{{ branch.name }}</span>
|
|
3393
3461
|
</div>
|
|
3394
3462
|
}
|
|
3395
3463
|
</ng-template>
|
|
3396
3464
|
<ng-template #item let-branch>
|
|
3397
3465
|
<div class="flex items-center gap-2">
|
|
3398
|
-
<
|
|
3466
|
+
<ui-icon name="building" class="text-muted-color"></ui-icon>
|
|
3399
3467
|
<span>{{ branch.name }}</span>
|
|
3400
3468
|
</div>
|
|
3401
3469
|
</ng-template>
|
|
3402
|
-
</
|
|
3470
|
+
</f-select>
|
|
3403
3471
|
<small class="text-muted-color block mt-1">
|
|
3404
3472
|
{{
|
|
3405
3473
|
(filteredBranches().length !== 1
|
|
@@ -3419,7 +3487,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3419
3487
|
<div
|
|
3420
3488
|
class="surface-card p-5 rounded-border shadow-sm flex justify-center"
|
|
3421
3489
|
>
|
|
3422
|
-
<
|
|
3490
|
+
<ui-icon name="loader-circle" spin class="text-primary text-5xl"></ui-icon>
|
|
3423
3491
|
</div>
|
|
3424
3492
|
}
|
|
3425
3493
|
|
|
@@ -3441,37 +3509,46 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3441
3509
|
</p>
|
|
3442
3510
|
</div>
|
|
3443
3511
|
<div class="flex flex-wrap gap-2">
|
|
3444
|
-
<
|
|
3445
|
-
|
|
3446
|
-
icon="pi pi-check"
|
|
3512
|
+
<button
|
|
3513
|
+
fButton
|
|
3447
3514
|
[outlined]="true"
|
|
3448
3515
|
size="small"
|
|
3449
3516
|
severity="secondary"
|
|
3450
|
-
(
|
|
3451
|
-
|
|
3452
|
-
|
|
3453
|
-
|
|
3454
|
-
|
|
3517
|
+
(click)="selectAll()"
|
|
3518
|
+
>
|
|
3519
|
+
<ui-icon pButtonIcon name="check"></ui-icon>
|
|
3520
|
+
<span pButtonLabel>{{ 'shared.select.all' | translate }}</span>
|
|
3521
|
+
</button>
|
|
3522
|
+
<button
|
|
3523
|
+
fButton
|
|
3455
3524
|
[outlined]="true"
|
|
3456
3525
|
size="small"
|
|
3457
3526
|
severity="secondary"
|
|
3458
|
-
(
|
|
3459
|
-
|
|
3460
|
-
|
|
3527
|
+
(click)="deselectAll()"
|
|
3528
|
+
>
|
|
3529
|
+
<ui-icon pButtonIcon name="times"></ui-icon>
|
|
3530
|
+
<span pButtonLabel>{{ 'shared.deselect.all' | translate }}</span>
|
|
3531
|
+
</button>
|
|
3532
|
+
<button
|
|
3533
|
+
fButton
|
|
3461
3534
|
*hasPermission="USER_ROLE_PERMISSIONS.ASSIGN"
|
|
3462
|
-
[
|
|
3463
|
-
icon="pi pi-save"
|
|
3464
|
-
[disabled]="!canSave()"
|
|
3465
|
-
[loading]="saving()"
|
|
3535
|
+
[disabled]="!canSave() || saving()"
|
|
3466
3536
|
size="small"
|
|
3467
|
-
(
|
|
3468
|
-
|
|
3537
|
+
(click)="saveChanges()"
|
|
3538
|
+
>
|
|
3539
|
+
@if (saving()) {
|
|
3540
|
+
<ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
|
|
3541
|
+
} @else {
|
|
3542
|
+
<ui-icon pButtonIcon name="save"></ui-icon>
|
|
3543
|
+
}
|
|
3544
|
+
<span pButtonLabel>{{ 'shared.save.changes' | translate }}</span>
|
|
3545
|
+
</button>
|
|
3469
3546
|
</div>
|
|
3470
3547
|
</div>
|
|
3471
3548
|
|
|
3472
3549
|
<!-- Role Table -->
|
|
3473
3550
|
<div class="overflow-x-auto -mx-4 sm:mx-0">
|
|
3474
|
-
<
|
|
3551
|
+
<f-table
|
|
3475
3552
|
[value]="roles()"
|
|
3476
3553
|
[rows]="10"
|
|
3477
3554
|
[paginator]="roles().length > 10"
|
|
@@ -3481,17 +3558,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3481
3558
|
[currentPageReportTemplate]="
|
|
3482
3559
|
'iam.pagination.roles.template' | translate
|
|
3483
3560
|
"
|
|
3484
|
-
styleClass="p-datatable-sm"
|
|
3485
3561
|
[tableStyle]="{ 'min-width': '35rem' }"
|
|
3486
3562
|
>
|
|
3487
3563
|
<ng-template #header>
|
|
3488
3564
|
<tr>
|
|
3489
3565
|
<th style="width: 3rem">
|
|
3490
|
-
<
|
|
3566
|
+
<f-checkbox
|
|
3491
3567
|
[ngModel]="allSelected()"
|
|
3492
3568
|
[binary]="true"
|
|
3493
3569
|
(ngModelChange)="toggleAll()"
|
|
3494
|
-
[
|
|
3570
|
+
[fTooltip]="'shared.select.deselect.all' | translate"
|
|
3495
3571
|
tooltipPosition="top"
|
|
3496
3572
|
/>
|
|
3497
3573
|
</th>
|
|
@@ -3507,11 +3583,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3507
3583
|
<ng-template #body let-role>
|
|
3508
3584
|
<tr>
|
|
3509
3585
|
<td>
|
|
3510
|
-
<
|
|
3586
|
+
<f-checkbox
|
|
3511
3587
|
[ngModel]="selectionMap()[role.id]"
|
|
3512
3588
|
[binary]="true"
|
|
3513
3589
|
(ngModelChange)="onRoleToggle(role, $event)"
|
|
3514
|
-
[
|
|
3590
|
+
[fTooltip]="getTooltip(role)"
|
|
3515
3591
|
tooltipPosition="top"
|
|
3516
3592
|
/>
|
|
3517
3593
|
</td>
|
|
@@ -3526,7 +3602,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3526
3602
|
<tr>
|
|
3527
3603
|
<td colspan="4" class="text-center p-4 text-muted-color">
|
|
3528
3604
|
@if (loading()) {
|
|
3529
|
-
<
|
|
3605
|
+
<ui-icon name="loader-circle" spin></ui-icon>
|
|
3530
3606
|
{{ 'shared.loading.roles' | translate }}
|
|
3531
3607
|
} @else {
|
|
3532
3608
|
{{ 'iam.permission.no.roles.available' | translate }}
|
|
@@ -3534,7 +3610,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3534
3610
|
</td>
|
|
3535
3611
|
</tr>
|
|
3536
3612
|
</ng-template>
|
|
3537
|
-
</
|
|
3613
|
+
</f-table>
|
|
3538
3614
|
</div>
|
|
3539
3615
|
</div>
|
|
3540
3616
|
|
|
@@ -3542,7 +3618,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3542
3618
|
@if (hasChanges()) {
|
|
3543
3619
|
<div class="border border-surface rounded-border p-3 mt-4">
|
|
3544
3620
|
<div class="flex items-center gap-2 mb-3">
|
|
3545
|
-
<
|
|
3621
|
+
<ui-icon name="info-circle" class="text-primary"></ui-icon>
|
|
3546
3622
|
<span class="font-bold">{{
|
|
3547
3623
|
'shared.pending.changes' | translate
|
|
3548
3624
|
}}</span>
|
|
@@ -3551,7 +3627,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3551
3627
|
@if (pendingAdd().length > 0) {
|
|
3552
3628
|
<div>
|
|
3553
3629
|
<div class="flex items-center gap-2 mb-2">
|
|
3554
|
-
<
|
|
3630
|
+
<ui-icon name="plus-circle" class="text-green-500"></ui-icon>
|
|
3555
3631
|
<strong class="text-sm"
|
|
3556
3632
|
>{{ 'shared.to.assign' | translate }} ({{
|
|
3557
3633
|
pendingAdd().length
|
|
@@ -3568,7 +3644,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3568
3644
|
@if (pendingRemove().length > 0) {
|
|
3569
3645
|
<div>
|
|
3570
3646
|
<div class="flex items-center gap-2 mb-2">
|
|
3571
|
-
<
|
|
3647
|
+
<ui-icon name="minus-circle" class="text-red-500"></ui-icon>
|
|
3572
3648
|
<strong class="text-sm"
|
|
3573
3649
|
>{{ 'shared.to.remove' | translate }} ({{
|
|
3574
3650
|
pendingRemove().length
|
|
@@ -3589,9 +3665,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3589
3665
|
|
|
3590
3666
|
@if (!loading() && roles().length === 0) {
|
|
3591
3667
|
<div class="surface-card p-5 rounded-border shadow-sm text-center">
|
|
3592
|
-
<
|
|
3593
|
-
class="pi pi-info-circle text-muted-color mb-3 block text-5xl"
|
|
3594
|
-
></i>
|
|
3668
|
+
<ui-icon name="info-circle" class="text-muted-color mb-3 block text-5xl"></ui-icon>
|
|
3595
3669
|
<p class="text-muted-color m-0">
|
|
3596
3670
|
{{ 'iam.permission.no.roles.for.user' | translate }}
|
|
3597
3671
|
</p>
|
|
@@ -3610,17 +3684,22 @@ class UserActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
3610
3684
|
actionApi = inject(ActionApiService);
|
|
3611
3685
|
permissionApi = inject(PermissionApiService);
|
|
3612
3686
|
messageService = inject(MessageService);
|
|
3613
|
-
selectedUserId = signal(null,
|
|
3614
|
-
|
|
3615
|
-
|
|
3616
|
-
|
|
3687
|
+
selectedUserId = signal(null, /* @ts-ignore */
|
|
3688
|
+
...(ngDevMode ? [{ debugName: "selectedUserId" }] : /* istanbul ignore next */ []));
|
|
3689
|
+
selectedBranchId = signal(undefined, /* @ts-ignore */
|
|
3690
|
+
...(ngDevMode ? [{ debugName: "selectedBranchId" }] : /* istanbul ignore next */ []));
|
|
3691
|
+
branches = signal([], /* @ts-ignore */
|
|
3692
|
+
...(ngDevMode ? [{ debugName: "branches" }] : /* istanbul ignore next */ []));
|
|
3693
|
+
isCompanyFeatureActive = computed(() => isCompanyFeatureEnabled(this.appConfig) === true, /* @ts-ignore */
|
|
3694
|
+
...(ngDevMode ? [{ debugName: "isCompanyFeatureActive" }] : /* istanbul ignore next */ []));
|
|
3617
3695
|
showBranchSelector = this.isCompanyFeatureActive;
|
|
3618
3696
|
filteredBranches = computed(() => {
|
|
3619
3697
|
const currentCompanyId = this.companyContext.currentCompanyInfo()?.id || undefined;
|
|
3620
3698
|
if (!currentCompanyId)
|
|
3621
3699
|
return this.branches();
|
|
3622
3700
|
return this.branches().filter((b) => b.companyId === currentCompanyId);
|
|
3623
|
-
},
|
|
3701
|
+
}, /* @ts-ignore */
|
|
3702
|
+
...(ngDevMode ? [{ debugName: "filteredBranches" }] : /* istanbul ignore next */ []));
|
|
3624
3703
|
constructor() {
|
|
3625
3704
|
super();
|
|
3626
3705
|
effect(() => {
|
|
@@ -3740,14 +3819,14 @@ class UserActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
3740
3819
|
this.saving.set(false);
|
|
3741
3820
|
}
|
|
3742
3821
|
}
|
|
3743
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
3744
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
3822
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: UserActionSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3823
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: UserActionSelectorComponent, isStandalone: true, selector: "flusys-user-action-selector", usesInheritance: true, ngImport: i0, template: `
|
|
3745
3824
|
<div class="user-action-selector">
|
|
3746
3825
|
<div class="surface-card p-4 rounded-border mb-4 shadow-sm">
|
|
3747
3826
|
<div class="grid grid-cols-1 sm:grid-cols-2 gap-5">
|
|
3748
3827
|
<div>
|
|
3749
3828
|
<label class="block font-semibold mb-2">
|
|
3750
|
-
<
|
|
3829
|
+
<ui-icon name="user" class="mr-2 text-primary"></ui-icon>
|
|
3751
3830
|
{{ 'iam.permission.select.user' | translate }}
|
|
3752
3831
|
</label>
|
|
3753
3832
|
<lib-user-select
|
|
@@ -3763,10 +3842,10 @@ class UserActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
3763
3842
|
@if (showBranchSelector()) {
|
|
3764
3843
|
<div>
|
|
3765
3844
|
<label class="block font-semibold mb-2">
|
|
3766
|
-
<
|
|
3845
|
+
<ui-icon name="building" class="mr-2 text-primary"></ui-icon>
|
|
3767
3846
|
{{ 'iam.permission.select.branch' | translate }}
|
|
3768
3847
|
</label>
|
|
3769
|
-
<
|
|
3848
|
+
<f-select
|
|
3770
3849
|
[ngModel]="selectedBranchId()"
|
|
3771
3850
|
(ngModelChange)="selectedBranchId.set($event)"
|
|
3772
3851
|
[options]="filteredBranches()"
|
|
@@ -3782,18 +3861,18 @@ class UserActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
3782
3861
|
<ng-template #selectedItem let-branch>
|
|
3783
3862
|
@if (branch) {
|
|
3784
3863
|
<div class="flex items-center gap-2">
|
|
3785
|
-
<
|
|
3864
|
+
<ui-icon name="building" class="text-primary"></ui-icon>
|
|
3786
3865
|
<span class="font-semibold">{{ branch.name }}</span>
|
|
3787
3866
|
</div>
|
|
3788
3867
|
}
|
|
3789
3868
|
</ng-template>
|
|
3790
3869
|
<ng-template #item let-branch>
|
|
3791
3870
|
<div class="flex items-center gap-2">
|
|
3792
|
-
<
|
|
3871
|
+
<ui-icon name="building" class="text-muted-color"></ui-icon>
|
|
3793
3872
|
<span>{{ branch.name }}</span>
|
|
3794
3873
|
</div>
|
|
3795
3874
|
</ng-template>
|
|
3796
|
-
</
|
|
3875
|
+
</f-select>
|
|
3797
3876
|
<small class="text-muted-color block mt-1">
|
|
3798
3877
|
{{
|
|
3799
3878
|
(filteredBranches().length !== 1
|
|
@@ -3810,7 +3889,7 @@ class UserActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
3810
3889
|
@if (selectedUserId()) {
|
|
3811
3890
|
@if (loading()) {
|
|
3812
3891
|
<div class="flex justify-center p-5">
|
|
3813
|
-
<
|
|
3892
|
+
<ui-icon name="loader-circle" spin class="text-4xl"></ui-icon>
|
|
3814
3893
|
</div>
|
|
3815
3894
|
}
|
|
3816
3895
|
|
|
@@ -3831,38 +3910,47 @@ class UserActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
3831
3910
|
</p>
|
|
3832
3911
|
</div>
|
|
3833
3912
|
<div class="flex flex-wrap gap-2">
|
|
3834
|
-
<
|
|
3835
|
-
|
|
3836
|
-
icon="pi pi-check"
|
|
3913
|
+
<button
|
|
3914
|
+
fButton
|
|
3837
3915
|
[outlined]="true"
|
|
3838
3916
|
size="small"
|
|
3839
3917
|
severity="secondary"
|
|
3840
|
-
(
|
|
3841
|
-
|
|
3842
|
-
|
|
3843
|
-
|
|
3844
|
-
|
|
3918
|
+
(click)="selectAll()"
|
|
3919
|
+
>
|
|
3920
|
+
<ui-icon pButtonIcon name="check"></ui-icon>
|
|
3921
|
+
<span pButtonLabel>{{ 'shared.select.all' | translate }}</span>
|
|
3922
|
+
</button>
|
|
3923
|
+
<button
|
|
3924
|
+
fButton
|
|
3845
3925
|
[outlined]="true"
|
|
3846
3926
|
size="small"
|
|
3847
3927
|
severity="secondary"
|
|
3848
|
-
(
|
|
3849
|
-
|
|
3850
|
-
|
|
3928
|
+
(click)="deselectAll()"
|
|
3929
|
+
>
|
|
3930
|
+
<ui-icon pButtonIcon name="times"></ui-icon>
|
|
3931
|
+
<span pButtonLabel>{{ 'shared.deselect.all' | translate }}</span>
|
|
3932
|
+
</button>
|
|
3933
|
+
<button
|
|
3934
|
+
fButton
|
|
3851
3935
|
*hasPermission="USER_ACTION_PERMISSIONS.ASSIGN"
|
|
3852
|
-
[
|
|
3853
|
-
icon="pi pi-save"
|
|
3854
|
-
[disabled]="!canSave()"
|
|
3855
|
-
[loading]="saving()"
|
|
3936
|
+
[disabled]="!canSave() || saving()"
|
|
3856
3937
|
size="small"
|
|
3857
|
-
(
|
|
3858
|
-
|
|
3938
|
+
(click)="saveChanges()"
|
|
3939
|
+
>
|
|
3940
|
+
@if (saving()) {
|
|
3941
|
+
<ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
|
|
3942
|
+
} @else {
|
|
3943
|
+
<ui-icon pButtonIcon name="save"></ui-icon>
|
|
3944
|
+
}
|
|
3945
|
+
<span pButtonLabel>{{ 'shared.save.changes' | translate }}</span>
|
|
3946
|
+
</button>
|
|
3859
3947
|
</div>
|
|
3860
3948
|
</div>
|
|
3861
3949
|
|
|
3862
3950
|
@if (invalidActionsCount() > 0) {
|
|
3863
3951
|
<div class="validation-warning rounded-border p-3 mb-4">
|
|
3864
3952
|
<div class="flex items-start gap-2">
|
|
3865
|
-
<
|
|
3953
|
+
<ui-icon name="exclamation-triangle" class="text-xl"></ui-icon>
|
|
3866
3954
|
<div class="flex-1">
|
|
3867
3955
|
<span class="font-semibold"
|
|
3868
3956
|
>{{ 'iam.validation.warning.title' | translate }}:</span
|
|
@@ -3881,20 +3969,19 @@ class UserActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
3881
3969
|
}
|
|
3882
3970
|
|
|
3883
3971
|
<div class="overflow-x-auto -mx-4 sm:mx-0">
|
|
3884
|
-
<
|
|
3972
|
+
<f-treetable
|
|
3885
3973
|
[value]="treeNodes()"
|
|
3886
3974
|
dataKey="id"
|
|
3887
|
-
class="p-treetable-sm"
|
|
3888
3975
|
[tableStyle]="{ 'min-width': '50rem' }"
|
|
3889
3976
|
>
|
|
3890
3977
|
<ng-template #header>
|
|
3891
3978
|
<tr>
|
|
3892
3979
|
<th class="w-12">
|
|
3893
|
-
<
|
|
3980
|
+
<f-checkbox
|
|
3894
3981
|
[ngModel]="allSelected()"
|
|
3895
3982
|
[binary]="true"
|
|
3896
3983
|
(ngModelChange)="toggleAll()"
|
|
3897
|
-
[
|
|
3984
|
+
[fTooltip]="'shared.select.deselect.all' | translate"
|
|
3898
3985
|
tooltipPosition="top"
|
|
3899
3986
|
/>
|
|
3900
3987
|
</th>
|
|
@@ -3913,27 +4000,24 @@ class UserActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
3913
4000
|
@let tooltip = getTooltip(rowData);
|
|
3914
4001
|
<tr [class.highlight-warning]="hasUnmet">
|
|
3915
4002
|
<td class="w-12">
|
|
3916
|
-
<
|
|
4003
|
+
<f-checkbox
|
|
3917
4004
|
[ngModel]="selectionMap()[rowData.id]"
|
|
3918
4005
|
[binary]="true"
|
|
3919
4006
|
(ngModelChange)="onActionToggle(rowData, $event)"
|
|
3920
|
-
[
|
|
4007
|
+
[fTooltip]="tooltip"
|
|
3921
4008
|
tooltipPosition="top"
|
|
3922
4009
|
/>
|
|
3923
4010
|
</td>
|
|
3924
4011
|
<td>
|
|
3925
|
-
<
|
|
4012
|
+
<f-treetabletoggler [rowNode]="rowNode" />
|
|
3926
4013
|
<span class="inline-flex items-center gap-2">
|
|
3927
4014
|
{{ rowData.name }}
|
|
3928
4015
|
@if (hasUnmet) {
|
|
3929
|
-
<
|
|
3930
|
-
class="pi pi-exclamation-triangle text-orange-500"
|
|
3931
|
-
[pTooltip]="
|
|
4016
|
+
<ui-icon name="exclamation-triangle" class="text-orange-500" [fTooltip]="
|
|
3932
4017
|
'iam.validation.unmet.prerequisites.tooltip'
|
|
3933
4018
|
| translate
|
|
3934
4019
|
"
|
|
3935
|
-
tooltipPosition="top"
|
|
3936
|
-
></i>
|
|
4020
|
+
tooltipPosition="top"></ui-icon>
|
|
3937
4021
|
}
|
|
3938
4022
|
</span>
|
|
3939
4023
|
</td>
|
|
@@ -3941,7 +4025,7 @@ class UserActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
3941
4025
|
{{ rowData.code || '-' }}
|
|
3942
4026
|
</td>
|
|
3943
4027
|
<td>
|
|
3944
|
-
<
|
|
4028
|
+
<f-tag
|
|
3945
4029
|
[value]="rowData.actionType"
|
|
3946
4030
|
[severity]="
|
|
3947
4031
|
rowData.actionType === 'backend' ? 'info' : 'success'
|
|
@@ -3957,7 +4041,7 @@ class UserActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
3957
4041
|
<tr>
|
|
3958
4042
|
<td colspan="5" class="text-center p-4 text-muted-color">
|
|
3959
4043
|
@if (loading()) {
|
|
3960
|
-
<
|
|
4044
|
+
<ui-icon name="loader-circle" spin></ui-icon>
|
|
3961
4045
|
{{ 'shared.loading.actions' | translate }}
|
|
3962
4046
|
} @else {
|
|
3963
4047
|
{{ 'iam.permission.no.actions.available' | translate }}
|
|
@@ -3965,14 +4049,14 @@ class UserActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
3965
4049
|
</td>
|
|
3966
4050
|
</tr>
|
|
3967
4051
|
</ng-template>
|
|
3968
|
-
</
|
|
4052
|
+
</f-treetable>
|
|
3969
4053
|
</div>
|
|
3970
4054
|
</div>
|
|
3971
4055
|
|
|
3972
4056
|
@if (hasChanges()) {
|
|
3973
4057
|
<div class="border border-surface rounded-border p-3 mt-4">
|
|
3974
4058
|
<div class="flex items-center gap-2 mb-3">
|
|
3975
|
-
<
|
|
4059
|
+
<ui-icon name="info-circle" class="text-primary"></ui-icon>
|
|
3976
4060
|
<span class="font-bold">{{
|
|
3977
4061
|
'shared.pending.changes' | translate
|
|
3978
4062
|
}}</span>
|
|
@@ -3981,7 +4065,7 @@ class UserActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
3981
4065
|
@if (pendingAdd().length > 0) {
|
|
3982
4066
|
<div>
|
|
3983
4067
|
<div class="flex items-center gap-2 mb-2">
|
|
3984
|
-
<
|
|
4068
|
+
<ui-icon name="plus-circle" class="text-green-500"></ui-icon>
|
|
3985
4069
|
<strong class="text-sm"
|
|
3986
4070
|
>{{ 'shared.to.assign' | translate }} ({{
|
|
3987
4071
|
pendingAdd().length
|
|
@@ -3998,7 +4082,7 @@ class UserActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
3998
4082
|
@if (pendingRemove().length > 0) {
|
|
3999
4083
|
<div>
|
|
4000
4084
|
<div class="flex items-center gap-2 mb-2">
|
|
4001
|
-
<
|
|
4085
|
+
<ui-icon name="minus-circle" class="text-red-500"></ui-icon>
|
|
4002
4086
|
<strong class="text-sm"
|
|
4003
4087
|
>{{ 'shared.to.remove' | translate }} ({{
|
|
4004
4088
|
pendingRemove().length
|
|
@@ -4019,9 +4103,7 @@ class UserActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
4019
4103
|
|
|
4020
4104
|
@if (!loading() && actions().length === 0) {
|
|
4021
4105
|
<div class="surface-card p-5 rounded-border shadow-sm text-center">
|
|
4022
|
-
<
|
|
4023
|
-
class="pi pi-info-circle text-muted-color mb-3 block text-5xl"
|
|
4024
|
-
></i>
|
|
4106
|
+
<ui-icon name="info-circle" class="text-muted-color mb-3 block text-5xl"></ui-icon>
|
|
4025
4107
|
<p class="text-muted-color m-0">
|
|
4026
4108
|
{{ 'iam.permission.no.actions.for.user' | translate }}
|
|
4027
4109
|
</p>
|
|
@@ -4029,13 +4111,13 @@ class UserActionSelectorComponent extends BaseActionSelectorComponent {
|
|
|
4029
4111
|
}
|
|
4030
4112
|
}
|
|
4031
4113
|
</div>
|
|
4032
|
-
`, isInline: true, styles: [":host{display:block}.validation-warning{background-color:var(--
|
|
4114
|
+
`, isInline: true, styles: [":host{display:block}.validation-warning{background-color:var(--f-yellow-50, #fefce8);border-left:4px solid var(--f-yellow-500, #eab308);color:var(--f-yellow-700, #a16207)}:host-context(.p-dark) .validation-warning{background-color:#eab3081a;color:var(--f-yellow-400, #facc15)}:host ::ng-deep tr.highlight-warning{background-color:var(--f-red-50, rgba(239, 68, 68, .1))!important}:host-context(.p-dark) ::ng-deep tr.highlight-warning{background-color:#ef444426!important}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: UiModule }, { kind: "directive", type: i2.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "rounded", "raised", "fluid", "disabled", "loading", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i2.TagComponent, selector: "f-tag", inputs: ["value", "severity", "icon", "rounded", "color"] }, { kind: "component", type: i2.CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "inputId", "invalid", "indeterminate", "touched", "styleClass", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "component", type: i2.SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "showClear", "loading", "inputId", "invalid", "touched", "styleClass", "editable"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur"] }, { kind: "directive", type: i2.TooltipDirective, selector: "[fTooltip]", inputs: ["fTooltip", "tooltipPosition", "tooltipStyleClass", "disabled", "tooltipEvent", "showDelay", "hideDelay"] }, { kind: "component", type: i2.TreeTableComponent, selector: "f-treetable", inputs: ["value", "loading", "dataKey", "styleClass", "tableStyle", "scrollable"] }, { kind: "component", type: i2.TreeTableTogglerComponent, selector: "f-treetabletoggler", inputs: ["rowNode"] }, { kind: "component", type: i2.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill"] }, { kind: "directive", type: HasPermissionDirective, selector: "[hasPermission]", inputs: ["hasPermission"] }, { kind: "component", type: UserSelectComponent, selector: "lib-user-select", inputs: ["showClear", "value"], outputs: ["valueChange", "userSelected"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
4033
4115
|
}
|
|
4034
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
4116
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: UserActionSelectorComponent, decorators: [{
|
|
4035
4117
|
type: Component,
|
|
4036
4118
|
args: [{ selector: 'flusys-user-action-selector', imports: [
|
|
4037
4119
|
FormsModule,
|
|
4038
|
-
|
|
4120
|
+
UiModule,
|
|
4039
4121
|
HasPermissionDirective,
|
|
4040
4122
|
UserSelectComponent,
|
|
4041
4123
|
TranslatePipe,
|
|
@@ -4045,7 +4127,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
4045
4127
|
<div class="grid grid-cols-1 sm:grid-cols-2 gap-5">
|
|
4046
4128
|
<div>
|
|
4047
4129
|
<label class="block font-semibold mb-2">
|
|
4048
|
-
<
|
|
4130
|
+
<ui-icon name="user" class="mr-2 text-primary"></ui-icon>
|
|
4049
4131
|
{{ 'iam.permission.select.user' | translate }}
|
|
4050
4132
|
</label>
|
|
4051
4133
|
<lib-user-select
|
|
@@ -4061,10 +4143,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
4061
4143
|
@if (showBranchSelector()) {
|
|
4062
4144
|
<div>
|
|
4063
4145
|
<label class="block font-semibold mb-2">
|
|
4064
|
-
<
|
|
4146
|
+
<ui-icon name="building" class="mr-2 text-primary"></ui-icon>
|
|
4065
4147
|
{{ 'iam.permission.select.branch' | translate }}
|
|
4066
4148
|
</label>
|
|
4067
|
-
<
|
|
4149
|
+
<f-select
|
|
4068
4150
|
[ngModel]="selectedBranchId()"
|
|
4069
4151
|
(ngModelChange)="selectedBranchId.set($event)"
|
|
4070
4152
|
[options]="filteredBranches()"
|
|
@@ -4080,18 +4162,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
4080
4162
|
<ng-template #selectedItem let-branch>
|
|
4081
4163
|
@if (branch) {
|
|
4082
4164
|
<div class="flex items-center gap-2">
|
|
4083
|
-
<
|
|
4165
|
+
<ui-icon name="building" class="text-primary"></ui-icon>
|
|
4084
4166
|
<span class="font-semibold">{{ branch.name }}</span>
|
|
4085
4167
|
</div>
|
|
4086
4168
|
}
|
|
4087
4169
|
</ng-template>
|
|
4088
4170
|
<ng-template #item let-branch>
|
|
4089
4171
|
<div class="flex items-center gap-2">
|
|
4090
|
-
<
|
|
4172
|
+
<ui-icon name="building" class="text-muted-color"></ui-icon>
|
|
4091
4173
|
<span>{{ branch.name }}</span>
|
|
4092
4174
|
</div>
|
|
4093
4175
|
</ng-template>
|
|
4094
|
-
</
|
|
4176
|
+
</f-select>
|
|
4095
4177
|
<small class="text-muted-color block mt-1">
|
|
4096
4178
|
{{
|
|
4097
4179
|
(filteredBranches().length !== 1
|
|
@@ -4108,7 +4190,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
4108
4190
|
@if (selectedUserId()) {
|
|
4109
4191
|
@if (loading()) {
|
|
4110
4192
|
<div class="flex justify-center p-5">
|
|
4111
|
-
<
|
|
4193
|
+
<ui-icon name="loader-circle" spin class="text-4xl"></ui-icon>
|
|
4112
4194
|
</div>
|
|
4113
4195
|
}
|
|
4114
4196
|
|
|
@@ -4129,38 +4211,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
4129
4211
|
</p>
|
|
4130
4212
|
</div>
|
|
4131
4213
|
<div class="flex flex-wrap gap-2">
|
|
4132
|
-
<
|
|
4133
|
-
|
|
4134
|
-
icon="pi pi-check"
|
|
4214
|
+
<button
|
|
4215
|
+
fButton
|
|
4135
4216
|
[outlined]="true"
|
|
4136
4217
|
size="small"
|
|
4137
4218
|
severity="secondary"
|
|
4138
|
-
(
|
|
4139
|
-
|
|
4140
|
-
|
|
4141
|
-
|
|
4142
|
-
|
|
4219
|
+
(click)="selectAll()"
|
|
4220
|
+
>
|
|
4221
|
+
<ui-icon pButtonIcon name="check"></ui-icon>
|
|
4222
|
+
<span pButtonLabel>{{ 'shared.select.all' | translate }}</span>
|
|
4223
|
+
</button>
|
|
4224
|
+
<button
|
|
4225
|
+
fButton
|
|
4143
4226
|
[outlined]="true"
|
|
4144
4227
|
size="small"
|
|
4145
4228
|
severity="secondary"
|
|
4146
|
-
(
|
|
4147
|
-
|
|
4148
|
-
|
|
4229
|
+
(click)="deselectAll()"
|
|
4230
|
+
>
|
|
4231
|
+
<ui-icon pButtonIcon name="times"></ui-icon>
|
|
4232
|
+
<span pButtonLabel>{{ 'shared.deselect.all' | translate }}</span>
|
|
4233
|
+
</button>
|
|
4234
|
+
<button
|
|
4235
|
+
fButton
|
|
4149
4236
|
*hasPermission="USER_ACTION_PERMISSIONS.ASSIGN"
|
|
4150
|
-
[
|
|
4151
|
-
icon="pi pi-save"
|
|
4152
|
-
[disabled]="!canSave()"
|
|
4153
|
-
[loading]="saving()"
|
|
4237
|
+
[disabled]="!canSave() || saving()"
|
|
4154
4238
|
size="small"
|
|
4155
|
-
(
|
|
4156
|
-
|
|
4239
|
+
(click)="saveChanges()"
|
|
4240
|
+
>
|
|
4241
|
+
@if (saving()) {
|
|
4242
|
+
<ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
|
|
4243
|
+
} @else {
|
|
4244
|
+
<ui-icon pButtonIcon name="save"></ui-icon>
|
|
4245
|
+
}
|
|
4246
|
+
<span pButtonLabel>{{ 'shared.save.changes' | translate }}</span>
|
|
4247
|
+
</button>
|
|
4157
4248
|
</div>
|
|
4158
4249
|
</div>
|
|
4159
4250
|
|
|
4160
4251
|
@if (invalidActionsCount() > 0) {
|
|
4161
4252
|
<div class="validation-warning rounded-border p-3 mb-4">
|
|
4162
4253
|
<div class="flex items-start gap-2">
|
|
4163
|
-
<
|
|
4254
|
+
<ui-icon name="exclamation-triangle" class="text-xl"></ui-icon>
|
|
4164
4255
|
<div class="flex-1">
|
|
4165
4256
|
<span class="font-semibold"
|
|
4166
4257
|
>{{ 'iam.validation.warning.title' | translate }}:</span
|
|
@@ -4179,20 +4270,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
4179
4270
|
}
|
|
4180
4271
|
|
|
4181
4272
|
<div class="overflow-x-auto -mx-4 sm:mx-0">
|
|
4182
|
-
<
|
|
4273
|
+
<f-treetable
|
|
4183
4274
|
[value]="treeNodes()"
|
|
4184
4275
|
dataKey="id"
|
|
4185
|
-
class="p-treetable-sm"
|
|
4186
4276
|
[tableStyle]="{ 'min-width': '50rem' }"
|
|
4187
4277
|
>
|
|
4188
4278
|
<ng-template #header>
|
|
4189
4279
|
<tr>
|
|
4190
4280
|
<th class="w-12">
|
|
4191
|
-
<
|
|
4281
|
+
<f-checkbox
|
|
4192
4282
|
[ngModel]="allSelected()"
|
|
4193
4283
|
[binary]="true"
|
|
4194
4284
|
(ngModelChange)="toggleAll()"
|
|
4195
|
-
[
|
|
4285
|
+
[fTooltip]="'shared.select.deselect.all' | translate"
|
|
4196
4286
|
tooltipPosition="top"
|
|
4197
4287
|
/>
|
|
4198
4288
|
</th>
|
|
@@ -4211,27 +4301,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
4211
4301
|
@let tooltip = getTooltip(rowData);
|
|
4212
4302
|
<tr [class.highlight-warning]="hasUnmet">
|
|
4213
4303
|
<td class="w-12">
|
|
4214
|
-
<
|
|
4304
|
+
<f-checkbox
|
|
4215
4305
|
[ngModel]="selectionMap()[rowData.id]"
|
|
4216
4306
|
[binary]="true"
|
|
4217
4307
|
(ngModelChange)="onActionToggle(rowData, $event)"
|
|
4218
|
-
[
|
|
4308
|
+
[fTooltip]="tooltip"
|
|
4219
4309
|
tooltipPosition="top"
|
|
4220
4310
|
/>
|
|
4221
4311
|
</td>
|
|
4222
4312
|
<td>
|
|
4223
|
-
<
|
|
4313
|
+
<f-treetabletoggler [rowNode]="rowNode" />
|
|
4224
4314
|
<span class="inline-flex items-center gap-2">
|
|
4225
4315
|
{{ rowData.name }}
|
|
4226
4316
|
@if (hasUnmet) {
|
|
4227
|
-
<
|
|
4228
|
-
class="pi pi-exclamation-triangle text-orange-500"
|
|
4229
|
-
[pTooltip]="
|
|
4317
|
+
<ui-icon name="exclamation-triangle" class="text-orange-500" [fTooltip]="
|
|
4230
4318
|
'iam.validation.unmet.prerequisites.tooltip'
|
|
4231
4319
|
| translate
|
|
4232
4320
|
"
|
|
4233
|
-
tooltipPosition="top"
|
|
4234
|
-
></i>
|
|
4321
|
+
tooltipPosition="top"></ui-icon>
|
|
4235
4322
|
}
|
|
4236
4323
|
</span>
|
|
4237
4324
|
</td>
|
|
@@ -4239,7 +4326,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
4239
4326
|
{{ rowData.code || '-' }}
|
|
4240
4327
|
</td>
|
|
4241
4328
|
<td>
|
|
4242
|
-
<
|
|
4329
|
+
<f-tag
|
|
4243
4330
|
[value]="rowData.actionType"
|
|
4244
4331
|
[severity]="
|
|
4245
4332
|
rowData.actionType === 'backend' ? 'info' : 'success'
|
|
@@ -4255,7 +4342,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
4255
4342
|
<tr>
|
|
4256
4343
|
<td colspan="5" class="text-center p-4 text-muted-color">
|
|
4257
4344
|
@if (loading()) {
|
|
4258
|
-
<
|
|
4345
|
+
<ui-icon name="loader-circle" spin></ui-icon>
|
|
4259
4346
|
{{ 'shared.loading.actions' | translate }}
|
|
4260
4347
|
} @else {
|
|
4261
4348
|
{{ 'iam.permission.no.actions.available' | translate }}
|
|
@@ -4263,14 +4350,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
4263
4350
|
</td>
|
|
4264
4351
|
</tr>
|
|
4265
4352
|
</ng-template>
|
|
4266
|
-
</
|
|
4353
|
+
</f-treetable>
|
|
4267
4354
|
</div>
|
|
4268
4355
|
</div>
|
|
4269
4356
|
|
|
4270
4357
|
@if (hasChanges()) {
|
|
4271
4358
|
<div class="border border-surface rounded-border p-3 mt-4">
|
|
4272
4359
|
<div class="flex items-center gap-2 mb-3">
|
|
4273
|
-
<
|
|
4360
|
+
<ui-icon name="info-circle" class="text-primary"></ui-icon>
|
|
4274
4361
|
<span class="font-bold">{{
|
|
4275
4362
|
'shared.pending.changes' | translate
|
|
4276
4363
|
}}</span>
|
|
@@ -4279,7 +4366,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
4279
4366
|
@if (pendingAdd().length > 0) {
|
|
4280
4367
|
<div>
|
|
4281
4368
|
<div class="flex items-center gap-2 mb-2">
|
|
4282
|
-
<
|
|
4369
|
+
<ui-icon name="plus-circle" class="text-green-500"></ui-icon>
|
|
4283
4370
|
<strong class="text-sm"
|
|
4284
4371
|
>{{ 'shared.to.assign' | translate }} ({{
|
|
4285
4372
|
pendingAdd().length
|
|
@@ -4296,7 +4383,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
4296
4383
|
@if (pendingRemove().length > 0) {
|
|
4297
4384
|
<div>
|
|
4298
4385
|
<div class="flex items-center gap-2 mb-2">
|
|
4299
|
-
<
|
|
4386
|
+
<ui-icon name="minus-circle" class="text-red-500"></ui-icon>
|
|
4300
4387
|
<strong class="text-sm"
|
|
4301
4388
|
>{{ 'shared.to.remove' | translate }} ({{
|
|
4302
4389
|
pendingRemove().length
|
|
@@ -4317,9 +4404,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
4317
4404
|
|
|
4318
4405
|
@if (!loading() && actions().length === 0) {
|
|
4319
4406
|
<div class="surface-card p-5 rounded-border shadow-sm text-center">
|
|
4320
|
-
<
|
|
4321
|
-
class="pi pi-info-circle text-muted-color mb-3 block text-5xl"
|
|
4322
|
-
></i>
|
|
4407
|
+
<ui-icon name="info-circle" class="text-muted-color mb-3 block text-5xl"></ui-icon>
|
|
4323
4408
|
<p class="text-muted-color m-0">
|
|
4324
4409
|
{{ 'iam.permission.no.actions.for.user' | translate }}
|
|
4325
4410
|
</p>
|
|
@@ -4327,7 +4412,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
4327
4412
|
}
|
|
4328
4413
|
}
|
|
4329
4414
|
</div>
|
|
4330
|
-
`, styles: [":host{display:block}.validation-warning{background-color:var(--
|
|
4415
|
+
`, styles: [":host{display:block}.validation-warning{background-color:var(--f-yellow-50, #fefce8);border-left:4px solid var(--f-yellow-500, #eab308);color:var(--f-yellow-700, #a16207)}:host-context(.p-dark) .validation-warning{background-color:#eab3081a;color:var(--f-yellow-400, #facc15)}:host ::ng-deep tr.highlight-warning{background-color:var(--f-red-50, rgba(239, 68, 68, .1))!important}:host-context(.p-dark) ::ng-deep tr.highlight-warning{background-color:#ef444426!important}\n"] }]
|
|
4331
4416
|
}], ctorParameters: () => [] });
|
|
4332
4417
|
|
|
4333
4418
|
// Logic Builder Component
|
|
@@ -4377,10 +4462,10 @@ class ProfilePermissionProviderAdapter {
|
|
|
4377
4462
|
})),
|
|
4378
4463
|
})));
|
|
4379
4464
|
}
|
|
4380
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
4381
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
4465
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: ProfilePermissionProviderAdapter, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
4466
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: ProfilePermissionProviderAdapter });
|
|
4382
4467
|
}
|
|
4383
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
4468
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: ProfilePermissionProviderAdapter, decorators: [{
|
|
4384
4469
|
type: Injectable
|
|
4385
4470
|
}] });
|
|
4386
4471
|
|
|
@@ -4403,7 +4488,7 @@ const IAM_ROUTES = [
|
|
|
4403
4488
|
{
|
|
4404
4489
|
path: '',
|
|
4405
4490
|
resolve: { translations: resolveTranslationModule({ modules: ['iam'], fallbackMessages: { ...IAM_MESSAGES, ...SHARED_MESSAGES } }) },
|
|
4406
|
-
loadComponent: () => import('./flusys-ng-iam-iam-container.component-
|
|
4491
|
+
loadComponent: () => import('./flusys-ng-iam-iam-container.component-D0m8u6nu.mjs').then((m) => m.IamContainerComponent),
|
|
4407
4492
|
children: [
|
|
4408
4493
|
// Actions Management
|
|
4409
4494
|
{
|
|
@@ -4412,15 +4497,15 @@ const IAM_ROUTES = [
|
|
|
4412
4497
|
children: [
|
|
4413
4498
|
{
|
|
4414
4499
|
path: '',
|
|
4415
|
-
loadComponent: () => import('./flusys-ng-iam-action-list-page.component-
|
|
4500
|
+
loadComponent: () => import('./flusys-ng-iam-action-list-page.component-B1hUE4lD.mjs').then((m) => m.ActionListPageComponent),
|
|
4416
4501
|
},
|
|
4417
4502
|
{
|
|
4418
4503
|
path: 'new',
|
|
4419
|
-
loadComponent: () => import('./flusys-ng-iam-action-form-page.component-
|
|
4504
|
+
loadComponent: () => import('./flusys-ng-iam-action-form-page.component-DTJT8Dc-.mjs').then((m) => m.ActionFormPageComponent),
|
|
4420
4505
|
},
|
|
4421
4506
|
{
|
|
4422
4507
|
path: ':id',
|
|
4423
|
-
loadComponent: () => import('./flusys-ng-iam-action-form-page.component-
|
|
4508
|
+
loadComponent: () => import('./flusys-ng-iam-action-form-page.component-DTJT8Dc-.mjs').then((m) => m.ActionFormPageComponent),
|
|
4424
4509
|
},
|
|
4425
4510
|
],
|
|
4426
4511
|
},
|
|
@@ -4431,15 +4516,15 @@ const IAM_ROUTES = [
|
|
|
4431
4516
|
children: [
|
|
4432
4517
|
{
|
|
4433
4518
|
path: '',
|
|
4434
|
-
loadComponent: () => import('./flusys-ng-iam-role-list-page.component-
|
|
4519
|
+
loadComponent: () => import('./flusys-ng-iam-role-list-page.component-BcS9_ysT.mjs').then((m) => m.RoleListPageComponent),
|
|
4435
4520
|
},
|
|
4436
4521
|
{
|
|
4437
4522
|
path: 'new',
|
|
4438
|
-
loadComponent: () => import('./flusys-ng-iam-role-form-page.component-
|
|
4523
|
+
loadComponent: () => import('./flusys-ng-iam-role-form-page.component-DrUQ0taO.mjs').then((m) => m.RoleFormPageComponent),
|
|
4439
4524
|
},
|
|
4440
4525
|
{
|
|
4441
4526
|
path: ':id',
|
|
4442
|
-
loadComponent: () => import('./flusys-ng-iam-role-form-page.component-
|
|
4527
|
+
loadComponent: () => import('./flusys-ng-iam-role-form-page.component-DrUQ0taO.mjs').then((m) => m.RoleFormPageComponent),
|
|
4443
4528
|
},
|
|
4444
4529
|
],
|
|
4445
4530
|
},
|
|
@@ -4454,7 +4539,7 @@ const IAM_ROUTES = [
|
|
|
4454
4539
|
COMPANY_ACTION_PERMISSIONS.READ,
|
|
4455
4540
|
]),
|
|
4456
4541
|
],
|
|
4457
|
-
loadComponent: () => import('./flusys-ng-iam-permission-page.component-
|
|
4542
|
+
loadComponent: () => import('./flusys-ng-iam-permission-page.component-rcijgKmE.mjs').then((m) => m.PermissionPageComponent),
|
|
4458
4543
|
},
|
|
4459
4544
|
// Default redirect to actions
|
|
4460
4545
|
{
|
|
@@ -4473,4 +4558,4 @@ const IAM_ROUTES = [
|
|
|
4473
4558
|
*/
|
|
4474
4559
|
|
|
4475
4560
|
export { ActionApiService as A, CompanyActionSelectorComponent as C, IAM_MESSAGES as I, LogicBuilderComponent as L, MAX_DROPDOWN_ITEMS as M, PermissionApiService as P, RoleApiService as R, UserRoleSelectorComponent as U, ActionType as a, RoleActionSelectorComponent as b, convertActionToTreeNode as c, UserActionSelectorComponent as d, ActionPermissionLogicService as e, IAM_ROUTES as f, MyPermissionsApiService as g, PermissionStateService as h, ProfilePermissionProviderAdapter as i, provideIamProviders as p };
|
|
4476
|
-
//# sourceMappingURL=flusys-ng-iam-flusys-ng-iam-
|
|
4561
|
+
//# sourceMappingURL=flusys-ng-iam-flusys-ng-iam-DzIO0zsO.mjs.map
|