@atlashub/smartstack 3.28.0 → 3.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{AgentSkillsPage-ChykpPZx.js → AgentSkillsPage-CVq3qZoe.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-ChykpPZx.js.map → AgentSkillsPage-CVq3qZoe.js.map} +1 -1
- package/dist/chunks/{AgentSkillsPage-ABpqnnyK.js → AgentSkillsPage-DJb49NMA.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-ABpqnnyK.js.map → AgentSkillsPage-DJb49NMA.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-BltzNlXI.js → AgentWorkloadPage-D_nk3gKj.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-BltzNlXI.js.map → AgentWorkloadPage-D_nk3gKj.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-BI5QWJyQ.js → AgentWorkloadPage-oHEi-sFh.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-BI5QWJyQ.js.map → AgentWorkloadPage-oHEi-sFh.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-BaheZKBq.js → ApiCatalogDetailPage-Cr0q2HnB.js} +3 -3
- package/dist/chunks/{ApiCatalogDetailPage-BaheZKBq.js.map → ApiCatalogDetailPage-Cr0q2HnB.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-CsRxlHwO.js → ApiCatalogDetailPage-DX8buBkV.js} +2 -2
- package/dist/chunks/{ApiCatalogDetailPage-CsRxlHwO.js.map → ApiCatalogDetailPage-DX8buBkV.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-CqmmHpQ4.js → ApiCatalogPage-DN7sazvI.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-CqmmHpQ4.js.map → ApiCatalogPage-DN7sazvI.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-B0yIz8-U.js → ApiCatalogPage-DqboIzZE.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-B0yIz8-U.js.map → ApiCatalogPage-DqboIzZE.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-CngD5JSN.js → ApplicationDetailPage--9YwwS5A.js} +2 -2
- package/dist/chunks/{ApplicationDetailPage-CngD5JSN.js.map → ApplicationDetailPage--9YwwS5A.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-CdT6KNd7.js → ApplicationDetailPage-CCNjr64K.js} +4 -4
- package/dist/chunks/{ApplicationDetailPage-CdT6KNd7.js.map → ApplicationDetailPage-CCNjr64K.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-DHmnjk2O.js → ApplicationsDashboardPage-BSsHN3Yj.js} +2 -2
- package/dist/chunks/{ApplicationsDashboardPage-DHmnjk2O.js.map → ApplicationsDashboardPage-BSsHN3Yj.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-1V4iQ6eY.js → ApplicationsDashboardPage-Bs-Xgca4.js} +3 -3
- package/dist/chunks/{ApplicationsDashboardPage-1V4iQ6eY.js.map → ApplicationsDashboardPage-Bs-Xgca4.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-Bo3NDnBF.js → ApplicationsGridPage-DDysNWJ5.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-Bo3NDnBF.js.map → ApplicationsGridPage-DDysNWJ5.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-CiMJFlB_.js → ApplicationsGridPage-s1WEzOXS.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-CiMJFlB_.js.map → ApplicationsGridPage-s1WEzOXS.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-L2_S23aN.js → ApplicationsListPage-B3CSMiV0.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-L2_S23aN.js.map → ApplicationsListPage-B3CSMiV0.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-De8jQ1Cm.js → ApplicationsListPage-B6ZCecIl.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-De8jQ1Cm.js.map → ApplicationsListPage-B6ZCecIl.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-DBq7_Sm8.js → ApplicationsPage-BBaiBM--.js} +2 -2
- package/dist/chunks/{ApplicationsPage-DBq7_Sm8.js.map → ApplicationsPage-BBaiBM--.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-CiNI-b0R.js → ApplicationsPage-ztPwoAGt.js} +4 -4
- package/dist/chunks/{ApplicationsPage-CiNI-b0R.js.map → ApplicationsPage-ztPwoAGt.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-DFsO4ZES.js → AssignmentRulesPage-CK4L4rBO.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-DFsO4ZES.js.map → AssignmentRulesPage-CK4L4rBO.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-C8rfUsMB.js → AssignmentRulesPage-DFSVFFXr.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-C8rfUsMB.js.map → AssignmentRulesPage-DFSVFFXr.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-78C_EBsw.js → AssignmentsPage-Bp7oQD7Q.js} +2 -2
- package/dist/chunks/{AssignmentsPage-78C_EBsw.js.map → AssignmentsPage-Bp7oQD7Q.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-COCikISI.js → AssignmentsPage-JCLpyg94.js} +2 -2
- package/dist/chunks/{AssignmentsPage-COCikISI.js.map → AssignmentsPage-JCLpyg94.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-DqT6ueVi.js → AuthCallbackPage-Bl9xlJ3h.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-DqT6ueVi.js.map → AuthCallbackPage-Bl9xlJ3h.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-BF4bkTnR.js → AuthCallbackPage-CzMHz4jy.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-BF4bkTnR.js.map → AuthCallbackPage-CzMHz4jy.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-Bh_K5qJn.js → ConfirmEmailPage-D_8T1vqV.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-Bh_K5qJn.js.map → ConfirmEmailPage-D_8T1vqV.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-DJy4idrf.js → ConfirmEmailPage-M7mJgXvn.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-DJy4idrf.js.map → ConfirmEmailPage-M7mJgXvn.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-pL7jbG9o.js → CreateSupportTicketPage-BNEGavlu.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-pL7jbG9o.js.map → CreateSupportTicketPage-BNEGavlu.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-AVTwXbJd.js → CreateSupportTicketPage-C2X2mfds.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-AVTwXbJd.js.map → CreateSupportTicketPage-C2X2mfds.js.map} +1 -1
- package/dist/chunks/{DashboardPage-DdQlTLw0.js → DashboardPage-4oy2YqvT.js} +2 -2
- package/dist/chunks/{DashboardPage-DdQlTLw0.js.map → DashboardPage-4oy2YqvT.js.map} +1 -1
- package/dist/chunks/{DashboardPage-C55mIiB6.js → DashboardPage-CO-8B8EI.js} +3 -3
- package/dist/chunks/{DashboardPage-C55mIiB6.js.map → DashboardPage-CO-8B8EI.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CcCnUl7s.js → DashboardPage-CPArUG-S.js} +2 -2
- package/dist/chunks/{DashboardPage-CcCnUl7s.js.map → DashboardPage-CPArUG-S.js.map} +1 -1
- package/dist/chunks/{DashboardPage-DOitDfGV.js → DashboardPage-D5MRMxEV.js} +3 -3
- package/dist/chunks/{DashboardPage-DOitDfGV.js.map → DashboardPage-D5MRMxEV.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-DNnZftCH.js → EscalationConfigPage-CwdnfJbJ.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-DNnZftCH.js.map → EscalationConfigPage-CwdnfJbJ.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-DRr55328.js → EscalationConfigPage-DnjLFXnL.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-DRr55328.js.map → EscalationConfigPage-DnjLFXnL.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-1SCOPIqK.js → ForceChangePasswordPage-ZEIfyqwE.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-1SCOPIqK.js.map → ForceChangePasswordPage-ZEIfyqwE.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-DBeG_HRO.js → ForceChangePasswordPage-sh-3h_H9.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-DBeG_HRO.js.map → ForceChangePasswordPage-sh-3h_H9.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-Dlb6wKfC.js → ForgotPasswordPage-B4M6-xeM.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-Dlb6wKfC.js.map → ForgotPasswordPage-B4M6-xeM.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-DffYfXva.js → ForgotPasswordPage-MIu-U7p0.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-DffYfXva.js.map → ForgotPasswordPage-MIu-U7p0.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-C9nRbeHI.js → GroupDetailPage-4XK3Bs_r.js} +5 -5
- package/dist/chunks/{GroupDetailPage-C9nRbeHI.js.map → GroupDetailPage-4XK3Bs_r.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-CPPUWzXf.js → GroupDetailPage-C-kvtd2T.js} +2 -2
- package/dist/chunks/{GroupDetailPage-CPPUWzXf.js.map → GroupDetailPage-C-kvtd2T.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-BAX0xwJX.js → MyAccessRequestsPage-CP41FzHi.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-BAX0xwJX.js.map → MyAccessRequestsPage-CP41FzHi.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-BMY1V631.js → MyAccessRequestsPage-DzrXTrVi.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-BMY1V631.js.map → MyAccessRequestsPage-DzrXTrVi.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-Bbn4HxN2.js → MyTenantsPage-CZRkMbh8.js} +2 -2
- package/dist/chunks/{MyTenantsPage-Bbn4HxN2.js.map → MyTenantsPage-CZRkMbh8.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-BHtp67SD.js → MyTenantsPage-V_SwYio2.js} +3 -3
- package/dist/chunks/{MyTenantsPage-BHtp67SD.js.map → MyTenantsPage-V_SwYio2.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-BvZeiTXu.js → MyTicketsPage-DOUhaLal.js} +2 -2
- package/dist/chunks/{MyTicketsPage-BvZeiTXu.js.map → MyTicketsPage-DOUhaLal.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-D9IGVofj.js → MyTicketsPage-DnvAIeyr.js} +2 -2
- package/dist/chunks/{MyTicketsPage-D9IGVofj.js.map → MyTicketsPage-DnvAIeyr.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-DiPBCsAF.js → NavigationAppsPage-DXvpLsbt.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-DiPBCsAF.js.map → NavigationAppsPage-DXvpLsbt.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-ChtMK1yt.js → NavigationAppsPage-DfTa4jCG.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-ChtMK1yt.js.map → NavigationAppsPage-DfTa4jCG.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-BxCiGzHk.js → NotificationsPage-D76MdAs-.js} +2 -2
- package/dist/chunks/{NotificationsPage-BxCiGzHk.js.map → NotificationsPage-D76MdAs-.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-BCnL9oPb.js → NotificationsPage-I1yCk7tk.js} +2 -2
- package/dist/chunks/{NotificationsPage-BCnL9oPb.js.map → NotificationsPage-I1yCk7tk.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-CV_cxq7k.js → OnboardingWizardPage-BRUzcl1A.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-CV_cxq7k.js.map → OnboardingWizardPage-BRUzcl1A.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-Du-tQ2ag.js → OnboardingWizardPage-DtWUPCh3.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-Du-tQ2ag.js.map → OnboardingWizardPage-DtWUPCh3.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-C1iuWv0G.js → PermissionDetailPage-CUNKbl7t.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-C1iuWv0G.js.map → PermissionDetailPage-CUNKbl7t.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Ds4Jt1os.js → PermissionDetailPage-DJJGbXoX.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Ds4Jt1os.js.map → PermissionDetailPage-DJJGbXoX.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-BGI2nxCn.js → PermissionsPage-B8wmawPV.js} +2 -2
- package/dist/chunks/{PermissionsPage-BGI2nxCn.js.map → PermissionsPage-B8wmawPV.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-sauv7ct1.js → PermissionsPage-Dbjcctuh.js} +2 -2
- package/dist/chunks/{PermissionsPage-sauv7ct1.js.map → PermissionsPage-Dbjcctuh.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-CQWEcghD.js → PortalDashboardPage-BeNfBZmb.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-CQWEcghD.js.map → PortalDashboardPage-BeNfBZmb.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-2kCbJw9w.js → PortalDashboardPage-zii0ll57.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-2kCbJw9w.js.map → PortalDashboardPage-zii0ll57.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-Bu4gaDRb.js → PreferencesPage-BCpuIGzv.js} +2 -2
- package/dist/chunks/{PreferencesPage-Bu4gaDRb.js.map → PreferencesPage-BCpuIGzv.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-Dbg0bEYD.js → PreferencesPage-BmvrBaAD.js} +2 -2
- package/dist/chunks/{PreferencesPage-Dbg0bEYD.js.map → PreferencesPage-BmvrBaAD.js.map} +1 -1
- package/dist/chunks/{ProfilePage-C5QS7tsh.js → ProfilePage-eowQd59_.js} +2 -2
- package/dist/chunks/{ProfilePage-C5QS7tsh.js.map → ProfilePage-eowQd59_.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DfiBhOUt.js → ProfilePage-mf5wI0-n.js} +2 -2
- package/dist/chunks/{ProfilePage-DfiBhOUt.js.map → ProfilePage-mf5wI0-n.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-Bs0mapj8.js → ReferencesManagementPage-8UPgkVE8.js} +3 -3
- package/dist/chunks/{ReferencesManagementPage-Bs0mapj8.js.map → ReferencesManagementPage-8UPgkVE8.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-C0RgHbJb.js → ReferencesManagementPage-CLsaUNqA.js} +2 -2
- package/dist/chunks/{ReferencesManagementPage-C0RgHbJb.js.map → ReferencesManagementPage-CLsaUNqA.js.map} +1 -1
- package/dist/chunks/{RegisterPage-DS1chV_A.js → RegisterPage-57X-ILDb.js} +2 -2
- package/dist/chunks/{RegisterPage-DS1chV_A.js.map → RegisterPage-57X-ILDb.js.map} +1 -1
- package/dist/chunks/{RegisterPage-DoeIiJt0.js → RegisterPage-CNyHSbqs.js} +2 -2
- package/dist/chunks/{RegisterPage-DoeIiJt0.js.map → RegisterPage-CNyHSbqs.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-3KEk3zj5.js → ResetPasswordPage-CyV8l-Zo.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-3KEk3zj5.js.map → ResetPasswordPage-CyV8l-Zo.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-C_VQSFB5.js → ResetPasswordPage-JW8-mh_k.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-C_VQSFB5.js.map → ResetPasswordPage-JW8-mh_k.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-S6URD--N.js → ResolutionModal-CjwE73NX.js} +2 -2
- package/dist/chunks/{ResolutionModal-S6URD--N.js.map → ResolutionModal-CjwE73NX.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-BzI1x79r.js → ResolutionModal-wddG59kg.js} +2 -2
- package/dist/chunks/{ResolutionModal-BzI1x79r.js.map → ResolutionModal-wddG59kg.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-SXK9cq_3.js → RoleDetailPage-CrioVHFI.js} +3 -3
- package/dist/chunks/{RoleDetailPage-SXK9cq_3.js.map → RoleDetailPage-CrioVHFI.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-DvEEWPKr.js → RoleDetailPage-TUOGR1ow.js} +2 -2
- package/dist/chunks/{RoleDetailPage-DvEEWPKr.js.map → RoleDetailPage-TUOGR1ow.js.map} +1 -1
- package/dist/chunks/{RolesPage-B75lCugt.js → RolesPage-CAcols3D.js} +2 -2
- package/dist/chunks/{RolesPage-B75lCugt.js.map → RolesPage-CAcols3D.js.map} +1 -1
- package/dist/chunks/{RolesPage-C5gYJxAl.js → RolesPage-sJBWaNff.js} +2 -2
- package/dist/chunks/{RolesPage-C5gYJxAl.js.map → RolesPage-sJBWaNff.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-BqXHATb6.js → SlaConfigPage-BPGRloOS.js} +2 -2
- package/dist/chunks/{SlaConfigPage-BqXHATb6.js.map → SlaConfigPage-BPGRloOS.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-DZ4P1FFW.js → SlaConfigPage-D5TRn7Ir.js} +2 -2
- package/dist/chunks/{SlaConfigPage-DZ4P1FFW.js.map → SlaConfigPage-D5TRn7Ir.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-B4xy_pCQ.js → SupportPermissionsPage-Dc2bWTzG.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-B4xy_pCQ.js.map → SupportPermissionsPage-Dc2bWTzG.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-DW7KJjYK.js → SupportPermissionsPage-UXmYLrIq.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-DW7KJjYK.js.map → SupportPermissionsPage-UXmYLrIq.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-DZa0PQTE.js → TemplatesPage-dmPlqqiD.js} +2 -2
- package/dist/chunks/{TemplatesPage-DZa0PQTE.js.map → TemplatesPage-dmPlqqiD.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-m5-sLJ7F.js → TemplatesPage-nTY85sNA.js} +2 -2
- package/dist/chunks/{TemplatesPage-m5-sLJ7F.js.map → TemplatesPage-nTY85sNA.js.map} +1 -1
- package/dist/chunks/{TenantCard-BJQi7Oew.js → TenantCard-BUXfstRZ.js} +2 -2
- package/dist/chunks/{TenantCard-BJQi7Oew.js.map → TenantCard-BUXfstRZ.js.map} +1 -1
- package/dist/chunks/{TenantCard-CqfifMrM.js → TenantCard-BhT-31ls.js} +2 -2
- package/dist/chunks/{TenantCard-CqfifMrM.js.map → TenantCard-BhT-31ls.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-CdiYJvuH.js → TenantScopeSelector-3_mzBLNI.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-CdiYJvuH.js.map → TenantScopeSelector-3_mzBLNI.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Cl5DD318.js → TenantScopeSelector-B-SRDR2R.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Cl5DD318.js.map → TenantScopeSelector-B-SRDR2R.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-BOC9rHu3.js → TicketDetailPage-B4cR3rOC.js} +2 -2
- package/dist/chunks/{TicketDetailPage-BOC9rHu3.js.map → TicketDetailPage-B4cR3rOC.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-C1UuMxD8.js → TicketDetailPage-xN3wPnFL.js} +2 -2
- package/dist/chunks/{TicketDetailPage-C1UuMxD8.js.map → TicketDetailPage-xN3wPnFL.js.map} +1 -1
- package/dist/chunks/{TicketsPage-BCgHZA-m.js → TicketsPage-CkHgXSxU.js} +2 -2
- package/dist/chunks/{TicketsPage-BCgHZA-m.js.map → TicketsPage-CkHgXSxU.js.map} +1 -1
- package/dist/chunks/{TicketsPage-BjaN4Baq.js → TicketsPage-Dwi2xpMI.js} +2 -2
- package/dist/chunks/{TicketsPage-BjaN4Baq.js.map → TicketsPage-Dwi2xpMI.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-ChQL1mVY.js → UserCreateTicketPage-D2a3EOey.js} +3 -3
- package/dist/chunks/UserCreateTicketPage-D2a3EOey.js.map +1 -0
- package/dist/chunks/{UserCreateTicketPage-DkjsHeV7.js → UserCreateTicketPage-bcbSLglE.js} +48 -48
- package/dist/chunks/UserCreateTicketPage-bcbSLglE.js.map +1 -0
- package/dist/chunks/{UserDashboardPage-BMYrtF3o.js → UserDashboardPage-DwnDRNoW.js} +2 -2
- package/dist/chunks/{UserDashboardPage-BMYrtF3o.js.map → UserDashboardPage-DwnDRNoW.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-81-3GJAQ.js → UserDashboardPage-ZMsx8LWw.js} +2 -2
- package/dist/chunks/{UserDashboardPage-81-3GJAQ.js.map → UserDashboardPage-ZMsx8LWw.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-BMW8jAWG.js → UserDetailPage-BRFowOFL.js} +2 -2
- package/dist/chunks/{UserDetailPage-BMW8jAWG.js.map → UserDetailPage-BRFowOFL.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-D6oCH2eS.js → UserDetailPage-CZyV-zsg.js} +5 -5
- package/dist/chunks/{UserDetailPage-D6oCH2eS.js.map → UserDetailPage-CZyV-zsg.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-ZH2BDWBt.js → UserTicketDetailPage-BstGk_BP.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-ZH2BDWBt.js.map → UserTicketDetailPage-BstGk_BP.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-Z_myXXJ0.js → UserTicketDetailPage-DzB_pELt.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-Z_myXXJ0.js.map → UserTicketDetailPage-DzB_pELt.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-B8Ka6uRa.js → UsersGroupsPage-BygTv_kK.js} +3 -3
- package/dist/chunks/{UsersGroupsPage-B8Ka6uRa.js.map → UsersGroupsPage-BygTv_kK.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-xJmGib8b.js → UsersGroupsPage-DTmhzttW.js} +2 -2
- package/dist/chunks/{UsersGroupsPage-xJmGib8b.js.map → UsersGroupsPage-DTmhzttW.js.map} +1 -1
- package/dist/chunks/{UsersPage-CQ38akZ_.js → UsersPage-DcwLyMAX.js} +2 -2
- package/dist/chunks/{UsersPage-CQ38akZ_.js.map → UsersPage-DcwLyMAX.js.map} +1 -1
- package/dist/chunks/{UsersPage-Bd2-vl39.js → UsersPage-TIqSHgHj.js} +2 -2
- package/dist/chunks/{UsersPage-Bd2-vl39.js.map → UsersPage-TIqSHgHj.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-DguOx0q0.js → accessRequestsApi-3FjMFbpa.js} +2 -2
- package/dist/chunks/{accessRequestsApi-DguOx0q0.js.map → accessRequestsApi-3FjMFbpa.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-COtWo9kC.js → accessRequestsApi-B6dsJzvH.js} +2 -2
- package/dist/chunks/{accessRequestsApi-COtWo9kC.js.map → accessRequestsApi-B6dsJzvH.js.map} +1 -1
- package/dist/chunks/{aiApi-CITiWGYX.js → aiApi-9G4wG_mT.js} +2 -2
- package/dist/chunks/{aiApi-CITiWGYX.js.map → aiApi-9G4wG_mT.js.map} +1 -1
- package/dist/chunks/{aiApi-BmZsud6O.js → aiApi-DXOdsoxr.js} +2 -2
- package/dist/chunks/{aiApi-BmZsud6O.js.map → aiApi-DXOdsoxr.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-BYoEJzSN.js → applicationAnalyticsApi-D0DEp9Y-.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-BYoEJzSN.js.map → applicationAnalyticsApi-D0DEp9Y-.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-D62lc6z4.js → applicationAnalyticsApi-DhOd6idI.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-D62lc6z4.js.map → applicationAnalyticsApi-DhOd6idI.js.map} +1 -1
- package/dist/chunks/auth-Ca2Rn6on.js +2 -0
- package/dist/chunks/auth-Ca2Rn6on.js.map +1 -0
- package/dist/chunks/auth-ClNTDOqm.js +18 -0
- package/dist/chunks/auth-ClNTDOqm.js.map +1 -0
- package/dist/chunks/auth-DECnMZjF.js +18 -0
- package/dist/chunks/auth-DECnMZjF.js.map +1 -0
- package/dist/chunks/auth-DPvxdqy4.js +18 -0
- package/dist/chunks/auth-DPvxdqy4.js.map +1 -0
- package/dist/chunks/auth-HzvnTaOm.js +2 -0
- package/dist/chunks/auth-HzvnTaOm.js.map +1 -0
- package/dist/chunks/auth-M6aNTKCH.js +2 -0
- package/dist/chunks/auth-M6aNTKCH.js.map +1 -0
- package/dist/chunks/auth-UHnAu6_e.js +2 -0
- package/dist/chunks/auth-UHnAu6_e.js.map +1 -0
- package/dist/chunks/auth-YrujJY7m.js +18 -0
- package/dist/chunks/auth-YrujJY7m.js.map +1 -0
- package/dist/chunks/{groupsApi-3CR-_g5b.js → groupsApi-Db8G2lLs.js} +2 -2
- package/dist/chunks/{groupsApi-3CR-_g5b.js.map → groupsApi-Db8G2lLs.js.map} +1 -1
- package/dist/chunks/{groupsApi-BUyBgf_N.js → groupsApi-lbxNsHFv.js} +2 -2
- package/dist/chunks/{groupsApi-BUyBgf_N.js.map → groupsApi-lbxNsHFv.js.map} +1 -1
- package/dist/chunks/{index-IJR_91Yt.js → index-BI2dc1FS.js} +2 -2
- package/dist/chunks/{index-IJR_91Yt.js.map → index-BI2dc1FS.js.map} +1 -1
- package/dist/chunks/{index-DIQ6Jmmq.js → index-Bn8HzILk.js} +4 -4
- package/dist/chunks/{index-DIQ6Jmmq.js.map → index-Bn8HzILk.js.map} +1 -1
- package/dist/chunks/{index-DA5VyW0k.js → index-CN2WRyg1.js} +2249 -2264
- package/dist/chunks/index-CN2WRyg1.js.map +1 -0
- package/dist/chunks/{index-Br2wsGE8.js → index-CTGSmYvs.js} +2 -2
- package/dist/chunks/{index-Br2wsGE8.js.map → index-CTGSmYvs.js.map} +1 -1
- package/dist/chunks/index-CUICSveU.js +2 -0
- package/dist/chunks/index-CUICSveU.js.map +1 -0
- package/dist/chunks/{index-S-X8qFYW.js → index-CgtbaFf5.js} +2 -2
- package/dist/chunks/{index-S-X8qFYW.js.map → index-CgtbaFf5.js.map} +1 -1
- package/dist/chunks/{index-_g82N2nb.js → index-D0HS542b.js} +2 -2
- package/dist/chunks/{index-_g82N2nb.js.map → index-D0HS542b.js.map} +1 -1
- package/dist/chunks/{index-BIqcvvbh.js → index-DEtq-xUL.js} +9 -8
- package/dist/chunks/index-DEtq-xUL.js.map +1 -0
- package/dist/chunks/{index-BOKR3bw6.js → index-DF93KQFR.js} +2 -2
- package/dist/chunks/{index-BOKR3bw6.js.map → index-DF93KQFR.js.map} +1 -1
- package/dist/chunks/{index-CxgEV-rT.js → index-DLekpNSE.js} +2 -2
- package/dist/chunks/{index-CxgEV-rT.js.map → index-DLekpNSE.js.map} +1 -1
- package/dist/chunks/{index-DEOBhXS_.js → index-DUS-tunb.js} +2 -2
- package/dist/chunks/{index-DEOBhXS_.js.map → index-DUS-tunb.js.map} +1 -1
- package/dist/chunks/{index-BMsjMCv9.js → index-DjC1u2hI.js} +3 -3
- package/dist/chunks/{index-BMsjMCv9.js.map → index-DjC1u2hI.js.map} +1 -1
- package/dist/chunks/{index-BxHVPJ-j.js → index-DqbVFB1H.js} +2 -2
- package/dist/chunks/{index-BxHVPJ-j.js.map → index-DqbVFB1H.js.map} +1 -1
- package/dist/chunks/{index-Djy4eIbB.js → index-DwqLhQ8S.js} +2 -2
- package/dist/chunks/{index-Djy4eIbB.js.map → index-DwqLhQ8S.js.map} +1 -1
- package/dist/chunks/{index-C1w97Ejz.js → index-HsAOBno4.js} +2 -2
- package/dist/chunks/{index-C1w97Ejz.js.map → index-HsAOBno4.js.map} +1 -1
- package/dist/chunks/{index-Czk12A3G.js → index-TiWOcC0g.js} +2 -2
- package/dist/chunks/{index-Czk12A3G.js.map → index-TiWOcC0g.js.map} +1 -1
- package/dist/chunks/{index-vXiLh35n.js → index-cAikSVW0.js} +13 -13
- package/dist/chunks/index-cAikSVW0.js.map +1 -0
- package/dist/chunks/{index-CNxx56kE.js → index-xhRXN1Jq.js} +2 -2
- package/dist/chunks/{index-CNxx56kE.js.map → index-xhRXN1Jq.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-COKA97Ug.js → tenantIconMap-CHeS7oLt.js} +2 -2
- package/dist/chunks/{tenantIconMap-COKA97Ug.js.map → tenantIconMap-CHeS7oLt.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-BuSQUUyZ.js → tenantIconMap-__FKj6CN.js} +2 -2
- package/dist/chunks/{tenantIconMap-BuSQUUyZ.js.map → tenantIconMap-__FKj6CN.js.map} +1 -1
- package/dist/chunks/{ticketingApi-DbREwHez.js → ticketingApi-Cj239hYB.js} +2 -2
- package/dist/chunks/{ticketingApi-DbREwHez.js.map → ticketingApi-Cj239hYB.js.map} +1 -1
- package/dist/chunks/{ticketingApi-C6EbupqP.js → ticketingApi-DF4RwD_6.js} +2 -2
- package/dist/chunks/{ticketingApi-C6EbupqP.js.map → ticketingApi-DF4RwD_6.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-vucIb3_w.js → useAccessRequests-CFam8zFR.js} +3 -3
- package/dist/chunks/{useAccessRequests-vucIb3_w.js.map → useAccessRequests-CFam8zFR.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-C0dY6y-4.js → useAccessRequests-CViOUwyF.js} +2 -2
- package/dist/chunks/{useAccessRequests-C0dY6y-4.js.map → useAccessRequests-CViOUwyF.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-BBcw1Rk9.js → useUserAccessRequests-B-Cs6NX1.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-BBcw1Rk9.js.map → useUserAccessRequests-B-Cs6NX1.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-Cj0nkesW.js → useUserAccessRequests-CslSQeBJ.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-Cj0nkesW.js.map → useUserAccessRequests-CslSQeBJ.js.map} +1 -1
- package/dist/contexts/AuthContext.d.ts.map +1 -1
- package/dist/pages/LoginPage.d.ts.map +1 -1
- package/dist/pages/platform/administration/tenants/TenantDetailPage.d.ts.map +1 -1
- package/dist/pages/platform/support/UserCreateTicketPage.d.ts.map +1 -1
- package/dist/services/api/apiClient.d.ts.map +1 -1
- package/dist/services/support/ticketDraftService.d.ts.map +1 -1
- package/dist/smartstack.cjs +1 -1
- package/dist/smartstack.js +6 -6
- package/dist/utils/permissions.generated.d.ts +288 -0
- package/dist/utils/permissions.generated.d.ts.map +1 -0
- package/dist/utils/uuid.d.ts +6 -0
- package/dist/utils/uuid.d.ts.map +1 -0
- package/package.json +1 -1
- package/dist/chunks/UserCreateTicketPage-ChQL1mVY.js.map +0 -1
- package/dist/chunks/UserCreateTicketPage-DkjsHeV7.js.map +0 -1
- package/dist/chunks/auth-B-hELPDB.js +0 -2
- package/dist/chunks/auth-B-hELPDB.js.map +0 -1
- package/dist/chunks/auth-BYaMuq7D.js +0 -16
- package/dist/chunks/auth-BYaMuq7D.js.map +0 -1
- package/dist/chunks/auth-C5zpZ9k7.js +0 -2
- package/dist/chunks/auth-C5zpZ9k7.js.map +0 -1
- package/dist/chunks/auth-CDpRMVv1.js +0 -16
- package/dist/chunks/auth-CDpRMVv1.js.map +0 -1
- package/dist/chunks/auth-CyPkCta2.js +0 -2
- package/dist/chunks/auth-CyPkCta2.js.map +0 -1
- package/dist/chunks/auth-DL47kvnl.js +0 -2
- package/dist/chunks/auth-DL47kvnl.js.map +0 -1
- package/dist/chunks/auth-Diiv90i1.js +0 -16
- package/dist/chunks/auth-Diiv90i1.js.map +0 -1
- package/dist/chunks/auth-rog9MvUr.js +0 -16
- package/dist/chunks/auth-rog9MvUr.js.map +0 -1
- package/dist/chunks/index-BIqcvvbh.js.map +0 -1
- package/dist/chunks/index-DA5VyW0k.js.map +0 -1
- package/dist/chunks/index-Dht6EQW1.js +0 -2
- package/dist/chunks/index-Dht6EQW1.js.map +0 -1
- package/dist/chunks/index-vXiLh35n.js.map +0 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsxs as a, jsx as t, Fragment as _e } from "react/jsx-runtime";
|
|
2
|
-
import { useRef as q, useState as
|
|
2
|
+
import { useRef as q, useState as c, useEffect as G, useCallback as l } from "react";
|
|
3
3
|
import { useNavigate as Qe, useSearchParams as Ze } from "react-router-dom";
|
|
4
4
|
import { useTranslation as Je } from "react-i18next";
|
|
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
|
|
6
|
-
import { W as ft, a as gt, a0 as P, a2 as De, a1 as re,
|
|
7
|
-
import { S as
|
|
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 it, HelpCircle as ct, 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, a3 as vt, l as bt, i as se, a4 as ne } from "./index-CN2WRyg1.js";
|
|
7
|
+
import { S as xt } from "./ScreenshotAnnotator-DEuQRcin.js";
|
|
8
8
|
const ae = [
|
|
9
9
|
{
|
|
10
10
|
value: "Bug",
|
|
@@ -36,7 +36,7 @@ const ae = [
|
|
|
36
36
|
labelKey: "tickets.types.support",
|
|
37
37
|
description: "Need help with something",
|
|
38
38
|
descriptionKey: "tickets.types.supportDescription",
|
|
39
|
-
icon:
|
|
39
|
+
icon: it
|
|
40
40
|
},
|
|
41
41
|
{
|
|
42
42
|
value: "Question",
|
|
@@ -44,21 +44,21 @@ const ae = [
|
|
|
44
44
|
labelKey: "tickets.types.question",
|
|
45
45
|
description: "Have a question about the platform",
|
|
46
46
|
descriptionKey: "tickets.types.questionDescription",
|
|
47
|
-
icon:
|
|
47
|
+
icon: ct
|
|
48
48
|
}
|
|
49
|
-
],
|
|
49
|
+
], yt = [
|
|
50
50
|
{ value: "Low", label: "Low", labelKey: "tickets.priority.low", description: "Can wait, not urgent", descriptionKey: "tickets.priority.lowDescription" },
|
|
51
51
|
{ value: "Medium", label: "Medium", labelKey: "tickets.priority.medium", description: "Normal priority", descriptionKey: "tickets.priority.mediumDescription" },
|
|
52
52
|
{ value: "High", label: "High", labelKey: "tickets.priority.high", description: "Important, needs attention soon", descriptionKey: "tickets.priority.highDescription" },
|
|
53
53
|
{ value: "Critical", label: "Critical", labelKey: "tickets.priority.critical", description: "Urgent, blocking work", descriptionKey: "tickets.priority.criticalDescription" }
|
|
54
|
-
], Se = 10 * 1024 * 1024, Te = 5,
|
|
55
|
-
function
|
|
54
|
+
], Se = 10 * 1024 * 1024, Te = 5, Nt = [".pdf", ".doc", ".docx", ".xls", ".xlsx", ".txt", ".csv", ".zip", ".rar", ".7z", ".png", ".jpg", ".jpeg", ".gif", ".webp", ".bmp"];
|
|
55
|
+
function kt(n) {
|
|
56
56
|
return n < 1024 ? `${n} B` : n < 1024 * 1024 ? `${(n / 1024).toFixed(1)} KB` : `${(n / (1024 * 1024)).toFixed(1)} MB`;
|
|
57
57
|
}
|
|
58
|
-
function
|
|
58
|
+
function wt(n) {
|
|
59
59
|
return n.includes("pdf") ? pt : n.startsWith("image/") ? Ce : ht;
|
|
60
60
|
}
|
|
61
|
-
function
|
|
61
|
+
function Dt(n, u) {
|
|
62
62
|
if (!n) return { draft: null, selectedTenant: null };
|
|
63
63
|
const r = P.getDraft(n);
|
|
64
64
|
if (!r) return { draft: null, selectedTenant: null };
|
|
@@ -69,12 +69,12 @@ function wt(n, u) {
|
|
|
69
69
|
}
|
|
70
70
|
return { draft: r, selectedTenant: x };
|
|
71
71
|
}
|
|
72
|
-
function
|
|
72
|
+
function St(n) {
|
|
73
73
|
if (!n?.screenshot) return { screenshot: null, autoSelectType: null };
|
|
74
74
|
let u = null;
|
|
75
75
|
return n.recentErrors.length > 0 && (u = "Bug"), { screenshot: n.screenshot, autoSelectType: u };
|
|
76
76
|
}
|
|
77
|
-
async function
|
|
77
|
+
async function Tt(n, u, r) {
|
|
78
78
|
try {
|
|
79
79
|
const h = await (await fetch(u)).blob(), f = new File([h], "screenshot.png", { type: "image/png" });
|
|
80
80
|
if (r) {
|
|
@@ -89,7 +89,7 @@ async function St(n, u, r) {
|
|
|
89
89
|
} catch {
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
|
-
async function
|
|
92
|
+
async function Ct(n, u, r) {
|
|
93
93
|
for (const x of u)
|
|
94
94
|
try {
|
|
95
95
|
if (r) {
|
|
@@ -104,12 +104,12 @@ async function Tt(n, u, r) {
|
|
|
104
104
|
} catch {
|
|
105
105
|
}
|
|
106
106
|
}
|
|
107
|
-
function
|
|
108
|
-
const n = Qe(), [u] = Ze(), { t: r } = Je(["support", "common"]), { isGlpi: x, glpiBaseUrl: h } = ft(), { currentTenant: f, userTenants: w, isGlobalView: M } = gt(), R = q(null), F = q(null), [y,
|
|
107
|
+
function Lt() {
|
|
108
|
+
const n = Qe(), [u] = Ze(), { t: r } = Je(["support", "common"]), { isGlpi: x, glpiBaseUrl: h } = ft(), { currentTenant: f, userTenants: w, isGlobalView: M } = gt(), R = q(null), F = q(null), [y, ie] = c(null), [Ie, B] = c(!1), T = f ?? y;
|
|
109
109
|
G(() => {
|
|
110
110
|
!f && M && w.length > 0 && B(!0);
|
|
111
111
|
}, [f, M, w.length]);
|
|
112
|
-
const O = u.get("draft"), [D, K] =
|
|
112
|
+
const O = u.get("draft"), [D, K] = c(1), [m, U] = c(null), [b, X] = c(""), [N, V] = c(""), [C, _] = c("Medium"), [ce, oe] = c(!1), [le, g] = c(null), [v, Ae] = c(null), [Q, Pe] = c(!0), [de, z] = c(null), [S, L] = c(null), [me, Z] = c(!1), [I, ue] = c([]), [pe, J] = c(!1), [o, Re] = c(O), [Fe, he] = c(!1), [Be, fe] = c(!1), p = q(null), ge = q(!1), E = q(!1), $ = l(() => {
|
|
113
113
|
if (!o) return !1;
|
|
114
114
|
const e = P.updateDraft(o, {
|
|
115
115
|
type: m,
|
|
@@ -153,13 +153,13 @@ function Kt() {
|
|
|
153
153
|
o && P.deleteDraft(o), p.current && (clearTimeout(p.current), p.current = null), n(-1);
|
|
154
154
|
}, [o, n]);
|
|
155
155
|
G(() => {
|
|
156
|
-
const { draft: e, selectedTenant: s } =
|
|
157
|
-
if (e && (e.type && (U(e.type), K(2)), e.title && X(e.title), e.description && V(e.description), e.priority && _(e.priority), e.screenshot && (z(e.screenshot), L(e.screenshot)), s &&
|
|
156
|
+
const { draft: e, selectedTenant: s } = Dt(O, w);
|
|
157
|
+
if (e && (e.type && (U(e.type), K(2)), e.title && X(e.title), e.description && V(e.description), e.priority && _(e.priority), e.screenshot && (z(e.screenshot), L(e.screenshot)), s && ie(s)), !e) {
|
|
158
158
|
const A = ["Bug", "FeatureRequest", "Suggestion", "ApplicationRequest", "Support", "Question"], ee = u.get("type"), be = u.get("subject"), xe = u.get("body");
|
|
159
159
|
ee && A.includes(ee) && (U(ee), K(2)), be && X(decodeURIComponent(be)), xe && V(decodeURIComponent(xe));
|
|
160
160
|
}
|
|
161
|
-
const d = De.loadContext(), { screenshot:
|
|
162
|
-
|
|
161
|
+
const d = De.loadContext(), { screenshot: i, autoSelectType: j } = St(d);
|
|
162
|
+
i && !S && (z(i), L(i), j && !m && (U(j), _("High"))), De.clearContext();
|
|
163
163
|
const k = re.captureBrowserInfo();
|
|
164
164
|
Ae(k), setTimeout(() => {
|
|
165
165
|
ge.current = !0;
|
|
@@ -176,8 +176,8 @@ function Kt() {
|
|
|
176
176
|
}
|
|
177
177
|
const s = new FileReader();
|
|
178
178
|
s.onload = (d) => {
|
|
179
|
-
const
|
|
180
|
-
z(
|
|
179
|
+
const i = d.target?.result;
|
|
180
|
+
z(i), L(i), g(null);
|
|
181
181
|
}, s.onerror = () => {
|
|
182
182
|
g(r("tickets.create.imageReadError", "Failed to read image file"));
|
|
183
183
|
}, s.readAsDataURL(e);
|
|
@@ -203,29 +203,29 @@ function Kt() {
|
|
|
203
203
|
if (e.type.startsWith("image/"))
|
|
204
204
|
return !0;
|
|
205
205
|
const s = "." + e.name.split(".").pop()?.toLowerCase();
|
|
206
|
-
return
|
|
206
|
+
return Nt.includes(s);
|
|
207
207
|
}, []), W = l((e) => {
|
|
208
208
|
const s = [];
|
|
209
209
|
for (let d = 0; d < e.length; d++) {
|
|
210
|
-
const
|
|
210
|
+
const i = e[d];
|
|
211
211
|
if (I.length + s.length >= Te) {
|
|
212
212
|
g(r("tickets.create.maxAttachments", `Maximum ${Te} attachments allowed`));
|
|
213
213
|
break;
|
|
214
214
|
}
|
|
215
|
-
if (
|
|
216
|
-
g(r("tickets.create.fileTooLarge", `File "${
|
|
215
|
+
if (i.size > Se) {
|
|
216
|
+
g(r("tickets.create.fileTooLarge", `File "${i.name}" is too large (max 10MB)`));
|
|
217
217
|
continue;
|
|
218
218
|
}
|
|
219
|
-
if (!ve(
|
|
220
|
-
g(r("tickets.create.invalidFileType", `File type not allowed: ${
|
|
219
|
+
if (!ve(i)) {
|
|
220
|
+
g(r("tickets.create.invalidFileType", `File type not allowed: ${i.name}`));
|
|
221
221
|
continue;
|
|
222
222
|
}
|
|
223
|
-
I.some((k) => k.name ===
|
|
224
|
-
id:
|
|
225
|
-
file:
|
|
226
|
-
name:
|
|
227
|
-
size:
|
|
228
|
-
type:
|
|
223
|
+
I.some((k) => k.name === i.name && k.size === i.size) || s.push({
|
|
224
|
+
id: vt(),
|
|
225
|
+
file: i,
|
|
226
|
+
name: i.name,
|
|
227
|
+
size: i.size,
|
|
228
|
+
type: i.type
|
|
229
229
|
});
|
|
230
230
|
}
|
|
231
231
|
s.length > 0 && (ue((d) => [...d, ...s]), g(null));
|
|
@@ -256,7 +256,7 @@ function Kt() {
|
|
|
256
256
|
---
|
|
257
257
|
**System Information:**
|
|
258
258
|
` + re.formatForDescription(v));
|
|
259
|
-
const s = v || re.captureBrowserInfo(), d =
|
|
259
|
+
const s = v || re.captureBrowserInfo(), d = bt.getRecentErrors().slice(0, 5), i = {
|
|
260
260
|
sourceUrl: window.location.href,
|
|
261
261
|
browser: {
|
|
262
262
|
name: s.browser,
|
|
@@ -282,15 +282,15 @@ function Kt() {
|
|
|
282
282
|
description: e,
|
|
283
283
|
type: m,
|
|
284
284
|
priority: C,
|
|
285
|
-
clientContext:
|
|
285
|
+
clientContext: i
|
|
286
286
|
}, { headers: j }) : await ne.create({
|
|
287
287
|
title: b.trim(),
|
|
288
288
|
description: e,
|
|
289
289
|
type: m,
|
|
290
290
|
priority: C,
|
|
291
|
-
clientContext:
|
|
291
|
+
clientContext: i
|
|
292
292
|
});
|
|
293
|
-
S && await
|
|
293
|
+
S && await Tt(k.id, S, y), await Ct(k.id, I, y), o && P.deleteDraft(o), p.current && (clearTimeout(p.current), p.current = null), E.current = !1, n(`/support/my-tickets/${k.id}?tab=submitted`);
|
|
294
294
|
} catch (e) {
|
|
295
295
|
const s = e && typeof e == "object" && "message" in e ? e.message : null;
|
|
296
296
|
g(s || r("tickets.create.submitError", "Failed to create ticket. Please try again."));
|
|
@@ -372,7 +372,7 @@ function Kt() {
|
|
|
372
372
|
] }),
|
|
373
373
|
/* @__PURE__ */ a("div", { children: [
|
|
374
374
|
/* @__PURE__ */ t("label", { className: "block text-sm font-medium mb-2", children: r("tickets.create.priority", "Priority") }),
|
|
375
|
-
/* @__PURE__ */ t("div", { className: "grid grid-cols-2 md:grid-cols-4 gap-2", children:
|
|
375
|
+
/* @__PURE__ */ t("div", { className: "grid grid-cols-2 md:grid-cols-4 gap-2", children: yt.map((e) => /* @__PURE__ */ a(
|
|
376
376
|
"button",
|
|
377
377
|
{
|
|
378
378
|
type: "button",
|
|
@@ -411,7 +411,7 @@ function Kt() {
|
|
|
411
411
|
)
|
|
412
412
|
] }),
|
|
413
413
|
/* @__PURE__ */ t(
|
|
414
|
-
|
|
414
|
+
xt,
|
|
415
415
|
{
|
|
416
416
|
screenshot: de,
|
|
417
417
|
onAnnotatedScreenshot: Me
|
|
@@ -490,7 +490,7 @@ function Kt() {
|
|
|
490
490
|
}
|
|
491
491
|
),
|
|
492
492
|
I.length > 0 && /* @__PURE__ */ t("div", { className: "mt-3 space-y-2", children: I.map((e) => {
|
|
493
|
-
const s =
|
|
493
|
+
const s = wt(e.type);
|
|
494
494
|
return /* @__PURE__ */ a(
|
|
495
495
|
"div",
|
|
496
496
|
{
|
|
@@ -501,7 +501,7 @@ function Kt() {
|
|
|
501
501
|
/* @__PURE__ */ t("span", { className: "text-sm truncate", children: e.name }),
|
|
502
502
|
/* @__PURE__ */ a("span", { className: "text-xs text-[var(--text-muted)] flex-shrink-0", children: [
|
|
503
503
|
"(",
|
|
504
|
-
|
|
504
|
+
kt(e.size),
|
|
505
505
|
")"
|
|
506
506
|
] })
|
|
507
507
|
] }),
|
|
@@ -596,10 +596,10 @@ function Kt() {
|
|
|
596
596
|
"button",
|
|
597
597
|
{
|
|
598
598
|
onClick: Oe,
|
|
599
|
-
disabled: !b.trim() || !N.trim() ||
|
|
599
|
+
disabled: !b.trim() || !N.trim() || ce,
|
|
600
600
|
className: "btn btn-primary",
|
|
601
601
|
children: [
|
|
602
|
-
|
|
602
|
+
ce ? /* @__PURE__ */ t(mt, { className: "w-4 h-4 animate-spin mr-2" }) : /* @__PURE__ */ t(ut, { className: "w-4 h-4 mr-2" }),
|
|
603
603
|
r("tickets.create.submit", "Submit Ticket")
|
|
604
604
|
]
|
|
605
605
|
}
|
|
@@ -705,7 +705,7 @@ function Kt() {
|
|
|
705
705
|
"button",
|
|
706
706
|
{
|
|
707
707
|
onClick: () => {
|
|
708
|
-
|
|
708
|
+
ie(e), B(!1);
|
|
709
709
|
const s = o || Y();
|
|
710
710
|
s && P.updateDraft(s, {
|
|
711
711
|
tenantId: e.id,
|
|
@@ -739,6 +739,6 @@ function Kt() {
|
|
|
739
739
|
] });
|
|
740
740
|
}
|
|
741
741
|
export {
|
|
742
|
-
|
|
742
|
+
Lt as UserCreateTicketPage
|
|
743
743
|
};
|
|
744
|
-
//# sourceMappingURL=UserCreateTicketPage-
|
|
744
|
+
//# sourceMappingURL=UserCreateTicketPage-bcbSLglE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserCreateTicketPage-bcbSLglE.js","sources":["../../src/pages/platform/support/UserCreateTicketPage.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate, useSearchParams } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n ArrowLeft, Headset, Bug, Lightbulb, AppWindow, HelpCircle, MessageSquare,\r\n Loader2, AlertTriangle, Send, Monitor, Upload, X, Image as ImageIcon,\r\n FileText, File as FileIcon, Paperclip, Info, ExternalLink, Building2, Check, Trash2\r\n} from 'lucide-react';\r\nimport { myTicketsApi, type TicketType, type TicketPriority, type ClientContextDto, type MyTicketDetailDto } from '@/services/api/ticketApi';\r\nimport { api } from '@/services/api/apiClient';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport type { UserTenantDto } from '@/services/api/adminApi';\r\nimport { browserInfoService, type BrowserInfo } from '@/services/support/browserInfoService';\r\nimport { useTicketingProvider } from '@/hooks/useTicketingProvider';\r\nimport { generateUUID } from '@/utils/uuid';\r\nimport { logService } from '@/services/logging/logService';\r\nimport { ScreenshotAnnotator } from '@/components/platform/support/ScreenshotAnnotator';\r\nimport { errorContextService } from '@/services/support/errorContextService';\r\nimport { ticketDraftService } from '@/services/support/ticketDraftService';\r\n\r\nconst ticketTypes: { value: TicketType; label: string; labelKey: string; description: string; descriptionKey: string; icon: React.ElementType }[] = [\r\n {\r\n value: 'Bug',\r\n label: 'Report a Bug',\r\n labelKey: 'tickets.types.bug',\r\n description: 'Something is not working correctly',\r\n descriptionKey: 'tickets.types.bugDescription',\r\n icon: Bug,\r\n },\r\n {\r\n value: 'FeatureRequest',\r\n label: 'Request a Feature',\r\n labelKey: 'tickets.types.featureRequest',\r\n description: 'Suggest an improvement or new feature',\r\n descriptionKey: 'tickets.types.featureRequestDescription',\r\n icon: Lightbulb,\r\n },\r\n {\r\n value: 'ApplicationRequest',\r\n label: 'Request an Application',\r\n labelKey: 'tickets.types.applicationRequest',\r\n description: 'Request access to a new application',\r\n descriptionKey: 'tickets.types.applicationRequestDescription',\r\n icon: AppWindow,\r\n },\r\n {\r\n value: 'Support',\r\n label: 'General Support',\r\n labelKey: 'tickets.types.support',\r\n description: 'Need help with something',\r\n descriptionKey: 'tickets.types.supportDescription',\r\n icon: MessageSquare,\r\n },\r\n {\r\n value: 'Question',\r\n label: 'Ask a Question',\r\n labelKey: 'tickets.types.question',\r\n description: 'Have a question about the platform',\r\n descriptionKey: 'tickets.types.questionDescription',\r\n icon: HelpCircle,\r\n },\r\n];\r\n\r\nconst priorityOptions: { value: TicketPriority; label: string; labelKey: string; description: string; descriptionKey: string }[] = [\r\n { value: 'Low', label: 'Low', labelKey: 'tickets.priority.low', description: 'Can wait, not urgent', descriptionKey: 'tickets.priority.lowDescription' },\r\n { value: 'Medium', label: 'Medium', labelKey: 'tickets.priority.medium', description: 'Normal priority', descriptionKey: 'tickets.priority.mediumDescription' },\r\n { value: 'High', label: 'High', labelKey: 'tickets.priority.high', description: 'Important, needs attention soon', descriptionKey: 'tickets.priority.highDescription' },\r\n { value: 'Critical', label: 'Critical', labelKey: 'tickets.priority.critical', description: 'Urgent, blocking work', descriptionKey: 'tickets.priority.criticalDescription' },\r\n];\r\n\r\ninterface AttachmentFile {\r\n id: string;\r\n file: File;\r\n name: string;\r\n size: number;\r\n type: string;\r\n}\r\n\r\nconst MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB\r\nconst MAX_ATTACHMENTS = 5;\r\nconst ALLOWED_EXTENSIONS = ['.pdf', '.doc', '.docx', '.xls', '.xlsx', '.txt', '.csv', '.zip', '.rar', '.7z', '.png', '.jpg', '.jpeg', '.gif', '.webp', '.bmp'];\r\n\r\nfunction formatFileSize(bytes: number): string {\r\n if (bytes < 1024) return `${bytes} B`;\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\r\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\r\n}\r\n\r\nfunction getFileIcon(type: string) {\r\n if (type.includes('pdf')) return FileText;\r\n if (type.startsWith('image/')) return ImageIcon;\r\n return FileIcon;\r\n}\r\n\r\nfunction restoreDraft(draftId: string | null, userTenants: UserTenantDto[]) {\r\n if (!draftId) return { draft: null, selectedTenant: null };\r\n\r\n const draft = ticketDraftService.getDraft(draftId);\r\n if (!draft) return { draft: null, selectedTenant: null };\r\n\r\n let selectedTenant: UserTenantDto | null = null;\r\n if (draft.tenantId && draft.tenantSlug) {\r\n const matchingTenant = userTenants.find(t => t.id === draft.tenantId);\r\n if (matchingTenant) {\r\n selectedTenant = matchingTenant;\r\n }\r\n }\r\n\r\n return { draft, selectedTenant };\r\n}\r\n\r\nfunction restoreSessionContext(sessionContext: ReturnType<typeof errorContextService.loadContext>) {\r\n if (!sessionContext?.screenshot) return { screenshot: null, autoSelectType: null };\r\n\r\n let autoSelectType: TicketType | null = null;\r\n if (sessionContext.recentErrors.length > 0) {\r\n autoSelectType = 'Bug';\r\n }\r\n\r\n return { screenshot: sessionContext.screenshot, autoSelectType };\r\n}\r\n\r\nasync function uploadScreenshot(ticketId: string, screenshot: string, selectedTenantForTicket: UserTenantDto | null) {\r\n try {\r\n const response = await fetch(screenshot);\r\n const blob = await response.blob();\r\n const file = new File([blob], 'screenshot.png', { type: 'image/png' });\r\n\r\n if (selectedTenantForTicket) {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n const tenantHeaders = { 'X-Tenant-Slug': selectedTenantForTicket.slug };\r\n await api.post(`/api/support/my-tickets/${ticketId}/attachments`, formData, {\r\n headers: { 'Content-Type': 'multipart/form-data', ...tenantHeaders },\r\n });\r\n } else {\r\n await myTicketsApi.uploadAttachment(ticketId, file);\r\n }\r\n } catch (attachmentError) {\r\n // Silent fail for attachment upload\r\n }\r\n}\r\n\r\nasync function uploadAttachments(ticketId: string, attachments: AttachmentFile[], selectedTenantForTicket: UserTenantDto | null) {\r\n for (const attachment of attachments) {\r\n try {\r\n if (selectedTenantForTicket) {\r\n const formData = new FormData();\r\n formData.append('file', attachment.file);\r\n const tenantHeaders = { 'X-Tenant-Slug': selectedTenantForTicket.slug };\r\n await api.post(`/api/support/my-tickets/${ticketId}/attachments`, formData, {\r\n headers: { 'Content-Type': 'multipart/form-data', ...tenantHeaders },\r\n });\r\n } else {\r\n await myTicketsApi.uploadAttachment(ticketId, attachment.file);\r\n }\r\n } catch (attachmentError) {\r\n // Silent fail for attachment upload\r\n }\r\n }\r\n}\r\n\r\nexport function UserCreateTicketPage(): ReactElement {\r\n const navigate = useNavigate();\r\n const [searchParams] = useSearchParams();\r\n const { t } = useTranslation(['support', 'common']);\r\n const { isGlpi, glpiBaseUrl } = useTicketingProvider();\r\n const { currentTenant, userTenants, isGlobalView } = useTenant();\r\n const screenshotInputRef = useRef<HTMLInputElement>(null);\r\n const attachmentInputRef = useRef<HTMLInputElement>(null);\r\n\r\n // When in global view (no tenant selected), allow user to pick a tenant for the ticket\r\n const [selectedTenantForTicket, setSelectedTenantForTicket] = useState<UserTenantDto | null>(null);\r\n const [showTenantPicker, setShowTenantPicker] = useState(false);\r\n\r\n // The effective tenant: either the global current tenant or the locally selected one\r\n const effectiveTenant = currentTenant ?? selectedTenantForTicket;\r\n\r\n // Show tenant picker on mount when no tenant is selected\r\n useEffect(() => {\r\n if (!currentTenant && isGlobalView && userTenants.length > 0) {\r\n setShowTenantPicker(true);\r\n }\r\n }, [currentTenant, isGlobalView, userTenants.length]);\r\n\r\n const draftId = searchParams.get('draft');\r\n\r\n const [step, setStep] = useState(1);\r\n const [selectedType, setSelectedType] = useState<TicketType | null>(null);\r\n const [title, setTitle] = useState('');\r\n const [description, setDescription] = useState('');\r\n const [priority, setPriority] = useState<TicketPriority>('Medium');\r\n const [submitting, setSubmitting] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n // Browser info state\r\n const [browserInfo, setBrowserInfo] = useState<BrowserInfo | null>(null);\r\n const [includeBrowserInfo, setIncludeBrowserInfo] = useState(true);\r\n\r\n // Screenshot state\r\n const [screenshot, setScreenshot] = useState<string | null>(null);\r\n const [annotatedScreenshot, setAnnotatedScreenshot] = useState<string | null>(null);\r\n const [isDraggingScreenshot, setIsDraggingScreenshot] = useState(false);\r\n\r\n // Attachments state\r\n const [attachments, setAttachments] = useState<AttachmentFile[]>([]);\r\n const [isDraggingAttachment, setIsDraggingAttachment] = useState(false);\r\n\r\n // Draft auto-save state\r\n const [currentDraftId, setCurrentDraftId] = useState<string | null>(draftId);\r\n const [showDraftSaved, setShowDraftSaved] = useState(false);\r\n const [showDiscardConfirm, setShowDiscardConfirm] = useState(false);\r\n const autoSaveTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const isInitialLoadCompleteRef = useRef(false);\r\n const hasUnsavedChangesRef = useRef(false);\r\n\r\n // Save draft function\r\n const saveDraftNow = useCallback(() => {\r\n if (!currentDraftId) return false;\r\n\r\n const result = ticketDraftService.updateDraft(currentDraftId, {\r\n type: selectedType,\r\n title,\r\n description,\r\n priority,\r\n includeScreenshot: !!annotatedScreenshot,\r\n includeErrorLogs: false,\r\n screenshot: annotatedScreenshot ?? undefined,\r\n tenantId: effectiveTenant?.id,\r\n tenantSlug: effectiveTenant?.slug,\r\n tenantName: effectiveTenant?.name,\r\n });\r\n\r\n if (result.success) {\r\n hasUnsavedChangesRef.current = false;\r\n setShowDraftSaved(true);\r\n setTimeout(() => setShowDraftSaved(false), 2000);\r\n }\r\n return result.success;\r\n }, [currentDraftId, selectedType, title, description, priority, annotatedScreenshot, effectiveTenant]);\r\n\r\n // Auto-create draft when user starts filling the form (no existing draft)\r\n const ensureDraft = useCallback(() => {\r\n if (currentDraftId) return currentDraftId;\r\n const newDraft = ticketDraftService.createDraft();\r\n setCurrentDraftId(newDraft.id);\r\n return newDraft.id;\r\n }, [currentDraftId]);\r\n\r\n // Debounced auto-save when form data changes\r\n useEffect(() => {\r\n if (!isInitialLoadCompleteRef.current) return;\r\n // Only auto-save if there's meaningful data\r\n if (!selectedType && !title && !description) return;\r\n\r\n hasUnsavedChangesRef.current = true;\r\n\r\n // Ensure a draft exists before saving\r\n if (!currentDraftId) {\r\n ensureDraft();\r\n return; // Will re-trigger on next render with currentDraftId set\r\n }\r\n\r\n if (autoSaveTimerRef.current) {\r\n clearTimeout(autoSaveTimerRef.current);\r\n }\r\n\r\n autoSaveTimerRef.current = setTimeout(() => {\r\n saveDraftNow();\r\n }, 1000);\r\n\r\n return () => {\r\n if (autoSaveTimerRef.current) {\r\n clearTimeout(autoSaveTimerRef.current);\r\n }\r\n };\r\n }, [selectedType, title, description, priority, annotatedScreenshot, currentDraftId, saveDraftNow, ensureDraft]);\r\n\r\n // Save on unmount + beforeunload\r\n useEffect(() => {\r\n const handleBeforeUnload = () => {\r\n if (hasUnsavedChangesRef.current && currentDraftId) {\r\n saveDraftNow();\r\n }\r\n };\r\n\r\n window.addEventListener('beforeunload', handleBeforeUnload);\r\n return () => {\r\n window.removeEventListener('beforeunload', handleBeforeUnload);\r\n if (hasUnsavedChangesRef.current && currentDraftId) {\r\n saveDraftNow();\r\n }\r\n if (autoSaveTimerRef.current) {\r\n clearTimeout(autoSaveTimerRef.current);\r\n }\r\n };\r\n }, [currentDraftId, saveDraftNow]);\r\n\r\n // Discard draft handler\r\n const handleDiscardDraft = useCallback(() => {\r\n if (currentDraftId) {\r\n ticketDraftService.deleteDraft(currentDraftId);\r\n }\r\n if (autoSaveTimerRef.current) {\r\n clearTimeout(autoSaveTimerRef.current);\r\n autoSaveTimerRef.current = null;\r\n }\r\n navigate(-1);\r\n }, [currentDraftId, navigate]);\r\n\r\n // Load draft, session context, URL pre-fill params, and browser info on mount\r\n useEffect(() => {\r\n // Load draft if resuming\r\n const { draft, selectedTenant } = restoreDraft(draftId, userTenants);\r\n if (draft) {\r\n if (draft.type) {\r\n setSelectedType(draft.type);\r\n setStep(2);\r\n }\r\n if (draft.title) setTitle(draft.title);\r\n if (draft.description) setDescription(draft.description);\r\n if (draft.priority) setPriority(draft.priority);\r\n if (draft.screenshot) {\r\n setScreenshot(draft.screenshot);\r\n setAnnotatedScreenshot(draft.screenshot);\r\n }\r\n if (selectedTenant) {\r\n setSelectedTenantForTicket(selectedTenant);\r\n }\r\n }\r\n\r\n // Pre-fill from URL params (e.g. from AccessDenied page) — draft takes priority\r\n if (!draft) {\r\n const validTypes: TicketType[] = ['Bug', 'FeatureRequest', 'Suggestion', 'ApplicationRequest', 'Support', 'Question'];\r\n const prefillType = searchParams.get('type') as TicketType | null;\r\n const prefillSubject = searchParams.get('subject');\r\n const prefillBody = searchParams.get('body');\r\n\r\n if (prefillType && validTypes.includes(prefillType)) {\r\n setSelectedType(prefillType);\r\n setStep(2);\r\n }\r\n if (prefillSubject) setTitle(decodeURIComponent(prefillSubject));\r\n if (prefillBody) setDescription(decodeURIComponent(prefillBody));\r\n }\r\n\r\n // Load captured screenshot from session context (from CreateTicketButton)\r\n const sessionContext = errorContextService.loadContext();\r\n const { screenshot: sessionScreenshot, autoSelectType } = restoreSessionContext(sessionContext);\r\n if (sessionScreenshot && !annotatedScreenshot) {\r\n setScreenshot(sessionScreenshot);\r\n setAnnotatedScreenshot(sessionScreenshot);\r\n\r\n if (autoSelectType && !selectedType) {\r\n setSelectedType(autoSelectType);\r\n setPriority('High');\r\n }\r\n }\r\n errorContextService.clearContext();\r\n\r\n const info = browserInfoService.captureBrowserInfo();\r\n setBrowserInfo(info);\r\n\r\n // Mark initial load complete (prevents auto-save during hydration)\r\n setTimeout(() => { isInitialLoadCompleteRef.current = true; }, 100);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [draftId]);\r\n\r\n // Process image file for screenshot\r\n const processImageFile = useCallback((file: File) => {\r\n if (!file.type.startsWith('image/')) {\r\n setError(t('tickets.create.invalidImageType', 'Please select a valid image file'));\r\n return;\r\n }\r\n\r\n if (file.size > MAX_FILE_SIZE) {\r\n setError(t('tickets.create.imageTooLarge', 'Image must be less than 10MB'));\r\n return;\r\n }\r\n\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n const dataUrl = e.target?.result as string;\r\n setScreenshot(dataUrl);\r\n setAnnotatedScreenshot(dataUrl);\r\n setError(null);\r\n };\r\n reader.onerror = () => {\r\n setError(t('tickets.create.imageReadError', 'Failed to read image file'));\r\n };\r\n reader.readAsDataURL(file);\r\n }, [t]);\r\n\r\n const handleScreenshotUpload = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n const file = event.target.files?.[0];\r\n if (file) {\r\n processImageFile(file);\r\n }\r\n }, [processImageFile]);\r\n\r\n // Drag & Drop handlers for screenshot\r\n const handleScreenshotDragOver = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDraggingScreenshot(true);\r\n }, []);\r\n\r\n const handleScreenshotDragLeave = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDraggingScreenshot(false);\r\n }, []);\r\n\r\n const handleScreenshotDrop = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDraggingScreenshot(false);\r\n\r\n const files = e.dataTransfer.files;\r\n if (files.length > 0) {\r\n const file = files[0];\r\n if (file.type.startsWith('image/')) {\r\n processImageFile(file);\r\n } else {\r\n setError(t('tickets.create.invalidImageType', 'Please select a valid image file'));\r\n }\r\n }\r\n }, [processImageFile, t]);\r\n\r\n const handleRemoveScreenshot = useCallback(() => {\r\n setScreenshot(null);\r\n setAnnotatedScreenshot(null);\r\n if (screenshotInputRef.current) {\r\n screenshotInputRef.current.value = '';\r\n }\r\n }, []);\r\n\r\n const handleAnnotatedScreenshot = useCallback((dataUrl: string) => {\r\n setAnnotatedScreenshot(dataUrl);\r\n }, []);\r\n\r\n // Attachment handlers\r\n const isAllowedFileType = useCallback((file: File): boolean => {\r\n // Allow all images\r\n if (file.type.startsWith('image/')) {\r\n return true;\r\n }\r\n const extension = '.' + file.name.split('.').pop()?.toLowerCase();\r\n return ALLOWED_EXTENSIONS.includes(extension);\r\n }, []);\r\n\r\n const processAttachmentFiles = useCallback((files: FileList) => {\r\n const newAttachments: AttachmentFile[] = [];\r\n\r\n for (let i = 0; i < files.length; i++) {\r\n const file = files[i];\r\n\r\n // Skip if already at max attachments\r\n if (attachments.length + newAttachments.length >= MAX_ATTACHMENTS) {\r\n setError(t('tickets.create.maxAttachments', `Maximum ${MAX_ATTACHMENTS} attachments allowed`));\r\n break;\r\n }\r\n\r\n // Check file size\r\n if (file.size > MAX_FILE_SIZE) {\r\n setError(t('tickets.create.fileTooLarge', `File \"${file.name}\" is too large (max 10MB)`));\r\n continue;\r\n }\r\n\r\n // Check file type\r\n if (!isAllowedFileType(file)) {\r\n setError(t('tickets.create.invalidFileType', `File type not allowed: ${file.name}`));\r\n continue;\r\n }\r\n\r\n // Check for duplicates\r\n const isDuplicate = attachments.some(a => a.name === file.name && a.size === file.size);\r\n if (isDuplicate) {\r\n continue;\r\n }\r\n\r\n newAttachments.push({\r\n id: generateUUID(),\r\n file,\r\n name: file.name,\r\n size: file.size,\r\n type: file.type,\r\n });\r\n }\r\n\r\n if (newAttachments.length > 0) {\r\n setAttachments(prev => [...prev, ...newAttachments]);\r\n setError(null);\r\n }\r\n }, [attachments, isAllowedFileType, t]);\r\n\r\n const handleAttachmentUpload = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = event.target.files;\r\n if (files) {\r\n processAttachmentFiles(files);\r\n }\r\n // Reset input\r\n if (attachmentInputRef.current) {\r\n attachmentInputRef.current.value = '';\r\n }\r\n }, [processAttachmentFiles]);\r\n\r\n // Drag & Drop handlers for attachments\r\n const handleAttachmentDragOver = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDraggingAttachment(true);\r\n }, []);\r\n\r\n const handleAttachmentDragLeave = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDraggingAttachment(false);\r\n }, []);\r\n\r\n const handleAttachmentDrop = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDraggingAttachment(false);\r\n\r\n const files = e.dataTransfer.files;\r\n if (files.length > 0) {\r\n processAttachmentFiles(files);\r\n }\r\n }, [processAttachmentFiles]);\r\n\r\n const handleRemoveAttachment = useCallback((id: string) => {\r\n setAttachments(prev => prev.filter(a => a.id !== id));\r\n }, []);\r\n\r\n const handleSubmit = async () => {\r\n if (!selectedType || !title.trim() || !description.trim()) return;\r\n\r\n if (!effectiveTenant) {\r\n setShowTenantPicker(true);\r\n return;\r\n }\r\n\r\n try {\r\n setSubmitting(true);\r\n setError(null);\r\n\r\n // Build description with browser info if enabled\r\n let fullDescription = description.trim();\r\n\r\n if (includeBrowserInfo && browserInfo) {\r\n fullDescription += '\\n\\n---\\n**System Information:**\\n' + browserInfoService.formatForDescription(browserInfo);\r\n }\r\n\r\n // Build structured client context for backend storage\r\n const currentBrowserInfo = browserInfo || browserInfoService.captureBrowserInfo();\r\n const recentErrors = logService.getRecentErrors().slice(0, 5);\r\n const clientContext: ClientContextDto = {\r\n sourceUrl: window.location.href,\r\n browser: {\r\n name: currentBrowserInfo.browser,\r\n version: currentBrowserInfo.browserVersion,\r\n language: currentBrowserInfo.language,\r\n },\r\n os: {\r\n name: currentBrowserInfo.os,\r\n version: currentBrowserInfo.osVersion,\r\n },\r\n device: {\r\n type: currentBrowserInfo.deviceType,\r\n screenResolution: currentBrowserInfo.screenResolution,\r\n },\r\n recentErrors: recentErrors.map((e) => ({\r\n message: e.message,\r\n stack: e.stack,\r\n component: e.component,\r\n timestamp: e.timestamp.toISOString(),\r\n })),\r\n };\r\n\r\n // If using locally selected tenant (global view), override X-Tenant-Slug header\r\n const tenantHeaders = selectedTenantForTicket\r\n ? { 'X-Tenant-Slug': selectedTenantForTicket.slug }\r\n : {};\r\n\r\n const ticket = selectedTenantForTicket\r\n ? await api.post<MyTicketDetailDto>('/api/support/my-tickets', {\r\n title: title.trim(),\r\n description: fullDescription,\r\n type: selectedType,\r\n priority,\r\n clientContext,\r\n }, { headers: tenantHeaders })\r\n : await myTicketsApi.create({\r\n title: title.trim(),\r\n description: fullDescription,\r\n type: selectedType,\r\n priority,\r\n clientContext,\r\n });\r\n\r\n // Upload screenshot as attachment if present\r\n if (annotatedScreenshot) {\r\n await uploadScreenshot(ticket.id, annotatedScreenshot, selectedTenantForTicket);\r\n }\r\n\r\n // Upload other attachments\r\n await uploadAttachments(ticket.id, attachments, selectedTenantForTicket);\r\n\r\n // Clean up draft on successful submit\r\n if (currentDraftId) {\r\n ticketDraftService.deleteDraft(currentDraftId);\r\n }\r\n if (autoSaveTimerRef.current) {\r\n clearTimeout(autoSaveTimerRef.current);\r\n autoSaveTimerRef.current = null;\r\n }\r\n hasUnsavedChangesRef.current = false;\r\n\r\n navigate(`/support/my-tickets/${ticket.id}?tab=submitted`);\r\n } catch (err: unknown) {\r\n const serverMessage = err && typeof err === 'object' && 'message' in err\r\n ? (err as { message: string }).message\r\n : null;\r\n setError(serverMessage || t('tickets.create.submitError', 'Failed to create ticket. Please try again.'));\r\n } finally {\r\n setSubmitting(false);\r\n }\r\n };\r\n\r\n const renderTypeSelection = () => (\r\n <div className=\"space-y-4\">\r\n <h2 className=\"text-lg font-semibold mb-4\">{t('tickets.create.selectType', 'What type of request do you have?')}</h2>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n {ticketTypes.map((type) => (\r\n <button\r\n key={type.value}\r\n onClick={() => {\r\n setSelectedType(type.value);\r\n setStep(2);\r\n }}\r\n className={`card p-4 text-left hover:shadow-md transition-shadow ${\r\n selectedType === type.value ? 'ring-2 ring-[var(--color-primary-600)]' : ''\r\n }`}\r\n >\r\n <div className=\"flex items-start gap-4\">\r\n <div className=\"p-3 rounded-lg bg-[var(--bg-secondary)]\">\r\n <type.icon className=\"w-6 h-6\" />\r\n </div>\r\n <div>\r\n <h3 className=\"font-medium\">{t(type.labelKey, type.label)}</h3>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{t(type.descriptionKey, type.description)}</p>\r\n </div>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n\r\n const renderForm = () => (\r\n <div className=\"space-y-6\">\r\n <div className=\"flex items-center gap-4 mb-6\">\r\n <button onClick={() => setStep(1)} className=\"btn btn-ghost p-2\">\r\n <ArrowLeft className=\"w-5 h-5\" />\r\n </button>\r\n <div>\r\n <h2 className=\"text-lg font-semibold\">\r\n {t(ticketTypes.find((tt) => tt.value === selectedType)?.labelKey || '', { defaultValue: ticketTypes.find((tt) => tt.value === selectedType)?.label })}\r\n </h2>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('tickets.create.fillDetails', 'Fill in the details below')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">\r\n {t('tickets.form.title', 'Title')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={title}\r\n onChange={(e) => setTitle(e.target.value)}\r\n placeholder={t('tickets.create.titlePlaceholder', 'Brief summary of your request')}\r\n className=\"input w-full\"\r\n maxLength={200}\r\n />\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n {title.length}/200 {t('common:text.characters', 'characters')}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">\r\n {t('tickets.create.description', 'Description')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <textarea\r\n value={description}\r\n onChange={(e) => setDescription(e.target.value)}\r\n placeholder={\r\n selectedType === 'Bug'\r\n ? t('tickets.create.bugPlaceholder', 'Please describe the issue in detail. Include steps to reproduce, expected behavior, and actual behavior.')\r\n : selectedType === 'FeatureRequest'\r\n ? t('tickets.create.featurePlaceholder', 'Describe the feature you would like to see and why it would be useful.')\r\n : selectedType === 'ApplicationRequest'\r\n ? t('tickets.create.applicationPlaceholder', 'Which application do you need access to and why?')\r\n : t('tickets.create.defaultPlaceholder', 'Please provide as much detail as possible.')\r\n }\r\n className=\"input w-full h-40\"\r\n maxLength={5000}\r\n />\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n {description.length}/5000 {t('common:text.characters', 'characters')}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">{t('tickets.create.priority', 'Priority')}</label>\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-2\">\r\n {priorityOptions.map((option) => (\r\n <button\r\n key={option.value}\r\n type=\"button\"\r\n onClick={() => setPriority(option.value)}\r\n className={`p-3 rounded-lg border text-center transition-colors ${\r\n priority === option.value\r\n ? 'border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10'\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <div className=\"font-medium\">{t(option.labelKey, option.label)}</div>\r\n <div className=\"text-xs text-[var(--text-secondary)]\">{t(option.descriptionKey, option.description)}</div>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Screenshot Upload Section */}\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">\r\n <ImageIcon className=\"w-4 h-4 inline mr-2\" />\r\n {t('tickets.create.screenshot', 'Screenshot')}\r\n <span className=\"text-[var(--text-secondary)] font-normal ml-2\">({t('common:text.optional', 'optional')})</span>\r\n </label>\r\n\r\n {!screenshot ? (\r\n <div\r\n className={`border-2 border-dashed rounded-lg p-6 text-center cursor-pointer transition-colors ${\r\n isDraggingScreenshot\r\n ? 'border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-primary-600)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n onClick={() => screenshotInputRef.current?.click()}\r\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); screenshotInputRef.current?.click(); } }}\r\n role=\"button\"\r\n tabIndex={0}\r\n onDragOver={handleScreenshotDragOver}\r\n onDragLeave={handleScreenshotDragLeave}\r\n onDrop={handleScreenshotDrop}\r\n >\r\n <Upload className=\"w-8 h-8 mx-auto mb-2 text-[var(--text-secondary)]\" />\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {isDraggingScreenshot\r\n ? t('tickets.create.dropScreenshotNow', 'Drop image here')\r\n : t('tickets.create.uploadScreenshot', 'Click or drag & drop to upload a screenshot')}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-muted)] mt-1\">\r\n {t('tickets.create.uploadScreenshotHint', 'PNG, JPG, or GIF up to 10MB')}\r\n </p>\r\n <input\r\n ref={screenshotInputRef}\r\n type=\"file\"\r\n accept=\"image/*\"\r\n onChange={handleScreenshotUpload}\r\n className=\"hidden\"\r\n />\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3\">\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('tickets.create.screenshotUploaded', 'Screenshot uploaded - you can annotate it below')}\r\n </span>\r\n <button\r\n type=\"button\"\r\n onClick={handleRemoveScreenshot}\r\n className=\"btn btn-ghost p-2 text-[var(--error-text)]\"\r\n title={t('tickets.create.removeScreenshot', 'Remove screenshot')}\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n <ScreenshotAnnotator\r\n screenshot={screenshot}\r\n onAnnotatedScreenshot={handleAnnotatedScreenshot}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Attachments Section */}\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">\r\n <Paperclip className=\"w-4 h-4 inline mr-2\" />\r\n {t('tickets.create.attachments', 'Attachments')}\r\n <span className=\"text-[var(--text-secondary)] font-normal ml-2\">({t('common:text.optional', 'optional')})</span>\r\n </label>\r\n\r\n <div\r\n className={`border-2 border-dashed rounded-lg p-4 text-center cursor-pointer transition-colors ${\r\n isDraggingAttachment\r\n ? 'border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-primary-600)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n onClick={() => attachmentInputRef.current?.click()}\r\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); attachmentInputRef.current?.click(); } }}\r\n role=\"button\"\r\n tabIndex={0}\r\n onDragOver={handleAttachmentDragOver}\r\n onDragLeave={handleAttachmentDragLeave}\r\n onDrop={handleAttachmentDrop}\r\n >\r\n <Upload className=\"w-6 h-6 mx-auto mb-1 text-[var(--text-secondary)]\" />\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {isDraggingAttachment\r\n ? t('tickets.create.dropFilesNow', 'Drop files here')\r\n : t('tickets.create.uploadAttachments', 'Click or drag & drop to add documents')}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-muted)] mt-1\">\r\n {t('tickets.create.attachmentsHint', 'PDF, Word, Excel, TXT, CSV, ZIP (max 10MB each, up to 5 files)')}\r\n </p>\r\n <input\r\n ref={attachmentInputRef}\r\n type=\"file\"\r\n multiple\r\n accept=\".pdf,.doc,.docx,.xls,.xlsx,.txt,.csv,.zip,.rar,.7z,image/*\"\r\n onChange={handleAttachmentUpload}\r\n className=\"hidden\"\r\n />\r\n </div>\r\n\r\n {/* Attachments List */}\r\n {attachments.length > 0 && (\r\n <div className=\"mt-3 space-y-2\">\r\n {attachments.map((attachment) => {\r\n const AttachmentIcon = getFileIcon(attachment.type);\r\n return (\r\n <div\r\n key={attachment.id}\r\n className=\"flex items-center justify-between p-2 rounded-lg bg-[var(--bg-secondary)]\"\r\n >\r\n <div className=\"flex items-center gap-2 min-w-0\">\r\n <AttachmentIcon className=\"w-4 h-4 text-[var(--text-secondary)] flex-shrink-0\" />\r\n <span className=\"text-sm truncate\">{attachment.name}</span>\r\n <span className=\"text-xs text-[var(--text-muted)] flex-shrink-0\">\r\n ({formatFileSize(attachment.size)})\r\n </span>\r\n </div>\r\n <button\r\n type=\"button\"\r\n onClick={() => handleRemoveAttachment(attachment.id)}\r\n className=\"btn btn-ghost p-1 text-[var(--error-text)]\"\r\n title={t('tickets.create.removeAttachment', 'Remove attachment')}\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Browser Info Section */}\r\n {browserInfo && (\r\n <div className=\"border border-[var(--border-color)] rounded-lg p-4\">\r\n <div className=\"flex items-center justify-between mb-3\">\r\n <div className=\"flex items-center gap-2\">\r\n <Monitor className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <span className=\"text-sm font-medium\">{t('tickets.create.systemInfo', 'System Information')}</span>\r\n </div>\r\n <label className=\"flex items-center gap-2 cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n checked={includeBrowserInfo}\r\n onChange={(e) => setIncludeBrowserInfo(e.target.checked)}\r\n className=\"rounded border-[var(--border-color)]\"\r\n />\r\n <span className=\"text-xs text-[var(--text-secondary)]\">\r\n {t('tickets.create.includeSystemInfo', 'Include in ticket')}\r\n </span>\r\n </label>\r\n </div>\r\n <div className={`grid grid-cols-2 md:grid-cols-3 gap-3 text-sm ${!includeBrowserInfo ? 'opacity-50' : ''}`}>\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('tickets.create.browser', 'Browser')}:</span>\r\n <span className=\"ml-2 font-medium\">{browserInfo.browser} {browserInfo.browserVersion}</span>\r\n </div>\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('tickets.create.os', 'OS')}:</span>\r\n <span className=\"ml-2 font-medium\">{browserInfo.os} {browserInfo.osVersion}</span>\r\n </div>\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('tickets.create.device', 'Device')}:</span>\r\n <span className=\"ml-2 font-medium\">{browserInfo.deviceType}</span>\r\n </div>\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('tickets.create.screen', 'Screen')}:</span>\r\n <span className=\"ml-2 font-medium\">{browserInfo.screenResolution}</span>\r\n </div>\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('tickets.create.language', 'Language')}:</span>\r\n <span className=\"ml-2 font-medium\">{browserInfo.language}</span>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {error && (\r\n <div className=\"p-4 rounded-lg bg-[var(--error-bg)] text-[var(--error-text)] flex items-center gap-2\">\r\n <AlertTriangle className=\"w-5 h-5\" />\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div className=\"flex items-center justify-between pt-4 border-t border-[var(--border-color)]\">\r\n <button onClick={() => setStep(1)} className=\"btn btn-secondary\">\r\n {t('common:buttons.back', 'Back')}\r\n </button>\r\n <button\r\n onClick={handleSubmit}\r\n disabled={!title.trim() || !description.trim() || submitting}\r\n className=\"btn btn-primary\"\r\n >\r\n {submitting ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin mr-2\" />\r\n ) : (\r\n <Send className=\"w-4 h-4 mr-2\" />\r\n )}\r\n {t('tickets.create.submit', 'Submit Ticket')}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n\r\n return (\r\n <div className=\"max-w-3xl mx-auto\">\r\n <div className=\"flex items-center gap-4 mb-6\">\r\n <button onClick={() => navigate(-1)} className=\"btn btn-ghost p-2\">\r\n <ArrowLeft className=\"w-5 h-5\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <h1 className=\"text-2xl font-bold flex items-center gap-2\">\r\n <Headset className=\"w-6 h-6\" />\r\n {t('tickets.create.title', 'Create New Ticket')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('tickets.create.subtitle', 'Submit a support request or report an issue')}\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n {/* Draft auto-save indicator */}\r\n <div className={`flex items-center gap-1 text-xs text-[var(--success-text)] transition-opacity duration-300 ${\r\n showDraftSaved ? 'opacity-100' : 'opacity-0'\r\n }`}>\r\n <Check className=\"w-3.5 h-3.5\" />\r\n <span>{t('common:drafts.autoSaved', 'Draft saved')}</span>\r\n </div>\r\n {/* Discard draft button */}\r\n {currentDraftId && (\r\n <button\r\n onClick={() => setShowDiscardConfirm(true)}\r\n className=\"btn btn-ghost p-2 text-[var(--text-secondary)] hover:text-[var(--error-text)]\"\r\n title={t('common:drafts.discard', 'Discard draft')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {isGlpi ? (\r\n <div className=\"mb-6 p-4 rounded-lg bg-[var(--info-bg)] border border-[var(--info-border)]\">\r\n <div className=\"flex items-center gap-3 mb-3\">\r\n <Info className=\"w-5 h-5 text-[var(--info-text)] flex-shrink-0\" />\r\n <p className=\"font-medium text-[var(--info-text)]\">\r\n {t('glpi.cannotCreateTicket', 'Tickets are managed by GLPI. Please create tickets directly in GLPI.')}\r\n </p>\r\n </div>\r\n {glpiBaseUrl && (\r\n <a\r\n href={glpiBaseUrl}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"btn btn-primary inline-flex items-center gap-2\"\r\n >\r\n <ExternalLink className=\"w-4 h-4\" />\r\n {t('glpi.openGlpi')}\r\n </a>\r\n )}\r\n </div>\r\n ) : (\r\n <>\r\n <div className=\"flex items-center gap-4 mb-8\">\r\n <div className={`flex items-center gap-2 ${step >= 1 ? 'text-[var(--color-primary-600)]' : 'text-[var(--text-secondary)]'}`}>\r\n <div className={`w-8 h-8 rounded-full flex items-center justify-center ${\r\n step >= 1 ? 'bg-[var(--color-primary-600)] text-white' : 'bg-[var(--bg-secondary)]'\r\n }`}>\r\n 1\r\n </div>\r\n <span className=\"font-medium\">{t('tickets.create.stepSelectType', 'Select Type')}</span>\r\n </div>\r\n <div className={`flex-1 h-0.5 ${step >= 2 ? 'bg-[var(--color-primary-600)]' : 'bg-[var(--border-color)]'}`} />\r\n <div className={`flex items-center gap-2 ${step >= 2 ? 'text-[var(--color-primary-600)]' : 'text-[var(--text-secondary)]'}`}>\r\n <div className={`w-8 h-8 rounded-full flex items-center justify-center ${\r\n step >= 2 ? 'bg-[var(--color-primary-600)] text-white' : 'bg-[var(--bg-secondary)]'\r\n }`}>\r\n 2\r\n </div>\r\n <span className=\"font-medium\">{t('tickets.create.stepDetails', 'Details')}</span>\r\n </div>\r\n </div>\r\n\r\n {/* Tenant context indicator (shown when using locally selected tenant in global view) */}\r\n {selectedTenantForTicket && !currentTenant && (\r\n <div className=\"mb-4 p-3 rounded-lg bg-[var(--info-bg)] border border-[var(--info-border)] flex items-center justify-between\">\r\n <div className=\"flex items-center gap-2 text-sm text-[var(--info-text)]\">\r\n <Building2 className=\"w-4 h-4\" />\r\n <span>{t('support:tickets.tenantPicker.creatingFor', 'Creating ticket for:')}</span>\r\n <span className=\"font-semibold\">{selectedTenantForTicket.name}</span>\r\n </div>\r\n <button\r\n onClick={() => setShowTenantPicker(true)}\r\n className=\"text-xs text-[var(--info-text)] underline hover:no-underline\"\r\n >\r\n {t('common:actions.change', 'Change')}\r\n </button>\r\n </div>\r\n )}\r\n\r\n <div className=\"card p-6\">\r\n {step === 1 && renderTypeSelection()}\r\n {step === 2 && renderForm()}\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* Discard confirmation modal */}\r\n {showDiscardConfirm && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50 p-4\">\r\n <div className=\"card w-full max-w-md p-6\">\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <div className=\"w-10 h-10 rounded-full bg-[var(--error-bg)] flex items-center justify-center\">\r\n <Trash2 className=\"w-5 h-5 text-[var(--error-text)]\" />\r\n </div>\r\n <h2 className=\"text-xl font-bold\">{t('common:drafts.discardConfirmTitle', 'Discard draft?')}</h2>\r\n </div>\r\n <p className=\"text-[var(--text-secondary)] mb-6\">{t('common:drafts.discardConfirmMessage', 'This draft will be permanently deleted. This action cannot be undone.')}</p>\r\n <div className=\"flex justify-end gap-3\">\r\n <button onClick={() => setShowDiscardConfirm(false)} className=\"btn btn-secondary\">\r\n {t('common:actions.cancel', 'Cancel')}\r\n </button>\r\n <button onClick={handleDiscardDraft} className=\"btn bg-[var(--error-text)] text-white hover:opacity-90\">\r\n {t('common:drafts.discard', 'Discard')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Tenant picker modal (shown in global view when no tenant selected) */}\r\n {showTenantPicker && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50 p-4\">\r\n <div className=\"card w-full max-w-md p-6\">\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <div className=\"w-10 h-10 rounded-full bg-[var(--info-bg)] flex items-center justify-center\">\r\n <Building2 className=\"w-5 h-5 text-[var(--info-text)]\" />\r\n </div>\r\n <div>\r\n <h2 className=\"text-xl font-bold\">{t('support:tickets.tenantPicker.title', 'Select Workspace')}</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{t('support:tickets.tenantPicker.description', 'Choose a workspace to create the ticket in')}</p>\r\n </div>\r\n </div>\r\n <div className=\"space-y-2 max-h-64 overflow-y-auto\">\r\n {userTenants\r\n .filter(tenant => tenant.status === 'Active')\r\n .map(tenant => (\r\n <button\r\n key={tenant.id}\r\n onClick={() => {\r\n setSelectedTenantForTicket(tenant);\r\n setShowTenantPicker(false);\r\n // Immediately persist tenant to draft\r\n const id = currentDraftId || ensureDraft();\r\n if (id) {\r\n ticketDraftService.updateDraft(id, {\r\n tenantId: tenant.id,\r\n tenantSlug: tenant.slug,\r\n tenantName: tenant.name,\r\n });\r\n }\r\n }}\r\n className={`w-full p-3 rounded-lg border text-left transition-colors hover:bg-[var(--bg-hover)] ${\r\n selectedTenantForTicket?.id === tenant.id\r\n ? 'border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10'\r\n : 'border-[var(--border-color)]'\r\n }`}\r\n >\r\n <div className=\"flex items-center gap-3\">\r\n <Building2 className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"font-medium truncate\">{tenant.name}</div>\r\n {tenant.organisationName && (\r\n <div className=\"text-xs text-[var(--text-secondary)] truncate\">{tenant.organisationName}</div>\r\n )}\r\n </div>\r\n <span className={`text-xs px-2 py-0.5 rounded-full ${\r\n tenant.type === 'Personal'\r\n ? 'bg-[var(--info-bg)] text-[var(--info-text)]'\r\n : 'bg-[var(--success-bg)] text-[var(--success-text)]'\r\n }`}>\r\n {tenant.type === 'Personal' ? t('common:tenant.personal', 'Personal') : t('common:tenant.business', 'Business')}\r\n </span>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n <div className=\"flex justify-end gap-3 mt-4 pt-4 border-t border-[var(--border-color)]\">\r\n <button\r\n onClick={() => {\r\n setShowTenantPicker(false);\r\n if (!effectiveTenant) navigate(-1);\r\n }}\r\n className=\"btn btn-secondary\"\r\n >\r\n {t('common:actions.cancel', 'Cancel')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["ticketTypes","Bug","Lightbulb","AppWindow","MessageSquare","HelpCircle","priorityOptions","MAX_FILE_SIZE","MAX_ATTACHMENTS","ALLOWED_EXTENSIONS","formatFileSize","bytes","getFileIcon","type","FileText","ImageIcon","FileIcon","restoreDraft","draftId","userTenants","draft","ticketDraftService","selectedTenant","matchingTenant","t","restoreSessionContext","sessionContext","autoSelectType","uploadScreenshot","ticketId","screenshot","selectedTenantForTicket","blob","file","formData","tenantHeaders","api","myTicketsApi","uploadAttachments","attachments","attachment","UserCreateTicketPage","navigate","useNavigate","searchParams","useSearchParams","useTranslation","isGlpi","glpiBaseUrl","useTicketingProvider","currentTenant","isGlobalView","useTenant","screenshotInputRef","useRef","attachmentInputRef","setSelectedTenantForTicket","useState","showTenantPicker","setShowTenantPicker","effectiveTenant","useEffect","step","setStep","selectedType","setSelectedType","title","setTitle","description","setDescription","priority","setPriority","submitting","setSubmitting","error","setError","browserInfo","setBrowserInfo","includeBrowserInfo","setIncludeBrowserInfo","setScreenshot","annotatedScreenshot","setAnnotatedScreenshot","isDraggingScreenshot","setIsDraggingScreenshot","setAttachments","isDraggingAttachment","setIsDraggingAttachment","currentDraftId","setCurrentDraftId","showDraftSaved","setShowDraftSaved","showDiscardConfirm","setShowDiscardConfirm","autoSaveTimerRef","isInitialLoadCompleteRef","hasUnsavedChangesRef","saveDraftNow","useCallback","result","ensureDraft","newDraft","handleBeforeUnload","handleDiscardDraft","validTypes","prefillType","prefillSubject","prefillBody","errorContextService","sessionScreenshot","info","browserInfoService","processImageFile","reader","e","dataUrl","handleScreenshotUpload","event","handleScreenshotDragOver","handleScreenshotDragLeave","handleScreenshotDrop","files","handleRemoveScreenshot","handleAnnotatedScreenshot","isAllowedFileType","extension","processAttachmentFiles","newAttachments","i","a","generateUUID","prev","handleAttachmentUpload","handleAttachmentDragOver","handleAttachmentDragLeave","handleAttachmentDrop","handleRemoveAttachment","id","handleSubmit","fullDescription","currentBrowserInfo","recentErrors","logService","clientContext","ticket","err","serverMessage","renderTypeSelection","jsxs","jsx","renderForm","ArrowLeft","tt","option","X","ScreenshotAnnotator","Upload","Paperclip","AttachmentIcon","Monitor","AlertTriangle","Loader2","Send","Headset","Check","Trash2","Info","ExternalLink","Fragment","Building2","tenant"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { useNavigate as ce } from "react-router-dom";
|
|
|
4
4
|
import { useTranslation as u } from "react-i18next";
|
|
5
5
|
import * as de from "lucide-react";
|
|
6
6
|
import { AlertTriangle as g, MapPin as H, Globe as D, Monitor as f, Clock as O, Loader2 as I, Star as C, Building2 as le, Settings as me, Activity as he, TrendingUp as ue, Calendar as ve, AppWindow as be, BarChart3 as K } from "lucide-react";
|
|
7
|
-
import { o as xe, a as ge, u as fe,
|
|
7
|
+
import { o as xe, a as ge, u as fe, aa as ye, f as pe } from "./index-CN2WRyg1.js";
|
|
8
8
|
import { ResponsiveContainer as p, LineChart as Ne, CartesianGrid as R, XAxis as $, YAxis as y, Tooltip as N, Legend as we, Line as W, BarChart as G, ReferenceLine as Se, Bar as q, Cell as X, PieChart as ke, Pie as Ce } from "recharts";
|
|
9
9
|
function De({ data: t }) {
|
|
10
10
|
const { t: o } = u("navigation");
|
|
@@ -798,4 +798,4 @@ function k({
|
|
|
798
798
|
export {
|
|
799
799
|
Ke as UserDashboardPage
|
|
800
800
|
};
|
|
801
|
-
//# sourceMappingURL=UserDashboardPage-
|
|
801
|
+
//# sourceMappingURL=UserDashboardPage-DwnDRNoW.js.map
|