@atlashub/smartstack 3.29.0 → 3.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (320) hide show
  1. package/dist/chunks/{AgentSkillsPage-ChykpPZx.js → AgentSkillsPage-CVq3qZoe.js} +2 -2
  2. package/dist/chunks/{AgentSkillsPage-ChykpPZx.js.map → AgentSkillsPage-CVq3qZoe.js.map} +1 -1
  3. package/dist/chunks/{AgentSkillsPage-ABpqnnyK.js → AgentSkillsPage-DJb49NMA.js} +2 -2
  4. package/dist/chunks/{AgentSkillsPage-ABpqnnyK.js.map → AgentSkillsPage-DJb49NMA.js.map} +1 -1
  5. package/dist/chunks/{AgentWorkloadPage-BltzNlXI.js → AgentWorkloadPage-D_nk3gKj.js} +2 -2
  6. package/dist/chunks/{AgentWorkloadPage-BltzNlXI.js.map → AgentWorkloadPage-D_nk3gKj.js.map} +1 -1
  7. package/dist/chunks/{AgentWorkloadPage-BI5QWJyQ.js → AgentWorkloadPage-oHEi-sFh.js} +2 -2
  8. package/dist/chunks/{AgentWorkloadPage-BI5QWJyQ.js.map → AgentWorkloadPage-oHEi-sFh.js.map} +1 -1
  9. package/dist/chunks/{ApiCatalogDetailPage-BaheZKBq.js → ApiCatalogDetailPage-Cr0q2HnB.js} +3 -3
  10. package/dist/chunks/{ApiCatalogDetailPage-BaheZKBq.js.map → ApiCatalogDetailPage-Cr0q2HnB.js.map} +1 -1
  11. package/dist/chunks/{ApiCatalogDetailPage-CsRxlHwO.js → ApiCatalogDetailPage-DX8buBkV.js} +2 -2
  12. package/dist/chunks/{ApiCatalogDetailPage-CsRxlHwO.js.map → ApiCatalogDetailPage-DX8buBkV.js.map} +1 -1
  13. package/dist/chunks/{ApiCatalogPage-CqmmHpQ4.js → ApiCatalogPage-DN7sazvI.js} +2 -2
  14. package/dist/chunks/{ApiCatalogPage-CqmmHpQ4.js.map → ApiCatalogPage-DN7sazvI.js.map} +1 -1
  15. package/dist/chunks/{ApiCatalogPage-B0yIz8-U.js → ApiCatalogPage-DqboIzZE.js} +2 -2
  16. package/dist/chunks/{ApiCatalogPage-B0yIz8-U.js.map → ApiCatalogPage-DqboIzZE.js.map} +1 -1
  17. package/dist/chunks/{ApplicationDetailPage-CngD5JSN.js → ApplicationDetailPage--9YwwS5A.js} +2 -2
  18. package/dist/chunks/{ApplicationDetailPage-CngD5JSN.js.map → ApplicationDetailPage--9YwwS5A.js.map} +1 -1
  19. package/dist/chunks/{ApplicationDetailPage-CdT6KNd7.js → ApplicationDetailPage-CCNjr64K.js} +4 -4
  20. package/dist/chunks/{ApplicationDetailPage-CdT6KNd7.js.map → ApplicationDetailPage-CCNjr64K.js.map} +1 -1
  21. package/dist/chunks/{ApplicationsDashboardPage-DHmnjk2O.js → ApplicationsDashboardPage-BSsHN3Yj.js} +2 -2
  22. package/dist/chunks/{ApplicationsDashboardPage-DHmnjk2O.js.map → ApplicationsDashboardPage-BSsHN3Yj.js.map} +1 -1
  23. package/dist/chunks/{ApplicationsDashboardPage-1V4iQ6eY.js → ApplicationsDashboardPage-Bs-Xgca4.js} +3 -3
  24. package/dist/chunks/{ApplicationsDashboardPage-1V4iQ6eY.js.map → ApplicationsDashboardPage-Bs-Xgca4.js.map} +1 -1
  25. package/dist/chunks/{ApplicationsGridPage-Bo3NDnBF.js → ApplicationsGridPage-DDysNWJ5.js} +2 -2
  26. package/dist/chunks/{ApplicationsGridPage-Bo3NDnBF.js.map → ApplicationsGridPage-DDysNWJ5.js.map} +1 -1
  27. package/dist/chunks/{ApplicationsGridPage-CiMJFlB_.js → ApplicationsGridPage-s1WEzOXS.js} +2 -2
  28. package/dist/chunks/{ApplicationsGridPage-CiMJFlB_.js.map → ApplicationsGridPage-s1WEzOXS.js.map} +1 -1
  29. package/dist/chunks/{ApplicationsListPage-L2_S23aN.js → ApplicationsListPage-B3CSMiV0.js} +2 -2
  30. package/dist/chunks/{ApplicationsListPage-L2_S23aN.js.map → ApplicationsListPage-B3CSMiV0.js.map} +1 -1
  31. package/dist/chunks/{ApplicationsListPage-De8jQ1Cm.js → ApplicationsListPage-B6ZCecIl.js} +2 -2
  32. package/dist/chunks/{ApplicationsListPage-De8jQ1Cm.js.map → ApplicationsListPage-B6ZCecIl.js.map} +1 -1
  33. package/dist/chunks/{ApplicationsPage-DBq7_Sm8.js → ApplicationsPage-BBaiBM--.js} +2 -2
  34. package/dist/chunks/{ApplicationsPage-DBq7_Sm8.js.map → ApplicationsPage-BBaiBM--.js.map} +1 -1
  35. package/dist/chunks/{ApplicationsPage-CiNI-b0R.js → ApplicationsPage-ztPwoAGt.js} +4 -4
  36. package/dist/chunks/{ApplicationsPage-CiNI-b0R.js.map → ApplicationsPage-ztPwoAGt.js.map} +1 -1
  37. package/dist/chunks/{AssignmentRulesPage-DFsO4ZES.js → AssignmentRulesPage-CK4L4rBO.js} +2 -2
  38. package/dist/chunks/{AssignmentRulesPage-DFsO4ZES.js.map → AssignmentRulesPage-CK4L4rBO.js.map} +1 -1
  39. package/dist/chunks/{AssignmentRulesPage-C8rfUsMB.js → AssignmentRulesPage-DFSVFFXr.js} +2 -2
  40. package/dist/chunks/{AssignmentRulesPage-C8rfUsMB.js.map → AssignmentRulesPage-DFSVFFXr.js.map} +1 -1
  41. package/dist/chunks/{AssignmentsPage-78C_EBsw.js → AssignmentsPage-Bp7oQD7Q.js} +2 -2
  42. package/dist/chunks/{AssignmentsPage-78C_EBsw.js.map → AssignmentsPage-Bp7oQD7Q.js.map} +1 -1
  43. package/dist/chunks/{AssignmentsPage-COCikISI.js → AssignmentsPage-JCLpyg94.js} +2 -2
  44. package/dist/chunks/{AssignmentsPage-COCikISI.js.map → AssignmentsPage-JCLpyg94.js.map} +1 -1
  45. package/dist/chunks/{AuthCallbackPage-DqT6ueVi.js → AuthCallbackPage-Bl9xlJ3h.js} +2 -2
  46. package/dist/chunks/{AuthCallbackPage-DqT6ueVi.js.map → AuthCallbackPage-Bl9xlJ3h.js.map} +1 -1
  47. package/dist/chunks/{AuthCallbackPage-BF4bkTnR.js → AuthCallbackPage-CzMHz4jy.js} +2 -2
  48. package/dist/chunks/{AuthCallbackPage-BF4bkTnR.js.map → AuthCallbackPage-CzMHz4jy.js.map} +1 -1
  49. package/dist/chunks/{ConfirmEmailPage-Bh_K5qJn.js → ConfirmEmailPage-D_8T1vqV.js} +2 -2
  50. package/dist/chunks/{ConfirmEmailPage-Bh_K5qJn.js.map → ConfirmEmailPage-D_8T1vqV.js.map} +1 -1
  51. package/dist/chunks/{ConfirmEmailPage-DJy4idrf.js → ConfirmEmailPage-M7mJgXvn.js} +2 -2
  52. package/dist/chunks/{ConfirmEmailPage-DJy4idrf.js.map → ConfirmEmailPage-M7mJgXvn.js.map} +1 -1
  53. package/dist/chunks/{CreateSupportTicketPage-pL7jbG9o.js → CreateSupportTicketPage-BNEGavlu.js} +2 -2
  54. package/dist/chunks/{CreateSupportTicketPage-pL7jbG9o.js.map → CreateSupportTicketPage-BNEGavlu.js.map} +1 -1
  55. package/dist/chunks/{CreateSupportTicketPage-AVTwXbJd.js → CreateSupportTicketPage-C2X2mfds.js} +2 -2
  56. package/dist/chunks/{CreateSupportTicketPage-AVTwXbJd.js.map → CreateSupportTicketPage-C2X2mfds.js.map} +1 -1
  57. package/dist/chunks/{DashboardPage-DdQlTLw0.js → DashboardPage-4oy2YqvT.js} +2 -2
  58. package/dist/chunks/{DashboardPage-DdQlTLw0.js.map → DashboardPage-4oy2YqvT.js.map} +1 -1
  59. package/dist/chunks/{DashboardPage-C55mIiB6.js → DashboardPage-CO-8B8EI.js} +3 -3
  60. package/dist/chunks/{DashboardPage-C55mIiB6.js.map → DashboardPage-CO-8B8EI.js.map} +1 -1
  61. package/dist/chunks/{DashboardPage-CcCnUl7s.js → DashboardPage-CPArUG-S.js} +2 -2
  62. package/dist/chunks/{DashboardPage-CcCnUl7s.js.map → DashboardPage-CPArUG-S.js.map} +1 -1
  63. package/dist/chunks/{DashboardPage-DOitDfGV.js → DashboardPage-D5MRMxEV.js} +3 -3
  64. package/dist/chunks/{DashboardPage-DOitDfGV.js.map → DashboardPage-D5MRMxEV.js.map} +1 -1
  65. package/dist/chunks/{EscalationConfigPage-DNnZftCH.js → EscalationConfigPage-CwdnfJbJ.js} +2 -2
  66. package/dist/chunks/{EscalationConfigPage-DNnZftCH.js.map → EscalationConfigPage-CwdnfJbJ.js.map} +1 -1
  67. package/dist/chunks/{EscalationConfigPage-DRr55328.js → EscalationConfigPage-DnjLFXnL.js} +2 -2
  68. package/dist/chunks/{EscalationConfigPage-DRr55328.js.map → EscalationConfigPage-DnjLFXnL.js.map} +1 -1
  69. package/dist/chunks/{ForceChangePasswordPage-1SCOPIqK.js → ForceChangePasswordPage-ZEIfyqwE.js} +2 -2
  70. package/dist/chunks/{ForceChangePasswordPage-1SCOPIqK.js.map → ForceChangePasswordPage-ZEIfyqwE.js.map} +1 -1
  71. package/dist/chunks/{ForceChangePasswordPage-DBeG_HRO.js → ForceChangePasswordPage-sh-3h_H9.js} +2 -2
  72. package/dist/chunks/{ForceChangePasswordPage-DBeG_HRO.js.map → ForceChangePasswordPage-sh-3h_H9.js.map} +1 -1
  73. package/dist/chunks/{ForgotPasswordPage-Dlb6wKfC.js → ForgotPasswordPage-B4M6-xeM.js} +2 -2
  74. package/dist/chunks/{ForgotPasswordPage-Dlb6wKfC.js.map → ForgotPasswordPage-B4M6-xeM.js.map} +1 -1
  75. package/dist/chunks/{ForgotPasswordPage-DffYfXva.js → ForgotPasswordPage-MIu-U7p0.js} +2 -2
  76. package/dist/chunks/{ForgotPasswordPage-DffYfXva.js.map → ForgotPasswordPage-MIu-U7p0.js.map} +1 -1
  77. package/dist/chunks/{GroupDetailPage-C9nRbeHI.js → GroupDetailPage-4XK3Bs_r.js} +5 -5
  78. package/dist/chunks/{GroupDetailPage-C9nRbeHI.js.map → GroupDetailPage-4XK3Bs_r.js.map} +1 -1
  79. package/dist/chunks/{GroupDetailPage-CPPUWzXf.js → GroupDetailPage-C-kvtd2T.js} +2 -2
  80. package/dist/chunks/{GroupDetailPage-CPPUWzXf.js.map → GroupDetailPage-C-kvtd2T.js.map} +1 -1
  81. package/dist/chunks/{MyAccessRequestsPage-BAX0xwJX.js → MyAccessRequestsPage-CP41FzHi.js} +2 -2
  82. package/dist/chunks/{MyAccessRequestsPage-BAX0xwJX.js.map → MyAccessRequestsPage-CP41FzHi.js.map} +1 -1
  83. package/dist/chunks/{MyAccessRequestsPage-BMY1V631.js → MyAccessRequestsPage-DzrXTrVi.js} +2 -2
  84. package/dist/chunks/{MyAccessRequestsPage-BMY1V631.js.map → MyAccessRequestsPage-DzrXTrVi.js.map} +1 -1
  85. package/dist/chunks/{MyTenantsPage-Bbn4HxN2.js → MyTenantsPage-CZRkMbh8.js} +2 -2
  86. package/dist/chunks/{MyTenantsPage-Bbn4HxN2.js.map → MyTenantsPage-CZRkMbh8.js.map} +1 -1
  87. package/dist/chunks/{MyTenantsPage-BHtp67SD.js → MyTenantsPage-V_SwYio2.js} +3 -3
  88. package/dist/chunks/{MyTenantsPage-BHtp67SD.js.map → MyTenantsPage-V_SwYio2.js.map} +1 -1
  89. package/dist/chunks/{MyTicketsPage-BvZeiTXu.js → MyTicketsPage-DOUhaLal.js} +2 -2
  90. package/dist/chunks/{MyTicketsPage-BvZeiTXu.js.map → MyTicketsPage-DOUhaLal.js.map} +1 -1
  91. package/dist/chunks/{MyTicketsPage-D9IGVofj.js → MyTicketsPage-DnvAIeyr.js} +2 -2
  92. package/dist/chunks/{MyTicketsPage-D9IGVofj.js.map → MyTicketsPage-DnvAIeyr.js.map} +1 -1
  93. package/dist/chunks/{NavigationAppsPage-DiPBCsAF.js → NavigationAppsPage-DXvpLsbt.js} +2 -2
  94. package/dist/chunks/{NavigationAppsPage-DiPBCsAF.js.map → NavigationAppsPage-DXvpLsbt.js.map} +1 -1
  95. package/dist/chunks/{NavigationAppsPage-ChtMK1yt.js → NavigationAppsPage-DfTa4jCG.js} +2 -2
  96. package/dist/chunks/{NavigationAppsPage-ChtMK1yt.js.map → NavigationAppsPage-DfTa4jCG.js.map} +1 -1
  97. package/dist/chunks/{NotificationsPage-BxCiGzHk.js → NotificationsPage-D76MdAs-.js} +2 -2
  98. package/dist/chunks/{NotificationsPage-BxCiGzHk.js.map → NotificationsPage-D76MdAs-.js.map} +1 -1
  99. package/dist/chunks/{NotificationsPage-BCnL9oPb.js → NotificationsPage-I1yCk7tk.js} +2 -2
  100. package/dist/chunks/{NotificationsPage-BCnL9oPb.js.map → NotificationsPage-I1yCk7tk.js.map} +1 -1
  101. package/dist/chunks/{OnboardingWizardPage-CV_cxq7k.js → OnboardingWizardPage-BRUzcl1A.js} +2 -2
  102. package/dist/chunks/{OnboardingWizardPage-CV_cxq7k.js.map → OnboardingWizardPage-BRUzcl1A.js.map} +1 -1
  103. package/dist/chunks/{OnboardingWizardPage-Du-tQ2ag.js → OnboardingWizardPage-DtWUPCh3.js} +2 -2
  104. package/dist/chunks/{OnboardingWizardPage-Du-tQ2ag.js.map → OnboardingWizardPage-DtWUPCh3.js.map} +1 -1
  105. package/dist/chunks/{PermissionDetailPage-C1iuWv0G.js → PermissionDetailPage-CUNKbl7t.js} +2 -2
  106. package/dist/chunks/{PermissionDetailPage-C1iuWv0G.js.map → PermissionDetailPage-CUNKbl7t.js.map} +1 -1
  107. package/dist/chunks/{PermissionDetailPage-Ds4Jt1os.js → PermissionDetailPage-DJJGbXoX.js} +2 -2
  108. package/dist/chunks/{PermissionDetailPage-Ds4Jt1os.js.map → PermissionDetailPage-DJJGbXoX.js.map} +1 -1
  109. package/dist/chunks/{PermissionsPage-BGI2nxCn.js → PermissionsPage-B8wmawPV.js} +2 -2
  110. package/dist/chunks/{PermissionsPage-BGI2nxCn.js.map → PermissionsPage-B8wmawPV.js.map} +1 -1
  111. package/dist/chunks/{PermissionsPage-sauv7ct1.js → PermissionsPage-Dbjcctuh.js} +2 -2
  112. package/dist/chunks/{PermissionsPage-sauv7ct1.js.map → PermissionsPage-Dbjcctuh.js.map} +1 -1
  113. package/dist/chunks/{PortalDashboardPage-CQWEcghD.js → PortalDashboardPage-BeNfBZmb.js} +2 -2
  114. package/dist/chunks/{PortalDashboardPage-CQWEcghD.js.map → PortalDashboardPage-BeNfBZmb.js.map} +1 -1
  115. package/dist/chunks/{PortalDashboardPage-2kCbJw9w.js → PortalDashboardPage-zii0ll57.js} +2 -2
  116. package/dist/chunks/{PortalDashboardPage-2kCbJw9w.js.map → PortalDashboardPage-zii0ll57.js.map} +1 -1
  117. package/dist/chunks/{PreferencesPage-Bu4gaDRb.js → PreferencesPage-BCpuIGzv.js} +2 -2
  118. package/dist/chunks/{PreferencesPage-Bu4gaDRb.js.map → PreferencesPage-BCpuIGzv.js.map} +1 -1
  119. package/dist/chunks/{PreferencesPage-Dbg0bEYD.js → PreferencesPage-BmvrBaAD.js} +2 -2
  120. package/dist/chunks/{PreferencesPage-Dbg0bEYD.js.map → PreferencesPage-BmvrBaAD.js.map} +1 -1
  121. package/dist/chunks/{ProfilePage-C5QS7tsh.js → ProfilePage-eowQd59_.js} +2 -2
  122. package/dist/chunks/{ProfilePage-C5QS7tsh.js.map → ProfilePage-eowQd59_.js.map} +1 -1
  123. package/dist/chunks/{ProfilePage-DfiBhOUt.js → ProfilePage-mf5wI0-n.js} +2 -2
  124. package/dist/chunks/{ProfilePage-DfiBhOUt.js.map → ProfilePage-mf5wI0-n.js.map} +1 -1
  125. package/dist/chunks/{ReferencesManagementPage-Bs0mapj8.js → ReferencesManagementPage-8UPgkVE8.js} +3 -3
  126. package/dist/chunks/{ReferencesManagementPage-Bs0mapj8.js.map → ReferencesManagementPage-8UPgkVE8.js.map} +1 -1
  127. package/dist/chunks/{ReferencesManagementPage-C0RgHbJb.js → ReferencesManagementPage-CLsaUNqA.js} +2 -2
  128. package/dist/chunks/{ReferencesManagementPage-C0RgHbJb.js.map → ReferencesManagementPage-CLsaUNqA.js.map} +1 -1
  129. package/dist/chunks/{RegisterPage-DS1chV_A.js → RegisterPage-57X-ILDb.js} +2 -2
  130. package/dist/chunks/{RegisterPage-DS1chV_A.js.map → RegisterPage-57X-ILDb.js.map} +1 -1
  131. package/dist/chunks/{RegisterPage-DoeIiJt0.js → RegisterPage-CNyHSbqs.js} +2 -2
  132. package/dist/chunks/{RegisterPage-DoeIiJt0.js.map → RegisterPage-CNyHSbqs.js.map} +1 -1
  133. package/dist/chunks/{ResetPasswordPage-3KEk3zj5.js → ResetPasswordPage-CyV8l-Zo.js} +2 -2
  134. package/dist/chunks/{ResetPasswordPage-3KEk3zj5.js.map → ResetPasswordPage-CyV8l-Zo.js.map} +1 -1
  135. package/dist/chunks/{ResetPasswordPage-C_VQSFB5.js → ResetPasswordPage-JW8-mh_k.js} +2 -2
  136. package/dist/chunks/{ResetPasswordPage-C_VQSFB5.js.map → ResetPasswordPage-JW8-mh_k.js.map} +1 -1
  137. package/dist/chunks/{ResolutionModal-S6URD--N.js → ResolutionModal-CjwE73NX.js} +2 -2
  138. package/dist/chunks/{ResolutionModal-S6URD--N.js.map → ResolutionModal-CjwE73NX.js.map} +1 -1
  139. package/dist/chunks/{ResolutionModal-BzI1x79r.js → ResolutionModal-wddG59kg.js} +2 -2
  140. package/dist/chunks/{ResolutionModal-BzI1x79r.js.map → ResolutionModal-wddG59kg.js.map} +1 -1
  141. package/dist/chunks/{RoleDetailPage-SXK9cq_3.js → RoleDetailPage-CrioVHFI.js} +3 -3
  142. package/dist/chunks/{RoleDetailPage-SXK9cq_3.js.map → RoleDetailPage-CrioVHFI.js.map} +1 -1
  143. package/dist/chunks/{RoleDetailPage-DvEEWPKr.js → RoleDetailPage-TUOGR1ow.js} +2 -2
  144. package/dist/chunks/{RoleDetailPage-DvEEWPKr.js.map → RoleDetailPage-TUOGR1ow.js.map} +1 -1
  145. package/dist/chunks/{RolesPage-B75lCugt.js → RolesPage-CAcols3D.js} +2 -2
  146. package/dist/chunks/{RolesPage-B75lCugt.js.map → RolesPage-CAcols3D.js.map} +1 -1
  147. package/dist/chunks/{RolesPage-C5gYJxAl.js → RolesPage-sJBWaNff.js} +2 -2
  148. package/dist/chunks/{RolesPage-C5gYJxAl.js.map → RolesPage-sJBWaNff.js.map} +1 -1
  149. package/dist/chunks/{SlaConfigPage-BqXHATb6.js → SlaConfigPage-BPGRloOS.js} +2 -2
  150. package/dist/chunks/{SlaConfigPage-BqXHATb6.js.map → SlaConfigPage-BPGRloOS.js.map} +1 -1
  151. package/dist/chunks/{SlaConfigPage-DZ4P1FFW.js → SlaConfigPage-D5TRn7Ir.js} +2 -2
  152. package/dist/chunks/{SlaConfigPage-DZ4P1FFW.js.map → SlaConfigPage-D5TRn7Ir.js.map} +1 -1
  153. package/dist/chunks/{SupportPermissionsPage-B4xy_pCQ.js → SupportPermissionsPage-Dc2bWTzG.js} +2 -2
  154. package/dist/chunks/{SupportPermissionsPage-B4xy_pCQ.js.map → SupportPermissionsPage-Dc2bWTzG.js.map} +1 -1
  155. package/dist/chunks/{SupportPermissionsPage-DW7KJjYK.js → SupportPermissionsPage-UXmYLrIq.js} +2 -2
  156. package/dist/chunks/{SupportPermissionsPage-DW7KJjYK.js.map → SupportPermissionsPage-UXmYLrIq.js.map} +1 -1
  157. package/dist/chunks/{TemplatesPage-DZa0PQTE.js → TemplatesPage-dmPlqqiD.js} +2 -2
  158. package/dist/chunks/{TemplatesPage-DZa0PQTE.js.map → TemplatesPage-dmPlqqiD.js.map} +1 -1
  159. package/dist/chunks/{TemplatesPage-m5-sLJ7F.js → TemplatesPage-nTY85sNA.js} +2 -2
  160. package/dist/chunks/{TemplatesPage-m5-sLJ7F.js.map → TemplatesPage-nTY85sNA.js.map} +1 -1
  161. package/dist/chunks/{TenantCard-BJQi7Oew.js → TenantCard-BUXfstRZ.js} +2 -2
  162. package/dist/chunks/{TenantCard-BJQi7Oew.js.map → TenantCard-BUXfstRZ.js.map} +1 -1
  163. package/dist/chunks/{TenantCard-CqfifMrM.js → TenantCard-BhT-31ls.js} +2 -2
  164. package/dist/chunks/{TenantCard-CqfifMrM.js.map → TenantCard-BhT-31ls.js.map} +1 -1
  165. package/dist/chunks/{TenantScopeSelector-CdiYJvuH.js → TenantScopeSelector-3_mzBLNI.js} +2 -2
  166. package/dist/chunks/{TenantScopeSelector-CdiYJvuH.js.map → TenantScopeSelector-3_mzBLNI.js.map} +1 -1
  167. package/dist/chunks/{TenantScopeSelector-Cl5DD318.js → TenantScopeSelector-B-SRDR2R.js} +2 -2
  168. package/dist/chunks/{TenantScopeSelector-Cl5DD318.js.map → TenantScopeSelector-B-SRDR2R.js.map} +1 -1
  169. package/dist/chunks/{TicketDetailPage-BOC9rHu3.js → TicketDetailPage-B4cR3rOC.js} +2 -2
  170. package/dist/chunks/{TicketDetailPage-BOC9rHu3.js.map → TicketDetailPage-B4cR3rOC.js.map} +1 -1
  171. package/dist/chunks/{TicketDetailPage-C1UuMxD8.js → TicketDetailPage-xN3wPnFL.js} +2 -2
  172. package/dist/chunks/{TicketDetailPage-C1UuMxD8.js.map → TicketDetailPage-xN3wPnFL.js.map} +1 -1
  173. package/dist/chunks/{TicketsPage-BCgHZA-m.js → TicketsPage-CkHgXSxU.js} +2 -2
  174. package/dist/chunks/{TicketsPage-BCgHZA-m.js.map → TicketsPage-CkHgXSxU.js.map} +1 -1
  175. package/dist/chunks/{TicketsPage-BjaN4Baq.js → TicketsPage-Dwi2xpMI.js} +2 -2
  176. package/dist/chunks/{TicketsPage-BjaN4Baq.js.map → TicketsPage-Dwi2xpMI.js.map} +1 -1
  177. package/dist/chunks/{UserCreateTicketPage-ChQL1mVY.js → UserCreateTicketPage-D2a3EOey.js} +3 -3
  178. package/dist/chunks/UserCreateTicketPage-D2a3EOey.js.map +1 -0
  179. package/dist/chunks/{UserCreateTicketPage-DkjsHeV7.js → UserCreateTicketPage-bcbSLglE.js} +48 -48
  180. package/dist/chunks/UserCreateTicketPage-bcbSLglE.js.map +1 -0
  181. package/dist/chunks/{UserDashboardPage-BMYrtF3o.js → UserDashboardPage-DwnDRNoW.js} +2 -2
  182. package/dist/chunks/{UserDashboardPage-BMYrtF3o.js.map → UserDashboardPage-DwnDRNoW.js.map} +1 -1
  183. package/dist/chunks/{UserDashboardPage-81-3GJAQ.js → UserDashboardPage-ZMsx8LWw.js} +2 -2
  184. package/dist/chunks/{UserDashboardPage-81-3GJAQ.js.map → UserDashboardPage-ZMsx8LWw.js.map} +1 -1
  185. package/dist/chunks/{UserDetailPage-BMW8jAWG.js → UserDetailPage-BRFowOFL.js} +2 -2
  186. package/dist/chunks/{UserDetailPage-BMW8jAWG.js.map → UserDetailPage-BRFowOFL.js.map} +1 -1
  187. package/dist/chunks/{UserDetailPage-D6oCH2eS.js → UserDetailPage-CZyV-zsg.js} +5 -5
  188. package/dist/chunks/{UserDetailPage-D6oCH2eS.js.map → UserDetailPage-CZyV-zsg.js.map} +1 -1
  189. package/dist/chunks/{UserTicketDetailPage-ZH2BDWBt.js → UserTicketDetailPage-BstGk_BP.js} +2 -2
  190. package/dist/chunks/{UserTicketDetailPage-ZH2BDWBt.js.map → UserTicketDetailPage-BstGk_BP.js.map} +1 -1
  191. package/dist/chunks/{UserTicketDetailPage-Z_myXXJ0.js → UserTicketDetailPage-DzB_pELt.js} +2 -2
  192. package/dist/chunks/{UserTicketDetailPage-Z_myXXJ0.js.map → UserTicketDetailPage-DzB_pELt.js.map} +1 -1
  193. package/dist/chunks/{UsersGroupsPage-B8Ka6uRa.js → UsersGroupsPage-BygTv_kK.js} +3 -3
  194. package/dist/chunks/{UsersGroupsPage-B8Ka6uRa.js.map → UsersGroupsPage-BygTv_kK.js.map} +1 -1
  195. package/dist/chunks/{UsersGroupsPage-xJmGib8b.js → UsersGroupsPage-DTmhzttW.js} +2 -2
  196. package/dist/chunks/{UsersGroupsPage-xJmGib8b.js.map → UsersGroupsPage-DTmhzttW.js.map} +1 -1
  197. package/dist/chunks/{UsersPage-CQ38akZ_.js → UsersPage-DcwLyMAX.js} +2 -2
  198. package/dist/chunks/{UsersPage-CQ38akZ_.js.map → UsersPage-DcwLyMAX.js.map} +1 -1
  199. package/dist/chunks/{UsersPage-Bd2-vl39.js → UsersPage-TIqSHgHj.js} +2 -2
  200. package/dist/chunks/{UsersPage-Bd2-vl39.js.map → UsersPage-TIqSHgHj.js.map} +1 -1
  201. package/dist/chunks/{accessRequestsApi-DguOx0q0.js → accessRequestsApi-3FjMFbpa.js} +2 -2
  202. package/dist/chunks/{accessRequestsApi-DguOx0q0.js.map → accessRequestsApi-3FjMFbpa.js.map} +1 -1
  203. package/dist/chunks/{accessRequestsApi-COtWo9kC.js → accessRequestsApi-B6dsJzvH.js} +2 -2
  204. package/dist/chunks/{accessRequestsApi-COtWo9kC.js.map → accessRequestsApi-B6dsJzvH.js.map} +1 -1
  205. package/dist/chunks/{aiApi-CITiWGYX.js → aiApi-9G4wG_mT.js} +2 -2
  206. package/dist/chunks/{aiApi-CITiWGYX.js.map → aiApi-9G4wG_mT.js.map} +1 -1
  207. package/dist/chunks/{aiApi-BmZsud6O.js → aiApi-DXOdsoxr.js} +2 -2
  208. package/dist/chunks/{aiApi-BmZsud6O.js.map → aiApi-DXOdsoxr.js.map} +1 -1
  209. package/dist/chunks/{applicationAnalyticsApi-BYoEJzSN.js → applicationAnalyticsApi-D0DEp9Y-.js} +2 -2
  210. package/dist/chunks/{applicationAnalyticsApi-BYoEJzSN.js.map → applicationAnalyticsApi-D0DEp9Y-.js.map} +1 -1
  211. package/dist/chunks/{applicationAnalyticsApi-D62lc6z4.js → applicationAnalyticsApi-DhOd6idI.js} +2 -2
  212. package/dist/chunks/{applicationAnalyticsApi-D62lc6z4.js.map → applicationAnalyticsApi-DhOd6idI.js.map} +1 -1
  213. package/dist/chunks/auth-Ca2Rn6on.js +2 -0
  214. package/dist/chunks/auth-Ca2Rn6on.js.map +1 -0
  215. package/dist/chunks/auth-ClNTDOqm.js +18 -0
  216. package/dist/chunks/auth-ClNTDOqm.js.map +1 -0
  217. package/dist/chunks/auth-DECnMZjF.js +18 -0
  218. package/dist/chunks/auth-DECnMZjF.js.map +1 -0
  219. package/dist/chunks/auth-DPvxdqy4.js +18 -0
  220. package/dist/chunks/auth-DPvxdqy4.js.map +1 -0
  221. package/dist/chunks/auth-HzvnTaOm.js +2 -0
  222. package/dist/chunks/auth-HzvnTaOm.js.map +1 -0
  223. package/dist/chunks/auth-M6aNTKCH.js +2 -0
  224. package/dist/chunks/auth-M6aNTKCH.js.map +1 -0
  225. package/dist/chunks/auth-UHnAu6_e.js +2 -0
  226. package/dist/chunks/auth-UHnAu6_e.js.map +1 -0
  227. package/dist/chunks/auth-YrujJY7m.js +18 -0
  228. package/dist/chunks/auth-YrujJY7m.js.map +1 -0
  229. package/dist/chunks/{groupsApi-3CR-_g5b.js → groupsApi-Db8G2lLs.js} +2 -2
  230. package/dist/chunks/{groupsApi-3CR-_g5b.js.map → groupsApi-Db8G2lLs.js.map} +1 -1
  231. package/dist/chunks/{groupsApi-BUyBgf_N.js → groupsApi-lbxNsHFv.js} +2 -2
  232. package/dist/chunks/{groupsApi-BUyBgf_N.js.map → groupsApi-lbxNsHFv.js.map} +1 -1
  233. package/dist/chunks/{index-IJR_91Yt.js → index-BI2dc1FS.js} +2 -2
  234. package/dist/chunks/{index-IJR_91Yt.js.map → index-BI2dc1FS.js.map} +1 -1
  235. package/dist/chunks/{index-DIQ6Jmmq.js → index-Bn8HzILk.js} +4 -4
  236. package/dist/chunks/{index-DIQ6Jmmq.js.map → index-Bn8HzILk.js.map} +1 -1
  237. package/dist/chunks/{index-DA5VyW0k.js → index-CN2WRyg1.js} +2249 -2264
  238. package/dist/chunks/index-CN2WRyg1.js.map +1 -0
  239. package/dist/chunks/{index-Br2wsGE8.js → index-CTGSmYvs.js} +2 -2
  240. package/dist/chunks/{index-Br2wsGE8.js.map → index-CTGSmYvs.js.map} +1 -1
  241. package/dist/chunks/index-CUICSveU.js +2 -0
  242. package/dist/chunks/index-CUICSveU.js.map +1 -0
  243. package/dist/chunks/{index-S-X8qFYW.js → index-CgtbaFf5.js} +2 -2
  244. package/dist/chunks/{index-S-X8qFYW.js.map → index-CgtbaFf5.js.map} +1 -1
  245. package/dist/chunks/{index-_g82N2nb.js → index-D0HS542b.js} +2 -2
  246. package/dist/chunks/{index-_g82N2nb.js.map → index-D0HS542b.js.map} +1 -1
  247. package/dist/chunks/{index-BIqcvvbh.js → index-DEtq-xUL.js} +9 -8
  248. package/dist/chunks/index-DEtq-xUL.js.map +1 -0
  249. package/dist/chunks/{index-BOKR3bw6.js → index-DF93KQFR.js} +2 -2
  250. package/dist/chunks/{index-BOKR3bw6.js.map → index-DF93KQFR.js.map} +1 -1
  251. package/dist/chunks/{index-CxgEV-rT.js → index-DLekpNSE.js} +2 -2
  252. package/dist/chunks/{index-CxgEV-rT.js.map → index-DLekpNSE.js.map} +1 -1
  253. package/dist/chunks/{index-DEOBhXS_.js → index-DUS-tunb.js} +2 -2
  254. package/dist/chunks/{index-DEOBhXS_.js.map → index-DUS-tunb.js.map} +1 -1
  255. package/dist/chunks/{index-BMsjMCv9.js → index-DjC1u2hI.js} +3 -3
  256. package/dist/chunks/{index-BMsjMCv9.js.map → index-DjC1u2hI.js.map} +1 -1
  257. package/dist/chunks/{index-BxHVPJ-j.js → index-DqbVFB1H.js} +2 -2
  258. package/dist/chunks/{index-BxHVPJ-j.js.map → index-DqbVFB1H.js.map} +1 -1
  259. package/dist/chunks/{index-Djy4eIbB.js → index-DwqLhQ8S.js} +2 -2
  260. package/dist/chunks/{index-Djy4eIbB.js.map → index-DwqLhQ8S.js.map} +1 -1
  261. package/dist/chunks/{index-C1w97Ejz.js → index-HsAOBno4.js} +2 -2
  262. package/dist/chunks/{index-C1w97Ejz.js.map → index-HsAOBno4.js.map} +1 -1
  263. package/dist/chunks/{index-Czk12A3G.js → index-TiWOcC0g.js} +2 -2
  264. package/dist/chunks/{index-Czk12A3G.js.map → index-TiWOcC0g.js.map} +1 -1
  265. package/dist/chunks/{index-vXiLh35n.js → index-cAikSVW0.js} +13 -13
  266. package/dist/chunks/index-cAikSVW0.js.map +1 -0
  267. package/dist/chunks/{index-CNxx56kE.js → index-xhRXN1Jq.js} +2 -2
  268. package/dist/chunks/{index-CNxx56kE.js.map → index-xhRXN1Jq.js.map} +1 -1
  269. package/dist/chunks/{tenantIconMap-COKA97Ug.js → tenantIconMap-CHeS7oLt.js} +2 -2
  270. package/dist/chunks/{tenantIconMap-COKA97Ug.js.map → tenantIconMap-CHeS7oLt.js.map} +1 -1
  271. package/dist/chunks/{tenantIconMap-BuSQUUyZ.js → tenantIconMap-__FKj6CN.js} +2 -2
  272. package/dist/chunks/{tenantIconMap-BuSQUUyZ.js.map → tenantIconMap-__FKj6CN.js.map} +1 -1
  273. package/dist/chunks/{ticketingApi-DbREwHez.js → ticketingApi-Cj239hYB.js} +2 -2
  274. package/dist/chunks/{ticketingApi-DbREwHez.js.map → ticketingApi-Cj239hYB.js.map} +1 -1
  275. package/dist/chunks/{ticketingApi-C6EbupqP.js → ticketingApi-DF4RwD_6.js} +2 -2
  276. package/dist/chunks/{ticketingApi-C6EbupqP.js.map → ticketingApi-DF4RwD_6.js.map} +1 -1
  277. package/dist/chunks/{useAccessRequests-vucIb3_w.js → useAccessRequests-CFam8zFR.js} +3 -3
  278. package/dist/chunks/{useAccessRequests-vucIb3_w.js.map → useAccessRequests-CFam8zFR.js.map} +1 -1
  279. package/dist/chunks/{useAccessRequests-C0dY6y-4.js → useAccessRequests-CViOUwyF.js} +2 -2
  280. package/dist/chunks/{useAccessRequests-C0dY6y-4.js.map → useAccessRequests-CViOUwyF.js.map} +1 -1
  281. package/dist/chunks/{useUserAccessRequests-BBcw1Rk9.js → useUserAccessRequests-B-Cs6NX1.js} +2 -2
  282. package/dist/chunks/{useUserAccessRequests-BBcw1Rk9.js.map → useUserAccessRequests-B-Cs6NX1.js.map} +1 -1
  283. package/dist/chunks/{useUserAccessRequests-Cj0nkesW.js → useUserAccessRequests-CslSQeBJ.js} +2 -2
  284. package/dist/chunks/{useUserAccessRequests-Cj0nkesW.js.map → useUserAccessRequests-CslSQeBJ.js.map} +1 -1
  285. package/dist/contexts/AuthContext.d.ts.map +1 -1
  286. package/dist/pages/LoginPage.d.ts.map +1 -1
  287. package/dist/pages/platform/administration/tenants/TenantDetailPage.d.ts.map +1 -1
  288. package/dist/pages/platform/support/UserCreateTicketPage.d.ts.map +1 -1
  289. package/dist/services/api/apiClient.d.ts.map +1 -1
  290. package/dist/services/support/ticketDraftService.d.ts.map +1 -1
  291. package/dist/smartstack.cjs +1 -1
  292. package/dist/smartstack.js +6 -6
  293. package/dist/utils/permissions.generated.d.ts +288 -0
  294. package/dist/utils/permissions.generated.d.ts.map +1 -0
  295. package/dist/utils/uuid.d.ts +6 -0
  296. package/dist/utils/uuid.d.ts.map +1 -0
  297. package/package.json +1 -1
  298. package/dist/chunks/UserCreateTicketPage-ChQL1mVY.js.map +0 -1
  299. package/dist/chunks/UserCreateTicketPage-DkjsHeV7.js.map +0 -1
  300. package/dist/chunks/auth-B-hELPDB.js +0 -2
  301. package/dist/chunks/auth-B-hELPDB.js.map +0 -1
  302. package/dist/chunks/auth-BYaMuq7D.js +0 -16
  303. package/dist/chunks/auth-BYaMuq7D.js.map +0 -1
  304. package/dist/chunks/auth-C5zpZ9k7.js +0 -2
  305. package/dist/chunks/auth-C5zpZ9k7.js.map +0 -1
  306. package/dist/chunks/auth-CDpRMVv1.js +0 -16
  307. package/dist/chunks/auth-CDpRMVv1.js.map +0 -1
  308. package/dist/chunks/auth-CyPkCta2.js +0 -2
  309. package/dist/chunks/auth-CyPkCta2.js.map +0 -1
  310. package/dist/chunks/auth-DL47kvnl.js +0 -2
  311. package/dist/chunks/auth-DL47kvnl.js.map +0 -1
  312. package/dist/chunks/auth-Diiv90i1.js +0 -16
  313. package/dist/chunks/auth-Diiv90i1.js.map +0 -1
  314. package/dist/chunks/auth-rog9MvUr.js +0 -16
  315. package/dist/chunks/auth-rog9MvUr.js.map +0 -1
  316. package/dist/chunks/index-BIqcvvbh.js.map +0 -1
  317. package/dist/chunks/index-DA5VyW0k.js.map +0 -1
  318. package/dist/chunks/index-Dht6EQW1.js +0 -2
  319. package/dist/chunks/index-Dht6EQW1.js.map +0 -1
  320. package/dist/chunks/index-vXiLh35n.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CreateSupportTicketPage-pL7jbG9o.js","sources":["../../src/hooks/useCreateSupportTicket.ts","../../src/pages/platform/support/CreateSupportTicketPage.tsx"],"sourcesContent":["import React, { useState, useCallback, useRef } from 'react';\r\nimport { api } from '@/services/api/apiClient';\r\nimport {\r\n errorContextService,\r\n type ErrorContext,\r\n} from '@/services/support/errorContextService';\r\nimport {\r\n browserInfoService,\r\n type BrowserInfo,\r\n} from '@/services/support/browserInfoService';\r\nimport {\r\n ticketDraftService,\r\n type DraftErrorContext,\r\n type DraftAttachment,\r\n} from '@/services/support/ticketDraftService';\r\nimport type {\r\n TicketType,\r\n TicketPriority,\r\n ClientContextDto,\r\n MyTicketDetailDto,\r\n} from '@/services/api/ticketApi';\r\nimport type { UserTenantDto } from '@/services/api/adminApi';\r\n\r\nconst maxFileSize = 10 * 1024 * 1024; // 10 MB\r\nexport const allowedExtensions = [\r\n '.jpg',\r\n '.jpeg',\r\n '.png',\r\n '.gif',\r\n '.pdf',\r\n '.doc',\r\n '.docx',\r\n '.xls',\r\n '.xlsx',\r\n '.txt',\r\n '.log',\r\n '.zip',\r\n];\r\n\r\ninterface UseCreateSupportTicketOptions {\r\n draftId: string | null;\r\n effectiveTenant: UserTenantDto | null;\r\n}\r\n\r\nexport interface UseCreateSupportTicketReturn {\r\n selectedType: TicketType | null;\r\n setSelectedType: React.Dispatch<React.SetStateAction<TicketType | null>>;\r\n title: string;\r\n setTitle: React.Dispatch<React.SetStateAction<string>>;\r\n description: string;\r\n setDescription: React.Dispatch<React.SetStateAction<string>>;\r\n priority: TicketPriority;\r\n setPriority: React.Dispatch<React.SetStateAction<TicketPriority>>;\r\n submitting: boolean;\r\n error: string | null;\r\n setError: React.Dispatch<React.SetStateAction<string | null>>;\r\n errorContext: ErrorContext | null;\r\n setErrorContext: React.Dispatch<React.SetStateAction<ErrorContext | null>>;\r\n includeScreenshot: boolean;\r\n setIncludeScreenshot: React.Dispatch<React.SetStateAction<boolean>>;\r\n includeErrorLogs: boolean;\r\n setIncludeErrorLogs: React.Dispatch<React.SetStateAction<boolean>>;\r\n includeBrowserInfo: boolean;\r\n setIncludeBrowserInfo: React.Dispatch<React.SetStateAction<boolean>>;\r\n annotatedScreenshot: string | null;\r\n setAnnotatedScreenshot: React.Dispatch<React.SetStateAction<string | null>>;\r\n browserInfo: BrowserInfo | null;\r\n setBrowserInfo: React.Dispatch<React.SetStateAction<BrowserInfo | null>>;\r\n pendingFiles: File[];\r\n setPendingFiles: React.Dispatch<React.SetStateAction<File[]>>;\r\n uploadingFiles: boolean;\r\n fileInputRef: React.RefObject<HTMLInputElement | null>;\r\n showDraftSaved: boolean;\r\n setShowDraftSaved: React.Dispatch<React.SetStateAction<boolean>>;\r\n saveFailed: boolean;\r\n setSaveFailed: React.Dispatch<React.SetStateAction<boolean>>;\r\n autoSaveTimerRef: React.MutableRefObject<ReturnType<typeof setTimeout> | null>;\r\n isInitialLoadCompleteRef: React.MutableRefObject<boolean>;\r\n hasUnsavedChangesRef: React.MutableRefObject<boolean>;\r\n draftAttachmentsRef: React.MutableRefObject<DraftAttachment[]>;\r\n errorContextToDraft: (context: ErrorContext) => DraftErrorContext;\r\n draftToErrorContext: (draft: DraftErrorContext) => ErrorContext;\r\n fileToAttachment: (file: File) => Promise<DraftAttachment>;\r\n attachmentToFile: (attachment: DraftAttachment) => File;\r\n filesToAttachments: (files: File[]) => Promise<DraftAttachment[]>;\r\n saveDraftNow: () => boolean;\r\n processFiles: (files: File[]) => void;\r\n removeFile: (index: number) => void;\r\n buildClientContext: () => ClientContextDto;\r\n cleanupAfterSubmit: () => void;\r\n submitTicket: () => Promise<MyTicketDetailDto | null>;\r\n}\r\n\r\nexport function useCreateSupportTicket({\r\n draftId,\r\n effectiveTenant,\r\n}: UseCreateSupportTicketOptions): UseCreateSupportTicketReturn {\r\n const [selectedType, setSelectedType] = useState<TicketType | null>(null);\r\n const [title, setTitle] = useState('');\r\n const [description, setDescription] = useState('');\r\n const [priority, setPriority] = useState<TicketPriority>('Medium');\r\n const [submitting, setSubmitting] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const [errorContext, setErrorContext] = useState<ErrorContext | null>(null);\r\n const [includeScreenshot, setIncludeScreenshot] = useState(true);\r\n const [includeErrorLogs, setIncludeErrorLogs] = useState(true);\r\n const [includeBrowserInfo, setIncludeBrowserInfo] = useState(true);\r\n const [annotatedScreenshot, setAnnotatedScreenshot] = useState<string | null>(null);\r\n const [browserInfo, setBrowserInfo] = useState<BrowserInfo | null>(null);\r\n\r\n const [pendingFiles, setPendingFiles] = useState<File[]>([]);\r\n const [uploadingFiles, setUploadingFiles] = useState(false);\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n\r\n const [showDraftSaved, setShowDraftSaved] = useState(false);\r\n const [saveFailed, setSaveFailed] = useState(false);\r\n const autoSaveTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const isInitialLoadCompleteRef = useRef(false);\r\n const hasUnsavedChangesRef = useRef(false);\r\n const draftAttachmentsRef = useRef<DraftAttachment[]>([]);\r\n\r\n const errorContextToDraft = useCallback((context: ErrorContext): DraftErrorContext => ({\r\n url: context.url,\r\n timestamp: context.timestamp.toISOString(),\r\n recentErrors: context.recentErrors.map((e) => ({\r\n ...e,\r\n timestamp: e.timestamp.toISOString(),\r\n })),\r\n browserInfo: context.browserInfo,\r\n }), []);\r\n\r\n const draftToErrorContext = useCallback((draft: DraftErrorContext): ErrorContext => ({\r\n url: draft.url,\r\n timestamp: new Date(draft.timestamp),\r\n recentErrors: draft.recentErrors.map((e) => ({\r\n ...e,\r\n timestamp: new Date(e.timestamp),\r\n })),\r\n browserInfo: draft.browserInfo,\r\n }), []);\r\n\r\n const fileToAttachment = useCallback((file: File): Promise<DraftAttachment> => {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n resolve({\r\n name: file.name,\r\n type: file.type,\r\n size: file.size,\r\n data: reader.result as string,\r\n });\r\n };\r\n reader.onerror = reject;\r\n reader.readAsDataURL(file);\r\n });\r\n }, []);\r\n\r\n const attachmentToFile = useCallback((attachment: DraftAttachment): File => {\r\n const arr = attachment.data.split(',');\r\n const mime = /:(.*?);/.exec(arr[0])?.[1] || attachment.type;\r\n const bstr = atob(arr[1]);\r\n let n = bstr.length;\r\n const u8arr = new Uint8Array(n);\r\n while (n--) {\r\n u8arr[n] = bstr.charCodeAt(n);\r\n }\r\n return new window.File([u8arr], attachment.name, { type: mime });\r\n }, []);\r\n\r\n const filesToAttachments = useCallback(\r\n async (files: File[]): Promise<DraftAttachment[]> => {\r\n return Promise.all(files.map(fileToAttachment));\r\n },\r\n [fileToAttachment]\r\n );\r\n\r\n const saveDraftNow = useCallback(() => {\r\n if (!draftId) return false;\r\n\r\n const result = ticketDraftService.updateDraft(draftId, {\r\n type: selectedType,\r\n title,\r\n description,\r\n priority,\r\n includeScreenshot,\r\n includeErrorLogs,\r\n screenshot: annotatedScreenshot || undefined,\r\n errorContext: errorContext ? errorContextToDraft(errorContext) : undefined,\r\n attachments:\r\n draftAttachmentsRef.current.length > 0\r\n ? draftAttachmentsRef.current\r\n : undefined,\r\n tenantId: effectiveTenant?.id,\r\n tenantSlug: effectiveTenant?.slug,\r\n tenantName: effectiveTenant?.name,\r\n });\r\n\r\n if (result.success) {\r\n hasUnsavedChangesRef.current = false;\r\n setShowDraftSaved(true);\r\n setSaveFailed(false);\r\n setTimeout(() => setShowDraftSaved(false), 2000);\r\n } else {\r\n setSaveFailed(true);\r\n console.error('[CreateSupportTicketPage] Failed to save draft!');\r\n }\r\n\r\n return result.success;\r\n }, [\r\n draftId,\r\n selectedType,\r\n title,\r\n description,\r\n priority,\r\n includeScreenshot,\r\n includeErrorLogs,\r\n annotatedScreenshot,\r\n errorContext,\r\n errorContextToDraft,\r\n effectiveTenant,\r\n ]);\r\n\r\n const processFiles = useCallback((files: File[]) => {\r\n const validFiles: File[] = [];\r\n const errors: string[] = [];\r\n\r\n files.forEach((file) => {\r\n const extension = '.' + file.name.split('.').pop()?.toLowerCase();\r\n if (!allowedExtensions.includes(extension)) {\r\n errors.push(`${file.name}: file type not allowed`);\r\n return;\r\n }\r\n if (file.size > maxFileSize) {\r\n errors.push(`${file.name}: file too large`);\r\n return;\r\n }\r\n validFiles.push(file);\r\n });\r\n\r\n if (errors.length > 0) {\r\n setError(errors.join('\\n'));\r\n } else {\r\n setError(null);\r\n }\r\n\r\n if (validFiles.length > 0) {\r\n setPendingFiles((prev) => [...prev, ...validFiles]);\r\n }\r\n }, []);\r\n\r\n const removeFile = useCallback((index: number) => {\r\n setPendingFiles((prev) => prev.filter((_, i) => i !== index));\r\n }, []);\r\n\r\n const buildClientContext = useCallback((): ClientContextDto => {\r\n const info = browserInfoService.captureBrowserInfo();\r\n return {\r\n sourceUrl: window.location.href,\r\n browser: {\r\n name: info.browser,\r\n version: info.browserVersion,\r\n language: info.language,\r\n },\r\n os: {\r\n name: info.os,\r\n version: info.osVersion,\r\n },\r\n device: {\r\n type: info.deviceType,\r\n screenResolution: info.screenResolution,\r\n },\r\n recentErrors: includeErrorLogs\r\n ? (errorContext?.recentErrors.slice(0, 5).map((e) => ({\r\n message: e.message,\r\n stack: e.stack,\r\n component: e.component,\r\n timestamp: e.timestamp.toISOString(),\r\n })) ?? [])\r\n : [],\r\n };\r\n }, [errorContext, includeErrorLogs]);\r\n\r\n const cleanupAfterSubmit = useCallback((): void => {\r\n if (draftId) {\r\n ticketDraftService.deleteDraft(draftId);\r\n }\r\n errorContextService.clearContext();\r\n }, [draftId]);\r\n\r\n const submitTicket = useCallback(\r\n async (): Promise<MyTicketDetailDto | null> => {\r\n if (!selectedType || !title.trim() || !description.trim()) {\r\n return null;\r\n }\r\n\r\n try {\r\n setSubmitting(true);\r\n setError(null);\r\n\r\n const clientContext = buildClientContext();\r\n\r\n const tenantHeaders = effectiveTenant\r\n ? { 'X-Tenant-Slug': effectiveTenant.slug }\r\n : {};\r\n\r\n const ticket = await api.post<MyTicketDetailDto>(\r\n '/api/support/my-tickets',\r\n {\r\n title: title.trim(),\r\n description: description.trim(),\r\n type: selectedType,\r\n priority,\r\n clientContext,\r\n },\r\n { headers: tenantHeaders }\r\n );\r\n\r\n setUploadingFiles(true);\r\n\r\n if (includeScreenshot && annotatedScreenshot) {\r\n try {\r\n const response = await fetch(annotatedScreenshot);\r\n const blob = await response.blob();\r\n const file = new (globalThis as typeof window).File([blob], 'screenshot.png', {\r\n type: 'image/png',\r\n });\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n await api.post(\r\n `/api/support/my-tickets/${ticket.id}/attachments`,\r\n formData,\r\n {\r\n headers: { 'Content-Type': 'multipart/form-data', ...tenantHeaders },\r\n }\r\n );\r\n } catch (err) {\r\n console.error('Failed to upload screenshot:', err);\r\n }\r\n }\r\n\r\n for (const file of pendingFiles) {\r\n try {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n await api.post(\r\n `/api/support/my-tickets/${ticket.id}/attachments`,\r\n formData,\r\n {\r\n headers: { 'Content-Type': 'multipart/form-data', ...tenantHeaders },\r\n }\r\n );\r\n } catch (err) {\r\n console.error('Failed to upload file:', file.name, err);\r\n }\r\n }\r\n\r\n cleanupAfterSubmit();\r\n return ticket;\r\n } catch (err) {\r\n setError('An error occurred');\r\n return null;\r\n } finally {\r\n setSubmitting(false);\r\n setUploadingFiles(false);\r\n }\r\n },\r\n [\r\n selectedType,\r\n title,\r\n description,\r\n priority,\r\n buildClientContext,\r\n effectiveTenant,\r\n includeScreenshot,\r\n annotatedScreenshot,\r\n pendingFiles,\r\n cleanupAfterSubmit,\r\n ]\r\n );\r\n\r\n return {\r\n selectedType,\r\n setSelectedType,\r\n title,\r\n setTitle,\r\n description,\r\n setDescription,\r\n priority,\r\n setPriority,\r\n submitting,\r\n error,\r\n setError,\r\n errorContext,\r\n setErrorContext,\r\n includeScreenshot,\r\n setIncludeScreenshot,\r\n includeErrorLogs,\r\n setIncludeErrorLogs,\r\n includeBrowserInfo,\r\n setIncludeBrowserInfo,\r\n annotatedScreenshot,\r\n setAnnotatedScreenshot,\r\n browserInfo,\r\n setBrowserInfo,\r\n pendingFiles,\r\n setPendingFiles,\r\n uploadingFiles,\r\n fileInputRef,\r\n showDraftSaved,\r\n setShowDraftSaved,\r\n saveFailed,\r\n setSaveFailed,\r\n autoSaveTimerRef,\r\n isInitialLoadCompleteRef,\r\n hasUnsavedChangesRef,\r\n draftAttachmentsRef,\r\n errorContextToDraft,\r\n draftToErrorContext,\r\n fileToAttachment,\r\n attachmentToFile,\r\n filesToAttachments,\r\n saveDraftNow,\r\n processFiles,\r\n removeFile,\r\n buildClientContext,\r\n cleanupAfterSubmit,\r\n submitTicket,\r\n };\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate, useSearchParams } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n ArrowLeft, Headset, Bug, Lightbulb, AppWindow, HelpCircle, MessageSquare,\r\n Loader2, AlertTriangle, Send, Camera, Monitor,\r\n Paperclip, X, FileText, Image as ImageIcon, File, Sparkles, Check, Trash2, Info, ExternalLink,\r\n Building2\r\n} from 'lucide-react';\r\nimport { type TicketType, type TicketPriority } from '@/services/api/ticketApi';\r\nimport { errorContextService } from '@/services/support/errorContextService';\r\nimport { browserInfoService } from '@/services/support/browserInfoService';\r\nimport { ScreenshotAnnotator } from '@/components/platform/support/ScreenshotAnnotator';\r\nimport { ticketDraftService } from '@/services/support/ticketDraftService';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { useTicketingProvider } from '@/hooks/useTicketingProvider';\r\nimport { useCreateSupportTicket, allowedExtensions } from '@/hooks/useCreateSupportTicket';\r\nimport type { UserTenantDto } from '@/services/api/adminApi';\r\n\r\nconst ticketTypes: { value: TicketType; labelKey: string; descriptionKey: string; icon: React.ElementType }[] = [\r\n { value: 'Bug', labelKey: 'types.Bug', descriptionKey: 'typeDescriptions.Bug', icon: Bug },\r\n { value: 'FeatureRequest', labelKey: 'types.FeatureRequest', descriptionKey: 'typeDescriptions.FeatureRequest', icon: Lightbulb },\r\n { value: 'Suggestion', labelKey: 'types.Suggestion', descriptionKey: 'typeDescriptions.Suggestion', icon: Sparkles },\r\n { value: 'ApplicationRequest', labelKey: 'types.ApplicationRequest', descriptionKey: 'typeDescriptions.ApplicationRequest', icon: AppWindow },\r\n { value: 'Support', labelKey: 'types.Support', descriptionKey: 'typeDescriptions.Support', icon: MessageSquare },\r\n { value: 'Question', labelKey: 'types.Question', descriptionKey: 'typeDescriptions.Question', icon: HelpCircle },\r\n];\r\n\r\nconst priorityOptions: { value: TicketPriority; labelKey: string; descriptionKey: string }[] = [\r\n { value: 'Low', labelKey: 'priorities.Low', descriptionKey: 'priorityDescriptions.Low' },\r\n { value: 'Medium', labelKey: 'priorities.Medium', descriptionKey: 'priorityDescriptions.Medium' },\r\n { value: 'High', labelKey: 'priorities.High', descriptionKey: 'priorityDescriptions.High' },\r\n { value: 'Critical', labelKey: 'priorities.Critical', descriptionKey: 'priorityDescriptions.Critical' },\r\n];\r\n\r\nexport function CreateSupportTicketPage(): ReactElement | null {\r\n const { t } = useTranslation(['support', 'common']);\r\n const navigate = useNavigate();\r\n const [searchParams] = useSearchParams();\r\n const { currentTenant, userTenants, isGlobalView } = useTenant();\r\n const { isGlpi, glpiBaseUrl } = useTicketingProvider();\r\n\r\n // When in global view (no tenant selected), allow user to pick a tenant for the ticket\r\n const [selectedTenantForTicket, setSelectedTenantForTicket] = useState<UserTenantDto | null>(null);\r\n const [showTenantPicker, setShowTenantPicker] = useState(false);\r\n const [showDiscardConfirm, setShowDiscardConfirm] = useState(false);\r\n\r\n // The effective tenant: either the global current tenant or the locally selected one\r\n const effectiveTenant = currentTenant ?? selectedTenantForTicket;\r\n\r\n // Show tenant picker on mount when no tenant is selected\r\n useEffect(() => {\r\n if (!currentTenant && isGlobalView && userTenants.length > 0) {\r\n setShowTenantPicker(true);\r\n }\r\n }, [currentTenant, isGlobalView, userTenants.length]);\r\n\r\n const [step, setStep] = useState(1);\r\n const [isDragging, setIsDragging] = useState(false);\r\n\r\n const draftId = searchParams.get('draft');\r\n\r\n // Use hook for form logic\r\n const {\r\n selectedType,\r\n setSelectedType,\r\n title,\r\n setTitle,\r\n description,\r\n setDescription,\r\n priority,\r\n setPriority,\r\n submitting,\r\n error,\r\n setError: _setError,\r\n errorContext,\r\n setErrorContext,\r\n includeScreenshot,\r\n setIncludeScreenshot,\r\n includeErrorLogs,\r\n setIncludeErrorLogs,\r\n includeBrowserInfo,\r\n setIncludeBrowserInfo,\r\n annotatedScreenshot,\r\n setAnnotatedScreenshot,\r\n browserInfo,\r\n setBrowserInfo,\r\n pendingFiles,\r\n setPendingFiles,\r\n uploadingFiles,\r\n fileInputRef,\r\n showDraftSaved,\r\n setShowDraftSaved: _setShowDraftSaved,\r\n saveFailed,\r\n setSaveFailed: _setSaveFailed,\r\n autoSaveTimerRef,\r\n isInitialLoadCompleteRef,\r\n hasUnsavedChangesRef,\r\n draftAttachmentsRef,\r\n errorContextToDraft: _errorContextToDraft,\r\n draftToErrorContext,\r\n fileToAttachment: _fileToAttachment,\r\n attachmentToFile,\r\n filesToAttachments,\r\n saveDraftNow,\r\n processFiles,\r\n removeFile,\r\n buildClientContext: _buildClientContext,\r\n cleanupAfterSubmit: _cleanupAfterSubmit,\r\n submitTicket,\r\n } = useCreateSupportTicket({\r\n draftId,\r\n effectiveTenant,\r\n });\r\n\r\n // Load and apply draft data\r\n const applyDraftData = (draft: ReturnType<typeof ticketDraftService.getDraft>) => {\r\n if (!draft) return { hasType: false, hasScreenshot: false, hasErrorContext: false };\r\n\r\n setTitle(draft.title);\r\n setDescription(draft.description);\r\n setPriority(draft.priority);\r\n setIncludeScreenshot(draft.includeScreenshot);\r\n setIncludeErrorLogs(draft.includeErrorLogs);\r\n\r\n if (draft.type) {\r\n setSelectedType(draft.type);\r\n setStep(2);\r\n }\r\n\r\n if (draft.screenshot) {\r\n setAnnotatedScreenshot(draft.screenshot);\r\n }\r\n\r\n if (draft.errorContext) {\r\n setErrorContext(draftToErrorContext(draft.errorContext));\r\n }\r\n\r\n if (draft.attachments?.length) {\r\n const restoredFiles = draft.attachments.map(attachmentToFile);\r\n setPendingFiles(restoredFiles);\r\n draftAttachmentsRef.current = draft.attachments;\r\n }\r\n\r\n // Restore tenant selection from draft\r\n if (draft.tenantId && draft.tenantSlug) {\r\n const matchingTenant = userTenants.find(t => t.id === draft.tenantId);\r\n if (matchingTenant) {\r\n setSelectedTenantForTicket(matchingTenant);\r\n }\r\n }\r\n\r\n return {\r\n hasType: !!draft.type,\r\n hasScreenshot: !!draft.screenshot,\r\n hasErrorContext: !!draft.errorContext,\r\n };\r\n };\r\n\r\n // Load session context (error logs and screenshot from page navigation)\r\n const applySessionContext = (draftState: ReturnType<typeof applyDraftData>) => {\r\n const sessionContext = errorContextService.loadContext();\r\n if (!sessionContext) return;\r\n\r\n if (!draftState.hasErrorContext) {\r\n setErrorContext(sessionContext);\r\n }\r\n\r\n if (!draftState.hasScreenshot && sessionContext.screenshot) {\r\n setAnnotatedScreenshot(sessionContext.screenshot);\r\n }\r\n\r\n if (sessionContext.recentErrors.length > 0 && !draftState.hasType) {\r\n setSelectedType('Bug');\r\n setPriority('High');\r\n }\r\n };\r\n\r\n // Load draft and error context on mount\r\n useEffect(() => {\r\n const draftState = draftId ? applyDraftData(ticketDraftService.getDraft(draftId)) : { hasType: false, hasScreenshot: false, hasErrorContext: false };\r\n applySessionContext(draftState);\r\n\r\n const info = browserInfoService.captureBrowserInfo();\r\n setBrowserInfo(info);\r\n\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n isInitialLoadCompleteRef.current = true;\r\n });\r\n });\r\n\r\n return () => {\r\n errorContextService.clearContext();\r\n };\r\n }, [draftId, draftToErrorContext, attachmentToFile]);\r\n\r\n // Update draftAttachmentsRef whenever pendingFiles changes\r\n useEffect(() => {\r\n if (pendingFiles.length === 0) {\r\n draftAttachmentsRef.current = [];\r\n return;\r\n }\r\n\r\n // Convert files to attachments asynchronously\r\n filesToAttachments(pendingFiles)\r\n .then((attachments) => {\r\n draftAttachmentsRef.current = attachments;\r\n })\r\n .catch((err) => {\r\n console.error(\r\n '[CreateSupportTicketPage] Failed to convert files to attachments:',\r\n err\r\n );\r\n });\r\n }, [pendingFiles, filesToAttachments]);\r\n\r\n // Debounced auto-save when data changes\r\n useEffect(() => {\r\n if (!isInitialLoadCompleteRef.current || !draftId) return;\r\n\r\n hasUnsavedChangesRef.current = true;\r\n\r\n if (autoSaveTimerRef.current) {\r\n clearTimeout(autoSaveTimerRef.current);\r\n }\r\n\r\n autoSaveTimerRef.current = setTimeout(() => {\r\n saveDraftNow();\r\n }, 1000);\r\n\r\n return () => {\r\n if (autoSaveTimerRef.current) {\r\n clearTimeout(autoSaveTimerRef.current);\r\n }\r\n };\r\n }, [\r\n selectedType,\r\n title,\r\n description,\r\n priority,\r\n includeScreenshot,\r\n includeErrorLogs,\r\n includeBrowserInfo,\r\n annotatedScreenshot,\r\n errorContext,\r\n pendingFiles,\r\n draftId,\r\n saveDraftNow,\r\n ]);\r\n\r\n // Save on unmount (when navigating away)\r\n useEffect(() => {\r\n const handleBeforeUnload = () => {\r\n if (hasUnsavedChangesRef.current && draftId) {\r\n saveDraftNow();\r\n // Don't show browser prompt, we're auto-saving\r\n }\r\n };\r\n\r\n window.addEventListener('beforeunload', handleBeforeUnload);\r\n\r\n return () => {\r\n window.removeEventListener('beforeunload', handleBeforeUnload);\r\n // Save on cleanup (component unmount / navigation)\r\n if (hasUnsavedChangesRef.current && draftId && isInitialLoadCompleteRef.current) {\r\n // Direct call since we can't use async in cleanup\r\n ticketDraftService.updateDraft(draftId, {\r\n type: selectedType,\r\n title,\r\n description,\r\n priority,\r\n includeScreenshot,\r\n includeErrorLogs,\r\n screenshot: annotatedScreenshot || undefined,\r\n errorContext: errorContext\r\n ? {\r\n url: errorContext.url,\r\n timestamp: errorContext.timestamp.toISOString(),\r\n recentErrors: errorContext.recentErrors.map((e) => ({\r\n ...e,\r\n timestamp: e.timestamp.toISOString(),\r\n })),\r\n browserInfo: errorContext.browserInfo,\r\n }\r\n : undefined,\r\n attachments:\r\n draftAttachmentsRef.current.length > 0\r\n ? draftAttachmentsRef.current\r\n : undefined,\r\n });\r\n }\r\n };\r\n }, [\r\n draftId,\r\n selectedType,\r\n title,\r\n description,\r\n priority,\r\n includeScreenshot,\r\n includeErrorLogs,\r\n annotatedScreenshot,\r\n errorContext,\r\n saveDraftNow,\r\n ]);\r\n\r\n const handleAnnotatedScreenshot = (dataUrl: string) => {\r\n setAnnotatedScreenshot(dataUrl);\r\n };\r\n\r\n // Recapture screenshot (for reset functionality)\r\n const handleRecaptureScreenshot = async () => {\r\n try {\r\n const newContext = await errorContextService.captureContext();\r\n if (newContext.screenshot) {\r\n setAnnotatedScreenshot(newContext.screenshot);\r\n // Also update error context with fresh data\r\n setErrorContext(newContext);\r\n }\r\n } catch (err) {\r\n console.error('[CreateSupportTicketPage] Error recapturing screenshot:', err);\r\n }\r\n };\r\n\r\n // Discard draft and navigate away\r\n const handleDiscardDraft = () => {\r\n if (draftId) {\r\n // Clear any pending auto-save\r\n if (autoSaveTimerRef.current) {\r\n clearTimeout(autoSaveTimerRef.current);\r\n autoSaveTimerRef.current = null;\r\n }\r\n // Delete the draft\r\n ticketDraftService.deleteDraft(draftId);\r\n }\r\n // Navigate to tickets page\r\n navigate('/support/my-tickets?tab=submitted');\r\n };\r\n\r\n const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = Array.from(e.target.files || []);\r\n processFiles(files);\r\n if (fileInputRef.current) {\r\n fileInputRef.current.value = '';\r\n }\r\n };\r\n\r\n // Drag and drop handlers\r\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n };\r\n\r\n const handleDragEnter = (e: React.DragEvent<HTMLDivElement>) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDragging(true);\r\n };\r\n\r\n const handleDragLeave = (e: React.DragEvent<HTMLDivElement>) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n // Only set isDragging to false if we're leaving the drop zone entirely\r\n const rect = e.currentTarget.getBoundingClientRect();\r\n const x = e.clientX;\r\n const y = e.clientY;\r\n if (x < rect.left || x > rect.right || y < rect.top || y > rect.bottom) {\r\n setIsDragging(false);\r\n }\r\n };\r\n\r\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDragging(false);\r\n\r\n const files = Array.from(e.dataTransfer.files);\r\n if (files.length > 0) {\r\n processFiles(files);\r\n }\r\n };\r\n\r\n const formatFileSize = (bytes: number): string => {\r\n if (bytes < 1024) return `${bytes} B`;\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\r\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\r\n };\r\n\r\n const getFileIcon = (fileName: string) => {\r\n const ext = fileName.split('.').pop()?.toLowerCase();\r\n if (['jpg', 'jpeg', 'png', 'gif'].includes(ext || '')) return ImageIcon;\r\n if (['pdf', 'doc', 'docx', 'txt'].includes(ext || '')) return FileText;\r\n return File;\r\n };\r\n\r\n const handleSubmit = async () => {\r\n if (!selectedType || !title.trim() || !description.trim()) return;\r\n\r\n if (!effectiveTenant) {\r\n // No tenant selected at all - show picker modal\r\n setShowTenantPicker(true);\r\n return;\r\n }\r\n\r\n const ticket = await submitTicket();\r\n if (ticket) {\r\n navigate(`/support/my-tickets/${ticket.id}?tab=submitted`);\r\n }\r\n };\r\n\r\n const renderTypeSelection = () => (\r\n <div className=\"space-y-4\">\r\n <h2 className=\"text-lg font-semibold mb-4\">{t('tickets.createFlow.selectType')}</h2>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n {ticketTypes.map((type) => (\r\n <button\r\n key={type.value}\r\n onClick={() => {\r\n setSelectedType(type.value);\r\n setStep(2);\r\n }}\r\n className={`card p-4 text-left hover:shadow-md transition-shadow ${\r\n selectedType === type.value ? 'ring-2 ring-[var(--color-primary-600)]' : ''\r\n }`}\r\n >\r\n <div className=\"flex items-start gap-4\">\r\n <div className=\"p-3 rounded-lg bg-[var(--bg-secondary)]\">\r\n <type.icon className=\"w-6 h-6\" />\r\n </div>\r\n <div>\r\n <h3 className=\"font-medium\">{t(`tickets.${type.labelKey}`)}</h3>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{t(`tickets.${type.descriptionKey}`, type.value)}</p>\r\n </div>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n\r\n const renderSystemInfo = () => {\r\n if (!browserInfo) return null;\r\n return (\r\n <div className=\"card p-4 bg-[var(--bg-secondary)]\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"font-medium flex items-center gap-2\">\r\n <Monitor className=\"w-5 h-5 text-[var(--color-primary-600)]\" />\r\n {t('tickets.create.systemInfo', 'System Information')}\r\n </h3>\r\n <label className=\"flex items-center gap-2 cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n checked={includeBrowserInfo}\r\n onChange={(e) => setIncludeBrowserInfo(e.target.checked)}\r\n className=\"rounded border-[var(--border-color)]\"\r\n />\r\n <span className=\"text-xs text-[var(--text-secondary)]\">\r\n {t('tickets.create.includeSystemInfo', 'Include in ticket')}\r\n </span>\r\n </label>\r\n </div>\r\n\r\n <div className={`grid grid-cols-2 md:grid-cols-3 gap-3 text-sm ${!includeBrowserInfo ? 'opacity-50' : ''}`}>\r\n <div className=\"p-3 bg-[var(--bg-primary)] rounded-lg\">\r\n <span className=\"text-xs text-[var(--text-secondary)] block\">{t('tickets.create.browser', 'Browser')}</span>\r\n <span className=\"font-medium\">{browserInfo.browser} {browserInfo.browserVersion}</span>\r\n </div>\r\n <div className=\"p-3 bg-[var(--bg-primary)] rounded-lg\">\r\n <span className=\"text-xs text-[var(--text-secondary)] block\">{t('tickets.create.os', 'OS')}</span>\r\n <span className=\"font-medium\">{browserInfo.os} {browserInfo.osVersion}</span>\r\n </div>\r\n <div className=\"p-3 bg-[var(--bg-primary)] rounded-lg\">\r\n <span className=\"text-xs text-[var(--text-secondary)] block\">{t('tickets.create.device', 'Device')}</span>\r\n <span className=\"font-medium\">{browserInfo.deviceType}</span>\r\n </div>\r\n <div className=\"p-3 bg-[var(--bg-primary)] rounded-lg\">\r\n <span className=\"text-xs text-[var(--text-secondary)] block\">{t('tickets.create.screen', 'Screen')}</span>\r\n <span className=\"font-medium\">{browserInfo.screenResolution}</span>\r\n </div>\r\n <div className=\"p-3 bg-[var(--bg-primary)] rounded-lg\">\r\n <span className=\"text-xs text-[var(--text-secondary)] block\">{t('tickets.create.language', 'Language')}</span>\r\n <span className=\"font-medium\">{browserInfo.language}</span>\r\n </div>\r\n {errorContext && (\r\n <div className=\"p-3 bg-[var(--bg-primary)] rounded-lg\">\r\n <span className=\"text-xs text-[var(--text-secondary)] block\">URL</span>\r\n <span className=\"font-medium font-mono text-xs truncate block\">{errorContext.url}</span>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const renderScreenshot = () => {\r\n if (!annotatedScreenshot) return null;\r\n return (\r\n <div className=\"card p-4\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"font-medium flex items-center gap-2\">\r\n <Camera className=\"w-5 h-5 text-[var(--color-primary-600)]\" />\r\n {t('tickets.createFlow.screenshot')}\r\n </h3>\r\n <label className=\"flex items-center gap-2 text-sm\">\r\n <input\r\n type=\"checkbox\"\r\n checked={includeScreenshot}\r\n onChange={(e) => setIncludeScreenshot(e.target.checked)}\r\n className=\"rounded border-[var(--border-color)]\"\r\n />\r\n {t('tickets.createFlow.includeScreenshot')}\r\n </label>\r\n </div>\r\n\r\n {includeScreenshot ? (\r\n <ScreenshotAnnotator\r\n screenshot={annotatedScreenshot}\r\n onAnnotatedScreenshot={handleAnnotatedScreenshot}\r\n onReset={handleRecaptureScreenshot}\r\n />\r\n ) : (\r\n <div className=\"p-8 text-center text-[var(--text-secondary)] bg-[var(--bg-secondary)] rounded-lg\">\r\n <Camera className=\"w-8 h-8 mx-auto mb-2 opacity-50\" />\r\n <p className=\"text-sm\">{t('tickets.createFlow.screenshotExcluded', 'Screenshot will not be included')}</p>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n const renderErrorLogs = () => {\r\n if (!errorContext || errorContext.recentErrors.length === 0) return null;\r\n return (\r\n <div className=\"card p-4\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"font-medium flex items-center gap-2\">\r\n <AlertTriangle className=\"w-5 h-5 text-[var(--error-text)]\" />\r\n {t('tickets.createFlow.recentErrors')} ({errorContext.recentErrors.length})\r\n </h3>\r\n <label className=\"flex items-center gap-2 text-sm\">\r\n <input\r\n type=\"checkbox\"\r\n checked={includeErrorLogs}\r\n onChange={(e) => setIncludeErrorLogs(e.target.checked)}\r\n className=\"rounded border-[var(--border-color)]\"\r\n />\r\n {t('tickets.createFlow.includeErrorLogs')}\r\n </label>\r\n </div>\r\n\r\n {includeErrorLogs ? (\r\n <div className=\"bg-[var(--bg-secondary)] rounded-lg p-4 text-sm font-mono max-h-48 overflow-y-auto space-y-2\">\r\n {errorContext.recentErrors.slice(0, 10).map((err, index) => (\r\n <div key={`error-${index}`} className=\"p-2 bg-[var(--error-bg)]/50 rounded text-[var(--error-text)]\">\r\n <div className=\"flex items-center gap-2 text-xs opacity-70 mb-1\">\r\n <span>{err.timestamp.toLocaleTimeString()}</span>\r\n {err.component && <span className=\"px-1.5 py-0.5 bg-[var(--bg-primary)] rounded\">{err.component}</span>}\r\n </div>\r\n <div className=\"break-words\">{err.message}</div>\r\n </div>\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"p-4 text-center text-[var(--text-secondary)] bg-[var(--bg-secondary)] rounded-lg\">\r\n <p className=\"text-sm\">{t('tickets.createFlow.logsExcluded', 'Error logs will not be included')}</p>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n const renderCapturedContext = () => {\r\n if (!errorContext && !browserInfo) return null;\r\n\r\n return (\r\n <div className=\"space-y-6 mb-6\">\r\n {renderSystemInfo()}\r\n {renderScreenshot()}\r\n {renderErrorLogs()}\r\n </div>\r\n );\r\n };\r\n\r\n const renderAttachmentSection = () => {\r\n return (\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">\r\n {t('tickets.createFlow.attachments')}\r\n </label>\r\n <div\r\n className={`border-2 border-dashed rounded-lg p-6 text-center transition-colors cursor-pointer ${\r\n isDragging\r\n ? 'border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-primary-600)]'\r\n }`}\r\n onClick={() => fileInputRef.current?.click()}\r\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); fileInputRef.current?.click(); } }}\r\n role=\"button\"\r\n tabIndex={0}\r\n onDragOver={handleDragOver}\r\n onDragEnter={handleDragEnter}\r\n onDragLeave={handleDragLeave}\r\n onDrop={handleDrop}\r\n >\r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n multiple\r\n onChange={handleFileSelect}\r\n accept={allowedExtensions.join(',')}\r\n className=\"hidden\"\r\n />\r\n <Paperclip className={`w-8 h-8 mx-auto mb-2 ${isDragging ? 'text-[var(--color-primary-600)]' : 'text-[var(--text-secondary)]'}`} />\r\n <p className={`text-sm ${isDragging ? 'text-[var(--color-primary-600)] font-medium' : 'text-[var(--text-secondary)]'}`}>\r\n {isDragging\r\n ? t('tickets.createFlow.dropFilesNow', 'Drop files here')\r\n : t('tickets.createFlow.dropFilesHere')}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n {t('tickets.createFlow.maxFileSize', { size: '10 MB' })}\r\n </p>\r\n </div>\r\n\r\n {pendingFiles.length > 0 && (\r\n <div className=\"mt-3 space-y-2\">\r\n {pendingFiles.map((file, index) => {\r\n const FileIcon = getFileIcon(file.name);\r\n return (\r\n <div\r\n key={`file-${file.name}-${index}`}\r\n className=\"flex items-center gap-3 p-3 bg-[var(--bg-secondary)] rounded-lg\"\r\n >\r\n <FileIcon className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium truncate\">{file.name}</p>\r\n <p className=\"text-xs text-[var(--text-secondary)]\">{formatFileSize(file.size)}</p>\r\n </div>\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n removeFile(index);\r\n }}\r\n className=\"p-1 hover:bg-[var(--bg-hover)] rounded\"\r\n >\r\n <X className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n const renderForm = () => {\r\n const currentTypeConfig = ticketTypes.find(tt => tt.value === selectedType);\r\n const CurrentTypeIcon = currentTypeConfig?.icon || Bug;\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <div className=\"flex items-center gap-4 mb-6\">\r\n <button onClick={() => setStep(1)} className=\"btn btn-ghost p-2\">\r\n <ArrowLeft className=\"w-5 h-5\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-[var(--bg-secondary)]\">\r\n <CurrentTypeIcon className=\"w-5 h-5\" />\r\n </div>\r\n <select\r\n value={selectedType || ''}\r\n onChange={(e) => setSelectedType(e.target.value as TicketType)}\r\n className=\"input text-lg font-semibold bg-transparent border-none p-0 pr-8 cursor-pointer hover:text-[var(--color-primary-600)] focus:ring-0\"\r\n >\r\n {ticketTypes.map((type) => (\r\n <option key={type.value} value={type.value}>\r\n {t(`tickets.${type.labelKey}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t('tickets.createFlow.fillDetails')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {renderCapturedContext()}\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">\r\n {t('tickets.form.title')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={title}\r\n onChange={(e) => setTitle(e.target.value)}\r\n placeholder={t('tickets.form.titlePlaceholder')}\r\n className=\"input w-full\"\r\n maxLength={200}\r\n />\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n {title.length}/200\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">\r\n {t('tickets.form.description')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <textarea\r\n value={description}\r\n onChange={(e) => setDescription(e.target.value)}\r\n placeholder={t('tickets.form.descriptionPlaceholder')}\r\n className=\"input w-full h-40\"\r\n maxLength={5000}\r\n />\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n {description.length}/5000\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">{t('tickets.form.priority')}</label>\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-2\">\r\n {priorityOptions.map((option) => (\r\n <button\r\n key={option.value}\r\n type=\"button\"\r\n onClick={() => setPriority(option.value)}\r\n className={`p-3 rounded-lg border text-center transition-colors ${\r\n priority === option.value\r\n ? 'border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10'\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <div className=\"font-medium\">{t(`tickets.${option.labelKey}`)}</div>\r\n <div className=\"text-xs text-[var(--text-secondary)]\">{t(`tickets.${option.descriptionKey}`, option.value)}</div>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {renderAttachmentSection()}\r\n\r\n {error && (\r\n <div className=\"p-4 rounded-lg bg-[var(--error-bg)] text-[var(--error-text)] flex items-center gap-2\">\r\n <AlertTriangle className=\"w-5 h-5\" />\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div className=\"flex items-center justify-between pt-4 border-t border-[var(--border-color)]\">\r\n <button onClick={() => setStep(1)} className=\"btn btn-secondary\">\r\n {t('common:actions.back')}\r\n </button>\r\n <button\r\n onClick={handleSubmit}\r\n disabled={!title.trim() || !description.trim() || submitting || uploadingFiles}\r\n className=\"btn btn-primary\"\r\n >\r\n {(submitting || uploadingFiles) ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin mr-2\" />\r\n ) : (\r\n <Send className=\"w-4 h-4 mr-2\" />\r\n )}\r\n {(() => {\r\n if (uploadingFiles) return t('tickets.createFlow.uploadingFiles');\r\n if (submitting) return t('common:actions.submitting');\r\n return t('common:actions.submit');\r\n })()}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"max-w-3xl mx-auto\">\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('create.title', 'Create Ticket') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center gap-4 mb-6 mt-6\">\r\n <button onClick={() => navigate(-1)} className=\"btn btn-ghost p-2\">\r\n <ArrowLeft className=\"w-5 h-5\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <h1 className=\"text-2xl font-bold flex items-center gap-2\">\r\n <Headset className=\"w-6 h-6\" />\r\n {t('tickets.createFlow.title')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('tickets.createFlow.subtitle')}\r\n </p>\r\n </div>\r\n {draftId && (\r\n <button\r\n onClick={() => setShowDiscardConfirm(true)}\r\n className=\"btn btn-ghost text-[var(--error-text)] hover:bg-[var(--error-bg)]\"\r\n title={t('common:drafts.discard')}\r\n >\r\n <Trash2 className=\"w-4 h-4 mr-2\" />\r\n {t('common:drafts.discard')}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {isGlpi ? (\r\n <div className=\"mb-6 p-4 rounded-lg bg-[var(--info-bg)] border border-[var(--info-border)]\">\r\n <div className=\"flex items-center gap-3 mb-3\">\r\n <Info className=\"w-5 h-5 text-[var(--info-text)] flex-shrink-0\" />\r\n <p className=\"font-medium text-[var(--info-text)]\">\r\n {t('glpi.cannotCreateTicket', 'Tickets are managed by GLPI. Please create tickets directly in GLPI.')}\r\n </p>\r\n </div>\r\n {glpiBaseUrl && (\r\n <a\r\n href={glpiBaseUrl}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"btn btn-primary inline-flex items-center gap-2\"\r\n >\r\n <ExternalLink className=\"w-4 h-4\" />\r\n {t('glpi.openGlpi')}\r\n </a>\r\n )}\r\n </div>\r\n ) : (\r\n <>\r\n <div className=\"flex items-center gap-4 mb-8\">\r\n <div className={`flex items-center gap-2 ${step >= 1 ? 'text-[var(--color-primary-600)]' : 'text-[var(--text-secondary)]'}`}>\r\n <div className={`w-8 h-8 rounded-full flex items-center justify-center ${\r\n step >= 1 ? 'bg-[var(--color-primary-600)] text-white' : 'bg-[var(--bg-secondary)]'\r\n }`}>\r\n 1\r\n </div>\r\n <span className=\"font-medium\">{t('tickets.createFlow.step1')}</span>\r\n </div>\r\n <div className={`flex-1 h-0.5 ${step >= 2 ? 'bg-[var(--color-primary-600)]' : 'bg-[var(--border-color)]'}`} />\r\n <div className={`flex items-center gap-2 ${step >= 2 ? 'text-[var(--color-primary-600)]' : 'text-[var(--text-secondary)]'}`}>\r\n <div className={`w-8 h-8 rounded-full flex items-center justify-center ${\r\n step >= 2 ? 'bg-[var(--color-primary-600)] text-white' : 'bg-[var(--bg-secondary)]'\r\n }`}>\r\n 2\r\n </div>\r\n <span className=\"font-medium\">{t('tickets.createFlow.step2')}</span>\r\n </div>\r\n\r\n {/* Draft auto-save indicator */}\r\n {saveFailed ? (\r\n <div className=\"ml-auto flex items-center gap-1.5 text-xs text-[var(--error-text)]\">\r\n <AlertTriangle className=\"w-3.5 h-3.5\" />\r\n <span>{t('common:errors.generic')}</span>\r\n </div>\r\n ) : (\r\n <div className={`ml-auto flex items-center gap-1.5 text-xs text-[var(--success-text)] transition-opacity duration-300 ${\r\n showDraftSaved ? 'opacity-100' : 'opacity-0'\r\n }`}>\r\n <Check className=\"w-3.5 h-3.5\" />\r\n <span>{t('common:drafts.autoSaved')}</span>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Tenant context indicator (shown when using locally selected tenant in global view) */}\r\n {selectedTenantForTicket && !currentTenant && (\r\n <div className=\"mb-4 p-3 rounded-lg bg-[var(--info-bg)] border border-[var(--info-border)] flex items-center justify-between\">\r\n <div className=\"flex items-center gap-2 text-sm text-[var(--info-text)]\">\r\n <Building2 className=\"w-4 h-4\" />\r\n <span>{t('support:tickets.tenantPicker.creatingFor')}</span>\r\n <span className=\"font-semibold\">{selectedTenantForTicket.name}</span>\r\n </div>\r\n <button\r\n onClick={() => setShowTenantPicker(true)}\r\n className=\"text-xs text-[var(--info-text)] underline hover:no-underline\"\r\n >\r\n {t('common:actions.change')}\r\n </button>\r\n </div>\r\n )}\r\n\r\n <div className=\"card p-6\">\r\n {step === 1 && renderTypeSelection()}\r\n {step === 2 && renderForm()}\r\n </div>\r\n\r\n {/* Tenant picker modal (shown in global view when no tenant selected) */}\r\n {showTenantPicker && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50 p-4\">\r\n <div className=\"card w-full max-w-md p-6\">\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <div className=\"w-10 h-10 rounded-full bg-[var(--info-bg)] flex items-center justify-center\">\r\n <Building2 className=\"w-5 h-5 text-[var(--info-text)]\" />\r\n </div>\r\n <div>\r\n <h2 className=\"text-xl font-bold\">{t('support:tickets.tenantPicker.title')}</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{t('support:tickets.tenantPicker.description')}</p>\r\n </div>\r\n </div>\r\n <div className=\"space-y-2 max-h-64 overflow-y-auto\">\r\n {userTenants\r\n .filter(tenant => tenant.status === 'Active')\r\n .map(tenant => (\r\n <button\r\n key={tenant.id}\r\n onClick={() => {\r\n setSelectedTenantForTicket(tenant);\r\n setShowTenantPicker(false);\r\n // Immediately persist tenant to draft\r\n if (draftId) {\r\n ticketDraftService.updateDraft(draftId, {\r\n tenantId: tenant.id,\r\n tenantSlug: tenant.slug,\r\n tenantName: tenant.name,\r\n });\r\n }\r\n }}\r\n className={`w-full p-3 rounded-lg border text-left transition-colors hover:bg-[var(--bg-hover)] ${\r\n selectedTenantForTicket?.id === tenant.id\r\n ? 'border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10'\r\n : 'border-[var(--border-color)]'\r\n }`}\r\n >\r\n <div className=\"flex items-center gap-3\">\r\n <Building2 className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"font-medium truncate\">{tenant.name}</div>\r\n {tenant.organisationName && (\r\n <div className=\"text-xs text-[var(--text-secondary)] truncate\">{tenant.organisationName}</div>\r\n )}\r\n </div>\r\n <span className={`text-xs px-2 py-0.5 rounded-full ${\r\n tenant.type === 'Personal'\r\n ? 'bg-[var(--info-bg)] text-[var(--info-text)]'\r\n : 'bg-[var(--success-bg)] text-[var(--success-text)]'\r\n }`}>\r\n {tenant.type === 'Personal' ? t('common:tenant.personal') : t('common:tenant.business')}\r\n </span>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n <div className=\"flex justify-end gap-3 mt-4 pt-4 border-t border-[var(--border-color)]\">\r\n <button\r\n onClick={() => {\r\n setShowTenantPicker(false);\r\n if (!effectiveTenant) navigate(-1);\r\n }}\r\n className=\"btn btn-secondary\"\r\n >\r\n {t('common:actions.cancel')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Discard confirmation modal */}\r\n {showDiscardConfirm && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50 p-4\">\r\n <div className=\"card w-full max-w-md p-6\">\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <div className=\"w-10 h-10 rounded-full bg-[var(--error-bg)] flex items-center justify-center\">\r\n <Trash2 className=\"w-5 h-5 text-[var(--error-text)]\" />\r\n </div>\r\n <h2 className=\"text-xl font-bold\">{t('common:drafts.discardConfirmTitle')}</h2>\r\n </div>\r\n <p className=\"text-[var(--text-secondary)] mb-6\">\r\n {t('common:drafts.discardConfirmMessage')}\r\n </p>\r\n <div className=\"flex justify-end gap-3\">\r\n <button\r\n onClick={() => setShowDiscardConfirm(false)}\r\n className=\"btn btn-secondary\"\r\n >\r\n {t('common:actions.cancel')}\r\n </button>\r\n <button\r\n onClick={() => {\r\n setShowDiscardConfirm(false);\r\n handleDiscardDraft();\r\n }}\r\n className=\"btn bg-[var(--error-bg)] text-[var(--error-text)] hover:opacity-90\"\r\n >\r\n <Trash2 className=\"w-4 h-4 mr-2\" />\r\n {t('common:drafts.discardConfirm')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["maxFileSize","allowedExtensions","useCreateSupportTicket","draftId","effectiveTenant","selectedType","setSelectedType","useState","title","setTitle","description","setDescription","priority","setPriority","submitting","setSubmitting","error","setError","errorContext","setErrorContext","includeScreenshot","setIncludeScreenshot","includeErrorLogs","setIncludeErrorLogs","includeBrowserInfo","setIncludeBrowserInfo","annotatedScreenshot","setAnnotatedScreenshot","browserInfo","setBrowserInfo","pendingFiles","setPendingFiles","uploadingFiles","setUploadingFiles","fileInputRef","useRef","showDraftSaved","setShowDraftSaved","saveFailed","setSaveFailed","autoSaveTimerRef","isInitialLoadCompleteRef","hasUnsavedChangesRef","draftAttachmentsRef","errorContextToDraft","useCallback","context","e","draftToErrorContext","draft","fileToAttachment","file","resolve","reject","reader","attachmentToFile","attachment","arr","mime","bstr","n","u8arr","filesToAttachments","files","saveDraftNow","result","ticketDraftService","processFiles","validFiles","errors","extension","prev","removeFile","index","_","i","buildClientContext","info","browserInfoService","cleanupAfterSubmit","errorContextService","submitTicket","clientContext","tenantHeaders","ticket","api","blob","formData","err","ticketTypes","Bug","Lightbulb","Sparkles","AppWindow","MessageSquare","HelpCircle","priorityOptions","CreateSupportTicketPage","t","useTranslation","navigate","useNavigate","searchParams","useSearchParams","currentTenant","userTenants","isGlobalView","useTenant","isGlpi","glpiBaseUrl","useTicketingProvider","selectedTenantForTicket","setSelectedTenantForTicket","showTenantPicker","setShowTenantPicker","showDiscardConfirm","setShowDiscardConfirm","useEffect","step","setStep","isDragging","setIsDragging","applyDraftData","restoredFiles","matchingTenant","applySessionContext","draftState","sessionContext","attachments","handleBeforeUnload","handleAnnotatedScreenshot","dataUrl","handleRecaptureScreenshot","newContext","handleDiscardDraft","handleFileSelect","handleDragOver","handleDragEnter","handleDragLeave","rect","x","y","handleDrop","formatFileSize","bytes","getFileIcon","fileName","ext","ImageIcon","FileText","File","handleSubmit","renderTypeSelection","jsxs","jsx","type","renderSystemInfo","Monitor","renderScreenshot","Camera","ScreenshotAnnotator","renderErrorLogs","AlertTriangle","renderCapturedContext","renderAttachmentSection","Paperclip","FileIcon","X","renderForm","CurrentTypeIcon","tt","ArrowLeft","option","Loader2","Send","Breadcrumb","Headset","Trash2","Info","ExternalLink","Fragment","Check","Building2","tenant"],"mappings":"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"}
