@flusys/ng-iam 4.0.0-rc → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/fesm2022/{flusys-ng-iam-action-form-page.component-BQx9yset.mjs → flusys-ng-iam-action-form-page.component-DJbMu2aV.mjs} +2 -2
- package/fesm2022/{flusys-ng-iam-action-form-page.component-BQx9yset.mjs.map → flusys-ng-iam-action-form-page.component-DJbMu2aV.mjs.map} +1 -1
- package/fesm2022/{flusys-ng-iam-action-list-page.component-BrpZujxk.mjs → flusys-ng-iam-action-list-page.component-DYnYC7Nn.mjs} +2 -2
- package/fesm2022/{flusys-ng-iam-action-list-page.component-BrpZujxk.mjs.map → flusys-ng-iam-action-list-page.component-DYnYC7Nn.mjs.map} +1 -1
- package/fesm2022/{flusys-ng-iam-flusys-ng-iam-Co4ot9My.mjs → flusys-ng-iam-flusys-ng-iam-CnVOy_4s.mjs} +10 -10
- package/fesm2022/{flusys-ng-iam-flusys-ng-iam-Co4ot9My.mjs.map → flusys-ng-iam-flusys-ng-iam-CnVOy_4s.mjs.map} +1 -1
- package/fesm2022/{flusys-ng-iam-permission-page.component-Dpk90y72.mjs → flusys-ng-iam-permission-page.component-_cLVilgz.mjs} +2 -2
- package/fesm2022/{flusys-ng-iam-permission-page.component-Dpk90y72.mjs.map → flusys-ng-iam-permission-page.component-_cLVilgz.mjs.map} +1 -1
- package/fesm2022/{flusys-ng-iam-role-form-page.component-CVfRQpoa.mjs → flusys-ng-iam-role-form-page.component-BuZmko2b.mjs} +2 -2
- package/fesm2022/{flusys-ng-iam-role-form-page.component-CVfRQpoa.mjs.map → flusys-ng-iam-role-form-page.component-BuZmko2b.mjs.map} +1 -1
- package/fesm2022/{flusys-ng-iam-role-list-page.component-BHB8X5r7.mjs → flusys-ng-iam-role-list-page.component-C7GVYYIn.mjs} +2 -2
- package/fesm2022/{flusys-ng-iam-role-list-page.component-BHB8X5r7.mjs.map → flusys-ng-iam-role-list-page.component-C7GVYYIn.mjs.map} +1 -1
- package/fesm2022/flusys-ng-iam.mjs +1 -1
- package/package.json +7 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flusys-ng-iam-flusys-ng-iam-Co4ot9My.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/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 metadata: Record<string, unknown> | null;\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 metadata?: Record<string, unknown>;\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 // Container page\n 'iam.title': 'Identity & Access Management',\n 'iam.subtitle': 'Manage roles, permissions, and access control',\n\n // Tabs\n 'iam.tabs.roles': 'Roles',\n 'iam.tabs.actions': 'Actions',\n 'iam.tabs.permissions': 'Permissions',\n\n // Administration\n 'iam.administration.title': 'Administration',\n 'iam.administration.subtitle': 'Manage users, companies, and branches',\n\n // Users\n 'iam.user.title': 'Users',\n 'iam.user.add': 'Add User',\n 'iam.user.new': 'New User',\n 'iam.user.create': 'Create User',\n 'iam.user.edit': 'Edit User',\n 'iam.user.name': 'Name',\n 'iam.user.email': 'Email',\n 'iam.user.phone': 'Phone',\n 'iam.user.password': 'Password',\n 'iam.user.password.optional': 'Password (leave blank to keep current)',\n 'iam.user.password.placeholder': 'Enter password',\n 'iam.user.name.placeholder': 'Enter full name',\n 'iam.user.email.placeholder': 'Enter email address',\n 'iam.user.phone.placeholder': 'Enter phone number',\n 'iam.user.email.verified': 'Email Verified',\n 'iam.user.no.users': 'No users found',\n 'iam.user.details': 'User Details',\n 'iam.user.auto.assign.to': 'Auto-assign to',\n 'iam.user.assign.role': 'Assign Role',\n 'iam.user.remove.role': 'Remove Role',\n 'iam.user.activate': 'Activate User',\n 'iam.user.deactivate': 'Deactivate User',\n 'iam.user.reset.password': 'Reset Password',\n 'iam.user.assign.branch': 'Assign Branch',\n 'iam.user.delete.title': 'Delete User',\n 'iam.user.delete.success': 'User deleted successfully',\n\n // Roles\n 'iam.role.title': 'Roles',\n 'iam.role.new': 'New Role',\n 'iam.role.create': 'Create Role',\n 'iam.role.edit': 'Edit Role',\n 'iam.role.name': 'Role Name',\n 'iam.role.name.placeholder': 'Enter role name',\n 'iam.role.description': 'Role Description',\n 'iam.role.description.placeholder': 'Enter role description',\n 'iam.role.permissions': 'Permissions',\n 'iam.role.assigned.users': 'Assigned Users',\n 'iam.role.no.roles': 'No roles found',\n 'iam.role.no.roles.assigned': 'No roles assigned',\n 'iam.role.delete.title': 'Delete Role',\n 'iam.role.delete.success': 'Role deleted successfully',\n 'iam.role.create.success': 'Role created successfully',\n 'iam.role.update.success': 'Role updated successfully',\n 'role.create.success': 'Role created successfully',\n 'role.update.success': 'Role updated successfully',\n 'role.delete.success': 'Role deleted successfully',\n 'role.get.success': 'Role retrieved successfully',\n 'role.get.all.success': 'Roles retrieved successfully',\n\n // Actions\n 'iam.action.title': 'Actions',\n 'iam.action.new': 'New Action',\n 'iam.action.create': 'Create Action',\n 'iam.action.edit': 'Edit Action',\n 'iam.action.name': 'Action Name',\n 'iam.action.name.placeholder': 'Enter action name',\n 'iam.action.code': 'Action Code',\n 'iam.action.code.placeholder': 'Enter action code',\n 'iam.action.type': 'Type',\n 'iam.action.no.actions': 'No actions found',\n 'iam.action.no.actions.assigned': 'No actions assigned',\n 'iam.action.direct.actions': 'Direct Actions',\n 'iam.action.type.backend': 'Backend',\n 'iam.action.type.frontend': 'Frontend',\n 'iam.action.type.both': 'Both',\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 'iam.action.delete.title': 'Delete Action',\n 'iam.action.delete.success': 'Action deleted successfully',\n 'iam.action.create.success': 'Action created successfully',\n 'iam.action.update.success': 'Action updated successfully',\n 'iam.action.parent': 'Parent Action',\n 'iam.action.select.parent': 'Select Parent Action',\n\n // Permissions\n 'iam.permission.title': 'Permissions',\n 'iam.permission.create': 'Create Permission',\n 'iam.permission.edit': 'Edit Permission',\n 'iam.permission.name': 'Permission Name',\n 'iam.permission.code': 'Permission Code',\n 'iam.permission.module': 'Module',\n 'iam.permission.action': 'Action',\n 'iam.permission.description': 'Description',\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 'iam.permission.company.permissions': 'Company Permissions',\n 'iam.permission.branch.permissions': 'Branch Permissions',\n 'iam.permission.my.permissions': 'My Permissions',\n 'iam.permission.select.company': 'Select Company',\n 'iam.permission.select.company.placeholder': 'Search and select a company',\n 'iam.permission.select.role': 'Select Role',\n 'iam.permission.select.role.placeholder': 'Search and select a role',\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.permission.action.whitelist': 'Action Whitelist',\n 'iam.permission.action.permissions': 'Action Permissions',\n 'iam.permission.direct.action.permissions': 'Direct Action Permissions',\n 'iam.permission.role.assignments': 'Role Assignments',\n 'iam.permission.actions.available': '{{count}} actions available',\n 'iam.permission.roles.available': '{{count}} roles available',\n 'iam.permission.no.actions.available': 'No actions available',\n 'iam.permission.no.roles.available': 'No roles available',\n 'iam.permission.no.actions.for.company': 'No actions available for this company',\n 'iam.permission.no.actions.for.role': 'No actions available for this role',\n 'iam.permission.no.actions.for.user': 'No actions available for this user',\n 'iam.permission.no.roles.for.user': 'No roles available for this user',\n 'iam.permission.company.required': 'Please select a company first',\n 'iam.permission.has.prerequisites': 'Has prerequisites',\n 'iam.permission.requirements': 'Requirements',\n 'iam.permission.company.actions.updated': 'Company actions updated successfully',\n 'iam.permission.role.permissions.updated': 'Role permissions updated successfully',\n 'iam.permission.user.actions.updated': 'User actions updated successfully',\n 'iam.permission.user.roles.updated': 'User roles updated successfully',\n 'iam.permission.requires': 'requires',\n 'iam.permission.prerequisite.validation.failed': 'Prerequisite Validation Failed',\n 'iam.permission.prerequisite.error.message': 'The following actions have unmet prerequisites:',\n 'iam.permission.auto.select.prompt': 'Would you like to auto-select the required actions?',\n 'iam.permission.auto.select.required': 'Auto-select Required',\n 'iam.permission.actions.selected': 'Actions Selected',\n 'iam.permission.auto.selected.prerequisites': 'Required prerequisites have been auto-selected. Click Save to apply changes.',\n 'iam.permission.changes.reverted': 'Changes Reverted',\n 'iam.permission.selection.reverted': 'Selection has been reverted to the initial state.',\n 'permission.create.success': 'Permission created successfully',\n 'permission.update.success': 'Permission updated successfully',\n 'permission.delete.success': 'Permission deleted successfully',\n 'permission.get.success': 'Permission retrieved successfully',\n 'permission.get.all.success': 'Permissions retrieved successfully',\n 'permission.process.success': '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 // Access control\n 'iam.access.denied': 'Access Denied',\n 'iam.no.permission': 'You do not have permission to perform this action.',\n 'iam.contact.admin': 'Please contact your administrator for access.',\n 'iam.insufficient.permissions': 'Insufficient permissions',\n\n // Company\n 'iam.company.title': 'Companies',\n 'iam.company.add': 'Add Company',\n 'iam.company.new': 'New Company',\n 'iam.company.create': 'Create Company',\n 'iam.company.edit': 'Edit Company',\n 'iam.company.select': 'Select Company',\n 'iam.company.name': 'Company Name',\n 'iam.company.name.placeholder': 'Enter company name',\n 'iam.company.slug': 'Company Slug',\n 'iam.company.slug.placeholder': 'Enter company slug',\n 'iam.company.code': 'Company Code',\n 'iam.company.code.placeholder': 'Enter company code',\n 'iam.company.details': 'Company Details',\n 'iam.company.address': 'Address',\n 'iam.company.address.placeholder': 'Enter company address',\n 'iam.company.phone': 'Phone',\n 'iam.company.phone.placeholder': 'Enter phone number',\n 'iam.company.email': 'Email',\n 'iam.company.email.placeholder': 'Enter email address',\n 'iam.company.website': 'Website',\n 'iam.company.website.placeholder': 'Enter website URL',\n 'iam.company.no.companies': 'No companies found',\n 'iam.company.delete.title': 'Delete Company',\n 'iam.company.delete.success': 'Company deleted successfully',\n 'iam.company.slug.required': 'Company slug is required',\n\n // Branch\n 'iam.branch.title': 'Branches',\n 'iam.branch.add': 'Add Branch',\n 'iam.branch.new': 'New Branch',\n 'iam.branch.create': 'Create Branch',\n 'iam.branch.edit': 'Edit Branch',\n 'iam.branch.name': 'Branch Name',\n 'iam.branch.name.placeholder': 'Enter branch name',\n 'iam.branch.slug': 'Branch Slug',\n 'iam.branch.slug.placeholder': 'Enter branch slug',\n 'iam.branch.code': 'Branch Code',\n 'iam.branch.code.placeholder': 'Enter branch code',\n 'iam.branch.company': 'Company',\n 'iam.branch.no.branches': 'No branches found',\n 'iam.branch.select.company.first': 'Please select a company first',\n 'iam.branch.view.branches': 'View Branches',\n 'iam.branch.delete.title': 'Delete Branch',\n 'iam.branch.delete.success': 'Branch deleted successfully',\n 'iam.branch.slug.required': 'Branch slug is required',\n\n // Action CRUD messages (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.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 'action.not.found': 'Action not found',\n\n // Role CRUD messages (API keys)\n 'role.create.many.success': '{{count}} roles created successfully',\n 'role.update.many.success': '{{count}} roles updated successfully',\n 'role.restore.success': 'Role restored successfully',\n 'role.not.found': 'Role not found',\n\n // Role permission messages (API keys)\n 'role.permission.get.success': 'Role permissions retrieved successfully',\n 'role.permission.assign.success': 'Role permissions assigned successfully',\n 'role.permission.actions.success': 'Role actions retrieved successfully',\n 'role.permission.users.success': 'Role users 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': 'User action permissions retrieved successfully',\n 'user.action.permission.assign.success': 'User action permissions assigned successfully',\n 'user.action.permission.revoke.success': 'User action permissions revoked successfully',\n\n // Company action permission messages (API keys)\n 'company.action.permission.get.success': 'Company action permissions retrieved successfully',\n 'company.action.permission.assign.success': 'Company action permissions assigned successfully',\n 'company.action.permission.revoke.success': 'Company action permissions revoked 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': 'Direct permission assignment not available in RBAC-only mode',\n 'iam.rbac.mode.unavailable': 'Role-based permission assignment not available in direct-only mode',\n 'iam.role.assignment.unavailable': 'Role assignment not available in direct-only mode',\n\n // Validation warnings\n 'iam.validation.warning.title': 'Validation Warning',\n 'iam.validation.unmet.prerequisites.singular': '{{count}} selected action has unmet prerequisites. Fix before saving or use auto-fix on save.',\n 'iam.validation.unmet.prerequisites.plural': '{{count}} selected actions have unmet prerequisites. Fix before saving or use auto-fix on save.',\n 'iam.validation.unmet.prerequisites.tooltip': 'This action has unmet prerequisites and will fail validation on save',\n\n // Branch selector\n 'iam.branch.permitted.count': '{{count}} permitted branch in current company',\n 'iam.branch.permitted.count.plural': '{{count}} permitted branches in current company',\n\n // Tooltips\n 'iam.tooltip.remove.action': 'Click to remove',\n 'iam.tooltip.add.action': 'Click to add (auto-selects required)',\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.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 '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.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 // Logic builder\n 'iam.logic.title': 'Permission Logic',\n 'iam.logic.add.logic': 'Add Logic',\n 'iam.logic.clear.logic': 'Clear Logic',\n 'iam.logic.description': 'Define permission requirements using AND/OR logic with actions',\n 'iam.logic.conditions': '{{count}} conditions',\n 'iam.logic.select.action': 'Select Action...',\n 'iam.logic.actions.available': '{{count}} available',\n 'iam.logic.remove': 'Remove',\n 'iam.logic.add.condition': 'Add Condition:',\n 'iam.logic.group': 'Group',\n 'iam.logic.action': 'Action',\n\n // Permission logic dialogs\n 'iam.logic.validation.failed': 'Validation Failed',\n 'iam.logic.validation.failed.message': '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': 'Removed {{count}} action(s) with unmet prerequisites. You can now save.',\n 'iam.logic.save.cancelled': 'Save Cancelled',\n 'iam.logic.fix.prerequisites.manually': 'Please fix the prerequisites manually before saving',\n 'iam.logic.missing.prerequisites': 'Missing Prerequisites',\n 'iam.logic.requires.conditions': 'requires the following conditions to be satisfied:',\n 'iam.logic.auto.select.prompt': 'Auto-select will choose {{count}} action(s){{suffix}}.',\n 'iam.logic.minimum.required': ' (minimum required)',\n 'iam.logic.would.you.continue': 'Would you like to continue?',\n 'iam.logic.select.action.label': 'Select Action',\n 'iam.logic.auto.select.actions': 'Auto-select Actions',\n 'iam.logic.actions.selected.summary': 'Actions Selected',\n 'iam.logic.action.selected.detail': 'Action selected successfully (prerequisites already satisfied)',\n 'iam.logic.auto.selected.detail': 'Automatically selected {{count}} action(s) including prerequisites',\n 'iam.logic.selection.cancelled': 'Selection Cancelled',\n 'iam.logic.action.not.added': 'Action not added to whitelist',\n 'iam.logic.dependency.warning': 'Dependency Warning',\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': 'Would you like to automatically switch to alternatives?',\n 'iam.logic.remove.dependents': 'Removing this will also remove the dependent action(s).',\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': 'Switched to alternative actions to maintain dependencies',\n 'iam.logic.actions.removed': 'Actions Removed',\n 'iam.logic.removed.with.dependents': 'Removed {{name}} and {{count}} dependent action(s)',\n 'iam.logic.cancelled': 'Cancelled',\n 'iam.logic.no.changes.made': 'No changes made',\n 'iam.logic.prerequisites.satisfied': '[OK] Prerequisites Satisfied',\n 'iam.logic.all.required.selected': 'All required actions are already selected.\\nYou can safely add this action.',\n 'iam.logic.prerequisites.required': 'Prerequisites Required ({{count}} missing)',\n 'iam.logic.click.to.auto.select': 'Click to auto-select required actions',\n 'iam.logic.satisfied': '(satisfied)',\n 'iam.logic.missing': '(missing)',\n 'iam.logic.unknown.action': 'Unknown Action',\n 'iam.logic.invalid.node': 'Invalid logic node',\n 'iam.logic.invalid': '(invalid)',\n 'iam.logic.click.to.toggle': 'Click to toggle',\n\n // Pagination templates\n 'iam.pagination.roles.template': 'Showing {first} to {last} of {totalRecords} roles',\n 'iam.pagination.actions.template': 'Showing {first} to {last} of {totalRecords} actions',\n 'iam.pagination.users.template': 'Showing {first} to {last} of {totalRecords} users',\n 'iam.pagination.companies.template': 'Showing {first} to {last} of {totalRecords} companies',\n 'iam.pagination.branches.template': 'Showing {first} to {last} of {totalRecords} branches',\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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\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 = ' '.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} <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 {\n Component,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { AngularModule, ILogicNode, PrimeModule, TranslatePipe } 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\">{{ 'iam.logic.title' | translate }}</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 } @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 </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 *ngTemplateOutlet=\"nodeTemplate; context: { $implicit: builderLogic()!, depth: 0 }\"></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 class=\"p-3 border-b border-surface\" [ngClass]=\"depth % 2 === 0 ? 'bg-surface-0' : 'bg-surface-50'\">\n <div class=\"flex items-center gap-3 mb-2\">\n <span class=\"node-type\" [ngClass]=\"node.type\">{{ node.type.toUpperCase() }}</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 {{ node.operator }}\n </span>\n <span class=\"text-muted-color text-xs\">({{ 'iam.logic.conditions' | translate: { count: node.children?.length || 0 } }})</span>\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 <option [value]=\"null\">{{ 'iam.logic.select.action' | translate }} ({{ 'iam.logic.actions.available' | translate: { count: actions().length } }})</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]=\"'iam.logic.remove' | translate\" />\n </div>\n </div>\n\n <!-- Children for group nodes -->\n @if (node.type === 'group' && node.children && node.children.length > 0) {\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 *ngTemplateOutlet=\"nodeTemplate; context: { $implicit: child, depth: depth + 1 }\"></ng-container>\n }\n </div>\n }\n\n <!-- Add child buttons for group nodes -->\n @if (node.type === 'group') {\n <div class=\"mt-3 p-3 bg-surface-50 rounded border border-dashed border-surface\">\n <div class=\"text-xs font-semibold text-muted-color mb-2\">{{ 'iam.logic.add.condition' | translate }}</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 <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 </div>\n </div>\n }\n </div>\n </ng-template>\n `,\n styles: [`\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})\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 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 }, { allowSignalWrites: true });\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(node: IBuilderNode, targetId: string): 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 { CommonModule } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { HasPermissionDirective, PrimeModule, ROLE_ACTION_PERMISSIONS, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { firstValueFrom } from 'rxjs';\nimport {\n IAction,\n IActionTreeDto,\n IRole,\n PermissionAction,\n} from '../interfaces/public-api';\nimport { ActionApiService } from '../services/action-api.service';\nimport { ActionPermissionLogicService } from '../services/action-permission-logic.service';\nimport { PermissionApiService } from '../services/permission-api.service';\nimport { RoleApiService } from '../services/role-api.service';\nimport { MAX_DROPDOWN_ITEMS } from '../constants/pagination.constants';\nimport { buildTreeFromFlat, convertActionToTreeNode } from '../utils/tree-utils';\n\n/**\n * Role-Action Selector Component\n *\n * Manages role action permissions with hierarchical tree view and intelligent dependency management.\n *\n * **Architecture:**\n * - Presentation: TreeTable for hierarchical display\n * - Business Logic: Flat action list for selection/validation\n * - State: Signals with computed dependencies\n *\n * **Core Features:**\n * - Role dropdown with async loading\n * - Hierarchical TreeTable with expand/collapse\n * - Action permission assignment (add/remove)\n * - Real-time change tracking\n *\n * **Dependency Management:**\n * - Auto-selection with AND/OR logic\n * - Dependency detection on uncheck\n * - Cascade remove for AND dependencies\n * - Visual warnings for unmet prerequisites\n * - Pre-save validation with auto-fix\n *\n * **Performance:**\n * - Computed signals for reactive updates\n * - Memoized prerequisite validation\n * - AbortController for request cancellation\n *\n * @example\n * ```html\n * <flusys-role-action-selector />\n * ```\n */\n@Component({\n selector: 'flusys-role-action-selector',\n imports: [CommonModule, FormsModule, PrimeModule, HasPermissionDirective, TranslatePipe],\n template: `\n <div class=\"role-action-selector\">\n <!-- Role 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\">{{ 'iam.permission.select.role' | translate }}</label>\n <p-select\n [ngModel]=\"selectedRoleId()\"\n (ngModelChange)=\"selectedRoleId.set($event)\"\n [options]=\"roles()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"'iam.permission.select.role.placeholder' | translate\"\n [showClear]=\"true\"\n [filter]=\"true\"\n styleClass=\"w-full\"\n />\n </div>\n </div>\n </div>\n\n @if (selectedRoleId()) {\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 <!-- Action List -->\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\">{{ 'iam.permission.action.permissions' | translate }}</h5>\n <p class=\"text-sm text-muted-color m-0\">\n {{ 'iam.permission.actions.available' | translate: { count: actions().length } }}\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 <!-- Validation Warning -->\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\">{{ 'iam.validation.warning.title' | translate }}:</span>\n <p class=\"text-sm mt-1 mb-0\">\n {{ (invalidActionsCount() > 1 ? 'iam.validation.unmet.prerequisites.plural' : 'iam.validation.unmet.prerequisites.singular') | translate: { count: invalidActionsCount() } }}\n </p>\n </div>\n </div>\n </div>\n }\n\n <!-- Action Tree Table -->\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <p-treeTable\n [value]=\"treeNodes()\"\n dataKey=\"id\"\n styleClass=\"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\">{{ 'shared.code' | translate }}</th>\n <th>{{ 'iam.action.type' | translate }}</th>\n <th class=\"hidden lg:table-cell\">{{ 'iam.permission.requirements' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-rowNode let-rowData=\"rowData\">\n <tr [class.highlight-warning]=\"hasUnmetPrerequisites(rowData)\">\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 (hasUnmetPrerequisites(rowData)) {\n <i\n class=\"pi pi-exclamation-triangle text-orange-500\"\n [pTooltip]=\"'iam.validation.unmet.prerequisites.tooltip' | translate\"\n tooltipPosition=\"top\"\n ></i>\n }\n </span>\n </td>\n <td class=\"hidden md:table-cell\">{{ rowData.code || '-' }}</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\">{{ 'iam.permission.has.prerequisites' | translate }}</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> {{ 'shared.loading.actions' | translate }}\n } @else { {{ 'iam.permission.no.actions.available' | translate }} }\n </td>\n </tr>\n </ng-template>\n </p-treeTable>\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\">{{ 'shared.pending.changes' | translate }}</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\">{{ 'shared.to.add' | translate }} ({{ pendingAdd().length }})</strong>\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\">{{ 'shared.to.remove' | translate }} ({{ pendingRemove().length }})</strong>\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 class=\"pi pi-info-circle text-muted-color mb-3 block text-5xl\"></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 :host {\n display: block;\n }\n /* Dark mode compatible validation warning */\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 /* Dark mode compatible warning row highlight */\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})\nexport class RoleActionSelectorComponent {\n // Permission constants for template\n readonly ROLE_ACTION_PERMISSIONS = ROLE_ACTION_PERMISSIONS;\n\n // Dependencies\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 private readonly permissionLogic = inject(ActionPermissionLogicService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n // State - Role Selection\n readonly selectedRoleId = signal<string | undefined>(undefined);\n readonly roles = signal<IRole[]>([]);\n\n // State - Loading/Saving\n readonly loading = signal(false);\n readonly saving = signal(false);\n\n // State - Actions (Business Logic)\n private readonly _actions = signal<IAction[]>([]);\n readonly actions = this._actions.asReadonly();\n\n // State - Actions (Display)\n private readonly _actionsTree = signal<IActionTreeDto[]>([]);\n private readonly actionsTree = this._actionsTree.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 - Tree Nodes (for PrimeNG TreeTable)\n readonly treeNodes = computed(() =>\n convertActionToTreeNode(this.actionsTree()),\n );\n\n // Computed - Selection State\n readonly allSelected = computed(() => {\n const selMap = this.selectionMap();\n const total = this.actions().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 - Validation\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 // Computed - Pending Changes\n readonly pendingAdd = computed(() => {\n const current = this.selectionMap();\n const initial = this.initialSelection();\n const allActions = this.actions();\n\n return allActions.filter(\n (action) => current[action.id as string] && !initial[action.id as string],\n );\n });\n\n readonly pendingRemove = computed(() => {\n const current = this.selectionMap();\n const initial = this.initialSelection();\n const allActions = this.actions();\n\n return allActions.filter(\n (action) => !current[action.id as string] && initial[action.id as string],\n );\n });\n\n // Computed - Save Button State\n readonly canSave = computed(() => {\n return (\n this.hasChanges() && !this.saving() && this.invalidActionsCount() === 0\n );\n });\n\n // AbortController for data loading\n private loadDataAbortController: AbortController | null = null;\n\n constructor() {\n this.loadRoles();\n\n // Cleanup on destroy\n this.destroyRef.onDestroy(() => {\n this.loadDataAbortController?.abort();\n });\n\n // Effect: Load data when role selection changes\n effect(() => {\n const roleId = this.selectedRoleId();\n\n // Abort previous request\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 // Error toast handled by global interceptor\n this.loading.set(false);\n }\n });\n } else {\n this.resetState();\n }\n });\n }\n\n /**\n * Load roles from API\n */\n private async loadRoles(): Promise<void> {\n try {\n const response = await firstValueFrom(\n this.roleApi.getAll('', {\n pagination: { currentPage: 0, pageSize: MAX_DROPDOWN_ITEMS },\n }),\n );\n this.roles.set(response?.data ?? []);\n } catch {\n // Error toast handled by global interceptor\n }\n }\n\n /**\n * Load actions and assignments for selected role\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 // Get flat list (filtered by company if enabled)\n const flatActions = (actionsResponse?.data ?? []).filter((a) => !!a.id);\n\n // Build tree structure from flat list with parentId\n const actionsTree = buildTreeFromFlat(flatActions) as IActionTreeDto[];\n\n // Store both representations\n this._actionsTree.set(actionsTree);\n this._actions.set(flatActions);\n\n // Load existing assignments\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 // Build selection map\n const selMap: Record<string, boolean> = {};\n for (const action of flatActions) {\n if (action.id) {\n selMap[action.id] = assignedIds.has(action.id);\n }\n }\n this.applySelection(selMap);\n } finally {\n if (!signal.aborted) {\n this.loading.set(false);\n }\n }\n }\n\n /**\n * Get tooltip for action checkbox\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\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\n return `${prerequisiteInfo}${actionHint}`;\n }\n }\n\n if (isCurrentlySelected) {\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\n return `[${this.translate('shared.add')}] ${this.translate('iam.tooltip.click.to.assign.role')}`;\n }\n\n /**\n * Check if action has unmet prerequisites\n */\n hasUnmetPrerequisites(action: IAction): boolean {\n return action.id\n ? this.actionsWithUnmetPrerequisites().has(action.id)\n : false;\n }\n\n /**\n * Handle action toggle with dependency management\n */\n onActionToggle(action: IAction, newValue: boolean): void {\n if (!newValue) {\n // Unchecking - validate dependencies\n this.permissionLogic.handleUncheck(\n action,\n this.selectionMap(),\n this.actions(),\n (newMap) => this._selectionMap.set(newMap),\n );\n } else {\n // Checking - validate prerequisites\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 private setAllSelection(value: boolean): void {\n const selMap: Record<string, boolean> = {};\n for (const action of this.actions()) {\n selMap[action.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 roleId = this.selectedRoleId();\n if (!roleId) return;\n\n // Pre-save validation\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 // Build payload\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({\n roleId,\n items,\n }),\n );\n\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response?.data?.message || this.translate('iam.permission.role.permissions.updated'),\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 private applySelection(selMap: Record<string, boolean>): void {\n this._selectionMap.set(selMap);\n this._initialSelection.set({ ...selMap });\n }\n\n private 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 private resetState(): void {\n this._actionsTree.set([]);\n this._actions.set([]);\n this._selectionMap.set({});\n this._initialSelection.set({});\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { COMPANY_ACTION_PERMISSIONS, COMPANY_API_PROVIDER, HasPermissionDirective, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { firstValueFrom } from 'rxjs';\nimport {\n IAction,\n IActionTreeDto,\n ICompany,\n IPrerequisiteValidationError,\n PermissionAction,\n} from '../interfaces/public-api';\nimport { ActionApiService } from '../services/action-api.service';\nimport { ActionPermissionLogicService } from '../services/action-permission-logic.service';\nimport { PermissionApiService } from '../services/permission-api.service';\nimport { MAX_DROPDOWN_ITEMS } from '../constants/pagination.constants';\nimport { convertActionToTreeNode, flattenTree } from '../utils/tree-utils';\n\n/**\n * Company-Action Selector Component\n *\n * Manages company action whitelisting with hierarchical tree view and intelligent dependency management.\n *\n * **Architecture:**\n * - Presentation: TreeTable for hierarchical display\n * - Business Logic: Flat action list for selection/validation\n * - State: Signals with computed dependencies\n *\n * **Core Features:**\n * - Company dropdown with async loading\n * - Hierarchical TreeTable with expand/collapse\n * - Action whitelist management (add/remove)\n * - Real-time change tracking\n *\n * **Dependency Management:**\n * - Auto-selection with AND/OR logic\n * - Dependency detection on uncheck\n * - Cascade remove for AND dependencies\n * - Visual warnings for unmet prerequisites\n * - Pre-save validation with auto-fix\n *\n * **Performance:**\n * - Computed signals for reactive updates\n * - Memoized prerequisite validation\n * - AbortController for request cancellation\n *\n * @example\n * ```html\n * <flusys-company-action-selector />\n * ```\n */\n@Component({\n selector: 'flusys-company-action-selector',\n imports: [CommonModule, FormsModule, PrimeModule, HasPermissionDirective, TranslatePipe],\n template: `\n <div class=\"company-action-selector\">\n <!-- Company 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\">{{ 'iam.permission.select.company' | translate }}</label>\n <p-select\n [ngModel]=\"selectedCompanyId()\"\n (ngModelChange)=\"selectedCompanyId.set($event)\"\n [options]=\"companies()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"'iam.permission.select.company.placeholder' | translate\"\n [showClear]=\"true\"\n [filter]=\"true\"\n styleClass=\"w-full\"\n />\n </div>\n </div>\n </div>\n\n @if (selectedCompanyId()) {\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 <!-- Action List -->\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\">{{ 'iam.permission.action.whitelist' | translate }}</h5>\n <p class=\"text-sm text-muted-color m-0\">\n {{ 'iam.permission.actions.available' | translate: { count: actions().length } }}\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 <!-- Validation Warning -->\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\">{{ 'iam.validation.warning.title' | translate }}:</span>\n <p class=\"text-sm mt-1 mb-0\">\n {{ (invalidActionsCount() > 1 ? 'iam.validation.unmet.prerequisites.plural' : 'iam.validation.unmet.prerequisites.singular') | translate: { count: invalidActionsCount() } }}\n </p>\n </div>\n </div>\n </div>\n }\n\n <!-- Action Tree Table -->\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <p-treeTable\n [value]=\"treeNodes()\"\n dataKey=\"id\"\n styleClass=\"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\">{{ 'shared.code' | translate }}</th>\n <th>{{ 'iam.action.type' | translate }}</th>\n <th class=\"hidden lg:table-cell\">{{ 'shared.description' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-rowNode let-rowData=\"rowData\">\n <tr [class.highlight-warning]=\"hasUnmetPrerequisites(rowData)\">\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 (hasUnmetPrerequisites(rowData)) {\n <i\n class=\"pi pi-exclamation-triangle text-orange-500\"\n [pTooltip]=\"'iam.validation.unmet.prerequisites.tooltip' | translate\"\n tooltipPosition=\"top\"\n ></i>\n }\n </span>\n </td>\n <td class=\"hidden md:table-cell\">{{ rowData.code || '-' }}</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\">{{ rowData.description || '-' }}</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> {{ 'shared.loading.actions' | translate }}\n } @else { {{ 'iam.permission.no.actions.available' | translate }} }\n </td>\n </tr>\n </ng-template>\n </p-treeTable>\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\">{{ 'shared.pending.changes' | translate }}</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\">{{ 'shared.to.whitelist' | translate }} ({{ pendingAdd().length }})</strong>\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\">{{ 'shared.to.remove' | translate }} ({{ pendingRemove().length }})</strong>\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 class=\"pi pi-info-circle text-muted-color mb-3 block text-5xl\"></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 :host {\n display: block;\n }\n /* Dark mode compatible validation warning */\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 /* Dark mode compatible warning row highlight */\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})\nexport class CompanyActionSelectorComponent {\n // Permission constants for template\n readonly COMPANY_ACTION_PERMISSIONS = COMPANY_ACTION_PERMISSIONS;\n\n // Dependencies\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 permissionLogic = inject(ActionPermissionLogicService);\n private readonly destroyRef = inject(DestroyRef);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n // State - Company Selection\n readonly selectedCompanyId = signal<string | undefined>(undefined);\n readonly companies = signal<ICompany[]>([]);\n\n // State - Loading/Saving\n readonly loading = signal(false);\n readonly saving = signal(false);\n\n // State - Actions (Business Logic)\n private readonly _actions = signal<IAction[]>([]);\n readonly actions = this._actions.asReadonly();\n\n // State - Actions (Display)\n private readonly _actionsTree = signal<IActionTreeDto[]>([]);\n private readonly actionsTree = this._actionsTree.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 - Tree Nodes (for PrimeNG TreeTable)\n readonly treeNodes = computed(() =>\n convertActionToTreeNode(this.actionsTree()),\n );\n\n // Computed - Selection State\n readonly allSelected = computed(() => {\n const selMap = this.selectionMap();\n const total = this.actions().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 - Validation\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 // Computed - Pending Changes\n readonly pendingAdd = computed(() => {\n const current = this.selectionMap();\n const initial = this.initialSelection();\n const allActions = this.actions();\n\n return allActions.filter(\n (action) => current[action.id as string] && !initial[action.id as string],\n );\n });\n\n readonly pendingRemove = computed(() => {\n const current = this.selectionMap();\n const initial = this.initialSelection();\n const allActions = this.actions();\n\n return allActions.filter(\n (action) => !current[action.id as string] && initial[action.id as string],\n );\n });\n\n // Computed - Save Button State\n readonly canSave = computed(() => {\n return this.hasChanges() && !this.saving() && this.invalidActionsCount() === 0;\n });\n\n // AbortController for data loading\n private loadDataAbortController: AbortController | null = null;\n\n constructor() {\n // Cleanup on destroy\n this.destroyRef.onDestroy(() => {\n this.loadDataAbortController?.abort();\n });\n\n this.loadCompanies();\n\n // Effect: Load data when company selection changes\n effect(() => {\n const companyId = this.selectedCompanyId();\n\n // Abort previous request\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 // Error toast handled by global interceptor\n this.loading.set(false);\n }\n });\n } else {\n this.resetState();\n }\n });\n }\n\n /**\n * Load companies from API\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 // Error toast handled by global interceptor\n }\n }\n\n /**\n * Load actions and assignments for selected company\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 // Fetch hierarchical action tree\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\n // Flatten tree for business logic\n const actionsList = flattenTree(actionsTree).filter((a) => !!a.id);\n\n // Store both representations\n this._actionsTree.set(actionsTree);\n this._actions.set(actionsList);\n\n // Load existing assignments\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 /**\n * Check if action has unmet prerequisites\n */\n hasUnmetPrerequisites(action: IAction): boolean {\n return action.id\n ? this.actionsWithUnmetPrerequisites().has(action.id)\n : false;\n }\n\n /**\n * Get tooltip for action checkbox\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\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\n return `${prerequisiteInfo}${actionHint}`;\n }\n }\n\n if (isCurrentlySelected) {\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\n return `[${this.translate('shared.add')}] ${this.translate('iam.tooltip.click.to.add')}`;\n }\n\n /**\n * Handle action checkbox toggle\n */\n onActionToggle(action: IAction, newValue: boolean): void {\n if (!newValue) {\n // Unchecking - validate dependencies\n this.permissionLogic.handleUncheck(\n action,\n this.selectionMap(),\n this.actions(),\n (newMap) => this._selectionMap.set(newMap),\n );\n } else {\n // Checking - validate prerequisites\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 private setAllSelection(value: boolean): void {\n this._selectionMap.set(this.buildSelectionMap(this.actions(), () => value));\n }\n\n /**\n * Save changes to backend\n */\n async saveChanges(): Promise<void> {\n const companyId = this.selectedCompanyId();\n if (!companyId) return;\n\n // Pre-save validation\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({\n companyId,\n items,\n }),\n );\n\n // Handle backend prerequisite errors\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?.data?.message || this.translate('iam.permission.company.actions.updated'),\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 * Handle backend prerequisite validation errors\n * Shows confirmation dialog with auto-fix option\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 // Auto-select missing prerequisites\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\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 // Revert to initial state\n this._selectionMap.set({ ...this.initialSelection() });\n\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 private resetState(): void {\n this._actionsTree.set([]);\n this._actions.set([]);\n this._selectionMap.set({});\n this._initialSelection.set({});\n }\n\n private 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 private 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","import { CommonModule } from '@angular/common';\nimport {\n Component,\n computed,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { APP_CONFIG, isCompanyFeatureEnabled, TRANSLATE_ADAPTER } 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 {\n IBranch,\n IRole,\n PermissionAction,\n} 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: [CommonModule, FormsModule, PrimeModule, HasPermissionDirective, UserSelectComponent, TranslatePipe],\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]=\"'iam.permission.select.user.placeholder' | translate\"\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]=\"'iam.permission.select.branch.placeholder' | translate\"\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 {{ (filteredBranches().length !== 1 ? 'iam.branch.permitted.count.plural' : 'iam.branch.permitted.count') | translate: { count: filteredBranches().length } }}\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\">{{ 'iam.permission.role.assignments' | translate }}</h5>\n <p class=\"text-sm text-muted-color m-0\">\n {{ 'iam.permission.roles.available' | translate: { count: roles().length } }}\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]=\"'iam.pagination.roles.template' | translate\"\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\">{{ 'shared.code' | translate }}</th>\n <th class=\"hidden md:table-cell\">{{ 'shared.description' | translate }}</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\">{{ role.description || '-' }}</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> {{ '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\">{{ 'shared.pending.changes' | translate }}</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\">{{ 'shared.to.assign' | translate }} ({{ pendingAdd().length }})</strong>\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\">{{ 'shared.to.remove' | translate }} ({{ pendingRemove().length }})</strong>\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 class=\"pi pi-info-circle text-muted-color mb-3 block text-5xl\"></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, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): 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 firstValueFrom(\n this.roleApi.getAll('', {\n pagination: { currentPage: 0, pageSize: MAX_DROPDOWN_ITEMS },\n }),\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?.data?.message || this.translate('iam.permission.user.roles.updated'),\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 { CommonModule } from '@angular/common';\nimport {\n Component,\n computed,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { APP_CONFIG, isCompanyFeatureEnabled, TRANSLATE_ADAPTER } 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 {\n IAction,\n IActionTreeDto,\n IBranch,\n PermissionAction,\n} from '../interfaces/public-api';\nimport { ActionApiService } from '../services/action-api.service';\nimport { ActionPermissionLogicService } from '../services/action-permission-logic.service';\nimport { PermissionApiService } from '../services/permission-api.service';\nimport {\n buildTreeFromFlat,\n convertActionToTreeNode,\n} from '../utils/tree-utils';\n\n/**\n * User-Action Selector Component\n *\n * Manages direct user action permissions with hierarchical tree view.\n *\n * **Architecture:**\n * - Presentation: TreeTable for hierarchical display\n * - Business Logic: Flat action list for selection/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 * - Hierarchical TreeTable with expand/collapse\n * - Direct user-action permission assignment (bypassing roles)\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-action-selector />\n * ```\n */\n@Component({\n selector: 'flusys-user-action-selector',\n imports: [CommonModule, FormsModule, PrimeModule, HasPermissionDirective, UserSelectComponent, TranslatePipe],\n template: `\n <div class=\"user-action-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]=\"'iam.permission.select.user.placeholder' | translate\"\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]=\"'iam.permission.select.branch.placeholder' | translate\"\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 {{ (filteredBranches().length !== 1 ? 'iam.branch.permitted.count.plural' : 'iam.branch.permitted.count') | translate: { count: filteredBranches().length } }}\n </small>\n </div>\n }\n </div>\n </div>\n\n @if (selectedUserId()) {\n <!-- Loading State -->\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 <!-- Action List -->\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\">{{ 'iam.permission.direct.action.permissions' | translate }}</h5>\n <p class=\"text-sm text-muted-color m-0\">\n {{ 'iam.permission.actions.available' | translate: { count: actions().length } }}\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 <!-- Validation Warning -->\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\">{{ 'iam.validation.warning.title' | translate }}:</span>\n <p class=\"text-sm mt-1 mb-0\">\n {{ (invalidActionsCount() > 1 ? 'iam.validation.unmet.prerequisites.plural' : 'iam.validation.unmet.prerequisites.singular') | translate: { count: invalidActionsCount() } }}\n </p>\n </div>\n </div>\n </div>\n }\n\n <!-- Action Tree Table -->\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <p-treeTable\n [value]=\"treeNodes()\"\n dataKey=\"id\"\n styleClass=\"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\">{{ 'shared.code' | translate }}</th>\n <th>{{ 'iam.action.type' | translate }}</th>\n <th class=\"hidden lg:table-cell\">{{ 'shared.description' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-rowNode let-rowData=\"rowData\">\n <tr [class.highlight-warning]=\"hasUnmetPrerequisites(rowData)\">\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 (hasUnmetPrerequisites(rowData)) {\n <i\n class=\"pi pi-exclamation-triangle text-orange-500\"\n [pTooltip]=\"'iam.validation.unmet.prerequisites.tooltip' | translate\"\n tooltipPosition=\"top\"\n ></i>\n }\n </span>\n </td>\n <td class=\"hidden md:table-cell\">{{ rowData.code || '-' }}</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\">{{ rowData.description || '-' }}</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> {{ '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 <!-- 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\">{{ 'shared.pending.changes' | translate }}</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\">{{ 'shared.to.assign' | translate }} ({{ pendingAdd().length }})</strong>\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\">{{ 'shared.to.remove' | translate }} ({{ pendingRemove().length }})</strong>\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 class=\"pi pi-info-circle text-muted-color mb-3 block text-5xl\"></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 :host {\n display: block;\n }\n /* Dark mode compatible validation warning */\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 /* Dark mode compatible warning row highlight */\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})\nexport class UserActionSelectorComponent {\n // Permission constants for template\n readonly USER_ACTION_PERMISSIONS = USER_ACTION_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 actionApi = inject(ActionApiService);\n private readonly permissionApi = inject(PermissionApiService);\n private readonly permissionLogic = inject(ActionPermissionLogicService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): 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 - Actions (Business Logic)\n private readonly _actions = signal<IAction[]>([]);\n readonly actions = this._actions.asReadonly();\n\n // State - Actions (Display)\n private readonly _actionsTree = signal<IActionTreeDto[]>([]);\n private readonly actionsTree = this._actionsTree.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 - Company Feature Flag (cached)\n private readonly isCompanyFeatureActive = computed(\n () => isCompanyFeatureEnabled(this.appConfig) === true,\n );\n\n // Computed - UI Flags\n readonly showBranchSelector = this.isCompanyFeatureActive;\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 - Tree Nodes (for PrimeNG TreeTable)\n readonly treeNodes = computed(() =>\n convertActionToTreeNode(this.actionsTree()),\n );\n\n // Computed - Selection State\n readonly allSelected = computed(() => {\n const selMap = this.selectionMap();\n const total = this.actions().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 - Validation\n readonly actionsWithUnmetPrerequisites = computed(() => {\n const selMap = this.selectionMap();\n const allActions = this.actions();\n\n const unmetSet = new Set<string>();\n allActions.forEach((action) => {\n if (\n action.id &&\n this.permissionLogic.hasUnmetPrerequisites(action, selMap, allActions)\n ) {\n unmetSet.add(action.id);\n }\n });\n\n return unmetSet;\n });\n\n readonly invalidActionsCount = computed(() => {\n return this.actionsWithUnmetPrerequisites().size;\n });\n\n // Computed - Pending Changes\n readonly pendingAdd = computed(() => {\n const current = this.selectionMap();\n const initial = this.initialSelection();\n const allActions = this.actions();\n\n return allActions.filter(\n (action) => current[action.id as string] && !initial[action.id as string],\n );\n });\n\n readonly pendingRemove = computed(() => {\n const current = this.selectionMap();\n const initial = this.initialSelection();\n const allActions = this.actions();\n\n return allActions.filter(\n (action) => !current[action.id as string] && initial[action.id as string],\n );\n });\n\n // Computed - Save Button State\n readonly canSave = computed(() => {\n return (\n this.hasChanges() && !this.saving() && this.invalidActionsCount() === 0\n );\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 (this.isCompanyFeatureActive()) {\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 (this.isCompanyFeatureActive() && userId && branchId !== undefined) {\n this.loadData();\n }\n });\n }\n\n /**\n * Load user's permitted branches\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 // Error toast handled by global interceptor\n }\n }\n\n /**\n * Load actions 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 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\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 action checkbox\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\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\n return `${prerequisiteInfo}${actionHint}`;\n }\n }\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.user')}`;\n }\n\n return `[${this.translate('shared.add')}] ${this.translate('iam.tooltip.click.to.assign.user')}`;\n }\n\n /**\n * Check if action has unmet prerequisites\n */\n hasUnmetPrerequisites(action: IAction): boolean {\n return action.id\n ? this.actionsWithUnmetPrerequisites().has(action.id)\n : false;\n }\n\n /**\n * Handle action toggle with dependency management\n */\n onActionToggle(action: IAction, newValue: boolean): void {\n if (!newValue) {\n // Unchecking - validate dependencies\n this.permissionLogic.handleUncheck(\n action,\n this.selectionMap(),\n this.actions(),\n (newMap) => this._selectionMap.set(newMap),\n );\n } else {\n // Checking - validate prerequisites\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.setAllActions(!this.allSelected());\n }\n\n selectAll(): void {\n this.setAllActions(true);\n }\n\n deselectAll(): void {\n this.setAllActions(false);\n }\n\n private setAllActions(value: boolean): void {\n this._selectionMap.set(\n this.buildSelectionMap(this.actions(), () => value),\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.buildPermissionItems();\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?.data?.message || this.translate('iam.permission.user.actions.updated'),\n });\n\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 private resetState(): void {\n this._actionsTree.set([]);\n this._actions.set([]);\n this._selectionMap.set({});\n this._initialSelection.set({});\n }\n\n private buildSelectionMap(\n actions: IAction[],\n predicate: (action: IAction) => boolean,\n ): Record<string, boolean> {\n const selMap: Record<string, boolean> = {};\n actions.forEach((action) => {\n selMap[action.id as string] = predicate(action);\n });\n return selMap;\n }\n\n private buildPermissionItems(): Array<{ id: string; action: PermissionAction }> {\n const items: Array<{ id: string; action: PermissionAction }> = [];\n\n this.pendingAdd().forEach((action) => {\n items.push({ id: action.id as string, action: 'add' });\n });\n\n this.pendingRemove().forEach((action) => {\n items.push({ id: action.id as string, action: 'remove' });\n });\n\n return items;\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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"}
|
|
1
|
+
{"version":3,"file":"flusys-ng-iam-flusys-ng-iam-CnVOy_4s.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/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 metadata: Record<string, unknown> | null;\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 metadata?: Record<string, unknown>;\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 // Container page\n 'iam.title': 'Identity & Access Management',\n 'iam.subtitle': 'Manage roles, permissions, and access control',\n\n // Tabs\n 'iam.tabs.roles': 'Roles',\n 'iam.tabs.actions': 'Actions',\n 'iam.tabs.permissions': 'Permissions',\n\n // Administration\n 'iam.administration.title': 'Administration',\n 'iam.administration.subtitle': 'Manage users, companies, and branches',\n\n // Users\n 'iam.user.title': 'Users',\n 'iam.user.add': 'Add User',\n 'iam.user.new': 'New User',\n 'iam.user.create': 'Create User',\n 'iam.user.edit': 'Edit User',\n 'iam.user.name': 'Name',\n 'iam.user.email': 'Email',\n 'iam.user.phone': 'Phone',\n 'iam.user.password': 'Password',\n 'iam.user.password.optional': 'Password (leave blank to keep current)',\n 'iam.user.password.placeholder': 'Enter password',\n 'iam.user.name.placeholder': 'Enter full name',\n 'iam.user.email.placeholder': 'Enter email address',\n 'iam.user.phone.placeholder': 'Enter phone number',\n 'iam.user.email.verified': 'Email Verified',\n 'iam.user.no.users': 'No users found',\n 'iam.user.details': 'User Details',\n 'iam.user.auto.assign.to': 'Auto-assign to',\n 'iam.user.assign.role': 'Assign Role',\n 'iam.user.remove.role': 'Remove Role',\n 'iam.user.activate': 'Activate User',\n 'iam.user.deactivate': 'Deactivate User',\n 'iam.user.reset.password': 'Reset Password',\n 'iam.user.assign.branch': 'Assign Branch',\n 'iam.user.delete.title': 'Delete User',\n 'iam.user.delete.success': 'User deleted successfully',\n\n // Roles\n 'iam.role.title': 'Roles',\n 'iam.role.new': 'New Role',\n 'iam.role.create': 'Create Role',\n 'iam.role.edit': 'Edit Role',\n 'iam.role.name': 'Role Name',\n 'iam.role.name.placeholder': 'Enter role name',\n 'iam.role.description': 'Role Description',\n 'iam.role.description.placeholder': 'Enter role description',\n 'iam.role.permissions': 'Permissions',\n 'iam.role.assigned.users': 'Assigned Users',\n 'iam.role.no.roles': 'No roles found',\n 'iam.role.no.roles.assigned': 'No roles assigned',\n 'iam.role.delete.title': 'Delete Role',\n 'iam.role.delete.success': 'Role deleted successfully',\n 'iam.role.create.success': 'Role created successfully',\n 'iam.role.update.success': 'Role updated successfully',\n 'role.create.success': 'Role created successfully',\n 'role.update.success': 'Role updated successfully',\n 'role.delete.success': 'Role deleted successfully',\n 'role.get.success': 'Role retrieved successfully',\n 'role.get.all.success': 'Roles retrieved successfully',\n\n // Actions\n 'iam.action.title': 'Actions',\n 'iam.action.new': 'New Action',\n 'iam.action.create': 'Create Action',\n 'iam.action.edit': 'Edit Action',\n 'iam.action.name': 'Action Name',\n 'iam.action.name.placeholder': 'Enter action name',\n 'iam.action.code': 'Action Code',\n 'iam.action.code.placeholder': 'Enter action code',\n 'iam.action.type': 'Type',\n 'iam.action.no.actions': 'No actions found',\n 'iam.action.no.actions.assigned': 'No actions assigned',\n 'iam.action.direct.actions': 'Direct Actions',\n 'iam.action.type.backend': 'Backend',\n 'iam.action.type.frontend': 'Frontend',\n 'iam.action.type.both': 'Both',\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 'iam.action.delete.title': 'Delete Action',\n 'iam.action.delete.success': 'Action deleted successfully',\n 'iam.action.create.success': 'Action created successfully',\n 'iam.action.update.success': 'Action updated successfully',\n 'iam.action.parent': 'Parent Action',\n 'iam.action.select.parent': 'Select Parent Action',\n\n // Permissions\n 'iam.permission.title': 'Permissions',\n 'iam.permission.create': 'Create Permission',\n 'iam.permission.edit': 'Edit Permission',\n 'iam.permission.name': 'Permission Name',\n 'iam.permission.code': 'Permission Code',\n 'iam.permission.module': 'Module',\n 'iam.permission.action': 'Action',\n 'iam.permission.description': 'Description',\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 'iam.permission.company.permissions': 'Company Permissions',\n 'iam.permission.branch.permissions': 'Branch Permissions',\n 'iam.permission.my.permissions': 'My Permissions',\n 'iam.permission.select.company': 'Select Company',\n 'iam.permission.select.company.placeholder': 'Search and select a company',\n 'iam.permission.select.role': 'Select Role',\n 'iam.permission.select.role.placeholder': 'Search and select a role',\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.permission.action.whitelist': 'Action Whitelist',\n 'iam.permission.action.permissions': 'Action Permissions',\n 'iam.permission.direct.action.permissions': 'Direct Action Permissions',\n 'iam.permission.role.assignments': 'Role Assignments',\n 'iam.permission.actions.available': '{{count}} actions available',\n 'iam.permission.roles.available': '{{count}} roles available',\n 'iam.permission.no.actions.available': 'No actions available',\n 'iam.permission.no.roles.available': 'No roles available',\n 'iam.permission.no.actions.for.company': 'No actions available for this company',\n 'iam.permission.no.actions.for.role': 'No actions available for this role',\n 'iam.permission.no.actions.for.user': 'No actions available for this user',\n 'iam.permission.no.roles.for.user': 'No roles available for this user',\n 'iam.permission.company.required': 'Please select a company first',\n 'iam.permission.has.prerequisites': 'Has prerequisites',\n 'iam.permission.requirements': 'Requirements',\n 'iam.permission.company.actions.updated': 'Company actions updated successfully',\n 'iam.permission.role.permissions.updated': 'Role permissions updated successfully',\n 'iam.permission.user.actions.updated': 'User actions updated successfully',\n 'iam.permission.user.roles.updated': 'User roles updated successfully',\n 'iam.permission.requires': 'requires',\n 'iam.permission.prerequisite.validation.failed': 'Prerequisite Validation Failed',\n 'iam.permission.prerequisite.error.message': 'The following actions have unmet prerequisites:',\n 'iam.permission.auto.select.prompt': 'Would you like to auto-select the required actions?',\n 'iam.permission.auto.select.required': 'Auto-select Required',\n 'iam.permission.actions.selected': 'Actions Selected',\n 'iam.permission.auto.selected.prerequisites': 'Required prerequisites have been auto-selected. Click Save to apply changes.',\n 'iam.permission.changes.reverted': 'Changes Reverted',\n 'iam.permission.selection.reverted': 'Selection has been reverted to the initial state.',\n 'permission.create.success': 'Permission created successfully',\n 'permission.update.success': 'Permission updated successfully',\n 'permission.delete.success': 'Permission deleted successfully',\n 'permission.get.success': 'Permission retrieved successfully',\n 'permission.get.all.success': 'Permissions retrieved successfully',\n 'permission.process.success': '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 // Access control\n 'iam.access.denied': 'Access Denied',\n 'iam.no.permission': 'You do not have permission to perform this action.',\n 'iam.contact.admin': 'Please contact your administrator for access.',\n 'iam.insufficient.permissions': 'Insufficient permissions',\n\n // Company\n 'iam.company.title': 'Companies',\n 'iam.company.add': 'Add Company',\n 'iam.company.new': 'New Company',\n 'iam.company.create': 'Create Company',\n 'iam.company.edit': 'Edit Company',\n 'iam.company.select': 'Select Company',\n 'iam.company.name': 'Company Name',\n 'iam.company.name.placeholder': 'Enter company name',\n 'iam.company.slug': 'Company Slug',\n 'iam.company.slug.placeholder': 'Enter company slug',\n 'iam.company.code': 'Company Code',\n 'iam.company.code.placeholder': 'Enter company code',\n 'iam.company.details': 'Company Details',\n 'iam.company.address': 'Address',\n 'iam.company.address.placeholder': 'Enter company address',\n 'iam.company.phone': 'Phone',\n 'iam.company.phone.placeholder': 'Enter phone number',\n 'iam.company.email': 'Email',\n 'iam.company.email.placeholder': 'Enter email address',\n 'iam.company.website': 'Website',\n 'iam.company.website.placeholder': 'Enter website URL',\n 'iam.company.no.companies': 'No companies found',\n 'iam.company.delete.title': 'Delete Company',\n 'iam.company.delete.success': 'Company deleted successfully',\n 'iam.company.slug.required': 'Company slug is required',\n\n // Branch\n 'iam.branch.title': 'Branches',\n 'iam.branch.add': 'Add Branch',\n 'iam.branch.new': 'New Branch',\n 'iam.branch.create': 'Create Branch',\n 'iam.branch.edit': 'Edit Branch',\n 'iam.branch.name': 'Branch Name',\n 'iam.branch.name.placeholder': 'Enter branch name',\n 'iam.branch.slug': 'Branch Slug',\n 'iam.branch.slug.placeholder': 'Enter branch slug',\n 'iam.branch.code': 'Branch Code',\n 'iam.branch.code.placeholder': 'Enter branch code',\n 'iam.branch.company': 'Company',\n 'iam.branch.no.branches': 'No branches found',\n 'iam.branch.select.company.first': 'Please select a company first',\n 'iam.branch.view.branches': 'View Branches',\n 'iam.branch.delete.title': 'Delete Branch',\n 'iam.branch.delete.success': 'Branch deleted successfully',\n 'iam.branch.slug.required': 'Branch slug is required',\n\n // Action CRUD messages (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.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 'action.not.found': 'Action not found',\n\n // Role CRUD messages (API keys)\n 'role.create.many.success': '{{count}} roles created successfully',\n 'role.update.many.success': '{{count}} roles updated successfully',\n 'role.restore.success': 'Role restored successfully',\n 'role.not.found': 'Role not found',\n\n // Role permission messages (API keys)\n 'role.permission.get.success': 'Role permissions retrieved successfully',\n 'role.permission.assign.success': 'Role permissions assigned successfully',\n 'role.permission.actions.success': 'Role actions retrieved successfully',\n 'role.permission.users.success': 'Role users 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': 'User action permissions retrieved successfully',\n 'user.action.permission.assign.success': 'User action permissions assigned successfully',\n 'user.action.permission.revoke.success': 'User action permissions revoked successfully',\n\n // Company action permission messages (API keys)\n 'company.action.permission.get.success': 'Company action permissions retrieved successfully',\n 'company.action.permission.assign.success': 'Company action permissions assigned successfully',\n 'company.action.permission.revoke.success': 'Company action permissions revoked 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': 'Direct permission assignment not available in RBAC-only mode',\n 'iam.rbac.mode.unavailable': 'Role-based permission assignment not available in direct-only mode',\n 'iam.role.assignment.unavailable': 'Role assignment not available in direct-only mode',\n\n // Validation warnings\n 'iam.validation.warning.title': 'Validation Warning',\n 'iam.validation.unmet.prerequisites.singular': '{{count}} selected action has unmet prerequisites. Fix before saving or use auto-fix on save.',\n 'iam.validation.unmet.prerequisites.plural': '{{count}} selected actions have unmet prerequisites. Fix before saving or use auto-fix on save.',\n 'iam.validation.unmet.prerequisites.tooltip': 'This action has unmet prerequisites and will fail validation on save',\n\n // Branch selector\n 'iam.branch.permitted.count': '{{count}} permitted branch in current company',\n 'iam.branch.permitted.count.plural': '{{count}} permitted branches in current company',\n\n // Tooltips\n 'iam.tooltip.remove.action': 'Click to remove',\n 'iam.tooltip.add.action': 'Click to add (auto-selects required)',\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.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 '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.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 // Logic builder\n 'iam.logic.title': 'Permission Logic',\n 'iam.logic.add.logic': 'Add Logic',\n 'iam.logic.clear.logic': 'Clear Logic',\n 'iam.logic.description': 'Define permission requirements using AND/OR logic with actions',\n 'iam.logic.conditions': '{{count}} conditions',\n 'iam.logic.select.action': 'Select Action...',\n 'iam.logic.actions.available': '{{count}} available',\n 'iam.logic.remove': 'Remove',\n 'iam.logic.add.condition': 'Add Condition:',\n 'iam.logic.group': 'Group',\n 'iam.logic.action': 'Action',\n\n // Permission logic dialogs\n 'iam.logic.validation.failed': 'Validation Failed',\n 'iam.logic.validation.failed.message': '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': 'Removed {{count}} action(s) with unmet prerequisites. You can now save.',\n 'iam.logic.save.cancelled': 'Save Cancelled',\n 'iam.logic.fix.prerequisites.manually': 'Please fix the prerequisites manually before saving',\n 'iam.logic.missing.prerequisites': 'Missing Prerequisites',\n 'iam.logic.requires.conditions': 'requires the following conditions to be satisfied:',\n 'iam.logic.auto.select.prompt': 'Auto-select will choose {{count}} action(s){{suffix}}.',\n 'iam.logic.minimum.required': ' (minimum required)',\n 'iam.logic.would.you.continue': 'Would you like to continue?',\n 'iam.logic.select.action.label': 'Select Action',\n 'iam.logic.auto.select.actions': 'Auto-select Actions',\n 'iam.logic.actions.selected.summary': 'Actions Selected',\n 'iam.logic.action.selected.detail': 'Action selected successfully (prerequisites already satisfied)',\n 'iam.logic.auto.selected.detail': 'Automatically selected {{count}} action(s) including prerequisites',\n 'iam.logic.selection.cancelled': 'Selection Cancelled',\n 'iam.logic.action.not.added': 'Action not added to whitelist',\n 'iam.logic.dependency.warning': 'Dependency Warning',\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': 'Would you like to automatically switch to alternatives?',\n 'iam.logic.remove.dependents': 'Removing this will also remove the dependent action(s).',\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': 'Switched to alternative actions to maintain dependencies',\n 'iam.logic.actions.removed': 'Actions Removed',\n 'iam.logic.removed.with.dependents': 'Removed {{name}} and {{count}} dependent action(s)',\n 'iam.logic.cancelled': 'Cancelled',\n 'iam.logic.no.changes.made': 'No changes made',\n 'iam.logic.prerequisites.satisfied': '[OK] Prerequisites Satisfied',\n 'iam.logic.all.required.selected': 'All required actions are already selected.\\nYou can safely add this action.',\n 'iam.logic.prerequisites.required': 'Prerequisites Required ({{count}} missing)',\n 'iam.logic.click.to.auto.select': 'Click to auto-select required actions',\n 'iam.logic.satisfied': '(satisfied)',\n 'iam.logic.missing': '(missing)',\n 'iam.logic.unknown.action': 'Unknown Action',\n 'iam.logic.invalid.node': 'Invalid logic node',\n 'iam.logic.invalid': '(invalid)',\n 'iam.logic.click.to.toggle': 'Click to toggle',\n\n // Pagination templates\n 'iam.pagination.roles.template': 'Showing {first} to {last} of {totalRecords} roles',\n 'iam.pagination.actions.template': 'Showing {first} to {last} of {totalRecords} actions',\n 'iam.pagination.users.template': 'Showing {first} to {last} of {totalRecords} users',\n 'iam.pagination.companies.template': 'Showing {first} to {last} of {totalRecords} companies',\n 'iam.pagination.branches.template': 'Showing {first} to {last} of {totalRecords} branches',\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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\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 = ' '.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} <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 {\n Component,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { AngularModule, ILogicNode, PrimeModule, TranslatePipe } 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\">{{ 'iam.logic.title' | translate }}</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 } @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 </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 *ngTemplateOutlet=\"nodeTemplate; context: { $implicit: builderLogic()!, depth: 0 }\"></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 class=\"p-3 border-b border-surface\" [ngClass]=\"depth % 2 === 0 ? 'bg-surface-0' : 'bg-surface-50'\">\n <div class=\"flex items-center gap-3 mb-2\">\n <span class=\"node-type\" [ngClass]=\"node.type\">{{ node.type.toUpperCase() }}</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 {{ node.operator }}\n </span>\n <span class=\"text-muted-color text-xs\">({{ 'iam.logic.conditions' | translate: { count: node.children?.length || 0 } }})</span>\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 <option [value]=\"null\">{{ 'iam.logic.select.action' | translate }} ({{ 'iam.logic.actions.available' | translate: { count: actions().length } }})</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]=\"'iam.logic.remove' | translate\" />\n </div>\n </div>\n\n <!-- Children for group nodes -->\n @if (node.type === 'group' && node.children && node.children.length > 0) {\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 *ngTemplateOutlet=\"nodeTemplate; context: { $implicit: child, depth: depth + 1 }\"></ng-container>\n }\n </div>\n }\n\n <!-- Add child buttons for group nodes -->\n @if (node.type === 'group') {\n <div class=\"mt-3 p-3 bg-surface-50 rounded border border-dashed border-surface\">\n <div class=\"text-xs font-semibold text-muted-color mb-2\">{{ 'iam.logic.add.condition' | translate }}</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 <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 </div>\n </div>\n }\n </div>\n </ng-template>\n `,\n styles: [`\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})\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 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 }, { allowSignalWrites: true });\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(node: IBuilderNode, targetId: string): 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 { CommonModule } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { HasPermissionDirective, PrimeModule, ROLE_ACTION_PERMISSIONS, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { firstValueFrom } from 'rxjs';\nimport {\n IAction,\n IActionTreeDto,\n IRole,\n PermissionAction,\n} from '../interfaces/public-api';\nimport { ActionApiService } from '../services/action-api.service';\nimport { ActionPermissionLogicService } from '../services/action-permission-logic.service';\nimport { PermissionApiService } from '../services/permission-api.service';\nimport { RoleApiService } from '../services/role-api.service';\nimport { MAX_DROPDOWN_ITEMS } from '../constants/pagination.constants';\nimport { buildTreeFromFlat, convertActionToTreeNode } from '../utils/tree-utils';\n\n/**\n * Role-Action Selector Component\n *\n * Manages role action permissions with hierarchical tree view and intelligent dependency management.\n *\n * **Architecture:**\n * - Presentation: TreeTable for hierarchical display\n * - Business Logic: Flat action list for selection/validation\n * - State: Signals with computed dependencies\n *\n * **Core Features:**\n * - Role dropdown with async loading\n * - Hierarchical TreeTable with expand/collapse\n * - Action permission assignment (add/remove)\n * - Real-time change tracking\n *\n * **Dependency Management:**\n * - Auto-selection with AND/OR logic\n * - Dependency detection on uncheck\n * - Cascade remove for AND dependencies\n * - Visual warnings for unmet prerequisites\n * - Pre-save validation with auto-fix\n *\n * **Performance:**\n * - Computed signals for reactive updates\n * - Memoized prerequisite validation\n * - AbortController for request cancellation\n *\n * @example\n * ```html\n * <flusys-role-action-selector />\n * ```\n */\n@Component({\n selector: 'flusys-role-action-selector',\n imports: [CommonModule, FormsModule, PrimeModule, HasPermissionDirective, TranslatePipe],\n template: `\n <div class=\"role-action-selector\">\n <!-- Role 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\">{{ 'iam.permission.select.role' | translate }}</label>\n <p-select\n [ngModel]=\"selectedRoleId()\"\n (ngModelChange)=\"selectedRoleId.set($event)\"\n [options]=\"roles()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"'iam.permission.select.role.placeholder' | translate\"\n [showClear]=\"true\"\n [filter]=\"true\"\n styleClass=\"w-full\"\n />\n </div>\n </div>\n </div>\n\n @if (selectedRoleId()) {\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 <!-- Action List -->\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\">{{ 'iam.permission.action.permissions' | translate }}</h5>\n <p class=\"text-sm text-muted-color m-0\">\n {{ 'iam.permission.actions.available' | translate: { count: actions().length } }}\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 <!-- Validation Warning -->\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\">{{ 'iam.validation.warning.title' | translate }}:</span>\n <p class=\"text-sm mt-1 mb-0\">\n {{ (invalidActionsCount() > 1 ? 'iam.validation.unmet.prerequisites.plural' : 'iam.validation.unmet.prerequisites.singular') | translate: { count: invalidActionsCount() } }}\n </p>\n </div>\n </div>\n </div>\n }\n\n <!-- Action Tree Table -->\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <p-treeTable\n [value]=\"treeNodes()\"\n dataKey=\"id\"\n styleClass=\"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\">{{ 'shared.code' | translate }}</th>\n <th>{{ 'iam.action.type' | translate }}</th>\n <th class=\"hidden lg:table-cell\">{{ 'iam.permission.requirements' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-rowNode let-rowData=\"rowData\">\n <tr [class.highlight-warning]=\"hasUnmetPrerequisites(rowData)\">\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 (hasUnmetPrerequisites(rowData)) {\n <i\n class=\"pi pi-exclamation-triangle text-orange-500\"\n [pTooltip]=\"'iam.validation.unmet.prerequisites.tooltip' | translate\"\n tooltipPosition=\"top\"\n ></i>\n }\n </span>\n </td>\n <td class=\"hidden md:table-cell\">{{ rowData.code || '-' }}</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\">{{ 'iam.permission.has.prerequisites' | translate }}</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> {{ 'shared.loading.actions' | translate }}\n } @else { {{ 'iam.permission.no.actions.available' | translate }} }\n </td>\n </tr>\n </ng-template>\n </p-treeTable>\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\">{{ 'shared.pending.changes' | translate }}</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\">{{ 'shared.to.add' | translate }} ({{ pendingAdd().length }})</strong>\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\">{{ 'shared.to.remove' | translate }} ({{ pendingRemove().length }})</strong>\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 class=\"pi pi-info-circle text-muted-color mb-3 block text-5xl\"></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 :host {\n display: block;\n }\n /* Dark mode compatible validation warning */\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 /* Dark mode compatible warning row highlight */\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})\nexport class RoleActionSelectorComponent {\n // Permission constants for template\n readonly ROLE_ACTION_PERMISSIONS = ROLE_ACTION_PERMISSIONS;\n\n // Dependencies\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 private readonly permissionLogic = inject(ActionPermissionLogicService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n // State - Role Selection\n readonly selectedRoleId = signal<string | undefined>(undefined);\n readonly roles = signal<IRole[]>([]);\n\n // State - Loading/Saving\n readonly loading = signal(false);\n readonly saving = signal(false);\n\n // State - Actions (Business Logic)\n private readonly _actions = signal<IAction[]>([]);\n readonly actions = this._actions.asReadonly();\n\n // State - Actions (Display)\n private readonly _actionsTree = signal<IActionTreeDto[]>([]);\n private readonly actionsTree = this._actionsTree.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 - Tree Nodes (for PrimeNG TreeTable)\n readonly treeNodes = computed(() =>\n convertActionToTreeNode(this.actionsTree()),\n );\n\n // Computed - Selection State\n readonly allSelected = computed(() => {\n const selMap = this.selectionMap();\n const total = this.actions().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 - Validation\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 // Computed - Pending Changes\n readonly pendingAdd = computed(() => {\n const current = this.selectionMap();\n const initial = this.initialSelection();\n const allActions = this.actions();\n\n return allActions.filter(\n (action) => current[action.id as string] && !initial[action.id as string],\n );\n });\n\n readonly pendingRemove = computed(() => {\n const current = this.selectionMap();\n const initial = this.initialSelection();\n const allActions = this.actions();\n\n return allActions.filter(\n (action) => !current[action.id as string] && initial[action.id as string],\n );\n });\n\n // Computed - Save Button State\n readonly canSave = computed(() => {\n return (\n this.hasChanges() && !this.saving() && this.invalidActionsCount() === 0\n );\n });\n\n // AbortController for data loading\n private loadDataAbortController: AbortController | null = null;\n\n constructor() {\n this.loadRoles();\n\n // Cleanup on destroy\n this.destroyRef.onDestroy(() => {\n this.loadDataAbortController?.abort();\n });\n\n // Effect: Load data when role selection changes\n effect(() => {\n const roleId = this.selectedRoleId();\n\n // Abort previous request\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 // Error toast handled by global interceptor\n this.loading.set(false);\n }\n });\n } else {\n this.resetState();\n }\n });\n }\n\n /**\n * Load roles from API\n */\n private async loadRoles(): Promise<void> {\n try {\n const response = await firstValueFrom(\n this.roleApi.getAll('', {\n pagination: { currentPage: 0, pageSize: MAX_DROPDOWN_ITEMS },\n }),\n );\n this.roles.set(response?.data ?? []);\n } catch {\n // Error toast handled by global interceptor\n }\n }\n\n /**\n * Load actions and assignments for selected role\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 // Get flat list (filtered by company if enabled)\n const flatActions = (actionsResponse?.data ?? []).filter((a) => !!a.id);\n\n // Build tree structure from flat list with parentId\n const actionsTree = buildTreeFromFlat(flatActions) as IActionTreeDto[];\n\n // Store both representations\n this._actionsTree.set(actionsTree);\n this._actions.set(flatActions);\n\n // Load existing assignments\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 // Build selection map\n const selMap: Record<string, boolean> = {};\n for (const action of flatActions) {\n if (action.id) {\n selMap[action.id] = assignedIds.has(action.id);\n }\n }\n this.applySelection(selMap);\n } finally {\n if (!signal.aborted) {\n this.loading.set(false);\n }\n }\n }\n\n /**\n * Get tooltip for action checkbox\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\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\n return `${prerequisiteInfo}${actionHint}`;\n }\n }\n\n if (isCurrentlySelected) {\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\n return `[${this.translate('shared.add')}] ${this.translate('iam.tooltip.click.to.assign.role')}`;\n }\n\n /**\n * Check if action has unmet prerequisites\n */\n hasUnmetPrerequisites(action: IAction): boolean {\n return action.id\n ? this.actionsWithUnmetPrerequisites().has(action.id)\n : false;\n }\n\n /**\n * Handle action toggle with dependency management\n */\n onActionToggle(action: IAction, newValue: boolean): void {\n if (!newValue) {\n // Unchecking - validate dependencies\n this.permissionLogic.handleUncheck(\n action,\n this.selectionMap(),\n this.actions(),\n (newMap) => this._selectionMap.set(newMap),\n );\n } else {\n // Checking - validate prerequisites\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 private setAllSelection(value: boolean): void {\n const selMap: Record<string, boolean> = {};\n for (const action of this.actions()) {\n selMap[action.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 roleId = this.selectedRoleId();\n if (!roleId) return;\n\n // Pre-save validation\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 // Build payload\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({\n roleId,\n items,\n }),\n );\n\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response?.data?.message || this.translate('iam.permission.role.permissions.updated'),\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 private applySelection(selMap: Record<string, boolean>): void {\n this._selectionMap.set(selMap);\n this._initialSelection.set({ ...selMap });\n }\n\n private 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 private resetState(): void {\n this._actionsTree.set([]);\n this._actions.set([]);\n this._selectionMap.set({});\n this._initialSelection.set({});\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { COMPANY_ACTION_PERMISSIONS, COMPANY_API_PROVIDER, HasPermissionDirective, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { firstValueFrom } from 'rxjs';\nimport {\n IAction,\n IActionTreeDto,\n ICompany,\n IPrerequisiteValidationError,\n PermissionAction,\n} from '../interfaces/public-api';\nimport { ActionApiService } from '../services/action-api.service';\nimport { ActionPermissionLogicService } from '../services/action-permission-logic.service';\nimport { PermissionApiService } from '../services/permission-api.service';\nimport { MAX_DROPDOWN_ITEMS } from '../constants/pagination.constants';\nimport { convertActionToTreeNode, flattenTree } from '../utils/tree-utils';\n\n/**\n * Company-Action Selector Component\n *\n * Manages company action whitelisting with hierarchical tree view and intelligent dependency management.\n *\n * **Architecture:**\n * - Presentation: TreeTable for hierarchical display\n * - Business Logic: Flat action list for selection/validation\n * - State: Signals with computed dependencies\n *\n * **Core Features:**\n * - Company dropdown with async loading\n * - Hierarchical TreeTable with expand/collapse\n * - Action whitelist management (add/remove)\n * - Real-time change tracking\n *\n * **Dependency Management:**\n * - Auto-selection with AND/OR logic\n * - Dependency detection on uncheck\n * - Cascade remove for AND dependencies\n * - Visual warnings for unmet prerequisites\n * - Pre-save validation with auto-fix\n *\n * **Performance:**\n * - Computed signals for reactive updates\n * - Memoized prerequisite validation\n * - AbortController for request cancellation\n *\n * @example\n * ```html\n * <flusys-company-action-selector />\n * ```\n */\n@Component({\n selector: 'flusys-company-action-selector',\n imports: [CommonModule, FormsModule, PrimeModule, HasPermissionDirective, TranslatePipe],\n template: `\n <div class=\"company-action-selector\">\n <!-- Company 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\">{{ 'iam.permission.select.company' | translate }}</label>\n <p-select\n [ngModel]=\"selectedCompanyId()\"\n (ngModelChange)=\"selectedCompanyId.set($event)\"\n [options]=\"companies()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"'iam.permission.select.company.placeholder' | translate\"\n [showClear]=\"true\"\n [filter]=\"true\"\n styleClass=\"w-full\"\n />\n </div>\n </div>\n </div>\n\n @if (selectedCompanyId()) {\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 <!-- Action List -->\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\">{{ 'iam.permission.action.whitelist' | translate }}</h5>\n <p class=\"text-sm text-muted-color m-0\">\n {{ 'iam.permission.actions.available' | translate: { count: actions().length } }}\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 <!-- Validation Warning -->\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\">{{ 'iam.validation.warning.title' | translate }}:</span>\n <p class=\"text-sm mt-1 mb-0\">\n {{ (invalidActionsCount() > 1 ? 'iam.validation.unmet.prerequisites.plural' : 'iam.validation.unmet.prerequisites.singular') | translate: { count: invalidActionsCount() } }}\n </p>\n </div>\n </div>\n </div>\n }\n\n <!-- Action Tree Table -->\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <p-treeTable\n [value]=\"treeNodes()\"\n dataKey=\"id\"\n styleClass=\"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\">{{ 'shared.code' | translate }}</th>\n <th>{{ 'iam.action.type' | translate }}</th>\n <th class=\"hidden lg:table-cell\">{{ 'shared.description' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-rowNode let-rowData=\"rowData\">\n <tr [class.highlight-warning]=\"hasUnmetPrerequisites(rowData)\">\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 (hasUnmetPrerequisites(rowData)) {\n <i\n class=\"pi pi-exclamation-triangle text-orange-500\"\n [pTooltip]=\"'iam.validation.unmet.prerequisites.tooltip' | translate\"\n tooltipPosition=\"top\"\n ></i>\n }\n </span>\n </td>\n <td class=\"hidden md:table-cell\">{{ rowData.code || '-' }}</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\">{{ rowData.description || '-' }}</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> {{ 'shared.loading.actions' | translate }}\n } @else { {{ 'iam.permission.no.actions.available' | translate }} }\n </td>\n </tr>\n </ng-template>\n </p-treeTable>\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\">{{ 'shared.pending.changes' | translate }}</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\">{{ 'shared.to.whitelist' | translate }} ({{ pendingAdd().length }})</strong>\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\">{{ 'shared.to.remove' | translate }} ({{ pendingRemove().length }})</strong>\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 class=\"pi pi-info-circle text-muted-color mb-3 block text-5xl\"></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 :host {\n display: block;\n }\n /* Dark mode compatible validation warning */\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 /* Dark mode compatible warning row highlight */\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})\nexport class CompanyActionSelectorComponent {\n // Permission constants for template\n readonly COMPANY_ACTION_PERMISSIONS = COMPANY_ACTION_PERMISSIONS;\n\n // Dependencies\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 permissionLogic = inject(ActionPermissionLogicService);\n private readonly destroyRef = inject(DestroyRef);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n // State - Company Selection\n readonly selectedCompanyId = signal<string | undefined>(undefined);\n readonly companies = signal<ICompany[]>([]);\n\n // State - Loading/Saving\n readonly loading = signal(false);\n readonly saving = signal(false);\n\n // State - Actions (Business Logic)\n private readonly _actions = signal<IAction[]>([]);\n readonly actions = this._actions.asReadonly();\n\n // State - Actions (Display)\n private readonly _actionsTree = signal<IActionTreeDto[]>([]);\n private readonly actionsTree = this._actionsTree.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 - Tree Nodes (for PrimeNG TreeTable)\n readonly treeNodes = computed(() =>\n convertActionToTreeNode(this.actionsTree()),\n );\n\n // Computed - Selection State\n readonly allSelected = computed(() => {\n const selMap = this.selectionMap();\n const total = this.actions().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 - Validation\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 // Computed - Pending Changes\n readonly pendingAdd = computed(() => {\n const current = this.selectionMap();\n const initial = this.initialSelection();\n const allActions = this.actions();\n\n return allActions.filter(\n (action) => current[action.id as string] && !initial[action.id as string],\n );\n });\n\n readonly pendingRemove = computed(() => {\n const current = this.selectionMap();\n const initial = this.initialSelection();\n const allActions = this.actions();\n\n return allActions.filter(\n (action) => !current[action.id as string] && initial[action.id as string],\n );\n });\n\n // Computed - Save Button State\n readonly canSave = computed(() => {\n return this.hasChanges() && !this.saving() && this.invalidActionsCount() === 0;\n });\n\n // AbortController for data loading\n private loadDataAbortController: AbortController | null = null;\n\n constructor() {\n // Cleanup on destroy\n this.destroyRef.onDestroy(() => {\n this.loadDataAbortController?.abort();\n });\n\n this.loadCompanies();\n\n // Effect: Load data when company selection changes\n effect(() => {\n const companyId = this.selectedCompanyId();\n\n // Abort previous request\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 // Error toast handled by global interceptor\n this.loading.set(false);\n }\n });\n } else {\n this.resetState();\n }\n });\n }\n\n /**\n * Load companies from API\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 // Error toast handled by global interceptor\n }\n }\n\n /**\n * Load actions and assignments for selected company\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 // Fetch hierarchical action tree\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\n // Flatten tree for business logic\n const actionsList = flattenTree(actionsTree).filter((a) => !!a.id);\n\n // Store both representations\n this._actionsTree.set(actionsTree);\n this._actions.set(actionsList);\n\n // Load existing assignments\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 /**\n * Check if action has unmet prerequisites\n */\n hasUnmetPrerequisites(action: IAction): boolean {\n return action.id\n ? this.actionsWithUnmetPrerequisites().has(action.id)\n : false;\n }\n\n /**\n * Get tooltip for action checkbox\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\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\n return `${prerequisiteInfo}${actionHint}`;\n }\n }\n\n if (isCurrentlySelected) {\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\n return `[${this.translate('shared.add')}] ${this.translate('iam.tooltip.click.to.add')}`;\n }\n\n /**\n * Handle action checkbox toggle\n */\n onActionToggle(action: IAction, newValue: boolean): void {\n if (!newValue) {\n // Unchecking - validate dependencies\n this.permissionLogic.handleUncheck(\n action,\n this.selectionMap(),\n this.actions(),\n (newMap) => this._selectionMap.set(newMap),\n );\n } else {\n // Checking - validate prerequisites\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 private setAllSelection(value: boolean): void {\n this._selectionMap.set(this.buildSelectionMap(this.actions(), () => value));\n }\n\n /**\n * Save changes to backend\n */\n async saveChanges(): Promise<void> {\n const companyId = this.selectedCompanyId();\n if (!companyId) return;\n\n // Pre-save validation\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({\n companyId,\n items,\n }),\n );\n\n // Handle backend prerequisite errors\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?.data?.message || this.translate('iam.permission.company.actions.updated'),\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 * Handle backend prerequisite validation errors\n * Shows confirmation dialog with auto-fix option\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 // Auto-select missing prerequisites\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\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 // Revert to initial state\n this._selectionMap.set({ ...this.initialSelection() });\n\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 private resetState(): void {\n this._actionsTree.set([]);\n this._actions.set([]);\n this._selectionMap.set({});\n this._initialSelection.set({});\n }\n\n private 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 private 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","import { CommonModule } from '@angular/common';\nimport {\n Component,\n computed,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { APP_CONFIG, isCompanyFeatureEnabled, TRANSLATE_ADAPTER } 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 {\n IBranch,\n IRole,\n PermissionAction,\n} 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: [CommonModule, FormsModule, PrimeModule, HasPermissionDirective, UserSelectComponent, TranslatePipe],\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]=\"'iam.permission.select.user.placeholder' | translate\"\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]=\"'iam.permission.select.branch.placeholder' | translate\"\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 {{ (filteredBranches().length !== 1 ? 'iam.branch.permitted.count.plural' : 'iam.branch.permitted.count') | translate: { count: filteredBranches().length } }}\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\">{{ 'iam.permission.role.assignments' | translate }}</h5>\n <p class=\"text-sm text-muted-color m-0\">\n {{ 'iam.permission.roles.available' | translate: { count: roles().length } }}\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]=\"'iam.pagination.roles.template' | translate\"\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\">{{ 'shared.code' | translate }}</th>\n <th class=\"hidden md:table-cell\">{{ 'shared.description' | translate }}</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\">{{ role.description || '-' }}</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> {{ '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\">{{ 'shared.pending.changes' | translate }}</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\">{{ 'shared.to.assign' | translate }} ({{ pendingAdd().length }})</strong>\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\">{{ 'shared.to.remove' | translate }} ({{ pendingRemove().length }})</strong>\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 class=\"pi pi-info-circle text-muted-color mb-3 block text-5xl\"></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, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): 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 firstValueFrom(\n this.roleApi.getAll('', {\n pagination: { currentPage: 0, pageSize: MAX_DROPDOWN_ITEMS },\n }),\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?.data?.message || this.translate('iam.permission.user.roles.updated'),\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 { CommonModule } from '@angular/common';\nimport {\n Component,\n computed,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { APP_CONFIG, isCompanyFeatureEnabled, TRANSLATE_ADAPTER } 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 {\n IAction,\n IActionTreeDto,\n IBranch,\n PermissionAction,\n} from '../interfaces/public-api';\nimport { ActionApiService } from '../services/action-api.service';\nimport { ActionPermissionLogicService } from '../services/action-permission-logic.service';\nimport { PermissionApiService } from '../services/permission-api.service';\nimport {\n buildTreeFromFlat,\n convertActionToTreeNode,\n} from '../utils/tree-utils';\n\n/**\n * User-Action Selector Component\n *\n * Manages direct user action permissions with hierarchical tree view.\n *\n * **Architecture:**\n * - Presentation: TreeTable for hierarchical display\n * - Business Logic: Flat action list for selection/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 * - Hierarchical TreeTable with expand/collapse\n * - Direct user-action permission assignment (bypassing roles)\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-action-selector />\n * ```\n */\n@Component({\n selector: 'flusys-user-action-selector',\n imports: [CommonModule, FormsModule, PrimeModule, HasPermissionDirective, UserSelectComponent, TranslatePipe],\n template: `\n <div class=\"user-action-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]=\"'iam.permission.select.user.placeholder' | translate\"\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]=\"'iam.permission.select.branch.placeholder' | translate\"\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 {{ (filteredBranches().length !== 1 ? 'iam.branch.permitted.count.plural' : 'iam.branch.permitted.count') | translate: { count: filteredBranches().length } }}\n </small>\n </div>\n }\n </div>\n </div>\n\n @if (selectedUserId()) {\n <!-- Loading State -->\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 <!-- Action List -->\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\">{{ 'iam.permission.direct.action.permissions' | translate }}</h5>\n <p class=\"text-sm text-muted-color m-0\">\n {{ 'iam.permission.actions.available' | translate: { count: actions().length } }}\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 <!-- Validation Warning -->\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\">{{ 'iam.validation.warning.title' | translate }}:</span>\n <p class=\"text-sm mt-1 mb-0\">\n {{ (invalidActionsCount() > 1 ? 'iam.validation.unmet.prerequisites.plural' : 'iam.validation.unmet.prerequisites.singular') | translate: { count: invalidActionsCount() } }}\n </p>\n </div>\n </div>\n </div>\n }\n\n <!-- Action Tree Table -->\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <p-treeTable\n [value]=\"treeNodes()\"\n dataKey=\"id\"\n styleClass=\"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\">{{ 'shared.code' | translate }}</th>\n <th>{{ 'iam.action.type' | translate }}</th>\n <th class=\"hidden lg:table-cell\">{{ 'shared.description' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-rowNode let-rowData=\"rowData\">\n <tr [class.highlight-warning]=\"hasUnmetPrerequisites(rowData)\">\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 (hasUnmetPrerequisites(rowData)) {\n <i\n class=\"pi pi-exclamation-triangle text-orange-500\"\n [pTooltip]=\"'iam.validation.unmet.prerequisites.tooltip' | translate\"\n tooltipPosition=\"top\"\n ></i>\n }\n </span>\n </td>\n <td class=\"hidden md:table-cell\">{{ rowData.code || '-' }}</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\">{{ rowData.description || '-' }}</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> {{ '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 <!-- 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\">{{ 'shared.pending.changes' | translate }}</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\">{{ 'shared.to.assign' | translate }} ({{ pendingAdd().length }})</strong>\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\">{{ 'shared.to.remove' | translate }} ({{ pendingRemove().length }})</strong>\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 class=\"pi pi-info-circle text-muted-color mb-3 block text-5xl\"></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 :host {\n display: block;\n }\n /* Dark mode compatible validation warning */\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 /* Dark mode compatible warning row highlight */\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})\nexport class UserActionSelectorComponent {\n // Permission constants for template\n readonly USER_ACTION_PERMISSIONS = USER_ACTION_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 actionApi = inject(ActionApiService);\n private readonly permissionApi = inject(PermissionApiService);\n private readonly permissionLogic = inject(ActionPermissionLogicService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): 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 - Actions (Business Logic)\n private readonly _actions = signal<IAction[]>([]);\n readonly actions = this._actions.asReadonly();\n\n // State - Actions (Display)\n private readonly _actionsTree = signal<IActionTreeDto[]>([]);\n private readonly actionsTree = this._actionsTree.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 - Company Feature Flag (cached)\n private readonly isCompanyFeatureActive = computed(\n () => isCompanyFeatureEnabled(this.appConfig) === true,\n );\n\n // Computed - UI Flags\n readonly showBranchSelector = this.isCompanyFeatureActive;\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 - Tree Nodes (for PrimeNG TreeTable)\n readonly treeNodes = computed(() =>\n convertActionToTreeNode(this.actionsTree()),\n );\n\n // Computed - Selection State\n readonly allSelected = computed(() => {\n const selMap = this.selectionMap();\n const total = this.actions().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 - Validation\n readonly actionsWithUnmetPrerequisites = computed(() => {\n const selMap = this.selectionMap();\n const allActions = this.actions();\n\n const unmetSet = new Set<string>();\n allActions.forEach((action) => {\n if (\n action.id &&\n this.permissionLogic.hasUnmetPrerequisites(action, selMap, allActions)\n ) {\n unmetSet.add(action.id);\n }\n });\n\n return unmetSet;\n });\n\n readonly invalidActionsCount = computed(() => {\n return this.actionsWithUnmetPrerequisites().size;\n });\n\n // Computed - Pending Changes\n readonly pendingAdd = computed(() => {\n const current = this.selectionMap();\n const initial = this.initialSelection();\n const allActions = this.actions();\n\n return allActions.filter(\n (action) => current[action.id as string] && !initial[action.id as string],\n );\n });\n\n readonly pendingRemove = computed(() => {\n const current = this.selectionMap();\n const initial = this.initialSelection();\n const allActions = this.actions();\n\n return allActions.filter(\n (action) => !current[action.id as string] && initial[action.id as string],\n );\n });\n\n // Computed - Save Button State\n readonly canSave = computed(() => {\n return (\n this.hasChanges() && !this.saving() && this.invalidActionsCount() === 0\n );\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 (this.isCompanyFeatureActive()) {\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 (this.isCompanyFeatureActive() && userId && branchId !== undefined) {\n this.loadData();\n }\n });\n }\n\n /**\n * Load user's permitted branches\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 // Error toast handled by global interceptor\n }\n }\n\n /**\n * Load actions 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 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\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 action checkbox\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\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\n return `${prerequisiteInfo}${actionHint}`;\n }\n }\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.user')}`;\n }\n\n return `[${this.translate('shared.add')}] ${this.translate('iam.tooltip.click.to.assign.user')}`;\n }\n\n /**\n * Check if action has unmet prerequisites\n */\n hasUnmetPrerequisites(action: IAction): boolean {\n return action.id\n ? this.actionsWithUnmetPrerequisites().has(action.id)\n : false;\n }\n\n /**\n * Handle action toggle with dependency management\n */\n onActionToggle(action: IAction, newValue: boolean): void {\n if (!newValue) {\n // Unchecking - validate dependencies\n this.permissionLogic.handleUncheck(\n action,\n this.selectionMap(),\n this.actions(),\n (newMap) => this._selectionMap.set(newMap),\n );\n } else {\n // Checking - validate prerequisites\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.setAllActions(!this.allSelected());\n }\n\n selectAll(): void {\n this.setAllActions(true);\n }\n\n deselectAll(): void {\n this.setAllActions(false);\n }\n\n private setAllActions(value: boolean): void {\n this._selectionMap.set(\n this.buildSelectionMap(this.actions(), () => value),\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.buildPermissionItems();\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?.data?.message || this.translate('iam.permission.user.actions.updated'),\n });\n\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 private resetState(): void {\n this._actionsTree.set([]);\n this._actions.set([]);\n this._selectionMap.set({});\n this._initialSelection.set({});\n }\n\n private buildSelectionMap(\n actions: IAction[],\n predicate: (action: IAction) => boolean,\n ): Record<string, boolean> {\n const selMap: Record<string, boolean> = {};\n actions.forEach((action) => {\n selMap[action.id as string] = predicate(action);\n });\n return selMap;\n }\n\n private buildPermissionItems(): Array<{ id: string; action: PermissionAction }> {\n const items: Array<{ id: string; action: PermissionAction }> = [];\n\n this.pendingAdd().forEach((action) => {\n items.push({ id: action.id as string, action: 'add' });\n });\n\n this.pendingRemove().forEach((action) => {\n items.push({ id: action.id as string, action: 'remove' });\n });\n\n return items;\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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"}
|