@flusys/ng-iam 0.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/flusys-ng-iam-action-form-page.component-BojLw61e.mjs +468 -0
- package/fesm2022/flusys-ng-iam-action-form-page.component-BojLw61e.mjs.map +1 -0
- package/fesm2022/flusys-ng-iam-action-list-page.component-CFZsCdCc.mjs +282 -0
- package/fesm2022/flusys-ng-iam-action-list-page.component-CFZsCdCc.mjs.map +1 -0
- package/fesm2022/flusys-ng-iam-flusys-ng-iam-me7pTNTO.mjs +5053 -0
- package/fesm2022/flusys-ng-iam-flusys-ng-iam-me7pTNTO.mjs.map +1 -0
- package/fesm2022/flusys-ng-iam-iam-container.component-BFKoNtdz.mjs +97 -0
- package/fesm2022/flusys-ng-iam-iam-container.component-BFKoNtdz.mjs.map +1 -0
- package/fesm2022/flusys-ng-iam-permission-page.component-jZgTau_R.mjs +143 -0
- package/fesm2022/flusys-ng-iam-permission-page.component-jZgTau_R.mjs.map +1 -0
- package/fesm2022/flusys-ng-iam-role-form-page.component-BjL-Y3rx.mjs +314 -0
- package/fesm2022/flusys-ng-iam-role-form-page.component-BjL-Y3rx.mjs.map +1 -0
- package/fesm2022/flusys-ng-iam-role-list-page.component-Sw0CBlkz.mjs +262 -0
- package/fesm2022/flusys-ng-iam-role-list-page.component-Sw0CBlkz.mjs.map +1 -0
- package/fesm2022/flusys-ng-iam.mjs +2 -0
- package/fesm2022/flusys-ng-iam.mjs.map +1 -0
- package/package.json +29 -0
- package/types/flusys-ng-iam.d.ts +1140 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flusys-ng-iam-flusys-ng-iam-me7pTNTO.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/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/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// ==================== ENUMS ====================\n\n/**\n * Action Type - determines how action is used\n * CRITICAL: Must match backend ActionType enum exactly\n */\nexport enum ActionType {\n BACKEND = 'backend', // For API endpoint permissions (cached for PermissionGuard)\n FRONTEND = 'frontend', // For frontend features (returned in my-permissions API)\n BOTH = 'both', // For both backend and frontend (cached + returned)\n}\n\n// ==================== DATA INTERFACES ====================\n\n/**\n * Action Response DTO\n * Matches backend ActionResponseDto\n */\nexport interface IAction extends IBaseEntity {\n readOnly: boolean;\n name: string;\n description: string | null;\n code: string | null; // Unique action code\n actionType: ActionType;\n permissionLogic: ILogicNode | null; // Complex AND/OR rules\n parentId: string | null; // For hierarchy\n serial: number | null;\n isActive: boolean;\n metadata: Record<string, any> | null;\n}\n\n/**\n * Action Tree DTO\n * Hierarchical action structure\n */\nexport interface IActionTreeDto extends IAction {\n children: IActionTreeDto[];\n}\n\n// ==================== CREATE/UPDATE DTOS ====================\n\n/**\n * Create Action DTO\n * Matches backend CreateActionDto\n */\nexport interface ICreateActionDto {\n name: string;\n description?: string;\n code?: string; // Unique action code\n actionType?: ActionType; // Default: ENDPOINT\n permissionLogic?: ILogicNode;\n parentId?: string;\n serial?: number;\n isActive?: boolean; // Default: true\n metadata?: Record<string, any>;\n}\n\n/**\n * Update Action DTO\n * Matches backend UpdateActionDto\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","/**\n * Pagination Constants\n *\n * Standard pagination limits for IAM components.\n * Prevents excessive data loading and potential DoS.\n */\n\n/**\n * Maximum items to fetch for dropdown lists\n * Used for: companies, roles, users, branches\n *\n * Security: Prevents memory exhaustion from loading excessive records\n */\nexport const MAX_DROPDOWN_ITEMS = 100;\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport {\n IRole,\n IUpdateRoleDto,\n} from '../interfaces/role.interface';\n\n/**\n * Role API Service\n * Handles role CRUD operations\n * Endpoint: POST /iam/roles/*\n * Conditional: Only available in RBAC/FULL mode\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class RoleApiService extends ApiResourceService<\n IUpdateRoleDto,\n IRole\n> {\n constructor() {\n const http = inject(HttpClient);\n super('iam/roles', http);\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 } from '@flusys/ng-core';\nimport {\n IAction,\n IActionTreeDto,\n IUpdateActionDto,\n} from '../interfaces/action.interface';\n\n/**\n * Action API Service\n * Handles action CRUD operations\n * Endpoint: POST /iam/actions/*\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ActionApiService extends ApiResourceService<\n IUpdateActionDto,\n IAction\n> {\n private readonly appConfig = inject(APP_CONFIG);\n\n constructor() {\n const http = inject(HttpClient);\n super('iam/actions', http);\n }\n\n /**\n * Get actions for permission assignment\n * GET /iam/actions/tree-for-permission\n * Returns actions filtered by company whitelist if enabled\n */\n getActionsForPermission(): Observable<ISingleResponse<IActionTreeDto[]>> {\n return this.http.get<ISingleResponse<IActionTreeDto[]>>(\n `${this.appConfig.apiBaseUrl}/iam/actions/tree-for-permission`\n );\n }\n\n /**\n * Get actions in hierarchical tree structure\n * POST /iam/actions/tree\n * Returns all actions organized in parent-child tree\n *\n * @param search - Optional search term (name or code)\n * @param isActive - Optional filter by active status\n * @param withDeleted - Include deleted actions (default: false)\n * @returns Observable of action tree response\n */\n getTree(\n search?: string,\n isActive?: boolean,\n withDeleted?: boolean\n ): Observable<ISingleResponse<IActionTreeDto[]>> {\n const body: Partial<{\n search: string;\n isActive: boolean;\n withDeleted: boolean;\n }> = {};\n\n if (search?.trim()) {\n body.search = search.trim();\n }\n if (isActive !== undefined) {\n body.isActive = isActive;\n }\n if (withDeleted !== undefined) {\n body.withDeleted = withDeleted;\n }\n\n return this.http.post<ISingleResponse<IActionTreeDto[]>>(\n `${this.appConfig.apiBaseUrl}/iam/actions/tree`,\n body\n );\n }\n}\n","import { ILogicNode } from '@flusys/ng-shared';\nimport { IAction } from '../interfaces/action.interface';\n\n/**\n * Extract all required action IDs from a permission logic tree\n * This is useful for prerequisite validation\n *\n * @param logic - Permission logic to analyze\n * @returns Set of action IDs that are required\n */\nexport function extractRequiredActionIds(\n logic: ILogicNode | null,\n): Set<string> {\n const actionIds = new Set<string>();\n\n if (!logic) {\n return actionIds;\n }\n\n collectActionIds(logic, actionIds);\n return actionIds;\n}\n\n/**\n * Recursively collect action IDs from logic tree\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 for (const child of node.children) {\n collectActionIds(child, actionIds);\n }\n }\n}\n\n/**\n * Prerequisite validation result\n */\nexport interface IPrerequisiteValidationResult {\n valid: boolean;\n missingActions: IAction[];\n}\n\n/**\n * Validate if an action's prerequisites are satisfied\n * Respects AND/OR logic operators in permission tree\n *\n * @param action - Action to validate\n * @param selectedActionIds - Set of currently selected action IDs\n * @param allActions - All available actions (to look up missing ones)\n * @returns Validation result with missing actions\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(\n action.permissionLogic,\n selectedActionIds,\n );\n\n if (result.valid) {\n return { valid: true, missingActions: [] };\n }\n\n const missingActions = allActions.filter(\n (a) => a.id && result.missingActionIds.has(a.id),\n );\n\n return { valid: false, missingActions };\n}\n\n/**\n * Recursively evaluate logic node respecting AND/OR operators\n * Returns validation result with missing action IDs (for prerequisite dialogs)\n * Note: This differs from evaluateLogicNode in ng-shared which returns boolean only\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 {\n valid,\n missingActionIds: valid ? new Set() : new Set([node.actionId]),\n };\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 missingIds = new Set<string>();\n let allValid = true;\n\n for (const child of node.children) {\n const childResult = evaluateLogicNodeWithMissing(\n child,\n selectedActionIds,\n );\n if (!childResult.valid) {\n allValid = false;\n childResult.missingActionIds.forEach((id) => missingIds.add(id));\n }\n }\n\n return { valid: allValid, missingActionIds: missingIds };\n } else {\n for (const child of node.children) {\n const childResult = evaluateLogicNodeWithMissing(\n child,\n selectedActionIds,\n );\n if (childResult.valid) {\n return { valid: true, missingActionIds: new Set() };\n }\n }\n\n const firstChildResult = evaluateLogicNodeWithMissing(\n node.children[0],\n selectedActionIds,\n );\n return {\n valid: false,\n missingActionIds: firstChildResult.missingActionIds,\n };\n }\n }\n\n return { valid: true, missingActionIds: new Set() };\n}\n\n/**\n * Get human-readable prerequisite description\n *\n * @param logic - Permission logic to describe\n * @param allActions - All available actions for name lookup\n * @returns Human-readable string describing prerequisites\n */\nexport function describePrerequisites(\n logic: ILogicNode | null,\n allActions: IAction[],\n): string {\n if (!logic) {\n return 'None';\n }\n\n const requiredIds = extractRequiredActionIds(logic);\n if (requiredIds.size === 0) {\n return 'None';\n }\n\n const actionMap = new Map(allActions.map((a) => [a.id as string, a]));\n const names = Array.from(requiredIds)\n .map((id) => actionMap.get(id)?.name || id)\n .filter(Boolean);\n\n if (names.length === 0) {\n return 'Unknown prerequisites';\n }\n\n if (names.length === 1) {\n return names[0];\n }\n\n return names.join(', ');\n}\n","import { Injectable, inject } from '@angular/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/**\n * Action Permission Logic Service\n *\n * Shared service for handling smart dependency management across all action selectors:\n * - Company-Action Selector\n * - Role-Action Selector\n * - User-Action Selector\n *\n * **Core Features:**\n * - Smart auto-selection (AND/OR optimization)\n * - Dependency detection and management\n * - Alternative suggestion for OR logic\n * - Visual formatting of permission logic trees\n * - Prerequisite validation\n *\n * @example\n * constructor() {\n * this.permissionLogic = inject(ActionPermissionLogicService);\n * }\n *\n * onActionToggle(action: IAction, newValue: boolean) {\n * if (!newValue) {\n * this.permissionLogic.handleUncheck(\n * action,\n * this.selectionMap(),\n * this.actions(),\n * (newMap) => this.selectionMap.set(newMap)\n * );\n * } else {\n * this.permissionLogic.handleCheck(\n * action,\n * this.selectionMap(),\n * this.actions(),\n * (newMap) => this.selectionMap.set(newMap),\n * (previousState) => this.selectionMap.set(previousState)\n * );\n * }\n * }\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ActionPermissionLogicService {\n private readonly confirmationService = inject(ConfirmationService);\n private readonly messageService = inject(MessageService);\n\n /**\n * Handle checking an action with prerequisite validation\n *\n * Uses recursive deep scan to find ALL missing prerequisites at all levels,\n * not just direct dependencies. This ensures cascading dependencies are\n * resolved in a single step.\n *\n * @param action - Action being checked\n * @param currentSelection - Current selection map\n * @param allActions - All available actions\n * @param onUpdate - Callback to update selection\n * @param onCancel - Callback when user cancels\n */\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 = new Set(\n Object.keys(currentSelection).filter((id) => currentSelection[id]),\n );\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 /**\n * Handle unchecking an action with dependency detection\n *\n * @param action - Action being unchecked\n * @param currentSelection - Current selection map\n * @param allActions - All available actions\n * @param onUpdate - Callback to update selection\n */\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 /**\n * Check if an action has unmet prerequisites\n *\n * @param action - Action to check\n * @param currentSelection - Current selection map\n * @param allActions - All available actions\n * @returns True if action has unmet prerequisites\n */\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 = new Set(\n Object.keys(currentSelection).filter(\n (id) => currentSelection[id] && id !== action.id,\n ),\n );\n\n const validationResult = validateActionPrerequisites(\n action,\n selectedActionIds,\n allActions,\n );\n\n return !validationResult.valid;\n }\n\n /**\n * Get all selected actions that have unmet prerequisites\n *\n * @param currentSelection - Current selection map\n * @param allActions - All available actions\n * @returns Array of actions with unmet prerequisites\n */\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 /**\n * Show validation error dialog with auto-fix options\n *\n * @param invalidActions - Actions with unmet prerequisites\n * @param currentSelection - Current selection map\n * @param allActions - All available actions\n * @param onUpdate - Callback to update selection\n */\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 = new Set(\n Object.keys(currentSelection).filter(\n (id) => currentSelection[id] && id !== action.id,\n ),\n );\n\n const validationResult = validateActionPrerequisites(\n action,\n selectedActionIds,\n allActions,\n );\n\n const sanitizedActionName = this.sanitizeHtml(action.name ?? 'Unknown');\n const missingNames = validationResult.missingActions\n .map((a) => this.sanitizeHtml(a.name ?? 'Unknown'))\n .join(', ');\n return `<li><strong>${sanitizedActionName}</strong> requires: ${missingNames}</li>`;\n })\n .join('');\n\n this.confirmationService.confirm({\n header: 'Validation Failed',\n message: `The following actions have unmet prerequisites:<br/><br/><ul class=\"pl-4\">${errorList}</ul><br/>Would you like to:`,\n icon: 'pi pi-exclamation-triangle',\n acceptLabel: 'Auto-fix (Remove Invalid)',\n rejectLabel: '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: 'Invalid Actions Removed',\n detail: `Removed ${invalidActions.length} action${invalidActions.length > 1 ? 's' : ''} with unmet prerequisites. You can now save.`,\n });\n },\n reject: () => {\n this.messageService.add({\n severity: 'info',\n summary: 'Save Cancelled',\n detail: 'Please fix the prerequisites manually before saving',\n });\n },\n });\n }\n\n /**\n * Get prerequisite description for tooltip display\n *\n * @param action - Action to get prerequisites for\n * @param currentSelection - Current selection map\n * @param allActions - All available actions\n * @returns Plain text prerequisite description\n */\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 = new Set(\n Object.keys(currentSelection).filter((id) => currentSelection[id]),\n );\n\n const validationResult = validateActionPrerequisites(\n action,\n selectedActionIds,\n allActions,\n );\n\n if (validationResult.valid) {\n return 'ā Prerequisites Satisfied\\n\\nAll required actions are already selected.\\nYou can safely add this action.';\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 = `ā Prerequisites Required (${missingCount} missing)`;\n const hint = '\\n\\nš” Click to auto-select required actions';\n\n return `${header}\\n\\n${logicTree}${hint}`;\n }\n\n /**\n * Build dynamic logic tree message with AND/OR operators and nesting\n *\n * @param logic - Permission logic tree\n * @param missingActions - Actions that are missing\n * @param allActions - All available actions\n * @param currentSelection - Current selection map for accurate status\n * @returns HTML formatted logic tree\n */\n buildLogicMessage(\n logic: ILogicNode,\n missingActions: IAction[],\n allActions: IAction[],\n currentSelection?: Record<string, boolean>,\n ): string {\n const selectedIds = currentSelection\n ? new Set(\n Object.keys(currentSelection).filter((id) => currentSelection[id]),\n )\n : new Set<string>();\n const actionMap = new Map(allActions.map((a) => [a.id, a]));\n\n return this.formatLogicNode(logic, selectedIds, actionMap, 0);\n }\n\n // ==================== Private Methods ====================\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 /**\n * Recursively collect ALL missing prerequisites at all dependency levels\n *\n * This prevents cascading prerequisite dialogs by finding the complete\n * dependency chain upfront.\n *\n * **Example:**\n * - Action 4 requires Action 3\n * - Action 3 requires Action 2\n * - Action 2 requires Action 1\n *\n * Instead of showing 3 separate dialogs, this returns: [Action 3, Action 2, Action 1]\n *\n * @param action - Starting action to check\n * @param currentSelection - Current selection map\n * @param allActions - All available actions\n * @returns Complete set of missing prerequisites across all levels\n */\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 console.error(\n '[Permission Logic] Circular dependency detected',\n targetAction.id,\n );\n return;\n }\n\n if (visited.has(targetAction.id)) return;\n\n if (stack.has(targetAction.id)) {\n console.warn(\n '[Permission Logic] Circular reference detected:',\n targetAction.id,\n );\n return;\n }\n\n visited.add(targetAction.id);\n stack.add(targetAction.id);\n\n const selectedActionIds = new Set(\n Object.keys(currentSelection).filter((id) => currentSelection[id]),\n );\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 ?? 'Unknown Action',\n );\n\n const acceptLabel =\n selectionCount === 0 ? 'Select Action' : 'Auto-select Actions';\n const detailMessage =\n selectionCount === 0\n ? 'Action selected successfully (prerequisites already satisfied)'\n : `Automatically selected ${selectionCount} action${selectionCount !== 1 ? 's' : ''} including prerequisites`;\n\n this.confirmationService.confirm({\n header: 'Missing Prerequisites',\n message: `<strong>${sanitizedActionName}</strong> requires the following conditions to be satisfied:<br/><br/>${logicMessage}<br/><br/><strong>Auto-select will choose ${selectionCount} action${selectionCount !== 1 ? 's' : ''}${selectionCount < missingActions.length ? ' (minimum required)' : ''}.</strong><br/>Would you like to continue?`,\n icon: 'pi pi-exclamation-triangle',\n acceptLabel,\n rejectLabel: '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: 'Actions Selected',\n detail: detailMessage,\n });\n },\n reject: () => {\n onCancel(previousState);\n\n this.messageService.add({\n severity: 'info',\n summary: 'Selection Cancelled',\n detail: 'Action not added to whitelist',\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 ?? 'Unknown Action',\n );\n let message = `<strong>${sanitizedActionName}</strong> is required by the following action${affectedActions.length > 1 ? 's' : ''}:<br/><br/><ul class=\"pl-4\">`;\n affectedActions.forEach((a) => {\n const sanitizedName = this.sanitizeHtml(a.name ?? 'Unknown');\n message += `<li>${sanitizedName}</li>`;\n });\n message += '</ul><br/>';\n\n if (alternatives.length > 0) {\n message += '<strong>Alternative options available:</strong><br/><br/>';\n message +=\n '<em>Would you like to automatically switch to alternatives?</em>';\n } else {\n message +=\n '<em>Removing this will also remove the dependent action(s).</em><br/><br/>';\n message += 'Would you like to continue?';\n }\n\n this.confirmationService.confirm({\n header: 'Dependency Warning',\n message,\n icon: 'pi pi-exclamation-triangle',\n acceptLabel: alternatives.length > 0 ? 'Use Alternatives' : 'Remove All',\n rejectLabel: '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: 'Alternatives Applied',\n detail: 'Switched to alternative actions to maintain dependencies',\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: 'Actions Removed',\n detail: `Removed ${action.name} and ${affectedActions.length} dependent action${affectedActions.length > 1 ? 's' : ''}`,\n });\n }\n\n onUpdate(selMap);\n },\n reject: () => {\n this.messageService.add({\n severity: 'info',\n summary: 'Cancelled',\n detail: '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: any) =>\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 = new Set(\n Object.keys(currentSelection).filter((id) => currentSelection[id]),\n );\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 ?? 'Unknown')}</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 || '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;\">(satisfied)</em>`;\n } else {\n return `${indent}<span style=\"color: #ef4444;\">ā ${actionName}</span> <em style=\"color: #dc2626;\">(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;\">Invalid logic node</em>`;\n }\n\n /**\n * Build clean text-based logic tree for tooltips\n */\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 = new Set(\n Object.keys(currentSelection).filter((id) => currentSelection[id]),\n );\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 || 'Unknown';\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}(invalid)`;\n }\n}\n","import { HttpParams } from '@angular/common/http';\nimport { 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 IGetRoleActionsDto,\n IGetUserActionsDto,\n IGetUserRolesDto,\n IPermissionOperationResultDto,\n IRoleActionResponseDto,\n IUserActionResponseDto,\n IUserRoleResponseDto,\n} from '../interfaces/permission.interface';\n\n/**\n * Consolidated Permission API Service\n * Handles all permission-related operations in one service\n * Supports:\n * - User ā Action (direct permissions)\n * - User ā Role (role assignments)\n * - Role ā Action (role permissions)\n * - Company ā Action (company whitelisting)\n *\n * Endpoint: POST /permissions/*\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class PermissionApiService extends BaseApiService {\n constructor() {\n super('iam');\n }\n\n // =============================================================================\n // User ā Action (Direct Permissions)\n // =============================================================================\n\n /**\n * Assign/remove actions directly to/from user\n * POST /permissions/user-actions/assign\n */\n assignUserActions(\n data: IAssignUserActionsDto,\n ): Observable<ISingleResponse<IPermissionOperationResultDto>> {\n return this.http.post<ISingleResponse<IPermissionOperationResultDto>>(\n this.getUrl('permissions/user-actions/assign'),\n data,\n );\n }\n\n /**\n * Get user's direct action permissions\n * GET /permissions/user-actions/:userId\n */\n getUserActions(\n userId: string,\n query?: IGetUserActionsDto,\n ): Observable<ISingleResponse<IUserActionResponseDto[]>> {\n let params = new HttpParams();\n if (query?.branchId) {\n params = params.set('branchId', query.branchId);\n }\n\n return this.http.get<ISingleResponse<IUserActionResponseDto[]>>(\n this.getUrl(`permissions/user-actions/${userId}`),\n { params },\n );\n }\n\n // =============================================================================\n // User ā Role (Role Assignments)\n // =============================================================================\n\n /**\n * Assign/remove roles to/from user\n * POST /permissions/user-roles/assign\n */\n assignUserRoles(\n data: IAssignUserRolesDto,\n ): Observable<ISingleResponse<IPermissionOperationResultDto>> {\n return this.http.post<ISingleResponse<IPermissionOperationResultDto>>(\n this.getUrl('permissions/user-roles/assign'),\n data,\n );\n }\n\n /**\n * Get user's role assignments\n * GET /permissions/user-roles/:userId\n */\n getUserRoles(\n userId: string,\n query?: IGetUserRolesDto,\n ): Observable<ISingleResponse<IUserRoleResponseDto[]>> {\n let params = new HttpParams();\n if (query?.branchId) {\n params = params.set('branchId', query.branchId);\n }\n\n return this.http.get<ISingleResponse<IUserRoleResponseDto[]>>(\n this.getUrl(`permissions/user-roles/${userId}`),\n { params },\n );\n }\n\n // =============================================================================\n // Role ā Action (Role Permissions)\n // =============================================================================\n\n /**\n * Assign/remove actions to/from role\n * POST /permissions/role-actions/assign\n */\n assignRoleActions(\n data: IAssignRoleActionsDto,\n ): Observable<ISingleResponse<IPermissionOperationResultDto>> {\n return this.http.post<ISingleResponse<IPermissionOperationResultDto>>(\n this.getUrl('permissions/role-actions/assign'),\n data,\n );\n }\n\n /**\n * Get role's action permissions\n * GET /permissions/role-actions/:roleId\n */\n getRoleActions(\n roleId: string,\n query?: IGetRoleActionsDto,\n ): Observable<ISingleResponse<IRoleActionResponseDto[]>> {\n return this.http.get<ISingleResponse<IRoleActionResponseDto[]>>(\n this.getUrl(`permissions/role-actions/${roleId}`),\n );\n }\n\n // =============================================================================\n // Company ā Action (Company Whitelisting)\n // =============================================================================\n\n /**\n * Assign/remove actions to/from company (whitelisting)\n * POST /permissions/company-actions/assign\n */\n assignCompanyActions(\n data: IAssignCompanyActionsDto,\n ): Observable<ISingleResponse<IPermissionOperationResultDto>> {\n return this.http.post<ISingleResponse<IPermissionOperationResultDto>>(\n this.getUrl('permissions/company-actions/assign'),\n data,\n );\n }\n\n /**\n * Get company's whitelisted actions\n * GET /permissions/company-actions/:companyId\n */\n getCompanyActions(\n companyId: string,\n ): Observable<ISingleResponse<ICompanyActionResponseDto[]>> {\n return this.http.get<ISingleResponse<ICompanyActionResponseDto[]>>(\n this.getUrl(`permissions/company-actions/${companyId}`),\n );\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { APP_CONFIG } 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(APP_CONFIG);\n private readonly baseUrl: string;\n\n constructor() {\n this.baseUrl = `${this.appConfig.apiBaseUrl}/iam/permissions`;\n }\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 { Injectable, Signal, inject, signal } from '@angular/core';\nimport { PermissionValidatorService } from '@flusys/ng-shared';\nimport { Observable, of } from 'rxjs';\nimport { catchError, map, tap } from 'rxjs/operators';\nimport {\n IGetMyPermissionsDto,\n IMyPermissionsResponseDto,\n} from '../interfaces/permission.interface';\nimport { MyPermissionsApiService } from './my-permissions-api.service';\n\n/**\n * Permission State Service\n * Manages user permissions state and provides permission checking methods\n *\n * Uses shared PermissionValidatorService for centralized permission checking.\n *\n * @example\n * ```typescript\n * // In component\n * readonly permissionState = inject(PermissionStateService);\n *\n * ngOnInit() {\n * this.permissionState.loadPermissions();\n * }\n *\n * // Check permission\n * if (this.permissionState.hasAction('user.create')) {\n * // Show create button\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class PermissionStateService {\n private readonly permissionApi = inject(MyPermissionsApiService);\n private readonly permissionValidator = inject(PermissionValidatorService);\n\n // Permission state\n private readonly _permissions = signal<IMyPermissionsResponseDto | null>(\n null,\n );\n readonly permissions: Signal<IMyPermissionsResponseDto | null> =\n this._permissions.asReadonly();\n\n // Loading state\n private readonly _isLoading = signal(false);\n readonly isLoading: Signal<boolean> = this._isLoading.asReadonly();\n\n /**\n * Load current user's permissions from API\n * Call this on app initialization or after login\n * Returns Observable for reactive composition\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\n // Update shared permission validator\n const actionCodes =\n response.data?.frontendActions.map((a) => a.code) ?? [];\n this.permissionValidator.setPermissions(actionCodes);\n }),\n catchError((error) => {\n console.error('Failed to load permissions:', error);\n this._permissions.set(null);\n this._isLoading.set(false);\n\n // Clear shared permission validator\n this.permissionValidator.clearPermissions();\n return of(void 0);\n }),\n map(() => void 0),\n );\n }\n\n /**\n * Check if permissions are loaded\n *\n * @returns true if permissions are loaded\n */\n isLoaded(): boolean {\n return (\n this._permissions() !== null &&\n this.permissionValidator.isPermissionsLoaded()\n );\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 ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { AngularModule, ILogicNode, PrimeModule } from '@flusys/ng-shared';\nimport { ButtonModule } from 'primeng/button';\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 { id: crypto.randomUUID(), type: 'action', actionId: node.actionId };\n }\n return {\n id: crypto.randomUUID(),\n type: 'group',\n operator: node.operator,\n children: node.children?.map(toBuilderNode) ?? [],\n };\n}\n\n/** Visual builder for AND/OR permission logic trees */\n@Component({\n selector: 'lib-logic-builder',\n standalone: true,\n imports: [CommonModule, FormsModule, AngularModule, PrimeModule, ButtonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"logic-builder\">\n <div class=\"flex justify-between items-center mb-3\">\n <h4 class=\"text-sm font-semibold\">Permission Logic</h4>\n @if (!builderLogic()) {\n <p-button\n label=\"Add Logic\"\n icon=\"pi pi-plus\"\n size=\"small\"\n (onClick)=\"initializeLogic()\" />\n } @else {\n <p-button\n label=\"Clear Logic\"\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 rounded p-3 bg-gray-50\">\n <div class=\"mb-3 text-sm text-gray-600\">\n Define permission requirements using AND/OR logic with actions\n </div>\n\n <!-- Root Node -->\n <div class=\"logic-tree bg-white rounded border\">\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=\"node\" [style.background-color]=\"depth % 2 === 0 ? '#ffffff' : '#f9fafb'\">\n <div class=\"node-header\">\n <span class=\"node-type\" [ngClass]=\"node.type\">{{ node.type.toUpperCase() }}</span>\n\n <div class=\"node-content\">\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=\"Click to toggle\">\n {{ node.operator }}\n </span>\n <span class=\"text-gray-600 text-xs\">({{ node.children?.length || 0 }} conditions)</span>\n }\n\n @if (node.type === 'action') {\n <!-- Action: show action selector -->\n <select\n class=\"flex-1\"\n [ngModel]=\"node.actionId\"\n (ngModelChange)=\"updateActionId(node.id, $event)\">\n <option [value]=\"null\">Select Action... ({{ availableActions().length }} available)</option>\n @for (action of availableActions(); track action.id) {\n <option [ngValue]=\"action.id\">{{ action.name }}</option>\n }\n </select>\n }\n </div>\n\n <div class=\"node-actions\">\n <p-button\n icon=\"pi pi-trash\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n (onClick)=\"removeNode(node.id)\"\n [pTooltip]=\"'Remove'\" />\n </div>\n </div>\n\n <!-- Children for group nodes -->\n @if (node.type === 'group' && node.children && node.children.length > 0) {\n <div class=\"node-children\">\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=\"add-child-section\">\n <div class=\"text-xs font-semibold text-gray-600 mb-2\">Add Condition:</div>\n <div class=\"add-child-buttons\">\n <p-button\n label=\"Group\"\n icon=\"pi pi-sitemap\"\n size=\"small\"\n [outlined]=\"true\"\n (onClick)=\"addChildNode(node.id, 'group')\" />\n <p-button\n label=\"Action\"\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 .logic-tree {\n font-size: 0.875rem;\n }\n\n .node {\n padding: 0.75rem;\n border-bottom: 1px solid #e5e7eb;\n }\n\n .node:last-child {\n border-bottom: none;\n }\n\n .node-header {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin-bottom: 0.5rem;\n }\n\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: #dbeafe;\n color: #1e40af;\n }\n\n .node-type.action {\n background-color: #d1fae5;\n color: #065f46;\n }\n\n\n .node-content {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .node-actions {\n display: flex;\n gap: 0.25rem;\n }\n\n .node-children {\n margin-left: 1.5rem;\n margin-top: 0.5rem;\n padding-left: 1rem;\n border-left: 2px solid #e5e7eb;\n }\n\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: all 0.2s;\n }\n\n .operator-badge.and {\n background-color: #fef3c7;\n color: #92400e;\n }\n\n .operator-badge.or {\n background-color: #e0e7ff;\n color: #3730a3;\n }\n\n .operator-badge:hover {\n opacity: 0.8;\n }\n\n select {\n padding: 0.375rem 0.75rem;\n border: 1px solid #d1d5db;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n background-color: white;\n }\n\n select:focus {\n outline: none;\n border-color: #3b82f6;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n }\n\n .add-child-section {\n margin-top: 0.75rem;\n padding: 0.75rem;\n background-color: #f9fafb;\n border-radius: 0.375rem;\n border: 1px dashed #d1d5db;\n }\n\n .add-child-buttons {\n display: flex;\n gap: 0.5rem;\n flex-wrap: wrap;\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 readonly availableActions = computed(() => this.actions());\n\n private builderTree: IBuilderNode | null = null;\n\n readonly builderLogic = computed(() => {\n const logic = this.logic();\n if (!logic) {\n this.builderTree = null;\n return null;\n }\n if (!this.builderTree) {\n this.builderTree = toBuilderNode(logic);\n }\n return this.builderTree;\n });\n\n initializeLogic(): void {\n this.builderTree = {\n id: crypto.randomUUID(),\n type: 'group',\n operator: 'AND',\n children: [],\n };\n this.emitChange();\n }\n\n clearLogic(): void {\n this.builderTree = null;\n this.logicChange.emit(null);\n }\n\n toggleOperator(nodeId: string): void {\n if (!this.builderTree) return;\n\n this.builderTree = this.updateNodeInTree(this.builderTree, nodeId, (node) => ({\n ...node,\n operator: node.operator === 'AND' ? 'OR' : 'AND',\n }));\n\n this.emitChange();\n }\n\n addChildNode(parentId: string, type: 'group' | 'action'): void {\n if (!this.builderTree) return;\n\n const newNode: IBuilderNode =\n type === 'group'\n ? { id: crypto.randomUUID(), type: 'group', operator: 'AND', children: [] }\n : { id: crypto.randomUUID(), type: 'action', actionId: '' };\n\n this.builderTree = this.updateNodeInTree(this.builderTree, parentId, (node) => ({\n ...node,\n children: [...(node.children || []), newNode],\n }));\n\n this.emitChange();\n }\n\n removeNode(nodeId: string): void {\n if (!this.builderTree) return;\n\n if (this.builderTree.id === nodeId) {\n this.clearLogic();\n return;\n }\n\n this.builderTree = this.removeNodeFromTree(this.builderTree, nodeId);\n this.emitChange();\n }\n\n updateActionId(nodeId: string, actionId: string): void {\n if (!this.builderTree) return;\n\n this.builderTree = this.updateNodeInTree(this.builderTree, nodeId, (node) => ({\n ...node,\n actionId,\n }));\n\n this.emitChange();\n }\n\n private emitChange(): void {\n if (!this.builderTree) {\n this.logicChange.emit(null);\n return;\n }\n this.logicChange.emit(toLogicNode(this.builderTree));\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) {\n return {\n ...node,\n children: node.children.map((child) =>\n this.updateNodeInTree(child, targetId, updater),\n ),\n };\n }\n return node;\n }\n\n private removeNodeFromTree(node: IBuilderNode, targetId: string): IBuilderNode {\n if (node.children) {\n return {\n ...node,\n children: node.children\n .filter((child) => child.id !== targetId)\n .map((child) => this.removeNodeFromTree(child, targetId)),\n };\n }\n return node;\n }\n}\n","/**\n * Tree Utility Functions\n * Shared utilities for working with hierarchical tree structures\n */\n\nimport { TreeNode } from 'primeng/api';\nimport { IActionTreeDto, IAction } from '../interfaces/action.interface';\n\n/**\n * Flattens a hierarchical tree structure into a flat array\n *\n * @template T - Type of tree node (must have optional children array)\n * @param tree - Array of tree nodes to flatten\n * @returns Flat array containing all nodes from the tree\n *\n * @example\n * ```typescript\n * const tree = [\n * { id: '1', name: 'Parent', children: [\n * { id: '2', name: 'Child 1' },\n * { id: '3', name: 'Child 2' }\n * ]}\n * ];\n * const flat = flattenTree(tree);\n * // Returns: [{ id: '1', ... }, { id: '2', ... }, { id: '3', ... }]\n * ```\n */\nexport function flattenTree<T extends { children?: T[] }>(tree: T[]): T[] {\n if (!tree?.length) {\n return [];\n }\n\n const result: T[] = [];\n\n const flatten = (nodes: T[]): void => {\n for (const node of nodes) {\n result.push(node);\n\n if (node.children?.length) {\n flatten(node.children);\n }\n }\n };\n\n flatten(tree);\n return result;\n}\n\n/**\n * Builds a map of items by their ID for quick lookup\n *\n * @template T - Type of item (must have id property)\n * @param items - Array of items to map\n * @returns Map with item IDs as keys and items as values\n *\n * @example\n * ```typescript\n * const actions = [{ id: '1', name: 'Action 1' }, { id: '2', name: 'Action 2' }];\n * const map = buildItemMap(actions);\n * const action = map.get('1'); // { id: '1', name: 'Action 1' }\n * ```\n */\nexport function buildItemMap<T extends { id: string | number }>(\n items: T[]\n): Map<string, T> {\n if (!items?.length) {\n return new Map();\n }\n\n return new Map(\n items\n .filter((item) => item?.id !== undefined && item?.id !== null)\n .map((item) => [String(item.id), item])\n );\n}\n\n/**\n * Build tree structure from flat list using parentId\n *\n * Converts flat array with parentId references into hierarchical tree structure.\n * Used when backend returns flat list but tree structure is needed for display.\n *\n * @template T - Type of node (must have id and optional parentId)\n * @param flatList - Flat array of nodes with parentId references\n * @returns Hierarchical tree with children arrays\n *\n * @example\n * ```typescript\n * const flat = [\n * { id: '1', name: 'Parent', parentId: null },\n * { id: '2', name: 'Child 1', parentId: '1' },\n * { id: '3', name: 'Child 2', parentId: '1' }\n * ];\n * const tree = buildTreeFromFlat(flat);\n * // Returns: [{ id: '1', name: 'Parent', children: [child1, child2] }]\n * ```\n */\nexport function buildTreeFromFlat<\n T extends { id?: string | null; parentId?: string | null }\n>(flatList: T[]): (T & { children: T[] })[] {\n if (!flatList?.length) {\n return [];\n }\n\n // Create map for O(1) lookup\n const itemMap = new Map<string, T & { children: T[] }>();\n const rootItems: (T & { children: T[] })[] = [];\n\n // First pass: Create all nodes with empty children arrays\n flatList.forEach((item) => {\n if (item.id) {\n itemMap.set(item.id, { ...item, children: [] });\n }\n });\n\n // Second pass: Build parent-child relationships\n flatList.forEach((item) => {\n if (!item.id) return;\n\n const node = itemMap.get(item.id);\n if (!node) return;\n\n if (!item.parentId) {\n // Root level item\n rootItems.push(node);\n } else {\n // Child item - add to parent's children\n const parent = itemMap.get(item.parentId);\n if (parent) {\n parent.children.push(node);\n } else {\n // Parent not found - treat as root\n rootItems.push(node);\n }\n }\n });\n\n return rootItems;\n}\n\n/**\n * Convert ActionTreeDto to PrimeNG TreeNode format\n *\n * Transforms hierarchical action data from backend into PrimeNG TreeTable format.\n * Recursively processes children and sets leaf/expanded properties.\n *\n * @param actions - Array of action tree DTOs from backend\n * @returns Array of TreeNodes for PrimeNG TreeTable\n *\n * @example\n * ```typescript\n * const actionsTree = [\n * {\n * id: '1',\n * name: 'User Management',\n * children: [\n * { id: '2', name: 'Create User', children: [] }\n * ]\n * }\n * ];\n * const treeNodes = convertActionToTreeNode(actionsTree);\n * // Use with: <p-treeTable [value]=\"treeNodes\">\n * ```\n */\nexport function convertActionToTreeNode(\n actions: IActionTreeDto[]\n): TreeNode<IAction>[] {\n if (!actions?.length) {\n return [];\n }\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 ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n OnDestroy,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { PrimeModule } 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 * - OnPush change detection\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 standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, FormsModule, PrimeModule],\n template: `\n <div class=\"role-action-selector\">\n <!-- Role Selector -->\n <div class=\"mb-4\">\n <div class=\"grid\">\n <div class=\"col-12 md:col-6 lg:col-4\">\n <label class=\"block font-semibold mb-2\">Select Role</label>\n <p-select\n [(ngModel)]=\"selectedRoleId\"\n [options]=\"roles()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n placeholder=\"Select a role\"\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 border-round shadow-1 flex justify-content-center\"\n >\n <i\n class=\"pi pi-spin pi-spinner text-primary\"\n style=\"font-size: 3rem\"\n ></i>\n </div>\n }\n\n <!-- Action List -->\n @if (!loading() && actions().length > 0) {\n <div class=\"surface-card p-4 border-round shadow-1\">\n <div\n class=\"flex flex-column md:flex-row justify-content-between align-items-start md:align-items-center gap-3 mb-4\"\n >\n <div>\n <h5 class=\"m-0 mb-1\">Action Permissions</h5>\n <p class=\"text-sm text-color-secondary m-0\">\n {{ actions().length }} actions available\n </p>\n </div>\n <div class=\"flex flex-wrap gap-2\">\n <p-button\n label=\"Select All\"\n icon=\"pi pi-check\"\n [outlined]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n (onClick)=\"selectAll()\"\n />\n <p-button\n label=\"Deselect All\"\n icon=\"pi pi-times\"\n [outlined]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n (onClick)=\"deselectAll()\"\n />\n <p-button\n label=\"Save Changes\"\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=\"bg-orange-50 border-l-4 border-orange-500 p-4 mb-4\">\n <div class=\"flex items-center\">\n <i\n class=\"pi pi-exclamation-triangle text-orange-500 mr-2\"\n ></i>\n <div>\n <strong class=\"text-orange-800\">Validation Warning:</strong>\n <p class=\"text-sm text-orange-700 mt-1\">\n {{ invalidActionsCount() }} selected\n action{{ invalidActionsCount() > 1 ? 's have' : ' has' }}\n unmet prerequisites. Fix before saving or use auto-fix on\n save.\n </p>\n </div>\n </div>\n </div>\n }\n\n <!-- Action Tree Table -->\n <p-treeTable\n [value]=\"treeNodes()\"\n [scrollable]=\"true\"\n scrollHeight=\"flex\"\n dataKey=\"id\"\n styleClass=\"p-treetable-sm\"\n >\n <ng-template pTemplate=\"header\">\n <tr>\n <th style=\"width: 3rem\">\n <p-checkbox\n [ngModel]=\"allSelected()\"\n [binary]=\"true\"\n (ngModelChange)=\"toggleAll()\"\n pTooltip=\"Select/Deselect All\"\n tooltipPosition=\"top\"\n />\n </th>\n <th>Name</th>\n <th>Code</th>\n <th>Type</th>\n <th>Requirements</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowNode let-rowData=\"rowData\">\n <tr [class.bg-red-50]=\"hasUnmetPrerequisites(rowData)\">\n <td style=\"width: 3rem\">\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 align-items-center gap-2\">\n {{ rowData.name }}\n @if (hasUnmetPrerequisites(rowData)) {\n <i\n class=\"pi pi-exclamation-triangle text-orange-500\"\n pTooltip=\"This action has unmet prerequisites and will fail validation on save\"\n tooltipPosition=\"top\"\n ></i>\n }\n </span>\n </td>\n <td>{{ 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>\n @if (rowData.permissionLogic) {\n <span class=\"text-sm text-muted\">Has prerequisites</span>\n } @else {\n <span class=\"text-muted\">-</span>\n }\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"5\" class=\"text-center p-4\">\n @if (loading()) {\n <i class=\"pi pi-spin pi-spinner\"></i> Loading actions...\n } @else { No actions available. }\n </td>\n </tr>\n </ng-template>\n </p-treeTable>\n </div>\n\n <!-- Change Summary -->\n @if (hasChanges()) {\n <div class=\"surface-border border-1 border-round p-3 mt-4\">\n <div class=\"flex align-items-center gap-2 mb-3\">\n <i class=\"pi pi-info-circle text-blue-500 content-center\"></i>\n <p class=\"m-0 mb-1 font-bold\">Pending Changes</p>\n </div>\n <div class=\"flex flex-col md:flex-row gap-4\">\n @if (pendingAdd().length > 0) {\n <div class=\"w-full md:w-1/2\">\n <div class=\"flex align-items-center gap-2 mb-2\">\n <i class=\"pi pi-plus-circle text-green-500\"></i>\n <strong class=\"text-sm\"\n >To Add ({{ pendingAdd().length }})</strong\n >\n </div>\n <ul class=\"list-none p-0 m-0 pl-4\">\n @for (action of pendingAdd(); track action.id) {\n <li class=\"text-sm mb-1\">{{ action.name }}</li>\n }\n </ul>\n </div>\n }\n @if (pendingRemove().length > 0) {\n <div class=\"w-full md:w-1/2\">\n <div class=\"flex align-items-center gap-2 mb-2\">\n <i class=\"pi pi-minus-circle text-red-500\"></i>\n <strong class=\"text-sm\"\n >To Remove ({{ pendingRemove().length }})</strong\n >\n </div>\n <ul class=\"list-none p-0 m-0 pl-4\">\n @for (action of pendingRemove(); track action.id) {\n <li class=\"text-sm mb-1\">{{ action.name }}</li>\n }\n </ul>\n </div>\n }\n </div>\n </div>\n }\n }\n\n @if (!loading() && actions().length === 0) {\n <div class=\"surface-card p-5 border-round shadow-1 text-center\">\n <i\n class=\"pi pi-info-circle text-color-secondary mb-3\"\n style=\"font-size: 3rem; display: block;\"\n ></i>\n <p class=\"text-color-secondary m-0\">\n No actions available for this role.\n </p>\n </div>\n }\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n `,\n ],\n})\nexport class RoleActionSelectorComponent implements OnDestroy {\n // Dependencies\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\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\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 // AbortController for data loading\n private loadDataAbortController: AbortController | null = null;\n\n constructor() {\n this.loadRoles();\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 console.error('[Role Selector] Failed to load data:', err);\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to load role permissions. Please refresh.',\n });\n this.loading.set(false);\n }\n });\n } else {\n this.resetState();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.loadDataAbortController?.abort();\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 (err) {\n console.error('[Role Selector] Failed to load roles:', err);\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to load roles',\n });\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) => {\n if (!a.id) {\n console.warn('[Role Selector] Skipping action without ID:', a.name);\n return false;\n }\n return true;\n });\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 flatActions.forEach((action: IAction) => {\n if (action.id) {\n selMap[action.id] = assignedIds.has(action.id);\n }\n });\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 * 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šļø Click to remove'\n : '\\n\\nāāāāāāāāāāāāāāāāāā\\nā Click to add (auto-selects required)';\n\n return `${prerequisiteInfo}${actionHint}`;\n }\n }\n\n if (isCurrentlySelected) {\n return 'ā Assigned to role\\n\\nšļø Click to remove';\n }\n\n return 'ā Click to assign to 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 /**\n * Toggle all actions\n */\n toggleAll(): void {\n const newValue = !this.allSelected();\n const selMap: Record<string, boolean> = {};\n this.actions().forEach((action) => {\n selMap[action.id as string] = newValue;\n });\n this._selectionMap.set(selMap);\n }\n\n /**\n * Select all actions\n */\n selectAll(): void {\n const selMap: Record<string, boolean> = {};\n this.actions().forEach((action) => {\n selMap[action.id as string] = true;\n });\n this._selectionMap.set(selMap);\n }\n\n /**\n * Deselect all actions\n */\n deselectAll(): void {\n const selMap: Record<string, boolean> = {};\n this.actions().forEach((action) => {\n selMap[action.id as string] = false;\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: Array<{ id: string; action: PermissionAction }> = [];\n\n this.pendingAdd().forEach((action) => {\n items.push({\n id: action.id as string,\n action: 'add',\n });\n });\n\n this.pendingRemove().forEach((action) => {\n items.push({\n id: action.id as string,\n action: 'remove',\n });\n });\n\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: 'Success',\n detail:\n response?.data?.message || 'Role permissions updated successfully',\n });\n\n // Update baseline\n this._initialSelection.set({ ...this.selectionMap() });\n } catch (err) {\n const error = err as { error?: { message?: string } };\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: error?.error?.message || 'Failed to update role permissions',\n });\n } finally {\n this.saving.set(false);\n }\n }\n\n /**\n * Reset component state\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 ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n OnDestroy,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { COMPANY_API_PROVIDER, PrimeModule } from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { firstValueFrom } from 'rxjs';\nimport {\n IAction,\n IActionTreeDto,\n ICompany,\n IPermissionOperationResultDto,\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 * - OnPush change detection\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 standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, FormsModule, PrimeModule],\n template: `\n <div class=\"company-action-selector\">\n <!-- Company Selector -->\n <div class=\"mb-4\">\n <div class=\"grid\">\n <div class=\"col-12 md:col-6 lg:col-4\">\n <label class=\"block font-semibold mb-2\">Select Company</label>\n <p-select\n [(ngModel)]=\"selectedCompanyId\"\n [options]=\"companies()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n placeholder=\"Select a company\"\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 border-round shadow-1 flex justify-content-center\"\n >\n <i\n class=\"pi pi-spin pi-spinner text-primary\"\n style=\"font-size: 3rem\"\n ></i>\n </div>\n }\n\n <!-- Action List -->\n @if (!loading() && actions().length > 0) {\n <div class=\"surface-card p-4 border-round shadow-1\">\n <div\n class=\"flex flex-column md:flex-row justify-content-between align-items-start md:align-items-center gap-3 mb-4\"\n >\n <div>\n <h5 class=\"m-0 mb-1\">Action Whitelist</h5>\n <p class=\"text-sm text-color-secondary m-0\">\n {{ actions().length }} actions available\n </p>\n </div>\n <div class=\"flex flex-wrap gap-2\">\n <p-button\n label=\"Select All\"\n icon=\"pi pi-check\"\n [outlined]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n (onClick)=\"selectAll()\"\n />\n <p-button\n label=\"Deselect All\"\n icon=\"pi pi-times\"\n [outlined]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n (onClick)=\"deselectAll()\"\n />\n <p-button\n label=\"Save Changes\"\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=\"bg-orange-50 border-l-4 border-orange-500 p-4 mb-4\">\n <div class=\"flex items-center\">\n <i\n class=\"pi pi-exclamation-triangle text-orange-500 mr-2\"\n ></i>\n <div>\n <strong class=\"text-orange-800\">Validation Warning:</strong>\n <p class=\"text-sm text-orange-700 mt-1\">\n {{ invalidActionsCount() }} selected\n action{{ invalidActionsCount() > 1 ? 's have' : ' has' }}\n unmet prerequisites. Fix before saving or use auto-fix on\n save.\n </p>\n </div>\n </div>\n </div>\n }\n\n <!-- Action Tree Table -->\n <p-treeTable\n [value]=\"treeNodes()\"\n [scrollable]=\"true\"\n scrollHeight=\"flex\"\n dataKey=\"id\"\n styleClass=\"p-treetable-sm\"\n >\n <ng-template pTemplate=\"header\">\n <tr>\n <th style=\"width: 3rem\">\n <p-checkbox\n [ngModel]=\"allSelected()\"\n [binary]=\"true\"\n (ngModelChange)=\"toggleAll()\"\n pTooltip=\"Select/Deselect All\"\n tooltipPosition=\"top\"\n />\n </th>\n <th>Name</th>\n <th>Code</th>\n <th>Type</th>\n <th>Description</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowNode let-rowData=\"rowData\">\n <tr [class.bg-red-50]=\"hasUnmetPrerequisites(rowData)\">\n <td style=\"width: 3rem\">\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 align-items-center gap-2\">\n {{ rowData.name }}\n @if (hasUnmetPrerequisites(rowData)) {\n <i\n class=\"pi pi-exclamation-triangle text-orange-500\"\n pTooltip=\"This action has unmet prerequisites and will fail validation on save\"\n tooltipPosition=\"top\"\n ></i>\n }\n </span>\n </td>\n <td>{{ 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>{{ rowData.description || '-' }}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"5\" class=\"text-center p-4\">\n @if (loading()) {\n <i class=\"pi pi-spin pi-spinner\"></i> Loading actions...\n } @else { No actions available. }\n </td>\n </tr>\n </ng-template>\n </p-treeTable>\n </div>\n\n <!-- Change Summary -->\n @if (hasChanges()) {\n <div class=\"surface-border border-1 border-round p-3 mt-4\">\n <div class=\"flex align-items-center gap-2 mb-3\">\n <i class=\"pi pi-info-circle text-blue-500 content-center\"></i>\n <p class=\"m-0 mb-1 font-bold\">Pending Changes</p>\n </div>\n <div class=\"flex flex-col md:flex-row gap-4\">\n @if (pendingAdd().length > 0) {\n <div class=\"w-full md:w-1/2\">\n <div class=\"flex items-center gap-2 mb-2\">\n <i class=\"pi pi-plus-circle text-green-500\"></i>\n <strong class=\"text-sm\">\n To Whitelist ({{ pendingAdd().length }})\n </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\n @if (pendingRemove().length > 0) {\n <div class=\"w-full md:w-1/2\">\n <div class=\"flex items-center gap-2 mb-2\">\n <i class=\"pi pi-minus-circle text-red-500\"></i>\n <strong class=\"text-sm\">\n To Remove ({{ pendingRemove().length }})\n </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 border-round shadow-1 text-center\">\n <i\n class=\"pi pi-info-circle text-color-secondary mb-3\"\n style=\"font-size: 3rem; display: block;\"\n ></i>\n <p class=\"text-color-secondary m-0\">\n No actions available for this company.\n </p>\n </div>\n }\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n `,\n ],\n})\nexport class CompanyActionSelectorComponent implements OnDestroy {\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\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\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 this.hasChanges() && !this.saving() && this.invalidActionsCount() === 0;\n });\n\n // AbortController for data loading\n private loadDataAbortController: AbortController | null = null;\n\n constructor() {\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 console.error('[Company Selector] Failed to load data:', err);\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to load company actions. Please refresh.',\n });\n this.loading.set(false);\n }\n });\n } else {\n this.resetState();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.loadDataAbortController?.abort();\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 (err) {\n console.error('[Company Selector] Failed to load companies:', err);\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to load companies',\n });\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) => {\n if (!a.id) {\n console.warn(\n '[Company Selector] Skipping action without ID:',\n a.name,\n );\n return false;\n }\n return true;\n });\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 // Build selection map\n const selMap: Record<string, boolean> = {};\n actionsList.forEach((action: IAction) => {\n if (action.id) {\n selMap[action.id] = assignedIds.has(action.id);\n }\n });\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šļø Click to remove'\n : '\\n\\nāāāāāāāāāāāāāāāāāā\\nā Click to add (auto-selects required)';\n\n return `${prerequisiteInfo}${actionHint}`;\n }\n }\n\n if (isCurrentlySelected) {\n return 'ā Selected\\n\\nšļø Click to remove from company whitelist';\n }\n\n return 'ā Click to add to company whitelist';\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 /**\n * Toggle all actions\n */\n toggleAll(): void {\n const newValue = !this.allSelected();\n const selMap: Record<string, boolean> = {};\n this.actions().forEach((action) => {\n selMap[action.id as string] = newValue;\n });\n this._selectionMap.set(selMap);\n }\n\n /**\n * Select all actions\n */\n selectAll(): void {\n const selMap: Record<string, boolean> = {};\n this.actions().forEach((action) => {\n selMap[action.id as string] = true;\n });\n this._selectionMap.set(selMap);\n }\n\n /**\n * Deselect all actions\n */\n deselectAll(): void {\n const selMap: Record<string, boolean> = {};\n this.actions().forEach((action) => {\n selMap[action.id as string] = false;\n });\n this._selectionMap.set(selMap);\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 // Build payload\n const items: Array<{ id: string; action: PermissionAction }> = [];\n\n this.pendingAdd().forEach((action) => {\n items.push({\n id: action.id as string,\n action: 'add',\n });\n });\n\n this.pendingRemove().forEach((action) => {\n items.push({\n id: action.id as string,\n action: 'remove',\n });\n });\n\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: 'Success',\n detail:\n response?.data?.message ||\n 'Company action whitelist updated successfully',\n });\n\n // Update baseline\n this._initialSelection.set({ ...this.selectionMap() });\n } catch (err) {\n const error = err as { error?: { message?: string } };\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail:\n error?.error?.message || 'Failed to update company action whitelist',\n });\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} requires: ${requiredNames}`;\n })\n .join('\\n');\n\n this.confirmationService.confirm({\n header: 'Prerequisite Validation Failed',\n message: `The following actions cannot be added because they have missing prerequisites:\\n\\n${errorList}\\n\\nWould you like to automatically select all required actions?`,\n icon: 'pi pi-exclamation-triangle',\n acceptLabel: 'Auto-select Required Actions',\n rejectLabel: '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: 'Actions Selected',\n detail:\n 'Automatically selected required prerequisite actions. Please save again.',\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: 'Changes Reverted',\n detail: 'Selection reverted to saved state',\n });\n },\n });\n }\n\n /**\n * Reset component state\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 ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport {\n PrimeModule,\n USER_PERMISSION_PROVIDER,\n USER_PROVIDER,\n} from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { MAX_DROPDOWN_ITEMS } from '../constants/pagination.constants';\nimport {\n IBranch,\n IRole,\n IUser,\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 * - OnPush change detection\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 standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, FormsModule, PrimeModule],\n template: `\n <div class=\"user-role-selector\">\n <!-- User and Branch Selectors -->\n <div class=\"surface-card p-4 border-round mb-4 shadow-1\">\n <div class=\"formgrid grid gap-5\">\n <div class=\"field col-12 sm:col-6 mb-0\">\n <label class=\"block font-semibold mb-2 text-900\">\n <i class=\"pi pi-user mr-2 text-primary\"></i>\n Select User\n </label>\n <p-select\n [(ngModel)]=\"selectedUserId\"\n [options]=\"users()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n placeholder=\"Select a user\"\n [showClear]=\"true\"\n [filter]=\"true\"\n styleClass=\"w-full\"\n >\n <ng-template #selectedItem let-user>\n @if (user) {\n <div class=\"flex align-items-center gap-2\">\n <i class=\"pi pi-user text-primary\"></i>\n <div>\n <div class=\"font-semibold\">{{ user.name }}</div>\n <div class=\"text-xs text-color-secondary\">\n {{ user.email }}\n </div>\n </div>\n </div>\n }\n </ng-template>\n <ng-template #item let-user>\n <div class=\"flex align-items-center gap-2\">\n <i class=\"pi pi-user text-color-secondary\"></i>\n <div>\n <div class=\"font-semibold\">{{ user.name }}</div>\n <div class=\"text-xs text-color-secondary\">\n {{ user.email }}\n </div>\n </div>\n </div>\n </ng-template>\n </p-select>\n </div>\n\n @if (showBranchSelector()) {\n <div class=\"field col-12 sm:col-6 mb-0\">\n <label class=\"block font-semibold mb-2 text-900\">\n <i class=\"pi pi-building mr-2 text-primary\"></i>\n Select Branch\n </label>\n <p-select\n [(ngModel)]=\"selectedBranchId\"\n [options]=\"filteredBranches()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n placeholder=\"Select a branch\"\n [showClear]=\"true\"\n [filter]=\"true\"\n styleClass=\"w-full\"\n >\n <ng-template #selectedItem let-branch>\n @if (branch) {\n <div class=\"flex align-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 align-items-center gap-2\">\n <i class=\"pi pi-building text-color-secondary\"></i>\n <span>{{ branch.name }}</span>\n </div>\n </ng-template>\n </p-select>\n <small class=\"text-color-secondary block mt-1\">\n {{ filteredBranches().length }} permitted branch{{\n filteredBranches().length !== 1 ? 'es' : ''\n }}\n in current company\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 border-round shadow-1 flex justify-content-center\"\n >\n <i\n class=\"pi pi-spin pi-spinner text-primary\"\n style=\"font-size: 3rem\"\n ></i>\n </div>\n }\n\n <!-- Role List -->\n @if (!loading() && roles().length > 0) {\n <div class=\"surface-card p-4 border-round shadow-1\">\n <div\n class=\"flex flex-column md:flex-row justify-content-between align-items-start md:align-items-center gap-3 mb-4\"\n >\n <div>\n <h5 class=\"m-0 mb-1\">Role Assignments</h5>\n <p class=\"text-sm text-color-secondary m-0\">\n {{ roles().length }} roles available\n </p>\n </div>\n <div class=\"flex flex-wrap gap-2\">\n <p-button\n label=\"Select All\"\n icon=\"pi pi-check\"\n [outlined]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n (onClick)=\"selectAll()\"\n />\n <p-button\n label=\"Deselect All\"\n icon=\"pi pi-times\"\n [outlined]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n (onClick)=\"deselectAll()\"\n />\n <p-button\n label=\"Save Changes\"\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 <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=\"Showing {first} to {last} of {totalRecords} roles\"\n styleClass=\"p-datatable-sm\"\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=\"Select/Deselect All\"\n tooltipPosition=\"top\"\n />\n </th>\n <th>Name</th>\n <th>Code</th>\n <th>Description</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>{{ role.code || '-' }}</td>\n <td>{{ role.description || '-' }}</td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"4\" class=\"text-center p-4\">\n @if (loading()) {\n <i class=\"pi pi-spin pi-spinner\"></i> Loading roles...\n } @else {\n No roles available.\n }\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n\n <!-- Change Summary -->\n @if (hasChanges()) {\n <div class=\"surface-border border-1 border-round p-3 mt-4\">\n <div class=\"flex align-items-center gap-2 mb-3\">\n <i class=\"pi pi-info-circle text-blue-500 content-center\"></i>\n <p class=\"m-0 mb-1 font-bold\">Pending Changes</p>\n </div>\n <div class=\"flex flex-col md:flex-row gap-4\">\n @if (pendingAdd().length > 0) {\n <div class=\"w-full md:w-1/2\">\n <div class=\"flex align-items-center gap-2 mb-2\">\n <i class=\"pi pi-plus-circle text-green-500\"></i>\n <strong class=\"text-sm\"\n >To Assign ({{ pendingAdd().length }})</strong\n >\n </div>\n <ul class=\"list-none p-0 m-0 pl-4\">\n @for (role of pendingAdd(); track role.id) {\n <li class=\"text-sm mb-1\">{{ role.name }}</li>\n }\n </ul>\n </div>\n }\n @if (pendingRemove().length > 0) {\n <div class=\"w-full md:w-1/2\">\n <div class=\"flex align-items-center gap-2 mb-2\">\n <i class=\"pi pi-minus-circle text-red-500\"></i>\n <strong class=\"text-sm\"\n >To Remove ({{ pendingRemove().length }})</strong\n >\n </div>\n <ul class=\"list-none p-0 m-0 pl-4\">\n @for (role of pendingRemove(); track role.id) {\n <li class=\"text-sm mb-1\">{{ role.name }}</li>\n }\n </ul>\n </div>\n }\n </div>\n </div>\n }\n }\n\n @if (!loading() && roles().length === 0) {\n <div class=\"surface-card p-5 border-round shadow-1 text-center\">\n <i\n class=\"pi pi-info-circle text-color-secondary mb-3\"\n style=\"font-size: 3rem; display: block;\"\n ></i>\n <p class=\"text-color-secondary m-0\">\n No roles available for this user.\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 // Dependencies\n private readonly appConfig = inject(APP_CONFIG);\n private readonly companyContext = inject(LAYOUT_AUTH_STATE);\n private readonly userProvider = inject(USER_PROVIDER);\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\n // State - User/Branch Selection\n readonly selectedUserId = signal<string | undefined>(undefined);\n readonly selectedBranchId = signal<string | undefined>(undefined);\n readonly users = signal<IUser[]>([]);\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 return JSON.stringify(current) !== JSON.stringify(initial);\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 this.loadUsers();\n\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 users from provider\n */\n private async loadUsers(): Promise<void> {\n try {\n const response = await this.userProvider\n .getUsers({\n page: 0,\n pageSize: MAX_DROPDOWN_ITEMS,\n })\n .toPromise();\n this.users.set(response?.data ?? []);\n } catch (err) {\n console.error('[User Role Selector] Failed to load users:', err);\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to load users',\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 this.userPermissionProvider\n .getUserBranchPermissions(userId)\n .toPromise();\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 (err) {\n console.error('[User Role Selector] Failed to load user branches:', err);\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to load user permitted branches',\n });\n }\n }\n\n /**\n * Load roles and assignments for selected user\n */\n private async loadData(): Promise<void> {\n const userId = this.selectedUserId();\n if (!userId) return;\n\n const branchId = this.selectedBranchId();\n\n this.loading.set(true);\n try {\n // Load all roles\n const rolesResponse = await this.roleApi\n .getAll('', {\n pagination: { currentPage: 0, pageSize: MAX_DROPDOWN_ITEMS },\n })\n .toPromise();\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 this.permissionApi\n .getUserRoles(userId, query)\n .toPromise();\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 (err) {\n console.error('[User Role Selector] Failed to load user roles:', err);\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to load user role assignments',\n });\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 'ā Assigned to user\\n\\nšļø Click to remove role';\n }\n\n return 'ā 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 const newValue = !this.allSelected();\n const selMap: Record<string, boolean> = {};\n this.roles().forEach((role) => {\n selMap[role.id as string] = newValue;\n });\n this._selectionMap.set(selMap);\n }\n\n /**\n * Select all roles\n */\n selectAll(): void {\n const selMap: Record<string, boolean> = {};\n this.roles().forEach((role) => {\n selMap[role.id as string] = true;\n });\n this._selectionMap.set(selMap);\n }\n\n /**\n * Deselect all roles\n */\n deselectAll(): void {\n const selMap: Record<string, boolean> = {};\n this.roles().forEach((role) => {\n selMap[role.id as string] = false;\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: 'Company Required',\n detail: 'Please select a company',\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 this.permissionApi\n .assignUserRoles(payload)\n .toPromise();\n\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail:\n response?.data?.message ||\n 'User role assignments updated successfully',\n });\n\n // Update baseline\n this._initialSelection.set({ ...this.selectionMap() });\n } catch (err) {\n const error = err as { error?: { message?: string } };\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail:\n error?.error?.message || 'Failed to update user role assignments',\n });\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 ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport {\n PrimeModule,\n USER_PERMISSION_PROVIDER,\n USER_PROVIDER,\n} from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { MAX_DROPDOWN_ITEMS } from '../constants/pagination.constants';\nimport {\n IAction,\n IActionTreeDto,\n IBranch,\n IUser,\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 * - OnPush change detection\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 standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, FormsModule, PrimeModule],\n template: `\n <div class=\"user-action-selector\">\n <!-- User and Branch Selectors -->\n <div class=\"surface-card p-4 border-round mb-4 shadow-1\">\n <div class=\"formgrid grid gap-5\">\n <div class=\"field col-12 sm:col-6 mb-0\">\n <label class=\"block font-semibold mb-2 text-900\">\n <i class=\"pi pi-user mr-2 text-primary\"></i>\n Select User\n </label>\n <p-select\n [(ngModel)]=\"selectedUserId\"\n [options]=\"users()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n placeholder=\"Select a user\"\n [showClear]=\"true\"\n [filter]=\"true\"\n styleClass=\"w-full\"\n >\n <ng-template #selectedItem let-user>\n @if (user) {\n <div class=\"flex align-items-center gap-2\">\n <i class=\"pi pi-user text-primary\"></i>\n <div>\n <div class=\"font-semibold\">{{ user.name }}</div>\n <div class=\"text-xs text-color-secondary\">\n {{ user.email }}\n </div>\n </div>\n </div>\n }\n </ng-template>\n <ng-template #item let-user>\n <div class=\"flex align-items-center gap-2\">\n <i class=\"pi pi-user text-color-secondary\"></i>\n <div>\n <div class=\"font-semibold\">{{ user.name }}</div>\n <div class=\"text-xs text-color-secondary\">\n {{ user.email }}\n </div>\n </div>\n </div>\n </ng-template>\n </p-select>\n </div>\n\n @if (showBranchSelector()) {\n <div class=\"field col-12 sm:col-6 mb-0\">\n <label class=\"block font-semibold mb-2 text-900\">\n <i class=\"pi pi-building mr-2 text-primary\"></i>\n Select Branch\n </label>\n <p-select\n [(ngModel)]=\"selectedBranchId\"\n [options]=\"filteredBranches()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n placeholder=\"Select a branch\"\n [showClear]=\"true\"\n [filter]=\"true\"\n styleClass=\"w-full\"\n >\n <ng-template #selectedItem let-branch>\n @if (branch) {\n <div class=\"flex align-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 align-items-center gap-2\">\n <i class=\"pi pi-building text-color-secondary\"></i>\n <span>{{ branch.name }}</span>\n </div>\n </ng-template>\n </p-select>\n <small class=\"text-color-secondary block mt-1\">\n {{ filteredBranches().length }} permitted branch{{\n filteredBranches().length !== 1 ? 'es' : ''\n }}\n in current company\n </small>\n </div>\n }\n </div>\n </div>\n\n @if (selectedUserId()) {\n <!-- Loading State -->\n @if (loading()) {\n <div class=\"flex justify-content-center p-5\">\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem\"></i>\n </div>\n }\n\n <!-- Action List -->\n @if (!loading() && actions().length > 0) {\n <div class=\"surface-card p-4 border-round shadow-1\">\n <div\n class=\"flex flex-column md:flex-row justify-content-between align-items-start md:align-items-center gap-3 mb-4\"\n >\n <div>\n <h5 class=\"m-0 mb-1\">Direct Action Permissions</h5>\n <p class=\"text-sm text-color-secondary m-0\">\n {{ actions().length }} actions available\n </p>\n </div>\n <div class=\"flex flex-wrap gap-2\">\n <p-button\n label=\"Select All\"\n icon=\"pi pi-check\"\n [outlined]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n (onClick)=\"selectAll()\"\n />\n <p-button\n label=\"Deselect All\"\n icon=\"pi pi-times\"\n [outlined]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n (onClick)=\"deselectAll()\"\n />\n <p-button\n label=\"Save Changes\"\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 <!-- Action Tree Table -->\n <p-treeTable\n [value]=\"treeNodes()\"\n [scrollable]=\"true\"\n scrollHeight=\"flex\"\n dataKey=\"id\"\n styleClass=\"p-treetable-sm\"\n >\n <ng-template pTemplate=\"header\">\n <tr>\n <th style=\"width: 3rem\">\n <p-checkbox\n [ngModel]=\"allSelected()\"\n [binary]=\"true\"\n (ngModelChange)=\"toggleAll()\"\n pTooltip=\"Select/Deselect All\"\n tooltipPosition=\"top\"\n />\n </th>\n <th>Name</th>\n <th>Code</th>\n <th>Type</th>\n <th>Description</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowNode let-rowData=\"rowData\">\n <tr>\n <td style=\"width: 3rem\">\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>{{ rowData.name }}</span>\n </td>\n <td>{{ 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>{{ rowData.description || '-' }}</td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td colspan=\"5\" class=\"text-center p-4\">\n @if (loading()) {\n <i class=\"pi pi-spin pi-spinner\"></i> Loading actions...\n } @else {\n No actions available.\n }\n </td>\n </tr>\n </ng-template>\n </p-treeTable>\n </div>\n\n <!-- Change Summary -->\n @if (hasChanges()) {\n <div class=\"surface-border border-1 border-round p-3 mt-4\">\n <div class=\"flex align-items-center gap-2 mb-3\">\n <i class=\"pi pi-info-circle text-blue-500 content-center\"></i>\n <p class=\"m-0 mb-1 font-bold\">Pending Changes</p>\n </div>\n <div class=\"flex flex-col md:flex-row gap-4\">\n @if (pendingAdd().length > 0) {\n <div class=\"w-full md:w-1/2\">\n <div class=\"flex align-items-center gap-2 mb-2\">\n <i class=\"pi pi-plus-circle text-green-500\"></i>\n <strong class=\"text-sm\"\n >To Assign ({{ pendingAdd().length }})</strong\n >\n </div>\n <ul class=\"list-none p-0 m-0 pl-4\">\n @for (action of pendingAdd(); track action.id) {\n <li class=\"text-sm mb-1\">{{ action.name }}</li>\n }\n </ul>\n </div>\n }\n @if (pendingRemove().length > 0) {\n <div class=\"w-full md:w-1/2\">\n <div class=\"flex align-items-center gap-2 mb-2\">\n <i class=\"pi pi-minus-circle text-red-500\"></i>\n <strong class=\"text-sm\"\n >To Remove ({{ pendingRemove().length }})</strong\n >\n </div>\n <ul class=\"list-none p-0 m-0 pl-4\">\n @for (action of pendingRemove(); track action.id) {\n <li class=\"text-sm mb-1\">{{ action.name }}</li>\n }\n </ul>\n </div>\n }\n </div>\n </div>\n }\n }\n\n @if (!loading() && actions().length === 0) {\n <div class=\"surface-card p-5 border-round shadow-1 text-center\">\n <i\n class=\"pi pi-info-circle text-color-secondary mb-3\"\n style=\"font-size: 3rem; display: block;\"\n ></i>\n <p class=\"text-color-secondary m-0\">\n No actions available for this user.\n </p>\n </div>\n }\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n `,\n ],\n})\nexport class UserActionSelectorComponent {\n // Dependencies\n private readonly appConfig = inject(APP_CONFIG);\n private readonly companyContext = inject(LAYOUT_AUTH_STATE);\n private readonly userProvider = inject(USER_PROVIDER);\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\n // State - User/Branch Selection\n readonly selectedUserId = signal<string | undefined>(undefined);\n readonly selectedBranchId = signal<string | undefined>(undefined);\n readonly users = signal<IUser[]>([]);\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 - 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 - 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 return JSON.stringify(current) !== JSON.stringify(initial);\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 this.loadUsers();\n\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 users from provider\n */\n private async loadUsers(): Promise<void> {\n try {\n const response = await this.userProvider\n .getUsers({\n page: 0,\n pageSize: MAX_DROPDOWN_ITEMS,\n })\n .toPromise();\n this.users.set(response?.data ?? []);\n } catch (err) {\n console.error('[User Selector] Failed to load users:', err);\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to load users',\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 this.userPermissionProvider\n .getUserBranchPermissions(userId)\n .toPromise();\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 (err) {\n console.error('[User Selector] Failed to load user branches:', err);\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to load user permitted branches',\n });\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 // Load actions filtered by company whitelist\n const actionsResponse = await this.actionApi\n .getActionsForPermission()\n .toPromise();\n\n // Get flat list (filtered by company if enabled)\n const flatActions = actionsResponse?.data ?? [];\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 user-action assignments\n const query =\n isCompanyFeatureEnabled(this.appConfig) && branchId\n ? { branchId }\n : undefined;\n\n const assignedResponse = await this.permissionApi\n .getUserActions(userId, query)\n .toPromise();\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 flatActions.forEach((action: IAction) => {\n selMap[action.id as string] = assignedIds.has(action.id as string);\n });\n\n this._selectionMap.set(selMap);\n this._initialSelection.set({ ...selMap });\n } catch (err) {\n console.error('[User Selector] Failed to load user actions:', err);\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to load user action permissions',\n });\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šļø Click to remove'\n : '\\n\\nāāāāāāāāāāāāāāāāāā\\nā Click to add (auto-selects required)';\n\n return `${prerequisiteInfo}${actionHint}`;\n }\n }\n\n if (isCurrentlySelected) {\n return 'ā Assigned to user\\n\\nšļø Click to remove direct permission';\n }\n\n return 'ā Click to assign direct permission';\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 checkbox toggle\n */\n onActionToggle(action: IAction, newValue: boolean): void {\n const selMap = { ...this.selectionMap() };\n selMap[action.id as string] = newValue;\n this._selectionMap.set(selMap);\n }\n\n /**\n * Toggle all actions\n */\n toggleAll(): void {\n const newValue = !this.allSelected();\n const selMap: Record<string, boolean> = {};\n this.actions().forEach((action) => {\n selMap[action.id as string] = newValue;\n });\n this._selectionMap.set(selMap);\n }\n\n /**\n * Select all actions\n */\n selectAll(): void {\n const selMap: Record<string, boolean> = {};\n this.actions().forEach((action) => {\n selMap[action.id as string] = true;\n });\n this._selectionMap.set(selMap);\n }\n\n /**\n * Deselect all actions\n */\n deselectAll(): void {\n const selMap: Record<string, boolean> = {};\n this.actions().forEach((action) => {\n selMap[action.id as string] = false;\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: 'Company Required',\n detail: 'Please select a company',\n });\n return;\n }\n\n // Build payload\n const items: Array<{ id: string; action: PermissionAction }> = [];\n\n this.pendingAdd().forEach((action) => {\n items.push({\n id: action.id as string,\n action: 'add',\n });\n });\n\n this.pendingRemove().forEach((action) => {\n items.push({\n id: action.id as string,\n action: 'remove',\n });\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 this.permissionApi\n .assignUserActions(payload)\n .toPromise();\n\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail:\n response?.data?.message ||\n 'User action permissions updated successfully',\n });\n\n // Update baseline\n this._initialSelection.set({ ...this.selectionMap() });\n } catch (err) {\n const error = err as { error?: { message?: string } };\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail:\n error?.error?.message || 'Failed to update user action permissions',\n });\n } finally {\n this.saving.set(false);\n }\n }\n\n /**\n * Reset component state\n */\n private resetState(): void {\n this._actionsTree.set([]);\n this._actions.set([]);\n this._selectionMap.set({});\n this._initialSelection.set({});\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 { Routes } from '@angular/router';\n\n/**\n * IAM Routes Configuration\n *\n * Identity and Access Management routing\n * - Actions: Permission actions (always visible)\n * - Roles: Role management (conditional on RBAC/FULL mode)\n * - Permissions: User permission assignments (always visible)\n *\n * All routes are protected by permission guards to prevent direct URL access.\n */\nexport const IAM_ROUTES: Routes = [\n {\n path: '',\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 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 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 (User permission assignment)\n {\n path: 'permissions',\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';\n\n// ==================== SERVICES ====================\nexport * from './services/public-api';\n\n// ==================== COMPONENTS ====================\nexport * from './components/public-api';\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","i1","i3","i4","i5","i6"],"mappings":"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"}
|