@atlashub/smartstack 3.21.0 → 3.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js → AgentSkillsPage-BWQSCYl-.js} +2 -2
  2. package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js.map → AgentSkillsPage-BWQSCYl-.js.map} +1 -1
  3. package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js → AgentSkillsPage-IQcMnBaD.js} +2 -2
  4. package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js.map → AgentSkillsPage-IQcMnBaD.js.map} +1 -1
  5. package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js → AgentWorkloadPage-DqrjkvWL.js} +2 -2
  6. package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js.map → AgentWorkloadPage-DqrjkvWL.js.map} +1 -1
  7. package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js → AgentWorkloadPage-w-HiyFYP.js} +2 -2
  8. package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js.map → AgentWorkloadPage-w-HiyFYP.js.map} +1 -1
  9. package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js → ApiCatalogDetailPage-D3L8Yf4G.js} +3 -3
  10. package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js.map → ApiCatalogDetailPage-D3L8Yf4G.js.map} +1 -1
  11. package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js → ApiCatalogDetailPage-MPT3Kz6H.js} +2 -2
  12. package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js.map → ApiCatalogDetailPage-MPT3Kz6H.js.map} +1 -1
  13. package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js → ApiCatalogPage-D4Hg3uiS.js} +2 -2
  14. package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js.map → ApiCatalogPage-D4Hg3uiS.js.map} +1 -1
  15. package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js → ApiCatalogPage-DRg5Cz0r.js} +2 -2
  16. package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js.map → ApiCatalogPage-DRg5Cz0r.js.map} +1 -1
  17. package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js → ApplicationDetailPage-Caizuyn2.js} +2 -2
  18. package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js.map → ApplicationDetailPage-Caizuyn2.js.map} +1 -1
  19. package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js → ApplicationDetailPage-CuCW6aMB.js} +4 -4
  20. package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js.map → ApplicationDetailPage-CuCW6aMB.js.map} +1 -1
  21. package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js → ApplicationsDashboardPage-B2MW8-Kc.js} +2 -2
  22. package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js.map → ApplicationsDashboardPage-B2MW8-Kc.js.map} +1 -1
  23. package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js → ApplicationsDashboardPage-BDIjFIYZ.js} +3 -3
  24. package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js.map → ApplicationsDashboardPage-BDIjFIYZ.js.map} +1 -1
  25. package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js → ApplicationsGridPage-DV-FihKj.js} +2 -2
  26. package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js.map → ApplicationsGridPage-DV-FihKj.js.map} +1 -1
  27. package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js → ApplicationsGridPage-DXsTfXPI.js} +2 -2
  28. package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js.map → ApplicationsGridPage-DXsTfXPI.js.map} +1 -1
  29. package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js → ApplicationsListPage--CGkyBuJ.js} +2 -2
  30. package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js.map → ApplicationsListPage--CGkyBuJ.js.map} +1 -1
  31. package/dist/chunks/{ApplicationsListPage-C91v2rZt.js → ApplicationsListPage-JUX823bh.js} +2 -2
  32. package/dist/chunks/{ApplicationsListPage-C91v2rZt.js.map → ApplicationsListPage-JUX823bh.js.map} +1 -1
  33. package/dist/chunks/{ApplicationsPage-BCbgotIx.js → ApplicationsPage-6zgFye6w.js} +2 -2
  34. package/dist/chunks/{ApplicationsPage-BCbgotIx.js.map → ApplicationsPage-6zgFye6w.js.map} +1 -1
  35. package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js → ApplicationsPage-CQPuuiO6.js} +4 -4
  36. package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js.map → ApplicationsPage-CQPuuiO6.js.map} +1 -1
  37. package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js → AssignmentRulesPage-CFffeEbo.js} +2 -2
  38. package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js.map → AssignmentRulesPage-CFffeEbo.js.map} +1 -1
  39. package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js → AssignmentRulesPage-D78UeUId.js} +2 -2
  40. package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js.map → AssignmentRulesPage-D78UeUId.js.map} +1 -1
  41. package/dist/chunks/{AssignmentsPage-DmfBYQAD.js → AssignmentsPage-Cww2ifZF.js} +2 -2
  42. package/dist/chunks/{AssignmentsPage-DmfBYQAD.js.map → AssignmentsPage-Cww2ifZF.js.map} +1 -1
  43. package/dist/chunks/{AssignmentsPage-sRCCBmRc.js → AssignmentsPage-DE_QS2LO.js} +2 -2
  44. package/dist/chunks/{AssignmentsPage-sRCCBmRc.js.map → AssignmentsPage-DE_QS2LO.js.map} +1 -1
  45. package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js → AuthCallbackPage-CA2nO6DG.js} +2 -2
  46. package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js.map → AuthCallbackPage-CA2nO6DG.js.map} +1 -1
  47. package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js → AuthCallbackPage-CDUAoX-N.js} +2 -2
  48. package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js.map → AuthCallbackPage-CDUAoX-N.js.map} +1 -1
  49. package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js → ConfirmEmailPage-BqsILAYH.js} +2 -2
  50. package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js.map → ConfirmEmailPage-BqsILAYH.js.map} +1 -1
  51. package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js → ConfirmEmailPage-INeHCuMB.js} +2 -2
  52. package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js.map → ConfirmEmailPage-INeHCuMB.js.map} +1 -1
  53. package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js → CreateSupportTicketPage-BWeuV2aU.js} +2 -2
  54. package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js.map → CreateSupportTicketPage-BWeuV2aU.js.map} +1 -1
  55. package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js → CreateSupportTicketPage-OBwF4v7b.js} +2 -2
  56. package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js.map → CreateSupportTicketPage-OBwF4v7b.js.map} +1 -1
  57. package/dist/chunks/{DashboardPage-CUZ80NGV.js → DashboardPage-CKHqWrdS.js} +3 -3
  58. package/dist/chunks/{DashboardPage-CUZ80NGV.js.map → DashboardPage-CKHqWrdS.js.map} +1 -1
  59. package/dist/chunks/{DashboardPage-CaNOAstg.js → DashboardPage-COmc9b__.js} +3 -3
  60. package/dist/chunks/{DashboardPage-CaNOAstg.js.map → DashboardPage-COmc9b__.js.map} +1 -1
  61. package/dist/chunks/{DashboardPage-B48_rQFi.js → DashboardPage-CfKZHiSj.js} +2 -2
  62. package/dist/chunks/{DashboardPage-B48_rQFi.js.map → DashboardPage-CfKZHiSj.js.map} +1 -1
  63. package/dist/chunks/{DashboardPage-CUZV1J9t.js → DashboardPage-CwEZZ3jx.js} +2 -2
  64. package/dist/chunks/{DashboardPage-CUZV1J9t.js.map → DashboardPage-CwEZZ3jx.js.map} +1 -1
  65. package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js → EscalationConfigPage--7lgZ0kJ.js} +2 -2
  66. package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js.map → EscalationConfigPage--7lgZ0kJ.js.map} +1 -1
  67. package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js → EscalationConfigPage-DPyiBcqV.js} +2 -2
  68. package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js.map → EscalationConfigPage-DPyiBcqV.js.map} +1 -1
  69. package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js → ForceChangePasswordPage-BE-6umub.js} +2 -2
  70. package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js.map → ForceChangePasswordPage-BE-6umub.js.map} +1 -1
  71. package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js → ForceChangePasswordPage-CnsYoWmV.js} +2 -2
  72. package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js.map → ForceChangePasswordPage-CnsYoWmV.js.map} +1 -1
  73. package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js → ForgotPasswordPage-CSq4DnFF.js} +2 -2
  74. package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js.map → ForgotPasswordPage-CSq4DnFF.js.map} +1 -1
  75. package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js → ForgotPasswordPage-DZLVolAC.js} +2 -2
  76. package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js.map → ForgotPasswordPage-DZLVolAC.js.map} +1 -1
  77. package/dist/chunks/{GroupDetailPage-DFBvVO1S.js → GroupDetailPage-Bf9Wb_2j.js} +5 -5
  78. package/dist/chunks/{GroupDetailPage-DFBvVO1S.js.map → GroupDetailPage-Bf9Wb_2j.js.map} +1 -1
  79. package/dist/chunks/{GroupDetailPage-B2FkKrGG.js → GroupDetailPage-R-hf3rJ7.js} +2 -2
  80. package/dist/chunks/{GroupDetailPage-B2FkKrGG.js.map → GroupDetailPage-R-hf3rJ7.js.map} +1 -1
  81. package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js → MyAccessRequestsPage-BIisvWM6.js} +2 -2
  82. package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js.map → MyAccessRequestsPage-BIisvWM6.js.map} +1 -1
  83. package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js → MyAccessRequestsPage-BLSV7Tbx.js} +2 -2
  84. package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js.map → MyAccessRequestsPage-BLSV7Tbx.js.map} +1 -1
  85. package/dist/chunks/{MyTenantsPage-BEcYYdGR.js → MyTenantsPage-D-7k9CP1.js} +3 -3
  86. package/dist/chunks/{MyTenantsPage-BEcYYdGR.js.map → MyTenantsPage-D-7k9CP1.js.map} +1 -1
  87. package/dist/chunks/{MyTenantsPage-D9f85zjF.js → MyTenantsPage-DqGW6aDt.js} +2 -2
  88. package/dist/chunks/{MyTenantsPage-D9f85zjF.js.map → MyTenantsPage-DqGW6aDt.js.map} +1 -1
  89. package/dist/chunks/{MyTicketsPage-DJR8h6y1.js → MyTicketsPage--DgDsnZA.js} +2 -2
  90. package/dist/chunks/{MyTicketsPage-DJR8h6y1.js.map → MyTicketsPage--DgDsnZA.js.map} +1 -1
  91. package/dist/chunks/{MyTicketsPage-DiOUExKJ.js → MyTicketsPage-CqJ3Aqob.js} +2 -2
  92. package/dist/chunks/{MyTicketsPage-DiOUExKJ.js.map → MyTicketsPage-CqJ3Aqob.js.map} +1 -1
  93. package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js → NavigationAppsPage-Bebis_RT.js} +2 -2
  94. package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js.map → NavigationAppsPage-Bebis_RT.js.map} +1 -1
  95. package/dist/chunks/{NavigationAppsPage-If7tmCFY.js → NavigationAppsPage-THNPOAjv.js} +2 -2
  96. package/dist/chunks/{NavigationAppsPage-If7tmCFY.js.map → NavigationAppsPage-THNPOAjv.js.map} +1 -1
  97. package/dist/chunks/{NotificationsPage-C29Lln5o.js → NotificationsPage-CAbNW_Cn.js} +2 -2
  98. package/dist/chunks/{NotificationsPage-C29Lln5o.js.map → NotificationsPage-CAbNW_Cn.js.map} +1 -1
  99. package/dist/chunks/{NotificationsPage-BiaLRb0s.js → NotificationsPage-DxwizUhL.js} +2 -2
  100. package/dist/chunks/{NotificationsPage-BiaLRb0s.js.map → NotificationsPage-DxwizUhL.js.map} +1 -1
  101. package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js → OnboardingWizardPage-C6HlbJ3K.js} +2 -2
  102. package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js.map → OnboardingWizardPage-C6HlbJ3K.js.map} +1 -1
  103. package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js → OnboardingWizardPage-CyC2zONO.js} +2 -2
  104. package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js.map → OnboardingWizardPage-CyC2zONO.js.map} +1 -1
  105. package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js → PermissionDetailPage-BDHiNgky.js} +2 -2
  106. package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js.map → PermissionDetailPage-BDHiNgky.js.map} +1 -1
  107. package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js → PermissionDetailPage-C5K17ydY.js} +2 -2
  108. package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js.map → PermissionDetailPage-C5K17ydY.js.map} +1 -1
  109. package/dist/chunks/{PermissionsPage-l0PnY-EE.js → PermissionsPage-COI5LJPo.js} +2 -2
  110. package/dist/chunks/{PermissionsPage-l0PnY-EE.js.map → PermissionsPage-COI5LJPo.js.map} +1 -1
  111. package/dist/chunks/{PermissionsPage-DLy9U3P3.js → PermissionsPage-CkOwH2_d.js} +2 -2
  112. package/dist/chunks/{PermissionsPage-DLy9U3P3.js.map → PermissionsPage-CkOwH2_d.js.map} +1 -1
  113. package/dist/chunks/{PortalDashboardPage-DFBx38-x.js → PortalDashboardPage-CoEC4CmC.js} +2 -2
  114. package/dist/chunks/{PortalDashboardPage-DFBx38-x.js.map → PortalDashboardPage-CoEC4CmC.js.map} +1 -1
  115. package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js → PortalDashboardPage-DrYymEf-.js} +2 -2
  116. package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js.map → PortalDashboardPage-DrYymEf-.js.map} +1 -1
  117. package/dist/chunks/{PreferencesPage-BBu8yZQB.js → PreferencesPage-CJRaU3ba.js} +2 -2
  118. package/dist/chunks/{PreferencesPage-BBu8yZQB.js.map → PreferencesPage-CJRaU3ba.js.map} +1 -1
  119. package/dist/chunks/{PreferencesPage-B81MsNV1.js → PreferencesPage-Cqr9mAab.js} +2 -2
  120. package/dist/chunks/{PreferencesPage-B81MsNV1.js.map → PreferencesPage-Cqr9mAab.js.map} +1 -1
  121. package/dist/chunks/{ProfilePage-DDrl10zj.js → ProfilePage-BZVpg6-l.js} +2 -2
  122. package/dist/chunks/{ProfilePage-DDrl10zj.js.map → ProfilePage-BZVpg6-l.js.map} +1 -1
  123. package/dist/chunks/{ProfilePage-DPoXwdnc.js → ProfilePage-Cu_FITeL.js} +2 -2
  124. package/dist/chunks/{ProfilePage-DPoXwdnc.js.map → ProfilePage-Cu_FITeL.js.map} +1 -1
  125. package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js → ReferencesManagementPage-DUlVk9Ps.js} +3 -3
  126. package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js.map → ReferencesManagementPage-DUlVk9Ps.js.map} +1 -1
  127. package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js → ReferencesManagementPage-ZCuYtqd7.js} +2 -2
  128. package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js.map → ReferencesManagementPage-ZCuYtqd7.js.map} +1 -1
  129. package/dist/chunks/{RegisterPage-CiQib3-6.js → RegisterPage-C4xmVwh9.js} +2 -2
  130. package/dist/chunks/{RegisterPage-CiQib3-6.js.map → RegisterPage-C4xmVwh9.js.map} +1 -1
  131. package/dist/chunks/{RegisterPage-bXCcJD88.js → RegisterPage-DGyzoIHT.js} +2 -2
  132. package/dist/chunks/{RegisterPage-bXCcJD88.js.map → RegisterPage-DGyzoIHT.js.map} +1 -1
  133. package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js → ResetPasswordPage-DqDD6VPR.js} +2 -2
  134. package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js.map → ResetPasswordPage-DqDD6VPR.js.map} +1 -1
  135. package/dist/chunks/{ResetPasswordPage-CubPG3yv.js → ResetPasswordPage-Glu-aeqv.js} +2 -2
  136. package/dist/chunks/{ResetPasswordPage-CubPG3yv.js.map → ResetPasswordPage-Glu-aeqv.js.map} +1 -1
  137. package/dist/chunks/{ResolutionModal-Bg7XZmR1.js → ResolutionModal-CxjANAOP.js} +2 -2
  138. package/dist/chunks/{ResolutionModal-Bg7XZmR1.js.map → ResolutionModal-CxjANAOP.js.map} +1 -1
  139. package/dist/chunks/{ResolutionModal-DqRk_T0n.js → ResolutionModal-Duat18qV.js} +2 -2
  140. package/dist/chunks/{ResolutionModal-DqRk_T0n.js.map → ResolutionModal-Duat18qV.js.map} +1 -1
  141. package/dist/chunks/{RoleDetailPage-Blau6_4c.js → RoleDetailPage-BQffUSnt.js} +3 -3
  142. package/dist/chunks/{RoleDetailPage-Blau6_4c.js.map → RoleDetailPage-BQffUSnt.js.map} +1 -1
  143. package/dist/chunks/{RoleDetailPage-CiRVxxIP.js → RoleDetailPage-JTm5lD1_.js} +2 -2
  144. package/dist/chunks/{RoleDetailPage-CiRVxxIP.js.map → RoleDetailPage-JTm5lD1_.js.map} +1 -1
  145. package/dist/chunks/{RolesPage-Pm-RN3lP.js → RolesPage-B9rRzciI.js} +2 -2
  146. package/dist/chunks/{RolesPage-Pm-RN3lP.js.map → RolesPage-B9rRzciI.js.map} +1 -1
  147. package/dist/chunks/{RolesPage-Cb8joqdJ.js → RolesPage-BN8_zMOC.js} +2 -2
  148. package/dist/chunks/{RolesPage-Cb8joqdJ.js.map → RolesPage-BN8_zMOC.js.map} +1 -1
  149. package/dist/chunks/{SlaConfigPage-B86McKM6.js → SlaConfigPage-B7kZNig4.js} +2 -2
  150. package/dist/chunks/{SlaConfigPage-B86McKM6.js.map → SlaConfigPage-B7kZNig4.js.map} +1 -1
  151. package/dist/chunks/{SlaConfigPage-BY7gvYU6.js → SlaConfigPage-okvZfA_K.js} +2 -2
  152. package/dist/chunks/{SlaConfigPage-BY7gvYU6.js.map → SlaConfigPage-okvZfA_K.js.map} +1 -1
  153. package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js → SupportPermissionsPage-DGAPqJbl.js} +2 -2
  154. package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js.map → SupportPermissionsPage-DGAPqJbl.js.map} +1 -1
  155. package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js → SupportPermissionsPage-Dg_wLOme.js} +2 -2
  156. package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js.map → SupportPermissionsPage-Dg_wLOme.js.map} +1 -1
  157. package/dist/chunks/{TemplatesPage-BDguJ401.js → TemplatesPage-DT9fhlAU.js} +2 -2
  158. package/dist/chunks/{TemplatesPage-BDguJ401.js.map → TemplatesPage-DT9fhlAU.js.map} +1 -1
  159. package/dist/chunks/{TemplatesPage-DdnGgioU.js → TemplatesPage-DiEk538p.js} +2 -2
  160. package/dist/chunks/{TemplatesPage-DdnGgioU.js.map → TemplatesPage-DiEk538p.js.map} +1 -1
  161. package/dist/chunks/{TenantCard-ffwWsgFQ.js → TenantCard-BbSYk9_Z.js} +2 -2
  162. package/dist/chunks/{TenantCard-ffwWsgFQ.js.map → TenantCard-BbSYk9_Z.js.map} +1 -1
  163. package/dist/chunks/{TenantCard-CUjb6og9.js → TenantCard-CEkiKxcZ.js} +2 -2
  164. package/dist/chunks/{TenantCard-CUjb6og9.js.map → TenantCard-CEkiKxcZ.js.map} +1 -1
  165. package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js → TenantScopeSelector-BWfYxvEa.js} +2 -2
  166. package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js.map → TenantScopeSelector-BWfYxvEa.js.map} +1 -1
  167. package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js → TenantScopeSelector-D-BKgQPV.js} +2 -2
  168. package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js.map → TenantScopeSelector-D-BKgQPV.js.map} +1 -1
  169. package/dist/chunks/{TicketDetailPage-GOh9GX7E.js → TicketDetailPage-C1mNS9Up.js} +2 -2
  170. package/dist/chunks/{TicketDetailPage-GOh9GX7E.js.map → TicketDetailPage-C1mNS9Up.js.map} +1 -1
  171. package/dist/chunks/{TicketDetailPage-Du8WMyqf.js → TicketDetailPage-ieVDRh42.js} +2 -2
  172. package/dist/chunks/{TicketDetailPage-Du8WMyqf.js.map → TicketDetailPage-ieVDRh42.js.map} +1 -1
  173. package/dist/chunks/{TicketsPage-Bqd6moQy.js → TicketsPage-CnuWsnIW.js} +2 -2
  174. package/dist/chunks/{TicketsPage-Bqd6moQy.js.map → TicketsPage-CnuWsnIW.js.map} +1 -1
  175. package/dist/chunks/{TicketsPage-WdU4Bb7M.js → TicketsPage-jjyY15_D.js} +2 -2
  176. package/dist/chunks/{TicketsPage-WdU4Bb7M.js.map → TicketsPage-jjyY15_D.js.map} +1 -1
  177. package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js → UserCreateTicketPage-B8Tvf-ag.js} +2 -2
  178. package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js.map → UserCreateTicketPage-B8Tvf-ag.js.map} +1 -1
  179. package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js → UserCreateTicketPage-DnOsDlfO.js} +2 -2
  180. package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js.map → UserCreateTicketPage-DnOsDlfO.js.map} +1 -1
  181. package/dist/chunks/{UserDashboardPage-BP5WeXPS.js → UserDashboardPage-BrtkJ-NB.js} +2 -2
  182. package/dist/chunks/{UserDashboardPage-BP5WeXPS.js.map → UserDashboardPage-BrtkJ-NB.js.map} +1 -1
  183. package/dist/chunks/{UserDashboardPage-B53C8fUq.js → UserDashboardPage-KLB5CQP5.js} +2 -2
  184. package/dist/chunks/{UserDashboardPage-B53C8fUq.js.map → UserDashboardPage-KLB5CQP5.js.map} +1 -1
  185. package/dist/chunks/{UserDetailPage-B110bmGX.js → UserDetailPage-U7smBQoF.js} +5 -5
  186. package/dist/chunks/{UserDetailPage-B110bmGX.js.map → UserDetailPage-U7smBQoF.js.map} +1 -1
  187. package/dist/chunks/{UserDetailPage-CV2VCE46.js → UserDetailPage-_J6lcKAU.js} +2 -2
  188. package/dist/chunks/{UserDetailPage-CV2VCE46.js.map → UserDetailPage-_J6lcKAU.js.map} +1 -1
  189. package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js → UserTicketDetailPage-CWoYQgH-.js} +2 -2
  190. package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js.map → UserTicketDetailPage-CWoYQgH-.js.map} +1 -1
  191. package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js → UserTicketDetailPage-DkufSlvZ.js} +2 -2
  192. package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js.map → UserTicketDetailPage-DkufSlvZ.js.map} +1 -1
  193. package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js → UsersGroupsPage-C38s2-Rq.js} +3 -3
  194. package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js.map → UsersGroupsPage-C38s2-Rq.js.map} +1 -1
  195. package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js → UsersGroupsPage-Dq3rAteo.js} +2 -2
  196. package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js.map → UsersGroupsPage-Dq3rAteo.js.map} +1 -1
  197. package/dist/chunks/{UsersPage-Bg7033pp.js → UsersPage-B5C5KEUR.js} +2 -2
  198. package/dist/chunks/{UsersPage-Bg7033pp.js.map → UsersPage-B5C5KEUR.js.map} +1 -1
  199. package/dist/chunks/{UsersPage-TYAfwPY1.js → UsersPage-CXC9Hvq6.js} +2 -2
  200. package/dist/chunks/{UsersPage-TYAfwPY1.js.map → UsersPage-CXC9Hvq6.js.map} +1 -1
  201. package/dist/chunks/{accessRequestsApi-DZeDvzwv.js → accessRequestsApi-B-4TJ5_U.js} +2 -2
  202. package/dist/chunks/{accessRequestsApi-DZeDvzwv.js.map → accessRequestsApi-B-4TJ5_U.js.map} +1 -1
  203. package/dist/chunks/{accessRequestsApi-ZXFPCid2.js → accessRequestsApi-DZSfThpd.js} +2 -2
  204. package/dist/chunks/{accessRequestsApi-ZXFPCid2.js.map → accessRequestsApi-DZSfThpd.js.map} +1 -1
  205. package/dist/chunks/{aiApi-CsH8DXgs.js → aiApi-B20Teu2v.js} +2 -2
  206. package/dist/chunks/{aiApi-CsH8DXgs.js.map → aiApi-B20Teu2v.js.map} +1 -1
  207. package/dist/chunks/{aiApi-CVPzFTXa.js → aiApi-DMGz-RPM.js} +2 -2
  208. package/dist/chunks/{aiApi-CVPzFTXa.js.map → aiApi-DMGz-RPM.js.map} +1 -1
  209. package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js → applicationAnalyticsApi-Bwa75Fzd.js} +2 -2
  210. package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js.map → applicationAnalyticsApi-Bwa75Fzd.js.map} +1 -1
  211. package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js → applicationAnalyticsApi-CLBqRPfN.js} +2 -2
  212. package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js.map → applicationAnalyticsApi-CLBqRPfN.js.map} +1 -1
  213. package/dist/chunks/{groupsApi-BgCk2fsp.js → groupsApi-QzXI-5xu.js} +2 -2
  214. package/dist/chunks/{groupsApi-BgCk2fsp.js.map → groupsApi-QzXI-5xu.js.map} +1 -1
  215. package/dist/chunks/{groupsApi-BIbG665N.js → groupsApi-hB9kSWEd.js} +2 -2
  216. package/dist/chunks/{groupsApi-BIbG665N.js.map → groupsApi-hB9kSWEd.js.map} +1 -1
  217. package/dist/chunks/{index-Cb3LotuT.js → index--NGcBYUu.js} +3 -3
  218. package/dist/chunks/{index-Cb3LotuT.js.map → index--NGcBYUu.js.map} +1 -1
  219. package/dist/chunks/{index-C33zcyF4.js → index--aPwOFjF.js} +2 -2
  220. package/dist/chunks/{index-C33zcyF4.js.map → index--aPwOFjF.js.map} +1 -1
  221. package/dist/chunks/{index-sMr9qND_.js → index-0VrOtwP0.js} +2 -2
  222. package/dist/chunks/{index-sMr9qND_.js.map → index-0VrOtwP0.js.map} +1 -1
  223. package/dist/chunks/{index-DDKetfKq.js → index-37U271aw.js} +2 -2
  224. package/dist/chunks/{index-DDKetfKq.js.map → index-37U271aw.js.map} +1 -1
  225. package/dist/chunks/{index-B9fS7ir6.js → index-B7qZTuQ-.js} +2 -2
  226. package/dist/chunks/{index-B9fS7ir6.js.map → index-B7qZTuQ-.js.map} +1 -1
  227. package/dist/chunks/{index-CdjBY7L8.js → index-Bedzmqr-.js} +2 -2
  228. package/dist/chunks/{index-CdjBY7L8.js.map → index-Bedzmqr-.js.map} +1 -1
  229. package/dist/chunks/{index-CHG_O1fS.js → index-Betxo5g5.js} +2 -2
  230. package/dist/chunks/{index-CHG_O1fS.js.map → index-Betxo5g5.js.map} +1 -1
  231. package/dist/chunks/{index-jiGu-H8x.js → index-BmaJz475.js} +2 -2
  232. package/dist/chunks/{index-jiGu-H8x.js.map → index-BmaJz475.js.map} +1 -1
  233. package/dist/chunks/{index-C53JoVNk.js → index-Buhqag3v.js} +2 -2
  234. package/dist/chunks/{index-C53JoVNk.js.map → index-Buhqag3v.js.map} +1 -1
  235. package/dist/chunks/{index-DO0Rw7hX.js → index-C3VxlfKq.js} +2 -2
  236. package/dist/chunks/{index-DO0Rw7hX.js.map → index-C3VxlfKq.js.map} +1 -1
  237. package/dist/chunks/{index-CSQ60fpG.js → index-CgpRo8Oe.js} +2 -2
  238. package/dist/chunks/{index-CSQ60fpG.js.map → index-CgpRo8Oe.js.map} +1 -1
  239. package/dist/chunks/{index-B-e-ELsf.js → index-DOY0w8Iu.js} +8 -8
  240. package/dist/chunks/{index-B-e-ELsf.js.map → index-DOY0w8Iu.js.map} +1 -1
  241. package/dist/chunks/{index-D2REDIRX.js → index-DwuvIOrQ.js} +2 -2
  242. package/dist/chunks/{index-D2REDIRX.js.map → index-DwuvIOrQ.js.map} +1 -1
  243. package/dist/chunks/{index-DCcl7Qof.js → index-DzedSLdI.js} +2 -2
  244. package/dist/chunks/{index-DCcl7Qof.js.map → index-DzedSLdI.js.map} +1 -1
  245. package/dist/chunks/{index-2wUhd9Lu.js → index-IgLVXPg8.js} +10 -10
  246. package/dist/chunks/index-IgLVXPg8.js.map +1 -0
  247. package/dist/chunks/{index-CwSaRXXg.js → index-lpIzhufD.js} +1916 -1900
  248. package/dist/chunks/index-lpIzhufD.js.map +1 -0
  249. package/dist/chunks/{index-Cuwn2q-f.js → index-mLUKwbGl.js} +4 -4
  250. package/dist/chunks/{index-Cuwn2q-f.js.map → index-mLUKwbGl.js.map} +1 -1
  251. package/dist/chunks/{index-B0mk2tNY.js → index-tO6MMIFB.js} +2 -2
  252. package/dist/chunks/{index-B0mk2tNY.js.map → index-tO6MMIFB.js.map} +1 -1
  253. package/dist/chunks/{tenantIconMap-BpNANQ5s.js → tenantIconMap-BQD9byc8.js} +2 -2
  254. package/dist/chunks/{tenantIconMap-BpNANQ5s.js.map → tenantIconMap-BQD9byc8.js.map} +1 -1
  255. package/dist/chunks/{tenantIconMap-DtdUgvJO.js → tenantIconMap-CTMuSt18.js} +2 -2
  256. package/dist/chunks/{tenantIconMap-DtdUgvJO.js.map → tenantIconMap-CTMuSt18.js.map} +1 -1
  257. package/dist/chunks/{ticketingApi-Bu4rKwLl.js → ticketingApi-BNIdox5t.js} +2 -2
  258. package/dist/chunks/{ticketingApi-Bu4rKwLl.js.map → ticketingApi-BNIdox5t.js.map} +1 -1
  259. package/dist/chunks/{ticketingApi-r4Avm9iS.js → ticketingApi-J0vC_t7r.js} +2 -2
  260. package/dist/chunks/{ticketingApi-r4Avm9iS.js.map → ticketingApi-J0vC_t7r.js.map} +1 -1
  261. package/dist/chunks/{useAccessRequests-B9bF4swg.js → useAccessRequests-DCNNLnxk.js} +3 -3
  262. package/dist/chunks/{useAccessRequests-B9bF4swg.js.map → useAccessRequests-DCNNLnxk.js.map} +1 -1
  263. package/dist/chunks/{useAccessRequests-JyPUX3Om.js → useAccessRequests-DT7X4FAK.js} +2 -2
  264. package/dist/chunks/{useAccessRequests-JyPUX3Om.js.map → useAccessRequests-DT7X4FAK.js.map} +1 -1
  265. package/dist/chunks/{useUserAccessRequests-DjPQenC2.js → useUserAccessRequests-BYbmG4c7.js} +2 -2
  266. package/dist/chunks/{useUserAccessRequests-DjPQenC2.js.map → useUserAccessRequests-BYbmG4c7.js.map} +1 -1
  267. package/dist/chunks/{useUserAccessRequests-BB6FHW14.js → useUserAccessRequests-CylKxRN6.js} +2 -2
  268. package/dist/chunks/{useUserAccessRequests-BB6FHW14.js.map → useUserAccessRequests-CylKxRN6.js.map} +1 -1
  269. package/dist/hooks/useCollapsibleState.d.ts +5 -2
  270. package/dist/hooks/useCollapsibleState.d.ts.map +1 -1
  271. package/dist/i18n/config.d.ts +1 -0
  272. package/dist/i18n/config.d.ts.map +1 -1
  273. package/dist/main.d.ts +0 -1
  274. package/dist/main.d.ts.map +1 -1
  275. package/dist/smartstack.cjs +1 -1
  276. package/dist/smartstack.js +1 -1
  277. package/dist/utils/permissions.d.ts.map +1 -1
  278. package/package.json +1 -1
  279. package/dist/chunks/index-2wUhd9Lu.js.map +0 -1
  280. package/dist/chunks/index-CwSaRXXg.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TenantScopeSelector-Cym_Zyps.js","sources":["../../src/hooks/useAdminTenants.ts","../../src/components/ui/TenantScopeSelector.tsx"],"sourcesContent":["import { useState, useCallback, useEffect } from 'react';\r\nimport { adminApi, type UserTenantDto } from '@/services/api/adminApi';\r\n\r\n/**\r\n * Hook that fetches ALL tenants directly from the API for admin pages.\r\n * Unlike useTenant().userTenants (which is cached from /api/auth/me at login),\r\n * this hook always returns fresh data including newly created tenants.\r\n *\r\n * Use this for admin pages that need the complete tenant list:\r\n * - GroupDetailPage (role assignment by tenant)\r\n * - UserDetailPage (role assignment by tenant)\r\n * - Any admin page with a TenantScopeSelector\r\n */\r\nexport function useAdminTenants(): {\n tenants: UserTenantDto[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n} {\r\n const [tenants, setTenants] = useState<UserTenantDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadTenants = useCallback(async () => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const data = await adminApi.myTenants.getAll();\r\n setTenants(data);\r\n } catch (err) {\r\n console.error('Failed to load admin tenants:', err);\r\n setError('Failed to load tenants');\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadTenants();\r\n }, [loadTenants]);\r\n\r\n return { tenants, loading, error, refresh: loadTenants };\r\n}\r\n","import { useState, useRef, useEffect, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Globe, Building2, ChevronDown, Check, AlertTriangle, Search, User } from 'lucide-react';\r\n\r\nexport type ScopeValue = 'global' | { tenantId: string; tenantSlug: string; tenantUserId: string; tenantName: string };\r\n\r\ninterface TenantInfo {\r\n tenantId: string;\r\n tenantSlug: string;\r\n tenantName: string;\r\n tenantType?: string;\r\n}\r\n\r\ninterface TenantMembership extends TenantInfo {\r\n tenantUserId: string;\r\n}\r\n\r\ninterface TenantScopeSelectorProps {\r\n /** Current scope value */\r\n readonly value: ScopeValue;\r\n /** Callback when scope changes */\r\n readonly onChange: (scope: ScopeValue) => void;\r\n /** All tenants the admin has access to */\r\n readonly adminTenants: TenantInfo[];\r\n /** User's tenant memberships (with tenantUserId for API calls) - optional for backwards compat */\r\n readonly userTenantMemberships?: TenantMembership[];\r\n /** Whether the selector is disabled */\r\n readonly disabled?: boolean;\r\n /** Show warning when user is not member of selected tenant */\r\n readonly showNotMemberWarning?: boolean;\r\n}\r\n\r\ntype FilterType = 'all' | 'b2b' | 'b2c';\r\n\r\n/**\r\n * Selector component for choosing between Global scope (platform-wide)\r\n * and Tenant scope (tenant-specific roles/permissions).\r\n * Features: search, B2B/B2C filtering, membership indicators.\r\n */\r\nexport function TenantScopeSelector({\r\n value,\r\n onChange,\r\n adminTenants,\r\n userTenantMemberships = [],\r\n disabled = false,\r\n showNotMemberWarning = false,\r\n}: TenantScopeSelectorProps): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [filterType, setFilterType] = useState<FilterType>('all');\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n const searchInputRef = useRef<HTMLInputElement>(null);\r\n\r\n // Close on click outside\r\n useEffect(() => {\r\n function handleClickOutside(event: MouseEvent) {\r\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\r\n setIsOpen(false);\r\n }\r\n }\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => document.removeEventListener('mousedown', handleClickOutside);\r\n }, []);\r\n\r\n // Close on Escape\r\n useEffect(() => {\r\n function handleEscape(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n setIsOpen(false);\r\n }\r\n }\r\n document.addEventListener('keydown', handleEscape);\r\n return () => document.removeEventListener('keydown', handleEscape);\r\n }, []);\r\n\r\n // Focus search input when opening\r\n useEffect(() => {\r\n if (isOpen && searchInputRef.current) {\r\n setTimeout(() => searchInputRef.current?.focus(), 50);\r\n }\r\n }, [isOpen]);\r\n\r\n // Create a map for quick membership lookup\r\n const membershipMap = useMemo(() => {\r\n const map = new Map<string, TenantMembership>();\r\n userTenantMemberships.forEach(m => map.set(m.tenantId, m));\r\n return map;\r\n }, [userTenantMemberships]);\r\n\r\n // Filter and categorize tenants\r\n const { b2bTenants, b2cTenants, filteredTenants } = useMemo(() => {\r\n const b2b = adminTenants.filter(t => t.tenantType === 'Business');\r\n const b2c = adminTenants.filter(t => t.tenantType === 'Personal');\r\n\r\n let filtered = adminTenants;\r\n\r\n // Apply type filter\r\n if (filterType === 'b2b') {\r\n filtered = b2b;\r\n } else if (filterType === 'b2c') {\r\n filtered = b2c;\r\n }\r\n\r\n // Apply search filter\r\n if (searchQuery.trim()) {\r\n const query = searchQuery.toLowerCase().trim();\r\n filtered = filtered.filter(t => t.tenantName.toLowerCase().includes(query));\r\n }\r\n\r\n return { b2bTenants: b2b, b2cTenants: b2c, filteredTenants: filtered };\r\n }, [adminTenants, filterType, searchQuery]);\r\n\r\n const isGlobal = value === 'global';\r\n const selectedTenant = !isGlobal ? value : null;\r\n\r\n const handleSelectGlobal = () => {\r\n onChange('global');\r\n setIsOpen(false);\r\n setSearchQuery('');\r\n };\r\n\r\n const handleSelectTenant = (tenant: TenantInfo) => {\r\n const membership = membershipMap.get(tenant.tenantId);\r\n onChange({\r\n tenantId: tenant.tenantId,\r\n tenantSlug: tenant.tenantSlug,\r\n tenantUserId: membership?.tenantUserId || '',\r\n tenantName: tenant.tenantName,\r\n });\r\n setIsOpen(false);\r\n setSearchQuery('');\r\n };\r\n\r\n // Don't render if no tenants\r\n if (adminTenants.length === 0) {\r\n return null;\r\n }\r\n\r\n const renderTenantOption = (tenant: TenantInfo) => {\r\n const isSelected = !isGlobal && selectedTenant?.tenantId === tenant.tenantId;\r\n const isB2B = tenant.tenantType === 'Business';\r\n const isMember = membershipMap.has(tenant.tenantId);\r\n\r\n return (\r\n <button\r\n key={tenant.tenantId}\r\n type=\"button\"\r\n onClick={() => handleSelectTenant(tenant)}\r\n className={`w-full flex items-center gap-3 px-3 py-2.5 text-left transition-colors ${\r\n isSelected\r\n ? 'bg-blue-500/10 text-blue-700'\r\n : 'hover:bg-[var(--bg-tertiary)] text-[var(--text-primary)]'\r\n }`}\r\n role=\"option\"\r\n aria-selected={isSelected}\r\n >\r\n <div\r\n className={`flex-shrink-0 w-8 h-8 flex items-center justify-center ${\r\n isB2B ? 'bg-blue-500/10' : 'bg-violet-500/10'\r\n }`}\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <Building2 className={`w-4 h-4 ${isB2B ? 'text-blue-500' : 'text-violet-500'}`} />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium truncate\">{tenant.tenantName}</span>\r\n {isMember && (\r\n <span className=\"flex-shrink-0 text-xs px-1.5 py-0.5 rounded bg-emerald-500/10 text-emerald-600\">\r\n <User className=\"w-3 h-3 inline mr-0.5\" />\r\n {t('userRoles.scope.selector.member', 'Membre')}\r\n </span>\r\n )}\r\n </div>\r\n <span className=\"text-xs text-[var(--text-tertiary)]\">\r\n {isB2B\r\n ? t('userRoles.scope.selector.b2b', 'Business')\r\n : t('userRoles.scope.selector.b2c', 'Personnel')}\r\n </span>\r\n </div>\r\n {isSelected && <Check className=\"w-4 h-4 text-blue-600 flex-shrink-0\" />}\r\n </button>\r\n );\r\n };\r\n\r\n return (\r\n <div ref={menuRef} className=\"relative inline-block\">\r\n {/* Trigger Button */}\r\n <button\r\n type=\"button\"\r\n onClick={() => !disabled && setIsOpen(!isOpen)}\r\n disabled={disabled}\r\n className={`flex items-center gap-2 px-3 py-2 text-sm font-medium border transition-colors ${\r\n isGlobal\r\n ? 'bg-emerald-500/10 border-emerald-500/30 text-emerald-700 hover:bg-emerald-500/20'\r\n : 'bg-blue-500/10 border-blue-500/30 text-blue-700 hover:bg-blue-500/20'\r\n } ${disabled ? 'opacity-50 cursor-not-allowed' : ''}`}\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n aria-expanded={isOpen}\r\n aria-haspopup=\"listbox\"\r\n >\r\n {isGlobal ? (\r\n <>\r\n <Globe className=\"w-4 h-4\" />\r\n <span>{t('userRoles.scope.selector.global', 'Global (plateforme)')}</span>\r\n </>\r\n ) : (\r\n <>\r\n <Building2 className=\"w-4 h-4\" />\r\n <span className=\"max-w-[150px] truncate\">{selectedTenant?.tenantName}</span>\r\n </>\r\n )}\r\n <ChevronDown className={`w-4 h-4 transition-transform ${isOpen ? 'rotate-180' : ''}`} />\r\n </button>\r\n\r\n {/* Dropdown Menu */}\r\n <div\r\n className={`absolute left-0 mt-1 w-80 z-50 transition-all duration-150 ease-out ${\r\n isOpen\r\n ? 'opacity-100 scale-100 translate-y-0'\r\n : 'opacity-0 scale-95 -translate-y-1 pointer-events-none'\r\n }`}\r\n >\r\n <div\r\n className=\"bg-[var(--bg-card)] border border-[var(--border-color)] shadow-xl overflow-hidden\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n {/* Header with Search */}\r\n <div className=\"px-3 py-2 border-b border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-muted)]\" />\r\n <input\r\n ref={searchInputRef}\r\n type=\"text\"\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(e.target.value)}\r\n placeholder={t('userRoles.scope.selector.search', 'Rechercher un tenant...')}\r\n className=\"w-full pl-8 pr-3 py-1.5 text-sm bg-[var(--bg-primary)] border border-[var(--border-color)] rounded-md text-[var(--text-primary)] placeholder-[var(--text-muted)] focus:outline-none focus:ring-1 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Filter Tabs */}\r\n <div className=\"flex items-center gap-1 px-3 py-2 border-b border-[var(--border-color)] bg-[var(--bg-tertiary)]\" role=\"tablist\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setFilterType('all')}\r\n className={`px-2.5 py-1 text-xs font-medium rounded-md transition-colors ${\r\n filterType === 'all'\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n role=\"tab\"\r\n aria-selected={filterType === 'all'}\r\n >\r\n {t('userRoles.scope.selector.filterAll', 'Tous')} ({adminTenants.length})\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setFilterType('b2b')}\r\n className={`px-2.5 py-1 text-xs font-medium rounded-md transition-colors ${\r\n filterType === 'b2b'\r\n ? 'bg-blue-600 text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n role=\"tab\"\r\n aria-selected={filterType === 'b2b'}\r\n >\r\n {t('userRoles.scope.selector.filterB2B', 'B2B')} ({b2bTenants.length})\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setFilterType('b2c')}\r\n className={`px-2.5 py-1 text-xs font-medium rounded-md transition-colors ${\r\n filterType === 'b2c'\r\n ? 'bg-violet-600 text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n role=\"tab\"\r\n aria-selected={filterType === 'b2c'}\r\n >\r\n {t('userRoles.scope.selector.filterB2C', 'B2C')} ({b2cTenants.length})\r\n </button>\r\n </div>\r\n\r\n {/* Options */}\r\n <div className=\"py-1 max-h-72 overflow-y-auto\" role=\"listbox\">\r\n {/* Global Option */}\r\n <button\r\n type=\"button\"\r\n onClick={handleSelectGlobal}\r\n className={`w-full flex items-center gap-3 px-3 py-2.5 text-left transition-colors ${\r\n isGlobal\r\n ? 'bg-emerald-500/10 text-emerald-700'\r\n : 'hover:bg-[var(--bg-tertiary)] text-[var(--text-primary)]'\r\n }`}\r\n role=\"option\"\r\n aria-selected={isGlobal}\r\n >\r\n <div\r\n className=\"flex-shrink-0 w-8 h-8 flex items-center justify-center bg-emerald-500/10\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <Globe className=\"w-4 h-4 text-emerald-600\" />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <span className=\"font-medium block\">\r\n {t('userRoles.scope.selector.global', 'Global (plateforme)')}\r\n </span>\r\n <span className=\"text-xs text-[var(--text-tertiary)]\">\r\n {t('userRoles.scope.selector.globalDesc', 'Rôles applicables sur toute la plateforme')}\r\n </span>\r\n </div>\r\n {isGlobal && <Check className=\"w-4 h-4 text-emerald-600 flex-shrink-0\" />}\r\n </button>\r\n\r\n {/* Divider */}\r\n {filteredTenants.length > 0 && (\r\n <div className=\"border-t border-[var(--border-color)] my-1\" />\r\n )}\r\n\r\n {/* Tenant Options */}\r\n {filteredTenants.length > 0 ? (\r\n filteredTenants.map(renderTenantOption)\r\n ) : (\r\n <div className=\"px-3 py-4 text-center text-sm text-[var(--text-muted)]\">\r\n {t('userRoles.scope.selector.noResults', 'Aucun tenant trouvé')}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Not Member Warning */}\r\n {showNotMemberWarning && !isGlobal && (\r\n <div className=\"mt-2 flex items-center gap-2 text-sm text-amber-600\">\r\n <AlertTriangle className=\"w-4 h-4\" />\r\n <span>{t('userRoles.scope.notMember', \"L'utilisateur n'est pas membre de ce tenant\")}</span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["useAdminTenants","tenants","setTenants","useState","loading","setLoading","error","setError","loadTenants","useCallback","data","adminApi","err","useEffect","TenantScopeSelector","value","onChange","adminTenants","userTenantMemberships","disabled","showNotMemberWarning","t","useTranslation","isOpen","setIsOpen","searchQuery","setSearchQuery","filterType","setFilterType","menuRef","useRef","searchInputRef","handleClickOutside","event","handleEscape","membershipMap","useMemo","map","m","b2bTenants","b2cTenants","filteredTenants","b2b","b2c","filtered","query","isGlobal","selectedTenant","handleSelectGlobal","handleSelectTenant","tenant","membership","renderTenantOption","isSelected","isB2B","isMember","jsxs","jsx","Building2","User","Check","Fragment","Globe","ChevronDown","Search","e","AlertTriangle"],"mappings":"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"}
