@flusys/ng-iam 8.1.2 → 8.1.4

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 (18) hide show
  1. package/fesm2022/{flusys-ng-iam-action-form-page.component-DunIW6W4.mjs → flusys-ng-iam-action-form-page.component-i3FPyBR7.mjs} +3 -3
  2. package/fesm2022/{flusys-ng-iam-action-form-page.component-DunIW6W4.mjs.map → flusys-ng-iam-action-form-page.component-i3FPyBR7.mjs.map} +1 -1
  3. package/fesm2022/{flusys-ng-iam-action-list-page.component-CgoLgAqd.mjs → flusys-ng-iam-action-list-page.component-CLCylls2.mjs} +4 -8
  4. package/fesm2022/flusys-ng-iam-action-list-page.component-CLCylls2.mjs.map +1 -0
  5. package/fesm2022/{flusys-ng-iam-flusys-ng-iam-CJC610eS.mjs → flusys-ng-iam-flusys-ng-iam-BhRNGNaD.mjs} +165 -23
  6. package/fesm2022/flusys-ng-iam-flusys-ng-iam-BhRNGNaD.mjs.map +1 -0
  7. package/fesm2022/{flusys-ng-iam-permission-page.component-y86NW53S.mjs → flusys-ng-iam-permission-page.component-zQgYqLfE.mjs} +2 -2
  8. package/fesm2022/{flusys-ng-iam-permission-page.component-y86NW53S.mjs.map → flusys-ng-iam-permission-page.component-zQgYqLfE.mjs.map} +1 -1
  9. package/fesm2022/{flusys-ng-iam-role-form-page.component-H3qpNn3J.mjs → flusys-ng-iam-role-form-page.component-BcfbKeAt.mjs} +2 -2
  10. package/fesm2022/{flusys-ng-iam-role-form-page.component-H3qpNn3J.mjs.map → flusys-ng-iam-role-form-page.component-BcfbKeAt.mjs.map} +1 -1
  11. package/fesm2022/{flusys-ng-iam-role-list-page.component-BoKQbhu5.mjs → flusys-ng-iam-role-list-page.component-DyOesI24.mjs} +4 -8
  12. package/fesm2022/flusys-ng-iam-role-list-page.component-DyOesI24.mjs.map +1 -0
  13. package/fesm2022/flusys-ng-iam.mjs +1 -1
  14. package/package.json +5 -5
  15. package/types/flusys-ng-iam.d.ts +64 -6
  16. package/fesm2022/flusys-ng-iam-action-list-page.component-CgoLgAqd.mjs.map +0 -1
  17. package/fesm2022/flusys-ng-iam-flusys-ng-iam-CJC610eS.mjs.map +0 -1
  18. package/fesm2022/flusys-ng-iam-role-list-page.component-BoKQbhu5.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Service, inject, signal, input, output, effect, Component, computed, DestroyRef, viewChild } from '@angular/core';
3
- import { ApiResourceService, TranslateService, PermissionValidatorService, TranslatePipe, ROLE_ACTION_PERMISSIONS, HasPermissionDirective, COMPANY_ACTION_PERMISSIONS, COMPANY_API_PROVIDER, USER_ROLE_PERMISSIONS, USER_PERMISSION_PROVIDER, UserSelectComponent, USER_ACTION_PERMISSIONS, USER_PROVIDER, PROFILE_PERMISSION_PROVIDER, ACTION_PERMISSIONS, ROLE_PERMISSIONS, permissionGuard, anyPermissionGuard, resolveTranslationModule, SHARED_MESSAGES } from '@flusys/ng-shared';
3
+ import { ApiResourceService, TranslateService, PermissionValidatorService, COMPANY_API_PROVIDER, TranslatePipe, ROLE_ACTION_PERMISSIONS, HasPermissionDirective, COMPANY_ACTION_PERMISSIONS, USER_ROLE_PERMISSIONS, USER_PERMISSION_PROVIDER, UserSelectComponent, USER_ACTION_PERMISSIONS, USER_PROVIDER, PROFILE_PERMISSION_PROVIDER, ACTION_PERMISSIONS, ROLE_PERMISSIONS, permissionGuard, anyPermissionGuard, resolveTranslationModule, SHARED_MESSAGES } from '@flusys/ng-shared';
4
4
  import { APP_CONFIG, getServiceUrl, BaseApiService, isCompanyFeatureEnabled, getPermissionMode } from '@flusys/ng-core';
5
5
  import { ConfirmationService, MessageService, FButtonDirective, SelectComponent, TooltipDirective, UiIconComponent, CheckboxComponent, TagComponent, TreeTableComponent, TreeTableTogglerComponent, TableComponent, DialogComponent, ProgressSpinnerComponent } from '@flusys/ng-ui';
6
6
  import { HttpClient } from '@angular/common/http';
@@ -89,6 +89,9 @@ const IAM_MESSAGES = {
89
89
  'iam.permission.remove': 'Remove Access',
90
90
  'iam.permission.remove.confirm': 'Remove access for {{name}}?',
91
91
  'iam.action.delete.title': 'Delete Action',
92
+ 'iam.company.name': 'Company',
93
+ 'iam.branch.name': 'Branch',
94
+ 'iam.branch.all': 'All branches',
92
95
  // pages/action/action-form-page.component.ts
93
96
  'iam.action.edit': 'Edit Action',
94
97
  'iam.action.name.placeholder': 'Enter action name',
@@ -924,6 +927,51 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
924
927
  type: Service
925
928
  }] });
926
929
 