1
+ {"version":3,"file":"CreateSupportTicketPage-BNEGavlu.js","sources":["../../src/hooks/useCreateSupportTicket.ts","../../src/pages/platform/support/CreateSupportTicketPage.tsx"],"sourcesContent":["import React, { useState, useCallback, useRef } from 'react';\r\nimport { api } from '@/services/api/apiClient';\r\nimport {\r\n errorContextService,\r\n type ErrorContext,\r\n} from '@/services/support/errorContextService';\r\nimport {\r\n browserInfoService,\r\n type BrowserInfo,\r\n} from '@/services/support/browserInfoService';\r\nimport {\r\n ticketDraftService,\r\n type DraftErrorContext,\r\n type DraftAttachment,\r\n} from '@/services/support/ticketDraftService';\r\nimport type {\r\n TicketType,\r\n TicketPriority,\r\n ClientContextDto,\r\n MyTicketDetailDto,\r\n} from '@/services/api/ticketApi';\r\nimport type { UserTenantDto } from '@/services/api/adminApi';\r\n\r\nconst maxFileSize = 10 * 1024 * 1024; // 10 MB\r\nexport const allowedExtensions = [\r\n '.jpg',\r\n '.jpeg',\r\n '.png',\r\n '.gif',\r\n '.pdf',\r\n '.doc',\r\n '.docx',\r\n '.xls',\r\n '.xlsx',\r\n '.txt',\r\n '.log',\r\n '.zip',\r\n];\r\n\r\ninterface UseCreateSupportTicketOptions {\r\n draftId: string | null;\r\n effectiveTenant: UserTenantDto | null;\r\n}\r\n\r\nexport interface UseCreateSupportTicketReturn {\r\n selectedType: TicketType | null;\r\n setSelectedType: React.Dispatch<React.SetStateAction<TicketType | null>>;\r\n title: string;\r\n setTitle: React.Dispatch<React.SetStateAction<string>>;\r\n description: string;\r\n setDescription: React.Dispatch<React.SetStateAction<string>>;\r\n priority: TicketPriority;\r\n setPriority: React.Dispatch<React.SetStateAction<TicketPriority>>;\r\n submitting: boolean;\r\n error: string | null;\r\n setError: React.Dispatch<React.SetStateAction<string | null>>;\r\n errorContext: ErrorContext | null;\r\n setErrorContext: React.Dispatch<React.SetStateAction<ErrorContext | null>>;\r\n includeScreenshot: boolean;\r\n setIncludeScreenshot: React.Dispatch<React.SetStateAction<boolean>>;\r\n includeErrorLogs: boolean;\r\n setIncludeErrorLogs: React.Dispatch<React.SetStateAction<boolean>>;\r\n includeBrowserInfo: boolean;\r\n setIncludeBrowserInfo: React.Dispatch<React.SetStateAction<boolean>>;\r\n annotatedScreenshot: string | null;\r\n setAnnotatedScreenshot: React.Dispatch<React.SetStateAction<string | null>>;\r\n browserInfo: BrowserInfo | null;\r\n setBrowserInfo: React.Dispatch<React.SetStateAction<BrowserInfo | null>>;\r\n pendingFiles: File[];\r\n setPendingFiles: React.Dispatch<React.SetStateAction<File[]>>;\r\n uploadingFiles: boolean;\r\n fileInputRef: React.RefObject<HTMLInputElement | null>;\r\n showDraftSaved: boolean;\r\n setShowDraftSaved: React.Dispatch<React.SetStateAction<boolean>>;\r\n saveFailed: boolean;\r\n setSaveFailed: React.Dispatch<React.SetStateAction<boolean>>;\r\n autoSaveTimerRef: React.MutableRefObject<ReturnType<typeof setTimeout> | null>;\r\n isInitialLoadCompleteRef: React.MutableRefObject<boolean>;\r\n hasUnsavedChangesRef: React.MutableRefObject<boolean>;\r\n draftAttachmentsRef: React.MutableRefObject<DraftAttachment[]>;\r\n errorContextToDraft: (context: ErrorContext) => DraftErrorContext;\r\n draftToErrorContext: (draft: DraftErrorContext) => ErrorContext;\r\n fileToAttachment: (file: File) => Promise<DraftAttachment>;\r\n attachmentToFile: (attachment: DraftAttachment) => File;\r\n filesToAttachments: (files: File[]) => Promise<DraftAttachment[]>;\r\n saveDraftNow: () => boolean;\r\n processFiles: (files: File[]) => void;\r\n removeFile: (index: number) => void;\r\n buildClientContext: () => ClientContextDto;\r\n cleanupAfterSubmit: () => void;\r\n submitTicket: () => Promise<MyTicketDetailDto | null>;\r\n}\r\n\r\nexport function useCreateSupportTicket({\r\n draftId,\r\n effectiveTenant,\r\n}: UseCreateSupportTicketOptions): UseCreateSupportTicketReturn {\r\n const [selectedType, setSelectedType] = useState<TicketType | null>(null);\r\n const [title, setTitle] = useState('');\r\n const [description, setDescription] = useState('');\r\n const [priority, setPriority] = useState<TicketPriority>('Medium');\r\n const [submitting, setSubmitting] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const [errorContext, setErrorContext] = useState<ErrorContext | null>(null);\r\n const [includeScreenshot, setIncludeScreenshot] = useState(true);\r\n const [includeErrorLogs, setIncludeErrorLogs] = useState(true);\r\n const [includeBrowserInfo, setIncludeBrowserInfo] = useState(true);\r\n const [annotatedScreenshot, setAnnotatedScreenshot] = useState<string | null>(null);\r\n const [browserInfo, setBrowserInfo] = useState<BrowserInfo | null>(null);\r\n\r\n const [pendingFiles, setPendingFiles] = useState<File[]>([]);\r\n const [uploadingFiles, setUploadingFiles] = useState(false);\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n\r\n const [showDraftSaved, setShowDraftSaved] = useState(false);\r\n const [saveFailed, setSaveFailed] = useState(false);\r\n const autoSaveTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const isInitialLoadCompleteRef = useRef(false);\r\n const hasUnsavedChangesRef = useRef(false);\r\n const draftAttachmentsRef = useRef<DraftAttachment[]>([]);\r\n\r\n const errorContextToDraft = useCallback((context: ErrorContext): DraftErrorContext => ({\r\n url: context.url,\r\n timestamp: context.timestamp.toISOString(),\r\n recentErrors: context.recentErrors.map((e) => ({\r\n ...e,\r\n timestamp: e.timestamp.toISOString(),\r\n })),\r\n browserInfo: context.browserInfo,\r\n }), []);\r\n\r\n const draftToErrorContext = useCallback((draft: DraftErrorContext): ErrorContext => ({\r\n url: draft.url,\r\n timestamp: new Date(draft.timestamp),\r\n recentErrors: draft.recentErrors.map((e) => ({\r\n ...e,\r\n timestamp: new Date(e.timestamp),\r\n })),\r\n browserInfo: draft.browserInfo,\r\n }), []);\r\n\r\n const fileToAttachment = useCallback((file: File): Promise<DraftAttachment> => {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n resolve({\r\n name: file.name,\r\n type: file.type,\r\n size: file.size,\r\n data: reader.result as string,\r\n });\r\n };\r\n reader.onerror = reject;\r\n reader.readAsDataURL(file);\r\n });\r\n }, []);\r\n\r\n const attachmentToFile = useCallback((attachment: DraftAttachment): File => {\r\n const arr = attachment.data.split(',');\r\n const mime = /:(.*?);/.exec(arr[0])?.[1] || attachment.type;\r\n const bstr = atob(arr[1]);\r\n let n = bstr.length;\r\n const u8arr = new Uint8Array(n);\r\n while (n--) {\r\n u8arr[n] = bstr.charCodeAt(n);\r\n }\r\n return new window.File([u8arr], attachment.name, { type: mime });\r\n }, []);\r\n\r\n const filesToAttachments = useCallback(\r\n async (files: File[]): Promise<DraftAttachment[]> => {\r\n return Promise.all(files.map(fileToAttachment));\r\n },\r\n [fileToAttachment]\r\n );\r\n\r\n const saveDraftNow = useCallback(() => {\r\n if (!draftId) return false;\r\n\r\n const result = ticketDraftService.updateDraft(draftId, {\r\n type: selectedType,\r\n title,\r\n description,\r\n priority,\r\n includeScreenshot,\r\n includeErrorLogs,\r\n screenshot: annotatedScreenshot || undefined,\r\n errorContext: errorContext ? errorContextToDraft(errorContext) : undefined,\r\n attachments:\r\n draftAttachmentsRef.current.length > 0\r\n ? draftAttachmentsRef.current\r\n : undefined,\r\n tenantId: effectiveTenant?.id,\r\n tenantSlug: effectiveTenant?.slug,\r\n tenantName: effectiveTenant?.name,\r\n });\r\n\r\n if (result.success) {\r\n hasUnsavedChangesRef.current = false;\r\n setShowDraftSaved(true);\r\n setSaveFailed(false);\r\n setTimeout(() => setShowDraftSaved(false), 2000);\r\n } else {\r\n setSaveFailed(true);\r\n console.error('[CreateSupportTicketPage] Failed to save draft!');\r\n }\r\n\r\n return result.success;\r\n }, [\r\n draftId,\r\n selectedType,\r\n title,\r\n description,\r\n priority,\r\n includeScreenshot,\r\n includeErrorLogs,\r\n annotatedScreenshot,\r\n errorContext,\r\n errorContextToDraft,\r\n effectiveTenant,\r\n ]);\r\n\r\n const processFiles = useCallback((files: File[]) => {\r\n const validFiles: File[] = [];\r\n const errors: string[] = [];\r\n\r\n files.forEach((file) => {\r\n const extension = '.' + file.name.split('.').pop()?.toLowerCase();\r\n if (!allowedExtensions.includes(extension)) {\r\n errors.push(`${file.name}: file type not allowed`);\r\n return;\r\n }\r\n if (file.size > maxFileSize) {\r\n errors.push(`${file.name}: file too large`);\r\n return;\r\n }\r\n validFiles.push(file);\r\n });\r\n\r\n if (errors.length > 0) {\r\n setError(errors.join('\\n'));\r\n } else {\r\n setError(null);\r\n }\r\n\r\n if (validFiles.length > 0) {\r\n setPendingFiles((prev) => [...prev, ...validFiles]);\r\n }\r\n }, []);\r\n\r\n const removeFile = useCallback((index: number) => {\r\n setPendingFiles((prev) => prev.filter((_, i) => i !== index));\r\n }, []);\r\n\r\n const buildClientContext = useCallback((): ClientContextDto => {\r\n const info = browserInfoService.captureBrowserInfo();\r\n return {\r\n sourceUrl: window.location.href,\r\n browser: {\r\n name: info.browser,\r\n version: info.browserVersion,\r\n language: info.language,\r\n },\r\n os: {\r\n name: info.os,\r\n version: info.osVersion,\r\n },\r\n device: {\r\n type: info.deviceType,\r\n screenResolution: info.screenResolution,\r\n },\r\n recentErrors: includeErrorLogs\r\n ? (errorContext?.recentErrors.slice(0, 5).map((e) => ({\r\n message: e.message,\r\n stack: e.stack,\r\n component: e.component,\r\n timestamp: e.timestamp.toISOString(),\r\n })) ?? [])\r\n : [],\r\n };\r\n }, [errorContext, includeErrorLogs]);\r\n\r\n const cleanupAfterSubmit = useCallback((): void => {\r\n if (draftId) {\r\n ticketDraftService.deleteDraft(draftId);\r\n }\r\n errorContextService.clearContext();\r\n }, [draftId]);\r\n\r\n const submitTicket = useCallback(\r\n async (): Promise<MyTicketDetailDto | null> => {\r\n if (!selectedType || !title.trim() || !description.trim()) {\r\n return null;\r\n }\r\n\r\n try {\r\n setSubmitting(true);\r\n setError(null);\r\n\r\n const clientContext = buildClientContext();\r\n\r\n const tenantHeaders = effectiveTenant\r\n ? { 'X-Tenant-Slug': effectiveTenant.slug }\r\n : {};\r\n\r\n const ticket = await api.post<MyTicketDetailDto>(\r\n '/api/support/my-tickets',\r\n {\r\n title: title.trim(),\r\n description: description.trim(),\r\n type: selectedType,\r\n priority,\r\n clientContext,\r\n },\r\n { headers: tenantHeaders }\r\n );\r\n\r\n setUploadingFiles(true);\r\n\r\n if (includeScreenshot && annotatedScreenshot) {\r\n try {\r\n const response = await fetch(annotatedScreenshot);\r\n const blob = await response.blob();\r\n const file = new (globalThis as typeof window).File([blob], 'screenshot.png', {\r\n type: 'image/png',\r\n });\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n await api.post(\r\n `/api/support/my-tickets/${ticket.id}/attachments`,\r\n formData,\r\n {\r\n headers: { 'Content-Type': 'multipart/form-data', ...tenantHeaders },\r\n }\r\n );\r\n } catch (err) {\r\n console.error('Failed to upload screenshot:', err);\r\n }\r\n }\r\n\r\n for (const file of pendingFiles) {\r\n try {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n await api.post(\r\n `/api/support/my-tickets/${ticket.id}/attachments`,\r\n formData,\r\n {\r\n headers: { 'Content-Type': 'multipart/form-data', ...tenantHeaders },\r\n }\r\n );\r\n } catch (err) {\r\n console.error('Failed to upload file:', file.name, err);\r\n }\r\n }\r\n\r\n cleanupAfterSubmit();\r\n return ticket;\r\n } catch (err) {\r\n setError('An error occurred');\r\n return null;\r\n } finally {\r\n setSubmitting(false);\r\n setUploadingFiles(false);\r\n }\r\n },\r\n [\r\n selectedType,\r\n title,\r\n description,\r\n priority,\r\n buildClientContext,\r\n effectiveTenant,\r\n includeScreenshot,\r\n annotatedScreenshot,\r\n pendingFiles,\r\n cleanupAfterSubmit,\r\n ]\r\n );\r\n\r\n return {\r\n selectedType,\r\n setSelectedType,\r\n title,\r\n setTitle,\r\n description,\r\n setDescription,\r\n priority,\r\n setPriority,\r\n submitting,\r\n error,\r\n setError,\r\n errorContext,\r\n setErrorContext,\r\n includeScreenshot,\r\n setIncludeScreenshot,\r\n includeErrorLogs,\r\n setIncludeErrorLogs,\r\n includeBrowserInfo,\r\n setIncludeBrowserInfo,\r\n annotatedScreenshot,\r\n setAnnotatedScreenshot,\r\n browserInfo,\r\n setBrowserInfo,\r\n pendingFiles,\r\n setPendingFiles,\r\n uploadingFiles,\r\n fileInputRef,\r\n showDraftSaved,\r\n setShowDraftSaved,\r\n saveFailed,\r\n setSaveFailed,\r\n autoSaveTimerRef,\r\n isInitialLoadCompleteRef,\r\n hasUnsavedChangesRef,\r\n draftAttachmentsRef,\r\n errorContextToDraft,\r\n draftToErrorContext,\r\n fileToAttachment,\r\n attachmentToFile,\r\n filesToAttachments,\r\n saveDraftNow,\r\n processFiles,\r\n removeFile,\r\n buildClientContext,\r\n cleanupAfterSubmit,\r\n submitTicket,\r\n };\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate, useSearchParams } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n ArrowLeft, Headset, Bug, Lightbulb, AppWindow, HelpCircle, MessageSquare,\r\n Loader2, AlertTriangle, Send, Camera, Monitor,\r\n Paperclip, X, FileText, Image as ImageIcon, File, Sparkles, Check, Trash2, Info, ExternalLink,\r\n Building2\r\n} from 'lucide-react';\r\nimport { type TicketType, type TicketPriority } from '@/services/api/ticketApi';\r\nimport { errorContextService } from '@/services/support/errorContextService';\r\nimport { browserInfoService } from '@/services/support/browserInfoService';\r\nimport { ScreenshotAnnotator } from '@/components/platform/support/ScreenshotAnnotator';\r\nimport { ticketDraftService } from '@/services/support/ticketDraftService';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { useTicketingProvider } from '@/hooks/useTicketingProvider';\r\nimport { useCreateSupportTicket, allowedExtensions } from '@/hooks/useCreateSupportTicket';\r\nimport type { UserTenantDto } from '@/services/api/adminApi';\r\n\r\nconst ticketTypes: { value: TicketType; labelKey: string; descriptionKey: string; icon: React.ElementType }[] = [\r\n { value: 'Bug', labelKey: 'types.Bug', descriptionKey: 'typeDescriptions.Bug', icon: Bug },\r\n { value: 'FeatureRequest', labelKey: 'types.FeatureRequest', descriptionKey: 'typeDescriptions.FeatureRequest', icon: Lightbulb },\r\n { value: 'Suggestion', labelKey: 'types.Suggestion', descriptionKey: 'typeDescriptions.Suggestion', icon: Sparkles },\r\n { value: 'ApplicationRequest', labelKey: 'types.ApplicationRequest', descriptionKey: 'typeDescriptions.ApplicationRequest', icon: AppWindow },\r\n { value: 'Support', labelKey: 'types.Support', descriptionKey: 'typeDescriptions.Support', icon: MessageSquare },\r\n { value: 'Question', labelKey: 'types.Question', descriptionKey: 'typeDescriptions.Question', icon: HelpCircle },\r\n];\r\n\r\nconst priorityOptions: { value: TicketPriority; labelKey: string; descriptionKey: string }[] = [\r\n { value: 'Low', labelKey: 'priorities.Low', descriptionKey: 'priorityDescriptions.Low' },\r\n { value: 'Medium', labelKey: 'priorities.Medium', descriptionKey: 'priorityDescriptions.Medium' },\r\n { value: 'High', labelKey: 'priorities.High', descriptionKey: 'priorityDescriptions.High' },\r\n { value: 'Critical', labelKey: 'priorities.Critical', descriptionKey: 'priorityDescriptions.Critical' },\r\n];\r\n\r\nexport function CreateSupportTicketPage(): ReactElement | null {\r\n const { t } = useTranslation(['support', 'common']);\r\n const navigate = useNavigate();\r\n const [searchParams] = useSearchParams();\r\n const { currentTenant, userTenants, isGlobalView } = useTenant();\r\n const { isGlpi, glpiBaseUrl } = useTicketingProvider();\r\n\r\n // When in global view (no tenant selected), allow user to pick a tenant for the ticket\r\n const [selectedTenantForTicket, setSelectedTenantForTicket] = useState<UserTenantDto | null>(null);\r\n const [showTenantPicker, setShowTenantPicker] = useState(false);\r\n const [showDiscardConfirm, setShowDiscardConfirm] = useState(false);\r\n\r\n // The effective tenant: either the global current tenant or the locally selected one\r\n const effectiveTenant = currentTenant ?? selectedTenantForTicket;\r\n\r\n // Show tenant picker on mount when no tenant is selected\r\n useEffect(() => {\r\n if (!currentTenant && isGlobalView && userTenants.length > 0) {\r\n setShowTenantPicker(true);\r\n }\r\n }, [currentTenant, isGlobalView, userTenants.length]);\r\n\r\n const [step, setStep] = useState(1);\r\n const [isDragging, setIsDragging] = useState(false);\r\n\r\n const draftId = searchParams.get('draft');\r\n\r\n // Use hook for form logic\r\n const {\r\n selectedType,\r\n setSelectedType,\r\n title,\r\n setTitle,\r\n description,\r\n setDescription,\r\n priority,\r\n setPriority,\r\n submitting,\r\n error,\r\n setError: _setError,\r\n errorContext,\r\n setErrorContext,\r\n includeScreenshot,\r\n setIncludeScreenshot,\r\n includeErrorLogs,\r\n setIncludeErrorLogs,\r\n includeBrowserInfo,\r\n setIncludeBrowserInfo,\r\n annotatedScreenshot,\r\n setAnnotatedScreenshot,\r\n browserInfo,\r\n setBrowserInfo,\r\n pendingFiles,\r\n setPendingFiles,\r\n uploadingFiles,\r\n fileInputRef,\r\n showDraftSaved,\r\n setShowDraftSaved: _setShowDraftSaved,\r\n saveFailed,\r\n setSaveFailed: _setSaveFailed,\r\n autoSaveTimerRef,\r\n isInitialLoadCompleteRef,\r\n hasUnsavedChangesRef,\r\n draftAttachmentsRef,\r\n errorContextToDraft: _errorContextToDraft,\r\n draftToErrorContext,\r\n fileToAttachment: _fileToAttachment,\r\n attachmentToFile,\r\n filesToAttachments,\r\n saveDraftNow,\r\n processFiles,\r\n removeFile,\r\n buildClientContext: _buildClientContext,\r\n cleanupAfterSubmit: _cleanupAfterSubmit,\r\n submitTicket,\r\n } = useCreateSupportTicket({\r\n draftId,\r\n effectiveTenant,\r\n });\r\n\r\n // Load and apply draft data\r\n const applyDraftData = (draft: ReturnType<typeof ticketDraftService.getDraft>) => {\r\n if (!draft) return { hasType: false, hasScreenshot: false, hasErrorContext: false };\r\n\r\n setTitle(draft.title);\r\n setDescription(draft.description);\r\n setPriority(draft.priority);\r\n setIncludeScreenshot(draft.includeScreenshot);\r\n setIncludeErrorLogs(draft.includeErrorLogs);\r\n\r\n if (draft.type) {\r\n setSelectedType(draft.type);\r\n setStep(2);\r\n }\r\n\r\n if (draft.screenshot) {\r\n setAnnotatedScreenshot(draft.screenshot);\r\n }\r\n\r\n if (draft.errorContext) {\r\n setErrorContext(draftToErrorContext(draft.errorContext));\r\n }\r\n\r\n if (draft.attachments?.length) {\r\n const restoredFiles = draft.attachments.map(attachmentToFile);\r\n setPendingFiles(restoredFiles);\r\n draftAttachmentsRef.current = draft.attachments;\r\n }\r\n\r\n // Restore tenant selection from draft\r\n if (draft.tenantId && draft.tenantSlug) {\r\n const matchingTenant = userTenants.find(t => t.id === draft.tenantId);\r\n if (matchingTenant) {\r\n setSelectedTenantForTicket(matchingTenant);\r\n }\r\n }\r\n\r\n return {\r\n hasType: !!draft.type,\r\n hasScreenshot: !!draft.screenshot,\r\n hasErrorContext: !!draft.errorContext,\r\n };\r\n };\r\n\r\n // Load session context (error logs and screenshot from page navigation)\r\n const applySessionContext = (draftState: ReturnType<typeof applyDraftData>) => {\r\n const sessionContext = errorContextService.loadContext();\r\n if (!sessionContext) return;\r\n\r\n if (!draftState.hasErrorContext) {\r\n setErrorContext(sessionContext);\r\n }\r\n\r\n if (!draftState.hasScreenshot && sessionContext.screenshot) {\r\n setAnnotatedScreenshot(sessionContext.screenshot);\r\n }\r\n\r\n if (sessionContext.recentErrors.length > 0 && !draftState.hasType) {\r\n setSelectedType('Bug');\r\n setPriority('High');\r\n }\r\n };\r\n\r\n // Load draft and error context on mount\r\n useEffect(() => {\r\n const draftState = draftId ? applyDraftData(ticketDraftService.getDraft(draftId)) : { hasType: false, hasScreenshot: false, hasErrorContext: false };\r\n applySessionContext(draftState);\r\n\r\n const info = browserInfoService.captureBrowserInfo();\r\n setBrowserInfo(info);\r\n\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n isInitialLoadCompleteRef.current = true;\r\n });\r\n });\r\n\r\n return () => {\r\n errorContextService.clearContext();\r\n };\r\n }, [draftId, draftToErrorContext, attachmentToFile]);\r\n\r\n // Update draftAttachmentsRef whenever pendingFiles changes\r\n useEffect(() => {\r\n if (pendingFiles.length === 0) {\r\n draftAttachmentsRef.current = [];\r\n return;\r\n }\r\n\r\n // Convert files to attachments asynchronously\r\n filesToAttachments(pendingFiles)\r\n .then((attachments) => {\r\n draftAttachmentsRef.current = attachments;\r\n })\r\n .catch((err) => {\r\n console.error(\r\n '[CreateSupportTicketPage] Failed to convert files to attachments:',\r\n err\r\n );\r\n });\r\n }, [pendingFiles, filesToAttachments]);\r\n\r\n // Debounced auto-save when data changes\r\n useEffect(() => {\r\n if (!isInitialLoadCompleteRef.current || !draftId) return;\r\n\r\n hasUnsavedChangesRef.current = true;\r\n\r\n if (autoSaveTimerRef.current) {\r\n clearTimeout(autoSaveTimerRef.current);\r\n }\r\n\r\n autoSaveTimerRef.current = setTimeout(() => {\r\n saveDraftNow();\r\n }, 1000);\r\n\r\n return () => {\r\n if (autoSaveTimerRef.current) {\r\n clearTimeout(autoSaveTimerRef.current);\r\n }\r\n };\r\n }, [\r\n selectedType,\r\n title,\r\n description,\r\n priority,\r\n includeScreenshot,\r\n includeErrorLogs,\r\n includeBrowserInfo,\r\n annotatedScreenshot,\r\n errorContext,\r\n pendingFiles,\r\n draftId,\r\n saveDraftNow,\r\n ]);\r\n\r\n // Save on unmount (when navigating away)\r\n useEffect(() => {\r\n const handleBeforeUnload = () => {\r\n if (hasUnsavedChangesRef.current && draftId) {\r\n saveDraftNow();\r\n // Don't show browser prompt, we're auto-saving\r\n }\r\n };\r\n\r\n window.addEventListener('beforeunload', handleBeforeUnload);\r\n\r\n return () => {\r\n window.removeEventListener('beforeunload', handleBeforeUnload);\r\n // Save on cleanup (component unmount / navigation)\r\n if (hasUnsavedChangesRef.current && draftId && isInitialLoadCompleteRef.current) {\r\n // Direct call since we can't use async in cleanup\r\n ticketDraftService.updateDraft(draftId, {\r\n type: selectedType,\r\n title,\r\n description,\r\n priority,\r\n includeScreenshot,\r\n includeErrorLogs,\r\n screenshot: annotatedScreenshot || undefined,\r\n errorContext: errorContext\r\n ? {\r\n url: errorContext.url,\r\n timestamp: errorContext.timestamp.toISOString(),\r\n recentErrors: errorContext.recentErrors.map((e) => ({\r\n ...e,\r\n timestamp: e.timestamp.toISOString(),\r\n })),\r\n browserInfo: errorContext.browserInfo,\r\n }\r\n : undefined,\r\n attachments:\r\n draftAttachmentsRef.current.length > 0\r\n ? draftAttachmentsRef.current\r\n : undefined,\r\n });\r\n }\r\n };\r\n }, [\r\n draftId,\r\n selectedType,\r\n title,\r\n description,\r\n priority,\r\n includeScreenshot,\r\n includeErrorLogs,\r\n annotatedScreenshot,\r\n errorContext,\r\n saveDraftNow,\r\n ]);\r\n\r\n const handleAnnotatedScreenshot = (dataUrl: string) => {\r\n setAnnotatedScreenshot(dataUrl);\r\n };\r\n\r\n // Recapture screenshot (for reset functionality)\r\n const handleRecaptureScreenshot = async () => {\r\n try {\r\n const newContext = await errorContextService.captureContext();\r\n if (newContext.screenshot) {\r\n setAnnotatedScreenshot(newContext.screenshot);\r\n // Also update error context with fresh data\r\n setErrorContext(newContext);\r\n }\r\n } catch (err) {\r\n console.error('[CreateSupportTicketPage] Error recapturing screenshot:', err);\r\n }\r\n };\r\n\r\n // Discard draft and navigate away\r\n const handleDiscardDraft = () => {\r\n if (draftId) {\r\n // Clear any pending auto-save\r\n if (autoSaveTimerRef.current) {\r\n clearTimeout(autoSaveTimerRef.current);\r\n autoSaveTimerRef.current = null;\r\n }\r\n // Delete the draft\r\n ticketDraftService.deleteDraft(draftId);\r\n }\r\n // Navigate to tickets page\r\n navigate('/support/my-tickets?tab=submitted');\r\n };\r\n\r\n const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = Array.from(e.target.files || []);\r\n processFiles(files);\r\n if (fileInputRef.current) {\r\n fileInputRef.current.value = '';\r\n }\r\n };\r\n\r\n // Drag and drop handlers\r\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n };\r\n\r\n const handleDragEnter = (e: React.DragEvent<HTMLDivElement>) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDragging(true);\r\n };\r\n\r\n const handleDragLeave = (e: React.DragEvent<HTMLDivElement>) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n // Only set isDragging to false if we're leaving the drop zone entirely\r\n const rect = e.currentTarget.getBoundingClientRect();\r\n const x = e.clientX;\r\n const y = e.clientY;\r\n if (x < rect.left || x > rect.right || y < rect.top || y > rect.bottom) {\r\n setIsDragging(false);\r\n }\r\n };\r\n\r\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDragging(false);\r\n\r\n const files = Array.from(e.dataTransfer.files);\r\n if (files.length > 0) {\r\n processFiles(files);\r\n }\r\n };\r\n\r\n const formatFileSize = (bytes: number): string => {\r\n if (bytes < 1024) return `${bytes} B`;\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\r\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\r\n };\r\n\r\n const getFileIcon = (fileName: string) => {\r\n const ext = fileName.split('.').pop()?.toLowerCase();\r\n if (['jpg', 'jpeg', 'png', 'gif'].includes(ext || '')) return ImageIcon;\r\n if (['pdf', 'doc', 'docx', 'txt'].includes(ext || '')) return FileText;\r\n return File;\r\n };\r\n\r\n const handleSubmit = async () => {\r\n if (!selectedType || !title.trim() || !description.trim()) return;\r\n\r\n if (!effectiveTenant) {\r\n // No tenant selected at all - show picker modal\r\n setShowTenantPicker(true);\r\n return;\r\n }\r\n\r\n const ticket = await submitTicket();\r\n if (ticket) {\r\n navigate(`/support/my-tickets/${ticket.id}?tab=submitted`);\r\n }\r\n };\r\n\r\n const renderTypeSelection = () => (\r\n <div className=\"space-y-4\">\r\n <h2 className=\"text-lg font-semibold mb-4\">{t('tickets.createFlow.selectType')}</h2>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n {ticketTypes.map((type) => (\r\n <button\r\n key={type.value}\r\n onClick={() => {\r\n setSelectedType(type.value);\r\n setStep(2);\r\n }}\r\n className={`card p-4 text-left hover:shadow-md transition-shadow ${\r\n selectedType === type.value ? 'ring-2 ring-[var(--color-primary-600)]' : ''\r\n }`}\r\n >\r\n <div className=\"flex items-start gap-4\">\r\n <div className=\"p-3 rounded-lg bg-[var(--bg-secondary)]\">\r\n <type.icon className=\"w-6 h-6\" />\r\n </div>\r\n <div>\r\n <h3 className=\"font-medium\">{t(`tickets.${type.labelKey}`)}</h3>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{t(`tickets.${type.descriptionKey}`, type.value)}</p>\r\n </div>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n\r\n const renderSystemInfo = () => {\r\n if (!browserInfo) return null;\r\n return (\r\n <div className=\"card p-4 bg-[var(--bg-secondary)]\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"font-medium flex items-center gap-2\">\r\n <Monitor className=\"w-5 h-5 text-[var(--color-primary-600)]\" />\r\n {t('tickets.create.systemInfo', 'System Information')}\r\n </h3>\r\n <label className=\"flex items-center gap-2 cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n checked={includeBrowserInfo}\r\n onChange={(e) => setIncludeBrowserInfo(e.target.checked)}\r\n className=\"rounded border-[var(--border-color)]\"\r\n />\r\n <span className=\"text-xs text-[var(--text-secondary)]\">\r\n {t('tickets.create.includeSystemInfo', 'Include in ticket')}\r\n </span>\r\n </label>\r\n </div>\r\n\r\n <div className={`grid grid-cols-2 md:grid-cols-3 gap-3 text-sm ${!includeBrowserInfo ? 'opacity-50' : ''}`}>\r\n <div className=\"p-3 bg-[var(--bg-primary)] rounded-lg\">\r\n <span className=\"text-xs text-[var(--text-secondary)] block\">{t('tickets.create.browser', 'Browser')}</span>\r\n <span className=\"font-medium\">{browserInfo.browser} {browserInfo.browserVersion}</span>\r\n </div>\r\n <div className=\"p-3 bg-[var(--bg-primary)] rounded-lg\">\r\n <span className=\"text-xs text-[var(--text-secondary)] block\">{t('tickets.create.os', 'OS')}</span>\r\n <span className=\"font-medium\">{browserInfo.os} {browserInfo.osVersion}</span>\r\n </div>\r\n <div className=\"p-3 bg-[var(--bg-primary)] rounded-lg\">\r\n <span className=\"text-xs text-[var(--text-secondary)] block\">{t('tickets.create.device', 'Device')}</span>\r\n <span className=\"font-medium\">{browserInfo.deviceType}</span>\r\n </div>\r\n <div className=\"p-3 bg-[var(--bg-primary)] rounded-lg\">\r\n <span className=\"text-xs text-[var(--text-secondary)] block\">{t('tickets.create.screen', 'Screen')}</span>\r\n <span className=\"font-medium\">{browserInfo.screenResolution}</span>\r\n </div>\r\n <div className=\"p-3 bg-[var(--bg-primary)] rounded-lg\">\r\n <span className=\"text-xs text-[var(--text-secondary)] block\">{t('tickets.create.language', 'Language')}</span>\r\n <span className=\"font-medium\">{browserInfo.language}</span>\r\n </div>\r\n {errorContext && (\r\n <div className=\"p-3 bg-[var(--bg-primary)] rounded-lg\">\r\n <span className=\"text-xs text-[var(--text-secondary)] block\">URL</span>\r\n <span className=\"font-medium font-mono text-xs truncate block\">{errorContext.url}</span>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const renderScreenshot = () => {\r\n if (!annotatedScreenshot) return null;\r\n return (\r\n <div className=\"card p-4\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"font-medium flex items-center gap-2\">\r\n <Camera className=\"w-5 h-5 text-[var(--color-primary-600)]\" />\r\n {t('tickets.createFlow.screenshot')}\r\n </h3>\r\n <label className=\"flex items-center gap-2 text-sm\">\r\n <input\r\n type=\"checkbox\"\r\n checked={includeScreenshot}\r\n onChange={(e) => setIncludeScreenshot(e.target.checked)}\r\n className=\"rounded border-[var(--border-color)]\"\r\n />\r\n {t('tickets.createFlow.includeScreenshot')}\r\n </label>\r\n </div>\r\n\r\n {includeScreenshot ? (\r\n <ScreenshotAnnotator\r\n screenshot={annotatedScreenshot}\r\n onAnnotatedScreenshot={handleAnnotatedScreenshot}\r\n onReset={handleRecaptureScreenshot}\r\n />\r\n ) : (\r\n <div className=\"p-8 text-center text-[var(--text-secondary)] bg-[var(--bg-secondary)] rounded-lg\">\r\n <Camera className=\"w-8 h-8 mx-auto mb-2 opacity-50\" />\r\n <p className=\"text-sm\">{t('tickets.createFlow.screenshotExcluded', 'Screenshot will not be included')}</p>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n const renderErrorLogs = () => {\r\n if (!errorContext || errorContext.recentErrors.length === 0) return null;\r\n return (\r\n <div className=\"card p-4\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"font-medium flex items-center gap-2\">\r\n <AlertTriangle className=\"w-5 h-5 text-[var(--error-text)]\" />\r\n {t('tickets.createFlow.recentErrors')} ({errorContext.recentErrors.length})\r\n </h3>\r\n <label className=\"flex items-center gap-2 text-sm\">\r\n <input\r\n type=\"checkbox\"\r\n checked={includeErrorLogs}\r\n onChange={(e) => setIncludeErrorLogs(e.target.checked)}\r\n className=\"rounded border-[var(--border-color)]\"\r\n />\r\n {t('tickets.createFlow.includeErrorLogs')}\r\n </label>\r\n </div>\r\n\r\n {includeErrorLogs ? (\r\n <div className=\"bg-[var(--bg-secondary)] rounded-lg p-4 text-sm font-mono max-h-48 overflow-y-auto space-y-2\">\r\n {errorContext.recentErrors.slice(0, 10).map((err, index) => (\r\n <div key={`error-${index}`} className=\"p-2 bg-[var(--error-bg)]/50 rounded text-[var(--error-text)]\">\r\n <div className=\"flex items-center gap-2 text-xs opacity-70 mb-1\">\r\n <span>{err.timestamp.toLocaleTimeString()}</span>\r\n {err.component && <span className=\"px-1.5 py-0.5 bg-[var(--bg-primary)] rounded\">{err.component}</span>}\r\n </div>\r\n <div className=\"break-words\">{err.message}</div>\r\n </div>\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"p-4 text-center text-[var(--text-secondary)] bg-[var(--bg-secondary)] rounded-lg\">\r\n <p className=\"text-sm\">{t('tickets.createFlow.logsExcluded', 'Error logs will not be included')}</p>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n const renderCapturedContext = () => {\r\n if (!errorContext && !browserInfo) return null;\r\n\r\n return (\r\n <div className=\"space-y-6 mb-6\">\r\n {renderSystemInfo()}\r\n {renderScreenshot()}\r\n {renderErrorLogs()}\r\n </div>\r\n );\r\n };\r\n\r\n const renderAttachmentSection = () => {\r\n return (\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">\r\n {t('tickets.createFlow.attachments')}\r\n </label>\r\n <div\r\n className={`border-2 border-dashed rounded-lg p-6 text-center transition-colors cursor-pointer ${\r\n isDragging\r\n ? 'border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-primary-600)]'\r\n }`}\r\n onClick={() => fileInputRef.current?.click()}\r\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); fileInputRef.current?.click(); } }}\r\n role=\"button\"\r\n tabIndex={0}\r\n onDragOver={handleDragOver}\r\n onDragEnter={handleDragEnter}\r\n onDragLeave={handleDragLeave}\r\n onDrop={handleDrop}\r\n >\r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n multiple\r\n onChange={handleFileSelect}\r\n accept={allowedExtensions.join(',')}\r\n className=\"hidden\"\r\n />\r\n <Paperclip className={`w-8 h-8 mx-auto mb-2 ${isDragging ? 'text-[var(--color-primary-600)]' : 'text-[var(--text-secondary)]'}`} />\r\n <p className={`text-sm ${isDragging ? 'text-[var(--color-primary-600)] font-medium' : 'text-[var(--text-secondary)]'}`}>\r\n {isDragging\r\n ? t('tickets.createFlow.dropFilesNow', 'Drop files here')\r\n : t('tickets.createFlow.dropFilesHere')}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n {t('tickets.createFlow.maxFileSize', { size: '10 MB' })}\r\n </p>\r\n </div>\r\n\r\n {pendingFiles.length > 0 && (\r\n <div className=\"mt-3 space-y-2\">\r\n {pendingFiles.map((file, index) => {\r\n const FileIcon = getFileIcon(file.name);\r\n return (\r\n <div\r\n key={`file-${file.name}-${index}`}\r\n className=\"flex items-center gap-3 p-3 bg-[var(--bg-secondary)] rounded-lg\"\r\n >\r\n <FileIcon className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium truncate\">{file.name}</p>\r\n <p className=\"text-xs text-[var(--text-secondary)]\">{formatFileSize(file.size)}</p>\r\n </div>\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n removeFile(index);\r\n }}\r\n className=\"p-1 hover:bg-[var(--bg-hover)] rounded\"\r\n >\r\n <X className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n const renderForm = () => {\r\n const currentTypeConfig = ticketTypes.find(tt => tt.value === selectedType);\r\n const CurrentTypeIcon = currentTypeConfig?.icon || Bug;\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <div className=\"flex items-center gap-4 mb-6\">\r\n <button onClick={() => setStep(1)} className=\"btn btn-ghost p-2\">\r\n <ArrowLeft className=\"w-5 h-5\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-[var(--bg-secondary)]\">\r\n <CurrentTypeIcon className=\"w-5 h-5\" />\r\n </div>\r\n <select\r\n value={selectedType || ''}\r\n onChange={(e) => setSelectedType(e.target.value as TicketType)}\r\n className=\"input text-lg font-semibold bg-transparent border-none p-0 pr-8 cursor-pointer hover:text-[var(--color-primary-600)] focus:ring-0\"\r\n >\r\n {ticketTypes.map((type) => (\r\n <option key={type.value} value={type.value}>\r\n {t(`tickets.${type.labelKey}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t('tickets.createFlow.fillDetails')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {renderCapturedContext()}\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">\r\n {t('tickets.form.title')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={title}\r\n onChange={(e) => setTitle(e.target.value)}\r\n placeholder={t('tickets.form.titlePlaceholder')}\r\n className=\"input w-full\"\r\n maxLength={200}\r\n />\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n {title.length}/200\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">\r\n {t('tickets.form.description')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <textarea\r\n value={description}\r\n onChange={(e) => setDescription(e.target.value)}\r\n placeholder={t('tickets.form.descriptionPlaceholder')}\r\n className=\"input w-full h-40\"\r\n maxLength={5000}\r\n />\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n {description.length}/5000\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">{t('tickets.form.priority')}</label>\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-2\">\r\n {priorityOptions.map((option) => (\r\n <button\r\n key={option.value}\r\n type=\"button\"\r\n onClick={() => setPriority(option.value)}\r\n className={`p-3 rounded-lg border text-center transition-colors ${\r\n priority === option.value\r\n ? 'border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10'\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <div className=\"font-medium\">{t(`tickets.${option.labelKey}`)}</div>\r\n <div className=\"text-xs text-[var(--text-secondary)]\">{t(`tickets.${option.descriptionKey}`, option.value)}</div>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {renderAttachmentSection()}\r\n\r\n {error && (\r\n <div className=\"p-4 rounded-lg bg-[var(--error-bg)] text-[var(--error-text)] flex items-center gap-2\">\r\n <AlertTriangle className=\"w-5 h-5\" />\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div className=\"flex items-center justify-between pt-4 border-t border-[var(--border-color)]\">\r\n <button onClick={() => setStep(1)} className=\"btn btn-secondary\">\r\n {t('common:actions.back')}\r\n </button>\r\n <button\r\n onClick={handleSubmit}\r\n disabled={!title.trim() || !description.trim() || submitting || uploadingFiles}\r\n className=\"btn btn-primary\"\r\n >\r\n {(submitting || uploadingFiles) ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin mr-2\" />\r\n ) : (\r\n <Send className=\"w-4 h-4 mr-2\" />\r\n )}\r\n {(() => {\r\n if (uploadingFiles) return t('tickets.createFlow.uploadingFiles');\r\n if (submitting) return t('common:actions.submitting');\r\n return t('common:actions.submit');\r\n })()}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"max-w-3xl mx-auto\">\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('create.title', 'Create Ticket') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center gap-4 mb-6 mt-6\">\r\n <button onClick={() => navigate(-1)} className=\"btn btn-ghost p-2\">\r\n <ArrowLeft className=\"w-5 h-5\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <h1 className=\"text-2xl font-bold flex items-center gap-2\">\r\n <Headset className=\"w-6 h-6\" />\r\n {t('tickets.createFlow.title')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('tickets.createFlow.subtitle')}\r\n </p>\r\n </div>\r\n {draftId && (\r\n <button\r\n onClick={() => setShowDiscardConfirm(true)}\r\n className=\"btn btn-ghost text-[var(--error-text)] hover:bg-[var(--error-bg)]\"\r\n title={t('common:drafts.discard')}\r\n >\r\n <Trash2 className=\"w-4 h-4 mr-2\" />\r\n {t('common:drafts.discard')}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {isGlpi ? (\r\n <div className=\"mb-6 p-4 rounded-lg bg-[var(--info-bg)] border border-[var(--info-border)]\">\r\n <div className=\"flex items-center gap-3 mb-3\">\r\n <Info className=\"w-5 h-5 text-[var(--info-text)] flex-shrink-0\" />\r\n <p className=\"font-medium text-[var(--info-text)]\">\r\n {t('glpi.cannotCreateTicket', 'Tickets are managed by GLPI. Please create tickets directly in GLPI.')}\r\n </p>\r\n </div>\r\n {glpiBaseUrl && (\r\n <a\r\n href={glpiBaseUrl}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"btn btn-primary inline-flex items-center gap-2\"\r\n >\r\n <ExternalLink className=\"w-4 h-4\" />\r\n {t('glpi.openGlpi')}\r\n </a>\r\n )}\r\n </div>\r\n ) : (\r\n <>\r\n <div className=\"flex items-center gap-4 mb-8\">\r\n <div className={`flex items-center gap-2 ${step >= 1 ? 'text-[var(--color-primary-600)]' : 'text-[var(--text-secondary)]'}`}>\r\n <div className={`w-8 h-8 rounded-full flex items-center justify-center ${\r\n step >= 1 ? 'bg-[var(--color-primary-600)] text-white' : 'bg-[var(--bg-secondary)]'\r\n }`}>\r\n 1\r\n </div>\r\n <span className=\"font-medium\">{t('tickets.createFlow.step1')}</span>\r\n </div>\r\n <div className={`flex-1 h-0.5 ${step >= 2 ? 'bg-[var(--color-primary-600)]' : 'bg-[var(--border-color)]'}`} />\r\n <div className={`flex items-center gap-2 ${step >= 2 ? 'text-[var(--color-primary-600)]' : 'text-[var(--text-secondary)]'}`}>\r\n <div className={`w-8 h-8 rounded-full flex items-center justify-center ${\r\n step >= 2 ? 'bg-[var(--color-primary-600)] text-white' : 'bg-[var(--bg-secondary)]'\r\n }`}>\r\n 2\r\n </div>\r\n <span className=\"font-medium\">{t('tickets.createFlow.step2')}</span>\r\n </div>\r\n\r\n {/* Draft auto-save indicator */}\r\n {saveFailed ? (\r\n <div className=\"ml-auto flex items-center gap-1.5 text-xs text-[var(--error-text)]\">\r\n <AlertTriangle className=\"w-3.5 h-3.5\" />\r\n <span>{t('common:errors.generic')}</span>\r\n </div>\r\n ) : (\r\n <div className={`ml-auto flex items-center gap-1.5 text-xs text-[var(--success-text)] transition-opacity duration-300 ${\r\n showDraftSaved ? 'opacity-100' : 'opacity-0'\r\n }`}>\r\n <Check className=\"w-3.5 h-3.5\" />\r\n <span>{t('common:drafts.autoSaved')}</span>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Tenant context indicator (shown when using locally selected tenant in global view) */}\r\n {selectedTenantForTicket && !currentTenant && (\r\n <div className=\"mb-4 p-3 rounded-lg bg-[var(--info-bg)] border border-[var(--info-border)] flex items-center justify-between\">\r\n <div className=\"flex items-center gap-2 text-sm text-[var(--info-text)]\">\r\n <Building2 className=\"w-4 h-4\" />\r\n <span>{t('support:tickets.tenantPicker.creatingFor')}</span>\r\n <span className=\"font-semibold\">{selectedTenantForTicket.name}</span>\r\n </div>\r\n <button\r\n onClick={() => setShowTenantPicker(true)}\r\n className=\"text-xs text-[var(--info-text)] underline hover:no-underline\"\r\n >\r\n {t('common:actions.change')}\r\n </button>\r\n </div>\r\n )}\r\n\r\n <div className=\"card p-6\">\r\n {step === 1 && renderTypeSelection()}\r\n {step === 2 && renderForm()}\r\n </div>\r\n\r\n {/* Tenant picker modal (shown in global view when no tenant selected) */}\r\n {showTenantPicker && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50 p-4\">\r\n <div className=\"card w-full max-w-md p-6\">\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <div className=\"w-10 h-10 rounded-full bg-[var(--info-bg)] flex items-center justify-center\">\r\n <Building2 className=\"w-5 h-5 text-[var(--info-text)]\" />\r\n </div>\r\n <div>\r\n <h2 className=\"text-xl font-bold\">{t('support:tickets.tenantPicker.title')}</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{t('support:tickets.tenantPicker.description')}</p>\r\n </div>\r\n </div>\r\n <div className=\"space-y-2 max-h-64 overflow-y-auto\">\r\n {userTenants\r\n .filter(tenant => tenant.status === 'Active')\r\n .map(tenant => (\r\n <button\r\n key={tenant.id}\r\n onClick={() => {\r\n setSelectedTenantForTicket(tenant);\r\n setShowTenantPicker(false);\r\n // Immediately persist tenant to draft\r\n if (draftId) {\r\n ticketDraftService.updateDraft(draftId, {\r\n tenantId: tenant.id,\r\n tenantSlug: tenant.slug,\r\n tenantName: tenant.name,\r\n });\r\n }\r\n }}\r\n className={`w-full p-3 rounded-lg border text-left transition-colors hover:bg-[var(--bg-hover)] ${\r\n selectedTenantForTicket?.id === tenant.id\r\n ? 'border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10'\r\n : 'border-[var(--border-color)]'\r\n }`}\r\n >\r\n <div className=\"flex items-center gap-3\">\r\n <Building2 className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"font-medium truncate\">{tenant.name}</div>\r\n {tenant.organisationName && (\r\n <div className=\"text-xs text-[var(--text-secondary)] truncate\">{tenant.organisationName}</div>\r\n )}\r\n </div>\r\n <span className={`text-xs px-2 py-0.5 rounded-full ${\r\n tenant.type === 'Personal'\r\n ? 'bg-[var(--info-bg)] text-[var(--info-text)]'\r\n : 'bg-[var(--success-bg)] text-[var(--success-text)]'\r\n }`}>\r\n {tenant.type === 'Personal' ? t('common:tenant.personal') : t('common:tenant.business')}\r\n </span>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n <div className=\"flex justify-end gap-3 mt-4 pt-4 border-t border-[var(--border-color)]\">\r\n <button\r\n onClick={() => {\r\n setShowTenantPicker(false);\r\n if (!effectiveTenant) navigate(-1);\r\n }}\r\n className=\"btn btn-secondary\"\r\n >\r\n {t('common:actions.cancel')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Discard confirmation modal */}\r\n {showDiscardConfirm && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50 p-4\">\r\n <div className=\"card w-full max-w-md p-6\">\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <div className=\"w-10 h-10 rounded-full bg-[var(--error-bg)] flex items-center justify-center\">\r\n <Trash2 className=\"w-5 h-5 text-[var(--error-text)]\" />\r\n </div>\r\n <h2 className=\"text-xl font-bold\">{t('common:drafts.discardConfirmTitle')}</h2>\r\n </div>\r\n <p className=\"text-[var(--text-secondary)] mb-6\">\r\n {t('common:drafts.discardConfirmMessage')}\r\n </p>\r\n <div className=\"flex justify-end gap-3\">\r\n <button\r\n onClick={() => setShowDiscardConfirm(false)}\r\n className=\"btn btn-secondary\"\r\n >\r\n {t('common:actions.cancel')}\r\n </button>\r\n <button\r\n onClick={() => {\r\n setShowDiscardConfirm(false);\r\n handleDiscardDraft();\r\n }}\r\n className=\"btn bg-[var(--error-bg)] text-[var(--error-text)] hover:opacity-90\"\r\n >\r\n <Trash2 className=\"w-4 h-4 mr-2\" />\r\n {t('common:drafts.discardConfirm')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["maxFileSize","allowedExtensions","useCreateSupportTicket","draftId","effectiveTenant","selectedType","setSelectedType","useState","title","setTitle","description","setDescription","priority","setPriority","submitting","setSubmitting","error","setError","errorContext","setErrorContext","includeScreenshot","setIncludeScreenshot","includeErrorLogs","setIncludeErrorLogs","includeBrowserInfo","setIncludeBrowserInfo","annotatedScreenshot","setAnnotatedScreenshot","browserInfo","setBrowserInfo","pendingFiles","setPendingFiles","uploadingFiles","setUploadingFiles","fileInputRef","useRef","showDraftSaved","setShowDraftSaved","saveFailed","setSaveFailed","autoSaveTimerRef","isInitialLoadCompleteRef","hasUnsavedChangesRef","draftAttachmentsRef","errorContextToDraft","useCallback","context","e","draftToErrorContext","draft","fileToAttachment","file","resolve","reject","reader","attachmentToFile","attachment","arr","mime","bstr","n","u8arr","filesToAttachments","files","saveDraftNow","result","ticketDraftService","processFiles","validFiles","errors","extension","prev","removeFile","index","_","i","buildClientContext","info","browserInfoService","cleanupAfterSubmit","errorContextService","submitTicket","clientContext","tenantHeaders","ticket","api","blob","formData","err","ticketTypes","Bug","Lightbulb","Sparkles","AppWindow","MessageSquare","HelpCircle","priorityOptions","CreateSupportTicketPage","t","useTranslation","navigate","useNavigate","searchParams","useSearchParams","currentTenant","userTenants","isGlobalView","useTenant","isGlpi","glpiBaseUrl","useTicketingProvider","selectedTenantForTicket","setSelectedTenantForTicket","showTenantPicker","setShowTenantPicker","showDiscardConfirm","setShowDiscardConfirm","useEffect","step","setStep","isDragging","setIsDragging","applyDraftData","restoredFiles","matchingTenant","applySessionContext","draftState","sessionContext","attachments","handleBeforeUnload","handleAnnotatedScreenshot","dataUrl","handleRecaptureScreenshot","newContext","handleDiscardDraft","handleFileSelect","handleDragOver","handleDragEnter","handleDragLeave","rect","x","y","handleDrop","formatFileSize","bytes","getFileIcon","fileName","ext","ImageIcon","FileText","File","handleSubmit","renderTypeSelection","jsxs","jsx","type","renderSystemInfo","Monitor","renderScreenshot","Camera","ScreenshotAnnotator","renderErrorLogs","AlertTriangle","renderCapturedContext","renderAttachmentSection","Paperclip","FileIcon","X","renderForm","CurrentTypeIcon","tt","ArrowLeft","option","Loader2","Send","Breadcrumb","Headset","Trash2","Info","ExternalLink","Fragment","Check","Building2","tenant"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),a=require("react"),ue=require("react-router-dom"),$e=require("react-i18next"),d=require("./index-vXiLh35n.js"),c=require("lucide-react"),Ke=require("./ScreenshotAnnotator-CoRDpHXW.js"),Be=10*1024*1024,xe=[".jpg",".jpeg",".png",".gif",".pdf",".doc",".docx",".xls",".xlsx",".txt",".log",".zip"];function qe({draftId:s,effectiveTenant:g}){const[P,z]=a.useState(null),[v,J]=a.useState(""),[R,Z]=a.useState(""),[y,ee]=a.useState("Medium"),[oe,L]=a.useState(!1),[ie,w]=a.useState(null),[j,k]=a.useState(null),[N,M]=a.useState(!0),[S,m]=a.useState(!0),[C,O]=a.useState(!0),[h,te]=a.useState(null),[T,se]=a.useState(null),[A,B]=a.useState([]),[U,H]=a.useState(!1),u=a.useRef(null),[G,F]=a.useState(!1),[re,D]=a.useState(!1),ae=a.useRef(null),V=a.useRef(!1),ne=a.useRef(!1),I=a.useRef([]),$=a.useCallback(r=>({url:r.url,timestamp:r.timestamp.toISOString(),recentErrors:r.recentErrors.map(o=>({...o,timestamp:o.timestamp.toISOString()})),browserInfo:r.browserInfo}),[]),b=a.useCallback(r=>({url:r.url,timestamp:new Date(r.timestamp),recentErrors:r.recentErrors.map(o=>({...o,timestamp:new Date(o.timestamp)})),browserInfo:r.browserInfo}),[]),Q=a.useCallback(r=>new Promise((o,x)=>{const i=new FileReader;i.onload=()=>{o({name:r.name,type:r.type,size:r.size,data:i.result})},i.onerror=x,i.readAsDataURL(r)}),[]),K=a.useCallback(r=>{const o=r.data.split(","),x=/:(.*?);/.exec(o[0])?.[1]||r.type,i=atob(o[1]);let p=i.length;const E=new Uint8Array(p);for(;p--;)E[p]=i.charCodeAt(p);return new window.File([E],r.name,{type:x})},[]),le=a.useCallback(async r=>Promise.all(r.map(Q)),[Q]),X=a.useCallback(()=>{if(!s)return!1;const r=d.ticketDraftService.updateDraft(s,{type:P,title:v,description:R,priority:y,includeScreenshot:N,includeErrorLogs:S,screenshot:h||void 0,errorContext:j?$(j):void 0,attachments:I.current.length>0?I.current:void 0,tenantId:g?.id,tenantSlug:g?.slug,tenantName:g?.name});return r.success?(ne.current=!1,F(!0),D(!1),setTimeout(()=>F(!1),2e3)):(D(!0),console.error("[CreateSupportTicketPage] Failed to save draft!")),r.success},[s,P,v,R,y,N,S,h,j,$,g]),q=a.useCallback(r=>{const o=[],x=[];r.forEach(i=>{const p="."+i.name.split(".").pop()?.toLowerCase();if(!xe.includes(p)){x.push(`${i.name}: file type not allowed`);return}if(i.size>Be){x.push(`${i.name}: file too large`);return}o.push(i)}),x.length>0?w(x.join(`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),a=require("react"),ue=require("react-router-dom"),$e=require("react-i18next"),d=require("./index-cAikSVW0.js"),c=require("lucide-react"),Ke=require("./ScreenshotAnnotator-CoRDpHXW.js"),Be=10*1024*1024,xe=[".jpg",".jpeg",".png",".gif",".pdf",".doc",".docx",".xls",".xlsx",".txt",".log",".zip"];function qe({draftId:s,effectiveTenant:g}){const[P,z]=a.useState(null),[v,J]=a.useState(""),[R,Z]=a.useState(""),[y,ee]=a.useState("Medium"),[oe,L]=a.useState(!1),[ie,w]=a.useState(null),[j,k]=a.useState(null),[N,M]=a.useState(!0),[S,m]=a.useState(!0),[C,O]=a.useState(!0),[h,te]=a.useState(null),[T,se]=a.useState(null),[A,B]=a.useState([]),[U,H]=a.useState(!1),u=a.useRef(null),[G,F]=a.useState(!1),[re,D]=a.useState(!1),ae=a.useRef(null),V=a.useRef(!1),ne=a.useRef(!1),I=a.useRef([]),$=a.useCallback(r=>({url:r.url,timestamp:r.timestamp.toISOString(),recentErrors:r.recentErrors.map(o=>({...o,timestamp:o.timestamp.toISOString()})),browserInfo:r.browserInfo}),[]),b=a.useCallback(r=>({url:r.url,timestamp:new Date(r.timestamp),recentErrors:r.recentErrors.map(o=>({...o,timestamp:new Date(o.timestamp)})),browserInfo:r.browserInfo}),[]),Q=a.useCallback(r=>new Promise((o,x)=>{const i=new FileReader;i.onload=()=>{o({name:r.name,type:r.type,size:r.size,data:i.result})},i.onerror=x,i.readAsDataURL(r)}),[]),K=a.useCallback(r=>{const o=r.data.split(","),x=/:(.*?);/.exec(o[0])?.[1]||r.type,i=atob(o[1]);let p=i.length;const E=new Uint8Array(p);for(;p--;)E[p]=i.charCodeAt(p);return new window.File([E],r.name,{type:x})},[]),le=a.useCallback(async r=>Promise.all(r.map(Q)),[Q]),X=a.useCallback(()=>{if(!s)return!1;const r=d.ticketDraftService.updateDraft(s,{type:P,title:v,description:R,priority:y,includeScreenshot:N,includeErrorLogs:S,screenshot:h||void 0,errorContext:j?$(j):void 0,attachments:I.current.length>0?I.current:void 0,tenantId:g?.id,tenantSlug:g?.slug,tenantName:g?.name});return r.success?(ne.current=!1,F(!0),D(!1),setTimeout(()=>F(!1),2e3)):(D(!0),console.error("[CreateSupportTicketPage] Failed to save draft!")),r.success},[s,P,v,R,y,N,S,h,j,$,g]),q=a.useCallback(r=>{const o=[],x=[];r.forEach(i=>{const p="."+i.name.split(".").pop()?.toLowerCase();if(!xe.includes(p)){x.push(`${i.name}: file type not allowed`);return}if(i.size>Be){x.push(`${i.name}: file too large`);return}o.push(i)}),x.length>0?w(x.join(`
2
2
  `)):w(null),o.length>0&&B(i=>[...i,...o])},[]),de=a.useCallback(r=>{B(o=>o.filter((x,i)=>i!==r))},[]),_=a.useCallback(()=>{const r=d.browserInfoService.captureBrowserInfo();return{sourceUrl:window.location.href,browser:{name:r.browser,version:r.browserVersion,language:r.language},os:{name:r.os,version:r.osVersion},device:{type:r.deviceType,screenResolution:r.screenResolution},recentErrors:S?j?.recentErrors.slice(0,5).map(o=>({message:o.message,stack:o.stack,component:o.component,timestamp:o.timestamp.toISOString()}))??[]:[]}},[j,S]),f=a.useCallback(()=>{s&&d.ticketDraftService.deleteDraft(s),d.errorContextService.clearContext()},[s]),W=a.useCallback(async()=>{if(!P||!v.trim()||!R.trim())return null;try{L(!0),w(null);const r=_(),o=g?{"X-Tenant-Slug":g.slug}:{},x=await d.api.post("/api/support/my-tickets",{title:v.trim(),description:R.trim(),type:P,priority:y,clientContext:r},{headers:o});if(H(!0),N&&h)try{const p=await(await fetch(h)).blob(),E=new globalThis.File([p],"screenshot.png",{type:"image/png"}),Y=new FormData;Y.append("file",E),await d.api.post(`/api/support/my-tickets/${x.id}/attachments`,Y,{headers:{"Content-Type":"multipart/form-data",...o}})}catch(i){console.error("Failed to upload screenshot:",i)}for(const i of A)try{const p=new FormData;p.append("file",i),await d.api.post(`/api/support/my-tickets/${x.id}/attachments`,p,{headers:{"Content-Type":"multipart/form-data",...o}})}catch(p){console.error("Failed to upload file:",i.name,p)}return f(),x}catch{return w("An error occurred"),null}finally{L(!1),H(!1)}},[P,v,R,y,_,g,N,h,A,f]);return{selectedType:P,setSelectedType:z,title:v,setTitle:J,description:R,setDescription:Z,priority:y,setPriority:ee,submitting:oe,error:ie,setError:w,errorContext:j,setErrorContext:k,includeScreenshot:N,setIncludeScreenshot:M,includeErrorLogs:S,setIncludeErrorLogs:m,includeBrowserInfo:C,setIncludeBrowserInfo:O,annotatedScreenshot:h,setAnnotatedScreenshot:te,browserInfo:T,setBrowserInfo:se,pendingFiles:A,setPendingFiles:B,uploadingFiles:U,fileInputRef:u,showDraftSaved:G,setShowDraftSaved:F,saveFailed:re,setSaveFailed:D,autoSaveTimerRef:ae,isInitialLoadCompleteRef:V,hasUnsavedChangesRef:ne,draftAttachmentsRef:I,errorContextToDraft:$,draftToErrorContext:b,fileToAttachment:Q,attachmentToFile:K,filesToAttachments:le,saveDraftNow:X,processFiles:q,removeFile:de,buildClientContext:_,cleanupAfterSubmit:f,submitTicket:W}}const me=[{value:"Bug",labelKey:"types.Bug",descriptionKey:"typeDescriptions.Bug",icon:c.Bug},{value:"FeatureRequest",labelKey:"types.FeatureRequest",descriptionKey:"typeDescriptions.FeatureRequest",icon:c.Lightbulb},{value:"Suggestion",labelKey:"types.Suggestion",descriptionKey:"typeDescriptions.Suggestion",icon:c.Sparkles},{value:"ApplicationRequest",labelKey:"types.ApplicationRequest",descriptionKey:"typeDescriptions.ApplicationRequest",icon:c.AppWindow},{value:"Support",labelKey:"types.Support",descriptionKey:"typeDescriptions.Support",icon:c.MessageSquare},{value:"Question",labelKey:"types.Question",descriptionKey:"typeDescriptions.Question",icon:c.HelpCircle}],ze=[{value:"Low",labelKey:"priorities.Low",descriptionKey:"priorityDescriptions.Low"},{value:"Medium",labelKey:"priorities.Medium",descriptionKey:"priorityDescriptions.Medium"},{value:"High",labelKey:"priorities.High",descriptionKey:"priorityDescriptions.High"},{value:"Critical",labelKey:"priorities.Critical",descriptionKey:"priorityDescriptions.Critical"}];function Me(){const{t:s}=$e.useTranslation(["support","common"]),g=ue.useNavigate(),[P]=ue.useSearchParams(),{currentTenant:z,userTenants:v,isGlobalView:J}=d.useTenant(),{isGlpi:R,glpiBaseUrl:Z}=d.useTicketingProvider(),[y,ee]=a.useState(null),[oe,L]=a.useState(!1),[ie,w]=a.useState(!1),j=z??y;a.useEffect(()=>{!z&&J&&v.length>0&&L(!0)},[z,J,v.length]);const[k,N]=a.useState(1),[M,S]=a.useState(!1),m=P.get("draft"),{selectedType:C,setSelectedType:O,title:h,setTitle:te,description:T,setDescription:se,priority:A,setPriority:B,submitting:U,error:H,errorContext:u,setErrorContext:G,includeScreenshot:F,setIncludeScreenshot:re,includeErrorLogs:D,setIncludeErrorLogs:ae,includeBrowserInfo:V,setIncludeBrowserInfo:ne,annotatedScreenshot:I,setAnnotatedScreenshot:$,browserInfo:b,setBrowserInfo:Q,pendingFiles:K,setPendingFiles:le,uploadingFiles:X,fileInputRef:q,showDraftSaved:de,saveFailed:_,autoSaveTimerRef:f,isInitialLoadCompleteRef:W,hasUnsavedChangesRef:r,draftAttachmentsRef:o,draftToErrorContext:x,attachmentToFile:i,filesToAttachments:p,saveDraftNow:E,processFiles:Y,removeFile:pe,submitTicket:he}=qe({draftId:m,effectiveTenant:j}),ge=t=>{if(!t)return{hasType:!1,hasScreenshot:!1,hasErrorContext:!1};if(te(t.title),se(t.description),B(t.priority),re(t.includeScreenshot),ae(t.includeErrorLogs),t.type&&(O(t.type),N(2)),t.screenshot&&$(t.screenshot),t.errorContext&&G(x(t.errorContext)),t.attachments?.length){const n=t.attachments.map(i);le(n),o.current=t.attachments}if(t.tenantId&&t.tenantSlug){const n=v.find(l=>l.id===t.tenantId);n&&ee(n)}return{hasType:!!t.type,hasScreenshot:!!t.screenshot,hasErrorContext:!!t.errorContext}},fe=t=>{const n=d.errorContextService.loadContext();n&&(t.hasErrorContext||G(n),!t.hasScreenshot&&n.screenshot&&$(n.screenshot),n.recentErrors.length>0&&!t.hasType&&(O("Bug"),B("High")))};a.useEffect(()=>{const t=m?ge(d.ticketDraftService.getDraft(m)):{hasType:!1,hasScreenshot:!1,hasErrorContext:!1};fe(t);const n=d.browserInfoService.captureBrowserInfo();return Q(n),requestAnimationFrame(()=>{requestAnimationFrame(()=>{W.current=!0})}),()=>{d.errorContextService.clearContext()}},[m,x,i]),a.useEffect(()=>{if(K.length===0){o.current=[];return}p(K).then(t=>{o.current=t}).catch(t=>{console.error("[CreateSupportTicketPage] Failed to convert files to attachments:",t)})},[K,p]),a.useEffect(()=>{if(!(!W.current||!m))return r.current=!0,f.current&&clearTimeout(f.current),f.current=setTimeout(()=>{E()},1e3),()=>{f.current&&clearTimeout(f.current)}},[C,h,T,A,F,D,V,I,u,K,m,E]),a.useEffect(()=>{const t=()=>{r.current&&m&&E()};return window.addEventListener("beforeunload",t),()=>{window.removeEventListener("beforeunload",t),r.current&&m&&W.current&&d.ticketDraftService.updateDraft(m,{type:C,title:h,description:T,priority:A,includeScreenshot:F,includeErrorLogs:D,screenshot:I||void 0,errorContext:u?{url:u.url,timestamp:u.timestamp.toISOString(),recentErrors:u.recentErrors.map(n=>({...n,timestamp:n.timestamp.toISOString()})),browserInfo:u.browserInfo}:void 0,attachments:o.current.length>0?o.current:void 0})}},[m,C,h,T,A,F,D,I,u,E]);const ve=t=>{$(t)},be=async()=>{try{const t=await d.errorContextService.captureContext();t.screenshot&&($(t.screenshot),G(t))}catch(t){console.error("[CreateSupportTicketPage] Error recapturing screenshot:",t)}},ye=()=>{m&&(f.current&&(clearTimeout(f.current),f.current=null),d.ticketDraftService.deleteDraft(m)),g("/support/my-tickets?tab=submitted")},je=t=>{const n=Array.from(t.target.files||[]);Y(n),q.current&&(q.current.value="")},Ne=t=>{t.preventDefault(),t.stopPropagation()},we=t=>{t.preventDefault(),t.stopPropagation(),S(!0)},ke=t=>{t.preventDefault(),t.stopPropagation();const n=t.currentTarget.getBoundingClientRect(),l=t.clientX,ce=t.clientY;(l<n.left||l>n.right||ce<n.top||ce>n.bottom)&&S(!1)},Se=t=>{t.preventDefault(),t.stopPropagation(),S(!1);const n=Array.from(t.dataTransfer.files);n.length>0&&Y(n)},Ce=t=>t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`,Te=t=>{const n=t.split(".").pop()?.toLowerCase();return["jpg","jpeg","png","gif"].includes(n||"")?c.Image:["pdf","doc","docx","txt"].includes(n||"")?c.FileText:c.File},Fe=async()=>{if(!C||!h.trim()||!T.trim())return;if(!j){L(!0);return}const t=await he();t&&g(`/support/my-tickets/${t.id}?tab=submitted`)},De=()=>e.jsxs("div",{className:"space-y-4",children:[e.jsx("h2",{className:"text-lg font-semibold mb-4",children:s("tickets.createFlow.selectType")}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:me.map(t=>e.jsx("button",{onClick:()=>{O(t.value),N(2)},className:`card p-4 text-left hover:shadow-md transition-shadow ${C===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(`tickets.${t.labelKey}`)}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:s(`tickets.${t.descriptionKey}`,t.value)})]})]})},t.value))})]}),Ie=()=>b?e.jsxs("div",{className:"card p-4 bg-[var(--bg-secondary)]",children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("h3",{className:"font-medium flex items-center gap-2",children:[e.jsx(c.Monitor,{className:"w-5 h-5 text-[var(--color-primary-600)]"}),s("tickets.create.systemInfo","System Information")]}),e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:V,onChange:t=>ne(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 ${V?"":"opacity-50"}`,children:[e.jsxs("div",{className:"p-3 bg-[var(--bg-primary)] rounded-lg",children:[e.jsx("span",{className:"text-xs text-[var(--text-secondary)] block",children:s("tickets.create.browser","Browser")}),e.jsxs("span",{className:"font-medium",children:[b.browser," ",b.browserVersion]})]}),e.jsxs("div",{className:"p-3 bg-[var(--bg-primary)] rounded-lg",children:[e.jsx("span",{className:"text-xs text-[var(--text-secondary)] block",children:s("tickets.create.os","OS")}),e.jsxs("span",{className:"font-medium",children:[b.os," ",b.osVersion]})]}),e.jsxs("div",{className:"p-3 bg-[var(--bg-primary)] rounded-lg",children:[e.jsx("span",{className:"text-xs text-[var(--text-secondary)] block",children:s("tickets.create.device","Device")}),e.jsx("span",{className:"font-medium",children:b.deviceType})]}),e.jsxs("div",{className:"p-3 bg-[var(--bg-primary)] rounded-lg",children:[e.jsx("span",{className:"text-xs text-[var(--text-secondary)] block",children:s("tickets.create.screen","Screen")}),e.jsx("span",{className:"font-medium",children:b.screenResolution})]}),e.jsxs("div",{className:"p-3 bg-[var(--bg-primary)] rounded-lg",children:[e.jsx("span",{className:"text-xs text-[var(--text-secondary)] block",children:s("tickets.create.language","Language")}),e.jsx("span",{className:"font-medium",children:b.language})]}),u&&e.jsxs("div",{className:"p-3 bg-[var(--bg-primary)] rounded-lg",children:[e.jsx("span",{className:"text-xs text-[var(--text-secondary)] block",children:"URL"}),e.jsx("span",{className:"font-medium font-mono text-xs truncate block",children:u.url})]})]})]}):null,Ee=()=>I?e.jsxs("div",{className:"card p-4",children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("h3",{className:"font-medium flex items-center gap-2",children:[e.jsx(c.Camera,{className:"w-5 h-5 text-[var(--color-primary-600)]"}),s("tickets.createFlow.screenshot")]}),e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:F,onChange:t=>re(t.target.checked),className:"rounded border-[var(--border-color)]"}),s("tickets.createFlow.includeScreenshot")]})]}),F?e.jsx(Ke.ScreenshotAnnotator,{screenshot:I,onAnnotatedScreenshot:ve,onReset:be}):e.jsxs("div",{className:"p-8 text-center text-[var(--text-secondary)] bg-[var(--bg-secondary)] rounded-lg",children:[e.jsx(c.Camera,{className:"w-8 h-8 mx-auto mb-2 opacity-50"}),e.jsx("p",{className:"text-sm",children:s("tickets.createFlow.screenshotExcluded","Screenshot will not be included")})]})]}):null,Pe=()=>!u||u.recentErrors.length===0?null:e.jsxs("div",{className:"card p-4",children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("h3",{className:"font-medium flex items-center gap-2",children:[e.jsx(c.AlertTriangle,{className:"w-5 h-5 text-[var(--error-text)]"}),s("tickets.createFlow.recentErrors")," (",u.recentErrors.length,")"]}),e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:D,onChange:t=>ae(t.target.checked),className:"rounded border-[var(--border-color)]"}),s("tickets.createFlow.includeErrorLogs")]})]}),D?e.jsx("div",{className:"bg-[var(--bg-secondary)] rounded-lg p-4 text-sm font-mono max-h-48 overflow-y-auto space-y-2",children:u.recentErrors.slice(0,10).map((t,n)=>e.jsxs("div",{className:"p-2 bg-[var(--error-bg)]/50 rounded text-[var(--error-text)]",children:[e.jsxs("div",{className:"flex items-center gap-2 text-xs opacity-70 mb-1",children:[e.jsx("span",{children:t.timestamp.toLocaleTimeString()}),t.component&&e.jsx("span",{className:"px-1.5 py-0.5 bg-[var(--bg-primary)] rounded",children:t.component})]}),e.jsx("div",{className:"break-words",children:t.message})]},`error-${n}`))}):e.jsx("div",{className:"p-4 text-center text-[var(--text-secondary)] bg-[var(--bg-secondary)] rounded-lg",children:e.jsx("p",{className:"text-sm",children:s("tickets.createFlow.logsExcluded","Error logs will not be included")})})]}),Re=()=>!u&&!b?null:e.jsxs("div",{className:"space-y-6 mb-6",children:[Ie(),Ee(),Pe()]}),Le=()=>e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-2",children:s("tickets.createFlow.attachments")}),e.jsxs("div",{className:`border-2 border-dashed rounded-lg p-6 text-center transition-colors cursor-pointer ${M?"border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10":"border-[var(--border-color)] hover:border-[var(--color-primary-600)]"}`,onClick:()=>q.current?.click(),onKeyDown:t=>{(t.key==="Enter"||t.key===" ")&&(t.preventDefault(),q.current?.click())},role:"button",tabIndex:0,onDragOver:Ne,onDragEnter:we,onDragLeave:ke,onDrop:Se,children:[e.jsx("input",{ref:q,type:"file",multiple:!0,onChange:je,accept:xe.join(","),className:"hidden"}),e.jsx(c.Paperclip,{className:`w-8 h-8 mx-auto mb-2 ${M?"text-[var(--color-primary-600)]":"text-[var(--text-secondary)]"}`}),e.jsx("p",{className:`text-sm ${M?"text-[var(--color-primary-600)] font-medium":"text-[var(--text-secondary)]"}`,children:M?s("tickets.createFlow.dropFilesNow","Drop files here"):s("tickets.createFlow.dropFilesHere")}),e.jsx("p",{className:"text-xs text-[var(--text-secondary)] mt-1",children:s("tickets.createFlow.maxFileSize",{size:"10 MB"})})]}),K.length>0&&e.jsx("div",{className:"mt-3 space-y-2",children:K.map((t,n)=>{const l=Te(t.name);return e.jsxs("div",{className:"flex items-center gap-3 p-3 bg-[var(--bg-secondary)] rounded-lg",children:[e.jsx(l,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm font-medium truncate",children:t.name}),e.jsx("p",{className:"text-xs text-[var(--text-secondary)]",children:Ce(t.size)})]}),e.jsx("button",{type:"button",onClick:ce=>{ce.stopPropagation(),pe(n)},className:"p-1 hover:bg-[var(--bg-hover)] rounded",children:e.jsx(c.X,{className:"w-4 h-4 text-[var(--text-secondary)]"})})]},`file-${t.name}-${n}`)})})]}),Ae=()=>{const n=me.find(l=>l.value===C)?.icon||c.Bug;return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[e.jsx("button",{onClick:()=>N(1),className:"btn btn-ghost p-2",children:e.jsx(c.ArrowLeft,{className:"w-5 h-5"})}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"p-2 rounded-lg bg-[var(--bg-secondary)]",children:e.jsx(n,{className:"w-5 h-5"})}),e.jsx("select",{value:C||"",onChange:l=>O(l.target.value),className:"input text-lg font-semibold bg-transparent border-none p-0 pr-8 cursor-pointer hover:text-[var(--color-primary-600)] focus:ring-0",children:me.map(l=>e.jsx("option",{value:l.value,children:s(`tickets.${l.labelKey}`)},l.value))})]}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)] mt-1",children:s("tickets.createFlow.fillDetails")})]})]}),Re(),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-2",children:[s("tickets.form.title")," ",e.jsx("span",{className:"text-[var(--error-text)]",children:"*"})]}),e.jsx("input",{type:"text",value:h,onChange:l=>te(l.target.value),placeholder:s("tickets.form.titlePlaceholder"),className:"input w-full",maxLength:200}),e.jsxs("p",{className:"text-xs text-[var(--text-secondary)] mt-1",children:[h.length,"/200"]})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-2",children:[s("tickets.form.description")," ",e.jsx("span",{className:"text-[var(--error-text)]",children:"*"})]}),e.jsx("textarea",{value:T,onChange:l=>se(l.target.value),placeholder:s("tickets.form.descriptionPlaceholder"),className:"input w-full h-40",maxLength:5e3}),e.jsxs("p",{className:"text-xs text-[var(--text-secondary)] mt-1",children:[T.length,"/5000"]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-2",children:s("tickets.form.priority")}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-2",children:ze.map(l=>e.jsxs("button",{type:"button",onClick:()=>B(l.value),className:`p-3 rounded-lg border text-center transition-colors ${A===l.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(`tickets.${l.labelKey}`)}),e.jsx("div",{className:"text-xs text-[var(--text-secondary)]",children:s(`tickets.${l.descriptionKey}`,l.value)})]},l.value))})]}),Le(),H&&e.jsxs("div",{className:"p-4 rounded-lg bg-[var(--error-bg)] text-[var(--error-text)] flex items-center gap-2",children:[e.jsx(c.AlertTriangle,{className:"w-5 h-5"}),H]}),e.jsxs("div",{className:"flex items-center justify-between pt-4 border-t border-[var(--border-color)]",children:[e.jsx("button",{onClick:()=>N(1),className:"btn btn-secondary",children:s("common:actions.back")}),e.jsxs("button",{onClick:Fe,disabled:!h.trim()||!T.trim()||U||X,className:"btn btn-primary",children:[U||X?e.jsx(c.Loader2,{className:"w-4 h-4 animate-spin mr-2"}):e.jsx(c.Send,{className:"w-4 h-4 mr-2"}),s(X?"tickets.createFlow.uploadingFiles":U?"common:actions.submitting":"common:actions.submit")]})]})]})};return e.jsxs("div",{className:"max-w-3xl mx-auto",children:[e.jsx(d.Breadcrumb,{items:[{label:s("title","Support"),href:"/support"},{label:s("list.title","Tickets"),href:"/support/tickets"},{label:s("create.title","Create Ticket")}]}),e.jsxs("div",{className:"flex items-center gap-4 mb-6 mt-6",children:[e.jsx("button",{onClick:()=>g(-1),className:"btn btn-ghost p-2",children:e.jsx(c.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(c.Headset,{className:"w-6 h-6"}),s("tickets.createFlow.title")]}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:s("tickets.createFlow.subtitle")})]}),m&&e.jsxs("button",{onClick:()=>w(!0),className:"btn btn-ghost text-[var(--error-text)] hover:bg-[var(--error-bg)]",title:s("common:drafts.discard"),children:[e.jsx(c.Trash2,{className:"w-4 h-4 mr-2"}),s("common:drafts.discard")]})]}),R?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(c.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.")})]}),Z&&e.jsxs("a",{href:Z,target:"_blank",rel:"noopener noreferrer",className:"btn btn-primary inline-flex items-center gap-2",children:[e.jsx(c.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 ${k>=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 ${k>=1?"bg-[var(--color-primary-600)] text-white":"bg-[var(--bg-secondary)]"}`,children:"1"}),e.jsx("span",{className:"font-medium",children:s("tickets.createFlow.step1")})]}),e.jsx("div",{className:`flex-1 h-0.5 ${k>=2?"bg-[var(--color-primary-600)]":"bg-[var(--border-color)]"}`}),e.jsxs("div",{className:`flex items-center gap-2 ${k>=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 ${k>=2?"bg-[var(--color-primary-600)] text-white":"bg-[var(--bg-secondary)]"}`,children:"2"}),e.jsx("span",{className:"font-medium",children:s("tickets.createFlow.step2")})]}),_?e.jsxs("div",{className:"ml-auto flex items-center gap-1.5 text-xs text-[var(--error-text)]",children:[e.jsx(c.AlertTriangle,{className:"w-3.5 h-3.5"}),e.jsx("span",{children:s("common:errors.generic")})]}):e.jsxs("div",{className:`ml-auto flex items-center gap-1.5 text-xs text-[var(--success-text)] transition-opacity duration-300 ${de?"opacity-100":"opacity-0"}`,children:[e.jsx(c.Check,{className:"w-3.5 h-3.5"}),e.jsx("span",{children:s("common:drafts.autoSaved")})]})]}),y&&!z&&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(c.Building2,{className:"w-4 h-4"}),e.jsx("span",{children:s("support:tickets.tenantPicker.creatingFor")}),e.jsx("span",{className:"font-semibold",children:y.name})]}),e.jsx("button",{onClick:()=>L(!0),className:"text-xs text-[var(--info-text)] underline hover:no-underline",children:s("common:actions.change")})]}),e.jsxs("div",{className:"card p-6",children:[k===1&&De(),k===2&&Ae()]}),oe&&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(c.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")}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:s("support:tickets.tenantPicker.description")})]})]}),e.jsx("div",{className:"space-y-2 max-h-64 overflow-y-auto",children:v.filter(t=>t.status==="Active").map(t=>e.jsx("button",{onClick:()=>{ee(t),L(!1),m&&d.ticketDraftService.updateDraft(m,{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(c.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"):s("common:tenant.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:()=>{L(!1),j||g(-1)},className:"btn btn-secondary",children:s("common:actions.cancel")})})]})}),ie&&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(c.Trash2,{className:"w-5 h-5 text-[var(--error-text)]"})}),e.jsx("h2",{className:"text-xl font-bold",children:s("common:drafts.discardConfirmTitle")})]}),e.jsx("p",{className:"text-[var(--text-secondary)] mb-6",children:s("common:drafts.discardConfirmMessage")}),e.jsxs("div",{className:"flex justify-end gap-3",children:[e.jsx("button",{onClick:()=>w(!1),className:"btn btn-secondary",children:s("common:actions.cancel")}),e.jsxs("button",{onClick:()=>{w(!1),ye()},className:"btn bg-[var(--error-bg)] text-[var(--error-text)] hover:opacity-90",children:[e.jsx(c.Trash2,{className:"w-4 h-4 mr-2"}),s("common:drafts.discardConfirm")]})]})]})})]})]})}exports.CreateSupportTicketPage=Me;
3
- //# sourceMappingURL=CreateSupportTicketPage-AVTwXbJd.js.map
3
+ //# sourceMappingURL=CreateSupportTicketPage-C2X2mfds.js.map