@atlashub/smartstack 3.21.0 → 3.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js → AgentSkillsPage-BWQSCYl-.js} +2 -2
  2. package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js.map → AgentSkillsPage-BWQSCYl-.js.map} +1 -1
  3. package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js → AgentSkillsPage-IQcMnBaD.js} +2 -2
  4. package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js.map → AgentSkillsPage-IQcMnBaD.js.map} +1 -1
  5. package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js → AgentWorkloadPage-DqrjkvWL.js} +2 -2
  6. package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js.map → AgentWorkloadPage-DqrjkvWL.js.map} +1 -1
  7. package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js → AgentWorkloadPage-w-HiyFYP.js} +2 -2
  8. package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js.map → AgentWorkloadPage-w-HiyFYP.js.map} +1 -1
  9. package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js → ApiCatalogDetailPage-D3L8Yf4G.js} +3 -3
  10. package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js.map → ApiCatalogDetailPage-D3L8Yf4G.js.map} +1 -1
  11. package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js → ApiCatalogDetailPage-MPT3Kz6H.js} +2 -2
  12. package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js.map → ApiCatalogDetailPage-MPT3Kz6H.js.map} +1 -1
  13. package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js → ApiCatalogPage-D4Hg3uiS.js} +2 -2
  14. package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js.map → ApiCatalogPage-D4Hg3uiS.js.map} +1 -1
  15. package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js → ApiCatalogPage-DRg5Cz0r.js} +2 -2
  16. package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js.map → ApiCatalogPage-DRg5Cz0r.js.map} +1 -1
  17. package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js → ApplicationDetailPage-Caizuyn2.js} +2 -2
  18. package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js.map → ApplicationDetailPage-Caizuyn2.js.map} +1 -1
  19. package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js → ApplicationDetailPage-CuCW6aMB.js} +4 -4
  20. package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js.map → ApplicationDetailPage-CuCW6aMB.js.map} +1 -1
  21. package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js → ApplicationsDashboardPage-B2MW8-Kc.js} +2 -2
  22. package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js.map → ApplicationsDashboardPage-B2MW8-Kc.js.map} +1 -1
  23. package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js → ApplicationsDashboardPage-BDIjFIYZ.js} +3 -3
  24. package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js.map → ApplicationsDashboardPage-BDIjFIYZ.js.map} +1 -1
  25. package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js → ApplicationsGridPage-DV-FihKj.js} +2 -2
  26. package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js.map → ApplicationsGridPage-DV-FihKj.js.map} +1 -1
  27. package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js → ApplicationsGridPage-DXsTfXPI.js} +2 -2
  28. package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js.map → ApplicationsGridPage-DXsTfXPI.js.map} +1 -1
  29. package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js → ApplicationsListPage--CGkyBuJ.js} +2 -2
  30. package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js.map → ApplicationsListPage--CGkyBuJ.js.map} +1 -1
  31. package/dist/chunks/{ApplicationsListPage-C91v2rZt.js → ApplicationsListPage-JUX823bh.js} +2 -2
  32. package/dist/chunks/{ApplicationsListPage-C91v2rZt.js.map → ApplicationsListPage-JUX823bh.js.map} +1 -1
  33. package/dist/chunks/{ApplicationsPage-BCbgotIx.js → ApplicationsPage-6zgFye6w.js} +2 -2
  34. package/dist/chunks/{ApplicationsPage-BCbgotIx.js.map → ApplicationsPage-6zgFye6w.js.map} +1 -1
  35. package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js → ApplicationsPage-CQPuuiO6.js} +4 -4
  36. package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js.map → ApplicationsPage-CQPuuiO6.js.map} +1 -1
  37. package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js → AssignmentRulesPage-CFffeEbo.js} +2 -2
  38. package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js.map → AssignmentRulesPage-CFffeEbo.js.map} +1 -1
  39. package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js → AssignmentRulesPage-D78UeUId.js} +2 -2
  40. package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js.map → AssignmentRulesPage-D78UeUId.js.map} +1 -1
  41. package/dist/chunks/{AssignmentsPage-DmfBYQAD.js → AssignmentsPage-Cww2ifZF.js} +2 -2
  42. package/dist/chunks/{AssignmentsPage-DmfBYQAD.js.map → AssignmentsPage-Cww2ifZF.js.map} +1 -1
  43. package/dist/chunks/{AssignmentsPage-sRCCBmRc.js → AssignmentsPage-DE_QS2LO.js} +2 -2
  44. package/dist/chunks/{AssignmentsPage-sRCCBmRc.js.map → AssignmentsPage-DE_QS2LO.js.map} +1 -1
  45. package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js → AuthCallbackPage-CA2nO6DG.js} +2 -2
  46. package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js.map → AuthCallbackPage-CA2nO6DG.js.map} +1 -1
  47. package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js → AuthCallbackPage-CDUAoX-N.js} +2 -2
  48. package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js.map → AuthCallbackPage-CDUAoX-N.js.map} +1 -1
  49. package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js → ConfirmEmailPage-BqsILAYH.js} +2 -2
  50. package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js.map → ConfirmEmailPage-BqsILAYH.js.map} +1 -1
  51. package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js → ConfirmEmailPage-INeHCuMB.js} +2 -2
  52. package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js.map → ConfirmEmailPage-INeHCuMB.js.map} +1 -1
  53. package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js → CreateSupportTicketPage-BWeuV2aU.js} +2 -2
  54. package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js.map → CreateSupportTicketPage-BWeuV2aU.js.map} +1 -1
  55. package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js → CreateSupportTicketPage-OBwF4v7b.js} +2 -2
  56. package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js.map → CreateSupportTicketPage-OBwF4v7b.js.map} +1 -1
  57. package/dist/chunks/{DashboardPage-CUZ80NGV.js → DashboardPage-CKHqWrdS.js} +3 -3
  58. package/dist/chunks/{DashboardPage-CUZ80NGV.js.map → DashboardPage-CKHqWrdS.js.map} +1 -1
  59. package/dist/chunks/{DashboardPage-CaNOAstg.js → DashboardPage-COmc9b__.js} +3 -3
  60. package/dist/chunks/{DashboardPage-CaNOAstg.js.map → DashboardPage-COmc9b__.js.map} +1 -1
  61. package/dist/chunks/{DashboardPage-B48_rQFi.js → DashboardPage-CfKZHiSj.js} +2 -2
  62. package/dist/chunks/{DashboardPage-B48_rQFi.js.map → DashboardPage-CfKZHiSj.js.map} +1 -1
  63. package/dist/chunks/{DashboardPage-CUZV1J9t.js → DashboardPage-CwEZZ3jx.js} +2 -2
  64. package/dist/chunks/{DashboardPage-CUZV1J9t.js.map → DashboardPage-CwEZZ3jx.js.map} +1 -1
  65. package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js → EscalationConfigPage--7lgZ0kJ.js} +2 -2
  66. package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js.map → EscalationConfigPage--7lgZ0kJ.js.map} +1 -1
  67. package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js → EscalationConfigPage-DPyiBcqV.js} +2 -2
  68. package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js.map → EscalationConfigPage-DPyiBcqV.js.map} +1 -1
  69. package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js → ForceChangePasswordPage-BE-6umub.js} +2 -2
  70. package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js.map → ForceChangePasswordPage-BE-6umub.js.map} +1 -1
  71. package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js → ForceChangePasswordPage-CnsYoWmV.js} +2 -2
  72. package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js.map → ForceChangePasswordPage-CnsYoWmV.js.map} +1 -1
  73. package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js → ForgotPasswordPage-CSq4DnFF.js} +2 -2
  74. package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js.map → ForgotPasswordPage-CSq4DnFF.js.map} +1 -1
  75. package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js → ForgotPasswordPage-DZLVolAC.js} +2 -2
  76. package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js.map → ForgotPasswordPage-DZLVolAC.js.map} +1 -1
  77. package/dist/chunks/{GroupDetailPage-DFBvVO1S.js → GroupDetailPage-Bf9Wb_2j.js} +5 -5
  78. package/dist/chunks/{GroupDetailPage-DFBvVO1S.js.map → GroupDetailPage-Bf9Wb_2j.js.map} +1 -1
  79. package/dist/chunks/{GroupDetailPage-B2FkKrGG.js → GroupDetailPage-R-hf3rJ7.js} +2 -2
  80. package/dist/chunks/{GroupDetailPage-B2FkKrGG.js.map → GroupDetailPage-R-hf3rJ7.js.map} +1 -1
  81. package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js → MyAccessRequestsPage-BIisvWM6.js} +2 -2
  82. package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js.map → MyAccessRequestsPage-BIisvWM6.js.map} +1 -1
  83. package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js → MyAccessRequestsPage-BLSV7Tbx.js} +2 -2
  84. package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js.map → MyAccessRequestsPage-BLSV7Tbx.js.map} +1 -1
  85. package/dist/chunks/{MyTenantsPage-BEcYYdGR.js → MyTenantsPage-D-7k9CP1.js} +3 -3
  86. package/dist/chunks/{MyTenantsPage-BEcYYdGR.js.map → MyTenantsPage-D-7k9CP1.js.map} +1 -1
  87. package/dist/chunks/{MyTenantsPage-D9f85zjF.js → MyTenantsPage-DqGW6aDt.js} +2 -2
  88. package/dist/chunks/{MyTenantsPage-D9f85zjF.js.map → MyTenantsPage-DqGW6aDt.js.map} +1 -1
  89. package/dist/chunks/{MyTicketsPage-DJR8h6y1.js → MyTicketsPage--DgDsnZA.js} +2 -2
  90. package/dist/chunks/{MyTicketsPage-DJR8h6y1.js.map → MyTicketsPage--DgDsnZA.js.map} +1 -1
  91. package/dist/chunks/{MyTicketsPage-DiOUExKJ.js → MyTicketsPage-CqJ3Aqob.js} +2 -2
  92. package/dist/chunks/{MyTicketsPage-DiOUExKJ.js.map → MyTicketsPage-CqJ3Aqob.js.map} +1 -1
  93. package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js → NavigationAppsPage-Bebis_RT.js} +2 -2
  94. package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js.map → NavigationAppsPage-Bebis_RT.js.map} +1 -1
  95. package/dist/chunks/{NavigationAppsPage-If7tmCFY.js → NavigationAppsPage-THNPOAjv.js} +2 -2
  96. package/dist/chunks/{NavigationAppsPage-If7tmCFY.js.map → NavigationAppsPage-THNPOAjv.js.map} +1 -1
  97. package/dist/chunks/{NotificationsPage-C29Lln5o.js → NotificationsPage-CAbNW_Cn.js} +2 -2
  98. package/dist/chunks/{NotificationsPage-C29Lln5o.js.map → NotificationsPage-CAbNW_Cn.js.map} +1 -1
  99. package/dist/chunks/{NotificationsPage-BiaLRb0s.js → NotificationsPage-DxwizUhL.js} +2 -2
  100. package/dist/chunks/{NotificationsPage-BiaLRb0s.js.map → NotificationsPage-DxwizUhL.js.map} +1 -1
  101. package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js → OnboardingWizardPage-C6HlbJ3K.js} +2 -2
  102. package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js.map → OnboardingWizardPage-C6HlbJ3K.js.map} +1 -1
  103. package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js → OnboardingWizardPage-CyC2zONO.js} +2 -2
  104. package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js.map → OnboardingWizardPage-CyC2zONO.js.map} +1 -1
  105. package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js → PermissionDetailPage-BDHiNgky.js} +2 -2
  106. package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js.map → PermissionDetailPage-BDHiNgky.js.map} +1 -1
  107. package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js → PermissionDetailPage-C5K17ydY.js} +2 -2
  108. package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js.map → PermissionDetailPage-C5K17ydY.js.map} +1 -1
  109. package/dist/chunks/{PermissionsPage-l0PnY-EE.js → PermissionsPage-COI5LJPo.js} +2 -2
  110. package/dist/chunks/{PermissionsPage-l0PnY-EE.js.map → PermissionsPage-COI5LJPo.js.map} +1 -1
  111. package/dist/chunks/{PermissionsPage-DLy9U3P3.js → PermissionsPage-CkOwH2_d.js} +2 -2
  112. package/dist/chunks/{PermissionsPage-DLy9U3P3.js.map → PermissionsPage-CkOwH2_d.js.map} +1 -1
  113. package/dist/chunks/{PortalDashboardPage-DFBx38-x.js → PortalDashboardPage-CoEC4CmC.js} +2 -2
  114. package/dist/chunks/{PortalDashboardPage-DFBx38-x.js.map → PortalDashboardPage-CoEC4CmC.js.map} +1 -1
  115. package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js → PortalDashboardPage-DrYymEf-.js} +2 -2
  116. package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js.map → PortalDashboardPage-DrYymEf-.js.map} +1 -1
  117. package/dist/chunks/{PreferencesPage-BBu8yZQB.js → PreferencesPage-CJRaU3ba.js} +2 -2
  118. package/dist/chunks/{PreferencesPage-BBu8yZQB.js.map → PreferencesPage-CJRaU3ba.js.map} +1 -1
  119. package/dist/chunks/{PreferencesPage-B81MsNV1.js → PreferencesPage-Cqr9mAab.js} +2 -2
  120. package/dist/chunks/{PreferencesPage-B81MsNV1.js.map → PreferencesPage-Cqr9mAab.js.map} +1 -1
  121. package/dist/chunks/{ProfilePage-DDrl10zj.js → ProfilePage-BZVpg6-l.js} +2 -2
  122. package/dist/chunks/{ProfilePage-DDrl10zj.js.map → ProfilePage-BZVpg6-l.js.map} +1 -1
  123. package/dist/chunks/{ProfilePage-DPoXwdnc.js → ProfilePage-Cu_FITeL.js} +2 -2
  124. package/dist/chunks/{ProfilePage-DPoXwdnc.js.map → ProfilePage-Cu_FITeL.js.map} +1 -1
  125. package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js → ReferencesManagementPage-DUlVk9Ps.js} +3 -3
  126. package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js.map → ReferencesManagementPage-DUlVk9Ps.js.map} +1 -1
  127. package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js → ReferencesManagementPage-ZCuYtqd7.js} +2 -2
  128. package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js.map → ReferencesManagementPage-ZCuYtqd7.js.map} +1 -1
  129. package/dist/chunks/{RegisterPage-CiQib3-6.js → RegisterPage-C4xmVwh9.js} +2 -2
  130. package/dist/chunks/{RegisterPage-CiQib3-6.js.map → RegisterPage-C4xmVwh9.js.map} +1 -1
  131. package/dist/chunks/{RegisterPage-bXCcJD88.js → RegisterPage-DGyzoIHT.js} +2 -2
  132. package/dist/chunks/{RegisterPage-bXCcJD88.js.map → RegisterPage-DGyzoIHT.js.map} +1 -1
  133. package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js → ResetPasswordPage-DqDD6VPR.js} +2 -2
  134. package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js.map → ResetPasswordPage-DqDD6VPR.js.map} +1 -1
  135. package/dist/chunks/{ResetPasswordPage-CubPG3yv.js → ResetPasswordPage-Glu-aeqv.js} +2 -2
  136. package/dist/chunks/{ResetPasswordPage-CubPG3yv.js.map → ResetPasswordPage-Glu-aeqv.js.map} +1 -1
  137. package/dist/chunks/{ResolutionModal-Bg7XZmR1.js → ResolutionModal-CxjANAOP.js} +2 -2
  138. package/dist/chunks/{ResolutionModal-Bg7XZmR1.js.map → ResolutionModal-CxjANAOP.js.map} +1 -1
  139. package/dist/chunks/{ResolutionModal-DqRk_T0n.js → ResolutionModal-Duat18qV.js} +2 -2
  140. package/dist/chunks/{ResolutionModal-DqRk_T0n.js.map → ResolutionModal-Duat18qV.js.map} +1 -1
  141. package/dist/chunks/{RoleDetailPage-Blau6_4c.js → RoleDetailPage-BQffUSnt.js} +3 -3
  142. package/dist/chunks/{RoleDetailPage-Blau6_4c.js.map → RoleDetailPage-BQffUSnt.js.map} +1 -1
  143. package/dist/chunks/{RoleDetailPage-CiRVxxIP.js → RoleDetailPage-JTm5lD1_.js} +2 -2
  144. package/dist/chunks/{RoleDetailPage-CiRVxxIP.js.map → RoleDetailPage-JTm5lD1_.js.map} +1 -1
  145. package/dist/chunks/{RolesPage-Pm-RN3lP.js → RolesPage-B9rRzciI.js} +2 -2
  146. package/dist/chunks/{RolesPage-Pm-RN3lP.js.map → RolesPage-B9rRzciI.js.map} +1 -1
  147. package/dist/chunks/{RolesPage-Cb8joqdJ.js → RolesPage-BN8_zMOC.js} +2 -2
  148. package/dist/chunks/{RolesPage-Cb8joqdJ.js.map → RolesPage-BN8_zMOC.js.map} +1 -1
  149. package/dist/chunks/{SlaConfigPage-B86McKM6.js → SlaConfigPage-B7kZNig4.js} +2 -2
  150. package/dist/chunks/{SlaConfigPage-B86McKM6.js.map → SlaConfigPage-B7kZNig4.js.map} +1 -1
  151. package/dist/chunks/{SlaConfigPage-BY7gvYU6.js → SlaConfigPage-okvZfA_K.js} +2 -2
  152. package/dist/chunks/{SlaConfigPage-BY7gvYU6.js.map → SlaConfigPage-okvZfA_K.js.map} +1 -1
  153. package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js → SupportPermissionsPage-DGAPqJbl.js} +2 -2
  154. package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js.map → SupportPermissionsPage-DGAPqJbl.js.map} +1 -1
  155. package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js → SupportPermissionsPage-Dg_wLOme.js} +2 -2
  156. package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js.map → SupportPermissionsPage-Dg_wLOme.js.map} +1 -1
  157. package/dist/chunks/{TemplatesPage-BDguJ401.js → TemplatesPage-DT9fhlAU.js} +2 -2
  158. package/dist/chunks/{TemplatesPage-BDguJ401.js.map → TemplatesPage-DT9fhlAU.js.map} +1 -1
  159. package/dist/chunks/{TemplatesPage-DdnGgioU.js → TemplatesPage-DiEk538p.js} +2 -2
  160. package/dist/chunks/{TemplatesPage-DdnGgioU.js.map → TemplatesPage-DiEk538p.js.map} +1 -1
  161. package/dist/chunks/{TenantCard-ffwWsgFQ.js → TenantCard-BbSYk9_Z.js} +2 -2
  162. package/dist/chunks/{TenantCard-ffwWsgFQ.js.map → TenantCard-BbSYk9_Z.js.map} +1 -1
  163. package/dist/chunks/{TenantCard-CUjb6og9.js → TenantCard-CEkiKxcZ.js} +2 -2
  164. package/dist/chunks/{TenantCard-CUjb6og9.js.map → TenantCard-CEkiKxcZ.js.map} +1 -1
  165. package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js → TenantScopeSelector-BWfYxvEa.js} +2 -2
  166. package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js.map → TenantScopeSelector-BWfYxvEa.js.map} +1 -1
  167. package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js → TenantScopeSelector-D-BKgQPV.js} +2 -2
  168. package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js.map → TenantScopeSelector-D-BKgQPV.js.map} +1 -1
  169. package/dist/chunks/{TicketDetailPage-GOh9GX7E.js → TicketDetailPage-C1mNS9Up.js} +2 -2
  170. package/dist/chunks/{TicketDetailPage-GOh9GX7E.js.map → TicketDetailPage-C1mNS9Up.js.map} +1 -1
  171. package/dist/chunks/{TicketDetailPage-Du8WMyqf.js → TicketDetailPage-ieVDRh42.js} +2 -2
  172. package/dist/chunks/{TicketDetailPage-Du8WMyqf.js.map → TicketDetailPage-ieVDRh42.js.map} +1 -1
  173. package/dist/chunks/{TicketsPage-Bqd6moQy.js → TicketsPage-CnuWsnIW.js} +2 -2
  174. package/dist/chunks/{TicketsPage-Bqd6moQy.js.map → TicketsPage-CnuWsnIW.js.map} +1 -1
  175. package/dist/chunks/{TicketsPage-WdU4Bb7M.js → TicketsPage-jjyY15_D.js} +2 -2
  176. package/dist/chunks/{TicketsPage-WdU4Bb7M.js.map → TicketsPage-jjyY15_D.js.map} +1 -1
  177. package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js → UserCreateTicketPage-B8Tvf-ag.js} +2 -2
  178. package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js.map → UserCreateTicketPage-B8Tvf-ag.js.map} +1 -1
  179. package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js → UserCreateTicketPage-DnOsDlfO.js} +2 -2
  180. package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js.map → UserCreateTicketPage-DnOsDlfO.js.map} +1 -1
  181. package/dist/chunks/{UserDashboardPage-BP5WeXPS.js → UserDashboardPage-BrtkJ-NB.js} +2 -2
  182. package/dist/chunks/{UserDashboardPage-BP5WeXPS.js.map → UserDashboardPage-BrtkJ-NB.js.map} +1 -1
  183. package/dist/chunks/{UserDashboardPage-B53C8fUq.js → UserDashboardPage-KLB5CQP5.js} +2 -2
  184. package/dist/chunks/{UserDashboardPage-B53C8fUq.js.map → UserDashboardPage-KLB5CQP5.js.map} +1 -1
  185. package/dist/chunks/{UserDetailPage-B110bmGX.js → UserDetailPage-U7smBQoF.js} +5 -5
  186. package/dist/chunks/{UserDetailPage-B110bmGX.js.map → UserDetailPage-U7smBQoF.js.map} +1 -1
  187. package/dist/chunks/{UserDetailPage-CV2VCE46.js → UserDetailPage-_J6lcKAU.js} +2 -2
  188. package/dist/chunks/{UserDetailPage-CV2VCE46.js.map → UserDetailPage-_J6lcKAU.js.map} +1 -1
  189. package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js → UserTicketDetailPage-CWoYQgH-.js} +2 -2
  190. package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js.map → UserTicketDetailPage-CWoYQgH-.js.map} +1 -1
  191. package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js → UserTicketDetailPage-DkufSlvZ.js} +2 -2
  192. package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js.map → UserTicketDetailPage-DkufSlvZ.js.map} +1 -1
  193. package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js → UsersGroupsPage-C38s2-Rq.js} +3 -3
  194. package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js.map → UsersGroupsPage-C38s2-Rq.js.map} +1 -1
  195. package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js → UsersGroupsPage-Dq3rAteo.js} +2 -2
  196. package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js.map → UsersGroupsPage-Dq3rAteo.js.map} +1 -1
  197. package/dist/chunks/{UsersPage-Bg7033pp.js → UsersPage-B5C5KEUR.js} +2 -2
  198. package/dist/chunks/{UsersPage-Bg7033pp.js.map → UsersPage-B5C5KEUR.js.map} +1 -1
  199. package/dist/chunks/{UsersPage-TYAfwPY1.js → UsersPage-CXC9Hvq6.js} +2 -2
  200. package/dist/chunks/{UsersPage-TYAfwPY1.js.map → UsersPage-CXC9Hvq6.js.map} +1 -1
  201. package/dist/chunks/{accessRequestsApi-DZeDvzwv.js → accessRequestsApi-B-4TJ5_U.js} +2 -2
  202. package/dist/chunks/{accessRequestsApi-DZeDvzwv.js.map → accessRequestsApi-B-4TJ5_U.js.map} +1 -1
  203. package/dist/chunks/{accessRequestsApi-ZXFPCid2.js → accessRequestsApi-DZSfThpd.js} +2 -2
  204. package/dist/chunks/{accessRequestsApi-ZXFPCid2.js.map → accessRequestsApi-DZSfThpd.js.map} +1 -1
  205. package/dist/chunks/{aiApi-CsH8DXgs.js → aiApi-B20Teu2v.js} +2 -2
  206. package/dist/chunks/{aiApi-CsH8DXgs.js.map → aiApi-B20Teu2v.js.map} +1 -1
  207. package/dist/chunks/{aiApi-CVPzFTXa.js → aiApi-DMGz-RPM.js} +2 -2
  208. package/dist/chunks/{aiApi-CVPzFTXa.js.map → aiApi-DMGz-RPM.js.map} +1 -1
  209. package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js → applicationAnalyticsApi-Bwa75Fzd.js} +2 -2
  210. package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js.map → applicationAnalyticsApi-Bwa75Fzd.js.map} +1 -1
  211. package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js → applicationAnalyticsApi-CLBqRPfN.js} +2 -2
  212. package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js.map → applicationAnalyticsApi-CLBqRPfN.js.map} +1 -1
  213. package/dist/chunks/{groupsApi-BgCk2fsp.js → groupsApi-QzXI-5xu.js} +2 -2
  214. package/dist/chunks/{groupsApi-BgCk2fsp.js.map → groupsApi-QzXI-5xu.js.map} +1 -1
  215. package/dist/chunks/{groupsApi-BIbG665N.js → groupsApi-hB9kSWEd.js} +2 -2
  216. package/dist/chunks/{groupsApi-BIbG665N.js.map → groupsApi-hB9kSWEd.js.map} +1 -1
  217. package/dist/chunks/{index-Cb3LotuT.js → index--NGcBYUu.js} +3 -3
  218. package/dist/chunks/{index-Cb3LotuT.js.map → index--NGcBYUu.js.map} +1 -1
  219. package/dist/chunks/{index-C33zcyF4.js → index--aPwOFjF.js} +2 -2
  220. package/dist/chunks/{index-C33zcyF4.js.map → index--aPwOFjF.js.map} +1 -1
  221. package/dist/chunks/{index-sMr9qND_.js → index-0VrOtwP0.js} +2 -2
  222. package/dist/chunks/{index-sMr9qND_.js.map → index-0VrOtwP0.js.map} +1 -1
  223. package/dist/chunks/{index-DDKetfKq.js → index-37U271aw.js} +2 -2
  224. package/dist/chunks/{index-DDKetfKq.js.map → index-37U271aw.js.map} +1 -1
  225. package/dist/chunks/{index-B9fS7ir6.js → index-B7qZTuQ-.js} +2 -2
  226. package/dist/chunks/{index-B9fS7ir6.js.map → index-B7qZTuQ-.js.map} +1 -1
  227. package/dist/chunks/{index-CdjBY7L8.js → index-Bedzmqr-.js} +2 -2
  228. package/dist/chunks/{index-CdjBY7L8.js.map → index-Bedzmqr-.js.map} +1 -1
  229. package/dist/chunks/{index-CHG_O1fS.js → index-Betxo5g5.js} +2 -2
  230. package/dist/chunks/{index-CHG_O1fS.js.map → index-Betxo5g5.js.map} +1 -1
  231. package/dist/chunks/{index-jiGu-H8x.js → index-BmaJz475.js} +2 -2
  232. package/dist/chunks/{index-jiGu-H8x.js.map → index-BmaJz475.js.map} +1 -1
  233. package/dist/chunks/{index-C53JoVNk.js → index-Buhqag3v.js} +2 -2
  234. package/dist/chunks/{index-C53JoVNk.js.map → index-Buhqag3v.js.map} +1 -1
  235. package/dist/chunks/{index-DO0Rw7hX.js → index-C3VxlfKq.js} +2 -2
  236. package/dist/chunks/{index-DO0Rw7hX.js.map → index-C3VxlfKq.js.map} +1 -1
  237. package/dist/chunks/{index-CSQ60fpG.js → index-CgpRo8Oe.js} +2 -2
  238. package/dist/chunks/{index-CSQ60fpG.js.map → index-CgpRo8Oe.js.map} +1 -1
  239. package/dist/chunks/{index-B-e-ELsf.js → index-DOY0w8Iu.js} +8 -8
  240. package/dist/chunks/{index-B-e-ELsf.js.map → index-DOY0w8Iu.js.map} +1 -1
  241. package/dist/chunks/{index-D2REDIRX.js → index-DwuvIOrQ.js} +2 -2
  242. package/dist/chunks/{index-D2REDIRX.js.map → index-DwuvIOrQ.js.map} +1 -1
  243. package/dist/chunks/{index-DCcl7Qof.js → index-DzedSLdI.js} +2 -2
  244. package/dist/chunks/{index-DCcl7Qof.js.map → index-DzedSLdI.js.map} +1 -1
  245. package/dist/chunks/{index-2wUhd9Lu.js → index-IgLVXPg8.js} +10 -10
  246. package/dist/chunks/index-IgLVXPg8.js.map +1 -0
  247. package/dist/chunks/{index-CwSaRXXg.js → index-lpIzhufD.js} +1916 -1900
  248. package/dist/chunks/index-lpIzhufD.js.map +1 -0
  249. package/dist/chunks/{index-Cuwn2q-f.js → index-mLUKwbGl.js} +4 -4
  250. package/dist/chunks/{index-Cuwn2q-f.js.map → index-mLUKwbGl.js.map} +1 -1
  251. package/dist/chunks/{index-B0mk2tNY.js → index-tO6MMIFB.js} +2 -2
  252. package/dist/chunks/{index-B0mk2tNY.js.map → index-tO6MMIFB.js.map} +1 -1
  253. package/dist/chunks/{tenantIconMap-BpNANQ5s.js → tenantIconMap-BQD9byc8.js} +2 -2
  254. package/dist/chunks/{tenantIconMap-BpNANQ5s.js.map → tenantIconMap-BQD9byc8.js.map} +1 -1
  255. package/dist/chunks/{tenantIconMap-DtdUgvJO.js → tenantIconMap-CTMuSt18.js} +2 -2
  256. package/dist/chunks/{tenantIconMap-DtdUgvJO.js.map → tenantIconMap-CTMuSt18.js.map} +1 -1
  257. package/dist/chunks/{ticketingApi-Bu4rKwLl.js → ticketingApi-BNIdox5t.js} +2 -2
  258. package/dist/chunks/{ticketingApi-Bu4rKwLl.js.map → ticketingApi-BNIdox5t.js.map} +1 -1
  259. package/dist/chunks/{ticketingApi-r4Avm9iS.js → ticketingApi-J0vC_t7r.js} +2 -2
  260. package/dist/chunks/{ticketingApi-r4Avm9iS.js.map → ticketingApi-J0vC_t7r.js.map} +1 -1
  261. package/dist/chunks/{useAccessRequests-B9bF4swg.js → useAccessRequests-DCNNLnxk.js} +3 -3
  262. package/dist/chunks/{useAccessRequests-B9bF4swg.js.map → useAccessRequests-DCNNLnxk.js.map} +1 -1
  263. package/dist/chunks/{useAccessRequests-JyPUX3Om.js → useAccessRequests-DT7X4FAK.js} +2 -2
  264. package/dist/chunks/{useAccessRequests-JyPUX3Om.js.map → useAccessRequests-DT7X4FAK.js.map} +1 -1
  265. package/dist/chunks/{useUserAccessRequests-DjPQenC2.js → useUserAccessRequests-BYbmG4c7.js} +2 -2
  266. package/dist/chunks/{useUserAccessRequests-DjPQenC2.js.map → useUserAccessRequests-BYbmG4c7.js.map} +1 -1
  267. package/dist/chunks/{useUserAccessRequests-BB6FHW14.js → useUserAccessRequests-CylKxRN6.js} +2 -2
  268. package/dist/chunks/{useUserAccessRequests-BB6FHW14.js.map → useUserAccessRequests-CylKxRN6.js.map} +1 -1
  269. package/dist/hooks/useCollapsibleState.d.ts +5 -2
  270. package/dist/hooks/useCollapsibleState.d.ts.map +1 -1
  271. package/dist/i18n/config.d.ts +1 -0
  272. package/dist/i18n/config.d.ts.map +1 -1
  273. package/dist/main.d.ts +0 -1
  274. package/dist/main.d.ts.map +1 -1
  275. package/dist/smartstack.cjs +1 -1
  276. package/dist/smartstack.js +1 -1
  277. package/dist/utils/permissions.d.ts.map +1 -1
  278. package/package.json +1 -1
  279. package/dist/chunks/index-2wUhd9Lu.js.map +0 -1
  280. package/dist/chunks/index-CwSaRXXg.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"PermissionDetailPage-Dh8v7mGj.js","sources":["../../src/pages/platform/administration/permissions/PermissionDetailPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback, type ReactNode } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useParams, useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n ArrowLeft,\r\n Shield,\r\n Users,\r\n Loader2,\r\n Lock,\r\n Eye,\r\n Plus,\r\n Edit,\r\n Trash2,\r\n UserPlus,\r\n Play,\r\n Layers,\r\n Calendar,\r\n Copy,\r\n CheckCircle,\r\n Info,\r\n Building2\r\n} from 'lucide-react';\r\nimport {\r\n adminApi,\r\n type PermissionDetailDto,\r\n} from '@/services/api/adminApi';\r\n\r\ntype TabId = 'roles' | 'entraGroups' | 'users';\r\n\r\nconst ACTION_ICONS: Record<string, React.ReactNode> = {\r\n '*': <Shield className=\"h-4 w-4\" />,\r\n Read: <Eye className=\"h-4 w-4\" />,\r\n Create: <Plus className=\"h-4 w-4\" />,\r\n Update: <Edit className=\"h-4 w-4\" />,\r\n Delete: <Trash2 className=\"h-4 w-4\" />,\r\n Assign: <UserPlus className=\"h-4 w-4\" />,\r\n Execute: <Play className=\"h-4 w-4\" />,\r\n};\r\n\r\nconst ACTION_COLORS: Record<string, string> = {\r\n '*': 'bg-[var(--accent-bg)] text-[var(--accent-text)] border-[var(--accent-border)]',\r\n Read: 'bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)]',\r\n Create: 'bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]',\r\n Update: 'bg-[var(--warning-bg)] text-[var(--warning-text)] border-[var(--warning-border)]',\r\n Delete: 'bg-[var(--error-bg)] text-[var(--error-text)] border-[var(--error-border)]',\r\n Assign: 'bg-[var(--accent-bg)] text-[var(--accent-text)] border-[var(--accent-border)]',\r\n Execute: 'bg-[var(--warning-bg)] text-[var(--warning-text)] border-[var(--warning-border)]',\r\n};\r\n\r\nconst LEVEL_COLORS: Record<string, string> = {\r\n Context: 'bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300',\r\n Application: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300',\r\n Module: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300',\r\n Section: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-300',\r\n Resource: 'bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-300',\r\n};\r\n\r\nexport function PermissionDetailPage(): ReactElement {\r\n const { t } = useTranslation(['admin', 'common']);\r\n const { id: permissionId } = useParams<{ id: string }>();\r\n const navigate = useNavigate();\r\n\r\n const [permission, setPermission] = useState<PermissionDetailDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [copied, setCopied] = useState(false);\r\n const [activeTab, setActiveTab] = useState<TabId>('roles');\r\n\r\n const loadPermission = useCallback(async () => {\r\n if (!permissionId) return;\r\n try {\r\n setLoading(true);\r\n const data = await adminApi.permissions.getById(permissionId);\r\n setPermission(data);\r\n } catch (err) {\r\n console.error('Failed to load permission:', err);\r\n setError(t('admin:permissionDetail.errors.loadFailed', 'Failed to load permission'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [permissionId, t]);\r\n\r\n useEffect(() => {\r\n loadPermission();\r\n }, [loadPermission]);\r\n\r\n const handleCopyPath = async () => {\r\n if (permission?.path) {\r\n await navigator.clipboard.writeText(permission.path);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n }\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !permission) {\r\n return (\r\n <div className=\"p-6\">\r\n <div className=\"bg-[var(--error-bg)] border border-[var(--error-border)] rounded-lg p-4\">\r\n <p className=\"text-[var(--error-text)]\">{error || t('admin:permissionDetail.errors.notFound', 'Permission not found')}</p>\r\n <button\r\n onClick={() => navigate('/administration/permissions/permissions')}\r\n className=\"mt-4 text-sm text-[var(--color-accent-500)] hover:underline\"\r\n >\r\n {t('common:buttons.back')}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n const actionKey = permission.action || '*';\r\n const actionColor = ACTION_COLORS[actionKey] || ACTION_COLORS['*'];\r\n const actionIcon = ACTION_ICONS[actionKey] || ACTION_ICONS['*'];\r\n const levelColor = LEVEL_COLORS[permission.level] || 'bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-200';\r\n\r\n return (\r\n <div className=\"p-6 space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('admin:header.title'), href: '/administration' },\r\n { label: t('admin:permissions.title', 'Permissions'), href: '/administration/permissions/permissions' },\r\n { label: permission?.path || 'Detail' }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center gap-4\">\r\n <button\r\n onClick={() => navigate('/administration/permissions/permissions')}\r\n className=\"p-2 hover:bg-[var(--bg-hover)] rounded-lg transition-colors\"\r\n >\r\n <ArrowLeft className=\"h-5 w-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3\">\r\n <Lock className=\"h-6 w-6 text-[var(--color-accent-500)]\" />\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('admin:permissionDetail.title', 'Permission Detail')}\r\n </h1>\r\n </div>\r\n <div className=\"flex items-center gap-2 mt-2\">\r\n <code className=\"px-3 py-1.5 bg-[var(--bg-tertiary)] border border-[var(--border-color)] rounded-lg text-sm font-mono text-[var(--text-primary)]\">\r\n {permission.path}\r\n </code>\r\n <button\r\n onClick={handleCopyPath}\r\n className=\"p-1.5 hover:bg-[var(--bg-hover)] rounded transition-colors\"\r\n title={t('common:buttons.copy')}\r\n >\r\n {copied ? (\r\n <CheckCircle className=\"h-4 w-4 text-[var(--success-text)]\" />\r\n ) : (\r\n <Copy className=\"h-4 w-4 text-[var(--text-muted)]\" />\r\n )}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Permission Info Card */}\r\n <div className=\"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] p-6\">\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2\">\r\n <Info className=\"h-5 w-5 text-[var(--color-accent-500)]\" />\r\n {t('admin:permissionDetail.info', 'Information')}\r\n </h2>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n {/* Level */}\r\n <div className=\"space-y-1\">\r\n <label className=\"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wide\">\r\n {t('admin:permissions.level', 'Level')}\r\n </label>\r\n <div>\r\n <span className={`inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium ${levelColor}`}>\r\n <Layers className=\"h-3 w-3\" />\r\n {permission.level}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Action */}\r\n <div className=\"space-y-1\">\r\n <label className=\"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wide\">\r\n {t('admin:permissions.action', 'Action')}\r\n </label>\r\n <div>\r\n <span className={`inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium border ${actionColor}`}>\r\n {actionIcon}\r\n {permission.action || t('admin:permissions.wildcard', 'Wildcard (*)')}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Wildcard */}\r\n <div className=\"space-y-1\">\r\n <label className=\"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wide\">\r\n {t('admin:permissions.type', 'Type')}\r\n </label>\r\n <div>\r\n {permission.isWildcard ? (\r\n <span className=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium bg-[var(--accent-bg)] text-[var(--accent-text)] border border-[var(--accent-border)]\">\r\n <Shield className=\"h-3 w-3\" />\r\n {t('admin:permissions.wildcardType', 'Wildcard')}\r\n </span>\r\n ) : (\r\n <span className=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium bg-[var(--bg-secondary)] text-[var(--text-secondary)] border border-[var(--border-color)]\">\r\n {t('admin:permissions.specificType', 'Specific')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Created At */}\r\n <div className=\"space-y-1\">\r\n <label className=\"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wide\">\r\n {t('admin:permissions.createdAt', 'Created')}\r\n </label>\r\n <div className=\"flex items-center gap-1.5 text-sm text-[var(--text-secondary)]\">\r\n <Calendar className=\"h-4 w-4\" />\r\n {new Date(permission.createdAt).toLocaleDateString()}\r\n </div>\r\n </div>\r\n\r\n {/* Description */}\r\n {permission.description && (\r\n <div className=\"space-y-1 md:col-span-2\">\r\n <label className=\"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wide\">\r\n {t('admin:permissions.description', 'Description')}\r\n </label>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{permission.description}</p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Tabs */}\r\n <div className=\"border-b border-[var(--border-color)]\">\r\n <div className=\"flex gap-1\">\r\n {([\r\n { id: 'roles', label: t('admin:permissionDetail.tabs.roles', 'Rôles'), count: permission.roles.length, icon: <Shield className=\"w-4 h-4\" /> },\r\n { id: 'entraGroups', label: t('admin:permissionDetail.tabs.entraGroups', 'Groupes AAD'), count: permission.entraGroups?.length ?? 0, icon: <Building2 className=\"w-4 h-4\" /> },\r\n { id: 'users', label: t('admin:permissionDetail.tabs.users', 'Utilisateurs'), count: permission.users.length, icon: <Users className=\"w-4 h-4\" /> },\r\n ] satisfies Array<{ id: TabId; label: string; count: number; icon: ReactNode }>).map((tab) => (\r\n <button\r\n key={tab.id}\r\n onClick={() => setActiveTab(tab.id)}\r\n className={`flex items-center gap-2 px-4 py-3 text-sm font-medium border-b-2 transition-colors ${\r\n activeTab === tab.id\r\n ? 'border-[var(--color-accent-500)] text-[var(--color-accent-500)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]'\r\n }`}\r\n >\r\n {tab.icon}\r\n {tab.label}\r\n <span className={`px-2 py-0.5 text-xs rounded-full ${\r\n activeTab === tab.id\r\n ? 'bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-tertiary)]'\r\n }`}>\r\n {tab.count}\r\n </span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div className=\"min-h-[400px]\">\r\n {/* Roles Tab */}\r\n {activeTab === 'roles' && (\r\n <div className=\"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] p-6\">\r\n {permission.roles.length === 0 ? (\r\n <div className=\"text-center py-8 text-[var(--text-muted)]\">\r\n <Shield className=\"h-12 w-12 mx-auto mb-3 opacity-30\" />\r\n <p>{t('admin:permissionDetail.noRoles', 'No roles have this permission')}</p>\r\n </div>\r\n ) : (\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead className=\"bg-[var(--bg-secondary)]\">\r\n <tr>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('admin:roles.name', 'Nom')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('common:type', 'Type')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {permission.roles.map((role) => (\r\n <tr\r\n key={role.id}\r\n onClick={() => navigate(`/administration/permissions/roles/${role.id}`)}\r\n className=\"hover:bg-[var(--bg-hover)] cursor-pointer transition-colors\"\r\n >\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-8 h-8 rounded-full flex items-center justify-center bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]\">\r\n <Shield className=\"w-4 h-4\" />\r\n </div>\r\n <span className=\"font-medium text-[var(--text-primary)]\">{role.name}</span>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n {role.isSystem ? (\r\n <span className=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium bg-[var(--info-bg)] text-[var(--info-text)] border border-[var(--info-border)]\">\r\n <Lock className=\"h-3 w-3\" />\r\n {t('admin:roles.system', 'Système')}\r\n </span>\r\n ) : (\r\n <span className=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium bg-[var(--bg-secondary)] text-[var(--text-secondary)] border border-[var(--border-color)]\">\r\n {t('admin:roles.custom', 'Personnalisé')}\r\n </span>\r\n )}\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Entra Groups Tab */}\r\n {activeTab === 'entraGroups' && (\r\n <div className=\"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] p-6\">\r\n {(!permission.entraGroups || permission.entraGroups.length === 0) ? (\r\n <div className=\"text-center py-8 text-[var(--text-muted)]\">\r\n <Building2 className=\"h-12 w-12 mx-auto mb-3 opacity-30\" />\r\n <p>{t('admin:permissionDetail.noEntraGroups', 'Aucun groupe AAD n\\'a cette permission')}</p>\r\n </div>\r\n ) : (\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead className=\"bg-[var(--bg-secondary)]\">\r\n <tr>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('entra:groups.groupName', 'Nom du groupe')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('common:type', 'Type')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('entra:groups.members', 'Membres')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('admin:permissionDetail.viaRoles', 'Via Rôles')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {permission.entraGroups.map((group) => (\r\n <tr\r\n key={group.id}\r\n onClick={() => navigate(`/administration/entra/groups/${group.id}`)}\r\n className=\"hover:bg-[var(--bg-hover)] cursor-pointer transition-colors\"\r\n >\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`w-8 h-8 rounded-full flex items-center justify-center ${\r\n group.isSecurityGroup\r\n ? 'bg-blue-500/10 text-blue-500'\r\n : 'bg-purple-500/10 text-purple-500'\r\n }`}>\r\n {group.isSecurityGroup ? (\r\n <Shield className=\"w-4 h-4\" />\r\n ) : (\r\n <Building2 className=\"w-4 h-4\" />\r\n )}\r\n </div>\r\n <span className=\"font-medium text-[var(--text-primary)]\">{group.displayName}</span>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className={`px-2 py-1 text-xs rounded-[var(--radius-badge)] ${\r\n group.isSecurityGroup\r\n ? 'bg-blue-500/10 text-blue-500'\r\n : 'bg-purple-500/10 text-purple-500'\r\n }`}>\r\n {group.isSecurityGroup ? t('entra:groups.securityGroup', 'Sécurité') : t('entra:groups.distributionGroup', 'Distribution')}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)]\">\r\n <span className=\"flex items-center gap-1\">\r\n <Users className=\"w-4 h-4\" />\r\n {group.memberCount}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex flex-wrap gap-1\">\r\n {group.roleNames.map((roleName) => (\r\n <span\r\n key={roleName}\r\n className=\"inline-flex items-center gap-1 px-2 py-0.5 bg-[var(--bg-tertiary)] rounded text-xs text-[var(--text-secondary)]\"\r\n >\r\n <Shield className=\"h-2.5 w-2.5\" />\r\n {roleName}\r\n </span>\r\n ))}\r\n </div>\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Users Tab */}\r\n {activeTab === 'users' && (\r\n <div className=\"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] p-6\">\r\n {permission.users.length === 0 ? (\r\n <div className=\"text-center py-8 text-[var(--text-muted)]\">\r\n <Users className=\"h-12 w-12 mx-auto mb-3 opacity-30\" />\r\n <p>{t('admin:permissionDetail.noUsers', 'No users have this permission')}</p>\r\n </div>\r\n ) : (\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead className=\"bg-[var(--bg-secondary)]\">\r\n <tr>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('admin:users.name', 'Name')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('admin:users.email', 'Email')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('admin:permissionDetail.viaRoles', 'Via Roles')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {permission.users.map((user) => (\r\n <tr\r\n key={user.id}\r\n onClick={() => navigate(`/administration/users/${user.id}`)}\r\n className=\"hover:bg-[var(--bg-hover)] cursor-pointer transition-colors\"\r\n >\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"h-8 w-8 rounded-full bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] flex items-center justify-center\">\r\n <span className=\"text-sm font-medium text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)]\">\r\n {user.firstName.charAt(0)}{user.lastName.charAt(0)}\r\n </span>\r\n </div>\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {user.firstName} {user.lastName}\r\n </span>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)]\">\r\n {user.email}\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex flex-wrap gap-1\">\r\n {user.roleNames.map((roleName) => (\r\n <span\r\n key={roleName}\r\n className=\"inline-flex items-center gap-1 px-2 py-0.5 bg-[var(--bg-tertiary)] rounded text-xs text-[var(--text-secondary)]\"\r\n >\r\n <Shield className=\"h-2.5 w-2.5\" />\r\n {roleName}\r\n </span>\r\n ))}\r\n </div>\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ACTION_ICONS","jsx","Shield","Eye","Plus","Edit","Trash2","UserPlus","Play","ACTION_COLORS","LEVEL_COLORS","PermissionDetailPage","t","useTranslation","permissionId","useParams","navigate","useNavigate","permission","setPermission","useState","loading","setLoading","error","setError","copied","setCopied","activeTab","setActiveTab","loadPermission","useCallback","data","adminApi","err","useEffect","handleCopyPath","Loader2","jsxs","actionKey","actionColor","actionIcon","levelColor","Breadcrumb","ArrowLeft","Lock","CheckCircle","Copy","Info","Layers","Calendar","Building2","Users","tab","role","group","roleName","user"],"mappings":"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"}