930
+ /**
931
+ * Shared resolver for the company/branch display info behind an IAM permission
932
+ * grant's scope (`companyId`/`branchId`). Used by the read-only permitted-users
933
+ * dialogs (action and role) to turn scope IDs into display names.
934
+ *
935
+ * Since IAM stays independent of the auth package, company/branch info is
936
+ * resolved via the `COMPANY_API_PROVIDER` injection token rather than a direct
937
+ * join. Both `getCompaniesByIds`/`getBranchesByIds` are optional on
938
+ * `ICompanyApiProvider`, and provider errors are swallowed — callers always get
939
+ * a `Map` (empty when ids are empty, the provider doesn't implement the
940
+ * method, or the request fails) and fall back to displaying the raw ID.
941
+ */
942
+ class PermissionScopeResolverService {
943
+ companyProvider = inject(COMPANY_API_PROVIDER);
944
+ async resolveCompanyInfo(companyIds) {
945
+ if (companyIds.length === 0 || !this.companyProvider.getCompaniesByIds) {
946
+ return new Map();
947
+ }
948
+ try {
949
+ const response = await firstValueFrom(this.companyProvider.getCompaniesByIds(companyIds));
950
+ return new Map((response.data ?? []).map((c) => [c.id, c]));
951
+ }
952
+ catch {
953
+ return new Map();
954
+ }
955
+ }
956
+ async resolveBranchInfo(branchIds) {
957
+ if (branchIds.length === 0 || !this.companyProvider.getBranchesByIds) {
958
+ return new Map();
959
+ }
960
+ try {
961
+ const response = await firstValueFrom(this.companyProvider.getBranchesByIds(branchIds));
962
+ return new Map((response.data ?? []).map((b) => [b.id, b]));
963
+ }
964
+ catch {
965
+ return new Map();
966
+ }
967
+ }
968
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: PermissionScopeResolverService, deps: [], target: i0.ɵɵFactoryTarget.Service });
969
+ static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.1.5", ngImport: i0, type: PermissionScopeResolverService });
970
+ }
971
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: PermissionScopeResolverService, decorators: [{
972
+ type: Service
973
+ }] });
974
+
927
975
  // Role services
928
976
 
