@atlashub/smartstack 3.39.0-preview.1049 → 3.40.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 (273) hide show
  1. package/dist/chunks/{AgentSkillsPage-DgqyaZwI.js → AgentSkillsPage-BS_W2KTh.js} +2 -2
  2. package/dist/chunks/{AgentSkillsPage-DgqyaZwI.js.map → AgentSkillsPage-BS_W2KTh.js.map} +1 -1
  3. package/dist/chunks/{AgentSkillsPage-ojivq0Cu.js → AgentSkillsPage-CmDFLnp7.js} +2 -2
  4. package/dist/chunks/{AgentSkillsPage-ojivq0Cu.js.map → AgentSkillsPage-CmDFLnp7.js.map} +1 -1
  5. package/dist/chunks/{AgentWorkloadPage-BGGTfOLs.js → AgentWorkloadPage-C8IvYfhT.js} +2 -2
  6. package/dist/chunks/{AgentWorkloadPage-BGGTfOLs.js.map → AgentWorkloadPage-C8IvYfhT.js.map} +1 -1
  7. package/dist/chunks/{AgentWorkloadPage-DWsC5VoS.js → AgentWorkloadPage-JXsQbwuM.js} +2 -2
  8. package/dist/chunks/{AgentWorkloadPage-DWsC5VoS.js.map → AgentWorkloadPage-JXsQbwuM.js.map} +1 -1
  9. package/dist/chunks/{ApiCatalogDetailPage-7EifQOAh.js → ApiCatalogDetailPage-CYOt34Vy.js} +2 -2
  10. package/dist/chunks/{ApiCatalogDetailPage-7EifQOAh.js.map → ApiCatalogDetailPage-CYOt34Vy.js.map} +1 -1
  11. package/dist/chunks/{ApiCatalogDetailPage-BD7XE4xK.js → ApiCatalogDetailPage-wFZDsTGy.js} +3 -3
  12. package/dist/chunks/{ApiCatalogDetailPage-BD7XE4xK.js.map → ApiCatalogDetailPage-wFZDsTGy.js.map} +1 -1
  13. package/dist/chunks/{ApiCatalogPage-BfPoZGD3.js → ApiCatalogPage-Bdm3HNGP.js} +2 -2
  14. package/dist/chunks/{ApiCatalogPage-BfPoZGD3.js.map → ApiCatalogPage-Bdm3HNGP.js.map} +1 -1
  15. package/dist/chunks/{ApiCatalogPage-BOPTnk-b.js → ApiCatalogPage-m_TWQyGv.js} +2 -2
  16. package/dist/chunks/{ApiCatalogPage-BOPTnk-b.js.map → ApiCatalogPage-m_TWQyGv.js.map} +1 -1
  17. package/dist/chunks/ApplicationDetailPage-C2BSpEoW.js +2 -0
  18. package/dist/chunks/{ApplicationDetailPage-CWdz0TS4.js.map → ApplicationDetailPage-C2BSpEoW.js.map} +1 -1
  19. package/dist/chunks/{ApplicationDetailPage-CDQqViuH.js → ApplicationDetailPage-CcgDAP-J.js} +503 -501
  20. package/dist/chunks/{ApplicationDetailPage-CDQqViuH.js.map → ApplicationDetailPage-CcgDAP-J.js.map} +1 -1
  21. package/dist/chunks/{ApplicationsDashboardPage-ZyXm2Cd1.js → ApplicationsDashboardPage-CDIjziL3.js} +3 -3
  22. package/dist/chunks/{ApplicationsDashboardPage-ZyXm2Cd1.js.map → ApplicationsDashboardPage-CDIjziL3.js.map} +1 -1
  23. package/dist/chunks/{ApplicationsDashboardPage-BH4S3qA2.js → ApplicationsDashboardPage-DslDyNzJ.js} +2 -2
  24. package/dist/chunks/{ApplicationsDashboardPage-BH4S3qA2.js.map → ApplicationsDashboardPage-DslDyNzJ.js.map} +1 -1
  25. package/dist/chunks/{ApplicationsGridPage-D0fU1_Le.js → ApplicationsGridPage-BCjsQGU0.js} +2 -2
  26. package/dist/chunks/{ApplicationsGridPage-D0fU1_Le.js.map → ApplicationsGridPage-BCjsQGU0.js.map} +1 -1
  27. package/dist/chunks/{ApplicationsGridPage-C1WF2Htv.js → ApplicationsGridPage-CIfKiCND.js} +2 -2
  28. package/dist/chunks/{ApplicationsGridPage-C1WF2Htv.js.map → ApplicationsGridPage-CIfKiCND.js.map} +1 -1
  29. package/dist/chunks/{ApplicationsListPage-Cxvt2_WQ.js → ApplicationsListPage-CT75kNcH.js} +2 -2
  30. package/dist/chunks/{ApplicationsListPage-Cxvt2_WQ.js.map → ApplicationsListPage-CT75kNcH.js.map} +1 -1
  31. package/dist/chunks/{ApplicationsListPage-B3ItaY4r.js → ApplicationsListPage-D2B4PZ5n.js} +2 -2
  32. package/dist/chunks/{ApplicationsListPage-B3ItaY4r.js.map → ApplicationsListPage-D2B4PZ5n.js.map} +1 -1
  33. package/dist/chunks/{ApplicationsPage-BqfNR-kc.js → ApplicationsPage-CaTBtduL.js} +2 -2
  34. package/dist/chunks/{ApplicationsPage-BqfNR-kc.js.map → ApplicationsPage-CaTBtduL.js.map} +1 -1
  35. package/dist/chunks/{ApplicationsPage-DuxuWfrN.js → ApplicationsPage-DW1LhL0U.js} +4 -4
  36. package/dist/chunks/{ApplicationsPage-DuxuWfrN.js.map → ApplicationsPage-DW1LhL0U.js.map} +1 -1
  37. package/dist/chunks/{AssignmentRulesPage-CR1C7V0a.js → AssignmentRulesPage-Bt9M0ki7.js} +2 -2
  38. package/dist/chunks/{AssignmentRulesPage-CR1C7V0a.js.map → AssignmentRulesPage-Bt9M0ki7.js.map} +1 -1
  39. package/dist/chunks/{AssignmentRulesPage-C4Jouh2g.js → AssignmentRulesPage-Y7xv60NY.js} +2 -2
  40. package/dist/chunks/{AssignmentRulesPage-C4Jouh2g.js.map → AssignmentRulesPage-Y7xv60NY.js.map} +1 -1
  41. package/dist/chunks/{AssignmentsPage-v8QUJkE7.js → AssignmentsPage-1eQGTjTi.js} +2 -2
  42. package/dist/chunks/{AssignmentsPage-v8QUJkE7.js.map → AssignmentsPage-1eQGTjTi.js.map} +1 -1
  43. package/dist/chunks/{AssignmentsPage-CjuGAd8n.js → AssignmentsPage-RURdPvfZ.js} +2 -2
  44. package/dist/chunks/{AssignmentsPage-CjuGAd8n.js.map → AssignmentsPage-RURdPvfZ.js.map} +1 -1
  45. package/dist/chunks/{AuthCallbackPage-BxIXPUJk.js → AuthCallbackPage-8hF0jYlK.js} +2 -2
  46. package/dist/chunks/{AuthCallbackPage-BxIXPUJk.js.map → AuthCallbackPage-8hF0jYlK.js.map} +1 -1
  47. package/dist/chunks/{AuthCallbackPage-CuS-efzY.js → AuthCallbackPage-DPL68Asu.js} +2 -2
  48. package/dist/chunks/{AuthCallbackPage-CuS-efzY.js.map → AuthCallbackPage-DPL68Asu.js.map} +1 -1
  49. package/dist/chunks/{ConfirmEmailPage-CWIqy2bT.js → ConfirmEmailPage-BKlpZkVk.js} +2 -2
  50. package/dist/chunks/{ConfirmEmailPage-CWIqy2bT.js.map → ConfirmEmailPage-BKlpZkVk.js.map} +1 -1
  51. package/dist/chunks/{ConfirmEmailPage-CkN8IfP-.js → ConfirmEmailPage-CawSZypI.js} +2 -2
  52. package/dist/chunks/{ConfirmEmailPage-CkN8IfP-.js.map → ConfirmEmailPage-CawSZypI.js.map} +1 -1
  53. package/dist/chunks/{CreateSupportTicketPage-Df0ow5ge.js → CreateSupportTicketPage-AwbMbBIH.js} +2 -2
  54. package/dist/chunks/{CreateSupportTicketPage-Df0ow5ge.js.map → CreateSupportTicketPage-AwbMbBIH.js.map} +1 -1
  55. package/dist/chunks/{CreateSupportTicketPage-CmrDfFxP.js → CreateSupportTicketPage-Dg1YW1eA.js} +2 -2
  56. package/dist/chunks/{CreateSupportTicketPage-CmrDfFxP.js.map → CreateSupportTicketPage-Dg1YW1eA.js.map} +1 -1
  57. package/dist/chunks/{DashboardPage-B4Pi5P3O.js → DashboardPage-B4YxOF-9.js} +3 -3
  58. package/dist/chunks/{DashboardPage-B4Pi5P3O.js.map → DashboardPage-B4YxOF-9.js.map} +1 -1
  59. package/dist/chunks/{DashboardPage-wEKZ_DWf.js → DashboardPage-BZxjinar.js} +2 -2
  60. package/dist/chunks/{DashboardPage-wEKZ_DWf.js.map → DashboardPage-BZxjinar.js.map} +1 -1
  61. package/dist/chunks/{DashboardPage-BAqpoxCW.js → DashboardPage-Bo09y8r7.js} +3 -3
  62. package/dist/chunks/{DashboardPage-BAqpoxCW.js.map → DashboardPage-Bo09y8r7.js.map} +1 -1
  63. package/dist/chunks/{DashboardPage-BT5kFaQA.js → DashboardPage-Cq5adDjP.js} +2 -2
  64. package/dist/chunks/{DashboardPage-BT5kFaQA.js.map → DashboardPage-Cq5adDjP.js.map} +1 -1
  65. package/dist/chunks/{EscalationConfigPage-4pF38E4N.js → EscalationConfigPage-C8Hv5naz.js} +2 -2
  66. package/dist/chunks/{EscalationConfigPage-4pF38E4N.js.map → EscalationConfigPage-C8Hv5naz.js.map} +1 -1
  67. package/dist/chunks/{EscalationConfigPage-Bcifnt_h.js → EscalationConfigPage-DNAqMRxA.js} +2 -2
  68. package/dist/chunks/{EscalationConfigPage-Bcifnt_h.js.map → EscalationConfigPage-DNAqMRxA.js.map} +1 -1
  69. package/dist/chunks/{ForceChangePasswordPage-CBaMV_PS.js → ForceChangePasswordPage-BURE_vNg.js} +2 -2
  70. package/dist/chunks/{ForceChangePasswordPage-CBaMV_PS.js.map → ForceChangePasswordPage-BURE_vNg.js.map} +1 -1
  71. package/dist/chunks/{ForceChangePasswordPage-ClDXluX1.js → ForceChangePasswordPage-C6jDZshk.js} +2 -2
  72. package/dist/chunks/{ForceChangePasswordPage-ClDXluX1.js.map → ForceChangePasswordPage-C6jDZshk.js.map} +1 -1
  73. package/dist/chunks/{ForgotPasswordPage--ueWRNSO.js → ForgotPasswordPage-C5HLYbz4.js} +2 -2
  74. package/dist/chunks/{ForgotPasswordPage--ueWRNSO.js.map → ForgotPasswordPage-C5HLYbz4.js.map} +1 -1
  75. package/dist/chunks/{ForgotPasswordPage-CzpAkP5R.js → ForgotPasswordPage-D3ZQBtjd.js} +2 -2
  76. package/dist/chunks/{ForgotPasswordPage-CzpAkP5R.js.map → ForgotPasswordPage-D3ZQBtjd.js.map} +1 -1
  77. package/dist/chunks/{GroupDetailPage-dXNOoSXE.js → GroupDetailPage-CTuzp9Vp.js} +5 -5
  78. package/dist/chunks/{GroupDetailPage-dXNOoSXE.js.map → GroupDetailPage-CTuzp9Vp.js.map} +1 -1
  79. package/dist/chunks/{GroupDetailPage-BIgBzQk0.js → GroupDetailPage-NJc2zCxC.js} +2 -2
  80. package/dist/chunks/{GroupDetailPage-BIgBzQk0.js.map → GroupDetailPage-NJc2zCxC.js.map} +1 -1
  81. package/dist/chunks/{MyAccessRequestsPage-K2NXkdy4.js → MyAccessRequestsPage-Cvr29Pnq.js} +2 -2
  82. package/dist/chunks/{MyAccessRequestsPage-K2NXkdy4.js.map → MyAccessRequestsPage-Cvr29Pnq.js.map} +1 -1
  83. package/dist/chunks/{MyAccessRequestsPage-Be8VvLhh.js → MyAccessRequestsPage-t6I24rHN.js} +2 -2
  84. package/dist/chunks/{MyAccessRequestsPage-Be8VvLhh.js.map → MyAccessRequestsPage-t6I24rHN.js.map} +1 -1
  85. package/dist/chunks/{MyTenantsPage-BXx1nPC8.js → MyTenantsPage-Dy2RZ_Ei.js} +2 -2
  86. package/dist/chunks/{MyTenantsPage-BXx1nPC8.js.map → MyTenantsPage-Dy2RZ_Ei.js.map} +1 -1
  87. package/dist/chunks/{MyTenantsPage-B9ZAUeCa.js → MyTenantsPage-SvDCQ4Wt.js} +3 -3
  88. package/dist/chunks/{MyTenantsPage-B9ZAUeCa.js.map → MyTenantsPage-SvDCQ4Wt.js.map} +1 -1
  89. package/dist/chunks/{MyTicketsPage-C9MSmmR5.js → MyTicketsPage-C3lEBFD9.js} +2 -2
  90. package/dist/chunks/{MyTicketsPage-C9MSmmR5.js.map → MyTicketsPage-C3lEBFD9.js.map} +1 -1
  91. package/dist/chunks/{MyTicketsPage-d0PoJpnX.js → MyTicketsPage-DydDgFyz.js} +2 -2
  92. package/dist/chunks/{MyTicketsPage-d0PoJpnX.js.map → MyTicketsPage-DydDgFyz.js.map} +1 -1
  93. package/dist/chunks/{NavigationAppsPage-CJ3BjLlz.js → NavigationAppsPage-Dyv767w8.js} +2 -2
  94. package/dist/chunks/{NavigationAppsPage-CJ3BjLlz.js.map → NavigationAppsPage-Dyv767w8.js.map} +1 -1
  95. package/dist/chunks/{NavigationAppsPage-8t2xbddT.js → NavigationAppsPage-WqSspaVo.js} +2 -2
  96. package/dist/chunks/{NavigationAppsPage-8t2xbddT.js.map → NavigationAppsPage-WqSspaVo.js.map} +1 -1
  97. package/dist/chunks/{NotificationsPage-_62-bmuk.js → NotificationsPage-Di4I95PM.js} +2 -2
  98. package/dist/chunks/{NotificationsPage-_62-bmuk.js.map → NotificationsPage-Di4I95PM.js.map} +1 -1
  99. package/dist/chunks/{NotificationsPage-CLHfVUxm.js → NotificationsPage-elSovpBw.js} +2 -2
  100. package/dist/chunks/{NotificationsPage-CLHfVUxm.js.map → NotificationsPage-elSovpBw.js.map} +1 -1
  101. package/dist/chunks/{OnboardingWizardPage-Dkc22Jc4.js → OnboardingWizardPage-fdWdkwiT.js} +2 -2
  102. package/dist/chunks/{OnboardingWizardPage-Dkc22Jc4.js.map → OnboardingWizardPage-fdWdkwiT.js.map} +1 -1
  103. package/dist/chunks/{OnboardingWizardPage-D1rzD6gR.js → OnboardingWizardPage-nPLe2buQ.js} +2 -2
  104. package/dist/chunks/{OnboardingWizardPage-D1rzD6gR.js.map → OnboardingWizardPage-nPLe2buQ.js.map} +1 -1
  105. package/dist/chunks/{PermissionDetailPage-BSvSe4SI.js → PermissionDetailPage-B8C7tWFP.js} +2 -2
  106. package/dist/chunks/{PermissionDetailPage-BSvSe4SI.js.map → PermissionDetailPage-B8C7tWFP.js.map} +1 -1
  107. package/dist/chunks/{PermissionDetailPage-_HhbxzlG.js → PermissionDetailPage-IUgUaTkE.js} +2 -2
  108. package/dist/chunks/{PermissionDetailPage-_HhbxzlG.js.map → PermissionDetailPage-IUgUaTkE.js.map} +1 -1
  109. package/dist/chunks/{PermissionsPage-Xb92YAHn.js → PermissionsPage-CmX5sQf2.js} +2 -2
  110. package/dist/chunks/{PermissionsPage-Xb92YAHn.js.map → PermissionsPage-CmX5sQf2.js.map} +1 -1
  111. package/dist/chunks/{PermissionsPage-B0M4gA5m.js → PermissionsPage-Kg0rduOM.js} +2 -2
  112. package/dist/chunks/{PermissionsPage-B0M4gA5m.js.map → PermissionsPage-Kg0rduOM.js.map} +1 -1
  113. package/dist/chunks/{PortalDashboardPage-DTeMESj9.js → PortalDashboardPage-CCAYuhtI.js} +2 -2
  114. package/dist/chunks/{PortalDashboardPage-DTeMESj9.js.map → PortalDashboardPage-CCAYuhtI.js.map} +1 -1
  115. package/dist/chunks/{PortalDashboardPage-pt9hipR4.js → PortalDashboardPage-Dme1XmzN.js} +2 -2
  116. package/dist/chunks/{PortalDashboardPage-pt9hipR4.js.map → PortalDashboardPage-Dme1XmzN.js.map} +1 -1
  117. package/dist/chunks/{PreferencesPage-Cy30AWIN.js → PreferencesPage-Ct6xWAFp.js} +2 -2
  118. package/dist/chunks/{PreferencesPage-Cy30AWIN.js.map → PreferencesPage-Ct6xWAFp.js.map} +1 -1
  119. package/dist/chunks/{PreferencesPage-CsHVGMgp.js → PreferencesPage-Db2RjMpm.js} +2 -2
  120. package/dist/chunks/{PreferencesPage-CsHVGMgp.js.map → PreferencesPage-Db2RjMpm.js.map} +1 -1
  121. package/dist/chunks/{ProfilePage-6Gf7igUI.js → ProfilePage-D6Xb1ALH.js} +2 -2
  122. package/dist/chunks/{ProfilePage-6Gf7igUI.js.map → ProfilePage-D6Xb1ALH.js.map} +1 -1
  123. package/dist/chunks/{ProfilePage-BzBWkztf.js → ProfilePage-DN2s-lfp.js} +2 -2
  124. package/dist/chunks/{ProfilePage-BzBWkztf.js.map → ProfilePage-DN2s-lfp.js.map} +1 -1
  125. package/dist/chunks/{ReferencesManagementPage-DEDoHrnU.js → ReferencesManagementPage-B5mcshG1.js} +2 -2
  126. package/dist/chunks/{ReferencesManagementPage-DEDoHrnU.js.map → ReferencesManagementPage-B5mcshG1.js.map} +1 -1
  127. package/dist/chunks/{ReferencesManagementPage-DD1QiFYr.js → ReferencesManagementPage-DB975ktX.js} +3 -3
  128. package/dist/chunks/{ReferencesManagementPage-DD1QiFYr.js.map → ReferencesManagementPage-DB975ktX.js.map} +1 -1
  129. package/dist/chunks/{RegisterPage-asdx33fV.js → RegisterPage-ZskZrLZH.js} +2 -2
  130. package/dist/chunks/{RegisterPage-asdx33fV.js.map → RegisterPage-ZskZrLZH.js.map} +1 -1
  131. package/dist/chunks/{RegisterPage-CIPHRYkl.js → RegisterPage-b8yIPVgh.js} +2 -2
  132. package/dist/chunks/{RegisterPage-CIPHRYkl.js.map → RegisterPage-b8yIPVgh.js.map} +1 -1
  133. package/dist/chunks/{ResetPasswordPage-B4Dj24vU.js → ResetPasswordPage-CeAvfsE-.js} +2 -2
  134. package/dist/chunks/{ResetPasswordPage-B4Dj24vU.js.map → ResetPasswordPage-CeAvfsE-.js.map} +1 -1
  135. package/dist/chunks/{ResetPasswordPage-B8MWH_Vi.js → ResetPasswordPage-Dzp5dCp8.js} +2 -2
  136. package/dist/chunks/{ResetPasswordPage-B8MWH_Vi.js.map → ResetPasswordPage-Dzp5dCp8.js.map} +1 -1
  137. package/dist/chunks/{ResolutionModal-Cs6T441o.js → ResolutionModal-CRVN7gHv.js} +2 -2
  138. package/dist/chunks/{ResolutionModal-Cs6T441o.js.map → ResolutionModal-CRVN7gHv.js.map} +1 -1
  139. package/dist/chunks/{ResolutionModal-rLoFOxm9.js → ResolutionModal-DJOw1sLT.js} +2 -2
  140. package/dist/chunks/{ResolutionModal-rLoFOxm9.js.map → ResolutionModal-DJOw1sLT.js.map} +1 -1
  141. package/dist/chunks/{RoleDetailPage-Pkw0wU5g.js → RoleDetailPage-CLVoFVF8.js} +2 -2
  142. package/dist/chunks/{RoleDetailPage-Pkw0wU5g.js.map → RoleDetailPage-CLVoFVF8.js.map} +1 -1
  143. package/dist/chunks/{RoleDetailPage-CNFG6j6P.js → RoleDetailPage-XGnPD_8C.js} +3 -3
  144. package/dist/chunks/{RoleDetailPage-CNFG6j6P.js.map → RoleDetailPage-XGnPD_8C.js.map} +1 -1
  145. package/dist/chunks/{RolesPage-BHEkMR2O.js → RolesPage-BnAMpR2b.js} +2 -2
  146. package/dist/chunks/{RolesPage-BHEkMR2O.js.map → RolesPage-BnAMpR2b.js.map} +1 -1
  147. package/dist/chunks/{RolesPage-D35jwDJU.js → RolesPage-Czj9LMkL.js} +2 -2
  148. package/dist/chunks/{RolesPage-D35jwDJU.js.map → RolesPage-Czj9LMkL.js.map} +1 -1
  149. package/dist/chunks/{SlaConfigPage-DtonDehw.js → SlaConfigPage-HM0MpIlg.js} +2 -2
  150. package/dist/chunks/{SlaConfigPage-DtonDehw.js.map → SlaConfigPage-HM0MpIlg.js.map} +1 -1
  151. package/dist/chunks/{SlaConfigPage-C5Jstix-.js → SlaConfigPage-ZRyAs8aY.js} +2 -2
  152. package/dist/chunks/{SlaConfigPage-C5Jstix-.js.map → SlaConfigPage-ZRyAs8aY.js.map} +1 -1
  153. package/dist/chunks/{SupportPermissionsPage-6pC73oCY.js → SupportPermissionsPage-CxJuGgcQ.js} +2 -2
  154. package/dist/chunks/{SupportPermissionsPage-6pC73oCY.js.map → SupportPermissionsPage-CxJuGgcQ.js.map} +1 -1
  155. package/dist/chunks/{SupportPermissionsPage-CsJKGt__.js → SupportPermissionsPage-DNd323OK.js} +2 -2
  156. package/dist/chunks/{SupportPermissionsPage-CsJKGt__.js.map → SupportPermissionsPage-DNd323OK.js.map} +1 -1
  157. package/dist/chunks/{TemplatesPage-DjmYOGEC.js → TemplatesPage-CdwPLsHj.js} +2 -2
  158. package/dist/chunks/{TemplatesPage-DjmYOGEC.js.map → TemplatesPage-CdwPLsHj.js.map} +1 -1
  159. package/dist/chunks/{TemplatesPage-DlY91VO_.js → TemplatesPage-Co3ygZvF.js} +2 -2
  160. package/dist/chunks/{TemplatesPage-DlY91VO_.js.map → TemplatesPage-Co3ygZvF.js.map} +1 -1
  161. package/dist/chunks/{TenantCard-BHLcv2gD.js → TenantCard-CmCfIK2F.js} +2 -2
  162. package/dist/chunks/{TenantCard-BHLcv2gD.js.map → TenantCard-CmCfIK2F.js.map} +1 -1
  163. package/dist/chunks/{TenantCard-DGCKVvKI.js → TenantCard-DI66acce.js} +2 -2
  164. package/dist/chunks/{TenantCard-DGCKVvKI.js.map → TenantCard-DI66acce.js.map} +1 -1
  165. package/dist/chunks/{TenantScopeSelector-dsSwnOWg.js → TenantScopeSelector-5NOwmFX2.js} +2 -2
  166. package/dist/chunks/{TenantScopeSelector-dsSwnOWg.js.map → TenantScopeSelector-5NOwmFX2.js.map} +1 -1
  167. package/dist/chunks/{TenantScopeSelector-CU5z5PJH.js → TenantScopeSelector-CEFgxiWt.js} +2 -2
  168. package/dist/chunks/{TenantScopeSelector-CU5z5PJH.js.map → TenantScopeSelector-CEFgxiWt.js.map} +1 -1
  169. package/dist/chunks/{TicketDetailPage-BQHMaRmq.js → TicketDetailPage-BhZ-mpv7.js} +2 -2
  170. package/dist/chunks/{TicketDetailPage-BQHMaRmq.js.map → TicketDetailPage-BhZ-mpv7.js.map} +1 -1
  171. package/dist/chunks/{TicketDetailPage-Bk_0uQ3B.js → TicketDetailPage-BxOiOG22.js} +2 -2
  172. package/dist/chunks/{TicketDetailPage-Bk_0uQ3B.js.map → TicketDetailPage-BxOiOG22.js.map} +1 -1
  173. package/dist/chunks/{TicketsPage-CufUJctx.js → TicketsPage-BiTvIcM8.js} +2 -2
  174. package/dist/chunks/{TicketsPage-CufUJctx.js.map → TicketsPage-BiTvIcM8.js.map} +1 -1
  175. package/dist/chunks/{TicketsPage-C8QQ4SKy.js → TicketsPage-CSiinHME.js} +2 -2
  176. package/dist/chunks/{TicketsPage-C8QQ4SKy.js.map → TicketsPage-CSiinHME.js.map} +1 -1
  177. package/dist/chunks/{UserCreateTicketPage-DoEMtJoe.js → UserCreateTicketPage-B3TW1oV7.js} +2 -2
  178. package/dist/chunks/{UserCreateTicketPage-DoEMtJoe.js.map → UserCreateTicketPage-B3TW1oV7.js.map} +1 -1
  179. package/dist/chunks/{UserCreateTicketPage-XxjNlR9K.js → UserCreateTicketPage-BszUd_WZ.js} +2 -2
  180. package/dist/chunks/{UserCreateTicketPage-XxjNlR9K.js.map → UserCreateTicketPage-BszUd_WZ.js.map} +1 -1
  181. package/dist/chunks/{UserDashboardPage-fdhZwMLg.js → UserDashboardPage-C6MvatAb.js} +2 -2
  182. package/dist/chunks/{UserDashboardPage-fdhZwMLg.js.map → UserDashboardPage-C6MvatAb.js.map} +1 -1
  183. package/dist/chunks/{UserDashboardPage-BV1d2hMG.js → UserDashboardPage-Dtt9VzG_.js} +2 -2
  184. package/dist/chunks/{UserDashboardPage-BV1d2hMG.js.map → UserDashboardPage-Dtt9VzG_.js.map} +1 -1
  185. package/dist/chunks/{UserDetailPage-C97e-Dax.js → UserDetailPage-BEEV2vlJ.js} +5 -5
  186. package/dist/chunks/{UserDetailPage-C97e-Dax.js.map → UserDetailPage-BEEV2vlJ.js.map} +1 -1
  187. package/dist/chunks/{UserDetailPage-BcA7Vhb2.js → UserDetailPage-Dw5OHheZ.js} +2 -2
  188. package/dist/chunks/{UserDetailPage-BcA7Vhb2.js.map → UserDetailPage-Dw5OHheZ.js.map} +1 -1
  189. package/dist/chunks/{UserTicketDetailPage-BA2syxXG.js → UserTicketDetailPage-B4YkzzbR.js} +2 -2
  190. package/dist/chunks/{UserTicketDetailPage-BA2syxXG.js.map → UserTicketDetailPage-B4YkzzbR.js.map} +1 -1
  191. package/dist/chunks/{UserTicketDetailPage-CXuZVAa2.js → UserTicketDetailPage-DCFV-0ny.js} +2 -2
  192. package/dist/chunks/{UserTicketDetailPage-CXuZVAa2.js.map → UserTicketDetailPage-DCFV-0ny.js.map} +1 -1
  193. package/dist/chunks/{UsersGroupsPage-CPVk31Dh.js → UsersGroupsPage-CY-l9fTp.js} +3 -3
  194. package/dist/chunks/{UsersGroupsPage-CPVk31Dh.js.map → UsersGroupsPage-CY-l9fTp.js.map} +1 -1
  195. package/dist/chunks/{UsersGroupsPage-DS2YiUE4.js → UsersGroupsPage-c28vYHN9.js} +2 -2
  196. package/dist/chunks/{UsersGroupsPage-DS2YiUE4.js.map → UsersGroupsPage-c28vYHN9.js.map} +1 -1
  197. package/dist/chunks/{UsersPage-BIXWHFmG.js → UsersPage-1sLlq9QD.js} +2 -2
  198. package/dist/chunks/{UsersPage-BIXWHFmG.js.map → UsersPage-1sLlq9QD.js.map} +1 -1
  199. package/dist/chunks/{UsersPage-DS8aWUKj.js → UsersPage-Bm-uNxh0.js} +2 -2
  200. package/dist/chunks/{UsersPage-DS8aWUKj.js.map → UsersPage-Bm-uNxh0.js.map} +1 -1
  201. package/dist/chunks/{accessRequestsApi-C-r0mrCH.js → accessRequestsApi-CJPjyEkH.js} +2 -2
  202. package/dist/chunks/{accessRequestsApi-C-r0mrCH.js.map → accessRequestsApi-CJPjyEkH.js.map} +1 -1
  203. package/dist/chunks/{accessRequestsApi-k3ZwhcFb.js → accessRequestsApi-D_pj1wl6.js} +2 -2
  204. package/dist/chunks/{accessRequestsApi-k3ZwhcFb.js.map → accessRequestsApi-D_pj1wl6.js.map} +1 -1
  205. package/dist/chunks/{aiApi-B-H-76wM.js → aiApi-ByF-oo1J.js} +2 -2
  206. package/dist/chunks/{aiApi-B-H-76wM.js.map → aiApi-ByF-oo1J.js.map} +1 -1
  207. package/dist/chunks/{aiApi-CcdrBILv.js → aiApi-Dt3fj0dU.js} +2 -2
  208. package/dist/chunks/{aiApi-CcdrBILv.js.map → aiApi-Dt3fj0dU.js.map} +1 -1
  209. package/dist/chunks/{applicationAnalyticsApi-CO3tk6Ju.js → applicationAnalyticsApi-BgG3SGJm.js} +2 -2
  210. package/dist/chunks/{applicationAnalyticsApi-CO3tk6Ju.js.map → applicationAnalyticsApi-BgG3SGJm.js.map} +1 -1
  211. package/dist/chunks/{applicationAnalyticsApi-CLVdVLDu.js → applicationAnalyticsApi-ktD65iLO.js} +2 -2
  212. package/dist/chunks/{applicationAnalyticsApi-CLVdVLDu.js.map → applicationAnalyticsApi-ktD65iLO.js.map} +1 -1
  213. package/dist/chunks/{groupsApi-DExOJZPF.js → groupsApi-C-FLWPCO.js} +2 -2
  214. package/dist/chunks/{groupsApi-DExOJZPF.js.map → groupsApi-C-FLWPCO.js.map} +1 -1
  215. package/dist/chunks/{groupsApi-CyqyYsmi.js → groupsApi-CBI5vMLa.js} +2 -2
  216. package/dist/chunks/{groupsApi-CyqyYsmi.js.map → groupsApi-CBI5vMLa.js.map} +1 -1
  217. package/dist/chunks/{index-DtAReZI6.js → index-B727-QSU.js} +2 -2
  218. package/dist/chunks/{index-DtAReZI6.js.map → index-B727-QSU.js.map} +1 -1
  219. package/dist/chunks/{index-BlOgmQzc.js → index-B9q3vx13.js} +2 -2
  220. package/dist/chunks/{index-BlOgmQzc.js.map → index-B9q3vx13.js.map} +1 -1
  221. package/dist/chunks/{index-VSQ2prtJ.js → index-BD-REzV9.js} +2 -2
  222. package/dist/chunks/{index-VSQ2prtJ.js.map → index-BD-REzV9.js.map} +1 -1
  223. package/dist/chunks/{index-XOOiD_zY.js → index-BDRogQH_.js} +3 -3
  224. package/dist/chunks/{index-XOOiD_zY.js.map → index-BDRogQH_.js.map} +1 -1
  225. package/dist/chunks/{index-DOQyf5yZ.js → index-C-DYxdvd.js} +8 -8
  226. package/dist/chunks/{index-DOQyf5yZ.js.map → index-C-DYxdvd.js.map} +1 -1
  227. package/dist/chunks/{index-Cq80YBne.js → index-CBtjGPod.js} +105 -105
  228. package/dist/chunks/{index-Cq80YBne.js.map → index-CBtjGPod.js.map} +1 -1
  229. package/dist/chunks/{index-dlXYTPWH.js → index-CF1cvNUL.js} +4 -4
  230. package/dist/chunks/{index-dlXYTPWH.js.map → index-CF1cvNUL.js.map} +1 -1
  231. package/dist/chunks/{index-COA_xJVJ.js → index-CH0pTHy1.js} +2 -2
  232. package/dist/chunks/{index-COA_xJVJ.js.map → index-CH0pTHy1.js.map} +1 -1
  233. package/dist/chunks/{index-DjZQ6ZG_.js → index-Ca88RIuT.js} +2 -2
  234. package/dist/chunks/{index-DjZQ6ZG_.js.map → index-Ca88RIuT.js.map} +1 -1
  235. package/dist/chunks/{index-Cj-9tGpd.js → index-CkWvsvKW.js} +2 -2
  236. package/dist/chunks/{index-Cj-9tGpd.js.map → index-CkWvsvKW.js.map} +1 -1
  237. package/dist/chunks/{index-EL_ZNnMH.js → index-CzYKE5fL.js} +2 -2
  238. package/dist/chunks/{index-EL_ZNnMH.js.map → index-CzYKE5fL.js.map} +1 -1
  239. package/dist/chunks/{index-qXfYaEmV.js → index-D32ol7lq.js} +2 -2
  240. package/dist/chunks/{index-qXfYaEmV.js.map → index-D32ol7lq.js.map} +1 -1
  241. package/dist/chunks/{index-DMQQ0KyA.js → index-D7hmx9IX.js} +2 -2
  242. package/dist/chunks/{index-DMQQ0KyA.js.map → index-D7hmx9IX.js.map} +1 -1
  243. package/dist/chunks/{index-BetDcNZm.js → index-DThcQmwZ.js} +2 -2
  244. package/dist/chunks/{index-BetDcNZm.js.map → index-DThcQmwZ.js.map} +1 -1
  245. package/dist/chunks/{index-C7h5yvcP.js → index-D_3J6ziZ.js} +2 -2
  246. package/dist/chunks/{index-C7h5yvcP.js.map → index-D_3J6ziZ.js.map} +1 -1
  247. package/dist/chunks/{index-C_nDTEP5.js → index-JSjfMShT.js} +2 -2
  248. package/dist/chunks/{index-C_nDTEP5.js.map → index-JSjfMShT.js.map} +1 -1
  249. package/dist/chunks/{index-COXxU0FH.js → index-gzXJw_ow.js} +3 -3
  250. package/dist/chunks/{index-COXxU0FH.js.map → index-gzXJw_ow.js.map} +1 -1
  251. package/dist/chunks/{index-jJxtz2bs.js → index-rRAbl04H.js} +2 -2
  252. package/dist/chunks/{index-jJxtz2bs.js.map → index-rRAbl04H.js.map} +1 -1
  253. package/dist/chunks/{tenantIconMap-Ddvguo0l.js → tenantIconMap-Cw-hQ9n4.js} +2 -2
  254. package/dist/chunks/{tenantIconMap-Ddvguo0l.js.map → tenantIconMap-Cw-hQ9n4.js.map} +1 -1
  255. package/dist/chunks/{tenantIconMap-DBa5MjIz.js → tenantIconMap-DinwojNW.js} +2 -2
  256. package/dist/chunks/{tenantIconMap-DBa5MjIz.js.map → tenantIconMap-DinwojNW.js.map} +1 -1
  257. package/dist/chunks/{ticketingApi-Cr6QSv0g.js → ticketingApi-CcWdebXv.js} +2 -2
  258. package/dist/chunks/{ticketingApi-Cr6QSv0g.js.map → ticketingApi-CcWdebXv.js.map} +1 -1
  259. package/dist/chunks/{ticketingApi-D6s75rOB.js → ticketingApi-x0BwZ1NH.js} +2 -2
  260. package/dist/chunks/{ticketingApi-D6s75rOB.js.map → ticketingApi-x0BwZ1NH.js.map} +1 -1
  261. package/dist/chunks/{useAccessRequests-VuQT-n-P.js → useAccessRequests-BBTIYht3.js} +2 -2
  262. package/dist/chunks/{useAccessRequests-VuQT-n-P.js.map → useAccessRequests-BBTIYht3.js.map} +1 -1
  263. package/dist/chunks/{useAccessRequests-CanI2ypo.js → useAccessRequests-BBUj9XY9.js} +71 -71
  264. package/dist/chunks/{useAccessRequests-CanI2ypo.js.map → useAccessRequests-BBUj9XY9.js.map} +1 -1
  265. package/dist/chunks/{useUserAccessRequests-BEVZLX_M.js → useUserAccessRequests-BKQxcOXH.js} +2 -2
  266. package/dist/chunks/{useUserAccessRequests-BEVZLX_M.js.map → useUserAccessRequests-BKQxcOXH.js.map} +1 -1
  267. package/dist/chunks/{useUserAccessRequests-Ba40FDLm.js → useUserAccessRequests-BPUPiP55.js} +2 -2
  268. package/dist/chunks/{useUserAccessRequests-Ba40FDLm.js.map → useUserAccessRequests-BPUPiP55.js.map} +1 -1
  269. package/dist/pages/platform/administration/applications/ApplicationDetailPage.d.ts.map +1 -1
  270. package/dist/smartstack.cjs +1 -1
  271. package/dist/smartstack.js +1 -1
  272. package/package.json +1 -1
  273. package/dist/chunks/ApplicationDetailPage-CWdz0TS4.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"useAccessRequests-CanI2ypo.js","sources":["../../src/components/platform/administration/access-requests/AccessRequestApprovalModal.tsx","../../src/hooks/useAccessRequestActions.ts","../../src/components/platform/administration/access-requests/AccessRequestsListTab.tsx","../../src/hooks/useAccessRequests.ts"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { AccessRequest } from '@/services/api/accessRequestsApi';\r\nimport { adminApi, type RoleListDto, type TenantGroupDto } from '@/services/api/adminApi';\r\nimport { Loader2, X, Users, Shield } from 'lucide-react';\r\n\r\ntype AssignmentMode = 'group' | 'role';\r\n\r\ninterface AccessRequestApprovalModalProps {\r\n readonly open: boolean;\r\n readonly onClose: () => void;\r\n readonly onConfirm: (data: { roleId?: string; groupId?: string; notes?: string }) => Promise<void>;\r\n readonly request: AccessRequest;\r\n readonly action: 'approve' | 'deny';\r\n readonly processing: boolean;\r\n}\r\n\r\nexport function AccessRequestApprovalModal({\r\n open,\r\n onClose,\r\n onConfirm,\r\n request,\r\n action,\r\n processing,\r\n}: AccessRequestApprovalModalProps): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const [notes, setNotes] = useState('');\r\n const [assignmentMode, setAssignmentMode] = useState<AssignmentMode>('group');\r\n const [selectedRoleId, setSelectedRoleId] = useState('');\r\n const [selectedGroupId, setSelectedGroupId] = useState('');\r\n const [roles, setRoles] = useState<RoleListDto[]>([]);\r\n const [groups, setGroups] = useState<TenantGroupDto[]>([]);\r\n const [loadingRoles, setLoadingRoles] = useState(false);\r\n const [loadingGroups, setLoadingGroups] = useState(false);\r\n\r\n const isDeny = action === 'deny';\r\n const isApprove = action === 'approve';\r\n\r\n // Load groups for the tenant when modal opens in approve mode\r\n useEffect(() => {\r\n if (!open || !isApprove) return;\r\n\r\n setLoadingGroups(true); // eslint-disable-line react-hooks/set-state-in-effect -- async data fetch\r\n adminApi.tenants.getGroups(request.tenantId)\r\n .then((groups) => {\r\n setGroups(groups.filter(g => g.isActive));\r\n })\r\n .catch(() => {\r\n setGroups([]);\r\n })\r\n .finally(() => {\r\n setLoadingGroups(false);\r\n });\r\n }, [open, isApprove, request.tenantId]);\r\n\r\n // Load roles when switching to role mode or on initial open\r\n useEffect(() => {\r\n if (!open || !isApprove || assignmentMode !== 'role') return;\r\n if (roles.length > 0) return; // Already loaded\r\n\r\n setLoadingRoles(true); // eslint-disable-line react-hooks/set-state-in-effect -- async data fetch\r\n adminApi.roles.getByApplication(request.applicationId)\r\n .then((roles) => {\r\n setRoles(roles);\r\n })\r\n .catch(() => {\r\n setRoles([]);\r\n })\r\n .finally(() => {\r\n setLoadingRoles(false);\r\n });\r\n }, [open, isApprove, assignmentMode, request.applicationId, roles.length]);\r\n\r\n // Reset state when modal closes\r\n useEffect(() => {\r\n if (!open) {\r\n setNotes(''); // eslint-disable-line react-hooks/set-state-in-effect -- conditional reset\r\n setAssignmentMode('group');\r\n setSelectedRoleId('');\r\n setSelectedGroupId('');\r\n setRoles([]);\r\n setGroups([]);\r\n }\r\n }, [open]);\r\n\r\n const handleSubmit = async () => {\r\n if (isDeny) {\r\n await onConfirm({ notes: notes || undefined });\r\n return;\r\n }\r\n\r\n await onConfirm({\r\n roleId: assignmentMode === 'role' ? selectedRoleId : undefined,\r\n groupId: assignmentMode === 'group' ? selectedGroupId : undefined,\r\n notes: notes || undefined,\r\n });\r\n };\r\n\r\n if (!open) return null;\r\n\r\n const canSubmit = isApprove\r\n ? ((assignmentMode === 'role' && selectedRoleId !== '') ||\r\n (assignmentMode === 'group' && selectedGroupId !== '')) && !processing\r\n : notes !== '' && !processing;\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] p-6 max-w-md w-full max-h-[90vh] overflow-y-auto\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold\">{t(`accessRequests.modal.${action}Title`)}</h3>\r\n <button\r\n onClick={onClose}\r\n className=\"p-1 hover:bg-[var(--bg-hover)] rounded\"\r\n disabled={processing}\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n <div>\r\n <div className=\"font-medium mb-1\">{t('accessRequests.modal.user')}</div>\r\n <div>{request.userFullName} ({request.userEmail})</div>\r\n </div>\r\n\r\n <div>\r\n <div className=\"font-medium mb-1\">{t('accessRequests.modal.application')}</div>\r\n <div>{request.applicationLabel}</div>\r\n </div>\r\n\r\n {request.reason && (\r\n <div>\r\n <div className=\"font-medium mb-1\">{t('accessRequests.modal.userReason')}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">{request.reason}</div>\r\n </div>\r\n )}\r\n\r\n {isApprove && (\r\n <>\r\n {/* Assignment mode toggle */}\r\n <div>\r\n <label className=\"block font-medium mb-2\">\r\n {t('accessRequests.modal.assignmentMethod')}\r\n <span className=\"text-[var(--error-text)] ml-1\">*</span>\r\n </label>\r\n <div className=\"grid grid-cols-2 gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setAssignmentMode('group')}\r\n className={`flex items-center gap-2 px-3 py-2.5 rounded-[var(--radius-input)] border text-sm font-medium transition-colors ${\r\n assignmentMode === 'group'\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] text-[var(--color-accent-700)]'\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <Users className=\"w-4 h-4\" />\r\n {t('accessRequests.modal.addToGroup')}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setAssignmentMode('role')}\r\n className={`flex items-center gap-2 px-3 py-2.5 rounded-[var(--radius-input)] border text-sm font-medium transition-colors ${\r\n assignmentMode === 'role'\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] text-[var(--color-accent-700)]'\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <Shield className=\"w-4 h-4\" />\r\n {t('accessRequests.modal.assignRole')}\r\n </button>\r\n </div>\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1.5\">\r\n {assignmentMode === 'group'\r\n ? t('accessRequests.modal.groupHint')\r\n : t('accessRequests.modal.roleHint')}\r\n </p>\r\n </div>\r\n\r\n {/* Group selector */}\r\n {assignmentMode === 'group' && (\r\n <div>\r\n <label className=\"block font-medium mb-2\">\r\n {t('accessRequests.modal.selectGroup')}\r\n <span className=\"text-[var(--error-text)] ml-1\">*</span>\r\n </label>\r\n {loadingGroups && (\r\n <div className=\"flex items-center gap-2 text-sm text-[var(--text-secondary)]\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {t('accessRequests.modal.loadingGroups')}\r\n </div>\r\n )}\r\n {!loadingGroups && groups.length === 0 && (\r\n <div className=\"text-sm text-[var(--warning-text)]\">\r\n {t('accessRequests.modal.noGroupsAvailable')}\r\n </div>\r\n )}\r\n {!loadingGroups && groups.length > 0 && (\r\n <select\r\n value={selectedGroupId}\r\n onChange={(e) => setSelectedGroupId(e.target.value)}\r\n className=\"w-full px-3 py-2 border rounded-[var(--radius-input)] bg-[var(--bg-primary)] border-[var(--border-color)]\"\r\n >\r\n <option value=\"\">{t('accessRequests.modal.selectGroupPlaceholder')}</option>\r\n {groups.map((group) => (\r\n <option key={group.groupId} value={group.groupId}>\r\n {group.name} ({group.memberCount} {t('accessRequests.modal.members')})\r\n </option>\r\n ))}\r\n </select>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Role selector */}\r\n {assignmentMode === 'role' && (\r\n <div>\r\n <label className=\"block font-medium mb-2\">\r\n {t('accessRequests.modal.selectRole')}\r\n <span className=\"text-[var(--error-text)] ml-1\">*</span>\r\n </label>\r\n {loadingRoles && (\r\n <div className=\"flex items-center gap-2 text-sm text-[var(--text-secondary)]\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {t('accessRequests.modal.loadingRoles')}\r\n </div>\r\n )}\r\n {!loadingRoles && roles.length === 0 && (\r\n <div className=\"text-sm text-[var(--warning-text)]\">\r\n {t('accessRequests.modal.noRolesAvailable')}\r\n </div>\r\n )}\r\n {!loadingRoles && roles.length > 0 && (\r\n <select\r\n value={selectedRoleId}\r\n onChange={(e) => setSelectedRoleId(e.target.value)}\r\n className=\"w-full px-3 py-2 border rounded-[var(--radius-input)] bg-[var(--bg-primary)] border-[var(--border-color)]\"\r\n >\r\n <option value=\"\">{t('accessRequests.modal.selectRolePlaceholder')}</option>\r\n {roles.map((role) => (\r\n <option key={role.id} value={role.id}>\r\n {role.name} ({role.shortName})\r\n </option>\r\n ))}\r\n </select>\r\n )}\r\n </div>\r\n )}\r\n </>\r\n )}\r\n\r\n <div>\r\n <label className=\"block font-medium mb-2\">\r\n {t(`accessRequests.modal.${action}Notes`)}\r\n {isDeny && <span className=\"text-[var(--error-text)] ml-1\">*</span>}\r\n </label>\r\n <textarea\r\n value={notes}\r\n onChange={(e) => setNotes(e.target.value)}\r\n className=\"w-full px-3 py-2 border rounded-[var(--radius-input)] bg-[var(--bg-primary)] border-[var(--border-color)]\"\r\n rows={3}\r\n placeholder={t(`accessRequests.modal.${action}NotesPlaceholder`)}\r\n required={isDeny}\r\n />\r\n </div>\r\n\r\n <div className=\"flex justify-end gap-2 pt-2\">\r\n <button\r\n onClick={onClose}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] hover:bg-[var(--bg-hover)]\"\r\n disabled={processing}\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={handleSubmit}\r\n disabled={!canSubmit}\r\n className={`px-4 py-2 rounded-[var(--radius-button)] text-white disabled:opacity-50 flex items-center gap-2 ${\r\n isDeny ? 'bg-[var(--error-text)]' : 'bg-[var(--success-text)]'\r\n }`}\r\n >\r\n {processing && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t(`accessRequests.actions.${action}`)}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState } from 'react';\r\nimport { accessRequestsApi } from '@/services/api/accessRequestsApi';\r\n\r\nexport function useAccessRequestActions(onSuccess?: () => void): {\n approve: (requestId: string, data: { roleId?: string; groupId?: string; notes?: string }) => Promise<void>;\n deny: (requestId: string, notes: string) => Promise<void>;\n processing: boolean;\n error: string | null;\n} {\r\n const [processing, setProcessing] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const approve = async (requestId: string, data: { roleId?: string; groupId?: string; notes?: string }) => {\r\n setProcessing(true);\r\n setError(null);\r\n try {\r\n await accessRequestsApi.approveRequest(requestId, data);\r\n onSuccess?.();\r\n } catch (err: unknown) {\r\n setError(err instanceof Error ? err.message : 'Failed to approve request');\r\n throw err;\r\n } finally {\r\n setProcessing(false);\r\n }\r\n };\r\n\r\n const deny = async (requestId: string, notes: string) => {\r\n setProcessing(true);\r\n setError(null);\r\n try {\r\n await accessRequestsApi.denyRequest(requestId, notes);\r\n onSuccess?.();\r\n } catch (err: unknown) {\r\n setError(err instanceof Error ? err.message : 'Failed to deny request');\r\n throw err;\r\n } finally {\r\n setProcessing(false);\r\n }\r\n };\r\n\r\n return { approve, deny, processing, error };\r\n}\r\n","import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { DataTable } from '@/components/ui/DataTable';\r\nimport type { DataTableColumn } from '@/components/ui/DataTable';\r\nimport { AccessRequestStatusBadge } from './AccessRequestStatusBadge';\r\nimport { AccessRequestApprovalModal } from './AccessRequestApprovalModal';\r\nimport { CheckCircle, XCircle, Loader2 } from 'lucide-react';\r\nimport type { AccessRequest } from '@/services/api/accessRequestsApi';\r\nimport { useAccessRequestActions } from '@/hooks/useAccessRequestActions';\r\n\r\ninterface AccessRequestsListTabProps {\r\n readonly requests: AccessRequest[];\r\n readonly loading: boolean;\r\n readonly onReload: () => void;\r\n readonly showTenantColumn?: boolean;\r\n}\r\n\r\nexport function AccessRequestsListTab({ requests, loading, onReload, showTenantColumn = false }: AccessRequestsListTabProps): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const [selectedRequest, setSelectedRequest] = useState<AccessRequest | null>(null);\r\n const [modalAction, setModalAction] = useState<'approve' | 'deny' | null>(null);\r\n\r\n const { approve, deny, processing } = useAccessRequestActions(() => {\r\n setSelectedRequest(null);\r\n setModalAction(null);\r\n onReload();\r\n });\r\n\r\n const handleAction = (request: AccessRequest, action: 'approve' | 'deny') => {\r\n setSelectedRequest(request);\r\n setModalAction(action);\r\n };\r\n\r\n const handleConfirm = async (data: { roleId?: string; groupId?: string; notes?: string }) => {\r\n if (!selectedRequest) return;\r\n\r\n if (modalAction === 'approve') {\r\n await approve(selectedRequest.id, data);\r\n } else if (modalAction === 'deny' && data.notes) {\r\n await deny(selectedRequest.id, data.notes);\r\n }\r\n };\r\n\r\n const columns: DataTableColumn<AccessRequest>[] = [\r\n {\r\n key: 'userFullName',\r\n label: t('accessRequests.table.user'),\r\n render: (req) => (\r\n <div>\r\n <div className=\"font-medium\">{req.userFullName}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">{req.userEmail}</div>\r\n </div>\r\n ),\r\n },\r\n ...(showTenantColumn ? [{\r\n key: 'tenantName' as const,\r\n label: t('accessRequests.table.tenant'),\r\n render: (req: AccessRequest) => req.tenantName,\r\n }] : []),\r\n {\r\n key: 'applicationLabel',\r\n label: t('accessRequests.table.application'),\r\n },\r\n {\r\n key: 'reason',\r\n label: t('accessRequests.table.reason'),\r\n render: (req) => req.reason || '-',\r\n },\r\n {\r\n key: 'requestedAt',\r\n label: t('accessRequests.table.requestedAt'),\r\n render: (req) => new Date(req.requestedAt).toLocaleString(),\r\n },\r\n {\r\n key: 'status',\r\n label: t('accessRequests.table.status'),\r\n render: (req) => <AccessRequestStatusBadge status={req.status} />,\r\n },\r\n {\r\n key: 'actions',\r\n label: t('common:actionsColumn'),\r\n align: 'right',\r\n render: (req) => (\r\n req.status === 'Pending' ? (\r\n <div className=\"flex gap-2\">\r\n <button\r\n onClick={() => handleAction(req, 'approve')}\r\n className=\"p-1 rounded hover:bg-[var(--success-bg)] text-[var(--success-text)]\"\r\n title={t('accessRequests.actions.approve')}\r\n >\r\n <CheckCircle className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => handleAction(req, 'deny')}\r\n className=\"p-1 rounded hover:bg-[var(--error-bg)] text-[var(--error-text)]\"\r\n title={t('accessRequests.actions.deny')}\r\n >\r\n <XCircle className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n ) : (\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {req.processedBy}\r\n </div>\r\n )\r\n ),\r\n },\r\n ];\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n <DataTable\r\n data={requests}\r\n columns={columns}\r\n searchable\r\n searchPlaceholder={t('accessRequests.search')}\r\n getRowKey={(req) => req.id}\r\n emptyMessage={t('accessRequests.empty')}\r\n />\r\n\r\n {selectedRequest && modalAction && (\r\n <AccessRequestApprovalModal\r\n open={true}\r\n onClose={() => {\r\n setSelectedRequest(null);\r\n setModalAction(null);\r\n }}\r\n onConfirm={handleConfirm}\r\n request={selectedRequest}\r\n action={modalAction}\r\n processing={processing}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState } from 'react';\r\nimport { accessRequestsApi } from '@/services/api/accessRequestsApi';\r\nimport type { AccessRequest } from '@/services/api/accessRequestsApi';\r\n\r\nexport function useAccessRequests(type: 'application' | 'tenant', id: string): {\r\n requests: AccessRequest[];\r\n loading: boolean;\r\n error: string | null;\r\n loadRequests: (status?: string) => Promise<void>;\r\n} {\r\n const [requests, setRequests] = useState<AccessRequest[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadRequests = async (status?: string) => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const data = type === 'application'\r\n ? await accessRequestsApi.getRequestsByApplication(id, status)\r\n : await accessRequestsApi.getRequestsByTenant(id, status);\r\n setRequests(Array.isArray(data) ? data : []);\r\n } catch (err: unknown) {\r\n setError((err as { message?: string }).message || 'Failed to load requests');\r\n setRequests([]); // Reset to empty array on error\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n return { requests, loading, error, loadRequests };\r\n}\r\n"],"names":["AccessRequestApprovalModal","open","onClose","onConfirm","request","action","processing","t","useTranslation","notes","setNotes","useState","assignmentMode","setAssignmentMode","selectedRoleId","setSelectedRoleId","selectedGroupId","setSelectedGroupId","roles","setRoles","groups","setGroups","loadingRoles","setLoadingRoles","loadingGroups","setLoadingGroups","isDeny","isApprove","useEffect","adminApi","g","handleSubmit","canSubmit","jsxs","jsx","X","Fragment","Users","Shield","Loader2","e","group","role","useAccessRequestActions","onSuccess","setProcessing","error","setError","requestId","data","accessRequestsApi","err","AccessRequestsListTab","requests","loading","onReload","showTenantColumn","selectedRequest","setSelectedRequest","modalAction","setModalAction","approve","deny","handleAction","handleConfirm","columns","req","AccessRequestStatusBadge","CheckCircle","XCircle","DataTable","useAccessRequests","type","id","setRequests","setLoading","status"],"mappings":"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"}
1
+ {"version":3,"file":"useAccessRequests-BBUj9XY9.js","sources":["../../src/components/platform/administration/access-requests/AccessRequestApprovalModal.tsx","../../src/hooks/useAccessRequestActions.ts","../../src/components/platform/administration/access-requests/AccessRequestsListTab.tsx","../../src/hooks/useAccessRequests.ts"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { AccessRequest } from '@/services/api/accessRequestsApi';\r\nimport { adminApi, type RoleListDto, type TenantGroupDto } from '@/services/api/adminApi';\r\nimport { Loader2, X, Users, Shield } from 'lucide-react';\r\n\r\ntype AssignmentMode = 'group' | 'role';\r\n\r\ninterface AccessRequestApprovalModalProps {\r\n readonly open: boolean;\r\n readonly onClose: () => void;\r\n readonly onConfirm: (data: { roleId?: string; groupId?: string; notes?: string }) => Promise<void>;\r\n readonly request: AccessRequest;\r\n readonly action: 'approve' | 'deny';\r\n readonly processing: boolean;\r\n}\r\n\r\nexport function AccessRequestApprovalModal({\r\n open,\r\n onClose,\r\n onConfirm,\r\n request,\r\n action,\r\n processing,\r\n}: AccessRequestApprovalModalProps): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const [notes, setNotes] = useState('');\r\n const [assignmentMode, setAssignmentMode] = useState<AssignmentMode>('group');\r\n const [selectedRoleId, setSelectedRoleId] = useState('');\r\n const [selectedGroupId, setSelectedGroupId] = useState('');\r\n const [roles, setRoles] = useState<RoleListDto[]>([]);\r\n const [groups, setGroups] = useState<TenantGroupDto[]>([]);\r\n const [loadingRoles, setLoadingRoles] = useState(false);\r\n const [loadingGroups, setLoadingGroups] = useState(false);\r\n\r\n const isDeny = action === 'deny';\r\n const isApprove = action === 'approve';\r\n\r\n // Load groups for the tenant when modal opens in approve mode\r\n useEffect(() => {\r\n if (!open || !isApprove) return;\r\n\r\n setLoadingGroups(true); // eslint-disable-line react-hooks/set-state-in-effect -- async data fetch\r\n adminApi.tenants.getGroups(request.tenantId)\r\n .then((groups) => {\r\n setGroups(groups.filter(g => g.isActive));\r\n })\r\n .catch(() => {\r\n setGroups([]);\r\n })\r\n .finally(() => {\r\n setLoadingGroups(false);\r\n });\r\n }, [open, isApprove, request.tenantId]);\r\n\r\n // Load roles when switching to role mode or on initial open\r\n useEffect(() => {\r\n if (!open || !isApprove || assignmentMode !== 'role') return;\r\n if (roles.length > 0) return; // Already loaded\r\n\r\n setLoadingRoles(true); // eslint-disable-line react-hooks/set-state-in-effect -- async data fetch\r\n adminApi.roles.getByApplication(request.applicationId)\r\n .then((roles) => {\r\n setRoles(roles);\r\n })\r\n .catch(() => {\r\n setRoles([]);\r\n })\r\n .finally(() => {\r\n setLoadingRoles(false);\r\n });\r\n }, [open, isApprove, assignmentMode, request.applicationId, roles.length]);\r\n\r\n // Reset state when modal closes\r\n useEffect(() => {\r\n if (!open) {\r\n setNotes(''); // eslint-disable-line react-hooks/set-state-in-effect -- conditional reset\r\n setAssignmentMode('group');\r\n setSelectedRoleId('');\r\n setSelectedGroupId('');\r\n setRoles([]);\r\n setGroups([]);\r\n }\r\n }, [open]);\r\n\r\n const handleSubmit = async () => {\r\n if (isDeny) {\r\n await onConfirm({ notes: notes || undefined });\r\n return;\r\n }\r\n\r\n await onConfirm({\r\n roleId: assignmentMode === 'role' ? selectedRoleId : undefined,\r\n groupId: assignmentMode === 'group' ? selectedGroupId : undefined,\r\n notes: notes || undefined,\r\n });\r\n };\r\n\r\n if (!open) return null;\r\n\r\n const canSubmit = isApprove\r\n ? ((assignmentMode === 'role' && selectedRoleId !== '') ||\r\n (assignmentMode === 'group' && selectedGroupId !== '')) && !processing\r\n : notes !== '' && !processing;\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] p-6 max-w-md w-full max-h-[90vh] overflow-y-auto\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold\">{t(`accessRequests.modal.${action}Title`)}</h3>\r\n <button\r\n onClick={onClose}\r\n className=\"p-1 hover:bg-[var(--bg-hover)] rounded\"\r\n disabled={processing}\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n <div>\r\n <div className=\"font-medium mb-1\">{t('accessRequests.modal.user')}</div>\r\n <div>{request.userFullName} ({request.userEmail})</div>\r\n </div>\r\n\r\n <div>\r\n <div className=\"font-medium mb-1\">{t('accessRequests.modal.application')}</div>\r\n <div>{request.applicationLabel}</div>\r\n </div>\r\n\r\n {request.reason && (\r\n <div>\r\n <div className=\"font-medium mb-1\">{t('accessRequests.modal.userReason')}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">{request.reason}</div>\r\n </div>\r\n )}\r\n\r\n {isApprove && (\r\n <>\r\n {/* Assignment mode toggle */}\r\n <div>\r\n <label className=\"block font-medium mb-2\">\r\n {t('accessRequests.modal.assignmentMethod')}\r\n <span className=\"text-[var(--error-text)] ml-1\">*</span>\r\n </label>\r\n <div className=\"grid grid-cols-2 gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setAssignmentMode('group')}\r\n className={`flex items-center gap-2 px-3 py-2.5 rounded-[var(--radius-input)] border text-sm font-medium transition-colors ${\r\n assignmentMode === 'group'\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] text-[var(--color-accent-700)]'\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <Users className=\"w-4 h-4\" />\r\n {t('accessRequests.modal.addToGroup')}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setAssignmentMode('role')}\r\n className={`flex items-center gap-2 px-3 py-2.5 rounded-[var(--radius-input)] border text-sm font-medium transition-colors ${\r\n assignmentMode === 'role'\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] text-[var(--color-accent-700)]'\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <Shield className=\"w-4 h-4\" />\r\n {t('accessRequests.modal.assignRole')}\r\n </button>\r\n </div>\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1.5\">\r\n {assignmentMode === 'group'\r\n ? t('accessRequests.modal.groupHint')\r\n : t('accessRequests.modal.roleHint')}\r\n </p>\r\n </div>\r\n\r\n {/* Group selector */}\r\n {assignmentMode === 'group' && (\r\n <div>\r\n <label className=\"block font-medium mb-2\">\r\n {t('accessRequests.modal.selectGroup')}\r\n <span className=\"text-[var(--error-text)] ml-1\">*</span>\r\n </label>\r\n {loadingGroups && (\r\n <div className=\"flex items-center gap-2 text-sm text-[var(--text-secondary)]\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {t('accessRequests.modal.loadingGroups')}\r\n </div>\r\n )}\r\n {!loadingGroups && groups.length === 0 && (\r\n <div className=\"text-sm text-[var(--warning-text)]\">\r\n {t('accessRequests.modal.noGroupsAvailable')}\r\n </div>\r\n )}\r\n {!loadingGroups && groups.length > 0 && (\r\n <select\r\n value={selectedGroupId}\r\n onChange={(e) => setSelectedGroupId(e.target.value)}\r\n className=\"w-full px-3 py-2 border rounded-[var(--radius-input)] bg-[var(--bg-primary)] border-[var(--border-color)]\"\r\n >\r\n <option value=\"\">{t('accessRequests.modal.selectGroupPlaceholder')}</option>\r\n {groups.map((group) => (\r\n <option key={group.groupId} value={group.groupId}>\r\n {group.name} ({group.memberCount} {t('accessRequests.modal.members')})\r\n </option>\r\n ))}\r\n </select>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Role selector */}\r\n {assignmentMode === 'role' && (\r\n <div>\r\n <label className=\"block font-medium mb-2\">\r\n {t('accessRequests.modal.selectRole')}\r\n <span className=\"text-[var(--error-text)] ml-1\">*</span>\r\n </label>\r\n {loadingRoles && (\r\n <div className=\"flex items-center gap-2 text-sm text-[var(--text-secondary)]\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {t('accessRequests.modal.loadingRoles')}\r\n </div>\r\n )}\r\n {!loadingRoles && roles.length === 0 && (\r\n <div className=\"text-sm text-[var(--warning-text)]\">\r\n {t('accessRequests.modal.noRolesAvailable')}\r\n </div>\r\n )}\r\n {!loadingRoles && roles.length > 0 && (\r\n <select\r\n value={selectedRoleId}\r\n onChange={(e) => setSelectedRoleId(e.target.value)}\r\n className=\"w-full px-3 py-2 border rounded-[var(--radius-input)] bg-[var(--bg-primary)] border-[var(--border-color)]\"\r\n >\r\n <option value=\"\">{t('accessRequests.modal.selectRolePlaceholder')}</option>\r\n {roles.map((role) => (\r\n <option key={role.id} value={role.id}>\r\n {role.name} ({role.shortName})\r\n </option>\r\n ))}\r\n </select>\r\n )}\r\n </div>\r\n )}\r\n </>\r\n )}\r\n\r\n <div>\r\n <label className=\"block font-medium mb-2\">\r\n {t(`accessRequests.modal.${action}Notes`)}\r\n {isDeny && <span className=\"text-[var(--error-text)] ml-1\">*</span>}\r\n </label>\r\n <textarea\r\n value={notes}\r\n onChange={(e) => setNotes(e.target.value)}\r\n className=\"w-full px-3 py-2 border rounded-[var(--radius-input)] bg-[var(--bg-primary)] border-[var(--border-color)]\"\r\n rows={3}\r\n placeholder={t(`accessRequests.modal.${action}NotesPlaceholder`)}\r\n required={isDeny}\r\n />\r\n </div>\r\n\r\n <div className=\"flex justify-end gap-2 pt-2\">\r\n <button\r\n onClick={onClose}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] hover:bg-[var(--bg-hover)]\"\r\n disabled={processing}\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={handleSubmit}\r\n disabled={!canSubmit}\r\n className={`px-4 py-2 rounded-[var(--radius-button)] text-white disabled:opacity-50 flex items-center gap-2 ${\r\n isDeny ? 'bg-[var(--error-text)]' : 'bg-[var(--success-text)]'\r\n }`}\r\n >\r\n {processing && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t(`accessRequests.actions.${action}`)}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState } from 'react';\r\nimport { accessRequestsApi } from '@/services/api/accessRequestsApi';\r\n\r\nexport function useAccessRequestActions(onSuccess?: () => void): {\n approve: (requestId: string, data: { roleId?: string; groupId?: string; notes?: string }) => Promise<void>;\n deny: (requestId: string, notes: string) => Promise<void>;\n processing: boolean;\n error: string | null;\n} {\r\n const [processing, setProcessing] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const approve = async (requestId: string, data: { roleId?: string; groupId?: string; notes?: string }) => {\r\n setProcessing(true);\r\n setError(null);\r\n try {\r\n await accessRequestsApi.approveRequest(requestId, data);\r\n onSuccess?.();\r\n } catch (err: unknown) {\r\n setError(err instanceof Error ? err.message : 'Failed to approve request');\r\n throw err;\r\n } finally {\r\n setProcessing(false);\r\n }\r\n };\r\n\r\n const deny = async (requestId: string, notes: string) => {\r\n setProcessing(true);\r\n setError(null);\r\n try {\r\n await accessRequestsApi.denyRequest(requestId, notes);\r\n onSuccess?.();\r\n } catch (err: unknown) {\r\n setError(err instanceof Error ? err.message : 'Failed to deny request');\r\n throw err;\r\n } finally {\r\n setProcessing(false);\r\n }\r\n };\r\n\r\n return { approve, deny, processing, error };\r\n}\r\n","import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { DataTable } from '@/components/ui/DataTable';\r\nimport type { DataTableColumn } from '@/components/ui/DataTable';\r\nimport { AccessRequestStatusBadge } from './AccessRequestStatusBadge';\r\nimport { AccessRequestApprovalModal } from './AccessRequestApprovalModal';\r\nimport { CheckCircle, XCircle, Loader2 } from 'lucide-react';\r\nimport type { AccessRequest } from '@/services/api/accessRequestsApi';\r\nimport { useAccessRequestActions } from '@/hooks/useAccessRequestActions';\r\n\r\ninterface AccessRequestsListTabProps {\r\n readonly requests: AccessRequest[];\r\n readonly loading: boolean;\r\n readonly onReload: () => void;\r\n readonly showTenantColumn?: boolean;\r\n}\r\n\r\nexport function AccessRequestsListTab({ requests, loading, onReload, showTenantColumn = false }: AccessRequestsListTabProps): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const [selectedRequest, setSelectedRequest] = useState<AccessRequest | null>(null);\r\n const [modalAction, setModalAction] = useState<'approve' | 'deny' | null>(null);\r\n\r\n const { approve, deny, processing } = useAccessRequestActions(() => {\r\n setSelectedRequest(null);\r\n setModalAction(null);\r\n onReload();\r\n });\r\n\r\n const handleAction = (request: AccessRequest, action: 'approve' | 'deny') => {\r\n setSelectedRequest(request);\r\n setModalAction(action);\r\n };\r\n\r\n const handleConfirm = async (data: { roleId?: string; groupId?: string; notes?: string }) => {\r\n if (!selectedRequest) return;\r\n\r\n if (modalAction === 'approve') {\r\n await approve(selectedRequest.id, data);\r\n } else if (modalAction === 'deny' && data.notes) {\r\n await deny(selectedRequest.id, data.notes);\r\n }\r\n };\r\n\r\n const columns: DataTableColumn<AccessRequest>[] = [\r\n {\r\n key: 'userFullName',\r\n label: t('accessRequests.table.user'),\r\n render: (req) => (\r\n <div>\r\n <div className=\"font-medium\">{req.userFullName}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">{req.userEmail}</div>\r\n </div>\r\n ),\r\n },\r\n ...(showTenantColumn ? [{\r\n key: 'tenantName' as const,\r\n label: t('accessRequests.table.tenant'),\r\n render: (req: AccessRequest) => req.tenantName,\r\n }] : []),\r\n {\r\n key: 'applicationLabel',\r\n label: t('accessRequests.table.application'),\r\n },\r\n {\r\n key: 'reason',\r\n label: t('accessRequests.table.reason'),\r\n render: (req) => req.reason || '-',\r\n },\r\n {\r\n key: 'requestedAt',\r\n label: t('accessRequests.table.requestedAt'),\r\n render: (req) => new Date(req.requestedAt).toLocaleString(),\r\n },\r\n {\r\n key: 'status',\r\n label: t('accessRequests.table.status'),\r\n render: (req) => <AccessRequestStatusBadge status={req.status} />,\r\n },\r\n {\r\n key: 'actions',\r\n label: t('common:actionsColumn'),\r\n align: 'right',\r\n render: (req) => (\r\n req.status === 'Pending' ? (\r\n <div className=\"flex gap-2\">\r\n <button\r\n onClick={() => handleAction(req, 'approve')}\r\n className=\"p-1 rounded hover:bg-[var(--success-bg)] text-[var(--success-text)]\"\r\n title={t('accessRequests.actions.approve')}\r\n >\r\n <CheckCircle className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => handleAction(req, 'deny')}\r\n className=\"p-1 rounded hover:bg-[var(--error-bg)] text-[var(--error-text)]\"\r\n title={t('accessRequests.actions.deny')}\r\n >\r\n <XCircle className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n ) : (\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {req.processedBy}\r\n </div>\r\n )\r\n ),\r\n },\r\n ];\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n <DataTable\r\n data={requests}\r\n columns={columns}\r\n searchable\r\n searchPlaceholder={t('accessRequests.search')}\r\n getRowKey={(req) => req.id}\r\n emptyMessage={t('accessRequests.empty')}\r\n />\r\n\r\n {selectedRequest && modalAction && (\r\n <AccessRequestApprovalModal\r\n open={true}\r\n onClose={() => {\r\n setSelectedRequest(null);\r\n setModalAction(null);\r\n }}\r\n onConfirm={handleConfirm}\r\n request={selectedRequest}\r\n action={modalAction}\r\n processing={processing}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useCallback } from 'react';\r\nimport { accessRequestsApi } from '@/services/api/accessRequestsApi';\r\nimport type { AccessRequest } from '@/services/api/accessRequestsApi';\r\n\r\nexport function useAccessRequests(type: 'application' | 'tenant', id: string): {\r\n requests: AccessRequest[];\r\n loading: boolean;\r\n error: string | null;\r\n loadRequests: (status?: string) => Promise<void>;\r\n} {\r\n const [requests, setRequests] = useState<AccessRequest[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadRequests = useCallback(async (status?: string) => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const data = type === 'application'\r\n ? await accessRequestsApi.getRequestsByApplication(id, status)\r\n : await accessRequestsApi.getRequestsByTenant(id, status);\r\n setRequests(Array.isArray(data) ? data : []);\r\n } catch (err: unknown) {\r\n setError((err as { message?: string }).message || 'Failed to load requests');\r\n setRequests([]);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [type, id]);\r\n\r\n return { requests, loading, error, loadRequests };\r\n}\r\n"],"names":["AccessRequestApprovalModal","open","onClose","onConfirm","request","action","processing","t","useTranslation","notes","setNotes","useState","assignmentMode","setAssignmentMode","selectedRoleId","setSelectedRoleId","selectedGroupId","setSelectedGroupId","roles","setRoles","groups","setGroups","loadingRoles","setLoadingRoles","loadingGroups","setLoadingGroups","isDeny","isApprove","useEffect","adminApi","g","handleSubmit","canSubmit","jsxs","jsx","X","Fragment","Users","Shield","Loader2","e","group","role","useAccessRequestActions","onSuccess","setProcessing","error","setError","requestId","data","accessRequestsApi","err","AccessRequestsListTab","requests","loading","onReload","showTenantColumn","selectedRequest","setSelectedRequest","modalAction","setModalAction","approve","deny","handleAction","handleConfirm","columns","req","AccessRequestStatusBadge","CheckCircle","XCircle","DataTable","useAccessRequests","type","id","setRequests","setLoading","loadRequests","useCallback","status"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { useState as s, useEffect as l } from "react";
2
- import { a as i } from "./accessRequestsApi-k3ZwhcFb.js";
2
+ import { a as i } from "./accessRequestsApi-D_pj1wl6.js";
3
3
  function q() {
4
4
  const [u, t] = s([]), [c, a] = s(!1), [n, r] = s(null), o = async () => {
5
5
  a(!0), r(null);
@@ -19,4 +19,4 @@ function q() {
19
19
  export {
20
20
  q as u
21
21
  };
22
- //# sourceMappingURL=useUserAccessRequests-BEVZLX_M.js.map
22
+ //# sourceMappingURL=useUserAccessRequests-BKQxcOXH.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useUserAccessRequests-BEVZLX_M.js","sources":["../../src/hooks/useUserAccessRequests.ts"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport { accessRequestsApi } from '@/services/api/accessRequestsApi';\r\nimport type { AccessRequest } from '@/services/api/accessRequestsApi';\r\n\r\nexport function useUserAccessRequests(): {\r\n requests: AccessRequest[];\r\n loading: boolean;\r\n error: string | null;\r\n reload: () => Promise<void>;\r\n} {\r\n const [requests, setRequests] = useState<AccessRequest[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadRequests = async () => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const data = await accessRequestsApi.getMyRequests();\r\n setRequests(data || []);\r\n } catch (err: unknown) {\r\n setError((err as { message?: string }).message || 'Failed to load requests');\r\n setRequests([]); // Reset to empty array on error\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n loadRequests();\r\n }, []);\r\n\r\n return { requests, loading, error, reload: loadRequests };\r\n}\r\n"],"names":["useUserAccessRequests","requests","setRequests","useState","loading","setLoading","error","setError","loadRequests","data","accessRequestsApi","err","useEffect"],"mappings":";;AAIO,SAASA,IAKd;AACA,QAAM,CAACC,GAAUC,CAAW,IAAIC,EAA0B,CAAA,CAAE,GACtD,CAACC,GAASC,CAAU,IAAIF,EAAS,EAAK,GACtC,CAACG,GAAOC,CAAQ,IAAIJ,EAAwB,IAAI,GAEhDK,IAAe,YAAY;AAC/B,IAAAH,EAAW,EAAI,GACfE,EAAS,IAAI;AACb,QAAI;AACF,YAAME,IAAO,MAAMC,EAAkB,cAAA;AACrC,MAAAR,EAAYO,KAAQ,EAAE;AAAA,IACxB,SAASE,GAAc;AACrB,MAAAJ,EAAUI,EAA6B,WAAW,yBAAyB,GAC3ET,EAAY,CAAA,CAAE;AAAA,IAChB,UAAA;AACE,MAAAG,EAAW,EAAK;AAAA,IAClB;AAAA,EACF;AAEA,SAAAO,EAAU,MAAM;AACd,IAAAJ,EAAA;AAAA,EACF,GAAG,CAAA,CAAE,GAEE,EAAE,UAAAP,GAAU,SAAAG,GAAS,OAAAE,GAAO,QAAQE,EAAA;AAC7C;"}
1
+ {"version":3,"file":"useUserAccessRequests-BKQxcOXH.js","sources":["../../src/hooks/useUserAccessRequests.ts"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport { accessRequestsApi } from '@/services/api/accessRequestsApi';\r\nimport type { AccessRequest } from '@/services/api/accessRequestsApi';\r\n\r\nexport function useUserAccessRequests(): {\r\n requests: AccessRequest[];\r\n loading: boolean;\r\n error: string | null;\r\n reload: () => Promise<void>;\r\n} {\r\n const [requests, setRequests] = useState<AccessRequest[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadRequests = async () => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const data = await accessRequestsApi.getMyRequests();\r\n setRequests(data || []);\r\n } catch (err: unknown) {\r\n setError((err as { message?: string }).message || 'Failed to load requests');\r\n setRequests([]); // Reset to empty array on error\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n loadRequests();\r\n }, []);\r\n\r\n return { requests, loading, error, reload: loadRequests };\r\n}\r\n"],"names":["useUserAccessRequests","requests","setRequests","useState","loading","setLoading","error","setError","loadRequests","data","accessRequestsApi","err","useEffect"],"mappings":";;AAIO,SAASA,IAKd;AACA,QAAM,CAACC,GAAUC,CAAW,IAAIC,EAA0B,CAAA,CAAE,GACtD,CAACC,GAASC,CAAU,IAAIF,EAAS,EAAK,GACtC,CAACG,GAAOC,CAAQ,IAAIJ,EAAwB,IAAI,GAEhDK,IAAe,YAAY;AAC/B,IAAAH,EAAW,EAAI,GACfE,EAAS,IAAI;AACb,QAAI;AACF,YAAME,IAAO,MAAMC,EAAkB,cAAA;AACrC,MAAAR,EAAYO,KAAQ,EAAE;AAAA,IACxB,SAASE,GAAc;AACrB,MAAAJ,EAAUI,EAA6B,WAAW,yBAAyB,GAC3ET,EAAY,CAAA,CAAE;AAAA,IAChB,UAAA;AACE,MAAAG,EAAW,EAAK;AAAA,IAClB;AAAA,EACF;AAEA,SAAAO,EAAU,MAAM;AACd,IAAAJ,EAAA;AAAA,EACF,GAAG,CAAA,CAAE,GAEE,EAAE,UAAAP,GAAU,SAAAG,GAAS,OAAAE,GAAO,QAAQE,EAAA;AAC7C;"}
@@ -1,2 +1,2 @@
1
- "use strict";const e=require("react"),l=require("./accessRequestsApi-C-r0mrCH.js");function i(){const[r,t]=e.useState([]),[n,u]=e.useState(!1),[o,a]=e.useState(null),c=async()=>{u(!0),a(null);try{const s=await l.accessRequestsApi.getMyRequests();t(s||[])}catch(s){a(s.message||"Failed to load requests"),t([])}finally{u(!1)}};return e.useEffect(()=>{c()},[]),{requests:r,loading:n,error:o,reload:c}}exports.useUserAccessRequests=i;
2
- //# sourceMappingURL=useUserAccessRequests-Ba40FDLm.js.map
1
+ "use strict";const e=require("react"),l=require("./accessRequestsApi-CJPjyEkH.js");function i(){const[r,t]=e.useState([]),[n,u]=e.useState(!1),[o,a]=e.useState(null),c=async()=>{u(!0),a(null);try{const s=await l.accessRequestsApi.getMyRequests();t(s||[])}catch(s){a(s.message||"Failed to load requests"),t([])}finally{u(!1)}};return e.useEffect(()=>{c()},[]),{requests:r,loading:n,error:o,reload:c}}exports.useUserAccessRequests=i;
2
+ //# sourceMappingURL=useUserAccessRequests-BPUPiP55.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useUserAccessRequests-Ba40FDLm.js","sources":["../../src/hooks/useUserAccessRequests.ts"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport { accessRequestsApi } from '@/services/api/accessRequestsApi';\r\nimport type { AccessRequest } from '@/services/api/accessRequestsApi';\r\n\r\nexport function useUserAccessRequests(): {\r\n requests: AccessRequest[];\r\n loading: boolean;\r\n error: string | null;\r\n reload: () => Promise<void>;\r\n} {\r\n const [requests, setRequests] = useState<AccessRequest[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadRequests = async () => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const data = await accessRequestsApi.getMyRequests();\r\n setRequests(data || []);\r\n } catch (err: unknown) {\r\n setError((err as { message?: string }).message || 'Failed to load requests');\r\n setRequests([]); // Reset to empty array on error\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n loadRequests();\r\n }, []);\r\n\r\n return { requests, loading, error, reload: loadRequests };\r\n}\r\n"],"names":["useUserAccessRequests","requests","setRequests","useState","loading","setLoading","error","setError","loadRequests","data","accessRequestsApi","err","useEffect"],"mappings":"mFAIO,SAASA,GAKd,CACA,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAA0B,CAAA,CAAE,EACtD,CAACC,EAASC,CAAU,EAAIF,EAAAA,SAAS,EAAK,EACtC,CAACG,EAAOC,CAAQ,EAAIJ,EAAAA,SAAwB,IAAI,EAEhDK,EAAe,SAAY,CAC/BH,EAAW,EAAI,EACfE,EAAS,IAAI,EACb,GAAI,CACF,MAAME,EAAO,MAAMC,EAAAA,kBAAkB,cAAA,EACrCR,EAAYO,GAAQ,EAAE,CACxB,OAASE,EAAc,CACrBJ,EAAUI,EAA6B,SAAW,yBAAyB,EAC3ET,EAAY,CAAA,CAAE,CAChB,QAAA,CACEG,EAAW,EAAK,CAClB,CACF,EAEAO,OAAAA,EAAAA,UAAU,IAAM,CACdJ,EAAA,CACF,EAAG,CAAA,CAAE,EAEE,CAAE,SAAAP,EAAU,QAAAG,EAAS,MAAAE,EAAO,OAAQE,CAAA,CAC7C"}
1
+ {"version":3,"file":"useUserAccessRequests-BPUPiP55.js","sources":["../../src/hooks/useUserAccessRequests.ts"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport { accessRequestsApi } from '@/services/api/accessRequestsApi';\r\nimport type { AccessRequest } from '@/services/api/accessRequestsApi';\r\n\r\nexport function useUserAccessRequests(): {\r\n requests: AccessRequest[];\r\n loading: boolean;\r\n error: string | null;\r\n reload: () => Promise<void>;\r\n} {\r\n const [requests, setRequests] = useState<AccessRequest[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadRequests = async () => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const data = await accessRequestsApi.getMyRequests();\r\n setRequests(data || []);\r\n } catch (err: unknown) {\r\n setError((err as { message?: string }).message || 'Failed to load requests');\r\n setRequests([]); // Reset to empty array on error\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n loadRequests();\r\n }, []);\r\n\r\n return { requests, loading, error, reload: loadRequests };\r\n}\r\n"],"names":["useUserAccessRequests","requests","setRequests","useState","loading","setLoading","error","setError","loadRequests","data","accessRequestsApi","err","useEffect"],"mappings":"mFAIO,SAASA,GAKd,CACA,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAA0B,CAAA,CAAE,EACtD,CAACC,EAASC,CAAU,EAAIF,EAAAA,SAAS,EAAK,EACtC,CAACG,EAAOC,CAAQ,EAAIJ,EAAAA,SAAwB,IAAI,EAEhDK,EAAe,SAAY,CAC/BH,EAAW,EAAI,EACfE,EAAS,IAAI,EACb,GAAI,CACF,MAAME,EAAO,MAAMC,EAAAA,kBAAkB,cAAA,EACrCR,EAAYO,GAAQ,EAAE,CACxB,OAASE,EAAc,CACrBJ,EAAUI,EAA6B,SAAW,yBAAyB,EAC3ET,EAAY,CAAA,CAAE,CAChB,QAAA,CACEG,EAAW,EAAK,CAClB,CACF,EAEAO,OAAAA,EAAAA,UAAU,IAAM,CACdJ,EAAA,CACF,EAAG,CAAA,CAAE,EAEE,CAAE,SAAAP,EAAU,QAAAG,EAAS,MAAAE,EAAO,OAAQE,CAAA,CAC7C"}
@@ -1 +1 @@
1
- {"version":3,"file":"ApplicationDetailPage.d.ts","sourceRoot":"","sources":["../../../../../src/pages/platform/administration/applications/ApplicationDetailPage.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAwC1C,MAAM,CAAC,OAAO,UAAU,qBAAqB,IAAI,YAAY,CA+b5D"}
1
+ {"version":3,"file":"ApplicationDetailPage.d.ts","sourceRoot":"","sources":["../../../../../src/pages/platform/administration/applications/ApplicationDetailPage.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAwC1C,MAAM,CAAC,OAAO,UAAU,qBAAqB,IAAI,YAAY,CAyc5D"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./chunks/index-XOOiD_zY.js"),i=require("i18next");exports.ActivityTimeline=e.ActivityTimeline;exports.AdminSidebar=e.AdminSidebar;exports.AppHeader=e.AppHeader;exports.AppLayout=e.AppLayout;exports.AppSwitcher=e.AppSwitcher;exports.AuthLayout=e.AuthLayout;exports.AuthProvider=e.AuthProvider;exports.Breadcrumb=e.Breadcrumb;exports.CreateTicketButton=e.CreateTicketButton;exports.DataTable=e.DataTable;exports.DataView=e.DataView;exports.DocPanelProvider=e.DocPanelProvider;exports.DocsLayout=e.DocsLayout;exports.DynamicRouter=e.DynamicRouter;exports.EntityCard=e.EntityCard;exports.ErrorFallback=e.ErrorFallback;exports.ExtendablePage=e.ExtendablePage;exports.ExtensionProvider=e.ExtensionProvider;exports.FavoritesBar=e.FavoritesBar;exports.FavoritesModal=e.FavoritesModal;exports.FavoritesProvider=e.FavoritesProvider;exports.FeatureGate=e.FeatureGate;exports.FeatureRouteGuard=e.FeatureRouteGuard;exports.Fill=e.Fill;exports.Footer=e.Footer;exports.GlobalErrorBoundary=e.GlobalErrorBoundary;exports.Header=e.Header;exports.KanbanBoard=e.KanbanBoard;exports.LanguageSwitcher=e.LanguageSwitcher;exports.LicenseActivationDialog=e.LicenseActivationDialog;exports.LicenseContentBanner=e.LicenseContentBanner;exports.LicenseGuard=e.LicenseGuard;exports.LicenseProvider=e.LicenseProvider;exports.LicenseStatusBadge=e.LicenseStatusBadge;exports.ModuleSidebar=e.ModuleSidebar;exports.NotificationBell=e.NotificationBell;exports.PAGE_KEYS=e.PAGE_KEYS;exports.PageHeader=e.PageHeader;exports.PageRegistry=e.PageRegistry;exports.PermissionMatrix=e.PermissionMatrix;exports.ProtectedRoute=e.ProtectedRoute;exports.PublicLayout=e.PublicLayout;exports.RouteErrorBoundary=e.RouteErrorBoundary;exports.SessionProvider=e.SessionProvider;exports.SessionWarningModal=e.SessionWarningModal;exports.SidebarProvider=e.SidebarProvider;exports.SignalRProvider=e.SignalRProvider;exports.SlaBadge=e.SlaBadge;exports.Slot=e.Slot;exports.SlotFillProvider=e.SlotFillProvider;exports.SmartStackProvider=e.SmartStackProvider;exports.ThemeCustomizer=e.ThemeCustomizer;exports.ThemeProvider=e.ThemeProvider;exports.ThemeSwitcher=e.ThemeSwitcher;exports.TicketConversation=e.TicketConversation;exports.TicketDetailView=e.TicketDetailView;exports.TicketSidebar=e.TicketSidebar;exports.TicketsListView=e.TicketsListView;exports.Tooltip=e.Tooltip;exports.UnderDevelopment=e.UnderDevelopment;exports.UserSidebar=e.UserSidebar;exports.WILDCARD_PERMISSION=e.WILDCARD_PERMISSION;exports.api=e.api;exports.apiClient=e.apiClient;exports.changeLanguage=e.changeLanguage;exports.createSlotFill=e.createSlotFill;exports.hasFullAccess=e.hasFullAccess;exports.hasPermission=e.hasPermission;exports.hasRouteAccess=e.hasRouteAccess;exports.i18nReady=e.i18nReady;exports.logService=e.logService;exports.matchesWildcard=e.matchesWildcard;exports.useActivePage=e.useActivePage;exports.useAuth=e.useAuth;exports.useClientContext=e.useClientContext;exports.useCollapsibleState=e.useCollapsibleState;exports.useDocPanel=e.useDocPanel;exports.useExtensions=e.useExtensions;exports.useFavoriteModules=e.useFavorites;exports.useFavorites=e.useFavorites;exports.useFormFieldExtensions=e.useFormFieldExtensions;exports.useHasExtension=e.useHasExtension;exports.useLicense=e.useLicense;exports.usePageOverride=e.usePageOverride;exports.usePageTracking=e.usePageTracking;exports.usePermissionMatrix=e.usePermissionMatrix;exports.usePermissionSync=e.usePermissionSync;exports.useRouteConfig=e.useRouteConfig;exports.useSessionMonitor=e.useSessionMonitor;exports.useSidebar=e.useSidebar;exports.useSignalR=e.useSignalR;exports.useSignalRContext=e.useSignalRContext;exports.useSlotFill=e.useSlotFill;exports.useSlotHasContent=e.useSlotHasContent;exports.useTableColumnExtensions=e.useTableColumnExtensions;exports.useTheme=e.useTheme;exports.useTicketSignalR=e.useTicketSignalR;exports.useUserPermissions=e.useUserPermissions;exports.withPageOverride=e.withPageOverride;exports.i18n=i;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./chunks/index-BDRogQH_.js"),i=require("i18next");exports.ActivityTimeline=e.ActivityTimeline;exports.AdminSidebar=e.AdminSidebar;exports.AppHeader=e.AppHeader;exports.AppLayout=e.AppLayout;exports.AppSwitcher=e.AppSwitcher;exports.AuthLayout=e.AuthLayout;exports.AuthProvider=e.AuthProvider;exports.Breadcrumb=e.Breadcrumb;exports.CreateTicketButton=e.CreateTicketButton;exports.DataTable=e.DataTable;exports.DataView=e.DataView;exports.DocPanelProvider=e.DocPanelProvider;exports.DocsLayout=e.DocsLayout;exports.DynamicRouter=e.DynamicRouter;exports.EntityCard=e.EntityCard;exports.ErrorFallback=e.ErrorFallback;exports.ExtendablePage=e.ExtendablePage;exports.ExtensionProvider=e.ExtensionProvider;exports.FavoritesBar=e.FavoritesBar;exports.FavoritesModal=e.FavoritesModal;exports.FavoritesProvider=e.FavoritesProvider;exports.FeatureGate=e.FeatureGate;exports.FeatureRouteGuard=e.FeatureRouteGuard;exports.Fill=e.Fill;exports.Footer=e.Footer;exports.GlobalErrorBoundary=e.GlobalErrorBoundary;exports.Header=e.Header;exports.KanbanBoard=e.KanbanBoard;exports.LanguageSwitcher=e.LanguageSwitcher;exports.LicenseActivationDialog=e.LicenseActivationDialog;exports.LicenseContentBanner=e.LicenseContentBanner;exports.LicenseGuard=e.LicenseGuard;exports.LicenseProvider=e.LicenseProvider;exports.LicenseStatusBadge=e.LicenseStatusBadge;exports.ModuleSidebar=e.ModuleSidebar;exports.NotificationBell=e.NotificationBell;exports.PAGE_KEYS=e.PAGE_KEYS;exports.PageHeader=e.PageHeader;exports.PageRegistry=e.PageRegistry;exports.PermissionMatrix=e.PermissionMatrix;exports.ProtectedRoute=e.ProtectedRoute;exports.PublicLayout=e.PublicLayout;exports.RouteErrorBoundary=e.RouteErrorBoundary;exports.SessionProvider=e.SessionProvider;exports.SessionWarningModal=e.SessionWarningModal;exports.SidebarProvider=e.SidebarProvider;exports.SignalRProvider=e.SignalRProvider;exports.SlaBadge=e.SlaBadge;exports.Slot=e.Slot;exports.SlotFillProvider=e.SlotFillProvider;exports.SmartStackProvider=e.SmartStackProvider;exports.ThemeCustomizer=e.ThemeCustomizer;exports.ThemeProvider=e.ThemeProvider;exports.ThemeSwitcher=e.ThemeSwitcher;exports.TicketConversation=e.TicketConversation;exports.TicketDetailView=e.TicketDetailView;exports.TicketSidebar=e.TicketSidebar;exports.TicketsListView=e.TicketsListView;exports.Tooltip=e.Tooltip;exports.UnderDevelopment=e.UnderDevelopment;exports.UserSidebar=e.UserSidebar;exports.WILDCARD_PERMISSION=e.WILDCARD_PERMISSION;exports.api=e.api;exports.apiClient=e.apiClient;exports.changeLanguage=e.changeLanguage;exports.createSlotFill=e.createSlotFill;exports.hasFullAccess=e.hasFullAccess;exports.hasPermission=e.hasPermission;exports.hasRouteAccess=e.hasRouteAccess;exports.i18nReady=e.i18nReady;exports.logService=e.logService;exports.matchesWildcard=e.matchesWildcard;exports.useActivePage=e.useActivePage;exports.useAuth=e.useAuth;exports.useClientContext=e.useClientContext;exports.useCollapsibleState=e.useCollapsibleState;exports.useDocPanel=e.useDocPanel;exports.useExtensions=e.useExtensions;exports.useFavoriteModules=e.useFavorites;exports.useFavorites=e.useFavorites;exports.useFormFieldExtensions=e.useFormFieldExtensions;exports.useHasExtension=e.useHasExtension;exports.useLicense=e.useLicense;exports.usePageOverride=e.usePageOverride;exports.usePageTracking=e.usePageTracking;exports.usePermissionMatrix=e.usePermissionMatrix;exports.usePermissionSync=e.usePermissionSync;exports.useRouteConfig=e.useRouteConfig;exports.useSessionMonitor=e.useSessionMonitor;exports.useSidebar=e.useSidebar;exports.useSignalR=e.useSignalR;exports.useSignalRContext=e.useSignalRContext;exports.useSlotFill=e.useSlotFill;exports.useSlotHasContent=e.useSlotHasContent;exports.useTableColumnExtensions=e.useTableColumnExtensions;exports.useTheme=e.useTheme;exports.useTicketSignalR=e.useTicketSignalR;exports.useUserPermissions=e.useUserPermissions;exports.withPageOverride=e.withPageOverride;exports.i18n=i;
2
2
  //# sourceMappingURL=smartstack.cjs.map
@@ -1,4 +1,4 @@
1
- import { bc as e, aW as i, aV as r, aL as t, aS as o, aM as n, aw as u, B as l, bb as d, D as c, aP as b, aB as S, aN as P, b6 as g, H as v, a$ as m, at as h, ag as F, b9 as T, ba as C, ay as L, b3 as A, b8 as R, am as p, aU as x, aZ as y, aT as E, aQ as D, ad as B, Q as k, b4 as M, b7 as w, ax as f, O as G, aY as H, b0 as O, au as I, C as U, aq as V, aR as W, b5 as _, aO as j, a_ as K, b1 as N, b2 as z, az as J, aD as Q, bd as Y, S as $, al as q, af as X, ac as Z, av as aa, T as sa, be as ea, $ as ia, bf as ra, _ as ta, G as oa, F as na, aX as ua, bj as la, i as da, j as ca, h as ba, ap as Sa, x as Pa, bg as ga, bh as va, bk as ma, l as ha, bi as Fa, as as Ta, o as Ca, aE as La, s as Aa, aC as Ra, ah as pa, aa as xa, aa as ya, aj as Ea, ak as Da, L as Ba, ai as ka, aF as Ma, y as wa, aG as fa, aK as Ga, aH as Ha, aA as Oa, aI as Ia, J as Ua, an as Va, ao as Wa, m as _a, ab as ja, aJ as Ka, r as Na, ar as za } from "./chunks/index-Cq80YBne.js";
1
+ import { bc as e, aW as i, aV as r, aL as t, aS as o, aM as n, aw as u, B as l, bb as d, D as c, aP as b, aB as S, aN as P, b6 as g, H as v, a$ as m, at as h, ag as F, b9 as T, ba as C, ay as L, b3 as A, b8 as R, am as p, aU as x, aZ as y, aT as E, aQ as D, ad as B, Q as k, b4 as M, b7 as w, ax as f, O as G, aY as H, b0 as O, au as I, C as U, aq as V, aR as W, b5 as _, aO as j, a_ as K, b1 as N, b2 as z, az as J, aD as Q, bd as Y, S as $, al as q, af as X, ac as Z, av as aa, T as sa, be as ea, $ as ia, bf as ra, _ as ta, G as oa, F as na, aX as ua, bj as la, i as da, j as ca, h as ba, ap as Sa, x as Pa, bg as ga, bh as va, bk as ma, l as ha, bi as Fa, as as Ta, o as Ca, aE as La, s as Aa, aC as Ra, ah as pa, aa as xa, aa as ya, aj as Ea, ak as Da, L as Ba, ai as ka, aF as Ma, y as wa, aG as fa, aK as Ga, aH as Ha, aA as Oa, aI as Ia, J as Ua, an as Va, ao as Wa, m as _a, ab as ja, aJ as Ka, r as Na, ar as za } from "./chunks/index-CBtjGPod.js";
2
2
  import { default as Qa } from "i18next";
3
3
  export {
4
4
  e as ActivityTimeline,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlashub/smartstack",
3
- "version": "3.39.0-preview.1049",
3
+ "version": "3.40.0",
4
4
  "description": "SmartStack React components, navigation system and admin UI",
5
5
  "type": "module",
6
6
  "main": "./dist/smartstack.cjs",
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),n=require("react"),Q=require("react-router-dom"),Ne=require("./useTabNavigation-BVtbCTd5.js"),z=require("react-i18next"),M=require("./index-XOOiD_zY.js"),w=require("lucide-react"),U=require("@dnd-kit/core"),$=require("@dnd-kit/sortable"),we=require("@dnd-kit/utilities"),V=require("./tenantIconMap-Ddvguo0l.js"),X=require("./useAccessRequests-VuQT-n-P.js");function Se(t){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const s in t)if(s!=="default"){const l=Object.getOwnPropertyDescriptor(t,s);Object.defineProperty(r,s,l.get?l:{enumerable:!0,get:()=>t[s]})}}return r.default=t,Object.freeze(r)}const Ae=Se(w);function H(t,r="w-4 h-4"){if(!t)return null;if(typeof t=="string"){const d=Ae[t];return d?e.jsx(d,{className:r}):null}const s=t;return e.jsx(s,{className:r})}function De(){const{t}=z.useTranslation("admin"),[r,s]=n.useState(null),[l,d]=n.useState(!1),[u,c]=n.useState(!1),[o,j]=n.useState(null),[a,b]=n.useState(null),[N,i]=n.useState({label:"",description:"",icon:"",route:"",displayOrder:0}),A=n.useCallback(async h=>{if(h){d(!0),j(null);try{const m=await M.adminApi.applications.getById(h);s(m),i({label:m.label,description:m.description||"",icon:m.icon||"",route:m.route||"",displayOrder:m.displayOrder})}catch(m){j(m instanceof Error?m.message:t("applicationDetail.errors.loadFailed"))}finally{d(!1)}}},[t]),R=n.useCallback(async(h,m)=>{if(!(!h||!r)){c(!0),j(null),b(null);try{const y={label:m.label,description:m.description||void 0,icon:m.icon||void 0,route:m.route||void 0,displayOrder:m.displayOrder};await M.adminApi.applications.update(h,y),b(t("applicationDetail.success.saved")),await A(h)}catch(y){j(y instanceof Error?y.message:t("applicationDetail.errors.saveFailed"))}finally{c(!1)}}},[r,t,A]),k=n.useCallback(async h=>{if(!(!h||!r)){c(!0),j(null),b(null);try{r.isActive?await M.adminApi.applications.deactivate(h):await M.adminApi.applications.activate(h),b(r.isActive?t("applicationDetail.success.deactivated"):t("applicationDetail.success.activated")),await A(h)}catch(m){j(m instanceof Error?m.message:t("applicationDetail.errors.toggleFailed"))}finally{c(!1)}}},[r,t,A]);return{application:r,loading:l,saving:u,error:o,success:a,formData:N,setFormData:i,setError:j,setSuccess:b,loadApplication:A,handleSaveInfo:R,handleToggleStatus:k}}function Me(){const[t,r]=n.useState(new Set),[s,l]=n.useState(new Map),[d,u]=n.useState(new Set),[c,o]=n.useState(!1),[j,a]=n.useState(null),[b,N]=n.useState({code:"",label:"",description:"",icon:"",route:"",displayOrder:0}),[i,A]=n.useState(!1),R=n.useCallback(async(T,p)=>{const L=!t.has(p);if(r(S=>{const D=new Set(S);return D.has(p)?D.delete(p):D.add(p),D}),L&&!s.has(p)){u(S=>new Set(S).add(p));try{const S=await M.adminApi.applications.getModuleSections(T,p);l(D=>new Map(D).set(p,S))}catch(S){console.error("Failed to load sections:",S)}finally{u(S=>{const D=new Set(S);return D.delete(p),D})}}},[t,s]),k=n.useCallback(T=>{N({code:"",label:"",description:"",icon:"",route:"",displayOrder:T||0})},[]),h=n.useCallback(async(T,p,L)=>{try{await M.adminApi.applications.updateModule(T,p,{label:L.label,description:L.description||void 0,icon:L.icon||void 0,route:L.route||void 0,displayOrder:L.displayOrder}),A(!1),a(null),k()}catch(S){throw console.error("Failed to save module:",S),S}},[k]),m=n.useCallback(async(T,p)=>{const L=p.map((S,D)=>({...S,displayOrder:D}));o(!0);try{await M.adminApi.applications.reorderModules(T,L.map((S,D)=>({id:S.id,displayOrder:D})))}catch(S){throw console.error("Failed to reorder modules:",S),S}finally{o(!1)}},[]),y=n.useCallback(async(T,p,L)=>{const S=L.map((D,B)=>({...D,displayOrder:B}));l(D=>new Map(D).set(p,S)),o(!0);try{await M.adminApi.applications.reorderSections(T,p,S.map((D,B)=>({id:D.id,displayOrder:B})))}catch(D){console.error("Failed to reorder sections:",D);try{const B=await M.adminApi.applications.getModuleSections(T,p);l(O=>new Map(O).set(p,B))}catch(B){console.error("Failed to reload sections:",B)}throw D}finally{o(!1)}},[]),P=n.useCallback(T=>{a(T),N({code:T.code,label:T.label,description:T.description||"",icon:T.icon||"",route:T.route||"",displayOrder:T.displayOrder}),A(!0)},[]);return{expandedModules:t,moduleSections:s,loadingSections:d,reordering:c,editingModule:j,moduleFormData:b,showModuleForm:i,toggleModuleExpand:R,handleSaveModule:h,handleModulesReorder:m,handleSectionsReorder:y,startEditModule:P,resetModuleForm:k,setShowModuleForm:A,setEditingModule:a,setModuleFormData:N}}const Te=(t,r,s)=>{const l=r.filter(d=>d.permissionIds.includes(t.id)).map(d=>s.find(u=>u.id===d.id)).filter(Boolean);return{permission:t,roles:l}};function Ce(){const[t,r]=n.useState([]),[s,l]=n.useState([]),[d,u]=n.useState([]),c=n.useCallback(async a=>{try{const[b,N]=await Promise.all([M.adminApi.permissions.getMatrix(),M.adminApi.roles.getAll()]),i=`${a.code}.`.toLowerCase(),A=b.permissions.filter(k=>k.path.toLowerCase().startsWith(i));l(A),r(N);const R=A.map(k=>Te(k,b.roles,N));u(R)}catch(b){throw console.error("Failed to load permissions data:",b),b}},[]),o=n.useCallback(async()=>{try{const a=await M.adminApi.roles.getAll();r(a)}catch(a){throw console.error("Failed to load roles:",a),a}},[]),j=n.useMemo(()=>{if(d.length===0)return[];const a=new Map;return d.forEach(({permission:b,roles:N})=>{N.forEach(i=>{a.has(i.id)||a.set(i.id,{role:i,permissions:[]}),a.get(i.id).permissions.push(b)})}),Array.from(a.values()).sort((b,N)=>N.permissions.length-b.permissions.length)},[d]);return{roles:t,permissions:s,permissionsWithRoles:d,rolesWithAppAccess:j,loadPermissionsData:c,loadRolesData:o}}const ke=(t,r)=>{if(t.id!==r)return t;const s=!t.isAssigned;return{...t,isAssigned:s,sections:t.sections.map(l=>({...l,isAssigned:s}))}},Le=(t,r,s)=>{if(t.id!==r)return t;const l=t.sections.map(u=>u.id===s?{...u,isAssigned:!u.isAssigned}:u),d=l.every(u=>u.isAssigned);return{...t,isAssigned:d,sections:l}},Re=t=>({...t,isAssigned:!0,sections:t.sections.map(r=>({...r,isAssigned:!0}))}),Pe=t=>({...t,isAssigned:!1,sections:t.sections.map(r=>({...r,isAssigned:!1}))});function Be(){const[t,r]=n.useState([]),[s,l]=n.useState([]),[d,u]=n.useState(!1),[c,o]=n.useState([]),[j,a]=n.useState("FullAccess"),[b,N]=n.useState(""),[i,A]=n.useState(!1),[R,k]=n.useState(null),[h,m]=n.useState("full"),[y,P]=n.useState([]),[T,p]=n.useState(new Set),[L,S]=n.useState(!1),[D,B]=n.useState(!1),[O,Z]=n.useState("merge"),[ee,G]=n.useState(!1),[te,J]=n.useState({modules:0,sections:0}),[W,se]=n.useState(!1),[ae,ie]=n.useState(!1),q=n.useCallback(async v=>{try{const[x,g]=await Promise.all([M.adminApi.applications.getTenants(v),M.adminApi.applications.getAvailableTenants(v)]);r(x),l(g.tenants),ie(g.isInDefaultPersonalTemplate)}catch(x){console.error("Failed to load publication data:",x)}},[]),re=n.useCallback(async v=>{S(!0);try{const x=await M.adminApi.applications.getModules(v),g=[];for(const f of x){const F=(await M.adminApi.applications.getModuleSections(v,f.id)).map(I=>({id:I.id,label:I.label,code:I.code,icon:I.icon,isAssigned:!0}));g.push({id:f.id,label:f.label,code:f.code,icon:f.icon,isAssigned:!0,sections:F})}P(g)}catch(x){console.error("Failed to load bulk modules:",x)}finally{S(!1)}},[]),ne=n.useCallback(v=>{p(x=>{const g=new Set(x);return g.has(v)?g.delete(v):g.add(v),g})},[]),le=n.useCallback(v=>{P(x=>x.map(g=>ke(g,v)))},[]),oe=n.useCallback((v,x)=>{P(g=>g.map(f=>Le(f,v,x)))},[]),ce=n.useCallback(v=>{const x=v.sections.filter(g=>g.isAssigned).length;return x===0?"unchecked":x===v.sections.length?"checked":"indeterminate"},[]),de=n.useCallback(()=>{const v=y.length,x=y.filter(C=>C.isAssigned||C.sections.some(F=>F.isAssigned)).length,g=y.reduce((C,F)=>C+F.sections.length,0),f=y.reduce((C,F)=>C+F.sections.filter(I=>I.isAssigned).length,0);return{totalModules:v,assignedModules:x,totalSections:g,assignedSections:f}},[y]),ue=n.useCallback(()=>{P(v=>v.map(x=>Re(x)))},[]),pe=n.useCallback(()=>{P(v=>v.map(x=>Pe(x)))},[]),me=n.useCallback(v=>{o(x=>x.includes(v)?x.filter(g=>g!==v):[...x,v])},[]),xe=n.useCallback(()=>{if(D){const v=t.filter(x=>{const g=x.tenantName.toLowerCase().includes(b.toLowerCase())||x.tenantSlug.toLowerCase().includes(b.toLowerCase()),f=W||x.tenantType!=="Personal";return g&&f}).map(x=>x.tenantId);o(v)}else{const v=s.filter(x=>{const g=x.name.toLowerCase().includes(b.toLowerCase())||x.slug.toLowerCase().includes(b.toLowerCase()),f=W||x.type!=="Personal";return g&&f}).map(x=>x.id);o(v)}},[D,t,s,b,W]),be=n.useCallback(()=>{o([])},[]),_=n.useCallback(async(v,x)=>{if(!(!v||c.length===0))try{const g={tenantIds:c,accessLevel:j,accessMode:h,mergeMode:O};h==="custom"&&(g.moduleIds=y.filter(f=>f.isAssigned).map(f=>f.id),g.sectionIds=y.flatMap(f=>f.sections.filter(C=>C.isAssigned).map(C=>C.id))),await M.adminApi.applications.bulkAssignTenants(v,g),u(!1),o([]),a("FullAccess"),m("full"),N(""),B(!1),Z("merge"),G(!1),await q(v),x&&x()}catch(g){throw console.error("Failed to update tenant assignments:",g),g}},[c,j,h,O,y,q]),ve=n.useCallback(async(v,x)=>{if(!(!v||c.length===0))try{const g={tenantIds:c,accessLevel:j,accessMode:h};h==="custom"&&(g.moduleIds=y.filter(f=>f.isAssigned).map(f=>f.id),g.sectionIds=y.flatMap(f=>f.sections.filter(C=>C.isAssigned).map(C=>C.id))),await M.adminApi.applications.bulkAssignTenants(v,g),u(!1),o([]),a("FullAccess"),m("full"),N(""),await q(v),x&&x()}catch(g){throw console.error("Failed to assign tenants:",g),g}},[c,j,h,y,q]),ge=n.useCallback(async(v,x)=>{if(!(!v||c.length===0)){if(O==="replace"&&h==="custom"){let g=0,f=0;for(const C of c)try{const F=await M.adminApi.tenants.getModules(C),I=await M.adminApi.tenants.getSections(C),ye=new Set(y.filter(E=>E.isAssigned).map(E=>E.id)),je=new Set(y.flatMap(E=>E.sections.filter(K=>K.isAssigned).map(K=>K.id)));g+=F.filter(E=>!ye.has(E.moduleId)).length,f+=I.filter(E=>!je.has(E.sectionId)).length}catch{}if(g>0||f>0){J({modules:g,sections:f}),G(!0);return}}await _(v,x)}},[c,O,h,y,_]),he=n.useCallback(async(v,x,g)=>{if(v)try{await M.adminApi.applications.removeFromTenant(v,x),await q(v),g&&g()}catch(f){throw console.error("Failed to remove tenant:",f),f}},[q]),fe=n.useCallback(async(v,x,g,f)=>{if(v)try{await M.adminApi.applications.updateTenantAccessLevel(v,x,g),await q(v),f&&f()}catch(C){throw console.error("Failed to update access level:",C),C}},[q]);return{assignedTenants:t,availableTenants:s,showAssignModal:d,selectedTenantIds:c,selectedAccessLevel:j,tenantSearch:b,showCustomizeDrawer:i,customizingTenant:R,bulkAccessMode:h,bulkModules:y,bulkExpandedModules:T,loadingBulkModules:L,isUpdateMode:D,updateMergeMode:O,showConfirmRemovalDialog:ee,pendingRemovals:te,includePersonalTenants:W,isInDefaultPersonalTemplate:ae,setAssignedTenants:r,setAvailableTenants:l,setShowAssignModal:u,setSelectedTenantIds:o,setSelectedAccessLevel:a,setTenantSearch:N,setShowCustomizeDrawer:A,setCustomizingTenant:k,setBulkAccessMode:m,setBulkModules:P,setBulkExpandedModules:p,setIsUpdateMode:B,setUpdateMergeMode:Z,setShowConfirmRemovalDialog:G,setPendingRemovals:J,setIncludePersonalTenants:se,loadPublicationData:q,loadBulkModules:re,toggleBulkModuleExpand:ne,toggleBulkModule:le,toggleBulkSection:oe,getBulkModuleCheckState:ce,getBulkStats:de,selectAllBulkModules:ue,clearBulkModules:pe,toggleTenantSelection:me,selectAllFilteredTenants:xe,clearTenantSelection:be,handleAssignTenants:ve,handleUpdateTenants:ge,executeUpdateTenants:_,handleRemoveTenant:he,handleUpdateAccessLevel:fe}}function qe({formData:t,setFormData:r,application:s,saving:l,onSubmit:d}){const{t:u}=z.useTranslation("admin");return e.jsxs("form",{onSubmit:d,className:"space-y-6",children:[e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-[var(--text-secondary)] mb-2",children:u("applicationDetail.fields.code")}),e.jsx("input",{type:"text",value:s.code,disabled:!0,className:"w-full px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] border border-[var(--border-color)] text-[var(--text-muted)] cursor-not-allowed"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-[var(--text-secondary)] mb-2",children:u("applicationDetail.fields.label")}),e.jsx("input",{type:"text",value:t.label,onChange:c=>r(o=>({...o,label:c.target.value})),className:"w-full px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-primary)] border border-[var(--border-color)] text-[var(--text-primary)] focus:ring-2 focus:ring-[var(--color-accent-600)] focus:border-transparent",required:!0})]}),e.jsxs("div",{className:"md:col-span-2",children:[e.jsx("label",{className:"block text-sm font-medium text-[var(--text-secondary)] mb-2",children:u("applicationDetail.fields.description")}),e.jsx("textarea",{value:t.description,onChange:c=>r(o=>({...o,description:c.target.value})),rows:3,className:"w-full px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-primary)] border border-[var(--border-color)] text-[var(--text-primary)] focus:ring-2 focus:ring-[var(--color-accent-600)] focus:border-transparent"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-[var(--text-secondary)] mb-2",children:u("applicationDetail.fields.icon")}),e.jsx("input",{type:"text",value:t.icon,onChange:c=>r(o=>({...o,icon:c.target.value})),placeholder:u("applicationDetail.fields.icon"),className:"w-full px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-primary)] border border-[var(--border-color)] text-[var(--text-primary)] focus:ring-2 focus:ring-[var(--color-accent-600)] focus:border-transparent"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-[var(--text-secondary)] mb-2",children:u("applicationDetail.fields.route")}),e.jsx("input",{type:"text",value:t.route,onChange:c=>r(o=>({...o,route:c.target.value})),className:"w-full px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-primary)] border border-[var(--border-color)] text-[var(--text-primary)] focus:ring-2 focus:ring-[var(--color-accent-600)] focus:border-transparent"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-[var(--text-secondary)] mb-2",children:u("applicationDetail.fields.displayOrder")}),e.jsx("input",{type:"number",value:t.displayOrder,onChange:c=>r(o=>({...o,displayOrder:parseInt(c.target.value)||0})),className:"w-full px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-primary)] border border-[var(--border-color)] text-[var(--text-primary)] focus:ring-2 focus:ring-[var(--color-accent-600)] focus:border-transparent"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-[var(--text-secondary)] mb-2",children:u("applicationDetail.fields.zone","Zone")}),e.jsx("input",{type:"text",value:s.zone||"",disabled:!0,className:"w-full px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] border border-[var(--border-color)] text-[var(--text-muted)] cursor-not-allowed"})]})]}),e.jsx("div",{className:"flex justify-end",children:e.jsxs("button",{type:"submit",disabled:l,className:"flex items-center gap-2 px-6 py-2 rounded-[var(--radius-button)] font-medium bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] disabled:opacity-50",children:[l?e.jsx(w.Loader2,{className:"w-4 h-4 animate-spin"}):e.jsx(w.Save,{className:"w-4 h-4"}),u("applicationDetail.actions.save")]})})]})}function Fe({id:t,disabled:r,children:s}){const{attributes:l,listeners:d,setNodeRef:u,transform:c,transition:o,isDragging:j}=$.useSortable({id:t,disabled:r}),a={transform:we.CSS.Transform.toString(c),transition:o,opacity:j?.5:1,zIndex:j?1:0},b=r?null:e.jsx("button",{type:"button",className:"p-1.5 rounded hover:bg-[var(--bg-hover)] cursor-grab active:cursor-grabbing text-[var(--text-muted)] hover:text-[var(--text-secondary)] transition-colors",...l,...d,children:e.jsx(w.GripVertical,{className:"w-4 h-4"})});return e.jsx("div",{ref:u,style:a,children:s(b)})}function Y({items:t,onReorder:r,renderItem:s,disabled:l=!1}){const[,d]=n.useState(null),u=U.useSensors(U.useSensor(U.PointerSensor,{activationConstraint:{distance:8}}),U.useSensor(U.KeyboardSensor,{coordinateGetter:$.sortableKeyboardCoordinates})),c=o=>{const{active:j,over:a}=o;if(d(null),a&&j.id!==a.id){const b=t.findIndex(A=>A.id===j.id),N=t.findIndex(A=>A.id===a.id),i=$.arrayMove(t,b,N);r(i)}};return e.jsx(U.DndContext,{sensors:u,collisionDetection:U.closestCenter,onDragStart:o=>d(o.active.id),onDragEnd:c,children:e.jsx($.SortableContext,{items:t.map(o=>o.id),strategy:$.verticalListSortingStrategy,disabled:l,children:e.jsx("div",{className:"space-y-2",children:t.map(o=>e.jsx(Fe,{id:o.id,disabled:l,children:j=>s(o,j)},o.id))})})})}const Ee=(t,r,s,l,d,u)=>r.has(t)?e.jsx("div",{className:"flex items-center justify-center py-4",children:e.jsx(w.Loader2,{className:"w-5 h-5 animate-spin text-[var(--text-muted)]"})}):s.get(t)?.length===0?e.jsx("p",{className:"text-sm text-[var(--text-muted)] py-2",children:u("applicationDetail.modules.noSections","No sections")}):s.get(t)?e.jsx(Y,{items:s.get(t).map(c=>({...c,id:c.id})),onReorder:c=>l(t,c),disabled:d,renderItem:(c,o)=>e.jsxs("div",{className:"flex items-center gap-2 p-2 rounded bg-[var(--bg-secondary)] border border-[var(--border-color)]",children:[o,e.jsx("div",{className:"p-1 rounded bg-[var(--bg-tertiary)]",children:H(c.icon,"w-3 h-3")||e.jsx(w.Layers,{className:"w-3 h-3 text-[var(--text-muted)]"})}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-sm font-medium text-[var(--text-primary)]",children:c.label}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:c.code})]}),e.jsx("span",{className:`px-2 py-0.5 text-xs rounded-full ${c.isActive?"bg-[var(--success-bg)] text-[var(--success-text)]":"bg-[var(--error-bg)] text-[var(--error-text)]"}`,children:c.isActive?u("common:active"):u("common:inactive")})]})}):null;function Ie({application:t,expandedModules:r,moduleSections:s,loadingSections:l,reordering:d,editingModule:u,moduleFormData:c,showModuleForm:o,saving:j,onToggleExpand:a,onStartEdit:b,onSaveModule:N,onCancelEdit:i,onModulesReorder:A,onSectionsReorder:R,setModuleFormData:k}){const{t:h}=z.useTranslation("admin");return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("h3",{className:"text-lg font-semibold text-[var(--text-primary)]",children:[h("applicationDetail.modules.title")," (",t.modules.length,")"]}),o&&u&&e.jsxs("div",{className:"p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)]",children:[e.jsx("h4",{className:"text-md font-semibold text-[var(--text-primary)] mb-4",children:h("applicationDetail.modules.edit")}),e.jsxs("form",{onSubmit:N,className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-[var(--text-secondary)] mb-1",children:h("applicationDetail.fields.code")}),e.jsx("input",{type:"text",value:c.code,disabled:!0,className:"w-full px-3 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] border border-[var(--border-color)] text-[var(--text-muted)] cursor-not-allowed"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-[var(--text-secondary)] mb-1",children:h("applicationDetail.fields.label")}),e.jsx("input",{type:"text",value:c.label,onChange:m=>k(y=>({...y,label:m.target.value})),className:"w-full px-3 py-2 rounded-[var(--radius-input)] bg-[var(--bg-primary)] border border-[var(--border-color)] text-[var(--text-primary)]",required:!0})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-[var(--text-secondary)] mb-1",children:h("applicationDetail.fields.icon")}),e.jsx("input",{type:"text",value:c.icon,onChange:m=>k(y=>({...y,icon:m.target.value})),placeholder:"Users",className:"w-full px-3 py-2 rounded-[var(--radius-input)] bg-[var(--bg-primary)] border border-[var(--border-color)] text-[var(--text-primary)]"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-[var(--text-secondary)] mb-1",children:h("applicationDetail.fields.route")}),e.jsx("input",{type:"text",value:c.route,onChange:m=>k(y=>({...y,route:m.target.value})),className:"w-full px-3 py-2 rounded-[var(--radius-input)] bg-[var(--bg-primary)] border border-[var(--border-color)] text-[var(--text-primary)]"})]}),e.jsxs("div",{className:"md:col-span-2",children:[e.jsx("label",{className:"block text-sm font-medium text-[var(--text-secondary)] mb-1",children:h("applicationDetail.fields.description")}),e.jsx("textarea",{value:c.description,onChange:m=>k(y=>({...y,description:m.target.value})),rows:2,className:"w-full px-3 py-2 rounded-[var(--radius-input)] bg-[var(--bg-primary)] border border-[var(--border-color)] text-[var(--text-primary)]"})]})]}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",onClick:i,className:"px-4 py-2 rounded-[var(--radius-button)] font-medium text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]",children:h("common:cancel")}),e.jsxs("button",{type:"submit",disabled:j,className:"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] disabled:opacity-50",children:[j?e.jsx(w.Loader2,{className:"w-4 h-4 animate-spin"}):e.jsx(w.Save,{className:"w-4 h-4"}),h("common:save")]})]})]})]}),t.modules.length===0?e.jsx("p",{className:"text-center py-8 text-[var(--text-muted)]",children:h("applicationDetail.modules.empty")}):e.jsx(Y,{items:t.modules.map(m=>({...m,id:m.id})),onReorder:A,disabled:d,renderItem:(m,y)=>e.jsxs("div",{className:"p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--item-color-border)] hover:border-[var(--color-accent-600)] transition-colors",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[y,e.jsx("div",{className:"p-2 rounded-[var(--radius-button)] bg-[var(--bg-tertiary)]",children:H(m.icon,"w-4 h-4")||e.jsx(w.Layers,{className:"w-4 h-4 text-[var(--text-muted)]"})}),e.jsx("button",{onClick:()=>a(m.id),className:"p-1 rounded hover:bg-[var(--bg-hover)]","aria-expanded":r.has(m.id),"aria-label":h("applicationDetail.modules.toggleExpand","Toggle sections"),children:r.has(m.id)?e.jsx(w.ChevronDown,{className:"w-4 h-4 text-[var(--text-muted)]"}):e.jsx(w.ChevronRight,{className:"w-4 h-4 text-[var(--text-muted)]"})}),e.jsxs("div",{children:[e.jsx("p",{className:"font-medium text-[var(--text-primary)]",children:m.label}),e.jsx("p",{className:"text-sm text-[var(--text-muted)]",children:m.code})]}),e.jsx("span",{className:`ml-2 px-2 py-0.5 text-xs font-medium rounded-full ${m.isActive?"bg-[var(--success-bg)] text-[var(--success-text)]":"bg-[var(--error-bg)] text-[var(--error-text)]"}`,children:m.isActive?h("common:active"):h("common:inactive")})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("span",{className:"text-sm text-[var(--text-muted)]",children:[m.sectionsCount," ",h("applicationDetail.modules.sections","sections")]}),e.jsx("button",{onClick:()=>b(m),className:"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] text-[var(--text-secondary)]","aria-label":h("applicationDetail.modules.edit"),children:e.jsx(w.Edit,{className:"w-4 h-4"})})]})]}),r.has(m.id)&&e.jsxs("div",{className:"mt-3 pl-10 pt-3 border-t border-[var(--border-color)]",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 text-sm mb-4",children:[e.jsxs("div",{children:[e.jsxs("span",{className:"text-[var(--text-muted)]",children:[h("applicationDetail.fields.description"),":"]}),e.jsx("p",{className:"text-[var(--text-primary)]",children:m.description||"-"})]}),e.jsxs("div",{children:[e.jsxs("span",{className:"text-[var(--text-muted)]",children:[h("applicationDetail.fields.route"),":"]}),e.jsx("p",{className:"text-[var(--text-primary)] font-mono",children:m.route||"-"})]})]}),e.jsxs("div",{className:"mt-4",children:[e.jsxs("h5",{className:"text-sm font-medium text-[var(--text-secondary)] mb-2",children:[h("applicationDetail.modules.sections","Sections")," (",m.sectionsCount,")"]}),Ee(m.id,l,s,R,d,h)]})]})]})})]})}function Oe({application:t,permissions:r,permissionsWithRoles:s}){const{t:l}=z.useTranslation("admin");return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("h3",{className:"text-lg font-semibold text-[var(--text-primary)]",children:[l("applicationDetail.permissions.title")," (",r.length,")"]}),e.jsx("p",{className:"text-sm text-[var(--text-muted)]",children:l("applicationDetail.permissions.description",{path:`${t.code}.*`})}),r.length===0?e.jsx("p",{className:"text-center py-8 text-[var(--text-muted)]",children:l("applicationDetail.permissions.empty")}):e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[var(--border-color)]",children:[e.jsx("th",{className:"text-left py-3 px-4 text-sm font-medium text-[var(--text-secondary)]",children:l("applicationDetail.permissions.path")}),e.jsx("th",{className:"text-left py-3 px-4 text-sm font-medium text-[var(--text-secondary)]",children:l("applicationDetail.permissions.action")}),e.jsx("th",{className:"text-left py-3 px-4 text-sm font-medium text-[var(--text-secondary)]",children:l("applicationDetail.permissions.type")}),e.jsx("th",{className:"text-left py-3 px-4 text-sm font-medium text-[var(--text-secondary)]",children:l("applicationDetail.permissions.roles")})]})}),e.jsx("tbody",{children:s.map(({permission:d,roles:u})=>e.jsxs("tr",{className:"border-b border-[var(--border-color)] hover:bg-[var(--bg-hover)]",children:[e.jsx("td",{className:"py-3 px-4 font-mono text-sm text-[var(--text-primary)]",children:d.path}),e.jsx("td",{className:"py-3 px-4",children:d.action?e.jsx("span",{className:"px-2 py-1 text-xs font-medium rounded-full bg-[var(--accent-bg)] text-[var(--accent-text)]",children:d.action}):"-"}),e.jsx("td",{className:"py-3 px-4",children:d.isWildcard?e.jsx("span",{className:"px-2 py-1 text-xs font-medium rounded-full bg-[var(--warning-bg)] text-[var(--warning-text)]",children:l("applicationDetail.permissions.wildcard","Wildcard")}):e.jsx("span",{className:"px-2 py-1 text-xs font-medium rounded-full bg-[var(--bg-tertiary)] text-[var(--text-muted)]",children:l("applicationDetail.permissions.specific","Specific")})}),e.jsx("td",{className:"py-3 px-4",children:e.jsxs("div",{className:"flex flex-wrap gap-1",children:[u.length===0?e.jsx("span",{className:"text-[var(--text-muted)] text-sm",children:"-"}):u.slice(0,3).map(c=>e.jsx("span",{className:"px-2 py-0.5 text-xs font-medium rounded-full bg-[var(--color-accent-100)] text-[var(--color-accent-700)]",children:c.name},c.id)),u.length>3&&e.jsxs("span",{className:"px-2 py-0.5 text-xs font-medium rounded-full bg-[var(--bg-tertiary)] text-[var(--text-muted)]",children:["+",u.length-3]})]})})]},d.id))})]})})]})}function Ue({rolesWithAppAccess:t,onNavigateToRole:r}){const{t:s}=z.useTranslation("admin");return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("h3",{className:"text-lg font-semibold text-[var(--text-primary)]",children:[s("applicationDetail.roles.title")," (",t.length,")"]}),e.jsx("p",{className:"text-sm text-[var(--text-muted)]",children:s("applicationDetail.roles.description")}),t.length===0?e.jsx("p",{className:"text-center py-8 text-[var(--text-muted)]",children:s("applicationDetail.roles.empty")}):e.jsx("div",{className:"space-y-3",children:t.map(({role:l,permissions:d})=>e.jsxs("div",{className:"p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--item-color-border)] hover:border-[var(--color-accent-600)] transition-colors",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"p-2 rounded-[var(--radius-button)] bg-[var(--color-accent-100)]",children:e.jsx(w.Shield,{className:"w-5 h-5 text-[var(--color-accent-600)]"})}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("p",{className:"font-medium text-[var(--text-primary)]",children:l.name}),l.isSystem&&e.jsx("span",{className:"px-2 py-0.5 text-xs font-medium rounded-full bg-[var(--warning-bg)] text-[var(--warning-text)]",children:s("applicationDetail.roles.system","System")})]}),e.jsxs("p",{className:"text-sm text-[var(--text-muted)]",children:[l.usersCount," ",s("applicationDetail.roles.users")," • ",d.length," ",s("applicationDetail.roles.permissions")]})]})]}),e.jsx("div",{className:"flex items-center gap-2",children:e.jsxs("button",{onClick:()=>r(l.id),className:"flex items-center gap-1 px-3 py-1.5 rounded-[var(--radius-button)] text-sm font-medium text-[var(--color-accent-600)] hover:bg-[var(--color-accent-100)]",children:[e.jsx(w.Eye,{className:"w-4 h-4"}),s("applicationDetail.roles.viewRole")]})})]}),e.jsxs("div",{className:"mt-3 flex flex-wrap gap-1",children:[d.slice(0,5).map(u=>e.jsxs("span",{className:"px-2 py-0.5 text-xs font-mono rounded bg-[var(--bg-tertiary)] text-[var(--text-muted)]",children:[u.path.split(".").pop(),u.isWildcard&&".*"]},u.id)),d.length>5&&e.jsxs("span",{className:"px-2 py-0.5 text-xs rounded bg-[var(--bg-tertiary)] text-[var(--text-muted)]",children:["+",d.length-5," ",s("applicationDetail.roles.more","more")]})]})]},l.id))})]})}const ze=t=>{switch(t){case"FullAccess":return"bg-green-500";case"RequestAccess":return"bg-amber-500";case"Disabled":return"bg-gray-400";default:return"bg-gray-400"}},$e=t=>{switch(t){case"FullAccess":return"fullAccess";case"RequestAccess":return"requestAccess";case"Disabled":return"disabled";default:return"disabled"}},We=()=>{const{getIconForType:t}=V.useTenantTypeSettings();return r=>{const s=t(r),l=V.getLucideIcon(s.icon),d=V.getColorClasses(s.color);return{Icon:l,bgClass:d.bg,colorClass:d.text}}},Ge=({assignedTenants:t})=>{const{t:r}=z.useTranslation("admin"),s=We();return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsxs("h3",{className:"text-lg font-semibold text-[var(--text-primary)]",children:[r("applicationDetail.publication.title","Tenant Publication")," (",t.length,")"]}),e.jsx("p",{className:"text-sm text-[var(--text-muted)]",children:r("applicationDetail.publication.description","Manage which tenants have access to this application")})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-3 p-4 rounded-[var(--radius-card)] bg-[var(--bg-tertiary)] border border-[var(--border-color)]",children:[e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("div",{className:"w-3 h-3 mt-1 rounded-full bg-green-500 flex-shrink-0"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-[var(--text-primary)]",children:r("applicationDetail.publication.accessLevels.fullAccess","Full Access")}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:r("applicationDetail.publication.accessLevels.fullAccessDesc","Users can use all features")})]})]}),e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("div",{className:"w-3 h-3 mt-1 rounded-full bg-amber-500 flex-shrink-0"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-[var(--text-primary)]",children:r("applicationDetail.publication.accessLevels.requestAccess","Request Access")}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:r("applicationDetail.publication.accessLevels.requestAccessDesc","Requires access request")})]})]}),e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("div",{className:"w-3 h-3 mt-1 rounded-full bg-gray-400 flex-shrink-0"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-[var(--text-primary)]",children:r("applicationDetail.publication.accessLevels.disabled","Disabled")}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:r("applicationDetail.publication.accessLevels.disabledDesc","Not visible for tenant")})]})]})]}),t.length===0?e.jsxs("div",{className:"text-center py-12",children:[e.jsx(w.Globe,{className:"w-12 h-12 mx-auto text-[var(--text-muted)] mb-4"}),e.jsx("p",{className:"text-[var(--text-muted)]",children:r("applicationDetail.publication.empty","No tenants have access to this application yet")})]}):e.jsx("div",{className:"space-y-3",children:t.map(l=>{const{Icon:d,bgClass:u,colorClass:c}=s(l.tenantType),o=l.tenantStatus==="Active"?"bg-[var(--success-bg)] text-[var(--success-text)]":"bg-[var(--warning-bg)] text-[var(--warning-text)]";return e.jsxs("div",{className:"p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--item-color-border)] hover:border-[var(--color-accent-600)] transition-colors",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:`p-2 rounded-[var(--radius-button)] ${u}`,children:e.jsx(d,{className:`w-5 h-5 ${c}`})}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("p",{className:"font-medium text-[var(--text-primary)]",children:l.tenantName}),e.jsx("span",{className:`px-2 py-0.5 text-xs font-medium rounded-full ${o}`,children:l.tenantStatus})]}),e.jsxs("p",{className:"text-sm text-[var(--text-muted)]",children:[l.tenantSlug," • ",l.tenantType]})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:`w-2.5 h-2.5 rounded-full ${ze(l.accessLevel)}`}),e.jsx("span",{className:"px-3 py-1.5 rounded-[var(--radius-input)] bg-[var(--bg-secondary)] border border-[var(--border-color)] text-sm text-[var(--text-primary)]",children:r(`applicationDetail.publication.accessLevels.${$e(l.accessLevel)}`,l.accessLevel)})]})]}),e.jsxs("div",{className:"mt-2 text-xs text-[var(--text-muted)]",children:[r("applicationDetail.publication.assignedAt","Assigned"),": ",new Date(l.assignedAt).toLocaleDateString(),l.assignedBy&&` ${r("applicationDetail.publication.by","by")} ${l.assignedBy}`]})]},l.tenantId)})})]})},_e=["info","modules","permissions","roles","publication","requests"];function Ke(){const{id:t}=Q.useParams(),r=Q.useNavigate(),{t:s}=z.useTranslation("admin"),{hasPermission:l}=M.useAuth(),{currentTenant:d,isGlobalView:u}=M.useTenant(),c=l("administration.applications.execute"),{activeTab:o,setActiveTab:j}=Ne.useTabNavigation("info",_e),a=De(),b=Me(),N=Ce(),i=Be(),A=X.useAccessRequests("application",t),R=n.useMemo(()=>u||!d?i.availableTenants:i.availableTenants.filter(p=>p.slug===d.slug),[i.availableTenants,u,d]),k=n.useMemo(()=>u||!d?i.assignedTenants:i.assignedTenants.filter(p=>p.tenantSlug===d.slug),[i.assignedTenants,u,d]);n.useEffect(()=>{t&&a.loadApplication(t)},[t,a]),n.useEffect(()=>{a.application&&((o==="permissions"||o==="roles")&&N.permissions.length===0&&N.loadPermissionsData(a.application),o==="publication"&&i.assignedTenants.length===0&&i.loadPublicationData(t),o==="requests"&&A.loadRequests())},[o,t,a.application,N,i,A]);const h=[{id:"info",label:s("applicationDetail.tabs.info"),icon:w.Settings},{id:"modules",label:s("applicationDetail.tabs.modules"),icon:w.Layers},{id:"permissions",label:s("applicationDetail.tabs.permissions"),icon:w.Shield},{id:"roles",label:s("applicationDetail.tabs.roles"),icon:w.Users},{id:"publication",label:s("applicationDetail.tabs.publication"),icon:w.Globe},{id:"requests",label:s("applicationDetail.tabs.requests"),icon:w.Inbox}];if(a.loading)return e.jsx("div",{className:"flex items-center justify-center h-64",children:e.jsx(w.Loader2,{className:"w-8 h-8 animate-spin text-[var(--color-accent-500)]"})});if(a.error||!a.application)return e.jsxs("div",{className:"text-center py-12",children:[e.jsx(w.AlertCircle,{className:"w-12 h-12 text-[var(--error-text)] mx-auto mb-4"}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:a.error||s("applicationDetail.notFound")}),e.jsx("button",{onClick:()=>r("/administration/applications"),className:"mt-4 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)]",children:s("applicationDetail.backToList")})]});const m=N.permissions.length>0||o==="permissions"||o==="roles",y=i.assignedTenants.length>0||o==="publication",P=[{label:s("applicationDetail.stats.modules"),value:a.application.modules?.length||0,color:"blue"},{label:s("applicationDetail.stats.permissions"),value:m?N.permissions.length:"—",color:"green"},{label:s("applicationDetail.stats.rolesWithAccess"),value:m?N.rolesWithAppAccess.length:"—",color:"purple"},{label:s("applicationDetail.stats.assignedTenants"),value:y?k.length:"—",color:"yellow"},{label:s("applicationDetail.stats.status"),value:a.application.isActive?s("common:active"):s("common:inactive"),color:a.application.isActive?"green":"neutral"}],T={blue:"bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)]",green:"bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]",yellow:"bg-[var(--warning-bg)] text-[var(--warning-text)] border-[var(--warning-border)]",red:"bg-[var(--error-bg)] text-[var(--error-text)] border-[var(--error-border)]",purple:"bg-[var(--accent-bg)] text-[var(--accent-text)] border-[var(--color-accent-300)]",neutral:"bg-[var(--bg-secondary)] text-[var(--text-primary)] border-[var(--border-color)]"};return e.jsxs("div",{className:"space-y-6",children:[e.jsx(M.Breadcrumb,{items:[{label:s("breadcrumb.admin",{ns:"navigation"}),href:"/administration"},{label:s("applications.title"),href:"/administration/applications"},{label:a.application.label}]}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("button",{onClick:()=>r("/administration/applications"),className:"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors","aria-label":s("common:back"),children:e.jsx(w.ArrowLeft,{className:"w-5 h-5 text-[var(--text-secondary)]"})}),e.jsxs("div",{className:"flex items-center gap-3",children:[H(a.application.icon,"w-5 h-5"),e.jsxs("div",{className:"flex-1",children:[e.jsx("h1",{className:"text-xl sm:text-2xl font-bold text-[var(--text-primary)]",children:a.application.label}),a.application.description&&e.jsx("p",{className:"text-sm sm:text-base text-[var(--text-secondary)]",children:a.application.description})]})]}),e.jsxs("div",{className:"flex items-center gap-2 ml-auto",children:[e.jsx("span",{className:`px-3 py-1 rounded-[var(--radius-badge)] text-sm font-medium ${a.application.isActive?"bg-[var(--success-bg)] text-[var(--success-text)] border border-[var(--success-border)]":"bg-[var(--bg-tertiary)] text-[var(--text-secondary)] border border-[var(--border-color)]"}`,children:a.application.isActive?s("common:active"):s("common:inactive")}),c&&e.jsxs("button",{onClick:()=>a.handleToggleStatus(t),disabled:a.saving,className:`inline-flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium transition-colors ${a.application.isActive?"bg-[var(--error-bg)] text-[var(--error-text)] border border-[var(--error-border)] hover:bg-[var(--error-border)]":"bg-[var(--success-bg)] text-[var(--success-text)] border border-[var(--success-border)] hover:bg-[var(--success-border)]"} disabled:opacity-50`,children:[a.saving&&e.jsx(w.Loader2,{className:"w-4 h-4 animate-spin"}),!a.saving&&a.application.isActive&&e.jsx(w.PowerOff,{className:"w-4 h-4"}),!a.saving&&!a.application.isActive&&e.jsx(w.Power,{className:"w-4 h-4"}),a.application.isActive?s("applicationDetail.deactivate"):s("applicationDetail.activate")]})]})]}),a.error&&e.jsxs("div",{className:"p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)] text-[var(--error-text)] flex items-center gap-2",children:[e.jsx(w.AlertTriangle,{className:"w-5 h-5 flex-shrink-0"}),a.error]}),a.success&&e.jsxs("div",{className:"p-4 rounded-[var(--radius-card)] bg-[var(--success-bg)] border border-[var(--success-border)] text-[var(--success-text)] flex items-center gap-2",children:[e.jsx(w.CheckCircle,{className:"w-5 h-5 flex-shrink-0"}),a.success]}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-3 lg:grid-cols-5 gap-4",children:P.map(p=>e.jsxs("div",{className:`rounded-[var(--radius-card)] p-4 text-center border ${T[p.color]}`,children:[e.jsx("div",{className:"text-2xl font-bold",children:p.value}),e.jsx("div",{className:"text-sm opacity-80",children:p.label})]},p.label))}),e.jsx("div",{className:"flex gap-1 p-1 overflow-x-auto bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)]",role:"tablist","aria-label":s("applicationDetail.tabs.label","Application tabs"),children:h.map(p=>{const L=p.icon,S=o===p.id;return e.jsxs("button",{role:"tab","aria-selected":S,"aria-controls":`tabpanel-${p.id}`,onClick:()=>j(p.id),className:`flex items-center gap-2 px-4 py-2 whitespace-nowrap rounded-[var(--radius-button)] font-medium transition-colors ${S?"bg-[var(--color-accent-600)] text-white":"text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]"}`,children:[e.jsx(L,{className:"w-4 h-4"}),p.label]},p.id)})}),e.jsxs("div",{className:"bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4 sm:p-6",role:"tabpanel",id:`tabpanel-${o}`,"aria-labelledby":o,children:[o==="info"&&e.jsx(qe,{formData:a.formData,setFormData:a.setFormData,application:a.application,saving:a.saving,onSubmit:()=>a.handleSaveInfo(t,a.formData)}),o==="modules"&&e.jsx(Ie,{application:a.application,expandedModules:b.expandedModules,moduleSections:b.moduleSections,loadingSections:b.loadingSections,reordering:b.reordering,editingModule:b.editingModule,moduleFormData:b.moduleFormData,showModuleForm:b.showModuleForm,saving:a.saving,onToggleExpand:p=>b.toggleModuleExpand(t,p),onStartEdit:b.startEditModule,onSaveModule:async()=>{await b.handleSaveModule(t,b.editingModule.id,b.moduleFormData),a.setSuccess(s("applicationDetail.success.moduleUpdated")),await a.loadApplication(t)},onCancelEdit:()=>{b.setShowModuleForm(!1),b.setEditingModule(null)},onModulesReorder:async p=>{await b.handleModulesReorder(t,p),await a.loadApplication(t)},onSectionsReorder:(p,L)=>b.handleSectionsReorder(t,p,L),setModuleFormData:p=>b.setModuleFormData(typeof p=="function"?p(b.moduleFormData):p)}),o==="permissions"&&e.jsx(Oe,{application:a.application,permissions:N.permissions,permissionsWithRoles:N.permissionsWithRoles}),o==="roles"&&e.jsx(Ue,{rolesWithAppAccess:N.rolesWithAppAccess,onNavigateToRole:p=>r(`/administration/permissions/roles/${p}`)}),o==="publication"&&e.jsx(Ge,{application:a.application,assignedTenants:k,availableTenants:R,showAssignModal:i.showAssignModal,selectedTenantIds:i.selectedTenantIds,selectedAccessLevel:i.selectedAccessLevel,tenantSearch:i.tenantSearch,showCustomizeDrawer:i.showCustomizeDrawer,customizingTenant:i.customizingTenant,bulkAccessMode:i.bulkAccessMode,bulkModules:i.bulkModules,bulkExpandedModules:i.bulkExpandedModules,loadingBulkModules:i.loadingBulkModules,isUpdateMode:i.isUpdateMode,updateMergeMode:i.updateMergeMode,showConfirmRemovalDialog:i.showConfirmRemovalDialog,pendingRemovals:i.pendingRemovals,saving:a.saving,includePersonalTenants:i.includePersonalTenants,isInDefaultPersonalTemplate:i.isInDefaultPersonalTemplate,onAddTenant:()=>{i.loadPublicationData(t),i.setShowAssignModal(!0)},onRemoveTenant:p=>i.handleRemoveTenant(t,p,()=>{a.setSuccess(s("applicationDetail.publication.success.removed"))}),onUpdateAccessLevel:(p,L)=>i.handleUpdateAccessLevel(t,p,L,()=>{a.setSuccess(s("applicationDetail.publication.success.updated"))}),onCustomizeTenant:p=>{i.setCustomizingTenant(p),i.setShowCustomizeDrawer(!0)},onCloseCustomizeDrawer:()=>{i.setShowCustomizeDrawer(!1),i.setCustomizingTenant(null),i.loadPublicationData(t)},onAssignTenants:()=>i.handleAssignTenants(t,()=>{a.setSuccess(s("applicationDetail.publication.success.assigned")),i.loadPublicationData(t)}),onUpdateTenants:()=>i.handleUpdateTenants(t,()=>{a.setSuccess(s("applicationDetail.publication.success.updated")),i.loadPublicationData(t)}),onExecuteUpdateTenants:()=>i.executeUpdateTenants(t,()=>{a.setSuccess(s("applicationDetail.publication.success.updated")),i.loadPublicationData(t)}),onCancelRemovalDialog:()=>{i.setShowConfirmRemovalDialog(!1),i.setUpdateMergeMode("merge")},setShowAssignModal:i.setShowAssignModal,setSelectedTenantIds:i.setSelectedTenantIds,setSelectedAccessLevel:i.setSelectedAccessLevel,setTenantSearch:i.setTenantSearch,setBulkAccessMode:i.setBulkAccessMode,setIsUpdateMode:i.setIsUpdateMode,setUpdateMergeMode:i.setUpdateMergeMode,onToggleTenantSelection:i.toggleTenantSelection,onSelectAllFilteredTenants:i.selectAllFilteredTenants,onClearTenantSelection:i.clearTenantSelection,setIncludePersonalTenants:i.setIncludePersonalTenants,onLoadBulkModules:()=>i.loadBulkModules(t),onToggleBulkModuleExpand:i.toggleBulkModuleExpand,onToggleBulkModule:i.toggleBulkModule,onToggleBulkSection:i.toggleBulkSection,onGetBulkModuleCheckState:i.getBulkModuleCheckState,onGetBulkStats:i.getBulkStats,onSelectAllBulkModules:i.selectAllBulkModules,onClearBulkModules:i.clearBulkModules,appId:t}),o==="requests"&&e.jsx(X.AccessRequestsListTab,{requests:A.requests,loading:A.loading,onReload:()=>A.loadRequests()})]})]})}exports.default=Ke;
2
- //# sourceMappingURL=ApplicationDetailPage-CWdz0TS4.js.map