1
+ {"version":3,"file":"PermissionDetailPage-C5K17ydY.js","sources":["../../src/pages/platform/administration/permissions/PermissionDetailPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback, type ReactNode } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useParams, useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n ArrowLeft,\r\n Shield,\r\n Users,\r\n Loader2,\r\n Lock,\r\n Eye,\r\n Plus,\r\n Edit,\r\n Trash2,\r\n UserPlus,\r\n Play,\r\n Layers,\r\n Calendar,\r\n Copy,\r\n CheckCircle,\r\n Info,\r\n Building2\r\n} from 'lucide-react';\r\nimport {\r\n adminApi,\r\n type PermissionDetailDto,\r\n} from '@/services/api/adminApi';\r\n\r\ntype TabId = 'roles' | 'entraGroups' | 'users';\r\n\r\nconst ACTION_ICONS: Record<string, React.ReactNode> = {\r\n '*': <Shield className=\"h-4 w-4\" />,\r\n Read: <Eye className=\"h-4 w-4\" />,\r\n Create: <Plus className=\"h-4 w-4\" />,\r\n Update: <Edit className=\"h-4 w-4\" />,\r\n Delete: <Trash2 className=\"h-4 w-4\" />,\r\n Assign: <UserPlus className=\"h-4 w-4\" />,\r\n Execute: <Play className=\"h-4 w-4\" />,\r\n};\r\n\r\nconst ACTION_COLORS: Record<string, string> = {\r\n '*': 'bg-[var(--accent-bg)] text-[var(--accent-text)] border-[var(--accent-border)]',\r\n Read: 'bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)]',\r\n Create: 'bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]',\r\n Update: 'bg-[var(--warning-bg)] text-[var(--warning-text)] border-[var(--warning-border)]',\r\n Delete: 'bg-[var(--error-bg)] text-[var(--error-text)] border-[var(--error-border)]',\r\n Assign: 'bg-[var(--accent-bg)] text-[var(--accent-text)] border-[var(--accent-border)]',\r\n Execute: 'bg-[var(--warning-bg)] text-[var(--warning-text)] border-[var(--warning-border)]',\r\n};\r\n\r\nconst LEVEL_COLORS: Record<string, string> = {\r\n Context: 'bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300',\r\n Application: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300',\r\n Module: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300',\r\n Section: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-300',\r\n Resource: 'bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-300',\r\n};\r\n\r\nexport function PermissionDetailPage(): ReactElement {\r\n const { t } = useTranslation(['admin', 'common']);\r\n const { id: permissionId } = useParams<{ id: string }>();\r\n const navigate = useNavigate();\r\n\r\n const [permission, setPermission] = useState<PermissionDetailDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [copied, setCopied] = useState(false);\r\n const [activeTab, setActiveTab] = useState<TabId>('roles');\r\n\r\n const loadPermission = useCallback(async () => {\r\n if (!permissionId) return;\r\n try {\r\n setLoading(true);\r\n const data = await adminApi.permissions.getById(permissionId);\r\n setPermission(data);\r\n } catch (err) {\r\n console.error('Failed to load permission:', err);\r\n setError(t('admin:permissionDetail.errors.loadFailed', 'Failed to load permission'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [permissionId, t]);\r\n\r\n useEffect(() => {\r\n loadPermission();\r\n }, [loadPermission]);\r\n\r\n const handleCopyPath = async () => {\r\n if (permission?.path) {\r\n await navigator.clipboard.writeText(permission.path);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n }\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !permission) {\r\n return (\r\n <div className=\"p-6\">\r\n <div className=\"bg-[var(--error-bg)] border border-[var(--error-border)] rounded-lg p-4\">\r\n <p className=\"text-[var(--error-text)]\">{error || t('admin:permissionDetail.errors.notFound', 'Permission not found')}</p>\r\n <button\r\n onClick={() => navigate('/administration/permissions/permissions')}\r\n className=\"mt-4 text-sm text-[var(--color-accent-500)] hover:underline\"\r\n >\r\n {t('common:buttons.back')}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n const actionKey = permission.action || '*';\r\n const actionColor = ACTION_COLORS[actionKey] || ACTION_COLORS['*'];\r\n const actionIcon = ACTION_ICONS[actionKey] || ACTION_ICONS['*'];\r\n const levelColor = LEVEL_COLORS[permission.level] || 'bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-200';\r\n\r\n return (\r\n <div className=\"p-6 space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('admin:header.title'), href: '/administration' },\r\n { label: t('admin:permissions.title', 'Permissions'), href: '/administration/permissions/permissions' },\r\n { label: permission?.path || 'Detail' }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center gap-4\">\r\n <button\r\n onClick={() => navigate('/administration/permissions/permissions')}\r\n className=\"p-2 hover:bg-[var(--bg-hover)] rounded-lg transition-colors\"\r\n >\r\n <ArrowLeft className=\"h-5 w-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3\">\r\n <Lock className=\"h-6 w-6 text-[var(--color-accent-500)]\" />\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('admin:permissionDetail.title', 'Permission Detail')}\r\n </h1>\r\n </div>\r\n <div className=\"flex items-center gap-2 mt-2\">\r\n <code className=\"px-3 py-1.5 bg-[var(--bg-tertiary)] border border-[var(--border-color)] rounded-lg text-sm font-mono text-[var(--text-primary)]\">\r\n {permission.path}\r\n </code>\r\n <button\r\n onClick={handleCopyPath}\r\n className=\"p-1.5 hover:bg-[var(--bg-hover)] rounded transition-colors\"\r\n title={t('common:buttons.copy')}\r\n >\r\n {copied ? (\r\n <CheckCircle className=\"h-4 w-4 text-[var(--success-text)]\" />\r\n ) : (\r\n <Copy className=\"h-4 w-4 text-[var(--text-muted)]\" />\r\n )}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Permission Info Card */}\r\n <div className=\"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] p-6\">\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2\">\r\n <Info className=\"h-5 w-5 text-[var(--color-accent-500)]\" />\r\n {t('admin:permissionDetail.info', 'Information')}\r\n </h2>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n {/* Level */}\r\n <div className=\"space-y-1\">\r\n <label className=\"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wide\">\r\n {t('admin:permissions.level', 'Level')}\r\n </label>\r\n <div>\r\n <span className={`inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium ${levelColor}`}>\r\n <Layers className=\"h-3 w-3\" />\r\n {permission.level}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Action */}\r\n <div className=\"space-y-1\">\r\n <label className=\"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wide\">\r\n {t('admin:permissions.action', 'Action')}\r\n </label>\r\n <div>\r\n <span className={`inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium border ${actionColor}`}>\r\n {actionIcon}\r\n {permission.action || t('admin:permissions.wildcard', 'Wildcard (*)')}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Wildcard */}\r\n <div className=\"space-y-1\">\r\n <label className=\"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wide\">\r\n {t('admin:permissions.type', 'Type')}\r\n </label>\r\n <div>\r\n {permission.isWildcard ? (\r\n <span className=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium bg-[var(--accent-bg)] text-[var(--accent-text)] border border-[var(--accent-border)]\">\r\n <Shield className=\"h-3 w-3\" />\r\n {t('admin:permissions.wildcardType', 'Wildcard')}\r\n </span>\r\n ) : (\r\n <span className=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium bg-[var(--bg-secondary)] text-[var(--text-secondary)] border border-[var(--border-color)]\">\r\n {t('admin:permissions.specificType', 'Specific')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Created At */}\r\n <div className=\"space-y-1\">\r\n <label className=\"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wide\">\r\n {t('admin:permissions.createdAt', 'Created')}\r\n </label>\r\n <div className=\"flex items-center gap-1.5 text-sm text-[var(--text-secondary)]\">\r\n <Calendar className=\"h-4 w-4\" />\r\n {new Date(permission.createdAt).toLocaleDateString()}\r\n </div>\r\n </div>\r\n\r\n {/* Description */}\r\n {permission.description && (\r\n <div className=\"space-y-1 md:col-span-2\">\r\n <label className=\"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wide\">\r\n {t('admin:permissions.description', 'Description')}\r\n </label>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{permission.description}</p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Tabs */}\r\n <div className=\"border-b border-[var(--border-color)]\">\r\n <div className=\"flex gap-1\">\r\n {([\r\n { id: 'roles', label: t('admin:permissionDetail.tabs.roles', 'Rôles'), count: permission.roles.length, icon: <Shield className=\"w-4 h-4\" /> },\r\n { id: 'entraGroups', label: t('admin:permissionDetail.tabs.entraGroups', 'Groupes AAD'), count: permission.entraGroups?.length ?? 0, icon: <Building2 className=\"w-4 h-4\" /> },\r\n { id: 'users', label: t('admin:permissionDetail.tabs.users', 'Utilisateurs'), count: permission.users.length, icon: <Users className=\"w-4 h-4\" /> },\r\n ] satisfies Array<{ id: TabId; label: string; count: number; icon: ReactNode }>).map((tab) => (\r\n <button\r\n key={tab.id}\r\n onClick={() => setActiveTab(tab.id)}\r\n className={`flex items-center gap-2 px-4 py-3 text-sm font-medium border-b-2 transition-colors ${\r\n activeTab === tab.id\r\n ? 'border-[var(--color-accent-500)] text-[var(--color-accent-500)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]'\r\n }`}\r\n >\r\n {tab.icon}\r\n {tab.label}\r\n <span className={`px-2 py-0.5 text-xs rounded-full ${\r\n activeTab === tab.id\r\n ? 'bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-tertiary)]'\r\n }`}>\r\n {tab.count}\r\n </span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div className=\"min-h-[400px]\">\r\n {/* Roles Tab */}\r\n {activeTab === 'roles' && (\r\n <div className=\"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] p-6\">\r\n {permission.roles.length === 0 ? (\r\n <div className=\"text-center py-8 text-[var(--text-muted)]\">\r\n <Shield className=\"h-12 w-12 mx-auto mb-3 opacity-30\" />\r\n <p>{t('admin:permissionDetail.noRoles', 'No roles have this permission')}</p>\r\n </div>\r\n ) : (\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead className=\"bg-[var(--bg-secondary)]\">\r\n <tr>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('admin:roles.name', 'Nom')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('common:type', 'Type')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {permission.roles.map((role) => (\r\n <tr\r\n key={role.id}\r\n onClick={() => navigate(`/administration/permissions/roles/${role.id}`)}\r\n className=\"hover:bg-[var(--bg-hover)] cursor-pointer transition-colors\"\r\n >\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-8 h-8 rounded-full flex items-center justify-center bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]\">\r\n <Shield className=\"w-4 h-4\" />\r\n </div>\r\n <span className=\"font-medium text-[var(--text-primary)]\">{role.name}</span>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n {role.isSystem ? (\r\n <span className=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium bg-[var(--info-bg)] text-[var(--info-text)] border border-[var(--info-border)]\">\r\n <Lock className=\"h-3 w-3\" />\r\n {t('admin:roles.system', 'Système')}\r\n </span>\r\n ) : (\r\n <span className=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium bg-[var(--bg-secondary)] text-[var(--text-secondary)] border border-[var(--border-color)]\">\r\n {t('admin:roles.custom', 'Personnalisé')}\r\n </span>\r\n )}\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Entra Groups Tab */}\r\n {activeTab === 'entraGroups' && (\r\n <div className=\"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] p-6\">\r\n {(!permission.entraGroups || permission.entraGroups.length === 0) ? (\r\n <div className=\"text-center py-8 text-[var(--text-muted)]\">\r\n <Building2 className=\"h-12 w-12 mx-auto mb-3 opacity-30\" />\r\n <p>{t('admin:permissionDetail.noEntraGroups', 'Aucun groupe AAD n\\'a cette permission')}</p>\r\n </div>\r\n ) : (\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead className=\"bg-[var(--bg-secondary)]\">\r\n <tr>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('entra:groups.groupName', 'Nom du groupe')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('common:type', 'Type')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('entra:groups.members', 'Membres')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('admin:permissionDetail.viaRoles', 'Via Rôles')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {permission.entraGroups.map((group) => (\r\n <tr\r\n key={group.id}\r\n onClick={() => navigate(`/administration/entra/groups/${group.id}`)}\r\n className=\"hover:bg-[var(--bg-hover)] cursor-pointer transition-colors\"\r\n >\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`w-8 h-8 rounded-full flex items-center justify-center ${\r\n group.isSecurityGroup\r\n ? 'bg-blue-500/10 text-blue-500'\r\n : 'bg-purple-500/10 text-purple-500'\r\n }`}>\r\n {group.isSecurityGroup ? (\r\n <Shield className=\"w-4 h-4\" />\r\n ) : (\r\n <Building2 className=\"w-4 h-4\" />\r\n )}\r\n </div>\r\n <span className=\"font-medium text-[var(--text-primary)]\">{group.displayName}</span>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className={`px-2 py-1 text-xs rounded-[var(--radius-badge)] ${\r\n group.isSecurityGroup\r\n ? 'bg-blue-500/10 text-blue-500'\r\n : 'bg-purple-500/10 text-purple-500'\r\n }`}>\r\n {group.isSecurityGroup ? t('entra:groups.securityGroup', 'Sécurité') : t('entra:groups.distributionGroup', 'Distribution')}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)]\">\r\n <span className=\"flex items-center gap-1\">\r\n <Users className=\"w-4 h-4\" />\r\n {group.memberCount}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex flex-wrap gap-1\">\r\n {group.roleNames.map((roleName) => (\r\n <span\r\n key={roleName}\r\n className=\"inline-flex items-center gap-1 px-2 py-0.5 bg-[var(--bg-tertiary)] rounded text-xs text-[var(--text-secondary)]\"\r\n >\r\n <Shield className=\"h-2.5 w-2.5\" />\r\n {roleName}\r\n </span>\r\n ))}\r\n </div>\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Users Tab */}\r\n {activeTab === 'users' && (\r\n <div className=\"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] p-6\">\r\n {permission.users.length === 0 ? (\r\n <div className=\"text-center py-8 text-[var(--text-muted)]\">\r\n <Users className=\"h-12 w-12 mx-auto mb-3 opacity-30\" />\r\n <p>{t('admin:permissionDetail.noUsers', 'No users have this permission')}</p>\r\n </div>\r\n ) : (\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead className=\"bg-[var(--bg-secondary)]\">\r\n <tr>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('admin:users.name', 'Name')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('admin:users.email', 'Email')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('admin:permissionDetail.viaRoles', 'Via Roles')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {permission.users.map((user) => (\r\n <tr\r\n key={user.id}\r\n onClick={() => navigate(`/administration/users/${user.id}`)}\r\n className=\"hover:bg-[var(--bg-hover)] cursor-pointer transition-colors\"\r\n >\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"h-8 w-8 rounded-full bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] flex items-center justify-center\">\r\n <span className=\"text-sm font-medium text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)]\">\r\n {user.firstName.charAt(0)}{user.lastName.charAt(0)}\r\n </span>\r\n </div>\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {user.firstName} {user.lastName}\r\n </span>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)]\">\r\n {user.email}\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex flex-wrap gap-1\">\r\n {user.roleNames.map((roleName) => (\r\n <span\r\n key={roleName}\r\n className=\"inline-flex items-center gap-1 px-2 py-0.5 bg-[var(--bg-tertiary)] rounded text-xs text-[var(--text-secondary)]\"\r\n >\r\n <Shield className=\"h-2.5 w-2.5\" />\r\n {roleName}\r\n </span>\r\n ))}\r\n </div>\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ACTION_ICONS","jsx","Shield","Eye","Plus","Edit","Trash2","UserPlus","Play","ACTION_COLORS","LEVEL_COLORS","PermissionDetailPage","t","useTranslation","permissionId","useParams","navigate","useNavigate","permission","setPermission","useState","loading","setLoading","error","setError","copied","setCopied","activeTab","setActiveTab","loadPermission","useCallback","data","adminApi","err","useEffect","handleCopyPath","Loader2","jsxs","actionKey","actionColor","actionIcon","levelColor","Breadcrumb","ArrowLeft","Lock","CheckCircle","Copy","Info","Layers","Calendar","Building2","Users","tab","role","group","roleName","user"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),d=require("react"),q=require("react-i18next"),R=require("react-router-dom"),r=require("lucide-react"),g=require("./index-2wUhd9Lu.js");function A({app:s,expandedNodes:i,toggleNode:o,t:l}){return e.jsxs("div",{children:[e.jsxs("button",{onClick:()=>o(s.id),className:"w-full flex items-center gap-3 py-3 px-4 pl-14 hover:bg-[var(--bg-hover)] transition-colors group",children:[e.jsx("div",{className:"flex items-center justify-center w-5 h-5 rounded bg-[var(--bg-tertiary)] group-hover:bg-[var(--info-bg)] transition-colors",children:i.has(s.id)?e.jsx(r.ChevronDown,{className:"w-3.5 h-3.5 text-[var(--text-secondary)] group-hover:text-[var(--info-text)]"}):e.jsx(r.ChevronRight,{className:"w-3.5 h-3.5 text-[var(--text-secondary)] group-hover:text-[var(--info-text)]"})}),e.jsx("div",{className:"w-7 h-7 rounded-[var(--radius-button)] bg-[var(--info-bg)] flex items-center justify-center",children:e.jsx(r.LayoutGrid,{className:"w-3.5 h-3.5 text-[var(--info-text)]"})}),e.jsxs("div",{className:"flex-1 text-left",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"font-medium text-[var(--text-primary)] text-sm",children:s.label}),e.jsx("span",{className:"px-1.5 py-0.5 text-[10px] rounded bg-[var(--info-bg)] text-[var(--info-text)] font-medium",children:l("permissions.levels.application")})]}),e.jsx("code",{className:"text-xs text-[var(--text-tertiary)] font-mono",children:s.permissionPath})]}),e.jsxs("div",{className:"text-xs text-[var(--text-secondary)]",children:[s.modules.length," ",l("permissions.stats.modules").toLowerCase()]})]}),i.has(s.id)&&e.jsx("div",{className:"bg-[var(--bg-tertiary)]/50",children:s.modules.map(a=>e.jsx(D,{module:a,expandedNodes:i,toggleNode:o,t:l},a.id))})]},s.id)}function D({module:s,expandedNodes:i,toggleNode:o,t:l}){return e.jsxs("div",{children:[e.jsxs("button",{onClick:()=>o(s.id),className:"w-full flex items-center gap-3 py-2.5 px-4 pl-24 hover:bg-[var(--bg-hover)] transition-colors group",children:[s.sections.length>0?e.jsx("div",{className:"flex items-center justify-center w-4 h-4 rounded bg-[var(--bg-tertiary)] group-hover:bg-[var(--success-bg)] transition-colors",children:i.has(s.id)?e.jsx(r.ChevronDown,{className:"w-3 h-3 text-[var(--text-secondary)] group-hover:text-[var(--success-text)]"}):e.jsx(r.ChevronRight,{className:"w-3 h-3 text-[var(--text-secondary)] group-hover:text-[var(--success-text)]"})}):e.jsx("div",{className:"w-4 h-4"}),e.jsx("div",{className:"w-6 h-6 rounded-[var(--radius-button)] bg-[var(--success-bg)] flex items-center justify-center",children:e.jsx(r.Layers,{className:"w-3 h-3 text-[var(--success-text)]"})}),e.jsxs("div",{className:"flex-1 text-left",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm text-[var(--text-primary)]",children:s.label}),e.jsx("span",{className:"px-1.5 py-0.5 text-[10px] rounded bg-[var(--success-bg)] text-[var(--success-text)] font-medium",children:l("permissions.levels.module")})]}),e.jsx("code",{className:"text-xs text-[var(--text-tertiary)] font-mono",children:s.permissionPath})]}),s.sections.length>0&&e.jsxs("div",{className:"text-xs text-[var(--text-secondary)]",children:[s.sections.length," ",l("permissions.stats.sections").toLowerCase()]})]}),i.has(s.id)&&s.sections.length>0&&e.jsx("div",{className:"bg-[var(--bg-primary)]",children:s.sections.map(a=>e.jsxs("div",{className:"flex items-center gap-3 py-2 px-4 pl-36 text-sm",children:[e.jsx("div",{className:"w-5 h-5 rounded bg-[var(--warning-bg)] flex items-center justify-center",children:e.jsx(r.FileCode,{className:"w-3 h-3 text-[var(--warning-text)]"})}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-[var(--text-primary)]",children:a.label}),e.jsx("span",{className:"px-1.5 py-0.5 text-[10px] rounded bg-[var(--warning-bg)] text-[var(--warning-text)] font-medium",children:l("permissions.levels.section")})]}),e.jsx("code",{className:"text-xs text-[var(--text-tertiary)] font-mono",children:a.permissionPath})]})]},a.id))})]},s.id)}function F({permission:s,navigate:i}){return e.jsxs("tr",{onClick:()=>i(`/administration/permissions/permissions/${s.id}`),className:"hover:bg-[var(--bg-hover)] transition-colors cursor-pointer group",children:[e.jsx("td",{className:"px-4 py-3",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("code",{className:"font-mono text-sm text-[var(--text-primary)] bg-[var(--bg-tertiary)] px-2 py-1 rounded group-hover:bg-[var(--color-accent-100)] dark:group-hover:bg-[var(--color-accent-900)]/30 transition-colors",children:s.path}),s.isWildcard&&e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 text-xs rounded-full bg-[var(--warning-bg)] text-[var(--warning-text)] font-medium",children:[e.jsx(r.Sparkles,{className:"w-3 h-3"}),"wildcard"]})]})}),e.jsx("td",{className:"px-4 py-3 hidden md:table-cell",children:e.jsx("span",{className:"px-2.5 py-1 text-xs rounded-full bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)] font-medium",children:s.level})}),e.jsx("td",{className:"px-4 py-3 text-[var(--text-secondary)] hidden lg:table-cell",children:s.description||"-"}),e.jsx("td",{className:"px-4 py-3",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"inline-flex items-center justify-center min-w-[2rem] px-2 py-1 text-sm font-medium rounded-full bg-[var(--bg-tertiary)] text-[var(--text-primary)]",children:s.rolesCount}),e.jsx(r.ExternalLink,{className:"w-4 h-4 text-[var(--text-tertiary)] opacity-0 group-hover:opacity-100 transition-opacity"})]})})]},s.id)}function I(){const{t:s}=q.useTranslation("admin"),i=R.useNavigate(),[o,l]=d.useState([]),[a,N]=d.useState(null),[x,b]=d.useState(!0),[h,w]=d.useState(""),[m,j]=d.useState("list"),[S,f]=d.useState(new Set),p=d.useCallback(async()=>{try{b(!0);const t=await g.adminApi.permissions.getAll({search:h||void 0});l(t)}catch(t){console.error("Failed to load permissions:",t)}finally{b(!1)}},[h]),k=t=>{const n=new Set;return(t.applications??[]).forEach(c=>{n.add(c.id),(c.modules??[]).forEach(v=>{n.add(v.id)})}),n},C=async()=>{try{const t=await g.adminApi.permissions.getTree();N(t);const n=k(t);f(n)}catch(t){console.error("Failed to load permission tree:",t)}};d.useEffect(()=>{p(),C()},[p]);const L=t=>{t.preventDefault(),p()},P=t=>{f(n=>{const c=new Set(n);return c.has(t)?c.delete(t):c.add(t),c})},u=a?(t=>{const n=t.applications??[];let c=0,v=0;return n.forEach(T=>{const y=T.modules??[];c+=y.length,y.forEach(E=>{v+=(E.sections??[]).length})}),{applications:n.length,modules:c,sections:v}})(a):{applications:0,modules:0,sections:0};return e.jsxs("div",{className:"space-y-6",children:[e.jsx(g.Breadcrumb,{items:[{label:s("header.title"),href:"/administration"},{label:s("permissions.title")}]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("div",{className:"w-12 h-12 rounded-[var(--radius-button)] bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 flex items-center justify-center",children:e.jsx(r.Shield,{className:"w-6 h-6 text-[var(--color-accent-600)] dark:text-[var(--color-accent-400)]"})}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-[var(--text-primary)]",children:s("permissions.title")}),e.jsx("p",{className:"text-[var(--text-secondary)] mt-0.5",children:s("permissions.subtitle")})]})]}),e.jsxs("div",{className:"flex items-center gap-1 p-1 bg-[var(--bg-tertiary)] rounded-[var(--radius-button)]",children:[e.jsxs("button",{onClick:()=>j("tree"),className:`flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium transition-all ${m==="tree"?"bg-[var(--color-accent-500)] text-white shadow-sm":"text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)]"}`,children:[e.jsx(r.FolderTree,{className:"w-4 h-4"}),s("permissions.treeView")]}),e.jsxs("button",{onClick:()=>j("list"),className:`flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium transition-all ${m==="list"?"bg-[var(--color-accent-500)] text-white shadow-sm":"text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)]"}`,children:[e.jsx(r.List,{className:"w-4 h-4"}),s("permissions.listView")]})]})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx("div",{className:"bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-10 h-10 rounded-[var(--radius-button)] bg-[var(--info-bg)] flex items-center justify-center",children:e.jsx(r.LayoutGrid,{className:"w-5 h-5 text-[var(--info-text)]"})}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[var(--text-primary)]",children:u.applications}),e.jsx("div",{className:"text-sm text-[var(--text-secondary)]",children:s("permissions.stats.applications")})]})]})}),e.jsx("div",{className:"bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-10 h-10 rounded-[var(--radius-button)] bg-[var(--success-bg)] flex items-center justify-center",children:e.jsx(r.Layers,{className:"w-5 h-5 text-[var(--success-text)]"})}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[var(--text-primary)]",children:u.modules}),e.jsx("div",{className:"text-sm text-[var(--text-secondary)]",children:s("permissions.stats.modules")})]})]})}),e.jsx("div",{className:"bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-10 h-10 rounded-[var(--radius-button)] bg-[var(--warning-bg)] flex items-center justify-center",children:e.jsx(r.FileCode,{className:"w-5 h-5 text-[var(--warning-text)]"})}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[var(--text-primary)]",children:u.sections}),e.jsx("div",{className:"text-sm text-[var(--text-secondary)]",children:s("permissions.stats.sections")})]})]})})]}),m==="list"&&e.jsxs("form",{onSubmit:L,className:"flex gap-2",children:[e.jsxs("div",{className:"relative flex-1 max-w-md",children:[e.jsx(r.Search,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-secondary)]"}),e.jsx("input",{type:"text",value:h,onChange:t=>w(t.target.value),placeholder:s("common.search"),className:"w-full pl-10 pr-4 py-2.5 rounded-[var(--radius-button)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-transparent transition-all"})]}),e.jsx("button",{type:"submit",className:"px-4 py-2.5 rounded-[var(--radius-button)] bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white font-medium transition-colors",children:s("common.search")})]}),m==="tree"?e.jsxs("div",{className:"bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden",children:[x&&e.jsx("div",{className:"flex justify-center py-16",children:e.jsx(r.Loader2,{className:"w-8 h-8 animate-spin text-[var(--color-accent-500)]"})}),!x&&a?.applications?.length?e.jsx("div",{className:"divide-y divide-[var(--border-color)]",children:a.applications.map(t=>e.jsx(A,{app:t,expandedNodes:S,toggleNode:P,t:s},t.id))}):!x&&e.jsxs("div",{className:"flex flex-col items-center justify-center py-16 text-[var(--text-secondary)]",children:[e.jsx(r.Shield,{className:"w-12 h-12 mb-4 text-[var(--text-tertiary)]"}),e.jsx("p",{children:s("permissions.noData")})]})]}):e.jsx("div",{className:"card overflow-hidden",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"bg-[var(--bg-secondary)]",children:[e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider",children:s("permissions.columns.path")}),e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden md:table-cell",children:s("permissions.columns.level")}),e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell",children:s("permissions.columns.description")}),e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider",children:s("permissions.columns.roles")})]})}),e.jsxs("tbody",{className:"divide-y divide-[var(--border-color)]",children:[x&&e.jsx("tr",{children:e.jsx("td",{colSpan:4,className:"px-6 py-16 text-center",children:e.jsx(r.Loader2,{className:"w-8 h-8 animate-spin mx-auto text-[var(--color-accent-500)]"})})}),!x&&o.length===0&&e.jsx("tr",{children:e.jsx("td",{colSpan:4,className:"px-6 py-16 text-center",children:e.jsxs("div",{className:"flex flex-col items-center text-[var(--text-secondary)]",children:[e.jsx(r.Shield,{className:"w-12 h-12 mb-4 text-[var(--text-tertiary)]"}),e.jsx("p",{children:s("permissions.noPermissions")})]})})}),!x&&o.length>0&&o.map(t=>e.jsx(F,{permission:t,navigate:i},t.id))]})]})})]})}exports.PermissionsPage=I;
2
- //# sourceMappingURL=PermissionsPage-l0PnY-EE.js.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),d=require("react"),q=require("react-i18next"),R=require("react-router-dom"),r=require("lucide-react"),g=require("./index-IgLVXPg8.js");function A({app:s,expandedNodes:i,toggleNode:o,t:l}){return e.jsxs("div",{children:[e.jsxs("button",{onClick:()=>o(s.id),className:"w-full flex items-center gap-3 py-3 px-4 pl-14 hover:bg-[var(--bg-hover)] transition-colors group",children:[e.jsx("div",{className:"flex items-center justify-center w-5 h-5 rounded bg-[var(--bg-tertiary)] group-hover:bg-[var(--info-bg)] transition-colors",children:i.has(s.id)?e.jsx(r.ChevronDown,{className:"w-3.5 h-3.5 text-[var(--text-secondary)] group-hover:text-[var(--info-text)]"}):e.jsx(r.ChevronRight,{className:"w-3.5 h-3.5 text-[var(--text-secondary)] group-hover:text-[var(--info-text)]"})}),e.jsx("div",{className:"w-7 h-7 rounded-[var(--radius-button)] bg-[var(--info-bg)] flex items-center justify-center",children:e.jsx(r.LayoutGrid,{className:"w-3.5 h-3.5 text-[var(--info-text)]"})}),e.jsxs("div",{className:"flex-1 text-left",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"font-medium text-[var(--text-primary)] text-sm",children:s.label}),e.jsx("span",{className:"px-1.5 py-0.5 text-[10px] rounded bg-[var(--info-bg)] text-[var(--info-text)] font-medium",children:l("permissions.levels.application")})]}),e.jsx("code",{className:"text-xs text-[var(--text-tertiary)] font-mono",children:s.permissionPath})]}),e.jsxs("div",{className:"text-xs text-[var(--text-secondary)]",children:[s.modules.length," ",l("permissions.stats.modules").toLowerCase()]})]}),i.has(s.id)&&e.jsx("div",{className:"bg-[var(--bg-tertiary)]/50",children:s.modules.map(a=>e.jsx(D,{module:a,expandedNodes:i,toggleNode:o,t:l},a.id))})]},s.id)}function D({module:s,expandedNodes:i,toggleNode:o,t:l}){return e.jsxs("div",{children:[e.jsxs("button",{onClick:()=>o(s.id),className:"w-full flex items-center gap-3 py-2.5 px-4 pl-24 hover:bg-[var(--bg-hover)] transition-colors group",children:[s.sections.length>0?e.jsx("div",{className:"flex items-center justify-center w-4 h-4 rounded bg-[var(--bg-tertiary)] group-hover:bg-[var(--success-bg)] transition-colors",children:i.has(s.id)?e.jsx(r.ChevronDown,{className:"w-3 h-3 text-[var(--text-secondary)] group-hover:text-[var(--success-text)]"}):e.jsx(r.ChevronRight,{className:"w-3 h-3 text-[var(--text-secondary)] group-hover:text-[var(--success-text)]"})}):e.jsx("div",{className:"w-4 h-4"}),e.jsx("div",{className:"w-6 h-6 rounded-[var(--radius-button)] bg-[var(--success-bg)] flex items-center justify-center",children:e.jsx(r.Layers,{className:"w-3 h-3 text-[var(--success-text)]"})}),e.jsxs("div",{className:"flex-1 text-left",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm text-[var(--text-primary)]",children:s.label}),e.jsx("span",{className:"px-1.5 py-0.5 text-[10px] rounded bg-[var(--success-bg)] text-[var(--success-text)] font-medium",children:l("permissions.levels.module")})]}),e.jsx("code",{className:"text-xs text-[var(--text-tertiary)] font-mono",children:s.permissionPath})]}),s.sections.length>0&&e.jsxs("div",{className:"text-xs text-[var(--text-secondary)]",children:[s.sections.length," ",l("permissions.stats.sections").toLowerCase()]})]}),i.has(s.id)&&s.sections.length>0&&e.jsx("div",{className:"bg-[var(--bg-primary)]",children:s.sections.map(a=>e.jsxs("div",{className:"flex items-center gap-3 py-2 px-4 pl-36 text-sm",children:[e.jsx("div",{className:"w-5 h-5 rounded bg-[var(--warning-bg)] flex items-center justify-center",children:e.jsx(r.FileCode,{className:"w-3 h-3 text-[var(--warning-text)]"})}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-[var(--text-primary)]",children:a.label}),e.jsx("span",{className:"px-1.5 py-0.5 text-[10px] rounded bg-[var(--warning-bg)] text-[var(--warning-text)] font-medium",children:l("permissions.levels.section")})]}),e.jsx("code",{className:"text-xs text-[var(--text-tertiary)] font-mono",children:a.permissionPath})]})]},a.id))})]},s.id)}function F({permission:s,navigate:i}){return e.jsxs("tr",{onClick:()=>i(`/administration/permissions/permissions/${s.id}`),className:"hover:bg-[var(--bg-hover)] transition-colors cursor-pointer group",children:[e.jsx("td",{className:"px-4 py-3",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("code",{className:"font-mono text-sm text-[var(--text-primary)] bg-[var(--bg-tertiary)] px-2 py-1 rounded group-hover:bg-[var(--color-accent-100)] dark:group-hover:bg-[var(--color-accent-900)]/30 transition-colors",children:s.path}),s.isWildcard&&e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 text-xs rounded-full bg-[var(--warning-bg)] text-[var(--warning-text)] font-medium",children:[e.jsx(r.Sparkles,{className:"w-3 h-3"}),"wildcard"]})]})}),e.jsx("td",{className:"px-4 py-3 hidden md:table-cell",children:e.jsx("span",{className:"px-2.5 py-1 text-xs rounded-full bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)] font-medium",children:s.level})}),e.jsx("td",{className:"px-4 py-3 text-[var(--text-secondary)] hidden lg:table-cell",children:s.description||"-"}),e.jsx("td",{className:"px-4 py-3",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"inline-flex items-center justify-center min-w-[2rem] px-2 py-1 text-sm font-medium rounded-full bg-[var(--bg-tertiary)] text-[var(--text-primary)]",children:s.rolesCount}),e.jsx(r.ExternalLink,{className:"w-4 h-4 text-[var(--text-tertiary)] opacity-0 group-hover:opacity-100 transition-opacity"})]})})]},s.id)}function I(){const{t:s}=q.useTranslation("admin"),i=R.useNavigate(),[o,l]=d.useState([]),[a,N]=d.useState(null),[x,b]=d.useState(!0),[h,w]=d.useState(""),[m,j]=d.useState("list"),[S,f]=d.useState(new Set),p=d.useCallback(async()=>{try{b(!0);const t=await g.adminApi.permissions.getAll({search:h||void 0});l(t)}catch(t){console.error("Failed to load permissions:",t)}finally{b(!1)}},[h]),k=t=>{const n=new Set;return(t.applications??[]).forEach(c=>{n.add(c.id),(c.modules??[]).forEach(v=>{n.add(v.id)})}),n},C=async()=>{try{const t=await g.adminApi.permissions.getTree();N(t);const n=k(t);f(n)}catch(t){console.error("Failed to load permission tree:",t)}};d.useEffect(()=>{p(),C()},[p]);const L=t=>{t.preventDefault(),p()},P=t=>{f(n=>{const c=new Set(n);return c.has(t)?c.delete(t):c.add(t),c})},u=a?(t=>{const n=t.applications??[];let c=0,v=0;return n.forEach(T=>{const y=T.modules??[];c+=y.length,y.forEach(E=>{v+=(E.sections??[]).length})}),{applications:n.length,modules:c,sections:v}})(a):{applications:0,modules:0,sections:0};return e.jsxs("div",{className:"space-y-6",children:[e.jsx(g.Breadcrumb,{items:[{label:s("header.title"),href:"/administration"},{label:s("permissions.title")}]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("div",{className:"w-12 h-12 rounded-[var(--radius-button)] bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 flex items-center justify-center",children:e.jsx(r.Shield,{className:"w-6 h-6 text-[var(--color-accent-600)] dark:text-[var(--color-accent-400)]"})}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-[var(--text-primary)]",children:s("permissions.title")}),e.jsx("p",{className:"text-[var(--text-secondary)] mt-0.5",children:s("permissions.subtitle")})]})]}),e.jsxs("div",{className:"flex items-center gap-1 p-1 bg-[var(--bg-tertiary)] rounded-[var(--radius-button)]",children:[e.jsxs("button",{onClick:()=>j("tree"),className:`flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium transition-all ${m==="tree"?"bg-[var(--color-accent-500)] text-white shadow-sm":"text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)]"}`,children:[e.jsx(r.FolderTree,{className:"w-4 h-4"}),s("permissions.treeView")]}),e.jsxs("button",{onClick:()=>j("list"),className:`flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium transition-all ${m==="list"?"bg-[var(--color-accent-500)] text-white shadow-sm":"text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)]"}`,children:[e.jsx(r.List,{className:"w-4 h-4"}),s("permissions.listView")]})]})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx("div",{className:"bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-10 h-10 rounded-[var(--radius-button)] bg-[var(--info-bg)] flex items-center justify-center",children:e.jsx(r.LayoutGrid,{className:"w-5 h-5 text-[var(--info-text)]"})}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[var(--text-primary)]",children:u.applications}),e.jsx("div",{className:"text-sm text-[var(--text-secondary)]",children:s("permissions.stats.applications")})]})]})}),e.jsx("div",{className:"bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-10 h-10 rounded-[var(--radius-button)] bg-[var(--success-bg)] flex items-center justify-center",children:e.jsx(r.Layers,{className:"w-5 h-5 text-[var(--success-text)]"})}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[var(--text-primary)]",children:u.modules}),e.jsx("div",{className:"text-sm text-[var(--text-secondary)]",children:s("permissions.stats.modules")})]})]})}),e.jsx("div",{className:"bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-10 h-10 rounded-[var(--radius-button)] bg-[var(--warning-bg)] flex items-center justify-center",children:e.jsx(r.FileCode,{className:"w-5 h-5 text-[var(--warning-text)]"})}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[var(--text-primary)]",children:u.sections}),e.jsx("div",{className:"text-sm text-[var(--text-secondary)]",children:s("permissions.stats.sections")})]})]})})]}),m==="list"&&e.jsxs("form",{onSubmit:L,className:"flex gap-2",children:[e.jsxs("div",{className:"relative flex-1 max-w-md",children:[e.jsx(r.Search,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-secondary)]"}),e.jsx("input",{type:"text",value:h,onChange:t=>w(t.target.value),placeholder:s("common.search"),className:"w-full pl-10 pr-4 py-2.5 rounded-[var(--radius-button)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-transparent transition-all"})]}),e.jsx("button",{type:"submit",className:"px-4 py-2.5 rounded-[var(--radius-button)] bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white font-medium transition-colors",children:s("common.search")})]}),m==="tree"?e.jsxs("div",{className:"bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden",children:[x&&e.jsx("div",{className:"flex justify-center py-16",children:e.jsx(r.Loader2,{className:"w-8 h-8 animate-spin text-[var(--color-accent-500)]"})}),!x&&a?.applications?.length?e.jsx("div",{className:"divide-y divide-[var(--border-color)]",children:a.applications.map(t=>e.jsx(A,{app:t,expandedNodes:S,toggleNode:P,t:s},t.id))}):!x&&e.jsxs("div",{className:"flex flex-col items-center justify-center py-16 text-[var(--text-secondary)]",children:[e.jsx(r.Shield,{className:"w-12 h-12 mb-4 text-[var(--text-tertiary)]"}),e.jsx("p",{children:s("permissions.noData")})]})]}):e.jsx("div",{className:"card overflow-hidden",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"bg-[var(--bg-secondary)]",children:[e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider",children:s("permissions.columns.path")}),e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden md:table-cell",children:s("permissions.columns.level")}),e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell",children:s("permissions.columns.description")}),e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider",children:s("permissions.columns.roles")})]})}),e.jsxs("tbody",{className:"divide-y divide-[var(--border-color)]",children:[x&&e.jsx("tr",{children:e.jsx("td",{colSpan:4,className:"px-6 py-16 text-center",children:e.jsx(r.Loader2,{className:"w-8 h-8 animate-spin mx-auto text-[var(--color-accent-500)]"})})}),!x&&o.length===0&&e.jsx("tr",{children:e.jsx("td",{colSpan:4,className:"px-6 py-16 text-center",children:e.jsxs("div",{className:"flex flex-col items-center text-[var(--text-secondary)]",children:[e.jsx(r.Shield,{className:"w-12 h-12 mb-4 text-[var(--text-tertiary)]"}),e.jsx("p",{children:s("permissions.noPermissions")})]})})}),!x&&o.length>0&&o.map(t=>e.jsx(F,{permission:t,navigate:i},t.id))]})]})})]})}exports.PermissionsPage=I;
2
+ //# sourceMappingURL=PermissionsPage-COI5LJPo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PermissionsPage-l0PnY-EE.js","sources":["../../src/pages/platform/administration/permissions/PermissionsPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport {\r\n Search,\r\n Loader2,\r\n ChevronRight,\r\n ChevronDown,\r\n Shield,\r\n FolderTree,\r\n List,\r\n LayoutGrid,\r\n Layers,\r\n FileCode,\r\n Sparkles,\r\n ExternalLink\r\n} from 'lucide-react';\r\nimport { adminApi, type PermissionListDto, type PermissionTreeDto } from '@/services/api/adminApi';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\ntype TFunction = ReturnType<typeof useTranslation>['t'];\r\n\r\ninterface ApplicationTreeNodeProps {\r\n readonly app: PermissionTreeDto['applications'][0];\r\n readonly expandedNodes: Set<string>;\r\n readonly toggleNode: (id: string) => void;\r\n readonly t: TFunction;\r\n}\r\n\r\nfunction ApplicationTreeNode({ app, expandedNodes, toggleNode, t }: Readonly<ApplicationTreeNodeProps>) {\r\n return (\r\n <div key={app.id}>\r\n <button\r\n onClick={() => toggleNode(app.id)}\r\n className=\"w-full flex items-center gap-3 py-3 px-4 pl-14 hover:bg-[var(--bg-hover)] transition-colors group\"\r\n >\r\n <div className=\"flex items-center justify-center w-5 h-5 rounded bg-[var(--bg-tertiary)] group-hover:bg-[var(--info-bg)] transition-colors\">\r\n {expandedNodes.has(app.id) ? (\r\n <ChevronDown className=\"w-3.5 h-3.5 text-[var(--text-secondary)] group-hover:text-[var(--info-text)]\" />\r\n ) : (\r\n <ChevronRight className=\"w-3.5 h-3.5 text-[var(--text-secondary)] group-hover:text-[var(--info-text)]\" />\r\n )}\r\n </div>\r\n <div className=\"w-7 h-7 rounded-[var(--radius-button)] bg-[var(--info-bg)] flex items-center justify-center\">\r\n <LayoutGrid className=\"w-3.5 h-3.5 text-[var(--info-text)]\" />\r\n </div>\r\n <div className=\"flex-1 text-left\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium text-[var(--text-primary)] text-sm\">{app.label}</span>\r\n <span className=\"px-1.5 py-0.5 text-[10px] rounded bg-[var(--info-bg)] text-[var(--info-text)] font-medium\">\r\n {t('permissions.levels.application')}\r\n </span>\r\n </div>\r\n <code className=\"text-xs text-[var(--text-tertiary)] font-mono\">{app.permissionPath}</code>\r\n </div>\r\n <div className=\"text-xs text-[var(--text-secondary)]\">\r\n {app.modules.length} {t('permissions.stats.modules').toLowerCase()}\r\n </div>\r\n </button>\r\n\r\n {expandedNodes.has(app.id) && (\r\n <div className=\"bg-[var(--bg-tertiary)]/50\">\r\n {app.modules.map(module => (\r\n <ModuleTreeNode\r\n key={module.id}\r\n module={module}\r\n expandedNodes={expandedNodes}\r\n toggleNode={toggleNode}\r\n t={t}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\ninterface ModuleTreeNodeProps {\r\n readonly module: PermissionTreeDto['applications'][0]['modules'][0];\r\n readonly expandedNodes: Set<string>;\r\n readonly toggleNode: (id: string) => void;\r\n readonly t: TFunction;\r\n}\r\n\r\nfunction ModuleTreeNode({ module, expandedNodes, toggleNode, t }: Readonly<ModuleTreeNodeProps>) {\r\n return (\r\n <div key={module.id}>\r\n <button\r\n onClick={() => toggleNode(module.id)}\r\n className=\"w-full flex items-center gap-3 py-2.5 px-4 pl-24 hover:bg-[var(--bg-hover)] transition-colors group\"\r\n >\r\n {module.sections.length > 0 ? (\r\n <div className=\"flex items-center justify-center w-4 h-4 rounded bg-[var(--bg-tertiary)] group-hover:bg-[var(--success-bg)] transition-colors\">\r\n {expandedNodes.has(module.id) ? (\r\n <ChevronDown className=\"w-3 h-3 text-[var(--text-secondary)] group-hover:text-[var(--success-text)]\" />\r\n ) : (\r\n <ChevronRight className=\"w-3 h-3 text-[var(--text-secondary)] group-hover:text-[var(--success-text)]\" />\r\n )}\r\n </div>\r\n ) : (\r\n <div className=\"w-4 h-4\" />\r\n )}\r\n <div className=\"w-6 h-6 rounded-[var(--radius-button)] bg-[var(--success-bg)] flex items-center justify-center\">\r\n <Layers className=\"w-3 h-3 text-[var(--success-text)]\" />\r\n </div>\r\n <div className=\"flex-1 text-left\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-sm text-[var(--text-primary)]\">{module.label}</span>\r\n <span className=\"px-1.5 py-0.5 text-[10px] rounded bg-[var(--success-bg)] text-[var(--success-text)] font-medium\">\r\n {t('permissions.levels.module')}\r\n </span>\r\n </div>\r\n <code className=\"text-xs text-[var(--text-tertiary)] font-mono\">{module.permissionPath}</code>\r\n </div>\r\n {module.sections.length > 0 && (\r\n <div className=\"text-xs text-[var(--text-secondary)]\">\r\n {module.sections.length} {t('permissions.stats.sections').toLowerCase()}\r\n </div>\r\n )}\r\n </button>\r\n\r\n {expandedNodes.has(module.id) && module.sections.length > 0 && (\r\n <div className=\"bg-[var(--bg-primary)]\">\r\n {module.sections.map(section => (\r\n <div\r\n key={section.id}\r\n className=\"flex items-center gap-3 py-2 px-4 pl-36 text-sm\"\r\n >\r\n <div className=\"w-5 h-5 rounded bg-[var(--warning-bg)] flex items-center justify-center\">\r\n <FileCode className=\"w-3 h-3 text-[var(--warning-text)]\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-[var(--text-primary)]\">{section.label}</span>\r\n <span className=\"px-1.5 py-0.5 text-[10px] rounded bg-[var(--warning-bg)] text-[var(--warning-text)] font-medium\">\r\n {t('permissions.levels.section')}\r\n </span>\r\n </div>\r\n <code className=\"text-xs text-[var(--text-tertiary)] font-mono\">{section.permissionPath}</code>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\ninterface PermissionListRowProps {\r\n readonly permission: PermissionListDto;\r\n readonly navigate: (path: string) => void;\r\n}\r\n\r\nfunction PermissionListRow({ permission, navigate }: Readonly<PermissionListRowProps>) {\r\n return (\r\n <tr\r\n key={permission.id}\r\n onClick={() => navigate(`/administration/permissions/permissions/${permission.id}`)}\r\n className=\"hover:bg-[var(--bg-hover)] transition-colors cursor-pointer group\"\r\n >\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-2\">\r\n <code className=\"font-mono text-sm text-[var(--text-primary)] bg-[var(--bg-tertiary)] px-2 py-1 rounded group-hover:bg-[var(--color-accent-100)] dark:group-hover:bg-[var(--color-accent-900)]/30 transition-colors\">{permission.path}</code>\r\n {permission.isWildcard && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs rounded-full bg-[var(--warning-bg)] text-[var(--warning-text)] font-medium\">\r\n <Sparkles className=\"w-3 h-3\" />\r\n wildcard\r\n </span>\r\n )}\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 hidden md:table-cell\">\r\n <span className=\"px-2.5 py-1 text-xs rounded-full bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)] font-medium\">\r\n {permission.level}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3 text-[var(--text-secondary)] hidden lg:table-cell\">{permission.description || '-'}</td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-3\">\r\n <span className=\"inline-flex items-center justify-center min-w-[2rem] px-2 py-1 text-sm font-medium rounded-full bg-[var(--bg-tertiary)] text-[var(--text-primary)]\">\r\n {permission.rolesCount}\r\n </span>\r\n <ExternalLink className=\"w-4 h-4 text-[var(--text-tertiary)] opacity-0 group-hover:opacity-100 transition-opacity\" />\r\n </div>\r\n </td>\r\n </tr>\r\n );\r\n}\r\n\r\nexport function PermissionsPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const navigate = useNavigate();\r\n const [permissions, setPermissions] = useState<PermissionListDto[]>([]);\r\n const [tree, setTree] = useState<PermissionTreeDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [search, setSearch] = useState('');\r\n const [viewMode, setViewMode] = useState<'list' | 'tree'>('list');\r\n const [expandedNodes, setExpandedNodes] = useState<Set<string>>(new Set());\r\n\r\n const loadPermissions = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const result = await adminApi.permissions.getAll({ search: search || undefined });\r\n setPermissions(result);\r\n } catch (err) {\r\n console.error('Failed to load permissions:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [search]);\r\n\r\n const collectAllNodeIds = (tree: PermissionTreeDto): Set<string> => {\r\n const allIds = new Set<string>();\r\n (tree.applications ?? []).forEach(app => {\r\n allIds.add(app.id);\r\n (app.modules ?? []).forEach(mod => {\r\n allIds.add(mod.id);\r\n });\r\n });\r\n return allIds;\r\n };\r\n\r\n const loadTree = async () => {\r\n try {\r\n const result = await adminApi.permissions.getTree();\r\n setTree(result);\r\n const allIds = collectAllNodeIds(result);\r\n setExpandedNodes(allIds);\r\n } catch (err) {\r\n console.error('Failed to load permission tree:', err);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n loadPermissions();\r\n loadTree();\r\n }, [loadPermissions]);\r\n\r\n const handleSearch = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n loadPermissions();\r\n };\r\n\r\n const toggleNode = (id: string) => {\r\n setExpandedNodes(prev => {\r\n const next = new Set(prev);\r\n if (next.has(id)) {\r\n next.delete(id);\r\n } else {\r\n next.add(id);\r\n }\r\n return next;\r\n });\r\n };\r\n\r\n const countTreeStats = (tree: PermissionTreeDto) => {\r\n const apps = tree.applications ?? [];\r\n let modules = 0;\r\n let sections = 0;\r\n apps.forEach(app => {\r\n const mods = app.modules ?? [];\r\n modules += mods.length;\r\n mods.forEach(mod => {\r\n sections += (mod.sections ?? []).length;\r\n });\r\n });\r\n return { applications: apps.length, modules, sections };\r\n };\r\n\r\n const getStats = () => {\r\n if (!tree) return { applications: 0, modules: 0, sections: 0 };\r\n return countTreeStats(tree);\r\n };\r\n\r\n const stats = getStats();\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Breadcrumb */}\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('permissions.title') }\r\n ]}\r\n />\r\n\r\n {/* Page Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-4\">\r\n <div className=\"w-12 h-12 rounded-[var(--radius-button)] bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 flex items-center justify-center\">\r\n <Shield className=\"w-6 h-6 text-[var(--color-accent-600)] dark:text-[var(--color-accent-400)]\" />\r\n </div>\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{t('permissions.title')}</h1>\r\n <p className=\"text-[var(--text-secondary)] mt-0.5\">{t('permissions.subtitle')}</p>\r\n </div>\r\n </div>\r\n\r\n {/* View Mode Toggle */}\r\n <div className=\"flex items-center gap-1 p-1 bg-[var(--bg-tertiary)] rounded-[var(--radius-button)]\">\r\n <button\r\n onClick={() => setViewMode('tree')}\r\n className={`flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium transition-all ${\r\n viewMode === 'tree'\r\n ? 'bg-[var(--color-accent-500)] text-white shadow-sm'\r\n : 'text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <FolderTree className=\"w-4 h-4\" />\r\n {t('permissions.treeView')}\r\n </button>\r\n <button\r\n onClick={() => setViewMode('list')}\r\n className={`flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium transition-all ${\r\n viewMode === 'list'\r\n ? 'bg-[var(--color-accent-500)] text-white shadow-sm'\r\n : 'text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <List className=\"w-4 h-4\" />\r\n {t('permissions.listView')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Stats Cards */}\r\n <div className=\"grid grid-cols-3 gap-4\">\r\n <div className=\"bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-10 h-10 rounded-[var(--radius-button)] bg-[var(--info-bg)] flex items-center justify-center\">\r\n <LayoutGrid className=\"w-5 h-5 text-[var(--info-text)]\" />\r\n </div>\r\n <div>\r\n <div className=\"text-2xl font-bold text-[var(--text-primary)]\">{stats.applications}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">{t('permissions.stats.applications')}</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-10 h-10 rounded-[var(--radius-button)] bg-[var(--success-bg)] flex items-center justify-center\">\r\n <Layers className=\"w-5 h-5 text-[var(--success-text)]\" />\r\n </div>\r\n <div>\r\n <div className=\"text-2xl font-bold text-[var(--text-primary)]\">{stats.modules}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">{t('permissions.stats.modules')}</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-10 h-10 rounded-[var(--radius-button)] bg-[var(--warning-bg)] flex items-center justify-center\">\r\n <FileCode className=\"w-5 h-5 text-[var(--warning-text)]\" />\r\n </div>\r\n <div>\r\n <div className=\"text-2xl font-bold text-[var(--text-primary)]\">{stats.sections}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">{t('permissions.stats.sections')}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Search Bar (List View) */}\r\n {viewMode === 'list' && (\r\n <form onSubmit={handleSearch} className=\"flex gap-2\">\r\n <div className=\"relative flex-1 max-w-md\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={e => setSearch(e.target.value)}\r\n placeholder={t('common.search')}\r\n className=\"w-full pl-10 pr-4 py-2.5 rounded-[var(--radius-button)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-transparent transition-all\"\r\n />\r\n </div>\r\n <button\r\n type=\"submit\"\r\n className=\"px-4 py-2.5 rounded-[var(--radius-button)] bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white font-medium transition-colors\"\r\n >\r\n {t('common.search')}\r\n </button>\r\n </form>\r\n )}\r\n\r\n {/* Tree View */}\r\n {viewMode === 'tree' ? (\r\n <div className=\"bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n {loading && (\r\n <div className=\"flex justify-center py-16\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n )}\r\n {!loading && tree?.applications?.length ? (\r\n <div className=\"divide-y divide-[var(--border-color)]\">\r\n {tree.applications.map(app => (\r\n <ApplicationTreeNode\r\n key={app.id}\r\n app={app}\r\n expandedNodes={expandedNodes}\r\n toggleNode={toggleNode}\r\n t={t}\r\n />\r\n ))}\r\n </div>\r\n ) : !loading && (\r\n <div className=\"flex flex-col items-center justify-center py-16 text-[var(--text-secondary)]\">\r\n <Shield className=\"w-12 h-12 mb-4 text-[var(--text-tertiary)]\" />\r\n <p>{t('permissions.noData')}</p>\r\n </div>\r\n )}\r\n </div>\r\n ) : (\r\n /* List View */\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('permissions.columns.path')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden md:table-cell\">{t('permissions.columns.level')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">{t('permissions.columns.description')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('permissions.columns.roles')}</th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {loading && (\r\n <tr>\r\n <td colSpan={4} className=\"px-6 py-16 text-center\">\r\n <Loader2 className=\"w-8 h-8 animate-spin mx-auto text-[var(--color-accent-500)]\" />\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && permissions.length === 0 && (\r\n <tr>\r\n <td colSpan={4} className=\"px-6 py-16 text-center\">\r\n <div className=\"flex flex-col items-center text-[var(--text-secondary)]\">\r\n <Shield className=\"w-12 h-12 mb-4 text-[var(--text-tertiary)]\" />\r\n <p>{t('permissions.noPermissions')}</p>\r\n </div>\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && permissions.length > 0 && (\r\n permissions.map(permission => (\r\n <PermissionListRow\r\n key={permission.id}\r\n permission={permission}\r\n navigate={navigate}\r\n />\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["ApplicationTreeNode","app","expandedNodes","toggleNode","t","jsxs","jsx","ChevronDown","ChevronRight","LayoutGrid","module","ModuleTreeNode","Layers","section","FileCode","PermissionListRow","permission","navigate","Sparkles","ExternalLink","PermissionsPage","useTranslation","useNavigate","permissions","setPermissions","useState","tree","setTree","loading","setLoading","search","setSearch","viewMode","setViewMode","setExpandedNodes","loadPermissions","useCallback","result","adminApi","err","collectAllNodeIds","allIds","mod","loadTree","useEffect","handleSearch","e","id","prev","next","stats","apps","modules","sections","mods","Breadcrumb","Shield","FolderTree","List","Search","Loader2"],"mappings":"4PA8BA,SAASA,EAAoB,CAAE,IAAAC,EAAK,cAAAC,EAAe,WAAAC,EAAY,EAAAC,GAAyC,CACtG,cACG,MAAA,CACC,SAAA,CAAAC,EAAAA,KAAC,SAAA,CACC,QAAS,IAAMF,EAAWF,EAAI,EAAE,EAChC,UAAU,oGAEV,SAAA,CAAAK,MAAC,OAAI,UAAU,6HACZ,SAAAJ,EAAc,IAAID,EAAI,EAAE,EACvBK,EAAAA,IAACC,EAAAA,YAAA,CAAY,UAAU,8EAAA,CAA+E,QAErGC,EAAAA,aAAA,CAAa,UAAU,+EAA+E,EAE3G,EACAF,EAAAA,IAAC,OAAI,UAAU,8FACb,eAACG,EAAAA,WAAA,CAAW,UAAU,sCAAsC,CAAA,CAC9D,EACAJ,EAAAA,KAAC,MAAA,CAAI,UAAU,mBACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,iDAAkD,SAAAL,EAAI,MAAM,QAC3E,OAAA,CAAK,UAAU,4FACb,SAAAG,EAAE,gCAAgC,CAAA,CACrC,CAAA,EACF,EACAE,EAAAA,IAAC,OAAA,CAAK,UAAU,gDAAiD,WAAI,cAAA,CAAe,CAAA,EACtF,EACAD,EAAAA,KAAC,MAAA,CAAI,UAAU,uCACZ,SAAA,CAAAJ,EAAI,QAAQ,OAAO,IAAEG,EAAE,2BAA2B,EAAE,YAAA,CAAY,CAAA,CACnE,CAAA,CAAA,CAAA,EAGDF,EAAc,IAAID,EAAI,EAAE,GACvBK,EAAAA,IAAC,MAAA,CAAI,UAAU,6BACZ,SAAAL,EAAI,QAAQ,IAAIS,GACfJ,EAAAA,IAACK,EAAA,CAEC,OAAAD,EACA,cAAAR,EACA,WAAAC,EACA,EAAAC,CAAA,EAJKM,EAAO,EAAA,CAMf,CAAA,CACH,CAAA,CAAA,EAxCMT,EAAI,EA0Cd,CAEJ,CASA,SAASU,EAAe,CAAE,OAAAD,EAAQ,cAAAR,EAAe,WAAAC,EAAY,EAAAC,GAAoC,CAC/F,cACG,MAAA,CACC,SAAA,CAAAC,EAAAA,KAAC,SAAA,CACC,QAAS,IAAMF,EAAWO,EAAO,EAAE,EACnC,UAAU,sGAET,SAAA,CAAAA,EAAO,SAAS,OAAS,EACxBJ,EAAAA,IAAC,MAAA,CAAI,UAAU,gIACZ,SAAAJ,EAAc,IAAIQ,EAAO,EAAE,EAC1BJ,EAAAA,IAACC,EAAAA,aAAY,UAAU,6EAAA,CAA8E,EAErGD,EAAAA,IAACE,EAAAA,aAAA,CAAa,UAAU,6EAAA,CAA8E,CAAA,CAE1G,EAEAF,EAAAA,IAAC,MAAA,CAAI,UAAU,UAAU,EAE3BA,EAAAA,IAAC,OAAI,UAAU,iGACb,eAACM,EAAAA,OAAA,CAAO,UAAU,qCAAqC,CAAA,CACzD,EACAP,EAAAA,KAAC,MAAA,CAAI,UAAU,mBACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,qCAAsC,SAAAI,EAAO,MAAM,QAClE,OAAA,CAAK,UAAU,kGACb,SAAAN,EAAE,2BAA2B,CAAA,CAChC,CAAA,EACF,EACAE,EAAAA,IAAC,OAAA,CAAK,UAAU,gDAAiD,WAAO,cAAA,CAAe,CAAA,EACzF,EACCI,EAAO,SAAS,OAAS,GACxBL,EAAAA,KAAC,MAAA,CAAI,UAAU,uCACZ,SAAA,CAAAK,EAAO,SAAS,OAAO,IAAEN,EAAE,4BAA4B,EAAE,YAAA,CAAY,CAAA,CACxE,CAAA,CAAA,CAAA,EAIHF,EAAc,IAAIQ,EAAO,EAAE,GAAKA,EAAO,SAAS,OAAS,GACxDJ,EAAAA,IAAC,OAAI,UAAU,yBACZ,SAAAI,EAAO,SAAS,IAAIG,GACnBR,EAAAA,KAAC,MAAA,CAEC,UAAU,kDAEV,SAAA,CAAAC,EAAAA,IAAC,OAAI,UAAU,0EACb,eAACQ,EAAAA,SAAA,CAAS,UAAU,qCAAqC,CAAA,CAC3D,EACAT,EAAAA,KAAC,MAAA,CAAI,UAAU,SACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,6BAA8B,SAAAO,EAAQ,MAAM,QAC3D,OAAA,CAAK,UAAU,kGACb,SAAAT,EAAE,4BAA4B,CAAA,CACjC,CAAA,EACF,EACAE,EAAAA,IAAC,OAAA,CAAK,UAAU,gDAAiD,WAAQ,cAAA,CAAe,CAAA,CAAA,CAC1F,CAAA,CAAA,EAdKO,EAAQ,EAAA,CAgBhB,CAAA,CACH,CAAA,CAAA,EAxDMH,EAAO,EA0DjB,CAEJ,CAOA,SAASK,EAAkB,CAAE,WAAAC,EAAY,SAAAC,GAA8C,CACrF,OACEZ,EAAAA,KAAC,KAAA,CAEC,QAAS,IAAMY,EAAS,2CAA2CD,EAAW,EAAE,EAAE,EAClF,UAAU,oEAEV,SAAA,CAAAV,EAAAA,IAAC,MAAG,UAAU,YACZ,SAAAD,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,qMAAsM,SAAAU,EAAW,KAAK,EACrOA,EAAW,YACVX,OAAC,OAAA,CAAK,UAAU,gIACd,SAAA,CAAAC,EAAAA,IAACY,EAAAA,SAAA,CAAS,UAAU,SAAA,CAAU,EAAE,UAAA,CAAA,CAElC,CAAA,CAAA,CAEJ,CAAA,CACF,EACAZ,EAAAA,IAAC,KAAA,CAAG,UAAU,iCACZ,SAAAA,EAAAA,IAAC,QAAK,UAAU,oLACb,SAAAU,EAAW,KAAA,CACd,CAAA,CACF,QACC,KAAA,CAAG,UAAU,8DAA+D,SAAAA,EAAW,aAAe,IAAI,QAC1G,KAAA,CAAG,UAAU,YACZ,SAAAX,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,qJACb,SAAAU,EAAW,WACd,EACAV,EAAAA,IAACa,EAAAA,aAAA,CAAa,UAAU,0FAAA,CAA2F,CAAA,CAAA,CACrH,CAAA,CACF,CAAA,CAAA,EA5BKH,EAAW,EAAA,CA+BtB,CAEO,SAASI,GAAgC,CAC9C,KAAM,CAAE,EAAAhB,CAAA,EAAMiB,EAAAA,eAAe,OAAO,EAC9BJ,EAAWK,EAAAA,YAAA,EACX,CAACC,EAAaC,CAAc,EAAIC,EAAAA,SAA8B,CAAA,CAAE,EAChE,CAACC,EAAMC,CAAO,EAAIF,EAAAA,SAAmC,IAAI,EACzD,CAACG,EAASC,CAAU,EAAIJ,EAAAA,SAAS,EAAI,EACrC,CAACK,EAAQC,CAAS,EAAIN,EAAAA,SAAS,EAAE,EACjC,CAACO,EAAUC,CAAW,EAAIR,EAAAA,SAA0B,MAAM,EAC1D,CAACvB,EAAegC,CAAgB,EAAIT,EAAAA,SAAsB,IAAI,GAAK,EAEnEU,EAAkBC,EAAAA,YAAY,SAAY,CAC9C,GAAI,CACFP,EAAW,EAAI,EACf,MAAMQ,EAAS,MAAMC,EAAAA,SAAS,YAAY,OAAO,CAAE,OAAQR,GAAU,OAAW,EAChFN,EAAea,CAAM,CACvB,OAASE,EAAK,CACZ,QAAQ,MAAM,8BAA+BA,CAAG,CAClD,QAAA,CACEV,EAAW,EAAK,CAClB,CACF,EAAG,CAACC,CAAM,CAAC,EAELU,EAAqBd,GAAyC,CAClE,MAAMe,MAAa,IACnB,OAACf,EAAK,cAAgB,CAAA,GAAI,QAAQzB,GAAO,CACvCwC,EAAO,IAAIxC,EAAI,EAAE,GAChBA,EAAI,SAAW,CAAA,GAAI,QAAQyC,GAAO,CACjCD,EAAO,IAAIC,EAAI,EAAE,CACnB,CAAC,CACH,CAAC,EACMD,CACT,EAEME,EAAW,SAAY,CAC3B,GAAI,CACF,MAAMN,EAAS,MAAMC,WAAS,YAAY,QAAA,EAC1CX,EAAQU,CAAM,EACd,MAAMI,EAASD,EAAkBH,CAAM,EACvCH,EAAiBO,CAAM,CACzB,OAASF,EAAK,CACZ,QAAQ,MAAM,kCAAmCA,CAAG,CACtD,CACF,EAEAK,EAAAA,UAAU,IAAM,CACdT,EAAA,EACAQ,EAAA,CACF,EAAG,CAACR,CAAe,CAAC,EAEpB,MAAMU,EAAgBC,GAAuB,CAC3CA,EAAE,eAAA,EACFX,EAAA,CACF,EAEMhC,EAAc4C,GAAe,CACjCb,EAAiBc,GAAQ,CACvB,MAAMC,EAAO,IAAI,IAAID,CAAI,EACzB,OAAIC,EAAK,IAAIF,CAAE,EACbE,EAAK,OAAOF,CAAE,EAEdE,EAAK,IAAIF,CAAE,EAENE,CACT,CAAC,CACH,EAqBMC,EAJCxB,GAfiBA,GAA4B,CAClD,MAAMyB,EAAOzB,EAAK,cAAgB,CAAA,EAClC,IAAI0B,EAAU,EACVC,EAAW,EACf,OAAAF,EAAK,QAAQlD,GAAO,CAClB,MAAMqD,EAAOrD,EAAI,SAAW,CAAA,EAC5BmD,GAAWE,EAAK,OAChBA,EAAK,QAAQZ,GAAO,CAClBW,IAAaX,EAAI,UAAY,CAAA,GAAI,MACnC,CAAC,CACH,CAAC,EACM,CAAE,aAAcS,EAAK,OAAQ,QAAAC,EAAS,SAAAC,CAAA,CAC/C,GAIwB3B,CAAI,EADR,CAAE,aAAc,EAAG,QAAS,EAAG,SAAU,CAAA,EAM7D,OACErB,EAAAA,KAAC,MAAA,CAAI,UAAU,YAEb,SAAA,CAAAC,EAAAA,IAACiD,EAAAA,WAAA,CACC,MAAO,CACL,CAAE,MAAOnD,EAAE,cAAc,EAAG,KAAM,iBAAA,EAClC,CAAE,MAAOA,EAAE,mBAAmB,CAAA,CAAE,CAClC,CAAA,EAIFC,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,OAAI,UAAU,8IACb,eAACkD,EAAAA,OAAA,CAAO,UAAU,6EAA6E,CAAA,CACjG,SACC,MAAA,CACC,SAAA,CAAAlD,MAAC,KAAA,CAAG,UAAU,gDAAiD,SAAAF,EAAE,mBAAmB,EAAE,QACrF,IAAA,CAAE,UAAU,sCAAuC,SAAAA,EAAE,sBAAsB,CAAA,CAAE,CAAA,CAAA,CAChF,CAAA,EACF,EAGAC,EAAAA,KAAC,MAAA,CAAI,UAAU,qFACb,SAAA,CAAAA,EAAAA,KAAC,SAAA,CACC,QAAS,IAAM4B,EAAY,MAAM,EACjC,UAAW,+FACTD,IAAa,OACT,oDACA,0FACN,GAEA,SAAA,CAAA1B,EAAAA,IAACmD,EAAAA,WAAA,CAAW,UAAU,SAAA,CAAU,EAC/BrD,EAAE,sBAAsB,CAAA,CAAA,CAAA,EAE3BC,EAAAA,KAAC,SAAA,CACC,QAAS,IAAM4B,EAAY,MAAM,EACjC,UAAW,+FACTD,IAAa,OACT,oDACA,0FACN,GAEA,SAAA,CAAA1B,EAAAA,IAACoD,EAAAA,KAAA,CAAK,UAAU,SAAA,CAAU,EACzBtD,EAAE,sBAAsB,CAAA,CAAA,CAAA,CAC3B,CAAA,CACF,CAAA,EACF,EAGAC,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACb,SAAA,CAAAC,EAAAA,IAAC,OAAI,UAAU,2FACb,SAAAD,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,OAAI,UAAU,gGACb,eAACG,EAAAA,WAAA,CAAW,UAAU,kCAAkC,CAAA,CAC1D,SACC,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,MAAA,CAAI,UAAU,gDAAiD,SAAA4C,EAAM,aAAa,QAClF,MAAA,CAAI,UAAU,uCAAwC,SAAA9C,EAAE,gCAAgC,CAAA,CAAE,CAAA,CAAA,CAC7F,CAAA,CAAA,CACF,CAAA,CACF,QACC,MAAA,CAAI,UAAU,2FACb,SAAAC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,OAAI,UAAU,mGACb,eAACM,EAAAA,OAAA,CAAO,UAAU,qCAAqC,CAAA,CACzD,SACC,MAAA,CACC,SAAA,CAAAN,EAAAA,IAAC,MAAA,CAAI,UAAU,gDAAiD,SAAA4C,EAAM,QAAQ,QAC7E,MAAA,CAAI,UAAU,uCAAwC,SAAA9C,EAAE,2BAA2B,CAAA,CAAE,CAAA,CAAA,CACxF,CAAA,CAAA,CACF,CAAA,CACF,QACC,MAAA,CAAI,UAAU,2FACb,SAAAC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,OAAI,UAAU,mGACb,eAACQ,EAAAA,SAAA,CAAS,UAAU,qCAAqC,CAAA,CAC3D,SACC,MAAA,CACC,SAAA,CAAAR,EAAAA,IAAC,MAAA,CAAI,UAAU,gDAAiD,SAAA4C,EAAM,SAAS,QAC9E,MAAA,CAAI,UAAU,uCAAwC,SAAA9C,EAAE,4BAA4B,CAAA,CAAE,CAAA,CAAA,CACzF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,EACF,EAGC4B,IAAa,QACZ3B,EAAAA,KAAC,QAAK,SAAUwC,EAAc,UAAU,aACtC,SAAA,CAAAxC,EAAAA,KAAC,MAAA,CAAI,UAAU,2BACb,SAAA,CAAAC,EAAAA,IAACqD,EAAAA,OAAA,CAAO,UAAU,+EAAA,CAAgF,EAClGrD,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOwB,EACP,SAAUgB,GAAKf,EAAUe,EAAE,OAAO,KAAK,EACvC,YAAa1C,EAAE,eAAe,EAC9B,UAAU,8PAAA,CAAA,CACZ,EACF,EACAE,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,sJAET,WAAE,eAAe,CAAA,CAAA,CACpB,EACF,EAID0B,IAAa,OACZ3B,OAAC,MAAA,CAAI,UAAU,uGACZ,SAAA,CAAAuB,GACCtB,EAAAA,IAAC,OAAI,UAAU,4BACb,eAACsD,EAAAA,QAAA,CAAQ,UAAU,sDAAsD,CAAA,CAC3E,EAED,CAAChC,GAAWF,GAAM,cAAc,OAC/BpB,EAAAA,IAAC,MAAA,CAAI,UAAU,wCACZ,SAAAoB,EAAK,aAAa,IAAIzB,GACrBK,EAAAA,IAACN,EAAA,CAEC,IAAAC,EACA,cAAAC,EACA,WAAAC,EACA,EAAAC,CAAA,EAJKH,EAAI,EAAA,CAMZ,EACH,EACE,CAAC2B,GACHvB,EAAAA,KAAC,MAAA,CAAI,UAAU,+EACb,SAAA,CAAAC,EAAAA,IAACkD,EAAAA,OAAA,CAAO,UAAU,4CAAA,CAA6C,EAC/DlD,EAAAA,IAAC,IAAA,CAAG,SAAAF,EAAE,oBAAoB,CAAA,CAAE,CAAA,CAAA,CAC9B,CAAA,EAEJ,QAGC,MAAA,CAAI,UAAU,uBACb,SAAAC,EAAAA,KAAC,QAAA,CAAM,UAAU,SACf,SAAA,CAAAC,MAAC,QAAA,CACC,SAAAD,EAAAA,KAAC,KAAA,CAAG,UAAU,2BACZ,SAAA,CAAAC,MAAC,KAAA,CAAG,UAAU,iGAAkG,SAAAF,EAAE,0BAA0B,EAAE,QAC7I,KAAA,CAAG,UAAU,sHAAuH,SAAAA,EAAE,2BAA2B,EAAE,QACnK,KAAA,CAAG,UAAU,sHAAuH,SAAAA,EAAE,iCAAiC,EAAE,QACzK,KAAA,CAAG,UAAU,iGAAkG,SAAAA,EAAE,2BAA2B,CAAA,CAAE,CAAA,CAAA,CACjJ,CAAA,CACF,EACAC,EAAAA,KAAC,QAAA,CAAM,UAAU,wCACd,SAAA,CAAAuB,GACCtB,EAAAA,IAAC,KAAA,CACC,SAAAA,EAAAA,IAAC,KAAA,CAAG,QAAS,EAAG,UAAU,yBACxB,SAAAA,EAAAA,IAACsD,EAAAA,QAAA,CAAQ,UAAU,6DAAA,CAA8D,EACnF,EACF,EAED,CAAChC,GAAWL,EAAY,SAAW,SACjC,KAAA,CACC,SAAAjB,EAAAA,IAAC,KAAA,CAAG,QAAS,EAAG,UAAU,yBACxB,SAAAD,OAAC,MAAA,CAAI,UAAU,0DACb,SAAA,CAAAC,EAAAA,IAACkD,EAAAA,OAAA,CAAO,UAAU,4CAAA,CAA6C,EAC/DlD,EAAAA,IAAC,IAAA,CAAG,SAAAF,EAAE,2BAA2B,CAAA,CAAE,CAAA,CAAA,CACrC,EACF,EACF,EAED,CAACwB,GAAWL,EAAY,OAAS,GAChCA,EAAY,IAAIP,GACdV,EAAAA,IAACS,EAAA,CAEC,WAAAC,EACA,SAAAC,CAAA,EAFKD,EAAW,EAAA,CAInB,CAAA,CAAA,CAEL,CAAA,CAAA,CACF,CAAA,CACF,CAAA,EAEJ,CAEJ"}
1
+ {"version":3,"file":"PermissionsPage-COI5LJPo.js","sources":["../../src/pages/platform/administration/permissions/PermissionsPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport {\r\n Search,\r\n Loader2,\r\n ChevronRight,\r\n ChevronDown,\r\n Shield,\r\n FolderTree,\r\n List,\r\n LayoutGrid,\r\n Layers,\r\n FileCode,\r\n Sparkles,\r\n ExternalLink\r\n} from 'lucide-react';\r\nimport { adminApi, type PermissionListDto, type PermissionTreeDto } from '@/services/api/adminApi';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\ntype TFunction = ReturnType<typeof useTranslation>['t'];\r\n\r\ninterface ApplicationTreeNodeProps {\r\n readonly app: PermissionTreeDto['applications'][0];\r\n readonly expandedNodes: Set<string>;\r\n readonly toggleNode: (id: string) => void;\r\n readonly t: TFunction;\r\n}\r\n\r\nfunction ApplicationTreeNode({ app, expandedNodes, toggleNode, t }: Readonly<ApplicationTreeNodeProps>) {\r\n return (\r\n <div key={app.id}>\r\n <button\r\n onClick={() => toggleNode(app.id)}\r\n className=\"w-full flex items-center gap-3 py-3 px-4 pl-14 hover:bg-[var(--bg-hover)] transition-colors group\"\r\n >\r\n <div className=\"flex items-center justify-center w-5 h-5 rounded bg-[var(--bg-tertiary)] group-hover:bg-[var(--info-bg)] transition-colors\">\r\n {expandedNodes.has(app.id) ? (\r\n <ChevronDown className=\"w-3.5 h-3.5 text-[var(--text-secondary)] group-hover:text-[var(--info-text)]\" />\r\n ) : (\r\n <ChevronRight className=\"w-3.5 h-3.5 text-[var(--text-secondary)] group-hover:text-[var(--info-text)]\" />\r\n )}\r\n </div>\r\n <div className=\"w-7 h-7 rounded-[var(--radius-button)] bg-[var(--info-bg)] flex items-center justify-center\">\r\n <LayoutGrid className=\"w-3.5 h-3.5 text-[var(--info-text)]\" />\r\n </div>\r\n <div className=\"flex-1 text-left\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium text-[var(--text-primary)] text-sm\">{app.label}</span>\r\n <span className=\"px-1.5 py-0.5 text-[10px] rounded bg-[var(--info-bg)] text-[var(--info-text)] font-medium\">\r\n {t('permissions.levels.application')}\r\n </span>\r\n </div>\r\n <code className=\"text-xs text-[var(--text-tertiary)] font-mono\">{app.permissionPath}</code>\r\n </div>\r\n <div className=\"text-xs text-[var(--text-secondary)]\">\r\n {app.modules.length} {t('permissions.stats.modules').toLowerCase()}\r\n </div>\r\n </button>\r\n\r\n {expandedNodes.has(app.id) && (\r\n <div className=\"bg-[var(--bg-tertiary)]/50\">\r\n {app.modules.map(module => (\r\n <ModuleTreeNode\r\n key={module.id}\r\n module={module}\r\n expandedNodes={expandedNodes}\r\n toggleNode={toggleNode}\r\n t={t}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\ninterface ModuleTreeNodeProps {\r\n readonly module: PermissionTreeDto['applications'][0]['modules'][0];\r\n readonly expandedNodes: Set<string>;\r\n readonly toggleNode: (id: string) => void;\r\n readonly t: TFunction;\r\n}\r\n\r\nfunction ModuleTreeNode({ module, expandedNodes, toggleNode, t }: Readonly<ModuleTreeNodeProps>) {\r\n return (\r\n <div key={module.id}>\r\n <button\r\n onClick={() => toggleNode(module.id)}\r\n className=\"w-full flex items-center gap-3 py-2.5 px-4 pl-24 hover:bg-[var(--bg-hover)] transition-colors group\"\r\n >\r\n {module.sections.length > 0 ? (\r\n <div className=\"flex items-center justify-center w-4 h-4 rounded bg-[var(--bg-tertiary)] group-hover:bg-[var(--success-bg)] transition-colors\">\r\n {expandedNodes.has(module.id) ? (\r\n <ChevronDown className=\"w-3 h-3 text-[var(--text-secondary)] group-hover:text-[var(--success-text)]\" />\r\n ) : (\r\n <ChevronRight className=\"w-3 h-3 text-[var(--text-secondary)] group-hover:text-[var(--success-text)]\" />\r\n )}\r\n </div>\r\n ) : (\r\n <div className=\"w-4 h-4\" />\r\n )}\r\n <div className=\"w-6 h-6 rounded-[var(--radius-button)] bg-[var(--success-bg)] flex items-center justify-center\">\r\n <Layers className=\"w-3 h-3 text-[var(--success-text)]\" />\r\n </div>\r\n <div className=\"flex-1 text-left\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-sm text-[var(--text-primary)]\">{module.label}</span>\r\n <span className=\"px-1.5 py-0.5 text-[10px] rounded bg-[var(--success-bg)] text-[var(--success-text)] font-medium\">\r\n {t('permissions.levels.module')}\r\n </span>\r\n </div>\r\n <code className=\"text-xs text-[var(--text-tertiary)] font-mono\">{module.permissionPath}</code>\r\n </div>\r\n {module.sections.length > 0 && (\r\n <div className=\"text-xs text-[var(--text-secondary)]\">\r\n {module.sections.length} {t('permissions.stats.sections').toLowerCase()}\r\n </div>\r\n )}\r\n </button>\r\n\r\n {expandedNodes.has(module.id) && module.sections.length > 0 && (\r\n <div className=\"bg-[var(--bg-primary)]\">\r\n {module.sections.map(section => (\r\n <div\r\n key={section.id}\r\n className=\"flex items-center gap-3 py-2 px-4 pl-36 text-sm\"\r\n >\r\n <div className=\"w-5 h-5 rounded bg-[var(--warning-bg)] flex items-center justify-center\">\r\n <FileCode className=\"w-3 h-3 text-[var(--warning-text)]\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-[var(--text-primary)]\">{section.label}</span>\r\n <span className=\"px-1.5 py-0.5 text-[10px] rounded bg-[var(--warning-bg)] text-[var(--warning-text)] font-medium\">\r\n {t('permissions.levels.section')}\r\n </span>\r\n </div>\r\n <code className=\"text-xs text-[var(--text-tertiary)] font-mono\">{section.permissionPath}</code>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\ninterface PermissionListRowProps {\r\n readonly permission: PermissionListDto;\r\n readonly navigate: (path: string) => void;\r\n}\r\n\r\nfunction PermissionListRow({ permission, navigate }: Readonly<PermissionListRowProps>) {\r\n return (\r\n <tr\r\n key={permission.id}\r\n onClick={() => navigate(`/administration/permissions/permissions/${permission.id}`)}\r\n className=\"hover:bg-[var(--bg-hover)] transition-colors cursor-pointer group\"\r\n >\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-2\">\r\n <code className=\"font-mono text-sm text-[var(--text-primary)] bg-[var(--bg-tertiary)] px-2 py-1 rounded group-hover:bg-[var(--color-accent-100)] dark:group-hover:bg-[var(--color-accent-900)]/30 transition-colors\">{permission.path}</code>\r\n {permission.isWildcard && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs rounded-full bg-[var(--warning-bg)] text-[var(--warning-text)] font-medium\">\r\n <Sparkles className=\"w-3 h-3\" />\r\n wildcard\r\n </span>\r\n )}\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 hidden md:table-cell\">\r\n <span className=\"px-2.5 py-1 text-xs rounded-full bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)] font-medium\">\r\n {permission.level}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3 text-[var(--text-secondary)] hidden lg:table-cell\">{permission.description || '-'}</td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-3\">\r\n <span className=\"inline-flex items-center justify-center min-w-[2rem] px-2 py-1 text-sm font-medium rounded-full bg-[var(--bg-tertiary)] text-[var(--text-primary)]\">\r\n {permission.rolesCount}\r\n </span>\r\n <ExternalLink className=\"w-4 h-4 text-[var(--text-tertiary)] opacity-0 group-hover:opacity-100 transition-opacity\" />\r\n </div>\r\n </td>\r\n </tr>\r\n );\r\n}\r\n\r\nexport function PermissionsPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const navigate = useNavigate();\r\n const [permissions, setPermissions] = useState<PermissionListDto[]>([]);\r\n const [tree, setTree] = useState<PermissionTreeDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [search, setSearch] = useState('');\r\n const [viewMode, setViewMode] = useState<'list' | 'tree'>('list');\r\n const [expandedNodes, setExpandedNodes] = useState<Set<string>>(new Set());\r\n\r\n const loadPermissions = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const result = await adminApi.permissions.getAll({ search: search || undefined });\r\n setPermissions(result);\r\n } catch (err) {\r\n console.error('Failed to load permissions:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [search]);\r\n\r\n const collectAllNodeIds = (tree: PermissionTreeDto): Set<string> => {\r\n const allIds = new Set<string>();\r\n (tree.applications ?? []).forEach(app => {\r\n allIds.add(app.id);\r\n (app.modules ?? []).forEach(mod => {\r\n allIds.add(mod.id);\r\n });\r\n });\r\n return allIds;\r\n };\r\n\r\n const loadTree = async () => {\r\n try {\r\n const result = await adminApi.permissions.getTree();\r\n setTree(result);\r\n const allIds = collectAllNodeIds(result);\r\n setExpandedNodes(allIds);\r\n } catch (err) {\r\n console.error('Failed to load permission tree:', err);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n loadPermissions();\r\n loadTree();\r\n }, [loadPermissions]);\r\n\r\n const handleSearch = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n loadPermissions();\r\n };\r\n\r\n const toggleNode = (id: string) => {\r\n setExpandedNodes(prev => {\r\n const next = new Set(prev);\r\n if (next.has(id)) {\r\n next.delete(id);\r\n } else {\r\n next.add(id);\r\n }\r\n return next;\r\n });\r\n };\r\n\r\n const countTreeStats = (tree: PermissionTreeDto) => {\r\n const apps = tree.applications ?? [];\r\n let modules = 0;\r\n let sections = 0;\r\n apps.forEach(app => {\r\n const mods = app.modules ?? [];\r\n modules += mods.length;\r\n mods.forEach(mod => {\r\n sections += (mod.sections ?? []).length;\r\n });\r\n });\r\n return { applications: apps.length, modules, sections };\r\n };\r\n\r\n const getStats = () => {\r\n if (!tree) return { applications: 0, modules: 0, sections: 0 };\r\n return countTreeStats(tree);\r\n };\r\n\r\n const stats = getStats();\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Breadcrumb */}\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('permissions.title') }\r\n ]}\r\n />\r\n\r\n {/* Page Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-4\">\r\n <div className=\"w-12 h-12 rounded-[var(--radius-button)] bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 flex items-center justify-center\">\r\n <Shield className=\"w-6 h-6 text-[var(--color-accent-600)] dark:text-[var(--color-accent-400)]\" />\r\n </div>\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{t('permissions.title')}</h1>\r\n <p className=\"text-[var(--text-secondary)] mt-0.5\">{t('permissions.subtitle')}</p>\r\n </div>\r\n </div>\r\n\r\n {/* View Mode Toggle */}\r\n <div className=\"flex items-center gap-1 p-1 bg-[var(--bg-tertiary)] rounded-[var(--radius-button)]\">\r\n <button\r\n onClick={() => setViewMode('tree')}\r\n className={`flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium transition-all ${\r\n viewMode === 'tree'\r\n ? 'bg-[var(--color-accent-500)] text-white shadow-sm'\r\n : 'text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <FolderTree className=\"w-4 h-4\" />\r\n {t('permissions.treeView')}\r\n </button>\r\n <button\r\n onClick={() => setViewMode('list')}\r\n className={`flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium transition-all ${\r\n viewMode === 'list'\r\n ? 'bg-[var(--color-accent-500)] text-white shadow-sm'\r\n : 'text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <List className=\"w-4 h-4\" />\r\n {t('permissions.listView')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Stats Cards */}\r\n <div className=\"grid grid-cols-3 gap-4\">\r\n <div className=\"bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-10 h-10 rounded-[var(--radius-button)] bg-[var(--info-bg)] flex items-center justify-center\">\r\n <LayoutGrid className=\"w-5 h-5 text-[var(--info-text)]\" />\r\n </div>\r\n <div>\r\n <div className=\"text-2xl font-bold text-[var(--text-primary)]\">{stats.applications}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">{t('permissions.stats.applications')}</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-10 h-10 rounded-[var(--radius-button)] bg-[var(--success-bg)] flex items-center justify-center\">\r\n <Layers className=\"w-5 h-5 text-[var(--success-text)]\" />\r\n </div>\r\n <div>\r\n <div className=\"text-2xl font-bold text-[var(--text-primary)]\">{stats.modules}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">{t('permissions.stats.modules')}</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-10 h-10 rounded-[var(--radius-button)] bg-[var(--warning-bg)] flex items-center justify-center\">\r\n <FileCode className=\"w-5 h-5 text-[var(--warning-text)]\" />\r\n </div>\r\n <div>\r\n <div className=\"text-2xl font-bold text-[var(--text-primary)]\">{stats.sections}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">{t('permissions.stats.sections')}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Search Bar (List View) */}\r\n {viewMode === 'list' && (\r\n <form onSubmit={handleSearch} className=\"flex gap-2\">\r\n <div className=\"relative flex-1 max-w-md\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={e => setSearch(e.target.value)}\r\n placeholder={t('common.search')}\r\n className=\"w-full pl-10 pr-4 py-2.5 rounded-[var(--radius-button)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-transparent transition-all\"\r\n />\r\n </div>\r\n <button\r\n type=\"submit\"\r\n className=\"px-4 py-2.5 rounded-[var(--radius-button)] bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white font-medium transition-colors\"\r\n >\r\n {t('common.search')}\r\n </button>\r\n </form>\r\n )}\r\n\r\n {/* Tree View */}\r\n {viewMode === 'tree' ? (\r\n <div className=\"bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n {loading && (\r\n <div className=\"flex justify-center py-16\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n )}\r\n {!loading && tree?.applications?.length ? (\r\n <div className=\"divide-y divide-[var(--border-color)]\">\r\n {tree.applications.map(app => (\r\n <ApplicationTreeNode\r\n key={app.id}\r\n app={app}\r\n expandedNodes={expandedNodes}\r\n toggleNode={toggleNode}\r\n t={t}\r\n />\r\n ))}\r\n </div>\r\n ) : !loading && (\r\n <div className=\"flex flex-col items-center justify-center py-16 text-[var(--text-secondary)]\">\r\n <Shield className=\"w-12 h-12 mb-4 text-[var(--text-tertiary)]\" />\r\n <p>{t('permissions.noData')}</p>\r\n </div>\r\n )}\r\n </div>\r\n ) : (\r\n /* List View */\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('permissions.columns.path')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden md:table-cell\">{t('permissions.columns.level')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">{t('permissions.columns.description')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('permissions.columns.roles')}</th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {loading && (\r\n <tr>\r\n <td colSpan={4} className=\"px-6 py-16 text-center\">\r\n <Loader2 className=\"w-8 h-8 animate-spin mx-auto text-[var(--color-accent-500)]\" />\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && permissions.length === 0 && (\r\n <tr>\r\n <td colSpan={4} className=\"px-6 py-16 text-center\">\r\n <div className=\"flex flex-col items-center text-[var(--text-secondary)]\">\r\n <Shield className=\"w-12 h-12 mb-4 text-[var(--text-tertiary)]\" />\r\n <p>{t('permissions.noPermissions')}</p>\r\n </div>\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && permissions.length > 0 && (\r\n permissions.map(permission => (\r\n <PermissionListRow\r\n key={permission.id}\r\n permission={permission}\r\n navigate={navigate}\r\n />\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["ApplicationTreeNode","app","expandedNodes","toggleNode","t","jsxs","jsx","ChevronDown","ChevronRight","LayoutGrid","module","ModuleTreeNode","Layers","section","FileCode","PermissionListRow","permission","navigate","Sparkles","ExternalLink","PermissionsPage","useTranslation","useNavigate","permissions","setPermissions","useState","tree","setTree","loading","setLoading","search","setSearch","viewMode","setViewMode","setExpandedNodes","loadPermissions","useCallback","result","adminApi","err","collectAllNodeIds","allIds","mod","loadTree","useEffect","handleSearch","e","id","prev","next","stats","apps","modules","sections","mods","Breadcrumb","Shield","FolderTree","List","Search","Loader2"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { useState as m, useCallback as B, useEffect as R } from "react";
3
3
  import { useTranslation as G } from "react-i18next";
4
4
  import { useNavigate as W } from "react-router-dom";
5
5
  import { Shield as g, FolderTree as q, List as z, LayoutGrid as S, Layers as j, FileCode as C, Search as H, Loader2 as w, ChevronDown as L, ChevronRight as P, Sparkles as J, ExternalLink as K } from "lucide-react";
6
- import { k, B as O } from "./index-CwSaRXXg.js";
6
+ import { k, B as O } from "./index-lpIzhufD.js";
7
7
  function Q({ app: t, expandedNodes: i, toggleNode: o, t: l }) {
8
8
  return /* @__PURE__ */ r("div", { children: [
9
9
  /* @__PURE__ */ r(
@@ -293,4 +293,4 @@ function ie() {
293
293
  export {
294
294
  ie as PermissionsPage
295
295
  };
296
- //# sourceMappingURL=PermissionsPage-DLy9U3P3.js.map
296
+ //# sourceMappingURL=PermissionsPage-CkOwH2_d.js.map