@atlashub/smartstack 3.28.0 → 3.30.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 (320) hide show
  1. package/dist/chunks/{AgentSkillsPage-ChykpPZx.js → AgentSkillsPage-CVq3qZoe.js} +2 -2
  2. package/dist/chunks/{AgentSkillsPage-ChykpPZx.js.map → AgentSkillsPage-CVq3qZoe.js.map} +1 -1
  3. package/dist/chunks/{AgentSkillsPage-ABpqnnyK.js → AgentSkillsPage-DJb49NMA.js} +2 -2
  4. package/dist/chunks/{AgentSkillsPage-ABpqnnyK.js.map → AgentSkillsPage-DJb49NMA.js.map} +1 -1
  5. package/dist/chunks/{AgentWorkloadPage-BltzNlXI.js → AgentWorkloadPage-D_nk3gKj.js} +2 -2
  6. package/dist/chunks/{AgentWorkloadPage-BltzNlXI.js.map → AgentWorkloadPage-D_nk3gKj.js.map} +1 -1
  7. package/dist/chunks/{AgentWorkloadPage-BI5QWJyQ.js → AgentWorkloadPage-oHEi-sFh.js} +2 -2
  8. package/dist/chunks/{AgentWorkloadPage-BI5QWJyQ.js.map → AgentWorkloadPage-oHEi-sFh.js.map} +1 -1
  9. package/dist/chunks/{ApiCatalogDetailPage-BaheZKBq.js → ApiCatalogDetailPage-Cr0q2HnB.js} +3 -3
  10. package/dist/chunks/{ApiCatalogDetailPage-BaheZKBq.js.map → ApiCatalogDetailPage-Cr0q2HnB.js.map} +1 -1
  11. package/dist/chunks/{ApiCatalogDetailPage-CsRxlHwO.js → ApiCatalogDetailPage-DX8buBkV.js} +2 -2
  12. package/dist/chunks/{ApiCatalogDetailPage-CsRxlHwO.js.map → ApiCatalogDetailPage-DX8buBkV.js.map} +1 -1
  13. package/dist/chunks/{ApiCatalogPage-CqmmHpQ4.js → ApiCatalogPage-DN7sazvI.js} +2 -2
  14. package/dist/chunks/{ApiCatalogPage-CqmmHpQ4.js.map → ApiCatalogPage-DN7sazvI.js.map} +1 -1
  15. package/dist/chunks/{ApiCatalogPage-B0yIz8-U.js → ApiCatalogPage-DqboIzZE.js} +2 -2
  16. package/dist/chunks/{ApiCatalogPage-B0yIz8-U.js.map → ApiCatalogPage-DqboIzZE.js.map} +1 -1
  17. package/dist/chunks/{ApplicationDetailPage-CngD5JSN.js → ApplicationDetailPage--9YwwS5A.js} +2 -2
  18. package/dist/chunks/{ApplicationDetailPage-CngD5JSN.js.map → ApplicationDetailPage--9YwwS5A.js.map} +1 -1
  19. package/dist/chunks/{ApplicationDetailPage-CdT6KNd7.js → ApplicationDetailPage-CCNjr64K.js} +4 -4
  20. package/dist/chunks/{ApplicationDetailPage-CdT6KNd7.js.map → ApplicationDetailPage-CCNjr64K.js.map} +1 -1
  21. package/dist/chunks/{ApplicationsDashboardPage-DHmnjk2O.js → ApplicationsDashboardPage-BSsHN3Yj.js} +2 -2
  22. package/dist/chunks/{ApplicationsDashboardPage-DHmnjk2O.js.map → ApplicationsDashboardPage-BSsHN3Yj.js.map} +1 -1
  23. package/dist/chunks/{ApplicationsDashboardPage-1V4iQ6eY.js → ApplicationsDashboardPage-Bs-Xgca4.js} +3 -3
  24. package/dist/chunks/{ApplicationsDashboardPage-1V4iQ6eY.js.map → ApplicationsDashboardPage-Bs-Xgca4.js.map} +1 -1
  25. package/dist/chunks/{ApplicationsGridPage-Bo3NDnBF.js → ApplicationsGridPage-DDysNWJ5.js} +2 -2
  26. package/dist/chunks/{ApplicationsGridPage-Bo3NDnBF.js.map → ApplicationsGridPage-DDysNWJ5.js.map} +1 -1
  27. package/dist/chunks/{ApplicationsGridPage-CiMJFlB_.js → ApplicationsGridPage-s1WEzOXS.js} +2 -2
  28. package/dist/chunks/{ApplicationsGridPage-CiMJFlB_.js.map → ApplicationsGridPage-s1WEzOXS.js.map} +1 -1
  29. package/dist/chunks/{ApplicationsListPage-L2_S23aN.js → ApplicationsListPage-B3CSMiV0.js} +2 -2
  30. package/dist/chunks/{ApplicationsListPage-L2_S23aN.js.map → ApplicationsListPage-B3CSMiV0.js.map} +1 -1
  31. package/dist/chunks/{ApplicationsListPage-De8jQ1Cm.js → ApplicationsListPage-B6ZCecIl.js} +2 -2
  32. package/dist/chunks/{ApplicationsListPage-De8jQ1Cm.js.map → ApplicationsListPage-B6ZCecIl.js.map} +1 -1
  33. package/dist/chunks/{ApplicationsPage-DBq7_Sm8.js → ApplicationsPage-BBaiBM--.js} +2 -2
  34. package/dist/chunks/{ApplicationsPage-DBq7_Sm8.js.map → ApplicationsPage-BBaiBM--.js.map} +1 -1
  35. package/dist/chunks/{ApplicationsPage-CiNI-b0R.js → ApplicationsPage-ztPwoAGt.js} +4 -4
  36. package/dist/chunks/{ApplicationsPage-CiNI-b0R.js.map → ApplicationsPage-ztPwoAGt.js.map} +1 -1
  37. package/dist/chunks/{AssignmentRulesPage-DFsO4ZES.js → AssignmentRulesPage-CK4L4rBO.js} +2 -2
  38. package/dist/chunks/{AssignmentRulesPage-DFsO4ZES.js.map → AssignmentRulesPage-CK4L4rBO.js.map} +1 -1
  39. package/dist/chunks/{AssignmentRulesPage-C8rfUsMB.js → AssignmentRulesPage-DFSVFFXr.js} +2 -2
  40. package/dist/chunks/{AssignmentRulesPage-C8rfUsMB.js.map → AssignmentRulesPage-DFSVFFXr.js.map} +1 -1
  41. package/dist/chunks/{AssignmentsPage-78C_EBsw.js → AssignmentsPage-Bp7oQD7Q.js} +2 -2
  42. package/dist/chunks/{AssignmentsPage-78C_EBsw.js.map → AssignmentsPage-Bp7oQD7Q.js.map} +1 -1
  43. package/dist/chunks/{AssignmentsPage-COCikISI.js → AssignmentsPage-JCLpyg94.js} +2 -2
  44. package/dist/chunks/{AssignmentsPage-COCikISI.js.map → AssignmentsPage-JCLpyg94.js.map} +1 -1
  45. package/dist/chunks/{AuthCallbackPage-DqT6ueVi.js → AuthCallbackPage-Bl9xlJ3h.js} +2 -2
  46. package/dist/chunks/{AuthCallbackPage-DqT6ueVi.js.map → AuthCallbackPage-Bl9xlJ3h.js.map} +1 -1
  47. package/dist/chunks/{AuthCallbackPage-BF4bkTnR.js → AuthCallbackPage-CzMHz4jy.js} +2 -2
  48. package/dist/chunks/{AuthCallbackPage-BF4bkTnR.js.map → AuthCallbackPage-CzMHz4jy.js.map} +1 -1
  49. package/dist/chunks/{ConfirmEmailPage-Bh_K5qJn.js → ConfirmEmailPage-D_8T1vqV.js} +2 -2
  50. package/dist/chunks/{ConfirmEmailPage-Bh_K5qJn.js.map → ConfirmEmailPage-D_8T1vqV.js.map} +1 -1
  51. package/dist/chunks/{ConfirmEmailPage-DJy4idrf.js → ConfirmEmailPage-M7mJgXvn.js} +2 -2
  52. package/dist/chunks/{ConfirmEmailPage-DJy4idrf.js.map → ConfirmEmailPage-M7mJgXvn.js.map} +1 -1
  53. package/dist/chunks/{CreateSupportTicketPage-pL7jbG9o.js → CreateSupportTicketPage-BNEGavlu.js} +2 -2
  54. package/dist/chunks/{CreateSupportTicketPage-pL7jbG9o.js.map → CreateSupportTicketPage-BNEGavlu.js.map} +1 -1
  55. package/dist/chunks/{CreateSupportTicketPage-AVTwXbJd.js → CreateSupportTicketPage-C2X2mfds.js} +2 -2
  56. package/dist/chunks/{CreateSupportTicketPage-AVTwXbJd.js.map → CreateSupportTicketPage-C2X2mfds.js.map} +1 -1
  57. package/dist/chunks/{DashboardPage-DdQlTLw0.js → DashboardPage-4oy2YqvT.js} +2 -2
  58. package/dist/chunks/{DashboardPage-DdQlTLw0.js.map → DashboardPage-4oy2YqvT.js.map} +1 -1
  59. package/dist/chunks/{DashboardPage-C55mIiB6.js → DashboardPage-CO-8B8EI.js} +3 -3
  60. package/dist/chunks/{DashboardPage-C55mIiB6.js.map → DashboardPage-CO-8B8EI.js.map} +1 -1
  61. package/dist/chunks/{DashboardPage-CcCnUl7s.js → DashboardPage-CPArUG-S.js} +2 -2
  62. package/dist/chunks/{DashboardPage-CcCnUl7s.js.map → DashboardPage-CPArUG-S.js.map} +1 -1
  63. package/dist/chunks/{DashboardPage-DOitDfGV.js → DashboardPage-D5MRMxEV.js} +3 -3
  64. package/dist/chunks/{DashboardPage-DOitDfGV.js.map → DashboardPage-D5MRMxEV.js.map} +1 -1
  65. package/dist/chunks/{EscalationConfigPage-DNnZftCH.js → EscalationConfigPage-CwdnfJbJ.js} +2 -2
  66. package/dist/chunks/{EscalationConfigPage-DNnZftCH.js.map → EscalationConfigPage-CwdnfJbJ.js.map} +1 -1
  67. package/dist/chunks/{EscalationConfigPage-DRr55328.js → EscalationConfigPage-DnjLFXnL.js} +2 -2
  68. package/dist/chunks/{EscalationConfigPage-DRr55328.js.map → EscalationConfigPage-DnjLFXnL.js.map} +1 -1
  69. package/dist/chunks/{ForceChangePasswordPage-1SCOPIqK.js → ForceChangePasswordPage-ZEIfyqwE.js} +2 -2
  70. package/dist/chunks/{ForceChangePasswordPage-1SCOPIqK.js.map → ForceChangePasswordPage-ZEIfyqwE.js.map} +1 -1
  71. package/dist/chunks/{ForceChangePasswordPage-DBeG_HRO.js → ForceChangePasswordPage-sh-3h_H9.js} +2 -2
  72. package/dist/chunks/{ForceChangePasswordPage-DBeG_HRO.js.map → ForceChangePasswordPage-sh-3h_H9.js.map} +1 -1
  73. package/dist/chunks/{ForgotPasswordPage-Dlb6wKfC.js → ForgotPasswordPage-B4M6-xeM.js} +2 -2
  74. package/dist/chunks/{ForgotPasswordPage-Dlb6wKfC.js.map → ForgotPasswordPage-B4M6-xeM.js.map} +1 -1
  75. package/dist/chunks/{ForgotPasswordPage-DffYfXva.js → ForgotPasswordPage-MIu-U7p0.js} +2 -2
  76. package/dist/chunks/{ForgotPasswordPage-DffYfXva.js.map → ForgotPasswordPage-MIu-U7p0.js.map} +1 -1
  77. package/dist/chunks/{GroupDetailPage-C9nRbeHI.js → GroupDetailPage-4XK3Bs_r.js} +5 -5
  78. package/dist/chunks/{GroupDetailPage-C9nRbeHI.js.map → GroupDetailPage-4XK3Bs_r.js.map} +1 -1
  79. package/dist/chunks/{GroupDetailPage-CPPUWzXf.js → GroupDetailPage-C-kvtd2T.js} +2 -2
  80. package/dist/chunks/{GroupDetailPage-CPPUWzXf.js.map → GroupDetailPage-C-kvtd2T.js.map} +1 -1
  81. package/dist/chunks/{MyAccessRequestsPage-BAX0xwJX.js → MyAccessRequestsPage-CP41FzHi.js} +2 -2
  82. package/dist/chunks/{MyAccessRequestsPage-BAX0xwJX.js.map → MyAccessRequestsPage-CP41FzHi.js.map} +1 -1
  83. package/dist/chunks/{MyAccessRequestsPage-BMY1V631.js → MyAccessRequestsPage-DzrXTrVi.js} +2 -2
  84. package/dist/chunks/{MyAccessRequestsPage-BMY1V631.js.map → MyAccessRequestsPage-DzrXTrVi.js.map} +1 -1
  85. package/dist/chunks/{MyTenantsPage-Bbn4HxN2.js → MyTenantsPage-CZRkMbh8.js} +2 -2
  86. package/dist/chunks/{MyTenantsPage-Bbn4HxN2.js.map → MyTenantsPage-CZRkMbh8.js.map} +1 -1
  87. package/dist/chunks/{MyTenantsPage-BHtp67SD.js → MyTenantsPage-V_SwYio2.js} +3 -3
  88. package/dist/chunks/{MyTenantsPage-BHtp67SD.js.map → MyTenantsPage-V_SwYio2.js.map} +1 -1
  89. package/dist/chunks/{MyTicketsPage-BvZeiTXu.js → MyTicketsPage-DOUhaLal.js} +2 -2
  90. package/dist/chunks/{MyTicketsPage-BvZeiTXu.js.map → MyTicketsPage-DOUhaLal.js.map} +1 -1
  91. package/dist/chunks/{MyTicketsPage-D9IGVofj.js → MyTicketsPage-DnvAIeyr.js} +2 -2
  92. package/dist/chunks/{MyTicketsPage-D9IGVofj.js.map → MyTicketsPage-DnvAIeyr.js.map} +1 -1
  93. package/dist/chunks/{NavigationAppsPage-DiPBCsAF.js → NavigationAppsPage-DXvpLsbt.js} +2 -2
  94. package/dist/chunks/{NavigationAppsPage-DiPBCsAF.js.map → NavigationAppsPage-DXvpLsbt.js.map} +1 -1
  95. package/dist/chunks/{NavigationAppsPage-ChtMK1yt.js → NavigationAppsPage-DfTa4jCG.js} +2 -2
  96. package/dist/chunks/{NavigationAppsPage-ChtMK1yt.js.map → NavigationAppsPage-DfTa4jCG.js.map} +1 -1
  97. package/dist/chunks/{NotificationsPage-BxCiGzHk.js → NotificationsPage-D76MdAs-.js} +2 -2
  98. package/dist/chunks/{NotificationsPage-BxCiGzHk.js.map → NotificationsPage-D76MdAs-.js.map} +1 -1
  99. package/dist/chunks/{NotificationsPage-BCnL9oPb.js → NotificationsPage-I1yCk7tk.js} +2 -2
  100. package/dist/chunks/{NotificationsPage-BCnL9oPb.js.map → NotificationsPage-I1yCk7tk.js.map} +1 -1
  101. package/dist/chunks/{OnboardingWizardPage-CV_cxq7k.js → OnboardingWizardPage-BRUzcl1A.js} +2 -2
  102. package/dist/chunks/{OnboardingWizardPage-CV_cxq7k.js.map → OnboardingWizardPage-BRUzcl1A.js.map} +1 -1
  103. package/dist/chunks/{OnboardingWizardPage-Du-tQ2ag.js → OnboardingWizardPage-DtWUPCh3.js} +2 -2
  104. package/dist/chunks/{OnboardingWizardPage-Du-tQ2ag.js.map → OnboardingWizardPage-DtWUPCh3.js.map} +1 -1
  105. package/dist/chunks/{PermissionDetailPage-C1iuWv0G.js → PermissionDetailPage-CUNKbl7t.js} +2 -2
  106. package/dist/chunks/{PermissionDetailPage-C1iuWv0G.js.map → PermissionDetailPage-CUNKbl7t.js.map} +1 -1
  107. package/dist/chunks/{PermissionDetailPage-Ds4Jt1os.js → PermissionDetailPage-DJJGbXoX.js} +2 -2
  108. package/dist/chunks/{PermissionDetailPage-Ds4Jt1os.js.map → PermissionDetailPage-DJJGbXoX.js.map} +1 -1
  109. package/dist/chunks/{PermissionsPage-BGI2nxCn.js → PermissionsPage-B8wmawPV.js} +2 -2
  110. package/dist/chunks/{PermissionsPage-BGI2nxCn.js.map → PermissionsPage-B8wmawPV.js.map} +1 -1
  111. package/dist/chunks/{PermissionsPage-sauv7ct1.js → PermissionsPage-Dbjcctuh.js} +2 -2
  112. package/dist/chunks/{PermissionsPage-sauv7ct1.js.map → PermissionsPage-Dbjcctuh.js.map} +1 -1
  113. package/dist/chunks/{PortalDashboardPage-CQWEcghD.js → PortalDashboardPage-BeNfBZmb.js} +2 -2
  114. package/dist/chunks/{PortalDashboardPage-CQWEcghD.js.map → PortalDashboardPage-BeNfBZmb.js.map} +1 -1
  115. package/dist/chunks/{PortalDashboardPage-2kCbJw9w.js → PortalDashboardPage-zii0ll57.js} +2 -2
  116. package/dist/chunks/{PortalDashboardPage-2kCbJw9w.js.map → PortalDashboardPage-zii0ll57.js.map} +1 -1
  117. package/dist/chunks/{PreferencesPage-Bu4gaDRb.js → PreferencesPage-BCpuIGzv.js} +2 -2
  118. package/dist/chunks/{PreferencesPage-Bu4gaDRb.js.map → PreferencesPage-BCpuIGzv.js.map} +1 -1
  119. package/dist/chunks/{PreferencesPage-Dbg0bEYD.js → PreferencesPage-BmvrBaAD.js} +2 -2
  120. package/dist/chunks/{PreferencesPage-Dbg0bEYD.js.map → PreferencesPage-BmvrBaAD.js.map} +1 -1
  121. package/dist/chunks/{ProfilePage-C5QS7tsh.js → ProfilePage-eowQd59_.js} +2 -2
  122. package/dist/chunks/{ProfilePage-C5QS7tsh.js.map → ProfilePage-eowQd59_.js.map} +1 -1
  123. package/dist/chunks/{ProfilePage-DfiBhOUt.js → ProfilePage-mf5wI0-n.js} +2 -2
  124. package/dist/chunks/{ProfilePage-DfiBhOUt.js.map → ProfilePage-mf5wI0-n.js.map} +1 -1
  125. package/dist/chunks/{ReferencesManagementPage-Bs0mapj8.js → ReferencesManagementPage-8UPgkVE8.js} +3 -3
  126. package/dist/chunks/{ReferencesManagementPage-Bs0mapj8.js.map → ReferencesManagementPage-8UPgkVE8.js.map} +1 -1
  127. package/dist/chunks/{ReferencesManagementPage-C0RgHbJb.js → ReferencesManagementPage-CLsaUNqA.js} +2 -2
  128. package/dist/chunks/{ReferencesManagementPage-C0RgHbJb.js.map → ReferencesManagementPage-CLsaUNqA.js.map} +1 -1
  129. package/dist/chunks/{RegisterPage-DS1chV_A.js → RegisterPage-57X-ILDb.js} +2 -2
  130. package/dist/chunks/{RegisterPage-DS1chV_A.js.map → RegisterPage-57X-ILDb.js.map} +1 -1
  131. package/dist/chunks/{RegisterPage-DoeIiJt0.js → RegisterPage-CNyHSbqs.js} +2 -2
  132. package/dist/chunks/{RegisterPage-DoeIiJt0.js.map → RegisterPage-CNyHSbqs.js.map} +1 -1
  133. package/dist/chunks/{ResetPasswordPage-3KEk3zj5.js → ResetPasswordPage-CyV8l-Zo.js} +2 -2
  134. package/dist/chunks/{ResetPasswordPage-3KEk3zj5.js.map → ResetPasswordPage-CyV8l-Zo.js.map} +1 -1
  135. package/dist/chunks/{ResetPasswordPage-C_VQSFB5.js → ResetPasswordPage-JW8-mh_k.js} +2 -2
  136. package/dist/chunks/{ResetPasswordPage-C_VQSFB5.js.map → ResetPasswordPage-JW8-mh_k.js.map} +1 -1
  137. package/dist/chunks/{ResolutionModal-S6URD--N.js → ResolutionModal-CjwE73NX.js} +2 -2
  138. package/dist/chunks/{ResolutionModal-S6URD--N.js.map → ResolutionModal-CjwE73NX.js.map} +1 -1
  139. package/dist/chunks/{ResolutionModal-BzI1x79r.js → ResolutionModal-wddG59kg.js} +2 -2
  140. package/dist/chunks/{ResolutionModal-BzI1x79r.js.map → ResolutionModal-wddG59kg.js.map} +1 -1
  141. package/dist/chunks/{RoleDetailPage-SXK9cq_3.js → RoleDetailPage-CrioVHFI.js} +3 -3
  142. package/dist/chunks/{RoleDetailPage-SXK9cq_3.js.map → RoleDetailPage-CrioVHFI.js.map} +1 -1
  143. package/dist/chunks/{RoleDetailPage-DvEEWPKr.js → RoleDetailPage-TUOGR1ow.js} +2 -2
  144. package/dist/chunks/{RoleDetailPage-DvEEWPKr.js.map → RoleDetailPage-TUOGR1ow.js.map} +1 -1
  145. package/dist/chunks/{RolesPage-B75lCugt.js → RolesPage-CAcols3D.js} +2 -2
  146. package/dist/chunks/{RolesPage-B75lCugt.js.map → RolesPage-CAcols3D.js.map} +1 -1
  147. package/dist/chunks/{RolesPage-C5gYJxAl.js → RolesPage-sJBWaNff.js} +2 -2
  148. package/dist/chunks/{RolesPage-C5gYJxAl.js.map → RolesPage-sJBWaNff.js.map} +1 -1
  149. package/dist/chunks/{SlaConfigPage-BqXHATb6.js → SlaConfigPage-BPGRloOS.js} +2 -2
  150. package/dist/chunks/{SlaConfigPage-BqXHATb6.js.map → SlaConfigPage-BPGRloOS.js.map} +1 -1
  151. package/dist/chunks/{SlaConfigPage-DZ4P1FFW.js → SlaConfigPage-D5TRn7Ir.js} +2 -2
  152. package/dist/chunks/{SlaConfigPage-DZ4P1FFW.js.map → SlaConfigPage-D5TRn7Ir.js.map} +1 -1
  153. package/dist/chunks/{SupportPermissionsPage-B4xy_pCQ.js → SupportPermissionsPage-Dc2bWTzG.js} +2 -2
  154. package/dist/chunks/{SupportPermissionsPage-B4xy_pCQ.js.map → SupportPermissionsPage-Dc2bWTzG.js.map} +1 -1
  155. package/dist/chunks/{SupportPermissionsPage-DW7KJjYK.js → SupportPermissionsPage-UXmYLrIq.js} +2 -2
  156. package/dist/chunks/{SupportPermissionsPage-DW7KJjYK.js.map → SupportPermissionsPage-UXmYLrIq.js.map} +1 -1
  157. package/dist/chunks/{TemplatesPage-DZa0PQTE.js → TemplatesPage-dmPlqqiD.js} +2 -2
  158. package/dist/chunks/{TemplatesPage-DZa0PQTE.js.map → TemplatesPage-dmPlqqiD.js.map} +1 -1
  159. package/dist/chunks/{TemplatesPage-m5-sLJ7F.js → TemplatesPage-nTY85sNA.js} +2 -2
  160. package/dist/chunks/{TemplatesPage-m5-sLJ7F.js.map → TemplatesPage-nTY85sNA.js.map} +1 -1
  161. package/dist/chunks/{TenantCard-BJQi7Oew.js → TenantCard-BUXfstRZ.js} +2 -2
  162. package/dist/chunks/{TenantCard-BJQi7Oew.js.map → TenantCard-BUXfstRZ.js.map} +1 -1
  163. package/dist/chunks/{TenantCard-CqfifMrM.js → TenantCard-BhT-31ls.js} +2 -2
  164. package/dist/chunks/{TenantCard-CqfifMrM.js.map → TenantCard-BhT-31ls.js.map} +1 -1
  165. package/dist/chunks/{TenantScopeSelector-CdiYJvuH.js → TenantScopeSelector-3_mzBLNI.js} +2 -2
  166. package/dist/chunks/{TenantScopeSelector-CdiYJvuH.js.map → TenantScopeSelector-3_mzBLNI.js.map} +1 -1
  167. package/dist/chunks/{TenantScopeSelector-Cl5DD318.js → TenantScopeSelector-B-SRDR2R.js} +2 -2
  168. package/dist/chunks/{TenantScopeSelector-Cl5DD318.js.map → TenantScopeSelector-B-SRDR2R.js.map} +1 -1
  169. package/dist/chunks/{TicketDetailPage-BOC9rHu3.js → TicketDetailPage-B4cR3rOC.js} +2 -2
  170. package/dist/chunks/{TicketDetailPage-BOC9rHu3.js.map → TicketDetailPage-B4cR3rOC.js.map} +1 -1
  171. package/dist/chunks/{TicketDetailPage-C1UuMxD8.js → TicketDetailPage-xN3wPnFL.js} +2 -2
  172. package/dist/chunks/{TicketDetailPage-C1UuMxD8.js.map → TicketDetailPage-xN3wPnFL.js.map} +1 -1
  173. package/dist/chunks/{TicketsPage-BCgHZA-m.js → TicketsPage-CkHgXSxU.js} +2 -2
  174. package/dist/chunks/{TicketsPage-BCgHZA-m.js.map → TicketsPage-CkHgXSxU.js.map} +1 -1
  175. package/dist/chunks/{TicketsPage-BjaN4Baq.js → TicketsPage-Dwi2xpMI.js} +2 -2
  176. package/dist/chunks/{TicketsPage-BjaN4Baq.js.map → TicketsPage-Dwi2xpMI.js.map} +1 -1
  177. package/dist/chunks/{UserCreateTicketPage-ChQL1mVY.js → UserCreateTicketPage-D2a3EOey.js} +3 -3
  178. package/dist/chunks/UserCreateTicketPage-D2a3EOey.js.map +1 -0
  179. package/dist/chunks/{UserCreateTicketPage-DkjsHeV7.js → UserCreateTicketPage-bcbSLglE.js} +48 -48
  180. package/dist/chunks/UserCreateTicketPage-bcbSLglE.js.map +1 -0
  181. package/dist/chunks/{UserDashboardPage-BMYrtF3o.js → UserDashboardPage-DwnDRNoW.js} +2 -2
  182. package/dist/chunks/{UserDashboardPage-BMYrtF3o.js.map → UserDashboardPage-DwnDRNoW.js.map} +1 -1
  183. package/dist/chunks/{UserDashboardPage-81-3GJAQ.js → UserDashboardPage-ZMsx8LWw.js} +2 -2
  184. package/dist/chunks/{UserDashboardPage-81-3GJAQ.js.map → UserDashboardPage-ZMsx8LWw.js.map} +1 -1
  185. package/dist/chunks/{UserDetailPage-BMW8jAWG.js → UserDetailPage-BRFowOFL.js} +2 -2
  186. package/dist/chunks/{UserDetailPage-BMW8jAWG.js.map → UserDetailPage-BRFowOFL.js.map} +1 -1
  187. package/dist/chunks/{UserDetailPage-D6oCH2eS.js → UserDetailPage-CZyV-zsg.js} +5 -5
  188. package/dist/chunks/{UserDetailPage-D6oCH2eS.js.map → UserDetailPage-CZyV-zsg.js.map} +1 -1
  189. package/dist/chunks/{UserTicketDetailPage-ZH2BDWBt.js → UserTicketDetailPage-BstGk_BP.js} +2 -2
  190. package/dist/chunks/{UserTicketDetailPage-ZH2BDWBt.js.map → UserTicketDetailPage-BstGk_BP.js.map} +1 -1
  191. package/dist/chunks/{UserTicketDetailPage-Z_myXXJ0.js → UserTicketDetailPage-DzB_pELt.js} +2 -2
  192. package/dist/chunks/{UserTicketDetailPage-Z_myXXJ0.js.map → UserTicketDetailPage-DzB_pELt.js.map} +1 -1
  193. package/dist/chunks/{UsersGroupsPage-B8Ka6uRa.js → UsersGroupsPage-BygTv_kK.js} +3 -3
  194. package/dist/chunks/{UsersGroupsPage-B8Ka6uRa.js.map → UsersGroupsPage-BygTv_kK.js.map} +1 -1
  195. package/dist/chunks/{UsersGroupsPage-xJmGib8b.js → UsersGroupsPage-DTmhzttW.js} +2 -2
  196. package/dist/chunks/{UsersGroupsPage-xJmGib8b.js.map → UsersGroupsPage-DTmhzttW.js.map} +1 -1
  197. package/dist/chunks/{UsersPage-CQ38akZ_.js → UsersPage-DcwLyMAX.js} +2 -2
  198. package/dist/chunks/{UsersPage-CQ38akZ_.js.map → UsersPage-DcwLyMAX.js.map} +1 -1
  199. package/dist/chunks/{UsersPage-Bd2-vl39.js → UsersPage-TIqSHgHj.js} +2 -2
  200. package/dist/chunks/{UsersPage-Bd2-vl39.js.map → UsersPage-TIqSHgHj.js.map} +1 -1
  201. package/dist/chunks/{accessRequestsApi-DguOx0q0.js → accessRequestsApi-3FjMFbpa.js} +2 -2
  202. package/dist/chunks/{accessRequestsApi-DguOx0q0.js.map → accessRequestsApi-3FjMFbpa.js.map} +1 -1
  203. package/dist/chunks/{accessRequestsApi-COtWo9kC.js → accessRequestsApi-B6dsJzvH.js} +2 -2
  204. package/dist/chunks/{accessRequestsApi-COtWo9kC.js.map → accessRequestsApi-B6dsJzvH.js.map} +1 -1
  205. package/dist/chunks/{aiApi-CITiWGYX.js → aiApi-9G4wG_mT.js} +2 -2
  206. package/dist/chunks/{aiApi-CITiWGYX.js.map → aiApi-9G4wG_mT.js.map} +1 -1
  207. package/dist/chunks/{aiApi-BmZsud6O.js → aiApi-DXOdsoxr.js} +2 -2
  208. package/dist/chunks/{aiApi-BmZsud6O.js.map → aiApi-DXOdsoxr.js.map} +1 -1
  209. package/dist/chunks/{applicationAnalyticsApi-BYoEJzSN.js → applicationAnalyticsApi-D0DEp9Y-.js} +2 -2
  210. package/dist/chunks/{applicationAnalyticsApi-BYoEJzSN.js.map → applicationAnalyticsApi-D0DEp9Y-.js.map} +1 -1
  211. package/dist/chunks/{applicationAnalyticsApi-D62lc6z4.js → applicationAnalyticsApi-DhOd6idI.js} +2 -2
  212. package/dist/chunks/{applicationAnalyticsApi-D62lc6z4.js.map → applicationAnalyticsApi-DhOd6idI.js.map} +1 -1
  213. package/dist/chunks/auth-Ca2Rn6on.js +2 -0
  214. package/dist/chunks/auth-Ca2Rn6on.js.map +1 -0
  215. package/dist/chunks/auth-ClNTDOqm.js +18 -0
  216. package/dist/chunks/auth-ClNTDOqm.js.map +1 -0
  217. package/dist/chunks/auth-DECnMZjF.js +18 -0
  218. package/dist/chunks/auth-DECnMZjF.js.map +1 -0
  219. package/dist/chunks/auth-DPvxdqy4.js +18 -0
  220. package/dist/chunks/auth-DPvxdqy4.js.map +1 -0
  221. package/dist/chunks/auth-HzvnTaOm.js +2 -0
  222. package/dist/chunks/auth-HzvnTaOm.js.map +1 -0
  223. package/dist/chunks/auth-M6aNTKCH.js +2 -0
  224. package/dist/chunks/auth-M6aNTKCH.js.map +1 -0
  225. package/dist/chunks/auth-UHnAu6_e.js +2 -0
  226. package/dist/chunks/auth-UHnAu6_e.js.map +1 -0
  227. package/dist/chunks/auth-YrujJY7m.js +18 -0
  228. package/dist/chunks/auth-YrujJY7m.js.map +1 -0
  229. package/dist/chunks/{groupsApi-3CR-_g5b.js → groupsApi-Db8G2lLs.js} +2 -2
  230. package/dist/chunks/{groupsApi-3CR-_g5b.js.map → groupsApi-Db8G2lLs.js.map} +1 -1
  231. package/dist/chunks/{groupsApi-BUyBgf_N.js → groupsApi-lbxNsHFv.js} +2 -2
  232. package/dist/chunks/{groupsApi-BUyBgf_N.js.map → groupsApi-lbxNsHFv.js.map} +1 -1
  233. package/dist/chunks/{index-IJR_91Yt.js → index-BI2dc1FS.js} +2 -2
  234. package/dist/chunks/{index-IJR_91Yt.js.map → index-BI2dc1FS.js.map} +1 -1
  235. package/dist/chunks/{index-DIQ6Jmmq.js → index-Bn8HzILk.js} +4 -4
  236. package/dist/chunks/{index-DIQ6Jmmq.js.map → index-Bn8HzILk.js.map} +1 -1
  237. package/dist/chunks/{index-DA5VyW0k.js → index-CN2WRyg1.js} +2249 -2264
  238. package/dist/chunks/index-CN2WRyg1.js.map +1 -0
  239. package/dist/chunks/{index-Br2wsGE8.js → index-CTGSmYvs.js} +2 -2
  240. package/dist/chunks/{index-Br2wsGE8.js.map → index-CTGSmYvs.js.map} +1 -1
  241. package/dist/chunks/index-CUICSveU.js +2 -0
  242. package/dist/chunks/index-CUICSveU.js.map +1 -0
  243. package/dist/chunks/{index-S-X8qFYW.js → index-CgtbaFf5.js} +2 -2
  244. package/dist/chunks/{index-S-X8qFYW.js.map → index-CgtbaFf5.js.map} +1 -1
  245. package/dist/chunks/{index-_g82N2nb.js → index-D0HS542b.js} +2 -2
  246. package/dist/chunks/{index-_g82N2nb.js.map → index-D0HS542b.js.map} +1 -1
  247. package/dist/chunks/{index-BIqcvvbh.js → index-DEtq-xUL.js} +9 -8
  248. package/dist/chunks/index-DEtq-xUL.js.map +1 -0
  249. package/dist/chunks/{index-BOKR3bw6.js → index-DF93KQFR.js} +2 -2
  250. package/dist/chunks/{index-BOKR3bw6.js.map → index-DF93KQFR.js.map} +1 -1
  251. package/dist/chunks/{index-CxgEV-rT.js → index-DLekpNSE.js} +2 -2
  252. package/dist/chunks/{index-CxgEV-rT.js.map → index-DLekpNSE.js.map} +1 -1
  253. package/dist/chunks/{index-DEOBhXS_.js → index-DUS-tunb.js} +2 -2
  254. package/dist/chunks/{index-DEOBhXS_.js.map → index-DUS-tunb.js.map} +1 -1
  255. package/dist/chunks/{index-BMsjMCv9.js → index-DjC1u2hI.js} +3 -3
  256. package/dist/chunks/{index-BMsjMCv9.js.map → index-DjC1u2hI.js.map} +1 -1
  257. package/dist/chunks/{index-BxHVPJ-j.js → index-DqbVFB1H.js} +2 -2
  258. package/dist/chunks/{index-BxHVPJ-j.js.map → index-DqbVFB1H.js.map} +1 -1
  259. package/dist/chunks/{index-Djy4eIbB.js → index-DwqLhQ8S.js} +2 -2
  260. package/dist/chunks/{index-Djy4eIbB.js.map → index-DwqLhQ8S.js.map} +1 -1
  261. package/dist/chunks/{index-C1w97Ejz.js → index-HsAOBno4.js} +2 -2
  262. package/dist/chunks/{index-C1w97Ejz.js.map → index-HsAOBno4.js.map} +1 -1
  263. package/dist/chunks/{index-Czk12A3G.js → index-TiWOcC0g.js} +2 -2
  264. package/dist/chunks/{index-Czk12A3G.js.map → index-TiWOcC0g.js.map} +1 -1
  265. package/dist/chunks/{index-vXiLh35n.js → index-cAikSVW0.js} +13 -13
  266. package/dist/chunks/index-cAikSVW0.js.map +1 -0
  267. package/dist/chunks/{index-CNxx56kE.js → index-xhRXN1Jq.js} +2 -2
  268. package/dist/chunks/{index-CNxx56kE.js.map → index-xhRXN1Jq.js.map} +1 -1
  269. package/dist/chunks/{tenantIconMap-COKA97Ug.js → tenantIconMap-CHeS7oLt.js} +2 -2
  270. package/dist/chunks/{tenantIconMap-COKA97Ug.js.map → tenantIconMap-CHeS7oLt.js.map} +1 -1
  271. package/dist/chunks/{tenantIconMap-BuSQUUyZ.js → tenantIconMap-__FKj6CN.js} +2 -2
  272. package/dist/chunks/{tenantIconMap-BuSQUUyZ.js.map → tenantIconMap-__FKj6CN.js.map} +1 -1
  273. package/dist/chunks/{ticketingApi-DbREwHez.js → ticketingApi-Cj239hYB.js} +2 -2
  274. package/dist/chunks/{ticketingApi-DbREwHez.js.map → ticketingApi-Cj239hYB.js.map} +1 -1
  275. package/dist/chunks/{ticketingApi-C6EbupqP.js → ticketingApi-DF4RwD_6.js} +2 -2
  276. package/dist/chunks/{ticketingApi-C6EbupqP.js.map → ticketingApi-DF4RwD_6.js.map} +1 -1
  277. package/dist/chunks/{useAccessRequests-vucIb3_w.js → useAccessRequests-CFam8zFR.js} +3 -3
  278. package/dist/chunks/{useAccessRequests-vucIb3_w.js.map → useAccessRequests-CFam8zFR.js.map} +1 -1
  279. package/dist/chunks/{useAccessRequests-C0dY6y-4.js → useAccessRequests-CViOUwyF.js} +2 -2
  280. package/dist/chunks/{useAccessRequests-C0dY6y-4.js.map → useAccessRequests-CViOUwyF.js.map} +1 -1
  281. package/dist/chunks/{useUserAccessRequests-BBcw1Rk9.js → useUserAccessRequests-B-Cs6NX1.js} +2 -2
  282. package/dist/chunks/{useUserAccessRequests-BBcw1Rk9.js.map → useUserAccessRequests-B-Cs6NX1.js.map} +1 -1
  283. package/dist/chunks/{useUserAccessRequests-Cj0nkesW.js → useUserAccessRequests-CslSQeBJ.js} +2 -2
  284. package/dist/chunks/{useUserAccessRequests-Cj0nkesW.js.map → useUserAccessRequests-CslSQeBJ.js.map} +1 -1
  285. package/dist/contexts/AuthContext.d.ts.map +1 -1
  286. package/dist/pages/LoginPage.d.ts.map +1 -1
  287. package/dist/pages/platform/administration/tenants/TenantDetailPage.d.ts.map +1 -1
  288. package/dist/pages/platform/support/UserCreateTicketPage.d.ts.map +1 -1
  289. package/dist/services/api/apiClient.d.ts.map +1 -1
  290. package/dist/services/support/ticketDraftService.d.ts.map +1 -1
  291. package/dist/smartstack.cjs +1 -1
  292. package/dist/smartstack.js +6 -6
  293. package/dist/utils/permissions.generated.d.ts +288 -0
  294. package/dist/utils/permissions.generated.d.ts.map +1 -0
  295. package/dist/utils/uuid.d.ts +6 -0
  296. package/dist/utils/uuid.d.ts.map +1 -0
  297. package/package.json +1 -1
  298. package/dist/chunks/UserCreateTicketPage-ChQL1mVY.js.map +0 -1
  299. package/dist/chunks/UserCreateTicketPage-DkjsHeV7.js.map +0 -1
  300. package/dist/chunks/auth-B-hELPDB.js +0 -2
  301. package/dist/chunks/auth-B-hELPDB.js.map +0 -1
  302. package/dist/chunks/auth-BYaMuq7D.js +0 -16
  303. package/dist/chunks/auth-BYaMuq7D.js.map +0 -1
  304. package/dist/chunks/auth-C5zpZ9k7.js +0 -2
  305. package/dist/chunks/auth-C5zpZ9k7.js.map +0 -1
  306. package/dist/chunks/auth-CDpRMVv1.js +0 -16
  307. package/dist/chunks/auth-CDpRMVv1.js.map +0 -1
  308. package/dist/chunks/auth-CyPkCta2.js +0 -2
  309. package/dist/chunks/auth-CyPkCta2.js.map +0 -1
  310. package/dist/chunks/auth-DL47kvnl.js +0 -2
  311. package/dist/chunks/auth-DL47kvnl.js.map +0 -1
  312. package/dist/chunks/auth-Diiv90i1.js +0 -16
  313. package/dist/chunks/auth-Diiv90i1.js.map +0 -1
  314. package/dist/chunks/auth-rog9MvUr.js +0 -16
  315. package/dist/chunks/auth-rog9MvUr.js.map +0 -1
  316. package/dist/chunks/index-BIqcvvbh.js.map +0 -1
  317. package/dist/chunks/index-DA5VyW0k.js.map +0 -1
  318. package/dist/chunks/index-Dht6EQW1.js +0 -2
  319. package/dist/chunks/index-Dht6EQW1.js.map +0 -1
  320. package/dist/chunks/index-vXiLh35n.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"NavigationAppsPage-DiPBCsAF.js","sources":["../../src/pages/platform/administration/applications/NavigationAppsPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Edit2, MoreHorizontal, X, Loader2, Eye, EyeOff, ChevronDown, ChevronRight } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport * as LucideIcons from 'lucide-react';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport { adminApi, type ApplicationListDto, type ApplicationModuleDto, type UpdateApplicationRequest, type UpdateModuleRequest } from '@/services/api/adminApi';\r\n\r\n// Dynamic icon component\r\nconst DynamicIcon = ({ name, className }: { name: string; className?: string }) => {\r\n const icons = LucideIcons as unknown as Record<string, LucideIcon>;\r\n const IconComponent = icons[name];\r\n if (!IconComponent) return null;\r\n return <IconComponent className={className} />;\r\n};\r\n\r\nexport function NavigationAppsPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const [applications, setApplications] = useState<ApplicationListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [expandedApps, setExpandedApps] = useState<Set<string>>(new Set());\r\n const [modules, setModules] = useState<Record<string, ApplicationModuleDto[]>>({});\r\n const [showAppModal, setShowAppModal] = useState(false);\r\n const [showModuleModal, setShowModuleModal] = useState(false);\r\n const [editingApp, setEditingApp] = useState<ApplicationListDto | null>(null);\r\n const [editingModule, setEditingModule] = useState<{ appId: string; module: ApplicationModuleDto } | null>(null);\r\n const [appFormData, setAppFormData] = useState({\r\n label: '',\r\n description: '',\r\n icon: '',\r\n iconType: 'Lucide',\r\n route: '',\r\n displayOrder: 0\r\n });\r\n const [moduleFormData, setModuleFormData] = useState({\r\n label: '',\r\n description: '',\r\n icon: '',\r\n iconType: 'Lucide',\r\n route: '',\r\n displayOrder: 0\r\n });\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [menuOpen, setMenuOpen] = useState<string | null>(null);\r\n\r\n const loadApplications = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const result = await adminApi.applications.getAll();\r\n setApplications(result);\r\n } catch (err) {\r\n console.error('Failed to load applications:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n const loadModules = async (appId: string) => {\r\n try {\r\n const result = await adminApi.applications.getModules(appId);\r\n setModules(prev => ({ ...prev, [appId]: result }));\r\n } catch (err) {\r\n console.error('Failed to load modules:', err);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n loadApplications();\r\n }, [loadApplications]);\r\n\r\n const toggleApp = async (appId: string) => {\r\n const next = new Set(expandedApps);\r\n if (next.has(appId)) {\r\n next.delete(appId);\r\n } else {\r\n next.add(appId);\r\n if (!modules[appId]) {\r\n await loadModules(appId);\r\n }\r\n }\r\n setExpandedApps(next);\r\n };\r\n\r\n const openEditAppModal = (app: ApplicationListDto) => {\r\n setEditingApp(app);\r\n setAppFormData({\r\n label: app.label,\r\n description: app.description || '',\r\n icon: app.icon || '',\r\n iconType: app.iconType,\r\n route: app.route || '',\r\n displayOrder: app.displayOrder\r\n });\r\n setError(null);\r\n setShowAppModal(true);\r\n };\r\n\r\n const openEditModuleModal = (appId: string, module: ApplicationModuleDto) => {\r\n setEditingModule({ appId, module });\r\n setModuleFormData({\r\n label: module.label,\r\n description: module.description || '',\r\n icon: module.icon || '',\r\n iconType: module.iconType,\r\n route: module.route || '',\r\n displayOrder: module.displayOrder\r\n });\r\n setError(null);\r\n setShowModuleModal(true);\r\n };\r\n\r\n const handleAppSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!editingApp) return;\r\n\r\n setSaving(true);\r\n setError(null);\r\n\r\n try {\r\n const updateData: UpdateApplicationRequest = {\r\n label: appFormData.label,\r\n description: appFormData.description,\r\n icon: appFormData.icon,\r\n iconType: appFormData.iconType,\r\n route: appFormData.route,\r\n displayOrder: appFormData.displayOrder\r\n };\r\n await adminApi.applications.update(editingApp.id, updateData);\r\n setShowAppModal(false);\r\n loadApplications();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'An error occurred';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleModuleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!editingModule) return;\r\n\r\n setSaving(true);\r\n setError(null);\r\n\r\n try {\r\n const updateData: UpdateModuleRequest = {\r\n label: moduleFormData.label,\r\n description: moduleFormData.description,\r\n icon: moduleFormData.icon,\r\n iconType: moduleFormData.iconType,\r\n route: moduleFormData.route,\r\n displayOrder: moduleFormData.displayOrder\r\n };\r\n await adminApi.applications.updateModule(editingModule.appId, editingModule.module.id, updateData);\r\n setShowModuleModal(false);\r\n loadModules(editingModule.appId);\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'An error occurred';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleToggleAppStatus = async (app: ApplicationListDto) => {\r\n try {\r\n if (app.isActive) {\r\n await adminApi.applications.deactivate(app.id);\r\n } else {\r\n await adminApi.applications.activate(app.id);\r\n }\r\n loadApplications();\r\n } catch (err) {\r\n console.error('Failed to toggle app status:', err);\r\n }\r\n setMenuOpen(null);\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') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{t('applications.title')}</h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">{t('applications.subtitle')}</p>\r\n </div>\r\n </div>\r\n\r\n {/* Applications list */}\r\n <div className=\"space-y-4\">\r\n {loading && (\r\n <div className=\"flex justify-center py-12\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-primary-500\" />\r\n </div>\r\n )}\r\n {!loading && applications.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)] bg-[var(--bg-secondary)] rounded-xl border border-[var(--border-color)]\">\r\n {t('applications.noApps')}\r\n </div>\r\n )}\r\n {!loading && applications.length > 0 && (\r\n applications.map(app => (\r\n <div key={app.id} className=\"bg-[var(--bg-secondary)] rounded-xl border border-[var(--border-color)] overflow-hidden\">\r\n <div className=\"flex items-center gap-4 p-4\">\r\n <button\r\n onClick={() => toggleApp(app.id)}\r\n className=\"p-1 rounded hover:bg-[var(--bg-hover)]\"\r\n >\r\n {expandedApps.has(app.id) ? (\r\n <ChevronDown className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n ) : (\r\n <ChevronRight className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n )}\r\n </button>\r\n\r\n <div className=\"w-10 h-10 rounded-xl bg-primary-100 dark:bg-primary-900 flex items-center justify-center\">\r\n {app.iconType === 'Lucide' && app.icon && (\r\n <DynamicIcon name={app.icon} className=\"w-5 h-5 text-primary-600 dark:text-primary-400\" />\r\n )}\r\n {app.iconType === 'Url' && app.icon && (\r\n <img src={app.icon} alt=\"\" className=\"w-6 h-6\" />\r\n )}\r\n {!(app.iconType === 'Lucide' && app.icon) && !(app.iconType === 'Url' && app.icon) && (\r\n <div className=\"w-5 h-5 bg-primary-500 rounded\" />\r\n )}\r\n </div>\r\n\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">{app.label}</span>\r\n <span className=\"px-2 py-0.5 text-xs rounded-full bg-[var(--bg-tertiary)] text-[var(--text-secondary)]\">\r\n {app.zone}\r\n </span>\r\n {!app.isActive && (\r\n <span className=\"px-2 py-0.5 text-xs rounded-full bg-red-100 dark:bg-red-900 text-red-700 dark:text-red-300\">\r\n {t('common.inactive')}\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {app.description || app.route}\r\n </div>\r\n </div>\r\n\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {app.modulesCount} {t('applications.modules')}\r\n </div>\r\n\r\n <div className=\"relative\">\r\n <button\r\n onClick={() => setMenuOpen(menuOpen === app.id ? null : app.id)}\r\n className=\"p-2 rounded-lg hover:bg-[var(--bg-tertiary)] transition-colors\"\r\n >\r\n <MoreHorizontal className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n </button>\r\n {menuOpen === app.id && (\r\n <div className=\"absolute right-0 top-full mt-1 w-48 py-1 bg-[var(--bg-secondary)] rounded-xl border border-[var(--border-color)] shadow-lg z-10\">\r\n <button\r\n onClick={() => { openEditAppModal(app); setMenuOpen(null); }}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-left text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n {t('common.edit')}\r\n </button>\r\n <button\r\n onClick={() => handleToggleAppStatus(app)}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-left text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {app.isActive ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\r\n {app.isActive ? t('common.deactivate') : t('common.activate')}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {expandedApps.has(app.id) && (\r\n <div className=\"border-t border-[var(--border-color)] p-4 bg-[var(--bg-primary)]\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"font-medium text-[var(--text-primary)]\">{t('applications.modules')}</h3>\r\n </div>\r\n\r\n {modules[app.id] ? (\r\n modules[app.id].length === 0 ? (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {t('applications.noModules')}\r\n </div>\r\n ) : (\r\n <div className=\"space-y-2\">\r\n {modules[app.id].map(module => (\r\n <div\r\n key={module.id}\r\n className=\"flex items-center gap-3 p-3 rounded-lg bg-[var(--bg-secondary)] border border-[var(--border-color)]\"\r\n >\r\n <div className=\"w-8 h-8 rounded-lg bg-[var(--bg-tertiary)] flex items-center justify-center\">\r\n {module.iconType === 'Lucide' && module.icon ? (\r\n <DynamicIcon name={module.icon} className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n ) : (\r\n <div className=\"w-4 h-4 bg-[var(--text-tertiary)] rounded\" />\r\n )}\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"font-medium text-sm text-[var(--text-primary)]\">{module.label}</div>\r\n <div className=\"text-xs text-[var(--text-secondary)]\">{module.route}</div>\r\n </div>\r\n <div className=\"flex items-center gap-1\">\r\n <button\r\n onClick={() => openEditModuleModal(app.id, module)}\r\n className=\"p-1.5 rounded-lg hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <Edit2 className=\"w-3.5 h-3.5 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )\r\n ) : (\r\n <div className=\"flex justify-center py-4\">\r\n <Loader2 className=\"w-5 h-5 animate-spin text-primary-500\" />\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n ))\r\n )}\r\n </div>\r\n\r\n {/* Application Edit Modal */}\r\n {showAppModal && editingApp && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-2xl w-full max-w-lg p-6 m-4 max-h-[90vh] overflow-y-auto\">\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">\r\n {t('applications.edit')}\r\n </h2>\r\n <button onClick={() => setShowAppModal(false)} className=\"p-2 rounded-lg hover:bg-[var(--bg-hover)]\">\r\n <X className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-4 p-3 rounded-lg bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300 text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleAppSubmit} className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.code')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={editingApp.code}\r\n disabled\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-tertiary)] text-[var(--text-muted)] cursor-not-allowed\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.label')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={appFormData.label}\r\n onChange={e => setAppFormData(prev => ({ ...prev, label: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.description')}\r\n </label>\r\n <textarea\r\n value={appFormData.description}\r\n onChange={e => setAppFormData(prev => ({ ...prev, description: e.target.value }))}\r\n rows={2}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500 resize-none\"\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.iconType')}\r\n </label>\r\n <select\r\n value={appFormData.iconType}\r\n onChange={e => setAppFormData(prev => ({ ...prev, iconType: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n >\r\n <option value=\"Lucide\">Lucide Icon</option>\r\n <option value=\"Url\">URL</option>\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.icon')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={appFormData.icon}\r\n onChange={e => setAppFormData(prev => ({ ...prev, icon: e.target.value }))}\r\n placeholder={appFormData.iconType === 'Lucide' ? 'Shield, Users, Settings...' : 'https://...'}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.route')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={appFormData.route}\r\n onChange={e => setAppFormData(prev => ({ ...prev, route: e.target.value }))}\r\n placeholder=\"/administration/...\"\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n\r\n <div className=\"flex justify-end gap-2 pt-4\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowAppModal(false)}\r\n className=\"px-4 py-2 rounded-xl bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] font-medium transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={saving}\r\n className=\"px-4 py-2 rounded-xl bg-primary-600 hover:bg-primary-700 text-white font-medium transition-colors disabled:opacity-50 flex items-center gap-2\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Module Edit Modal */}\r\n {showModuleModal && editingModule && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-2xl w-full max-w-lg p-6 m-4 max-h-[90vh] overflow-y-auto\">\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">\r\n {t('applications.editModule')}\r\n </h2>\r\n <button onClick={() => setShowModuleModal(false)} className=\"p-2 rounded-lg hover:bg-[var(--bg-hover)]\">\r\n <X className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-4 p-3 rounded-lg bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300 text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleModuleSubmit} className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.code')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={editingModule.module.code}\r\n disabled\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-tertiary)] text-[var(--text-muted)] cursor-not-allowed\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.label')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={moduleFormData.label}\r\n onChange={e => setModuleFormData(prev => ({ ...prev, label: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.iconType')}\r\n </label>\r\n <select\r\n value={moduleFormData.iconType}\r\n onChange={e => setModuleFormData(prev => ({ ...prev, iconType: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n >\r\n <option value=\"Lucide\">Lucide Icon</option>\r\n <option value=\"Url\">URL</option>\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.icon')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={moduleFormData.icon}\r\n onChange={e => setModuleFormData(prev => ({ ...prev, icon: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.route')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={moduleFormData.route}\r\n onChange={e => setModuleFormData(prev => ({ ...prev, route: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n\r\n <div className=\"flex justify-end gap-2 pt-4\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowModuleModal(false)}\r\n className=\"px-4 py-2 rounded-xl bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] font-medium transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={saving}\r\n className=\"px-4 py-2 rounded-xl bg-primary-600 hover:bg-primary-700 text-white font-medium transition-colors disabled:opacity-50 flex items-center gap-2\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["DynamicIcon","name","className","IconComponent","LucideIcons","jsx","NavigationAppsPage","t","useTranslation","applications","setApplications","useState","loading","setLoading","expandedApps","setExpandedApps","modules","setModules","showAppModal","setShowAppModal","showModuleModal","setShowModuleModal","editingApp","setEditingApp","editingModule","setEditingModule","appFormData","setAppFormData","moduleFormData","setModuleFormData","saving","setSaving","error","setError","menuOpen","setMenuOpen","loadApplications","useCallback","result","adminApi","err","loadModules","appId","prev","useEffect","toggleApp","next","openEditAppModal","app","openEditModuleModal","module","handleAppSubmit","e","updateData","message","handleModuleSubmit","handleToggleAppStatus","jsxs","Breadcrumb","Loader2","ChevronDown","ChevronRight","MoreHorizontal","Edit2","EyeOff","Eye","X"],"mappings":"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"}
1
+ {"version":3,"file":"NavigationAppsPage-DXvpLsbt.js","sources":["../../src/pages/platform/administration/applications/NavigationAppsPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Edit2, MoreHorizontal, X, Loader2, Eye, EyeOff, ChevronDown, ChevronRight } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport * as LucideIcons from 'lucide-react';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport { adminApi, type ApplicationListDto, type ApplicationModuleDto, type UpdateApplicationRequest, type UpdateModuleRequest } from '@/services/api/adminApi';\r\n\r\n// Dynamic icon component\r\nconst DynamicIcon = ({ name, className }: { name: string; className?: string }) => {\r\n const icons = LucideIcons as unknown as Record<string, LucideIcon>;\r\n const IconComponent = icons[name];\r\n if (!IconComponent) return null;\r\n return <IconComponent className={className} />;\r\n};\r\n\r\nexport function NavigationAppsPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const [applications, setApplications] = useState<ApplicationListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [expandedApps, setExpandedApps] = useState<Set<string>>(new Set());\r\n const [modules, setModules] = useState<Record<string, ApplicationModuleDto[]>>({});\r\n const [showAppModal, setShowAppModal] = useState(false);\r\n const [showModuleModal, setShowModuleModal] = useState(false);\r\n const [editingApp, setEditingApp] = useState<ApplicationListDto | null>(null);\r\n const [editingModule, setEditingModule] = useState<{ appId: string; module: ApplicationModuleDto } | null>(null);\r\n const [appFormData, setAppFormData] = useState({\r\n label: '',\r\n description: '',\r\n icon: '',\r\n iconType: 'Lucide',\r\n route: '',\r\n displayOrder: 0\r\n });\r\n const [moduleFormData, setModuleFormData] = useState({\r\n label: '',\r\n description: '',\r\n icon: '',\r\n iconType: 'Lucide',\r\n route: '',\r\n displayOrder: 0\r\n });\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [menuOpen, setMenuOpen] = useState<string | null>(null);\r\n\r\n const loadApplications = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const result = await adminApi.applications.getAll();\r\n setApplications(result);\r\n } catch (err) {\r\n console.error('Failed to load applications:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n const loadModules = async (appId: string) => {\r\n try {\r\n const result = await adminApi.applications.getModules(appId);\r\n setModules(prev => ({ ...prev, [appId]: result }));\r\n } catch (err) {\r\n console.error('Failed to load modules:', err);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n loadApplications();\r\n }, [loadApplications]);\r\n\r\n const toggleApp = async (appId: string) => {\r\n const next = new Set(expandedApps);\r\n if (next.has(appId)) {\r\n next.delete(appId);\r\n } else {\r\n next.add(appId);\r\n if (!modules[appId]) {\r\n await loadModules(appId);\r\n }\r\n }\r\n setExpandedApps(next);\r\n };\r\n\r\n const openEditAppModal = (app: ApplicationListDto) => {\r\n setEditingApp(app);\r\n setAppFormData({\r\n label: app.label,\r\n description: app.description || '',\r\n icon: app.icon || '',\r\n iconType: app.iconType,\r\n route: app.route || '',\r\n displayOrder: app.displayOrder\r\n });\r\n setError(null);\r\n setShowAppModal(true);\r\n };\r\n\r\n const openEditModuleModal = (appId: string, module: ApplicationModuleDto) => {\r\n setEditingModule({ appId, module });\r\n setModuleFormData({\r\n label: module.label,\r\n description: module.description || '',\r\n icon: module.icon || '',\r\n iconType: module.iconType,\r\n route: module.route || '',\r\n displayOrder: module.displayOrder\r\n });\r\n setError(null);\r\n setShowModuleModal(true);\r\n };\r\n\r\n const handleAppSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!editingApp) return;\r\n\r\n setSaving(true);\r\n setError(null);\r\n\r\n try {\r\n const updateData: UpdateApplicationRequest = {\r\n label: appFormData.label,\r\n description: appFormData.description,\r\n icon: appFormData.icon,\r\n iconType: appFormData.iconType,\r\n route: appFormData.route,\r\n displayOrder: appFormData.displayOrder\r\n };\r\n await adminApi.applications.update(editingApp.id, updateData);\r\n setShowAppModal(false);\r\n loadApplications();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'An error occurred';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleModuleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!editingModule) return;\r\n\r\n setSaving(true);\r\n setError(null);\r\n\r\n try {\r\n const updateData: UpdateModuleRequest = {\r\n label: moduleFormData.label,\r\n description: moduleFormData.description,\r\n icon: moduleFormData.icon,\r\n iconType: moduleFormData.iconType,\r\n route: moduleFormData.route,\r\n displayOrder: moduleFormData.displayOrder\r\n };\r\n await adminApi.applications.updateModule(editingModule.appId, editingModule.module.id, updateData);\r\n setShowModuleModal(false);\r\n loadModules(editingModule.appId);\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'An error occurred';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleToggleAppStatus = async (app: ApplicationListDto) => {\r\n try {\r\n if (app.isActive) {\r\n await adminApi.applications.deactivate(app.id);\r\n } else {\r\n await adminApi.applications.activate(app.id);\r\n }\r\n loadApplications();\r\n } catch (err) {\r\n console.error('Failed to toggle app status:', err);\r\n }\r\n setMenuOpen(null);\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') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{t('applications.title')}</h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">{t('applications.subtitle')}</p>\r\n </div>\r\n </div>\r\n\r\n {/* Applications list */}\r\n <div className=\"space-y-4\">\r\n {loading && (\r\n <div className=\"flex justify-center py-12\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-primary-500\" />\r\n </div>\r\n )}\r\n {!loading && applications.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)] bg-[var(--bg-secondary)] rounded-xl border border-[var(--border-color)]\">\r\n {t('applications.noApps')}\r\n </div>\r\n )}\r\n {!loading && applications.length > 0 && (\r\n applications.map(app => (\r\n <div key={app.id} className=\"bg-[var(--bg-secondary)] rounded-xl border border-[var(--border-color)] overflow-hidden\">\r\n <div className=\"flex items-center gap-4 p-4\">\r\n <button\r\n onClick={() => toggleApp(app.id)}\r\n className=\"p-1 rounded hover:bg-[var(--bg-hover)]\"\r\n >\r\n {expandedApps.has(app.id) ? (\r\n <ChevronDown className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n ) : (\r\n <ChevronRight className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n )}\r\n </button>\r\n\r\n <div className=\"w-10 h-10 rounded-xl bg-primary-100 dark:bg-primary-900 flex items-center justify-center\">\r\n {app.iconType === 'Lucide' && app.icon && (\r\n <DynamicIcon name={app.icon} className=\"w-5 h-5 text-primary-600 dark:text-primary-400\" />\r\n )}\r\n {app.iconType === 'Url' && app.icon && (\r\n <img src={app.icon} alt=\"\" className=\"w-6 h-6\" />\r\n )}\r\n {!(app.iconType === 'Lucide' && app.icon) && !(app.iconType === 'Url' && app.icon) && (\r\n <div className=\"w-5 h-5 bg-primary-500 rounded\" />\r\n )}\r\n </div>\r\n\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">{app.label}</span>\r\n <span className=\"px-2 py-0.5 text-xs rounded-full bg-[var(--bg-tertiary)] text-[var(--text-secondary)]\">\r\n {app.zone}\r\n </span>\r\n {!app.isActive && (\r\n <span className=\"px-2 py-0.5 text-xs rounded-full bg-red-100 dark:bg-red-900 text-red-700 dark:text-red-300\">\r\n {t('common.inactive')}\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {app.description || app.route}\r\n </div>\r\n </div>\r\n\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {app.modulesCount} {t('applications.modules')}\r\n </div>\r\n\r\n <div className=\"relative\">\r\n <button\r\n onClick={() => setMenuOpen(menuOpen === app.id ? null : app.id)}\r\n className=\"p-2 rounded-lg hover:bg-[var(--bg-tertiary)] transition-colors\"\r\n >\r\n <MoreHorizontal className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n </button>\r\n {menuOpen === app.id && (\r\n <div className=\"absolute right-0 top-full mt-1 w-48 py-1 bg-[var(--bg-secondary)] rounded-xl border border-[var(--border-color)] shadow-lg z-10\">\r\n <button\r\n onClick={() => { openEditAppModal(app); setMenuOpen(null); }}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-left text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n {t('common.edit')}\r\n </button>\r\n <button\r\n onClick={() => handleToggleAppStatus(app)}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-left text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {app.isActive ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\r\n {app.isActive ? t('common.deactivate') : t('common.activate')}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {expandedApps.has(app.id) && (\r\n <div className=\"border-t border-[var(--border-color)] p-4 bg-[var(--bg-primary)]\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"font-medium text-[var(--text-primary)]\">{t('applications.modules')}</h3>\r\n </div>\r\n\r\n {modules[app.id] ? (\r\n modules[app.id].length === 0 ? (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {t('applications.noModules')}\r\n </div>\r\n ) : (\r\n <div className=\"space-y-2\">\r\n {modules[app.id].map(module => (\r\n <div\r\n key={module.id}\r\n className=\"flex items-center gap-3 p-3 rounded-lg bg-[var(--bg-secondary)] border border-[var(--border-color)]\"\r\n >\r\n <div className=\"w-8 h-8 rounded-lg bg-[var(--bg-tertiary)] flex items-center justify-center\">\r\n {module.iconType === 'Lucide' && module.icon ? (\r\n <DynamicIcon name={module.icon} className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n ) : (\r\n <div className=\"w-4 h-4 bg-[var(--text-tertiary)] rounded\" />\r\n )}\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"font-medium text-sm text-[var(--text-primary)]\">{module.label}</div>\r\n <div className=\"text-xs text-[var(--text-secondary)]\">{module.route}</div>\r\n </div>\r\n <div className=\"flex items-center gap-1\">\r\n <button\r\n onClick={() => openEditModuleModal(app.id, module)}\r\n className=\"p-1.5 rounded-lg hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <Edit2 className=\"w-3.5 h-3.5 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )\r\n ) : (\r\n <div className=\"flex justify-center py-4\">\r\n <Loader2 className=\"w-5 h-5 animate-spin text-primary-500\" />\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n ))\r\n )}\r\n </div>\r\n\r\n {/* Application Edit Modal */}\r\n {showAppModal && editingApp && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-2xl w-full max-w-lg p-6 m-4 max-h-[90vh] overflow-y-auto\">\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">\r\n {t('applications.edit')}\r\n </h2>\r\n <button onClick={() => setShowAppModal(false)} className=\"p-2 rounded-lg hover:bg-[var(--bg-hover)]\">\r\n <X className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-4 p-3 rounded-lg bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300 text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleAppSubmit} className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.code')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={editingApp.code}\r\n disabled\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-tertiary)] text-[var(--text-muted)] cursor-not-allowed\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.label')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={appFormData.label}\r\n onChange={e => setAppFormData(prev => ({ ...prev, label: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.description')}\r\n </label>\r\n <textarea\r\n value={appFormData.description}\r\n onChange={e => setAppFormData(prev => ({ ...prev, description: e.target.value }))}\r\n rows={2}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500 resize-none\"\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.iconType')}\r\n </label>\r\n <select\r\n value={appFormData.iconType}\r\n onChange={e => setAppFormData(prev => ({ ...prev, iconType: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n >\r\n <option value=\"Lucide\">Lucide Icon</option>\r\n <option value=\"Url\">URL</option>\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.icon')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={appFormData.icon}\r\n onChange={e => setAppFormData(prev => ({ ...prev, icon: e.target.value }))}\r\n placeholder={appFormData.iconType === 'Lucide' ? 'Shield, Users, Settings...' : 'https://...'}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.route')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={appFormData.route}\r\n onChange={e => setAppFormData(prev => ({ ...prev, route: e.target.value }))}\r\n placeholder=\"/administration/...\"\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n\r\n <div className=\"flex justify-end gap-2 pt-4\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowAppModal(false)}\r\n className=\"px-4 py-2 rounded-xl bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] font-medium transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={saving}\r\n className=\"px-4 py-2 rounded-xl bg-primary-600 hover:bg-primary-700 text-white font-medium transition-colors disabled:opacity-50 flex items-center gap-2\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Module Edit Modal */}\r\n {showModuleModal && editingModule && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-2xl w-full max-w-lg p-6 m-4 max-h-[90vh] overflow-y-auto\">\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">\r\n {t('applications.editModule')}\r\n </h2>\r\n <button onClick={() => setShowModuleModal(false)} className=\"p-2 rounded-lg hover:bg-[var(--bg-hover)]\">\r\n <X className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-4 p-3 rounded-lg bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300 text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleModuleSubmit} className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.code')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={editingModule.module.code}\r\n disabled\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-tertiary)] text-[var(--text-muted)] cursor-not-allowed\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.label')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={moduleFormData.label}\r\n onChange={e => setModuleFormData(prev => ({ ...prev, label: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.iconType')}\r\n </label>\r\n <select\r\n value={moduleFormData.iconType}\r\n onChange={e => setModuleFormData(prev => ({ ...prev, iconType: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n >\r\n <option value=\"Lucide\">Lucide Icon</option>\r\n <option value=\"Url\">URL</option>\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.icon')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={moduleFormData.icon}\r\n onChange={e => setModuleFormData(prev => ({ ...prev, icon: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.route')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={moduleFormData.route}\r\n onChange={e => setModuleFormData(prev => ({ ...prev, route: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n\r\n <div className=\"flex justify-end gap-2 pt-4\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowModuleModal(false)}\r\n className=\"px-4 py-2 rounded-xl bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] font-medium transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={saving}\r\n className=\"px-4 py-2 rounded-xl bg-primary-600 hover:bg-primary-700 text-white font-medium transition-colors disabled:opacity-50 flex items-center gap-2\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["DynamicIcon","name","className","IconComponent","LucideIcons","jsx","NavigationAppsPage","t","useTranslation","applications","setApplications","useState","loading","setLoading","expandedApps","setExpandedApps","modules","setModules","showAppModal","setShowAppModal","showModuleModal","setShowModuleModal","editingApp","setEditingApp","editingModule","setEditingModule","appFormData","setAppFormData","moduleFormData","setModuleFormData","saving","setSaving","error","setError","menuOpen","setMenuOpen","loadApplications","useCallback","result","adminApi","err","loadModules","appId","prev","useEffect","toggleApp","next","openEditAppModal","app","openEditModuleModal","module","handleAppSubmit","e","updateData","message","handleModuleSubmit","handleToggleAppStatus","jsxs","Breadcrumb","Loader2","ChevronDown","ChevronRight","MoreHorizontal","Edit2","EyeOff","Eye","X"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { useState as i, useCallback as K, useEffect as Q } from "react";
3
3
  import { useTranslation as V } from "react-i18next";
4
4
  import * as W from "lucide-react";
5
5
  import { Loader2 as T, ChevronDown as Y, ChevronRight as Z, MoreHorizontal as _, Edit2 as S, EyeOff as $, Eye as ee, X as E } from "lucide-react";
6
- import { k as u, B as re } from "./index-DA5VyW0k.js";
6
+ import { k as u, B as re } from "./index-CN2WRyg1.js";
7
7
  const D = ({ name: o, className: p }) => {
8
8
  const s = W[o];
9
9
  return s ? /* @__PURE__ */ r(s, { className: p }) : null;
@@ -437,4 +437,4 @@ function ne() {
437
437
  export {
438
438
  ne as NavigationAppsPage
439
439
  };
440
- //# sourceMappingURL=NavigationAppsPage-ChtMK1yt.js.map
440
+ //# sourceMappingURL=NavigationAppsPage-DfTa4jCG.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NavigationAppsPage-ChtMK1yt.js","sources":["../../src/pages/platform/administration/applications/NavigationAppsPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Edit2, MoreHorizontal, X, Loader2, Eye, EyeOff, ChevronDown, ChevronRight } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport * as LucideIcons from 'lucide-react';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport { adminApi, type ApplicationListDto, type ApplicationModuleDto, type UpdateApplicationRequest, type UpdateModuleRequest } from '@/services/api/adminApi';\r\n\r\n// Dynamic icon component\r\nconst DynamicIcon = ({ name, className }: { name: string; className?: string }) => {\r\n const icons = LucideIcons as unknown as Record<string, LucideIcon>;\r\n const IconComponent = icons[name];\r\n if (!IconComponent) return null;\r\n return <IconComponent className={className} />;\r\n};\r\n\r\nexport function NavigationAppsPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const [applications, setApplications] = useState<ApplicationListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [expandedApps, setExpandedApps] = useState<Set<string>>(new Set());\r\n const [modules, setModules] = useState<Record<string, ApplicationModuleDto[]>>({});\r\n const [showAppModal, setShowAppModal] = useState(false);\r\n const [showModuleModal, setShowModuleModal] = useState(false);\r\n const [editingApp, setEditingApp] = useState<ApplicationListDto | null>(null);\r\n const [editingModule, setEditingModule] = useState<{ appId: string; module: ApplicationModuleDto } | null>(null);\r\n const [appFormData, setAppFormData] = useState({\r\n label: '',\r\n description: '',\r\n icon: '',\r\n iconType: 'Lucide',\r\n route: '',\r\n displayOrder: 0\r\n });\r\n const [moduleFormData, setModuleFormData] = useState({\r\n label: '',\r\n description: '',\r\n icon: '',\r\n iconType: 'Lucide',\r\n route: '',\r\n displayOrder: 0\r\n });\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [menuOpen, setMenuOpen] = useState<string | null>(null);\r\n\r\n const loadApplications = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const result = await adminApi.applications.getAll();\r\n setApplications(result);\r\n } catch (err) {\r\n console.error('Failed to load applications:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n const loadModules = async (appId: string) => {\r\n try {\r\n const result = await adminApi.applications.getModules(appId);\r\n setModules(prev => ({ ...prev, [appId]: result }));\r\n } catch (err) {\r\n console.error('Failed to load modules:', err);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n loadApplications();\r\n }, [loadApplications]);\r\n\r\n const toggleApp = async (appId: string) => {\r\n const next = new Set(expandedApps);\r\n if (next.has(appId)) {\r\n next.delete(appId);\r\n } else {\r\n next.add(appId);\r\n if (!modules[appId]) {\r\n await loadModules(appId);\r\n }\r\n }\r\n setExpandedApps(next);\r\n };\r\n\r\n const openEditAppModal = (app: ApplicationListDto) => {\r\n setEditingApp(app);\r\n setAppFormData({\r\n label: app.label,\r\n description: app.description || '',\r\n icon: app.icon || '',\r\n iconType: app.iconType,\r\n route: app.route || '',\r\n displayOrder: app.displayOrder\r\n });\r\n setError(null);\r\n setShowAppModal(true);\r\n };\r\n\r\n const openEditModuleModal = (appId: string, module: ApplicationModuleDto) => {\r\n setEditingModule({ appId, module });\r\n setModuleFormData({\r\n label: module.label,\r\n description: module.description || '',\r\n icon: module.icon || '',\r\n iconType: module.iconType,\r\n route: module.route || '',\r\n displayOrder: module.displayOrder\r\n });\r\n setError(null);\r\n setShowModuleModal(true);\r\n };\r\n\r\n const handleAppSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!editingApp) return;\r\n\r\n setSaving(true);\r\n setError(null);\r\n\r\n try {\r\n const updateData: UpdateApplicationRequest = {\r\n label: appFormData.label,\r\n description: appFormData.description,\r\n icon: appFormData.icon,\r\n iconType: appFormData.iconType,\r\n route: appFormData.route,\r\n displayOrder: appFormData.displayOrder\r\n };\r\n await adminApi.applications.update(editingApp.id, updateData);\r\n setShowAppModal(false);\r\n loadApplications();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'An error occurred';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleModuleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!editingModule) return;\r\n\r\n setSaving(true);\r\n setError(null);\r\n\r\n try {\r\n const updateData: UpdateModuleRequest = {\r\n label: moduleFormData.label,\r\n description: moduleFormData.description,\r\n icon: moduleFormData.icon,\r\n iconType: moduleFormData.iconType,\r\n route: moduleFormData.route,\r\n displayOrder: moduleFormData.displayOrder\r\n };\r\n await adminApi.applications.updateModule(editingModule.appId, editingModule.module.id, updateData);\r\n setShowModuleModal(false);\r\n loadModules(editingModule.appId);\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'An error occurred';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleToggleAppStatus = async (app: ApplicationListDto) => {\r\n try {\r\n if (app.isActive) {\r\n await adminApi.applications.deactivate(app.id);\r\n } else {\r\n await adminApi.applications.activate(app.id);\r\n }\r\n loadApplications();\r\n } catch (err) {\r\n console.error('Failed to toggle app status:', err);\r\n }\r\n setMenuOpen(null);\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') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{t('applications.title')}</h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">{t('applications.subtitle')}</p>\r\n </div>\r\n </div>\r\n\r\n {/* Applications list */}\r\n <div className=\"space-y-4\">\r\n {loading && (\r\n <div className=\"flex justify-center py-12\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-primary-500\" />\r\n </div>\r\n )}\r\n {!loading && applications.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)] bg-[var(--bg-secondary)] rounded-xl border border-[var(--border-color)]\">\r\n {t('applications.noApps')}\r\n </div>\r\n )}\r\n {!loading && applications.length > 0 && (\r\n applications.map(app => (\r\n <div key={app.id} className=\"bg-[var(--bg-secondary)] rounded-xl border border-[var(--border-color)] overflow-hidden\">\r\n <div className=\"flex items-center gap-4 p-4\">\r\n <button\r\n onClick={() => toggleApp(app.id)}\r\n className=\"p-1 rounded hover:bg-[var(--bg-hover)]\"\r\n >\r\n {expandedApps.has(app.id) ? (\r\n <ChevronDown className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n ) : (\r\n <ChevronRight className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n )}\r\n </button>\r\n\r\n <div className=\"w-10 h-10 rounded-xl bg-primary-100 dark:bg-primary-900 flex items-center justify-center\">\r\n {app.iconType === 'Lucide' && app.icon && (\r\n <DynamicIcon name={app.icon} className=\"w-5 h-5 text-primary-600 dark:text-primary-400\" />\r\n )}\r\n {app.iconType === 'Url' && app.icon && (\r\n <img src={app.icon} alt=\"\" className=\"w-6 h-6\" />\r\n )}\r\n {!(app.iconType === 'Lucide' && app.icon) && !(app.iconType === 'Url' && app.icon) && (\r\n <div className=\"w-5 h-5 bg-primary-500 rounded\" />\r\n )}\r\n </div>\r\n\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">{app.label}</span>\r\n <span className=\"px-2 py-0.5 text-xs rounded-full bg-[var(--bg-tertiary)] text-[var(--text-secondary)]\">\r\n {app.zone}\r\n </span>\r\n {!app.isActive && (\r\n <span className=\"px-2 py-0.5 text-xs rounded-full bg-red-100 dark:bg-red-900 text-red-700 dark:text-red-300\">\r\n {t('common.inactive')}\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {app.description || app.route}\r\n </div>\r\n </div>\r\n\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {app.modulesCount} {t('applications.modules')}\r\n </div>\r\n\r\n <div className=\"relative\">\r\n <button\r\n onClick={() => setMenuOpen(menuOpen === app.id ? null : app.id)}\r\n className=\"p-2 rounded-lg hover:bg-[var(--bg-tertiary)] transition-colors\"\r\n >\r\n <MoreHorizontal className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n </button>\r\n {menuOpen === app.id && (\r\n <div className=\"absolute right-0 top-full mt-1 w-48 py-1 bg-[var(--bg-secondary)] rounded-xl border border-[var(--border-color)] shadow-lg z-10\">\r\n <button\r\n onClick={() => { openEditAppModal(app); setMenuOpen(null); }}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-left text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n {t('common.edit')}\r\n </button>\r\n <button\r\n onClick={() => handleToggleAppStatus(app)}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-left text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {app.isActive ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\r\n {app.isActive ? t('common.deactivate') : t('common.activate')}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {expandedApps.has(app.id) && (\r\n <div className=\"border-t border-[var(--border-color)] p-4 bg-[var(--bg-primary)]\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"font-medium text-[var(--text-primary)]\">{t('applications.modules')}</h3>\r\n </div>\r\n\r\n {modules[app.id] ? (\r\n modules[app.id].length === 0 ? (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {t('applications.noModules')}\r\n </div>\r\n ) : (\r\n <div className=\"space-y-2\">\r\n {modules[app.id].map(module => (\r\n <div\r\n key={module.id}\r\n className=\"flex items-center gap-3 p-3 rounded-lg bg-[var(--bg-secondary)] border border-[var(--border-color)]\"\r\n >\r\n <div className=\"w-8 h-8 rounded-lg bg-[var(--bg-tertiary)] flex items-center justify-center\">\r\n {module.iconType === 'Lucide' && module.icon ? (\r\n <DynamicIcon name={module.icon} className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n ) : (\r\n <div className=\"w-4 h-4 bg-[var(--text-tertiary)] rounded\" />\r\n )}\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"font-medium text-sm text-[var(--text-primary)]\">{module.label}</div>\r\n <div className=\"text-xs text-[var(--text-secondary)]\">{module.route}</div>\r\n </div>\r\n <div className=\"flex items-center gap-1\">\r\n <button\r\n onClick={() => openEditModuleModal(app.id, module)}\r\n className=\"p-1.5 rounded-lg hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <Edit2 className=\"w-3.5 h-3.5 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )\r\n ) : (\r\n <div className=\"flex justify-center py-4\">\r\n <Loader2 className=\"w-5 h-5 animate-spin text-primary-500\" />\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n ))\r\n )}\r\n </div>\r\n\r\n {/* Application Edit Modal */}\r\n {showAppModal && editingApp && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-2xl w-full max-w-lg p-6 m-4 max-h-[90vh] overflow-y-auto\">\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">\r\n {t('applications.edit')}\r\n </h2>\r\n <button onClick={() => setShowAppModal(false)} className=\"p-2 rounded-lg hover:bg-[var(--bg-hover)]\">\r\n <X className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-4 p-3 rounded-lg bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300 text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleAppSubmit} className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.code')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={editingApp.code}\r\n disabled\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-tertiary)] text-[var(--text-muted)] cursor-not-allowed\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.label')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={appFormData.label}\r\n onChange={e => setAppFormData(prev => ({ ...prev, label: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.description')}\r\n </label>\r\n <textarea\r\n value={appFormData.description}\r\n onChange={e => setAppFormData(prev => ({ ...prev, description: e.target.value }))}\r\n rows={2}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500 resize-none\"\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.iconType')}\r\n </label>\r\n <select\r\n value={appFormData.iconType}\r\n onChange={e => setAppFormData(prev => ({ ...prev, iconType: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n >\r\n <option value=\"Lucide\">Lucide Icon</option>\r\n <option value=\"Url\">URL</option>\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.icon')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={appFormData.icon}\r\n onChange={e => setAppFormData(prev => ({ ...prev, icon: e.target.value }))}\r\n placeholder={appFormData.iconType === 'Lucide' ? 'Shield, Users, Settings...' : 'https://...'}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.route')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={appFormData.route}\r\n onChange={e => setAppFormData(prev => ({ ...prev, route: e.target.value }))}\r\n placeholder=\"/administration/...\"\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n\r\n <div className=\"flex justify-end gap-2 pt-4\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowAppModal(false)}\r\n className=\"px-4 py-2 rounded-xl bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] font-medium transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={saving}\r\n className=\"px-4 py-2 rounded-xl bg-primary-600 hover:bg-primary-700 text-white font-medium transition-colors disabled:opacity-50 flex items-center gap-2\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Module Edit Modal */}\r\n {showModuleModal && editingModule && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-2xl w-full max-w-lg p-6 m-4 max-h-[90vh] overflow-y-auto\">\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">\r\n {t('applications.editModule')}\r\n </h2>\r\n <button onClick={() => setShowModuleModal(false)} className=\"p-2 rounded-lg hover:bg-[var(--bg-hover)]\">\r\n <X className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-4 p-3 rounded-lg bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300 text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleModuleSubmit} className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.code')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={editingModule.module.code}\r\n disabled\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-tertiary)] text-[var(--text-muted)] cursor-not-allowed\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.label')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={moduleFormData.label}\r\n onChange={e => setModuleFormData(prev => ({ ...prev, label: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.iconType')}\r\n </label>\r\n <select\r\n value={moduleFormData.iconType}\r\n onChange={e => setModuleFormData(prev => ({ ...prev, iconType: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n >\r\n <option value=\"Lucide\">Lucide Icon</option>\r\n <option value=\"Url\">URL</option>\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.icon')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={moduleFormData.icon}\r\n onChange={e => setModuleFormData(prev => ({ ...prev, icon: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.route')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={moduleFormData.route}\r\n onChange={e => setModuleFormData(prev => ({ ...prev, route: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n\r\n <div className=\"flex justify-end gap-2 pt-4\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowModuleModal(false)}\r\n className=\"px-4 py-2 rounded-xl bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] font-medium transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={saving}\r\n className=\"px-4 py-2 rounded-xl bg-primary-600 hover:bg-primary-700 text-white font-medium transition-colors disabled:opacity-50 flex items-center gap-2\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["DynamicIcon","name","className","IconComponent","LucideIcons","jsx","NavigationAppsPage","t","useTranslation","applications","setApplications","useState","loading","setLoading","expandedApps","setExpandedApps","modules","setModules","showAppModal","setShowAppModal","showModuleModal","setShowModuleModal","editingApp","setEditingApp","editingModule","setEditingModule","appFormData","setAppFormData","moduleFormData","setModuleFormData","saving","setSaving","error","setError","menuOpen","setMenuOpen","loadApplications","useCallback","result","adminApi","err","loadModules","appId","prev","useEffect","toggleApp","next","openEditAppModal","app","openEditModuleModal","module","handleAppSubmit","updateData","message","handleModuleSubmit","handleToggleAppStatus","jsxs","Breadcrumb","Loader2","ChevronDown","ChevronRight","MoreHorizontal","Edit2","EyeOff","Eye","X"],"mappings":"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"}
1
+ {"version":3,"file":"NavigationAppsPage-DfTa4jCG.js","sources":["../../src/pages/platform/administration/applications/NavigationAppsPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Edit2, MoreHorizontal, X, Loader2, Eye, EyeOff, ChevronDown, ChevronRight } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport * as LucideIcons from 'lucide-react';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport { adminApi, type ApplicationListDto, type ApplicationModuleDto, type UpdateApplicationRequest, type UpdateModuleRequest } from '@/services/api/adminApi';\r\n\r\n// Dynamic icon component\r\nconst DynamicIcon = ({ name, className }: { name: string; className?: string }) => {\r\n const icons = LucideIcons as unknown as Record<string, LucideIcon>;\r\n const IconComponent = icons[name];\r\n if (!IconComponent) return null;\r\n return <IconComponent className={className} />;\r\n};\r\n\r\nexport function NavigationAppsPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const [applications, setApplications] = useState<ApplicationListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [expandedApps, setExpandedApps] = useState<Set<string>>(new Set());\r\n const [modules, setModules] = useState<Record<string, ApplicationModuleDto[]>>({});\r\n const [showAppModal, setShowAppModal] = useState(false);\r\n const [showModuleModal, setShowModuleModal] = useState(false);\r\n const [editingApp, setEditingApp] = useState<ApplicationListDto | null>(null);\r\n const [editingModule, setEditingModule] = useState<{ appId: string; module: ApplicationModuleDto } | null>(null);\r\n const [appFormData, setAppFormData] = useState({\r\n label: '',\r\n description: '',\r\n icon: '',\r\n iconType: 'Lucide',\r\n route: '',\r\n displayOrder: 0\r\n });\r\n const [moduleFormData, setModuleFormData] = useState({\r\n label: '',\r\n description: '',\r\n icon: '',\r\n iconType: 'Lucide',\r\n route: '',\r\n displayOrder: 0\r\n });\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [menuOpen, setMenuOpen] = useState<string | null>(null);\r\n\r\n const loadApplications = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const result = await adminApi.applications.getAll();\r\n setApplications(result);\r\n } catch (err) {\r\n console.error('Failed to load applications:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n const loadModules = async (appId: string) => {\r\n try {\r\n const result = await adminApi.applications.getModules(appId);\r\n setModules(prev => ({ ...prev, [appId]: result }));\r\n } catch (err) {\r\n console.error('Failed to load modules:', err);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n loadApplications();\r\n }, [loadApplications]);\r\n\r\n const toggleApp = async (appId: string) => {\r\n const next = new Set(expandedApps);\r\n if (next.has(appId)) {\r\n next.delete(appId);\r\n } else {\r\n next.add(appId);\r\n if (!modules[appId]) {\r\n await loadModules(appId);\r\n }\r\n }\r\n setExpandedApps(next);\r\n };\r\n\r\n const openEditAppModal = (app: ApplicationListDto) => {\r\n setEditingApp(app);\r\n setAppFormData({\r\n label: app.label,\r\n description: app.description || '',\r\n icon: app.icon || '',\r\n iconType: app.iconType,\r\n route: app.route || '',\r\n displayOrder: app.displayOrder\r\n });\r\n setError(null);\r\n setShowAppModal(true);\r\n };\r\n\r\n const openEditModuleModal = (appId: string, module: ApplicationModuleDto) => {\r\n setEditingModule({ appId, module });\r\n setModuleFormData({\r\n label: module.label,\r\n description: module.description || '',\r\n icon: module.icon || '',\r\n iconType: module.iconType,\r\n route: module.route || '',\r\n displayOrder: module.displayOrder\r\n });\r\n setError(null);\r\n setShowModuleModal(true);\r\n };\r\n\r\n const handleAppSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!editingApp) return;\r\n\r\n setSaving(true);\r\n setError(null);\r\n\r\n try {\r\n const updateData: UpdateApplicationRequest = {\r\n label: appFormData.label,\r\n description: appFormData.description,\r\n icon: appFormData.icon,\r\n iconType: appFormData.iconType,\r\n route: appFormData.route,\r\n displayOrder: appFormData.displayOrder\r\n };\r\n await adminApi.applications.update(editingApp.id, updateData);\r\n setShowAppModal(false);\r\n loadApplications();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'An error occurred';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleModuleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!editingModule) return;\r\n\r\n setSaving(true);\r\n setError(null);\r\n\r\n try {\r\n const updateData: UpdateModuleRequest = {\r\n label: moduleFormData.label,\r\n description: moduleFormData.description,\r\n icon: moduleFormData.icon,\r\n iconType: moduleFormData.iconType,\r\n route: moduleFormData.route,\r\n displayOrder: moduleFormData.displayOrder\r\n };\r\n await adminApi.applications.updateModule(editingModule.appId, editingModule.module.id, updateData);\r\n setShowModuleModal(false);\r\n loadModules(editingModule.appId);\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'An error occurred';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleToggleAppStatus = async (app: ApplicationListDto) => {\r\n try {\r\n if (app.isActive) {\r\n await adminApi.applications.deactivate(app.id);\r\n } else {\r\n await adminApi.applications.activate(app.id);\r\n }\r\n loadApplications();\r\n } catch (err) {\r\n console.error('Failed to toggle app status:', err);\r\n }\r\n setMenuOpen(null);\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') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{t('applications.title')}</h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">{t('applications.subtitle')}</p>\r\n </div>\r\n </div>\r\n\r\n {/* Applications list */}\r\n <div className=\"space-y-4\">\r\n {loading && (\r\n <div className=\"flex justify-center py-12\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-primary-500\" />\r\n </div>\r\n )}\r\n {!loading && applications.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)] bg-[var(--bg-secondary)] rounded-xl border border-[var(--border-color)]\">\r\n {t('applications.noApps')}\r\n </div>\r\n )}\r\n {!loading && applications.length > 0 && (\r\n applications.map(app => (\r\n <div key={app.id} className=\"bg-[var(--bg-secondary)] rounded-xl border border-[var(--border-color)] overflow-hidden\">\r\n <div className=\"flex items-center gap-4 p-4\">\r\n <button\r\n onClick={() => toggleApp(app.id)}\r\n className=\"p-1 rounded hover:bg-[var(--bg-hover)]\"\r\n >\r\n {expandedApps.has(app.id) ? (\r\n <ChevronDown className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n ) : (\r\n <ChevronRight className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n )}\r\n </button>\r\n\r\n <div className=\"w-10 h-10 rounded-xl bg-primary-100 dark:bg-primary-900 flex items-center justify-center\">\r\n {app.iconType === 'Lucide' && app.icon && (\r\n <DynamicIcon name={app.icon} className=\"w-5 h-5 text-primary-600 dark:text-primary-400\" />\r\n )}\r\n {app.iconType === 'Url' && app.icon && (\r\n <img src={app.icon} alt=\"\" className=\"w-6 h-6\" />\r\n )}\r\n {!(app.iconType === 'Lucide' && app.icon) && !(app.iconType === 'Url' && app.icon) && (\r\n <div className=\"w-5 h-5 bg-primary-500 rounded\" />\r\n )}\r\n </div>\r\n\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">{app.label}</span>\r\n <span className=\"px-2 py-0.5 text-xs rounded-full bg-[var(--bg-tertiary)] text-[var(--text-secondary)]\">\r\n {app.zone}\r\n </span>\r\n {!app.isActive && (\r\n <span className=\"px-2 py-0.5 text-xs rounded-full bg-red-100 dark:bg-red-900 text-red-700 dark:text-red-300\">\r\n {t('common.inactive')}\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {app.description || app.route}\r\n </div>\r\n </div>\r\n\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {app.modulesCount} {t('applications.modules')}\r\n </div>\r\n\r\n <div className=\"relative\">\r\n <button\r\n onClick={() => setMenuOpen(menuOpen === app.id ? null : app.id)}\r\n className=\"p-2 rounded-lg hover:bg-[var(--bg-tertiary)] transition-colors\"\r\n >\r\n <MoreHorizontal className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n </button>\r\n {menuOpen === app.id && (\r\n <div className=\"absolute right-0 top-full mt-1 w-48 py-1 bg-[var(--bg-secondary)] rounded-xl border border-[var(--border-color)] shadow-lg z-10\">\r\n <button\r\n onClick={() => { openEditAppModal(app); setMenuOpen(null); }}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-left text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n {t('common.edit')}\r\n </button>\r\n <button\r\n onClick={() => handleToggleAppStatus(app)}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-left text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {app.isActive ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\r\n {app.isActive ? t('common.deactivate') : t('common.activate')}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {expandedApps.has(app.id) && (\r\n <div className=\"border-t border-[var(--border-color)] p-4 bg-[var(--bg-primary)]\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"font-medium text-[var(--text-primary)]\">{t('applications.modules')}</h3>\r\n </div>\r\n\r\n {modules[app.id] ? (\r\n modules[app.id].length === 0 ? (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {t('applications.noModules')}\r\n </div>\r\n ) : (\r\n <div className=\"space-y-2\">\r\n {modules[app.id].map(module => (\r\n <div\r\n key={module.id}\r\n className=\"flex items-center gap-3 p-3 rounded-lg bg-[var(--bg-secondary)] border border-[var(--border-color)]\"\r\n >\r\n <div className=\"w-8 h-8 rounded-lg bg-[var(--bg-tertiary)] flex items-center justify-center\">\r\n {module.iconType === 'Lucide' && module.icon ? (\r\n <DynamicIcon name={module.icon} className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n ) : (\r\n <div className=\"w-4 h-4 bg-[var(--text-tertiary)] rounded\" />\r\n )}\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"font-medium text-sm text-[var(--text-primary)]\">{module.label}</div>\r\n <div className=\"text-xs text-[var(--text-secondary)]\">{module.route}</div>\r\n </div>\r\n <div className=\"flex items-center gap-1\">\r\n <button\r\n onClick={() => openEditModuleModal(app.id, module)}\r\n className=\"p-1.5 rounded-lg hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <Edit2 className=\"w-3.5 h-3.5 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )\r\n ) : (\r\n <div className=\"flex justify-center py-4\">\r\n <Loader2 className=\"w-5 h-5 animate-spin text-primary-500\" />\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n ))\r\n )}\r\n </div>\r\n\r\n {/* Application Edit Modal */}\r\n {showAppModal && editingApp && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-2xl w-full max-w-lg p-6 m-4 max-h-[90vh] overflow-y-auto\">\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">\r\n {t('applications.edit')}\r\n </h2>\r\n <button onClick={() => setShowAppModal(false)} className=\"p-2 rounded-lg hover:bg-[var(--bg-hover)]\">\r\n <X className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-4 p-3 rounded-lg bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300 text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleAppSubmit} className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.code')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={editingApp.code}\r\n disabled\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-tertiary)] text-[var(--text-muted)] cursor-not-allowed\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.label')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={appFormData.label}\r\n onChange={e => setAppFormData(prev => ({ ...prev, label: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.description')}\r\n </label>\r\n <textarea\r\n value={appFormData.description}\r\n onChange={e => setAppFormData(prev => ({ ...prev, description: e.target.value }))}\r\n rows={2}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500 resize-none\"\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.iconType')}\r\n </label>\r\n <select\r\n value={appFormData.iconType}\r\n onChange={e => setAppFormData(prev => ({ ...prev, iconType: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n >\r\n <option value=\"Lucide\">Lucide Icon</option>\r\n <option value=\"Url\">URL</option>\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.icon')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={appFormData.icon}\r\n onChange={e => setAppFormData(prev => ({ ...prev, icon: e.target.value }))}\r\n placeholder={appFormData.iconType === 'Lucide' ? 'Shield, Users, Settings...' : 'https://...'}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.route')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={appFormData.route}\r\n onChange={e => setAppFormData(prev => ({ ...prev, route: e.target.value }))}\r\n placeholder=\"/administration/...\"\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n\r\n <div className=\"flex justify-end gap-2 pt-4\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowAppModal(false)}\r\n className=\"px-4 py-2 rounded-xl bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] font-medium transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={saving}\r\n className=\"px-4 py-2 rounded-xl bg-primary-600 hover:bg-primary-700 text-white font-medium transition-colors disabled:opacity-50 flex items-center gap-2\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Module Edit Modal */}\r\n {showModuleModal && editingModule && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-2xl w-full max-w-lg p-6 m-4 max-h-[90vh] overflow-y-auto\">\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">\r\n {t('applications.editModule')}\r\n </h2>\r\n <button onClick={() => setShowModuleModal(false)} className=\"p-2 rounded-lg hover:bg-[var(--bg-hover)]\">\r\n <X className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-4 p-3 rounded-lg bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300 text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleModuleSubmit} className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.code')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={editingModule.module.code}\r\n disabled\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-tertiary)] text-[var(--text-muted)] cursor-not-allowed\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.label')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={moduleFormData.label}\r\n onChange={e => setModuleFormData(prev => ({ ...prev, label: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.iconType')}\r\n </label>\r\n <select\r\n value={moduleFormData.iconType}\r\n onChange={e => setModuleFormData(prev => ({ ...prev, iconType: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n >\r\n <option value=\"Lucide\">Lucide Icon</option>\r\n <option value=\"Url\">URL</option>\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.icon')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={moduleFormData.icon}\r\n onChange={e => setModuleFormData(prev => ({ ...prev, icon: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('applications.form.route')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={moduleFormData.route}\r\n onChange={e => setModuleFormData(prev => ({ ...prev, route: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-xl border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-primary-500\"\r\n />\r\n </div>\r\n\r\n <div className=\"flex justify-end gap-2 pt-4\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowModuleModal(false)}\r\n className=\"px-4 py-2 rounded-xl bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] font-medium transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={saving}\r\n className=\"px-4 py-2 rounded-xl bg-primary-600 hover:bg-primary-700 text-white font-medium transition-colors disabled:opacity-50 flex items-center gap-2\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["DynamicIcon","name","className","IconComponent","LucideIcons","jsx","NavigationAppsPage","t","useTranslation","applications","setApplications","useState","loading","setLoading","expandedApps","setExpandedApps","modules","setModules","showAppModal","setShowAppModal","showModuleModal","setShowModuleModal","editingApp","setEditingApp","editingModule","setEditingModule","appFormData","setAppFormData","moduleFormData","setModuleFormData","saving","setSaving","error","setError","menuOpen","setMenuOpen","loadApplications","useCallback","result","adminApi","err","loadModules","appId","prev","useEffect","toggleApp","next","openEditAppModal","app","openEditModuleModal","module","handleAppSubmit","updateData","message","handleModuleSubmit","handleToggleAppStatus","jsxs","Breadcrumb","Loader2","ChevronDown","ChevronRight","MoreHorizontal","Edit2","EyeOff","Eye","X"],"mappings":";;;;;;AAUA,MAAMA,IAAc,CAAC,EAAE,MAAAC,GAAM,WAAAC,QAAsD;AAEjF,QAAMC,IADQC,EACcH,CAAI;AAChC,SAAKE,IACE,gBAAAE,EAACF,KAAc,WAAAD,GAAsB,IADjB;AAE7B;AAEO,SAASI,KAAmC;AACjD,QAAM,EAAE,GAAAC,EAAA,IAAMC,EAAe,OAAO,GAC9B,CAACC,GAAcC,CAAe,IAAIC,EAA+B,CAAA,CAAE,GACnE,CAACC,GAASC,CAAU,IAAIF,EAAS,EAAI,GACrC,CAACG,GAAcC,CAAe,IAAIJ,EAAsB,oBAAI,KAAK,GACjE,CAACK,GAASC,CAAU,IAAIN,EAAiD,CAAA,CAAE,GAC3E,CAACO,GAAcC,CAAe,IAAIR,EAAS,EAAK,GAChD,CAACS,GAAiBC,CAAkB,IAAIV,EAAS,EAAK,GACtD,CAACW,GAAYC,CAAa,IAAIZ,EAAoC,IAAI,GACtE,CAACa,GAAeC,CAAgB,IAAId,EAAiE,IAAI,GACzG,CAACe,GAAaC,CAAc,IAAIhB,EAAS;AAAA,IAC7C,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,IACP,cAAc;AAAA,EAAA,CACf,GACK,CAACiB,GAAgBC,CAAiB,IAAIlB,EAAS;AAAA,IACnD,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,IACP,cAAc;AAAA,EAAA,CACf,GACK,CAACmB,GAAQC,CAAS,IAAIpB,EAAS,EAAK,GACpC,CAACqB,GAAOC,CAAQ,IAAItB,EAAwB,IAAI,GAChD,CAACuB,GAAUC,CAAW,IAAIxB,EAAwB,IAAI,GAEtDyB,IAAmBC,EAAY,YAAY;AAC/C,QAAI;AACF,MAAAxB,EAAW,EAAI;AACf,YAAMyB,IAAS,MAAMC,EAAS,aAAa,OAAA;AAC3C,MAAA7B,EAAgB4B,CAAM;AAAA,IACxB,SAASE,GAAK;AACZ,cAAQ,MAAM,gCAAgCA,CAAG;AAAA,IACnD,UAAA;AACE,MAAA3B,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAA,CAAE,GAEC4B,IAAc,OAAOC,MAAkB;AAC3C,QAAI;AACF,YAAMJ,IAAS,MAAMC,EAAS,aAAa,WAAWG,CAAK;AAC3D,MAAAzB,EAAW,CAAA0B,OAAS,EAAE,GAAGA,GAAM,CAACD,CAAK,GAAGJ,IAAS;AAAA,IACnD,SAASE,GAAK;AACZ,cAAQ,MAAM,2BAA2BA,CAAG;AAAA,IAC9C;AAAA,EACF;AAEA,EAAAI,EAAU,MAAM;AACd,IAAAR,EAAA;AAAA,EACF,GAAG,CAACA,CAAgB,CAAC;AAErB,QAAMS,IAAY,OAAOH,MAAkB;AACzC,UAAMI,IAAO,IAAI,IAAIhC,CAAY;AACjC,IAAIgC,EAAK,IAAIJ,CAAK,IAChBI,EAAK,OAAOJ,CAAK,KAEjBI,EAAK,IAAIJ,CAAK,GACT1B,EAAQ0B,CAAK,KAChB,MAAMD,EAAYC,CAAK,IAG3B3B,EAAgB+B,CAAI;AAAA,EACtB,GAEMC,IAAmB,CAACC,MAA4B;AACpD,IAAAzB,EAAcyB,CAAG,GACjBrB,EAAe;AAAA,MACb,OAAOqB,EAAI;AAAA,MACX,aAAaA,EAAI,eAAe;AAAA,MAChC,MAAMA,EAAI,QAAQ;AAAA,MAClB,UAAUA,EAAI;AAAA,MACd,OAAOA,EAAI,SAAS;AAAA,MACpB,cAAcA,EAAI;AAAA,IAAA,CACnB,GACDf,EAAS,IAAI,GACbd,EAAgB,EAAI;AAAA,EACtB,GAEM8B,IAAsB,CAACP,GAAeQ,MAAiC;AAC3E,IAAAzB,EAAiB,EAAE,OAAAiB,GAAO,QAAAQ,GAAQ,GAClCrB,EAAkB;AAAA,MAChB,OAAOqB,EAAO;AAAA,MACd,aAAaA,EAAO,eAAe;AAAA,MACnC,MAAMA,EAAO,QAAQ;AAAA,MACrB,UAAUA,EAAO;AAAA,MACjB,OAAOA,EAAO,SAAS;AAAA,MACvB,cAAcA,EAAO;AAAA,IAAA,CACtB,GACDjB,EAAS,IAAI,GACbZ,EAAmB,EAAI;AAAA,EACzB,GAEM8B,IAAkB,OAAO,MAAuB;AAEpD,QADA,EAAE,eAAA,GACE,EAAC7B,GAEL;AAAA,MAAAS,EAAU,EAAI,GACdE,EAAS,IAAI;AAEb,UAAI;AACF,cAAMmB,IAAuC;AAAA,UAC3C,OAAO1B,EAAY;AAAA,UACnB,aAAaA,EAAY;AAAA,UACzB,MAAMA,EAAY;AAAA,UAClB,UAAUA,EAAY;AAAA,UACtB,OAAOA,EAAY;AAAA,UACnB,cAAcA,EAAY;AAAA,QAAA;AAE5B,cAAMa,EAAS,aAAa,OAAOjB,EAAW,IAAI8B,CAAU,GAC5DjC,EAAgB,EAAK,GACrBiB,EAAA;AAAA,MACF,SAASI,GAAc;AACrB,cAAMa,IAAUb,aAAe,QAAQA,EAAI,UAAU;AACrD,QAAAP,EAASoB,CAAO;AAAA,MAClB,UAAA;AACE,QAAAtB,EAAU,EAAK;AAAA,MACjB;AAAA;AAAA,EACF,GAEMuB,IAAqB,OAAO,MAAuB;AAEvD,QADA,EAAE,eAAA,GACE,EAAC9B,GAEL;AAAA,MAAAO,EAAU,EAAI,GACdE,EAAS,IAAI;AAEb,UAAI;AACF,cAAMmB,IAAkC;AAAA,UACtC,OAAOxB,EAAe;AAAA,UACtB,aAAaA,EAAe;AAAA,UAC5B,MAAMA,EAAe;AAAA,UACrB,UAAUA,EAAe;AAAA,UACzB,OAAOA,EAAe;AAAA,UACtB,cAAcA,EAAe;AAAA,QAAA;AAE/B,cAAMW,EAAS,aAAa,aAAaf,EAAc,OAAOA,EAAc,OAAO,IAAI4B,CAAU,GACjG/B,EAAmB,EAAK,GACxBoB,EAAYjB,EAAc,KAAK;AAAA,MACjC,SAASgB,GAAc;AACrB,cAAMa,IAAUb,aAAe,QAAQA,EAAI,UAAU;AACrD,QAAAP,EAASoB,CAAO;AAAA,MAClB,UAAA;AACE,QAAAtB,EAAU,EAAK;AAAA,MACjB;AAAA;AAAA,EACF,GAEMwB,IAAwB,OAAOP,MAA4B;AAC/D,QAAI;AACF,MAAIA,EAAI,WACN,MAAMT,EAAS,aAAa,WAAWS,EAAI,EAAE,IAE7C,MAAMT,EAAS,aAAa,SAASS,EAAI,EAAE,GAE7CZ,EAAA;AAAA,IACF,SAASI,GAAK;AACZ,cAAQ,MAAM,gCAAgCA,CAAG;AAAA,IACnD;AACA,IAAAL,EAAY,IAAI;AAAA,EAClB;AAEA,SACE,gBAAAqB,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAnD;AAAA,MAACoD;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAOlD,EAAE,cAAc,GAAG,MAAM,kBAAA;AAAA,UAClC,EAAE,OAAOA,EAAE,oBAAoB,EAAA;AAAA,QAAE;AAAA,MACnC;AAAA,IAAA;AAAA,IAGF,gBAAAF,EAAC,OAAA,EAAI,WAAU,qCACb,4BAAC,OAAA,EACC,UAAA;AAAA,MAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,iDAAiD,UAAAE,EAAE,oBAAoB,GAAE;AAAA,wBACtF,KAAA,EAAE,WAAU,qCAAqC,UAAAA,EAAE,uBAAuB,EAAA,CAAE;AAAA,IAAA,EAAA,CAC/E,EAAA,CACF;AAAA,IAGA,gBAAAiD,EAAC,OAAA,EAAI,WAAU,aACZ,UAAA;AAAA,MAAA5C,KACC,gBAAAP,EAAC,SAAI,WAAU,6BACb,4BAACqD,GAAA,EAAQ,WAAU,yCAAwC,EAAA,CAC7D;AAAA,MAED,CAAC9C,KAAWH,EAAa,WAAW,KACnC,gBAAAJ,EAAC,OAAA,EAAI,WAAU,0HACZ,UAAAE,EAAE,qBAAqB,EAAA,CAC1B;AAAA,MAED,CAACK,KAAWH,EAAa,SAAS,KACjCA,EAAa,IAAI,CAAAuC,MACf,gBAAAQ,EAAC,OAAA,EAAiB,WAAU,2FAC1B,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,UAAA,gBAAAnD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS,MAAMwC,EAAUG,EAAI,EAAE;AAAA,cAC/B,WAAU;AAAA,cAET,UAAAlC,EAAa,IAAIkC,EAAI,EAAE,IACtB,gBAAA3C,EAACsD,GAAA,EAAY,WAAU,uCAAA,CAAuC,IAE9D,gBAAAtD,EAACuD,GAAA,EAAa,WAAU,uCAAA,CAAuC;AAAA,YAAA;AAAA,UAAA;AAAA,UAInE,gBAAAJ,EAAC,OAAA,EAAI,WAAU,4FACZ,UAAA;AAAA,YAAAR,EAAI,aAAa,YAAYA,EAAI,QAChC,gBAAA3C,EAACL,KAAY,MAAMgD,EAAI,MAAM,WAAU,iDAAA,CAAiD;AAAA,YAEzFA,EAAI,aAAa,SAASA,EAAI,QAC7B,gBAAA3C,EAAC,OAAA,EAAI,KAAK2C,EAAI,MAAM,KAAI,IAAG,WAAU,WAAU;AAAA,YAEhD,EAAEA,EAAI,aAAa,YAAYA,EAAI,SAAS,EAAEA,EAAI,aAAa,SAASA,EAAI,SAC3E,gBAAA3C,EAAC,OAAA,EAAI,WAAU,iCAAA,CAAiC;AAAA,UAAA,GAEpD;AAAA,UAEA,gBAAAmD,EAAC,OAAA,EAAI,WAAU,UACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,cAAA,gBAAAnD,EAAC,QAAA,EAAK,WAAU,0CAA0C,UAAA2C,EAAI,OAAM;AAAA,cACpE,gBAAA3C,EAAC,QAAA,EAAK,WAAU,yFACb,YAAI,MACP;AAAA,cACC,CAAC2C,EAAI,YACJ,gBAAA3C,EAAC,UAAK,WAAU,8FACb,UAAAE,EAAE,iBAAiB,EAAA,CACtB;AAAA,YAAA,GAEJ;AAAA,8BACC,OAAA,EAAI,WAAU,wCACZ,UAAAyC,EAAI,eAAeA,EAAI,MAAA,CAC1B;AAAA,UAAA,GACF;AAAA,UAEA,gBAAAQ,EAAC,OAAA,EAAI,WAAU,wCACZ,UAAA;AAAA,YAAAR,EAAI;AAAA,YAAa;AAAA,YAAEzC,EAAE,sBAAsB;AAAA,UAAA,GAC9C;AAAA,UAEA,gBAAAiD,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,YAAA,gBAAAnD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,MAAM8B,EAAYD,MAAac,EAAI,KAAK,OAAOA,EAAI,EAAE;AAAA,gBAC9D,WAAU;AAAA,gBAEV,UAAA,gBAAA3C,EAACwD,GAAA,EAAe,WAAU,uCAAA,CAAuC;AAAA,cAAA;AAAA,YAAA;AAAA,YAElE3B,MAAac,EAAI,MAChB,gBAAAQ,EAAC,OAAA,EAAI,WAAU,mIACb,UAAA;AAAA,cAAA,gBAAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,SAAS,MAAM;AAAE,oBAAAT,EAAiBC,CAAG,GAAGb,EAAY,IAAI;AAAA,kBAAG;AAAA,kBAC3D,WAAU;AAAA,kBAEV,UAAA;AAAA,oBAAA,gBAAA9B,EAACyD,GAAA,EAAM,WAAU,UAAA,CAAU;AAAA,oBAC1BvD,EAAE,aAAa;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAElB,gBAAAiD;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,SAAS,MAAMD,EAAsBP,CAAG;AAAA,kBACxC,WAAU;AAAA,kBAET,UAAA;AAAA,oBAAAA,EAAI,6BAAYe,GAAA,EAAO,WAAU,WAAU,IAAK,gBAAA1D,EAAC2D,IAAA,EAAI,WAAU,UAAA,CAAU;AAAA,oBACzEhB,EAAI,WAAWzC,EAAE,mBAAmB,IAAIA,EAAE,iBAAiB;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YAC9D,EAAA,CACF;AAAA,UAAA,EAAA,CAEJ;AAAA,QAAA,GACF;AAAA,QAECO,EAAa,IAAIkC,EAAI,EAAE,KACtB,gBAAAQ,EAAC,OAAA,EAAI,WAAU,oEACb,UAAA;AAAA,UAAA,gBAAAnD,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,0CAA0C,UAAAE,EAAE,sBAAsB,EAAA,CAAE,GACpF;AAAA,UAECS,EAAQgC,EAAI,EAAE,IACbhC,EAAQgC,EAAI,EAAE,EAAE,WAAW,IACzB,gBAAA3C,EAAC,OAAA,EAAI,WAAU,iDACZ,UAAAE,EAAE,wBAAwB,EAAA,CAC7B,IAEA,gBAAAF,EAAC,OAAA,EAAI,WAAU,aACZ,UAAAW,EAAQgC,EAAI,EAAE,EAAE,IAAI,CAAAE,MACnB,gBAAAM;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAA,gBAAAnD,EAAC,OAAA,EAAI,WAAU,+EACZ,UAAA6C,EAAO,aAAa,YAAYA,EAAO,OACtC,gBAAA7C,EAACL,GAAA,EAAY,MAAMkD,EAAO,MAAM,WAAU,uCAAA,CAAuC,sBAEhF,OAAA,EAAI,WAAU,6CAA4C,EAAA,CAE/D;AAAA,gBACA,gBAAAM,EAAC,OAAA,EAAI,WAAU,UACb,UAAA;AAAA,kBAAA,gBAAAnD,EAAC,OAAA,EAAI,WAAU,kDAAkD,UAAA6C,EAAO,OAAM;AAAA,kBAC9E,gBAAA7C,EAAC,OAAA,EAAI,WAAU,wCAAwC,YAAO,MAAA,CAAM;AAAA,gBAAA,GACtE;AAAA,gBACA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA,gBAAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,SAAS,MAAM4C,EAAoBD,EAAI,IAAIE,CAAM;AAAA,oBACjD,WAAU;AAAA,oBAEV,UAAA,gBAAA7C,EAACyD,GAAA,EAAM,WAAU,2CAAA,CAA2C;AAAA,kBAAA;AAAA,gBAAA,EAC9D,CACF;AAAA,cAAA;AAAA,YAAA;AAAA,YArBKZ,EAAO;AAAA,UAAA,CAuBf,EAAA,CACH,IAGF,gBAAA7C,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA,gBAAAA,EAACqD,GAAA,EAAQ,WAAU,wCAAA,CAAwC,EAAA,CAC7D;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA,EAAA,GAxHMV,EAAI,EA0Hd,CACD;AAAA,IAAA,GAEL;AAAA,IAGC9B,KAAgBI,KACf,gBAAAjB,EAAC,OAAA,EAAI,WAAU,mEACb,UAAA,gBAAAmD,EAAC,OAAA,EAAI,WAAU,2FACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,QAAA,gBAAAnD,EAAC,MAAA,EAAG,WAAU,gDACX,UAAAE,EAAE,mBAAmB,GACxB;AAAA,QACA,gBAAAF,EAAC,UAAA,EAAO,SAAS,MAAMc,EAAgB,EAAK,GAAG,WAAU,6CACvD,UAAA,gBAAAd,EAAC4D,GAAA,EAAE,WAAU,wCAAuC,EAAA,CACtD;AAAA,MAAA,GACF;AAAA,MAECjC,KACC,gBAAA3B,EAAC,OAAA,EAAI,WAAU,4FACZ,UAAA2B,GACH;AAAA,MAGF,gBAAAwB,EAAC,QAAA,EAAK,UAAUL,GAAiB,WAAU,aACzC,UAAA;AAAA,QAAA,gBAAAK,EAAC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAnD,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAE,EAAE,wBAAwB,GAC7B;AAAA,UACA,gBAAAF;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAOiB,EAAW;AAAA,cAClB,UAAQ;AAAA,cACR,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,GACF;AAAA,0BAEC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAjB,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAE,EAAE,yBAAyB,GAC9B;AAAA,UACA,gBAAAF;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAQ;AAAA,cACR,OAAOqB,EAAY;AAAA,cACnB,UAAU,CAAA,MAAKC,EAAe,CAAAgB,OAAS,EAAE,GAAGA,GAAM,OAAO,EAAE,OAAO,MAAA,EAAQ;AAAA,cAC1E,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,GACF;AAAA,0BAEC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAtC,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAE,EAAE,+BAA+B,GACpC;AAAA,UACA,gBAAAF;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAOqB,EAAY;AAAA,cACnB,UAAU,CAAA,MAAKC,EAAe,CAAAgB,OAAS,EAAE,GAAGA,GAAM,aAAa,EAAE,OAAO,MAAA,EAAQ;AAAA,cAChF,MAAM;AAAA,cACN,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,GACF;AAAA,QAEA,gBAAAa,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAAnD,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAE,EAAE,4BAA4B,GACjC;AAAA,YACA,gBAAAiD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO9B,EAAY;AAAA,gBACnB,UAAU,CAAA,MAAKC,EAAe,CAAAgB,OAAS,EAAE,GAAGA,GAAM,UAAU,EAAE,OAAO,MAAA,EAAQ;AAAA,gBAC7E,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAAA,gBAAAtC,EAAC,UAAA,EAAO,OAAM,UAAS,UAAA,eAAW;AAAA,kBAClC,gBAAAA,EAAC,UAAA,EAAO,OAAM,OAAM,UAAA,MAAA,CAAG;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UACzB,GACF;AAAA,4BACC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAAA,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAE,EAAE,wBAAwB,GAC7B;AAAA,YACA,gBAAAF;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAOqB,EAAY;AAAA,gBACnB,UAAU,CAAA,MAAKC,EAAe,CAAAgB,OAAS,EAAE,GAAGA,GAAM,MAAM,EAAE,OAAO,MAAA,EAAQ;AAAA,gBACzE,aAAajB,EAAY,aAAa,WAAW,+BAA+B;AAAA,gBAChF,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ,EAAA,CACF;AAAA,QAAA,GACF;AAAA,0BAEC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAArB,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAE,EAAE,yBAAyB,GAC9B;AAAA,UACA,gBAAAF;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAOqB,EAAY;AAAA,cACnB,UAAU,CAAA,MAAKC,EAAe,CAAAgB,OAAS,EAAE,GAAGA,GAAM,OAAO,EAAE,OAAO,MAAA,EAAQ;AAAA,cAC1E,aAAY;AAAA,cACZ,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,GACF;AAAA,QAEA,gBAAAa,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,UAAA,gBAAAnD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAMc,EAAgB,EAAK;AAAA,cACpC,WAAU;AAAA,cAET,YAAE,eAAe;AAAA,YAAA;AAAA,UAAA;AAAA,UAEpB,gBAAAqC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAU1B;AAAA,cACV,WAAU;AAAA,cAET,UAAA;AAAA,gBAAAA,KAAU,gBAAAzB,EAACqD,GAAA,EAAQ,WAAU,uBAAA,CAAuB;AAAA,gBACpDnD,EAAE,aAAa;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAClB,EAAA,CACF;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,IAIDa,KAAmBI,KAClB,gBAAAnB,EAAC,OAAA,EAAI,WAAU,mEACb,UAAA,gBAAAmD,EAAC,OAAA,EAAI,WAAU,2FACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,QAAA,gBAAAnD,EAAC,MAAA,EAAG,WAAU,gDACX,UAAAE,EAAE,yBAAyB,GAC9B;AAAA,QACA,gBAAAF,EAAC,UAAA,EAAO,SAAS,MAAMgB,EAAmB,EAAK,GAAG,WAAU,6CAC1D,UAAA,gBAAAhB,EAAC4D,GAAA,EAAE,WAAU,wCAAuC,EAAA,CACtD;AAAA,MAAA,GACF;AAAA,MAECjC,KACC,gBAAA3B,EAAC,OAAA,EAAI,WAAU,4FACZ,UAAA2B,GACH;AAAA,MAGF,gBAAAwB,EAAC,QAAA,EAAK,UAAUF,GAAoB,WAAU,aAC5C,UAAA;AAAA,QAAA,gBAAAE,EAAC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAnD,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAE,EAAE,wBAAwB,GAC7B;AAAA,UACA,gBAAAF;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAOmB,EAAc,OAAO;AAAA,cAC5B,UAAQ;AAAA,cACR,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,GACF;AAAA,0BAEC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAnB,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAE,EAAE,yBAAyB,GAC9B;AAAA,UACA,gBAAAF;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAQ;AAAA,cACR,OAAOuB,EAAe;AAAA,cACtB,UAAU,CAAA,MAAKC,EAAkB,CAAAc,OAAS,EAAE,GAAGA,GAAM,OAAO,EAAE,OAAO,MAAA,EAAQ;AAAA,cAC7E,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,GACF;AAAA,QAEA,gBAAAa,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAAnD,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAE,EAAE,4BAA4B,GACjC;AAAA,YACA,gBAAAiD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO5B,EAAe;AAAA,gBACtB,UAAU,CAAA,MAAKC,EAAkB,CAAAc,OAAS,EAAE,GAAGA,GAAM,UAAU,EAAE,OAAO,MAAA,EAAQ;AAAA,gBAChF,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAAA,gBAAAtC,EAAC,UAAA,EAAO,OAAM,UAAS,UAAA,eAAW;AAAA,kBAClC,gBAAAA,EAAC,UAAA,EAAO,OAAM,OAAM,UAAA,MAAA,CAAG;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UACzB,GACF;AAAA,4BACC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAAA,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAE,EAAE,wBAAwB,GAC7B;AAAA,YACA,gBAAAF;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAOuB,EAAe;AAAA,gBACtB,UAAU,CAAA,MAAKC,EAAkB,CAAAc,OAAS,EAAE,GAAGA,GAAM,MAAM,EAAE,OAAO,MAAA,EAAQ;AAAA,gBAC5E,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ,EAAA,CACF;AAAA,QAAA,GACF;AAAA,0BAEC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAtC,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAE,EAAE,yBAAyB,GAC9B;AAAA,UACA,gBAAAF;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAOuB,EAAe;AAAA,cACtB,UAAU,CAAA,MAAKC,EAAkB,CAAAc,OAAS,EAAE,GAAGA,GAAM,OAAO,EAAE,OAAO,MAAA,EAAQ;AAAA,cAC7E,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,GACF;AAAA,QAEA,gBAAAa,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,UAAA,gBAAAnD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAMgB,EAAmB,EAAK;AAAA,cACvC,WAAU;AAAA,cAET,YAAE,eAAe;AAAA,YAAA;AAAA,UAAA;AAAA,UAEpB,gBAAAmC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAU1B;AAAA,cACV,WAAU;AAAA,cAET,UAAA;AAAA,gBAAAA,KAAU,gBAAAzB,EAACqD,GAAA,EAAQ,WAAU,uBAAA,CAAuB;AAAA,gBACpDnD,EAAE,aAAa;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAClB,EAAA,CACF;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;"}
@@ -3,7 +3,7 @@ import { useState as s, useCallback as $, useEffect as W } from "react";
3
3
  import { useNavigate as q } from "react-router-dom";
4
4
  import { useTranslation as Z } from "react-i18next";
5
5
  import { Bell as S, Settings as z, Filter as G, CheckCheck as H, Trash2 as D, Loader2 as J, Check as K } from "lucide-react";
6
- import { a as Q, n as d, P as X, g as _ } from "./index-DA5VyW0k.js";
6
+ import { a as Q, n as d, P as X, g as _ } from "./index-CN2WRyg1.js";
7
7
  import { C as ee } from "./ConfirmModal-BEfzLWOz.js";
8
8
  function de() {
9
9
  const m = q(), { t: n } = Z("common"), { currentTenant: F, userTenants: P, hasMultipleTenants: N } = Q(), [u, b] = s(!0), [c, i] = s([]), [j, h] = s(!1), [I, y] = s(!1), [p, g] = s(1), [k, C] = s(1), [f, x] = s(0), [l, M] = s(void 0), [v, B] = s(void 0), w = $(async () => {
@@ -252,4 +252,4 @@ function te(m) {
252
252
  export {
253
253
  de as NotificationsPage
254
254
  };
255
- //# sourceMappingURL=NotificationsPage-BxCiGzHk.js.map
255
+ //# sourceMappingURL=NotificationsPage-D76MdAs-.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NotificationsPage-BxCiGzHk.js","sources":["../../src/pages/notifications/NotificationsPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Bell,\r\n Check,\r\n CheckCheck,\r\n Trash2,\r\n Loader2,\r\n Filter,\r\n Settings,\r\n} from 'lucide-react';\r\nimport {\r\n notificationsApi,\r\n type NotificationDto,\r\n} from '@/services/api/supportApi';\r\nimport { Pagination } from '@/components/ui/DataView';\r\nimport { ConfirmModal } from '@/components/ui/ConfirmModal';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { getTenantBadgeVariant } from '@/utils/notificationTenant';\r\n\r\nexport function NotificationsPage(): ReactElement | null {\r\n const navigate = useNavigate();\r\n const { t } = useTranslation('common');\r\n const { currentTenant, userTenants, hasMultipleTenants } = useTenant();\r\n const [loading, setLoading] = useState(true);\r\n const [notifications, setNotifications] = useState<NotificationDto[]>([]);\r\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\r\n const [deleting, setDeleting] = useState(false);\r\n const [page, setPage] = useState(1);\r\n const [totalPages, setTotalPages] = useState(1);\r\n const [totalCount, setTotalCount] = useState(0);\r\n const [filterRead, setFilterRead] = useState<boolean | undefined>(undefined);\r\n const [filterTenantId, setFilterTenantId] = useState<string | undefined>(undefined);\r\n\r\n const loadNotifications = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const result = await notificationsApi.getAll(page, 20, filterRead, filterTenantId);\r\n setNotifications(result.items);\r\n setTotalPages(result.totalPages);\r\n setTotalCount(result.totalCount);\r\n } catch (error) {\r\n console.error('Failed to load notifications:', error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [page, filterRead, filterTenantId]);\r\n\r\n useEffect(() => {\r\n loadNotifications();\r\n }, [loadNotifications]);\r\n\r\n const handleMarkAsRead = async (id: string) => {\r\n try {\r\n await notificationsApi.markAsRead(id);\r\n setNotifications((prev) =>\r\n prev.map((n) => (n.id === id ? { ...n, isRead: true, readAt: new Date().toISOString() } : n))\r\n );\r\n } catch (error) {\r\n console.error('Failed to mark as read:', error);\r\n }\r\n };\r\n\r\n const handleMarkAllAsRead = async () => {\r\n try {\r\n await notificationsApi.markAllAsRead();\r\n setNotifications((prev) => prev.map((n) => ({ ...n, isRead: true, readAt: new Date().toISOString() })));\r\n } catch (error) {\r\n console.error('Failed to mark all as read:', error);\r\n }\r\n };\r\n\r\n const handleDelete = async (id: string) => {\r\n try {\r\n await notificationsApi.delete(id);\r\n setNotifications((prev) => prev.filter((n) => n.id !== id));\r\n setTotalCount((prev) => prev - 1);\r\n } catch (error) {\r\n console.error('Failed to delete notification:', error);\r\n }\r\n };\r\n\r\n const handleDeleteAll = async () => {\r\n try {\r\n setDeleting(true);\r\n await notificationsApi.deleteAll();\r\n setNotifications([]);\r\n setTotalCount(0);\r\n setTotalPages(1);\r\n } catch (error) {\r\n console.error('Failed to delete all notifications:', error);\r\n } finally {\r\n setDeleting(false);\r\n setShowDeleteConfirm(false);\r\n }\r\n };\r\n\r\n const handleNotificationClick = (notification: NotificationDto) => {\r\n if (!notification.isRead) {\r\n handleMarkAsRead(notification.id);\r\n }\r\n if (notification.actionUrl) {\r\n navigate(notification.actionUrl);\r\n }\r\n };\r\n\r\n const getNotificationIcon = (type: string) => {\r\n switch (type) {\r\n case 'TicketCreated':\r\n return '🎫';\r\n case 'TicketAssigned':\r\n return '👤';\r\n case 'StatusChanged':\r\n return '🔄';\r\n case 'CommentAdded':\r\n return '💬';\r\n case 'SlaResponseBreached':\r\n case 'SlaResolutionBreached':\r\n return '⚠️';\r\n case 'SlaWarning':\r\n return '⏰';\r\n case 'TicketEscalated':\r\n return '📈';\r\n case 'SatisfactionRequested':\r\n return '⭐';\r\n default:\r\n return '📌';\r\n }\r\n };\r\n\r\n const formatDate = (dateStr: string) => {\r\n const date = new Date(dateStr);\r\n return date.toLocaleString();\r\n };\r\n\r\n const renderTenantBadge = (notification: NotificationDto) => {\r\n if (!hasMultipleTenants) return null;\r\n\r\n const variant = getTenantBadgeVariant(notification.tenantId, currentTenant?.id ?? null);\r\n\r\n if (variant === 'global') {\r\n return (\r\n <span className=\"text-xs px-2 py-1 rounded bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300 border border-purple-200 dark:border-purple-700\">\r\n System\r\n </span>\r\n );\r\n }\r\n\r\n if (variant === 'current') {\r\n return (\r\n <span className=\"text-xs px-2 py-1 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] border border-[var(--border-color)]\">\r\n {notification.tenantName}\r\n </span>\r\n );\r\n }\r\n\r\n // 'other' tenant - highlighted\r\n return (\r\n <span className=\"text-xs px-2 py-1 rounded bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 border border-blue-200 dark:border-blue-700 font-medium\">\r\n {notification.tenantName}\r\n </span>\r\n );\r\n };\r\n\r\n const unreadCount = notifications.filter((n) => !n.isRead).length;\r\n\r\n const getFilterReadValue = () => {\r\n if (filterRead === undefined) return '';\r\n return filterRead ? 'read' : 'unread';\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold flex items-center gap-2\">\r\n <Bell className=\"w-6 h-6\" />\r\n Notifications\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {totalCount} notification{totalCount !== 1 ? 's' : ''}, {unreadCount} unread\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => navigate('/myspace/notification-preferences')}\r\n className=\"btn btn-secondary flex items-center gap-2\"\r\n >\r\n <Settings className=\"w-4 h-4\" />\r\n Preferences\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Filters and Actions */}\r\n <div className=\"flex flex-col md:flex-row gap-4 items-start md:items-center justify-between\">\r\n <div className=\"flex items-center gap-2\">\r\n <Filter className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <select\r\n value={getFilterReadValue()}\r\n onChange={(e) => {\r\n const value = e.target.value;\r\n setFilterRead(value === '' ? undefined : value === 'read');\r\n setPage(1);\r\n }}\r\n className=\"input\"\r\n >\r\n <option value=\"\">All Notifications</option>\r\n <option value=\"unread\">Unread Only</option>\r\n <option value=\"read\">Read Only</option>\r\n </select>\r\n\r\n {hasMultipleTenants && (\r\n <select\r\n value={filterTenantId || ''}\r\n onChange={(e) => {\r\n setFilterTenantId(e.target.value || undefined);\r\n setPage(1);\r\n }}\r\n className=\"input\"\r\n >\r\n <option value=\"\">All Workspaces</option>\r\n {userTenants\r\n .filter(t => t.status === 'Active')\r\n .map(tenant => (\r\n <option key={tenant.id} value={tenant.id}>\r\n {tenant.name}\r\n </option>\r\n ))}\r\n </select>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n {unreadCount > 0 && (\r\n <button\r\n onClick={handleMarkAllAsRead}\r\n className=\"btn btn-secondary flex items-center gap-2\"\r\n >\r\n <CheckCheck className=\"w-4 h-4\" />\r\n Mark All Read\r\n </button>\r\n )}\r\n {notifications.length > 0 && (\r\n <button\r\n onClick={() => setShowDeleteConfirm(true)}\r\n className=\"btn btn-secondary flex items-center gap-2 text-red-600\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n Delete All\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Notifications List */}\r\n {loading && (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n )}\r\n {!loading && notifications.length > 0 && (\r\n <div className=\"card divide-y divide-[var(--border-color)]\">\r\n {notifications.map((notification) => (\r\n <button\r\n type=\"button\"\r\n key={notification.id}\r\n onClick={() => handleNotificationClick(notification)}\r\n className={`w-full text-left p-4 cursor-pointer hover:bg-[var(--bg-hover)] transition-colors ${\r\n !notification.isRead ? 'bg-blue-50/50' : ''\r\n }`}\r\n >\r\n <div className=\"flex gap-4\">\r\n <span className=\"text-2xl flex-shrink-0\">\r\n {getNotificationIcon(notification.type)}\r\n </span>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-start justify-between gap-4\">\r\n <div>\r\n <h3 className={`${!notification.isRead ? 'font-semibold' : ''}`}>\r\n {notification.title}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {notification.message}\r\n </p>\r\n </div>\r\n <div className=\"text-right flex-shrink-0\">\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {formatDate(notification.createdAt)}\r\n </div>\r\n {notification.isRead && notification.readAt && (\r\n <div className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n Read {formatDate(notification.readAt)}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2 mt-2\">\r\n <span className=\"text-xs px-2 py-1 bg-[var(--bg-secondary)] rounded\">\r\n {formatNotificationType(notification.type)}\r\n </span>\r\n {renderTenantBadge(notification)}\r\n {notification.relatedEntityType && (\r\n <span className=\"text-xs text-[var(--text-secondary)]\">\r\n {notification.relatedEntityType}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"flex flex-col gap-2 flex-shrink-0\" onClick={(e) => e.stopPropagation()}>\r\n {!notification.isRead && (\r\n <button\r\n onClick={() => handleMarkAsRead(notification.id)}\r\n className=\"p-2 rounded hover:bg-[var(--bg-secondary)] transition-colors\"\r\n title=\"Mark as read\"\r\n >\r\n <Check className=\"w-4 h-4 text-green-600\" />\r\n </button>\r\n )}\r\n <button\r\n onClick={() => handleDelete(notification.id)}\r\n className=\"p-2 rounded hover:bg-[var(--bg-secondary)] transition-colors\"\r\n title=\"Delete\"\r\n >\r\n <Trash2 className=\"w-4 h-4 text-red-500\" />\r\n </button>\r\n </div>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n {!loading && notifications.length === 0 && (\r\n <div className=\"card p-12 text-center\">\r\n <Bell className=\"w-16 h-16 mx-auto mb-4 opacity-30\" />\r\n <h3 className=\"text-lg font-medium mb-2\">No notifications</h3>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {(() => {\r\n if (filterRead === false) return 'You have no unread notifications';\r\n if (filterRead === true) return 'You have no read notifications';\r\n return \"You're all caught up!\";\r\n })()}\r\n </p>\r\n </div>\r\n )}\r\n\r\n {/* Pagination */}\r\n {!loading && totalPages > 1 && (\r\n <Pagination\r\n page={page}\r\n totalPages={totalPages}\r\n totalCount={totalCount}\r\n onPageChange={setPage}\r\n />\r\n )}\r\n\r\n {/* Delete All Confirmation */}\r\n <ConfirmModal\r\n isOpen={showDeleteConfirm}\r\n title={t('notifications.deleteAll.title')}\r\n message={t('notifications.deleteAll.message')}\r\n confirmLabel={t('notifications.deleteAll.confirm')}\r\n variant=\"danger\"\r\n loading={deleting}\r\n onConfirm={handleDeleteAll}\r\n onCancel={() => setShowDeleteConfirm(false)}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nfunction formatNotificationType(type: string): string {\r\n return type\r\n .replace(/([A-Z])/g, ' $1')\r\n .replace(/^./, (str) => str.toUpperCase())\r\n .trim();\r\n}\r\n"],"names":["NotificationsPage","navigate","useNavigate","t","useTranslation","currentTenant","userTenants","hasMultipleTenants","useTenant","loading","setLoading","useState","notifications","setNotifications","showDeleteConfirm","setShowDeleteConfirm","deleting","setDeleting","page","setPage","totalPages","setTotalPages","totalCount","setTotalCount","filterRead","setFilterRead","filterTenantId","setFilterTenantId","loadNotifications","useCallback","result","notificationsApi","error","useEffect","handleMarkAsRead","id","prev","n","handleMarkAllAsRead","handleDelete","handleDeleteAll","handleNotificationClick","notification","getNotificationIcon","type","formatDate","dateStr","renderTenantBadge","variant","getTenantBadgeVariant","jsx","unreadCount","jsxs","Bell","Settings","Filter","value","tenant","CheckCheck","Trash2","Loader2","formatNotificationType","e","Check","Pagination","ConfirmModal","str"],"mappings":"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"}
1
+ {"version":3,"file":"NotificationsPage-D76MdAs-.js","sources":["../../src/pages/notifications/NotificationsPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Bell,\r\n Check,\r\n CheckCheck,\r\n Trash2,\r\n Loader2,\r\n Filter,\r\n Settings,\r\n} from 'lucide-react';\r\nimport {\r\n notificationsApi,\r\n type NotificationDto,\r\n} from '@/services/api/supportApi';\r\nimport { Pagination } from '@/components/ui/DataView';\r\nimport { ConfirmModal } from '@/components/ui/ConfirmModal';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { getTenantBadgeVariant } from '@/utils/notificationTenant';\r\n\r\nexport function NotificationsPage(): ReactElement | null {\r\n const navigate = useNavigate();\r\n const { t } = useTranslation('common');\r\n const { currentTenant, userTenants, hasMultipleTenants } = useTenant();\r\n const [loading, setLoading] = useState(true);\r\n const [notifications, setNotifications] = useState<NotificationDto[]>([]);\r\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\r\n const [deleting, setDeleting] = useState(false);\r\n const [page, setPage] = useState(1);\r\n const [totalPages, setTotalPages] = useState(1);\r\n const [totalCount, setTotalCount] = useState(0);\r\n const [filterRead, setFilterRead] = useState<boolean | undefined>(undefined);\r\n const [filterTenantId, setFilterTenantId] = useState<string | undefined>(undefined);\r\n\r\n const loadNotifications = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const result = await notificationsApi.getAll(page, 20, filterRead, filterTenantId);\r\n setNotifications(result.items);\r\n setTotalPages(result.totalPages);\r\n setTotalCount(result.totalCount);\r\n } catch (error) {\r\n console.error('Failed to load notifications:', error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [page, filterRead, filterTenantId]);\r\n\r\n useEffect(() => {\r\n loadNotifications();\r\n }, [loadNotifications]);\r\n\r\n const handleMarkAsRead = async (id: string) => {\r\n try {\r\n await notificationsApi.markAsRead(id);\r\n setNotifications((prev) =>\r\n prev.map((n) => (n.id === id ? { ...n, isRead: true, readAt: new Date().toISOString() } : n))\r\n );\r\n } catch (error) {\r\n console.error('Failed to mark as read:', error);\r\n }\r\n };\r\n\r\n const handleMarkAllAsRead = async () => {\r\n try {\r\n await notificationsApi.markAllAsRead();\r\n setNotifications((prev) => prev.map((n) => ({ ...n, isRead: true, readAt: new Date().toISOString() })));\r\n } catch (error) {\r\n console.error('Failed to mark all as read:', error);\r\n }\r\n };\r\n\r\n const handleDelete = async (id: string) => {\r\n try {\r\n await notificationsApi.delete(id);\r\n setNotifications((prev) => prev.filter((n) => n.id !== id));\r\n setTotalCount((prev) => prev - 1);\r\n } catch (error) {\r\n console.error('Failed to delete notification:', error);\r\n }\r\n };\r\n\r\n const handleDeleteAll = async () => {\r\n try {\r\n setDeleting(true);\r\n await notificationsApi.deleteAll();\r\n setNotifications([]);\r\n setTotalCount(0);\r\n setTotalPages(1);\r\n } catch (error) {\r\n console.error('Failed to delete all notifications:', error);\r\n } finally {\r\n setDeleting(false);\r\n setShowDeleteConfirm(false);\r\n }\r\n };\r\n\r\n const handleNotificationClick = (notification: NotificationDto) => {\r\n if (!notification.isRead) {\r\n handleMarkAsRead(notification.id);\r\n }\r\n if (notification.actionUrl) {\r\n navigate(notification.actionUrl);\r\n }\r\n };\r\n\r\n const getNotificationIcon = (type: string) => {\r\n switch (type) {\r\n case 'TicketCreated':\r\n return '🎫';\r\n case 'TicketAssigned':\r\n return '👤';\r\n case 'StatusChanged':\r\n return '🔄';\r\n case 'CommentAdded':\r\n return '💬';\r\n case 'SlaResponseBreached':\r\n case 'SlaResolutionBreached':\r\n return '⚠️';\r\n case 'SlaWarning':\r\n return '⏰';\r\n case 'TicketEscalated':\r\n return '📈';\r\n case 'SatisfactionRequested':\r\n return '⭐';\r\n default:\r\n return '📌';\r\n }\r\n };\r\n\r\n const formatDate = (dateStr: string) => {\r\n const date = new Date(dateStr);\r\n return date.toLocaleString();\r\n };\r\n\r\n const renderTenantBadge = (notification: NotificationDto) => {\r\n if (!hasMultipleTenants) return null;\r\n\r\n const variant = getTenantBadgeVariant(notification.tenantId, currentTenant?.id ?? null);\r\n\r\n if (variant === 'global') {\r\n return (\r\n <span className=\"text-xs px-2 py-1 rounded bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300 border border-purple-200 dark:border-purple-700\">\r\n System\r\n </span>\r\n );\r\n }\r\n\r\n if (variant === 'current') {\r\n return (\r\n <span className=\"text-xs px-2 py-1 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] border border-[var(--border-color)]\">\r\n {notification.tenantName}\r\n </span>\r\n );\r\n }\r\n\r\n // 'other' tenant - highlighted\r\n return (\r\n <span className=\"text-xs px-2 py-1 rounded bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 border border-blue-200 dark:border-blue-700 font-medium\">\r\n {notification.tenantName}\r\n </span>\r\n );\r\n };\r\n\r\n const unreadCount = notifications.filter((n) => !n.isRead).length;\r\n\r\n const getFilterReadValue = () => {\r\n if (filterRead === undefined) return '';\r\n return filterRead ? 'read' : 'unread';\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold flex items-center gap-2\">\r\n <Bell className=\"w-6 h-6\" />\r\n Notifications\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {totalCount} notification{totalCount !== 1 ? 's' : ''}, {unreadCount} unread\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => navigate('/myspace/notification-preferences')}\r\n className=\"btn btn-secondary flex items-center gap-2\"\r\n >\r\n <Settings className=\"w-4 h-4\" />\r\n Preferences\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Filters and Actions */}\r\n <div className=\"flex flex-col md:flex-row gap-4 items-start md:items-center justify-between\">\r\n <div className=\"flex items-center gap-2\">\r\n <Filter className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <select\r\n value={getFilterReadValue()}\r\n onChange={(e) => {\r\n const value = e.target.value;\r\n setFilterRead(value === '' ? undefined : value === 'read');\r\n setPage(1);\r\n }}\r\n className=\"input\"\r\n >\r\n <option value=\"\">All Notifications</option>\r\n <option value=\"unread\">Unread Only</option>\r\n <option value=\"read\">Read Only</option>\r\n </select>\r\n\r\n {hasMultipleTenants && (\r\n <select\r\n value={filterTenantId || ''}\r\n onChange={(e) => {\r\n setFilterTenantId(e.target.value || undefined);\r\n setPage(1);\r\n }}\r\n className=\"input\"\r\n >\r\n <option value=\"\">All Workspaces</option>\r\n {userTenants\r\n .filter(t => t.status === 'Active')\r\n .map(tenant => (\r\n <option key={tenant.id} value={tenant.id}>\r\n {tenant.name}\r\n </option>\r\n ))}\r\n </select>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n {unreadCount > 0 && (\r\n <button\r\n onClick={handleMarkAllAsRead}\r\n className=\"btn btn-secondary flex items-center gap-2\"\r\n >\r\n <CheckCheck className=\"w-4 h-4\" />\r\n Mark All Read\r\n </button>\r\n )}\r\n {notifications.length > 0 && (\r\n <button\r\n onClick={() => setShowDeleteConfirm(true)}\r\n className=\"btn btn-secondary flex items-center gap-2 text-red-600\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n Delete All\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Notifications List */}\r\n {loading && (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n )}\r\n {!loading && notifications.length > 0 && (\r\n <div className=\"card divide-y divide-[var(--border-color)]\">\r\n {notifications.map((notification) => (\r\n <button\r\n type=\"button\"\r\n key={notification.id}\r\n onClick={() => handleNotificationClick(notification)}\r\n className={`w-full text-left p-4 cursor-pointer hover:bg-[var(--bg-hover)] transition-colors ${\r\n !notification.isRead ? 'bg-blue-50/50' : ''\r\n }`}\r\n >\r\n <div className=\"flex gap-4\">\r\n <span className=\"text-2xl flex-shrink-0\">\r\n {getNotificationIcon(notification.type)}\r\n </span>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-start justify-between gap-4\">\r\n <div>\r\n <h3 className={`${!notification.isRead ? 'font-semibold' : ''}`}>\r\n {notification.title}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {notification.message}\r\n </p>\r\n </div>\r\n <div className=\"text-right flex-shrink-0\">\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {formatDate(notification.createdAt)}\r\n </div>\r\n {notification.isRead && notification.readAt && (\r\n <div className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n Read {formatDate(notification.readAt)}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2 mt-2\">\r\n <span className=\"text-xs px-2 py-1 bg-[var(--bg-secondary)] rounded\">\r\n {formatNotificationType(notification.type)}\r\n </span>\r\n {renderTenantBadge(notification)}\r\n {notification.relatedEntityType && (\r\n <span className=\"text-xs text-[var(--text-secondary)]\">\r\n {notification.relatedEntityType}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"flex flex-col gap-2 flex-shrink-0\" onClick={(e) => e.stopPropagation()}>\r\n {!notification.isRead && (\r\n <button\r\n onClick={() => handleMarkAsRead(notification.id)}\r\n className=\"p-2 rounded hover:bg-[var(--bg-secondary)] transition-colors\"\r\n title=\"Mark as read\"\r\n >\r\n <Check className=\"w-4 h-4 text-green-600\" />\r\n </button>\r\n )}\r\n <button\r\n onClick={() => handleDelete(notification.id)}\r\n className=\"p-2 rounded hover:bg-[var(--bg-secondary)] transition-colors\"\r\n title=\"Delete\"\r\n >\r\n <Trash2 className=\"w-4 h-4 text-red-500\" />\r\n </button>\r\n </div>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n {!loading && notifications.length === 0 && (\r\n <div className=\"card p-12 text-center\">\r\n <Bell className=\"w-16 h-16 mx-auto mb-4 opacity-30\" />\r\n <h3 className=\"text-lg font-medium mb-2\">No notifications</h3>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {(() => {\r\n if (filterRead === false) return 'You have no unread notifications';\r\n if (filterRead === true) return 'You have no read notifications';\r\n return \"You're all caught up!\";\r\n })()}\r\n </p>\r\n </div>\r\n )}\r\n\r\n {/* Pagination */}\r\n {!loading && totalPages > 1 && (\r\n <Pagination\r\n page={page}\r\n totalPages={totalPages}\r\n totalCount={totalCount}\r\n onPageChange={setPage}\r\n />\r\n )}\r\n\r\n {/* Delete All Confirmation */}\r\n <ConfirmModal\r\n isOpen={showDeleteConfirm}\r\n title={t('notifications.deleteAll.title')}\r\n message={t('notifications.deleteAll.message')}\r\n confirmLabel={t('notifications.deleteAll.confirm')}\r\n variant=\"danger\"\r\n loading={deleting}\r\n onConfirm={handleDeleteAll}\r\n onCancel={() => setShowDeleteConfirm(false)}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nfunction formatNotificationType(type: string): string {\r\n return type\r\n .replace(/([A-Z])/g, ' $1')\r\n .replace(/^./, (str) => str.toUpperCase())\r\n .trim();\r\n}\r\n"],"names":["NotificationsPage","navigate","useNavigate","t","useTranslation","currentTenant","userTenants","hasMultipleTenants","useTenant","loading","setLoading","useState","notifications","setNotifications","showDeleteConfirm","setShowDeleteConfirm","deleting","setDeleting","page","setPage","totalPages","setTotalPages","totalCount","setTotalCount","filterRead","setFilterRead","filterTenantId","setFilterTenantId","loadNotifications","useCallback","result","notificationsApi","error","useEffect","handleMarkAsRead","id","prev","n","handleMarkAllAsRead","handleDelete","handleDeleteAll","handleNotificationClick","notification","getNotificationIcon","type","formatDate","dateStr","renderTenantBadge","variant","getTenantBadgeVariant","jsx","unreadCount","jsxs","Bell","Settings","Filter","value","tenant","CheckCheck","Trash2","Loader2","formatNotificationType","e","Check","Pagination","ConfirmModal","str"],"mappings":";;;;;;;AAsBO,SAASA,KAAyC;AACvD,QAAMC,IAAWC,EAAA,GACX,EAAE,GAAAC,EAAA,IAAMC,EAAe,QAAQ,GAC/B,EAAE,eAAAC,GAAe,aAAAC,GAAa,oBAAAC,EAAA,IAAuBC,EAAA,GACrD,CAACC,GAASC,CAAU,IAAIC,EAAS,EAAI,GACrC,CAACC,GAAeC,CAAgB,IAAIF,EAA4B,CAAA,CAAE,GAClE,CAACG,GAAmBC,CAAoB,IAAIJ,EAAS,EAAK,GAC1D,CAACK,GAAUC,CAAW,IAAIN,EAAS,EAAK,GACxC,CAACO,GAAMC,CAAO,IAAIR,EAAS,CAAC,GAC5B,CAACS,GAAYC,CAAa,IAAIV,EAAS,CAAC,GACxC,CAACW,GAAYC,CAAa,IAAIZ,EAAS,CAAC,GACxC,CAACa,GAAYC,CAAa,IAAId,EAA8B,MAAS,GACrE,CAACe,GAAgBC,CAAiB,IAAIhB,EAA6B,MAAS,GAE5EiB,IAAoBC,EAAY,YAAY;AAChD,QAAI;AACF,MAAAnB,EAAW,EAAI;AACf,YAAMoB,IAAS,MAAMC,EAAiB,OAAOb,GAAM,IAAIM,GAAYE,CAAc;AACjF,MAAAb,EAAiBiB,EAAO,KAAK,GAC7BT,EAAcS,EAAO,UAAU,GAC/BP,EAAcO,EAAO,UAAU;AAAA,IACjC,SAASE,GAAO;AACd,cAAQ,MAAM,iCAAiCA,CAAK;AAAA,IACtD,UAAA;AACE,MAAAtB,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAACQ,GAAMM,GAAYE,CAAc,CAAC;AAErC,EAAAO,EAAU,MAAM;AACd,IAAAL,EAAA;AAAA,EACF,GAAG,CAACA,CAAiB,CAAC;AAEtB,QAAMM,IAAmB,OAAOC,MAAe;AAC7C,QAAI;AACF,YAAMJ,EAAiB,WAAWI,CAAE,GACpCtB;AAAA,QAAiB,CAACuB,MAChBA,EAAK,IAAI,CAACC,MAAOA,EAAE,OAAOF,IAAK,EAAE,GAAGE,GAAG,QAAQ,IAAM,SAAQ,oBAAI,QAAO,YAAA,EAAY,IAAMA,CAAE;AAAA,MAAA;AAAA,IAEhG,SAASL,GAAO;AACd,cAAQ,MAAM,2BAA2BA,CAAK;AAAA,IAChD;AAAA,EACF,GAEMM,IAAsB,YAAY;AACtC,QAAI;AACF,YAAMP,EAAiB,cAAA,GACvBlB,EAAiB,CAACuB,MAASA,EAAK,IAAI,CAACC,OAAO,EAAE,GAAGA,GAAG,QAAQ,IAAM,SAAQ,oBAAI,KAAA,GAAO,YAAA,EAAY,EAAI,CAAC;AAAA,IACxG,SAASL,GAAO;AACd,cAAQ,MAAM,+BAA+BA,CAAK;AAAA,IACpD;AAAA,EACF,GAEMO,IAAe,OAAOJ,MAAe;AACzC,QAAI;AACF,YAAMJ,EAAiB,OAAOI,CAAE,GAChCtB,EAAiB,CAACuB,MAASA,EAAK,OAAO,CAACC,MAAMA,EAAE,OAAOF,CAAE,CAAC,GAC1DZ,EAAc,CAACa,MAASA,IAAO,CAAC;AAAA,IAClC,SAASJ,GAAO;AACd,cAAQ,MAAM,kCAAkCA,CAAK;AAAA,IACvD;AAAA,EACF,GAEMQ,IAAkB,YAAY;AAClC,QAAI;AACF,MAAAvB,EAAY,EAAI,GAChB,MAAMc,EAAiB,UAAA,GACvBlB,EAAiB,CAAA,CAAE,GACnBU,EAAc,CAAC,GACfF,EAAc,CAAC;AAAA,IACjB,SAASW,GAAO;AACd,cAAQ,MAAM,uCAAuCA,CAAK;AAAA,IAC5D,UAAA;AACE,MAAAf,EAAY,EAAK,GACjBF,EAAqB,EAAK;AAAA,IAC5B;AAAA,EACF,GAEM0B,IAA0B,CAACC,MAAkC;AACjE,IAAKA,EAAa,UAChBR,EAAiBQ,EAAa,EAAE,GAE9BA,EAAa,aACfzC,EAASyC,EAAa,SAAS;AAAA,EAEnC,GAEMC,IAAsB,CAACC,MAAiB;AAC5C,YAAQA,GAAA;AAAA,MACN,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IAAA;AAAA,EAEb,GAEMC,IAAa,CAACC,MACL,IAAI,KAAKA,CAAO,EACjB,eAAA,GAGRC,IAAoB,CAACL,MAAkC;AAC3D,QAAI,CAACnC,EAAoB,QAAO;AAEhC,UAAMyC,IAAUC,EAAsBP,EAAa,UAAUrC,GAAe,MAAM,IAAI;AAEtF,WAAI2C,MAAY,WAEZ,gBAAAE,EAAC,QAAA,EAAK,WAAU,sJAAqJ,UAAA,UAErK,IAIAF,MAAY,YAEZ,gBAAAE,EAAC,QAAA,EAAK,WAAU,uHACb,YAAa,YAChB,IAMF,gBAAAA,EAAC,QAAA,EAAK,WAAU,sJACb,YAAa,YAChB;AAAA,EAEJ,GAEMC,IAAcvC,EAAc,OAAO,CAACyB,MAAM,CAACA,EAAE,MAAM,EAAE;AAO3D,SACE,gBAAAe,EAAC,OAAA,EAAI,WAAU,aAEb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,QAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,8CACZ,UAAA;AAAA,UAAA,gBAAAF,EAACG,GAAA,EAAK,WAAU,UAAA,CAAU;AAAA,UAAE;AAAA,QAAA,GAE9B;AAAA,QACA,gBAAAD,EAAC,KAAA,EAAE,WAAU,gCACV,UAAA;AAAA,UAAA9B;AAAA,UAAW;AAAA,UAAcA,MAAe,IAAI,MAAM;AAAA,UAAG;AAAA,UAAG6B;AAAA,UAAY;AAAA,QAAA,EAAA,CACvE;AAAA,MAAA,GACF;AAAA,MACA,gBAAAD,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA,gBAAAE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,MAAMnD,EAAS,mCAAmC;AAAA,UAC3D,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,gBAAAiD,EAACI,GAAA,EAAS,WAAU,UAAA,CAAU;AAAA,YAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,EAElC,CACF;AAAA,IAAA,GACF;AAAA,IAGA,gBAAAF,EAAC,OAAA,EAAI,WAAU,+EACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAF,EAACK,GAAA,EAAO,WAAU,uCAAA,CAAuC;AAAA,QACzD,gBAAAH;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAjCJ5B,MAAe,SAAkB,KAC9BA,IAAa,SAAS;AAAA,YAiCrB,UAAU,CAAC,MAAM;AACf,oBAAMgC,IAAQ,EAAE,OAAO;AACvB,cAAA/B,EAAc+B,MAAU,KAAK,SAAYA,MAAU,MAAM,GACzDrC,EAAQ,CAAC;AAAA,YACX;AAAA,YACA,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAA+B,EAAC,UAAA,EAAO,OAAM,IAAG,UAAA,qBAAiB;AAAA,cAClC,gBAAAA,EAAC,UAAA,EAAO,OAAM,UAAS,UAAA,eAAW;AAAA,cAClC,gBAAAA,EAAC,UAAA,EAAO,OAAM,QAAO,UAAA,YAAA,CAAS;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAG/B3C,KACC,gBAAA6C;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO1B,KAAkB;AAAA,YACzB,UAAU,CAAC,MAAM;AACf,cAAAC,EAAkB,EAAE,OAAO,SAAS,MAAS,GAC7CR,EAAQ,CAAC;AAAA,YACX;AAAA,YACA,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAA+B,EAAC,UAAA,EAAO,OAAM,IAAG,UAAA,kBAAc;AAAA,cAC9B5C,EACE,OAAO,CAAAH,MAAKA,EAAE,WAAW,QAAQ,EACjC,IAAI,OACH,gBAAA+C,EAAC,UAAA,EAAuB,OAAOO,EAAO,IACnC,YAAO,KAAA,GADGA,EAAO,EAEpB,CACD;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACL,GAEJ;AAAA,MAEA,gBAAAL,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,QAAAD,IAAc,KACb,gBAAAC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASd;AAAA,YACT,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAAY,EAACQ,GAAA,EAAW,WAAU,UAAA,CAAU;AAAA,cAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAIrC9C,EAAc,SAAS,KACtB,gBAAAwC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAMrC,EAAqB,EAAI;AAAA,YACxC,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAAmC,EAACS,GAAA,EAAO,WAAU,UAAA,CAAU;AAAA,cAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAEhC,EAAA,CAEJ;AAAA,IAAA,GACF;AAAA,IAGClD,uBACE,OAAA,EAAI,WAAU,0CACb,UAAA,gBAAAyC,EAACU,GAAA,EAAQ,WAAU,uDAAA,CAAuD,EAAA,CAC5E;AAAA,IAED,CAACnD,KAAWG,EAAc,SAAS,KAClC,gBAAAsC,EAAC,OAAA,EAAI,WAAU,8CACZ,UAAAtC,EAAc,IAAI,CAAC8B,MAClB,gBAAAQ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QAEL,SAAS,MAAMT,EAAwBC,CAAY;AAAA,QACnD,WAAW,oFACRA,EAAa,SAA2B,KAAlB,eACzB;AAAA,QAEA,UAAA,gBAAAU,EAAC,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,UAAA,gBAAAF,EAAC,UAAK,WAAU,0BACb,UAAAP,EAAoBD,EAAa,IAAI,GACxC;AAAA,UACA,gBAAAU,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,cAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,gBAAA,gBAAAF,EAAC,MAAA,EAAG,WAAW,GAAIR,EAAa,SAA2B,KAAlB,eAAoB,IAC1D,UAAAA,EAAa,MAAA,CAChB;AAAA,gBACA,gBAAAQ,EAAC,KAAA,EAAE,WAAU,6CACV,YAAa,QAAA,CAChB;AAAA,cAAA,GACF;AAAA,cACA,gBAAAE,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,gBAAA,gBAAAF,EAAC,SAAI,WAAU,wCACZ,UAAAL,EAAWH,EAAa,SAAS,GACpC;AAAA,gBACCA,EAAa,UAAUA,EAAa,UACnC,gBAAAU,EAAC,OAAA,EAAI,WAAU,6CAA4C,UAAA;AAAA,kBAAA;AAAA,kBACnDP,EAAWH,EAAa,MAAM;AAAA,gBAAA,EAAA,CACtC;AAAA,cAAA,EAAA,CAEJ;AAAA,YAAA,GACF;AAAA,YACA,gBAAAU,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,cAAA,gBAAAF,EAAC,UAAK,WAAU,sDACb,UAAAW,GAAuBnB,EAAa,IAAI,GAC3C;AAAA,cACCK,EAAkBL,CAAY;AAAA,cAC9BA,EAAa,qBACZ,gBAAAQ,EAAC,UAAK,WAAU,wCACb,YAAa,kBAAA,CAChB;AAAA,YAAA,EAAA,CAEJ;AAAA,UAAA,GACF;AAAA,UACA,gBAAAE,EAAC,SAAI,WAAU,qCAAoC,SAAS,CAACU,MAAMA,EAAE,gBAAA,GAClE,UAAA;AAAA,YAAA,CAACpB,EAAa,UACb,gBAAAQ;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,MAAMhB,EAAiBQ,EAAa,EAAE;AAAA,gBAC/C,WAAU;AAAA,gBACV,OAAM;AAAA,gBAEN,UAAA,gBAAAQ,EAACa,GAAA,EAAM,WAAU,yBAAA,CAAyB;AAAA,cAAA;AAAA,YAAA;AAAA,YAG9C,gBAAAb;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,MAAMX,EAAaG,EAAa,EAAE;AAAA,gBAC3C,WAAU;AAAA,gBACV,OAAM;AAAA,gBAEN,UAAA,gBAAAQ,EAACS,GAAA,EAAO,WAAU,uBAAA,CAAuB;AAAA,cAAA;AAAA,YAAA;AAAA,UAC3C,EAAA,CACF;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,MA7DKjB,EAAa;AAAA,IAAA,CA+DrB,GACH;AAAA,IAED,CAACjC,KAAWG,EAAc,WAAW,KACpC,gBAAAwC,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,MAAA,gBAAAF,EAACG,GAAA,EAAK,WAAU,oCAAA,CAAoC;AAAA,MACpD,gBAAAH,EAAC,MAAA,EAAG,WAAU,4BAA2B,UAAA,oBAAgB;AAAA,MACzD,gBAAAA,EAAC,KAAA,EAAE,WAAU,gCACT,UACI1B,MAAe,KAAc,qCAC7BA,MAAe,KAAa,mCACzB,wBACN,CACL;AAAA,IAAA,GACF;AAAA,IAID,CAACf,KAAWW,IAAa,KACxB,gBAAA8B;AAAA,MAACc;AAAA,MAAA;AAAA,QACC,MAAA9C;AAAA,QACA,YAAAE;AAAA,QACA,YAAAE;AAAA,QACA,cAAcH;AAAA,MAAA;AAAA,IAAA;AAAA,IAKlB,gBAAA+B;AAAA,MAACe;AAAA,MAAA;AAAA,QACC,QAAQnD;AAAA,QACR,OAAOX,EAAE,+BAA+B;AAAA,QACxC,SAASA,EAAE,iCAAiC;AAAA,QAC5C,cAAcA,EAAE,iCAAiC;AAAA,QACjD,SAAQ;AAAA,QACR,SAASa;AAAA,QACT,WAAWwB;AAAA,QACX,UAAU,MAAMzB,EAAqB,EAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAC5C,GACF;AAEJ;AAEA,SAAS8C,GAAuBjB,GAAsB;AACpD,SAAOA,EACJ,QAAQ,YAAY,KAAK,EACzB,QAAQ,MAAM,CAACsB,MAAQA,EAAI,YAAA,CAAa,EACxC,KAAA;AACL;"}