@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,6 +1,6 @@
1
1
  import { jsxs as l, jsx as e } from "react/jsx-runtime";
2
2
  import { useTranslation as c } from "react-i18next";
3
- import { B as n, _ as i } from "./index-DA5VyW0k.js";
3
+ import { B as n, _ as i } from "./index-CN2WRyg1.js";
4
4
  import { u as d } from "./useTabNavigation-Bsbskz0i.js";
5
5
  const a = ["all", "assigned"];
6
6
  function v() {
@@ -51,4 +51,4 @@ function v() {
51
51
  export {
52
52
  v as TicketsPage
53
53
  };
54
- //# sourceMappingURL=TicketsPage-BCgHZA-m.js.map
54
+ //# sourceMappingURL=TicketsPage-CkHgXSxU.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TicketsPage-BCgHZA-m.js","sources":["../../src/pages/platform/support/TicketsPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { TicketsListView } from '@/components/platform/support/TicketsListView';\r\nimport { useTabNavigation } from '@/hooks/useTabNavigation';\r\n\r\nconst TABS = ['all', 'assigned'] as const;\r\ntype TabId = typeof TABS[number];\r\n\r\nexport function TicketsPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n const { activeTab, setActiveTab } = useTabNavigation<TabId>('all', [...TABS]);\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('list.title', 'Tickets') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex gap-1 border-b border-[var(--border-color)]\">\r\n {TABS.map(tab => (\r\n <button\r\n key={tab}\r\n onClick={() => setActiveTab(tab)}\r\n className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${\r\n activeTab === tab\r\n ? 'border-[var(--color-primary-600)] text-[var(--color-primary-600)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]'\r\n }`}\r\n >\r\n {tab === 'all'\r\n ? t('list.tabs.all', 'All tickets')\r\n : t('list.tabs.assigned', 'Assigned to me')}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {activeTab === 'all' && (\r\n <TicketsListView\r\n mode=\"admin\"\r\n showDrafts={false}\r\n basePath=\"/support/tickets\"\r\n title={t('list.title')}\r\n subtitle={t('list.subtitle')}\r\n createPath=\"/support/tickets/new\"\r\n />\r\n )}\r\n {activeTab === 'assigned' && (\r\n <TicketsListView\r\n mode=\"assigned\"\r\n showDrafts={false}\r\n basePath=\"/support/tickets\"\r\n title={t('list.assignedTitle', 'Assigned Tickets')}\r\n subtitle={t('list.assignedSubtitle', 'Tickets assigned to you')}\r\n createPath=\"/support/tickets/new\"\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["TABS","TicketsPage","useTranslation","activeTab","setActiveTab","useTabNavigation","jsxs","jsx","Breadcrumb","tab","TicketsListView"],"mappings":";;;;AAMA,MAAMA,IAAO,CAAC,OAAO,UAAU;AAGxB,SAASC,IAA4B;AAC1C,QAAM,EAAE,EAAA,IAAMC,EAAe,SAAS,GAChC,EAAE,WAAAC,GAAW,cAAAC,EAAA,IAAiBC,EAAwB,OAAO,CAAC,GAAGL,CAAI,CAAC;AAE5E,SACE,gBAAAM,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO,EAAE,SAAS,SAAS,GAAG,MAAM,WAAA;AAAA,UACtC,EAAE,OAAO,EAAE,cAAc,SAAS,EAAA;AAAA,QAAE;AAAA,MACtC;AAAA,IAAA;AAAA,sBAGD,OAAA,EAAI,WAAU,oDACZ,UAAAR,EAAK,IAAI,CAAAS,MACR,gBAAAF;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,SAAS,MAAMH,EAAaK,CAAG;AAAA,QAC/B,WAAW,8DACTN,MAAcM,IACV,sEACA,qHACN;AAAA,QAEC,UAAAA,MAAQ,QACL,EAAE,iBAAiB,aAAa,IAChC,EAAE,sBAAsB,gBAAgB;AAAA,MAAA;AAAA,MAVvCA;AAAA,IAAA,CAYR,GACH;AAAA,IAECN,MAAc,SACb,gBAAAI;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,YAAY;AAAA,QACZ,UAAS;AAAA,QACT,OAAO,EAAE,YAAY;AAAA,QACrB,UAAU,EAAE,eAAe;AAAA,QAC3B,YAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IAGdP,MAAc,cACb,gBAAAI;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,YAAY;AAAA,QACZ,UAAS;AAAA,QACT,OAAO,EAAE,sBAAsB,kBAAkB;AAAA,QACjD,UAAU,EAAE,yBAAyB,yBAAyB;AAAA,QAC9D,YAAW;AAAA,MAAA;AAAA,IAAA;AAAA,EACb,GAEJ;AAEJ;"}
1
+ {"version":3,"file":"TicketsPage-CkHgXSxU.js","sources":["../../src/pages/platform/support/TicketsPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { TicketsListView } from '@/components/platform/support/TicketsListView';\r\nimport { useTabNavigation } from '@/hooks/useTabNavigation';\r\n\r\nconst TABS = ['all', 'assigned'] as const;\r\ntype TabId = typeof TABS[number];\r\n\r\nexport function TicketsPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n const { activeTab, setActiveTab } = useTabNavigation<TabId>('all', [...TABS]);\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('list.title', 'Tickets') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex gap-1 border-b border-[var(--border-color)]\">\r\n {TABS.map(tab => (\r\n <button\r\n key={tab}\r\n onClick={() => setActiveTab(tab)}\r\n className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${\r\n activeTab === tab\r\n ? 'border-[var(--color-primary-600)] text-[var(--color-primary-600)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]'\r\n }`}\r\n >\r\n {tab === 'all'\r\n ? t('list.tabs.all', 'All tickets')\r\n : t('list.tabs.assigned', 'Assigned to me')}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {activeTab === 'all' && (\r\n <TicketsListView\r\n mode=\"admin\"\r\n showDrafts={false}\r\n basePath=\"/support/tickets\"\r\n title={t('list.title')}\r\n subtitle={t('list.subtitle')}\r\n createPath=\"/support/tickets/new\"\r\n />\r\n )}\r\n {activeTab === 'assigned' && (\r\n <TicketsListView\r\n mode=\"assigned\"\r\n showDrafts={false}\r\n basePath=\"/support/tickets\"\r\n title={t('list.assignedTitle', 'Assigned Tickets')}\r\n subtitle={t('list.assignedSubtitle', 'Tickets assigned to you')}\r\n createPath=\"/support/tickets/new\"\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["TABS","TicketsPage","useTranslation","activeTab","setActiveTab","useTabNavigation","jsxs","jsx","Breadcrumb","tab","TicketsListView"],"mappings":";;;;AAMA,MAAMA,IAAO,CAAC,OAAO,UAAU;AAGxB,SAASC,IAA4B;AAC1C,QAAM,EAAE,EAAA,IAAMC,EAAe,SAAS,GAChC,EAAE,WAAAC,GAAW,cAAAC,EAAA,IAAiBC,EAAwB,OAAO,CAAC,GAAGL,CAAI,CAAC;AAE5E,SACE,gBAAAM,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO,EAAE,SAAS,SAAS,GAAG,MAAM,WAAA;AAAA,UACtC,EAAE,OAAO,EAAE,cAAc,SAAS,EAAA;AAAA,QAAE;AAAA,MACtC;AAAA,IAAA;AAAA,sBAGD,OAAA,EAAI,WAAU,oDACZ,UAAAR,EAAK,IAAI,CAAAS,MACR,gBAAAF;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,SAAS,MAAMH,EAAaK,CAAG;AAAA,QAC/B,WAAW,8DACTN,MAAcM,IACV,sEACA,qHACN;AAAA,QAEC,UAAAA,MAAQ,QACL,EAAE,iBAAiB,aAAa,IAChC,EAAE,sBAAsB,gBAAgB;AAAA,MAAA;AAAA,MAVvCA;AAAA,IAAA,CAYR,GACH;AAAA,IAECN,MAAc,SACb,gBAAAI;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,YAAY;AAAA,QACZ,UAAS;AAAA,QACT,OAAO,EAAE,YAAY;AAAA,QACrB,UAAU,EAAE,eAAe;AAAA,QAC3B,YAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IAGdP,MAAc,cACb,gBAAAI;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,YAAY;AAAA,QACZ,UAAS;AAAA,QACT,OAAO,EAAE,sBAAsB,kBAAkB;AAAA,QACjD,UAAU,EAAE,yBAAyB,yBAAyB;AAAA,QAC9D,YAAW;AAAA,MAAA;AAAA,IAAA;AAAA,EACb,GAEJ;AAEJ;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),l=require("react-i18next"),r=require("./index-vXiLh35n.js"),c=require("./useTabNavigation-BVtbCTd5.js"),a=["all","assigned"];function n(){const{t:e}=l.useTranslation("support"),{activeTab:i,setActiveTab:o}=c.useTabNavigation("all",[...a]);return t.jsxs("div",{className:"space-y-4",children:[t.jsx(r.Breadcrumb,{items:[{label:e("title","Support"),href:"/support"},{label:e("list.title","Tickets")}]}),t.jsx("div",{className:"flex gap-1 border-b border-[var(--border-color)]",children:a.map(s=>t.jsx("button",{onClick:()=>o(s),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${i===s?"border-[var(--color-primary-600)] text-[var(--color-primary-600)]":"border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]"}`,children:s==="all"?e("list.tabs.all","All tickets"):e("list.tabs.assigned","Assigned to me")},s))}),i==="all"&&t.jsx(r.TicketsListView,{mode:"admin",showDrafts:!1,basePath:"/support/tickets",title:e("list.title"),subtitle:e("list.subtitle"),createPath:"/support/tickets/new"}),i==="assigned"&&t.jsx(r.TicketsListView,{mode:"assigned",showDrafts:!1,basePath:"/support/tickets",title:e("list.assignedTitle","Assigned Tickets"),subtitle:e("list.assignedSubtitle","Tickets assigned to you"),createPath:"/support/tickets/new"})]})}exports.TicketsPage=n;
2
- //# sourceMappingURL=TicketsPage-BjaN4Baq.js.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),l=require("react-i18next"),r=require("./index-cAikSVW0.js"),c=require("./useTabNavigation-BVtbCTd5.js"),a=["all","assigned"];function n(){const{t:e}=l.useTranslation("support"),{activeTab:i,setActiveTab:o}=c.useTabNavigation("all",[...a]);return t.jsxs("div",{className:"space-y-4",children:[t.jsx(r.Breadcrumb,{items:[{label:e("title","Support"),href:"/support"},{label:e("list.title","Tickets")}]}),t.jsx("div",{className:"flex gap-1 border-b border-[var(--border-color)]",children:a.map(s=>t.jsx("button",{onClick:()=>o(s),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${i===s?"border-[var(--color-primary-600)] text-[var(--color-primary-600)]":"border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]"}`,children:s==="all"?e("list.tabs.all","All tickets"):e("list.tabs.assigned","Assigned to me")},s))}),i==="all"&&t.jsx(r.TicketsListView,{mode:"admin",showDrafts:!1,basePath:"/support/tickets",title:e("list.title"),subtitle:e("list.subtitle"),createPath:"/support/tickets/new"}),i==="assigned"&&t.jsx(r.TicketsListView,{mode:"assigned",showDrafts:!1,basePath:"/support/tickets",title:e("list.assignedTitle","Assigned Tickets"),subtitle:e("list.assignedSubtitle","Tickets assigned to you"),createPath:"/support/tickets/new"})]})}exports.TicketsPage=n;
2
+ //# sourceMappingURL=TicketsPage-Dwi2xpMI.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TicketsPage-BjaN4Baq.js","sources":["../../src/pages/platform/support/TicketsPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { TicketsListView } from '@/components/platform/support/TicketsListView';\r\nimport { useTabNavigation } from '@/hooks/useTabNavigation';\r\n\r\nconst TABS = ['all', 'assigned'] as const;\r\ntype TabId = typeof TABS[number];\r\n\r\nexport function TicketsPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n const { activeTab, setActiveTab } = useTabNavigation<TabId>('all', [...TABS]);\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('list.title', 'Tickets') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex gap-1 border-b border-[var(--border-color)]\">\r\n {TABS.map(tab => (\r\n <button\r\n key={tab}\r\n onClick={() => setActiveTab(tab)}\r\n className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${\r\n activeTab === tab\r\n ? 'border-[var(--color-primary-600)] text-[var(--color-primary-600)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]'\r\n }`}\r\n >\r\n {tab === 'all'\r\n ? t('list.tabs.all', 'All tickets')\r\n : t('list.tabs.assigned', 'Assigned to me')}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {activeTab === 'all' && (\r\n <TicketsListView\r\n mode=\"admin\"\r\n showDrafts={false}\r\n basePath=\"/support/tickets\"\r\n title={t('list.title')}\r\n subtitle={t('list.subtitle')}\r\n createPath=\"/support/tickets/new\"\r\n />\r\n )}\r\n {activeTab === 'assigned' && (\r\n <TicketsListView\r\n mode=\"assigned\"\r\n showDrafts={false}\r\n basePath=\"/support/tickets\"\r\n title={t('list.assignedTitle', 'Assigned Tickets')}\r\n subtitle={t('list.assignedSubtitle', 'Tickets assigned to you')}\r\n createPath=\"/support/tickets/new\"\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["TABS","TicketsPage","t","useTranslation","activeTab","setActiveTab","useTabNavigation","jsxs","jsx","Breadcrumb","tab","TicketsListView"],"mappings":"6NAMMA,EAAO,CAAC,MAAO,UAAU,EAGxB,SAASC,GAA4B,CAC1C,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAAA,eAAe,SAAS,EAChC,CAAE,UAAAC,EAAW,aAAAC,CAAA,EAAiBC,EAAAA,iBAAwB,MAAO,CAAC,GAAGN,CAAI,CAAC,EAE5E,OACEO,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAC,EAAAA,IAACC,EAAAA,WAAA,CACC,MAAO,CACL,CAAE,MAAOP,EAAE,QAAS,SAAS,EAAG,KAAM,UAAA,EACtC,CAAE,MAAOA,EAAE,aAAc,SAAS,CAAA,CAAE,CACtC,CAAA,QAGD,MAAA,CAAI,UAAU,mDACZ,SAAAF,EAAK,IAAIU,GACRF,EAAAA,IAAC,SAAA,CAEC,QAAS,IAAMH,EAAaK,CAAG,EAC/B,UAAW,8DACTN,IAAcM,EACV,oEACA,qHACN,GAEC,SAAAA,IAAQ,MACLR,EAAE,gBAAiB,aAAa,EAChCA,EAAE,qBAAsB,gBAAgB,CAAA,EAVvCQ,CAAA,CAYR,EACH,EAECN,IAAc,OACbI,EAAAA,IAACG,EAAAA,gBAAA,CACC,KAAK,QACL,WAAY,GACZ,SAAS,mBACT,MAAOT,EAAE,YAAY,EACrB,SAAUA,EAAE,eAAe,EAC3B,WAAW,sBAAA,CAAA,EAGdE,IAAc,YACbI,EAAAA,IAACG,EAAAA,gBAAA,CACC,KAAK,WACL,WAAY,GACZ,SAAS,mBACT,MAAOT,EAAE,qBAAsB,kBAAkB,EACjD,SAAUA,EAAE,wBAAyB,yBAAyB,EAC9D,WAAW,sBAAA,CAAA,CACb,EAEJ,CAEJ"}
1
+ {"version":3,"file":"TicketsPage-Dwi2xpMI.js","sources":["../../src/pages/platform/support/TicketsPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { TicketsListView } from '@/components/platform/support/TicketsListView';\r\nimport { useTabNavigation } from '@/hooks/useTabNavigation';\r\n\r\nconst TABS = ['all', 'assigned'] as const;\r\ntype TabId = typeof TABS[number];\r\n\r\nexport function TicketsPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n const { activeTab, setActiveTab } = useTabNavigation<TabId>('all', [...TABS]);\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('list.title', 'Tickets') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex gap-1 border-b border-[var(--border-color)]\">\r\n {TABS.map(tab => (\r\n <button\r\n key={tab}\r\n onClick={() => setActiveTab(tab)}\r\n className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${\r\n activeTab === tab\r\n ? 'border-[var(--color-primary-600)] text-[var(--color-primary-600)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]'\r\n }`}\r\n >\r\n {tab === 'all'\r\n ? t('list.tabs.all', 'All tickets')\r\n : t('list.tabs.assigned', 'Assigned to me')}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {activeTab === 'all' && (\r\n <TicketsListView\r\n mode=\"admin\"\r\n showDrafts={false}\r\n basePath=\"/support/tickets\"\r\n title={t('list.title')}\r\n subtitle={t('list.subtitle')}\r\n createPath=\"/support/tickets/new\"\r\n />\r\n )}\r\n {activeTab === 'assigned' && (\r\n <TicketsListView\r\n mode=\"assigned\"\r\n showDrafts={false}\r\n basePath=\"/support/tickets\"\r\n title={t('list.assignedTitle', 'Assigned Tickets')}\r\n subtitle={t('list.assignedSubtitle', 'Tickets assigned to you')}\r\n createPath=\"/support/tickets/new\"\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["TABS","TicketsPage","t","useTranslation","activeTab","setActiveTab","useTabNavigation","jsxs","jsx","Breadcrumb","tab","TicketsListView"],"mappings":"6NAMMA,EAAO,CAAC,MAAO,UAAU,EAGxB,SAASC,GAA4B,CAC1C,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAAA,eAAe,SAAS,EAChC,CAAE,UAAAC,EAAW,aAAAC,CAAA,EAAiBC,EAAAA,iBAAwB,MAAO,CAAC,GAAGN,CAAI,CAAC,EAE5E,OACEO,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAC,EAAAA,IAACC,EAAAA,WAAA,CACC,MAAO,CACL,CAAE,MAAOP,EAAE,QAAS,SAAS,EAAG,KAAM,UAAA,EACtC,CAAE,MAAOA,EAAE,aAAc,SAAS,CAAA,CAAE,CACtC,CAAA,QAGD,MAAA,CAAI,UAAU,mDACZ,SAAAF,EAAK,IAAIU,GACRF,EAAAA,IAAC,SAAA,CAEC,QAAS,IAAMH,EAAaK,CAAG,EAC/B,UAAW,8DACTN,IAAcM,EACV,oEACA,qHACN,GAEC,SAAAA,IAAQ,MACLR,EAAE,gBAAiB,aAAa,EAChCA,EAAE,qBAAsB,gBAAgB,CAAA,EAVvCQ,CAAA,CAYR,EACH,EAECN,IAAc,OACbI,EAAAA,IAACG,EAAAA,gBAAA,CACC,KAAK,QACL,WAAY,GACZ,SAAS,mBACT,MAAOT,EAAE,YAAY,EACrB,SAAUA,EAAE,eAAe,EAC3B,WAAW,sBAAA,CAAA,EAGdE,IAAc,YACbI,EAAAA,IAACG,EAAAA,gBAAA,CACC,KAAK,WACL,WAAY,GACZ,SAAS,mBACT,MAAOT,EAAE,qBAAsB,kBAAkB,EACjD,SAAUA,EAAE,wBAAyB,yBAAyB,EAC9D,WAAW,sBAAA,CAAA,CACb,EAEJ,CAEJ"}
@@ -1,6 +1,6 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),r=require("react"),pe=require("react-router-dom"),Ee=require("react-i18next"),n=require("lucide-react"),o=require("./index-vXiLh35n.js"),Ke=require("./ScreenshotAnnotator-CoRDpHXW.js"),J=[{value:"Bug",label:"Report a Bug",labelKey:"tickets.types.bug",description:"Something is not working correctly",descriptionKey:"tickets.types.bugDescription",icon:n.Bug},{value:"FeatureRequest",label:"Request a Feature",labelKey:"tickets.types.featureRequest",description:"Suggest an improvement or new feature",descriptionKey:"tickets.types.featureRequestDescription",icon:n.Lightbulb},{value:"ApplicationRequest",label:"Request an Application",labelKey:"tickets.types.applicationRequest",description:"Request access to a new application",descriptionKey:"tickets.types.applicationRequestDescription",icon:n.AppWindow},{value:"Support",label:"General Support",labelKey:"tickets.types.support",description:"Need help with something",descriptionKey:"tickets.types.supportDescription",icon:n.MessageSquare},{value:"Question",label:"Ask a Question",labelKey:"tickets.types.question",description:"Have a question about the platform",descriptionKey:"tickets.types.questionDescription",icon:n.HelpCircle}],$e=[{value:"Low",label:"Low",labelKey:"tickets.priority.low",description:"Can wait, not urgent",descriptionKey:"tickets.priority.lowDescription"},{value:"Medium",label:"Medium",labelKey:"tickets.priority.medium",description:"Normal priority",descriptionKey:"tickets.priority.mediumDescription"},{value:"High",label:"High",labelKey:"tickets.priority.high",description:"Important, needs attention soon",descriptionKey:"tickets.priority.highDescription"},{value:"Critical",label:"Critical",labelKey:"tickets.priority.critical",description:"Urgent, blocking work",descriptionKey:"tickets.priority.criticalDescription"}],xe=10*1024*1024,he=5,Ue=[".pdf",".doc",".docx",".xls",".xlsx",".txt",".csv",".zip",".rar",".7z",".png",".jpg",".jpeg",".gif",".webp",".bmp"];function Me(c){return c<1024?`${c} B`:c<1024*1024?`${(c/1024).toFixed(1)} KB`:`${(c/(1024*1024)).toFixed(1)} MB`}function ze(c){return c.includes("pdf")?n.FileText:c.startsWith("image/")?n.Image:n.File}function He(c,u){if(!c)return{draft:null,selectedTenant:null};const s=o.ticketDraftService.getDraft(c);if(!s)return{draft:null,selectedTenant:null};let g=null;if(s.tenantId&&s.tenantSlug){const x=u.find(h=>h.id===s.tenantId);x&&(g=x)}return{draft:s,selectedTenant:g}}function Oe(c){if(!c?.screenshot)return{screenshot:null,autoSelectType:null};let u=null;return c.recentErrors.length>0&&(u="Bug"),{screenshot:c.screenshot,autoSelectType:u}}async function We(c,u,s){try{const x=await(await fetch(u)).blob(),h=new File([x],"screenshot.png",{type:"image/png"});if(s){const N=new FormData;N.append("file",h);const K={"X-Tenant-Slug":s.slug};await o.api.post(`/api/support/my-tickets/${c}/attachments`,N,{headers:{"Content-Type":"multipart/form-data",...K}})}else await o.myTicketsApi.uploadAttachment(c,h)}catch{}}async function Ge(c,u,s){for(const g of u)try{if(s){const x=new FormData;x.append("file",g.file);const h={"X-Tenant-Slug":s.slug};await o.api.post(`/api/support/my-tickets/${c}/attachments`,x,{headers:{"Content-Type":"multipart/form-data",...h}})}else await o.myTicketsApi.uploadAttachment(c,g.file)}catch{}}function Xe(){const c=pe.useNavigate(),[u]=pe.useSearchParams(),{t:s}=Ee.useTranslation(["support","common"]),{isGlpi:g,glpiBaseUrl:x}=o.useTicketingProvider(),{currentTenant:h,userTenants:N,isGlobalView:K}=o.useTenant(),A=r.useRef(null),P=r.useRef(null),[y,Y]=r.useState(null),[fe,R]=r.useState(!1),D=h??y;r.useEffect(()=>{!h&&K&&N.length>0&&R(!0)},[h,K,N.length]);const H=u.get("draft"),[w,F]=r.useState(1),[m,$]=r.useState(null),[b,O]=r.useState(""),[j,W]=r.useState(""),[T,G]=r.useState("Medium"),[ee,te]=r.useState(!1),[se,f]=r.useState(null),[v,ve]=r.useState(null),[X,be]=r.useState(!0),[re,U]=r.useState(null),[S,B]=r.useState(null),[ae,V]=r.useState(!1),[C,ne]=r.useState([]),[ce,_]=r.useState(!1),[l,ge]=r.useState(H),[ye,ie]=r.useState(!1),[je,oe]=r.useState(!1),p=r.useRef(null),le=r.useRef(!1),L=r.useRef(!1),q=r.useCallback(()=>{if(!l)return!1;const t=o.ticketDraftService.updateDraft(l,{type:m,title:b,description:j,priority:T,includeScreenshot:!!S,includeErrorLogs:!1,screenshot:S??void 0,tenantId:D?.id,tenantSlug:D?.slug,tenantName:D?.name});return t.success&&(L.current=!1,ie(!0),setTimeout(()=>ie(!1),2e3)),t.success},[l,m,b,j,T,S,D]),Q=r.useCallback(()=>{if(l)return l;const t=o.ticketDraftService.createDraft();return ge(t.id),t.id},[l]);r.useEffect(()=>{if(le.current&&!(!m&&!b&&!j)){if(L.current=!0,!l){Q();return}return p.current&&clearTimeout(p.current),p.current=setTimeout(()=>{q()},1e3),()=>{p.current&&clearTimeout(p.current)}}},[m,b,j,T,S,l,q,Q]),r.useEffect(()=>{const t=()=>{L.current&&l&&q()};return window.addEventListener("beforeunload",t),()=>{window.removeEventListener("beforeunload",t),L.current&&l&&q(),p.current&&clearTimeout(p.current)}},[l,q]);const ke=r.useCallback(()=>{l&&o.ticketDraftService.deleteDraft(l),p.current&&(clearTimeout(p.current),p.current=null),c(-1)},[l,c]);r.useEffect(()=>{const{draft:t,selectedTenant:a}=He(H,N);if(t&&(t.type&&($(t.type),F(2)),t.title&&O(t.title),t.description&&W(t.description),t.priority&&G(t.priority),t.screenshot&&(U(t.screenshot),B(t.screenshot)),a&&Y(a)),!t){const I=["Bug","FeatureRequest","Suggestion","ApplicationRequest","Support","Question"],Z=u.get("type"),me=u.get("subject"),ue=u.get("body");Z&&I.includes(Z)&&($(Z),F(2)),me&&O(decodeURIComponent(me)),ue&&W(decodeURIComponent(ue))}const d=o.errorContextService.loadContext(),{screenshot:i,autoSelectType:E}=Oe(d);i&&!S&&(U(i),B(i),E&&!m&&($(E),G("High"))),o.errorContextService.clearContext();const k=o.browserInfoService.captureBrowserInfo();ve(k),setTimeout(()=>{le.current=!0},100)},[H]);const M=r.useCallback(t=>{if(!t.type.startsWith("image/")){f(s("tickets.create.invalidImageType","Please select a valid image file"));return}if(t.size>xe){f(s("tickets.create.imageTooLarge","Image must be less than 10MB"));return}const a=new FileReader;a.onload=d=>{const i=d.target?.result;U(i),B(i),f(null)},a.onerror=()=>{f(s("tickets.create.imageReadError","Failed to read image file"))},a.readAsDataURL(t)},[s]),Ne=r.useCallback(t=>{const a=t.target.files?.[0];a&&M(a)},[M]),we=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),V(!0)},[]),Se=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),V(!1)},[]),De=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),V(!1);const a=t.dataTransfer.files;if(a.length>0){const d=a[0];d.type.startsWith("image/")?M(d):f(s("tickets.create.invalidImageType","Please select a valid image file"))}},[M,s]),Te=r.useCallback(()=>{U(null),B(null),A.current&&(A.current.value="")},[]),Ce=r.useCallback(t=>{B(t)},[]),de=r.useCallback(t=>{if(t.type.startsWith("image/"))return!0;const a="."+t.name.split(".").pop()?.toLowerCase();return Ue.includes(a)},[]),z=r.useCallback(t=>{const a=[];for(let d=0;d<t.length;d++){const i=t[d];if(C.length+a.length>=he){f(s("tickets.create.maxAttachments",`Maximum ${he} attachments allowed`));break}if(i.size>xe){f(s("tickets.create.fileTooLarge",`File "${i.name}" is too large (max 10MB)`));continue}if(!de(i)){f(s("tickets.create.invalidFileType",`File type not allowed: ${i.name}`));continue}C.some(k=>k.name===i.name&&k.size===i.size)||a.push({id:crypto.randomUUID(),file:i,name:i.name,size:i.size,type:i.type})}a.length>0&&(ne(d=>[...d,...a]),f(null))},[C,de,s]),Ie=r.useCallback(t=>{const a=t.target.files;a&&z(a),P.current&&(P.current.value="")},[z]),Ae=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),_(!0)},[]),Pe=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),_(!1)},[]),Re=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),_(!1);const a=t.dataTransfer.files;a.length>0&&z(a)},[z]),Fe=r.useCallback(t=>{ne(a=>a.filter(d=>d.id!==t))},[]),Be=async()=>{if(!(!m||!b.trim()||!j.trim())){if(!D){R(!0);return}try{te(!0),f(null);let t=j.trim();X&&v&&(t+=`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),r=require("react"),pe=require("react-router-dom"),Ee=require("react-i18next"),n=require("lucide-react"),i=require("./index-cAikSVW0.js"),Ke=require("./ScreenshotAnnotator-CoRDpHXW.js"),J=[{value:"Bug",label:"Report a Bug",labelKey:"tickets.types.bug",description:"Something is not working correctly",descriptionKey:"tickets.types.bugDescription",icon:n.Bug},{value:"FeatureRequest",label:"Request a Feature",labelKey:"tickets.types.featureRequest",description:"Suggest an improvement or new feature",descriptionKey:"tickets.types.featureRequestDescription",icon:n.Lightbulb},{value:"ApplicationRequest",label:"Request an Application",labelKey:"tickets.types.applicationRequest",description:"Request access to a new application",descriptionKey:"tickets.types.applicationRequestDescription",icon:n.AppWindow},{value:"Support",label:"General Support",labelKey:"tickets.types.support",description:"Need help with something",descriptionKey:"tickets.types.supportDescription",icon:n.MessageSquare},{value:"Question",label:"Ask a Question",labelKey:"tickets.types.question",description:"Have a question about the platform",descriptionKey:"tickets.types.questionDescription",icon:n.HelpCircle}],$e=[{value:"Low",label:"Low",labelKey:"tickets.priority.low",description:"Can wait, not urgent",descriptionKey:"tickets.priority.lowDescription"},{value:"Medium",label:"Medium",labelKey:"tickets.priority.medium",description:"Normal priority",descriptionKey:"tickets.priority.mediumDescription"},{value:"High",label:"High",labelKey:"tickets.priority.high",description:"Important, needs attention soon",descriptionKey:"tickets.priority.highDescription"},{value:"Critical",label:"Critical",labelKey:"tickets.priority.critical",description:"Urgent, blocking work",descriptionKey:"tickets.priority.criticalDescription"}],xe=10*1024*1024,he=5,Ue=[".pdf",".doc",".docx",".xls",".xlsx",".txt",".csv",".zip",".rar",".7z",".png",".jpg",".jpeg",".gif",".webp",".bmp"];function Me(c){return c<1024?`${c} B`:c<1024*1024?`${(c/1024).toFixed(1)} KB`:`${(c/(1024*1024)).toFixed(1)} MB`}function ze(c){return c.includes("pdf")?n.FileText:c.startsWith("image/")?n.Image:n.File}function He(c,u){if(!c)return{draft:null,selectedTenant:null};const s=i.ticketDraftService.getDraft(c);if(!s)return{draft:null,selectedTenant:null};let b=null;if(s.tenantId&&s.tenantSlug){const x=u.find(h=>h.id===s.tenantId);x&&(b=x)}return{draft:s,selectedTenant:b}}function Oe(c){if(!c?.screenshot)return{screenshot:null,autoSelectType:null};let u=null;return c.recentErrors.length>0&&(u="Bug"),{screenshot:c.screenshot,autoSelectType:u}}async function We(c,u,s){try{const x=await(await fetch(u)).blob(),h=new File([x],"screenshot.png",{type:"image/png"});if(s){const N=new FormData;N.append("file",h);const K={"X-Tenant-Slug":s.slug};await i.api.post(`/api/support/my-tickets/${c}/attachments`,N,{headers:{"Content-Type":"multipart/form-data",...K}})}else await i.myTicketsApi.uploadAttachment(c,h)}catch{}}async function Ge(c,u,s){for(const b of u)try{if(s){const x=new FormData;x.append("file",b.file);const h={"X-Tenant-Slug":s.slug};await i.api.post(`/api/support/my-tickets/${c}/attachments`,x,{headers:{"Content-Type":"multipart/form-data",...h}})}else await i.myTicketsApi.uploadAttachment(c,b.file)}catch{}}function Xe(){const c=pe.useNavigate(),[u]=pe.useSearchParams(),{t:s}=Ee.useTranslation(["support","common"]),{isGlpi:b,glpiBaseUrl:x}=i.useTicketingProvider(),{currentTenant:h,userTenants:N,isGlobalView:K}=i.useTenant(),A=r.useRef(null),P=r.useRef(null),[y,Y]=r.useState(null),[fe,R]=r.useState(!1),D=h??y;r.useEffect(()=>{!h&&K&&N.length>0&&R(!0)},[h,K,N.length]);const H=u.get("draft"),[w,F]=r.useState(1),[m,$]=r.useState(null),[v,O]=r.useState(""),[j,W]=r.useState(""),[T,G]=r.useState("Medium"),[ee,te]=r.useState(!1),[se,f]=r.useState(null),[g,ge]=r.useState(null),[X,ve]=r.useState(!0),[re,U]=r.useState(null),[S,B]=r.useState(null),[ae,V]=r.useState(!1),[C,ne]=r.useState([]),[ce,_]=r.useState(!1),[o,be]=r.useState(H),[ye,ie]=r.useState(!1),[je,le]=r.useState(!1),p=r.useRef(null),oe=r.useRef(!1),L=r.useRef(!1),q=r.useCallback(()=>{if(!o)return!1;const t=i.ticketDraftService.updateDraft(o,{type:m,title:v,description:j,priority:T,includeScreenshot:!!S,includeErrorLogs:!1,screenshot:S??void 0,tenantId:D?.id,tenantSlug:D?.slug,tenantName:D?.name});return t.success&&(L.current=!1,ie(!0),setTimeout(()=>ie(!1),2e3)),t.success},[o,m,v,j,T,S,D]),Q=r.useCallback(()=>{if(o)return o;const t=i.ticketDraftService.createDraft();return be(t.id),t.id},[o]);r.useEffect(()=>{if(oe.current&&!(!m&&!v&&!j)){if(L.current=!0,!o){Q();return}return p.current&&clearTimeout(p.current),p.current=setTimeout(()=>{q()},1e3),()=>{p.current&&clearTimeout(p.current)}}},[m,v,j,T,S,o,q,Q]),r.useEffect(()=>{const t=()=>{L.current&&o&&q()};return window.addEventListener("beforeunload",t),()=>{window.removeEventListener("beforeunload",t),L.current&&o&&q(),p.current&&clearTimeout(p.current)}},[o,q]);const ke=r.useCallback(()=>{o&&i.ticketDraftService.deleteDraft(o),p.current&&(clearTimeout(p.current),p.current=null),c(-1)},[o,c]);r.useEffect(()=>{const{draft:t,selectedTenant:a}=He(H,N);if(t&&(t.type&&($(t.type),F(2)),t.title&&O(t.title),t.description&&W(t.description),t.priority&&G(t.priority),t.screenshot&&(U(t.screenshot),B(t.screenshot)),a&&Y(a)),!t){const I=["Bug","FeatureRequest","Suggestion","ApplicationRequest","Support","Question"],Z=u.get("type"),me=u.get("subject"),ue=u.get("body");Z&&I.includes(Z)&&($(Z),F(2)),me&&O(decodeURIComponent(me)),ue&&W(decodeURIComponent(ue))}const d=i.errorContextService.loadContext(),{screenshot:l,autoSelectType:E}=Oe(d);l&&!S&&(U(l),B(l),E&&!m&&($(E),G("High"))),i.errorContextService.clearContext();const k=i.browserInfoService.captureBrowserInfo();ge(k),setTimeout(()=>{oe.current=!0},100)},[H]);const M=r.useCallback(t=>{if(!t.type.startsWith("image/")){f(s("tickets.create.invalidImageType","Please select a valid image file"));return}if(t.size>xe){f(s("tickets.create.imageTooLarge","Image must be less than 10MB"));return}const a=new FileReader;a.onload=d=>{const l=d.target?.result;U(l),B(l),f(null)},a.onerror=()=>{f(s("tickets.create.imageReadError","Failed to read image file"))},a.readAsDataURL(t)},[s]),Ne=r.useCallback(t=>{const a=t.target.files?.[0];a&&M(a)},[M]),we=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),V(!0)},[]),Se=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),V(!1)},[]),De=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),V(!1);const a=t.dataTransfer.files;if(a.length>0){const d=a[0];d.type.startsWith("image/")?M(d):f(s("tickets.create.invalidImageType","Please select a valid image file"))}},[M,s]),Te=r.useCallback(()=>{U(null),B(null),A.current&&(A.current.value="")},[]),Ce=r.useCallback(t=>{B(t)},[]),de=r.useCallback(t=>{if(t.type.startsWith("image/"))return!0;const a="."+t.name.split(".").pop()?.toLowerCase();return Ue.includes(a)},[]),z=r.useCallback(t=>{const a=[];for(let d=0;d<t.length;d++){const l=t[d];if(C.length+a.length>=he){f(s("tickets.create.maxAttachments",`Maximum ${he} attachments allowed`));break}if(l.size>xe){f(s("tickets.create.fileTooLarge",`File "${l.name}" is too large (max 10MB)`));continue}if(!de(l)){f(s("tickets.create.invalidFileType",`File type not allowed: ${l.name}`));continue}C.some(k=>k.name===l.name&&k.size===l.size)||a.push({id:i.generateUUID(),file:l,name:l.name,size:l.size,type:l.type})}a.length>0&&(ne(d=>[...d,...a]),f(null))},[C,de,s]),Ie=r.useCallback(t=>{const a=t.target.files;a&&z(a),P.current&&(P.current.value="")},[z]),Ae=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),_(!0)},[]),Pe=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),_(!1)},[]),Re=r.useCallback(t=>{t.preventDefault(),t.stopPropagation(),_(!1);const a=t.dataTransfer.files;a.length>0&&z(a)},[z]),Fe=r.useCallback(t=>{ne(a=>a.filter(d=>d.id!==t))},[]),Be=async()=>{if(!(!m||!v.trim()||!j.trim())){if(!D){R(!0);return}try{te(!0),f(null);let t=j.trim();X&&g&&(t+=`
2
2
 
3
3
  ---
4
4
  **System Information:**
5
- `+o.browserInfoService.formatForDescription(v));const a=v||o.browserInfoService.captureBrowserInfo(),d=o.logService.getRecentErrors().slice(0,5),i={sourceUrl:window.location.href,browser:{name:a.browser,version:a.browserVersion,language:a.language},os:{name:a.os,version:a.osVersion},device:{type:a.deviceType,screenResolution:a.screenResolution},recentErrors:d.map(I=>({message:I.message,stack:I.stack,component:I.component,timestamp:I.timestamp.toISOString()}))},E=y?{"X-Tenant-Slug":y.slug}:{},k=y?await o.api.post("/api/support/my-tickets",{title:b.trim(),description:t,type:m,priority:T,clientContext:i},{headers:E}):await o.myTicketsApi.create({title:b.trim(),description:t,type:m,priority:T,clientContext:i});S&&await We(k.id,S,y),await Ge(k.id,C,y),l&&o.ticketDraftService.deleteDraft(l),p.current&&(clearTimeout(p.current),p.current=null),L.current=!1,c(`/support/my-tickets/${k.id}?tab=submitted`)}catch(t){const a=t&&typeof t=="object"&&"message"in t?t.message:null;f(a||s("tickets.create.submitError","Failed to create ticket. Please try again."))}finally{te(!1)}}},Le=()=>e.jsxs("div",{className:"space-y-4",children:[e.jsx("h2",{className:"text-lg font-semibold mb-4",children:s("tickets.create.selectType","What type of request do you have?")}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:J.map(t=>e.jsx("button",{onClick:()=>{$(t.value),F(2)},className:`card p-4 text-left hover:shadow-md transition-shadow ${m===t.value?"ring-2 ring-[var(--color-primary-600)]":""}`,children:e.jsxs("div",{className:"flex items-start gap-4",children:[e.jsx("div",{className:"p-3 rounded-lg bg-[var(--bg-secondary)]",children:e.jsx(t.icon,{className:"w-6 h-6"})}),e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium",children:s(t.labelKey,t.label)}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:s(t.descriptionKey,t.description)})]})]})},t.value))})]}),qe=()=>e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[e.jsx("button",{onClick:()=>F(1),className:"btn btn-ghost p-2",children:e.jsx(n.ArrowLeft,{className:"w-5 h-5"})}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold",children:s(J.find(t=>t.value===m)?.labelKey||"",{defaultValue:J.find(t=>t.value===m)?.label})}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:s("tickets.create.fillDetails","Fill in the details below")})]})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-2",children:[s("tickets.form.title","Title")," ",e.jsx("span",{className:"text-[var(--error-text)]",children:"*"})]}),e.jsx("input",{type:"text",value:b,onChange:t=>O(t.target.value),placeholder:s("tickets.create.titlePlaceholder","Brief summary of your request"),className:"input w-full",maxLength:200}),e.jsxs("p",{className:"text-xs text-[var(--text-secondary)] mt-1",children:[b.length,"/200 ",s("common:text.characters","characters")]})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-2",children:[s("tickets.create.description","Description")," ",e.jsx("span",{className:"text-[var(--error-text)]",children:"*"})]}),e.jsx("textarea",{value:j,onChange:t=>W(t.target.value),placeholder:m==="Bug"?s("tickets.create.bugPlaceholder","Please describe the issue in detail. Include steps to reproduce, expected behavior, and actual behavior."):m==="FeatureRequest"?s("tickets.create.featurePlaceholder","Describe the feature you would like to see and why it would be useful."):m==="ApplicationRequest"?s("tickets.create.applicationPlaceholder","Which application do you need access to and why?"):s("tickets.create.defaultPlaceholder","Please provide as much detail as possible."),className:"input w-full h-40",maxLength:5e3}),e.jsxs("p",{className:"text-xs text-[var(--text-secondary)] mt-1",children:[j.length,"/5000 ",s("common:text.characters","characters")]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-2",children:s("tickets.create.priority","Priority")}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-2",children:$e.map(t=>e.jsxs("button",{type:"button",onClick:()=>G(t.value),className:`p-3 rounded-lg border text-center transition-colors ${T===t.value?"border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10":"border-[var(--border-color)] hover:bg-[var(--bg-hover)]"}`,children:[e.jsx("div",{className:"font-medium",children:s(t.labelKey,t.label)}),e.jsx("div",{className:"text-xs text-[var(--text-secondary)]",children:s(t.descriptionKey,t.description)})]},t.value))})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-2",children:[e.jsx(n.Image,{className:"w-4 h-4 inline mr-2"}),s("tickets.create.screenshot","Screenshot"),e.jsxs("span",{className:"text-[var(--text-secondary)] font-normal ml-2",children:["(",s("common:text.optional","optional"),")"]})]}),re?e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:s("tickets.create.screenshotUploaded","Screenshot uploaded - you can annotate it below")}),e.jsx("button",{type:"button",onClick:Te,className:"btn btn-ghost p-2 text-[var(--error-text)]",title:s("tickets.create.removeScreenshot","Remove screenshot"),children:e.jsx(n.X,{className:"w-4 h-4"})})]}),e.jsx(Ke.ScreenshotAnnotator,{screenshot:re,onAnnotatedScreenshot:Ce})]}):e.jsxs("div",{className:`border-2 border-dashed rounded-lg p-6 text-center cursor-pointer transition-colors ${ae?"border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10":"border-[var(--border-color)] hover:border-[var(--color-primary-600)] hover:bg-[var(--bg-hover)]"}`,onClick:()=>A.current?.click(),onKeyDown:t=>{(t.key==="Enter"||t.key===" ")&&(t.preventDefault(),A.current?.click())},role:"button",tabIndex:0,onDragOver:we,onDragLeave:Se,onDrop:De,children:[e.jsx(n.Upload,{className:"w-8 h-8 mx-auto mb-2 text-[var(--text-secondary)]"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:ae?s("tickets.create.dropScreenshotNow","Drop image here"):s("tickets.create.uploadScreenshot","Click or drag & drop to upload a screenshot")}),e.jsx("p",{className:"text-xs text-[var(--text-muted)] mt-1",children:s("tickets.create.uploadScreenshotHint","PNG, JPG, or GIF up to 10MB")}),e.jsx("input",{ref:A,type:"file",accept:"image/*",onChange:Ne,className:"hidden"})]})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-2",children:[e.jsx(n.Paperclip,{className:"w-4 h-4 inline mr-2"}),s("tickets.create.attachments","Attachments"),e.jsxs("span",{className:"text-[var(--text-secondary)] font-normal ml-2",children:["(",s("common:text.optional","optional"),")"]})]}),e.jsxs("div",{className:`border-2 border-dashed rounded-lg p-4 text-center cursor-pointer transition-colors ${ce?"border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10":"border-[var(--border-color)] hover:border-[var(--color-primary-600)] hover:bg-[var(--bg-hover)]"}`,onClick:()=>P.current?.click(),onKeyDown:t=>{(t.key==="Enter"||t.key===" ")&&(t.preventDefault(),P.current?.click())},role:"button",tabIndex:0,onDragOver:Ae,onDragLeave:Pe,onDrop:Re,children:[e.jsx(n.Upload,{className:"w-6 h-6 mx-auto mb-1 text-[var(--text-secondary)]"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:ce?s("tickets.create.dropFilesNow","Drop files here"):s("tickets.create.uploadAttachments","Click or drag & drop to add documents")}),e.jsx("p",{className:"text-xs text-[var(--text-muted)] mt-1",children:s("tickets.create.attachmentsHint","PDF, Word, Excel, TXT, CSV, ZIP (max 10MB each, up to 5 files)")}),e.jsx("input",{ref:P,type:"file",multiple:!0,accept:".pdf,.doc,.docx,.xls,.xlsx,.txt,.csv,.zip,.rar,.7z,image/*",onChange:Ie,className:"hidden"})]}),C.length>0&&e.jsx("div",{className:"mt-3 space-y-2",children:C.map(t=>{const a=ze(t.type);return e.jsxs("div",{className:"flex items-center justify-between p-2 rounded-lg bg-[var(--bg-secondary)]",children:[e.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[e.jsx(a,{className:"w-4 h-4 text-[var(--text-secondary)] flex-shrink-0"}),e.jsx("span",{className:"text-sm truncate",children:t.name}),e.jsxs("span",{className:"text-xs text-[var(--text-muted)] flex-shrink-0",children:["(",Me(t.size),")"]})]}),e.jsx("button",{type:"button",onClick:()=>Fe(t.id),className:"btn btn-ghost p-1 text-[var(--error-text)]",title:s("tickets.create.removeAttachment","Remove attachment"),children:e.jsx(n.X,{className:"w-4 h-4"})})]},t.id)})})]}),v&&e.jsxs("div",{className:"border border-[var(--border-color)] rounded-lg p-4",children:[e.jsxs("div",{className:"flex items-center justify-between mb-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(n.Monitor,{className:"w-4 h-4 text-[var(--text-secondary)]"}),e.jsx("span",{className:"text-sm font-medium",children:s("tickets.create.systemInfo","System Information")})]}),e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:X,onChange:t=>be(t.target.checked),className:"rounded border-[var(--border-color)]"}),e.jsx("span",{className:"text-xs text-[var(--text-secondary)]",children:s("tickets.create.includeSystemInfo","Include in ticket")})]})]}),e.jsxs("div",{className:`grid grid-cols-2 md:grid-cols-3 gap-3 text-sm ${X?"":"opacity-50"}`,children:[e.jsxs("div",{children:[e.jsxs("span",{className:"text-[var(--text-secondary)]",children:[s("tickets.create.browser","Browser"),":"]}),e.jsxs("span",{className:"ml-2 font-medium",children:[v.browser," ",v.browserVersion]})]}),e.jsxs("div",{children:[e.jsxs("span",{className:"text-[var(--text-secondary)]",children:[s("tickets.create.os","OS"),":"]}),e.jsxs("span",{className:"ml-2 font-medium",children:[v.os," ",v.osVersion]})]}),e.jsxs("div",{children:[e.jsxs("span",{className:"text-[var(--text-secondary)]",children:[s("tickets.create.device","Device"),":"]}),e.jsx("span",{className:"ml-2 font-medium",children:v.deviceType})]}),e.jsxs("div",{children:[e.jsxs("span",{className:"text-[var(--text-secondary)]",children:[s("tickets.create.screen","Screen"),":"]}),e.jsx("span",{className:"ml-2 font-medium",children:v.screenResolution})]}),e.jsxs("div",{children:[e.jsxs("span",{className:"text-[var(--text-secondary)]",children:[s("tickets.create.language","Language"),":"]}),e.jsx("span",{className:"ml-2 font-medium",children:v.language})]})]})]}),se&&e.jsxs("div",{className:"p-4 rounded-lg bg-[var(--error-bg)] text-[var(--error-text)] flex items-center gap-2",children:[e.jsx(n.AlertTriangle,{className:"w-5 h-5"}),se]}),e.jsxs("div",{className:"flex items-center justify-between pt-4 border-t border-[var(--border-color)]",children:[e.jsx("button",{onClick:()=>F(1),className:"btn btn-secondary",children:s("common:buttons.back","Back")}),e.jsxs("button",{onClick:Be,disabled:!b.trim()||!j.trim()||ee,className:"btn btn-primary",children:[ee?e.jsx(n.Loader2,{className:"w-4 h-4 animate-spin mr-2"}):e.jsx(n.Send,{className:"w-4 h-4 mr-2"}),s("tickets.create.submit","Submit Ticket")]})]})]});return e.jsxs("div",{className:"max-w-3xl mx-auto",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[e.jsx("button",{onClick:()=>c(-1),className:"btn btn-ghost p-2",children:e.jsx(n.ArrowLeft,{className:"w-5 h-5"})}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[e.jsx(n.Headset,{className:"w-6 h-6"}),s("tickets.create.title","Create New Ticket")]}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:s("tickets.create.subtitle","Submit a support request or report an issue")})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("div",{className:`flex items-center gap-1 text-xs text-[var(--success-text)] transition-opacity duration-300 ${ye?"opacity-100":"opacity-0"}`,children:[e.jsx(n.Check,{className:"w-3.5 h-3.5"}),e.jsx("span",{children:s("common:drafts.autoSaved","Draft saved")})]}),l&&e.jsx("button",{onClick:()=>oe(!0),className:"btn btn-ghost p-2 text-[var(--text-secondary)] hover:text-[var(--error-text)]",title:s("common:drafts.discard","Discard draft"),children:e.jsx(n.Trash2,{className:"w-4 h-4"})})]})]}),g?e.jsxs("div",{className:"mb-6 p-4 rounded-lg bg-[var(--info-bg)] border border-[var(--info-border)]",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-3",children:[e.jsx(n.Info,{className:"w-5 h-5 text-[var(--info-text)] flex-shrink-0"}),e.jsx("p",{className:"font-medium text-[var(--info-text)]",children:s("glpi.cannotCreateTicket","Tickets are managed by GLPI. Please create tickets directly in GLPI.")})]}),x&&e.jsxs("a",{href:x,target:"_blank",rel:"noopener noreferrer",className:"btn btn-primary inline-flex items-center gap-2",children:[e.jsx(n.ExternalLink,{className:"w-4 h-4"}),s("glpi.openGlpi")]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-4 mb-8",children:[e.jsxs("div",{className:`flex items-center gap-2 ${w>=1?"text-[var(--color-primary-600)]":"text-[var(--text-secondary)]"}`,children:[e.jsx("div",{className:`w-8 h-8 rounded-full flex items-center justify-center ${w>=1?"bg-[var(--color-primary-600)] text-white":"bg-[var(--bg-secondary)]"}`,children:"1"}),e.jsx("span",{className:"font-medium",children:s("tickets.create.stepSelectType","Select Type")})]}),e.jsx("div",{className:`flex-1 h-0.5 ${w>=2?"bg-[var(--color-primary-600)]":"bg-[var(--border-color)]"}`}),e.jsxs("div",{className:`flex items-center gap-2 ${w>=2?"text-[var(--color-primary-600)]":"text-[var(--text-secondary)]"}`,children:[e.jsx("div",{className:`w-8 h-8 rounded-full flex items-center justify-center ${w>=2?"bg-[var(--color-primary-600)] text-white":"bg-[var(--bg-secondary)]"}`,children:"2"}),e.jsx("span",{className:"font-medium",children:s("tickets.create.stepDetails","Details")})]})]}),y&&!h&&e.jsxs("div",{className:"mb-4 p-3 rounded-lg bg-[var(--info-bg)] border border-[var(--info-border)] flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2 text-sm text-[var(--info-text)]",children:[e.jsx(n.Building2,{className:"w-4 h-4"}),e.jsx("span",{children:s("support:tickets.tenantPicker.creatingFor","Creating ticket for:")}),e.jsx("span",{className:"font-semibold",children:y.name})]}),e.jsx("button",{onClick:()=>R(!0),className:"text-xs text-[var(--info-text)] underline hover:no-underline",children:s("common:actions.change","Change")})]}),e.jsxs("div",{className:"card p-6",children:[w===1&&Le(),w===2&&qe()]})]}),je&&e.jsx("div",{className:"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50 p-4",children:e.jsxs("div",{className:"card w-full max-w-md p-6",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx("div",{className:"w-10 h-10 rounded-full bg-[var(--error-bg)] flex items-center justify-center",children:e.jsx(n.Trash2,{className:"w-5 h-5 text-[var(--error-text)]"})}),e.jsx("h2",{className:"text-xl font-bold",children:s("common:drafts.discardConfirmTitle","Discard draft?")})]}),e.jsx("p",{className:"text-[var(--text-secondary)] mb-6",children:s("common:drafts.discardConfirmMessage","This draft will be permanently deleted. This action cannot be undone.")}),e.jsxs("div",{className:"flex justify-end gap-3",children:[e.jsx("button",{onClick:()=>oe(!1),className:"btn btn-secondary",children:s("common:actions.cancel","Cancel")}),e.jsx("button",{onClick:ke,className:"btn bg-[var(--error-text)] text-white hover:opacity-90",children:s("common:drafts.discard","Discard")})]})]})}),fe&&e.jsx("div",{className:"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50 p-4",children:e.jsxs("div",{className:"card w-full max-w-md p-6",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx("div",{className:"w-10 h-10 rounded-full bg-[var(--info-bg)] flex items-center justify-center",children:e.jsx(n.Building2,{className:"w-5 h-5 text-[var(--info-text)]"})}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-xl font-bold",children:s("support:tickets.tenantPicker.title","Select Workspace")}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:s("support:tickets.tenantPicker.description","Choose a workspace to create the ticket in")})]})]}),e.jsx("div",{className:"space-y-2 max-h-64 overflow-y-auto",children:N.filter(t=>t.status==="Active").map(t=>e.jsx("button",{onClick:()=>{Y(t),R(!1);const a=l||Q();a&&o.ticketDraftService.updateDraft(a,{tenantId:t.id,tenantSlug:t.slug,tenantName:t.name})},className:`w-full p-3 rounded-lg border text-left transition-colors hover:bg-[var(--bg-hover)] ${y?.id===t.id?"border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10":"border-[var(--border-color)]"}`,children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(n.Building2,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"font-medium truncate",children:t.name}),t.organisationName&&e.jsx("div",{className:"text-xs text-[var(--text-secondary)] truncate",children:t.organisationName})]}),e.jsx("span",{className:`text-xs px-2 py-0.5 rounded-full ${t.type==="Personal"?"bg-[var(--info-bg)] text-[var(--info-text)]":"bg-[var(--success-bg)] text-[var(--success-text)]"}`,children:t.type==="Personal"?s("common:tenant.personal","Personal"):s("common:tenant.business","Business")})]})},t.id))}),e.jsx("div",{className:"flex justify-end gap-3 mt-4 pt-4 border-t border-[var(--border-color)]",children:e.jsx("button",{onClick:()=>{R(!1),D||c(-1)},className:"btn btn-secondary",children:s("common:actions.cancel","Cancel")})})]})})]})}exports.UserCreateTicketPage=Xe;
6
- //# sourceMappingURL=UserCreateTicketPage-ChQL1mVY.js.map
5
+ `+i.browserInfoService.formatForDescription(g));const a=g||i.browserInfoService.captureBrowserInfo(),d=i.logService.getRecentErrors().slice(0,5),l={sourceUrl:window.location.href,browser:{name:a.browser,version:a.browserVersion,language:a.language},os:{name:a.os,version:a.osVersion},device:{type:a.deviceType,screenResolution:a.screenResolution},recentErrors:d.map(I=>({message:I.message,stack:I.stack,component:I.component,timestamp:I.timestamp.toISOString()}))},E=y?{"X-Tenant-Slug":y.slug}:{},k=y?await i.api.post("/api/support/my-tickets",{title:v.trim(),description:t,type:m,priority:T,clientContext:l},{headers:E}):await i.myTicketsApi.create({title:v.trim(),description:t,type:m,priority:T,clientContext:l});S&&await We(k.id,S,y),await Ge(k.id,C,y),o&&i.ticketDraftService.deleteDraft(o),p.current&&(clearTimeout(p.current),p.current=null),L.current=!1,c(`/support/my-tickets/${k.id}?tab=submitted`)}catch(t){const a=t&&typeof t=="object"&&"message"in t?t.message:null;f(a||s("tickets.create.submitError","Failed to create ticket. Please try again."))}finally{te(!1)}}},Le=()=>e.jsxs("div",{className:"space-y-4",children:[e.jsx("h2",{className:"text-lg font-semibold mb-4",children:s("tickets.create.selectType","What type of request do you have?")}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:J.map(t=>e.jsx("button",{onClick:()=>{$(t.value),F(2)},className:`card p-4 text-left hover:shadow-md transition-shadow ${m===t.value?"ring-2 ring-[var(--color-primary-600)]":""}`,children:e.jsxs("div",{className:"flex items-start gap-4",children:[e.jsx("div",{className:"p-3 rounded-lg bg-[var(--bg-secondary)]",children:e.jsx(t.icon,{className:"w-6 h-6"})}),e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium",children:s(t.labelKey,t.label)}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:s(t.descriptionKey,t.description)})]})]})},t.value))})]}),qe=()=>e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[e.jsx("button",{onClick:()=>F(1),className:"btn btn-ghost p-2",children:e.jsx(n.ArrowLeft,{className:"w-5 h-5"})}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold",children:s(J.find(t=>t.value===m)?.labelKey||"",{defaultValue:J.find(t=>t.value===m)?.label})}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:s("tickets.create.fillDetails","Fill in the details below")})]})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-2",children:[s("tickets.form.title","Title")," ",e.jsx("span",{className:"text-[var(--error-text)]",children:"*"})]}),e.jsx("input",{type:"text",value:v,onChange:t=>O(t.target.value),placeholder:s("tickets.create.titlePlaceholder","Brief summary of your request"),className:"input w-full",maxLength:200}),e.jsxs("p",{className:"text-xs text-[var(--text-secondary)] mt-1",children:[v.length,"/200 ",s("common:text.characters","characters")]})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-2",children:[s("tickets.create.description","Description")," ",e.jsx("span",{className:"text-[var(--error-text)]",children:"*"})]}),e.jsx("textarea",{value:j,onChange:t=>W(t.target.value),placeholder:m==="Bug"?s("tickets.create.bugPlaceholder","Please describe the issue in detail. Include steps to reproduce, expected behavior, and actual behavior."):m==="FeatureRequest"?s("tickets.create.featurePlaceholder","Describe the feature you would like to see and why it would be useful."):m==="ApplicationRequest"?s("tickets.create.applicationPlaceholder","Which application do you need access to and why?"):s("tickets.create.defaultPlaceholder","Please provide as much detail as possible."),className:"input w-full h-40",maxLength:5e3}),e.jsxs("p",{className:"text-xs text-[var(--text-secondary)] mt-1",children:[j.length,"/5000 ",s("common:text.characters","characters")]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-2",children:s("tickets.create.priority","Priority")}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-2",children:$e.map(t=>e.jsxs("button",{type:"button",onClick:()=>G(t.value),className:`p-3 rounded-lg border text-center transition-colors ${T===t.value?"border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10":"border-[var(--border-color)] hover:bg-[var(--bg-hover)]"}`,children:[e.jsx("div",{className:"font-medium",children:s(t.labelKey,t.label)}),e.jsx("div",{className:"text-xs text-[var(--text-secondary)]",children:s(t.descriptionKey,t.description)})]},t.value))})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-2",children:[e.jsx(n.Image,{className:"w-4 h-4 inline mr-2"}),s("tickets.create.screenshot","Screenshot"),e.jsxs("span",{className:"text-[var(--text-secondary)] font-normal ml-2",children:["(",s("common:text.optional","optional"),")"]})]}),re?e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:s("tickets.create.screenshotUploaded","Screenshot uploaded - you can annotate it below")}),e.jsx("button",{type:"button",onClick:Te,className:"btn btn-ghost p-2 text-[var(--error-text)]",title:s("tickets.create.removeScreenshot","Remove screenshot"),children:e.jsx(n.X,{className:"w-4 h-4"})})]}),e.jsx(Ke.ScreenshotAnnotator,{screenshot:re,onAnnotatedScreenshot:Ce})]}):e.jsxs("div",{className:`border-2 border-dashed rounded-lg p-6 text-center cursor-pointer transition-colors ${ae?"border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10":"border-[var(--border-color)] hover:border-[var(--color-primary-600)] hover:bg-[var(--bg-hover)]"}`,onClick:()=>A.current?.click(),onKeyDown:t=>{(t.key==="Enter"||t.key===" ")&&(t.preventDefault(),A.current?.click())},role:"button",tabIndex:0,onDragOver:we,onDragLeave:Se,onDrop:De,children:[e.jsx(n.Upload,{className:"w-8 h-8 mx-auto mb-2 text-[var(--text-secondary)]"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:ae?s("tickets.create.dropScreenshotNow","Drop image here"):s("tickets.create.uploadScreenshot","Click or drag & drop to upload a screenshot")}),e.jsx("p",{className:"text-xs text-[var(--text-muted)] mt-1",children:s("tickets.create.uploadScreenshotHint","PNG, JPG, or GIF up to 10MB")}),e.jsx("input",{ref:A,type:"file",accept:"image/*",onChange:Ne,className:"hidden"})]})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-2",children:[e.jsx(n.Paperclip,{className:"w-4 h-4 inline mr-2"}),s("tickets.create.attachments","Attachments"),e.jsxs("span",{className:"text-[var(--text-secondary)] font-normal ml-2",children:["(",s("common:text.optional","optional"),")"]})]}),e.jsxs("div",{className:`border-2 border-dashed rounded-lg p-4 text-center cursor-pointer transition-colors ${ce?"border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10":"border-[var(--border-color)] hover:border-[var(--color-primary-600)] hover:bg-[var(--bg-hover)]"}`,onClick:()=>P.current?.click(),onKeyDown:t=>{(t.key==="Enter"||t.key===" ")&&(t.preventDefault(),P.current?.click())},role:"button",tabIndex:0,onDragOver:Ae,onDragLeave:Pe,onDrop:Re,children:[e.jsx(n.Upload,{className:"w-6 h-6 mx-auto mb-1 text-[var(--text-secondary)]"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:ce?s("tickets.create.dropFilesNow","Drop files here"):s("tickets.create.uploadAttachments","Click or drag & drop to add documents")}),e.jsx("p",{className:"text-xs text-[var(--text-muted)] mt-1",children:s("tickets.create.attachmentsHint","PDF, Word, Excel, TXT, CSV, ZIP (max 10MB each, up to 5 files)")}),e.jsx("input",{ref:P,type:"file",multiple:!0,accept:".pdf,.doc,.docx,.xls,.xlsx,.txt,.csv,.zip,.rar,.7z,image/*",onChange:Ie,className:"hidden"})]}),C.length>0&&e.jsx("div",{className:"mt-3 space-y-2",children:C.map(t=>{const a=ze(t.type);return e.jsxs("div",{className:"flex items-center justify-between p-2 rounded-lg bg-[var(--bg-secondary)]",children:[e.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[e.jsx(a,{className:"w-4 h-4 text-[var(--text-secondary)] flex-shrink-0"}),e.jsx("span",{className:"text-sm truncate",children:t.name}),e.jsxs("span",{className:"text-xs text-[var(--text-muted)] flex-shrink-0",children:["(",Me(t.size),")"]})]}),e.jsx("button",{type:"button",onClick:()=>Fe(t.id),className:"btn btn-ghost p-1 text-[var(--error-text)]",title:s("tickets.create.removeAttachment","Remove attachment"),children:e.jsx(n.X,{className:"w-4 h-4"})})]},t.id)})})]}),g&&e.jsxs("div",{className:"border border-[var(--border-color)] rounded-lg p-4",children:[e.jsxs("div",{className:"flex items-center justify-between mb-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(n.Monitor,{className:"w-4 h-4 text-[var(--text-secondary)]"}),e.jsx("span",{className:"text-sm font-medium",children:s("tickets.create.systemInfo","System Information")})]}),e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:X,onChange:t=>ve(t.target.checked),className:"rounded border-[var(--border-color)]"}),e.jsx("span",{className:"text-xs text-[var(--text-secondary)]",children:s("tickets.create.includeSystemInfo","Include in ticket")})]})]}),e.jsxs("div",{className:`grid grid-cols-2 md:grid-cols-3 gap-3 text-sm ${X?"":"opacity-50"}`,children:[e.jsxs("div",{children:[e.jsxs("span",{className:"text-[var(--text-secondary)]",children:[s("tickets.create.browser","Browser"),":"]}),e.jsxs("span",{className:"ml-2 font-medium",children:[g.browser," ",g.browserVersion]})]}),e.jsxs("div",{children:[e.jsxs("span",{className:"text-[var(--text-secondary)]",children:[s("tickets.create.os","OS"),":"]}),e.jsxs("span",{className:"ml-2 font-medium",children:[g.os," ",g.osVersion]})]}),e.jsxs("div",{children:[e.jsxs("span",{className:"text-[var(--text-secondary)]",children:[s("tickets.create.device","Device"),":"]}),e.jsx("span",{className:"ml-2 font-medium",children:g.deviceType})]}),e.jsxs("div",{children:[e.jsxs("span",{className:"text-[var(--text-secondary)]",children:[s("tickets.create.screen","Screen"),":"]}),e.jsx("span",{className:"ml-2 font-medium",children:g.screenResolution})]}),e.jsxs("div",{children:[e.jsxs("span",{className:"text-[var(--text-secondary)]",children:[s("tickets.create.language","Language"),":"]}),e.jsx("span",{className:"ml-2 font-medium",children:g.language})]})]})]}),se&&e.jsxs("div",{className:"p-4 rounded-lg bg-[var(--error-bg)] text-[var(--error-text)] flex items-center gap-2",children:[e.jsx(n.AlertTriangle,{className:"w-5 h-5"}),se]}),e.jsxs("div",{className:"flex items-center justify-between pt-4 border-t border-[var(--border-color)]",children:[e.jsx("button",{onClick:()=>F(1),className:"btn btn-secondary",children:s("common:buttons.back","Back")}),e.jsxs("button",{onClick:Be,disabled:!v.trim()||!j.trim()||ee,className:"btn btn-primary",children:[ee?e.jsx(n.Loader2,{className:"w-4 h-4 animate-spin mr-2"}):e.jsx(n.Send,{className:"w-4 h-4 mr-2"}),s("tickets.create.submit","Submit Ticket")]})]})]});return e.jsxs("div",{className:"max-w-3xl mx-auto",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[e.jsx("button",{onClick:()=>c(-1),className:"btn btn-ghost p-2",children:e.jsx(n.ArrowLeft,{className:"w-5 h-5"})}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[e.jsx(n.Headset,{className:"w-6 h-6"}),s("tickets.create.title","Create New Ticket")]}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:s("tickets.create.subtitle","Submit a support request or report an issue")})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("div",{className:`flex items-center gap-1 text-xs text-[var(--success-text)] transition-opacity duration-300 ${ye?"opacity-100":"opacity-0"}`,children:[e.jsx(n.Check,{className:"w-3.5 h-3.5"}),e.jsx("span",{children:s("common:drafts.autoSaved","Draft saved")})]}),o&&e.jsx("button",{onClick:()=>le(!0),className:"btn btn-ghost p-2 text-[var(--text-secondary)] hover:text-[var(--error-text)]",title:s("common:drafts.discard","Discard draft"),children:e.jsx(n.Trash2,{className:"w-4 h-4"})})]})]}),b?e.jsxs("div",{className:"mb-6 p-4 rounded-lg bg-[var(--info-bg)] border border-[var(--info-border)]",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-3",children:[e.jsx(n.Info,{className:"w-5 h-5 text-[var(--info-text)] flex-shrink-0"}),e.jsx("p",{className:"font-medium text-[var(--info-text)]",children:s("glpi.cannotCreateTicket","Tickets are managed by GLPI. Please create tickets directly in GLPI.")})]}),x&&e.jsxs("a",{href:x,target:"_blank",rel:"noopener noreferrer",className:"btn btn-primary inline-flex items-center gap-2",children:[e.jsx(n.ExternalLink,{className:"w-4 h-4"}),s("glpi.openGlpi")]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-4 mb-8",children:[e.jsxs("div",{className:`flex items-center gap-2 ${w>=1?"text-[var(--color-primary-600)]":"text-[var(--text-secondary)]"}`,children:[e.jsx("div",{className:`w-8 h-8 rounded-full flex items-center justify-center ${w>=1?"bg-[var(--color-primary-600)] text-white":"bg-[var(--bg-secondary)]"}`,children:"1"}),e.jsx("span",{className:"font-medium",children:s("tickets.create.stepSelectType","Select Type")})]}),e.jsx("div",{className:`flex-1 h-0.5 ${w>=2?"bg-[var(--color-primary-600)]":"bg-[var(--border-color)]"}`}),e.jsxs("div",{className:`flex items-center gap-2 ${w>=2?"text-[var(--color-primary-600)]":"text-[var(--text-secondary)]"}`,children:[e.jsx("div",{className:`w-8 h-8 rounded-full flex items-center justify-center ${w>=2?"bg-[var(--color-primary-600)] text-white":"bg-[var(--bg-secondary)]"}`,children:"2"}),e.jsx("span",{className:"font-medium",children:s("tickets.create.stepDetails","Details")})]})]}),y&&!h&&e.jsxs("div",{className:"mb-4 p-3 rounded-lg bg-[var(--info-bg)] border border-[var(--info-border)] flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2 text-sm text-[var(--info-text)]",children:[e.jsx(n.Building2,{className:"w-4 h-4"}),e.jsx("span",{children:s("support:tickets.tenantPicker.creatingFor","Creating ticket for:")}),e.jsx("span",{className:"font-semibold",children:y.name})]}),e.jsx("button",{onClick:()=>R(!0),className:"text-xs text-[var(--info-text)] underline hover:no-underline",children:s("common:actions.change","Change")})]}),e.jsxs("div",{className:"card p-6",children:[w===1&&Le(),w===2&&qe()]})]}),je&&e.jsx("div",{className:"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50 p-4",children:e.jsxs("div",{className:"card w-full max-w-md p-6",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx("div",{className:"w-10 h-10 rounded-full bg-[var(--error-bg)] flex items-center justify-center",children:e.jsx(n.Trash2,{className:"w-5 h-5 text-[var(--error-text)]"})}),e.jsx("h2",{className:"text-xl font-bold",children:s("common:drafts.discardConfirmTitle","Discard draft?")})]}),e.jsx("p",{className:"text-[var(--text-secondary)] mb-6",children:s("common:drafts.discardConfirmMessage","This draft will be permanently deleted. This action cannot be undone.")}),e.jsxs("div",{className:"flex justify-end gap-3",children:[e.jsx("button",{onClick:()=>le(!1),className:"btn btn-secondary",children:s("common:actions.cancel","Cancel")}),e.jsx("button",{onClick:ke,className:"btn bg-[var(--error-text)] text-white hover:opacity-90",children:s("common:drafts.discard","Discard")})]})]})}),fe&&e.jsx("div",{className:"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50 p-4",children:e.jsxs("div",{className:"card w-full max-w-md p-6",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx("div",{className:"w-10 h-10 rounded-full bg-[var(--info-bg)] flex items-center justify-center",children:e.jsx(n.Building2,{className:"w-5 h-5 text-[var(--info-text)]"})}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-xl font-bold",children:s("support:tickets.tenantPicker.title","Select Workspace")}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:s("support:tickets.tenantPicker.description","Choose a workspace to create the ticket in")})]})]}),e.jsx("div",{className:"space-y-2 max-h-64 overflow-y-auto",children:N.filter(t=>t.status==="Active").map(t=>e.jsx("button",{onClick:()=>{Y(t),R(!1);const a=o||Q();a&&i.ticketDraftService.updateDraft(a,{tenantId:t.id,tenantSlug:t.slug,tenantName:t.name})},className:`w-full p-3 rounded-lg border text-left transition-colors hover:bg-[var(--bg-hover)] ${y?.id===t.id?"border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10":"border-[var(--border-color)]"}`,children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(n.Building2,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"font-medium truncate",children:t.name}),t.organisationName&&e.jsx("div",{className:"text-xs text-[var(--text-secondary)] truncate",children:t.organisationName})]}),e.jsx("span",{className:`text-xs px-2 py-0.5 rounded-full ${t.type==="Personal"?"bg-[var(--info-bg)] text-[var(--info-text)]":"bg-[var(--success-bg)] text-[var(--success-text)]"}`,children:t.type==="Personal"?s("common:tenant.personal","Personal"):s("common:tenant.business","Business")})]})},t.id))}),e.jsx("div",{className:"flex justify-end gap-3 mt-4 pt-4 border-t border-[var(--border-color)]",children:e.jsx("button",{onClick:()=>{R(!1),D||c(-1)},className:"btn btn-secondary",children:s("common:actions.cancel","Cancel")})})]})})]})}exports.UserCreateTicketPage=Xe;
6
+ //# sourceMappingURL=UserCreateTicketPage-D2a3EOey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserCreateTicketPage-D2a3EOey.js","sources":["../../src/pages/platform/support/UserCreateTicketPage.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate, useSearchParams } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n ArrowLeft, Headset, Bug, Lightbulb, AppWindow, HelpCircle, MessageSquare,\r\n Loader2, AlertTriangle, Send, Monitor, Upload, X, Image as ImageIcon,\r\n FileText, File as FileIcon, Paperclip, Info, ExternalLink, Building2, Check, Trash2\r\n} from 'lucide-react';\r\nimport { myTicketsApi, type TicketType, type TicketPriority, type ClientContextDto, type MyTicketDetailDto } from '@/services/api/ticketApi';\r\nimport { api } from '@/services/api/apiClient';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport type { UserTenantDto } from '@/services/api/adminApi';\r\nimport { browserInfoService, type BrowserInfo } from '@/services/support/browserInfoService';\r\nimport { useTicketingProvider } from '@/hooks/useTicketingProvider';\r\nimport { generateUUID } from '@/utils/uuid';\r\nimport { logService } from '@/services/logging/logService';\r\nimport { ScreenshotAnnotator } from '@/components/platform/support/ScreenshotAnnotator';\r\nimport { errorContextService } from '@/services/support/errorContextService';\r\nimport { ticketDraftService } from '@/services/support/ticketDraftService';\r\n\r\nconst ticketTypes: { value: TicketType; label: string; labelKey: string; description: string; descriptionKey: string; icon: React.ElementType }[] = [\r\n {\r\n value: 'Bug',\r\n label: 'Report a Bug',\r\n labelKey: 'tickets.types.bug',\r\n description: 'Something is not working correctly',\r\n descriptionKey: 'tickets.types.bugDescription',\r\n icon: Bug,\r\n },\r\n {\r\n value: 'FeatureRequest',\r\n label: 'Request a Feature',\r\n labelKey: 'tickets.types.featureRequest',\r\n description: 'Suggest an improvement or new feature',\r\n descriptionKey: 'tickets.types.featureRequestDescription',\r\n icon: Lightbulb,\r\n },\r\n {\r\n value: 'ApplicationRequest',\r\n label: 'Request an Application',\r\n labelKey: 'tickets.types.applicationRequest',\r\n description: 'Request access to a new application',\r\n descriptionKey: 'tickets.types.applicationRequestDescription',\r\n icon: AppWindow,\r\n },\r\n {\r\n value: 'Support',\r\n label: 'General Support',\r\n labelKey: 'tickets.types.support',\r\n description: 'Need help with something',\r\n descriptionKey: 'tickets.types.supportDescription',\r\n icon: MessageSquare,\r\n },\r\n {\r\n value: 'Question',\r\n label: 'Ask a Question',\r\n labelKey: 'tickets.types.question',\r\n description: 'Have a question about the platform',\r\n descriptionKey: 'tickets.types.questionDescription',\r\n icon: HelpCircle,\r\n },\r\n];\r\n\r\nconst priorityOptions: { value: TicketPriority; label: string; labelKey: string; description: string; descriptionKey: string }[] = [\r\n { value: 'Low', label: 'Low', labelKey: 'tickets.priority.low', description: 'Can wait, not urgent', descriptionKey: 'tickets.priority.lowDescription' },\r\n { value: 'Medium', label: 'Medium', labelKey: 'tickets.priority.medium', description: 'Normal priority', descriptionKey: 'tickets.priority.mediumDescription' },\r\n { value: 'High', label: 'High', labelKey: 'tickets.priority.high', description: 'Important, needs attention soon', descriptionKey: 'tickets.priority.highDescription' },\r\n { value: 'Critical', label: 'Critical', labelKey: 'tickets.priority.critical', description: 'Urgent, blocking work', descriptionKey: 'tickets.priority.criticalDescription' },\r\n];\r\n\r\ninterface AttachmentFile {\r\n id: string;\r\n file: File;\r\n name: string;\r\n size: number;\r\n type: string;\r\n}\r\n\r\nconst MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB\r\nconst MAX_ATTACHMENTS = 5;\r\nconst ALLOWED_EXTENSIONS = ['.pdf', '.doc', '.docx', '.xls', '.xlsx', '.txt', '.csv', '.zip', '.rar', '.7z', '.png', '.jpg', '.jpeg', '.gif', '.webp', '.bmp'];\r\n\r\nfunction 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\nfunction getFileIcon(type: string) {\r\n if (type.includes('pdf')) return FileText;\r\n if (type.startsWith('image/')) return ImageIcon;\r\n return FileIcon;\r\n}\r\n\r\nfunction restoreDraft(draftId: string | null, userTenants: UserTenantDto[]) {\r\n if (!draftId) return { draft: null, selectedTenant: null };\r\n\r\n const draft = ticketDraftService.getDraft(draftId);\r\n if (!draft) return { draft: null, selectedTenant: null };\r\n\r\n let selectedTenant: UserTenantDto | null = null;\r\n if (draft.tenantId && draft.tenantSlug) {\r\n const matchingTenant = userTenants.find(t => t.id === draft.tenantId);\r\n if (matchingTenant) {\r\n selectedTenant = matchingTenant;\r\n }\r\n }\r\n\r\n return { draft, selectedTenant };\r\n}\r\n\r\nfunction restoreSessionContext(sessionContext: ReturnType<typeof errorContextService.loadContext>) {\r\n if (!sessionContext?.screenshot) return { screenshot: null, autoSelectType: null };\r\n\r\n let autoSelectType: TicketType | null = null;\r\n if (sessionContext.recentErrors.length > 0) {\r\n autoSelectType = 'Bug';\r\n }\r\n\r\n return { screenshot: sessionContext.screenshot, autoSelectType };\r\n}\r\n\r\nasync function uploadScreenshot(ticketId: string, screenshot: string, selectedTenantForTicket: UserTenantDto | null) {\r\n try {\r\n const response = await fetch(screenshot);\r\n const blob = await response.blob();\r\n const file = new File([blob], 'screenshot.png', { type: 'image/png' });\r\n\r\n if (selectedTenantForTicket) {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n const tenantHeaders = { 'X-Tenant-Slug': selectedTenantForTicket.slug };\r\n await api.post(`/api/support/my-tickets/${ticketId}/attachments`, formData, {\r\n headers: { 'Content-Type': 'multipart/form-data', ...tenantHeaders },\r\n });\r\n } else {\r\n await myTicketsApi.uploadAttachment(ticketId, file);\r\n }\r\n } catch (attachmentError) {\r\n // Silent fail for attachment upload\r\n }\r\n}\r\n\r\nasync function uploadAttachments(ticketId: string, attachments: AttachmentFile[], selectedTenantForTicket: UserTenantDto | null) {\r\n for (const attachment of attachments) {\r\n try {\r\n if (selectedTenantForTicket) {\r\n const formData = new FormData();\r\n formData.append('file', attachment.file);\r\n const tenantHeaders = { 'X-Tenant-Slug': selectedTenantForTicket.slug };\r\n await api.post(`/api/support/my-tickets/${ticketId}/attachments`, formData, {\r\n headers: { 'Content-Type': 'multipart/form-data', ...tenantHeaders },\r\n });\r\n } else {\r\n await myTicketsApi.uploadAttachment(ticketId, attachment.file);\r\n }\r\n } catch (attachmentError) {\r\n // Silent fail for attachment upload\r\n }\r\n }\r\n}\r\n\r\nexport function UserCreateTicketPage(): ReactElement {\r\n const navigate = useNavigate();\r\n const [searchParams] = useSearchParams();\r\n const { t } = useTranslation(['support', 'common']);\r\n const { isGlpi, glpiBaseUrl } = useTicketingProvider();\r\n const { currentTenant, userTenants, isGlobalView } = useTenant();\r\n const screenshotInputRef = useRef<HTMLInputElement>(null);\r\n const attachmentInputRef = useRef<HTMLInputElement>(null);\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\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 draftId = searchParams.get('draft');\r\n\r\n const [step, setStep] = useState(1);\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 // Browser info state\r\n const [browserInfo, setBrowserInfo] = useState<BrowserInfo | null>(null);\r\n const [includeBrowserInfo, setIncludeBrowserInfo] = useState(true);\r\n\r\n // Screenshot state\r\n const [screenshot, setScreenshot] = useState<string | null>(null);\r\n const [annotatedScreenshot, setAnnotatedScreenshot] = useState<string | null>(null);\r\n const [isDraggingScreenshot, setIsDraggingScreenshot] = useState(false);\r\n\r\n // Attachments state\r\n const [attachments, setAttachments] = useState<AttachmentFile[]>([]);\r\n const [isDraggingAttachment, setIsDraggingAttachment] = useState(false);\r\n\r\n // Draft auto-save state\r\n const [currentDraftId, setCurrentDraftId] = useState<string | null>(draftId);\r\n const [showDraftSaved, setShowDraftSaved] = useState(false);\r\n const [showDiscardConfirm, setShowDiscardConfirm] = 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\r\n // Save draft function\r\n const saveDraftNow = useCallback(() => {\r\n if (!currentDraftId) return false;\r\n\r\n const result = ticketDraftService.updateDraft(currentDraftId, {\r\n type: selectedType,\r\n title,\r\n description,\r\n priority,\r\n includeScreenshot: !!annotatedScreenshot,\r\n includeErrorLogs: false,\r\n screenshot: annotatedScreenshot ?? 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 setTimeout(() => setShowDraftSaved(false), 2000);\r\n }\r\n return result.success;\r\n }, [currentDraftId, selectedType, title, description, priority, annotatedScreenshot, effectiveTenant]);\r\n\r\n // Auto-create draft when user starts filling the form (no existing draft)\r\n const ensureDraft = useCallback(() => {\r\n if (currentDraftId) return currentDraftId;\r\n const newDraft = ticketDraftService.createDraft();\r\n setCurrentDraftId(newDraft.id);\r\n return newDraft.id;\r\n }, [currentDraftId]);\r\n\r\n // Debounced auto-save when form data changes\r\n useEffect(() => {\r\n if (!isInitialLoadCompleteRef.current) return;\r\n // Only auto-save if there's meaningful data\r\n if (!selectedType && !title && !description) return;\r\n\r\n hasUnsavedChangesRef.current = true;\r\n\r\n // Ensure a draft exists before saving\r\n if (!currentDraftId) {\r\n ensureDraft();\r\n return; // Will re-trigger on next render with currentDraftId set\r\n }\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 }, [selectedType, title, description, priority, annotatedScreenshot, currentDraftId, saveDraftNow, ensureDraft]);\r\n\r\n // Save on unmount + beforeunload\r\n useEffect(() => {\r\n const handleBeforeUnload = () => {\r\n if (hasUnsavedChangesRef.current && currentDraftId) {\r\n saveDraftNow();\r\n }\r\n };\r\n\r\n window.addEventListener('beforeunload', handleBeforeUnload);\r\n return () => {\r\n window.removeEventListener('beforeunload', handleBeforeUnload);\r\n if (hasUnsavedChangesRef.current && currentDraftId) {\r\n saveDraftNow();\r\n }\r\n if (autoSaveTimerRef.current) {\r\n clearTimeout(autoSaveTimerRef.current);\r\n }\r\n };\r\n }, [currentDraftId, saveDraftNow]);\r\n\r\n // Discard draft handler\r\n const handleDiscardDraft = useCallback(() => {\r\n if (currentDraftId) {\r\n ticketDraftService.deleteDraft(currentDraftId);\r\n }\r\n if (autoSaveTimerRef.current) {\r\n clearTimeout(autoSaveTimerRef.current);\r\n autoSaveTimerRef.current = null;\r\n }\r\n navigate(-1);\r\n }, [currentDraftId, navigate]);\r\n\r\n // Load draft, session context, URL pre-fill params, and browser info on mount\r\n useEffect(() => {\r\n // Load draft if resuming\r\n const { draft, selectedTenant } = restoreDraft(draftId, userTenants);\r\n if (draft) {\r\n if (draft.type) {\r\n setSelectedType(draft.type);\r\n setStep(2);\r\n }\r\n if (draft.title) setTitle(draft.title);\r\n if (draft.description) setDescription(draft.description);\r\n if (draft.priority) setPriority(draft.priority);\r\n if (draft.screenshot) {\r\n setScreenshot(draft.screenshot);\r\n setAnnotatedScreenshot(draft.screenshot);\r\n }\r\n if (selectedTenant) {\r\n setSelectedTenantForTicket(selectedTenant);\r\n }\r\n }\r\n\r\n // Pre-fill from URL params (e.g. from AccessDenied page) — draft takes priority\r\n if (!draft) {\r\n const validTypes: TicketType[] = ['Bug', 'FeatureRequest', 'Suggestion', 'ApplicationRequest', 'Support', 'Question'];\r\n const prefillType = searchParams.get('type') as TicketType | null;\r\n const prefillSubject = searchParams.get('subject');\r\n const prefillBody = searchParams.get('body');\r\n\r\n if (prefillType && validTypes.includes(prefillType)) {\r\n setSelectedType(prefillType);\r\n setStep(2);\r\n }\r\n if (prefillSubject) setTitle(decodeURIComponent(prefillSubject));\r\n if (prefillBody) setDescription(decodeURIComponent(prefillBody));\r\n }\r\n\r\n // Load captured screenshot from session context (from CreateTicketButton)\r\n const sessionContext = errorContextService.loadContext();\r\n const { screenshot: sessionScreenshot, autoSelectType } = restoreSessionContext(sessionContext);\r\n if (sessionScreenshot && !annotatedScreenshot) {\r\n setScreenshot(sessionScreenshot);\r\n setAnnotatedScreenshot(sessionScreenshot);\r\n\r\n if (autoSelectType && !selectedType) {\r\n setSelectedType(autoSelectType);\r\n setPriority('High');\r\n }\r\n }\r\n errorContextService.clearContext();\r\n\r\n const info = browserInfoService.captureBrowserInfo();\r\n setBrowserInfo(info);\r\n\r\n // Mark initial load complete (prevents auto-save during hydration)\r\n setTimeout(() => { isInitialLoadCompleteRef.current = true; }, 100);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [draftId]);\r\n\r\n // Process image file for screenshot\r\n const processImageFile = useCallback((file: File) => {\r\n if (!file.type.startsWith('image/')) {\r\n setError(t('tickets.create.invalidImageType', 'Please select a valid image file'));\r\n return;\r\n }\r\n\r\n if (file.size > MAX_FILE_SIZE) {\r\n setError(t('tickets.create.imageTooLarge', 'Image must be less than 10MB'));\r\n return;\r\n }\r\n\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n const dataUrl = e.target?.result as string;\r\n setScreenshot(dataUrl);\r\n setAnnotatedScreenshot(dataUrl);\r\n setError(null);\r\n };\r\n reader.onerror = () => {\r\n setError(t('tickets.create.imageReadError', 'Failed to read image file'));\r\n };\r\n reader.readAsDataURL(file);\r\n }, [t]);\r\n\r\n const handleScreenshotUpload = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n const file = event.target.files?.[0];\r\n if (file) {\r\n processImageFile(file);\r\n }\r\n }, [processImageFile]);\r\n\r\n // Drag & Drop handlers for screenshot\r\n const handleScreenshotDragOver = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDraggingScreenshot(true);\r\n }, []);\r\n\r\n const handleScreenshotDragLeave = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDraggingScreenshot(false);\r\n }, []);\r\n\r\n const handleScreenshotDrop = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDraggingScreenshot(false);\r\n\r\n const files = e.dataTransfer.files;\r\n if (files.length > 0) {\r\n const file = files[0];\r\n if (file.type.startsWith('image/')) {\r\n processImageFile(file);\r\n } else {\r\n setError(t('tickets.create.invalidImageType', 'Please select a valid image file'));\r\n }\r\n }\r\n }, [processImageFile, t]);\r\n\r\n const handleRemoveScreenshot = useCallback(() => {\r\n setScreenshot(null);\r\n setAnnotatedScreenshot(null);\r\n if (screenshotInputRef.current) {\r\n screenshotInputRef.current.value = '';\r\n }\r\n }, []);\r\n\r\n const handleAnnotatedScreenshot = useCallback((dataUrl: string) => {\r\n setAnnotatedScreenshot(dataUrl);\r\n }, []);\r\n\r\n // Attachment handlers\r\n const isAllowedFileType = useCallback((file: File): boolean => {\r\n // Allow all images\r\n if (file.type.startsWith('image/')) {\r\n return true;\r\n }\r\n const extension = '.' + file.name.split('.').pop()?.toLowerCase();\r\n return ALLOWED_EXTENSIONS.includes(extension);\r\n }, []);\r\n\r\n const processAttachmentFiles = useCallback((files: FileList) => {\r\n const newAttachments: AttachmentFile[] = [];\r\n\r\n for (let i = 0; i < files.length; i++) {\r\n const file = files[i];\r\n\r\n // Skip if already at max attachments\r\n if (attachments.length + newAttachments.length >= MAX_ATTACHMENTS) {\r\n setError(t('tickets.create.maxAttachments', `Maximum ${MAX_ATTACHMENTS} attachments allowed`));\r\n break;\r\n }\r\n\r\n // Check file size\r\n if (file.size > MAX_FILE_SIZE) {\r\n setError(t('tickets.create.fileTooLarge', `File \"${file.name}\" is too large (max 10MB)`));\r\n continue;\r\n }\r\n\r\n // Check file type\r\n if (!isAllowedFileType(file)) {\r\n setError(t('tickets.create.invalidFileType', `File type not allowed: ${file.name}`));\r\n continue;\r\n }\r\n\r\n // Check for duplicates\r\n const isDuplicate = attachments.some(a => a.name === file.name && a.size === file.size);\r\n if (isDuplicate) {\r\n continue;\r\n }\r\n\r\n newAttachments.push({\r\n id: generateUUID(),\r\n file,\r\n name: file.name,\r\n size: file.size,\r\n type: file.type,\r\n });\r\n }\r\n\r\n if (newAttachments.length > 0) {\r\n setAttachments(prev => [...prev, ...newAttachments]);\r\n setError(null);\r\n }\r\n }, [attachments, isAllowedFileType, t]);\r\n\r\n const handleAttachmentUpload = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = event.target.files;\r\n if (files) {\r\n processAttachmentFiles(files);\r\n }\r\n // Reset input\r\n if (attachmentInputRef.current) {\r\n attachmentInputRef.current.value = '';\r\n }\r\n }, [processAttachmentFiles]);\r\n\r\n // Drag & Drop handlers for attachments\r\n const handleAttachmentDragOver = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDraggingAttachment(true);\r\n }, []);\r\n\r\n const handleAttachmentDragLeave = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDraggingAttachment(false);\r\n }, []);\r\n\r\n const handleAttachmentDrop = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDraggingAttachment(false);\r\n\r\n const files = e.dataTransfer.files;\r\n if (files.length > 0) {\r\n processAttachmentFiles(files);\r\n }\r\n }, [processAttachmentFiles]);\r\n\r\n const handleRemoveAttachment = useCallback((id: string) => {\r\n setAttachments(prev => prev.filter(a => a.id !== id));\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 setShowTenantPicker(true);\r\n return;\r\n }\r\n\r\n try {\r\n setSubmitting(true);\r\n setError(null);\r\n\r\n // Build description with browser info if enabled\r\n let fullDescription = description.trim();\r\n\r\n if (includeBrowserInfo && browserInfo) {\r\n fullDescription += '\\n\\n---\\n**System Information:**\\n' + browserInfoService.formatForDescription(browserInfo);\r\n }\r\n\r\n // Build structured client context for backend storage\r\n const currentBrowserInfo = browserInfo || browserInfoService.captureBrowserInfo();\r\n const recentErrors = logService.getRecentErrors().slice(0, 5);\r\n const clientContext: ClientContextDto = {\r\n sourceUrl: window.location.href,\r\n browser: {\r\n name: currentBrowserInfo.browser,\r\n version: currentBrowserInfo.browserVersion,\r\n language: currentBrowserInfo.language,\r\n },\r\n os: {\r\n name: currentBrowserInfo.os,\r\n version: currentBrowserInfo.osVersion,\r\n },\r\n device: {\r\n type: currentBrowserInfo.deviceType,\r\n screenResolution: currentBrowserInfo.screenResolution,\r\n },\r\n recentErrors: recentErrors.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 // If using locally selected tenant (global view), override X-Tenant-Slug header\r\n const tenantHeaders = selectedTenantForTicket\r\n ? { 'X-Tenant-Slug': selectedTenantForTicket.slug }\r\n : {};\r\n\r\n const ticket = selectedTenantForTicket\r\n ? await api.post<MyTicketDetailDto>('/api/support/my-tickets', {\r\n title: title.trim(),\r\n description: fullDescription,\r\n type: selectedType,\r\n priority,\r\n clientContext,\r\n }, { headers: tenantHeaders })\r\n : await myTicketsApi.create({\r\n title: title.trim(),\r\n description: fullDescription,\r\n type: selectedType,\r\n priority,\r\n clientContext,\r\n });\r\n\r\n // Upload screenshot as attachment if present\r\n if (annotatedScreenshot) {\r\n await uploadScreenshot(ticket.id, annotatedScreenshot, selectedTenantForTicket);\r\n }\r\n\r\n // Upload other attachments\r\n await uploadAttachments(ticket.id, attachments, selectedTenantForTicket);\r\n\r\n // Clean up draft on successful submit\r\n if (currentDraftId) {\r\n ticketDraftService.deleteDraft(currentDraftId);\r\n }\r\n if (autoSaveTimerRef.current) {\r\n clearTimeout(autoSaveTimerRef.current);\r\n autoSaveTimerRef.current = null;\r\n }\r\n hasUnsavedChangesRef.current = false;\r\n\r\n navigate(`/support/my-tickets/${ticket.id}?tab=submitted`);\r\n } catch (err: unknown) {\r\n const serverMessage = err && typeof err === 'object' && 'message' in err\r\n ? (err as { message: string }).message\r\n : null;\r\n setError(serverMessage || t('tickets.create.submitError', 'Failed to create ticket. Please try again.'));\r\n } finally {\r\n setSubmitting(false);\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.create.selectType', 'What type of request do you have?')}</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(type.labelKey, type.label)}</h3>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{t(type.descriptionKey, type.description)}</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 renderForm = () => (\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>\r\n <h2 className=\"text-lg font-semibold\">\r\n {t(ticketTypes.find((tt) => tt.value === selectedType)?.labelKey || '', { defaultValue: ticketTypes.find((tt) => tt.value === selectedType)?.label })}\r\n </h2>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('tickets.create.fillDetails', 'Fill in the details below')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">\r\n {t('tickets.form.title', '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.create.titlePlaceholder', 'Brief summary of your request')}\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 {t('common:text.characters', 'characters')}\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.create.description', '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={\r\n selectedType === 'Bug'\r\n ? t('tickets.create.bugPlaceholder', 'Please describe the issue in detail. Include steps to reproduce, expected behavior, and actual behavior.')\r\n : selectedType === 'FeatureRequest'\r\n ? t('tickets.create.featurePlaceholder', 'Describe the feature you would like to see and why it would be useful.')\r\n : selectedType === 'ApplicationRequest'\r\n ? t('tickets.create.applicationPlaceholder', 'Which application do you need access to and why?')\r\n : t('tickets.create.defaultPlaceholder', 'Please provide as much detail as possible.')\r\n }\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 {t('common:text.characters', 'characters')}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">{t('tickets.create.priority', '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(option.labelKey, option.label)}</div>\r\n <div className=\"text-xs text-[var(--text-secondary)]\">{t(option.descriptionKey, option.description)}</div>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Screenshot Upload Section */}\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">\r\n <ImageIcon className=\"w-4 h-4 inline mr-2\" />\r\n {t('tickets.create.screenshot', 'Screenshot')}\r\n <span className=\"text-[var(--text-secondary)] font-normal ml-2\">({t('common:text.optional', 'optional')})</span>\r\n </label>\r\n\r\n {!screenshot ? (\r\n <div\r\n className={`border-2 border-dashed rounded-lg p-6 text-center cursor-pointer transition-colors ${\r\n isDraggingScreenshot\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)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n onClick={() => screenshotInputRef.current?.click()}\r\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); screenshotInputRef.current?.click(); } }}\r\n role=\"button\"\r\n tabIndex={0}\r\n onDragOver={handleScreenshotDragOver}\r\n onDragLeave={handleScreenshotDragLeave}\r\n onDrop={handleScreenshotDrop}\r\n >\r\n <Upload className=\"w-8 h-8 mx-auto mb-2 text-[var(--text-secondary)]\" />\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {isDraggingScreenshot\r\n ? t('tickets.create.dropScreenshotNow', 'Drop image here')\r\n : t('tickets.create.uploadScreenshot', 'Click or drag & drop to upload a screenshot')}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-muted)] mt-1\">\r\n {t('tickets.create.uploadScreenshotHint', 'PNG, JPG, or GIF up to 10MB')}\r\n </p>\r\n <input\r\n ref={screenshotInputRef}\r\n type=\"file\"\r\n accept=\"image/*\"\r\n onChange={handleScreenshotUpload}\r\n className=\"hidden\"\r\n />\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3\">\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('tickets.create.screenshotUploaded', 'Screenshot uploaded - you can annotate it below')}\r\n </span>\r\n <button\r\n type=\"button\"\r\n onClick={handleRemoveScreenshot}\r\n className=\"btn btn-ghost p-2 text-[var(--error-text)]\"\r\n title={t('tickets.create.removeScreenshot', 'Remove screenshot')}\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n <ScreenshotAnnotator\r\n screenshot={screenshot}\r\n onAnnotatedScreenshot={handleAnnotatedScreenshot}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Attachments Section */}\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">\r\n <Paperclip className=\"w-4 h-4 inline mr-2\" />\r\n {t('tickets.create.attachments', 'Attachments')}\r\n <span className=\"text-[var(--text-secondary)] font-normal ml-2\">({t('common:text.optional', 'optional')})</span>\r\n </label>\r\n\r\n <div\r\n className={`border-2 border-dashed rounded-lg p-4 text-center cursor-pointer transition-colors ${\r\n isDraggingAttachment\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)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n onClick={() => attachmentInputRef.current?.click()}\r\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); attachmentInputRef.current?.click(); } }}\r\n role=\"button\"\r\n tabIndex={0}\r\n onDragOver={handleAttachmentDragOver}\r\n onDragLeave={handleAttachmentDragLeave}\r\n onDrop={handleAttachmentDrop}\r\n >\r\n <Upload className=\"w-6 h-6 mx-auto mb-1 text-[var(--text-secondary)]\" />\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {isDraggingAttachment\r\n ? t('tickets.create.dropFilesNow', 'Drop files here')\r\n : t('tickets.create.uploadAttachments', 'Click or drag & drop to add documents')}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-muted)] mt-1\">\r\n {t('tickets.create.attachmentsHint', 'PDF, Word, Excel, TXT, CSV, ZIP (max 10MB each, up to 5 files)')}\r\n </p>\r\n <input\r\n ref={attachmentInputRef}\r\n type=\"file\"\r\n multiple\r\n accept=\".pdf,.doc,.docx,.xls,.xlsx,.txt,.csv,.zip,.rar,.7z,image/*\"\r\n onChange={handleAttachmentUpload}\r\n className=\"hidden\"\r\n />\r\n </div>\r\n\r\n {/* Attachments List */}\r\n {attachments.length > 0 && (\r\n <div className=\"mt-3 space-y-2\">\r\n {attachments.map((attachment) => {\r\n const AttachmentIcon = getFileIcon(attachment.type);\r\n return (\r\n <div\r\n key={attachment.id}\r\n className=\"flex items-center justify-between p-2 rounded-lg bg-[var(--bg-secondary)]\"\r\n >\r\n <div className=\"flex items-center gap-2 min-w-0\">\r\n <AttachmentIcon className=\"w-4 h-4 text-[var(--text-secondary)] flex-shrink-0\" />\r\n <span className=\"text-sm truncate\">{attachment.name}</span>\r\n <span className=\"text-xs text-[var(--text-muted)] flex-shrink-0\">\r\n ({formatFileSize(attachment.size)})\r\n </span>\r\n </div>\r\n <button\r\n type=\"button\"\r\n onClick={() => handleRemoveAttachment(attachment.id)}\r\n className=\"btn btn-ghost p-1 text-[var(--error-text)]\"\r\n title={t('tickets.create.removeAttachment', 'Remove attachment')}\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Browser Info Section */}\r\n {browserInfo && (\r\n <div className=\"border border-[var(--border-color)] rounded-lg p-4\">\r\n <div className=\"flex items-center justify-between mb-3\">\r\n <div className=\"flex items-center gap-2\">\r\n <Monitor className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <span className=\"text-sm font-medium\">{t('tickets.create.systemInfo', 'System Information')}</span>\r\n </div>\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 <div className={`grid grid-cols-2 md:grid-cols-3 gap-3 text-sm ${!includeBrowserInfo ? 'opacity-50' : ''}`}>\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('tickets.create.browser', 'Browser')}:</span>\r\n <span className=\"ml-2 font-medium\">{browserInfo.browser} {browserInfo.browserVersion}</span>\r\n </div>\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('tickets.create.os', 'OS')}:</span>\r\n <span className=\"ml-2 font-medium\">{browserInfo.os} {browserInfo.osVersion}</span>\r\n </div>\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('tickets.create.device', 'Device')}:</span>\r\n <span className=\"ml-2 font-medium\">{browserInfo.deviceType}</span>\r\n </div>\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('tickets.create.screen', 'Screen')}:</span>\r\n <span className=\"ml-2 font-medium\">{browserInfo.screenResolution}</span>\r\n </div>\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('tickets.create.language', 'Language')}:</span>\r\n <span className=\"ml-2 font-medium\">{browserInfo.language}</span>\r\n </div>\r\n </div>\r\n </div>\r\n )}\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:buttons.back', 'Back')}\r\n </button>\r\n <button\r\n onClick={handleSubmit}\r\n disabled={!title.trim() || !description.trim() || submitting}\r\n className=\"btn btn-primary\"\r\n >\r\n {submitting ? (\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 {t('tickets.create.submit', 'Submit Ticket')}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n\r\n return (\r\n <div className=\"max-w-3xl mx-auto\">\r\n <div className=\"flex items-center gap-4 mb-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.create.title', 'Create New Ticket')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('tickets.create.subtitle', 'Submit a support request or report an issue')}\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n {/* Draft auto-save indicator */}\r\n <div className={`flex items-center gap-1 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', 'Draft saved')}</span>\r\n </div>\r\n {/* Discard draft button */}\r\n {currentDraftId && (\r\n <button\r\n onClick={() => setShowDiscardConfirm(true)}\r\n className=\"btn btn-ghost p-2 text-[var(--text-secondary)] hover:text-[var(--error-text)]\"\r\n title={t('common:drafts.discard', 'Discard draft')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\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.create.stepSelectType', 'Select Type')}</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.create.stepDetails', 'Details')}</span>\r\n </div>\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', 'Creating ticket for:')}</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', '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 )}\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', 'Discard draft?')}</h2>\r\n </div>\r\n <p className=\"text-[var(--text-secondary)] mb-6\">{t('common:drafts.discardConfirmMessage', 'This draft will be permanently deleted. This action cannot be undone.')}</p>\r\n <div className=\"flex justify-end gap-3\">\r\n <button onClick={() => setShowDiscardConfirm(false)} className=\"btn btn-secondary\">\r\n {t('common:actions.cancel', 'Cancel')}\r\n </button>\r\n <button onClick={handleDiscardDraft} className=\"btn bg-[var(--error-text)] text-white hover:opacity-90\">\r\n {t('common:drafts.discard', 'Discard')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\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', 'Select Workspace')}</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{t('support:tickets.tenantPicker.description', 'Choose a workspace to create the ticket in')}</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 const id = currentDraftId || ensureDraft();\r\n if (id) {\r\n ticketDraftService.updateDraft(id, {\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', 'Personal') : t('common:tenant.business', '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', 'Cancel')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["ticketTypes","Bug","Lightbulb","AppWindow","MessageSquare","HelpCircle","priorityOptions","MAX_FILE_SIZE","MAX_ATTACHMENTS","ALLOWED_EXTENSIONS","formatFileSize","bytes","getFileIcon","type","FileText","ImageIcon","FileIcon","restoreDraft","draftId","userTenants","draft","ticketDraftService","selectedTenant","matchingTenant","t","restoreSessionContext","sessionContext","autoSelectType","uploadScreenshot","ticketId","screenshot","selectedTenantForTicket","blob","file","formData","tenantHeaders","api","myTicketsApi","uploadAttachments","attachments","attachment","UserCreateTicketPage","navigate","useNavigate","searchParams","useSearchParams","useTranslation","isGlpi","glpiBaseUrl","useTicketingProvider","currentTenant","isGlobalView","useTenant","screenshotInputRef","useRef","attachmentInputRef","setSelectedTenantForTicket","useState","showTenantPicker","setShowTenantPicker","effectiveTenant","useEffect","step","setStep","selectedType","setSelectedType","title","setTitle","description","setDescription","priority","setPriority","submitting","setSubmitting","error","setError","browserInfo","setBrowserInfo","includeBrowserInfo","setIncludeBrowserInfo","setScreenshot","annotatedScreenshot","setAnnotatedScreenshot","isDraggingScreenshot","setIsDraggingScreenshot","setAttachments","isDraggingAttachment","setIsDraggingAttachment","currentDraftId","setCurrentDraftId","showDraftSaved","setShowDraftSaved","showDiscardConfirm","setShowDiscardConfirm","autoSaveTimerRef","isInitialLoadCompleteRef","hasUnsavedChangesRef","saveDraftNow","useCallback","result","ensureDraft","newDraft","handleBeforeUnload","handleDiscardDraft","validTypes","prefillType","prefillSubject","prefillBody","errorContextService","sessionScreenshot","info","browserInfoService","processImageFile","reader","e","dataUrl","handleScreenshotUpload","event","handleScreenshotDragOver","handleScreenshotDragLeave","handleScreenshotDrop","files","handleRemoveScreenshot","handleAnnotatedScreenshot","isAllowedFileType","extension","processAttachmentFiles","newAttachments","i","a","generateUUID","prev","handleAttachmentUpload","handleAttachmentDragOver","handleAttachmentDragLeave","handleAttachmentDrop","handleRemoveAttachment","id","handleSubmit","fullDescription","currentBrowserInfo","recentErrors","logService","clientContext","ticket","err","serverMessage","renderTypeSelection","jsxs","jsx","renderForm","ArrowLeft","tt","option","X","ScreenshotAnnotator","Upload","Paperclip","AttachmentIcon","Monitor","AlertTriangle","Loader2","Send","Headset","Check","Trash2","Info","ExternalLink","Fragment","Building2","tenant"],"mappings":"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"}