929
977
  function toLogicNode(node) {
@@ -1193,7 +1241,7 @@ class LogicBuilderComponent {
1193
1241
  }
1194
1242
  </div>
1195
1243
  </ng-template>
1196
- `, 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(.app-dark) .node-type.group{background-color:#3b82f633;color:var(--f-blue-400, #60a5fa)}:host-context(.app-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(.app-dark) .operator-badge.and{background-color:#eab30833;color:var(--f-yellow-400, #facc15)}:host-context(.app-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(.app-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: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "directive", type: TooltipDirective, selector: "[fTooltip]", inputs: ["fTooltip", "tooltipPosition", "positionStyle", "tooltipStyleClass", "disabled", "tooltipEvent", "showDelay", "hideDelay", "life", "autoHide", "positionTop", "positionLeft", "escape"] }, { kind: "component", type: UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
1244
+ `, 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(.app-dark) .node-type.group{background-color:#3b82f633;color:var(--f-blue-400, #60a5fa)}:host-context(.app-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(.app-dark) .operator-badge.and{background-color:#eab30833;color:var(--f-yellow-400, #facc15)}:host-context(.app-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(.app-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: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy", "selectedObject"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "directive", type: TooltipDirective, selector: "[fTooltip]", inputs: ["fTooltip", "tooltipPosition", "positionStyle", "tooltipStyleClass", "disabled", "tooltipEvent", "showDelay", "hideDelay", "life", "autoHide", "positionTop", "positionLeft", "escape"] }, { kind: "component", type: UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
1197
1245
  }
1198
1246
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: LogicBuilderComponent, decorators: [{
1199
1247
  type: Component,
@@ -1979,7 +2027,7 @@ class RoleActionSelectorComponent extends BaseActionSelectorComponent {
1979
2027
  }
1980
2028
  }
1981
2029
  </div>
1982
- `, isInline: true, styles: [":host{display:block}.empty-state-icon{width:3rem;height:3rem;border-radius:9999px;display:flex;align-items:center;justify-content:center;background-color:var(--f-primary-50, rgba(59, 130, 246, .08))}:host-context(.app-dark) .empty-state-icon{background-color:#60a5fa1f}.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(.app-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(.app-dark) ::ng-deep tr.highlight-warning{background-color:#ef444426!important}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "readonly", "inputId", "invalid", "indeterminate", "variant", "size", "touched", "styleClass", "style", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "directive", type: FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "component", type: TagComponent, selector: "f-tag", inputs: ["value", "severity", "icon", "rounded", "color", "styleClass", "style"] }, { kind: "directive", type: TooltipDirective, selector: "[fTooltip]", inputs: ["fTooltip", "tooltipPosition", "positionStyle", "tooltipStyleClass", "disabled", "tooltipEvent", "showDelay", "hideDelay", "life", "autoHide", "positionTop", "positionLeft", "escape"] }, { kind: "component", type: TreeTableComponent, selector: "f-treetable", inputs: ["value", "loading", "dataKey", "styleClass", "tableStyle", "scrollable", "scrollHeight", "resizableColumns", "lazy", "totalRecords", "paginator", "first", "rows", "rowsPerPageOptions", "showCurrentPageReport", "currentPageReportTemplate", "globalFilterFields", "filterDelay", "selectionMode", "sortMode", "virtualScroll", "virtualScrollItemSize", "sortField", "sortOrder", "multiSortMeta", "filters", "selection", "contextMenuSelection"], outputs: ["sortFieldChange", "sortOrderChange", "multiSortMetaChange", "filtersChange", "selectionChange", "contextMenuSelectionChange", "onLazyLoad", "onSort", "onFilter", "onNodeExpand", "onNodeCollapse", "onNodeSelect", "onNodeUnselect", "onRowContextMenu"] }, { kind: "component", type: TreeTableTogglerComponent, selector: "f-treetabletoggler", inputs: ["rowNode"] }, { kind: "component", type: UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "directive", type: HasPermissionDirective, selector: "[hasPermission]", inputs: ["hasPermission"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
2030
+ `, isInline: true, styles: [":host{display:block}.empty-state-icon{width:3rem;height:3rem;border-radius:9999px;display:flex;align-items:center;justify-content:center;background-color:var(--f-primary-50, rgba(59, 130, 246, .08))}:host-context(.app-dark) .empty-state-icon{background-color:#60a5fa1f}.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(.app-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(.app-dark) ::ng-deep tr.highlight-warning{background-color:#ef444426!important}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "readonly", "inputId", "invalid", "indeterminate", "variant", "size", "touched", "styleClass", "style", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "directive", type: FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy", "selectedObject"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "component", type: TagComponent, selector: "f-tag", inputs: ["value", "severity", "icon", "rounded", "color", "styleClass", "style"] }, { kind: "directive", type: TooltipDirective, selector: "[fTooltip]", inputs: ["fTooltip", "tooltipPosition", "positionStyle", "tooltipStyleClass", "disabled", "tooltipEvent", "showDelay", "hideDelay", "life", "autoHide", "positionTop", "positionLeft", "escape"] }, { kind: "component", type: TreeTableComponent, selector: "f-treetable", inputs: ["value", "loading", "dataKey", "styleClass", "tableStyle", "scrollable", "scrollHeight", "resizableColumns", "lazy", "totalRecords", "paginator", "first", "rows", "rowsPerPageOptions", "showCurrentPageReport", "currentPageReportTemplate", "globalFilterFields", "filterDelay", "selectionMode", "sortMode", "virtualScroll", "virtualScrollItemSize", "sortField", "sortOrder", "multiSortMeta", "filters", "selection", "contextMenuSelection"], outputs: ["sortFieldChange", "sortOrderChange", "multiSortMetaChange", "filtersChange", "selectionChange", "contextMenuSelectionChange", "onLazyLoad", "onSort", "onFilter", "onNodeExpand", "onNodeCollapse", "onNodeSelect", "onNodeUnselect", "onRowContextMenu"] }, { kind: "component", type: TreeTableTogglerComponent, selector: "f-treetabletoggler", inputs: ["rowNode"] }, { kind: "component", type: UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "directive", type: HasPermissionDirective, selector: "[hasPermission]", inputs: ["hasPermission"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
1983
2031
  }
1984
2032
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RoleActionSelectorComponent, decorators: [{
1985
2033
  type: Component,
@@ -2701,7 +2749,7 @@ class CompanyActionSelectorComponent extends BaseActionSelectorComponent {
2701
2749
  }
2702
2750
  }
2703
2751
  </div>
2704
- `, isInline: true, styles: [":host{display:block}.empty-state-icon{width:3rem;height:3rem;border-radius:9999px;display:flex;align-items:center;justify-content:center;background-color:var(--f-primary-50, rgba(59, 130, 246, .08))}:host-context(.app-dark) .empty-state-icon{background-color:#60a5fa1f}.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(.app-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(.app-dark) ::ng-deep tr.highlight-warning{background-color:#ef444426!important}\n"], dependencies: [{ kind: "component", type: CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "readonly", "inputId", "invalid", "indeterminate", "variant", "size", "touched", "styleClass", "style", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "directive", type: FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "component", type: TagComponent, selector: "f-tag", inputs: ["value", "severity", "icon", "rounded", "color", "styleClass", "style"] }, { kind: "directive", type: TooltipDirective, selector: "[fTooltip]", inputs: ["fTooltip", "tooltipPosition", "positionStyle", "tooltipStyleClass", "disabled", "tooltipEvent", "showDelay", "hideDelay", "life", "autoHide", "positionTop", "positionLeft", "escape"] }, { kind: "component", type: TreeTableComponent, selector: "f-treetable", inputs: ["value", "loading", "dataKey", "styleClass", "tableStyle", "scrollable", "scrollHeight", "resizableColumns", "lazy", "totalRecords", "paginator", "first", "rows", "rowsPerPageOptions", "showCurrentPageReport", "currentPageReportTemplate", "globalFilterFields", "filterDelay", "selectionMode", "sortMode", "virtualScroll", "virtualScrollItemSize", "sortField", "sortOrder", "multiSortMeta", "filters", "selection", "contextMenuSelection"], outputs: ["sortFieldChange", "sortOrderChange", "multiSortMetaChange", "filtersChange", "selectionChange", "contextMenuSelectionChange", "onLazyLoad", "onSort", "onFilter", "onNodeExpand", "onNodeCollapse", "onNodeSelect", "onNodeUnselect", "onRowContextMenu"] }, { kind: "component", type: TreeTableTogglerComponent, selector: "f-treetabletoggler", inputs: ["rowNode"] }, { kind: "component", type: UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.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" }] });
2752
+ `, isInline: true, styles: [":host{display:block}.empty-state-icon{width:3rem;height:3rem;border-radius:9999px;display:flex;align-items:center;justify-content:center;background-color:var(--f-primary-50, rgba(59, 130, 246, .08))}:host-context(.app-dark) .empty-state-icon{background-color:#60a5fa1f}.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(.app-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(.app-dark) ::ng-deep tr.highlight-warning{background-color:#ef444426!important}\n"], dependencies: [{ kind: "component", type: CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "readonly", "inputId", "invalid", "indeterminate", "variant", "size", "touched", "styleClass", "style", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "directive", type: FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy", "selectedObject"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "component", type: TagComponent, selector: "f-tag", inputs: ["value", "severity", "icon", "rounded", "color", "styleClass", "style"] }, { kind: "directive", type: TooltipDirective, selector: "[fTooltip]", inputs: ["fTooltip", "tooltipPosition", "positionStyle", "tooltipStyleClass", "disabled", "tooltipEvent", "showDelay", "hideDelay", "life", "autoHide", "positionTop", "positionLeft", "escape"] }, { kind: "component", type: TreeTableComponent, selector: "f-treetable", inputs: ["value", "loading", "dataKey", "styleClass", "tableStyle", "scrollable", "scrollHeight", "resizableColumns", "lazy", "totalRecords", "paginator", "first", "rows", "rowsPerPageOptions", "showCurrentPageReport", "currentPageReportTemplate", "globalFilterFields", "filterDelay", "selectionMode", "sortMode", "virtualScroll", "virtualScrollItemSize", "sortField", "sortOrder", "multiSortMeta", "filters", "selection", "contextMenuSelection"], outputs: ["sortFieldChange", "sortOrderChange", "multiSortMetaChange", "filtersChange", "selectionChange", "contextMenuSelectionChange", "onLazyLoad", "onSort", "onFilter", "onNodeExpand", "onNodeCollapse", "onNodeSelect", "onNodeUnselect", "onRowContextMenu"] }, { kind: "component", type: TreeTableTogglerComponent, selector: "f-treetabletoggler", inputs: ["rowNode"] }, { kind: "component", type: UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.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" }] });
2705
2753
  }
2706
2754
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: CompanyActionSelectorComponent, decorators: [{
2707
2755
  type: Component,
@@ -3521,7 +3569,7 @@ class UserRoleSelectorComponent {
3521
3569
  }
3522
3570
  }
3523
3571
  </div>
3524
- `, isInline: true, styles: [":host{display:block}.empty-state-icon{width:3rem;height:3rem;border-radius:9999px;display:flex;align-items:center;justify-content:center;background-color:var(--f-primary-50, rgba(59, 130, 246, .08))}:host-context(.app-dark) .empty-state-icon{background-color:#60a5fa1f}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "readonly", "inputId", "invalid", "indeterminate", "variant", "size", "touched", "styleClass", "style", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "directive", type: FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "component", type: TableComponent, selector: "f-table", inputs: ["value", "lazy", "loading", "rows", "totalRecords", "rowHover", "dataKey", "scrollable", "scrollHeight", "paginator", "first", "rowsPerPageOptions", "showCurrentPageReport", "currentPageReportTemplate", "tableStyle", "styleClass", "globalFilterFields", "filterDelay", "responsiveLayout", "selectionMode", "sortMode", "rowExpandMode", "resizableColumns", "rowStyleClass", "virtualScroll", "virtualScrollItemSize", "sortField", "sortOrder", "multiSortMeta", "filters", "selection", "expandedRowKeys", "contextMenuSelection"], outputs: ["sortFieldChange", "sortOrderChange", "multiSortMetaChange", "filtersChange", "selectionChange", "expandedRowKeysChange", "contextMenuSelectionChange", "onLazyLoad", "onSort", "onFilter", "onRowSelect", "onRowUnselect", "onSelectAllChange", "onRowExpand", "onRowCollapse", "onColResize", "onRowContextMenu"] }, { kind: "directive", type: TooltipDirective, selector: "[fTooltip]", inputs: ["fTooltip", "tooltipPosition", "positionStyle", "tooltipStyleClass", "disabled", "tooltipEvent", "showDelay", "hideDelay", "life", "autoHide", "positionTop", "positionLeft", "escape"] }, { kind: "component", type: UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { 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" }] });
3572
+ `, isInline: true, styles: [":host{display:block}.empty-state-icon{width:3rem;height:3rem;border-radius:9999px;display:flex;align-items:center;justify-content:center;background-color:var(--f-primary-50, rgba(59, 130, 246, .08))}:host-context(.app-dark) .empty-state-icon{background-color:#60a5fa1f}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "readonly", "inputId", "invalid", "indeterminate", "variant", "size", "touched", "styleClass", "style", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "directive", type: FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy", "selectedObject"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "component", type: TableComponent, selector: "f-table", inputs: ["value", "lazy", "loading", "rows", "totalRecords", "rowHover", "dataKey", "scrollable", "scrollHeight", "paginator", "first", "rowsPerPageOptions", "showCurrentPageReport", "currentPageReportTemplate", "tableStyle", "styleClass", "globalFilterFields", "filterDelay", "responsiveLayout", "selectionMode", "sortMode", "rowExpandMode", "resizableColumns", "rowStyleClass", "virtualScroll", "virtualScrollItemSize", "sortField", "sortOrder", "multiSortMeta", "filters", "selection", "expandedRowKeys", "contextMenuSelection"], outputs: ["sortFieldChange", "sortOrderChange", "multiSortMetaChange", "filtersChange", "selectionChange", "expandedRowKeysChange", "contextMenuSelectionChange", "onLazyLoad", "onSort", "onFilter", "onRowSelect", "onRowUnselect", "onSelectAllChange", "onRowExpand", "onRowCollapse", "onColResize", "onRowContextMenu"] }, { kind: "directive", type: TooltipDirective, selector: "[fTooltip]", inputs: ["fTooltip", "tooltipPosition", "positionStyle", "tooltipStyleClass", "disabled", "tooltipEvent", "showDelay", "hideDelay", "life", "autoHide", "positionTop", "positionLeft", "escape"] }, { kind: "component", type: UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { 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" }] });
3525
3573
  }
3526
3574
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UserRoleSelectorComponent, decorators: [{
3527
3575
  type: Component,
@@ -4358,7 +4406,7 @@ class UserActionSelectorComponent extends BaseActionSelectorComponent {
4358
4406
  }
4359
4407
  }
4360
4408
  </div>
4361
- `, isInline: true, styles: [":host{display:block}.empty-state-icon{width:3rem;height:3rem;border-radius:9999px;display:flex;align-items:center;justify-content:center;background-color:var(--f-primary-50, rgba(59, 130, 246, .08))}:host-context(.app-dark) .empty-state-icon{background-color:#60a5fa1f}.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(.app-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(.app-dark) ::ng-deep tr.highlight-warning{background-color:#ef444426!important}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "readonly", "inputId", "invalid", "indeterminate", "variant", "size", "touched", "styleClass", "style", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "directive", type: FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "component", type: TagComponent, selector: "f-tag", inputs: ["value", "severity", "icon", "rounded", "color", "styleClass", "style"] }, { kind: "directive", type: TooltipDirective, selector: "[fTooltip]", inputs: ["fTooltip", "tooltipPosition", "positionStyle", "tooltipStyleClass", "disabled", "tooltipEvent", "showDelay", "hideDelay", "life", "autoHide", "positionTop", "positionLeft", "escape"] }, { kind: "component", type: TreeTableComponent, selector: "f-treetable", inputs: ["value", "loading", "dataKey", "styleClass", "tableStyle", "scrollable", "scrollHeight", "resizableColumns", "lazy", "totalRecords", "paginator", "first", "rows", "rowsPerPageOptions", "showCurrentPageReport", "currentPageReportTemplate", "globalFilterFields", "filterDelay", "selectionMode", "sortMode", "virtualScroll", "virtualScrollItemSize", "sortField", "sortOrder", "multiSortMeta", "filters", "selection", "contextMenuSelection"], outputs: ["sortFieldChange", "sortOrderChange", "multiSortMetaChange", "filtersChange", "selectionChange", "contextMenuSelectionChange", "onLazyLoad", "onSort", "onFilter", "onNodeExpand", "onNodeCollapse", "onNodeSelect", "onNodeUnselect", "onRowContextMenu"] }, { kind: "component", type: TreeTableTogglerComponent, selector: "f-treetabletoggler", inputs: ["rowNode"] }, { kind: "component", type: UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { 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" }] });
4409
+ `, isInline: true, styles: [":host{display:block}.empty-state-icon{width:3rem;height:3rem;border-radius:9999px;display:flex;align-items:center;justify-content:center;background-color:var(--f-primary-50, rgba(59, 130, 246, .08))}:host-context(.app-dark) .empty-state-icon{background-color:#60a5fa1f}.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(.app-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(.app-dark) ::ng-deep tr.highlight-warning{background-color:#ef444426!important}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "readonly", "inputId", "invalid", "indeterminate", "variant", "size", "touched", "styleClass", "style", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "directive", type: FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy", "selectedObject"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "component", type: TagComponent, selector: "f-tag", inputs: ["value", "severity", "icon", "rounded", "color", "styleClass", "style"] }, { kind: "directive", type: TooltipDirective, selector: "[fTooltip]", inputs: ["fTooltip", "tooltipPosition", "positionStyle", "tooltipStyleClass", "disabled", "tooltipEvent", "showDelay", "hideDelay", "life", "autoHide", "positionTop", "positionLeft", "escape"] }, { kind: "component", type: TreeTableComponent, selector: "f-treetable", inputs: ["value", "loading", "dataKey", "styleClass", "tableStyle", "scrollable", "scrollHeight", "resizableColumns", "lazy", "totalRecords", "paginator", "first", "rows", "rowsPerPageOptions", "showCurrentPageReport", "currentPageReportTemplate", "globalFilterFields", "filterDelay", "selectionMode", "sortMode", "virtualScroll", "virtualScrollItemSize", "sortField", "sortOrder", "multiSortMeta", "filters", "selection", "contextMenuSelection"], outputs: ["sortFieldChange", "sortOrderChange", "multiSortMetaChange", "filtersChange", "selectionChange", "contextMenuSelectionChange", "onLazyLoad", "onSort", "onFilter", "onNodeExpand", "onNodeCollapse", "onNodeSelect", "onNodeUnselect", "onRowContextMenu"] }, { kind: "component", type: TreeTableTogglerComponent, selector: "f-treetabletoggler", inputs: ["rowNode"] }, { kind: "component", type: UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { 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" }] });
4362
4410
  }
4363
4411
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UserActionSelectorComponent, decorators: [{
4364
4412
  type: Component,
@@ -4714,13 +4762,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
4714
4762
  * per user. Assigning new users stays on the user-centric
4715
4763
  * `UserRoleSelectorComponent` flow — this dialog intentionally has no "add"
4716
4764
  * affordance. Since IAM stays independent of the auth package, user display
4717
- * info is resolved via the `USER_PROVIDER` injection token rather than a
4718
- * direct join.
4765
+ * info is resolved via the `USER_PROVIDER` injection token, and
4766
+ * company/branch display info via the shared `PermissionScopeResolverService`
4767
+ * (itself backed by `COMPANY_API_PROVIDER`) rather than a direct join.
4768
+ *
4769
+ * `Role` assignments are global (never scoped to a single company), so the
4770
+ * same user can hold several grants for the same role — one per
4771
+ * company/branch scope (company+branch null = global, branch null = whole
4772
+ * company, both set = a single branch). The company/branch lines are shown
4773
+ * only when at least one returned grant carries a `companyId` (i.e. the
4774
+ * multi-company feature is enabled) — otherwise they're omitted to avoid a
4775
+ * redundant "-" column. Removal is scoped to the exact row's
4776
+ * `companyId`/`branchId`, not just the user+role pair, since a user can
4777
+ * have multiple grants for the same role at different scopes.
4719
4778
  */
4720
4779
  class RolePermittedUsersDialogComponent {
4721
4780
  USER_ROLE_PERMISSIONS = USER_ROLE_PERMISSIONS;
4722
4781
  permissionApi = inject(PermissionApiService);
4723
4782
  userProvider = inject(USER_PROVIDER);
4783
+ scopeResolver = inject(PermissionScopeResolverService);
4724
4784
  confirmationService = inject(ConfirmationService);
4725
4785
  messageService = inject(MessageService);
4726
4786
  translateAdapter = inject(TranslateService, {
@@ -4740,6 +4800,8 @@ class RolePermittedUsersDialogComponent {
4740
4800
  ...(ngDevMode ? [{ debugName: "isRemoving" }] : /* istanbul ignore next */ []));
4741
4801
  users = signal([], /* @ts-ignore */
4742
4802
  ...(ngDevMode ? [{ debugName: "users" }] : /* istanbul ignore next */ []));
4803
+ showCompanyColumn = signal(false, /* @ts-ignore */
4804
+ ...(ngDevMode ? [{ debugName: "showCompanyColumn" }] : /* istanbul ignore next */ []));
4743
4805
  constructor() {
4744
4806
  effect(() => {
4745
4807
  if (this.visible() && this.role()) {
@@ -4755,8 +4817,15 @@ class RolePermittedUsersDialogComponent {
4755
4817
  try {
4756
4818
  const response = await firstValueFrom(this.permissionApi.getRoleUsers(role.id));
4757
4819
  const rows = response.data ?? [];
4758
- const userIds = rows.map((r) => r.userId);
4759
- const userInfoMap = await this.resolveUserInfo(userIds);
4820
+ const userIds = [...new Set(rows.map((r) => r.userId))];
4821
+ const companyIds = [...new Set(rows.map((r) => r.companyId).filter((id) => !!id))];
4822
+ const branchIds = [...new Set(rows.map((r) => r.branchId).filter((id) => !!id))];
4823
+ const [userInfoMap, companyInfoMap, branchInfoMap] = await Promise.all([
4824
+ this.resolveUserInfo(userIds),
4825
+ this.scopeResolver.resolveCompanyInfo(companyIds),
4826
+ this.scopeResolver.resolveBranchInfo(branchIds),
4827
+ ]);
4828
+ this.showCompanyColumn.set(companyIds.length > 0);
4760
4829
  this.users.set(rows.map((r) => {
4761
4830
  const info = userInfoMap.get(r.userId);
4762
4831
  return {
@@ -4764,6 +4833,10 @@ class RolePermittedUsersDialogComponent {
4764
4833
  userId: r.userId,
4765
4834
  userName: info?.name ?? r.userId,
4766
4835
  userEmail: info?.email ?? '',
4836
+ companyId: r.companyId,
4837
+ companyName: r.companyId ? (companyInfoMap.get(r.companyId)?.name ?? r.companyId) : null,
4838
+ branchId: r.branchId,
4839
+ branchName: r.branchId ? (branchInfoMap.get(r.branchId)?.name ?? r.branchId) : null,
4767
4840
  };
4768
4841
  }));
4769
4842
  }
@@ -4800,6 +4873,8 @@ class RolePermittedUsersDialogComponent {
4800
4873
  try {
4801
4874
  const response = await firstValueFrom(this.permissionApi.assignUserRoles({
4802
4875
  userId: user.userId,
4876
+ companyId: user.companyId ?? undefined,
4877
+ branchId: user.branchId ?? undefined,
4803
4878
  items: [{ id: role.id, action: 'remove' }],
4804
4879
  }));
4805
4880
  if (response.success) {
@@ -4856,6 +4931,16 @@ class RolePermittedUsersDialogComponent {
4856
4931
  <div>
4857
4932
  <div class="font-semibold">{{ user.userName }}</div>
4858
4933
  <div class="text-sm text-muted-color">{{ user.userEmail }}</div>
4934
+ @if (showCompanyColumn() && user.companyName) {
4935
+ <div class="text-xs text-muted-color mt-1">
4936
+ {{ 'iam.company.name' | translate }}: {{ user.companyName }}
4937
+ @if (user.branchName) {
4938
+ · {{ 'iam.branch.name' | translate }}: {{ user.branchName }}
4939
+ } @else {
4940
+ · {{ 'iam.branch.all' | translate }}
4941
+ }
4942
+ </div>
4943
+ }
4859
4944
  </div>
4860
4945
  <button
4861
4946
  fButton
@@ -4934,6 +5019,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
4934
5019
  <div>
4935
5020
  <div class="font-semibold">{{ user.userName }}</div>
4936
5021
  <div class="text-sm text-muted-color">{{ user.userEmail }}</div>
5022
+ @if (showCompanyColumn() && user.companyName) {
5023
+ <div class="text-xs text-muted-color mt-1">
5024
+ {{ 'iam.company.name' | translate }}: {{ user.companyName }}
5025
+ @if (user.branchName) {
5026
+ · {{ 'iam.branch.name' | translate }}: {{ user.branchName }}
5027
+ } @else {
5028
+ · {{ 'iam.branch.all' | translate }}
5029
+ }
5030
+ </div>
5031
+ }
4937
5032
  </div>
4938
5033
  <button
4939
5034
  fButton
@@ -4976,13 +5071,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
4976
5071
  * action per user. Assigning new users stays on the user-centric
4977
5072
  * `UserActionSelectorComponent` flow — this dialog intentionally has no
4978
5073
  * "add" affordance. Since IAM stays independent of the auth package, user
4979
- * display info is resolved via the `USER_PROVIDER` injection token rather
4980
- * than a direct join.
5074
+ * display info is resolved via the `USER_PROVIDER` injection token, and
5075
+ * company/branch display info via the shared `PermissionScopeResolverService`
5076
+ * (itself backed by `COMPANY_API_PROVIDER`) rather than a direct join.
5077
+ *
5078
+ * `Action` rows are global (never scoped to a single company), so the same
5079
+ * user can hold several grants for the same action — one per
5080
+ * company/branch scope (company+branch null = global, branch null = whole
5081
+ * company, both set = a single branch). The company/branch lines are shown
5082
+ * only when at least one returned grant carries a `companyId` (i.e. the
5083
+ * multi-company feature is enabled) — otherwise they're omitted to avoid a
5084
+ * redundant "-" column. Removal is scoped to the exact row's
5085
+ * `companyId`/`branchId`, not just the user+action pair, since a user can
5086
+ * have multiple grants for the same action at different scopes.
4981
5087
  */
4982
5088
  class ActionPermittedUsersDialogComponent {
4983
5089
  USER_ACTION_PERMISSIONS = USER_ACTION_PERMISSIONS;
4984
5090
  permissionApi = inject(PermissionApiService);
4985
5091
  userProvider = inject(USER_PROVIDER);
5092
+ scopeResolver = inject(PermissionScopeResolverService);
4986
5093
  confirmationService = inject(ConfirmationService);
4987
5094
  messageService = inject(MessageService);
4988
5095
  translateAdapter = inject(TranslateService, {
@@ -5002,6 +5109,8 @@ class ActionPermittedUsersDialogComponent {
5002
5109
  ...(ngDevMode ? [{ debugName: "isRemoving" }] : /* istanbul ignore next */ []));
5003
5110
  users = signal([], /* @ts-ignore */
5004
5111
  ...(ngDevMode ? [{ debugName: "users" }] : /* istanbul ignore next */ []));
5112
+ showCompanyColumn = signal(false, /* @ts-ignore */
5113
+ ...(ngDevMode ? [{ debugName: "showCompanyColumn" }] : /* istanbul ignore next */ []));
5005
5114
  constructor() {
5006
5115
  effect(() => {
5007
5116
  if (this.visible() && this.action()) {
@@ -5017,8 +5126,15 @@ class ActionPermittedUsersDialogComponent {
5017
5126
  try {
5018
5127
  const response = await firstValueFrom(this.permissionApi.getActionUsers(action.id));
5019
5128
  const rows = response.data ?? [];
5020
- const userIds = rows.map((r) => r.userId);
5021
- const userInfoMap = await this.resolveUserInfo(userIds);
5129
+ const userIds = [...new Set(rows.map((r) => r.userId))];
5130
+ const companyIds = [...new Set(rows.map((r) => r.companyId).filter((id) => !!id))];
5131
+ const branchIds = [...new Set(rows.map((r) => r.branchId).filter((id) => !!id))];
5132
+ const [userInfoMap, companyInfoMap, branchInfoMap] = await Promise.all([
5133
+ this.resolveUserInfo(userIds),
5134
+ this.scopeResolver.resolveCompanyInfo(companyIds),
5135
+ this.scopeResolver.resolveBranchInfo(branchIds),
5136
+ ]);
5137
+ this.showCompanyColumn.set(companyIds.length > 0);
5022
5138
  this.users.set(rows.map((r) => {
5023
5139
  const info = userInfoMap.get(r.userId);
5024
5140
  return {
@@ -5026,6 +5142,10 @@ class ActionPermittedUsersDialogComponent {
5026
5142
  userId: r.userId,
5027
5143
  userName: info?.name ?? r.userId,
5028
5144
  userEmail: info?.email ?? '',
5145
+ companyId: r.companyId,
5146
+ companyName: r.companyId ? (companyInfoMap.get(r.companyId)?.name ?? r.companyId) : null,
5147
+ branchId: r.branchId,
5148
+ branchName: r.branchId ? (branchInfoMap.get(r.branchId)?.name ?? r.branchId) : null,
5029
5149
  };
5030
5150
  }));
5031
5151
  }
@@ -5062,6 +5182,8 @@ class ActionPermittedUsersDialogComponent {
5062
5182
  try {
5063
5183
  const response = await firstValueFrom(this.permissionApi.assignUserActions({
5064
5184
  userId: user.userId,
5185
+ companyId: user.companyId ?? undefined,
5186
+ branchId: user.branchId ?? undefined,
5065
5187
  items: [{ id: action.id, action: 'remove' }],
5066
5188
  }));
5067
5189
  if (response.success) {
@@ -5118,6 +5240,16 @@ class ActionPermittedUsersDialogComponent {
5118
5240
  <div>
5119
5241
  <div class="font-semibold">{{ user.userName }}</div>
5120
5242
  <div class="text-sm text-muted-color">{{ user.userEmail }}</div>
5243
+ @if (showCompanyColumn() && user.companyName) {
5244
+ <div class="text-xs text-muted-color mt-1">
5245
+ {{ 'iam.company.name' | translate }}: {{ user.companyName }}
5246
+ @if (user.branchName) {
5247
+ · {{ 'iam.branch.name' | translate }}: {{ user.branchName }}
5248
+ } @else {
5249
+ · {{ 'iam.branch.all' | translate }}
5250
+ }
5251
+ </div>
5252
+ }
5121
5253
  </div>
5122
5254
  <button
5123
5255
  fButton
@@ -5196,6 +5328,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
5196
5328
  <div>
5197
5329
  <div class="font-semibold">{{ user.userName }}</div>
5198
5330
  <div class="text-sm text-muted-color">{{ user.userEmail }}</div>
5331
+ @if (showCompanyColumn() && user.companyName) {
5332
+ <div class="text-xs text-muted-color mt-1">
5333
+ {{ 'iam.company.name' | translate }}: {{ user.companyName }}
5334
+ @if (user.branchName) {
5335
+ · {{ 'iam.branch.name' | translate }}: {{ user.branchName }}
5336
+ } @else {
5337
+ · {{ 'iam.branch.all' | translate }}
5338
+ }
5339
+ </div>
5340
+ }
5199
5341
  </div>
5200
5342
  <button
5201
5343
  fButton
@@ -5346,15 +5488,15 @@ const IAM_ROUTES = [
5346
5488
  children: [
5347
5489
  {
5348
5490
  path: '',
5349
- loadComponent: () => import('./flusys-ng-iam-action-list-page.component-CgoLgAqd.mjs').then((m) => m.ActionListPageComponent),
5491
+ loadComponent: () => import('./flusys-ng-iam-action-list-page.component-CLCylls2.mjs').then((m) => m.ActionListPageComponent),
5350
5492
  },
5351
5493
  {
5352
5494
  path: 'new',
5353
- loadComponent: () => import('./flusys-ng-iam-action-form-page.component-DunIW6W4.mjs').then((m) => m.ActionFormPageComponent),
5495
+ loadComponent: () => import('./flusys-ng-iam-action-form-page.component-i3FPyBR7.mjs').then((m) => m.ActionFormPageComponent),
5354
5496
  },
5355
5497
  {
5356
5498
  path: ':id',
5357
- loadComponent: () => import('./flusys-ng-iam-action-form-page.component-DunIW6W4.mjs').then((m) => m.ActionFormPageComponent),
5499
+ loadComponent: () => import('./flusys-ng-iam-action-form-page.component-i3FPyBR7.mjs').then((m) => m.ActionFormPageComponent),
5358
5500
  },
5359
5501
  ],
5360
5502
  },
@@ -5365,15 +5507,15 @@ const IAM_ROUTES = [
5365
5507
  children: [
5366
5508
  {
5367
5509
  path: '',
5368
- loadComponent: () => import('./flusys-ng-iam-role-list-page.component-BoKQbhu5.mjs').then((m) => m.RoleListPageComponent),
5510
+ loadComponent: () => import('./flusys-ng-iam-role-list-page.component-DyOesI24.mjs').then((m) => m.RoleListPageComponent),
5369
5511
  },
5370
5512
  {
5371
5513
  path: 'new',
5372
- loadComponent: () => import('./flusys-ng-iam-role-form-page.component-H3qpNn3J.mjs').then((m) => m.RoleFormPageComponent),
5514
+ loadComponent: () => import('./flusys-ng-iam-role-form-page.component-BcfbKeAt.mjs').then((m) => m.RoleFormPageComponent),
5373
5515
  },
5374
5516
  {
5375
5517
  path: ':id',
5376
- loadComponent: () => import('./flusys-ng-iam-role-form-page.component-H3qpNn3J.mjs').then((m) => m.RoleFormPageComponent),
5518
+ loadComponent: () => import('./flusys-ng-iam-role-form-page.component-BcfbKeAt.mjs').then((m) => m.RoleFormPageComponent),
5377
5519
  },
5378
5520
  ],
5379
5521
  },
@@ -5388,7 +5530,7 @@ const IAM_ROUTES = [
5388
5530
  COMPANY_ACTION_PERMISSIONS.READ,
5389
5531
  ]),
5390
5532
  ],
5391
- loadComponent: () => import('./flusys-ng-iam-permission-page.component-y86NW53S.mjs').then((m) => m.PermissionPageComponent),
5533
+ loadComponent: () => import('./flusys-ng-iam-permission-page.component-zQgYqLfE.mjs').then((m) => m.PermissionPageComponent),
5392
5534
  },
5393
5535
  // Default redirect to the first tab the user has permission to see
5394
5536
  {
@@ -5406,5 +5548,5 @@ const IAM_ROUTES = [
5406
5548
  * Generated bundle index. Do not edit.
5407
5549
  */
5408
5550
 
5409
- 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, ActionPermittedUsersDialogComponent as b, convertActionToTreeNode as c, buildActionParentTree as d, RolePermittedUsersDialogComponent as e, RoleActionSelectorComponent as f, UserActionSelectorComponent as g, ActionPermissionLogicService as h, IAM_ROUTES as i, MyPermissionsApiService as j, PermissionStateService as k, ProfilePermissionProviderAdapter as l, provideIamProviders as p };
5410
- //# sourceMappingURL=flusys-ng-iam-flusys-ng-iam-CJC610eS.mjs.map
5551
+ 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, ActionPermittedUsersDialogComponent as b, convertActionToTreeNode as c, buildActionParentTree as d, RolePermittedUsersDialogComponent as e, RoleActionSelectorComponent as f, UserActionSelectorComponent as g, ActionPermissionLogicService as h, IAM_ROUTES as i, MyPermissionsApiService as j, PermissionScopeResolverService as k, PermissionStateService as l, ProfilePermissionProviderAdapter as m, provideIamProviders as p };
5552
+ //# sourceMappingURL=flusys-ng-iam-flusys-ng-iam-BhRNGNaD.mjs.map