@atlashub/smartstack 3.21.0 → 3.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js → AgentSkillsPage-BWQSCYl-.js} +2 -2
  2. package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js.map → AgentSkillsPage-BWQSCYl-.js.map} +1 -1
  3. package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js → AgentSkillsPage-IQcMnBaD.js} +2 -2
  4. package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js.map → AgentSkillsPage-IQcMnBaD.js.map} +1 -1
  5. package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js → AgentWorkloadPage-DqrjkvWL.js} +2 -2
  6. package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js.map → AgentWorkloadPage-DqrjkvWL.js.map} +1 -1
  7. package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js → AgentWorkloadPage-w-HiyFYP.js} +2 -2
  8. package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js.map → AgentWorkloadPage-w-HiyFYP.js.map} +1 -1
  9. package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js → ApiCatalogDetailPage-D3L8Yf4G.js} +3 -3
  10. package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js.map → ApiCatalogDetailPage-D3L8Yf4G.js.map} +1 -1
  11. package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js → ApiCatalogDetailPage-MPT3Kz6H.js} +2 -2
  12. package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js.map → ApiCatalogDetailPage-MPT3Kz6H.js.map} +1 -1
  13. package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js → ApiCatalogPage-D4Hg3uiS.js} +2 -2
  14. package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js.map → ApiCatalogPage-D4Hg3uiS.js.map} +1 -1
  15. package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js → ApiCatalogPage-DRg5Cz0r.js} +2 -2
  16. package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js.map → ApiCatalogPage-DRg5Cz0r.js.map} +1 -1
  17. package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js → ApplicationDetailPage-Caizuyn2.js} +2 -2
  18. package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js.map → ApplicationDetailPage-Caizuyn2.js.map} +1 -1
  19. package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js → ApplicationDetailPage-CuCW6aMB.js} +4 -4
  20. package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js.map → ApplicationDetailPage-CuCW6aMB.js.map} +1 -1
  21. package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js → ApplicationsDashboardPage-B2MW8-Kc.js} +2 -2
  22. package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js.map → ApplicationsDashboardPage-B2MW8-Kc.js.map} +1 -1
  23. package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js → ApplicationsDashboardPage-BDIjFIYZ.js} +3 -3
  24. package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js.map → ApplicationsDashboardPage-BDIjFIYZ.js.map} +1 -1
  25. package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js → ApplicationsGridPage-DV-FihKj.js} +2 -2
  26. package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js.map → ApplicationsGridPage-DV-FihKj.js.map} +1 -1
  27. package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js → ApplicationsGridPage-DXsTfXPI.js} +2 -2
  28. package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js.map → ApplicationsGridPage-DXsTfXPI.js.map} +1 -1
  29. package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js → ApplicationsListPage--CGkyBuJ.js} +2 -2
  30. package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js.map → ApplicationsListPage--CGkyBuJ.js.map} +1 -1
  31. package/dist/chunks/{ApplicationsListPage-C91v2rZt.js → ApplicationsListPage-JUX823bh.js} +2 -2
  32. package/dist/chunks/{ApplicationsListPage-C91v2rZt.js.map → ApplicationsListPage-JUX823bh.js.map} +1 -1
  33. package/dist/chunks/{ApplicationsPage-BCbgotIx.js → ApplicationsPage-6zgFye6w.js} +2 -2
  34. package/dist/chunks/{ApplicationsPage-BCbgotIx.js.map → ApplicationsPage-6zgFye6w.js.map} +1 -1
  35. package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js → ApplicationsPage-CQPuuiO6.js} +4 -4
  36. package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js.map → ApplicationsPage-CQPuuiO6.js.map} +1 -1
  37. package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js → AssignmentRulesPage-CFffeEbo.js} +2 -2
  38. package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js.map → AssignmentRulesPage-CFffeEbo.js.map} +1 -1
  39. package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js → AssignmentRulesPage-D78UeUId.js} +2 -2
  40. package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js.map → AssignmentRulesPage-D78UeUId.js.map} +1 -1
  41. package/dist/chunks/{AssignmentsPage-DmfBYQAD.js → AssignmentsPage-Cww2ifZF.js} +2 -2
  42. package/dist/chunks/{AssignmentsPage-DmfBYQAD.js.map → AssignmentsPage-Cww2ifZF.js.map} +1 -1
  43. package/dist/chunks/{AssignmentsPage-sRCCBmRc.js → AssignmentsPage-DE_QS2LO.js} +2 -2
  44. package/dist/chunks/{AssignmentsPage-sRCCBmRc.js.map → AssignmentsPage-DE_QS2LO.js.map} +1 -1
  45. package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js → AuthCallbackPage-CA2nO6DG.js} +2 -2
  46. package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js.map → AuthCallbackPage-CA2nO6DG.js.map} +1 -1
  47. package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js → AuthCallbackPage-CDUAoX-N.js} +2 -2
  48. package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js.map → AuthCallbackPage-CDUAoX-N.js.map} +1 -1
  49. package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js → ConfirmEmailPage-BqsILAYH.js} +2 -2
  50. package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js.map → ConfirmEmailPage-BqsILAYH.js.map} +1 -1
  51. package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js → ConfirmEmailPage-INeHCuMB.js} +2 -2
  52. package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js.map → ConfirmEmailPage-INeHCuMB.js.map} +1 -1
  53. package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js → CreateSupportTicketPage-BWeuV2aU.js} +2 -2
  54. package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js.map → CreateSupportTicketPage-BWeuV2aU.js.map} +1 -1
  55. package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js → CreateSupportTicketPage-OBwF4v7b.js} +2 -2
  56. package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js.map → CreateSupportTicketPage-OBwF4v7b.js.map} +1 -1
  57. package/dist/chunks/{DashboardPage-CUZ80NGV.js → DashboardPage-CKHqWrdS.js} +3 -3
  58. package/dist/chunks/{DashboardPage-CUZ80NGV.js.map → DashboardPage-CKHqWrdS.js.map} +1 -1
  59. package/dist/chunks/{DashboardPage-CaNOAstg.js → DashboardPage-COmc9b__.js} +3 -3
  60. package/dist/chunks/{DashboardPage-CaNOAstg.js.map → DashboardPage-COmc9b__.js.map} +1 -1
  61. package/dist/chunks/{DashboardPage-B48_rQFi.js → DashboardPage-CfKZHiSj.js} +2 -2
  62. package/dist/chunks/{DashboardPage-B48_rQFi.js.map → DashboardPage-CfKZHiSj.js.map} +1 -1
  63. package/dist/chunks/{DashboardPage-CUZV1J9t.js → DashboardPage-CwEZZ3jx.js} +2 -2
  64. package/dist/chunks/{DashboardPage-CUZV1J9t.js.map → DashboardPage-CwEZZ3jx.js.map} +1 -1
  65. package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js → EscalationConfigPage--7lgZ0kJ.js} +2 -2
  66. package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js.map → EscalationConfigPage--7lgZ0kJ.js.map} +1 -1
  67. package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js → EscalationConfigPage-DPyiBcqV.js} +2 -2
  68. package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js.map → EscalationConfigPage-DPyiBcqV.js.map} +1 -1
  69. package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js → ForceChangePasswordPage-BE-6umub.js} +2 -2
  70. package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js.map → ForceChangePasswordPage-BE-6umub.js.map} +1 -1
  71. package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js → ForceChangePasswordPage-CnsYoWmV.js} +2 -2
  72. package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js.map → ForceChangePasswordPage-CnsYoWmV.js.map} +1 -1
  73. package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js → ForgotPasswordPage-CSq4DnFF.js} +2 -2
  74. package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js.map → ForgotPasswordPage-CSq4DnFF.js.map} +1 -1
  75. package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js → ForgotPasswordPage-DZLVolAC.js} +2 -2
  76. package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js.map → ForgotPasswordPage-DZLVolAC.js.map} +1 -1
  77. package/dist/chunks/{GroupDetailPage-DFBvVO1S.js → GroupDetailPage-Bf9Wb_2j.js} +5 -5
  78. package/dist/chunks/{GroupDetailPage-DFBvVO1S.js.map → GroupDetailPage-Bf9Wb_2j.js.map} +1 -1
  79. package/dist/chunks/{GroupDetailPage-B2FkKrGG.js → GroupDetailPage-R-hf3rJ7.js} +2 -2
  80. package/dist/chunks/{GroupDetailPage-B2FkKrGG.js.map → GroupDetailPage-R-hf3rJ7.js.map} +1 -1
  81. package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js → MyAccessRequestsPage-BIisvWM6.js} +2 -2
  82. package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js.map → MyAccessRequestsPage-BIisvWM6.js.map} +1 -1
  83. package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js → MyAccessRequestsPage-BLSV7Tbx.js} +2 -2
  84. package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js.map → MyAccessRequestsPage-BLSV7Tbx.js.map} +1 -1
  85. package/dist/chunks/{MyTenantsPage-BEcYYdGR.js → MyTenantsPage-D-7k9CP1.js} +3 -3
  86. package/dist/chunks/{MyTenantsPage-BEcYYdGR.js.map → MyTenantsPage-D-7k9CP1.js.map} +1 -1
  87. package/dist/chunks/{MyTenantsPage-D9f85zjF.js → MyTenantsPage-DqGW6aDt.js} +2 -2
  88. package/dist/chunks/{MyTenantsPage-D9f85zjF.js.map → MyTenantsPage-DqGW6aDt.js.map} +1 -1
  89. package/dist/chunks/{MyTicketsPage-DJR8h6y1.js → MyTicketsPage--DgDsnZA.js} +2 -2
  90. package/dist/chunks/{MyTicketsPage-DJR8h6y1.js.map → MyTicketsPage--DgDsnZA.js.map} +1 -1
  91. package/dist/chunks/{MyTicketsPage-DiOUExKJ.js → MyTicketsPage-CqJ3Aqob.js} +2 -2
  92. package/dist/chunks/{MyTicketsPage-DiOUExKJ.js.map → MyTicketsPage-CqJ3Aqob.js.map} +1 -1
  93. package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js → NavigationAppsPage-Bebis_RT.js} +2 -2
  94. package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js.map → NavigationAppsPage-Bebis_RT.js.map} +1 -1
  95. package/dist/chunks/{NavigationAppsPage-If7tmCFY.js → NavigationAppsPage-THNPOAjv.js} +2 -2
  96. package/dist/chunks/{NavigationAppsPage-If7tmCFY.js.map → NavigationAppsPage-THNPOAjv.js.map} +1 -1
  97. package/dist/chunks/{NotificationsPage-C29Lln5o.js → NotificationsPage-CAbNW_Cn.js} +2 -2
  98. package/dist/chunks/{NotificationsPage-C29Lln5o.js.map → NotificationsPage-CAbNW_Cn.js.map} +1 -1
  99. package/dist/chunks/{NotificationsPage-BiaLRb0s.js → NotificationsPage-DxwizUhL.js} +2 -2
  100. package/dist/chunks/{NotificationsPage-BiaLRb0s.js.map → NotificationsPage-DxwizUhL.js.map} +1 -1
  101. package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js → OnboardingWizardPage-C6HlbJ3K.js} +2 -2
  102. package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js.map → OnboardingWizardPage-C6HlbJ3K.js.map} +1 -1
  103. package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js → OnboardingWizardPage-CyC2zONO.js} +2 -2
  104. package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js.map → OnboardingWizardPage-CyC2zONO.js.map} +1 -1
  105. package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js → PermissionDetailPage-BDHiNgky.js} +2 -2
  106. package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js.map → PermissionDetailPage-BDHiNgky.js.map} +1 -1
  107. package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js → PermissionDetailPage-C5K17ydY.js} +2 -2
  108. package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js.map → PermissionDetailPage-C5K17ydY.js.map} +1 -1
  109. package/dist/chunks/{PermissionsPage-l0PnY-EE.js → PermissionsPage-COI5LJPo.js} +2 -2
  110. package/dist/chunks/{PermissionsPage-l0PnY-EE.js.map → PermissionsPage-COI5LJPo.js.map} +1 -1
  111. package/dist/chunks/{PermissionsPage-DLy9U3P3.js → PermissionsPage-CkOwH2_d.js} +2 -2
  112. package/dist/chunks/{PermissionsPage-DLy9U3P3.js.map → PermissionsPage-CkOwH2_d.js.map} +1 -1
  113. package/dist/chunks/{PortalDashboardPage-DFBx38-x.js → PortalDashboardPage-CoEC4CmC.js} +2 -2
  114. package/dist/chunks/{PortalDashboardPage-DFBx38-x.js.map → PortalDashboardPage-CoEC4CmC.js.map} +1 -1
  115. package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js → PortalDashboardPage-DrYymEf-.js} +2 -2
  116. package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js.map → PortalDashboardPage-DrYymEf-.js.map} +1 -1
  117. package/dist/chunks/{PreferencesPage-BBu8yZQB.js → PreferencesPage-CJRaU3ba.js} +2 -2
  118. package/dist/chunks/{PreferencesPage-BBu8yZQB.js.map → PreferencesPage-CJRaU3ba.js.map} +1 -1
  119. package/dist/chunks/{PreferencesPage-B81MsNV1.js → PreferencesPage-Cqr9mAab.js} +2 -2
  120. package/dist/chunks/{PreferencesPage-B81MsNV1.js.map → PreferencesPage-Cqr9mAab.js.map} +1 -1
  121. package/dist/chunks/{ProfilePage-DDrl10zj.js → ProfilePage-BZVpg6-l.js} +2 -2
  122. package/dist/chunks/{ProfilePage-DDrl10zj.js.map → ProfilePage-BZVpg6-l.js.map} +1 -1
  123. package/dist/chunks/{ProfilePage-DPoXwdnc.js → ProfilePage-Cu_FITeL.js} +2 -2
  124. package/dist/chunks/{ProfilePage-DPoXwdnc.js.map → ProfilePage-Cu_FITeL.js.map} +1 -1
  125. package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js → ReferencesManagementPage-DUlVk9Ps.js} +3 -3
  126. package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js.map → ReferencesManagementPage-DUlVk9Ps.js.map} +1 -1
  127. package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js → ReferencesManagementPage-ZCuYtqd7.js} +2 -2
  128. package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js.map → ReferencesManagementPage-ZCuYtqd7.js.map} +1 -1
  129. package/dist/chunks/{RegisterPage-CiQib3-6.js → RegisterPage-C4xmVwh9.js} +2 -2
  130. package/dist/chunks/{RegisterPage-CiQib3-6.js.map → RegisterPage-C4xmVwh9.js.map} +1 -1
  131. package/dist/chunks/{RegisterPage-bXCcJD88.js → RegisterPage-DGyzoIHT.js} +2 -2
  132. package/dist/chunks/{RegisterPage-bXCcJD88.js.map → RegisterPage-DGyzoIHT.js.map} +1 -1
  133. package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js → ResetPasswordPage-DqDD6VPR.js} +2 -2
  134. package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js.map → ResetPasswordPage-DqDD6VPR.js.map} +1 -1
  135. package/dist/chunks/{ResetPasswordPage-CubPG3yv.js → ResetPasswordPage-Glu-aeqv.js} +2 -2
  136. package/dist/chunks/{ResetPasswordPage-CubPG3yv.js.map → ResetPasswordPage-Glu-aeqv.js.map} +1 -1
  137. package/dist/chunks/{ResolutionModal-Bg7XZmR1.js → ResolutionModal-CxjANAOP.js} +2 -2
  138. package/dist/chunks/{ResolutionModal-Bg7XZmR1.js.map → ResolutionModal-CxjANAOP.js.map} +1 -1
  139. package/dist/chunks/{ResolutionModal-DqRk_T0n.js → ResolutionModal-Duat18qV.js} +2 -2
  140. package/dist/chunks/{ResolutionModal-DqRk_T0n.js.map → ResolutionModal-Duat18qV.js.map} +1 -1
  141. package/dist/chunks/{RoleDetailPage-Blau6_4c.js → RoleDetailPage-BQffUSnt.js} +3 -3
  142. package/dist/chunks/{RoleDetailPage-Blau6_4c.js.map → RoleDetailPage-BQffUSnt.js.map} +1 -1
  143. package/dist/chunks/{RoleDetailPage-CiRVxxIP.js → RoleDetailPage-JTm5lD1_.js} +2 -2
  144. package/dist/chunks/{RoleDetailPage-CiRVxxIP.js.map → RoleDetailPage-JTm5lD1_.js.map} +1 -1
  145. package/dist/chunks/{RolesPage-Pm-RN3lP.js → RolesPage-B9rRzciI.js} +2 -2
  146. package/dist/chunks/{RolesPage-Pm-RN3lP.js.map → RolesPage-B9rRzciI.js.map} +1 -1
  147. package/dist/chunks/{RolesPage-Cb8joqdJ.js → RolesPage-BN8_zMOC.js} +2 -2
  148. package/dist/chunks/{RolesPage-Cb8joqdJ.js.map → RolesPage-BN8_zMOC.js.map} +1 -1
  149. package/dist/chunks/{SlaConfigPage-B86McKM6.js → SlaConfigPage-B7kZNig4.js} +2 -2
  150. package/dist/chunks/{SlaConfigPage-B86McKM6.js.map → SlaConfigPage-B7kZNig4.js.map} +1 -1
  151. package/dist/chunks/{SlaConfigPage-BY7gvYU6.js → SlaConfigPage-okvZfA_K.js} +2 -2
  152. package/dist/chunks/{SlaConfigPage-BY7gvYU6.js.map → SlaConfigPage-okvZfA_K.js.map} +1 -1
  153. package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js → SupportPermissionsPage-DGAPqJbl.js} +2 -2
  154. package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js.map → SupportPermissionsPage-DGAPqJbl.js.map} +1 -1
  155. package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js → SupportPermissionsPage-Dg_wLOme.js} +2 -2
  156. package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js.map → SupportPermissionsPage-Dg_wLOme.js.map} +1 -1
  157. package/dist/chunks/{TemplatesPage-BDguJ401.js → TemplatesPage-DT9fhlAU.js} +2 -2
  158. package/dist/chunks/{TemplatesPage-BDguJ401.js.map → TemplatesPage-DT9fhlAU.js.map} +1 -1
  159. package/dist/chunks/{TemplatesPage-DdnGgioU.js → TemplatesPage-DiEk538p.js} +2 -2
  160. package/dist/chunks/{TemplatesPage-DdnGgioU.js.map → TemplatesPage-DiEk538p.js.map} +1 -1
  161. package/dist/chunks/{TenantCard-ffwWsgFQ.js → TenantCard-BbSYk9_Z.js} +2 -2
  162. package/dist/chunks/{TenantCard-ffwWsgFQ.js.map → TenantCard-BbSYk9_Z.js.map} +1 -1
  163. package/dist/chunks/{TenantCard-CUjb6og9.js → TenantCard-CEkiKxcZ.js} +2 -2
  164. package/dist/chunks/{TenantCard-CUjb6og9.js.map → TenantCard-CEkiKxcZ.js.map} +1 -1
  165. package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js → TenantScopeSelector-BWfYxvEa.js} +2 -2
  166. package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js.map → TenantScopeSelector-BWfYxvEa.js.map} +1 -1
  167. package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js → TenantScopeSelector-D-BKgQPV.js} +2 -2
  168. package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js.map → TenantScopeSelector-D-BKgQPV.js.map} +1 -1
  169. package/dist/chunks/{TicketDetailPage-GOh9GX7E.js → TicketDetailPage-C1mNS9Up.js} +2 -2
  170. package/dist/chunks/{TicketDetailPage-GOh9GX7E.js.map → TicketDetailPage-C1mNS9Up.js.map} +1 -1
  171. package/dist/chunks/{TicketDetailPage-Du8WMyqf.js → TicketDetailPage-ieVDRh42.js} +2 -2
  172. package/dist/chunks/{TicketDetailPage-Du8WMyqf.js.map → TicketDetailPage-ieVDRh42.js.map} +1 -1
  173. package/dist/chunks/{TicketsPage-Bqd6moQy.js → TicketsPage-CnuWsnIW.js} +2 -2
  174. package/dist/chunks/{TicketsPage-Bqd6moQy.js.map → TicketsPage-CnuWsnIW.js.map} +1 -1
  175. package/dist/chunks/{TicketsPage-WdU4Bb7M.js → TicketsPage-jjyY15_D.js} +2 -2
  176. package/dist/chunks/{TicketsPage-WdU4Bb7M.js.map → TicketsPage-jjyY15_D.js.map} +1 -1
  177. package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js → UserCreateTicketPage-B8Tvf-ag.js} +2 -2
  178. package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js.map → UserCreateTicketPage-B8Tvf-ag.js.map} +1 -1
  179. package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js → UserCreateTicketPage-DnOsDlfO.js} +2 -2
  180. package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js.map → UserCreateTicketPage-DnOsDlfO.js.map} +1 -1
  181. package/dist/chunks/{UserDashboardPage-BP5WeXPS.js → UserDashboardPage-BrtkJ-NB.js} +2 -2
  182. package/dist/chunks/{UserDashboardPage-BP5WeXPS.js.map → UserDashboardPage-BrtkJ-NB.js.map} +1 -1
  183. package/dist/chunks/{UserDashboardPage-B53C8fUq.js → UserDashboardPage-KLB5CQP5.js} +2 -2
  184. package/dist/chunks/{UserDashboardPage-B53C8fUq.js.map → UserDashboardPage-KLB5CQP5.js.map} +1 -1
  185. package/dist/chunks/{UserDetailPage-B110bmGX.js → UserDetailPage-U7smBQoF.js} +5 -5
  186. package/dist/chunks/{UserDetailPage-B110bmGX.js.map → UserDetailPage-U7smBQoF.js.map} +1 -1
  187. package/dist/chunks/{UserDetailPage-CV2VCE46.js → UserDetailPage-_J6lcKAU.js} +2 -2
  188. package/dist/chunks/{UserDetailPage-CV2VCE46.js.map → UserDetailPage-_J6lcKAU.js.map} +1 -1
  189. package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js → UserTicketDetailPage-CWoYQgH-.js} +2 -2
  190. package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js.map → UserTicketDetailPage-CWoYQgH-.js.map} +1 -1
  191. package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js → UserTicketDetailPage-DkufSlvZ.js} +2 -2
  192. package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js.map → UserTicketDetailPage-DkufSlvZ.js.map} +1 -1
  193. package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js → UsersGroupsPage-C38s2-Rq.js} +3 -3
  194. package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js.map → UsersGroupsPage-C38s2-Rq.js.map} +1 -1
  195. package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js → UsersGroupsPage-Dq3rAteo.js} +2 -2
  196. package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js.map → UsersGroupsPage-Dq3rAteo.js.map} +1 -1
  197. package/dist/chunks/{UsersPage-Bg7033pp.js → UsersPage-B5C5KEUR.js} +2 -2
  198. package/dist/chunks/{UsersPage-Bg7033pp.js.map → UsersPage-B5C5KEUR.js.map} +1 -1
  199. package/dist/chunks/{UsersPage-TYAfwPY1.js → UsersPage-CXC9Hvq6.js} +2 -2
  200. package/dist/chunks/{UsersPage-TYAfwPY1.js.map → UsersPage-CXC9Hvq6.js.map} +1 -1
  201. package/dist/chunks/{accessRequestsApi-DZeDvzwv.js → accessRequestsApi-B-4TJ5_U.js} +2 -2
  202. package/dist/chunks/{accessRequestsApi-DZeDvzwv.js.map → accessRequestsApi-B-4TJ5_U.js.map} +1 -1
  203. package/dist/chunks/{accessRequestsApi-ZXFPCid2.js → accessRequestsApi-DZSfThpd.js} +2 -2
  204. package/dist/chunks/{accessRequestsApi-ZXFPCid2.js.map → accessRequestsApi-DZSfThpd.js.map} +1 -1
  205. package/dist/chunks/{aiApi-CsH8DXgs.js → aiApi-B20Teu2v.js} +2 -2
  206. package/dist/chunks/{aiApi-CsH8DXgs.js.map → aiApi-B20Teu2v.js.map} +1 -1
  207. package/dist/chunks/{aiApi-CVPzFTXa.js → aiApi-DMGz-RPM.js} +2 -2
  208. package/dist/chunks/{aiApi-CVPzFTXa.js.map → aiApi-DMGz-RPM.js.map} +1 -1
  209. package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js → applicationAnalyticsApi-Bwa75Fzd.js} +2 -2
  210. package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js.map → applicationAnalyticsApi-Bwa75Fzd.js.map} +1 -1
  211. package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js → applicationAnalyticsApi-CLBqRPfN.js} +2 -2
  212. package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js.map → applicationAnalyticsApi-CLBqRPfN.js.map} +1 -1
  213. package/dist/chunks/{groupsApi-BgCk2fsp.js → groupsApi-QzXI-5xu.js} +2 -2
  214. package/dist/chunks/{groupsApi-BgCk2fsp.js.map → groupsApi-QzXI-5xu.js.map} +1 -1
  215. package/dist/chunks/{groupsApi-BIbG665N.js → groupsApi-hB9kSWEd.js} +2 -2
  216. package/dist/chunks/{groupsApi-BIbG665N.js.map → groupsApi-hB9kSWEd.js.map} +1 -1
  217. package/dist/chunks/{index-Cb3LotuT.js → index--NGcBYUu.js} +3 -3
  218. package/dist/chunks/{index-Cb3LotuT.js.map → index--NGcBYUu.js.map} +1 -1
  219. package/dist/chunks/{index-C33zcyF4.js → index--aPwOFjF.js} +2 -2
  220. package/dist/chunks/{index-C33zcyF4.js.map → index--aPwOFjF.js.map} +1 -1
  221. package/dist/chunks/{index-sMr9qND_.js → index-0VrOtwP0.js} +2 -2
  222. package/dist/chunks/{index-sMr9qND_.js.map → index-0VrOtwP0.js.map} +1 -1
  223. package/dist/chunks/{index-DDKetfKq.js → index-37U271aw.js} +2 -2
  224. package/dist/chunks/{index-DDKetfKq.js.map → index-37U271aw.js.map} +1 -1
  225. package/dist/chunks/{index-B9fS7ir6.js → index-B7qZTuQ-.js} +2 -2
  226. package/dist/chunks/{index-B9fS7ir6.js.map → index-B7qZTuQ-.js.map} +1 -1
  227. package/dist/chunks/{index-CdjBY7L8.js → index-Bedzmqr-.js} +2 -2
  228. package/dist/chunks/{index-CdjBY7L8.js.map → index-Bedzmqr-.js.map} +1 -1
  229. package/dist/chunks/{index-CHG_O1fS.js → index-Betxo5g5.js} +2 -2
  230. package/dist/chunks/{index-CHG_O1fS.js.map → index-Betxo5g5.js.map} +1 -1
  231. package/dist/chunks/{index-jiGu-H8x.js → index-BmaJz475.js} +2 -2
  232. package/dist/chunks/{index-jiGu-H8x.js.map → index-BmaJz475.js.map} +1 -1
  233. package/dist/chunks/{index-C53JoVNk.js → index-Buhqag3v.js} +2 -2
  234. package/dist/chunks/{index-C53JoVNk.js.map → index-Buhqag3v.js.map} +1 -1
  235. package/dist/chunks/{index-DO0Rw7hX.js → index-C3VxlfKq.js} +2 -2
  236. package/dist/chunks/{index-DO0Rw7hX.js.map → index-C3VxlfKq.js.map} +1 -1
  237. package/dist/chunks/{index-CSQ60fpG.js → index-CgpRo8Oe.js} +2 -2
  238. package/dist/chunks/{index-CSQ60fpG.js.map → index-CgpRo8Oe.js.map} +1 -1
  239. package/dist/chunks/{index-B-e-ELsf.js → index-DOY0w8Iu.js} +8 -8
  240. package/dist/chunks/{index-B-e-ELsf.js.map → index-DOY0w8Iu.js.map} +1 -1
  241. package/dist/chunks/{index-D2REDIRX.js → index-DwuvIOrQ.js} +2 -2
  242. package/dist/chunks/{index-D2REDIRX.js.map → index-DwuvIOrQ.js.map} +1 -1
  243. package/dist/chunks/{index-DCcl7Qof.js → index-DzedSLdI.js} +2 -2
  244. package/dist/chunks/{index-DCcl7Qof.js.map → index-DzedSLdI.js.map} +1 -1
  245. package/dist/chunks/{index-2wUhd9Lu.js → index-IgLVXPg8.js} +10 -10
  246. package/dist/chunks/index-IgLVXPg8.js.map +1 -0
  247. package/dist/chunks/{index-CwSaRXXg.js → index-lpIzhufD.js} +1916 -1900
  248. package/dist/chunks/index-lpIzhufD.js.map +1 -0
  249. package/dist/chunks/{index-Cuwn2q-f.js → index-mLUKwbGl.js} +4 -4
  250. package/dist/chunks/{index-Cuwn2q-f.js.map → index-mLUKwbGl.js.map} +1 -1
  251. package/dist/chunks/{index-B0mk2tNY.js → index-tO6MMIFB.js} +2 -2
  252. package/dist/chunks/{index-B0mk2tNY.js.map → index-tO6MMIFB.js.map} +1 -1
  253. package/dist/chunks/{tenantIconMap-BpNANQ5s.js → tenantIconMap-BQD9byc8.js} +2 -2
  254. package/dist/chunks/{tenantIconMap-BpNANQ5s.js.map → tenantIconMap-BQD9byc8.js.map} +1 -1
  255. package/dist/chunks/{tenantIconMap-DtdUgvJO.js → tenantIconMap-CTMuSt18.js} +2 -2
  256. package/dist/chunks/{tenantIconMap-DtdUgvJO.js.map → tenantIconMap-CTMuSt18.js.map} +1 -1
  257. package/dist/chunks/{ticketingApi-Bu4rKwLl.js → ticketingApi-BNIdox5t.js} +2 -2
  258. package/dist/chunks/{ticketingApi-Bu4rKwLl.js.map → ticketingApi-BNIdox5t.js.map} +1 -1
  259. package/dist/chunks/{ticketingApi-r4Avm9iS.js → ticketingApi-J0vC_t7r.js} +2 -2
  260. package/dist/chunks/{ticketingApi-r4Avm9iS.js.map → ticketingApi-J0vC_t7r.js.map} +1 -1
  261. package/dist/chunks/{useAccessRequests-B9bF4swg.js → useAccessRequests-DCNNLnxk.js} +3 -3
  262. package/dist/chunks/{useAccessRequests-B9bF4swg.js.map → useAccessRequests-DCNNLnxk.js.map} +1 -1
  263. package/dist/chunks/{useAccessRequests-JyPUX3Om.js → useAccessRequests-DT7X4FAK.js} +2 -2
  264. package/dist/chunks/{useAccessRequests-JyPUX3Om.js.map → useAccessRequests-DT7X4FAK.js.map} +1 -1
  265. package/dist/chunks/{useUserAccessRequests-DjPQenC2.js → useUserAccessRequests-BYbmG4c7.js} +2 -2
  266. package/dist/chunks/{useUserAccessRequests-DjPQenC2.js.map → useUserAccessRequests-BYbmG4c7.js.map} +1 -1
  267. package/dist/chunks/{useUserAccessRequests-BB6FHW14.js → useUserAccessRequests-CylKxRN6.js} +2 -2
  268. package/dist/chunks/{useUserAccessRequests-BB6FHW14.js.map → useUserAccessRequests-CylKxRN6.js.map} +1 -1
  269. package/dist/hooks/useCollapsibleState.d.ts +5 -2
  270. package/dist/hooks/useCollapsibleState.d.ts.map +1 -1
  271. package/dist/i18n/config.d.ts +1 -0
  272. package/dist/i18n/config.d.ts.map +1 -1
  273. package/dist/main.d.ts +0 -1
  274. package/dist/main.d.ts.map +1 -1
  275. package/dist/smartstack.cjs +1 -1
  276. package/dist/smartstack.js +1 -1
  277. package/dist/utils/permissions.d.ts.map +1 -1
  278. package/package.json +1 -1
  279. package/dist/chunks/index-2wUhd9Lu.js.map +0 -1
  280. package/dist/chunks/index-CwSaRXXg.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ApplicationsListPage-DYKM2Yeo.js","sources":["../../src/components/platform/administration/ApplicationCard.tsx","../../src/pages/platform/administration/applications/ApplicationsListPage.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ChevronRight, Users, Clock } from 'lucide-react';\r\n\r\ninterface ApplicationCardProps {\r\n readonly id: string;\r\n readonly name: string;\r\n readonly description?: string;\r\n readonly icon?: string;\r\n readonly isActive: boolean;\r\n readonly userCount?: number;\r\n readonly lastAccessedAt?: string;\r\n readonly onClick?: () => void;\r\n}\r\n\r\nexport const ApplicationCard: React.FC<ApplicationCardProps> = ({\r\n id: _id,\r\n name,\r\n description,\r\n icon,\r\n isActive,\r\n userCount,\r\n lastAccessedAt,\r\n onClick\r\n}) => {\r\n const { t } = useTranslation('admin');\r\n\r\n // Generate consistent gradient color based on application name\r\n const gradientColor = useMemo(() => {\r\n const colors = [\r\n 'from-blue-500 to-cyan-500',\r\n 'from-purple-500 to-pink-500',\r\n 'from-green-500 to-emerald-500',\r\n 'from-orange-500 to-red-500',\r\n 'from-indigo-500 to-blue-500',\r\n 'from-teal-500 to-green-500'\r\n ];\r\n const hash = name.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0);\r\n return colors[hash % colors.length];\r\n }, [name]);\r\n\r\n const formatLastAccessed = (date?: string) => {\r\n if (!date) return t('applications.card.never');\r\n const d = new Date(date);\r\n const now = new Date();\r\n const diffMs = now.getTime() - d.getTime();\r\n const diffMins = Math.floor(diffMs / 60000);\r\n const diffHours = Math.floor(diffMins / 60);\r\n const diffDays = Math.floor(diffHours / 24);\r\n\r\n if (diffMins < 1) return t('applications.card.justNow');\r\n if (diffMins < 60) return t('applications.card.minutesAgo', { count: diffMins });\r\n if (diffHours < 24) return t('applications.card.hoursAgo', { count: diffHours });\r\n if (diffDays < 7) return t('applications.card.daysAgo', { count: diffDays });\r\n return d.toLocaleDateString();\r\n };\r\n\r\n return (\r\n <button\r\n onClick={onClick}\r\n className=\"group relative overflow-hidden rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-6 text-left shadow-sm transition-all duration-300 hover:shadow-md hover:scale-105 hover:border-[var(--color-primary-600)]\"\r\n >\r\n {/* Background gradient accent */}\r\n <div className=\"absolute inset-0 opacity-0 transition-opacity duration-300 group-hover:opacity-5\">\r\n <div className={`absolute inset-0 bg-gradient-to-br ${gradientColor}`} />\r\n </div>\r\n\r\n <div className=\"relative z-10\">\r\n {/* Header with icon and status badge */}\r\n <div className=\"mb-4 flex items-start justify-between\">\r\n <div\r\n className={`flex h-12 w-12 items-center justify-center rounded-[var(--radius-button)] bg-gradient-to-br ${gradientColor} text-white text-lg font-bold`}\r\n >\r\n {icon && icon.length <= 2 ? icon : (name.charAt(0).toUpperCase())}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n {isActive && (\r\n <div className=\"flex items-center gap-1 rounded-full bg-[var(--success-bg)] px-2 py-1\">\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--success-text)]\" />\r\n <span className=\"text-xs font-medium text-[var(--success-text)]\">{t('applications.card.active')}</span>\r\n </div>\r\n )}\r\n {!isActive && (\r\n <div className=\"flex items-center gap-1 rounded-full bg-[var(--warning-bg)] px-2 py-1\">\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--warning-text)]\" />\r\n <span className=\"text-xs font-medium text-[var(--warning-text)]\">{t('applications.card.inactive')}</span>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Title */}\r\n <h3 className=\"mb-2 text-lg font-bold text-[var(--text-primary)]\">{name}</h3>\r\n\r\n {/* Description */}\r\n {description && (\r\n <p className=\"mb-4 line-clamp-2 text-sm text-[var(--text-secondary)]\">\r\n {description}\r\n </p>\r\n )}\r\n\r\n {/* Stats row */}\r\n <div className=\"mb-4 flex items-center gap-4 text-xs text-[var(--text-tertiary)]\">\r\n {userCount !== undefined && (\r\n <div className=\"flex items-center gap-1\">\r\n <Users className=\"h-4 w-4\" />\r\n <span>{userCount} {userCount !== 1 ? t('applications.card.users') : t('applications.card.user')}</span>\r\n </div>\r\n )}\r\n {lastAccessedAt && (\r\n <div className=\"flex items-center gap-1\">\r\n <Clock className=\"h-4 w-4\" />\r\n <span>{formatLastAccessed(lastAccessedAt)}</span>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* View button with arrow */}\r\n <div className=\"inline-flex items-center gap-2 rounded-[var(--radius-button)] bg-[var(--color-primary-600)] px-3 py-2 text-xs font-medium text-white transition-all duration-200 group-hover:gap-3\">\r\n {t('applications.card.viewDetails')}\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </div>\r\n </div>\r\n </button>\r\n );\r\n};\r\n","import React, { useEffect, useState, useMemo, useCallback } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { LayoutGrid, LayoutList, Search, AlertTriangle, Loader2 } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { ApplicationCard } from '@/components/platform/administration/ApplicationCard';\r\nimport { adminApi } from '@/services/api/adminApi';\r\nimport type { ApplicationListDto } from '@/services/api/adminApi';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\n\r\ntype ViewMode = 'cards' | 'table';\r\n\r\nexport const ApplicationsListPage: React.FC = () => {\r\n const navigate = useNavigate();\r\n const { t } = useTranslation('admin');\r\n const { currentTenant, isGlobalView } = useTenant();\r\n const [applications, setApplications] = useState<ApplicationListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [viewMode, setViewMode] = useState<ViewMode>('cards');\r\n const [searchTerm, setSearchTerm] = useState('');\r\n const [contextFilter, setContextFilter] = useState('');\r\n const [statusFilter, setStatusFilter] = useState('all');\r\n\r\n const fetchApplications = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const data = await adminApi.applications.getAll();\r\n setApplications(data);\r\n setError(null);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load applications');\r\n } finally {\r\n setLoading(false);\r\n }\r\n // TENANT ISOLATION: Re-fetch when tenant changes\r\n }, [currentTenant?.id, isGlobalView]);\r\n\r\n useEffect(() => {\r\n fetchApplications();\r\n }, [fetchApplications]);\r\n\r\n const contexts = useMemo(() => {\r\n const unique = new Set(applications.map(a => a.zone));\r\n return Array.from(unique).filter(Boolean) as string[];\r\n }, [applications]);\r\n\r\n const filteredApplications = useMemo(() => {\r\n return applications.filter(app => {\r\n const matchesSearch = app.label.toLowerCase().includes(searchTerm.toLowerCase()) ||\r\n (app.description?.toLowerCase().includes(searchTerm.toLowerCase()) ?? false);\r\n const matchesContext = !contextFilter || app.zone === contextFilter;\r\n const matchesStatus = statusFilter === 'all' ||\r\n (statusFilter === 'active' && app.isActive) ||\r\n (statusFilter === 'inactive' && !app.isActive);\r\n return matchesSearch && matchesContext && matchesStatus;\r\n });\r\n }, [applications, searchTerm, contextFilter, statusFilter]);\r\n\r\n const handleApplicationClick = (appId: string) => {\r\n navigate(`/administration/applications/${appId}`);\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex h-96 items-center justify-center\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"rounded-lg border border-[var(--error-border)] bg-[var(--error-bg)] p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <AlertTriangle className=\"h-5 w-5 text-[var(--error-text)]\" />\r\n <p className=\"text-[var(--error-text)]\">{error}</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('applications.title', 'Applications') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div>\r\n <h1 className=\"text-3xl font-bold text-[var(--text-primary)]\">{t('applications.list.heading')}</h1>\r\n <p className=\"mt-2 text-[var(--text-secondary)]\">\r\n {t('applications.list.description')}\r\n </p>\r\n </div>\r\n\r\n {/* Toolbar */}\r\n <div className=\"space-y-4 rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n {/* Search and filters row */}\r\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center\">\r\n {/* Search input */}\r\n <div className=\"flex-1 relative\">\r\n <Search className=\"absolute left-3 top-1/2 h-5 w-5 -translate-y-1/2 text-[var(--text-tertiary)]\" />\r\n <input\r\n type=\"text\"\r\n placeholder={t('applications.list.search')}\r\n value={searchTerm}\r\n onChange={(e) => setSearchTerm(e.target.value)}\r\n className=\"w-full rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] py-2 pl-10 pr-4 text-[var(--text-primary)] placeholder-[var(--text-tertiary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n />\r\n </div>\r\n\r\n {/* Filter dropdowns */}\r\n <select\r\n value={contextFilter}\r\n onChange={(e) => setContextFilter(e.target.value)}\r\n className=\"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n >\r\n <option value=\"\">{t('applications.list.allContexts')}</option>\r\n {contexts.map(ctx => (\r\n <option key={ctx} value={ctx}>{ctx}</option>\r\n ))}\r\n </select>\r\n\r\n <select\r\n value={statusFilter}\r\n onChange={(e) => setStatusFilter(e.target.value)}\r\n className=\"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n >\r\n <option value=\"all\">{t('applications.list.allStatus')}</option>\r\n <option value=\"active\">{t('applications.list.active')}</option>\r\n <option value=\"inactive\">{t('applications.list.inactive')}</option>\r\n </select>\r\n </div>\r\n\r\n {/* View mode toggle */}\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => setViewMode('cards')}\r\n className={`rounded-lg p-2 transition-all ${\r\n viewMode === 'cards'\r\n ? 'bg-[var(--color-primary-600)] text-white'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-tertiary)] hover:text-[var(--text-primary)]'\r\n }`}\r\n title={t('applications.list.cardView')}\r\n >\r\n <LayoutGrid className=\"h-5 w-5\" />\r\n </button>\r\n <button\r\n onClick={() => setViewMode('table')}\r\n className={`rounded-lg p-2 transition-all ${\r\n viewMode === 'table'\r\n ? 'bg-[var(--color-primary-600)] text-white'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-tertiary)] hover:text-[var(--text-primary)]'\r\n }`}\r\n title={t('applications.list.tableView')}\r\n >\r\n <LayoutList className=\"h-5 w-5\" />\r\n </button>\r\n <span className=\"ml-auto text-sm text-[var(--text-tertiary)]\">\r\n {t('applications.list.count', { count: filteredApplications.length })}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Content */}\r\n {filteredApplications.length === 0 && (\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-12 text-center\">\r\n <p className=\"text-[var(--text-secondary)]\">{t('applications.list.noResults')}</p>\r\n </div>\r\n )}\r\n {filteredApplications.length > 0 && viewMode === 'cards' && (\r\n // Card View\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6\">\r\n {filteredApplications.map((app) => (\r\n <ApplicationCard\r\n key={app.id}\r\n id={app.id}\r\n name={app.label}\r\n description={app.description ?? undefined}\r\n icon={app.icon ?? undefined}\r\n isActive={app.isActive}\r\n onClick={() => handleApplicationClick(app.id)}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n {filteredApplications.length > 0 && viewMode !== 'cards' && (\r\n // Table View\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">\r\n {t('applications.list.columns.application')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden md:table-cell\">\r\n {t('applications.list.columns.context')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">\r\n {t('applications.list.columns.modules')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">\r\n {t('applications.list.columns.status')}\r\n </th>\r\n <th className=\"w-24 px-4 py-3\"></th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {filteredApplications.map((app) => (\r\n <tr\r\n key={app.id}\r\n className=\"hover:bg-[var(--bg-hover)] transition-colors cursor-pointer group\"\r\n onClick={() => handleApplicationClick(app.id)}\r\n >\r\n <td className=\"px-4 py-3\">\r\n <p className=\"font-medium text-[var(--text-primary)] group-hover:text-[var(--color-accent-600)] transition-colors\">{app.label}</p>\r\n {app.description && (\r\n <p className=\"mt-0.5 text-xs text-[var(--text-tertiary)]\">{app.description}</p>\r\n )}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)] hidden md:table-cell\">\r\n {app.zone}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)] hidden lg:table-cell\">\r\n {app.modulesCount || 0}\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"inline-flex items-center gap-2 rounded-full px-2.5 py-0.5 text-xs font-medium\">\r\n {app.isActive ? (\r\n <>\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--success-text)]\" />\r\n <span className=\"text-[var(--success-text)]\">{t('applications.list.active')}</span>\r\n </>\r\n ) : (\r\n <>\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--warning-text)]\" />\r\n <span className=\"text-[var(--warning-text)]\">{t('applications.list.inactive')}</span>\r\n </>\r\n )}\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\" onClick={e => e.stopPropagation()}>\r\n <button\r\n onClick={() => handleApplicationClick(app.id)}\r\n className=\"inline-flex items-center justify-center rounded-lg bg-[var(--color-primary-600)] p-2 text-white transition-all hover:shadow-md\"\r\n >\r\n <span className=\"text-xs font-medium\">{t('applications.list.view')}</span>\r\n </button>\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n"],"names":["ApplicationCard","_id","name","description","icon","isActive","userCount","lastAccessedAt","onClick","t","useTranslation","gradientColor","useMemo","colors","hash","acc","char","formatLastAccessed","date","d","diffMs","diffMins","diffHours","diffDays","jsxs","jsx","Users","Clock","ChevronRight","ApplicationsListPage","navigate","useNavigate","currentTenant","isGlobalView","useTenant","applications","setApplications","useState","loading","setLoading","error","setError","viewMode","setViewMode","searchTerm","setSearchTerm","contextFilter","setContextFilter","statusFilter","setStatusFilter","fetchApplications","useCallback","data","adminApi","err","useEffect","contexts","unique","a","filteredApplications","app","matchesSearch","matchesContext","matchesStatus","handleApplicationClick","appId","Loader2","AlertTriangle","Breadcrumb","Search","e","ctx","LayoutGrid","LayoutList","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"ApplicationsListPage--CGkyBuJ.js","sources":["../../src/components/platform/administration/ApplicationCard.tsx","../../src/pages/platform/administration/applications/ApplicationsListPage.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ChevronRight, Users, Clock } from 'lucide-react';\r\n\r\ninterface ApplicationCardProps {\r\n readonly id: string;\r\n readonly name: string;\r\n readonly description?: string;\r\n readonly icon?: string;\r\n readonly isActive: boolean;\r\n readonly userCount?: number;\r\n readonly lastAccessedAt?: string;\r\n readonly onClick?: () => void;\r\n}\r\n\r\nexport const ApplicationCard: React.FC<ApplicationCardProps> = ({\r\n id: _id,\r\n name,\r\n description,\r\n icon,\r\n isActive,\r\n userCount,\r\n lastAccessedAt,\r\n onClick\r\n}) => {\r\n const { t } = useTranslation('admin');\r\n\r\n // Generate consistent gradient color based on application name\r\n const gradientColor = useMemo(() => {\r\n const colors = [\r\n 'from-blue-500 to-cyan-500',\r\n 'from-purple-500 to-pink-500',\r\n 'from-green-500 to-emerald-500',\r\n 'from-orange-500 to-red-500',\r\n 'from-indigo-500 to-blue-500',\r\n 'from-teal-500 to-green-500'\r\n ];\r\n const hash = name.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0);\r\n return colors[hash % colors.length];\r\n }, [name]);\r\n\r\n const formatLastAccessed = (date?: string) => {\r\n if (!date) return t('applications.card.never');\r\n const d = new Date(date);\r\n const now = new Date();\r\n const diffMs = now.getTime() - d.getTime();\r\n const diffMins = Math.floor(diffMs / 60000);\r\n const diffHours = Math.floor(diffMins / 60);\r\n const diffDays = Math.floor(diffHours / 24);\r\n\r\n if (diffMins < 1) return t('applications.card.justNow');\r\n if (diffMins < 60) return t('applications.card.minutesAgo', { count: diffMins });\r\n if (diffHours < 24) return t('applications.card.hoursAgo', { count: diffHours });\r\n if (diffDays < 7) return t('applications.card.daysAgo', { count: diffDays });\r\n return d.toLocaleDateString();\r\n };\r\n\r\n return (\r\n <button\r\n onClick={onClick}\r\n className=\"group relative overflow-hidden rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-6 text-left shadow-sm transition-all duration-300 hover:shadow-md hover:scale-105 hover:border-[var(--color-primary-600)]\"\r\n >\r\n {/* Background gradient accent */}\r\n <div className=\"absolute inset-0 opacity-0 transition-opacity duration-300 group-hover:opacity-5\">\r\n <div className={`absolute inset-0 bg-gradient-to-br ${gradientColor}`} />\r\n </div>\r\n\r\n <div className=\"relative z-10\">\r\n {/* Header with icon and status badge */}\r\n <div className=\"mb-4 flex items-start justify-between\">\r\n <div\r\n className={`flex h-12 w-12 items-center justify-center rounded-[var(--radius-button)] bg-gradient-to-br ${gradientColor} text-white text-lg font-bold`}\r\n >\r\n {icon && icon.length <= 2 ? icon : (name.charAt(0).toUpperCase())}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n {isActive && (\r\n <div className=\"flex items-center gap-1 rounded-full bg-[var(--success-bg)] px-2 py-1\">\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--success-text)]\" />\r\n <span className=\"text-xs font-medium text-[var(--success-text)]\">{t('applications.card.active')}</span>\r\n </div>\r\n )}\r\n {!isActive && (\r\n <div className=\"flex items-center gap-1 rounded-full bg-[var(--warning-bg)] px-2 py-1\">\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--warning-text)]\" />\r\n <span className=\"text-xs font-medium text-[var(--warning-text)]\">{t('applications.card.inactive')}</span>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Title */}\r\n <h3 className=\"mb-2 text-lg font-bold text-[var(--text-primary)]\">{name}</h3>\r\n\r\n {/* Description */}\r\n {description && (\r\n <p className=\"mb-4 line-clamp-2 text-sm text-[var(--text-secondary)]\">\r\n {description}\r\n </p>\r\n )}\r\n\r\n {/* Stats row */}\r\n <div className=\"mb-4 flex items-center gap-4 text-xs text-[var(--text-tertiary)]\">\r\n {userCount !== undefined && (\r\n <div className=\"flex items-center gap-1\">\r\n <Users className=\"h-4 w-4\" />\r\n <span>{userCount} {userCount !== 1 ? t('applications.card.users') : t('applications.card.user')}</span>\r\n </div>\r\n )}\r\n {lastAccessedAt && (\r\n <div className=\"flex items-center gap-1\">\r\n <Clock className=\"h-4 w-4\" />\r\n <span>{formatLastAccessed(lastAccessedAt)}</span>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* View button with arrow */}\r\n <div className=\"inline-flex items-center gap-2 rounded-[var(--radius-button)] bg-[var(--color-primary-600)] px-3 py-2 text-xs font-medium text-white transition-all duration-200 group-hover:gap-3\">\r\n {t('applications.card.viewDetails')}\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </div>\r\n </div>\r\n </button>\r\n );\r\n};\r\n","import React, { useEffect, useState, useMemo, useCallback } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { LayoutGrid, LayoutList, Search, AlertTriangle, Loader2 } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { ApplicationCard } from '@/components/platform/administration/ApplicationCard';\r\nimport { adminApi } from '@/services/api/adminApi';\r\nimport type { ApplicationListDto } from '@/services/api/adminApi';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\n\r\ntype ViewMode = 'cards' | 'table';\r\n\r\nexport const ApplicationsListPage: React.FC = () => {\r\n const navigate = useNavigate();\r\n const { t } = useTranslation('admin');\r\n const { currentTenant, isGlobalView } = useTenant();\r\n const [applications, setApplications] = useState<ApplicationListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [viewMode, setViewMode] = useState<ViewMode>('cards');\r\n const [searchTerm, setSearchTerm] = useState('');\r\n const [contextFilter, setContextFilter] = useState('');\r\n const [statusFilter, setStatusFilter] = useState('all');\r\n\r\n const fetchApplications = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const data = await adminApi.applications.getAll();\r\n setApplications(data);\r\n setError(null);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load applications');\r\n } finally {\r\n setLoading(false);\r\n }\r\n // TENANT ISOLATION: Re-fetch when tenant changes\r\n }, [currentTenant?.id, isGlobalView]);\r\n\r\n useEffect(() => {\r\n fetchApplications();\r\n }, [fetchApplications]);\r\n\r\n const contexts = useMemo(() => {\r\n const unique = new Set(applications.map(a => a.zone));\r\n return Array.from(unique).filter(Boolean) as string[];\r\n }, [applications]);\r\n\r\n const filteredApplications = useMemo(() => {\r\n return applications.filter(app => {\r\n const matchesSearch = app.label.toLowerCase().includes(searchTerm.toLowerCase()) ||\r\n (app.description?.toLowerCase().includes(searchTerm.toLowerCase()) ?? false);\r\n const matchesContext = !contextFilter || app.zone === contextFilter;\r\n const matchesStatus = statusFilter === 'all' ||\r\n (statusFilter === 'active' && app.isActive) ||\r\n (statusFilter === 'inactive' && !app.isActive);\r\n return matchesSearch && matchesContext && matchesStatus;\r\n });\r\n }, [applications, searchTerm, contextFilter, statusFilter]);\r\n\r\n const handleApplicationClick = (appId: string) => {\r\n navigate(`/administration/applications/${appId}`);\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex h-96 items-center justify-center\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"rounded-lg border border-[var(--error-border)] bg-[var(--error-bg)] p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <AlertTriangle className=\"h-5 w-5 text-[var(--error-text)]\" />\r\n <p className=\"text-[var(--error-text)]\">{error}</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('applications.title', 'Applications') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div>\r\n <h1 className=\"text-3xl font-bold text-[var(--text-primary)]\">{t('applications.list.heading')}</h1>\r\n <p className=\"mt-2 text-[var(--text-secondary)]\">\r\n {t('applications.list.description')}\r\n </p>\r\n </div>\r\n\r\n {/* Toolbar */}\r\n <div className=\"space-y-4 rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n {/* Search and filters row */}\r\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center\">\r\n {/* Search input */}\r\n <div className=\"flex-1 relative\">\r\n <Search className=\"absolute left-3 top-1/2 h-5 w-5 -translate-y-1/2 text-[var(--text-tertiary)]\" />\r\n <input\r\n type=\"text\"\r\n placeholder={t('applications.list.search')}\r\n value={searchTerm}\r\n onChange={(e) => setSearchTerm(e.target.value)}\r\n className=\"w-full rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] py-2 pl-10 pr-4 text-[var(--text-primary)] placeholder-[var(--text-tertiary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n />\r\n </div>\r\n\r\n {/* Filter dropdowns */}\r\n <select\r\n value={contextFilter}\r\n onChange={(e) => setContextFilter(e.target.value)}\r\n className=\"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n >\r\n <option value=\"\">{t('applications.list.allContexts')}</option>\r\n {contexts.map(ctx => (\r\n <option key={ctx} value={ctx}>{ctx}</option>\r\n ))}\r\n </select>\r\n\r\n <select\r\n value={statusFilter}\r\n onChange={(e) => setStatusFilter(e.target.value)}\r\n className=\"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n >\r\n <option value=\"all\">{t('applications.list.allStatus')}</option>\r\n <option value=\"active\">{t('applications.list.active')}</option>\r\n <option value=\"inactive\">{t('applications.list.inactive')}</option>\r\n </select>\r\n </div>\r\n\r\n {/* View mode toggle */}\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => setViewMode('cards')}\r\n className={`rounded-lg p-2 transition-all ${\r\n viewMode === 'cards'\r\n ? 'bg-[var(--color-primary-600)] text-white'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-tertiary)] hover:text-[var(--text-primary)]'\r\n }`}\r\n title={t('applications.list.cardView')}\r\n >\r\n <LayoutGrid className=\"h-5 w-5\" />\r\n </button>\r\n <button\r\n onClick={() => setViewMode('table')}\r\n className={`rounded-lg p-2 transition-all ${\r\n viewMode === 'table'\r\n ? 'bg-[var(--color-primary-600)] text-white'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-tertiary)] hover:text-[var(--text-primary)]'\r\n }`}\r\n title={t('applications.list.tableView')}\r\n >\r\n <LayoutList className=\"h-5 w-5\" />\r\n </button>\r\n <span className=\"ml-auto text-sm text-[var(--text-tertiary)]\">\r\n {t('applications.list.count', { count: filteredApplications.length })}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Content */}\r\n {filteredApplications.length === 0 && (\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-12 text-center\">\r\n <p className=\"text-[var(--text-secondary)]\">{t('applications.list.noResults')}</p>\r\n </div>\r\n )}\r\n {filteredApplications.length > 0 && viewMode === 'cards' && (\r\n // Card View\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6\">\r\n {filteredApplications.map((app) => (\r\n <ApplicationCard\r\n key={app.id}\r\n id={app.id}\r\n name={app.label}\r\n description={app.description ?? undefined}\r\n icon={app.icon ?? undefined}\r\n isActive={app.isActive}\r\n onClick={() => handleApplicationClick(app.id)}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n {filteredApplications.length > 0 && viewMode !== 'cards' && (\r\n // Table View\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">\r\n {t('applications.list.columns.application')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden md:table-cell\">\r\n {t('applications.list.columns.context')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">\r\n {t('applications.list.columns.modules')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">\r\n {t('applications.list.columns.status')}\r\n </th>\r\n <th className=\"w-24 px-4 py-3\"></th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {filteredApplications.map((app) => (\r\n <tr\r\n key={app.id}\r\n className=\"hover:bg-[var(--bg-hover)] transition-colors cursor-pointer group\"\r\n onClick={() => handleApplicationClick(app.id)}\r\n >\r\n <td className=\"px-4 py-3\">\r\n <p className=\"font-medium text-[var(--text-primary)] group-hover:text-[var(--color-accent-600)] transition-colors\">{app.label}</p>\r\n {app.description && (\r\n <p className=\"mt-0.5 text-xs text-[var(--text-tertiary)]\">{app.description}</p>\r\n )}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)] hidden md:table-cell\">\r\n {app.zone}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)] hidden lg:table-cell\">\r\n {app.modulesCount || 0}\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"inline-flex items-center gap-2 rounded-full px-2.5 py-0.5 text-xs font-medium\">\r\n {app.isActive ? (\r\n <>\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--success-text)]\" />\r\n <span className=\"text-[var(--success-text)]\">{t('applications.list.active')}</span>\r\n </>\r\n ) : (\r\n <>\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--warning-text)]\" />\r\n <span className=\"text-[var(--warning-text)]\">{t('applications.list.inactive')}</span>\r\n </>\r\n )}\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\" onClick={e => e.stopPropagation()}>\r\n <button\r\n onClick={() => handleApplicationClick(app.id)}\r\n className=\"inline-flex items-center justify-center rounded-lg bg-[var(--color-primary-600)] p-2 text-white transition-all hover:shadow-md\"\r\n >\r\n <span className=\"text-xs font-medium\">{t('applications.list.view')}</span>\r\n </button>\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n"],"names":["ApplicationCard","_id","name","description","icon","isActive","userCount","lastAccessedAt","onClick","t","useTranslation","gradientColor","useMemo","colors","hash","acc","char","formatLastAccessed","date","d","diffMs","diffMins","diffHours","diffDays","jsxs","jsx","Users","Clock","ChevronRight","ApplicationsListPage","navigate","useNavigate","currentTenant","isGlobalView","useTenant","applications","setApplications","useState","loading","setLoading","error","setError","viewMode","setViewMode","searchTerm","setSearchTerm","contextFilter","setContextFilter","statusFilter","setStatusFilter","fetchApplications","useCallback","data","adminApi","err","useEffect","contexts","unique","a","filteredApplications","app","matchesSearch","matchesContext","matchesStatus","handleApplicationClick","appId","Loader2","AlertTriangle","Breadcrumb","Search","e","ctx","LayoutGrid","LayoutList","Fragment"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { useMemo as A, useState as d, useCallback as D, useEffect as $ } from "r
3
3
  import { useNavigate as z } from "react-router-dom";
4
4
  import { useTranslation as M } from "react-i18next";
5
5
  import { Users as V, Clock as B, ChevronRight as E, Loader2 as G, AlertTriangle as P, Search as R, LayoutGrid as U, LayoutList as q } from "lucide-react";
6
- import { a as H, k as _, B as I } from "./index-CwSaRXXg.js";
6
+ import { a as H, k as _, B as I } from "./index-lpIzhufD.js";
7
7
  const J = ({
8
8
  id: k,
9
9
  name: r,
@@ -244,4 +244,4 @@ const J = ({
244
244
  export {
245
245
  Z as ApplicationsListPage
246
246
  };
247
- //# sourceMappingURL=ApplicationsListPage-C91v2rZt.js.map
247
+ //# sourceMappingURL=ApplicationsListPage-JUX823bh.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ApplicationsListPage-C91v2rZt.js","sources":["../../src/components/platform/administration/ApplicationCard.tsx","../../src/pages/platform/administration/applications/ApplicationsListPage.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ChevronRight, Users, Clock } from 'lucide-react';\r\n\r\ninterface ApplicationCardProps {\r\n readonly id: string;\r\n readonly name: string;\r\n readonly description?: string;\r\n readonly icon?: string;\r\n readonly isActive: boolean;\r\n readonly userCount?: number;\r\n readonly lastAccessedAt?: string;\r\n readonly onClick?: () => void;\r\n}\r\n\r\nexport const ApplicationCard: React.FC<ApplicationCardProps> = ({\r\n id: _id,\r\n name,\r\n description,\r\n icon,\r\n isActive,\r\n userCount,\r\n lastAccessedAt,\r\n onClick\r\n}) => {\r\n const { t } = useTranslation('admin');\r\n\r\n // Generate consistent gradient color based on application name\r\n const gradientColor = useMemo(() => {\r\n const colors = [\r\n 'from-blue-500 to-cyan-500',\r\n 'from-purple-500 to-pink-500',\r\n 'from-green-500 to-emerald-500',\r\n 'from-orange-500 to-red-500',\r\n 'from-indigo-500 to-blue-500',\r\n 'from-teal-500 to-green-500'\r\n ];\r\n const hash = name.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0);\r\n return colors[hash % colors.length];\r\n }, [name]);\r\n\r\n const formatLastAccessed = (date?: string) => {\r\n if (!date) return t('applications.card.never');\r\n const d = new Date(date);\r\n const now = new Date();\r\n const diffMs = now.getTime() - d.getTime();\r\n const diffMins = Math.floor(diffMs / 60000);\r\n const diffHours = Math.floor(diffMins / 60);\r\n const diffDays = Math.floor(diffHours / 24);\r\n\r\n if (diffMins < 1) return t('applications.card.justNow');\r\n if (diffMins < 60) return t('applications.card.minutesAgo', { count: diffMins });\r\n if (diffHours < 24) return t('applications.card.hoursAgo', { count: diffHours });\r\n if (diffDays < 7) return t('applications.card.daysAgo', { count: diffDays });\r\n return d.toLocaleDateString();\r\n };\r\n\r\n return (\r\n <button\r\n onClick={onClick}\r\n className=\"group relative overflow-hidden rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-6 text-left shadow-sm transition-all duration-300 hover:shadow-md hover:scale-105 hover:border-[var(--color-primary-600)]\"\r\n >\r\n {/* Background gradient accent */}\r\n <div className=\"absolute inset-0 opacity-0 transition-opacity duration-300 group-hover:opacity-5\">\r\n <div className={`absolute inset-0 bg-gradient-to-br ${gradientColor}`} />\r\n </div>\r\n\r\n <div className=\"relative z-10\">\r\n {/* Header with icon and status badge */}\r\n <div className=\"mb-4 flex items-start justify-between\">\r\n <div\r\n className={`flex h-12 w-12 items-center justify-center rounded-[var(--radius-button)] bg-gradient-to-br ${gradientColor} text-white text-lg font-bold`}\r\n >\r\n {icon && icon.length <= 2 ? icon : (name.charAt(0).toUpperCase())}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n {isActive && (\r\n <div className=\"flex items-center gap-1 rounded-full bg-[var(--success-bg)] px-2 py-1\">\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--success-text)]\" />\r\n <span className=\"text-xs font-medium text-[var(--success-text)]\">{t('applications.card.active')}</span>\r\n </div>\r\n )}\r\n {!isActive && (\r\n <div className=\"flex items-center gap-1 rounded-full bg-[var(--warning-bg)] px-2 py-1\">\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--warning-text)]\" />\r\n <span className=\"text-xs font-medium text-[var(--warning-text)]\">{t('applications.card.inactive')}</span>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Title */}\r\n <h3 className=\"mb-2 text-lg font-bold text-[var(--text-primary)]\">{name}</h3>\r\n\r\n {/* Description */}\r\n {description && (\r\n <p className=\"mb-4 line-clamp-2 text-sm text-[var(--text-secondary)]\">\r\n {description}\r\n </p>\r\n )}\r\n\r\n {/* Stats row */}\r\n <div className=\"mb-4 flex items-center gap-4 text-xs text-[var(--text-tertiary)]\">\r\n {userCount !== undefined && (\r\n <div className=\"flex items-center gap-1\">\r\n <Users className=\"h-4 w-4\" />\r\n <span>{userCount} {userCount !== 1 ? t('applications.card.users') : t('applications.card.user')}</span>\r\n </div>\r\n )}\r\n {lastAccessedAt && (\r\n <div className=\"flex items-center gap-1\">\r\n <Clock className=\"h-4 w-4\" />\r\n <span>{formatLastAccessed(lastAccessedAt)}</span>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* View button with arrow */}\r\n <div className=\"inline-flex items-center gap-2 rounded-[var(--radius-button)] bg-[var(--color-primary-600)] px-3 py-2 text-xs font-medium text-white transition-all duration-200 group-hover:gap-3\">\r\n {t('applications.card.viewDetails')}\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </div>\r\n </div>\r\n </button>\r\n );\r\n};\r\n","import React, { useEffect, useState, useMemo, useCallback } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { LayoutGrid, LayoutList, Search, AlertTriangle, Loader2 } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { ApplicationCard } from '@/components/platform/administration/ApplicationCard';\r\nimport { adminApi } from '@/services/api/adminApi';\r\nimport type { ApplicationListDto } from '@/services/api/adminApi';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\n\r\ntype ViewMode = 'cards' | 'table';\r\n\r\nexport const ApplicationsListPage: React.FC = () => {\r\n const navigate = useNavigate();\r\n const { t } = useTranslation('admin');\r\n const { currentTenant, isGlobalView } = useTenant();\r\n const [applications, setApplications] = useState<ApplicationListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [viewMode, setViewMode] = useState<ViewMode>('cards');\r\n const [searchTerm, setSearchTerm] = useState('');\r\n const [contextFilter, setContextFilter] = useState('');\r\n const [statusFilter, setStatusFilter] = useState('all');\r\n\r\n const fetchApplications = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const data = await adminApi.applications.getAll();\r\n setApplications(data);\r\n setError(null);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load applications');\r\n } finally {\r\n setLoading(false);\r\n }\r\n // TENANT ISOLATION: Re-fetch when tenant changes\r\n }, [currentTenant?.id, isGlobalView]);\r\n\r\n useEffect(() => {\r\n fetchApplications();\r\n }, [fetchApplications]);\r\n\r\n const contexts = useMemo(() => {\r\n const unique = new Set(applications.map(a => a.zone));\r\n return Array.from(unique).filter(Boolean) as string[];\r\n }, [applications]);\r\n\r\n const filteredApplications = useMemo(() => {\r\n return applications.filter(app => {\r\n const matchesSearch = app.label.toLowerCase().includes(searchTerm.toLowerCase()) ||\r\n (app.description?.toLowerCase().includes(searchTerm.toLowerCase()) ?? false);\r\n const matchesContext = !contextFilter || app.zone === contextFilter;\r\n const matchesStatus = statusFilter === 'all' ||\r\n (statusFilter === 'active' && app.isActive) ||\r\n (statusFilter === 'inactive' && !app.isActive);\r\n return matchesSearch && matchesContext && matchesStatus;\r\n });\r\n }, [applications, searchTerm, contextFilter, statusFilter]);\r\n\r\n const handleApplicationClick = (appId: string) => {\r\n navigate(`/administration/applications/${appId}`);\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex h-96 items-center justify-center\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"rounded-lg border border-[var(--error-border)] bg-[var(--error-bg)] p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <AlertTriangle className=\"h-5 w-5 text-[var(--error-text)]\" />\r\n <p className=\"text-[var(--error-text)]\">{error}</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('applications.title', 'Applications') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div>\r\n <h1 className=\"text-3xl font-bold text-[var(--text-primary)]\">{t('applications.list.heading')}</h1>\r\n <p className=\"mt-2 text-[var(--text-secondary)]\">\r\n {t('applications.list.description')}\r\n </p>\r\n </div>\r\n\r\n {/* Toolbar */}\r\n <div className=\"space-y-4 rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n {/* Search and filters row */}\r\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center\">\r\n {/* Search input */}\r\n <div className=\"flex-1 relative\">\r\n <Search className=\"absolute left-3 top-1/2 h-5 w-5 -translate-y-1/2 text-[var(--text-tertiary)]\" />\r\n <input\r\n type=\"text\"\r\n placeholder={t('applications.list.search')}\r\n value={searchTerm}\r\n onChange={(e) => setSearchTerm(e.target.value)}\r\n className=\"w-full rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] py-2 pl-10 pr-4 text-[var(--text-primary)] placeholder-[var(--text-tertiary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n />\r\n </div>\r\n\r\n {/* Filter dropdowns */}\r\n <select\r\n value={contextFilter}\r\n onChange={(e) => setContextFilter(e.target.value)}\r\n className=\"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n >\r\n <option value=\"\">{t('applications.list.allContexts')}</option>\r\n {contexts.map(ctx => (\r\n <option key={ctx} value={ctx}>{ctx}</option>\r\n ))}\r\n </select>\r\n\r\n <select\r\n value={statusFilter}\r\n onChange={(e) => setStatusFilter(e.target.value)}\r\n className=\"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n >\r\n <option value=\"all\">{t('applications.list.allStatus')}</option>\r\n <option value=\"active\">{t('applications.list.active')}</option>\r\n <option value=\"inactive\">{t('applications.list.inactive')}</option>\r\n </select>\r\n </div>\r\n\r\n {/* View mode toggle */}\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => setViewMode('cards')}\r\n className={`rounded-lg p-2 transition-all ${\r\n viewMode === 'cards'\r\n ? 'bg-[var(--color-primary-600)] text-white'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-tertiary)] hover:text-[var(--text-primary)]'\r\n }`}\r\n title={t('applications.list.cardView')}\r\n >\r\n <LayoutGrid className=\"h-5 w-5\" />\r\n </button>\r\n <button\r\n onClick={() => setViewMode('table')}\r\n className={`rounded-lg p-2 transition-all ${\r\n viewMode === 'table'\r\n ? 'bg-[var(--color-primary-600)] text-white'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-tertiary)] hover:text-[var(--text-primary)]'\r\n }`}\r\n title={t('applications.list.tableView')}\r\n >\r\n <LayoutList className=\"h-5 w-5\" />\r\n </button>\r\n <span className=\"ml-auto text-sm text-[var(--text-tertiary)]\">\r\n {t('applications.list.count', { count: filteredApplications.length })}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Content */}\r\n {filteredApplications.length === 0 && (\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-12 text-center\">\r\n <p className=\"text-[var(--text-secondary)]\">{t('applications.list.noResults')}</p>\r\n </div>\r\n )}\r\n {filteredApplications.length > 0 && viewMode === 'cards' && (\r\n // Card View\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6\">\r\n {filteredApplications.map((app) => (\r\n <ApplicationCard\r\n key={app.id}\r\n id={app.id}\r\n name={app.label}\r\n description={app.description ?? undefined}\r\n icon={app.icon ?? undefined}\r\n isActive={app.isActive}\r\n onClick={() => handleApplicationClick(app.id)}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n {filteredApplications.length > 0 && viewMode !== 'cards' && (\r\n // Table View\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">\r\n {t('applications.list.columns.application')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden md:table-cell\">\r\n {t('applications.list.columns.context')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">\r\n {t('applications.list.columns.modules')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">\r\n {t('applications.list.columns.status')}\r\n </th>\r\n <th className=\"w-24 px-4 py-3\"></th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {filteredApplications.map((app) => (\r\n <tr\r\n key={app.id}\r\n className=\"hover:bg-[var(--bg-hover)] transition-colors cursor-pointer group\"\r\n onClick={() => handleApplicationClick(app.id)}\r\n >\r\n <td className=\"px-4 py-3\">\r\n <p className=\"font-medium text-[var(--text-primary)] group-hover:text-[var(--color-accent-600)] transition-colors\">{app.label}</p>\r\n {app.description && (\r\n <p className=\"mt-0.5 text-xs text-[var(--text-tertiary)]\">{app.description}</p>\r\n )}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)] hidden md:table-cell\">\r\n {app.zone}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)] hidden lg:table-cell\">\r\n {app.modulesCount || 0}\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"inline-flex items-center gap-2 rounded-full px-2.5 py-0.5 text-xs font-medium\">\r\n {app.isActive ? (\r\n <>\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--success-text)]\" />\r\n <span className=\"text-[var(--success-text)]\">{t('applications.list.active')}</span>\r\n </>\r\n ) : (\r\n <>\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--warning-text)]\" />\r\n <span className=\"text-[var(--warning-text)]\">{t('applications.list.inactive')}</span>\r\n </>\r\n )}\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\" onClick={e => e.stopPropagation()}>\r\n <button\r\n onClick={() => handleApplicationClick(app.id)}\r\n className=\"inline-flex items-center justify-center rounded-lg bg-[var(--color-primary-600)] p-2 text-white transition-all hover:shadow-md\"\r\n >\r\n <span className=\"text-xs font-medium\">{t('applications.list.view')}</span>\r\n </button>\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n"],"names":["ApplicationCard","_id","name","description","icon","isActive","userCount","lastAccessedAt","onClick","t","useTranslation","gradientColor","useMemo","colors","hash","acc","char","formatLastAccessed","date","d","diffMs","diffMins","diffHours","diffDays","jsxs","jsx","Users","Clock","ChevronRight","ApplicationsListPage","navigate","useNavigate","currentTenant","isGlobalView","useTenant","applications","setApplications","useState","loading","setLoading","error","setError","viewMode","setViewMode","searchTerm","setSearchTerm","contextFilter","setContextFilter","statusFilter","setStatusFilter","fetchApplications","useCallback","data","adminApi","err","useEffect","contexts","unique","a","filteredApplications","app","matchesSearch","matchesContext","matchesStatus","handleApplicationClick","appId","Loader2","AlertTriangle","Breadcrumb","Search","e","ctx","LayoutGrid","LayoutList","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"ApplicationsListPage-JUX823bh.js","sources":["../../src/components/platform/administration/ApplicationCard.tsx","../../src/pages/platform/administration/applications/ApplicationsListPage.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ChevronRight, Users, Clock } from 'lucide-react';\r\n\r\ninterface ApplicationCardProps {\r\n readonly id: string;\r\n readonly name: string;\r\n readonly description?: string;\r\n readonly icon?: string;\r\n readonly isActive: boolean;\r\n readonly userCount?: number;\r\n readonly lastAccessedAt?: string;\r\n readonly onClick?: () => void;\r\n}\r\n\r\nexport const ApplicationCard: React.FC<ApplicationCardProps> = ({\r\n id: _id,\r\n name,\r\n description,\r\n icon,\r\n isActive,\r\n userCount,\r\n lastAccessedAt,\r\n onClick\r\n}) => {\r\n const { t } = useTranslation('admin');\r\n\r\n // Generate consistent gradient color based on application name\r\n const gradientColor = useMemo(() => {\r\n const colors = [\r\n 'from-blue-500 to-cyan-500',\r\n 'from-purple-500 to-pink-500',\r\n 'from-green-500 to-emerald-500',\r\n 'from-orange-500 to-red-500',\r\n 'from-indigo-500 to-blue-500',\r\n 'from-teal-500 to-green-500'\r\n ];\r\n const hash = name.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0);\r\n return colors[hash % colors.length];\r\n }, [name]);\r\n\r\n const formatLastAccessed = (date?: string) => {\r\n if (!date) return t('applications.card.never');\r\n const d = new Date(date);\r\n const now = new Date();\r\n const diffMs = now.getTime() - d.getTime();\r\n const diffMins = Math.floor(diffMs / 60000);\r\n const diffHours = Math.floor(diffMins / 60);\r\n const diffDays = Math.floor(diffHours / 24);\r\n\r\n if (diffMins < 1) return t('applications.card.justNow');\r\n if (diffMins < 60) return t('applications.card.minutesAgo', { count: diffMins });\r\n if (diffHours < 24) return t('applications.card.hoursAgo', { count: diffHours });\r\n if (diffDays < 7) return t('applications.card.daysAgo', { count: diffDays });\r\n return d.toLocaleDateString();\r\n };\r\n\r\n return (\r\n <button\r\n onClick={onClick}\r\n className=\"group relative overflow-hidden rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-6 text-left shadow-sm transition-all duration-300 hover:shadow-md hover:scale-105 hover:border-[var(--color-primary-600)]\"\r\n >\r\n {/* Background gradient accent */}\r\n <div className=\"absolute inset-0 opacity-0 transition-opacity duration-300 group-hover:opacity-5\">\r\n <div className={`absolute inset-0 bg-gradient-to-br ${gradientColor}`} />\r\n </div>\r\n\r\n <div className=\"relative z-10\">\r\n {/* Header with icon and status badge */}\r\n <div className=\"mb-4 flex items-start justify-between\">\r\n <div\r\n className={`flex h-12 w-12 items-center justify-center rounded-[var(--radius-button)] bg-gradient-to-br ${gradientColor} text-white text-lg font-bold`}\r\n >\r\n {icon && icon.length <= 2 ? icon : (name.charAt(0).toUpperCase())}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n {isActive && (\r\n <div className=\"flex items-center gap-1 rounded-full bg-[var(--success-bg)] px-2 py-1\">\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--success-text)]\" />\r\n <span className=\"text-xs font-medium text-[var(--success-text)]\">{t('applications.card.active')}</span>\r\n </div>\r\n )}\r\n {!isActive && (\r\n <div className=\"flex items-center gap-1 rounded-full bg-[var(--warning-bg)] px-2 py-1\">\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--warning-text)]\" />\r\n <span className=\"text-xs font-medium text-[var(--warning-text)]\">{t('applications.card.inactive')}</span>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Title */}\r\n <h3 className=\"mb-2 text-lg font-bold text-[var(--text-primary)]\">{name}</h3>\r\n\r\n {/* Description */}\r\n {description && (\r\n <p className=\"mb-4 line-clamp-2 text-sm text-[var(--text-secondary)]\">\r\n {description}\r\n </p>\r\n )}\r\n\r\n {/* Stats row */}\r\n <div className=\"mb-4 flex items-center gap-4 text-xs text-[var(--text-tertiary)]\">\r\n {userCount !== undefined && (\r\n <div className=\"flex items-center gap-1\">\r\n <Users className=\"h-4 w-4\" />\r\n <span>{userCount} {userCount !== 1 ? t('applications.card.users') : t('applications.card.user')}</span>\r\n </div>\r\n )}\r\n {lastAccessedAt && (\r\n <div className=\"flex items-center gap-1\">\r\n <Clock className=\"h-4 w-4\" />\r\n <span>{formatLastAccessed(lastAccessedAt)}</span>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* View button with arrow */}\r\n <div className=\"inline-flex items-center gap-2 rounded-[var(--radius-button)] bg-[var(--color-primary-600)] px-3 py-2 text-xs font-medium text-white transition-all duration-200 group-hover:gap-3\">\r\n {t('applications.card.viewDetails')}\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </div>\r\n </div>\r\n </button>\r\n );\r\n};\r\n","import React, { useEffect, useState, useMemo, useCallback } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { LayoutGrid, LayoutList, Search, AlertTriangle, Loader2 } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { ApplicationCard } from '@/components/platform/administration/ApplicationCard';\r\nimport { adminApi } from '@/services/api/adminApi';\r\nimport type { ApplicationListDto } from '@/services/api/adminApi';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\n\r\ntype ViewMode = 'cards' | 'table';\r\n\r\nexport const ApplicationsListPage: React.FC = () => {\r\n const navigate = useNavigate();\r\n const { t } = useTranslation('admin');\r\n const { currentTenant, isGlobalView } = useTenant();\r\n const [applications, setApplications] = useState<ApplicationListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [viewMode, setViewMode] = useState<ViewMode>('cards');\r\n const [searchTerm, setSearchTerm] = useState('');\r\n const [contextFilter, setContextFilter] = useState('');\r\n const [statusFilter, setStatusFilter] = useState('all');\r\n\r\n const fetchApplications = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const data = await adminApi.applications.getAll();\r\n setApplications(data);\r\n setError(null);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load applications');\r\n } finally {\r\n setLoading(false);\r\n }\r\n // TENANT ISOLATION: Re-fetch when tenant changes\r\n }, [currentTenant?.id, isGlobalView]);\r\n\r\n useEffect(() => {\r\n fetchApplications();\r\n }, [fetchApplications]);\r\n\r\n const contexts = useMemo(() => {\r\n const unique = new Set(applications.map(a => a.zone));\r\n return Array.from(unique).filter(Boolean) as string[];\r\n }, [applications]);\r\n\r\n const filteredApplications = useMemo(() => {\r\n return applications.filter(app => {\r\n const matchesSearch = app.label.toLowerCase().includes(searchTerm.toLowerCase()) ||\r\n (app.description?.toLowerCase().includes(searchTerm.toLowerCase()) ?? false);\r\n const matchesContext = !contextFilter || app.zone === contextFilter;\r\n const matchesStatus = statusFilter === 'all' ||\r\n (statusFilter === 'active' && app.isActive) ||\r\n (statusFilter === 'inactive' && !app.isActive);\r\n return matchesSearch && matchesContext && matchesStatus;\r\n });\r\n }, [applications, searchTerm, contextFilter, statusFilter]);\r\n\r\n const handleApplicationClick = (appId: string) => {\r\n navigate(`/administration/applications/${appId}`);\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex h-96 items-center justify-center\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"rounded-lg border border-[var(--error-border)] bg-[var(--error-bg)] p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <AlertTriangle className=\"h-5 w-5 text-[var(--error-text)]\" />\r\n <p className=\"text-[var(--error-text)]\">{error}</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('applications.title', 'Applications') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div>\r\n <h1 className=\"text-3xl font-bold text-[var(--text-primary)]\">{t('applications.list.heading')}</h1>\r\n <p className=\"mt-2 text-[var(--text-secondary)]\">\r\n {t('applications.list.description')}\r\n </p>\r\n </div>\r\n\r\n {/* Toolbar */}\r\n <div className=\"space-y-4 rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n {/* Search and filters row */}\r\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center\">\r\n {/* Search input */}\r\n <div className=\"flex-1 relative\">\r\n <Search className=\"absolute left-3 top-1/2 h-5 w-5 -translate-y-1/2 text-[var(--text-tertiary)]\" />\r\n <input\r\n type=\"text\"\r\n placeholder={t('applications.list.search')}\r\n value={searchTerm}\r\n onChange={(e) => setSearchTerm(e.target.value)}\r\n className=\"w-full rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] py-2 pl-10 pr-4 text-[var(--text-primary)] placeholder-[var(--text-tertiary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n />\r\n </div>\r\n\r\n {/* Filter dropdowns */}\r\n <select\r\n value={contextFilter}\r\n onChange={(e) => setContextFilter(e.target.value)}\r\n className=\"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n >\r\n <option value=\"\">{t('applications.list.allContexts')}</option>\r\n {contexts.map(ctx => (\r\n <option key={ctx} value={ctx}>{ctx}</option>\r\n ))}\r\n </select>\r\n\r\n <select\r\n value={statusFilter}\r\n onChange={(e) => setStatusFilter(e.target.value)}\r\n className=\"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n >\r\n <option value=\"all\">{t('applications.list.allStatus')}</option>\r\n <option value=\"active\">{t('applications.list.active')}</option>\r\n <option value=\"inactive\">{t('applications.list.inactive')}</option>\r\n </select>\r\n </div>\r\n\r\n {/* View mode toggle */}\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => setViewMode('cards')}\r\n className={`rounded-lg p-2 transition-all ${\r\n viewMode === 'cards'\r\n ? 'bg-[var(--color-primary-600)] text-white'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-tertiary)] hover:text-[var(--text-primary)]'\r\n }`}\r\n title={t('applications.list.cardView')}\r\n >\r\n <LayoutGrid className=\"h-5 w-5\" />\r\n </button>\r\n <button\r\n onClick={() => setViewMode('table')}\r\n className={`rounded-lg p-2 transition-all ${\r\n viewMode === 'table'\r\n ? 'bg-[var(--color-primary-600)] text-white'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-tertiary)] hover:text-[var(--text-primary)]'\r\n }`}\r\n title={t('applications.list.tableView')}\r\n >\r\n <LayoutList className=\"h-5 w-5\" />\r\n </button>\r\n <span className=\"ml-auto text-sm text-[var(--text-tertiary)]\">\r\n {t('applications.list.count', { count: filteredApplications.length })}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Content */}\r\n {filteredApplications.length === 0 && (\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-12 text-center\">\r\n <p className=\"text-[var(--text-secondary)]\">{t('applications.list.noResults')}</p>\r\n </div>\r\n )}\r\n {filteredApplications.length > 0 && viewMode === 'cards' && (\r\n // Card View\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6\">\r\n {filteredApplications.map((app) => (\r\n <ApplicationCard\r\n key={app.id}\r\n id={app.id}\r\n name={app.label}\r\n description={app.description ?? undefined}\r\n icon={app.icon ?? undefined}\r\n isActive={app.isActive}\r\n onClick={() => handleApplicationClick(app.id)}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n {filteredApplications.length > 0 && viewMode !== 'cards' && (\r\n // Table View\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">\r\n {t('applications.list.columns.application')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden md:table-cell\">\r\n {t('applications.list.columns.context')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">\r\n {t('applications.list.columns.modules')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">\r\n {t('applications.list.columns.status')}\r\n </th>\r\n <th className=\"w-24 px-4 py-3\"></th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {filteredApplications.map((app) => (\r\n <tr\r\n key={app.id}\r\n className=\"hover:bg-[var(--bg-hover)] transition-colors cursor-pointer group\"\r\n onClick={() => handleApplicationClick(app.id)}\r\n >\r\n <td className=\"px-4 py-3\">\r\n <p className=\"font-medium text-[var(--text-primary)] group-hover:text-[var(--color-accent-600)] transition-colors\">{app.label}</p>\r\n {app.description && (\r\n <p className=\"mt-0.5 text-xs text-[var(--text-tertiary)]\">{app.description}</p>\r\n )}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)] hidden md:table-cell\">\r\n {app.zone}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)] hidden lg:table-cell\">\r\n {app.modulesCount || 0}\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"inline-flex items-center gap-2 rounded-full px-2.5 py-0.5 text-xs font-medium\">\r\n {app.isActive ? (\r\n <>\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--success-text)]\" />\r\n <span className=\"text-[var(--success-text)]\">{t('applications.list.active')}</span>\r\n </>\r\n ) : (\r\n <>\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--warning-text)]\" />\r\n <span className=\"text-[var(--warning-text)]\">{t('applications.list.inactive')}</span>\r\n </>\r\n )}\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\" onClick={e => e.stopPropagation()}>\r\n <button\r\n onClick={() => handleApplicationClick(app.id)}\r\n className=\"inline-flex items-center justify-center rounded-lg bg-[var(--color-primary-600)] p-2 text-white transition-all hover:shadow-md\"\r\n >\r\n <span className=\"text-xs font-medium\">{t('applications.list.view')}</span>\r\n </button>\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n"],"names":["ApplicationCard","_id","name","description","icon","isActive","userCount","lastAccessedAt","onClick","t","useTranslation","gradientColor","useMemo","colors","hash","acc","char","formatLastAccessed","date","d","diffMs","diffMins","diffHours","diffDays","jsxs","jsx","Users","Clock","ChevronRight","ApplicationsListPage","navigate","useNavigate","currentTenant","isGlobalView","useTenant","applications","setApplications","useState","loading","setLoading","error","setError","viewMode","setViewMode","searchTerm","setSearchTerm","contextFilter","setContextFilter","statusFilter","setStatusFilter","fetchApplications","useCallback","data","adminApi","err","useEffect","contexts","unique","a","filteredApplications","app","matchesSearch","matchesContext","matchesStatus","handleApplicationClick","appId","Loader2","AlertTriangle","Breadcrumb","Search","e","ctx","LayoutGrid","LayoutList","Fragment"],"mappings":";;;;;;AAeO,MAAMA,IAAkD,CAAC;AAAA,EAC9D,IAAIC;AAAA,EACJ,MAAAC;AAAA,EACA,aAAAC;AAAA,EACA,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,SAAAC;AACF,MAAM;AACJ,QAAM,EAAE,GAAAC,EAAA,IAAMC,EAAe,OAAO,GAG9BC,IAAgBC,EAAQ,MAAM;AAClC,UAAMC,IAAS;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,GAEIC,IAAOZ,EAAK,MAAM,EAAE,EAAE,OAAO,CAACa,GAAKC,MAASD,IAAMC,EAAK,WAAW,CAAC,GAAG,CAAC;AAC7E,WAAOH,EAAOC,IAAOD,EAAO,MAAM;AAAA,EACpC,GAAG,CAACX,CAAI,CAAC,GAEHe,IAAqB,CAACC,MAAkB;AAC5C,QAAI,CAACA,EAAM,QAAOT,EAAE,yBAAyB;AAC7C,UAAMU,IAAI,IAAI,KAAKD,CAAI,GAEjBE,yBADU,KAAA,GACG,QAAA,IAAYD,EAAE,QAAA,GAC3BE,IAAW,KAAK,MAAMD,IAAS,GAAK,GACpCE,IAAY,KAAK,MAAMD,IAAW,EAAE,GACpCE,IAAW,KAAK,MAAMD,IAAY,EAAE;AAE1C,WAAID,IAAW,IAAUZ,EAAE,2BAA2B,IAClDY,IAAW,KAAWZ,EAAE,gCAAgC,EAAE,OAAOY,GAAU,IAC3EC,IAAY,KAAWb,EAAE,8BAA8B,EAAE,OAAOa,GAAW,IAC3EC,IAAW,IAAUd,EAAE,6BAA6B,EAAE,OAAOc,GAAU,IACpEJ,EAAE,mBAAA;AAAA,EACX;AAEA,SACE,gBAAAK;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,SAAAhB;AAAA,MACA,WAAU;AAAA,MAGV,UAAA;AAAA,QAAA,gBAAAiB,EAAC,OAAA,EAAI,WAAU,oFACb,UAAA,gBAAAA,EAAC,SAAI,WAAW,sCAAsCd,CAAa,GAAA,CAAI,EAAA,CACzE;AAAA,QAEA,gBAAAa,EAAC,OAAA,EAAI,WAAU,iBAEb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA;AAAA,YAAA,gBAAAC;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW,+FAA+Fd,CAAa;AAAA,gBAEtH,UAAAP,KAAQA,EAAK,UAAU,IAAIA,IAAQF,EAAK,OAAO,CAAC,EAAE,YAAA;AAAA,cAAY;AAAA,YAAA;AAAA,YAGjE,gBAAAsB,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,cAAAnB,KACC,gBAAAmB,EAAC,OAAA,EAAI,WAAU,yEACb,UAAA;AAAA,gBAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,gDAAA,CAAgD;AAAA,kCAC9D,QAAA,EAAK,WAAU,kDAAkD,UAAAhB,EAAE,0BAA0B,EAAA,CAAE;AAAA,cAAA,GAClG;AAAA,cAED,CAACJ,KACA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,yEACb,UAAA;AAAA,gBAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,gDAAA,CAAgD;AAAA,kCAC9D,QAAA,EAAK,WAAU,kDAAkD,UAAAhB,EAAE,4BAA4B,EAAA,CAAE;AAAA,cAAA,EAAA,CACpG;AAAA,YAAA,EAAA,CAEJ;AAAA,UAAA,GACF;AAAA,UAGA,gBAAAgB,EAAC,MAAA,EAAG,WAAU,qDAAqD,UAAAvB,GAAK;AAAA,UAGvEC,KACC,gBAAAsB,EAAC,KAAA,EAAE,WAAU,0DACV,UAAAtB,GACH;AAAA,UAIF,gBAAAqB,EAAC,OAAA,EAAI,WAAU,oEACZ,UAAA;AAAA,YAAAlB,MAAc,UACb,gBAAAkB,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,cAAA,gBAAAC,EAACC,GAAA,EAAM,WAAU,UAAA,CAAU;AAAA,gCAC1B,QAAA,EAAM,UAAA;AAAA,gBAAApB;AAAA,gBAAU;AAAA,gBAAoBG,EAAlBH,MAAc,IAAM,4BAA+B,wBAAN;AAAA,cAA8B,EAAA,CAAE;AAAA,YAAA,GAClG;AAAA,YAEDC,KACC,gBAAAiB,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,cAAA,gBAAAC,EAACE,GAAA,EAAM,WAAU,UAAA,CAAU;AAAA,cAC3B,gBAAAF,EAAC,QAAA,EAAM,UAAAR,EAAmBV,CAAc,EAAA,CAAE;AAAA,YAAA,EAAA,CAC5C;AAAA,UAAA,GAEJ;AAAA,UAGA,gBAAAiB,EAAC,OAAA,EAAI,WAAU,sLACZ,UAAA;AAAA,YAAAf,EAAE,+BAA+B;AAAA,YAClC,gBAAAgB,EAACG,GAAA,EAAa,WAAU,UAAA,CAAU;AAAA,UAAA,EAAA,CACpC;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN,GClHaC,IAAiC,MAAM;AAClD,QAAMC,IAAWC,EAAA,GACX,EAAE,GAAAtB,EAAA,IAAMC,EAAe,OAAO,GAC9B,EAAE,eAAAsB,GAAe,cAAAC,EAAA,IAAiBC,EAAA,GAClC,CAACC,GAAcC,CAAe,IAAIC,EAA+B,CAAA,CAAE,GACnE,CAACC,GAASC,CAAU,IAAIF,EAAS,EAAI,GACrC,CAACG,GAAOC,CAAQ,IAAIJ,EAAwB,IAAI,GAChD,CAACK,GAAUC,CAAW,IAAIN,EAAmB,OAAO,GACpD,CAACO,GAAYC,CAAa,IAAIR,EAAS,EAAE,GACzC,CAACS,GAAeC,CAAgB,IAAIV,EAAS,EAAE,GAC/C,CAACW,GAAcC,CAAe,IAAIZ,EAAS,KAAK,GAEhDa,IAAoBC,EAAY,YAAY;AAChD,QAAI;AACF,MAAAZ,EAAW,EAAI;AACf,YAAMa,IAAO,MAAMC,EAAS,aAAa,OAAA;AACzC,MAAAjB,EAAgBgB,CAAI,GACpBX,EAAS,IAAI;AAAA,IACf,SAASa,GAAK;AACZ,MAAAb,EAASa,aAAe,QAAQA,EAAI,UAAU,6BAA6B;AAAA,IAC7E,UAAA;AACE,MAAAf,EAAW,EAAK;AAAA,IAClB;AAAA,EAEF,GAAG,CAACP,GAAe,IAAIC,CAAY,CAAC;AAEpC,EAAAsB,EAAU,MAAM;AACd,IAAAL,EAAA;AAAA,EACF,GAAG,CAACA,CAAiB,CAAC;AAEtB,QAAMM,IAAW5C,EAAQ,MAAM;AAC7B,UAAM6C,IAAS,IAAI,IAAItB,EAAa,IAAI,CAAAuB,MAAKA,EAAE,IAAI,CAAC;AACpD,WAAO,MAAM,KAAKD,CAAM,EAAE,OAAO,OAAO;AAAA,EAC1C,GAAG,CAACtB,CAAY,CAAC,GAEXwB,IAAuB/C,EAAQ,MAC5BuB,EAAa,OAAO,CAAAyB,MAAO;AAChC,UAAMC,IAAgBD,EAAI,MAAM,cAAc,SAAShB,EAAW,YAAA,CAAa,MAC1DgB,EAAI,aAAa,cAAc,SAAShB,EAAW,YAAA,CAAa,KAAK,KACpFkB,IAAiB,CAAChB,KAAiBc,EAAI,SAASd,GAChDiB,IAAgBf,MAAiB,SAClBA,MAAiB,YAAYY,EAAI,YACjCZ,MAAiB,cAAc,CAACY,EAAI;AACzD,WAAOC,KAAiBC,KAAkBC;AAAA,EAC5C,CAAC,GACA,CAAC5B,GAAcS,GAAYE,GAAeE,CAAY,CAAC,GAEpDgB,IAAyB,CAACC,MAAkB;AAChD,IAAAnC,EAAS,gCAAgCmC,CAAK,EAAE;AAAA,EAClD;AAEA,SAAI3B,IAEA,gBAAAb,EAAC,SAAI,WAAU,yCACb,4BAACyC,GAAA,EAAQ,WAAU,wDAAuD,EAAA,CAC5E,IAIA1B,sBAEC,OAAA,EAAI,WAAU,2EACb,UAAA,gBAAAhB,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,IAAA,gBAAAC,EAAC0C,GAAA,EAAc,WAAU,mCAAA,CAAmC;AAAA,IAC5D,gBAAA1C,EAAC,KAAA,EAAE,WAAU,4BAA4B,UAAAe,EAAA,CAAM;AAAA,EAAA,EAAA,CACjD,EAAA,CACF,IAKF,gBAAAhB,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAAC2C;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO3D,EAAE,cAAc,GAAG,MAAM,kBAAA;AAAA,UAClC,EAAE,OAAOA,EAAE,sBAAsB,cAAc,EAAA;AAAA,QAAE;AAAA,MACnD;AAAA,IAAA;AAAA,sBAID,OAAA,EACC,UAAA;AAAA,MAAA,gBAAAgB,EAAC,MAAA,EAAG,WAAU,iDAAiD,UAAAhB,EAAE,2BAA2B,GAAE;AAAA,wBAC7F,KAAA,EAAE,WAAU,qCACV,UAAAA,EAAE,+BAA+B,EAAA,CACpC;AAAA,IAAA,GACF;AAAA,IAGA,gBAAAe,EAAC,OAAA,EAAI,WAAU,2GAEb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,mDAEb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,mBACb,UAAA;AAAA,UAAA,gBAAAC,EAAC4C,GAAA,EAAO,WAAU,+EAAA,CAA+E;AAAA,UACjG,gBAAA5C;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,aAAahB,EAAE,0BAA0B;AAAA,cACzC,OAAOmC;AAAA,cACP,UAAU,CAAC0B,MAAMzB,EAAcyB,EAAE,OAAO,KAAK;AAAA,cAC7C,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,GACF;AAAA,QAGA,gBAAA9C;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAOsB;AAAA,YACP,UAAU,CAACwB,MAAMvB,EAAiBuB,EAAE,OAAO,KAAK;AAAA,YAChD,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAA7C,EAAC,UAAA,EAAO,OAAM,IAAI,UAAAhB,EAAE,+BAA+B,GAAE;AAAA,cACpD+C,EAAS,IAAI,CAAAe,MACZ,gBAAA9C,EAAC,YAAiB,OAAO8C,GAAM,UAAAA,EAAA,GAAlBA,CAAsB,CACpC;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGH,gBAAA/C;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAOwB;AAAA,YACP,UAAU,CAACsB,MAAMrB,EAAgBqB,EAAE,OAAO,KAAK;AAAA,YAC/C,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAA7C,EAAC,UAAA,EAAO,OAAM,OAAO,UAAAhB,EAAE,6BAA6B,GAAE;AAAA,gCACrD,UAAA,EAAO,OAAM,UAAU,UAAAA,EAAE,0BAA0B,GAAE;AAAA,gCACrD,UAAA,EAAO,OAAM,YAAY,UAAAA,EAAE,4BAA4B,EAAA,CAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAC5D,GACF;AAAA,MAGA,gBAAAe,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAMkB,EAAY,OAAO;AAAA,YAClC,WAAW,iCACTD,MAAa,UACT,6CACA,uFACN;AAAA,YACA,OAAOjC,EAAE,4BAA4B;AAAA,YAErC,UAAA,gBAAAgB,EAAC+C,GAAA,EAAW,WAAU,UAAA,CAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAElC,gBAAA/C;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAMkB,EAAY,OAAO;AAAA,YAClC,WAAW,iCACTD,MAAa,UACT,6CACA,uFACN;AAAA,YACA,OAAOjC,EAAE,6BAA6B;AAAA,YAEtC,UAAA,gBAAAgB,EAACgD,GAAA,EAAW,WAAU,UAAA,CAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAElC,gBAAAhD,EAAC,QAAA,EAAK,WAAU,+CACb,UAAAhB,EAAE,2BAA2B,EAAE,OAAOkD,EAAqB,OAAA,CAAQ,EAAA,CACtE;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAGCA,EAAqB,WAAW,KAC/B,gBAAAlC,EAAC,SAAI,WAAU,8GACb,UAAA,gBAAAA,EAAC,KAAA,EAAE,WAAU,gCAAgC,UAAAhB,EAAE,6BAA6B,GAAE,GAChF;AAAA,IAEDkD,EAAqB,SAAS,KAAKjB,MAAa;AAAA,sBAE9C,OAAA,EAAI,WAAU,wDACZ,UAAAiB,EAAqB,IAAI,CAACC,MACzB,gBAAAnC;AAAA,MAACzB;AAAA,MAAA;AAAA,QAEC,IAAI4D,EAAI;AAAA,QACR,MAAMA,EAAI;AAAA,QACV,aAAaA,EAAI,eAAe;AAAA,QAChC,MAAMA,EAAI,QAAQ;AAAA,QAClB,UAAUA,EAAI;AAAA,QACd,SAAS,MAAMI,EAAuBJ,EAAI,EAAE;AAAA,MAAA;AAAA,MANvCA,EAAI;AAAA,IAAA,CAQZ,GACH;AAAA,IAEDD,EAAqB,SAAS,KAAKjB,MAAa;AAAA,sBAE9C,OAAA,EAAI,WAAU,wBACb,UAAA,gBAAAlB,EAAC,SAAA,EAAM,WAAU,UACf,UAAA;AAAA,MAAA,gBAAAC,EAAC,SAAA,EACC,UAAA,gBAAAD,EAAC,MAAA,EAAG,WAAU,4BACZ,UAAA;AAAA,QAAA,gBAAAC,EAAC,MAAA,EAAG,WAAU,kGACX,UAAAhB,EAAE,uCAAuC,GAC5C;AAAA,0BACC,MAAA,EAAG,WAAU,uHACX,UAAAA,EAAE,mCAAmC,GACxC;AAAA,0BACC,MAAA,EAAG,WAAU,uHACX,UAAAA,EAAE,mCAAmC,GACxC;AAAA,0BACC,MAAA,EAAG,WAAU,kGACX,UAAAA,EAAE,kCAAkC,GACvC;AAAA,QACA,gBAAAgB,EAAC,MAAA,EAAG,WAAU,iBAAA,CAAiB;AAAA,MAAA,EAAA,CACjC,EAAA,CACF;AAAA,wBACC,SAAA,EAAM,WAAU,yCACd,UAAAkC,EAAqB,IAAI,CAACC,MACzB,gBAAApC;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAU;AAAA,UACV,SAAS,MAAMwC,EAAuBJ,EAAI,EAAE;AAAA,UAE5C,UAAA;AAAA,YAAA,gBAAApC,EAAC,MAAA,EAAG,WAAU,aACZ,UAAA;AAAA,cAAA,gBAAAC,EAAC,KAAA,EAAE,WAAU,uGAAuG,UAAAmC,EAAI,OAAM;AAAA,cAC7HA,EAAI,eACH,gBAAAnC,EAAC,OAAE,WAAU,8CAA8C,YAAI,YAAA,CAAY;AAAA,YAAA,GAE/E;AAAA,YACA,gBAAAA,EAAC,MAAA,EAAG,WAAU,uEACX,YAAI,MACP;AAAA,8BACC,MAAA,EAAG,WAAU,uEACX,UAAAmC,EAAI,gBAAgB,GACvB;AAAA,YACA,gBAAAnC,EAAC,MAAA,EAAG,WAAU,aACZ,UAAA,gBAAAA,EAAC,SAAI,WAAU,iFACZ,UAAAmC,EAAI,WACH,gBAAApC,EAAAkD,GAAA,EACE,UAAA;AAAA,cAAA,gBAAAjD,EAAC,OAAA,EAAI,WAAU,gDAAA,CAAgD;AAAA,gCAC9D,QAAA,EAAK,WAAU,8BAA8B,UAAAhB,EAAE,0BAA0B,EAAA,CAAE;AAAA,YAAA,EAAA,CAC9E,IAEA,gBAAAe,EAAAkD,GAAA,EACE,UAAA;AAAA,cAAA,gBAAAjD,EAAC,OAAA,EAAI,WAAU,gDAAA,CAAgD;AAAA,gCAC9D,QAAA,EAAK,WAAU,8BAA8B,UAAAhB,EAAE,4BAA4B,EAAA,CAAE;AAAA,YAAA,EAAA,CAChF,GAEJ,GACF;AAAA,YACA,gBAAAgB,EAAC,QAAG,WAAU,aAAY,SAAS,CAAA6C,MAAKA,EAAE,mBACxC,UAAA,gBAAA7C;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,MAAMuC,EAAuBJ,EAAI,EAAE;AAAA,gBAC5C,WAAU;AAAA,gBAEV,4BAAC,QAAA,EAAK,WAAU,uBAAuB,UAAAnD,EAAE,wBAAwB,EAAA,CAAE;AAAA,cAAA;AAAA,YAAA,EACrE,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,QAtCKmD,EAAI;AAAA,MAAA,CAwCZ,EAAA,CACH;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),x=require("react"),N=require("react-i18next"),s=require("lucide-react"),q=require("react-router-dom"),j=require("./index-2wUhd9Lu.js"),R=require("./accessRequestsApi-DZeDvzwv.js"),A=require("./useUserAccessRequests-DjPQenC2.js");function P({applicationId:i,tenantId:t,existingStatus:c,onSuccess:m}){const{t:n}=N.useTranslation("admin"),[o,g]=x.useState(!1),[l,a]=x.useState(!1),[d,v]=x.useState(""),[b,h]=x.useState(!1),f=async()=>{g(!0);try{await R.accessRequestsApi.createRequest(t,i,{applicationId:i,reason:d||void 0}),a(!1),v(""),h(!0),m?.()}catch(r){console.error("Failed to create access request:",r)}finally{g(!1)}};return b||c==="Pending"?e.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-amber-500/10 text-amber-600 border border-amber-500/30 cursor-default",children:[e.jsx(s.Clock,{className:"w-4 h-4"}),n("accessRequests.pendingLabel","Request pending")]}):e.jsxs("div",{children:[e.jsxs("button",{onClick:()=>a(!0),className:"inline-flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)]",children:[c==="Denied"?e.jsx(s.RefreshCw,{className:"w-4 h-4"}):e.jsx(s.LogIn,{className:"w-4 h-4"}),c==="Denied"?n("accessRequests.retryAccess","Retry request"):n("accessRequests.requestAccess")]}),l&&e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm",children:e.jsxs("div",{className:"bg-[var(--bg-primary)] rounded-[var(--radius-card)] p-6 max-w-md w-full",children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsx("h3",{className:"text-lg font-semibold",children:n("accessRequests.modal.requestTitle")}),e.jsx("button",{onClick:()=>a(!1),className:"p-1 hover:bg-[var(--bg-hover)] rounded",disabled:o,children:e.jsx(s.X,{className:"w-5 h-5"})})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block font-medium mb-2",children:n("accessRequests.modal.reasonLabel")}),e.jsx("textarea",{value:d,onChange:r=>v(r.target.value),className:"w-full px-3 py-2 border rounded-[var(--radius-input)] bg-[var(--bg-primary)] border-[var(--border-color)]",rows:3,placeholder:n("accessRequests.modal.reasonPlaceholder")})]}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{onClick:()=>a(!1),className:"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] hover:bg-[var(--bg-hover)]",disabled:o,children:n("common:cancel")}),e.jsxs("button",{onClick:f,disabled:o,className:"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] disabled:opacity-50 flex items-center gap-2",children:[o&&e.jsx(s.Loader2,{className:"w-4 h-4 animate-spin"}),n("common:submit")]})]})]})]})})]})}const k={lifebuoy:s.LifeBuoy,briefcase:s.Briefcase,file:s.FileText,box:s.Box};function C(i){return i&&k[i.toLowerCase()]||s.Box}const w=x.memo(function({app:t,isFavorite:c,onToggleFavorite:m,buildUrl:n,tenantId:o,existingRequestStatus:g,onAccessRequested:l}){const{t:a}=N.useTranslation("navigation"),d=C(t.icon),v=t.accessLevel==="RequestAccess"&&t.modules.length===0,b=x.useCallback(h=>{h.preventDefault(),h.stopPropagation(),m()},[m]);return v?e.jsx("div",{className:"group relative bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden hover:border-[var(--warning-border)] transition-all duration-300 hover:shadow-lg",children:e.jsxs("div",{className:"block p-6",children:[e.jsxs("div",{className:"flex items-start justify-between mb-4",children:[e.jsx("div",{className:"w-14 h-14 rounded-xl bg-[var(--warning-bg)] flex items-center justify-center",children:e.jsx(d,{className:"w-7 h-7 text-[var(--warning-text)]"})}),e.jsx("div",{className:"p-2 rounded-lg bg-[var(--warning-bg)] text-[var(--warning-text)]",children:e.jsx(s.Lock,{className:"w-5 h-5"})})]}),e.jsx("h3",{className:"text-lg font-semibold text-[var(--text-primary)] mb-2",children:t.label}),e.jsx("p",{className:"text-sm text-[var(--warning-text)] opacity-80 mb-4",children:a("applicationsPage.requestAccessDesc","Restricted access - request required")}),o&&e.jsx(P,{applicationId:t.id,tenantId:o,existingStatus:g,onSuccess:l})]})}):e.jsx("div",{className:"group relative bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden hover:border-[var(--color-accent-400)] transition-all duration-300 hover:shadow-lg",children:e.jsxs(q.Link,{to:t.route?n(t.route):"#",className:"block p-6",children:[e.jsxs("div",{className:"flex items-start justify-between mb-4",children:[e.jsx("div",{className:"w-14 h-14 rounded-xl bg-[var(--accent-bg)] flex items-center justify-center group-hover:opacity-90 transition-all",children:e.jsx(d,{className:"w-7 h-7 text-[var(--color-accent-500)]"})}),e.jsx("button",{onClick:b,className:`p-2 rounded-lg transition-all duration-200 ${c?"text-[var(--warning-text)] bg-[var(--warning-bg)]":"text-[var(--text-tertiary)] opacity-0 group-hover:opacity-100 hover:bg-[var(--bg-tertiary)]"}`,title:c?a("applicationsPage.removeFavorite","Remove from favorites"):a("applicationsPage.addFavorite","Add to favorites"),children:e.jsx(s.Star,{className:`w-5 h-5 ${c?"fill-current":""}`})})]}),e.jsx("h3",{className:"text-lg font-semibold text-[var(--text-primary)] mb-2",children:t.label}),e.jsxs("p",{className:"text-sm text-[var(--text-secondary)] mb-4",children:[t.modules.length," ",t.modules.length===1?a("applicationsPage.moduleCount_one","module"):a("applicationsPage.moduleCount_other","modules")]}),e.jsxs("div",{className:"flex items-center gap-2 text-[var(--color-accent-500)] text-sm font-medium opacity-0 group-hover:opacity-100 transition-opacity",children:[a("applicationsPage.open","Open"),e.jsx(s.ArrowRight,{className:"w-4 h-4"})]})]})})});function S(){const{t:i}=N.useTranslation("navigation"),{favorites:t,menu:c,toggleFavorite:m,isFavorite:n,isLoading:o,refreshMenu:g}=j.useNavigation(),{currentTenant:l}=j.useTenant(),a=j.useTenantUrl(),{requests:d,reload:v}=A.useUserAccessRequests(),b=c?.applications||[],h=x.useCallback(r=>{const u=d.filter(p=>p.applicationId===r&&p.tenantId===l?.id);return u.find(p=>p.status==="Pending")?"Pending":u.find(p=>p.status==="Denied")?"Denied":null},[d,l?.id]),f=x.useCallback(()=>{g(),v()},[g,v]);return o?e.jsx("div",{className:"flex items-center justify-center min-h-[400px]",children:e.jsx("div",{className:"w-8 h-8 border-2 border-[var(--color-accent-500)] border-t-transparent rounded-full animate-spin"})}):e.jsxs("div",{className:"space-y-8",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-[var(--text-primary)]",children:i("applicationsPage.title","Applications")}),e.jsx("p",{className:"text-[var(--text-secondary)] mt-1",children:i("applicationsPage.subtitle","Your available applications")})]}),t.length>0&&e.jsxs("section",{children:[e.jsxs("h2",{className:"text-lg font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2",children:[e.jsx(s.Star,{className:"w-5 h-5 text-[var(--warning-text)] fill-[var(--warning-text)]"}),i("applicationsPage.favorites","Favorites")]}),e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:t.map(r=>{const u=b.find(y=>y.id===r.id);return u?e.jsx(w,{app:u,isFavorite:!0,onToggleFavorite:()=>m(u.id),buildUrl:a,tenantId:l?.id,existingRequestStatus:h(u.id),onAccessRequested:f},u.id):null})})]}),e.jsxs("section",{children:[e.jsx("h2",{className:"text-lg font-semibold text-[var(--text-primary)] mb-4",children:i("applicationsPage.all","All applications")}),b.length>0?e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:b.map(r=>e.jsx(w,{app:r,isFavorite:n(r.id),onToggleFavorite:()=>m(r.id),buildUrl:a,tenantId:l?.id,existingRequestStatus:h(r.id),onAccessRequested:f},r.id))}):e.jsxs("div",{className:"text-center py-12 bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)]",children:[e.jsx(s.Box,{className:"w-12 h-12 text-[var(--text-tertiary)] mx-auto mb-4"}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:i("applicationsPage.noApps","No applications available")})]})]})]})}exports.ApplicationsPage=S;
2
- //# sourceMappingURL=ApplicationsPage-BCbgotIx.js.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),x=require("react"),N=require("react-i18next"),s=require("lucide-react"),q=require("react-router-dom"),j=require("./index-IgLVXPg8.js"),R=require("./accessRequestsApi-B-4TJ5_U.js"),A=require("./useUserAccessRequests-BYbmG4c7.js");function P({applicationId:i,tenantId:t,existingStatus:c,onSuccess:m}){const{t:n}=N.useTranslation("admin"),[o,g]=x.useState(!1),[l,a]=x.useState(!1),[d,v]=x.useState(""),[b,h]=x.useState(!1),f=async()=>{g(!0);try{await R.accessRequestsApi.createRequest(t,i,{applicationId:i,reason:d||void 0}),a(!1),v(""),h(!0),m?.()}catch(r){console.error("Failed to create access request:",r)}finally{g(!1)}};return b||c==="Pending"?e.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-amber-500/10 text-amber-600 border border-amber-500/30 cursor-default",children:[e.jsx(s.Clock,{className:"w-4 h-4"}),n("accessRequests.pendingLabel","Request pending")]}):e.jsxs("div",{children:[e.jsxs("button",{onClick:()=>a(!0),className:"inline-flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)]",children:[c==="Denied"?e.jsx(s.RefreshCw,{className:"w-4 h-4"}):e.jsx(s.LogIn,{className:"w-4 h-4"}),c==="Denied"?n("accessRequests.retryAccess","Retry request"):n("accessRequests.requestAccess")]}),l&&e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm",children:e.jsxs("div",{className:"bg-[var(--bg-primary)] rounded-[var(--radius-card)] p-6 max-w-md w-full",children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsx("h3",{className:"text-lg font-semibold",children:n("accessRequests.modal.requestTitle")}),e.jsx("button",{onClick:()=>a(!1),className:"p-1 hover:bg-[var(--bg-hover)] rounded",disabled:o,children:e.jsx(s.X,{className:"w-5 h-5"})})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block font-medium mb-2",children:n("accessRequests.modal.reasonLabel")}),e.jsx("textarea",{value:d,onChange:r=>v(r.target.value),className:"w-full px-3 py-2 border rounded-[var(--radius-input)] bg-[var(--bg-primary)] border-[var(--border-color)]",rows:3,placeholder:n("accessRequests.modal.reasonPlaceholder")})]}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{onClick:()=>a(!1),className:"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] hover:bg-[var(--bg-hover)]",disabled:o,children:n("common:cancel")}),e.jsxs("button",{onClick:f,disabled:o,className:"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] disabled:opacity-50 flex items-center gap-2",children:[o&&e.jsx(s.Loader2,{className:"w-4 h-4 animate-spin"}),n("common:submit")]})]})]})]})})]})}const k={lifebuoy:s.LifeBuoy,briefcase:s.Briefcase,file:s.FileText,box:s.Box};function C(i){return i&&k[i.toLowerCase()]||s.Box}const w=x.memo(function({app:t,isFavorite:c,onToggleFavorite:m,buildUrl:n,tenantId:o,existingRequestStatus:g,onAccessRequested:l}){const{t:a}=N.useTranslation("navigation"),d=C(t.icon),v=t.accessLevel==="RequestAccess"&&t.modules.length===0,b=x.useCallback(h=>{h.preventDefault(),h.stopPropagation(),m()},[m]);return v?e.jsx("div",{className:"group relative bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden hover:border-[var(--warning-border)] transition-all duration-300 hover:shadow-lg",children:e.jsxs("div",{className:"block p-6",children:[e.jsxs("div",{className:"flex items-start justify-between mb-4",children:[e.jsx("div",{className:"w-14 h-14 rounded-xl bg-[var(--warning-bg)] flex items-center justify-center",children:e.jsx(d,{className:"w-7 h-7 text-[var(--warning-text)]"})}),e.jsx("div",{className:"p-2 rounded-lg bg-[var(--warning-bg)] text-[var(--warning-text)]",children:e.jsx(s.Lock,{className:"w-5 h-5"})})]}),e.jsx("h3",{className:"text-lg font-semibold text-[var(--text-primary)] mb-2",children:t.label}),e.jsx("p",{className:"text-sm text-[var(--warning-text)] opacity-80 mb-4",children:a("applicationsPage.requestAccessDesc","Restricted access - request required")}),o&&e.jsx(P,{applicationId:t.id,tenantId:o,existingStatus:g,onSuccess:l})]})}):e.jsx("div",{className:"group relative bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden hover:border-[var(--color-accent-400)] transition-all duration-300 hover:shadow-lg",children:e.jsxs(q.Link,{to:t.route?n(t.route):"#",className:"block p-6",children:[e.jsxs("div",{className:"flex items-start justify-between mb-4",children:[e.jsx("div",{className:"w-14 h-14 rounded-xl bg-[var(--accent-bg)] flex items-center justify-center group-hover:opacity-90 transition-all",children:e.jsx(d,{className:"w-7 h-7 text-[var(--color-accent-500)]"})}),e.jsx("button",{onClick:b,className:`p-2 rounded-lg transition-all duration-200 ${c?"text-[var(--warning-text)] bg-[var(--warning-bg)]":"text-[var(--text-tertiary)] opacity-0 group-hover:opacity-100 hover:bg-[var(--bg-tertiary)]"}`,title:c?a("applicationsPage.removeFavorite","Remove from favorites"):a("applicationsPage.addFavorite","Add to favorites"),children:e.jsx(s.Star,{className:`w-5 h-5 ${c?"fill-current":""}`})})]}),e.jsx("h3",{className:"text-lg font-semibold text-[var(--text-primary)] mb-2",children:t.label}),e.jsxs("p",{className:"text-sm text-[var(--text-secondary)] mb-4",children:[t.modules.length," ",t.modules.length===1?a("applicationsPage.moduleCount_one","module"):a("applicationsPage.moduleCount_other","modules")]}),e.jsxs("div",{className:"flex items-center gap-2 text-[var(--color-accent-500)] text-sm font-medium opacity-0 group-hover:opacity-100 transition-opacity",children:[a("applicationsPage.open","Open"),e.jsx(s.ArrowRight,{className:"w-4 h-4"})]})]})})});function S(){const{t:i}=N.useTranslation("navigation"),{favorites:t,menu:c,toggleFavorite:m,isFavorite:n,isLoading:o,refreshMenu:g}=j.useNavigation(),{currentTenant:l}=j.useTenant(),a=j.useTenantUrl(),{requests:d,reload:v}=A.useUserAccessRequests(),b=c?.applications||[],h=x.useCallback(r=>{const u=d.filter(p=>p.applicationId===r&&p.tenantId===l?.id);return u.find(p=>p.status==="Pending")?"Pending":u.find(p=>p.status==="Denied")?"Denied":null},[d,l?.id]),f=x.useCallback(()=>{g(),v()},[g,v]);return o?e.jsx("div",{className:"flex items-center justify-center min-h-[400px]",children:e.jsx("div",{className:"w-8 h-8 border-2 border-[var(--color-accent-500)] border-t-transparent rounded-full animate-spin"})}):e.jsxs("div",{className:"space-y-8",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-[var(--text-primary)]",children:i("applicationsPage.title","Applications")}),e.jsx("p",{className:"text-[var(--text-secondary)] mt-1",children:i("applicationsPage.subtitle","Your available applications")})]}),t.length>0&&e.jsxs("section",{children:[e.jsxs("h2",{className:"text-lg font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2",children:[e.jsx(s.Star,{className:"w-5 h-5 text-[var(--warning-text)] fill-[var(--warning-text)]"}),i("applicationsPage.favorites","Favorites")]}),e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:t.map(r=>{const u=b.find(y=>y.id===r.id);return u?e.jsx(w,{app:u,isFavorite:!0,onToggleFavorite:()=>m(u.id),buildUrl:a,tenantId:l?.id,existingRequestStatus:h(u.id),onAccessRequested:f},u.id):null})})]}),e.jsxs("section",{children:[e.jsx("h2",{className:"text-lg font-semibold text-[var(--text-primary)] mb-4",children:i("applicationsPage.all","All applications")}),b.length>0?e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:b.map(r=>e.jsx(w,{app:r,isFavorite:n(r.id),onToggleFavorite:()=>m(r.id),buildUrl:a,tenantId:l?.id,existingRequestStatus:h(r.id),onAccessRequested:f},r.id))}):e.jsxs("div",{className:"text-center py-12 bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)]",children:[e.jsx(s.Box,{className:"w-12 h-12 text-[var(--text-tertiary)] mx-auto mb-4"}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:i("applicationsPage.noApps","No applications available")})]})]})]})}exports.ApplicationsPage=S;
2
+ //# sourceMappingURL=ApplicationsPage-6zgFye6w.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ApplicationsPage-BCbgotIx.js","sources":["../../src/components/platform/administration/access-requests/RequestAccessButton.tsx","../../src/pages/ApplicationsPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { LogIn, Loader2, X, Clock, RefreshCw } from 'lucide-react';\r\nimport { accessRequestsApi } from '@/services/api/accessRequestsApi';\r\n\r\ninterface RequestAccessButtonProps {\r\n readonly applicationId: string;\r\n readonly tenantId: string;\r\n readonly existingStatus?: 'Pending' | 'Denied' | null;\r\n readonly onSuccess?: () => void;\r\n}\r\n\r\nexport function RequestAccessButton({ applicationId, tenantId, existingStatus, onSuccess }: RequestAccessButtonProps): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const [loading, setLoading] = useState(false);\r\n const [showReasonModal, setShowReasonModal] = useState(false);\r\n const [reason, setReason] = useState('');\r\n const [justSubmitted, setJustSubmitted] = useState(false);\r\n\r\n const handleRequest = async () => {\r\n setLoading(true);\r\n try {\r\n await accessRequestsApi.createRequest(tenantId, applicationId, {\r\n applicationId,\r\n reason: reason || undefined,\r\n });\r\n setShowReasonModal(false);\r\n setReason('');\r\n setJustSubmitted(true);\r\n onSuccess?.();\r\n } catch (err) {\r\n console.error('Failed to create access request:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n // After successful submission or existing pending request, show pending state\r\n if (justSubmitted || existingStatus === 'Pending') {\r\n return (\r\n <div className=\"inline-flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-amber-500/10 text-amber-600 border border-amber-500/30 cursor-default\">\r\n <Clock className=\"w-4 h-4\" />\r\n {t('accessRequests.pendingLabel', 'Request pending')}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div>\r\n <button\r\n onClick={() => setShowReasonModal(true)}\r\n className=\"inline-flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)]\"\r\n >\r\n {existingStatus === 'Denied' ? (\r\n <RefreshCw className=\"w-4 h-4\" />\r\n ) : (\r\n <LogIn className=\"w-4 h-4\" />\r\n )}\r\n {existingStatus === 'Denied'\r\n ? t('accessRequests.retryAccess', 'Retry request')\r\n : t('accessRequests.requestAccess')}\r\n </button>\r\n\r\n {showReasonModal && (\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\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold\">{t('accessRequests.modal.requestTitle')}</h3>\r\n <button\r\n onClick={() => setShowReasonModal(false)}\r\n className=\"p-1 hover:bg-[var(--bg-hover)] rounded\"\r\n disabled={loading}\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 <label className=\"block font-medium mb-2\">\r\n {t('accessRequests.modal.reasonLabel')}\r\n </label>\r\n <textarea\r\n value={reason}\r\n onChange={(e) => setReason(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.reasonPlaceholder')}\r\n />\r\n </div>\r\n <div className=\"flex justify-end gap-2\">\r\n <button\r\n onClick={() => setShowReasonModal(false)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] hover:bg-[var(--bg-hover)]\"\r\n disabled={loading}\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={handleRequest}\r\n disabled={loading}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] disabled:opacity-50 flex items-center gap-2\"\r\n >\r\n {loading && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common:submit')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { memo, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Star,\r\n LifeBuoy,\r\n Briefcase,\r\n FileText,\r\n Box,\r\n ArrowRight,\r\n Lock,\r\n} from 'lucide-react';\r\nimport { Link } from 'react-router-dom';\r\nimport { useNavigation, type ApplicationDto } from '@/contexts/NavigationContext';\r\nimport { useTenantUrl } from '@/utils/tenantUrl';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { RequestAccessButton } from '@/components/platform/administration/access-requests';\r\nimport { useUserAccessRequests } from '@/hooks/useUserAccessRequests';\r\n\r\nconst iconMap: Record<string, typeof Box> = {\r\n lifebuoy: LifeBuoy,\r\n briefcase: Briefcase,\r\n file: FileText,\r\n box: Box,\r\n};\r\n\r\nfunction getIcon(iconName: string | null) {\r\n if (!iconName) return Box;\r\n return iconMap[iconName.toLowerCase()] || Box;\r\n}\r\n\r\ninterface ApplicationCardProps {\r\n readonly app: ApplicationDto;\r\n readonly isFavorite: boolean;\r\n readonly onToggleFavorite: () => void;\r\n readonly buildUrl: (path: string) => string;\r\n readonly tenantId?: string;\r\n readonly existingRequestStatus?: 'Pending' | 'Denied' | null;\r\n readonly onAccessRequested?: () => void;\r\n}\r\n\r\nconst ApplicationCard = memo(function ApplicationCard({ app, isFavorite, onToggleFavorite, buildUrl, tenantId, existingRequestStatus, onAccessRequested }: ApplicationCardProps) {\r\n const { t } = useTranslation('navigation');\r\n const Icon = getIcon(app.icon);\r\n const isRequestAccess = app.accessLevel === 'RequestAccess' && app.modules.length === 0;\r\n\r\n const handleFavoriteClick = useCallback((e: React.MouseEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n onToggleFavorite();\r\n }, [onToggleFavorite]);\r\n\r\n if (isRequestAccess) {\r\n return (\r\n <div className=\"group relative bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden hover:border-[var(--warning-border)] transition-all duration-300 hover:shadow-lg\">\r\n <div className=\"block p-6\">\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div className=\"w-14 h-14 rounded-xl bg-[var(--warning-bg)] flex items-center justify-center\">\r\n <Icon className=\"w-7 h-7 text-[var(--warning-text)]\" />\r\n </div>\r\n <div className=\"p-2 rounded-lg bg-[var(--warning-bg)] text-[var(--warning-text)]\">\r\n <Lock className=\"w-5 h-5\" />\r\n </div>\r\n </div>\r\n\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-2\">\r\n {app.label}\r\n </h3>\r\n\r\n <p className=\"text-sm text-[var(--warning-text)] opacity-80 mb-4\">\r\n {t('applicationsPage.requestAccessDesc', \"Restricted access - request required\")}\r\n </p>\r\n\r\n {tenantId && (\r\n <RequestAccessButton\r\n applicationId={app.id}\r\n tenantId={tenantId}\r\n existingStatus={existingRequestStatus}\r\n onSuccess={onAccessRequested}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"group relative bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden hover:border-[var(--color-accent-400)] transition-all duration-300 hover:shadow-lg\">\r\n <Link\r\n to={app.route ? buildUrl(app.route) : '#'}\r\n className=\"block p-6\"\r\n >\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div className=\"w-14 h-14 rounded-xl bg-[var(--accent-bg)] flex items-center justify-center group-hover:opacity-90 transition-all\">\r\n <Icon className=\"w-7 h-7 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <button\r\n onClick={handleFavoriteClick}\r\n className={`p-2 rounded-lg transition-all duration-200 ${\r\n isFavorite\r\n ? 'text-[var(--warning-text)] bg-[var(--warning-bg)]'\r\n : 'text-[var(--text-tertiary)] opacity-0 group-hover:opacity-100 hover:bg-[var(--bg-tertiary)]'\r\n }`}\r\n title={isFavorite ? t('applicationsPage.removeFavorite', 'Remove from favorites') : t('applicationsPage.addFavorite', 'Add to favorites')}\r\n >\r\n <Star className={`w-5 h-5 ${isFavorite ? 'fill-current' : ''}`} />\r\n </button>\r\n </div>\r\n\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-2\">\r\n {app.label}\r\n </h3>\r\n\r\n <p className=\"text-sm text-[var(--text-secondary)] mb-4\">\r\n {app.modules.length} {app.modules.length === 1\r\n ? t('applicationsPage.moduleCount_one', 'module')\r\n : t('applicationsPage.moduleCount_other', 'modules')}\r\n </p>\r\n\r\n <div className=\"flex items-center gap-2 text-[var(--color-accent-500)] text-sm font-medium opacity-0 group-hover:opacity-100 transition-opacity\">\r\n {t('applicationsPage.open', 'Open')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </div>\r\n </Link>\r\n </div>\r\n );\r\n});\r\n\r\nexport function ApplicationsPage(): ReactElement | null {\r\n const { t } = useTranslation('navigation');\r\n const { favorites, menu, toggleFavorite, isFavorite, isLoading, refreshMenu } = useNavigation();\r\n const { currentTenant } = useTenant();\r\n const buildUrl = useTenantUrl();\r\n const { requests: myAccessRequests, reload: reloadAccessRequests } = useUserAccessRequests();\r\n\r\n const applications = menu?.applications || [];\r\n\r\n const getRequestStatus = useCallback((appId: string): 'Pending' | 'Denied' | null => {\r\n const appRequests = myAccessRequests\r\n .filter(r => r.applicationId === appId && r.tenantId === currentTenant?.id);\r\n const pending = appRequests.find(r => r.status === 'Pending');\r\n if (pending) return 'Pending';\r\n const denied = appRequests.find(r => r.status === 'Denied');\r\n if (denied) return 'Denied';\r\n return null;\r\n }, [myAccessRequests, currentTenant?.id]);\r\n\r\n const handleAccessRequested = useCallback(() => {\r\n refreshMenu();\r\n reloadAccessRequests();\r\n }, [refreshMenu, reloadAccessRequests]);\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <div className=\"w-8 h-8 border-2 border-[var(--color-accent-500)] border-t-transparent rounded-full animate-spin\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-8\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('applicationsPage.title', 'Applications')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n {t('applicationsPage.subtitle', 'Your available applications')}\r\n </p>\r\n </div>\r\n\r\n {favorites.length > 0 && (\r\n <section>\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2\">\r\n <Star className=\"w-5 h-5 text-[var(--warning-text)] fill-[var(--warning-text)]\" />\r\n {t('applicationsPage.favorites', 'Favorites')}\r\n </h2>\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {favorites.map(fav => {\r\n const app = applications.find(a => a.id === fav.id);\r\n if (!app) return null;\r\n return (\r\n <ApplicationCard\r\n key={app.id}\r\n app={app}\r\n isFavorite={true}\r\n onToggleFavorite={() => toggleFavorite(app.id)}\r\n buildUrl={buildUrl}\r\n tenantId={currentTenant?.id}\r\n existingRequestStatus={getRequestStatus(app.id)}\r\n onAccessRequested={handleAccessRequested}\r\n />\r\n );\r\n })}\r\n </div>\r\n </section>\r\n )}\r\n\r\n <section>\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4\">\r\n {t('applicationsPage.all', 'All applications')}\r\n </h2>\r\n {applications.length > 0 ? (\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {applications.map(app => (\r\n <ApplicationCard\r\n key={app.id}\r\n app={app}\r\n isFavorite={isFavorite(app.id)}\r\n onToggleFavorite={() => toggleFavorite(app.id)}\r\n buildUrl={buildUrl}\r\n tenantId={currentTenant?.id}\r\n existingRequestStatus={getRequestStatus(app.id)}\r\n onAccessRequested={handleAccessRequested}\r\n />\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"text-center py-12 bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n <Box className=\"w-12 h-12 text-[var(--text-tertiary)] mx-auto mb-4\" />\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('applicationsPage.noApps', 'No applications available')}\r\n </p>\r\n </div>\r\n )}\r\n </section>\r\n </div>\r\n );\r\n}\r\n"],"names":["RequestAccessButton","applicationId","tenantId","existingStatus","onSuccess","t","useTranslation","loading","setLoading","useState","showReasonModal","setShowReasonModal","reason","setReason","justSubmitted","setJustSubmitted","handleRequest","accessRequestsApi","err","jsxs","jsx","Clock","RefreshCw","LogIn","X","e","Loader2","iconMap","LifeBuoy","Briefcase","FileText","Box","getIcon","iconName","ApplicationCard","memo","app","isFavorite","onToggleFavorite","buildUrl","existingRequestStatus","onAccessRequested","Icon","isRequestAccess","handleFavoriteClick","useCallback","Lock","Link","Star","ArrowRight","ApplicationsPage","favorites","menu","toggleFavorite","isLoading","refreshMenu","useNavigation","currentTenant","useTenant","useTenantUrl","myAccessRequests","reloadAccessRequests","useUserAccessRequests","applications","getRequestStatus","appId","appRequests","r","handleAccessRequested","fav","a"],"mappings":"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"}
1
+ {"version":3,"file":"ApplicationsPage-6zgFye6w.js","sources":["../../src/components/platform/administration/access-requests/RequestAccessButton.tsx","../../src/pages/ApplicationsPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { LogIn, Loader2, X, Clock, RefreshCw } from 'lucide-react';\r\nimport { accessRequestsApi } from '@/services/api/accessRequestsApi';\r\n\r\ninterface RequestAccessButtonProps {\r\n readonly applicationId: string;\r\n readonly tenantId: string;\r\n readonly existingStatus?: 'Pending' | 'Denied' | null;\r\n readonly onSuccess?: () => void;\r\n}\r\n\r\nexport function RequestAccessButton({ applicationId, tenantId, existingStatus, onSuccess }: RequestAccessButtonProps): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const [loading, setLoading] = useState(false);\r\n const [showReasonModal, setShowReasonModal] = useState(false);\r\n const [reason, setReason] = useState('');\r\n const [justSubmitted, setJustSubmitted] = useState(false);\r\n\r\n const handleRequest = async () => {\r\n setLoading(true);\r\n try {\r\n await accessRequestsApi.createRequest(tenantId, applicationId, {\r\n applicationId,\r\n reason: reason || undefined,\r\n });\r\n setShowReasonModal(false);\r\n setReason('');\r\n setJustSubmitted(true);\r\n onSuccess?.();\r\n } catch (err) {\r\n console.error('Failed to create access request:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n // After successful submission or existing pending request, show pending state\r\n if (justSubmitted || existingStatus === 'Pending') {\r\n return (\r\n <div className=\"inline-flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-amber-500/10 text-amber-600 border border-amber-500/30 cursor-default\">\r\n <Clock className=\"w-4 h-4\" />\r\n {t('accessRequests.pendingLabel', 'Request pending')}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div>\r\n <button\r\n onClick={() => setShowReasonModal(true)}\r\n className=\"inline-flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)]\"\r\n >\r\n {existingStatus === 'Denied' ? (\r\n <RefreshCw className=\"w-4 h-4\" />\r\n ) : (\r\n <LogIn className=\"w-4 h-4\" />\r\n )}\r\n {existingStatus === 'Denied'\r\n ? t('accessRequests.retryAccess', 'Retry request')\r\n : t('accessRequests.requestAccess')}\r\n </button>\r\n\r\n {showReasonModal && (\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\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold\">{t('accessRequests.modal.requestTitle')}</h3>\r\n <button\r\n onClick={() => setShowReasonModal(false)}\r\n className=\"p-1 hover:bg-[var(--bg-hover)] rounded\"\r\n disabled={loading}\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 <label className=\"block font-medium mb-2\">\r\n {t('accessRequests.modal.reasonLabel')}\r\n </label>\r\n <textarea\r\n value={reason}\r\n onChange={(e) => setReason(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.reasonPlaceholder')}\r\n />\r\n </div>\r\n <div className=\"flex justify-end gap-2\">\r\n <button\r\n onClick={() => setShowReasonModal(false)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] hover:bg-[var(--bg-hover)]\"\r\n disabled={loading}\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={handleRequest}\r\n disabled={loading}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] disabled:opacity-50 flex items-center gap-2\"\r\n >\r\n {loading && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common:submit')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { memo, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Star,\r\n LifeBuoy,\r\n Briefcase,\r\n FileText,\r\n Box,\r\n ArrowRight,\r\n Lock,\r\n} from 'lucide-react';\r\nimport { Link } from 'react-router-dom';\r\nimport { useNavigation, type ApplicationDto } from '@/contexts/NavigationContext';\r\nimport { useTenantUrl } from '@/utils/tenantUrl';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { RequestAccessButton } from '@/components/platform/administration/access-requests';\r\nimport { useUserAccessRequests } from '@/hooks/useUserAccessRequests';\r\n\r\nconst iconMap: Record<string, typeof Box> = {\r\n lifebuoy: LifeBuoy,\r\n briefcase: Briefcase,\r\n file: FileText,\r\n box: Box,\r\n};\r\n\r\nfunction getIcon(iconName: string | null) {\r\n if (!iconName) return Box;\r\n return iconMap[iconName.toLowerCase()] || Box;\r\n}\r\n\r\ninterface ApplicationCardProps {\r\n readonly app: ApplicationDto;\r\n readonly isFavorite: boolean;\r\n readonly onToggleFavorite: () => void;\r\n readonly buildUrl: (path: string) => string;\r\n readonly tenantId?: string;\r\n readonly existingRequestStatus?: 'Pending' | 'Denied' | null;\r\n readonly onAccessRequested?: () => void;\r\n}\r\n\r\nconst ApplicationCard = memo(function ApplicationCard({ app, isFavorite, onToggleFavorite, buildUrl, tenantId, existingRequestStatus, onAccessRequested }: ApplicationCardProps) {\r\n const { t } = useTranslation('navigation');\r\n const Icon = getIcon(app.icon);\r\n const isRequestAccess = app.accessLevel === 'RequestAccess' && app.modules.length === 0;\r\n\r\n const handleFavoriteClick = useCallback((e: React.MouseEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n onToggleFavorite();\r\n }, [onToggleFavorite]);\r\n\r\n if (isRequestAccess) {\r\n return (\r\n <div className=\"group relative bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden hover:border-[var(--warning-border)] transition-all duration-300 hover:shadow-lg\">\r\n <div className=\"block p-6\">\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div className=\"w-14 h-14 rounded-xl bg-[var(--warning-bg)] flex items-center justify-center\">\r\n <Icon className=\"w-7 h-7 text-[var(--warning-text)]\" />\r\n </div>\r\n <div className=\"p-2 rounded-lg bg-[var(--warning-bg)] text-[var(--warning-text)]\">\r\n <Lock className=\"w-5 h-5\" />\r\n </div>\r\n </div>\r\n\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-2\">\r\n {app.label}\r\n </h3>\r\n\r\n <p className=\"text-sm text-[var(--warning-text)] opacity-80 mb-4\">\r\n {t('applicationsPage.requestAccessDesc', \"Restricted access - request required\")}\r\n </p>\r\n\r\n {tenantId && (\r\n <RequestAccessButton\r\n applicationId={app.id}\r\n tenantId={tenantId}\r\n existingStatus={existingRequestStatus}\r\n onSuccess={onAccessRequested}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"group relative bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden hover:border-[var(--color-accent-400)] transition-all duration-300 hover:shadow-lg\">\r\n <Link\r\n to={app.route ? buildUrl(app.route) : '#'}\r\n className=\"block p-6\"\r\n >\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div className=\"w-14 h-14 rounded-xl bg-[var(--accent-bg)] flex items-center justify-center group-hover:opacity-90 transition-all\">\r\n <Icon className=\"w-7 h-7 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <button\r\n onClick={handleFavoriteClick}\r\n className={`p-2 rounded-lg transition-all duration-200 ${\r\n isFavorite\r\n ? 'text-[var(--warning-text)] bg-[var(--warning-bg)]'\r\n : 'text-[var(--text-tertiary)] opacity-0 group-hover:opacity-100 hover:bg-[var(--bg-tertiary)]'\r\n }`}\r\n title={isFavorite ? t('applicationsPage.removeFavorite', 'Remove from favorites') : t('applicationsPage.addFavorite', 'Add to favorites')}\r\n >\r\n <Star className={`w-5 h-5 ${isFavorite ? 'fill-current' : ''}`} />\r\n </button>\r\n </div>\r\n\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-2\">\r\n {app.label}\r\n </h3>\r\n\r\n <p className=\"text-sm text-[var(--text-secondary)] mb-4\">\r\n {app.modules.length} {app.modules.length === 1\r\n ? t('applicationsPage.moduleCount_one', 'module')\r\n : t('applicationsPage.moduleCount_other', 'modules')}\r\n </p>\r\n\r\n <div className=\"flex items-center gap-2 text-[var(--color-accent-500)] text-sm font-medium opacity-0 group-hover:opacity-100 transition-opacity\">\r\n {t('applicationsPage.open', 'Open')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </div>\r\n </Link>\r\n </div>\r\n );\r\n});\r\n\r\nexport function ApplicationsPage(): ReactElement | null {\r\n const { t } = useTranslation('navigation');\r\n const { favorites, menu, toggleFavorite, isFavorite, isLoading, refreshMenu } = useNavigation();\r\n const { currentTenant } = useTenant();\r\n const buildUrl = useTenantUrl();\r\n const { requests: myAccessRequests, reload: reloadAccessRequests } = useUserAccessRequests();\r\n\r\n const applications = menu?.applications || [];\r\n\r\n const getRequestStatus = useCallback((appId: string): 'Pending' | 'Denied' | null => {\r\n const appRequests = myAccessRequests\r\n .filter(r => r.applicationId === appId && r.tenantId === currentTenant?.id);\r\n const pending = appRequests.find(r => r.status === 'Pending');\r\n if (pending) return 'Pending';\r\n const denied = appRequests.find(r => r.status === 'Denied');\r\n if (denied) return 'Denied';\r\n return null;\r\n }, [myAccessRequests, currentTenant?.id]);\r\n\r\n const handleAccessRequested = useCallback(() => {\r\n refreshMenu();\r\n reloadAccessRequests();\r\n }, [refreshMenu, reloadAccessRequests]);\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <div className=\"w-8 h-8 border-2 border-[var(--color-accent-500)] border-t-transparent rounded-full animate-spin\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-8\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('applicationsPage.title', 'Applications')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n {t('applicationsPage.subtitle', 'Your available applications')}\r\n </p>\r\n </div>\r\n\r\n {favorites.length > 0 && (\r\n <section>\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2\">\r\n <Star className=\"w-5 h-5 text-[var(--warning-text)] fill-[var(--warning-text)]\" />\r\n {t('applicationsPage.favorites', 'Favorites')}\r\n </h2>\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {favorites.map(fav => {\r\n const app = applications.find(a => a.id === fav.id);\r\n if (!app) return null;\r\n return (\r\n <ApplicationCard\r\n key={app.id}\r\n app={app}\r\n isFavorite={true}\r\n onToggleFavorite={() => toggleFavorite(app.id)}\r\n buildUrl={buildUrl}\r\n tenantId={currentTenant?.id}\r\n existingRequestStatus={getRequestStatus(app.id)}\r\n onAccessRequested={handleAccessRequested}\r\n />\r\n );\r\n })}\r\n </div>\r\n </section>\r\n )}\r\n\r\n <section>\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4\">\r\n {t('applicationsPage.all', 'All applications')}\r\n </h2>\r\n {applications.length > 0 ? (\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {applications.map(app => (\r\n <ApplicationCard\r\n key={app.id}\r\n app={app}\r\n isFavorite={isFavorite(app.id)}\r\n onToggleFavorite={() => toggleFavorite(app.id)}\r\n buildUrl={buildUrl}\r\n tenantId={currentTenant?.id}\r\n existingRequestStatus={getRequestStatus(app.id)}\r\n onAccessRequested={handleAccessRequested}\r\n />\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"text-center py-12 bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n <Box className=\"w-12 h-12 text-[var(--text-tertiary)] mx-auto mb-4\" />\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('applicationsPage.noApps', 'No applications available')}\r\n </p>\r\n </div>\r\n )}\r\n </section>\r\n </div>\r\n );\r\n}\r\n"],"names":["RequestAccessButton","applicationId","tenantId","existingStatus","onSuccess","t","useTranslation","loading","setLoading","useState","showReasonModal","setShowReasonModal","reason","setReason","justSubmitted","setJustSubmitted","handleRequest","accessRequestsApi","err","jsxs","jsx","Clock","RefreshCw","LogIn","X","e","Loader2","iconMap","LifeBuoy","Briefcase","FileText","Box","getIcon","iconName","ApplicationCard","memo","app","isFavorite","onToggleFavorite","buildUrl","existingRequestStatus","onAccessRequested","Icon","isRequestAccess","handleFavoriteClick","useCallback","Lock","Link","Star","ArrowRight","ApplicationsPage","favorites","menu","toggleFavorite","isLoading","refreshMenu","useNavigation","currentTenant","useTenant","useTenantUrl","myAccessRequests","reloadAccessRequests","useUserAccessRequests","applications","getRequestStatus","appId","appRequests","r","handleAccessRequested","fav","a"],"mappings":"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"}
@@ -3,9 +3,9 @@ import { useState as x, useCallback as y, memo as P } from "react";
3
3
  import { useTranslation as w } from "react-i18next";
4
4
  import { Clock as k, RefreshCw as C, LogIn as j, X as L, Loader2 as F, Star as A, Box as N, Lock as S, ArrowRight as T, FileText as D, Briefcase as I, LifeBuoy as B } from "lucide-react";
5
5
  import { Link as M } from "react-router-dom";
6
- import { u as U, a as _, b as $ } from "./index-CwSaRXXg.js";
7
- import { a as z } from "./accessRequestsApi-ZXFPCid2.js";
8
- import { u as J } from "./useUserAccessRequests-BB6FHW14.js";
6
+ import { u as U, a as _, b as $ } from "./index-lpIzhufD.js";
7
+ import { a as z } from "./accessRequestsApi-DZSfThpd.js";
8
+ import { u as J } from "./useUserAccessRequests-CylKxRN6.js";
9
9
  function O({ applicationId: i, tenantId: a, existingStatus: o, onSuccess: m }) {
10
10
  const { t: n } = w("admin"), [c, g] = x(!1), [l, r] = x(!1), [d, v] = x(""), [b, h] = x(!1), f = async () => {
11
11
  g(!0);
@@ -208,4 +208,4 @@ function te() {
208
208
  export {
209
209
  te as ApplicationsPage
210
210
  };
211
- //# sourceMappingURL=ApplicationsPage-CW3-Hjlu.js.map
211
+ //# sourceMappingURL=ApplicationsPage-CQPuuiO6.js.map