@flusys/ng-iam 5.0.1 → 5.0.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 (23) hide show
  1. package/fesm2022/{flusys-ng-iam-action-form-page.component-D_vwcCjG.mjs → flusys-ng-iam-action-form-page.component-DMrFt5MP.mjs} +156 -54
  2. package/fesm2022/flusys-ng-iam-action-form-page.component-DMrFt5MP.mjs.map +1 -0
  3. package/fesm2022/{flusys-ng-iam-action-list-page.component-DRK79zUR.mjs → flusys-ng-iam-action-list-page.component-BIA9UpeH.mjs} +110 -40
  4. package/fesm2022/flusys-ng-iam-action-list-page.component-BIA9UpeH.mjs.map +1 -0
  5. package/fesm2022/{flusys-ng-iam-flusys-ng-iam-C6I4k78L.mjs → flusys-ng-iam-flusys-ng-iam-Cfo9kP14.mjs} +50 -27
  6. package/fesm2022/flusys-ng-iam-flusys-ng-iam-Cfo9kP14.mjs.map +1 -0
  7. package/fesm2022/{flusys-ng-iam-iam-container.component-CQA2B6cU.mjs → flusys-ng-iam-iam-container.component-DAiS1Mtk.mjs} +34 -9
  8. package/fesm2022/flusys-ng-iam-iam-container.component-DAiS1Mtk.mjs.map +1 -0
  9. package/fesm2022/{flusys-ng-iam-permission-page.component-CZebeUhC.mjs → flusys-ng-iam-permission-page.component-BFZCb8Md.mjs} +2 -2
  10. package/fesm2022/{flusys-ng-iam-permission-page.component-CZebeUhC.mjs.map → flusys-ng-iam-permission-page.component-BFZCb8Md.mjs.map} +1 -1
  11. package/fesm2022/{flusys-ng-iam-role-form-page.component-49dKMKOj.mjs → flusys-ng-iam-role-form-page.component-TfZDInlN.mjs} +85 -31
  12. package/fesm2022/flusys-ng-iam-role-form-page.component-TfZDInlN.mjs.map +1 -0
  13. package/fesm2022/{flusys-ng-iam-role-list-page.component-CT7CvvHj.mjs → flusys-ng-iam-role-list-page.component-CuHewjjr.mjs} +5 -5
  14. package/fesm2022/flusys-ng-iam-role-list-page.component-CuHewjjr.mjs.map +1 -0
  15. package/fesm2022/flusys-ng-iam.mjs +1 -1
  16. package/package.json +4 -4
  17. package/types/flusys-ng-iam.d.ts +2 -3
  18. package/fesm2022/flusys-ng-iam-action-form-page.component-D_vwcCjG.mjs.map +0 -1
  19. package/fesm2022/flusys-ng-iam-action-list-page.component-DRK79zUR.mjs.map +0 -1
  20. package/fesm2022/flusys-ng-iam-flusys-ng-iam-C6I4k78L.mjs.map +0 -1
  21. package/fesm2022/flusys-ng-iam-iam-container.component-CQA2B6cU.mjs.map +0 -1
  22. package/fesm2022/flusys-ng-iam-role-form-page.component-49dKMKOj.mjs.map +0 -1
  23. package/fesm2022/flusys-ng-iam-role-list-page.component-CT7CvvHj.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"flusys-ng-iam-flusys-ng-iam-C6I4k78L.mjs","sources":["../../../projects/ng-iam/interfaces/action.interface.ts","../../../projects/ng-iam/interfaces/public-api.ts","../../../projects/ng-iam/constants/pagination.constants.ts","../../../projects/ng-iam/constants/messages.ts","../../../projects/ng-iam/services/role-api.service.ts","../../../projects/ng-iam/services/action-api.service.ts","../../../projects/ng-iam/utils/permission-logic.util.ts","../../../projects/ng-iam/services/action-permission-logic.service.ts","../../../projects/ng-iam/services/permission-api.service.ts","../../../projects/ng-iam/services/my-permissions-api.service.ts","../../../projects/ng-iam/services/permission-state.service.ts","../../../projects/ng-iam/services/public-api.ts","../../../projects/ng-iam/components/logic-builder.component.ts","../../../projects/ng-iam/utils/tree-utils.ts","../../../projects/ng-iam/components/base-action-selector.ts","../../../projects/ng-iam/components/role-action-selector.component.ts","../../../projects/ng-iam/components/company-action-selector.component.ts","../../../projects/ng-iam/components/user-role-selector.component.ts","../../../projects/ng-iam/components/user-action-selector.component.ts","../../../projects/ng-iam/components/public-api.ts","../../../projects/ng-iam/adapters/profile-permission-provider.adapter.ts","../../../projects/ng-iam/providers/iam-providers.ts","../../../projects/ng-iam/routes/iam.routes.ts","../../../projects/ng-iam/public-api.ts","../../../projects/ng-iam/flusys-ng-iam.ts"],"sourcesContent":["import { IBaseEntity, ILogicNode } from '@flusys/ng-shared';\n\n/** Must match backend ActionType enum */\nexport enum ActionType {\n BACKEND = 'backend',\n FRONTEND = 'frontend',\n BOTH = 'both',\n}\n\nexport interface IAction extends IBaseEntity {\n readOnly: boolean;\n name: string;\n description: string | null;\n code: string | null;\n actionType: ActionType;\n permissionLogic: ILogicNode | null;\n parentId: string | null;\n serial: number | null;\n isActive: boolean;\n}\n\nexport interface IActionTreeDto extends IAction {\n children: IActionTreeDto[];\n}\n\nexport interface ICreateActionDto {\n name: string;\n description?: string;\n code?: string;\n actionType?: ActionType;\n permissionLogic?: ILogicNode;\n parentId?: string;\n serial?: number;\n isActive?: boolean;\n}\n\nexport interface IUpdateActionDto extends Partial<ICreateActionDto> {\n id: string;\n}\n","// Company interfaces\nexport * from './company.interface';\n\n// User interfaces\nexport * from './user.interface';\n\n// Role interfaces\nexport * from './role.interface';\n\n// Action interfaces\nexport * from './action.interface';\n\n// Permission interfaces\nexport * from './permission.interface';\n","/** Maximum items for dropdown lists (companies, roles, users, branches) */\nexport const MAX_DROPDOWN_ITEMS = 100;\n","export const IAM_MESSAGES: Record<string, string> = {\n // Action CRUD (API keys)\n 'action.create.success': 'Action created successfully',\n 'action.create.many.success': '{{count}} actions created successfully',\n 'action.get.success': 'Action retrieved successfully',\n 'action.get.by.ids.success': 'Actions retrieved successfully by Ids',\n 'action.get.by.filter.success': 'Actions retrieved successfully by filter',\n 'action.get.all.success': 'Actions retrieved successfully',\n 'action.update.success': 'Action updated successfully',\n 'action.update.many.success': '{{count}} actions updated successfully',\n 'action.delete.success': 'Action deleted successfully',\n 'action.restore.success': 'Action restored successfully',\n\n // Role CRUD (API keys)\n 'role.create.success': 'Role created successfully',\n 'role.create.many.success': '{{count}} roles created successfully',\n 'role.get.success': 'Role retrieved successfully',\n 'role.get.by.ids.success': 'Roles retrieved successfully by Ids',\n 'role.get.by.filter.success': 'Roles retrieved successfully by filter',\n 'role.get.all.success': 'Roles retrieved successfully',\n 'role.update.success': 'Role updated successfully',\n 'role.update.many.success': '{{count}} roles updated successfully',\n 'role.delete.success': 'Role deleted successfully',\n 'role.restore.success': 'Role restored successfully',\n\n // PERMISSION_OPERATION_MESSAGES (API keys)\n 'permission.process.success':\n 'Successfully processed {{total}} items: {{added}} added, {{removed}} removed',\n 'permission.user.required': 'User is required for {{method}}',\n 'permission.already.exists': 'Permission already exists',\n\n // ROLE_PERMISSION_MESSAGES (API keys)\n 'role.permission.actions.success': 'Role actions retrieved successfully',\n 'role.permission.user.roles.success': 'User roles retrieved successfully',\n\n // USER_ACTION_PERMISSION_MESSAGES (API keys)\n 'user.action.permission.get.success':\n 'User action permissions retrieved successfully',\n\n // COMPANY_ACTION_PERMISSION_MESSAGES (API keys)\n 'company.action.permission.get.success':\n 'Company action permissions retrieved successfully',\n\n // MY_PERMISSION_MESSAGES (API keys)\n 'my.permission.get.success': 'Permissions loaded successfully',\n\n // IAM_MODE_MESSAGES (API keys)\n 'iam.direct.mode.unavailable':\n 'Direct permission assignment not available in RBAC-only mode',\n 'iam.rbac.mode.unavailable':\n 'Role-based permission assignment not available in direct-only mode',\n 'iam.role.assignment.unavailable':\n 'Role assignment not available in direct-only mode',\n\n // pages/iam-container/iam-container.component.ts\n 'iam.title': 'Identity & Access Management',\n 'iam.subtitle': 'Manage roles, permissions, and access control',\n 'iam.action.title': 'Actions',\n 'iam.role.title': 'Roles',\n 'iam.permission.title': 'Permissions',\n\n // pages/action/action-list-page.component.ts\n 'iam.action.new': 'New Action',\n 'iam.action.name': 'Action Name',\n 'iam.action.code': 'Action Code',\n 'iam.action.type': 'Type',\n 'iam.action.no.actions': 'No actions found',\n 'iam.action.type.backend': 'Backend',\n 'iam.action.type.frontend': 'Frontend',\n 'iam.action.type.both': 'Both',\n 'iam.action.delete.title': 'Delete Action',\n\n // pages/action/action-form-page.component.ts\n 'iam.action.edit': 'Edit Action',\n 'iam.action.name.placeholder': 'Enter action name',\n 'iam.action.code.placeholder': 'Enter action code',\n 'iam.action.parent': 'Parent Action',\n 'iam.action.select.parent': 'Select Parent Action',\n 'iam.action.type.backend.label': 'Backend Only',\n 'iam.action.type.frontend.label': 'Frontend Only',\n 'iam.action.type.both.label': 'Backend & Frontend',\n\n // pages/role/role-list-page.component.ts\n 'iam.company.title': 'Companies',\n 'iam.role.new': 'New Role',\n 'iam.role.name': 'Role Name',\n 'iam.role.no.roles': 'No roles found',\n 'iam.role.delete.title': 'Delete Role',\n\n // pages/role/role-form-page.component.ts\n 'iam.role.edit': 'Edit Role',\n 'iam.role.name.placeholder': 'Enter role name',\n\n // pages/permission/permission-page.component.ts\n 'iam.permission.role.actions': 'Role Actions',\n 'iam.permission.user.roles': 'User Roles',\n 'iam.permission.user.actions': 'User Actions',\n 'iam.permission.company.actions': 'Company Actions',\n\n // components/logic-builder.component.ts\n 'iam.logic.title': 'Permission Logic',\n 'iam.logic.add.logic': 'Add Logic',\n 'iam.logic.clear.logic': 'Clear Logic',\n 'iam.logic.description':\n 'Define permission requirements using AND/OR logic with actions',\n 'iam.logic.click.to.toggle': 'Click to toggle',\n 'iam.logic.conditions': '{{count}} conditions',\n 'iam.logic.select.action': 'Select Action...',\n 'iam.logic.actions.available': '{{count}} available',\n 'iam.logic.add.condition': 'Add Condition:',\n 'iam.logic.group': 'Group',\n 'iam.logic.action': 'Action',\n\n // components/role-action-selector.component.ts\n 'iam.permission.select.role': 'Select Role',\n 'iam.permission.select.role.placeholder': 'Search and select a role',\n 'iam.permission.action.permissions': 'Action Permissions',\n 'iam.permission.actions.available': '{{count}} actions available',\n 'iam.validation.warning.title': 'Validation Warning',\n 'iam.validation.unmet.prerequisites.plural':\n '{{count}} selected actions have unmet prerequisites. Fix before saving or use auto-fix on save.',\n 'iam.validation.unmet.prerequisites.singular':\n '{{count}} selected action has unmet prerequisites. Fix before saving or use auto-fix on save.',\n 'iam.permission.requirements': 'Requirements',\n 'iam.validation.unmet.prerequisites.tooltip':\n 'This action has unmet prerequisites and will fail validation on save',\n 'iam.permission.has.prerequisites': 'Has prerequisites',\n 'iam.permission.no.actions.available': 'No actions available',\n 'iam.permission.no.actions.for.role': 'No actions available for this role',\n 'iam.tooltip.remove.action': 'Click to remove',\n 'iam.tooltip.add.action': 'Click to add (auto-selects required)',\n 'iam.tooltip.assigned.to.role': 'Assigned to role',\n 'iam.tooltip.click.to.remove.role': 'Click to remove',\n 'iam.tooltip.click.to.assign.role': 'Click to assign to role',\n\n // components/user-action-selector.component.ts\n 'iam.permission.select.user': 'Select User',\n 'iam.permission.select.user.placeholder': 'Search and select a user',\n 'iam.permission.select.branch': 'Select Branch',\n 'iam.permission.select.branch.placeholder': 'Search and select a branch',\n 'iam.branch.permitted.count.plural':\n '{{count}} permitted branches in current company',\n 'iam.branch.permitted.count': '{{count}} permitted branch in current company',\n 'iam.permission.direct.action.permissions': 'Direct Action Permissions',\n 'iam.permission.no.actions.for.user': 'No actions available for this user',\n 'iam.tooltip.assigned.to.user': 'Assigned to user',\n 'iam.tooltip.click.to.remove.user': 'Click to remove direct permission',\n 'iam.tooltip.click.to.assign.user': 'Click to assign direct permission',\n 'iam.permission.company.required': 'Please select a company first',\n\n // components/company-action-selector.component.ts\n 'iam.permission.select.company': 'Select Company',\n 'iam.permission.select.company.placeholder': 'Search and select a company',\n 'iam.permission.action.whitelist': 'Action Whitelist',\n 'iam.permission.no.actions.for.company':\n 'No actions available for this company',\n 'iam.tooltip.selected': 'Selected',\n 'iam.tooltip.click.to.remove': 'Click to remove from company whitelist',\n 'iam.tooltip.click.to.add': 'Click to add to company whitelist',\n 'iam.permission.requires': 'requires',\n 'iam.permission.prerequisite.validation.failed':\n 'Prerequisite Validation Failed',\n 'iam.permission.prerequisite.error.message':\n 'The following actions have unmet prerequisites:',\n 'iam.permission.auto.select.required': 'Auto-select Required',\n 'iam.permission.actions.selected': 'Actions Selected',\n 'iam.permission.auto.selected.prerequisites':\n 'Required prerequisites have been auto-selected. Click Save to apply changes.',\n 'iam.permission.changes.reverted': 'Changes Reverted',\n 'iam.permission.selection.reverted':\n 'Selection has been reverted to the initial state.',\n\n // components/user-role-selector.component.ts\n 'iam.permission.role.assignments': 'Role Assignments',\n 'iam.permission.roles.available': '{{count}} roles available',\n 'iam.pagination.roles.template':\n 'Showing {first} to {last} of {totalRecords} roles',\n 'iam.permission.no.roles.available': 'No roles available',\n 'iam.permission.no.roles.for.user': 'No roles available for this user',\n 'iam.tooltip.click.to.remove.role.from.user': 'Click to remove role',\n 'iam.tooltip.click.to.assign.role.to.user': 'Click to assign role to user',\n\n // services/action-permission-logic.service.ts\n 'iam.logic.unknown.action': 'Unknown Action',\n 'iam.logic.validation.failed': 'Validation Failed',\n 'iam.logic.validation.failed.message':\n 'The following actions have unmet prerequisites:',\n 'iam.logic.validation.failed.prompt': 'Would you like to:',\n 'iam.logic.auto.fix': 'Auto-fix (Remove Invalid)',\n 'iam.logic.invalid.actions.removed': 'Invalid Actions Removed',\n 'iam.logic.removed.actions.detail':\n 'Removed {{count}} action(s) with unmet prerequisites. You can now save.',\n 'iam.logic.save.cancelled': 'Save Cancelled',\n 'iam.logic.fix.prerequisites.manually':\n 'Please fix the prerequisites manually before saving',\n 'iam.logic.prerequisites.satisfied': '[OK] Prerequisites Satisfied',\n 'iam.logic.all.required.selected':\n 'All required actions are already selected.\\nYou can safely add this action.',\n 'iam.logic.prerequisites.required':\n 'Prerequisites Required ({{count}} missing)',\n 'iam.logic.click.to.auto.select': 'Click to auto-select required actions',\n 'iam.logic.select.action.label': 'Select Action',\n 'iam.logic.auto.select.actions': 'Auto-select Actions',\n 'iam.logic.action.selected.detail':\n 'Action selected successfully (prerequisites already satisfied)',\n 'iam.logic.auto.selected.detail':\n 'Automatically selected {{count}} action(s) including prerequisites',\n 'iam.logic.minimum.required': ' (minimum required)',\n 'iam.logic.auto.select.prompt':\n 'Auto-select will choose {{count}} action(s){{suffix}}.',\n 'iam.logic.missing.prerequisites': 'Missing Prerequisites',\n 'iam.logic.requires.conditions':\n 'requires the following conditions to be satisfied:',\n 'iam.logic.would.you.continue': 'Would you like to continue?',\n 'iam.logic.actions.selected.summary': 'Actions Selected',\n 'iam.logic.selection.cancelled': 'Selection Cancelled',\n 'iam.logic.action.not.added': 'Action not added to whitelist',\n 'iam.logic.required.by.actions': 'is required by the following action(s):',\n 'iam.logic.alternatives.available': 'Alternative options available:',\n 'iam.logic.switch.to.alternatives':\n 'Would you like to automatically switch to alternatives?',\n 'iam.logic.remove.dependents':\n 'Removing this will also remove the dependent action(s).',\n 'iam.logic.dependency.warning': 'Dependency Warning',\n 'iam.logic.use.alternatives': 'Use Alternatives',\n 'iam.logic.remove.all': 'Remove All',\n 'iam.logic.alternatives.applied': 'Alternatives Applied',\n 'iam.logic.switched.to.alternatives':\n 'Automatically switched to alternative action(s)',\n 'iam.logic.actions.removed': 'Actions Removed',\n 'iam.logic.removed.with.dependents':\n 'Removed {{name}} and {{count}} dependent action(s)',\n 'iam.logic.cancelled': 'Cancelled',\n 'iam.logic.no.changes.made': 'No changes made',\n 'iam.logic.satisfied': '(satisfied)',\n 'iam.logic.missing': '(missing)',\n 'iam.logic.invalid.node': 'Invalid logic node',\n 'iam.logic.invalid': '(invalid)',\n};\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport { IRole, IUpdateRoleDto } from '../interfaces/role.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class RoleApiService extends ApiResourceService<IUpdateRoleDto, IRole> {\n constructor() {\n super('roles', inject(HttpClient), 'iam');\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { APP_CONFIG, getServiceUrl, IAppConfig } from '@flusys/ng-core';\nimport { IAction, IActionTreeDto, IUpdateActionDto } from '../interfaces/action.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class ActionApiService extends ApiResourceService<IUpdateActionDto, IAction> {\n private readonly appConfig = inject<IAppConfig>(APP_CONFIG);\n\n constructor() {\n super('actions', inject(HttpClient), 'iam');\n }\n\n /** Get actions filtered by company whitelist for permission assignment */\n getActionsForPermission(): Observable<ISingleResponse<IActionTreeDto[]>> {\n const iamBaseUrl = getServiceUrl(this.appConfig, 'iam');\n return this.http.post<ISingleResponse<IActionTreeDto[]>>(\n `${iamBaseUrl}/actions/tree-for-permission`,\n {}\n );\n }\n\n /** Get actions in hierarchical tree structure */\n getTree(search?: string, isActive?: boolean, withDeleted?: boolean): Observable<ISingleResponse<IActionTreeDto[]>> {\n const body: { search?: string; isActive?: boolean; withDeleted?: boolean } = {};\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 { ILogicNode } from '@flusys/ng-shared';\nimport { IAction } from '../interfaces/action.interface';\n\nexport interface IPrerequisiteValidationResult {\n valid: boolean;\n missingActions: IAction[];\n}\n\nexport function extractRequiredActionIds(logic: ILogicNode | null): Set<string> {\n const actionIds = new Set<string>();\n if (logic) {\n collectActionIds(logic, actionIds);\n }\n return actionIds;\n}\n\nfunction collectActionIds(node: ILogicNode, actionIds: Set<string>): void {\n if (node.type === 'action' && node.actionId) {\n actionIds.add(node.actionId);\n } else if (node.type === 'group' && node.children) {\n node.children.forEach((child) => collectActionIds(child, actionIds));\n }\n}\n\nexport function validateActionPrerequisites(\n action: IAction,\n selectedActionIds: Set<string>,\n allActions: IAction[],\n): IPrerequisiteValidationResult {\n if (!action.permissionLogic) {\n return { valid: true, missingActions: [] };\n }\n\n const result = evaluateLogicNodeWithMissing(action.permissionLogic, selectedActionIds);\n if (result.valid) {\n return { valid: true, missingActions: [] };\n }\n\n const missingActions = allActions.filter((a) => a.id && result.missingActionIds.has(a.id));\n return { valid: false, missingActions };\n}\n\nfunction evaluateLogicNodeWithMissing(\n node: ILogicNode,\n selectedActionIds: Set<string>,\n): { valid: boolean; missingActionIds: Set<string> } {\n if (node.type === 'action' && node.actionId) {\n const valid = selectedActionIds.has(node.actionId);\n return { valid, missingActionIds: valid ? new Set() : new Set([node.actionId]) };\n }\n\n if (node.type === 'group' && node.children?.length) {\n const operator = node.operator || 'AND';\n\n if (operator === 'AND') {\n const missingIds = new Set<string>();\n let allValid = true;\n for (const child of node.children) {\n const childResult = evaluateLogicNodeWithMissing(child, selectedActionIds);\n if (!childResult.valid) {\n allValid = false;\n childResult.missingActionIds.forEach((id) => missingIds.add(id));\n }\n }\n return { valid: allValid, missingActionIds: missingIds };\n }\n\n // OR operator\n for (const child of node.children) {\n const childResult = evaluateLogicNodeWithMissing(child, selectedActionIds);\n if (childResult.valid) {\n return { valid: true, missingActionIds: new Set() };\n }\n }\n const firstChildResult = evaluateLogicNodeWithMissing(node.children[0], selectedActionIds);\n return { valid: false, missingActionIds: firstChildResult.missingActionIds };\n }\n\n return { valid: true, missingActionIds: new Set() };\n}\n","import { Injectable, inject } from '@angular/core';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { ILogicNode } from '@flusys/ng-shared';\nimport { IAction } from '../interfaces/action.interface';\nimport { validateActionPrerequisites } from '../utils/permission-logic.util';\n\n/** Shared service for smart dependency management across action selectors */\n@Injectable({ providedIn: 'root' })\nexport class ActionPermissionLogicService {\n private readonly confirmationService = inject(ConfirmationService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private t(key: string, variables?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, variables) ?? key;\n }\n\n /** Handle checking an action with prerequisite validation (recursive deep scan) */\n handleCheck(\n action: IAction,\n currentSelection: Record<string, boolean>,\n allActions: IAction[],\n onUpdate: (newSelection: Record<string, boolean>) => void,\n onCancel: (previousState: Record<string, boolean>) => void,\n ): void {\n // Validate prerequisites with RECURSIVE DEEP SCAN\n if (action.permissionLogic) {\n const selectedActionIds = this.getSelectedIds(currentSelection);\n\n const validationResult = validateActionPrerequisites(\n action,\n selectedActionIds,\n allActions,\n );\n\n if (!validationResult.valid) {\n // Store previous state\n const previousState = { ...currentSelection };\n\n // Temporarily check the box\n const tempMap = { ...currentSelection };\n tempMap[action.id as string] = true;\n onUpdate(tempMap);\n\n // CRITICAL: Recursively collect ALL missing prerequisites (deep scan)\n const allMissingActions = this.getAllMissingPrerequisitesRecursive(\n action,\n currentSelection,\n allActions,\n );\n\n // Show prerequisite dialog with COMPLETE dependency chain\n this.showPrerequisiteDialog(\n action,\n allMissingActions,\n currentSelection,\n allActions,\n previousState,\n onUpdate,\n onCancel,\n );\n return;\n }\n }\n\n // All prerequisites satisfied, allow selection\n const selMap = { ...currentSelection };\n selMap[action.id as string] = true;\n onUpdate(selMap);\n }\n\n /** Handle unchecking an action with dependency detection */\n handleUncheck(\n action: IAction,\n currentSelection: Record<string, boolean>,\n allActions: IAction[],\n onUpdate: (newSelection: Record<string, boolean>) => void,\n ): void {\n const affectedActions = this.findActionsDependingOn(\n action.id as string,\n currentSelection,\n allActions,\n );\n\n if (affectedActions.length > 0) {\n this.showDependencyDialog(\n action,\n affectedActions,\n currentSelection,\n allActions,\n onUpdate,\n );\n return;\n }\n\n // No dependencies, safe to uncheck\n const selMap = { ...currentSelection };\n selMap[action.id as string] = false;\n onUpdate(selMap);\n }\n\n /** Check if an action has unmet prerequisites */\n hasUnmetPrerequisites(\n action: IAction,\n currentSelection: Record<string, boolean>,\n allActions: IAction[],\n ): boolean {\n const isSelected = currentSelection[action.id as string];\n\n if (!isSelected || !action.permissionLogic) {\n return false;\n }\n\n const selectedActionIds = this.getSelectedIds(currentSelection);\n selectedActionIds.delete(action.id as string);\n\n const validationResult = validateActionPrerequisites(\n action,\n selectedActionIds,\n allActions,\n );\n\n return !validationResult.valid;\n }\n\n /** Get all selected actions that have unmet prerequisites */\n getActionsWithUnmetPrerequisites(\n currentSelection: Record<string, boolean>,\n allActions: IAction[],\n ): IAction[] {\n const selectedActions = allActions.filter(\n (a) => currentSelection[a.id as string],\n );\n\n return selectedActions.filter((action) =>\n this.hasUnmetPrerequisites(action, currentSelection, allActions),\n );\n }\n\n /** Show validation error dialog with auto-fix options */\n showValidationErrorDialog(\n invalidActions: IAction[],\n currentSelection: Record<string, boolean>,\n allActions: IAction[],\n onUpdate: (newSelection: Record<string, boolean>) => void,\n ): void {\n const errorList = invalidActions\n .map((action) => {\n const selectedActionIds = this.getSelectedIds(currentSelection);\n selectedActionIds.delete(action.id as string);\n\n const validationResult = validateActionPrerequisites(\n action,\n selectedActionIds,\n allActions,\n );\n\n const sanitizedActionName = this.sanitizeHtml(action.name ?? this.t('iam.logic.unknown.action'));\n const missingNames = validationResult.missingActions\n .map((a) => this.sanitizeHtml(a.name ?? this.t('iam.logic.unknown.action')))\n .join(', ');\n return `<li><strong>${sanitizedActionName}</strong> requires: ${missingNames}</li>`;\n })\n .join('');\n\n this.confirmationService.confirm({\n header: this.t('iam.logic.validation.failed'),\n message: `${this.t('iam.logic.validation.failed.message')}<br/><br/><ul class=\"pl-4\">${errorList}</ul><br/>${this.t('iam.logic.validation.failed.prompt')}`,\n icon: 'pi pi-exclamation-triangle',\n acceptLabel: this.t('iam.logic.auto.fix'),\n rejectLabel: this.t('shared.cancel'),\n acceptIcon: 'pi pi-trash',\n rejectIcon: 'pi pi-times',\n acceptButtonStyleClass: 'p-button-warning',\n closeOnEscape: false,\n closable: false,\n accept: () => {\n // Remove all invalid actions\n const selMap = { ...currentSelection };\n invalidActions.forEach((action) => {\n selMap[action.id as string] = false;\n });\n onUpdate(selMap);\n\n this.messageService.add({\n severity: 'warning',\n summary: this.t('iam.logic.invalid.actions.removed'),\n detail: this.t('iam.logic.removed.actions.detail', { count: invalidActions.length }),\n });\n },\n reject: () => {\n this.messageService.add({\n severity: 'info',\n summary: this.t('iam.logic.save.cancelled'),\n detail: this.t('iam.logic.fix.prerequisites.manually'),\n });\n },\n });\n }\n\n /** Get prerequisite description for tooltip display */\n getPrerequisiteTooltip(\n action: IAction,\n currentSelection: Record<string, boolean>,\n allActions: IAction[],\n ): string {\n if (!action.permissionLogic) {\n return '';\n }\n\n const selectedActionIds = this.getSelectedIds(currentSelection);\n\n const validationResult = validateActionPrerequisites(\n action,\n selectedActionIds,\n allActions,\n );\n\n if (validationResult.valid) {\n return `${this.t('iam.logic.prerequisites.satisfied')}\\n\\n${this.t('iam.logic.all.required.selected')}`;\n }\n\n const allMissingActions = this.getAllMissingPrerequisitesRecursive(\n action,\n currentSelection,\n allActions,\n );\n\n const logicTree = this.buildTooltipLogicTree(\n action.permissionLogic,\n currentSelection,\n allActions,\n 0,\n );\n\n const missingCount = allMissingActions.length;\n const header = `⚠ ${this.t('iam.logic.prerequisites.required', { count: missingCount })}`;\n const hint = `\\n\\n💡 ${this.t('iam.logic.click.to.auto.select')}`;\n\n return `${header}\\n\\n${logicTree}${hint}`;\n }\n\n /** Build dynamic logic tree message with AND/OR operators and nesting */\n buildLogicMessage(\n logic: ILogicNode,\n _missingActions: IAction[],\n allActions: IAction[],\n currentSelection?: Record<string, boolean>,\n ): string {\n const selectedIds = currentSelection ? this.getSelectedIds(currentSelection) : new Set<string>();\n const actionMap = new Map(allActions.map((a) => [a.id, a]));\n return this.formatLogicNode(logic, selectedIds, actionMap, 0);\n }\n\n /** Extract selected action IDs from selection map */\n private getSelectedIds(currentSelection: Record<string, boolean>): Set<string> {\n return new Set(Object.keys(currentSelection).filter((id) => currentSelection[id]));\n }\n\n private sanitizeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#x27;');\n }\n\n /** Recursively collect ALL missing prerequisites at all dependency levels */\n private getAllMissingPrerequisitesRecursive(\n action: IAction,\n currentSelection: Record<string, boolean>,\n allActions: IAction[],\n ): IAction[] {\n if (!action.id) return [];\n\n const visited = new Set<string>();\n const allMissing = new Map<string, IAction>();\n const stack = new Set<string>();\n\n const collectMissing = (targetAction: IAction, depth: number = 0): void => {\n if (!targetAction.permissionLogic || !targetAction.id) return;\n\n if (depth > 50) {\n return;\n }\n\n if (visited.has(targetAction.id)) return;\n\n if (stack.has(targetAction.id)) {\n return;\n }\n\n visited.add(targetAction.id);\n stack.add(targetAction.id);\n\n const selectedActionIds = this.getSelectedIds(currentSelection);\n\n const result = validateActionPrerequisites(\n targetAction,\n selectedActionIds,\n allActions,\n );\n\n if (!result.valid) {\n result.missingActions.forEach((missingAction) => {\n if (missingAction.id && missingAction.id !== action.id) {\n allMissing.set(missingAction.id, missingAction);\n collectMissing(missingAction, depth + 1);\n }\n });\n }\n\n stack.delete(targetAction.id);\n };\n\n collectMissing(action);\n return Array.from(allMissing.values());\n }\n\n private showPrerequisiteDialog(\n action: IAction,\n missingActions: IAction[],\n currentSelection: Record<string, boolean>,\n allActions: IAction[],\n previousState: Record<string, boolean>,\n onUpdate: (newSelection: Record<string, boolean>) => void,\n onCancel: (previousState: Record<string, boolean>) => void,\n ): void {\n const logicMessage = action.permissionLogic\n ? this.buildLogicMessage(\n action.permissionLogic,\n missingActions,\n allActions,\n currentSelection,\n )\n : this.buildSimpleMessage(missingActions);\n\n const actionsToSelect = action.permissionLogic\n ? this.calculateSmartSelection(\n action.permissionLogic,\n missingActions,\n currentSelection,\n allActions,\n )\n : missingActions;\n\n const selectionCount = actionsToSelect.length;\n\n const sanitizedActionName = this.sanitizeHtml(\n action.name ?? this.t('iam.logic.unknown.action'),\n );\n\n const acceptLabel =\n selectionCount === 0 ? this.t('iam.logic.select.action.label') : this.t('iam.logic.auto.select.actions');\n const detailMessage =\n selectionCount === 0\n ? this.t('iam.logic.action.selected.detail')\n : this.t('iam.logic.auto.selected.detail', { count: selectionCount });\n\n const suffix = selectionCount < missingActions.length ? this.t('iam.logic.minimum.required') : '';\n const autoSelectPrompt = this.t('iam.logic.auto.select.prompt', { count: selectionCount, suffix });\n\n this.confirmationService.confirm({\n header: this.t('iam.logic.missing.prerequisites'),\n message: `<strong>${sanitizedActionName}</strong> ${this.t('iam.logic.requires.conditions')}<br/><br/>${logicMessage}<br/><br/><strong>${autoSelectPrompt}</strong><br/>${this.t('iam.logic.would.you.continue')}`,\n icon: 'pi pi-exclamation-triangle',\n acceptLabel,\n rejectLabel: this.t('shared.cancel'),\n acceptIcon: 'pi pi-check',\n rejectIcon: 'pi pi-times',\n closeOnEscape: false,\n closable: false,\n accept: () => {\n const selMap = { ...currentSelection };\n selMap[action.id as string] = true;\n actionsToSelect.forEach((a) => {\n selMap[a.id as string] = true;\n });\n onUpdate(selMap);\n\n this.messageService.add({\n severity: 'info',\n summary: this.t('iam.logic.actions.selected.summary'),\n detail: detailMessage,\n });\n },\n reject: () => {\n onCancel(previousState);\n\n this.messageService.add({\n severity: 'info',\n summary: this.t('iam.logic.selection.cancelled'),\n detail: this.t('iam.logic.action.not.added'),\n });\n },\n });\n }\n\n private showDependencyDialog(\n action: IAction,\n affectedActions: IAction[],\n currentSelection: Record<string, boolean>,\n _allActions: IAction[],\n onUpdate: (newSelection: Record<string, boolean>) => void,\n ): void {\n if (!action.id) return;\n\n const alternatives = this.findAlternatives(\n action.id,\n affectedActions,\n currentSelection,\n );\n\n const sanitizedActionName = this.sanitizeHtml(\n action.name ?? this.t('iam.logic.unknown.action'),\n );\n let message = `<strong>${sanitizedActionName}</strong> ${this.t('iam.logic.required.by.actions')}<br/><br/><ul class=\"pl-4\">`;\n affectedActions.forEach((a) => {\n const sanitizedName = this.sanitizeHtml(a.name ?? this.t('iam.logic.unknown.action'));\n message += `<li>${sanitizedName}</li>`;\n });\n message += '</ul><br/>';\n\n if (alternatives.length > 0) {\n message += `<strong>${this.t('iam.logic.alternatives.available')}</strong><br/><br/>`;\n message += `<em>${this.t('iam.logic.switch.to.alternatives')}</em>`;\n } else {\n message += `<em>${this.t('iam.logic.remove.dependents')}</em><br/><br/>`;\n message += this.t('iam.logic.would.you.continue');\n }\n\n this.confirmationService.confirm({\n header: this.t('iam.logic.dependency.warning'),\n message,\n icon: 'pi pi-exclamation-triangle',\n acceptLabel: alternatives.length > 0 ? this.t('iam.logic.use.alternatives') : this.t('iam.logic.remove.all'),\n rejectLabel: this.t('shared.cancel'),\n acceptIcon: 'pi pi-check',\n rejectIcon: 'pi pi-times',\n closeOnEscape: false,\n closable: false,\n accept: () => {\n const selMap = { ...currentSelection };\n\n if (alternatives.length > 0) {\n // Apply alternatives\n alternatives.forEach(({ alternativeId }) => {\n selMap[alternativeId] = true;\n });\n selMap[action.id as string] = false;\n\n this.messageService.add({\n severity: 'success',\n summary: this.t('iam.logic.alternatives.applied'),\n detail: this.t('iam.logic.switched.to.alternatives'),\n });\n } else {\n // Remove action and all dependents\n selMap[action.id as string] = false;\n affectedActions.forEach((a) => {\n selMap[a.id as string] = false;\n });\n\n this.messageService.add({\n severity: 'warn',\n summary: this.t('iam.logic.actions.removed'),\n detail: this.t('iam.logic.removed.with.dependents', { name: action.name ?? '', count: affectedActions.length }),\n });\n }\n\n onUpdate(selMap);\n },\n reject: () => {\n this.messageService.add({\n severity: 'info',\n summary: this.t('iam.logic.cancelled'),\n detail: this.t('iam.logic.no.changes.made'),\n });\n },\n });\n }\n\n private findActionsDependingOn(\n actionId: string,\n currentSelection: Record<string, boolean>,\n allActions: IAction[],\n ): IAction[] {\n const selectedActions = allActions.filter(\n (a) => currentSelection[a.id as string] && a.id !== actionId,\n );\n\n return selectedActions.filter((action) => {\n if (!action.permissionLogic) return false;\n return this.doesLogicDependOn(action.permissionLogic, actionId);\n });\n }\n\n private doesLogicDependOn(node: ILogicNode, targetActionId: string): boolean {\n if (node.type === 'action') {\n return node.actionId === targetActionId;\n }\n\n if (node.type === 'group' && node.children) {\n return node.children.some((child: ILogicNode) =>\n this.doesLogicDependOn(child, targetActionId),\n );\n }\n\n return false;\n }\n\n private findAlternatives(\n removingActionId: string,\n affectedActions: IAction[],\n currentSelection: Record<string, boolean>,\n ): Array<{ alternativeId: string }> {\n const alternatives: Array<{ alternativeId: string }> = [];\n\n for (const affectedAction of affectedActions) {\n if (!affectedAction.permissionLogic) continue;\n\n const alternative = this.findAlternativeInLogic(\n affectedAction.permissionLogic,\n removingActionId,\n currentSelection,\n );\n\n if (alternative) {\n alternatives.push({ alternativeId: alternative });\n }\n }\n\n return alternatives;\n }\n\n private findAlternativeInLogic(\n node: ILogicNode,\n removingActionId: string,\n currentSelection: Record<string, boolean>,\n ): string | null {\n if (node.type === 'group' && node.operator === 'OR' && node.children) {\n const hasRemoving = node.children.some(\n (child) =>\n child.type === 'action' && child.actionId === removingActionId,\n );\n\n if (hasRemoving) {\n for (const child of node.children) {\n if (\n child.type === 'action' &&\n child.actionId &&\n child.actionId !== removingActionId &&\n !currentSelection[child.actionId]\n ) {\n return child.actionId;\n }\n }\n }\n }\n\n if (node.type === 'group' && node.children) {\n for (const child of node.children) {\n const alternative = this.findAlternativeInLogic(\n child,\n removingActionId,\n currentSelection,\n );\n if (alternative) return alternative;\n }\n }\n\n return null;\n }\n\n private calculateSmartSelection(\n logic: ILogicNode,\n missingActions: IAction[],\n currentSelection: Record<string, boolean>,\n allActions: IAction[],\n ): IAction[] {\n const missingIds = new Set(missingActions.map((a) => a.id));\n const actionMap = new Map(allActions.map((a) => [a.id, a]));\n const selectedIds = this.getSelectedIds(currentSelection);\n\n const requiredIds = this.findRequiredActionIds(\n logic,\n missingIds,\n selectedIds,\n );\n return Array.from(requiredIds)\n .map((id) => actionMap.get(id))\n .filter((a): a is IAction => !!a);\n }\n\n private findRequiredActionIds(\n node: ILogicNode,\n missingIds: Set<string | undefined>,\n selectedIds: Set<string>,\n ): Set<string> {\n if (node.type === 'action' && node.actionId) {\n if (missingIds.has(node.actionId)) {\n return new Set([node.actionId]);\n }\n return new Set();\n }\n\n if (node.type === 'group' && node.children && node.children.length > 0) {\n const operator = node.operator || 'AND';\n\n if (operator === 'AND') {\n const required = new Set<string>();\n for (const child of node.children) {\n const childRequired = this.findRequiredActionIds(\n child,\n missingIds,\n selectedIds,\n );\n childRequired.forEach((id) => required.add(id));\n }\n return required;\n } else {\n let minRequired: Set<string> | null = null;\n let minSize = Infinity;\n\n for (const child of node.children) {\n const childRequired = this.findRequiredActionIds(\n child,\n missingIds,\n selectedIds,\n );\n\n if (childRequired.size === 0) {\n return new Set();\n }\n\n if (childRequired.size < minSize) {\n minSize = childRequired.size;\n minRequired = childRequired;\n }\n }\n\n return minRequired || new Set();\n }\n }\n\n return new Set();\n }\n\n private buildSimpleMessage(missingActions: IAction[]): string {\n return `<ul class=\"pl-4\">${missingActions.map((a) => `<li>${this.sanitizeHtml(a.name ?? this.t('iam.logic.unknown.action'))}</li>`).join('')}</ul>`;\n }\n\n private formatLogicNode(\n node: ILogicNode,\n selectedIds: Set<string | undefined>,\n actionMap: Map<string | undefined, IAction>,\n depth: number,\n ): string {\n const indent = '&nbsp;&nbsp;&nbsp;&nbsp;'.repeat(depth);\n\n if (node.type === 'action' && node.actionId) {\n const action = actionMap.get(node.actionId);\n const actionName = this.sanitizeHtml(action?.name || this.t('iam.logic.unknown.action'));\n const isSelected = selectedIds.has(node.actionId);\n\n if (isSelected) {\n return `${indent}<span style=\"color: #10b981; font-weight: 500;\">✓ ${actionName}</span> <em style=\"color: #059669;\">${this.t('iam.logic.satisfied')}</em>`;\n } else {\n return `${indent}<span style=\"color: #ef4444;\">✗ ${actionName}</span> <em style=\"color: #dc2626;\">${this.t('iam.logic.missing')}</em>`;\n }\n }\n\n if (node.type === 'group' && node.children) {\n const operator = node.operator || 'AND';\n const operatorColor = operator === 'AND' ? '#3b82f6' : '#8b5cf6';\n const lines: string[] = [];\n\n lines.push(\n `${indent}<strong style=\"color: ${operatorColor};\">${operator}</strong> <span style=\"color: #6b7280;\">(${node.children.length} condition${node.children.length !== 1 ? 's' : ''})</span>`,\n );\n\n node.children.forEach((child: ILogicNode, index: number) => {\n const childHtml = this.formatLogicNode(\n child,\n selectedIds,\n actionMap,\n depth + 1,\n );\n lines.push(childHtml);\n\n if (node.children && index < node.children.length - 1) {\n lines.push(\n `${indent}&nbsp;&nbsp;<em style=\"color: ${operatorColor}; font-size: 0.75rem;\">${operator.toLowerCase()}</em>`,\n );\n }\n });\n\n return lines.join('<br/>');\n }\n\n return `${indent}<em style=\"color: #9ca3af;\">${this.t('iam.logic.invalid.node')}</em>`;\n }\n\n /** Build clean text-based logic tree for tooltips */\n private buildTooltipLogicTree(\n node: ILogicNode,\n currentSelection: Record<string, boolean>,\n allActions: IAction[],\n depth: number,\n ): string {\n const indent = ' '.repeat(depth);\n const selectedIds = this.getSelectedIds(currentSelection);\n const actionMap = new Map(allActions.map((a) => [a.id, a]));\n\n if (node.type === 'action' && node.actionId) {\n const action = actionMap.get(node.actionId);\n const actionName = action?.name || this.t('iam.logic.unknown.action');\n const isSelected = selectedIds.has(node.actionId);\n\n if (isSelected) {\n return `${indent}✓ ${actionName}`;\n } else {\n return `${indent}✗ ${actionName}`;\n }\n }\n\n if (node.type === 'group' && node.children) {\n const operator = node.operator || 'AND';\n const lines: string[] = [];\n\n lines.push(`${indent}${operator}:`);\n\n node.children.forEach((child: ILogicNode, index: number) => {\n const childText = this.buildTooltipLogicTree(\n child,\n currentSelection,\n allActions,\n depth + 1,\n );\n lines.push(childText);\n\n if (\n node.children &&\n index < node.children.length - 1 &&\n operator === 'OR'\n ) {\n lines.push(`${indent} ${operator.toLowerCase()}`);\n }\n });\n\n return lines.join('\\n');\n }\n\n return `${indent}${this.t('iam.logic.invalid')}`;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BaseApiService } from '@flusys/ng-core';\nimport { ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n IAssignCompanyActionsDto,\n IAssignRoleActionsDto,\n IAssignUserActionsDto,\n IAssignUserRolesDto,\n ICompanyActionResponseDto,\n IGetUserActionsDto,\n IGetUserRolesDto,\n IPermissionOperationResultDto,\n IRoleActionResponseDto,\n IUserActionResponseDto,\n IUserRoleResponseDto,\n} from '../interfaces/permission.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class PermissionApiService extends BaseApiService {\n constructor() {\n super('iam');\n }\n\n assignUserActions(data: IAssignUserActionsDto): Observable<ISingleResponse<IPermissionOperationResultDto>> {\n return this.http.post<ISingleResponse<IPermissionOperationResultDto>>(\n this.getUrl('permissions/user-actions/assign'),\n data,\n );\n }\n\n getUserActions(userId: string, query?: IGetUserActionsDto): Observable<ISingleResponse<IUserActionResponseDto[]>> {\n return this.http.post<ISingleResponse<IUserActionResponseDto[]>>(\n this.getUrl('permissions/get-user-actions'),\n { userId, branchId: query?.branchId },\n );\n }\n\n assignUserRoles(data: IAssignUserRolesDto): Observable<ISingleResponse<IPermissionOperationResultDto>> {\n return this.http.post<ISingleResponse<IPermissionOperationResultDto>>(\n this.getUrl('permissions/user-roles/assign'),\n data,\n );\n }\n\n getUserRoles(userId: string, query?: IGetUserRolesDto): Observable<ISingleResponse<IUserRoleResponseDto[]>> {\n return this.http.post<ISingleResponse<IUserRoleResponseDto[]>>(\n this.getUrl('permissions/get-user-roles'),\n { userId, branchId: query?.branchId },\n );\n }\n\n assignRoleActions(data: IAssignRoleActionsDto): Observable<ISingleResponse<IPermissionOperationResultDto>> {\n return this.http.post<ISingleResponse<IPermissionOperationResultDto>>(\n this.getUrl('permissions/role-actions/assign'),\n data,\n );\n }\n\n getRoleActions(roleId: string): Observable<ISingleResponse<IRoleActionResponseDto[]>> {\n return this.http.post<ISingleResponse<IRoleActionResponseDto[]>>(\n this.getUrl('permissions/get-role-actions'),\n { roleId },\n );\n }\n\n assignCompanyActions(data: IAssignCompanyActionsDto): Observable<ISingleResponse<IPermissionOperationResultDto>> {\n return this.http.post<ISingleResponse<IPermissionOperationResultDto>>(\n this.getUrl('permissions/company-actions/assign'),\n data,\n );\n }\n\n getCompanyActions(companyId: string): Observable<ISingleResponse<ICompanyActionResponseDto[]>> {\n return this.http.post<ISingleResponse<ICompanyActionResponseDto[]>>(\n this.getUrl('permissions/get-company-actions'),\n { companyId },\n );\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { APP_CONFIG, getServiceUrl, IAppConfig } from '@flusys/ng-core';\nimport { ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport { IGetMyPermissionsDto, IMyPermissionsResponseDto } from '../interfaces/permission.interface';\n\n/**\n * My Permissions API Service\n * Get current user's complete permissions\n * Endpoint: POST /iam/permissions/my-permissions\n * Always enabled\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class MyPermissionsApiService {\n private readonly http = inject(HttpClient);\n private readonly appConfig = inject<IAppConfig>(APP_CONFIG);\n private readonly baseUrl = `${getServiceUrl(this.appConfig, 'iam')}/permissions`;\n\n /**\n * Get current user's complete permissions\n * POST /iam/permissions/my-permissions\n * Returns menus, frontend actions, and cached endpoint count\n * @param dto Optional filter by parent codes (only affects frontend actions)\n */\n getMyPermissions(dto: IGetMyPermissionsDto = {}): Observable<ISingleResponse<IMyPermissionsResponseDto>> {\n return this.http.post<ISingleResponse<IMyPermissionsResponseDto>>(\n `${this.baseUrl}/my-permissions`,\n dto,\n );\n }\n}\n","import { inject, Injectable, signal } from '@angular/core';\nimport { PermissionValidatorService } from '@flusys/ng-shared';\nimport { Observable, of } from 'rxjs';\nimport { catchError, map, tap } from 'rxjs/operators';\nimport { IGetMyPermissionsDto, IMyPermissionsResponseDto } from '../interfaces/permission.interface';\nimport { MyPermissionsApiService } from './my-permissions-api.service';\n\n@Injectable({ providedIn: 'root' })\nexport class PermissionStateService {\n private readonly permissionApi = inject(MyPermissionsApiService);\n private readonly permissionValidator = inject(PermissionValidatorService);\n\n private readonly _permissions = signal<IMyPermissionsResponseDto | null>(null);\n readonly permissions = this._permissions.asReadonly();\n\n private readonly _isLoading = signal(false);\n readonly isLoading = this._isLoading.asReadonly();\n\n loadPermissions(dto?: IGetMyPermissionsDto): Observable<void> {\n this._isLoading.set(true);\n return this.permissionApi.getMyPermissions(dto).pipe(\n tap((response) => {\n this._permissions.set(response.data ?? null);\n this._isLoading.set(false);\n const actionCodes = response.data?.frontendActions.map((a) => a.code) ?? [];\n this.permissionValidator.setPermissions(actionCodes);\n }),\n catchError(() => {\n this._permissions.set(null);\n this._isLoading.set(false);\n this.permissionValidator.clearPermissions();\n return of(void 0);\n }),\n map(() => void 0),\n );\n }\n\n isLoaded(): boolean {\n return this._permissions() !== null && this.permissionValidator.isPermissionsLoaded();\n }\n}\n","// Role services\nexport * from './role-api.service';\n\n// Action services\nexport * from './action-api.service';\n\n// Action permission logic service (shared smart dependency management)\nexport * from './action-permission-logic.service';\n\n// Consolidated permission API service (replaces 4 separate services)\nexport * from './permission-api.service';\n\n// My permissions (current user's permissions)\nexport * from './my-permissions-api.service';\n\n// Permission state service\nexport * from './permission-state.service';\n","import { Component, effect, input, output, signal } from '@angular/core';\nimport {\n AngularModule,\n ILogicNode,\n PrimeModule,\n TranslatePipe,\n} from '@flusys/ng-shared';\n\n/** Internal node with ID for UI tree tracking */\ninterface IBuilderNode {\n id: string;\n type: 'group' | 'action';\n operator?: 'AND' | 'OR';\n actionId?: string;\n children?: IBuilderNode[];\n}\n\nfunction toLogicNode(node: IBuilderNode): ILogicNode {\n if (node.type === 'action') {\n return { type: 'action', actionId: node.actionId! };\n }\n return {\n type: 'group',\n operator: node.operator!,\n children: node.children?.map(toLogicNode) ?? [],\n };\n}\n\nfunction toBuilderNode(node: ILogicNode): IBuilderNode {\n if (node.type === 'action') {\n return createActionNode(node.actionId);\n }\n return {\n ...createGroupNode(node.operator),\n children: node.children?.map(toBuilderNode) ?? [],\n };\n}\n\nfunction createGroupNode(operator: 'AND' | 'OR' = 'AND'): IBuilderNode {\n return { id: crypto.randomUUID(), type: 'group', operator, children: [] };\n}\n\nfunction createActionNode(actionId = ''): IBuilderNode {\n return { id: crypto.randomUUID(), type: 'action', actionId };\n}\n\n/** Visual builder for AND/OR permission logic trees */\n@Component({\n selector: 'lib-logic-builder',\n imports: [AngularModule, PrimeModule, TranslatePipe],\n template: `\n <div class=\"logic-builder\">\n <div class=\"flex justify-between items-center mb-3\">\n <h4 class=\"text-sm font-semibold m-0\">\n {{ 'iam.logic.title' | translate }}\n </h4>\n @if (!builderLogic()) {\n <p-button\n [label]=\"'iam.logic.add.logic' | translate\"\n icon=\"pi pi-plus\"\n size=\"small\"\n (onClick)=\"initializeLogic()\"\n />\n } @else {\n <p-button\n [label]=\"'iam.logic.clear.logic' | translate\"\n icon=\"pi pi-trash\"\n size=\"small\"\n severity=\"danger\"\n [outlined]=\"true\"\n (onClick)=\"clearLogic()\"\n />\n }\n </div>\n\n @if (builderLogic()) {\n <div class=\"border border-surface rounded p-3 bg-surface-50\">\n <div class=\"mb-3 text-sm text-muted-color\">\n {{ 'iam.logic.description' | translate }}\n </div>\n\n <!-- Root Node -->\n <div class=\"text-sm bg-surface-0 rounded border border-surface\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeTemplate;\n context: { $implicit: builderLogic()!, depth: 0 }\n \"\n ></ng-container>\n </div>\n </div>\n }\n </div>\n\n <!-- Recursive Node Template -->\n <ng-template #nodeTemplate let-node let-depth=\"depth\">\n <div\n class=\"p-3 border-b border-surface\"\n [ngClass]=\"depth % 2 === 0 ? 'bg-surface-0' : 'bg-surface-50'\"\n >\n <div class=\"flex items-center gap-3 mb-2\">\n <span class=\"node-type\" [ngClass]=\"node.type\">{{\n node.type.toUpperCase()\n }}</span>\n\n <div class=\"flex-1 flex items-center gap-2\">\n @if (node.type === 'group') {\n <!-- Group: show operator toggle -->\n <span\n class=\"operator-badge\"\n [ngClass]=\"node.operator === 'AND' ? 'and' : 'or'\"\n (click)=\"toggleOperator(node.id)\"\n [title]=\"'iam.logic.click.to.toggle' | translate\"\n >\n {{ node.operator }}\n </span>\n <span class=\"text-muted-color text-xs\"\n >({{\n 'iam.logic.conditions'\n | translate: { count: node.children?.length || 0 }\n }})</span\n >\n }\n\n @if (node.type === 'action') {\n <!-- Action: show action selector -->\n <select\n class=\"action-select flex-1 p-2 border border-surface rounded text-sm\"\n [ngModel]=\"node.actionId\"\n (ngModelChange)=\"updateActionId(node.id, $event)\"\n >\n <option [value]=\"null\">\n {{ 'iam.logic.select.action' | translate }} ({{\n 'iam.logic.actions.available'\n | translate: { count: actions().length }\n }})\n </option>\n @for (action of actions(); track action.id) {\n <option [ngValue]=\"action.id\">{{ action.name }}</option>\n }\n </select>\n }\n </div>\n\n <div class=\"flex gap-1\">\n <p-button\n icon=\"pi pi-trash\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n (onClick)=\"removeNode(node.id)\"\n [pTooltip]=\"'shared.remove' | translate\"\n />\n </div>\n </div>\n\n <!-- Children for group nodes -->\n @if (\n node.type === 'group' && node.children && node.children.length > 0\n ) {\n <div class=\"ml-5 mt-2 pl-3 border-l-2 border-surface\">\n @for (child of node.children; track child.id) {\n <ng-container\n *ngTemplateOutlet=\"\n nodeTemplate;\n context: { $implicit: child, depth: depth + 1 }\n \"\n ></ng-container>\n }\n </div>\n }\n\n <!-- Add child buttons for group nodes -->\n @if (node.type === 'group') {\n <div\n class=\"mt-3 p-3 bg-surface-50 rounded border border-dashed border-surface\"\n >\n <div class=\"text-xs font-semibold text-muted-color mb-2\">\n {{ 'iam.logic.add.condition' | translate }}\n </div>\n <div class=\"flex gap-2 flex-wrap\">\n <p-button\n [label]=\"'iam.logic.group' | translate\"\n icon=\"pi pi-sitemap\"\n size=\"small\"\n [outlined]=\"true\"\n (onClick)=\"addChildNode(node.id, 'group')\"\n />\n <p-button\n [label]=\"'iam.logic.action' | translate\"\n icon=\"pi pi-bolt\"\n size=\"small\"\n severity=\"success\"\n [outlined]=\"true\"\n (onClick)=\"addChildNode(node.id, 'action')\"\n />\n </div>\n </div>\n }\n </div>\n </ng-template>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n /* Node type badges */\n .node-type {\n display: inline-flex;\n align-items: center;\n padding: 0.25rem 0.5rem;\n border-radius: 0.25rem;\n font-weight: 600;\n font-size: 0.75rem;\n text-transform: uppercase;\n }\n\n .node-type.group {\n background-color: var(--p-blue-100, #dbeafe);\n color: var(--p-blue-700, #1e40af);\n }\n\n .node-type.action {\n background-color: var(--p-green-100, #d1fae5);\n color: var(--p-green-700, #065f46);\n }\n\n /* Dark mode node type badges */\n :host-context(.p-dark) .node-type.group {\n background-color: rgba(59, 130, 246, 0.2);\n color: var(--p-blue-400, #60a5fa);\n }\n\n :host-context(.p-dark) .node-type.action {\n background-color: rgba(34, 197, 94, 0.2);\n color: var(--p-green-400, #4ade80);\n }\n\n /* Operator toggle badge */\n .operator-badge {\n display: inline-flex;\n align-items: center;\n padding: 0.125rem 0.5rem;\n border-radius: 9999px;\n font-weight: 600;\n font-size: 0.75rem;\n cursor: pointer;\n transition: opacity 0.2s;\n }\n\n .operator-badge.and {\n background-color: var(--p-yellow-100, #fef3c7);\n color: var(--p-yellow-700, #92400e);\n }\n\n .operator-badge.or {\n background-color: var(--p-indigo-100, #e0e7ff);\n color: var(--p-indigo-700, #3730a3);\n }\n\n /* Dark mode operator badges */\n :host-context(.p-dark) .operator-badge.and {\n background-color: rgba(234, 179, 8, 0.2);\n color: var(--p-yellow-400, #facc15);\n }\n\n :host-context(.p-dark) .operator-badge.or {\n background-color: rgba(99, 102, 241, 0.2);\n color: var(--p-indigo-400, #818cf8);\n }\n\n .operator-badge:hover {\n opacity: 0.8;\n }\n\n /* Action select styling */\n .action-select {\n background-color: var(--p-surface-0, #ffffff);\n color: var(--p-text-color, #1f2937);\n }\n\n :host-context(.p-dark) .action-select {\n background-color: var(--p-surface-900, #1f2937);\n color: var(--p-text-color, #f9fafb);\n }\n\n /* Focus state for select */\n .action-select:focus {\n outline: none;\n border-color: var(--p-primary-color, #3b82f6);\n }\n `,\n ],\n})\nexport class LogicBuilderComponent {\n readonly logic = input<ILogicNode | null>(null);\n readonly actions = input<Array<{ id: string; name: string }>>([]);\n readonly logicChange = output<ILogicNode | null>();\n\n /** Internal builder tree state (private writable + public readonly pattern) */\n private readonly _builderTree = signal<IBuilderNode | null>(null);\n readonly builderLogic = this._builderTree.asReadonly();\n\n constructor() {\n effect(\n () => {\n const logic = this.logic();\n if (!logic) {\n this._builderTree.set(null);\n } else if (!this._builderTree()) {\n this._builderTree.set(toBuilderNode(logic));\n }\n },\n { allowSignalWrites: true },\n );\n }\n\n initializeLogic(): void {\n this.updateTreeAndEmit(createGroupNode());\n }\n\n clearLogic(): void {\n this._builderTree.set(null);\n this.logicChange.emit(null);\n }\n\n toggleOperator(nodeId: string): void {\n this.updateNode(nodeId, (node) => ({\n ...node,\n operator: node.operator === 'AND' ? 'OR' : 'AND',\n }));\n }\n\n addChildNode(parentId: string, type: 'group' | 'action'): void {\n const newNode = type === 'group' ? createGroupNode() : createActionNode();\n this.updateNode(parentId, (node) => ({\n ...node,\n children: [...(node.children || []), newNode],\n }));\n }\n\n removeNode(nodeId: string): void {\n const tree = this._builderTree();\n if (!tree) return;\n\n if (tree.id === nodeId) {\n this.clearLogic();\n return;\n }\n\n this.updateTreeAndEmit(this.removeNodeFromTree(tree, nodeId));\n }\n\n updateActionId(nodeId: string, actionId: string): void {\n this.updateNode(nodeId, (node) => ({ ...node, actionId }));\n }\n\n /** Updates a node in the tree and emits the change */\n private updateNode(\n nodeId: string,\n updater: (node: IBuilderNode) => IBuilderNode,\n ): void {\n const tree = this._builderTree();\n if (!tree) return;\n this.updateTreeAndEmit(this.updateNodeInTree(tree, nodeId, updater));\n }\n\n /** Sets the tree and emits the change */\n private updateTreeAndEmit(tree: IBuilderNode): void {\n this._builderTree.set(tree);\n this.logicChange.emit(toLogicNode(tree));\n }\n\n private updateNodeInTree(\n node: IBuilderNode,\n targetId: string,\n updater: (node: IBuilderNode) => IBuilderNode,\n ): IBuilderNode {\n if (node.id === targetId) return updater(node);\n if (!node.children) return node;\n return {\n ...node,\n children: node.children.map((child) =>\n this.updateNodeInTree(child, targetId, updater),\n ),\n };\n }\n\n private removeNodeFromTree(\n node: IBuilderNode,\n targetId: string,\n ): IBuilderNode {\n if (!node.children) return node;\n return {\n ...node,\n children: node.children\n .filter((child) => child.id !== targetId)\n .map((child) => this.removeNodeFromTree(child, targetId)),\n };\n }\n}\n","import { TreeNode } from 'primeng/api';\nimport { IAction, IActionTreeDto } from '../interfaces/action.interface';\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<T extends { id?: string | null; parentId?: string | null }>(\n flatList: T[],\n): (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(actions: IActionTreeDto[]): 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","import { computed, inject, signal } from '@angular/core';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { IAction, IActionTreeDto, PermissionAction } from '../interfaces/public-api';\nimport { ActionPermissionLogicService } from '../services/action-permission-logic.service';\nimport { convertActionToTreeNode } from '../utils/tree-utils';\n\nexport abstract class BaseActionSelectorComponent {\n protected readonly permissionLogic = inject(ActionPermissionLogicService);\n protected readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n readonly loading = signal(false);\n readonly saving = signal(false);\n\n protected readonly _actions = signal<IAction[]>([]);\n readonly actions = this._actions.asReadonly();\n\n protected readonly _actionsTree = signal<IActionTreeDto[]>([]);\n protected readonly actionsTree = this._actionsTree.asReadonly();\n\n protected readonly _selectionMap = signal<Record<string, boolean>>({});\n readonly selectionMap = this._selectionMap.asReadonly();\n\n protected readonly _initialSelection = signal<Record<string, boolean>>({});\n protected readonly initialSelection = this._initialSelection.asReadonly();\n\n readonly treeNodes = computed(() => convertActionToTreeNode(this.actionsTree()));\n\n readonly allSelected = computed(() => {\n const selMap = this.selectionMap();\n const total = this.actions().length;\n if (total === 0) return false;\n return Object.values(selMap).filter((v) => v).length === total;\n });\n\n readonly hasChanges = computed(() => {\n const current = this.selectionMap();\n const initial = this.initialSelection();\n const currentKeys = Object.keys(current);\n if (currentKeys.length !== Object.keys(initial).length) return true;\n return currentKeys.some((key) => current[key] !== initial[key]);\n });\n\n readonly actionsWithUnmetPrerequisites = computed(() => {\n const selMap = this.selectionMap();\n const allActions = this.actions();\n const unmetSet = new Set<string>();\n for (const action of allActions) {\n if (action.id && this.permissionLogic.hasUnmetPrerequisites(action, selMap, allActions)) {\n unmetSet.add(action.id);\n }\n }\n return unmetSet;\n });\n\n readonly invalidActionsCount = computed(() => this.actionsWithUnmetPrerequisites().size);\n\n readonly pendingAdd = computed(() => {\n const current = this.selectionMap();\n const initial = this.initialSelection();\n return this.actions().filter((a) => current[a.id as string] && !initial[a.id as string]);\n });\n\n readonly pendingRemove = computed(() => {\n const current = this.selectionMap();\n const initial = this.initialSelection();\n return this.actions().filter((a) => !current[a.id as string] && initial[a.id as string]);\n });\n\n readonly canSave = computed(\n () => this.hasChanges() && !this.saving() && this.invalidActionsCount() === 0,\n );\n\n protected translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n hasUnmetPrerequisites(action: IAction): boolean {\n return action.id ? this.actionsWithUnmetPrerequisites().has(action.id) : false;\n }\n\n getTooltip(action: IAction): string {\n const selMap = this.selectionMap();\n const isCurrentlySelected = selMap[action.id as string];\n\n if (action.permissionLogic) {\n const prerequisiteInfo = this.permissionLogic.getPrerequisiteTooltip(\n action,\n selMap,\n this.actions(),\n );\n if (prerequisiteInfo) {\n const actionHint = isCurrentlySelected\n ? `\\n\\n---\\n[${this.translate('shared.remove')}] ${this.translate('iam.tooltip.remove.action')}`\n : `\\n\\n---\\n[${this.translate('shared.add')}] ${this.translate('iam.tooltip.add.action')}`;\n return `${prerequisiteInfo}${actionHint}`;\n }\n }\n\n return this.getDefaultTooltip(isCurrentlySelected);\n }\n\n protected abstract getDefaultTooltip(isSelected: boolean): string;\n\n onActionToggle(action: IAction, newValue: boolean): void {\n if (!newValue) {\n this.permissionLogic.handleUncheck(\n action,\n this.selectionMap(),\n this.actions(),\n (newMap) => this._selectionMap.set(newMap),\n );\n } else {\n this.permissionLogic.handleCheck(\n action,\n this.selectionMap(),\n this.actions(),\n (newMap) => this._selectionMap.set(newMap),\n (previousState) => this._selectionMap.set(previousState),\n );\n }\n }\n\n toggleAll(): void {\n this.setAllSelection(!this.allSelected());\n }\n\n selectAll(): void {\n this.setAllSelection(true);\n }\n\n deselectAll(): void {\n this.setAllSelection(false);\n }\n\n protected setAllSelection(value: boolean): void {\n this._selectionMap.set(this.buildSelectionMap(this.actions(), () => value));\n }\n\n protected buildSelectionMap(\n actions: IAction[],\n predicate: (action: IAction) => boolean,\n ): Record<string, boolean> {\n const selMap: Record<string, boolean> = {};\n for (const action of actions) {\n selMap[action.id as string] = predicate(action);\n }\n return selMap;\n }\n\n protected buildPayloadItems(): Array<{ id: string; action: PermissionAction }> {\n const items: Array<{ id: string; action: PermissionAction }> = [];\n for (const action of this.pendingAdd()) {\n items.push({ id: action.id as string, action: 'add' });\n }\n for (const action of this.pendingRemove()) {\n items.push({ id: action.id as string, action: 'remove' });\n }\n return items;\n }\n\n protected resetState(): void {\n this._actionsTree.set([]);\n this._actions.set([]);\n this._selectionMap.set({});\n this._initialSelection.set({});\n }\n}\n","import {\n Component,\n DestroyRef,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n HasPermissionDirective,\n PrimeModule,\n ROLE_ACTION_PERMISSIONS,\n TranslatePipe,\n} from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { firstValueFrom } from 'rxjs';\nimport { MAX_DROPDOWN_ITEMS } from '../constants/pagination.constants';\nimport { IActionTreeDto, IRole } from '../interfaces/public-api';\nimport { ActionApiService } from '../services/action-api.service';\nimport { PermissionApiService } from '../services/permission-api.service';\nimport { RoleApiService } from '../services/role-api.service';\nimport { buildTreeFromFlat } from '../utils/tree-utils';\nimport { BaseActionSelectorComponent } from './base-action-selector';\n\n@Component({\n selector: 'flusys-role-action-selector',\n imports: [FormsModule, PrimeModule, HasPermissionDirective, TranslatePipe],\n template: `\n <div class=\"role-action-selector\">\n <div class=\"mb-4\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n <div>\n <label class=\"block font-semibold mb-2\">{{\n 'iam.permission.select.role' | translate\n }}</label>\n <p-select\n [ngModel]=\"selectedRoleId()\"\n (ngModelChange)=\"selectedRoleId.set($event)\"\n [options]=\"roles()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"\n 'iam.permission.select.role.placeholder' | translate\n \"\n [showClear]=\"true\"\n [filter]=\"true\"\n class=\"w-full\"\n />\n </div>\n </div>\n </div>\n\n @if (selectedRoleId()) {\n @if (loading()) {\n <div\n class=\"surface-card p-5 rounded-border shadow-sm flex justify-center\"\n >\n <i class=\"pi pi-spin pi-spinner text-primary text-5xl\"></i>\n </div>\n }\n\n @if (!loading() && actions().length > 0) {\n <div class=\"surface-card p-4 rounded-border shadow-sm\">\n <div\n class=\"flex flex-col md:flex-row justify-between items-start md:items-center gap-3 mb-4\"\n >\n <div>\n <h5 class=\"m-0 mb-1\">\n {{ 'iam.permission.action.permissions' | translate }}\n </h5>\n <p class=\"text-sm text-muted-color m-0\">\n {{\n 'iam.permission.actions.available'\n | translate: { count: actions().length }\n }}\n </p>\n </div>\n <div class=\"flex flex-wrap gap-2\">\n <p-button\n [label]=\"'shared.select.all' | translate\"\n icon=\"pi pi-check\"\n [outlined]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n (onClick)=\"selectAll()\"\n />\n <p-button\n [label]=\"'shared.deselect.all' | translate\"\n icon=\"pi pi-times\"\n [outlined]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n (onClick)=\"deselectAll()\"\n />\n <p-button\n *hasPermission=\"ROLE_ACTION_PERMISSIONS.ASSIGN\"\n [label]=\"'shared.save.changes' | translate\"\n icon=\"pi pi-save\"\n [disabled]=\"!canSave()\"\n [loading]=\"saving()\"\n size=\"small\"\n severity=\"success\"\n (onClick)=\"saveChanges()\"\n />\n </div>\n </div>\n\n @if (invalidActionsCount() > 0) {\n <div class=\"validation-warning rounded-border p-3 mb-4\">\n <div class=\"flex items-start gap-2\">\n <i class=\"pi pi-exclamation-triangle text-xl\"></i>\n <div class=\"flex-1\">\n <span class=\"font-semibold\"\n >{{ 'iam.validation.warning.title' | translate }}:</span\n >\n <p class=\"text-sm mt-1 mb-0\">\n {{\n (invalidActionsCount() > 1\n ? 'iam.validation.unmet.prerequisites.plural'\n : 'iam.validation.unmet.prerequisites.singular'\n ) | translate: { count: invalidActionsCount() }\n }}\n </p>\n </div>\n </div>\n </div>\n }\n\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <p-treeTable\n [value]=\"treeNodes()\"\n dataKey=\"id\"\n class=\"p-treetable-sm\"\n [tableStyle]=\"{ 'min-width': '50rem' }\"\n >\n <ng-template #header>\n <tr>\n <th class=\"w-12\">\n <p-checkbox\n [ngModel]=\"allSelected()\"\n [binary]=\"true\"\n (ngModelChange)=\"toggleAll()\"\n [pTooltip]=\"'shared.select.deselect.all' | translate\"\n tooltipPosition=\"top\"\n />\n </th>\n <th>{{ 'shared.name' | translate }}</th>\n <th class=\"hidden md:table-cell\">\n {{ 'shared.code' | translate }}\n </th>\n <th>{{ 'iam.action.type' | translate }}</th>\n <th class=\"hidden lg:table-cell\">\n {{ 'iam.permission.requirements' | translate }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body let-rowNode let-rowData=\"rowData\">\n @let hasUnmet = hasUnmetPrerequisites(rowData);\n @let tooltip = getTooltip(rowData);\n <tr [class.highlight-warning]=\"hasUnmet\">\n <td class=\"w-12\">\n <p-checkbox\n [ngModel]=\"selectionMap()[rowData.id]\"\n [binary]=\"true\"\n (ngModelChange)=\"onActionToggle(rowData, $event)\"\n [pTooltip]=\"tooltip\"\n tooltipPosition=\"top\"\n />\n </td>\n <td>\n <p-treeTableToggler [rowNode]=\"rowNode\" />\n <span class=\"inline-flex items-center gap-2\">\n {{ rowData.name }}\n @if (hasUnmet) {\n <i\n class=\"pi pi-exclamation-triangle text-orange-500\"\n [pTooltip]=\"\n 'iam.validation.unmet.prerequisites.tooltip'\n | translate\n \"\n tooltipPosition=\"top\"\n ></i>\n }\n </span>\n </td>\n <td class=\"hidden md:table-cell\">\n {{ rowData.code || '-' }}\n </td>\n <td>\n <p-tag\n [value]=\"rowData.actionType\"\n [severity]=\"\n rowData.actionType === 'backend' ? 'info' : 'success'\n \"\n />\n </td>\n <td class=\"hidden lg:table-cell\">\n @if (rowData.permissionLogic) {\n <span class=\"text-sm text-muted-color\">{{\n 'iam.permission.has.prerequisites' | translate\n }}</span>\n } @else {\n <span class=\"text-muted-color\">-</span>\n }\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"5\" class=\"text-center p-4 text-muted-color\">\n @if (loading()) {\n <i class=\"pi pi-spin pi-spinner\"></i>\n {{ 'shared.loading.actions' | translate }}\n } @else {\n {{ 'iam.permission.no.actions.available' | translate }}\n }\n </td>\n </tr>\n </ng-template>\n </p-treeTable>\n </div>\n </div>\n\n @if (hasChanges()) {\n <div class=\"border border-surface rounded-border p-3 mt-4\">\n <div class=\"flex items-center gap-2 mb-3\">\n <i class=\"pi pi-info-circle text-primary\"></i>\n <span class=\"font-bold\">{{\n 'shared.pending.changes' | translate\n }}</span>\n </div>\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n @if (pendingAdd().length > 0) {\n <div>\n <div class=\"flex items-center gap-2 mb-2\">\n <i class=\"pi pi-plus-circle text-green-500\"></i>\n <strong class=\"text-sm\"\n >{{ 'shared.to.add' | translate }} ({{\n pendingAdd().length\n }})</strong\n >\n </div>\n <ul class=\"list-none p-0 m-0 pl-4\">\n @for (action of pendingAdd(); track action.id) {\n <li class=\"text-sm mb-1\">{{ action.name }}</li>\n }\n </ul>\n </div>\n }\n @if (pendingRemove().length > 0) {\n <div>\n <div class=\"flex items-center gap-2 mb-2\">\n <i class=\"pi pi-minus-circle text-red-500\"></i>\n <strong class=\"text-sm\"\n >{{ 'shared.to.remove' | translate }} ({{\n pendingRemove().length\n }})</strong\n >\n </div>\n <ul class=\"list-none p-0 m-0 pl-4\">\n @for (action of pendingRemove(); track action.id) {\n <li class=\"text-sm mb-1\">{{ action.name }}</li>\n }\n </ul>\n </div>\n }\n </div>\n </div>\n }\n }\n\n @if (!loading() && actions().length === 0) {\n <div class=\"surface-card p-5 rounded-border shadow-sm text-center\">\n <i\n class=\"pi pi-info-circle text-muted-color mb-3 block text-5xl\"\n ></i>\n <p class=\"text-muted-color m-0\">\n {{ 'iam.permission.no.actions.for.role' | translate }}\n </p>\n </div>\n }\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n .validation-warning {\n background-color: var(--p-yellow-50, #fefce8);\n border-left: 4px solid var(--p-yellow-500, #eab308);\n color: var(--p-yellow-700, #a16207);\n }\n :host-context(.p-dark) .validation-warning {\n background-color: rgba(234, 179, 8, 0.1);\n color: var(--p-yellow-400, #facc15);\n }\n :host ::ng-deep tr.highlight-warning {\n background-color: var(--p-red-50, rgba(239, 68, 68, 0.1)) !important;\n }\n :host-context(.p-dark) ::ng-deep tr.highlight-warning {\n background-color: rgba(239, 68, 68, 0.15) !important;\n }\n `,\n ],\n})\nexport class RoleActionSelectorComponent extends BaseActionSelectorComponent {\n readonly ROLE_ACTION_PERMISSIONS = ROLE_ACTION_PERMISSIONS;\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly roleApi = inject(RoleApiService);\n private readonly actionApi = inject(ActionApiService);\n private readonly permissionApi = inject(PermissionApiService);\n private readonly messageService = inject(MessageService);\n\n readonly selectedRoleId = signal<string | undefined>(undefined);\n readonly roles = signal<IRole[]>([]);\n\n private loadDataAbortController: AbortController | null = null;\n\n constructor() {\n super();\n this.destroyRef.onDestroy(() => {\n this.loadDataAbortController?.abort();\n });\n\n this.loadRoles();\n\n effect(() => {\n const roleId = this.selectedRoleId();\n this.loadDataAbortController?.abort();\n\n if (roleId) {\n this.loadDataAbortController = new AbortController();\n this.onRoleChange(this.loadDataAbortController.signal).catch((err) => {\n if (err.name !== 'AbortError') {\n this.loading.set(false);\n }\n });\n } else {\n this.resetState();\n }\n });\n }\n\n protected getDefaultTooltip(isSelected: boolean): string {\n if (isSelected) {\n return `[${this.translate('shared.assigned')}] ${this.translate('iam.tooltip.assigned.to.role')}\\n\\n[${this.translate('shared.remove')}] ${this.translate('iam.tooltip.click.to.remove.role')}`;\n }\n return `[${this.translate('shared.add')}] ${this.translate('iam.tooltip.click.to.assign.role')}`;\n }\n\n private async loadRoles(): Promise<void> {\n try {\n const response = await this.roleApi.getAll({\n pagination: { currentPage: 0, pageSize: MAX_DROPDOWN_ITEMS },\n });\n this.roles.set(response?.data ?? []);\n } catch {\n }\n }\n\n private async onRoleChange(signal: AbortSignal): Promise<void> {\n const roleId = this.selectedRoleId();\n if (!roleId) return;\n\n this.loading.set(true);\n try {\n const actionsResponse = await firstValueFrom(\n this.actionApi.getActionsForPermission(),\n );\n\n if (signal.aborted) return;\n\n const flatActions = (actionsResponse?.data ?? []).filter((a) => !!a.id);\n const actionsTree = buildTreeFromFlat(flatActions) as IActionTreeDto[];\n\n this._actionsTree.set(actionsTree);\n this._actions.set(flatActions);\n\n const assignedResponse = await firstValueFrom(\n this.permissionApi.getRoleActions(roleId),\n );\n\n if (signal.aborted) return;\n\n const assignedIds = new Set(\n (assignedResponse?.data || []).map((a) => a.actionId),\n );\n\n const selMap = this.buildSelectionMap(flatActions, (action) =>\n assignedIds.has(action.id as string),\n );\n this._selectionMap.set(selMap);\n this._initialSelection.set({ ...selMap });\n } finally {\n if (!signal.aborted) {\n this.loading.set(false);\n }\n }\n }\n\n async saveChanges(): Promise<void> {\n const roleId = this.selectedRoleId();\n if (!roleId) return;\n\n const invalidActions = this.permissionLogic.getActionsWithUnmetPrerequisites(\n this.selectionMap(),\n this.actions(),\n );\n if (invalidActions.length > 0) {\n this.permissionLogic.showValidationErrorDialog(\n invalidActions,\n this.selectionMap(),\n this.actions(),\n (newMap) => this._selectionMap.set(newMap),\n );\n return;\n }\n\n const items = this.buildPayloadItems();\n if (items.length === 0) return;\n\n this.saving.set(true);\n try {\n const response = await firstValueFrom(\n this.permissionApi.assignRoleActions({ roleId, items }),\n );\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._initialSelection.set({ ...this.selectionMap() });\n } catch {\n } finally {\n this.saving.set(false);\n }\n }\n}\n","import { Component, DestroyRef, effect, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n COMPANY_ACTION_PERMISSIONS,\n COMPANY_API_PROVIDER,\n HasPermissionDirective,\n PrimeModule,\n TranslatePipe,\n} from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { firstValueFrom } from 'rxjs';\nimport { MAX_DROPDOWN_ITEMS } from '../constants/pagination.constants';\nimport {\n ICompany,\n IPrerequisiteValidationError,\n} from '../interfaces/public-api';\nimport { ActionApiService } from '../services/action-api.service';\nimport { PermissionApiService } from '../services/permission-api.service';\nimport { flattenTree } from '../utils/tree-utils';\nimport { BaseActionSelectorComponent } from './base-action-selector';\n\n@Component({\n selector: 'flusys-company-action-selector',\n imports: [\n FormsModule,\n PrimeModule,\n HasPermissionDirective,\n TranslatePipe,\n ],\n template: `\n <div class=\"company-action-selector\">\n <div class=\"mb-4\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n <div>\n <label class=\"block font-semibold mb-2\">{{\n 'iam.permission.select.company' | translate\n }}</label>\n <p-select\n [ngModel]=\"selectedCompanyId()\"\n (ngModelChange)=\"selectedCompanyId.set($event)\"\n [options]=\"companies()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"\n 'iam.permission.select.company.placeholder' | translate\n \"\n [showClear]=\"true\"\n [filter]=\"true\"\n class=\"w-full\"\n />\n </div>\n </div>\n </div>\n\n @if (selectedCompanyId()) {\n @if (loading()) {\n <div\n class=\"surface-card p-5 rounded-border shadow-sm flex justify-center\"\n >\n <i class=\"pi pi-spin pi-spinner text-primary text-5xl\"></i>\n </div>\n }\n\n @if (!loading() && actions().length > 0) {\n <div class=\"surface-card p-4 rounded-border shadow-sm\">\n <div\n class=\"flex flex-col md:flex-row justify-between items-start md:items-center gap-3 mb-4\"\n >\n <div>\n <h5 class=\"m-0 mb-1\">\n {{ 'iam.permission.action.whitelist' | translate }}\n </h5>\n <p class=\"text-sm text-muted-color m-0\">\n {{\n 'iam.permission.actions.available'\n | translate: { count: actions().length }\n }}\n </p>\n </div>\n <div class=\"flex flex-wrap gap-2\">\n <p-button\n [label]=\"'shared.select.all' | translate\"\n icon=\"pi pi-check\"\n [outlined]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n (onClick)=\"selectAll()\"\n />\n <p-button\n [label]=\"'shared.deselect.all' | translate\"\n icon=\"pi pi-times\"\n [outlined]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n (onClick)=\"deselectAll()\"\n />\n <p-button\n *hasPermission=\"COMPANY_ACTION_PERMISSIONS.ASSIGN\"\n [label]=\"'shared.save.changes' | translate\"\n icon=\"pi pi-save\"\n [disabled]=\"!canSave()\"\n [loading]=\"saving()\"\n size=\"small\"\n severity=\"success\"\n (onClick)=\"saveChanges()\"\n />\n </div>\n </div>\n\n @if (invalidActionsCount() > 0) {\n <div class=\"validation-warning rounded-border p-3 mb-4\">\n <div class=\"flex items-start gap-2\">\n <i class=\"pi pi-exclamation-triangle text-xl\"></i>\n <div class=\"flex-1\">\n <span class=\"font-semibold\"\n >{{ 'iam.validation.warning.title' | translate }}:</span\n >\n <p class=\"text-sm mt-1 mb-0\">\n {{\n (invalidActionsCount() > 1\n ? 'iam.validation.unmet.prerequisites.plural'\n : 'iam.validation.unmet.prerequisites.singular'\n ) | translate: { count: invalidActionsCount() }\n }}\n </p>\n </div>\n </div>\n </div>\n }\n\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <p-treeTable\n [value]=\"treeNodes()\"\n dataKey=\"id\"\n class=\"p-treetable-sm\"\n [tableStyle]=\"{ 'min-width': '50rem' }\"\n >\n <ng-template #header>\n <tr>\n <th class=\"w-12\">\n <p-checkbox\n [ngModel]=\"allSelected()\"\n [binary]=\"true\"\n (ngModelChange)=\"toggleAll()\"\n [pTooltip]=\"'shared.select.deselect.all' | translate\"\n tooltipPosition=\"top\"\n />\n </th>\n <th>{{ 'shared.name' | translate }}</th>\n <th class=\"hidden md:table-cell\">\n {{ 'shared.code' | translate }}\n </th>\n <th>{{ 'iam.action.type' | translate }}</th>\n <th class=\"hidden lg:table-cell\">\n {{ 'shared.description' | translate }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body let-rowNode let-rowData=\"rowData\">\n @let hasUnmet = hasUnmetPrerequisites(rowData);\n <tr [class.highlight-warning]=\"hasUnmet\">\n <td class=\"w-12\">\n <p-checkbox\n [ngModel]=\"selectionMap()[rowData.id]\"\n [binary]=\"true\"\n (ngModelChange)=\"onActionToggle(rowData, $event)\"\n [pTooltip]=\"getTooltip(rowData)\"\n tooltipPosition=\"top\"\n />\n </td>\n <td>\n <p-treeTableToggler [rowNode]=\"rowNode\" />\n <span class=\"inline-flex items-center gap-2\">\n {{ rowData.name }}\n @if (hasUnmet) {\n <i\n class=\"pi pi-exclamation-triangle text-orange-500\"\n [pTooltip]=\"\n 'iam.validation.unmet.prerequisites.tooltip'\n | translate\n \"\n tooltipPosition=\"top\"\n ></i>\n }\n </span>\n </td>\n <td class=\"hidden md:table-cell\">\n {{ rowData.code || '-' }}\n </td>\n <td>\n <p-tag\n [value]=\"rowData.actionType\"\n [severity]=\"\n rowData.actionType === 'backend' ? 'info' : 'success'\n \"\n />\n </td>\n <td class=\"hidden lg:table-cell\">\n {{ rowData.description || '-' }}\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"5\" class=\"text-center p-4 text-muted-color\">\n @if (loading()) {\n <i class=\"pi pi-spin pi-spinner\"></i>\n {{ 'shared.loading.actions' | translate }}\n } @else {\n {{ 'iam.permission.no.actions.available' | translate }}\n }\n </td>\n </tr>\n </ng-template>\n </p-treeTable>\n </div>\n </div>\n\n @if (hasChanges()) {\n <div class=\"border border-surface rounded-border p-3 mt-4\">\n <div class=\"flex items-center gap-2 mb-3\">\n <i class=\"pi pi-info-circle text-primary\"></i>\n <span class=\"font-bold\">{{\n 'shared.pending.changes' | translate\n }}</span>\n </div>\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n @if (pendingAdd().length > 0) {\n <div>\n <div class=\"flex items-center gap-2 mb-2\">\n <i class=\"pi pi-plus-circle text-green-500\"></i>\n <strong class=\"text-sm\"\n >{{ 'shared.to.whitelist' | translate }} ({{\n pendingAdd().length\n }})</strong\n >\n </div>\n <ul class=\"list-none p-0 m-0 pl-4\">\n @for (action of pendingAdd(); track action.id) {\n <li class=\"text-sm mb-1\">{{ action.name }}</li>\n }\n </ul>\n </div>\n }\n @if (pendingRemove().length > 0) {\n <div>\n <div class=\"flex items-center gap-2 mb-2\">\n <i class=\"pi pi-minus-circle text-red-500\"></i>\n <strong class=\"text-sm\"\n >{{ 'shared.to.remove' | translate }} ({{\n pendingRemove().length\n }})</strong\n >\n </div>\n <ul class=\"list-none p-0 m-0 pl-4\">\n @for (action of pendingRemove(); track action.id) {\n <li class=\"text-sm mb-1\">{{ action.name }}</li>\n }\n </ul>\n </div>\n }\n </div>\n </div>\n }\n }\n\n @if (!loading() && actions().length === 0) {\n <div class=\"surface-card p-5 rounded-border shadow-sm text-center\">\n <i\n class=\"pi pi-info-circle text-muted-color mb-3 block text-5xl\"\n ></i>\n <p class=\"text-muted-color m-0\">\n {{ 'iam.permission.no.actions.for.company' | translate }}\n </p>\n </div>\n }\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n .validation-warning {\n background-color: var(--p-yellow-50, #fefce8);\n border-left: 4px solid var(--p-yellow-500, #eab308);\n color: var(--p-yellow-700, #a16207);\n }\n :host-context(.p-dark) .validation-warning {\n background-color: rgba(234, 179, 8, 0.1);\n color: var(--p-yellow-400, #facc15);\n }\n :host ::ng-deep tr.highlight-warning {\n background-color: var(--p-red-50, rgba(239, 68, 68, 0.1)) !important;\n }\n :host-context(.p-dark) ::ng-deep tr.highlight-warning {\n background-color: rgba(239, 68, 68, 0.15) !important;\n }\n `,\n ],\n})\nexport class CompanyActionSelectorComponent extends BaseActionSelectorComponent {\n readonly COMPANY_ACTION_PERMISSIONS = COMPANY_ACTION_PERMISSIONS;\n\n private readonly companyApiProvider = inject(COMPANY_API_PROVIDER);\n private readonly actionApi = inject(ActionApiService);\n private readonly permissionApi = inject(PermissionApiService);\n private readonly messageService = inject(MessageService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly selectedCompanyId = signal<string | undefined>(undefined);\n readonly companies = signal<ICompany[]>([]);\n\n private loadDataAbortController: AbortController | null = null;\n\n constructor() {\n super();\n this.destroyRef.onDestroy(() => {\n this.loadDataAbortController?.abort();\n });\n\n this.loadCompanies();\n\n effect(() => {\n const companyId = this.selectedCompanyId();\n this.loadDataAbortController?.abort();\n\n if (companyId) {\n this.loadDataAbortController = new AbortController();\n this.loadData(this.loadDataAbortController.signal).catch((err) => {\n if (err.name !== 'AbortError') {\n this.loading.set(false);\n }\n });\n } else {\n this.resetState();\n }\n });\n }\n\n protected getDefaultTooltip(isSelected: boolean): string {\n if (isSelected) {\n return `[${this.translate('iam.tooltip.selected')}] ${this.translate('iam.tooltip.selected')}\\n\\n[${this.translate('shared.remove')}] ${this.translate('iam.tooltip.click.to.remove')}`;\n }\n return `[${this.translate('shared.add')}] ${this.translate('iam.tooltip.click.to.add')}`;\n }\n\n private async loadCompanies(): Promise<void> {\n try {\n const response = await firstValueFrom(\n this.companyApiProvider.getCompanies({\n page: 0,\n pageSize: MAX_DROPDOWN_ITEMS,\n }),\n );\n this.companies.set(response?.data ?? []);\n } catch {\n }\n }\n\n private async loadData(signal: AbortSignal): Promise<void> {\n const companyId = this.selectedCompanyId();\n if (!companyId) return;\n\n this.loading.set(true);\n try {\n const actionsResponse = await firstValueFrom(\n this.actionApi.getTree(undefined, undefined, false),\n );\n\n if (signal.aborted) return;\n\n const actionsTree = actionsResponse?.data ?? [];\n const actionsList = flattenTree(actionsTree).filter((a) => !!a.id);\n\n this._actionsTree.set(actionsTree);\n this._actions.set(actionsList);\n\n const assignedResponse = await firstValueFrom(\n this.permissionApi.getCompanyActions(companyId),\n );\n\n if (signal.aborted) return;\n\n const assignedIds = new Set(\n (assignedResponse?.data || []).map((a) => a.actionId),\n );\n\n const selMap = this.buildSelectionMap(actionsList, (action) =>\n assignedIds.has(action.id as string),\n );\n this._selectionMap.set(selMap);\n this._initialSelection.set({ ...selMap });\n } finally {\n if (!signal.aborted) {\n this.loading.set(false);\n }\n }\n }\n\n async saveChanges(): Promise<void> {\n const companyId = this.selectedCompanyId();\n if (!companyId) return;\n\n const invalidActions =\n this.permissionLogic.getActionsWithUnmetPrerequisites(\n this.selectionMap(),\n this.actions(),\n );\n if (invalidActions.length > 0) {\n this.permissionLogic.showValidationErrorDialog(\n invalidActions,\n this.selectionMap(),\n this.actions(),\n (newMap) => this._selectionMap.set(newMap),\n );\n return;\n }\n\n const items = this.buildPayloadItems();\n if (items.length === 0) return;\n\n this.saving.set(true);\n try {\n const response = await firstValueFrom(\n this.permissionApi.assignCompanyActions({ companyId, items }),\n );\n\n if (\n response?.data?.prerequisiteErrors &&\n response.data.prerequisiteErrors.length > 0\n ) {\n this.handleBackendPrerequisiteErrors(response.data.prerequisiteErrors);\n return;\n }\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._initialSelection.set({ ...this.selectionMap() });\n } catch {\n } finally {\n this.saving.set(false);\n }\n }\n\n private handleBackendPrerequisiteErrors(\n prerequisiteErrors: IPrerequisiteValidationError[],\n ): void {\n const errorList = prerequisiteErrors\n .map((error) => {\n const requiredNames = error.requiredActions\n .map((a) => a.actionName)\n .join(', ');\n return `${error.actionName} ${this.translate('iam.permission.requires')}: ${requiredNames}`;\n })\n .join('\\n');\n\n this.confirmationService.confirm({\n header: this.translate('iam.permission.prerequisite.validation.failed'),\n message: `${this.translate('iam.permission.prerequisite.error.message')}\\n\\n${errorList}\\n\\n${this.translate('iam.permission.auto.select.prompt')}`,\n icon: 'pi pi-exclamation-triangle',\n acceptLabel: this.translate('iam.permission.auto.select.required'),\n rejectLabel: this.translate('shared.cancel'),\n acceptIcon: 'pi pi-check',\n rejectIcon: 'pi pi-times',\n accept: () => {\n const selMap = { ...this.selectionMap() };\n prerequisiteErrors.forEach((error) => {\n error.requiredActions.forEach((a) => {\n selMap[a.actionId] = true;\n });\n });\n this._selectionMap.set(selMap);\n this.messageService.add({\n severity: 'info',\n summary: this.translate('iam.permission.actions.selected'),\n detail: this.translate('iam.permission.auto.selected.prerequisites'),\n });\n },\n reject: () => {\n this._selectionMap.set({ ...this.initialSelection() });\n this.messageService.add({\n severity: 'info',\n summary: this.translate('iam.permission.changes.reverted'),\n detail: this.translate('iam.permission.selection.reverted'),\n });\n },\n });\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, effect, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n APP_CONFIG,\n isCompanyFeatureEnabled,\n TRANSLATE_ADAPTER,\n} from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport {\n HasPermissionDirective,\n PrimeModule,\n TranslatePipe,\n USER_PERMISSION_PROVIDER,\n USER_ROLE_PERMISSIONS,\n UserSelectComponent,\n} from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { firstValueFrom } from 'rxjs';\nimport { MAX_DROPDOWN_ITEMS } from '../constants/pagination.constants';\nimport { IBranch, IRole, PermissionAction } from '../interfaces/public-api';\nimport { PermissionApiService } from '../services/permission-api.service';\nimport { RoleApiService } from '../services/role-api.service';\n\n/**\n * User-Role Selector Component\n *\n * Manages user role assignments with branch-level granularity.\n *\n * **Architecture:**\n * - Presentation: DataTable for role list\n * - Business Logic: Role assignment without dependency validation\n * - State: Signals with computed dependencies\n *\n * **Core Features:**\n * - User dropdown with async loading\n * - Branch selector (if company feature enabled)\n * - Role assignment management (add/remove)\n * - Real-time change tracking\n *\n * **Granularity:**\n * - Company-wide: branchId = undefined\n * - Branch-specific: branchId = selected value\n *\n * **Performance:**\n * - Computed signals for reactive updates\n * - Branch filtering on company context change\n *\n * @example\n * ```html\n * <flusys-user-role-selector />\n * ```\n */\n@Component({\n selector: 'flusys-user-role-selector',\n imports: [\n CommonModule,\n FormsModule,\n PrimeModule,\n HasPermissionDirective,\n UserSelectComponent,\n TranslatePipe,\n ],\n template: `\n <div class=\"user-role-selector\">\n <!-- User and Branch Selectors -->\n <div class=\"surface-card p-4 rounded-border mb-4 shadow-sm\">\n <div class=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <div>\n <label class=\"block font-semibold mb-2\">\n <i class=\"pi pi-user mr-2 text-primary\"></i>\n {{ 'iam.permission.select.user' | translate }}\n </label>\n <lib-user-select\n [value]=\"selectedUserId()\"\n (valueChange)=\"selectedUserId.set($event)\"\n [isEditMode]=\"true\"\n [placeHolder]=\"\n 'iam.permission.select.user.placeholder' | translate\n \"\n />\n </div>\n\n @if (showBranchSelector()) {\n <div>\n <label class=\"block font-semibold mb-2\">\n <i class=\"pi pi-building mr-2 text-primary\"></i>\n {{ 'iam.permission.select.branch' | translate }}\n </label>\n <p-select\n [ngModel]=\"selectedBranchId()\"\n (ngModelChange)=\"selectedBranchId.set($event)\"\n [options]=\"filteredBranches()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"\n 'iam.permission.select.branch.placeholder' | translate\n \"\n [showClear]=\"true\"\n [filter]=\"true\"\n styleClass=\"w-full\"\n >\n <ng-template #selectedItem let-branch>\n @if (branch) {\n <div class=\"flex items-center gap-2\">\n <i class=\"pi pi-building text-primary\"></i>\n <span class=\"font-semibold\">{{ branch.name }}</span>\n </div>\n }\n </ng-template>\n <ng-template #item let-branch>\n <div class=\"flex items-center gap-2\">\n <i class=\"pi pi-building text-muted-color\"></i>\n <span>{{ branch.name }}</span>\n </div>\n </ng-template>\n </p-select>\n <small class=\"text-muted-color block mt-1\">\n {{\n (filteredBranches().length !== 1\n ? 'iam.branch.permitted.count.plural'\n : 'iam.branch.permitted.count'\n ) | translate: { count: filteredBranches().length }\n }}\n </small>\n </div>\n }\n </div>\n </div>\n\n @if (selectedUserId()) {\n <!-- Loading State -->\n @if (loading()) {\n <div\n class=\"surface-card p-5 rounded-border shadow-sm flex justify-center\"\n >\n <i class=\"pi pi-spin pi-spinner text-primary text-5xl\"></i>\n </div>\n }\n\n <!-- Role List -->\n @if (!loading() && roles().length > 0) {\n <div class=\"surface-card p-4 rounded-border shadow-sm\">\n <div\n class=\"flex flex-col md:flex-row justify-between items-start md:items-center gap-3 mb-4\"\n >\n <div>\n <h5 class=\"m-0 mb-1\">\n {{ 'iam.permission.role.assignments' | translate }}\n </h5>\n <p class=\"text-sm text-muted-color m-0\">\n {{\n 'iam.permission.roles.available'\n | translate: { count: roles().length }\n }}\n </p>\n </div>\n <div class=\"flex flex-wrap gap-2\">\n <p-button\n [label]=\"'shared.select.all' | translate\"\n icon=\"pi pi-check\"\n [outlined]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n (onClick)=\"selectAll()\"\n />\n <p-button\n [label]=\"'shared.deselect.all' | translate\"\n icon=\"pi pi-times\"\n [outlined]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n (onClick)=\"deselectAll()\"\n />\n <p-button\n *hasPermission=\"USER_ROLE_PERMISSIONS.ASSIGN\"\n [label]=\"'shared.save.changes' | translate\"\n icon=\"pi pi-save\"\n [disabled]=\"!canSave()\"\n [loading]=\"saving()\"\n size=\"small\"\n severity=\"success\"\n (onClick)=\"saveChanges()\"\n />\n </div>\n </div>\n\n <!-- Role Table -->\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <p-table\n [value]=\"roles()\"\n [rows]=\"10\"\n [paginator]=\"roles().length > 10\"\n [rowsPerPageOptions]=\"[10, 20, 50]\"\n [globalFilterFields]=\"['name', 'code', 'description']\"\n [showCurrentPageReport]=\"true\"\n [currentPageReportTemplate]=\"\n 'iam.pagination.roles.template' | translate\n \"\n styleClass=\"p-datatable-sm\"\n [tableStyle]=\"{ 'min-width': '35rem' }\"\n >\n <ng-template #header>\n <tr>\n <th style=\"width: 3rem\">\n <p-checkbox\n [ngModel]=\"allSelected()\"\n [binary]=\"true\"\n (ngModelChange)=\"toggleAll()\"\n [pTooltip]=\"'shared.select.deselect.all' | translate\"\n tooltipPosition=\"top\"\n />\n </th>\n <th>{{ 'shared.name' | translate }}</th>\n <th class=\"hidden sm:table-cell\">\n {{ 'shared.code' | translate }}\n </th>\n <th class=\"hidden md:table-cell\">\n {{ 'shared.description' | translate }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body let-role>\n <tr>\n <td>\n <p-checkbox\n [ngModel]=\"selectionMap()[role.id]\"\n [binary]=\"true\"\n (ngModelChange)=\"onRoleToggle(role, $event)\"\n [pTooltip]=\"getTooltip(role)\"\n tooltipPosition=\"top\"\n />\n </td>\n <td>{{ role.name }}</td>\n <td class=\"hidden sm:table-cell\">{{ role.code || '-' }}</td>\n <td class=\"hidden md:table-cell\">\n {{ role.description || '-' }}\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"4\" class=\"text-center p-4 text-muted-color\">\n @if (loading()) {\n <i class=\"pi pi-spin pi-spinner\"></i>\n {{ 'shared.loading.roles' | translate }}\n } @else {\n {{ 'iam.permission.no.roles.available' | translate }}\n }\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </div>\n\n <!-- Change Summary -->\n @if (hasChanges()) {\n <div class=\"border border-surface rounded-border p-3 mt-4\">\n <div class=\"flex items-center gap-2 mb-3\">\n <i class=\"pi pi-info-circle text-primary\"></i>\n <span class=\"font-bold\">{{\n 'shared.pending.changes' | translate\n }}</span>\n </div>\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n @if (pendingAdd().length > 0) {\n <div>\n <div class=\"flex items-center gap-2 mb-2\">\n <i class=\"pi pi-plus-circle text-green-500\"></i>\n <strong class=\"text-sm\"\n >{{ 'shared.to.assign' | translate }} ({{\n pendingAdd().length\n }})</strong\n >\n </div>\n <ul class=\"list-none p-0 m-0 pl-4\">\n @for (role of pendingAdd(); track role.id) {\n <li class=\"text-sm mb-1\">{{ role.name }}</li>\n }\n </ul>\n </div>\n }\n @if (pendingRemove().length > 0) {\n <div>\n <div class=\"flex items-center gap-2 mb-2\">\n <i class=\"pi pi-minus-circle text-red-500\"></i>\n <strong class=\"text-sm\"\n >{{ 'shared.to.remove' | translate }} ({{\n pendingRemove().length\n }})</strong\n >\n </div>\n <ul class=\"list-none p-0 m-0 pl-4\">\n @for (role of pendingRemove(); track role.id) {\n <li class=\"text-sm mb-1\">{{ role.name }}</li>\n }\n </ul>\n </div>\n }\n </div>\n </div>\n }\n }\n\n @if (!loading() && roles().length === 0) {\n <div class=\"surface-card p-5 rounded-border shadow-sm text-center\">\n <i\n class=\"pi pi-info-circle text-muted-color mb-3 block text-5xl\"\n ></i>\n <p class=\"text-muted-color m-0\">\n {{ 'iam.permission.no.roles.for.user' | translate }}\n </p>\n </div>\n }\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n `,\n ],\n})\nexport class UserRoleSelectorComponent {\n // Permission constants for template\n readonly USER_ROLE_PERMISSIONS = USER_ROLE_PERMISSIONS;\n\n // Dependencies\n private readonly appConfig = inject(APP_CONFIG);\n private readonly companyContext = inject(LAYOUT_AUTH_STATE);\n private readonly userPermissionProvider = inject(USER_PERMISSION_PROVIDER);\n private readonly roleApi = inject(RoleApiService);\n private readonly permissionApi = inject(PermissionApiService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, {\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 // State - User/Branch Selection\n readonly selectedUserId = signal<string | null>(null);\n readonly selectedBranchId = signal<string | undefined>(undefined);\n readonly branches = signal<IBranch[]>([]);\n\n // State - Loading/Saving\n readonly loading = signal(false);\n readonly saving = signal(false);\n\n // State - Roles (Business Logic)\n private readonly _roles = signal<IRole[]>([]);\n readonly roles = this._roles.asReadonly();\n\n // State - Selection\n private readonly _selectionMap = signal<Record<string, boolean>>({});\n readonly selectionMap = this._selectionMap.asReadonly();\n\n private readonly _initialSelection = signal<Record<string, boolean>>({});\n private readonly initialSelection = this._initialSelection.asReadonly();\n\n // Computed - UI Flags\n readonly showBranchSelector = computed(\n () => isCompanyFeatureEnabled(this.appConfig) === true,\n );\n\n readonly filteredBranches = computed(() => {\n const currentCompanyId =\n this.companyContext.currentCompanyInfo()?.id || undefined;\n if (!currentCompanyId) return this.branches();\n return this.branches().filter((b) => b.companyId === currentCompanyId);\n });\n\n // Computed - Selection State\n readonly allSelected = computed(() => {\n const selMap = this.selectionMap();\n const total = this.roles().length;\n if (total === 0) return false;\n\n const selected = Object.values(selMap).filter((v) => v).length;\n return selected === total;\n });\n\n // Computed - Change Detection\n readonly hasChanges = computed(() => {\n const current = this.selectionMap();\n const initial = this.initialSelection();\n\n const currentKeys = Object.keys(current);\n const initialKeys = Object.keys(initial);\n\n if (currentKeys.length !== initialKeys.length) return true;\n return currentKeys.some((key) => current[key] !== initial[key]);\n });\n\n // Computed - Pending Changes\n readonly pendingAdd = computed(() => {\n const current = this.selectionMap();\n const initial = this.initialSelection();\n const allRoles = this.roles();\n\n return allRoles.filter(\n (role) => current[role.id as string] && !initial[role.id as string],\n );\n });\n\n readonly pendingRemove = computed(() => {\n const current = this.selectionMap();\n const initial = this.initialSelection();\n const allRoles = this.roles();\n\n return allRoles.filter(\n (role) => !current[role.id as string] && initial[role.id as string],\n );\n });\n\n // Computed - Save Button State\n readonly canSave = computed(() => {\n return this.hasChanges() && !this.saving();\n });\n\n constructor() {\n // Effect: Load user branches and data when user changes\n effect(() => {\n const userId = this.selectedUserId();\n\n if (userId) {\n if (isCompanyFeatureEnabled(this.appConfig)) {\n this.loadUserBranches(userId);\n }\n this.loadData();\n } else {\n this.branches.set([]);\n this.selectedBranchId.set(undefined);\n this.resetState();\n }\n });\n\n // Effect: Reload data when branch changes\n effect(() => {\n const userId = this.selectedUserId();\n const branchId = this.selectedBranchId();\n\n if (\n isCompanyFeatureEnabled(this.appConfig) &&\n userId &&\n branchId !== undefined\n ) {\n this.loadData();\n }\n });\n }\n\n /**\n * Load user's permitted branches\n */\n private async loadUserBranches(userId: string): Promise<void> {\n try {\n const companyId =\n this.companyContext.currentCompanyInfo()?.id || undefined;\n if (!companyId) {\n this.branches.set([]);\n return;\n }\n\n const response = await firstValueFrom(\n this.userPermissionProvider.getUserBranchPermissions(userId),\n );\n const userBranches =\n response?.data?.map(\n (ub: {\n branchId: string;\n branchName: string;\n companyId: string;\n }) => ({\n id: ub.branchId,\n name: ub.branchName,\n companyId: ub.companyId,\n }),\n ) ?? [];\n this.branches.set(userBranches);\n } catch {\n // Error toast handled by global interceptor\n }\n }\n\n /**\n * Load roles and assignments for selected user\n */\n private async loadData(): Promise<void> {\n const userId = this.selectedUserId();\n if (!userId) return;\n\n const branchId = this.selectedBranchId();\n\n this.loading.set(true);\n try {\n // Load all roles\n const rolesResponse = await this.roleApi.getAll({\n pagination: { currentPage: 0, pageSize: MAX_DROPDOWN_ITEMS },\n });\n const rolesList = rolesResponse?.data ?? [];\n\n this._roles.set(rolesList);\n\n // Load existing user-role assignments\n const query =\n isCompanyFeatureEnabled(this.appConfig) && branchId\n ? { branchId }\n : undefined;\n\n const assignedResponse = await firstValueFrom(\n this.permissionApi.getUserRoles(userId, query),\n );\n const assignedIds = new Set(\n (assignedResponse?.data || []).map((r) => r.roleId),\n );\n\n // Build selection map\n const selMap: Record<string, boolean> = {};\n rolesList.forEach((role: IRole) => {\n selMap[role.id as string] = assignedIds.has(role.id as string);\n });\n\n this._selectionMap.set(selMap);\n this._initialSelection.set({ ...selMap });\n } catch {\n // Error toast handled by global interceptor\n } finally {\n this.loading.set(false);\n }\n }\n\n /**\n * Get tooltip for role checkbox\n */\n getTooltip(role: IRole): string {\n const selMap = this.selectionMap();\n const isCurrentlySelected = selMap[role.id as string];\n\n if (isCurrentlySelected) {\n return `[${this.translate('shared.assigned')}] ${this.translate('iam.tooltip.assigned.to.user')}\\n\\n[${this.translate('shared.remove')}] ${this.translate('iam.tooltip.click.to.remove.role.from.user')}`;\n }\n\n return `[${this.translate('shared.add')}] ${this.translate('iam.tooltip.click.to.assign.role.to.user')}`;\n }\n\n /**\n * Handle role checkbox toggle\n */\n onRoleToggle(role: IRole, newValue: boolean): void {\n const selMap = { ...this.selectionMap() };\n selMap[role.id as string] = newValue;\n this._selectionMap.set(selMap);\n }\n\n /**\n * Toggle all roles\n */\n toggleAll(): void {\n this.setAllSelections(!this.allSelected());\n }\n\n /**\n * Select all roles\n */\n selectAll(): void {\n this.setAllSelections(true);\n }\n\n /**\n * Deselect all roles\n */\n deselectAll(): void {\n this.setAllSelections(false);\n }\n\n /**\n * Set all role selections to a given value\n */\n private setAllSelections(value: boolean): void {\n const selMap: Record<string, boolean> = {};\n this.roles().forEach((role) => {\n selMap[role.id as string] = value;\n });\n this._selectionMap.set(selMap);\n }\n\n /**\n * Save changes to backend\n */\n async saveChanges(): Promise<void> {\n const userId = this.selectedUserId();\n if (!userId) return;\n\n const branchId = this.selectedBranchId();\n const companyId = this.companyContext.currentCompanyInfo()?.id || undefined;\n\n // Validate company context if feature enabled\n if (isCompanyFeatureEnabled(this.appConfig) && !companyId) {\n this.messageService.add({\n severity: 'warn',\n summary: this.translate('shared.warning'),\n detail: this.translate('iam.permission.company.required'),\n });\n return;\n }\n\n // Build payload\n const items: Array<{ id: string; action: PermissionAction }> = [];\n\n this.pendingAdd().forEach((role) => {\n items.push({ id: role.id as string, action: 'add' });\n });\n\n this.pendingRemove().forEach((role) => {\n items.push({ id: role.id as string, action: 'remove' });\n });\n\n if (items.length === 0) return;\n\n this.saving.set(true);\n try {\n const payload: {\n userId: string;\n items: typeof items;\n companyId?: string;\n branchId?: string;\n } = { userId, items };\n\n if (isCompanyFeatureEnabled(this.appConfig)) {\n if (companyId) {\n payload.companyId = companyId;\n }\n if (branchId) {\n payload.branchId = branchId;\n }\n }\n\n const response = await firstValueFrom(\n this.permissionApi.assignUserRoles(payload),\n );\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 // Update baseline\n this._initialSelection.set({ ...this.selectionMap() });\n } catch {\n // Error toast handled by global interceptor\n } finally {\n this.saving.set(false);\n }\n }\n\n /**\n * Reset component state\n */\n private resetState(): void {\n this._roles.set([]);\n this._selectionMap.set({});\n this._initialSelection.set({});\n }\n}\n","import { Component, computed, effect, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n APP_CONFIG,\n isCompanyFeatureEnabled,\n} from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport {\n HasPermissionDirective,\n PrimeModule,\n TranslatePipe,\n USER_ACTION_PERMISSIONS,\n USER_PERMISSION_PROVIDER,\n UserSelectComponent,\n} from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { firstValueFrom } from 'rxjs';\nimport { IActionTreeDto, IBranch } from '../interfaces/public-api';\nimport { ActionApiService } from '../services/action-api.service';\nimport { PermissionApiService } from '../services/permission-api.service';\nimport { buildTreeFromFlat } from '../utils/tree-utils';\nimport { BaseActionSelectorComponent } from './base-action-selector';\n\n@Component({\n selector: 'flusys-user-action-selector',\n imports: [\n FormsModule,\n PrimeModule,\n HasPermissionDirective,\n UserSelectComponent,\n TranslatePipe,\n ],\n template: `\n <div class=\"user-action-selector\">\n <div class=\"surface-card p-4 rounded-border mb-4 shadow-sm\">\n <div class=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <div>\n <label class=\"block font-semibold mb-2\">\n <i class=\"pi pi-user mr-2 text-primary\"></i>\n {{ 'iam.permission.select.user' | translate }}\n </label>\n <lib-user-select\n [value]=\"selectedUserId()\"\n (valueChange)=\"selectedUserId.set($event)\"\n [isEditMode]=\"true\"\n [placeHolder]=\"\n 'iam.permission.select.user.placeholder' | translate\n \"\n />\n </div>\n\n @if (showBranchSelector()) {\n <div>\n <label class=\"block font-semibold mb-2\">\n <i class=\"pi pi-building mr-2 text-primary\"></i>\n {{ 'iam.permission.select.branch' | translate }}\n </label>\n <p-select\n [ngModel]=\"selectedBranchId()\"\n (ngModelChange)=\"selectedBranchId.set($event)\"\n [options]=\"filteredBranches()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"\n 'iam.permission.select.branch.placeholder' | translate\n \"\n [showClear]=\"true\"\n [filter]=\"true\"\n class=\"w-full\"\n >\n <ng-template #selectedItem let-branch>\n @if (branch) {\n <div class=\"flex items-center gap-2\">\n <i class=\"pi pi-building text-primary\"></i>\n <span class=\"font-semibold\">{{ branch.name }}</span>\n </div>\n }\n </ng-template>\n <ng-template #item let-branch>\n <div class=\"flex items-center gap-2\">\n <i class=\"pi pi-building text-muted-color\"></i>\n <span>{{ branch.name }}</span>\n </div>\n </ng-template>\n </p-select>\n <small class=\"text-muted-color block mt-1\">\n {{\n (filteredBranches().length !== 1\n ? 'iam.branch.permitted.count.plural'\n : 'iam.branch.permitted.count'\n ) | translate: { count: filteredBranches().length }\n }}\n </small>\n </div>\n }\n </div>\n </div>\n\n @if (selectedUserId()) {\n @if (loading()) {\n <div class=\"flex justify-center p-5\">\n <i class=\"pi pi-spin pi-spinner text-4xl\"></i>\n </div>\n }\n\n @if (!loading() && actions().length > 0) {\n <div class=\"surface-card p-4 rounded-border shadow-sm\">\n <div\n class=\"flex flex-col md:flex-row justify-between items-start md:items-center gap-3 mb-4\"\n >\n <div>\n <h5 class=\"m-0 mb-1\">\n {{ 'iam.permission.direct.action.permissions' | translate }}\n </h5>\n <p class=\"text-sm text-muted-color m-0\">\n {{\n 'iam.permission.actions.available'\n | translate: { count: actions().length }\n }}\n </p>\n </div>\n <div class=\"flex flex-wrap gap-2\">\n <p-button\n [label]=\"'shared.select.all' | translate\"\n icon=\"pi pi-check\"\n [outlined]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n (onClick)=\"selectAll()\"\n />\n <p-button\n [label]=\"'shared.deselect.all' | translate\"\n icon=\"pi pi-times\"\n [outlined]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n (onClick)=\"deselectAll()\"\n />\n <p-button\n *hasPermission=\"USER_ACTION_PERMISSIONS.ASSIGN\"\n [label]=\"'shared.save.changes' | translate\"\n icon=\"pi pi-save\"\n [disabled]=\"!canSave()\"\n [loading]=\"saving()\"\n size=\"small\"\n severity=\"success\"\n (onClick)=\"saveChanges()\"\n />\n </div>\n </div>\n\n @if (invalidActionsCount() > 0) {\n <div class=\"validation-warning rounded-border p-3 mb-4\">\n <div class=\"flex items-start gap-2\">\n <i class=\"pi pi-exclamation-triangle text-xl\"></i>\n <div class=\"flex-1\">\n <span class=\"font-semibold\"\n >{{ 'iam.validation.warning.title' | translate }}:</span\n >\n <p class=\"text-sm mt-1 mb-0\">\n {{\n (invalidActionsCount() > 1\n ? 'iam.validation.unmet.prerequisites.plural'\n : 'iam.validation.unmet.prerequisites.singular'\n ) | translate: { count: invalidActionsCount() }\n }}\n </p>\n </div>\n </div>\n </div>\n }\n\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <p-treeTable\n [value]=\"treeNodes()\"\n dataKey=\"id\"\n class=\"p-treetable-sm\"\n [tableStyle]=\"{ 'min-width': '50rem' }\"\n >\n <ng-template #header>\n <tr>\n <th class=\"w-12\">\n <p-checkbox\n [ngModel]=\"allSelected()\"\n [binary]=\"true\"\n (ngModelChange)=\"toggleAll()\"\n [pTooltip]=\"'shared.select.deselect.all' | translate\"\n tooltipPosition=\"top\"\n />\n </th>\n <th>{{ 'shared.name' | translate }}</th>\n <th class=\"hidden md:table-cell\">\n {{ 'shared.code' | translate }}\n </th>\n <th>{{ 'iam.action.type' | translate }}</th>\n <th class=\"hidden lg:table-cell\">\n {{ 'shared.description' | translate }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body let-rowNode let-rowData=\"rowData\">\n @let hasUnmet = hasUnmetPrerequisites(rowData);\n @let tooltip = getTooltip(rowData);\n <tr [class.highlight-warning]=\"hasUnmet\">\n <td class=\"w-12\">\n <p-checkbox\n [ngModel]=\"selectionMap()[rowData.id]\"\n [binary]=\"true\"\n (ngModelChange)=\"onActionToggle(rowData, $event)\"\n [pTooltip]=\"tooltip\"\n tooltipPosition=\"top\"\n />\n </td>\n <td>\n <p-treeTableToggler [rowNode]=\"rowNode\" />\n <span class=\"inline-flex items-center gap-2\">\n {{ rowData.name }}\n @if (hasUnmet) {\n <i\n class=\"pi pi-exclamation-triangle text-orange-500\"\n [pTooltip]=\"\n 'iam.validation.unmet.prerequisites.tooltip'\n | translate\n \"\n tooltipPosition=\"top\"\n ></i>\n }\n </span>\n </td>\n <td class=\"hidden md:table-cell\">\n {{ rowData.code || '-' }}\n </td>\n <td>\n <p-tag\n [value]=\"rowData.actionType\"\n [severity]=\"\n rowData.actionType === 'backend' ? 'info' : 'success'\n \"\n />\n </td>\n <td class=\"hidden lg:table-cell\">\n {{ rowData.description || '-' }}\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"5\" class=\"text-center p-4 text-muted-color\">\n @if (loading()) {\n <i class=\"pi pi-spin pi-spinner\"></i>\n {{ 'shared.loading.actions' | translate }}\n } @else {\n {{ 'iam.permission.no.actions.available' | translate }}\n }\n </td>\n </tr>\n </ng-template>\n </p-treeTable>\n </div>\n </div>\n\n @if (hasChanges()) {\n <div class=\"border border-surface rounded-border p-3 mt-4\">\n <div class=\"flex items-center gap-2 mb-3\">\n <i class=\"pi pi-info-circle text-primary\"></i>\n <span class=\"font-bold\">{{\n 'shared.pending.changes' | translate\n }}</span>\n </div>\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n @if (pendingAdd().length > 0) {\n <div>\n <div class=\"flex items-center gap-2 mb-2\">\n <i class=\"pi pi-plus-circle text-green-500\"></i>\n <strong class=\"text-sm\"\n >{{ 'shared.to.assign' | translate }} ({{\n pendingAdd().length\n }})</strong\n >\n </div>\n <ul class=\"list-none p-0 m-0 pl-4\">\n @for (action of pendingAdd(); track action.id) {\n <li class=\"text-sm mb-1\">{{ action.name }}</li>\n }\n </ul>\n </div>\n }\n @if (pendingRemove().length > 0) {\n <div>\n <div class=\"flex items-center gap-2 mb-2\">\n <i class=\"pi pi-minus-circle text-red-500\"></i>\n <strong class=\"text-sm\"\n >{{ 'shared.to.remove' | translate }} ({{\n pendingRemove().length\n }})</strong\n >\n </div>\n <ul class=\"list-none p-0 m-0 pl-4\">\n @for (action of pendingRemove(); track action.id) {\n <li class=\"text-sm mb-1\">{{ action.name }}</li>\n }\n </ul>\n </div>\n }\n </div>\n </div>\n }\n }\n\n @if (!loading() && actions().length === 0) {\n <div class=\"surface-card p-5 rounded-border shadow-sm text-center\">\n <i\n class=\"pi pi-info-circle text-muted-color mb-3 block text-5xl\"\n ></i>\n <p class=\"text-muted-color m-0\">\n {{ 'iam.permission.no.actions.for.user' | translate }}\n </p>\n </div>\n }\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n .validation-warning {\n background-color: var(--p-yellow-50, #fefce8);\n border-left: 4px solid var(--p-yellow-500, #eab308);\n color: var(--p-yellow-700, #a16207);\n }\n :host-context(.p-dark) .validation-warning {\n background-color: rgba(234, 179, 8, 0.1);\n color: var(--p-yellow-400, #facc15);\n }\n :host ::ng-deep tr.highlight-warning {\n background-color: var(--p-red-50, rgba(239, 68, 68, 0.1)) !important;\n }\n :host-context(.p-dark) ::ng-deep tr.highlight-warning {\n background-color: rgba(239, 68, 68, 0.15) !important;\n }\n `,\n ],\n})\nexport class UserActionSelectorComponent extends BaseActionSelectorComponent {\n readonly USER_ACTION_PERMISSIONS = USER_ACTION_PERMISSIONS;\n\n private readonly appConfig = inject(APP_CONFIG);\n private readonly companyContext = inject(LAYOUT_AUTH_STATE);\n private readonly userPermissionProvider = inject(USER_PERMISSION_PROVIDER);\n private readonly actionApi = inject(ActionApiService);\n private readonly permissionApi = inject(PermissionApiService);\n private readonly messageService = inject(MessageService);\n\n readonly selectedUserId = signal<string | null>(null);\n readonly selectedBranchId = signal<string | undefined>(undefined);\n readonly branches = signal<IBranch[]>([]);\n\n private readonly isCompanyFeatureActive = computed(\n () => isCompanyFeatureEnabled(this.appConfig) === true,\n );\n\n readonly showBranchSelector = this.isCompanyFeatureActive;\n\n readonly filteredBranches = computed(() => {\n const currentCompanyId = this.companyContext.currentCompanyInfo()?.id || undefined;\n if (!currentCompanyId) return this.branches();\n return this.branches().filter((b) => b.companyId === currentCompanyId);\n });\n\n constructor() {\n super();\n\n effect(() => {\n const userId = this.selectedUserId();\n this.selectedBranchId.set(undefined);\n\n if (userId) {\n if (this.isCompanyFeatureActive()) {\n this.loadUserBranches(userId);\n }\n this.loadData();\n } else {\n this.branches.set([]);\n this.resetState();\n }\n });\n\n effect(() => {\n const branchId = this.selectedBranchId();\n const userId = this.selectedUserId();\n\n if (this.isCompanyFeatureActive() && userId && branchId !== undefined) {\n this.loadData();\n }\n });\n }\n\n protected getDefaultTooltip(isSelected: boolean): string {\n if (isSelected) {\n return `[${this.translate('shared.assigned')}] ${this.translate('iam.tooltip.assigned.to.user')}\\n\\n[${this.translate('shared.remove')}] ${this.translate('iam.tooltip.click.to.remove.user')}`;\n }\n return `[${this.translate('shared.add')}] ${this.translate('iam.tooltip.click.to.assign.user')}`;\n }\n\n private async loadUserBranches(userId: string): Promise<void> {\n const companyId = this.companyContext.currentCompanyInfo()?.id;\n if (!companyId) {\n this.branches.set([]);\n return;\n }\n\n try {\n const response = await firstValueFrom(\n this.userPermissionProvider.getUserBranchPermissions(userId),\n );\n const userBranches =\n response?.data?.map(\n (ub: { branchId: string; branchName: string; companyId: string }) => ({\n id: ub.branchId,\n name: ub.branchName,\n companyId: ub.companyId,\n }),\n ) ?? [];\n this.branches.set(userBranches);\n } catch {\n }\n }\n\n private async loadData(): Promise<void> {\n const userId = this.selectedUserId();\n if (!userId) return;\n\n const branchId = this.selectedBranchId();\n\n this.loading.set(true);\n try {\n const actionsResponse = await firstValueFrom(\n this.actionApi.getActionsForPermission(),\n );\n\n const flatActions = actionsResponse?.data ?? [];\n const actionsTree = buildTreeFromFlat(flatActions) as IActionTreeDto[];\n\n this._actionsTree.set(actionsTree);\n this._actions.set(flatActions);\n\n const query =\n this.isCompanyFeatureActive() && branchId ? { branchId } : undefined;\n\n const assignedResponse = await firstValueFrom(\n this.permissionApi.getUserActions(userId, query),\n );\n const assignedIds = new Set(\n (assignedResponse?.data || []).map((a) => a.actionId),\n );\n\n const selMap = this.buildSelectionMap(flatActions, (action) =>\n assignedIds.has(action.id as string),\n );\n this._selectionMap.set(selMap);\n this._initialSelection.set({ ...selMap });\n } catch {\n } finally {\n this.loading.set(false);\n }\n }\n\n async saveChanges(): Promise<void> {\n const userId = this.selectedUserId();\n if (!userId) return;\n\n const branchId = this.selectedBranchId();\n const companyId = this.companyContext.currentCompanyInfo()?.id;\n\n if (this.isCompanyFeatureActive() && !companyId) {\n this.messageService.add({\n severity: 'warn',\n summary: this.translate('shared.warning'),\n detail: this.translate('iam.permission.company.required'),\n });\n return;\n }\n\n const invalidActions = this.permissionLogic.getActionsWithUnmetPrerequisites(\n this.selectionMap(),\n this.actions(),\n );\n if (invalidActions.length > 0) {\n this.permissionLogic.showValidationErrorDialog(\n invalidActions,\n this.selectionMap(),\n this.actions(),\n (newMap) => this._selectionMap.set(newMap),\n );\n return;\n }\n\n const items = this.buildPayloadItems();\n if (items.length === 0) return;\n\n this.saving.set(true);\n try {\n const payload: {\n userId: string;\n items: typeof items;\n companyId?: string;\n branchId?: string;\n } = { userId, items };\n\n if (this.isCompanyFeatureActive()) {\n if (companyId) payload.companyId = companyId;\n if (branchId) payload.branchId = branchId;\n }\n\n const response = await firstValueFrom(\n this.permissionApi.assignUserActions(payload),\n );\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._initialSelection.set({ ...this.selectionMap() });\n } catch {\n } finally {\n this.saving.set(false);\n }\n }\n}\n","// Logic Builder Component\nexport * from './logic-builder.component';\n\n// Enhanced Role-Action Selector (with logic builder integration)\nexport * from './role-action-selector.component';\n\n// Company-Action Selector (company whitelist management)\nexport * from './company-action-selector.component';\n\n// User-Role Selector (user role assignments)\nexport * from './user-role-selector.component';\n\n// User-Action Selector (direct user action permissions)\nexport * from './user-action-selector.component';\n","import { Injectable, inject } from '@angular/core';\nimport {\n IProfilePermissionProvider,\n IProfileRoleInfo,\n IProfileActionInfo,\n ISingleResponse,\n} from '@flusys/ng-shared';\nimport { Observable, map } from 'rxjs';\nimport { PermissionApiService } from '../services/permission-api.service';\n\n/**\n * Profile Permission Provider Adapter\n *\n * Implements IProfilePermissionProvider using ng-iam's PermissionApiService.\n * Allows ng-auth profile page to display user permissions without\n * depending on ng-iam directly.\n *\n * @example\n * // In app.config.ts\n * providers: [\n * ...provideIamProviders()\n * ]\n *\n * // In profile component\n * private readonly permissionProvider = inject(PROFILE_PERMISSION_PROVIDER, { optional: true });\n */\n@Injectable()\nexport class ProfilePermissionProviderAdapter\n implements IProfilePermissionProvider\n{\n private readonly permissionApi = inject(PermissionApiService);\n\n getUserRoles(\n userId: string,\n branchId?: string,\n ): Observable<ISingleResponse<IProfileRoleInfo[]>> {\n return this.permissionApi\n .getUserRoles(userId, branchId ? { branchId } : undefined)\n .pipe(\n map((response) => ({\n success: response.success,\n message: response.message,\n data: (response.data ?? []).map((role) => ({\n id: role.roleId,\n name: role.roleName,\n description: null,\n })),\n })),\n );\n }\n\n getUserActions(\n userId: string,\n branchId?: string,\n ): Observable<ISingleResponse<IProfileActionInfo[]>> {\n return this.permissionApi\n .getUserActions(userId, branchId ? { branchId } : undefined)\n .pipe(\n map((response) => ({\n success: response.success,\n message: response.message,\n data: (response.data ?? []).map((action) => ({\n id: action.actionId,\n name: action.actionName,\n code: action.actionCode,\n description: null,\n })),\n })),\n );\n }\n}\n","import { Provider } from '@angular/core';\nimport { PROFILE_PERMISSION_PROVIDER } from '@flusys/ng-shared';\nimport { ProfilePermissionProviderAdapter } from '../adapters/profile-permission-provider.adapter';\n\n/** Registers IAM provider adapters for ng-shared interfaces */\nexport function provideIamProviders(): Provider[] {\n return [\n { provide: PROFILE_PERMISSION_PROVIDER, useClass: ProfilePermissionProviderAdapter },\n ];\n}\n","import { Routes } from '@angular/router';\nimport {\n permissionGuard,\n anyPermissionGuard,\n ACTION_PERMISSIONS,\n ROLE_PERMISSIONS,\n ROLE_ACTION_PERMISSIONS,\n USER_ROLE_PERMISSIONS,\n USER_ACTION_PERMISSIONS,\n COMPANY_ACTION_PERMISSIONS,\n SHARED_MESSAGES,\n resolveTranslationModule,\n} from '@flusys/ng-shared';\nimport { IAM_MESSAGES } from '../constants/messages';\n\n/**\n * IAM Routes Configuration\n *\n * Identity and Access Management routing with permission guards.\n * - Actions: Permission actions management\n * - Roles: Role management (conditional on RBAC/FULL mode)\n * - Permissions: User permission assignments\n */\nexport const IAM_ROUTES: Routes = [\n {\n path: '',\n resolve: { translations: resolveTranslationModule({ modules: ['iam'], fallbackMessages: { ...IAM_MESSAGES, ...SHARED_MESSAGES } }) },\n loadComponent: () =>\n import('../pages/iam-container/iam-container.component').then(\n (m) => m.IamContainerComponent,\n ),\n children: [\n // Actions Management\n {\n path: 'actions',\n canActivate: [permissionGuard(ACTION_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/action/action-list-page.component').then(\n (m) => m.ActionListPageComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/action/action-form-page.component').then(\n (m) => m.ActionFormPageComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/action/action-form-page.component').then(\n (m) => m.ActionFormPageComponent,\n ),\n },\n ],\n },\n\n // Roles Management\n {\n path: 'roles',\n canActivate: [permissionGuard(ROLE_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/role/role-list-page.component').then(\n (m) => m.RoleListPageComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/role/role-form-page.component').then(\n (m) => m.RoleFormPageComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/role/role-form-page.component').then(\n (m) => m.RoleFormPageComponent,\n ),\n },\n ],\n },\n\n // Permissions Management (requires any permission tab access)\n {\n path: 'permissions',\n canActivate: [\n anyPermissionGuard([\n ROLE_ACTION_PERMISSIONS.READ,\n USER_ROLE_PERMISSIONS.READ,\n USER_ACTION_PERMISSIONS.READ,\n COMPANY_ACTION_PERMISSIONS.READ,\n ]),\n ],\n loadComponent: () =>\n import('../pages/permission/permission-page.component').then(\n (m) => m.PermissionPageComponent,\n ),\n },\n\n // Default redirect to actions\n {\n path: '',\n redirectTo: 'actions',\n pathMatch: 'full',\n },\n ],\n },\n];\n","// ==================== INTERFACES ====================\nexport * from './interfaces/public-api';\n\n// ==================== CONSTANTS ====================\nexport * from './constants/pagination.constants';\nexport * from './constants/messages';\n\n// ==================== SERVICES ====================\nexport * from './services/public-api';\n\n// ==================== COMPONENTS ====================\nexport * from './components/public-api';\n\n// ==================== ADAPTERS ====================\nexport * from './adapters/profile-permission-provider.adapter';\n\n// ==================== PROVIDERS ====================\nexport * from './providers/iam-providers';\n\n// ==================== ROUTES ====================\nexport * from './routes/iam.routes';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3","i4","i1","map"],"mappings":"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"}