@flusys/ng-iam 9.2.0 → 9.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/fesm2022/{flusys-ng-iam-action-form-page.component-DJ-A1gc2.mjs → flusys-ng-iam-action-form-page.component-4B2Eue3o.mjs} +5 -5
  2. package/fesm2022/{flusys-ng-iam-action-form-page.component-DJ-A1gc2.mjs.map → flusys-ng-iam-action-form-page.component-4B2Eue3o.mjs.map} +1 -1
  3. package/fesm2022/{flusys-ng-iam-action-list-page.component-D4jAQRwR.mjs → flusys-ng-iam-action-list-page.component-CY_gZRy7.mjs} +5 -5
  4. package/fesm2022/{flusys-ng-iam-action-list-page.component-D4jAQRwR.mjs.map → flusys-ng-iam-action-list-page.component-CY_gZRy7.mjs.map} +1 -1
  5. package/fesm2022/{flusys-ng-iam-iam-container.component-CIdxVCSW.mjs → flusys-ng-iam-iam-container.component-DXvFhD07.mjs} +4 -4
  6. package/fesm2022/{flusys-ng-iam-iam-container.component-CIdxVCSW.mjs.map → flusys-ng-iam-iam-container.component-DXvFhD07.mjs.map} +1 -1
  7. package/fesm2022/{flusys-ng-iam-permission-api.service-C7-Yxvz8.mjs → flusys-ng-iam-permission-api.service-ls0J1lec.mjs} +4 -4
  8. package/fesm2022/{flusys-ng-iam-permission-api.service-C7-Yxvz8.mjs.map → flusys-ng-iam-permission-api.service-ls0J1lec.mjs.map} +1 -1
  9. package/fesm2022/{flusys-ng-iam-permission-page.component-DBRetWGs.mjs → flusys-ng-iam-permission-page.component-DvWuxHyU.mjs} +5 -5
  10. package/fesm2022/{flusys-ng-iam-permission-page.component-DBRetWGs.mjs.map → flusys-ng-iam-permission-page.component-DvWuxHyU.mjs.map} +1 -1
  11. package/fesm2022/{flusys-ng-iam-role-api.service-OwPgmSFc.mjs → flusys-ng-iam-role-api.service-DVnfR0C1.mjs} +4 -4
  12. package/fesm2022/{flusys-ng-iam-role-api.service-OwPgmSFc.mjs.map → flusys-ng-iam-role-api.service-DVnfR0C1.mjs.map} +1 -1
  13. package/fesm2022/{flusys-ng-iam-role-form-page.component-DnkWkbTF.mjs → flusys-ng-iam-role-form-page.component-BO-k7B9J.mjs} +5 -5
  14. package/fesm2022/{flusys-ng-iam-role-form-page.component-DnkWkbTF.mjs.map → flusys-ng-iam-role-form-page.component-BO-k7B9J.mjs.map} +1 -1
  15. package/fesm2022/{flusys-ng-iam-role-list-page.component-Dhd0AtOg.mjs → flusys-ng-iam-role-list-page.component-DHrPv5FH.mjs} +5 -5
  16. package/fesm2022/{flusys-ng-iam-role-list-page.component-Dhd0AtOg.mjs.map → flusys-ng-iam-role-list-page.component-DHrPv5FH.mjs.map} +1 -1
  17. package/fesm2022/{flusys-ng-iam-tree-utils-B1pBG4At.mjs → flusys-ng-iam-tree-utils-DglBny_Y.mjs} +4 -4
  18. package/fesm2022/{flusys-ng-iam-tree-utils-B1pBG4At.mjs.map → flusys-ng-iam-tree-utils-DglBny_Y.mjs.map} +1 -1
  19. package/fesm2022/{flusys-ng-iam-user-action-selector.component-2wdl9Ci6.mjs → flusys-ng-iam-user-action-selector.component-D-vsK7Oz.mjs} +19 -19
  20. package/fesm2022/{flusys-ng-iam-user-action-selector.component-2wdl9Ci6.mjs.map → flusys-ng-iam-user-action-selector.component-D-vsK7Oz.mjs.map} +1 -1
  21. package/fesm2022/flusys-ng-iam.mjs +36 -36
  22. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-iam-role-form-page.component-DnkWkbTF.mjs","names":[],"sources":["../../../projects/ng-iam/pages/role/role-form-page.component.ts"],"sourcesContent":["import { Component, computed, effect, inject, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport {\n CheckboxComponent,\n FButtonDirective,\n InputTextDirective,\n MessageService,\n UiIconComponent,\n} from '@flusys/ng-ui';\nimport {\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { IRole } from '../../interfaces/role.interface';\nimport { RoleApiService } from '../../services/role-api.service';\n\ninterface IRoleFormModel {\n id: string;\n name: string;\n description: string;\n serial: string;\n isActive: boolean;\n}\n\n@Component({\n selector: 'lib-role-form-page',\n imports: [\n CheckboxComponent,\n FButtonDirective,\n InputTextDirective,\n UiIconComponent,\n FormField,\n TranslatePipe,\n ],\n template: `\n <div class=\"card\">\n <h3 class=\"text-lg sm:text-xl font-semibold mb-4\">\n {{\n isEditMode()\n ? ('iam.role.edit' | translate)\n : ('iam.role.new' | translate)\n }}\n </h3>\n\n <form\n (submit)=\"onSubmit($event)\"\n class=\"grid grid-cols-1 md:grid-cols-2 gap-4\"\n >\n <!-- Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\"\n >{{ 'iam.role.name' | translate }} *</label\n >\n <input\n fInputText\n id=\"name\"\n [formField]=\"roleForm.name\"\n [placeholder]=\"'iam.role.name.placeholder' | translate\"\n />\n </div>\n\n <!-- Description -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"description\" class=\"font-medium\">{{\n 'shared.description' | translate\n }}</label>\n <input\n fInputText\n id=\"description\"\n [formField]=\"roleForm.description\"\n [placeholder]=\"'shared.description.placeholder' | translate\"\n />\n </div>\n\n <!-- Order -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"serial\" class=\"font-medium\">{{\n 'shared.display.order' | translate\n }}</label>\n <input\n fInputText\n id=\"serial\"\n type=\"number\"\n [formField]=\"roleForm.serial\"\n [placeholder]=\"'shared.display.order.placeholder' | translate\"\n />\n </div>\n\n <!-- Is Active -->\n <div class=\"flex items-end gap-2 pb-1\">\n <f-checkbox\n [formField]=\"roleForm.isActive\"\n [binary]=\"true\"\n inputId=\"isActive\"\n />\n <label for=\"isActive\">{{ 'shared.active' | translate }}</label>\n </div>\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-2 md:col-span-2 pt-4\">\n <button\n fButton\n type=\"button\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onBack()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ \n isEditMode()\n ? ('shared.update' | translate)\n : ('shared.create' | translate)\n }}</span>\n </button>\n </div>\n </form>\n </div>\n `,\n})\nexport class RoleFormPageComponent {\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly companyContext = inject(LAYOUT_AUTH_STATE);\n private readonly roleApi = inject(RoleApiService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n\n private readonly routeParams = toSignal(this.route.paramMap);\n private initialized = false;\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly isLoading = signal(false);\n readonly existingRole = signal<IRole | null>(null);\n readonly isEditMode = computed(() => !!this.existingRole());\n\n readonly formModel = signal<IRoleFormModel>({\n id: '',\n name: '',\n description: '',\n serial: '',\n isActive: true,\n });\n\n readonly roleForm = form(this.formModel, (f) => {\n required(f.name, {\n message: this.translate('shared.validation.required', {\n field: this.translate('iam.role.name'),\n }),\n });\n });\n\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return model.name.trim().length > 0;\n });\n\n constructor() {\n effect(() => {\n const params = this.routeParams();\n if (!params || this.initialized) return;\n\n this.initialized = true;\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadRole(id);\n }\n });\n }\n\n async loadRole(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.roleApi.findById(id);\n const role = response?.data;\n\n if (role?.readOnly) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.error'),\n detail: this.translate('iam.role.readonly.edit.forbidden'),\n });\n this.router.navigate(['/iam/roles']);\n return;\n }\n\n if (role) {\n this.existingRole.set(role);\n this.formModel.set({\n id: role.id,\n name: role.name,\n description: role.description ?? '',\n serial: role.serial?.toString() ?? '',\n isActive: role.isActive,\n });\n } else {\n // Error toast handled by global interceptor\n this.router.navigate(['/iam/roles']);\n }\n } catch {\n // Error toast handled by global interceptor\n this.router.navigate(['/iam/roles']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n async onSubmit(event: Event): Promise<void> {\n event.preventDefault();\n\n if (!this.isFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('shared.fill.required.fields'),\n });\n return;\n }\n\n this.isLoading.set(true);\n\n try {\n const formValue = this.formModel();\n\n // Get company context if feature enabled\n const companyId = isCompanyFeatureEnabled(this.appConfig)\n ? this.companyContext.currentCompanyInfo()?.id || undefined\n : undefined;\n\n // Convert empty strings to undefined for DTO compatibility\n const dto = {\n ...formValue,\n description: formValue.description || undefined,\n serial: formValue.serial ? parseInt(formValue.serial, 10) : undefined,\n companyId: this.isEditMode() ? undefined : companyId,\n };\n\n const response = this.isEditMode()\n ? await this.roleApi.update(dto)\n : await this.roleApi.insert(dto);\n\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : (response.message ?? ''),\n });\n\n this.router.navigate(['/iam/roles']);\n } catch {\n // Error toast handled by global interceptor\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onBack(): void {\n this.router.navigate(['/iam/roles']);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-iam-role-form-page.component-BO-k7B9J.mjs","names":[],"sources":["../../../projects/ng-iam/pages/role/role-form-page.component.ts"],"sourcesContent":["import { Component, computed, effect, inject, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport {\n CheckboxComponent,\n FButtonDirective,\n InputTextDirective,\n MessageService,\n UiIconComponent,\n} from '@flusys/ng-ui';\nimport {\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { IRole } from '../../interfaces/role.interface';\nimport { RoleApiService } from '../../services/role-api.service';\n\ninterface IRoleFormModel {\n id: string;\n name: string;\n description: string;\n serial: string;\n isActive: boolean;\n}\n\n@Component({\n selector: 'lib-role-form-page',\n imports: [\n CheckboxComponent,\n FButtonDirective,\n InputTextDirective,\n UiIconComponent,\n FormField,\n TranslatePipe,\n ],\n template: `\n <div class=\"card\">\n <h3 class=\"text-lg sm:text-xl font-semibold mb-4\">\n {{\n isEditMode()\n ? ('iam.role.edit' | translate)\n : ('iam.role.new' | translate)\n }}\n </h3>\n\n <form\n (submit)=\"onSubmit($event)\"\n class=\"grid grid-cols-1 md:grid-cols-2 gap-4\"\n >\n <!-- Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\"\n >{{ 'iam.role.name' | translate }} *</label\n >\n <input\n fInputText\n id=\"name\"\n [formField]=\"roleForm.name\"\n [placeholder]=\"'iam.role.name.placeholder' | translate\"\n />\n </div>\n\n <!-- Description -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"description\" class=\"font-medium\">{{\n 'shared.description' | translate\n }}</label>\n <input\n fInputText\n id=\"description\"\n [formField]=\"roleForm.description\"\n [placeholder]=\"'shared.description.placeholder' | translate\"\n />\n </div>\n\n <!-- Order -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"serial\" class=\"font-medium\">{{\n 'shared.display.order' | translate\n }}</label>\n <input\n fInputText\n id=\"serial\"\n type=\"number\"\n [formField]=\"roleForm.serial\"\n [placeholder]=\"'shared.display.order.placeholder' | translate\"\n />\n </div>\n\n <!-- Is Active -->\n <div class=\"flex items-end gap-2 pb-1\">\n <f-checkbox\n [formField]=\"roleForm.isActive\"\n [binary]=\"true\"\n inputId=\"isActive\"\n />\n <label for=\"isActive\">{{ 'shared.active' | translate }}</label>\n </div>\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-2 md:col-span-2 pt-4\">\n <button\n fButton\n type=\"button\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onBack()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ \n isEditMode()\n ? ('shared.update' | translate)\n : ('shared.create' | translate)\n }}</span>\n </button>\n </div>\n </form>\n </div>\n `,\n})\nexport class RoleFormPageComponent {\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly companyContext = inject(LAYOUT_AUTH_STATE);\n private readonly roleApi = inject(RoleApiService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n\n private readonly routeParams = toSignal(this.route.paramMap);\n private initialized = false;\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly isLoading = signal(false);\n readonly existingRole = signal<IRole | null>(null);\n readonly isEditMode = computed(() => !!this.existingRole());\n\n readonly formModel = signal<IRoleFormModel>({\n id: '',\n name: '',\n description: '',\n serial: '',\n isActive: true,\n });\n\n readonly roleForm = form(this.formModel, (f) => {\n required(f.name, {\n message: this.translate('shared.validation.required', {\n field: this.translate('iam.role.name'),\n }),\n });\n });\n\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return model.name.trim().length > 0;\n });\n\n constructor() {\n effect(() => {\n const params = this.routeParams();\n if (!params || this.initialized) return;\n\n this.initialized = true;\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadRole(id);\n }\n });\n }\n\n async loadRole(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.roleApi.findById(id);\n const role = response?.data;\n\n if (role?.readOnly) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.error'),\n detail: this.translate('iam.role.readonly.edit.forbidden'),\n });\n this.router.navigate(['/iam/roles']);\n return;\n }\n\n if (role) {\n this.existingRole.set(role);\n this.formModel.set({\n id: role.id,\n name: role.name,\n description: role.description ?? '',\n serial: role.serial?.toString() ?? '',\n isActive: role.isActive,\n });\n } else {\n // Error toast handled by global interceptor\n this.router.navigate(['/iam/roles']);\n }\n } catch {\n // Error toast handled by global interceptor\n this.router.navigate(['/iam/roles']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n async onSubmit(event: Event): Promise<void> {\n event.preventDefault();\n\n if (!this.isFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('shared.fill.required.fields'),\n });\n return;\n }\n\n this.isLoading.set(true);\n\n try {\n const formValue = this.formModel();\n\n // Get company context if feature enabled\n const companyId = isCompanyFeatureEnabled(this.appConfig)\n ? this.companyContext.currentCompanyInfo()?.id || undefined\n : undefined;\n\n // Convert empty strings to undefined for DTO compatibility\n const dto = {\n ...formValue,\n description: formValue.description || undefined,\n serial: formValue.serial ? parseInt(formValue.serial, 10) : undefined,\n companyId: this.isEditMode() ? undefined : companyId,\n };\n\n const response = this.isEditMode()\n ? await this.roleApi.update(dto)\n : await this.roleApi.insert(dto);\n\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : (response.message ?? ''),\n });\n\n this.router.navigate(['/iam/roles']);\n } catch {\n // Error toast handled by global interceptor\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onBack(): void {\n this.router.navigate(['/iam/roles']);\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { t as RoleApiService } from "./flusys-ng-iam-role-api.service-OwPgmSFc.mjs";
1
+ import { t as RoleApiService } from "./flusys-ng-iam-role-api.service-DVnfR0C1.mjs";
2
2
  import { RolePermittedUsersDialogComponent } from "./flusys-ng-iam.mjs";
3
3
  import * as i0 from "@angular/core";
4
4
  import { Component, computed, effect, inject, signal, untracked } from "@angular/core";
@@ -131,7 +131,7 @@ var RoleListPageComponent = class RoleListPageComponent {
131
131
  }
132
132
  static ɵfac = i0.ɵɵngDeclareFactory({
133
133
  minVersion: "12.0.0",
134
- version: "22.2.1",
134
+ version: "22.2.2",
135
135
  ngImport: i0,
136
136
  type: RoleListPageComponent,
137
137
  deps: [],
@@ -139,7 +139,7 @@ var RoleListPageComponent = class RoleListPageComponent {
139
139
  });
140
140
  static ɵcmp = i0.ɵɵngDeclareComponent({
141
141
  minVersion: "17.0.0",
142
- version: "22.2.1",
142
+ version: "22.2.2",
143
143
  type: RoleListPageComponent,
144
144
  isStandalone: true,
145
145
  selector: "lib-role-list-page",
@@ -506,7 +506,7 @@ var RoleListPageComponent = class RoleListPageComponent {
506
506
  };
507
507
  i0.ɵɵngDeclareClassMetadata({
508
508
  minVersion: "12.0.0",
509
- version: "22.2.1",
509
+ version: "22.2.2",
510
510
  ngImport: i0,
511
511
  type: RoleListPageComponent,
512
512
  decorators: [{
@@ -685,4 +685,4 @@ i0.ɵɵngDeclareClassMetadata({
685
685
  });
686
686
  export { RoleListPageComponent };
687
687
 
688
- //# sourceMappingURL=flusys-ng-iam-role-list-page.component-Dhd0AtOg.mjs.map
688
+ //# sourceMappingURL=flusys-ng-iam-role-list-page.component-DHrPv5FH.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-iam-role-list-page.component-Dhd0AtOg.mjs","names":[],"sources":["../../../projects/ng-iam/pages/role/role-list-page.component.ts"],"sourcesContent":["import {\n Component,\n computed,\n effect,\n inject,\n signal,\n untracked,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport {\n APP_CONFIG,\n DEFAULT_APP_NAME,\n getPermissionMode,\n isCompanyFeatureEnabled,\n} from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport {\n HasPermissionDirective,\n ROLE_PERMISSIONS,\n TranslatePipe,\n TranslateService,\n USER_ROLE_PERMISSIONS,\n} from '@flusys/ng-shared';\nimport {\n ConfirmationService,\n FButtonDirective,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n MessageService,\n TableComponent,\n TagComponent,\n TooltipDirective,\n UiIconComponent,\n} from '@flusys/ng-ui';\nimport { RolePermittedUsersDialogComponent } from '../../components/role-permitted-users-dialog.component';\nimport { IRole } from '../../interfaces/role.interface';\nimport { RoleApiService } from '../../services/role-api.service';\n\n@Component({\n selector: 'lib-role-list-page',\n imports: [\n FButtonDirective,\n FormsModule,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n TableComponent,\n TagComponent,\n TooltipDirective,\n UiIconComponent,\n HasPermissionDirective,\n RolePermittedUsersDialogComponent,\n TranslatePipe,\n ],\n template: `\n <div class=\"card\">\n <div\n class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 mb-4\"\n >\n <div>\n <h3 class=\"text-lg sm:text-xl font-semibold\">\n {{ 'iam.role.title' | translate }}\n </h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'iam.company.title' | translate }}: {{ currentCompanyName() }}\n </p>\n }\n </div>\n <div class=\"flex flex-wrap items-center gap-2 w-full sm:w-auto\">\n <f-iconfield class=\"w-full sm:w-64\">\n <f-inputicon icon=\"search\" />\n <input\n fInputText\n type=\"text\"\n [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"onSearchChange($event)\"\n [placeholder]=\"'shared.search' | translate\"\n class=\"w-full\"\n />\n </f-iconfield>\n <button\n fButton\n *hasPermission=\"ROLE_PERMISSIONS.CREATE\"\n (click)=\"onCreate()\"\n class=\"w-full sm:w-auto\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{ 'iam.role.new' | translate }}</span>\n </button>\n </div>\n </div>\n\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <f-table\n [value]=\"roles()\"\n [loading]=\"isLoading()\"\n [paginator]=\"total() > 0\"\n [rows]=\"pageSize()\"\n [first]=\"first()\"\n [totalRecords]=\"total()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [scrollable]=\"true\"\n [tableStyle]=\"{ 'min-width': '40rem' }\"\n >\n <ng-template #header>\n <tr>\n <th>{{ 'iam.role.name' | translate }}</th>\n <th class=\"hidden md:table-cell\">\n {{ 'shared.description' | translate }}\n </th>\n <th>{{ 'shared.active' | translate }}</th>\n <th class=\"hidden sm:table-cell\">\n {{ 'shared.read.only' | translate }}\n </th>\n <th class=\"w-[120px]\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-role>\n <tr>\n <td>{{ role.name }}</td>\n <td class=\"hidden md:table-cell\">\n {{ role.description ?? '-' }}\n </td>\n <td>\n <f-tag\n [value]=\"\n role.isActive\n ? ('shared.active' | translate)\n : ('shared.inactive' | translate)\n \"\n [severity]=\"role.isActive ? 'success' : 'secondary'\"\n />\n </td>\n <td class=\"hidden sm:table-cell\">\n <f-tag\n [value]=\"\n role.readOnly\n ? ('shared.yes' | translate)\n : ('shared.no' | translate)\n \"\n [severity]=\"role.readOnly ? 'warn' : 'secondary'\"\n />\n </td>\n <td>\n <div class=\"flex gap-1\">\n <button\n fButton\n *hasPermission=\"ROLE_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [disabled]=\"role.readOnly\"\n [fTooltip]=\"'shared.edit' | translate\"\n (click)=\"onEdit(role)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n @if (showRoleUsers()) {\n <button\n fButton\n *hasPermission=\"USER_ROLE_PERMISSIONS.READ\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [fTooltip]=\"'iam.permission.view.users' | translate\"\n (click)=\"onViewUsers(role)\"\n >\n <ui-icon pButtonIcon name=\"users\"></ui-icon>\n </button>\n }\n <button\n fButton\n *hasPermission=\"ROLE_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n [fTooltip]=\"'shared.delete' | translate\"\n [disabled]=\"role.readOnly\"\n (click)=\"onDelete(role)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"5\" class=\"text-center py-4 text-muted-color\">\n {{ 'iam.role.no.roles' | translate }}\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </div>\n\n <flusys-role-permitted-users-dialog\n [visible]=\"permittedUsersDialogVisible()\"\n [role]=\"selectedRole()\"\n (closed)=\"permittedUsersDialogVisible.set(false)\"\n />\n `,\n})\nexport class RoleListPageComponent {\n readonly ROLE_PERMISSIONS = ROLE_PERMISSIONS;\n readonly USER_ROLE_PERMISSIONS = USER_ROLE_PERMISSIONS;\n\n private readonly router = inject(Router);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly companyContext = inject(LAYOUT_AUTH_STATE);\n private readonly roleApi = inject(RoleApiService);\n private readonly messageService = inject(MessageService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly roles = signal<IRole[]>([]);\n readonly isLoading = signal(false);\n readonly total = signal(0);\n readonly pageSize = signal(10);\n readonly first = signal(0);\n private readonly _searchTerm = signal('');\n readonly searchTerm = this._searchTerm.asReadonly();\n readonly showCompanyInfo = computed(\n () => this.appConfig.enableCompanyFeature,\n );\n readonly showRoleUsers = computed(() => {\n const permissionMode = getPermissionMode(this.appConfig);\n return permissionMode === 'rbac' || permissionMode === 'full';\n });\n readonly currentCompanyName = computed(\n () => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME,\n );\n\n readonly permittedUsersDialogVisible = signal(false);\n readonly selectedRole = signal<IRole | null>(null);\n\n private previousCompanyId: string | undefined | null = undefined;\n\n constructor() {\n effect(() => {\n const currentCompanyId =\n this.companyContext.currentCompanyInfo()?.id ?? null;\n if (this.previousCompanyId === undefined) {\n this.previousCompanyId = currentCompanyId;\n return;\n }\n if (this.previousCompanyId === currentCompanyId) return;\n this.previousCompanyId = currentCompanyId;\n untracked(() => {\n this.first.set(0);\n this.loadRoles();\n });\n });\n }\n\n private loadSeq = 0;\n\n private async loadRoles(): Promise<void> {\n const seq = ++this.loadSeq;\n this.isLoading.set(true);\n try {\n const enableCompanyFeature = isCompanyFeatureEnabled(this.appConfig);\n const companyId = enableCompanyFeature\n ? this.companyContext.currentCompanyInfo()?.id || undefined\n : undefined;\n\n const selectFields = [\n 'id',\n 'name',\n 'description',\n 'isActive',\n 'readOnly',\n 'serial',\n 'createdAt',\n 'deletedAt',\n ];\n if (enableCompanyFeature) {\n selectFields.push('companyId');\n }\n\n const response = await this.roleApi.getAll(\n {\n filter: companyId ? { companyId } : undefined,\n pagination: {\n currentPage: Math.floor(this.first() / this.pageSize()),\n pageSize: this.pageSize(),\n },\n select: selectFields,\n sort: { id: 'ASC' },\n },\n this._searchTerm(),\n );\n\n if (seq !== this.loadSeq) return;\n this.roles.set(response?.data ?? []);\n this.total.set(response?.meta?.total ?? 0);\n } catch {\n // Error toast handled by global interceptor\n } finally {\n if (seq === this.loadSeq) this.isLoading.set(false);\n }\n }\n\n onCreate(): void {\n this.router.navigate(['/iam/roles/new']);\n }\n\n onEdit(role: IRole): void {\n this.router.navigate(['/iam/roles', role.id]);\n }\n\n onViewUsers(role: IRole): void {\n this.selectedRole.set(role);\n this.permittedUsersDialogVisible.set(true);\n }\n\n onDelete(role: IRole): void {\n this.confirmationService.confirm({\n message: this.translate('shared.confirm.delete.item', {\n name: role.name,\n }),\n header: this.translate('iam.role.delete.title'),\n icon: 'exclamation-triangle',\n accept: async () => {\n try {\n const response = await this.roleApi.delete({\n id: role.id,\n type: 'permanent',\n });\n\n this.roles.update((list) => list.filter((r) => r.id !== role.id));\n this.total.update((t) => Math.max(0, t - 1));\n\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response?.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : response?.message,\n });\n } catch {\n // Error toast handled by global interceptor\n }\n },\n });\n }\n\n onLazyLoad(event: { first?: number | null; rows?: number | null }): void {\n this.first.set(event.first ?? 0);\n this.pageSize.set(event.rows ?? 10);\n this.loadRoles();\n }\n\n onSearchChange(value: string): void {\n this._searchTerm.set(value);\n this.first.set(0);\n this.loadRoles();\n }\n}\n"],"mappings":";;;;;;;;;;;AAiNA,IAAa,wBAAb,MAAa,sBAAqB;CACvB,mBAAmB;CACnB,wBAAwB;CAEhB,SAAS,OAAO,MAAM;CACtB,YAAY,OAAO,UAAU;CAC7B,iBAAiB,OAAO,iBAAiB;CACzC,UAAU,OAAO,cAAc;CAC/B,iBAAiB,OAAO,cAAc;CACtC,sBAAsB,OAAO,mBAAmB;CAChD,mBAAmB,OAAO,kBAAkB,EAC3D,UAAU,KACX,CAAA;CAEO,UACN,KACA,MAAsC;EAEtC,OAAO,KAAK,kBAAkB,UAAU,KAAK,IAAI,KAAK;CACxD;CAES,QAAQ,OAAgB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAC3B,YAAY,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CACzB,QAAQ,OAAO,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACjB,WAAW,OAAO,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CACrB,QAAQ,OAAO,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACT,cAAc,OAAO,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAChC,aAAa,KAAK,YAAY,WAAU;CACxC,kBAAkB,eACnB,KAAK,UAAU,sBACtB,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CACQ,gBAAgB,eAAc;EACrC,MAAM,iBAAiB,kBAAkB,KAAK,SAAS;EACvD,OAAO,mBAAmB,UAAU,mBAAmB;CACzD,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CACO,qBAAqB,eACtB,KAAK,eAAe,mBAAkB,CAAE,EAAE,QAAQ,kBACzD,GAAA,YAAA,CAAA,EAAA,WAAA,qBAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,8BAA8B,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,8BAAA,CAAA,+BAAA,CAAA,CAAA;CAC3C,eAAe,OAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAE1C,oBAA+C;CAEvD,cAAA;EACE,aAAY;GACV,MAAM,mBACJ,KAAK,eAAe,mBAAkB,CAAE,EAAE,MAAM;GAClD,IAAI,KAAK,sBAAsB,QAAW;IACxC,KAAK,oBAAoB;IACzB;GACF;GACA,IAAI,KAAK,sBAAsB,kBAAkB;GACjD,KAAK,oBAAoB;GACzB,gBAAe;IACb,KAAK,MAAM,IAAI,CAAC;IAChB,KAAK,UAAS;GAChB,CAAC;EACH,CAAC;CACH;CAEQ,UAAU;CAEV,MAAM,YAAS;EACrB,MAAM,MAAM,EAAE,KAAK;EACnB,KAAK,UAAU,IAAI,IAAI;EACvB,IAAI;GACF,MAAM,uBAAuB,wBAAwB,KAAK,SAAS;GACnE,MAAM,YAAY,uBACd,KAAK,eAAe,mBAAkB,CAAE,EAAE,MAAM,SAChD;GAEJ,MAAM,eAAe;IACnB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACD;GACD,IAAI,sBACF,aAAa,KAAK,WAAW;GAG/B,MAAM,WAAW,MAAM,KAAK,QAAQ,OAClC;IACE,QAAQ,YAAY,EAAE,UAAS,IAAK;IACpC,YAAY;KACV,aAAa,KAAK,MAAM,KAAK,MAAK,IAAK,KAAK,SAAQ,CAAE;KACtD,UAAU,KAAK,SAAQ;IACxB;IACD,QAAQ;IACR,MAAM,EAAE,IAAI,MAAK;GAClB,GACD,KAAK,YAAW,CAAE;GAGpB,IAAI,QAAQ,KAAK,SAAS;GAC1B,KAAK,MAAM,IAAI,UAAU,QAAQ,CAAA,CAAE;GACnC,KAAK,MAAM,IAAI,UAAU,MAAM,SAAS,CAAC;EAC3C,QAAQ,CAER,UAAU;GACR,IAAI,QAAQ,KAAK,SAAS,KAAK,UAAU,IAAI,KAAK;EACpD;CACF;CAEA,WAAQ;EACN,KAAK,OAAO,SAAS,CAAC,gBAAgB,CAAC;CACzC;CAEA,OAAO,MAAW;EAChB,KAAK,OAAO,SAAS,CAAC,cAAc,KAAK,EAAE,CAAC;CAC9C;CAEA,YAAY,MAAW;EACrB,KAAK,aAAa,IAAI,IAAI;EAC1B,KAAK,4BAA4B,IAAI,IAAI;CAC3C;CAEA,SAAS,MAAW;EAClB,KAAK,oBAAoB,QAAQ;GAC/B,SAAS,KAAK,UAAU,8BAA8B,EACpD,MAAM,KAAK,KACZ,CAAA;GACD,QAAQ,KAAK,UAAU,uBAAuB;GAC9C,MAAM;GACN,QAAQ,YAAW;IACjB,IAAI;KACF,MAAM,WAAW,MAAM,KAAK,QAAQ,OAAO;MACzC,IAAI,KAAK;MACT,MAAM;KACP,CAAA;KAED,KAAK,MAAM,QAAQ,SAAS,KAAK,QAAQ,MAAM,EAAE,OAAO,KAAK,EAAE,CAAC;KAChE,KAAK,MAAM,QAAQ,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;KAE3C,KAAK,eAAe,IAAI;MACtB,UAAU;MACV,SAAS,KAAK,UAAU,gBAAgB;MACxC,QAAQ,UAAU,aACd,KAAK,UACH,SAAS,YACT,SAAS,gBAAmD,IAE9D,UAAU;KACf,CAAA;IACH,QAAQ,CAER;GACF;EACD,CAAA;CACH;CAEA,WAAW,OAAsD;EAC/D,KAAK,MAAM,IAAI,MAAM,SAAS,CAAC;EAC/B,KAAK,SAAS,IAAI,MAAM,QAAQ,EAAE;EAClC,KAAK,UAAS;CAChB;CAEA,eAAe,OAAa;EAC1B,KAAK,YAAY,IAAI,KAAK;EAC1B,KAAK,MAAM,IAAI,CAAC;EAChB,KAAK,UAAS;CAChB;CAtKW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAqB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAArB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAqB,cAAA;EAAA,UAAA;EAAA,UAAA;EAAA,UAzJtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuJT,UAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MApKC;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAChB;GAAW;GAAA;IAAA,MAAA;IAAA,MAAA,GAAA;IAAA,UAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAA,GAAA;IAAA,UAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAA,GAAA;IAAA,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA,CAAA,eAAA;IAAA,UAAA,CAAA,SAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACX;IAAkB,UAAA;IAAA,QAAA,CAAA,gBAAA,YAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAClB;IAAkB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAClB;IAAkB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAClB;IAAc,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACd;IAAY,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACZ;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAChB;IAAe,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACf;IAAsB,UAAA;IAAA,QAAA,CAAA,eAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACtB;IAAiC,UAAA;IAAA,QAAA,CAAA,WAAA,MAAA;IAAA,SAAA,CAAA,QAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACjC;IAAa,MAAA;GAAA;EAAA;CAAA,CAAA;;AA2JJ,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA;EAzKjC,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACD;GACD,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwJX,CAAA"}
1
+ {"version":3,"file":"flusys-ng-iam-role-list-page.component-DHrPv5FH.mjs","names":[],"sources":["../../../projects/ng-iam/pages/role/role-list-page.component.ts"],"sourcesContent":["import {\n Component,\n computed,\n effect,\n inject,\n signal,\n untracked,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport {\n APP_CONFIG,\n DEFAULT_APP_NAME,\n getPermissionMode,\n isCompanyFeatureEnabled,\n} from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport {\n HasPermissionDirective,\n ROLE_PERMISSIONS,\n TranslatePipe,\n TranslateService,\n USER_ROLE_PERMISSIONS,\n} from '@flusys/ng-shared';\nimport {\n ConfirmationService,\n FButtonDirective,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n MessageService,\n TableComponent,\n TagComponent,\n TooltipDirective,\n UiIconComponent,\n} from '@flusys/ng-ui';\nimport { RolePermittedUsersDialogComponent } from '../../components/role-permitted-users-dialog.component';\nimport { IRole } from '../../interfaces/role.interface';\nimport { RoleApiService } from '../../services/role-api.service';\n\n@Component({\n selector: 'lib-role-list-page',\n imports: [\n FButtonDirective,\n FormsModule,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n TableComponent,\n TagComponent,\n TooltipDirective,\n UiIconComponent,\n HasPermissionDirective,\n RolePermittedUsersDialogComponent,\n TranslatePipe,\n ],\n template: `\n <div class=\"card\">\n <div\n class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 mb-4\"\n >\n <div>\n <h3 class=\"text-lg sm:text-xl font-semibold\">\n {{ 'iam.role.title' | translate }}\n </h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'iam.company.title' | translate }}: {{ currentCompanyName() }}\n </p>\n }\n </div>\n <div class=\"flex flex-wrap items-center gap-2 w-full sm:w-auto\">\n <f-iconfield class=\"w-full sm:w-64\">\n <f-inputicon icon=\"search\" />\n <input\n fInputText\n type=\"text\"\n [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"onSearchChange($event)\"\n [placeholder]=\"'shared.search' | translate\"\n class=\"w-full\"\n />\n </f-iconfield>\n <button\n fButton\n *hasPermission=\"ROLE_PERMISSIONS.CREATE\"\n (click)=\"onCreate()\"\n class=\"w-full sm:w-auto\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{ 'iam.role.new' | translate }}</span>\n </button>\n </div>\n </div>\n\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <f-table\n [value]=\"roles()\"\n [loading]=\"isLoading()\"\n [paginator]=\"total() > 0\"\n [rows]=\"pageSize()\"\n [first]=\"first()\"\n [totalRecords]=\"total()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [scrollable]=\"true\"\n [tableStyle]=\"{ 'min-width': '40rem' }\"\n >\n <ng-template #header>\n <tr>\n <th>{{ 'iam.role.name' | translate }}</th>\n <th class=\"hidden md:table-cell\">\n {{ 'shared.description' | translate }}\n </th>\n <th>{{ 'shared.active' | translate }}</th>\n <th class=\"hidden sm:table-cell\">\n {{ 'shared.read.only' | translate }}\n </th>\n <th class=\"w-[120px]\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-role>\n <tr>\n <td>{{ role.name }}</td>\n <td class=\"hidden md:table-cell\">\n {{ role.description ?? '-' }}\n </td>\n <td>\n <f-tag\n [value]=\"\n role.isActive\n ? ('shared.active' | translate)\n : ('shared.inactive' | translate)\n \"\n [severity]=\"role.isActive ? 'success' : 'secondary'\"\n />\n </td>\n <td class=\"hidden sm:table-cell\">\n <f-tag\n [value]=\"\n role.readOnly\n ? ('shared.yes' | translate)\n : ('shared.no' | translate)\n \"\n [severity]=\"role.readOnly ? 'warn' : 'secondary'\"\n />\n </td>\n <td>\n <div class=\"flex gap-1\">\n <button\n fButton\n *hasPermission=\"ROLE_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [disabled]=\"role.readOnly\"\n [fTooltip]=\"'shared.edit' | translate\"\n (click)=\"onEdit(role)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n @if (showRoleUsers()) {\n <button\n fButton\n *hasPermission=\"USER_ROLE_PERMISSIONS.READ\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [fTooltip]=\"'iam.permission.view.users' | translate\"\n (click)=\"onViewUsers(role)\"\n >\n <ui-icon pButtonIcon name=\"users\"></ui-icon>\n </button>\n }\n <button\n fButton\n *hasPermission=\"ROLE_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n [fTooltip]=\"'shared.delete' | translate\"\n [disabled]=\"role.readOnly\"\n (click)=\"onDelete(role)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"5\" class=\"text-center py-4 text-muted-color\">\n {{ 'iam.role.no.roles' | translate }}\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </div>\n\n <flusys-role-permitted-users-dialog\n [visible]=\"permittedUsersDialogVisible()\"\n [role]=\"selectedRole()\"\n (closed)=\"permittedUsersDialogVisible.set(false)\"\n />\n `,\n})\nexport class RoleListPageComponent {\n readonly ROLE_PERMISSIONS = ROLE_PERMISSIONS;\n readonly USER_ROLE_PERMISSIONS = USER_ROLE_PERMISSIONS;\n\n private readonly router = inject(Router);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly companyContext = inject(LAYOUT_AUTH_STATE);\n private readonly roleApi = inject(RoleApiService);\n private readonly messageService = inject(MessageService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly roles = signal<IRole[]>([]);\n readonly isLoading = signal(false);\n readonly total = signal(0);\n readonly pageSize = signal(10);\n readonly first = signal(0);\n private readonly _searchTerm = signal('');\n readonly searchTerm = this._searchTerm.asReadonly();\n readonly showCompanyInfo = computed(\n () => this.appConfig.enableCompanyFeature,\n );\n readonly showRoleUsers = computed(() => {\n const permissionMode = getPermissionMode(this.appConfig);\n return permissionMode === 'rbac' || permissionMode === 'full';\n });\n readonly currentCompanyName = computed(\n () => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME,\n );\n\n readonly permittedUsersDialogVisible = signal(false);\n readonly selectedRole = signal<IRole | null>(null);\n\n private previousCompanyId: string | undefined | null = undefined;\n\n constructor() {\n effect(() => {\n const currentCompanyId =\n this.companyContext.currentCompanyInfo()?.id ?? null;\n if (this.previousCompanyId === undefined) {\n this.previousCompanyId = currentCompanyId;\n return;\n }\n if (this.previousCompanyId === currentCompanyId) return;\n this.previousCompanyId = currentCompanyId;\n untracked(() => {\n this.first.set(0);\n this.loadRoles();\n });\n });\n }\n\n private loadSeq = 0;\n\n private async loadRoles(): Promise<void> {\n const seq = ++this.loadSeq;\n this.isLoading.set(true);\n try {\n const enableCompanyFeature = isCompanyFeatureEnabled(this.appConfig);\n const companyId = enableCompanyFeature\n ? this.companyContext.currentCompanyInfo()?.id || undefined\n : undefined;\n\n const selectFields = [\n 'id',\n 'name',\n 'description',\n 'isActive',\n 'readOnly',\n 'serial',\n 'createdAt',\n 'deletedAt',\n ];\n if (enableCompanyFeature) {\n selectFields.push('companyId');\n }\n\n const response = await this.roleApi.getAll(\n {\n filter: companyId ? { companyId } : undefined,\n pagination: {\n currentPage: Math.floor(this.first() / this.pageSize()),\n pageSize: this.pageSize(),\n },\n select: selectFields,\n sort: { id: 'ASC' },\n },\n this._searchTerm(),\n );\n\n if (seq !== this.loadSeq) return;\n this.roles.set(response?.data ?? []);\n this.total.set(response?.meta?.total ?? 0);\n } catch {\n // Error toast handled by global interceptor\n } finally {\n if (seq === this.loadSeq) this.isLoading.set(false);\n }\n }\n\n onCreate(): void {\n this.router.navigate(['/iam/roles/new']);\n }\n\n onEdit(role: IRole): void {\n this.router.navigate(['/iam/roles', role.id]);\n }\n\n onViewUsers(role: IRole): void {\n this.selectedRole.set(role);\n this.permittedUsersDialogVisible.set(true);\n }\n\n onDelete(role: IRole): void {\n this.confirmationService.confirm({\n message: this.translate('shared.confirm.delete.item', {\n name: role.name,\n }),\n header: this.translate('iam.role.delete.title'),\n icon: 'exclamation-triangle',\n accept: async () => {\n try {\n const response = await this.roleApi.delete({\n id: role.id,\n type: 'permanent',\n });\n\n this.roles.update((list) => list.filter((r) => r.id !== role.id));\n this.total.update((t) => Math.max(0, t - 1));\n\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response?.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : response?.message,\n });\n } catch {\n // Error toast handled by global interceptor\n }\n },\n });\n }\n\n onLazyLoad(event: { first?: number | null; rows?: number | null }): void {\n this.first.set(event.first ?? 0);\n this.pageSize.set(event.rows ?? 10);\n this.loadRoles();\n }\n\n onSearchChange(value: string): void {\n this._searchTerm.set(value);\n this.first.set(0);\n this.loadRoles();\n }\n}\n"],"mappings":"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"}
@@ -21,7 +21,7 @@ var ActionApiService = class ActionApiService extends ApiResourceService {
21
21
  }
22
22
  static ɵfac = i0.ɵɵngDeclareFactory({
23
23
  minVersion: "12.0.0",
24
- version: "22.2.1",
24
+ version: "22.2.2",
25
25
  ngImport: i0,
26
26
  type: ActionApiService,
27
27
  deps: [],
@@ -29,14 +29,14 @@ var ActionApiService = class ActionApiService extends ApiResourceService {
29
29
  });
30
30
  static ɵprov = i0.ɵɵngDeclareService({
31
31
  minVersion: "22.0.0",
32
- version: "22.2.1",
32
+ version: "22.2.2",
33
33
  ngImport: i0,
34
34
  type: ActionApiService
35
35
  });
36
36
  };
37
37
  i0.ɵɵngDeclareClassMetadata({
38
38
  minVersion: "12.0.0",
39
- version: "22.2.1",
39
+ version: "22.2.2",
40
40
  ngImport: i0,
41
41
  type: ActionApiService,
42
42
  decorators: [{ type: Service }],
@@ -107,4 +107,4 @@ function buildActionParentTree(actions, excludeId) {
107
107
  }
108
108
  export { ActionApiService as a, flattenTree as i, buildTreeFromFlat as n, convertActionToTreeNode as r, buildActionParentTree as t };
109
109
 
110
- //# sourceMappingURL=flusys-ng-iam-tree-utils-B1pBG4At.mjs.map
110
+ //# sourceMappingURL=flusys-ng-iam-tree-utils-DglBny_Y.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-iam-tree-utils-B1pBG4At.mjs","names":[],"sources":["../../../projects/ng-iam/services/action-api.service.ts","../../../projects/ng-iam/utils/tree-utils.ts"],"sourcesContent":["import { inject, Service } from '@angular/core';\nimport { APP_CONFIG, getServiceUrl, IAppConfig } from '@flusys/ng-core';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n IAction,\n IActionTreeDto,\n IUpdateActionDto,\n} from '../interfaces/action.interface';\n\n@Service()\nexport class ActionApiService extends ApiResourceService<\n IUpdateActionDto,\n IAction\n> {\n private readonly appConfig = inject<IAppConfig>(APP_CONFIG);\n\n constructor() {\n super('actions', 'iam');\n }\n\n /** Get actions filtered by company whitelist for permission assignment */\n getActionsForPermission(\n companyId?: string,\n ): Observable<ISingleResponse<IActionTreeDto[]>> {\n const iamBaseUrl = getServiceUrl(this.appConfig, 'iam');\n return this.http.post<ISingleResponse<IActionTreeDto[]>>(\n `${iamBaseUrl}/actions/tree-for-permission`,\n { companyId },\n );\n }\n\n /** Get actions in hierarchical tree structure */\n getTree(\n search?: string,\n isActive?: boolean,\n withDeleted?: boolean,\n ): Observable<ISingleResponse<IActionTreeDto[]>> {\n const body: { search?: string; isActive?: boolean; withDeleted?: boolean } =\n {};\n if (search?.trim()) body.search = search.trim();\n if (isActive !== undefined) body.isActive = isActive;\n if (withDeleted !== undefined) body.withDeleted = withDeleted;\n\n const iamBaseUrl = getServiceUrl(this.appConfig, 'iam');\n return this.http.post<ISingleResponse<IActionTreeDto[]>>(\n `${iamBaseUrl}/actions/tree`,\n body,\n );\n }\n}\n","import { IAction, IActionTreeDto } from '../interfaces/action.interface';\nimport { TreeNode } from '@flusys/ng-ui';\n\nexport function flattenTree<T extends { children?: T[] }>(tree: T[]): T[] {\n if (!tree?.length) return [];\n\n const result: T[] = [];\n const flatten = (nodes: T[]): void => {\n for (const node of nodes) {\n result.push(node);\n if (node.children?.length) flatten(node.children);\n }\n };\n flatten(tree);\n return result;\n}\n\nexport function buildTreeFromFlat<\n T extends { id?: string | null; parentId?: string | null },\n>(flatList: T[]): (T & { children: T[] })[] {\n if (!flatList?.length) return [];\n\n const itemMap = new Map<string, T & { children: T[] }>();\n const rootItems: (T & { children: T[] })[] = [];\n\n flatList.forEach((item) => {\n if (item.id) itemMap.set(item.id, { ...item, children: [] });\n });\n\n flatList.forEach((item) => {\n if (!item.id) return;\n const node = itemMap.get(item.id);\n if (!node) return;\n\n if (!item.parentId) {\n rootItems.push(node);\n } else {\n const parent = itemMap.get(item.parentId);\n if (parent) {\n parent.children.push(node);\n } else {\n rootItems.push(node);\n }\n }\n });\n\n return rootItems;\n}\n\nexport function convertActionToTreeNode(\n actions: IActionTreeDto[],\n): TreeNode<IAction>[] {\n if (!actions?.length) return [];\n\n const convert = (action: IActionTreeDto): TreeNode<IAction> => {\n const { children, ...actionData } = action;\n return {\n data: actionData,\n children: children?.map(convert) ?? [],\n leaf: !children?.length,\n expanded: false,\n };\n };\n\n return actions.map(convert);\n}\n\nexport function buildActionParentTree(\n actions: IAction[],\n excludeId?: string | null,\n): TreeNode<IAction>[] {\n const tree = buildTreeFromFlat(actions);\n\n const convert = (\n nodes: (IAction & { children: IAction[] })[],\n ): TreeNode<IAction>[] =>\n nodes\n .filter((node) => node.id !== excludeId)\n .map((node) => {\n const { children, ...data } = node;\n const converted = convert(\n children as (IAction & { children: IAction[] })[],\n );\n return {\n key: node.id,\n label: node.name,\n data,\n children: converted.length ? converted : undefined,\n leaf: converted.length === 0,\n };\n });\n\n return convert(tree);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-iam-tree-utils-DglBny_Y.mjs","names":[],"sources":["../../../projects/ng-iam/services/action-api.service.ts","../../../projects/ng-iam/utils/tree-utils.ts"],"sourcesContent":["import { inject, Service } from '@angular/core';\nimport { APP_CONFIG, getServiceUrl, IAppConfig } from '@flusys/ng-core';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n IAction,\n IActionTreeDto,\n IUpdateActionDto,\n} from '../interfaces/action.interface';\n\n@Service()\nexport class ActionApiService extends ApiResourceService<\n IUpdateActionDto,\n IAction\n> {\n private readonly appConfig = inject<IAppConfig>(APP_CONFIG);\n\n constructor() {\n super('actions', 'iam');\n }\n\n /** Get actions filtered by company whitelist for permission assignment */\n getActionsForPermission(\n companyId?: string,\n ): Observable<ISingleResponse<IActionTreeDto[]>> {\n const iamBaseUrl = getServiceUrl(this.appConfig, 'iam');\n return this.http.post<ISingleResponse<IActionTreeDto[]>>(\n `${iamBaseUrl}/actions/tree-for-permission`,\n { companyId },\n );\n }\n\n /** Get actions in hierarchical tree structure */\n getTree(\n search?: string,\n isActive?: boolean,\n withDeleted?: boolean,\n ): Observable<ISingleResponse<IActionTreeDto[]>> {\n const body: { search?: string; isActive?: boolean; withDeleted?: boolean } =\n {};\n if (search?.trim()) body.search = search.trim();\n if (isActive !== undefined) body.isActive = isActive;\n if (withDeleted !== undefined) body.withDeleted = withDeleted;\n\n const iamBaseUrl = getServiceUrl(this.appConfig, 'iam');\n return this.http.post<ISingleResponse<IActionTreeDto[]>>(\n `${iamBaseUrl}/actions/tree`,\n body,\n );\n }\n}\n","import { IAction, IActionTreeDto } from '../interfaces/action.interface';\nimport { TreeNode } from '@flusys/ng-ui';\n\nexport function flattenTree<T extends { children?: T[] }>(tree: T[]): T[] {\n if (!tree?.length) return [];\n\n const result: T[] = [];\n const flatten = (nodes: T[]): void => {\n for (const node of nodes) {\n result.push(node);\n if (node.children?.length) flatten(node.children);\n }\n };\n flatten(tree);\n return result;\n}\n\nexport function buildTreeFromFlat<\n T extends { id?: string | null; parentId?: string | null },\n>(flatList: T[]): (T & { children: T[] })[] {\n if (!flatList?.length) return [];\n\n const itemMap = new Map<string, T & { children: T[] }>();\n const rootItems: (T & { children: T[] })[] = [];\n\n flatList.forEach((item) => {\n if (item.id) itemMap.set(item.id, { ...item, children: [] });\n });\n\n flatList.forEach((item) => {\n if (!item.id) return;\n const node = itemMap.get(item.id);\n if (!node) return;\n\n if (!item.parentId) {\n rootItems.push(node);\n } else {\n const parent = itemMap.get(item.parentId);\n if (parent) {\n parent.children.push(node);\n } else {\n rootItems.push(node);\n }\n }\n });\n\n return rootItems;\n}\n\nexport function convertActionToTreeNode(\n actions: IActionTreeDto[],\n): TreeNode<IAction>[] {\n if (!actions?.length) return [];\n\n const convert = (action: IActionTreeDto): TreeNode<IAction> => {\n const { children, ...actionData } = action;\n return {\n data: actionData,\n children: children?.map(convert) ?? [],\n leaf: !children?.length,\n expanded: false,\n };\n };\n\n return actions.map(convert);\n}\n\nexport function buildActionParentTree(\n actions: IAction[],\n excludeId?: string | null,\n): TreeNode<IAction>[] {\n const tree = buildTreeFromFlat(actions);\n\n const convert = (\n nodes: (IAction & { children: IAction[] })[],\n ): TreeNode<IAction>[] =>\n nodes\n .filter((node) => node.id !== excludeId)\n .map((node) => {\n const { children, ...data } = node;\n const converted = convert(\n children as (IAction & { children: IAction[] })[],\n );\n return {\n key: node.id,\n label: node.name,\n data,\n children: converted.length ? converted : undefined,\n leaf: converted.length === 0,\n };\n });\n\n return convert(tree);\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { t as RoleApiService } from "./flusys-ng-iam-role-api.service-OwPgmSFc.mjs";
2
- import { a as ActionApiService, i as flattenTree, n as buildTreeFromFlat, r as convertActionToTreeNode } from "./flusys-ng-iam-tree-utils-B1pBG4At.mjs";
3
- import { t as PermissionApiService } from "./flusys-ng-iam-permission-api.service-C7-Yxvz8.mjs";
1
+ import { t as RoleApiService } from "./flusys-ng-iam-role-api.service-DVnfR0C1.mjs";
2
+ import { a as ActionApiService, i as flattenTree, n as buildTreeFromFlat, r as convertActionToTreeNode } from "./flusys-ng-iam-tree-utils-DglBny_Y.mjs";
3
+ import { t as PermissionApiService } from "./flusys-ng-iam-permission-api.service-ls0J1lec.mjs";
4
4
  import * as i0 from "@angular/core";
5
5
  import { Component, DestroyRef, Service, computed, effect, inject, signal, untracked, viewChild } from "@angular/core";
6
6
  import { COMPANY_ACTION_PERMISSIONS, COMPANY_API_PROVIDER, HasPermissionDirective, ROLE_ACTION_PERMISSIONS, TranslatePipe, TranslateService, USER_ACTION_PERMISSIONS, USER_PERMISSION_PROVIDER, USER_ROLE_PERMISSIONS, UserSelectComponent, buildBranchTreeNodes } from "@flusys/ng-shared";
@@ -406,7 +406,7 @@ var ActionPermissionLogicService = class ActionPermissionLogicService {
406
406
  }
407
407
  static ɵfac = i0.ɵɵngDeclareFactory({
408
408
  minVersion: "12.0.0",
409
- version: "22.2.1",
409
+ version: "22.2.2",
410
410
  ngImport: i0,
411
411
  type: ActionPermissionLogicService,
412
412
  deps: [],
@@ -414,14 +414,14 @@ var ActionPermissionLogicService = class ActionPermissionLogicService {
414
414
  });
415
415
  static ɵprov = i0.ɵɵngDeclareService({
416
416
  minVersion: "22.0.0",
417
- version: "22.2.1",
417
+ version: "22.2.2",
418
418
  ngImport: i0,
419
419
  type: ActionPermissionLogicService
420
420
  });
421
421
  };
422
422
  i0.ɵɵngDeclareClassMetadata({
423
423
  minVersion: "12.0.0",
424
- version: "22.2.1",
424
+ version: "22.2.2",
425
425
  ngImport: i0,
426
426
  type: ActionPermissionLogicService,
427
427
  decorators: [{ type: Service }]
@@ -632,7 +632,7 @@ var RoleActionSelectorComponent = class RoleActionSelectorComponent extends Base
632
632
  }
633
633
  static ɵfac = i0.ɵɵngDeclareFactory({
634
634
  minVersion: "12.0.0",
635
- version: "22.2.1",
635
+ version: "22.2.2",
636
636
  ngImport: i0,
637
637
  type: RoleActionSelectorComponent,
638
638
  deps: [],
@@ -640,7 +640,7 @@ var RoleActionSelectorComponent = class RoleActionSelectorComponent extends Base
640
640
  });
641
641
  static ɵcmp = i0.ɵɵngDeclareComponent({
642
642
  minVersion: "17.0.0",
643
- version: "22.2.1",
643
+ version: "22.2.2",
644
644
  type: RoleActionSelectorComponent,
645
645
  isStandalone: true,
646
646
  selector: "flusys-role-action-selector",
@@ -1175,7 +1175,7 @@ var RoleActionSelectorComponent = class RoleActionSelectorComponent extends Base
1175
1175
  };
1176
1176
  i0.ɵɵngDeclareClassMetadata({
1177
1177
  minVersion: "12.0.0",
1178
- version: "22.2.1",
1178
+ version: "22.2.2",
1179
1179
  ngImport: i0,
1180
1180
  type: RoleActionSelectorComponent,
1181
1181
  decorators: [{
@@ -1617,7 +1617,7 @@ var CompanyActionSelectorComponent = class CompanyActionSelectorComponent extend
1617
1617
  }
1618
1618
  static ɵfac = i0.ɵɵngDeclareFactory({
1619
1619
  minVersion: "12.0.0",
1620
- version: "22.2.1",
1620
+ version: "22.2.2",
1621
1621
  ngImport: i0,
1622
1622
  type: CompanyActionSelectorComponent,
1623
1623
  deps: [],
@@ -1625,7 +1625,7 @@ var CompanyActionSelectorComponent = class CompanyActionSelectorComponent extend
1625
1625
  });
1626
1626
  static ɵcmp = i0.ɵɵngDeclareComponent({
1627
1627
  minVersion: "17.0.0",
1628
- version: "22.2.1",
1628
+ version: "22.2.2",
1629
1629
  type: CompanyActionSelectorComponent,
1630
1630
  isStandalone: true,
1631
1631
  selector: "flusys-company-action-selector",
@@ -2153,7 +2153,7 @@ var CompanyActionSelectorComponent = class CompanyActionSelectorComponent extend
2153
2153
  };
2154
2154
  i0.ɵɵngDeclareClassMetadata({
2155
2155
  minVersion: "12.0.0",
2156
- version: "22.2.1",
2156
+ version: "22.2.2",
2157
2157
  ngImport: i0,
2158
2158
  type: CompanyActionSelectorComponent,
2159
2159
  decorators: [{
@@ -2669,7 +2669,7 @@ var UserRoleSelectorComponent = class UserRoleSelectorComponent {
2669
2669
  }
2670
2670
  static ɵfac = i0.ɵɵngDeclareFactory({
2671
2671
  minVersion: "12.0.0",
2672
- version: "22.2.1",
2672
+ version: "22.2.2",
2673
2673
  ngImport: i0,
2674
2674
  type: UserRoleSelectorComponent,
2675
2675
  deps: [],
@@ -2677,7 +2677,7 @@ var UserRoleSelectorComponent = class UserRoleSelectorComponent {
2677
2677
  });
2678
2678
  static ɵcmp = i0.ɵɵngDeclareComponent({
2679
2679
  minVersion: "17.0.0",
2680
- version: "22.2.1",
2680
+ version: "22.2.2",
2681
2681
  type: UserRoleSelectorComponent,
2682
2682
  isStandalone: true,
2683
2683
  selector: "flusys-user-role-selector",
@@ -3165,7 +3165,7 @@ var UserRoleSelectorComponent = class UserRoleSelectorComponent {
3165
3165
  };
3166
3166
  i0.ɵɵngDeclareClassMetadata({
3167
3167
  minVersion: "12.0.0",
3168
- version: "22.2.1",
3168
+ version: "22.2.2",
3169
3169
  ngImport: i0,
3170
3170
  type: UserRoleSelectorComponent,
3171
3171
  decorators: [{
@@ -3635,7 +3635,7 @@ var UserActionSelectorComponent = class UserActionSelectorComponent extends Base
3635
3635
  }
3636
3636
  static ɵfac = i0.ɵɵngDeclareFactory({
3637
3637
  minVersion: "12.0.0",
3638
- version: "22.2.1",
3638
+ version: "22.2.2",
3639
3639
  ngImport: i0,
3640
3640
  type: UserActionSelectorComponent,
3641
3641
  deps: [],
@@ -3643,7 +3643,7 @@ var UserActionSelectorComponent = class UserActionSelectorComponent extends Base
3643
3643
  });
3644
3644
  static ɵcmp = i0.ɵɵngDeclareComponent({
3645
3645
  minVersion: "17.0.0",
3646
- version: "22.2.1",
3646
+ version: "22.2.2",
3647
3647
  type: UserActionSelectorComponent,
3648
3648
  isStandalone: true,
3649
3649
  selector: "flusys-user-action-selector",
@@ -4254,7 +4254,7 @@ var UserActionSelectorComponent = class UserActionSelectorComponent extends Base
4254
4254
  };
4255
4255
  i0.ɵɵngDeclareClassMetadata({
4256
4256
  minVersion: "12.0.0",
4257
- version: "22.2.1",
4257
+ version: "22.2.2",
4258
4258
  ngImport: i0,
4259
4259
  type: UserActionSelectorComponent,
4260
4260
  decorators: [{
@@ -4604,4 +4604,4 @@ i0.ɵɵngDeclareClassMetadata({
4604
4604
  });
4605
4605
  export { ActionPermissionLogicService as a, RoleActionSelectorComponent as i, UserRoleSelectorComponent as n, MAX_DROPDOWN_ITEMS as o, CompanyActionSelectorComponent as r, UserActionSelectorComponent as t };
4606
4606
 
4607
- //# sourceMappingURL=flusys-ng-iam-user-action-selector.component-2wdl9Ci6.mjs.map
4607
+ //# sourceMappingURL=flusys-ng-iam-user-action-selector.component-D-vsK7Oz.mjs.map