@atlashub/smartstack 3.21.0 → 3.24.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":"OnboardingWizardPage-BQah4cI8.js","sources":["../../src/pages/auth/OnboardingWizardPage.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Loader2, CheckCircle, Globe, Palette, Sparkles, ArrowRight, ArrowLeft } from 'lucide-react';\r\nimport { api } from '@/services/api/apiClient';\r\nimport { changeLanguage } from '@/i18n/config';\r\n\r\ntype Step = 'language' | 'theme' | 'complete';\r\n\r\ninterface LanguageOption {\r\n code: string;\r\n name: string;\r\n flag: string;\r\n}\r\n\r\ninterface ThemeOption {\r\n value: string;\r\n labelKey: string;\r\n icon: string;\r\n}\r\n\r\nconst languages: LanguageOption[] = [\r\n { code: 'fr', name: 'Francais', flag: '🇫🇷' },\r\n { code: 'en', name: 'English', flag: '🇬🇧' },\r\n { code: 'de', name: 'Deutsch', flag: '🇩🇪' },\r\n { code: 'it', name: 'Italiano', flag: '🇮🇹' },\r\n];\r\n\r\nconst themes: ThemeOption[] = [\r\n { value: 'light', labelKey: 'themeLight', icon: '☀️' },\r\n { value: 'dark', labelKey: 'themeDark', icon: '🌙' },\r\n { value: 'system', labelKey: 'themeSystem', icon: '💻' },\r\n];\r\n\r\nconst accentColors = [\r\n { key: 'indigo', color: '#6366f1', name: 'Indigo' },\r\n { key: 'blue', color: '#3b82f6', name: 'Blue' },\r\n { key: 'emerald', color: '#10b981', name: 'Emerald' },\r\n { key: 'amber', color: '#f59e0b', name: 'Amber' },\r\n { key: 'rose', color: '#f43f5e', name: 'Rose' },\r\n { key: 'purple', color: '#a855f7', name: 'Purple' },\r\n];\r\n\r\nexport function OnboardingWizardPage(): ReactElement {\r\n const { t, i18n } = useTranslation('auth');\r\n const navigate = useNavigate();\r\n\r\n const [currentStep, setCurrentStep] = useState<Step>('language');\r\n const [selectedLanguage, setSelectedLanguage] = useState(i18n.language?.substring(0, 2) || 'fr');\r\n const [selectedTheme, setSelectedTheme] = useState('dark');\r\n const [selectedAccentColor, setSelectedAccentColor] = useState('indigo');\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n // Check onboarding status on load\r\n useEffect(() => {\r\n const checkOnboardingStatus = async () => {\r\n try {\r\n const response = await api.get<{ hasCompletedOnboarding: boolean }>('/api/onboarding/status');\r\n if (response.hasCompletedOnboarding) {\r\n // Already completed, redirect to home\r\n navigate('/myspace', { replace: true });\r\n }\r\n } catch {\r\n // If we can't check status, allow proceeding\r\n }\r\n };\r\n\r\n checkOnboardingStatus();\r\n }, [navigate]);\r\n\r\n // Update language immediately when selected (lazy loads translations if needed)\r\n useEffect(() => {\r\n if (selectedLanguage && selectedLanguage !== i18n.language?.substring(0, 2)) {\r\n changeLanguage(selectedLanguage);\r\n }\r\n }, [selectedLanguage, i18n]);\r\n\r\n const steps: { key: Step; labelKey: string; icon: React.ReactNode }[] = [\r\n { key: 'language', labelKey: 'stepLanguage', icon: <Globe className=\"w-5 h-5\" /> },\r\n { key: 'theme', labelKey: 'stepTheme', icon: <Palette className=\"w-5 h-5\" /> },\r\n { key: 'complete', labelKey: 'stepComplete', icon: <Sparkles className=\"w-5 h-5\" /> },\r\n ];\r\n\r\n const currentStepIndex = steps.findIndex((s) => s.key === currentStep);\r\n\r\n const handleNext = () => {\r\n const nextIndex = currentStepIndex + 1;\r\n if (nextIndex < steps.length) {\r\n setCurrentStep(steps[nextIndex].key);\r\n }\r\n };\r\n\r\n const handleBack = () => {\r\n const prevIndex = currentStepIndex - 1;\r\n if (prevIndex >= 0) {\r\n setCurrentStep(steps[prevIndex].key);\r\n }\r\n };\r\n\r\n const handleComplete = async () => {\r\n setIsSubmitting(true);\r\n setError(null);\r\n\r\n try {\r\n await api.post('/api/onboarding/complete', {\r\n language: selectedLanguage,\r\n theme: selectedTheme,\r\n accentColorKey: selectedAccentColor,\r\n });\r\n\r\n // Save preferences locally\r\n localStorage.setItem('i18nextLng', selectedLanguage);\r\n localStorage.setItem(\r\n 'smartstack-theme-config',\r\n JSON.stringify({\r\n mode: selectedTheme,\r\n accentColorKey: selectedAccentColor,\r\n borderRadius: {},\r\n itemPaletteKey: 'neutral',\r\n })\r\n );\r\n\r\n setSuccess(true);\r\n\r\n // Redirect after success animation\r\n setTimeout(() => {\r\n window.location.href = '/myspace';\r\n }, 2000);\r\n } catch (err) {\r\n console.error('Onboarding error:', err);\r\n setError(t('onboarding.errorMessage'));\r\n } finally {\r\n setIsSubmitting(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-[var(--bg-primary)]\">\r\n <div className=\"max-w-md w-full mx-4\">\r\n <div className=\"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]\">\r\n <div className=\"text-center\">\r\n <div className=\"w-20 h-20 mx-auto bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mb-6\">\r\n <CheckCircle className=\"w-12 h-12 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold mb-3\">{t('onboarding.successTitle')}</h2>\r\n <p className=\"text-[var(--text-secondary)]\">{t('onboarding.successMessage')}</p>\r\n <div className=\"mt-6\">\r\n <Loader2 className=\"w-6 h-6 mx-auto text-[var(--color-accent-500)] animate-spin\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-[var(--bg-primary)] p-4\">\r\n <div className=\"max-w-lg w-full\">\r\n {/* Header */}\r\n <div className=\"text-center mb-8\">\r\n <div className=\"flex items-center justify-center gap-2 mb-4\">\r\n <div className=\"w-12 h-12 bg-gradient-to-br from-blue-500 to-purple-600 rounded-xl flex items-center justify-center\">\r\n <span className=\"text-white text-xl font-bold\">S</span>\r\n </div>\r\n </div>\r\n <h1 className=\"text-3xl font-bold mb-2\">{t('onboarding.title')}</h1>\r\n <p className=\"text-[var(--text-secondary)]\">{t('onboarding.subtitle')}</p>\r\n </div>\r\n\r\n {/* Steps indicator */}\r\n <div className=\"flex justify-center mb-8\">\r\n <div className=\"flex items-center gap-2\">\r\n {steps.map((step, index) => (\r\n <div key={step.key} className=\"flex items-center\">\r\n <div\r\n className={`w-10 h-10 rounded-full flex items-center justify-center transition-all ${\r\n index <= currentStepIndex\r\n ? 'bg-[var(--color-accent-500)] text-white'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n {step.icon}\r\n </div>\r\n {index < steps.length - 1 && (\r\n <div\r\n className={`w-12 h-1 mx-1 rounded transition-all ${\r\n index < currentStepIndex\r\n ? 'bg-[var(--color-accent-500)]'\r\n : 'bg-[var(--bg-tertiary)]'\r\n }`}\r\n />\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Card */}\r\n <div className=\"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]\">\r\n {/* Language Step */}\r\n {currentStep === 'language' && (\r\n <div>\r\n <h2 className=\"text-xl font-semibold mb-6 text-center\">{t('onboarding.languageLabel')}</h2>\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n {languages.map((lang) => (\r\n <button\r\n key={lang.code}\r\n onClick={() => setSelectedLanguage(lang.code)}\r\n className={`p-4 rounded-xl border-2 transition-all ${\r\n selectedLanguage === lang.code\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-300)]'\r\n }`}\r\n >\r\n <span className=\"text-3xl mb-2 block\">{lang.flag}</span>\r\n <span className=\"font-medium\">{lang.name}</span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Theme Step */}\r\n {currentStep === 'theme' && (\r\n <div>\r\n <h2 className=\"text-xl font-semibold mb-6 text-center\">{t('onboarding.themeLabel')}</h2>\r\n\r\n {/* Theme selection */}\r\n <div className=\"grid grid-cols-3 gap-3 mb-8\">\r\n {themes.map((theme) => (\r\n <button\r\n key={theme.value}\r\n onClick={() => setSelectedTheme(theme.value)}\r\n className={`p-4 rounded-xl border-2 transition-all ${\r\n selectedTheme === theme.value\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-300)]'\r\n }`}\r\n >\r\n <span className=\"text-2xl mb-2 block\">{theme.icon}</span>\r\n <span className=\"text-sm font-medium\">{t(`onboarding.${theme.labelKey}`)}</span>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Accent color selection */}\r\n <div>\r\n <h3 className=\"text-sm font-medium mb-3 text-[var(--text-secondary)]\">\r\n {t('onboarding.accentColorLabel')}\r\n </h3>\r\n <div className=\"flex justify-center gap-3\">\r\n {accentColors.map((color) => (\r\n <button\r\n key={color.key}\r\n onClick={() => setSelectedAccentColor(color.key)}\r\n className={`w-10 h-10 rounded-full transition-all ${\r\n selectedAccentColor === color.key\r\n ? 'ring-2 ring-offset-2 ring-[var(--color-accent-500)] ring-offset-[var(--bg-secondary)]'\r\n : 'hover:scale-110'\r\n }`}\r\n style={{ backgroundColor: color.color }}\r\n title={color.name}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Complete Step */}\r\n {currentStep === 'complete' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-20 h-20 mx-auto bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 rounded-full flex items-center justify-center mb-6\">\r\n <Sparkles className=\"w-10 h-10 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold mb-4\">{t('onboarding.stepComplete')}</h2>\r\n <div className=\"text-[var(--text-secondary)] mb-6 space-y-2\">\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <Globe className=\"w-4 h-4\" />\r\n {languages.find((l) => l.code === selectedLanguage)?.name}\r\n </span>\r\n </p>\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <Palette className=\"w-4 h-4\" />\r\n {themes.find((t) => t.value === selectedTheme)?.icon}{' '}\r\n {t(`onboarding.${themes.find((th) => th.value === selectedTheme)?.labelKey}`)}\r\n </span>\r\n </p>\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <span\r\n className=\"w-4 h-4 rounded-full\"\r\n style={{ backgroundColor: accentColors.find((c) => c.key === selectedAccentColor)?.color }}\r\n />\r\n {accentColors.find((c) => c.key === selectedAccentColor)?.name}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-300 rounded-lg p-3 mb-4 text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Navigation buttons */}\r\n <div className=\"flex justify-between mt-8\">\r\n {currentStepIndex > 0 ? (\r\n <button\r\n onClick={handleBack}\r\n className=\"flex items-center gap-2 px-4 py-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('onboarding.back')}\r\n </button>\r\n ) : (\r\n <div />\r\n )}\r\n\r\n {currentStep === 'complete' ? (\r\n <button\r\n onClick={handleComplete}\r\n disabled={isSubmitting}\r\n className=\"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {isSubmitting ? (\r\n <>\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {t('onboarding.completing')}\r\n </>\r\n ) : (\r\n <>\r\n {t('onboarding.complete')}\r\n <CheckCircle className=\"w-4 h-4\" />\r\n </>\r\n )}\r\n </button>\r\n ) : (\r\n <button\r\n onClick={handleNext}\r\n className=\"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors\"\r\n >\r\n {t('onboarding.continue')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["languages","themes","accentColors","OnboardingWizardPage","i18n","useTranslation","navigate","useNavigate","currentStep","setCurrentStep","useState","selectedLanguage","setSelectedLanguage","selectedTheme","setSelectedTheme","selectedAccentColor","setSelectedAccentColor","isSubmitting","setIsSubmitting","error","setError","success","setSuccess","useEffect","api","changeLanguage","steps","jsx","Globe","Palette","Sparkles","currentStepIndex","s","handleNext","nextIndex","handleBack","prevIndex","handleComplete","err","jsxs","CheckCircle","Loader2","step","index","lang","theme","color","l","t","th","c","ArrowLeft","Fragment","ArrowRight"],"mappings":"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"}
1
+ {"version":3,"file":"OnboardingWizardPage-CyC2zONO.js","sources":["../../src/pages/auth/OnboardingWizardPage.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Loader2, CheckCircle, Globe, Palette, Sparkles, ArrowRight, ArrowLeft } from 'lucide-react';\r\nimport { api } from '@/services/api/apiClient';\r\nimport { changeLanguage } from '@/i18n/config';\r\n\r\ntype Step = 'language' | 'theme' | 'complete';\r\n\r\ninterface LanguageOption {\r\n code: string;\r\n name: string;\r\n flag: string;\r\n}\r\n\r\ninterface ThemeOption {\r\n value: string;\r\n labelKey: string;\r\n icon: string;\r\n}\r\n\r\nconst languages: LanguageOption[] = [\r\n { code: 'fr', name: 'Francais', flag: '🇫🇷' },\r\n { code: 'en', name: 'English', flag: '🇬🇧' },\r\n { code: 'de', name: 'Deutsch', flag: '🇩🇪' },\r\n { code: 'it', name: 'Italiano', flag: '🇮🇹' },\r\n];\r\n\r\nconst themes: ThemeOption[] = [\r\n { value: 'light', labelKey: 'themeLight', icon: '☀️' },\r\n { value: 'dark', labelKey: 'themeDark', icon: '🌙' },\r\n { value: 'system', labelKey: 'themeSystem', icon: '💻' },\r\n];\r\n\r\nconst accentColors = [\r\n { key: 'indigo', color: '#6366f1', name: 'Indigo' },\r\n { key: 'blue', color: '#3b82f6', name: 'Blue' },\r\n { key: 'emerald', color: '#10b981', name: 'Emerald' },\r\n { key: 'amber', color: '#f59e0b', name: 'Amber' },\r\n { key: 'rose', color: '#f43f5e', name: 'Rose' },\r\n { key: 'purple', color: '#a855f7', name: 'Purple' },\r\n];\r\n\r\nexport function OnboardingWizardPage(): ReactElement {\r\n const { t, i18n } = useTranslation('auth');\r\n const navigate = useNavigate();\r\n\r\n const [currentStep, setCurrentStep] = useState<Step>('language');\r\n const [selectedLanguage, setSelectedLanguage] = useState(i18n.language?.substring(0, 2) || 'fr');\r\n const [selectedTheme, setSelectedTheme] = useState('dark');\r\n const [selectedAccentColor, setSelectedAccentColor] = useState('indigo');\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n // Check onboarding status on load\r\n useEffect(() => {\r\n const checkOnboardingStatus = async () => {\r\n try {\r\n const response = await api.get<{ hasCompletedOnboarding: boolean }>('/api/onboarding/status');\r\n if (response.hasCompletedOnboarding) {\r\n // Already completed, redirect to home\r\n navigate('/myspace', { replace: true });\r\n }\r\n } catch {\r\n // If we can't check status, allow proceeding\r\n }\r\n };\r\n\r\n checkOnboardingStatus();\r\n }, [navigate]);\r\n\r\n // Update language immediately when selected (lazy loads translations if needed)\r\n useEffect(() => {\r\n if (selectedLanguage && selectedLanguage !== i18n.language?.substring(0, 2)) {\r\n changeLanguage(selectedLanguage);\r\n }\r\n }, [selectedLanguage, i18n]);\r\n\r\n const steps: { key: Step; labelKey: string; icon: React.ReactNode }[] = [\r\n { key: 'language', labelKey: 'stepLanguage', icon: <Globe className=\"w-5 h-5\" /> },\r\n { key: 'theme', labelKey: 'stepTheme', icon: <Palette className=\"w-5 h-5\" /> },\r\n { key: 'complete', labelKey: 'stepComplete', icon: <Sparkles className=\"w-5 h-5\" /> },\r\n ];\r\n\r\n const currentStepIndex = steps.findIndex((s) => s.key === currentStep);\r\n\r\n const handleNext = () => {\r\n const nextIndex = currentStepIndex + 1;\r\n if (nextIndex < steps.length) {\r\n setCurrentStep(steps[nextIndex].key);\r\n }\r\n };\r\n\r\n const handleBack = () => {\r\n const prevIndex = currentStepIndex - 1;\r\n if (prevIndex >= 0) {\r\n setCurrentStep(steps[prevIndex].key);\r\n }\r\n };\r\n\r\n const handleComplete = async () => {\r\n setIsSubmitting(true);\r\n setError(null);\r\n\r\n try {\r\n await api.post('/api/onboarding/complete', {\r\n language: selectedLanguage,\r\n theme: selectedTheme,\r\n accentColorKey: selectedAccentColor,\r\n });\r\n\r\n // Save preferences locally\r\n localStorage.setItem('i18nextLng', selectedLanguage);\r\n localStorage.setItem(\r\n 'smartstack-theme-config',\r\n JSON.stringify({\r\n mode: selectedTheme,\r\n accentColorKey: selectedAccentColor,\r\n borderRadius: {},\r\n itemPaletteKey: 'neutral',\r\n })\r\n );\r\n\r\n setSuccess(true);\r\n\r\n // Redirect after success animation\r\n setTimeout(() => {\r\n window.location.href = '/myspace';\r\n }, 2000);\r\n } catch (err) {\r\n console.error('Onboarding error:', err);\r\n setError(t('onboarding.errorMessage'));\r\n } finally {\r\n setIsSubmitting(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-[var(--bg-primary)]\">\r\n <div className=\"max-w-md w-full mx-4\">\r\n <div className=\"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]\">\r\n <div className=\"text-center\">\r\n <div className=\"w-20 h-20 mx-auto bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mb-6\">\r\n <CheckCircle className=\"w-12 h-12 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold mb-3\">{t('onboarding.successTitle')}</h2>\r\n <p className=\"text-[var(--text-secondary)]\">{t('onboarding.successMessage')}</p>\r\n <div className=\"mt-6\">\r\n <Loader2 className=\"w-6 h-6 mx-auto text-[var(--color-accent-500)] animate-spin\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-[var(--bg-primary)] p-4\">\r\n <div className=\"max-w-lg w-full\">\r\n {/* Header */}\r\n <div className=\"text-center mb-8\">\r\n <div className=\"flex items-center justify-center gap-2 mb-4\">\r\n <div className=\"w-12 h-12 bg-gradient-to-br from-blue-500 to-purple-600 rounded-xl flex items-center justify-center\">\r\n <span className=\"text-white text-xl font-bold\">S</span>\r\n </div>\r\n </div>\r\n <h1 className=\"text-3xl font-bold mb-2\">{t('onboarding.title')}</h1>\r\n <p className=\"text-[var(--text-secondary)]\">{t('onboarding.subtitle')}</p>\r\n </div>\r\n\r\n {/* Steps indicator */}\r\n <div className=\"flex justify-center mb-8\">\r\n <div className=\"flex items-center gap-2\">\r\n {steps.map((step, index) => (\r\n <div key={step.key} className=\"flex items-center\">\r\n <div\r\n className={`w-10 h-10 rounded-full flex items-center justify-center transition-all ${\r\n index <= currentStepIndex\r\n ? 'bg-[var(--color-accent-500)] text-white'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n {step.icon}\r\n </div>\r\n {index < steps.length - 1 && (\r\n <div\r\n className={`w-12 h-1 mx-1 rounded transition-all ${\r\n index < currentStepIndex\r\n ? 'bg-[var(--color-accent-500)]'\r\n : 'bg-[var(--bg-tertiary)]'\r\n }`}\r\n />\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Card */}\r\n <div className=\"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]\">\r\n {/* Language Step */}\r\n {currentStep === 'language' && (\r\n <div>\r\n <h2 className=\"text-xl font-semibold mb-6 text-center\">{t('onboarding.languageLabel')}</h2>\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n {languages.map((lang) => (\r\n <button\r\n key={lang.code}\r\n onClick={() => setSelectedLanguage(lang.code)}\r\n className={`p-4 rounded-xl border-2 transition-all ${\r\n selectedLanguage === lang.code\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-300)]'\r\n }`}\r\n >\r\n <span className=\"text-3xl mb-2 block\">{lang.flag}</span>\r\n <span className=\"font-medium\">{lang.name}</span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Theme Step */}\r\n {currentStep === 'theme' && (\r\n <div>\r\n <h2 className=\"text-xl font-semibold mb-6 text-center\">{t('onboarding.themeLabel')}</h2>\r\n\r\n {/* Theme selection */}\r\n <div className=\"grid grid-cols-3 gap-3 mb-8\">\r\n {themes.map((theme) => (\r\n <button\r\n key={theme.value}\r\n onClick={() => setSelectedTheme(theme.value)}\r\n className={`p-4 rounded-xl border-2 transition-all ${\r\n selectedTheme === theme.value\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-300)]'\r\n }`}\r\n >\r\n <span className=\"text-2xl mb-2 block\">{theme.icon}</span>\r\n <span className=\"text-sm font-medium\">{t(`onboarding.${theme.labelKey}`)}</span>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Accent color selection */}\r\n <div>\r\n <h3 className=\"text-sm font-medium mb-3 text-[var(--text-secondary)]\">\r\n {t('onboarding.accentColorLabel')}\r\n </h3>\r\n <div className=\"flex justify-center gap-3\">\r\n {accentColors.map((color) => (\r\n <button\r\n key={color.key}\r\n onClick={() => setSelectedAccentColor(color.key)}\r\n className={`w-10 h-10 rounded-full transition-all ${\r\n selectedAccentColor === color.key\r\n ? 'ring-2 ring-offset-2 ring-[var(--color-accent-500)] ring-offset-[var(--bg-secondary)]'\r\n : 'hover:scale-110'\r\n }`}\r\n style={{ backgroundColor: color.color }}\r\n title={color.name}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Complete Step */}\r\n {currentStep === 'complete' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-20 h-20 mx-auto bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 rounded-full flex items-center justify-center mb-6\">\r\n <Sparkles className=\"w-10 h-10 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold mb-4\">{t('onboarding.stepComplete')}</h2>\r\n <div className=\"text-[var(--text-secondary)] mb-6 space-y-2\">\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <Globe className=\"w-4 h-4\" />\r\n {languages.find((l) => l.code === selectedLanguage)?.name}\r\n </span>\r\n </p>\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <Palette className=\"w-4 h-4\" />\r\n {themes.find((t) => t.value === selectedTheme)?.icon}{' '}\r\n {t(`onboarding.${themes.find((th) => th.value === selectedTheme)?.labelKey}`)}\r\n </span>\r\n </p>\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <span\r\n className=\"w-4 h-4 rounded-full\"\r\n style={{ backgroundColor: accentColors.find((c) => c.key === selectedAccentColor)?.color }}\r\n />\r\n {accentColors.find((c) => c.key === selectedAccentColor)?.name}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-300 rounded-lg p-3 mb-4 text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Navigation buttons */}\r\n <div className=\"flex justify-between mt-8\">\r\n {currentStepIndex > 0 ? (\r\n <button\r\n onClick={handleBack}\r\n className=\"flex items-center gap-2 px-4 py-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('onboarding.back')}\r\n </button>\r\n ) : (\r\n <div />\r\n )}\r\n\r\n {currentStep === 'complete' ? (\r\n <button\r\n onClick={handleComplete}\r\n disabled={isSubmitting}\r\n className=\"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {isSubmitting ? (\r\n <>\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {t('onboarding.completing')}\r\n </>\r\n ) : (\r\n <>\r\n {t('onboarding.complete')}\r\n <CheckCircle className=\"w-4 h-4\" />\r\n </>\r\n )}\r\n </button>\r\n ) : (\r\n <button\r\n onClick={handleNext}\r\n className=\"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors\"\r\n >\r\n {t('onboarding.continue')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["languages","themes","accentColors","OnboardingWizardPage","i18n","useTranslation","navigate","useNavigate","currentStep","setCurrentStep","useState","selectedLanguage","setSelectedLanguage","selectedTheme","setSelectedTheme","selectedAccentColor","setSelectedAccentColor","isSubmitting","setIsSubmitting","error","setError","success","setSuccess","useEffect","api","changeLanguage","steps","jsx","Globe","Palette","Sparkles","currentStepIndex","s","handleNext","nextIndex","handleBack","prevIndex","handleComplete","err","jsxs","CheckCircle","Loader2","step","index","lang","theme","color","l","t","th","c","ArrowLeft","Fragment","ArrowRight"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsx as e, jsxs as r } from "react/jsx-runtime";
2
2
  import { useState as d, useCallback as T, useEffect as L } from "react";
3
3
  import { useParams as R, useNavigate as E } from "react-router-dom";
4
4
  import { useTranslation as $ } from "react-i18next";
5
- import { k as I, B as O } from "./index-CwSaRXXg.js";
5
+ import { k as I, B as O } from "./index-lpIzhufD.js";
6
6
  import { Loader2 as j, ArrowLeft as U, Lock as g, CheckCircle as B, Copy as F, Info as V, Layers as W, Shield as i, Calendar as _, Building2 as m, Users as p, Play as M, UserPlus as K, Trash2 as q, Edit as z, Plus as H, Eye as J } from "lucide-react";
7
7
  const N = {
8
8
  "*": /* @__PURE__ */ e(i, { className: "h-4 w-4" }),
@@ -275,4 +275,4 @@ function te() {
275
275
  export {
276
276
  te as PermissionDetailPage
277
277
  };
278
- //# sourceMappingURL=PermissionDetailPage-Ckjdjvf9.js.map
278
+ //# sourceMappingURL=PermissionDetailPage-BDHiNgky.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PermissionDetailPage-Ckjdjvf9.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-BDHiNgky.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"),i=require("react"),h=require("react-router-dom"),A=require("react-i18next"),v=require("./index-2wUhd9Lu.js"),a=require("lucide-react"),b={"*":e.jsx(a.Shield,{className:"h-4 w-4"}),Read:e.jsx(a.Eye,{className:"h-4 w-4"}),Create:e.jsx(a.Plus,{className:"h-4 w-4"}),Update:e.jsx(a.Edit,{className:"h-4 w-4"}),Delete:e.jsx(a.Trash2,{className:"h-4 w-4"}),Assign:e.jsx(a.UserPlus,{className:"h-4 w-4"}),Execute:e.jsx(a.Play,{className:"h-4 w-4"})},g={"*":"bg-[var(--accent-bg)] text-[var(--accent-text)] border-[var(--accent-border)]",Read:"bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)]",Create:"bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]",Update:"bg-[var(--warning-bg)] text-[var(--warning-text)] border-[var(--warning-border)]",Delete:"bg-[var(--error-bg)] text-[var(--error-text)] border-[var(--error-border)]",Assign:"bg-[var(--accent-bg)] text-[var(--accent-text)] border-[var(--accent-border)]",Execute:"bg-[var(--warning-bg)] text-[var(--warning-text)] border-[var(--warning-border)]"},P={Context:"bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300",Application:"bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300",Module:"bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300",Section:"bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-300",Resource:"bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-300"};function G(){const{t:s}=A.useTranslation(["admin","common"]),{id:d}=h.useParams(),n=h.useNavigate(),[t,j]=i.useState(null),[N,o]=i.useState(!0),[x,y]=i.useState(null),[f,m]=i.useState(!1),[l,w]=i.useState("roles"),p=i.useCallback(async()=>{if(d)try{o(!0);const r=await v.adminApi.permissions.getById(d);j(r)}catch(r){console.error("Failed to load permission:",r),y(s("admin:permissionDetail.errors.loadFailed","Failed to load permission"))}finally{o(!1)}},[d,s]);i.useEffect(()=>{p()},[p]);const k=async()=>{t?.path&&(await navigator.clipboard.writeText(t.path),m(!0),setTimeout(()=>m(!1),2e3))};if(N)return e.jsx("div",{className:"flex items-center justify-center min-h-[400px]",children:e.jsx(a.Loader2,{className:"h-8 w-8 animate-spin text-[var(--color-accent-500)]"})});if(x||!t)return e.jsx("div",{className:"p-6",children:e.jsxs("div",{className:"bg-[var(--error-bg)] border border-[var(--error-border)] rounded-lg p-4",children:[e.jsx("p",{className:"text-[var(--error-text)]",children:x||s("admin:permissionDetail.errors.notFound","Permission not found")}),e.jsx("button",{onClick:()=>n("/administration/permissions/permissions"),className:"mt-4 text-sm text-[var(--color-accent-500)] hover:underline",children:s("common:buttons.back")})]})});const u=t.action||"*",S=g[u]||g["*"],C=b[u]||b["*"],D=P[t.level]||"bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-200";return e.jsxs("div",{className:"p-6 space-y-6",children:[e.jsx(v.Breadcrumb,{items:[{label:s("admin:header.title"),href:"/administration"},{label:s("admin:permissions.title","Permissions"),href:"/administration/permissions/permissions"},{label:t?.path||"Detail"}]}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("button",{onClick:()=>n("/administration/permissions/permissions"),className:"p-2 hover:bg-[var(--bg-hover)] rounded-lg transition-colors",children:e.jsx(a.ArrowLeft,{className:"h-5 w-5 text-[var(--text-secondary)]"})}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(a.Lock,{className:"h-6 w-6 text-[var(--color-accent-500)]"}),e.jsx("h1",{className:"text-2xl font-bold text-[var(--text-primary)]",children:s("admin:permissionDetail.title","Permission Detail")})]}),e.jsxs("div",{className:"flex items-center gap-2 mt-2",children:[e.jsx("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)]",children:t.path}),e.jsx("button",{onClick:k,className:"p-1.5 hover:bg-[var(--bg-hover)] rounded transition-colors",title:s("common:buttons.copy"),children:f?e.jsx(a.CheckCircle,{className:"h-4 w-4 text-[var(--success-text)]"}):e.jsx(a.Copy,{className:"h-4 w-4 text-[var(--text-muted)]"})})]})]})]}),e.jsxs("div",{className:"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] p-6",children:[e.jsxs("h2",{className:"text-lg font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2",children:[e.jsx(a.Info,{className:"h-5 w-5 text-[var(--color-accent-500)]"}),s("admin:permissionDetail.info","Information")]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("label",{className:"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wide",children:s("admin:permissions.level","Level")}),e.jsx("div",{children:e.jsxs("span",{className:`inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium ${D}`,children:[e.jsx(a.Layers,{className:"h-3 w-3"}),t.level]})})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("label",{className:"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wide",children:s("admin:permissions.action","Action")}),e.jsx("div",{children:e.jsxs("span",{className:`inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium border ${S}`,children:[C,t.action||s("admin:permissions.wildcard","Wildcard (*)")]})})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("label",{className:"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wide",children:s("admin:permissions.type","Type")}),e.jsx("div",{children:t.isWildcard?e.jsxs("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)]",children:[e.jsx(a.Shield,{className:"h-3 w-3"}),s("admin:permissions.wildcardType","Wildcard")]}):e.jsx("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)]",children:s("admin:permissions.specificType","Specific")})})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("label",{className:"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wide",children:s("admin:permissions.createdAt","Created")}),e.jsxs("div",{className:"flex items-center gap-1.5 text-sm text-[var(--text-secondary)]",children:[e.jsx(a.Calendar,{className:"h-4 w-4"}),new Date(t.createdAt).toLocaleDateString()]})]}),t.description&&e.jsxs("div",{className:"space-y-1 md:col-span-2",children:[e.jsx("label",{className:"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wide",children:s("admin:permissions.description","Description")}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:t.description})]})]})]}),e.jsx("div",{className:"border-b border-[var(--border-color)]",children:e.jsx("div",{className:"flex gap-1",children:[{id:"roles",label:s("admin:permissionDetail.tabs.roles","Rôles"),count:t.roles.length,icon:e.jsx(a.Shield,{className:"w-4 h-4"})},{id:"entraGroups",label:s("admin:permissionDetail.tabs.entraGroups","Groupes AAD"),count:t.entraGroups?.length??0,icon:e.jsx(a.Building2,{className:"w-4 h-4"})},{id:"users",label:s("admin:permissionDetail.tabs.users","Utilisateurs"),count:t.users.length,icon:e.jsx(a.Users,{className:"w-4 h-4"})}].map(r=>e.jsxs("button",{onClick:()=>w(r.id),className:`flex items-center gap-2 px-4 py-3 text-sm font-medium border-b-2 transition-colors ${l===r.id?"border-[var(--color-accent-500)] text-[var(--color-accent-500)]":"border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]"}`,children:[r.icon,r.label,e.jsx("span",{className:`px-2 py-0.5 text-xs rounded-full ${l===r.id?"bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]":"bg-[var(--bg-tertiary)] text-[var(--text-tertiary)]"}`,children:r.count})]},r.id))})}),e.jsxs("div",{className:"min-h-[400px]",children:[l==="roles"&&e.jsx("div",{className:"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] p-6",children:t.roles.length===0?e.jsxs("div",{className:"text-center py-8 text-[var(--text-muted)]",children:[e.jsx(a.Shield,{className:"h-12 w-12 mx-auto mb-3 opacity-30"}),e.jsx("p",{children:s("admin:permissionDetail.noRoles","No roles have this permission")})]}):e.jsx("div",{className:"rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{className:"bg-[var(--bg-secondary)]",children:e.jsxs("tr",{children:[e.jsx("th",{className:"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]",children:s("admin:roles.name","Nom")}),e.jsx("th",{className:"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]",children:s("common:type","Type")})]})}),e.jsx("tbody",{className:"divide-y divide-[var(--border-color)]",children:t.roles.map(r=>e.jsxs("tr",{onClick:()=>n(`/administration/permissions/roles/${r.id}`),className:"hover:bg-[var(--bg-hover)] cursor-pointer transition-colors",children:[e.jsx("td",{className:"px-4 py-3",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-8 h-8 rounded-full flex items-center justify-center bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]",children:e.jsx(a.Shield,{className:"w-4 h-4"})}),e.jsx("span",{className:"font-medium text-[var(--text-primary)]",children:r.name})]})}),e.jsx("td",{className:"px-4 py-3",children:r.isSystem?e.jsxs("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)]",children:[e.jsx(a.Lock,{className:"h-3 w-3"}),s("admin:roles.system","Système")]}):e.jsx("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)]",children:s("admin:roles.custom","Personnalisé")})})]},r.id))})]})})}),l==="entraGroups"&&e.jsx("div",{className:"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] p-6",children:!t.entraGroups||t.entraGroups.length===0?e.jsxs("div",{className:"text-center py-8 text-[var(--text-muted)]",children:[e.jsx(a.Building2,{className:"h-12 w-12 mx-auto mb-3 opacity-30"}),e.jsx("p",{children:s("admin:permissionDetail.noEntraGroups","Aucun groupe AAD n'a cette permission")})]}):e.jsx("div",{className:"rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{className:"bg-[var(--bg-secondary)]",children:e.jsxs("tr",{children:[e.jsx("th",{className:"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]",children:s("entra:groups.groupName","Nom du groupe")}),e.jsx("th",{className:"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]",children:s("common:type","Type")}),e.jsx("th",{className:"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]",children:s("entra:groups.members","Membres")}),e.jsx("th",{className:"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]",children:s("admin:permissionDetail.viaRoles","Via Rôles")})]})}),e.jsx("tbody",{className:"divide-y divide-[var(--border-color)]",children:t.entraGroups.map(r=>e.jsxs("tr",{onClick:()=>n(`/administration/entra/groups/${r.id}`),className:"hover:bg-[var(--bg-hover)] cursor-pointer transition-colors",children:[e.jsx("td",{className:"px-4 py-3",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:`w-8 h-8 rounded-full flex items-center justify-center ${r.isSecurityGroup?"bg-blue-500/10 text-blue-500":"bg-purple-500/10 text-purple-500"}`,children:r.isSecurityGroup?e.jsx(a.Shield,{className:"w-4 h-4"}):e.jsx(a.Building2,{className:"w-4 h-4"})}),e.jsx("span",{className:"font-medium text-[var(--text-primary)]",children:r.displayName})]})}),e.jsx("td",{className:"px-4 py-3",children:e.jsx("span",{className:`px-2 py-1 text-xs rounded-[var(--radius-badge)] ${r.isSecurityGroup?"bg-blue-500/10 text-blue-500":"bg-purple-500/10 text-purple-500"}`,children:r.isSecurityGroup?s("entra:groups.securityGroup","Sécurité"):s("entra:groups.distributionGroup","Distribution")})}),e.jsx("td",{className:"px-4 py-3 text-sm text-[var(--text-secondary)]",children:e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(a.Users,{className:"w-4 h-4"}),r.memberCount]})}),e.jsx("td",{className:"px-4 py-3",children:e.jsx("div",{className:"flex flex-wrap gap-1",children:r.roleNames.map(c=>e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 bg-[var(--bg-tertiary)] rounded text-xs text-[var(--text-secondary)]",children:[e.jsx(a.Shield,{className:"h-2.5 w-2.5"}),c]},c))})})]},r.id))})]})})}),l==="users"&&e.jsx("div",{className:"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] p-6",children:t.users.length===0?e.jsxs("div",{className:"text-center py-8 text-[var(--text-muted)]",children:[e.jsx(a.Users,{className:"h-12 w-12 mx-auto mb-3 opacity-30"}),e.jsx("p",{children:s("admin:permissionDetail.noUsers","No users have this permission")})]}):e.jsx("div",{className:"rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{className:"bg-[var(--bg-secondary)]",children:e.jsxs("tr",{children:[e.jsx("th",{className:"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]",children:s("admin:users.name","Name")}),e.jsx("th",{className:"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]",children:s("admin:users.email","Email")}),e.jsx("th",{className:"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]",children:s("admin:permissionDetail.viaRoles","Via Roles")})]})}),e.jsx("tbody",{className:"divide-y divide-[var(--border-color)]",children:t.users.map(r=>e.jsxs("tr",{onClick:()=>n(`/administration/users/${r.id}`),className:"hover:bg-[var(--bg-hover)] cursor-pointer transition-colors",children:[e.jsx("td",{className:"px-4 py-3",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"h-8 w-8 rounded-full bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] flex items-center justify-center",children:e.jsxs("span",{className:"text-sm font-medium text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)]",children:[r.firstName.charAt(0),r.lastName.charAt(0)]})}),e.jsxs("span",{className:"font-medium text-[var(--text-primary)]",children:[r.firstName," ",r.lastName]})]})}),e.jsx("td",{className:"px-4 py-3 text-sm text-[var(--text-secondary)]",children:r.email}),e.jsx("td",{className:"px-4 py-3",children:e.jsx("div",{className:"flex flex-wrap gap-1",children:r.roleNames.map(c=>e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 bg-[var(--bg-tertiary)] rounded text-xs text-[var(--text-secondary)]",children:[e.jsx(a.Shield,{className:"h-2.5 w-2.5"}),c]},c))})})]},r.id))})]})})})]})]})}exports.PermissionDetailPage=G;
2
- //# sourceMappingURL=PermissionDetailPage-Dh8v7mGj.js.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),i=require("react"),h=require("react-router-dom"),A=require("react-i18next"),v=require("./index-IgLVXPg8.js"),a=require("lucide-react"),b={"*":e.jsx(a.Shield,{className:"h-4 w-4"}),Read:e.jsx(a.Eye,{className:"h-4 w-4"}),Create:e.jsx(a.Plus,{className:"h-4 w-4"}),Update:e.jsx(a.Edit,{className:"h-4 w-4"}),Delete:e.jsx(a.Trash2,{className:"h-4 w-4"}),Assign:e.jsx(a.UserPlus,{className:"h-4 w-4"}),Execute:e.jsx(a.Play,{className:"h-4 w-4"})},g={"*":"bg-[var(--accent-bg)] text-[var(--accent-text)] border-[var(--accent-border)]",Read:"bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)]",Create:"bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]",Update:"bg-[var(--warning-bg)] text-[var(--warning-text)] border-[var(--warning-border)]",Delete:"bg-[var(--error-bg)] text-[var(--error-text)] border-[var(--error-border)]",Assign:"bg-[var(--accent-bg)] text-[var(--accent-text)] border-[var(--accent-border)]",Execute:"bg-[var(--warning-bg)] text-[var(--warning-text)] border-[var(--warning-border)]"},P={Context:"bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300",Application:"bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300",Module:"bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300",Section:"bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-300",Resource:"bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-300"};function G(){const{t:s}=A.useTranslation(["admin","common"]),{id:d}=h.useParams(),n=h.useNavigate(),[t,j]=i.useState(null),[N,o]=i.useState(!0),[x,y]=i.useState(null),[f,m]=i.useState(!1),[l,w]=i.useState("roles"),p=i.useCallback(async()=>{if(d)try{o(!0);const r=await v.adminApi.permissions.getById(d);j(r)}catch(r){console.error("Failed to load permission:",r),y(s("admin:permissionDetail.errors.loadFailed","Failed to load permission"))}finally{o(!1)}},[d,s]);i.useEffect(()=>{p()},[p]);const k=async()=>{t?.path&&(await navigator.clipboard.writeText(t.path),m(!0),setTimeout(()=>m(!1),2e3))};if(N)return e.jsx("div",{className:"flex items-center justify-center min-h-[400px]",children:e.jsx(a.Loader2,{className:"h-8 w-8 animate-spin text-[var(--color-accent-500)]"})});if(x||!t)return e.jsx("div",{className:"p-6",children:e.jsxs("div",{className:"bg-[var(--error-bg)] border border-[var(--error-border)] rounded-lg p-4",children:[e.jsx("p",{className:"text-[var(--error-text)]",children:x||s("admin:permissionDetail.errors.notFound","Permission not found")}),e.jsx("button",{onClick:()=>n("/administration/permissions/permissions"),className:"mt-4 text-sm text-[var(--color-accent-500)] hover:underline",children:s("common:buttons.back")})]})});const u=t.action||"*",S=g[u]||g["*"],C=b[u]||b["*"],D=P[t.level]||"bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-200";return e.jsxs("div",{className:"p-6 space-y-6",children:[e.jsx(v.Breadcrumb,{items:[{label:s("admin:header.title"),href:"/administration"},{label:s("admin:permissions.title","Permissions"),href:"/administration/permissions/permissions"},{label:t?.path||"Detail"}]}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("button",{onClick:()=>n("/administration/permissions/permissions"),className:"p-2 hover:bg-[var(--bg-hover)] rounded-lg transition-colors",children:e.jsx(a.ArrowLeft,{className:"h-5 w-5 text-[var(--text-secondary)]"})}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(a.Lock,{className:"h-6 w-6 text-[var(--color-accent-500)]"}),e.jsx("h1",{className:"text-2xl font-bold text-[var(--text-primary)]",children:s("admin:permissionDetail.title","Permission Detail")})]}),e.jsxs("div",{className:"flex items-center gap-2 mt-2",children:[e.jsx("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)]",children:t.path}),e.jsx("button",{onClick:k,className:"p-1.5 hover:bg-[var(--bg-hover)] rounded transition-colors",title:s("common:buttons.copy"),children:f?e.jsx(a.CheckCircle,{className:"h-4 w-4 text-[var(--success-text)]"}):e.jsx(a.Copy,{className:"h-4 w-4 text-[var(--text-muted)]"})})]})]})]}),e.jsxs("div",{className:"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] p-6",children:[e.jsxs("h2",{className:"text-lg font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2",children:[e.jsx(a.Info,{className:"h-5 w-5 text-[var(--color-accent-500)]"}),s("admin:permissionDetail.info","Information")]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("label",{className:"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wide",children:s("admin:permissions.level","Level")}),e.jsx("div",{children:e.jsxs("span",{className:`inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium ${D}`,children:[e.jsx(a.Layers,{className:"h-3 w-3"}),t.level]})})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("label",{className:"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wide",children:s("admin:permissions.action","Action")}),e.jsx("div",{children:e.jsxs("span",{className:`inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium border ${S}`,children:[C,t.action||s("admin:permissions.wildcard","Wildcard (*)")]})})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("label",{className:"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wide",children:s("admin:permissions.type","Type")}),e.jsx("div",{children:t.isWildcard?e.jsxs("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)]",children:[e.jsx(a.Shield,{className:"h-3 w-3"}),s("admin:permissions.wildcardType","Wildcard")]}):e.jsx("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)]",children:s("admin:permissions.specificType","Specific")})})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("label",{className:"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wide",children:s("admin:permissions.createdAt","Created")}),e.jsxs("div",{className:"flex items-center gap-1.5 text-sm text-[var(--text-secondary)]",children:[e.jsx(a.Calendar,{className:"h-4 w-4"}),new Date(t.createdAt).toLocaleDateString()]})]}),t.description&&e.jsxs("div",{className:"space-y-1 md:col-span-2",children:[e.jsx("label",{className:"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wide",children:s("admin:permissions.description","Description")}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:t.description})]})]})]}),e.jsx("div",{className:"border-b border-[var(--border-color)]",children:e.jsx("div",{className:"flex gap-1",children:[{id:"roles",label:s("admin:permissionDetail.tabs.roles","Rôles"),count:t.roles.length,icon:e.jsx(a.Shield,{className:"w-4 h-4"})},{id:"entraGroups",label:s("admin:permissionDetail.tabs.entraGroups","Groupes AAD"),count:t.entraGroups?.length??0,icon:e.jsx(a.Building2,{className:"w-4 h-4"})},{id:"users",label:s("admin:permissionDetail.tabs.users","Utilisateurs"),count:t.users.length,icon:e.jsx(a.Users,{className:"w-4 h-4"})}].map(r=>e.jsxs("button",{onClick:()=>w(r.id),className:`flex items-center gap-2 px-4 py-3 text-sm font-medium border-b-2 transition-colors ${l===r.id?"border-[var(--color-accent-500)] text-[var(--color-accent-500)]":"border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]"}`,children:[r.icon,r.label,e.jsx("span",{className:`px-2 py-0.5 text-xs rounded-full ${l===r.id?"bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]":"bg-[var(--bg-tertiary)] text-[var(--text-tertiary)]"}`,children:r.count})]},r.id))})}),e.jsxs("div",{className:"min-h-[400px]",children:[l==="roles"&&e.jsx("div",{className:"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] p-6",children:t.roles.length===0?e.jsxs("div",{className:"text-center py-8 text-[var(--text-muted)]",children:[e.jsx(a.Shield,{className:"h-12 w-12 mx-auto mb-3 opacity-30"}),e.jsx("p",{children:s("admin:permissionDetail.noRoles","No roles have this permission")})]}):e.jsx("div",{className:"rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{className:"bg-[var(--bg-secondary)]",children:e.jsxs("tr",{children:[e.jsx("th",{className:"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]",children:s("admin:roles.name","Nom")}),e.jsx("th",{className:"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]",children:s("common:type","Type")})]})}),e.jsx("tbody",{className:"divide-y divide-[var(--border-color)]",children:t.roles.map(r=>e.jsxs("tr",{onClick:()=>n(`/administration/permissions/roles/${r.id}`),className:"hover:bg-[var(--bg-hover)] cursor-pointer transition-colors",children:[e.jsx("td",{className:"px-4 py-3",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-8 h-8 rounded-full flex items-center justify-center bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]",children:e.jsx(a.Shield,{className:"w-4 h-4"})}),e.jsx("span",{className:"font-medium text-[var(--text-primary)]",children:r.name})]})}),e.jsx("td",{className:"px-4 py-3",children:r.isSystem?e.jsxs("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)]",children:[e.jsx(a.Lock,{className:"h-3 w-3"}),s("admin:roles.system","Système")]}):e.jsx("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)]",children:s("admin:roles.custom","Personnalisé")})})]},r.id))})]})})}),l==="entraGroups"&&e.jsx("div",{className:"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] p-6",children:!t.entraGroups||t.entraGroups.length===0?e.jsxs("div",{className:"text-center py-8 text-[var(--text-muted)]",children:[e.jsx(a.Building2,{className:"h-12 w-12 mx-auto mb-3 opacity-30"}),e.jsx("p",{children:s("admin:permissionDetail.noEntraGroups","Aucun groupe AAD n'a cette permission")})]}):e.jsx("div",{className:"rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{className:"bg-[var(--bg-secondary)]",children:e.jsxs("tr",{children:[e.jsx("th",{className:"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]",children:s("entra:groups.groupName","Nom du groupe")}),e.jsx("th",{className:"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]",children:s("common:type","Type")}),e.jsx("th",{className:"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]",children:s("entra:groups.members","Membres")}),e.jsx("th",{className:"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]",children:s("admin:permissionDetail.viaRoles","Via Rôles")})]})}),e.jsx("tbody",{className:"divide-y divide-[var(--border-color)]",children:t.entraGroups.map(r=>e.jsxs("tr",{onClick:()=>n(`/administration/entra/groups/${r.id}`),className:"hover:bg-[var(--bg-hover)] cursor-pointer transition-colors",children:[e.jsx("td",{className:"px-4 py-3",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:`w-8 h-8 rounded-full flex items-center justify-center ${r.isSecurityGroup?"bg-blue-500/10 text-blue-500":"bg-purple-500/10 text-purple-500"}`,children:r.isSecurityGroup?e.jsx(a.Shield,{className:"w-4 h-4"}):e.jsx(a.Building2,{className:"w-4 h-4"})}),e.jsx("span",{className:"font-medium text-[var(--text-primary)]",children:r.displayName})]})}),e.jsx("td",{className:"px-4 py-3",children:e.jsx("span",{className:`px-2 py-1 text-xs rounded-[var(--radius-badge)] ${r.isSecurityGroup?"bg-blue-500/10 text-blue-500":"bg-purple-500/10 text-purple-500"}`,children:r.isSecurityGroup?s("entra:groups.securityGroup","Sécurité"):s("entra:groups.distributionGroup","Distribution")})}),e.jsx("td",{className:"px-4 py-3 text-sm text-[var(--text-secondary)]",children:e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(a.Users,{className:"w-4 h-4"}),r.memberCount]})}),e.jsx("td",{className:"px-4 py-3",children:e.jsx("div",{className:"flex flex-wrap gap-1",children:r.roleNames.map(c=>e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 bg-[var(--bg-tertiary)] rounded text-xs text-[var(--text-secondary)]",children:[e.jsx(a.Shield,{className:"h-2.5 w-2.5"}),c]},c))})})]},r.id))})]})})}),l==="users"&&e.jsx("div",{className:"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] p-6",children:t.users.length===0?e.jsxs("div",{className:"text-center py-8 text-[var(--text-muted)]",children:[e.jsx(a.Users,{className:"h-12 w-12 mx-auto mb-3 opacity-30"}),e.jsx("p",{children:s("admin:permissionDetail.noUsers","No users have this permission")})]}):e.jsx("div",{className:"rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{className:"bg-[var(--bg-secondary)]",children:e.jsxs("tr",{children:[e.jsx("th",{className:"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]",children:s("admin:users.name","Name")}),e.jsx("th",{className:"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]",children:s("admin:users.email","Email")}),e.jsx("th",{className:"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]",children:s("admin:permissionDetail.viaRoles","Via Roles")})]})}),e.jsx("tbody",{className:"divide-y divide-[var(--border-color)]",children:t.users.map(r=>e.jsxs("tr",{onClick:()=>n(`/administration/users/${r.id}`),className:"hover:bg-[var(--bg-hover)] cursor-pointer transition-colors",children:[e.jsx("td",{className:"px-4 py-3",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"h-8 w-8 rounded-full bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] flex items-center justify-center",children:e.jsxs("span",{className:"text-sm font-medium text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)]",children:[r.firstName.charAt(0),r.lastName.charAt(0)]})}),e.jsxs("span",{className:"font-medium text-[var(--text-primary)]",children:[r.firstName," ",r.lastName]})]})}),e.jsx("td",{className:"px-4 py-3 text-sm text-[var(--text-secondary)]",children:r.email}),e.jsx("td",{className:"px-4 py-3",children:e.jsx("div",{className:"flex flex-wrap gap-1",children:r.roleNames.map(c=>e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 bg-[var(--bg-tertiary)] rounded text-xs text-[var(--text-secondary)]",children:[e.jsx(a.Shield,{className:"h-2.5 w-2.5"}),c]},c))})})]},r.id))})]})})})]})]})}exports.PermissionDetailPage=G;
2
+ //# sourceMappingURL=PermissionDetailPage-C5K17ydY.js.map