1
+ {"version":3,"file":"TenantScopeSelector-D-BKgQPV.js","sources":["../../src/hooks/useAdminTenants.ts","../../src/components/ui/TenantScopeSelector.tsx"],"sourcesContent":["import { useState, useCallback, useEffect } from 'react';\r\nimport { adminApi, type UserTenantDto } from '@/services/api/adminApi';\r\n\r\n/**\r\n * Hook that fetches ALL tenants directly from the API for admin pages.\r\n * Unlike useTenant().userTenants (which is cached from /api/auth/me at login),\r\n * this hook always returns fresh data including newly created tenants.\r\n *\r\n * Use this for admin pages that need the complete tenant list:\r\n * - GroupDetailPage (role assignment by tenant)\r\n * - UserDetailPage (role assignment by tenant)\r\n * - Any admin page with a TenantScopeSelector\r\n */\r\nexport function useAdminTenants(): {\n tenants: UserTenantDto[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n} {\r\n const [tenants, setTenants] = useState<UserTenantDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadTenants = useCallback(async () => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const data = await adminApi.myTenants.getAll();\r\n setTenants(data);\r\n } catch (err) {\r\n console.error('Failed to load admin tenants:', err);\r\n setError('Failed to load tenants');\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadTenants();\r\n }, [loadTenants]);\r\n\r\n return { tenants, loading, error, refresh: loadTenants };\r\n}\r\n","import { useState, useRef, useEffect, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Globe, Building2, ChevronDown, Check, AlertTriangle, Search, User } from 'lucide-react';\r\n\r\nexport type ScopeValue = 'global' | { tenantId: string; tenantSlug: string; tenantUserId: string; tenantName: string };\r\n\r\ninterface TenantInfo {\r\n tenantId: string;\r\n tenantSlug: string;\r\n tenantName: string;\r\n tenantType?: string;\r\n}\r\n\r\ninterface TenantMembership extends TenantInfo {\r\n tenantUserId: string;\r\n}\r\n\r\ninterface TenantScopeSelectorProps {\r\n /** Current scope value */\r\n readonly value: ScopeValue;\r\n /** Callback when scope changes */\r\n readonly onChange: (scope: ScopeValue) => void;\r\n /** All tenants the admin has access to */\r\n readonly adminTenants: TenantInfo[];\r\n /** User's tenant memberships (with tenantUserId for API calls) - optional for backwards compat */\r\n readonly userTenantMemberships?: TenantMembership[];\r\n /** Whether the selector is disabled */\r\n readonly disabled?: boolean;\r\n /** Show warning when user is not member of selected tenant */\r\n readonly showNotMemberWarning?: boolean;\r\n}\r\n\r\ntype FilterType = 'all' | 'b2b' | 'b2c';\r\n\r\n/**\r\n * Selector component for choosing between Global scope (platform-wide)\r\n * and Tenant scope (tenant-specific roles/permissions).\r\n * Features: search, B2B/B2C filtering, membership indicators.\r\n */\r\nexport function TenantScopeSelector({\r\n value,\r\n onChange,\r\n adminTenants,\r\n userTenantMemberships = [],\r\n disabled = false,\r\n showNotMemberWarning = false,\r\n}: TenantScopeSelectorProps): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [filterType, setFilterType] = useState<FilterType>('all');\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n const searchInputRef = useRef<HTMLInputElement>(null);\r\n\r\n // Close on click outside\r\n useEffect(() => {\r\n function handleClickOutside(event: MouseEvent) {\r\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\r\n setIsOpen(false);\r\n }\r\n }\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => document.removeEventListener('mousedown', handleClickOutside);\r\n }, []);\r\n\r\n // Close on Escape\r\n useEffect(() => {\r\n function handleEscape(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n setIsOpen(false);\r\n }\r\n }\r\n document.addEventListener('keydown', handleEscape);\r\n return () => document.removeEventListener('keydown', handleEscape);\r\n }, []);\r\n\r\n // Focus search input when opening\r\n useEffect(() => {\r\n if (isOpen && searchInputRef.current) {\r\n setTimeout(() => searchInputRef.current?.focus(), 50);\r\n }\r\n }, [isOpen]);\r\n\r\n // Create a map for quick membership lookup\r\n const membershipMap = useMemo(() => {\r\n const map = new Map<string, TenantMembership>();\r\n userTenantMemberships.forEach(m => map.set(m.tenantId, m));\r\n return map;\r\n }, [userTenantMemberships]);\r\n\r\n // Filter and categorize tenants\r\n const { b2bTenants, b2cTenants, filteredTenants } = useMemo(() => {\r\n const b2b = adminTenants.filter(t => t.tenantType === 'Business');\r\n const b2c = adminTenants.filter(t => t.tenantType === 'Personal');\r\n\r\n let filtered = adminTenants;\r\n\r\n // Apply type filter\r\n if (filterType === 'b2b') {\r\n filtered = b2b;\r\n } else if (filterType === 'b2c') {\r\n filtered = b2c;\r\n }\r\n\r\n // Apply search filter\r\n if (searchQuery.trim()) {\r\n const query = searchQuery.toLowerCase().trim();\r\n filtered = filtered.filter(t => t.tenantName.toLowerCase().includes(query));\r\n }\r\n\r\n return { b2bTenants: b2b, b2cTenants: b2c, filteredTenants: filtered };\r\n }, [adminTenants, filterType, searchQuery]);\r\n\r\n const isGlobal = value === 'global';\r\n const selectedTenant = !isGlobal ? value : null;\r\n\r\n const handleSelectGlobal = () => {\r\n onChange('global');\r\n setIsOpen(false);\r\n setSearchQuery('');\r\n };\r\n\r\n const handleSelectTenant = (tenant: TenantInfo) => {\r\n const membership = membershipMap.get(tenant.tenantId);\r\n onChange({\r\n tenantId: tenant.tenantId,\r\n tenantSlug: tenant.tenantSlug,\r\n tenantUserId: membership?.tenantUserId || '',\r\n tenantName: tenant.tenantName,\r\n });\r\n setIsOpen(false);\r\n setSearchQuery('');\r\n };\r\n\r\n // Don't render if no tenants\r\n if (adminTenants.length === 0) {\r\n return null;\r\n }\r\n\r\n const renderTenantOption = (tenant: TenantInfo) => {\r\n const isSelected = !isGlobal && selectedTenant?.tenantId === tenant.tenantId;\r\n const isB2B = tenant.tenantType === 'Business';\r\n const isMember = membershipMap.has(tenant.tenantId);\r\n\r\n return (\r\n <button\r\n key={tenant.tenantId}\r\n type=\"button\"\r\n onClick={() => handleSelectTenant(tenant)}\r\n className={`w-full flex items-center gap-3 px-3 py-2.5 text-left transition-colors ${\r\n isSelected\r\n ? 'bg-blue-500/10 text-blue-700'\r\n : 'hover:bg-[var(--bg-tertiary)] text-[var(--text-primary)]'\r\n }`}\r\n role=\"option\"\r\n aria-selected={isSelected}\r\n >\r\n <div\r\n className={`flex-shrink-0 w-8 h-8 flex items-center justify-center ${\r\n isB2B ? 'bg-blue-500/10' : 'bg-violet-500/10'\r\n }`}\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <Building2 className={`w-4 h-4 ${isB2B ? 'text-blue-500' : 'text-violet-500'}`} />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium truncate\">{tenant.tenantName}</span>\r\n {isMember && (\r\n <span className=\"flex-shrink-0 text-xs px-1.5 py-0.5 rounded bg-emerald-500/10 text-emerald-600\">\r\n <User className=\"w-3 h-3 inline mr-0.5\" />\r\n {t('userRoles.scope.selector.member', 'Membre')}\r\n </span>\r\n )}\r\n </div>\r\n <span className=\"text-xs text-[var(--text-tertiary)]\">\r\n {isB2B\r\n ? t('userRoles.scope.selector.b2b', 'Business')\r\n : t('userRoles.scope.selector.b2c', 'Personnel')}\r\n </span>\r\n </div>\r\n {isSelected && <Check className=\"w-4 h-4 text-blue-600 flex-shrink-0\" />}\r\n </button>\r\n );\r\n };\r\n\r\n return (\r\n <div ref={menuRef} className=\"relative inline-block\">\r\n {/* Trigger Button */}\r\n <button\r\n type=\"button\"\r\n onClick={() => !disabled && setIsOpen(!isOpen)}\r\n disabled={disabled}\r\n className={`flex items-center gap-2 px-3 py-2 text-sm font-medium border transition-colors ${\r\n isGlobal\r\n ? 'bg-emerald-500/10 border-emerald-500/30 text-emerald-700 hover:bg-emerald-500/20'\r\n : 'bg-blue-500/10 border-blue-500/30 text-blue-700 hover:bg-blue-500/20'\r\n } ${disabled ? 'opacity-50 cursor-not-allowed' : ''}`}\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n aria-expanded={isOpen}\r\n aria-haspopup=\"listbox\"\r\n >\r\n {isGlobal ? (\r\n <>\r\n <Globe className=\"w-4 h-4\" />\r\n <span>{t('userRoles.scope.selector.global', 'Global (plateforme)')}</span>\r\n </>\r\n ) : (\r\n <>\r\n <Building2 className=\"w-4 h-4\" />\r\n <span className=\"max-w-[150px] truncate\">{selectedTenant?.tenantName}</span>\r\n </>\r\n )}\r\n <ChevronDown className={`w-4 h-4 transition-transform ${isOpen ? 'rotate-180' : ''}`} />\r\n </button>\r\n\r\n {/* Dropdown Menu */}\r\n <div\r\n className={`absolute left-0 mt-1 w-80 z-50 transition-all duration-150 ease-out ${\r\n isOpen\r\n ? 'opacity-100 scale-100 translate-y-0'\r\n : 'opacity-0 scale-95 -translate-y-1 pointer-events-none'\r\n }`}\r\n >\r\n <div\r\n className=\"bg-[var(--bg-card)] border border-[var(--border-color)] shadow-xl overflow-hidden\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n {/* Header with Search */}\r\n <div className=\"px-3 py-2 border-b border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-muted)]\" />\r\n <input\r\n ref={searchInputRef}\r\n type=\"text\"\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(e.target.value)}\r\n placeholder={t('userRoles.scope.selector.search', 'Rechercher un tenant...')}\r\n className=\"w-full pl-8 pr-3 py-1.5 text-sm bg-[var(--bg-primary)] border border-[var(--border-color)] rounded-md text-[var(--text-primary)] placeholder-[var(--text-muted)] focus:outline-none focus:ring-1 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Filter Tabs */}\r\n <div className=\"flex items-center gap-1 px-3 py-2 border-b border-[var(--border-color)] bg-[var(--bg-tertiary)]\" role=\"tablist\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setFilterType('all')}\r\n className={`px-2.5 py-1 text-xs font-medium rounded-md transition-colors ${\r\n filterType === 'all'\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n role=\"tab\"\r\n aria-selected={filterType === 'all'}\r\n >\r\n {t('userRoles.scope.selector.filterAll', 'Tous')} ({adminTenants.length})\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setFilterType('b2b')}\r\n className={`px-2.5 py-1 text-xs font-medium rounded-md transition-colors ${\r\n filterType === 'b2b'\r\n ? 'bg-blue-600 text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n role=\"tab\"\r\n aria-selected={filterType === 'b2b'}\r\n >\r\n {t('userRoles.scope.selector.filterB2B', 'B2B')} ({b2bTenants.length})\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setFilterType('b2c')}\r\n className={`px-2.5 py-1 text-xs font-medium rounded-md transition-colors ${\r\n filterType === 'b2c'\r\n ? 'bg-violet-600 text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n role=\"tab\"\r\n aria-selected={filterType === 'b2c'}\r\n >\r\n {t('userRoles.scope.selector.filterB2C', 'B2C')} ({b2cTenants.length})\r\n </button>\r\n </div>\r\n\r\n {/* Options */}\r\n <div className=\"py-1 max-h-72 overflow-y-auto\" role=\"listbox\">\r\n {/* Global Option */}\r\n <button\r\n type=\"button\"\r\n onClick={handleSelectGlobal}\r\n className={`w-full flex items-center gap-3 px-3 py-2.5 text-left transition-colors ${\r\n isGlobal\r\n ? 'bg-emerald-500/10 text-emerald-700'\r\n : 'hover:bg-[var(--bg-tertiary)] text-[var(--text-primary)]'\r\n }`}\r\n role=\"option\"\r\n aria-selected={isGlobal}\r\n >\r\n <div\r\n className=\"flex-shrink-0 w-8 h-8 flex items-center justify-center bg-emerald-500/10\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <Globe className=\"w-4 h-4 text-emerald-600\" />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <span className=\"font-medium block\">\r\n {t('userRoles.scope.selector.global', 'Global (plateforme)')}\r\n </span>\r\n <span className=\"text-xs text-[var(--text-tertiary)]\">\r\n {t('userRoles.scope.selector.globalDesc', 'Rôles applicables sur toute la plateforme')}\r\n </span>\r\n </div>\r\n {isGlobal && <Check className=\"w-4 h-4 text-emerald-600 flex-shrink-0\" />}\r\n </button>\r\n\r\n {/* Divider */}\r\n {filteredTenants.length > 0 && (\r\n <div className=\"border-t border-[var(--border-color)] my-1\" />\r\n )}\r\n\r\n {/* Tenant Options */}\r\n {filteredTenants.length > 0 ? (\r\n filteredTenants.map(renderTenantOption)\r\n ) : (\r\n <div className=\"px-3 py-4 text-center text-sm text-[var(--text-muted)]\">\r\n {t('userRoles.scope.selector.noResults', 'Aucun tenant trouvé')}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Not Member Warning */}\r\n {showNotMemberWarning && !isGlobal && (\r\n <div className=\"mt-2 flex items-center gap-2 text-sm text-amber-600\">\r\n <AlertTriangle className=\"w-4 h-4\" />\r\n <span>{t('userRoles.scope.notMember', \"L'utilisateur n'est pas membre de ce tenant\")}</span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["useAdminTenants","tenants","setTenants","useState","loading","setLoading","error","setError","loadTenants","useCallback","data","adminApi","err","useEffect","TenantScopeSelector","value","onChange","adminTenants","userTenantMemberships","disabled","showNotMemberWarning","t","useTranslation","isOpen","setIsOpen","searchQuery","setSearchQuery","filterType","setFilterType","menuRef","useRef","searchInputRef","handleClickOutside","event","handleEscape","membershipMap","useMemo","map","m","b2bTenants","b2cTenants","filteredTenants","b2b","b2c","filtered","query","isGlobal","selectedTenant","handleSelectGlobal","handleSelectTenant","tenant","membership","renderTenantOption","isSelected","isB2B","isMember","jsxs","jsx","Building2","User","Check","Fragment","Globe","ChevronDown","Search","e","AlertTriangle"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { jsxs as i, jsx as e } from "react/jsx-runtime";
2
2
  import { useTranslation as l } from "react-i18next";
3
- import { B as r, $ as s } from "./index-CwSaRXXg.js";
3
+ import { B as r, $ as s } from "./index-lpIzhufD.js";
4
4
  function m() {
5
5
  const { t } = l("support");
6
6
  return /* @__PURE__ */ i("div", { className: "h-full flex flex-col", children: [
@@ -20,4 +20,4 @@ function m() {
20
20
  export {
21
21
  m as TicketDetailPage
22
22
  };
23
- //# sourceMappingURL=TicketDetailPage-GOh9GX7E.js.map
23
+ //# sourceMappingURL=TicketDetailPage-C1mNS9Up.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TicketDetailPage-GOh9GX7E.js","sources":["../../src/pages/platform/support/TicketDetailPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { TicketDetailView } from '@/components/platform/support/TicketDetailView';\r\n\r\nexport function TicketDetailPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n\r\n return (\r\n <div className=\"h-full flex flex-col\">\r\n <div className=\"flex-shrink-0 mb-4\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('list.title', 'Tickets'), href: '/support/tickets' },\r\n { label: t('detail.title', 'Ticket Detail') }\r\n ]}\r\n />\r\n </div>\r\n <div className=\"flex-1 min-h-0\">\r\n <TicketDetailView mode=\"support\" />\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["TicketDetailPage","useTranslation","jsxs","jsx","Breadcrumb","TicketDetailView"],"mappings":";;;AAKO,SAASA,IAAiC;AAC/C,QAAM,EAAE,EAAA,IAAMC,EAAe,SAAS;AAEtC,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAU,wBACb,UAAA;AAAA,IAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA,gBAAAA;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO,EAAE,SAAS,SAAS,GAAG,MAAM,WAAA;AAAA,UACtC,EAAE,OAAO,EAAE,cAAc,SAAS,GAAG,MAAM,mBAAA;AAAA,UAC3C,EAAE,OAAO,EAAE,gBAAgB,eAAe,EAAA;AAAA,QAAE;AAAA,MAC9C;AAAA,IAAA,GAEJ;AAAA,IACA,gBAAAD,EAAC,SAAI,WAAU,kBACb,4BAACE,GAAA,EAAiB,MAAK,WAAU,EAAA,CACnC;AAAA,EAAA,GACF;AAEJ;"}
1
+ {"version":3,"file":"TicketDetailPage-C1mNS9Up.js","sources":["../../src/pages/platform/support/TicketDetailPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { TicketDetailView } from '@/components/platform/support/TicketDetailView';\r\n\r\nexport function TicketDetailPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n\r\n return (\r\n <div className=\"h-full flex flex-col\">\r\n <div className=\"flex-shrink-0 mb-4\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('list.title', 'Tickets'), href: '/support/tickets' },\r\n { label: t('detail.title', 'Ticket Detail') }\r\n ]}\r\n />\r\n </div>\r\n <div className=\"flex-1 min-h-0\">\r\n <TicketDetailView mode=\"support\" />\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["TicketDetailPage","useTranslation","jsxs","jsx","Breadcrumb","TicketDetailView"],"mappings":";;;AAKO,SAASA,IAAiC;AAC/C,QAAM,EAAE,EAAA,IAAMC,EAAe,SAAS;AAEtC,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAU,wBACb,UAAA;AAAA,IAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA,gBAAAA;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO,EAAE,SAAS,SAAS,GAAG,MAAM,WAAA;AAAA,UACtC,EAAE,OAAO,EAAE,cAAc,SAAS,GAAG,MAAM,mBAAA;AAAA,UAC3C,EAAE,OAAO,EAAE,gBAAgB,eAAe,EAAA;AAAA,QAAE;AAAA,MAC9C;AAAA,IAAA,GAEJ;AAAA,IACA,gBAAAD,EAAC,SAAI,WAAU,kBACb,4BAACE,GAAA,EAAiB,MAAK,WAAU,EAAA,CACnC;AAAA,EAAA,GACF;AAEJ;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),l=require("react-i18next"),i=require("./index-2wUhd9Lu.js");function s(){const{t}=l.useTranslation("support");return e.jsxs("div",{className:"h-full flex flex-col",children:[e.jsx("div",{className:"flex-shrink-0 mb-4",children:e.jsx(i.Breadcrumb,{items:[{label:t("title","Support"),href:"/support"},{label:t("list.title","Tickets"),href:"/support/tickets"},{label:t("detail.title","Ticket Detail")}]})}),e.jsx("div",{className:"flex-1 min-h-0",children:e.jsx(i.TicketDetailView,{mode:"support"})})]})}exports.TicketDetailPage=s;
2
- //# sourceMappingURL=TicketDetailPage-Du8WMyqf.js.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),l=require("react-i18next"),i=require("./index-IgLVXPg8.js");function s(){const{t}=l.useTranslation("support");return e.jsxs("div",{className:"h-full flex flex-col",children:[e.jsx("div",{className:"flex-shrink-0 mb-4",children:e.jsx(i.Breadcrumb,{items:[{label:t("title","Support"),href:"/support"},{label:t("list.title","Tickets"),href:"/support/tickets"},{label:t("detail.title","Ticket Detail")}]})}),e.jsx("div",{className:"flex-1 min-h-0",children:e.jsx(i.TicketDetailView,{mode:"support"})})]})}exports.TicketDetailPage=s;
2
+ //# sourceMappingURL=TicketDetailPage-ieVDRh42.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TicketDetailPage-Du8WMyqf.js","sources":["../../src/pages/platform/support/TicketDetailPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { TicketDetailView } from '@/components/platform/support/TicketDetailView';\r\n\r\nexport function TicketDetailPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n\r\n return (\r\n <div className=\"h-full flex flex-col\">\r\n <div className=\"flex-shrink-0 mb-4\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('list.title', 'Tickets'), href: '/support/tickets' },\r\n { label: t('detail.title', 'Ticket Detail') }\r\n ]}\r\n />\r\n </div>\r\n <div className=\"flex-1 min-h-0\">\r\n <TicketDetailView mode=\"support\" />\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["TicketDetailPage","useTranslation","jsxs","jsx","Breadcrumb","TicketDetailView"],"mappings":"iLAKO,SAASA,GAAiC,CAC/C,KAAM,CAAE,CAAA,EAAMC,EAAAA,eAAe,SAAS,EAEtC,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,qBACb,SAAAA,EAAAA,IAACC,EAAAA,WAAA,CACC,MAAO,CACL,CAAE,MAAO,EAAE,QAAS,SAAS,EAAG,KAAM,UAAA,EACtC,CAAE,MAAO,EAAE,aAAc,SAAS,EAAG,KAAM,kBAAA,EAC3C,CAAE,MAAO,EAAE,eAAgB,eAAe,CAAA,CAAE,CAC9C,CAAA,EAEJ,EACAD,EAAAA,IAAC,OAAI,UAAU,iBACb,eAACE,mBAAA,CAAiB,KAAK,UAAU,CAAA,CACnC,CAAA,EACF,CAEJ"}
1
+ {"version":3,"file":"TicketDetailPage-ieVDRh42.js","sources":["../../src/pages/platform/support/TicketDetailPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { TicketDetailView } from '@/components/platform/support/TicketDetailView';\r\n\r\nexport function TicketDetailPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n\r\n return (\r\n <div className=\"h-full flex flex-col\">\r\n <div className=\"flex-shrink-0 mb-4\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('list.title', 'Tickets'), href: '/support/tickets' },\r\n { label: t('detail.title', 'Ticket Detail') }\r\n ]}\r\n />\r\n </div>\r\n <div className=\"flex-1 min-h-0\">\r\n <TicketDetailView mode=\"support\" />\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["TicketDetailPage","useTranslation","jsxs","jsx","Breadcrumb","TicketDetailView"],"mappings":"iLAKO,SAASA,GAAiC,CAC/C,KAAM,CAAE,CAAA,EAAMC,EAAAA,eAAe,SAAS,EAEtC,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,qBACb,SAAAA,EAAAA,IAACC,EAAAA,WAAA,CACC,MAAO,CACL,CAAE,MAAO,EAAE,QAAS,SAAS,EAAG,KAAM,UAAA,EACtC,CAAE,MAAO,EAAE,aAAc,SAAS,EAAG,KAAM,kBAAA,EAC3C,CAAE,MAAO,EAAE,eAAgB,eAAe,CAAA,CAAE,CAC9C,CAAA,EAEJ,EACAD,EAAAA,IAAC,OAAI,UAAU,iBACb,eAACE,mBAAA,CAAiB,KAAK,UAAU,CAAA,CACnC,CAAA,EACF,CAEJ"}
@@ -1,6 +1,6 @@
1
1
  import { jsxs as l, jsx as e } from "react/jsx-runtime";
2
2
  import { useTranslation as c } from "react-i18next";
3
- import { B as n, _ as i } from "./index-CwSaRXXg.js";
3
+ import { B as n, _ as i } from "./index-lpIzhufD.js";
4
4
  import { u as d } from "./useTabNavigation-Bsbskz0i.js";
5
5
  const a = ["all", "assigned"];
6
6
  function v() {
@@ -51,4 +51,4 @@ function v() {
51
51
  export {
52
52
  v as TicketsPage
53
53
  };
54
- //# sourceMappingURL=TicketsPage-Bqd6moQy.js.map
54
+ //# sourceMappingURL=TicketsPage-CnuWsnIW.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TicketsPage-Bqd6moQy.js","sources":["../../src/pages/platform/support/TicketsPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { TicketsListView } from '@/components/platform/support/TicketsListView';\r\nimport { useTabNavigation } from '@/hooks/useTabNavigation';\r\n\r\nconst TABS = ['all', 'assigned'] as const;\r\ntype TabId = typeof TABS[number];\r\n\r\nexport function TicketsPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n const { activeTab, setActiveTab } = useTabNavigation<TabId>('all', [...TABS]);\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('list.title', 'Tickets') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex gap-1 border-b border-[var(--border-color)]\">\r\n {TABS.map(tab => (\r\n <button\r\n key={tab}\r\n onClick={() => setActiveTab(tab)}\r\n className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${\r\n activeTab === tab\r\n ? 'border-[var(--color-primary-600)] text-[var(--color-primary-600)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]'\r\n }`}\r\n >\r\n {tab === 'all'\r\n ? t('list.tabs.all', 'All tickets')\r\n : t('list.tabs.assigned', 'Assigned to me')}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {activeTab === 'all' && (\r\n <TicketsListView\r\n mode=\"admin\"\r\n showDrafts={false}\r\n basePath=\"/support/tickets\"\r\n title={t('list.title')}\r\n subtitle={t('list.subtitle')}\r\n createPath=\"/support/tickets/new\"\r\n />\r\n )}\r\n {activeTab === 'assigned' && (\r\n <TicketsListView\r\n mode=\"assigned\"\r\n showDrafts={false}\r\n basePath=\"/support/tickets\"\r\n title={t('list.assignedTitle', 'Assigned Tickets')}\r\n subtitle={t('list.assignedSubtitle', 'Tickets assigned to you')}\r\n createPath=\"/support/tickets/new\"\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["TABS","TicketsPage","useTranslation","activeTab","setActiveTab","useTabNavigation","jsxs","jsx","Breadcrumb","tab","TicketsListView"],"mappings":";;;;AAMA,MAAMA,IAAO,CAAC,OAAO,UAAU;AAGxB,SAASC,IAA4B;AAC1C,QAAM,EAAE,EAAA,IAAMC,EAAe,SAAS,GAChC,EAAE,WAAAC,GAAW,cAAAC,EAAA,IAAiBC,EAAwB,OAAO,CAAC,GAAGL,CAAI,CAAC;AAE5E,SACE,gBAAAM,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO,EAAE,SAAS,SAAS,GAAG,MAAM,WAAA;AAAA,UACtC,EAAE,OAAO,EAAE,cAAc,SAAS,EAAA;AAAA,QAAE;AAAA,MACtC;AAAA,IAAA;AAAA,sBAGD,OAAA,EAAI,WAAU,oDACZ,UAAAR,EAAK,IAAI,CAAAS,MACR,gBAAAF;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,SAAS,MAAMH,EAAaK,CAAG;AAAA,QAC/B,WAAW,8DACTN,MAAcM,IACV,sEACA,qHACN;AAAA,QAEC,UAAAA,MAAQ,QACL,EAAE,iBAAiB,aAAa,IAChC,EAAE,sBAAsB,gBAAgB;AAAA,MAAA;AAAA,MAVvCA;AAAA,IAAA,CAYR,GACH;AAAA,IAECN,MAAc,SACb,gBAAAI;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,YAAY;AAAA,QACZ,UAAS;AAAA,QACT,OAAO,EAAE,YAAY;AAAA,QACrB,UAAU,EAAE,eAAe;AAAA,QAC3B,YAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IAGdP,MAAc,cACb,gBAAAI;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,YAAY;AAAA,QACZ,UAAS;AAAA,QACT,OAAO,EAAE,sBAAsB,kBAAkB;AAAA,QACjD,UAAU,EAAE,yBAAyB,yBAAyB;AAAA,QAC9D,YAAW;AAAA,MAAA;AAAA,IAAA;AAAA,EACb,GAEJ;AAEJ;"}
1
+ {"version":3,"file":"TicketsPage-CnuWsnIW.js","sources":["../../src/pages/platform/support/TicketsPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { TicketsListView } from '@/components/platform/support/TicketsListView';\r\nimport { useTabNavigation } from '@/hooks/useTabNavigation';\r\n\r\nconst TABS = ['all', 'assigned'] as const;\r\ntype TabId = typeof TABS[number];\r\n\r\nexport function TicketsPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n const { activeTab, setActiveTab } = useTabNavigation<TabId>('all', [...TABS]);\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('list.title', 'Tickets') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex gap-1 border-b border-[var(--border-color)]\">\r\n {TABS.map(tab => (\r\n <button\r\n key={tab}\r\n onClick={() => setActiveTab(tab)}\r\n className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${\r\n activeTab === tab\r\n ? 'border-[var(--color-primary-600)] text-[var(--color-primary-600)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]'\r\n }`}\r\n >\r\n {tab === 'all'\r\n ? t('list.tabs.all', 'All tickets')\r\n : t('list.tabs.assigned', 'Assigned to me')}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {activeTab === 'all' && (\r\n <TicketsListView\r\n mode=\"admin\"\r\n showDrafts={false}\r\n basePath=\"/support/tickets\"\r\n title={t('list.title')}\r\n subtitle={t('list.subtitle')}\r\n createPath=\"/support/tickets/new\"\r\n />\r\n )}\r\n {activeTab === 'assigned' && (\r\n <TicketsListView\r\n mode=\"assigned\"\r\n showDrafts={false}\r\n basePath=\"/support/tickets\"\r\n title={t('list.assignedTitle', 'Assigned Tickets')}\r\n subtitle={t('list.assignedSubtitle', 'Tickets assigned to you')}\r\n createPath=\"/support/tickets/new\"\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["TABS","TicketsPage","useTranslation","activeTab","setActiveTab","useTabNavigation","jsxs","jsx","Breadcrumb","tab","TicketsListView"],"mappings":";;;;AAMA,MAAMA,IAAO,CAAC,OAAO,UAAU;AAGxB,SAASC,IAA4B;AAC1C,QAAM,EAAE,EAAA,IAAMC,EAAe,SAAS,GAChC,EAAE,WAAAC,GAAW,cAAAC,EAAA,IAAiBC,EAAwB,OAAO,CAAC,GAAGL,CAAI,CAAC;AAE5E,SACE,gBAAAM,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO,EAAE,SAAS,SAAS,GAAG,MAAM,WAAA;AAAA,UACtC,EAAE,OAAO,EAAE,cAAc,SAAS,EAAA;AAAA,QAAE;AAAA,MACtC;AAAA,IAAA;AAAA,sBAGD,OAAA,EAAI,WAAU,oDACZ,UAAAR,EAAK,IAAI,CAAAS,MACR,gBAAAF;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,SAAS,MAAMH,EAAaK,CAAG;AAAA,QAC/B,WAAW,8DACTN,MAAcM,IACV,sEACA,qHACN;AAAA,QAEC,UAAAA,MAAQ,QACL,EAAE,iBAAiB,aAAa,IAChC,EAAE,sBAAsB,gBAAgB;AAAA,MAAA;AAAA,MAVvCA;AAAA,IAAA,CAYR,GACH;AAAA,IAECN,MAAc,SACb,gBAAAI;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,YAAY;AAAA,QACZ,UAAS;AAAA,QACT,OAAO,EAAE,YAAY;AAAA,QACrB,UAAU,EAAE,eAAe;AAAA,QAC3B,YAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IAGdP,MAAc,cACb,gBAAAI;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,YAAY;AAAA,QACZ,UAAS;AAAA,QACT,OAAO,EAAE,sBAAsB,kBAAkB;AAAA,QACjD,UAAU,EAAE,yBAAyB,yBAAyB;AAAA,QAC9D,YAAW;AAAA,MAAA;AAAA,IAAA;AAAA,EACb,GAEJ;AAEJ;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),l=require("react-i18next"),r=require("./index-2wUhd9Lu.js"),c=require("./useTabNavigation-BVtbCTd5.js"),a=["all","assigned"];function n(){const{t:e}=l.useTranslation("support"),{activeTab:i,setActiveTab:o}=c.useTabNavigation("all",[...a]);return t.jsxs("div",{className:"space-y-4",children:[t.jsx(r.Breadcrumb,{items:[{label:e("title","Support"),href:"/support"},{label:e("list.title","Tickets")}]}),t.jsx("div",{className:"flex gap-1 border-b border-[var(--border-color)]",children:a.map(s=>t.jsx("button",{onClick:()=>o(s),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${i===s?"border-[var(--color-primary-600)] text-[var(--color-primary-600)]":"border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]"}`,children:s==="all"?e("list.tabs.all","All tickets"):e("list.tabs.assigned","Assigned to me")},s))}),i==="all"&&t.jsx(r.TicketsListView,{mode:"admin",showDrafts:!1,basePath:"/support/tickets",title:e("list.title"),subtitle:e("list.subtitle"),createPath:"/support/tickets/new"}),i==="assigned"&&t.jsx(r.TicketsListView,{mode:"assigned",showDrafts:!1,basePath:"/support/tickets",title:e("list.assignedTitle","Assigned Tickets"),subtitle:e("list.assignedSubtitle","Tickets assigned to you"),createPath:"/support/tickets/new"})]})}exports.TicketsPage=n;
2
- //# sourceMappingURL=TicketsPage-WdU4Bb7M.js.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),l=require("react-i18next"),r=require("./index-IgLVXPg8.js"),c=require("./useTabNavigation-BVtbCTd5.js"),a=["all","assigned"];function n(){const{t:e}=l.useTranslation("support"),{activeTab:i,setActiveTab:o}=c.useTabNavigation("all",[...a]);return t.jsxs("div",{className:"space-y-4",children:[t.jsx(r.Breadcrumb,{items:[{label:e("title","Support"),href:"/support"},{label:e("list.title","Tickets")}]}),t.jsx("div",{className:"flex gap-1 border-b border-[var(--border-color)]",children:a.map(s=>t.jsx("button",{onClick:()=>o(s),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${i===s?"border-[var(--color-primary-600)] text-[var(--color-primary-600)]":"border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]"}`,children:s==="all"?e("list.tabs.all","All tickets"):e("list.tabs.assigned","Assigned to me")},s))}),i==="all"&&t.jsx(r.TicketsListView,{mode:"admin",showDrafts:!1,basePath:"/support/tickets",title:e("list.title"),subtitle:e("list.subtitle"),createPath:"/support/tickets/new"}),i==="assigned"&&t.jsx(r.TicketsListView,{mode:"assigned",showDrafts:!1,basePath:"/support/tickets",title:e("list.assignedTitle","Assigned Tickets"),subtitle:e("list.assignedSubtitle","Tickets assigned to you"),createPath:"/support/tickets/new"})]})}exports.TicketsPage=n;
2
+ //# sourceMappingURL=TicketsPage-jjyY15_D.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TicketsPage-WdU4Bb7M.js","sources":["../../src/pages/platform/support/TicketsPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { TicketsListView } from '@/components/platform/support/TicketsListView';\r\nimport { useTabNavigation } from '@/hooks/useTabNavigation';\r\n\r\nconst TABS = ['all', 'assigned'] as const;\r\ntype TabId = typeof TABS[number];\r\n\r\nexport function TicketsPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n const { activeTab, setActiveTab } = useTabNavigation<TabId>('all', [...TABS]);\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('list.title', 'Tickets') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex gap-1 border-b border-[var(--border-color)]\">\r\n {TABS.map(tab => (\r\n <button\r\n key={tab}\r\n onClick={() => setActiveTab(tab)}\r\n className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${\r\n activeTab === tab\r\n ? 'border-[var(--color-primary-600)] text-[var(--color-primary-600)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]'\r\n }`}\r\n >\r\n {tab === 'all'\r\n ? t('list.tabs.all', 'All tickets')\r\n : t('list.tabs.assigned', 'Assigned to me')}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {activeTab === 'all' && (\r\n <TicketsListView\r\n mode=\"admin\"\r\n showDrafts={false}\r\n basePath=\"/support/tickets\"\r\n title={t('list.title')}\r\n subtitle={t('list.subtitle')}\r\n createPath=\"/support/tickets/new\"\r\n />\r\n )}\r\n {activeTab === 'assigned' && (\r\n <TicketsListView\r\n mode=\"assigned\"\r\n showDrafts={false}\r\n basePath=\"/support/tickets\"\r\n title={t('list.assignedTitle', 'Assigned Tickets')}\r\n subtitle={t('list.assignedSubtitle', 'Tickets assigned to you')}\r\n createPath=\"/support/tickets/new\"\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["TABS","TicketsPage","t","useTranslation","activeTab","setActiveTab","useTabNavigation","jsxs","jsx","Breadcrumb","tab","TicketsListView"],"mappings":"6NAMMA,EAAO,CAAC,MAAO,UAAU,EAGxB,SAASC,GAA4B,CAC1C,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAAA,eAAe,SAAS,EAChC,CAAE,UAAAC,EAAW,aAAAC,CAAA,EAAiBC,EAAAA,iBAAwB,MAAO,CAAC,GAAGN,CAAI,CAAC,EAE5E,OACEO,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAC,EAAAA,IAACC,EAAAA,WAAA,CACC,MAAO,CACL,CAAE,MAAOP,EAAE,QAAS,SAAS,EAAG,KAAM,UAAA,EACtC,CAAE,MAAOA,EAAE,aAAc,SAAS,CAAA,CAAE,CACtC,CAAA,QAGD,MAAA,CAAI,UAAU,mDACZ,SAAAF,EAAK,IAAIU,GACRF,EAAAA,IAAC,SAAA,CAEC,QAAS,IAAMH,EAAaK,CAAG,EAC/B,UAAW,8DACTN,IAAcM,EACV,oEACA,qHACN,GAEC,SAAAA,IAAQ,MACLR,EAAE,gBAAiB,aAAa,EAChCA,EAAE,qBAAsB,gBAAgB,CAAA,EAVvCQ,CAAA,CAYR,EACH,EAECN,IAAc,OACbI,EAAAA,IAACG,EAAAA,gBAAA,CACC,KAAK,QACL,WAAY,GACZ,SAAS,mBACT,MAAOT,EAAE,YAAY,EACrB,SAAUA,EAAE,eAAe,EAC3B,WAAW,sBAAA,CAAA,EAGdE,IAAc,YACbI,EAAAA,IAACG,EAAAA,gBAAA,CACC,KAAK,WACL,WAAY,GACZ,SAAS,mBACT,MAAOT,EAAE,qBAAsB,kBAAkB,EACjD,SAAUA,EAAE,wBAAyB,yBAAyB,EAC9D,WAAW,sBAAA,CAAA,CACb,EAEJ,CAEJ"}
1
+ {"version":3,"file":"TicketsPage-jjyY15_D.js","sources":["../../src/pages/platform/support/TicketsPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { TicketsListView } from '@/components/platform/support/TicketsListView';\r\nimport { useTabNavigation } from '@/hooks/useTabNavigation';\r\n\r\nconst TABS = ['all', 'assigned'] as const;\r\ntype TabId = typeof TABS[number];\r\n\r\nexport function TicketsPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n const { activeTab, setActiveTab } = useTabNavigation<TabId>('all', [...TABS]);\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('list.title', 'Tickets') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex gap-1 border-b border-[var(--border-color)]\">\r\n {TABS.map(tab => (\r\n <button\r\n key={tab}\r\n onClick={() => setActiveTab(tab)}\r\n className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${\r\n activeTab === tab\r\n ? 'border-[var(--color-primary-600)] text-[var(--color-primary-600)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]'\r\n }`}\r\n >\r\n {tab === 'all'\r\n ? t('list.tabs.all', 'All tickets')\r\n : t('list.tabs.assigned', 'Assigned to me')}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {activeTab === 'all' && (\r\n <TicketsListView\r\n mode=\"admin\"\r\n showDrafts={false}\r\n basePath=\"/support/tickets\"\r\n title={t('list.title')}\r\n subtitle={t('list.subtitle')}\r\n createPath=\"/support/tickets/new\"\r\n />\r\n )}\r\n {activeTab === 'assigned' && (\r\n <TicketsListView\r\n mode=\"assigned\"\r\n showDrafts={false}\r\n basePath=\"/support/tickets\"\r\n title={t('list.assignedTitle', 'Assigned Tickets')}\r\n subtitle={t('list.assignedSubtitle', 'Tickets assigned to you')}\r\n createPath=\"/support/tickets/new\"\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["TABS","TicketsPage","t","useTranslation","activeTab","setActiveTab","useTabNavigation","jsxs","jsx","Breadcrumb","tab","TicketsListView"],"mappings":"6NAMMA,EAAO,CAAC,MAAO,UAAU,EAGxB,SAASC,GAA4B,CAC1C,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAAA,eAAe,SAAS,EAChC,CAAE,UAAAC,EAAW,aAAAC,CAAA,EAAiBC,EAAAA,iBAAwB,MAAO,CAAC,GAAGN,CAAI,CAAC,EAE5E,OACEO,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAC,EAAAA,IAACC,EAAAA,WAAA,CACC,MAAO,CACL,CAAE,MAAOP,EAAE,QAAS,SAAS,EAAG,KAAM,UAAA,EACtC,CAAE,MAAOA,EAAE,aAAc,SAAS,CAAA,CAAE,CACtC,CAAA,QAGD,MAAA,CAAI,UAAU,mDACZ,SAAAF,EAAK,IAAIU,GACRF,EAAAA,IAAC,SAAA,CAEC,QAAS,IAAMH,EAAaK,CAAG,EAC/B,UAAW,8DACTN,IAAcM,EACV,oEACA,qHACN,GAEC,SAAAA,IAAQ,MACLR,EAAE,gBAAiB,aAAa,EAChCA,EAAE,qBAAsB,gBAAgB,CAAA,EAVvCQ,CAAA,CAYR,EACH,EAECN,IAAc,OACbI,EAAAA,IAACG,EAAAA,gBAAA,CACC,KAAK,QACL,WAAY,GACZ,SAAS,mBACT,MAAOT,EAAE,YAAY,EACrB,SAAUA,EAAE,eAAe,EAC3B,WAAW,sBAAA,CAAA,EAGdE,IAAc,YACbI,EAAAA,IAACG,EAAAA,gBAAA,CACC,KAAK,WACL,WAAY,GACZ,SAAS,mBACT,MAAOT,EAAE,qBAAsB,kBAAkB,EACjD,SAAUA,EAAE,wBAAyB,yBAAyB,EAC9D,WAAW,sBAAA,CAAA,CACb,EAEJ,CAEJ"}
@@ -1,6 +1,6 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),r=require("react"),pe=require("react-router-dom"),Ee=require("react-i18next"),n=require("lucide-react"),o=require("./index-2wUhd9Lu.js"),Ke=require("./ScreenshotAnnotator-CoRDpHXW.js"),J=[{value:"Bug",label:"Report a Bug",labelKey:"tickets.types.bug",description:"Something is not working correctly",descriptionKey:"tickets.types.bugDescription",icon:n.Bug},{value:"FeatureRequest",label:"Request a Feature",labelKey:"tickets.types.featureRequest",description:"Suggest an improvement or new feature",descriptionKey:"tickets.types.featureRequestDescription",icon:n.Lightbulb},{value:"ApplicationRequest",label:"Request an Application",labelKey:"tickets.types.applicationRequest",description:"Request access to a new application",descriptionKey:"tickets.types.applicationRequestDescription",icon:n.AppWindow},{value:"Support",label:"General Support",labelKey:"tickets.types.support",description:"Need help with something",descriptionKey:"tickets.types.supportDescription",icon:n.MessageSquare},{value:"Question",label:"Ask a Question",labelKey:"tickets.types.question",description:"Have a question about the platform",descriptionKey:"tickets.types.questionDescription",icon:n.HelpCircle}],$e=[{value:"Low",label:"Low",labelKey:"tickets.priority.low",description:"Can wait, not urgent",descriptionKey:"tickets.priority.lowDescription"},{value:"Medium",label:"Medium",labelKey:"tickets.priority.medium",description:"Normal priority",descriptionKey:"tickets.priority.mediumDescription"},{value:"High",label:"High",labelKey:"tickets.priority.high",description:"Important, needs attention soon",descriptionKey:"tickets.priority.highDescription"},{value:"Critical",label:"Critical",labelKey:"tickets.priority.critical",description:"Urgent, blocking work",descriptionKey:"tickets.priority.criticalDescription"}],xe=10*1024*1024,he=5,Ue=[".pdf",".doc",".docx",".xls",".xlsx",".txt",".csv",".zip",".rar",".7z",".png",".jpg",".jpeg",".gif",".webp",".bmp"];function Me(c){return c<1024?`${c} B`:c<1024*1024?`${(c/1024).toFixed(1)} KB`:`${(c/(1024*1024)).toFixed(1)} MB`}function ze(c){return c.includes("pdf")?n.FileText:c.startsWith("image/")?n.Image:n.File}function He(c,u){if(!c)return{draft:null,selectedTenant:null};const s=o.ticketDraftService.getDraft(c);if(!s)return{draft:null,selectedTenant:null};let g=null;if(s.tenantId&&s.tenantSlug){const x=u.find(h=>h.id===s.tenantId);x&&(g=x)}return{draft:s,selectedTenant:g}}function Oe(c){if(!c?.screenshot)return{screenshot:null,autoSelectType:null};let u=null;return c.recentErrors.length>0&&(u="Bug"),{screenshot:c.screenshot,autoSelectType:u}}async function We(c,u,s){try{const x=await(await fetch(u)).blob(),h=new File([x],"screenshot.png",{type:"image/png"});if(s){const N=new FormData;N.append("file",h);const K={"X-Tenant-Slug":s.slug};await o.api.post(`/api/support/my-tickets/${c}/attachments`,N,{headers:{"Content-Type":"multipart/form-data",...K}})}else await o.myTicketsApi.uploadAttachment(c,h)}catch{}}async function Ge(c,u,s){for(const g of u)try{if(s){const x=new FormData;x.append("file",g.file);const h={"X-Tenant-Slug":s.slug};await o.api.post(`/api/support/my-tickets/${c}/attachments`,x,{headers:{"Content-Type":"multipart/form-data",...h}})}else await o.myTicketsApi.uploadAttachment(c,g.file)}catch{}}function Xe(){const c=pe.useNavigate(),[u]=pe.useSearchParams(),{t:s}=Ee.useTranslation(["support","common"]),{isGlpi:g,glpiBaseUrl:x}=o.useTicketingProvider(),{currentTenant:h,userTenants:N,isGlobalView:K}=o.useTenant(),A=r.useRef(null),P=r.useRef(null),[y,Y]=r.useState(null),[fe,R]=r.useState(!1),D=h??y;r.useEffect(()=>{!h&&K&&N.length>0&&R(!0)},[h,K,N.length]);const H=u.get("draft"),[w,F]=r.useState(1),[m,$]=r.useState(null),[b,O]=r.useState(""),[j,W]=r.useState(""),[T,G]=r.useState("Medium"),[ee,te]=r.useState(!1),[se,f]=r.useState(null),[v,ve]=r.useState(null),[X,be]=r.useState(!0),[re,U]=r.useState(null),[S,B]=r.useState(null),[ae,V]=r.useState(!1),[C,ne]=r.useState([]),[ce,_]=r.useState(!1),[l,ge]=r.useState(H),[ye,ie]=r.useState(!1),[je,oe]=r.useState(!1),p=r.useRef(null),le=r.useRef(!1),L=r.useRef(!1),q=r.useCallback(()=>{if(!l)return!1;const t=o.ticketDraftService.updateDraft(l,{type:m,title:b,description:j,priority:T,includeScreenshot:!!S,includeErrorLogs:!1,screenshot:S??void 0,tenantId:D?.id,tenantSlug:D?.slug,tenantName:D?.name});return t.success&&(L.current=!1,ie(!0),setTimeout(()=>ie(!1),2e3)),t.success},[l,m,b,j,T,S,D]),Q=r.useCallback(()=>{if(l)return l;const t=o.ticketDraftService.createDraft();return ge(t.id),t.id},[l]);r.useEffect(()=>{if(le.current&&!(!m&&!b&&!j)){if(L.current=!0,!l){Q();return}return p.current&&clearTimeout(p.current),p.current=setTimeout(()=>{q()},1e3),()=>{p.current&&clearTimeout(p.current)}}},[m,b,j,T,S,l,q,Q]),r.useEffect(()=>{const t=()=>{L.current&&l&&q()};return window.addEventListener("beforeunload",t),()=>{window.removeEventListener("beforeunload",t),L.current&&l&&q(),p.current&&clearTimeout(p.current)}},[l,q]);const ke=r.useCallback(()=>{l&&o.ticketDraftService.deleteDraft(l),p.current&&(clearTimeout(p.current),p.current=null),c(-1)},[l,c]);r.useEffect(()=>{const{draft:t,selectedTenant:a}=He(H,N);if(t&&(t.type&&($(t.type),F(2)),t.title&&O(t.title),t.description&&W(t.description),t.priority&&G(t.priority),t.screenshot&&(U(t.screenshot),B(t.screenshot)),a&&Y(a)),!t){const I=["Bug","FeatureRequest","Suggestion","ApplicationRequest","Support","Question"],Z=u.get("type"),me=u.get("subject"),ue=u.get("body");Z&&I.includes(Z)&&($(Z),F(2)),me&&O(decodeURIComponent(me)),ue&&W(decodeURIComponent(ue))}const d=o.errorContextService.loadContext(),{screenshot:i,autoSelectType:E}=Oe(d);i&&!S&&(U(i),B(i),E&&!m&&($(E),G("High"))),o.errorContextService.clearContext();const k=o.browserInfoService.captureBrowserInfo();ve(k),setTimeout(()=>{le.current=!0},100)},[H]);const M=r.useCallback(t=>{if(!t.type.startsWith("image/")){f(s("tickets.create.invalidImageType","Please select a valid image file"));return}if(t.size>xe){f(s("tickets.create.imageTooLarge","Image must be less than 10MB"));return}const a=new FileReader;a.onload=d=>{const i=d.target?.result;U(i),B(i),f(null)},a.onerror=()=>{f(s("tickets.create.imageReadError","Failed to read image file"))},a.readAsDataURL(t)},[s]),Ne=r.useCallback(t=>{const a=t.target.files?.[0];a&&M(a)},[M]),we=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),V(!0)},[]),Se=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),V(!1)},[]),De=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),V(!1);const a=t.dataTransfer.files;if(a.length>0){const d=a[0];d.type.startsWith("image/")?M(d):f(s("tickets.create.invalidImageType","Please select a valid image file"))}},[M,s]),Te=r.useCallback(()=>{U(null),B(null),A.current&&(A.current.value="")},[]),Ce=r.useCallback(t=>{B(t)},[]),de=r.useCallback(t=>{if(t.type.startsWith("image/"))return!0;const a="."+t.name.split(".").pop()?.toLowerCase();return Ue.includes(a)},[]),z=r.useCallback(t=>{const a=[];for(let d=0;d<t.length;d++){const i=t[d];if(C.length+a.length>=he){f(s("tickets.create.maxAttachments",`Maximum ${he} attachments allowed`));break}if(i.size>xe){f(s("tickets.create.fileTooLarge",`File "${i.name}" is too large (max 10MB)`));continue}if(!de(i)){f(s("tickets.create.invalidFileType",`File type not allowed: ${i.name}`));continue}C.some(k=>k.name===i.name&&k.size===i.size)||a.push({id:crypto.randomUUID(),file:i,name:i.name,size:i.size,type:i.type})}a.length>0&&(ne(d=>[...d,...a]),f(null))},[C,de,s]),Ie=r.useCallback(t=>{const a=t.target.files;a&&z(a),P.current&&(P.current.value="")},[z]),Ae=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),_(!0)},[]),Pe=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),_(!1)},[]),Re=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),_(!1);const a=t.dataTransfer.files;a.length>0&&z(a)},[z]),Fe=r.useCallback(t=>{ne(a=>a.filter(d=>d.id!==t))},[]),Be=async()=>{if(!(!m||!b.trim()||!j.trim())){if(!D){R(!0);return}try{te(!0),f(null);let t=j.trim();X&&v&&(t+=`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),r=require("react"),pe=require("react-router-dom"),Ee=require("react-i18next"),n=require("lucide-react"),o=require("./index-IgLVXPg8.js"),Ke=require("./ScreenshotAnnotator-CoRDpHXW.js"),J=[{value:"Bug",label:"Report a Bug",labelKey:"tickets.types.bug",description:"Something is not working correctly",descriptionKey:"tickets.types.bugDescription",icon:n.Bug},{value:"FeatureRequest",label:"Request a Feature",labelKey:"tickets.types.featureRequest",description:"Suggest an improvement or new feature",descriptionKey:"tickets.types.featureRequestDescription",icon:n.Lightbulb},{value:"ApplicationRequest",label:"Request an Application",labelKey:"tickets.types.applicationRequest",description:"Request access to a new application",descriptionKey:"tickets.types.applicationRequestDescription",icon:n.AppWindow},{value:"Support",label:"General Support",labelKey:"tickets.types.support",description:"Need help with something",descriptionKey:"tickets.types.supportDescription",icon:n.MessageSquare},{value:"Question",label:"Ask a Question",labelKey:"tickets.types.question",description:"Have a question about the platform",descriptionKey:"tickets.types.questionDescription",icon:n.HelpCircle}],$e=[{value:"Low",label:"Low",labelKey:"tickets.priority.low",description:"Can wait, not urgent",descriptionKey:"tickets.priority.lowDescription"},{value:"Medium",label:"Medium",labelKey:"tickets.priority.medium",description:"Normal priority",descriptionKey:"tickets.priority.mediumDescription"},{value:"High",label:"High",labelKey:"tickets.priority.high",description:"Important, needs attention soon",descriptionKey:"tickets.priority.highDescription"},{value:"Critical",label:"Critical",labelKey:"tickets.priority.critical",description:"Urgent, blocking work",descriptionKey:"tickets.priority.criticalDescription"}],xe=10*1024*1024,he=5,Ue=[".pdf",".doc",".docx",".xls",".xlsx",".txt",".csv",".zip",".rar",".7z",".png",".jpg",".jpeg",".gif",".webp",".bmp"];function Me(c){return c<1024?`${c} B`:c<1024*1024?`${(c/1024).toFixed(1)} KB`:`${(c/(1024*1024)).toFixed(1)} MB`}function ze(c){return c.includes("pdf")?n.FileText:c.startsWith("image/")?n.Image:n.File}function He(c,u){if(!c)return{draft:null,selectedTenant:null};const s=o.ticketDraftService.getDraft(c);if(!s)return{draft:null,selectedTenant:null};let g=null;if(s.tenantId&&s.tenantSlug){const x=u.find(h=>h.id===s.tenantId);x&&(g=x)}return{draft:s,selectedTenant:g}}function Oe(c){if(!c?.screenshot)return{screenshot:null,autoSelectType:null};let u=null;return c.recentErrors.length>0&&(u="Bug"),{screenshot:c.screenshot,autoSelectType:u}}async function We(c,u,s){try{const x=await(await fetch(u)).blob(),h=new File([x],"screenshot.png",{type:"image/png"});if(s){const N=new FormData;N.append("file",h);const K={"X-Tenant-Slug":s.slug};await o.api.post(`/api/support/my-tickets/${c}/attachments`,N,{headers:{"Content-Type":"multipart/form-data",...K}})}else await o.myTicketsApi.uploadAttachment(c,h)}catch{}}async function Ge(c,u,s){for(const g of u)try{if(s){const x=new FormData;x.append("file",g.file);const h={"X-Tenant-Slug":s.slug};await o.api.post(`/api/support/my-tickets/${c}/attachments`,x,{headers:{"Content-Type":"multipart/form-data",...h}})}else await o.myTicketsApi.uploadAttachment(c,g.file)}catch{}}function Xe(){const c=pe.useNavigate(),[u]=pe.useSearchParams(),{t:s}=Ee.useTranslation(["support","common"]),{isGlpi:g,glpiBaseUrl:x}=o.useTicketingProvider(),{currentTenant:h,userTenants:N,isGlobalView:K}=o.useTenant(),A=r.useRef(null),P=r.useRef(null),[y,Y]=r.useState(null),[fe,R]=r.useState(!1),D=h??y;r.useEffect(()=>{!h&&K&&N.length>0&&R(!0)},[h,K,N.length]);const H=u.get("draft"),[w,F]=r.useState(1),[m,$]=r.useState(null),[b,O]=r.useState(""),[j,W]=r.useState(""),[T,G]=r.useState("Medium"),[ee,te]=r.useState(!1),[se,f]=r.useState(null),[v,ve]=r.useState(null),[X,be]=r.useState(!0),[re,U]=r.useState(null),[S,B]=r.useState(null),[ae,V]=r.useState(!1),[C,ne]=r.useState([]),[ce,_]=r.useState(!1),[l,ge]=r.useState(H),[ye,ie]=r.useState(!1),[je,oe]=r.useState(!1),p=r.useRef(null),le=r.useRef(!1),L=r.useRef(!1),q=r.useCallback(()=>{if(!l)return!1;const t=o.ticketDraftService.updateDraft(l,{type:m,title:b,description:j,priority:T,includeScreenshot:!!S,includeErrorLogs:!1,screenshot:S??void 0,tenantId:D?.id,tenantSlug:D?.slug,tenantName:D?.name});return t.success&&(L.current=!1,ie(!0),setTimeout(()=>ie(!1),2e3)),t.success},[l,m,b,j,T,S,D]),Q=r.useCallback(()=>{if(l)return l;const t=o.ticketDraftService.createDraft();return ge(t.id),t.id},[l]);r.useEffect(()=>{if(le.current&&!(!m&&!b&&!j)){if(L.current=!0,!l){Q();return}return p.current&&clearTimeout(p.current),p.current=setTimeout(()=>{q()},1e3),()=>{p.current&&clearTimeout(p.current)}}},[m,b,j,T,S,l,q,Q]),r.useEffect(()=>{const t=()=>{L.current&&l&&q()};return window.addEventListener("beforeunload",t),()=>{window.removeEventListener("beforeunload",t),L.current&&l&&q(),p.current&&clearTimeout(p.current)}},[l,q]);const ke=r.useCallback(()=>{l&&o.ticketDraftService.deleteDraft(l),p.current&&(clearTimeout(p.current),p.current=null),c(-1)},[l,c]);r.useEffect(()=>{const{draft:t,selectedTenant:a}=He(H,N);if(t&&(t.type&&($(t.type),F(2)),t.title&&O(t.title),t.description&&W(t.description),t.priority&&G(t.priority),t.screenshot&&(U(t.screenshot),B(t.screenshot)),a&&Y(a)),!t){const I=["Bug","FeatureRequest","Suggestion","ApplicationRequest","Support","Question"],Z=u.get("type"),me=u.get("subject"),ue=u.get("body");Z&&I.includes(Z)&&($(Z),F(2)),me&&O(decodeURIComponent(me)),ue&&W(decodeURIComponent(ue))}const d=o.errorContextService.loadContext(),{screenshot:i,autoSelectType:E}=Oe(d);i&&!S&&(U(i),B(i),E&&!m&&($(E),G("High"))),o.errorContextService.clearContext();const k=o.browserInfoService.captureBrowserInfo();ve(k),setTimeout(()=>{le.current=!0},100)},[H]);const M=r.useCallback(t=>{if(!t.type.startsWith("image/")){f(s("tickets.create.invalidImageType","Please select a valid image file"));return}if(t.size>xe){f(s("tickets.create.imageTooLarge","Image must be less than 10MB"));return}const a=new FileReader;a.onload=d=>{const i=d.target?.result;U(i),B(i),f(null)},a.onerror=()=>{f(s("tickets.create.imageReadError","Failed to read image file"))},a.readAsDataURL(t)},[s]),Ne=r.useCallback(t=>{const a=t.target.files?.[0];a&&M(a)},[M]),we=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),V(!0)},[]),Se=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),V(!1)},[]),De=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),V(!1);const a=t.dataTransfer.files;if(a.length>0){const d=a[0];d.type.startsWith("image/")?M(d):f(s("tickets.create.invalidImageType","Please select a valid image file"))}},[M,s]),Te=r.useCallback(()=>{U(null),B(null),A.current&&(A.current.value="")},[]),Ce=r.useCallback(t=>{B(t)},[]),de=r.useCallback(t=>{if(t.type.startsWith("image/"))return!0;const a="."+t.name.split(".").pop()?.toLowerCase();return Ue.includes(a)},[]),z=r.useCallback(t=>{const a=[];for(let d=0;d<t.length;d++){const i=t[d];if(C.length+a.length>=he){f(s("tickets.create.maxAttachments",`Maximum ${he} attachments allowed`));break}if(i.size>xe){f(s("tickets.create.fileTooLarge",`File "${i.name}" is too large (max 10MB)`));continue}if(!de(i)){f(s("tickets.create.invalidFileType",`File type not allowed: ${i.name}`));continue}C.some(k=>k.name===i.name&&k.size===i.size)||a.push({id:crypto.randomUUID(),file:i,name:i.name,size:i.size,type:i.type})}a.length>0&&(ne(d=>[...d,...a]),f(null))},[C,de,s]),Ie=r.useCallback(t=>{const a=t.target.files;a&&z(a),P.current&&(P.current.value="")},[z]),Ae=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),_(!0)},[]),Pe=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),_(!1)},[]),Re=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),_(!1);const a=t.dataTransfer.files;a.length>0&&z(a)},[z]),Fe=r.useCallback(t=>{ne(a=>a.filter(d=>d.id!==t))},[]),Be=async()=>{if(!(!m||!b.trim()||!j.trim())){if(!D){R(!0);return}try{te(!0),f(null);let t=j.trim();X&&v&&(t+=`
2
2
 
3
3
  ---
4
4
  **System Information:**
5
5
  `+o.browserInfoService.formatForDescription(v));const a=v||o.browserInfoService.captureBrowserInfo(),d=o.logService.getRecentErrors().slice(0,5),i={sourceUrl:window.location.href,browser:{name:a.browser,version:a.browserVersion,language:a.language},os:{name:a.os,version:a.osVersion},device:{type:a.deviceType,screenResolution:a.screenResolution},recentErrors:d.map(I=>({message:I.message,stack:I.stack,component:I.component,timestamp:I.timestamp.toISOString()}))},E=y?{"X-Tenant-Slug":y.slug}:{},k=y?await o.api.post("/api/support/my-tickets",{title:b.trim(),description:t,type:m,priority:T,clientContext:i},{headers:E}):await o.myTicketsApi.create({title:b.trim(),description:t,type:m,priority:T,clientContext:i});S&&await We(k.id,S,y),await Ge(k.id,C,y),l&&o.ticketDraftService.deleteDraft(l),p.current&&(clearTimeout(p.current),p.current=null),L.current=!1,c(`/support/my-tickets/${k.id}?tab=submitted`)}catch(t){const a=t&&typeof t=="object"&&"message"in t?t.message:null;f(a||s("tickets.create.submitError","Failed to create ticket. Please try again."))}finally{te(!1)}}},Le=()=>e.jsxs("div",{className:"space-y-4",children:[e.jsx("h2",{className:"text-lg font-semibold mb-4",children:s("tickets.create.selectType","What type of request do you have?")}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:J.map(t=>e.jsx("button",{onClick:()=>{$(t.value),F(2)},className:`card p-4 text-left hover:shadow-md transition-shadow ${m===t.value?"ring-2 ring-[var(--color-primary-600)]":""}`,children:e.jsxs("div",{className:"flex items-start gap-4",children:[e.jsx("div",{className:"p-3 rounded-lg bg-[var(--bg-secondary)]",children:e.jsx(t.icon,{className:"w-6 h-6"})}),e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium",children:s(t.labelKey,t.label)}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:s(t.descriptionKey,t.description)})]})]})},t.value))})]}),qe=()=>e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[e.jsx("button",{onClick:()=>F(1),className:"btn btn-ghost p-2",children:e.jsx(n.ArrowLeft,{className:"w-5 h-5"})}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold",children:s(J.find(t=>t.value===m)?.labelKey||"",{defaultValue:J.find(t=>t.value===m)?.label})}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:s("tickets.create.fillDetails","Fill in the details below")})]})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-2",children:[s("tickets.form.title","Title")," ",e.jsx("span",{className:"text-[var(--error-text)]",children:"*"})]}),e.jsx("input",{type:"text",value:b,onChange:t=>O(t.target.value),placeholder:s("tickets.create.titlePlaceholder","Brief summary of your request"),className:"input w-full",maxLength:200}),e.jsxs("p",{className:"text-xs text-[var(--text-secondary)] mt-1",children:[b.length,"/200 ",s("common:text.characters","characters")]})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-2",children:[s("tickets.create.description","Description")," ",e.jsx("span",{className:"text-[var(--error-text)]",children:"*"})]}),e.jsx("textarea",{value:j,onChange:t=>W(t.target.value),placeholder:m==="Bug"?s("tickets.create.bugPlaceholder","Please describe the issue in detail. Include steps to reproduce, expected behavior, and actual behavior."):m==="FeatureRequest"?s("tickets.create.featurePlaceholder","Describe the feature you would like to see and why it would be useful."):m==="ApplicationRequest"?s("tickets.create.applicationPlaceholder","Which application do you need access to and why?"):s("tickets.create.defaultPlaceholder","Please provide as much detail as possible."),className:"input w-full h-40",maxLength:5e3}),e.jsxs("p",{className:"text-xs text-[var(--text-secondary)] mt-1",children:[j.length,"/5000 ",s("common:text.characters","characters")]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-2",children:s("tickets.create.priority","Priority")}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-2",children:$e.map(t=>e.jsxs("button",{type:"button",onClick:()=>G(t.value),className:`p-3 rounded-lg border text-center transition-colors ${T===t.value?"border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10":"border-[var(--border-color)] hover:bg-[var(--bg-hover)]"}`,children:[e.jsx("div",{className:"font-medium",children:s(t.labelKey,t.label)}),e.jsx("div",{className:"text-xs text-[var(--text-secondary)]",children:s(t.descriptionKey,t.description)})]},t.value))})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-2",children:[e.jsx(n.Image,{className:"w-4 h-4 inline mr-2"}),s("tickets.create.screenshot","Screenshot"),e.jsxs("span",{className:"text-[var(--text-secondary)] font-normal ml-2",children:["(",s("common:text.optional","optional"),")"]})]}),re?e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:s("tickets.create.screenshotUploaded","Screenshot uploaded - you can annotate it below")}),e.jsx("button",{type:"button",onClick:Te,className:"btn btn-ghost p-2 text-[var(--error-text)]",title:s("tickets.create.removeScreenshot","Remove screenshot"),children:e.jsx(n.X,{className:"w-4 h-4"})})]}),e.jsx(Ke.ScreenshotAnnotator,{screenshot:re,onAnnotatedScreenshot:Ce})]}):e.jsxs("div",{className:`border-2 border-dashed rounded-lg p-6 text-center cursor-pointer transition-colors ${ae?"border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10":"border-[var(--border-color)] hover:border-[var(--color-primary-600)] hover:bg-[var(--bg-hover)]"}`,onClick:()=>A.current?.click(),onKeyDown:t=>{(t.key==="Enter"||t.key===" ")&&(t.preventDefault(),A.current?.click())},role:"button",tabIndex:0,onDragOver:we,onDragLeave:Se,onDrop:De,children:[e.jsx(n.Upload,{className:"w-8 h-8 mx-auto mb-2 text-[var(--text-secondary)]"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:ae?s("tickets.create.dropScreenshotNow","Drop image here"):s("tickets.create.uploadScreenshot","Click or drag & drop to upload a screenshot")}),e.jsx("p",{className:"text-xs text-[var(--text-muted)] mt-1",children:s("tickets.create.uploadScreenshotHint","PNG, JPG, or GIF up to 10MB")}),e.jsx("input",{ref:A,type:"file",accept:"image/*",onChange:Ne,className:"hidden"})]})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-2",children:[e.jsx(n.Paperclip,{className:"w-4 h-4 inline mr-2"}),s("tickets.create.attachments","Attachments"),e.jsxs("span",{className:"text-[var(--text-secondary)] font-normal ml-2",children:["(",s("common:text.optional","optional"),")"]})]}),e.jsxs("div",{className:`border-2 border-dashed rounded-lg p-4 text-center cursor-pointer transition-colors ${ce?"border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10":"border-[var(--border-color)] hover:border-[var(--color-primary-600)] hover:bg-[var(--bg-hover)]"}`,onClick:()=>P.current?.click(),onKeyDown:t=>{(t.key==="Enter"||t.key===" ")&&(t.preventDefault(),P.current?.click())},role:"button",tabIndex:0,onDragOver:Ae,onDragLeave:Pe,onDrop:Re,children:[e.jsx(n.Upload,{className:"w-6 h-6 mx-auto mb-1 text-[var(--text-secondary)]"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:ce?s("tickets.create.dropFilesNow","Drop files here"):s("tickets.create.uploadAttachments","Click or drag & drop to add documents")}),e.jsx("p",{className:"text-xs text-[var(--text-muted)] mt-1",children:s("tickets.create.attachmentsHint","PDF, Word, Excel, TXT, CSV, ZIP (max 10MB each, up to 5 files)")}),e.jsx("input",{ref:P,type:"file",multiple:!0,accept:".pdf,.doc,.docx,.xls,.xlsx,.txt,.csv,.zip,.rar,.7z,image/*",onChange:Ie,className:"hidden"})]}),C.length>0&&e.jsx("div",{className:"mt-3 space-y-2",children:C.map(t=>{const a=ze(t.type);return e.jsxs("div",{className:"flex items-center justify-between p-2 rounded-lg bg-[var(--bg-secondary)]",children:[e.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[e.jsx(a,{className:"w-4 h-4 text-[var(--text-secondary)] flex-shrink-0"}),e.jsx("span",{className:"text-sm truncate",children:t.name}),e.jsxs("span",{className:"text-xs text-[var(--text-muted)] flex-shrink-0",children:["(",Me(t.size),")"]})]}),e.jsx("button",{type:"button",onClick:()=>Fe(t.id),className:"btn btn-ghost p-1 text-[var(--error-text)]",title:s("tickets.create.removeAttachment","Remove attachment"),children:e.jsx(n.X,{className:"w-4 h-4"})})]},t.id)})})]}),v&&e.jsxs("div",{className:"border border-[var(--border-color)] rounded-lg p-4",children:[e.jsxs("div",{className:"flex items-center justify-between mb-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(n.Monitor,{className:"w-4 h-4 text-[var(--text-secondary)]"}),e.jsx("span",{className:"text-sm font-medium",children:s("tickets.create.systemInfo","System Information")})]}),e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:X,onChange:t=>be(t.target.checked),className:"rounded border-[var(--border-color)]"}),e.jsx("span",{className:"text-xs text-[var(--text-secondary)]",children:s("tickets.create.includeSystemInfo","Include in ticket")})]})]}),e.jsxs("div",{className:`grid grid-cols-2 md:grid-cols-3 gap-3 text-sm ${X?"":"opacity-50"}`,children:[e.jsxs("div",{children:[e.jsxs("span",{className:"text-[var(--text-secondary)]",children:[s("tickets.create.browser","Browser"),":"]}),e.jsxs("span",{className:"ml-2 font-medium",children:[v.browser," ",v.browserVersion]})]}),e.jsxs("div",{children:[e.jsxs("span",{className:"text-[var(--text-secondary)]",children:[s("tickets.create.os","OS"),":"]}),e.jsxs("span",{className:"ml-2 font-medium",children:[v.os," ",v.osVersion]})]}),e.jsxs("div",{children:[e.jsxs("span",{className:"text-[var(--text-secondary)]",children:[s("tickets.create.device","Device"),":"]}),e.jsx("span",{className:"ml-2 font-medium",children:v.deviceType})]}),e.jsxs("div",{children:[e.jsxs("span",{className:"text-[var(--text-secondary)]",children:[s("tickets.create.screen","Screen"),":"]}),e.jsx("span",{className:"ml-2 font-medium",children:v.screenResolution})]}),e.jsxs("div",{children:[e.jsxs("span",{className:"text-[var(--text-secondary)]",children:[s("tickets.create.language","Language"),":"]}),e.jsx("span",{className:"ml-2 font-medium",children:v.language})]})]})]}),se&&e.jsxs("div",{className:"p-4 rounded-lg bg-[var(--error-bg)] text-[var(--error-text)] flex items-center gap-2",children:[e.jsx(n.AlertTriangle,{className:"w-5 h-5"}),se]}),e.jsxs("div",{className:"flex items-center justify-between pt-4 border-t border-[var(--border-color)]",children:[e.jsx("button",{onClick:()=>F(1),className:"btn btn-secondary",children:s("common:buttons.back","Back")}),e.jsxs("button",{onClick:Be,disabled:!b.trim()||!j.trim()||ee,className:"btn btn-primary",children:[ee?e.jsx(n.Loader2,{className:"w-4 h-4 animate-spin mr-2"}):e.jsx(n.Send,{className:"w-4 h-4 mr-2"}),s("tickets.create.submit","Submit Ticket")]})]})]});return e.jsxs("div",{className:"max-w-3xl mx-auto",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[e.jsx("button",{onClick:()=>c(-1),className:"btn btn-ghost p-2",children:e.jsx(n.ArrowLeft,{className:"w-5 h-5"})}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[e.jsx(n.Headset,{className:"w-6 h-6"}),s("tickets.create.title","Create New Ticket")]}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:s("tickets.create.subtitle","Submit a support request or report an issue")})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("div",{className:`flex items-center gap-1 text-xs text-[var(--success-text)] transition-opacity duration-300 ${ye?"opacity-100":"opacity-0"}`,children:[e.jsx(n.Check,{className:"w-3.5 h-3.5"}),e.jsx("span",{children:s("common:drafts.autoSaved","Draft saved")})]}),l&&e.jsx("button",{onClick:()=>oe(!0),className:"btn btn-ghost p-2 text-[var(--text-secondary)] hover:text-[var(--error-text)]",title:s("common:drafts.discard","Discard draft"),children:e.jsx(n.Trash2,{className:"w-4 h-4"})})]})]}),g?e.jsxs("div",{className:"mb-6 p-4 rounded-lg bg-[var(--info-bg)] border border-[var(--info-border)]",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-3",children:[e.jsx(n.Info,{className:"w-5 h-5 text-[var(--info-text)] flex-shrink-0"}),e.jsx("p",{className:"font-medium text-[var(--info-text)]",children:s("glpi.cannotCreateTicket","Tickets are managed by GLPI. Please create tickets directly in GLPI.")})]}),x&&e.jsxs("a",{href:x,target:"_blank",rel:"noopener noreferrer",className:"btn btn-primary inline-flex items-center gap-2",children:[e.jsx(n.ExternalLink,{className:"w-4 h-4"}),s("glpi.openGlpi")]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-4 mb-8",children:[e.jsxs("div",{className:`flex items-center gap-2 ${w>=1?"text-[var(--color-primary-600)]":"text-[var(--text-secondary)]"}`,children:[e.jsx("div",{className:`w-8 h-8 rounded-full flex items-center justify-center ${w>=1?"bg-[var(--color-primary-600)] text-white":"bg-[var(--bg-secondary)]"}`,children:"1"}),e.jsx("span",{className:"font-medium",children:s("tickets.create.stepSelectType","Select Type")})]}),e.jsx("div",{className:`flex-1 h-0.5 ${w>=2?"bg-[var(--color-primary-600)]":"bg-[var(--border-color)]"}`}),e.jsxs("div",{className:`flex items-center gap-2 ${w>=2?"text-[var(--color-primary-600)]":"text-[var(--text-secondary)]"}`,children:[e.jsx("div",{className:`w-8 h-8 rounded-full flex items-center justify-center ${w>=2?"bg-[var(--color-primary-600)] text-white":"bg-[var(--bg-secondary)]"}`,children:"2"}),e.jsx("span",{className:"font-medium",children:s("tickets.create.stepDetails","Details")})]})]}),y&&!h&&e.jsxs("div",{className:"mb-4 p-3 rounded-lg bg-[var(--info-bg)] border border-[var(--info-border)] flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2 text-sm text-[var(--info-text)]",children:[e.jsx(n.Building2,{className:"w-4 h-4"}),e.jsx("span",{children:s("support:tickets.tenantPicker.creatingFor","Creating ticket for:")}),e.jsx("span",{className:"font-semibold",children:y.name})]}),e.jsx("button",{onClick:()=>R(!0),className:"text-xs text-[var(--info-text)] underline hover:no-underline",children:s("common:actions.change","Change")})]}),e.jsxs("div",{className:"card p-6",children:[w===1&&Le(),w===2&&qe()]})]}),je&&e.jsx("div",{className:"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50 p-4",children:e.jsxs("div",{className:"card w-full max-w-md p-6",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx("div",{className:"w-10 h-10 rounded-full bg-[var(--error-bg)] flex items-center justify-center",children:e.jsx(n.Trash2,{className:"w-5 h-5 text-[var(--error-text)]"})}),e.jsx("h2",{className:"text-xl font-bold",children:s("common:drafts.discardConfirmTitle","Discard draft?")})]}),e.jsx("p",{className:"text-[var(--text-secondary)] mb-6",children:s("common:drafts.discardConfirmMessage","This draft will be permanently deleted. This action cannot be undone.")}),e.jsxs("div",{className:"flex justify-end gap-3",children:[e.jsx("button",{onClick:()=>oe(!1),className:"btn btn-secondary",children:s("common:actions.cancel","Cancel")}),e.jsx("button",{onClick:ke,className:"btn bg-[var(--error-text)] text-white hover:opacity-90",children:s("common:drafts.discard","Discard")})]})]})}),fe&&e.jsx("div",{className:"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50 p-4",children:e.jsxs("div",{className:"card w-full max-w-md p-6",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx("div",{className:"w-10 h-10 rounded-full bg-[var(--info-bg)] flex items-center justify-center",children:e.jsx(n.Building2,{className:"w-5 h-5 text-[var(--info-text)]"})}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-xl font-bold",children:s("support:tickets.tenantPicker.title","Select Workspace")}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:s("support:tickets.tenantPicker.description","Choose a workspace to create the ticket in")})]})]}),e.jsx("div",{className:"space-y-2 max-h-64 overflow-y-auto",children:N.filter(t=>t.status==="Active").map(t=>e.jsx("button",{onClick:()=>{Y(t),R(!1);const a=l||Q();a&&o.ticketDraftService.updateDraft(a,{tenantId:t.id,tenantSlug:t.slug,tenantName:t.name})},className:`w-full p-3 rounded-lg border text-left transition-colors hover:bg-[var(--bg-hover)] ${y?.id===t.id?"border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10":"border-[var(--border-color)]"}`,children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(n.Building2,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"font-medium truncate",children:t.name}),t.organisationName&&e.jsx("div",{className:"text-xs text-[var(--text-secondary)] truncate",children:t.organisationName})]}),e.jsx("span",{className:`text-xs px-2 py-0.5 rounded-full ${t.type==="Personal"?"bg-[var(--info-bg)] text-[var(--info-text)]":"bg-[var(--success-bg)] text-[var(--success-text)]"}`,children:t.type==="Personal"?s("common:tenant.personal","Personal"):s("common:tenant.business","Business")})]})},t.id))}),e.jsx("div",{className:"flex justify-end gap-3 mt-4 pt-4 border-t border-[var(--border-color)]",children:e.jsx("button",{onClick:()=>{R(!1),D||c(-1)},className:"btn btn-secondary",children:s("common:actions.cancel","Cancel")})})]})})]})}exports.UserCreateTicketPage=Xe;
6
- //# sourceMappingURL=UserCreateTicketPage-Cm1emgwR.js.map
6
+ //# sourceMappingURL=UserCreateTicketPage-B8Tvf-ag.js.map