@atlashub/smartstack 3.21.0 → 3.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js → AgentSkillsPage-BWQSCYl-.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js.map → AgentSkillsPage-BWQSCYl-.js.map} +1 -1
- package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js → AgentSkillsPage-IQcMnBaD.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js.map → AgentSkillsPage-IQcMnBaD.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js → AgentWorkloadPage-DqrjkvWL.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js.map → AgentWorkloadPage-DqrjkvWL.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js → AgentWorkloadPage-w-HiyFYP.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js.map → AgentWorkloadPage-w-HiyFYP.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js → ApiCatalogDetailPage-D3L8Yf4G.js} +3 -3
- package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js.map → ApiCatalogDetailPage-D3L8Yf4G.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js → ApiCatalogDetailPage-MPT3Kz6H.js} +2 -2
- package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js.map → ApiCatalogDetailPage-MPT3Kz6H.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js → ApiCatalogPage-D4Hg3uiS.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js.map → ApiCatalogPage-D4Hg3uiS.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js → ApiCatalogPage-DRg5Cz0r.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js.map → ApiCatalogPage-DRg5Cz0r.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js → ApplicationDetailPage-Caizuyn2.js} +2 -2
- package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js.map → ApplicationDetailPage-Caizuyn2.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js → ApplicationDetailPage-CuCW6aMB.js} +4 -4
- package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js.map → ApplicationDetailPage-CuCW6aMB.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js → ApplicationsDashboardPage-B2MW8-Kc.js} +2 -2
- package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js.map → ApplicationsDashboardPage-B2MW8-Kc.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js → ApplicationsDashboardPage-BDIjFIYZ.js} +3 -3
- package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js.map → ApplicationsDashboardPage-BDIjFIYZ.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js → ApplicationsGridPage-DV-FihKj.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js.map → ApplicationsGridPage-DV-FihKj.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js → ApplicationsGridPage-DXsTfXPI.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js.map → ApplicationsGridPage-DXsTfXPI.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js → ApplicationsListPage--CGkyBuJ.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js.map → ApplicationsListPage--CGkyBuJ.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-C91v2rZt.js → ApplicationsListPage-JUX823bh.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-C91v2rZt.js.map → ApplicationsListPage-JUX823bh.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-BCbgotIx.js → ApplicationsPage-6zgFye6w.js} +2 -2
- package/dist/chunks/{ApplicationsPage-BCbgotIx.js.map → ApplicationsPage-6zgFye6w.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js → ApplicationsPage-CQPuuiO6.js} +4 -4
- package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js.map → ApplicationsPage-CQPuuiO6.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js → AssignmentRulesPage-CFffeEbo.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js.map → AssignmentRulesPage-CFffeEbo.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js → AssignmentRulesPage-D78UeUId.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js.map → AssignmentRulesPage-D78UeUId.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-DmfBYQAD.js → AssignmentsPage-Cww2ifZF.js} +2 -2
- package/dist/chunks/{AssignmentsPage-DmfBYQAD.js.map → AssignmentsPage-Cww2ifZF.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-sRCCBmRc.js → AssignmentsPage-DE_QS2LO.js} +2 -2
- package/dist/chunks/{AssignmentsPage-sRCCBmRc.js.map → AssignmentsPage-DE_QS2LO.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js → AuthCallbackPage-CA2nO6DG.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js.map → AuthCallbackPage-CA2nO6DG.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js → AuthCallbackPage-CDUAoX-N.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js.map → AuthCallbackPage-CDUAoX-N.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js → ConfirmEmailPage-BqsILAYH.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js.map → ConfirmEmailPage-BqsILAYH.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js → ConfirmEmailPage-INeHCuMB.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js.map → ConfirmEmailPage-INeHCuMB.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js → CreateSupportTicketPage-BWeuV2aU.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js.map → CreateSupportTicketPage-BWeuV2aU.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js → CreateSupportTicketPage-OBwF4v7b.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js.map → CreateSupportTicketPage-OBwF4v7b.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CUZ80NGV.js → DashboardPage-CKHqWrdS.js} +3 -3
- package/dist/chunks/{DashboardPage-CUZ80NGV.js.map → DashboardPage-CKHqWrdS.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CaNOAstg.js → DashboardPage-COmc9b__.js} +3 -3
- package/dist/chunks/{DashboardPage-CaNOAstg.js.map → DashboardPage-COmc9b__.js.map} +1 -1
- package/dist/chunks/{DashboardPage-B48_rQFi.js → DashboardPage-CfKZHiSj.js} +2 -2
- package/dist/chunks/{DashboardPage-B48_rQFi.js.map → DashboardPage-CfKZHiSj.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CUZV1J9t.js → DashboardPage-CwEZZ3jx.js} +2 -2
- package/dist/chunks/{DashboardPage-CUZV1J9t.js.map → DashboardPage-CwEZZ3jx.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js → EscalationConfigPage--7lgZ0kJ.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js.map → EscalationConfigPage--7lgZ0kJ.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js → EscalationConfigPage-DPyiBcqV.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js.map → EscalationConfigPage-DPyiBcqV.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js → ForceChangePasswordPage-BE-6umub.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js.map → ForceChangePasswordPage-BE-6umub.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js → ForceChangePasswordPage-CnsYoWmV.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js.map → ForceChangePasswordPage-CnsYoWmV.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js → ForgotPasswordPage-CSq4DnFF.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js.map → ForgotPasswordPage-CSq4DnFF.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js → ForgotPasswordPage-DZLVolAC.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js.map → ForgotPasswordPage-DZLVolAC.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-DFBvVO1S.js → GroupDetailPage-Bf9Wb_2j.js} +5 -5
- package/dist/chunks/{GroupDetailPage-DFBvVO1S.js.map → GroupDetailPage-Bf9Wb_2j.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-B2FkKrGG.js → GroupDetailPage-R-hf3rJ7.js} +2 -2
- package/dist/chunks/{GroupDetailPage-B2FkKrGG.js.map → GroupDetailPage-R-hf3rJ7.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js → MyAccessRequestsPage-BIisvWM6.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js.map → MyAccessRequestsPage-BIisvWM6.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js → MyAccessRequestsPage-BLSV7Tbx.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js.map → MyAccessRequestsPage-BLSV7Tbx.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-BEcYYdGR.js → MyTenantsPage-D-7k9CP1.js} +3 -3
- package/dist/chunks/{MyTenantsPage-BEcYYdGR.js.map → MyTenantsPage-D-7k9CP1.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-D9f85zjF.js → MyTenantsPage-DqGW6aDt.js} +2 -2
- package/dist/chunks/{MyTenantsPage-D9f85zjF.js.map → MyTenantsPage-DqGW6aDt.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DJR8h6y1.js → MyTicketsPage--DgDsnZA.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DJR8h6y1.js.map → MyTicketsPage--DgDsnZA.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DiOUExKJ.js → MyTicketsPage-CqJ3Aqob.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DiOUExKJ.js.map → MyTicketsPage-CqJ3Aqob.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js → NavigationAppsPage-Bebis_RT.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js.map → NavigationAppsPage-Bebis_RT.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-If7tmCFY.js → NavigationAppsPage-THNPOAjv.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-If7tmCFY.js.map → NavigationAppsPage-THNPOAjv.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-C29Lln5o.js → NotificationsPage-CAbNW_Cn.js} +2 -2
- package/dist/chunks/{NotificationsPage-C29Lln5o.js.map → NotificationsPage-CAbNW_Cn.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-BiaLRb0s.js → NotificationsPage-DxwizUhL.js} +2 -2
- package/dist/chunks/{NotificationsPage-BiaLRb0s.js.map → NotificationsPage-DxwizUhL.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js → OnboardingWizardPage-C6HlbJ3K.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js.map → OnboardingWizardPage-C6HlbJ3K.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js → OnboardingWizardPage-CyC2zONO.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js.map → OnboardingWizardPage-CyC2zONO.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js → PermissionDetailPage-BDHiNgky.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js.map → PermissionDetailPage-BDHiNgky.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js → PermissionDetailPage-C5K17ydY.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js.map → PermissionDetailPage-C5K17ydY.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-l0PnY-EE.js → PermissionsPage-COI5LJPo.js} +2 -2
- package/dist/chunks/{PermissionsPage-l0PnY-EE.js.map → PermissionsPage-COI5LJPo.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-DLy9U3P3.js → PermissionsPage-CkOwH2_d.js} +2 -2
- package/dist/chunks/{PermissionsPage-DLy9U3P3.js.map → PermissionsPage-CkOwH2_d.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-DFBx38-x.js → PortalDashboardPage-CoEC4CmC.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-DFBx38-x.js.map → PortalDashboardPage-CoEC4CmC.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js → PortalDashboardPage-DrYymEf-.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js.map → PortalDashboardPage-DrYymEf-.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-BBu8yZQB.js → PreferencesPage-CJRaU3ba.js} +2 -2
- package/dist/chunks/{PreferencesPage-BBu8yZQB.js.map → PreferencesPage-CJRaU3ba.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-B81MsNV1.js → PreferencesPage-Cqr9mAab.js} +2 -2
- package/dist/chunks/{PreferencesPage-B81MsNV1.js.map → PreferencesPage-Cqr9mAab.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DDrl10zj.js → ProfilePage-BZVpg6-l.js} +2 -2
- package/dist/chunks/{ProfilePage-DDrl10zj.js.map → ProfilePage-BZVpg6-l.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DPoXwdnc.js → ProfilePage-Cu_FITeL.js} +2 -2
- package/dist/chunks/{ProfilePage-DPoXwdnc.js.map → ProfilePage-Cu_FITeL.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js → ReferencesManagementPage-DUlVk9Ps.js} +3 -3
- package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js.map → ReferencesManagementPage-DUlVk9Ps.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js → ReferencesManagementPage-ZCuYtqd7.js} +2 -2
- package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js.map → ReferencesManagementPage-ZCuYtqd7.js.map} +1 -1
- package/dist/chunks/{RegisterPage-CiQib3-6.js → RegisterPage-C4xmVwh9.js} +2 -2
- package/dist/chunks/{RegisterPage-CiQib3-6.js.map → RegisterPage-C4xmVwh9.js.map} +1 -1
- package/dist/chunks/{RegisterPage-bXCcJD88.js → RegisterPage-DGyzoIHT.js} +2 -2
- package/dist/chunks/{RegisterPage-bXCcJD88.js.map → RegisterPage-DGyzoIHT.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js → ResetPasswordPage-DqDD6VPR.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js.map → ResetPasswordPage-DqDD6VPR.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-CubPG3yv.js → ResetPasswordPage-Glu-aeqv.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-CubPG3yv.js.map → ResetPasswordPage-Glu-aeqv.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-Bg7XZmR1.js → ResolutionModal-CxjANAOP.js} +2 -2
- package/dist/chunks/{ResolutionModal-Bg7XZmR1.js.map → ResolutionModal-CxjANAOP.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-DqRk_T0n.js → ResolutionModal-Duat18qV.js} +2 -2
- package/dist/chunks/{ResolutionModal-DqRk_T0n.js.map → ResolutionModal-Duat18qV.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-Blau6_4c.js → RoleDetailPage-BQffUSnt.js} +3 -3
- package/dist/chunks/{RoleDetailPage-Blau6_4c.js.map → RoleDetailPage-BQffUSnt.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-CiRVxxIP.js → RoleDetailPage-JTm5lD1_.js} +2 -2
- package/dist/chunks/{RoleDetailPage-CiRVxxIP.js.map → RoleDetailPage-JTm5lD1_.js.map} +1 -1
- package/dist/chunks/{RolesPage-Pm-RN3lP.js → RolesPage-B9rRzciI.js} +2 -2
- package/dist/chunks/{RolesPage-Pm-RN3lP.js.map → RolesPage-B9rRzciI.js.map} +1 -1
- package/dist/chunks/{RolesPage-Cb8joqdJ.js → RolesPage-BN8_zMOC.js} +2 -2
- package/dist/chunks/{RolesPage-Cb8joqdJ.js.map → RolesPage-BN8_zMOC.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-B86McKM6.js → SlaConfigPage-B7kZNig4.js} +2 -2
- package/dist/chunks/{SlaConfigPage-B86McKM6.js.map → SlaConfigPage-B7kZNig4.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-BY7gvYU6.js → SlaConfigPage-okvZfA_K.js} +2 -2
- package/dist/chunks/{SlaConfigPage-BY7gvYU6.js.map → SlaConfigPage-okvZfA_K.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js → SupportPermissionsPage-DGAPqJbl.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js.map → SupportPermissionsPage-DGAPqJbl.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js → SupportPermissionsPage-Dg_wLOme.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js.map → SupportPermissionsPage-Dg_wLOme.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-BDguJ401.js → TemplatesPage-DT9fhlAU.js} +2 -2
- package/dist/chunks/{TemplatesPage-BDguJ401.js.map → TemplatesPage-DT9fhlAU.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-DdnGgioU.js → TemplatesPage-DiEk538p.js} +2 -2
- package/dist/chunks/{TemplatesPage-DdnGgioU.js.map → TemplatesPage-DiEk538p.js.map} +1 -1
- package/dist/chunks/{TenantCard-ffwWsgFQ.js → TenantCard-BbSYk9_Z.js} +2 -2
- package/dist/chunks/{TenantCard-ffwWsgFQ.js.map → TenantCard-BbSYk9_Z.js.map} +1 -1
- package/dist/chunks/{TenantCard-CUjb6og9.js → TenantCard-CEkiKxcZ.js} +2 -2
- package/dist/chunks/{TenantCard-CUjb6og9.js.map → TenantCard-CEkiKxcZ.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js → TenantScopeSelector-BWfYxvEa.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js.map → TenantScopeSelector-BWfYxvEa.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js → TenantScopeSelector-D-BKgQPV.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js.map → TenantScopeSelector-D-BKgQPV.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-GOh9GX7E.js → TicketDetailPage-C1mNS9Up.js} +2 -2
- package/dist/chunks/{TicketDetailPage-GOh9GX7E.js.map → TicketDetailPage-C1mNS9Up.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-Du8WMyqf.js → TicketDetailPage-ieVDRh42.js} +2 -2
- package/dist/chunks/{TicketDetailPage-Du8WMyqf.js.map → TicketDetailPage-ieVDRh42.js.map} +1 -1
- package/dist/chunks/{TicketsPage-Bqd6moQy.js → TicketsPage-CnuWsnIW.js} +2 -2
- package/dist/chunks/{TicketsPage-Bqd6moQy.js.map → TicketsPage-CnuWsnIW.js.map} +1 -1
- package/dist/chunks/{TicketsPage-WdU4Bb7M.js → TicketsPage-jjyY15_D.js} +2 -2
- package/dist/chunks/{TicketsPage-WdU4Bb7M.js.map → TicketsPage-jjyY15_D.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js → UserCreateTicketPage-B8Tvf-ag.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js.map → UserCreateTicketPage-B8Tvf-ag.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js → UserCreateTicketPage-DnOsDlfO.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js.map → UserCreateTicketPage-DnOsDlfO.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-BP5WeXPS.js → UserDashboardPage-BrtkJ-NB.js} +2 -2
- package/dist/chunks/{UserDashboardPage-BP5WeXPS.js.map → UserDashboardPage-BrtkJ-NB.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-B53C8fUq.js → UserDashboardPage-KLB5CQP5.js} +2 -2
- package/dist/chunks/{UserDashboardPage-B53C8fUq.js.map → UserDashboardPage-KLB5CQP5.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-B110bmGX.js → UserDetailPage-U7smBQoF.js} +5 -5
- package/dist/chunks/{UserDetailPage-B110bmGX.js.map → UserDetailPage-U7smBQoF.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-CV2VCE46.js → UserDetailPage-_J6lcKAU.js} +2 -2
- package/dist/chunks/{UserDetailPage-CV2VCE46.js.map → UserDetailPage-_J6lcKAU.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js → UserTicketDetailPage-CWoYQgH-.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js.map → UserTicketDetailPage-CWoYQgH-.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js → UserTicketDetailPage-DkufSlvZ.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js.map → UserTicketDetailPage-DkufSlvZ.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js → UsersGroupsPage-C38s2-Rq.js} +3 -3
- package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js.map → UsersGroupsPage-C38s2-Rq.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js → UsersGroupsPage-Dq3rAteo.js} +2 -2
- package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js.map → UsersGroupsPage-Dq3rAteo.js.map} +1 -1
- package/dist/chunks/{UsersPage-Bg7033pp.js → UsersPage-B5C5KEUR.js} +2 -2
- package/dist/chunks/{UsersPage-Bg7033pp.js.map → UsersPage-B5C5KEUR.js.map} +1 -1
- package/dist/chunks/{UsersPage-TYAfwPY1.js → UsersPage-CXC9Hvq6.js} +2 -2
- package/dist/chunks/{UsersPage-TYAfwPY1.js.map → UsersPage-CXC9Hvq6.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-DZeDvzwv.js → accessRequestsApi-B-4TJ5_U.js} +2 -2
- package/dist/chunks/{accessRequestsApi-DZeDvzwv.js.map → accessRequestsApi-B-4TJ5_U.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-ZXFPCid2.js → accessRequestsApi-DZSfThpd.js} +2 -2
- package/dist/chunks/{accessRequestsApi-ZXFPCid2.js.map → accessRequestsApi-DZSfThpd.js.map} +1 -1
- package/dist/chunks/{aiApi-CsH8DXgs.js → aiApi-B20Teu2v.js} +2 -2
- package/dist/chunks/{aiApi-CsH8DXgs.js.map → aiApi-B20Teu2v.js.map} +1 -1
- package/dist/chunks/{aiApi-CVPzFTXa.js → aiApi-DMGz-RPM.js} +2 -2
- package/dist/chunks/{aiApi-CVPzFTXa.js.map → aiApi-DMGz-RPM.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js → applicationAnalyticsApi-Bwa75Fzd.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js.map → applicationAnalyticsApi-Bwa75Fzd.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js → applicationAnalyticsApi-CLBqRPfN.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js.map → applicationAnalyticsApi-CLBqRPfN.js.map} +1 -1
- package/dist/chunks/{groupsApi-BgCk2fsp.js → groupsApi-QzXI-5xu.js} +2 -2
- package/dist/chunks/{groupsApi-BgCk2fsp.js.map → groupsApi-QzXI-5xu.js.map} +1 -1
- package/dist/chunks/{groupsApi-BIbG665N.js → groupsApi-hB9kSWEd.js} +2 -2
- package/dist/chunks/{groupsApi-BIbG665N.js.map → groupsApi-hB9kSWEd.js.map} +1 -1
- package/dist/chunks/{index-Cb3LotuT.js → index--NGcBYUu.js} +3 -3
- package/dist/chunks/{index-Cb3LotuT.js.map → index--NGcBYUu.js.map} +1 -1
- package/dist/chunks/{index-C33zcyF4.js → index--aPwOFjF.js} +2 -2
- package/dist/chunks/{index-C33zcyF4.js.map → index--aPwOFjF.js.map} +1 -1
- package/dist/chunks/{index-sMr9qND_.js → index-0VrOtwP0.js} +2 -2
- package/dist/chunks/{index-sMr9qND_.js.map → index-0VrOtwP0.js.map} +1 -1
- package/dist/chunks/{index-DDKetfKq.js → index-37U271aw.js} +2 -2
- package/dist/chunks/{index-DDKetfKq.js.map → index-37U271aw.js.map} +1 -1
- package/dist/chunks/{index-B9fS7ir6.js → index-B7qZTuQ-.js} +2 -2
- package/dist/chunks/{index-B9fS7ir6.js.map → index-B7qZTuQ-.js.map} +1 -1
- package/dist/chunks/{index-CdjBY7L8.js → index-Bedzmqr-.js} +2 -2
- package/dist/chunks/{index-CdjBY7L8.js.map → index-Bedzmqr-.js.map} +1 -1
- package/dist/chunks/{index-CHG_O1fS.js → index-Betxo5g5.js} +2 -2
- package/dist/chunks/{index-CHG_O1fS.js.map → index-Betxo5g5.js.map} +1 -1
- package/dist/chunks/{index-jiGu-H8x.js → index-BmaJz475.js} +2 -2
- package/dist/chunks/{index-jiGu-H8x.js.map → index-BmaJz475.js.map} +1 -1
- package/dist/chunks/{index-C53JoVNk.js → index-Buhqag3v.js} +2 -2
- package/dist/chunks/{index-C53JoVNk.js.map → index-Buhqag3v.js.map} +1 -1
- package/dist/chunks/{index-DO0Rw7hX.js → index-C3VxlfKq.js} +2 -2
- package/dist/chunks/{index-DO0Rw7hX.js.map → index-C3VxlfKq.js.map} +1 -1
- package/dist/chunks/{index-CSQ60fpG.js → index-CgpRo8Oe.js} +2 -2
- package/dist/chunks/{index-CSQ60fpG.js.map → index-CgpRo8Oe.js.map} +1 -1
- package/dist/chunks/{index-B-e-ELsf.js → index-DOY0w8Iu.js} +8 -8
- package/dist/chunks/{index-B-e-ELsf.js.map → index-DOY0w8Iu.js.map} +1 -1
- package/dist/chunks/{index-D2REDIRX.js → index-DwuvIOrQ.js} +2 -2
- package/dist/chunks/{index-D2REDIRX.js.map → index-DwuvIOrQ.js.map} +1 -1
- package/dist/chunks/{index-DCcl7Qof.js → index-DzedSLdI.js} +2 -2
- package/dist/chunks/{index-DCcl7Qof.js.map → index-DzedSLdI.js.map} +1 -1
- package/dist/chunks/{index-2wUhd9Lu.js → index-IgLVXPg8.js} +10 -10
- package/dist/chunks/index-IgLVXPg8.js.map +1 -0
- package/dist/chunks/{index-CwSaRXXg.js → index-lpIzhufD.js} +1916 -1900
- package/dist/chunks/index-lpIzhufD.js.map +1 -0
- package/dist/chunks/{index-Cuwn2q-f.js → index-mLUKwbGl.js} +4 -4
- package/dist/chunks/{index-Cuwn2q-f.js.map → index-mLUKwbGl.js.map} +1 -1
- package/dist/chunks/{index-B0mk2tNY.js → index-tO6MMIFB.js} +2 -2
- package/dist/chunks/{index-B0mk2tNY.js.map → index-tO6MMIFB.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-BpNANQ5s.js → tenantIconMap-BQD9byc8.js} +2 -2
- package/dist/chunks/{tenantIconMap-BpNANQ5s.js.map → tenantIconMap-BQD9byc8.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-DtdUgvJO.js → tenantIconMap-CTMuSt18.js} +2 -2
- package/dist/chunks/{tenantIconMap-DtdUgvJO.js.map → tenantIconMap-CTMuSt18.js.map} +1 -1
- package/dist/chunks/{ticketingApi-Bu4rKwLl.js → ticketingApi-BNIdox5t.js} +2 -2
- package/dist/chunks/{ticketingApi-Bu4rKwLl.js.map → ticketingApi-BNIdox5t.js.map} +1 -1
- package/dist/chunks/{ticketingApi-r4Avm9iS.js → ticketingApi-J0vC_t7r.js} +2 -2
- package/dist/chunks/{ticketingApi-r4Avm9iS.js.map → ticketingApi-J0vC_t7r.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-B9bF4swg.js → useAccessRequests-DCNNLnxk.js} +3 -3
- package/dist/chunks/{useAccessRequests-B9bF4swg.js.map → useAccessRequests-DCNNLnxk.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-JyPUX3Om.js → useAccessRequests-DT7X4FAK.js} +2 -2
- package/dist/chunks/{useAccessRequests-JyPUX3Om.js.map → useAccessRequests-DT7X4FAK.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-DjPQenC2.js → useUserAccessRequests-BYbmG4c7.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-DjPQenC2.js.map → useUserAccessRequests-BYbmG4c7.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-BB6FHW14.js → useUserAccessRequests-CylKxRN6.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-BB6FHW14.js.map → useUserAccessRequests-CylKxRN6.js.map} +1 -1
- package/dist/hooks/useCollapsibleState.d.ts +5 -2
- package/dist/hooks/useCollapsibleState.d.ts.map +1 -1
- package/dist/i18n/config.d.ts +1 -0
- package/dist/i18n/config.d.ts.map +1 -1
- package/dist/main.d.ts +0 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/smartstack.cjs +1 -1
- package/dist/smartstack.js +1 -1
- package/dist/utils/permissions.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/index-2wUhd9Lu.js.map +0 -1
- package/dist/chunks/index-CwSaRXXg.js.map +0 -1
package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js.map → UserCreateTicketPage-B8Tvf-ag.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserCreateTicketPage-Cm1emgwR.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 { 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: crypto.randomUUID(),\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","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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"}
|
|
1
|
+
{"version":3,"file":"UserCreateTicketPage-B8Tvf-ag.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 { 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: crypto.randomUUID(),\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","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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"}
|
|
@@ -3,7 +3,7 @@ import { useRef as q, useState as i, useEffect as G, useCallback as l } from "re
|
|
|
3
3
|
import { useNavigate as Qe, useSearchParams as Ze } from "react-router-dom";
|
|
4
4
|
import { useTranslation as Je } from "react-i18next";
|
|
5
5
|
import { ArrowLeft as ye, Headset as Ye, Check as et, Trash2 as Ne, Info as tt, ExternalLink as rt, Building2 as te, Bug as at, Lightbulb as st, AppWindow as nt, MessageSquare as ct, HelpCircle as it, Image as Ce, Upload as ke, X as we, Paperclip as ot, Monitor as lt, AlertTriangle as dt, Loader2 as mt, Send as ut, FileText as pt, File as ht } from "lucide-react";
|
|
6
|
-
import { W as ft, a as gt, a0 as P, a2 as De, a1 as re, l as vt, i as se, a3 as ne } from "./index-
|
|
6
|
+
import { W as ft, a as gt, a0 as P, a2 as De, a1 as re, l as vt, i as se, a3 as ne } from "./index-lpIzhufD.js";
|
|
7
7
|
import { S as bt } from "./ScreenshotAnnotator-DEuQRcin.js";
|
|
8
8
|
const ae = [
|
|
9
9
|
{
|
|
@@ -741,4 +741,4 @@ function Kt() {
|
|
|
741
741
|
export {
|
|
742
742
|
Kt as UserCreateTicketPage
|
|
743
743
|
};
|
|
744
|
-
//# sourceMappingURL=UserCreateTicketPage-
|
|
744
|
+
//# sourceMappingURL=UserCreateTicketPage-DnOsDlfO.js.map
|