@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SlaConfigPage-BY7gvYU6.js","sources":["../../src/pages/platform/support/SlaConfigPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Clock, Save, AlertTriangle, Loader2, Check } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n slaApi,\r\n type SlaConfigurationDto,\r\n type EscalationRuleDto,\r\n type SlaMetricsDto,\r\n} from '@/services/api/supportApi';\r\n\r\nconst priorityOrder = ['Critical', 'High', 'Medium', 'Low'];\r\n\r\nexport function SlaConfigPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n const [loading, setLoading] = useState(true);\r\n const [saving, setSaving] = useState<string | null>(null);\r\n const [configs, setConfigs] = useState<SlaConfigurationDto[]>([]);\r\n const [escalationRules, setEscalationRules] = useState<EscalationRuleDto[]>([]);\r\n const [metrics, setMetrics] = useState<SlaMetricsDto | null>(null);\r\n const [editedConfigs, setEditedConfigs] = useState<Record<string, { response: number; resolution: number }>>({});\r\n const [successMessage, setSuccessMessage] = useState<string | null>(null);\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const [configsRes, rulesRes, metricsRes] = await Promise.all([\r\n slaApi.getConfigurations(),\r\n slaApi.getEscalationRules(),\r\n slaApi.getMetrics(),\r\n ]);\r\n\r\n // Sort by priority order\r\n const sorted = [...configsRes].sort(\r\n (a, b) => priorityOrder.indexOf(a.priority) - priorityOrder.indexOf(b.priority)\r\n );\r\n\r\n setConfigs(sorted);\r\n setEscalationRules(rulesRes);\r\n setMetrics(metricsRes);\r\n\r\n // Initialize edited values\r\n const edited: Record<string, { response: number; resolution: number }> = {};\r\n sorted.forEach((c) => {\r\n edited[c.priority] = {\r\n response: c.responseTimeMinutes,\r\n resolution: c.resolutionTimeMinutes,\r\n };\r\n });\r\n setEditedConfigs(edited);\r\n } catch (error) {\r\n console.error('Failed to load SLA configurations:', error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleSave = async (priority: string) => {\r\n const edited = editedConfigs[priority];\r\n if (!edited) return;\r\n\r\n try {\r\n setSaving(priority);\r\n await slaApi.updateConfiguration(priority, {\r\n responseTimeMinutes: edited.response,\r\n resolutionTimeMinutes: edited.resolution,\r\n });\r\n\r\n // Reload to get updated formatted strings\r\n await loadData();\r\n\r\n setSuccessMessage(`${priority} SLA configuration saved successfully`);\r\n setTimeout(() => setSuccessMessage(null), 3000);\r\n } catch (error) {\r\n console.error('Failed to save SLA configuration:', error);\r\n } finally {\r\n setSaving(null);\r\n }\r\n };\r\n\r\n const handleInputChange = (priority: string, field: 'response' | 'resolution', value: number) => {\r\n setEditedConfigs((prev) => ({\r\n ...prev,\r\n [priority]: {\r\n ...prev[priority],\r\n [field]: value,\r\n },\r\n }));\r\n };\r\n\r\n const hasChanges = (priority: string) => {\r\n const config = configs.find((c) => c.priority === priority);\r\n const edited = editedConfigs[priority];\r\n if (!config || !edited) return false;\r\n return (\r\n config.responseTimeMinutes !== edited.response ||\r\n config.resolutionTimeMinutes !== edited.resolution\r\n );\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('sla.title', 'SLA Configuration') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div>\r\n <h1 className=\"text-2xl font-bold flex items-center gap-2\">\r\n <Clock className=\"w-6 h-6\" />\r\n {t('sla.title', 'SLA Configuration')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n Configure Service Level Agreements for ticket response and resolution times\r\n </p>\r\n </div>\r\n\r\n {/* Success Message */}\r\n {successMessage && (\r\n <div className=\"bg-[var(--success-bg)] border border-[var(--success-border)] text-[var(--success-text)] px-4 py-3 rounded flex items-center gap-2\">\r\n <Check className=\"w-5 h-5\" />\r\n {successMessage}\r\n </div>\r\n )}\r\n\r\n {/* SLA Metrics Overview */}\r\n {metrics && (\r\n <div className=\"card p-4\">\r\n <h2 className=\"font-semibold mb-4\">Current SLA Performance</h2>\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n <div className=\"text-center p-3 bg-[var(--bg-secondary)] rounded\">\r\n <div className=\"text-2xl font-bold\">{metrics.totalTickets}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">Total Tickets</div>\r\n </div>\r\n <div className=\"text-center p-3 bg-[var(--bg-secondary)] rounded\">\r\n <div className=\"text-2xl font-bold text-[var(--success-text)]\">{metrics.ticketsWithinSla}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">Within SLA</div>\r\n </div>\r\n <div className=\"text-center p-3 bg-[var(--bg-secondary)] rounded\">\r\n <div className=\"text-2xl font-bold text-[var(--error-text)]\">{metrics.ticketsBreached}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">Breached</div>\r\n </div>\r\n <div className=\"text-center p-3 bg-[var(--bg-secondary)] rounded\">\r\n <div className={`text-2xl font-bold ${metrics.slaCompliancePercentage >= 90 ? 'text-[var(--success-text)]' : 'text-[var(--warning-text)]'}`}>\r\n {metrics.slaCompliancePercentage.toFixed(1)}%\r\n </div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">Compliance</div>\r\n </div>\r\n </div>\r\n\r\n {/* Breaches by Priority */}\r\n {Object.keys(metrics.breachesByPriority).length > 0 && (\r\n <div className=\"mt-4 pt-4 border-t border-[var(--border-color)]\">\r\n <h3 className=\"text-sm font-medium mb-2\">Breaches by Priority</h3>\r\n <div className=\"flex gap-4\">\r\n {Object.entries(metrics.breachesByPriority).map(([priority, count]) => (\r\n <div key={priority} className=\"flex items-center gap-2\">\r\n <span className=\"text-sm\">{priority}:</span>\r\n <span className=\"font-medium text-[var(--error-text)]\">{count}</span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* SLA Configurations */}\r\n <div className=\"card\">\r\n <div className=\"p-4 border-b border-[var(--border-color)]\">\r\n <h2 className=\"font-semibold\">Response & Resolution Times</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n Define the maximum time allowed for initial response and complete resolution by priority\r\n </p>\r\n </div>\r\n\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left p-4 font-medium\">Priority</th>\r\n <th className=\"text-left p-4 font-medium\">Response Time</th>\r\n <th className=\"text-left p-4 font-medium\">Resolution Time</th>\r\n <th className=\"text-left p-4 font-medium\">Status</th>\r\n <th className=\"text-right p-4 font-medium\">Actions</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {configs.map((config) => {\r\n const edited = editedConfigs[config.priority];\r\n const changed = hasChanges(config.priority);\r\n\r\n return (\r\n <tr key={config.id} className=\"border-b border-[var(--border-color)]\">\r\n <td className=\"p-4\">\r\n <span className={`inline-flex items-center px-3 py-1 rounded-[var(--radius-badge)] font-medium text-sm ${\r\n config.priority === 'Critical' ? 'bg-[var(--error-bg)] text-[var(--error-text)]' :\r\n config.priority === 'High' ? 'bg-[var(--warning-bg)] text-[var(--warning-text)]' :\r\n config.priority === 'Medium' ? 'bg-[var(--warning-bg)] text-[var(--warning-text)]' :\r\n 'bg-[var(--info-bg)] text-[var(--info-text)]'\r\n }`}>\r\n {config.priority}\r\n </span>\r\n </td>\r\n <td className=\"p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n value={edited?.response ?? config.responseTimeMinutes}\r\n onChange={(e) =>\r\n handleInputChange(config.priority, 'response', parseInt(e.target.value) || 0)\r\n }\r\n className=\"input w-24\"\r\n />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">minutes</span>\r\n <span className=\"text-sm text-[var(--text-secondary)] ml-2\">\r\n ({config.responseTimeFormatted})\r\n </span>\r\n </div>\r\n </td>\r\n <td className=\"p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n value={edited?.resolution ?? config.resolutionTimeMinutes}\r\n onChange={(e) =>\r\n handleInputChange(config.priority, 'resolution', parseInt(e.target.value) || 0)\r\n }\r\n className=\"input w-24\"\r\n />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">minutes</span>\r\n <span className=\"text-sm text-[var(--text-secondary)] ml-2\">\r\n ({config.resolutionTimeFormatted})\r\n </span>\r\n </div>\r\n </td>\r\n <td className=\"p-4\">\r\n {config.isActive ? (\r\n <span className=\"inline-flex items-center px-2 py-1 rounded bg-[var(--success-bg)] text-[var(--success-text)] text-sm\">\r\n Active\r\n </span>\r\n ) : (\r\n <span className=\"inline-flex items-center px-2 py-1 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] text-sm\">\r\n Inactive\r\n </span>\r\n )}\r\n </td>\r\n <td className=\"p-4 text-right\">\r\n <button\r\n onClick={() => handleSave(config.priority)}\r\n disabled={!changed || saving === config.priority}\r\n className={`btn ${changed ? 'btn-primary' : 'btn-secondary'} flex items-center gap-2`}\r\n >\r\n {saving === config.priority ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Save className=\"w-4 h-4\" />\r\n )}\r\n Save\r\n </button>\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n\r\n {/* Escalation Rules */}\r\n <div className=\"card\">\r\n <div className=\"p-4 border-b border-[var(--border-color)]\">\r\n <h2 className=\"font-semibold\">Escalation Rules</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n Automatic escalation paths when SLAs are breached\r\n </p>\r\n </div>\r\n\r\n {escalationRules.length > 0 ? (\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left p-4 font-medium\">Level</th>\r\n <th className=\"text-left p-4 font-medium\">Trigger</th>\r\n <th className=\"text-left p-4 font-medium\">Delay After Breach</th>\r\n <th className=\"text-left p-4 font-medium\">Status</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {escalationRules.map((rule) => (\r\n <tr key={rule.id} className=\"border-b border-[var(--border-color)]\">\r\n <td className=\"p-4\">\r\n <span className=\"font-medium\">{rule.level}</span>\r\n </td>\r\n <td className=\"p-4\">\r\n <span className=\"text-sm\">{formatTriggerType(rule.triggerType)}</span>\r\n </td>\r\n <td className=\"p-4\">\r\n <span className=\"text-sm\">{formatMinutes(rule.delayAfterBreachMinutes)}</span>\r\n </td>\r\n <td className=\"p-4\">\r\n {rule.isActive ? (\r\n <span className=\"inline-flex items-center px-2 py-1 rounded bg-[var(--success-bg)] text-[var(--success-text)] text-sm\">\r\n Active\r\n </span>\r\n ) : (\r\n <span className=\"inline-flex items-center px-2 py-1 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] text-sm\">\r\n Inactive\r\n </span>\r\n )}\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n ) : (\r\n <div className=\"p-8 text-center text-[var(--text-secondary)]\">\r\n <AlertTriangle className=\"w-12 h-12 mx-auto mb-4 opacity-50\" />\r\n <p>No escalation rules configured</p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Help Section */}\r\n <div className=\"card p-4 bg-[var(--info-bg)] border-[var(--info-border)]\">\r\n <h3 className=\"font-semibold text-[var(--info-text)] mb-2\">About SLA Configuration</h3>\r\n <ul className=\"text-sm text-[var(--info-text)] space-y-1\">\r\n <li>\r\n <strong>Response Time:</strong> Maximum time allowed for the first agent response after ticket creation\r\n </li>\r\n <li>\r\n <strong>Resolution Time:</strong> Maximum time allowed to fully resolve and close the ticket\r\n </li>\r\n <li>\r\n <strong>SLA Pause:</strong> SLA timers automatically pause when a ticket is placed On Hold\r\n </li>\r\n <li>\r\n <strong>Escalation:</strong> When SLA is breached, tickets are automatically escalated to higher levels\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction formatTriggerType(type: string): string {\r\n switch (type) {\r\n case 'ResponseBreach':\r\n return 'Response SLA Breached';\r\n case 'ResolutionBreach':\r\n return 'Resolution SLA Breached';\r\n default:\r\n return type;\r\n }\r\n}\r\n\r\nfunction formatMinutes(minutes: number): string {\r\n if (minutes < 60) return `${minutes} minutes`;\r\n const hours = Math.floor(minutes / 60);\r\n const mins = minutes % 60;\r\n if (hours < 24) return mins > 0 ? `${hours}h ${mins}m` : `${hours} hours`;\r\n const days = Math.floor(hours / 24);\r\n const remainingHours = hours % 24;\r\n return remainingHours > 0 ? `${days}d ${remainingHours}h` : `${days} days`;\r\n}\r\n"],"names":["priorityOrder","SlaConfigPage","t","useTranslation","loading","setLoading","useState","saving","setSaving","configs","setConfigs","escalationRules","setEscalationRules","metrics","setMetrics","editedConfigs","setEditedConfigs","successMessage","setSuccessMessage","loadData","useCallback","configsRes","rulesRes","metricsRes","slaApi","sorted","a","b","edited","c","error","useEffect","handleSave","priority","handleInputChange","field","value","prev","hasChanges","config","jsx","Loader2","jsxs","Breadcrumb","Clock","Check","count","changed","e","Save","rule","formatTriggerType","formatMinutes","AlertTriangle","type","minutes","hours","mins","days","remainingHours"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SlaConfigPage-okvZfA_K.js","sources":["../../src/pages/platform/support/SlaConfigPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Clock, Save, AlertTriangle, Loader2, Check } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n slaApi,\r\n type SlaConfigurationDto,\r\n type EscalationRuleDto,\r\n type SlaMetricsDto,\r\n} from '@/services/api/supportApi';\r\n\r\nconst priorityOrder = ['Critical', 'High', 'Medium', 'Low'];\r\n\r\nexport function SlaConfigPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n const [loading, setLoading] = useState(true);\r\n const [saving, setSaving] = useState<string | null>(null);\r\n const [configs, setConfigs] = useState<SlaConfigurationDto[]>([]);\r\n const [escalationRules, setEscalationRules] = useState<EscalationRuleDto[]>([]);\r\n const [metrics, setMetrics] = useState<SlaMetricsDto | null>(null);\r\n const [editedConfigs, setEditedConfigs] = useState<Record<string, { response: number; resolution: number }>>({});\r\n const [successMessage, setSuccessMessage] = useState<string | null>(null);\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const [configsRes, rulesRes, metricsRes] = await Promise.all([\r\n slaApi.getConfigurations(),\r\n slaApi.getEscalationRules(),\r\n slaApi.getMetrics(),\r\n ]);\r\n\r\n // Sort by priority order\r\n const sorted = [...configsRes].sort(\r\n (a, b) => priorityOrder.indexOf(a.priority) - priorityOrder.indexOf(b.priority)\r\n );\r\n\r\n setConfigs(sorted);\r\n setEscalationRules(rulesRes);\r\n setMetrics(metricsRes);\r\n\r\n // Initialize edited values\r\n const edited: Record<string, { response: number; resolution: number }> = {};\r\n sorted.forEach((c) => {\r\n edited[c.priority] = {\r\n response: c.responseTimeMinutes,\r\n resolution: c.resolutionTimeMinutes,\r\n };\r\n });\r\n setEditedConfigs(edited);\r\n } catch (error) {\r\n console.error('Failed to load SLA configurations:', error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleSave = async (priority: string) => {\r\n const edited = editedConfigs[priority];\r\n if (!edited) return;\r\n\r\n try {\r\n setSaving(priority);\r\n await slaApi.updateConfiguration(priority, {\r\n responseTimeMinutes: edited.response,\r\n resolutionTimeMinutes: edited.resolution,\r\n });\r\n\r\n // Reload to get updated formatted strings\r\n await loadData();\r\n\r\n setSuccessMessage(`${priority} SLA configuration saved successfully`);\r\n setTimeout(() => setSuccessMessage(null), 3000);\r\n } catch (error) {\r\n console.error('Failed to save SLA configuration:', error);\r\n } finally {\r\n setSaving(null);\r\n }\r\n };\r\n\r\n const handleInputChange = (priority: string, field: 'response' | 'resolution', value: number) => {\r\n setEditedConfigs((prev) => ({\r\n ...prev,\r\n [priority]: {\r\n ...prev[priority],\r\n [field]: value,\r\n },\r\n }));\r\n };\r\n\r\n const hasChanges = (priority: string) => {\r\n const config = configs.find((c) => c.priority === priority);\r\n const edited = editedConfigs[priority];\r\n if (!config || !edited) return false;\r\n return (\r\n config.responseTimeMinutes !== edited.response ||\r\n config.resolutionTimeMinutes !== edited.resolution\r\n );\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('sla.title', 'SLA Configuration') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div>\r\n <h1 className=\"text-2xl font-bold flex items-center gap-2\">\r\n <Clock className=\"w-6 h-6\" />\r\n {t('sla.title', 'SLA Configuration')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n Configure Service Level Agreements for ticket response and resolution times\r\n </p>\r\n </div>\r\n\r\n {/* Success Message */}\r\n {successMessage && (\r\n <div className=\"bg-[var(--success-bg)] border border-[var(--success-border)] text-[var(--success-text)] px-4 py-3 rounded flex items-center gap-2\">\r\n <Check className=\"w-5 h-5\" />\r\n {successMessage}\r\n </div>\r\n )}\r\n\r\n {/* SLA Metrics Overview */}\r\n {metrics && (\r\n <div className=\"card p-4\">\r\n <h2 className=\"font-semibold mb-4\">Current SLA Performance</h2>\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n <div className=\"text-center p-3 bg-[var(--bg-secondary)] rounded\">\r\n <div className=\"text-2xl font-bold\">{metrics.totalTickets}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">Total Tickets</div>\r\n </div>\r\n <div className=\"text-center p-3 bg-[var(--bg-secondary)] rounded\">\r\n <div className=\"text-2xl font-bold text-[var(--success-text)]\">{metrics.ticketsWithinSla}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">Within SLA</div>\r\n </div>\r\n <div className=\"text-center p-3 bg-[var(--bg-secondary)] rounded\">\r\n <div className=\"text-2xl font-bold text-[var(--error-text)]\">{metrics.ticketsBreached}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">Breached</div>\r\n </div>\r\n <div className=\"text-center p-3 bg-[var(--bg-secondary)] rounded\">\r\n <div className={`text-2xl font-bold ${metrics.slaCompliancePercentage >= 90 ? 'text-[var(--success-text)]' : 'text-[var(--warning-text)]'}`}>\r\n {metrics.slaCompliancePercentage.toFixed(1)}%\r\n </div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">Compliance</div>\r\n </div>\r\n </div>\r\n\r\n {/* Breaches by Priority */}\r\n {Object.keys(metrics.breachesByPriority).length > 0 && (\r\n <div className=\"mt-4 pt-4 border-t border-[var(--border-color)]\">\r\n <h3 className=\"text-sm font-medium mb-2\">Breaches by Priority</h3>\r\n <div className=\"flex gap-4\">\r\n {Object.entries(metrics.breachesByPriority).map(([priority, count]) => (\r\n <div key={priority} className=\"flex items-center gap-2\">\r\n <span className=\"text-sm\">{priority}:</span>\r\n <span className=\"font-medium text-[var(--error-text)]\">{count}</span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* SLA Configurations */}\r\n <div className=\"card\">\r\n <div className=\"p-4 border-b border-[var(--border-color)]\">\r\n <h2 className=\"font-semibold\">Response & Resolution Times</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n Define the maximum time allowed for initial response and complete resolution by priority\r\n </p>\r\n </div>\r\n\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left p-4 font-medium\">Priority</th>\r\n <th className=\"text-left p-4 font-medium\">Response Time</th>\r\n <th className=\"text-left p-4 font-medium\">Resolution Time</th>\r\n <th className=\"text-left p-4 font-medium\">Status</th>\r\n <th className=\"text-right p-4 font-medium\">Actions</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {configs.map((config) => {\r\n const edited = editedConfigs[config.priority];\r\n const changed = hasChanges(config.priority);\r\n\r\n return (\r\n <tr key={config.id} className=\"border-b border-[var(--border-color)]\">\r\n <td className=\"p-4\">\r\n <span className={`inline-flex items-center px-3 py-1 rounded-[var(--radius-badge)] font-medium text-sm ${\r\n config.priority === 'Critical' ? 'bg-[var(--error-bg)] text-[var(--error-text)]' :\r\n config.priority === 'High' ? 'bg-[var(--warning-bg)] text-[var(--warning-text)]' :\r\n config.priority === 'Medium' ? 'bg-[var(--warning-bg)] text-[var(--warning-text)]' :\r\n 'bg-[var(--info-bg)] text-[var(--info-text)]'\r\n }`}>\r\n {config.priority}\r\n </span>\r\n </td>\r\n <td className=\"p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n value={edited?.response ?? config.responseTimeMinutes}\r\n onChange={(e) =>\r\n handleInputChange(config.priority, 'response', parseInt(e.target.value) || 0)\r\n }\r\n className=\"input w-24\"\r\n />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">minutes</span>\r\n <span className=\"text-sm text-[var(--text-secondary)] ml-2\">\r\n ({config.responseTimeFormatted})\r\n </span>\r\n </div>\r\n </td>\r\n <td className=\"p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n value={edited?.resolution ?? config.resolutionTimeMinutes}\r\n onChange={(e) =>\r\n handleInputChange(config.priority, 'resolution', parseInt(e.target.value) || 0)\r\n }\r\n className=\"input w-24\"\r\n />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">minutes</span>\r\n <span className=\"text-sm text-[var(--text-secondary)] ml-2\">\r\n ({config.resolutionTimeFormatted})\r\n </span>\r\n </div>\r\n </td>\r\n <td className=\"p-4\">\r\n {config.isActive ? (\r\n <span className=\"inline-flex items-center px-2 py-1 rounded bg-[var(--success-bg)] text-[var(--success-text)] text-sm\">\r\n Active\r\n </span>\r\n ) : (\r\n <span className=\"inline-flex items-center px-2 py-1 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] text-sm\">\r\n Inactive\r\n </span>\r\n )}\r\n </td>\r\n <td className=\"p-4 text-right\">\r\n <button\r\n onClick={() => handleSave(config.priority)}\r\n disabled={!changed || saving === config.priority}\r\n className={`btn ${changed ? 'btn-primary' : 'btn-secondary'} flex items-center gap-2`}\r\n >\r\n {saving === config.priority ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Save className=\"w-4 h-4\" />\r\n )}\r\n Save\r\n </button>\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n\r\n {/* Escalation Rules */}\r\n <div className=\"card\">\r\n <div className=\"p-4 border-b border-[var(--border-color)]\">\r\n <h2 className=\"font-semibold\">Escalation Rules</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n Automatic escalation paths when SLAs are breached\r\n </p>\r\n </div>\r\n\r\n {escalationRules.length > 0 ? (\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left p-4 font-medium\">Level</th>\r\n <th className=\"text-left p-4 font-medium\">Trigger</th>\r\n <th className=\"text-left p-4 font-medium\">Delay After Breach</th>\r\n <th className=\"text-left p-4 font-medium\">Status</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {escalationRules.map((rule) => (\r\n <tr key={rule.id} className=\"border-b border-[var(--border-color)]\">\r\n <td className=\"p-4\">\r\n <span className=\"font-medium\">{rule.level}</span>\r\n </td>\r\n <td className=\"p-4\">\r\n <span className=\"text-sm\">{formatTriggerType(rule.triggerType)}</span>\r\n </td>\r\n <td className=\"p-4\">\r\n <span className=\"text-sm\">{formatMinutes(rule.delayAfterBreachMinutes)}</span>\r\n </td>\r\n <td className=\"p-4\">\r\n {rule.isActive ? (\r\n <span className=\"inline-flex items-center px-2 py-1 rounded bg-[var(--success-bg)] text-[var(--success-text)] text-sm\">\r\n Active\r\n </span>\r\n ) : (\r\n <span className=\"inline-flex items-center px-2 py-1 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] text-sm\">\r\n Inactive\r\n </span>\r\n )}\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n ) : (\r\n <div className=\"p-8 text-center text-[var(--text-secondary)]\">\r\n <AlertTriangle className=\"w-12 h-12 mx-auto mb-4 opacity-50\" />\r\n <p>No escalation rules configured</p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Help Section */}\r\n <div className=\"card p-4 bg-[var(--info-bg)] border-[var(--info-border)]\">\r\n <h3 className=\"font-semibold text-[var(--info-text)] mb-2\">About SLA Configuration</h3>\r\n <ul className=\"text-sm text-[var(--info-text)] space-y-1\">\r\n <li>\r\n <strong>Response Time:</strong> Maximum time allowed for the first agent response after ticket creation\r\n </li>\r\n <li>\r\n <strong>Resolution Time:</strong> Maximum time allowed to fully resolve and close the ticket\r\n </li>\r\n <li>\r\n <strong>SLA Pause:</strong> SLA timers automatically pause when a ticket is placed On Hold\r\n </li>\r\n <li>\r\n <strong>Escalation:</strong> When SLA is breached, tickets are automatically escalated to higher levels\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction formatTriggerType(type: string): string {\r\n switch (type) {\r\n case 'ResponseBreach':\r\n return 'Response SLA Breached';\r\n case 'ResolutionBreach':\r\n return 'Resolution SLA Breached';\r\n default:\r\n return type;\r\n }\r\n}\r\n\r\nfunction formatMinutes(minutes: number): string {\r\n if (minutes < 60) return `${minutes} minutes`;\r\n const hours = Math.floor(minutes / 60);\r\n const mins = minutes % 60;\r\n if (hours < 24) return mins > 0 ? `${hours}h ${mins}m` : `${hours} hours`;\r\n const days = Math.floor(hours / 24);\r\n const remainingHours = hours % 24;\r\n return remainingHours > 0 ? `${days}d ${remainingHours}h` : `${days} days`;\r\n}\r\n"],"names":["priorityOrder","SlaConfigPage","t","useTranslation","loading","setLoading","useState","saving","setSaving","configs","setConfigs","escalationRules","setEscalationRules","metrics","setMetrics","editedConfigs","setEditedConfigs","successMessage","setSuccessMessage","loadData","useCallback","configsRes","rulesRes","metricsRes","slaApi","sorted","a","b","edited","c","error","useEffect","handleSave","priority","handleInputChange","field","value","prev","hasChanges","config","jsx","Loader2","jsxs","Breadcrumb","Clock","Check","count","changed","e","Save","rule","formatTriggerType","formatMinutes","AlertTriangle","type","minutes","hours","mins","days","remainingHours"],"mappings":"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"}
|
package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js → SupportPermissionsPage-DGAPqJbl.js}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsxs as s, jsx as r } from "react/jsx-runtime";
|
|
2
2
|
import { useTranslation as t } from "react-i18next";
|
|
3
3
|
import { Shield as o } from "lucide-react";
|
|
4
|
-
import { B as i, F as p } from "./index-
|
|
4
|
+
import { B as i, F as p } from "./index-lpIzhufD.js";
|
|
5
5
|
function u() {
|
|
6
6
|
const { t: e } = t("support");
|
|
7
7
|
return /* @__PURE__ */ s("div", { className: "space-y-6", children: [
|
|
@@ -29,4 +29,4 @@ function u() {
|
|
|
29
29
|
export {
|
|
30
30
|
u as SupportPermissionsPage
|
|
31
31
|
};
|
|
32
|
-
//# sourceMappingURL=SupportPermissionsPage-
|
|
32
|
+
//# sourceMappingURL=SupportPermissionsPage-DGAPqJbl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SupportPermissionsPage-
|
|
1
|
+
{"version":3,"file":"SupportPermissionsPage-DGAPqJbl.js","sources":["../../src/pages/platform/support/SupportPermissionsPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport { Shield } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { UnderDevelopment } from '@/components/ui/UnderDevelopment';\r\n\r\nexport function SupportPermissionsPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('permissions.title', 'Support Permissions') }\r\n ]}\r\n />\r\n\r\n <UnderDevelopment\r\n title={t('permissions.title', 'Support Permissions')}\r\n description={t('permissions.underDevelopment', 'Ticket validation rules and role-based permissions for support actions are currently under development.')}\r\n icon={<Shield className=\"w-10 h-10 text-amber-600 dark:text-amber-400\" />}\r\n showBackButton={true}\r\n backUrl=\"/support/admin\"\r\n />\r\n </div>\r\n );\r\n}\r\n"],"names":["SupportPermissionsPage","t","useTranslation","jsxs","jsx","Breadcrumb","UnderDevelopment","Shield"],"mappings":";;;;AAMO,SAASA,IAAuC;AACrD,QAAM,EAAE,GAAAC,EAAA,IAAMC,EAAe,SAAS;AAEtC,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAOJ,EAAE,SAAS,SAAS,GAAG,MAAM,WAAA;AAAA,UACtC,EAAE,OAAOA,EAAE,qBAAqB,qBAAqB,EAAA;AAAA,QAAE;AAAA,MACzD;AAAA,IAAA;AAAA,IAGF,gBAAAG;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,OAAOL,EAAE,qBAAqB,qBAAqB;AAAA,QACnD,aAAaA,EAAE,gCAAgC,yGAAyG;AAAA,QACxJ,MAAM,gBAAAG,EAACG,GAAA,EAAO,WAAU,+CAAA,CAA+C;AAAA,QACvE,gBAAgB;AAAA,QAChB,SAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,EACV,GACF;AAEJ;"}
|
package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js → SupportPermissionsPage-Dg_wLOme.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),t=require("react-i18next"),i=require("lucide-react"),r=require("./index-
|
|
2
|
-
//# sourceMappingURL=SupportPermissionsPage-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),t=require("react-i18next"),i=require("lucide-react"),r=require("./index-IgLVXPg8.js");function o(){const{t:e}=t.useTranslation("support");return s.jsxs("div",{className:"space-y-6",children:[s.jsx(r.Breadcrumb,{items:[{label:e("title","Support"),href:"/support"},{label:e("permissions.title","Support Permissions")}]}),s.jsx(r.UnderDevelopment,{title:e("permissions.title","Support Permissions"),description:e("permissions.underDevelopment","Ticket validation rules and role-based permissions for support actions are currently under development."),icon:s.jsx(i.Shield,{className:"w-10 h-10 text-amber-600 dark:text-amber-400"}),showBackButton:!0,backUrl:"/support/admin"})]})}exports.SupportPermissionsPage=o;
|
|
2
|
+
//# sourceMappingURL=SupportPermissionsPage-Dg_wLOme.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SupportPermissionsPage-
|
|
1
|
+
{"version":3,"file":"SupportPermissionsPage-Dg_wLOme.js","sources":["../../src/pages/platform/support/SupportPermissionsPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport { Shield } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { UnderDevelopment } from '@/components/ui/UnderDevelopment';\r\n\r\nexport function SupportPermissionsPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('permissions.title', 'Support Permissions') }\r\n ]}\r\n />\r\n\r\n <UnderDevelopment\r\n title={t('permissions.title', 'Support Permissions')}\r\n description={t('permissions.underDevelopment', 'Ticket validation rules and role-based permissions for support actions are currently under development.')}\r\n icon={<Shield className=\"w-10 h-10 text-amber-600 dark:text-amber-400\" />}\r\n showBackButton={true}\r\n backUrl=\"/support/admin\"\r\n />\r\n </div>\r\n );\r\n}\r\n"],"names":["SupportPermissionsPage","t","useTranslation","jsxs","jsx","Breadcrumb","UnderDevelopment","Shield"],"mappings":"2MAMO,SAASA,GAAuC,CACrD,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAAA,eAAe,SAAS,EAEtC,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAC,EAAAA,IAACC,EAAAA,WAAA,CACC,MAAO,CACL,CAAE,MAAOJ,EAAE,QAAS,SAAS,EAAG,KAAM,UAAA,EACtC,CAAE,MAAOA,EAAE,oBAAqB,qBAAqB,CAAA,CAAE,CACzD,CAAA,EAGFG,EAAAA,IAACE,EAAAA,iBAAA,CACC,MAAOL,EAAE,oBAAqB,qBAAqB,EACnD,YAAaA,EAAE,+BAAgC,yGAAyG,EACxJ,KAAMG,EAAAA,IAACG,EAAAA,OAAA,CAAO,UAAU,8CAAA,CAA+C,EACvE,eAAgB,GAChB,QAAQ,gBAAA,CAAA,CACV,EACF,CAEJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),c=require("react"),G=require("react-i18next"),l=require("lucide-react"),o=require("./index-
|
|
2
|
-
//# sourceMappingURL=TemplatesPage-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),c=require("react"),G=require("react-i18next"),l=require("lucide-react"),o=require("./index-IgLVXPg8.js"),H={Greeting:"bg-[var(--info-bg)] text-[var(--info-text)]",Acknowledgment:"bg-[var(--success-bg)] text-[var(--success-text)]",RequestInfo:"bg-[var(--warning-bg)] text-[var(--warning-text)]",Resolution:"bg-[var(--accent-bg)] text-[var(--accent-text)]",Escalation:"bg-[var(--warning-bg)] text-[var(--warning-text)]",Closure:"bg-[var(--bg-secondary)] text-[var(--text-secondary)]"};function V(){const{t:s}=G.useTranslation("support"),h=t=>{const r=`templates.categories.${t}`,u=s(r);return u!==r?u:t},[g,j]=c.useState(!0),[k,T]=c.useState([]),[v,A]=c.useState([]),[i,F]=c.useState(""),[d,L]=c.useState(""),[b,O]=c.useState(!1),[D,m]=c.useState(!1),[p,f]=c.useState(null),[N,w]=c.useState(!1),[E,C]=c.useState(null),[a,n]=c.useState({title:"",content:"",category:"",displayOrder:0}),x=c.useCallback(async()=>{try{j(!0);const[t,r]=await Promise.all([o.templatesApi.getAll(d||void 0,!b),o.templatesApi.getCategories()]);T(t),A(r)}catch(t){console.error("Failed to load templates:",t)}finally{j(!1)}},[d,b]);c.useEffect(()=>{x()},[x]);const y=k.filter(t=>t.title.toLowerCase().includes(i.toLowerCase())||t.content.toLowerCase().includes(i.toLowerCase())),S=()=>{f(null),n({title:"",content:"",category:v[0]||"",displayOrder:0}),m(!0)},I=t=>{f(t),n({title:t.title,content:t.content,category:t.category,displayOrder:t.displayOrder}),m(!0)},P=async()=>{try{w(!0),p?await o.templatesApi.update(p.id,{title:a.title,content:a.content,category:a.category,displayOrder:a.displayOrder}):await o.templatesApi.create({title:a.title,content:a.content,category:a.category}),m(!1),x()}catch(t){console.error("Failed to save template:",t)}finally{w(!1)}},q=async t=>{if(confirm(s("templates.confirmDelete")))try{await o.templatesApi.delete(t),x()}catch(r){console.error("Failed to delete template:",r)}},R=async t=>{try{t.isActive?await o.templatesApi.deactivate(t.id):await o.templatesApi.activate(t.id),x()}catch(r){console.error("Failed to toggle template status:",r)}},M=async t=>{try{await navigator.clipboard.writeText(t.content),C(t.id),setTimeout(()=>C(null),2e3)}catch(r){console.error("Failed to copy:",r)}},$=["{{ticketNumber}}","{{ticketTitle}}","{{userName}}","{{userFirstName}}","{{userLastName}}","{{userEmail}}","{{priority}}","{{type}}","{{status}}","{{agentName}}","{{agentFirstName}}","{{createdAt}}","{{resolvedAt}}","{{resolution}}"];return e.jsxs("div",{className:"space-y-6",children:[e.jsx(o.Breadcrumb,{items:[{label:s("title","Support"),href:"/support"},{label:s("templates.title","Response Templates")}]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[e.jsx(l.FileText,{className:"w-6 h-6"}),s("templates.title")]}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:s("templates.subtitle")})]}),e.jsxs("button",{onClick:S,className:"btn btn-primary flex items-center gap-2",children:[e.jsx(l.Plus,{className:"w-4 h-4"}),s("templates.newTemplate")]})]}),e.jsxs("div",{className:"flex flex-col md:flex-row gap-4",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(l.Search,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-secondary)]"}),e.jsx("input",{type:"text",placeholder:s("templates.searchPlaceholder"),value:i,onChange:t=>F(t.target.value),className:"input w-full pl-10"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(l.Filter,{className:"w-4 h-4 text-[var(--text-secondary)]"}),e.jsxs("select",{value:d,onChange:t=>L(t.target.value),className:"input",children:[e.jsx("option",{value:"",children:s("templates.allCategories")}),v.map(t=>e.jsx("option",{value:t,children:h(t)},t))]}),e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:b,onChange:t=>O(t.target.checked),className:"rounded border-[var(--border-color)]"}),s("templates.showInactive")]})]})]}),g&&e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx(l.Loader2,{className:"w-8 h-8 animate-spin text-[var(--color-primary-600)]"})}),!g&&y.length>0&&e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:y.map(t=>e.jsxs("div",{className:`card p-4 ${t.isActive?"":"opacity-60"}`,children:[e.jsxs("div",{className:"flex items-start justify-between mb-3",children:[e.jsx("span",{className:`text-xs px-2 py-1 rounded-[var(--radius-badge)] font-medium ${H[t.category]||"bg-[var(--bg-secondary)] text-[var(--text-secondary)]"}`,children:h(t.category)}),e.jsxs("div",{className:"flex items-center gap-1",children:[!t.isActive&&e.jsx("span",{className:"text-xs text-[var(--error-text)] mr-2",children:s("templates.inactive")}),e.jsx("button",{onClick:()=>M(t),className:"p-1.5 rounded hover:bg-[var(--bg-hover)]",title:s("templates.actions.copyContent"),children:E===t.id?e.jsx(l.Check,{className:"w-4 h-4 text-[var(--success-text)]"}):e.jsx(l.Copy,{className:"w-4 h-4"})}),e.jsx("button",{onClick:()=>I(t),className:"p-1.5 rounded hover:bg-[var(--bg-hover)]",title:s("templates.actions.edit"),children:e.jsx(l.Edit,{className:"w-4 h-4"})}),e.jsx("button",{onClick:()=>R(t),className:"p-1.5 rounded hover:bg-[var(--bg-hover)]",title:t.isActive?s("templates.actions.deactivate"):s("templates.actions.activate"),children:t.isActive?e.jsx(l.EyeOff,{className:"w-4 h-4"}):e.jsx(l.Eye,{className:"w-4 h-4"})}),e.jsx("button",{onClick:()=>q(t.id),className:"p-1.5 rounded hover:bg-[var(--bg-hover)] text-[var(--error-text)]",title:s("templates.actions.delete"),children:e.jsx(l.Trash2,{className:"w-4 h-4"})})]})]}),e.jsx("h3",{className:"font-semibold mb-2",children:t.title}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)] line-clamp-3 whitespace-pre-wrap",children:t.content}),e.jsxs("div",{className:"mt-3 pt-3 border-t border-[var(--border-color)] flex items-center justify-between text-xs text-[var(--text-secondary)]",children:[e.jsxs("span",{children:[s("templates.labels.order"),": ",t.displayOrder]}),e.jsxs("span",{children:[s("templates.labels.updated"),": ",t.updatedAt?new Date(t.updatedAt).toLocaleDateString():new Date(t.createdAt).toLocaleDateString()]})]})]},t.id))}),!g&&y.length===0&&e.jsxs("div",{className:"card p-12 text-center",children:[e.jsx(l.FileText,{className:"w-16 h-16 mx-auto mb-4 opacity-30"}),e.jsx("h3",{className:"text-lg font-medium mb-2",children:s("templates.noTemplates")}),e.jsx("p",{className:"text-[var(--text-secondary)] mb-4",children:s(i||d?"templates.adjustFilters":"templates.createFirst")}),!i&&!d&&e.jsx("button",{onClick:S,className:"btn btn-primary",children:s("templates.createTemplate")})]}),D&&e.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4",children:e.jsxs("div",{className:"bg-[var(--bg-primary)] rounded-lg shadow-xl w-full max-w-2xl max-h-[90vh] overflow-hidden",children:[e.jsxs("div",{className:"p-4 border-b border-[var(--border-color)] flex items-center justify-between",children:[e.jsx("h2",{className:"text-lg font-semibold",children:s(p?"templates.editTemplate":"templates.createTemplate")}),e.jsx("button",{onClick:()=>m(!1),className:"p-1 rounded hover:bg-[var(--bg-hover)]",children:e.jsx(l.X,{className:"w-5 h-5"})})]}),e.jsx("div",{className:"p-4 overflow-y-auto",style:{maxHeight:"calc(90vh - 140px)"},children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-1",children:[s("templates.form.title")," *"]}),e.jsx("input",{type:"text",value:a.title,onChange:t=>n({...a,title:t.target.value}),className:"input w-full",placeholder:s("templates.form.titlePlaceholder")})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-1",children:[s("templates.form.category")," *"]}),e.jsx("select",{value:a.category,onChange:t=>n({...a,category:t.target.value}),className:"input w-full",children:v.map(t=>e.jsx("option",{value:t,children:h(t)},t))})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-1",children:s("templates.form.displayOrder")}),e.jsx("input",{type:"number",min:"0",value:a.displayOrder,onChange:t=>n({...a,displayOrder:parseInt(t.target.value)||0}),className:"input w-full"})]})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-1",children:[s("templates.form.content")," *"]}),e.jsx("textarea",{value:a.content,onChange:t=>n({...a,content:t.target.value}),className:"input w-full h-48 font-mono text-sm",placeholder:s("templates.form.contentPlaceholder")})]}),e.jsxs("div",{className:"bg-[var(--bg-secondary)] p-3 rounded-lg",children:[e.jsx("h4",{className:"text-sm font-medium mb-2",children:s("templates.form.availableVariables")}),e.jsx("div",{className:"flex flex-wrap gap-2",children:$.map(t=>e.jsx("button",{type:"button",onClick:()=>{const r=document.querySelector("textarea");if(r){const u=r.selectionStart,z=r.selectionEnd,B=a.content.substring(0,u)+t+a.content.substring(z);n({...a,content:B})}else n({...a,content:a.content+t})},className:"text-xs px-2 py-1 bg-[var(--bg-primary)] rounded border border-[var(--border-color)] hover:bg-[var(--bg-hover)] font-mono",children:t},t))})]})]})}),e.jsxs("div",{className:"p-4 border-t border-[var(--border-color)] flex justify-end gap-2",children:[e.jsx("button",{onClick:()=>m(!1),className:"btn btn-secondary",children:s("templates.actions.cancel")}),e.jsxs("button",{onClick:P,disabled:!a.title||!a.content||!a.category||N,className:"btn btn-primary flex items-center gap-2",children:[N?e.jsx(l.Loader2,{className:"w-4 h-4 animate-spin"}):e.jsx(l.Save,{className:"w-4 h-4"}),s(p?"templates.actions.update":"templates.actions.create")]})]})]})})]})}exports.TemplatesPage=V;
|
|
2
|
+
//# sourceMappingURL=TemplatesPage-DT9fhlAU.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplatesPage-BDguJ401.js","sources":["../../src/pages/platform/support/TemplatesPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n FileText,\r\n Plus,\r\n Edit,\r\n Trash2,\r\n Eye,\r\n EyeOff,\r\n Loader2,\r\n Search,\r\n Filter,\r\n X,\r\n Save,\r\n Copy,\r\n Check,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n templatesApi,\r\n type ResponseTemplateDto,\r\n} from '@/services/api/supportApi';\r\n\r\nconst categoryColors: Record<string, string> = {\r\n Greeting: 'bg-[var(--info-bg)] text-[var(--info-text)]',\r\n Acknowledgment: 'bg-[var(--success-bg)] text-[var(--success-text)]',\r\n RequestInfo: 'bg-[var(--warning-bg)] text-[var(--warning-text)]',\r\n Resolution: 'bg-[var(--accent-bg)] text-[var(--accent-text)]',\r\n Escalation: 'bg-[var(--warning-bg)] text-[var(--warning-text)]',\r\n Closure: 'bg-[var(--bg-secondary)] text-[var(--text-secondary)]',\r\n};\r\n\r\nexport function TemplatesPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n\r\n // Get translated category label (fallback to raw value if not found)\r\n const getCategoryLabel = (category: string) => {\r\n const key = `templates.categories.${category}`;\r\n const translated = t(key);\r\n return translated !== key ? translated : category;\r\n };\r\n const [loading, setLoading] = useState(true);\r\n const [templates, setTemplates] = useState<ResponseTemplateDto[]>([]);\r\n const [categories, setCategories] = useState<string[]>([]);\r\n const [search, setSearch] = useState('');\r\n const [categoryFilter, setCategoryFilter] = useState('');\r\n const [showInactive, setShowInactive] = useState(false);\r\n const [showModal, setShowModal] = useState(false);\r\n const [editingTemplate, setEditingTemplate] = useState<ResponseTemplateDto | null>(null);\r\n const [saving, setSaving] = useState(false);\r\n const [copiedId, setCopiedId] = useState<string | null>(null);\r\n\r\n // Form state\r\n const [formData, setFormData] = useState<{\r\n title: string;\r\n content: string;\r\n category: string;\r\n displayOrder: number;\r\n }>({\r\n title: '',\r\n content: '',\r\n category: '',\r\n displayOrder: 0,\r\n });\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const [templatesRes, categoriesRes] = await Promise.all([\r\n templatesApi.getAll(categoryFilter || undefined, !showInactive),\r\n templatesApi.getCategories(),\r\n ]);\r\n setTemplates(templatesRes);\r\n setCategories(categoriesRes);\r\n } catch (error) {\r\n console.error('Failed to load templates:', error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [categoryFilter, showInactive]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const filteredTemplates = templates.filter((t) =>\r\n t.title.toLowerCase().includes(search.toLowerCase()) ||\r\n t.content.toLowerCase().includes(search.toLowerCase())\r\n );\r\n\r\n const handleCreate = () => {\r\n setEditingTemplate(null);\r\n setFormData({\r\n title: '',\r\n content: '',\r\n category: categories[0] || '',\r\n displayOrder: 0,\r\n });\r\n setShowModal(true);\r\n };\r\n\r\n const handleEdit = (template: ResponseTemplateDto) => {\r\n setEditingTemplate(template);\r\n setFormData({\r\n title: template.title,\r\n content: template.content,\r\n category: template.category,\r\n displayOrder: template.displayOrder,\r\n });\r\n setShowModal(true);\r\n };\r\n\r\n const handleSave = async () => {\r\n try {\r\n setSaving(true);\r\n\r\n if (editingTemplate) {\r\n await templatesApi.update(editingTemplate.id, {\r\n title: formData.title,\r\n content: formData.content,\r\n category: formData.category,\r\n displayOrder: formData.displayOrder,\r\n });\r\n } else {\r\n await templatesApi.create({\r\n title: formData.title,\r\n content: formData.content,\r\n category: formData.category,\r\n });\r\n }\r\n\r\n setShowModal(false);\r\n loadData();\r\n } catch (error) {\r\n console.error('Failed to save template:', error);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleDelete = async (id: string) => {\r\n if (!confirm(t('templates.confirmDelete'))) return;\r\n\r\n try {\r\n await templatesApi.delete(id);\r\n loadData();\r\n } catch (error) {\r\n console.error('Failed to delete template:', error);\r\n }\r\n };\r\n\r\n const handleToggleActive = async (template: ResponseTemplateDto) => {\r\n try {\r\n if (template.isActive) {\r\n await templatesApi.deactivate(template.id);\r\n } else {\r\n await templatesApi.activate(template.id);\r\n }\r\n loadData();\r\n } catch (error) {\r\n console.error('Failed to toggle template status:', error);\r\n }\r\n };\r\n\r\n const handleCopyContent = async (template: ResponseTemplateDto) => {\r\n try {\r\n await navigator.clipboard.writeText(template.content);\r\n setCopiedId(template.id);\r\n setTimeout(() => setCopiedId(null), 2000);\r\n } catch (error) {\r\n console.error('Failed to copy:', error);\r\n }\r\n };\r\n\r\n // Available variables for reference\r\n const variables = [\r\n '{{ticketNumber}}',\r\n '{{ticketTitle}}',\r\n '{{userName}}',\r\n '{{userFirstName}}',\r\n '{{userLastName}}',\r\n '{{userEmail}}',\r\n '{{priority}}',\r\n '{{type}}',\r\n '{{status}}',\r\n '{{agentName}}',\r\n '{{agentFirstName}}',\r\n '{{createdAt}}',\r\n '{{resolvedAt}}',\r\n '{{resolution}}',\r\n ];\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('templates.title', 'Response Templates') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold flex items-center gap-2\">\r\n <FileText className=\"w-6 h-6\" />\r\n {t('templates.title')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('templates.subtitle')}\r\n </p>\r\n </div>\r\n <button onClick={handleCreate} className=\"btn btn-primary flex items-center gap-2\">\r\n <Plus className=\"w-4 h-4\" />\r\n {t('templates.newTemplate')}\r\n </button>\r\n </div>\r\n\r\n {/* Filters */}\r\n <div className=\"flex flex-col md:flex-row gap-4\">\r\n <div className=\"relative flex-1\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n placeholder={t('templates.searchPlaceholder')}\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n className=\"input w-full pl-10\"\r\n />\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <Filter className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <select\r\n value={categoryFilter}\r\n onChange={(e) => setCategoryFilter(e.target.value)}\r\n className=\"input\"\r\n >\r\n <option value=\"\">{t('templates.allCategories')}</option>\r\n {categories.map((cat) => (\r\n <option key={cat} value={cat}>\r\n {getCategoryLabel(cat)}\r\n </option>\r\n ))}\r\n </select>\r\n <label className=\"flex items-center gap-2 text-sm\">\r\n <input\r\n type=\"checkbox\"\r\n checked={showInactive}\r\n onChange={(e) => setShowInactive(e.target.checked)}\r\n className=\"rounded border-[var(--border-color)]\"\r\n />\r\n {t('templates.showInactive')}\r\n </label>\r\n </div>\r\n </div>\r\n\r\n {/* Templates Grid */}\r\n {loading && (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n )}\r\n {!loading && filteredTemplates.length > 0 && (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n {filteredTemplates.map((template) => (\r\n <div\r\n key={template.id}\r\n className={`card p-4 ${!template.isActive ? 'opacity-60' : ''}`}\r\n >\r\n <div className=\"flex items-start justify-between mb-3\">\r\n <span\r\n className={`text-xs px-2 py-1 rounded-[var(--radius-badge)] font-medium ${\r\n categoryColors[template.category] || 'bg-[var(--bg-secondary)] text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n {getCategoryLabel(template.category)}\r\n </span>\r\n <div className=\"flex items-center gap-1\">\r\n {!template.isActive && (\r\n <span className=\"text-xs text-[var(--error-text)] mr-2\">{t('templates.inactive')}</span>\r\n )}\r\n <button\r\n onClick={() => handleCopyContent(template)}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)]\"\r\n title={t('templates.actions.copyContent')}\r\n >\r\n {copiedId === template.id ? (\r\n <Check className=\"w-4 h-4 text-[var(--success-text)]\" />\r\n ) : (\r\n <Copy className=\"w-4 h-4\" />\r\n )}\r\n </button>\r\n <button\r\n onClick={() => handleEdit(template)}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)]\"\r\n title={t('templates.actions.edit')}\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => handleToggleActive(template)}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)]\"\r\n title={template.isActive ? t('templates.actions.deactivate') : t('templates.actions.activate')}\r\n >\r\n {template.isActive ? (\r\n <EyeOff className=\"w-4 h-4\" />\r\n ) : (\r\n <Eye className=\"w-4 h-4\" />\r\n )}\r\n </button>\r\n <button\r\n onClick={() => handleDelete(template.id)}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)] text-[var(--error-text)]\"\r\n title={t('templates.actions.delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <h3 className=\"font-semibold mb-2\">{template.title}</h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] line-clamp-3 whitespace-pre-wrap\">\r\n {template.content}\r\n </p>\r\n\r\n <div className=\"mt-3 pt-3 border-t border-[var(--border-color)] flex items-center justify-between text-xs text-[var(--text-secondary)]\">\r\n <span>{t('templates.labels.order')}: {template.displayOrder}</span>\r\n <span>\r\n {t('templates.labels.updated')}: {template.updatedAt\r\n ? new Date(template.updatedAt).toLocaleDateString()\r\n : new Date(template.createdAt).toLocaleDateString()}\r\n </span>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n {!loading && filteredTemplates.length === 0 && (\r\n <div className=\"card p-12 text-center\">\r\n <FileText className=\"w-16 h-16 mx-auto mb-4 opacity-30\" />\r\n <h3 className=\"text-lg font-medium mb-2\">{t('templates.noTemplates')}</h3>\r\n <p className=\"text-[var(--text-secondary)] mb-4\">\r\n {search || categoryFilter\r\n ? t('templates.adjustFilters')\r\n : t('templates.createFirst')}\r\n </p>\r\n {!search && !categoryFilter && (\r\n <button onClick={handleCreate} className=\"btn btn-primary\">\r\n {t('templates.createTemplate')}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Create/Edit Modal */}\r\n {showModal && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-lg shadow-xl w-full max-w-2xl max-h-[90vh] overflow-hidden\">\r\n <div className=\"p-4 border-b border-[var(--border-color)] flex items-center justify-between\">\r\n <h2 className=\"text-lg font-semibold\">\r\n {editingTemplate ? t('templates.editTemplate') : t('templates.createTemplate')}\r\n </h2>\r\n <button\r\n onClick={() => setShowModal(false)}\r\n className=\"p-1 rounded hover:bg-[var(--bg-hover)]\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"p-4 overflow-y-auto\" style={{ maxHeight: 'calc(90vh - 140px)' }}>\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('templates.form.title')} *</label>\r\n <input\r\n type=\"text\"\r\n value={formData.title}\r\n onChange={(e) => setFormData({ ...formData, title: e.target.value })}\r\n className=\"input w-full\"\r\n placeholder={t('templates.form.titlePlaceholder')}\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('templates.form.category')} *</label>\r\n <select\r\n value={formData.category}\r\n onChange={(e) => setFormData({ ...formData, category: e.target.value })}\r\n className=\"input w-full\"\r\n >\r\n {categories.map((cat) => (\r\n <option key={cat} value={cat}>\r\n {getCategoryLabel(cat)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('templates.form.displayOrder')}</label>\r\n <input\r\n type=\"number\"\r\n min=\"0\"\r\n value={formData.displayOrder}\r\n onChange={(e) =>\r\n setFormData({ ...formData, displayOrder: parseInt(e.target.value) || 0 })\r\n }\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('templates.form.content')} *</label>\r\n <textarea\r\n value={formData.content}\r\n onChange={(e) => setFormData({ ...formData, content: e.target.value })}\r\n className=\"input w-full h-48 font-mono text-sm\"\r\n placeholder={t('templates.form.contentPlaceholder')}\r\n />\r\n </div>\r\n\r\n {/* Variables Reference */}\r\n <div className=\"bg-[var(--bg-secondary)] p-3 rounded-lg\">\r\n <h4 className=\"text-sm font-medium mb-2\">{t('templates.form.availableVariables')}</h4>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {variables.map((variable) => (\r\n <button\r\n key={variable}\r\n type=\"button\"\r\n onClick={() => {\r\n const textarea = document.querySelector('textarea');\r\n if (textarea) {\r\n const start = textarea.selectionStart;\r\n const end = textarea.selectionEnd;\r\n const newContent =\r\n formData.content.substring(0, start) +\r\n variable +\r\n formData.content.substring(end);\r\n setFormData({ ...formData, content: newContent });\r\n } else {\r\n setFormData({ ...formData, content: formData.content + variable });\r\n }\r\n }}\r\n className=\"text-xs px-2 py-1 bg-[var(--bg-primary)] rounded border border-[var(--border-color)] hover:bg-[var(--bg-hover)] font-mono\"\r\n >\r\n {variable}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"p-4 border-t border-[var(--border-color)] flex justify-end gap-2\">\r\n <button onClick={() => setShowModal(false)} className=\"btn btn-secondary\">\r\n {t('templates.actions.cancel')}\r\n </button>\r\n <button\r\n onClick={handleSave}\r\n disabled={!formData.title || !formData.content || !formData.category || saving}\r\n className=\"btn btn-primary flex items-center gap-2\"\r\n >\r\n {saving ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Save className=\"w-4 h-4\" />\r\n )}\r\n {editingTemplate ? t('templates.actions.update') : t('templates.actions.create')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["categoryColors","TemplatesPage","t","useTranslation","getCategoryLabel","category","key","translated","loading","setLoading","useState","templates","setTemplates","categories","setCategories","search","setSearch","categoryFilter","setCategoryFilter","showInactive","setShowInactive","showModal","setShowModal","editingTemplate","setEditingTemplate","saving","setSaving","copiedId","setCopiedId","formData","setFormData","loadData","useCallback","templatesRes","categoriesRes","templatesApi","error","useEffect","filteredTemplates","handleCreate","handleEdit","template","handleSave","handleDelete","id","handleToggleActive","handleCopyContent","variables","jsxs","jsx","Breadcrumb","FileText","Plus","Search","e","Filter","cat","Loader2","Check","Copy","Edit","EyeOff","Eye","Trash2","X","variable","textarea","start","end","newContent","Save"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TemplatesPage-DT9fhlAU.js","sources":["../../src/pages/platform/support/TemplatesPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n FileText,\r\n Plus,\r\n Edit,\r\n Trash2,\r\n Eye,\r\n EyeOff,\r\n Loader2,\r\n Search,\r\n Filter,\r\n X,\r\n Save,\r\n Copy,\r\n Check,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n templatesApi,\r\n type ResponseTemplateDto,\r\n} from '@/services/api/supportApi';\r\n\r\nconst categoryColors: Record<string, string> = {\r\n Greeting: 'bg-[var(--info-bg)] text-[var(--info-text)]',\r\n Acknowledgment: 'bg-[var(--success-bg)] text-[var(--success-text)]',\r\n RequestInfo: 'bg-[var(--warning-bg)] text-[var(--warning-text)]',\r\n Resolution: 'bg-[var(--accent-bg)] text-[var(--accent-text)]',\r\n Escalation: 'bg-[var(--warning-bg)] text-[var(--warning-text)]',\r\n Closure: 'bg-[var(--bg-secondary)] text-[var(--text-secondary)]',\r\n};\r\n\r\nexport function TemplatesPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n\r\n // Get translated category label (fallback to raw value if not found)\r\n const getCategoryLabel = (category: string) => {\r\n const key = `templates.categories.${category}`;\r\n const translated = t(key);\r\n return translated !== key ? translated : category;\r\n };\r\n const [loading, setLoading] = useState(true);\r\n const [templates, setTemplates] = useState<ResponseTemplateDto[]>([]);\r\n const [categories, setCategories] = useState<string[]>([]);\r\n const [search, setSearch] = useState('');\r\n const [categoryFilter, setCategoryFilter] = useState('');\r\n const [showInactive, setShowInactive] = useState(false);\r\n const [showModal, setShowModal] = useState(false);\r\n const [editingTemplate, setEditingTemplate] = useState<ResponseTemplateDto | null>(null);\r\n const [saving, setSaving] = useState(false);\r\n const [copiedId, setCopiedId] = useState<string | null>(null);\r\n\r\n // Form state\r\n const [formData, setFormData] = useState<{\r\n title: string;\r\n content: string;\r\n category: string;\r\n displayOrder: number;\r\n }>({\r\n title: '',\r\n content: '',\r\n category: '',\r\n displayOrder: 0,\r\n });\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const [templatesRes, categoriesRes] = await Promise.all([\r\n templatesApi.getAll(categoryFilter || undefined, !showInactive),\r\n templatesApi.getCategories(),\r\n ]);\r\n setTemplates(templatesRes);\r\n setCategories(categoriesRes);\r\n } catch (error) {\r\n console.error('Failed to load templates:', error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [categoryFilter, showInactive]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const filteredTemplates = templates.filter((t) =>\r\n t.title.toLowerCase().includes(search.toLowerCase()) ||\r\n t.content.toLowerCase().includes(search.toLowerCase())\r\n );\r\n\r\n const handleCreate = () => {\r\n setEditingTemplate(null);\r\n setFormData({\r\n title: '',\r\n content: '',\r\n category: categories[0] || '',\r\n displayOrder: 0,\r\n });\r\n setShowModal(true);\r\n };\r\n\r\n const handleEdit = (template: ResponseTemplateDto) => {\r\n setEditingTemplate(template);\r\n setFormData({\r\n title: template.title,\r\n content: template.content,\r\n category: template.category,\r\n displayOrder: template.displayOrder,\r\n });\r\n setShowModal(true);\r\n };\r\n\r\n const handleSave = async () => {\r\n try {\r\n setSaving(true);\r\n\r\n if (editingTemplate) {\r\n await templatesApi.update(editingTemplate.id, {\r\n title: formData.title,\r\n content: formData.content,\r\n category: formData.category,\r\n displayOrder: formData.displayOrder,\r\n });\r\n } else {\r\n await templatesApi.create({\r\n title: formData.title,\r\n content: formData.content,\r\n category: formData.category,\r\n });\r\n }\r\n\r\n setShowModal(false);\r\n loadData();\r\n } catch (error) {\r\n console.error('Failed to save template:', error);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleDelete = async (id: string) => {\r\n if (!confirm(t('templates.confirmDelete'))) return;\r\n\r\n try {\r\n await templatesApi.delete(id);\r\n loadData();\r\n } catch (error) {\r\n console.error('Failed to delete template:', error);\r\n }\r\n };\r\n\r\n const handleToggleActive = async (template: ResponseTemplateDto) => {\r\n try {\r\n if (template.isActive) {\r\n await templatesApi.deactivate(template.id);\r\n } else {\r\n await templatesApi.activate(template.id);\r\n }\r\n loadData();\r\n } catch (error) {\r\n console.error('Failed to toggle template status:', error);\r\n }\r\n };\r\n\r\n const handleCopyContent = async (template: ResponseTemplateDto) => {\r\n try {\r\n await navigator.clipboard.writeText(template.content);\r\n setCopiedId(template.id);\r\n setTimeout(() => setCopiedId(null), 2000);\r\n } catch (error) {\r\n console.error('Failed to copy:', error);\r\n }\r\n };\r\n\r\n // Available variables for reference\r\n const variables = [\r\n '{{ticketNumber}}',\r\n '{{ticketTitle}}',\r\n '{{userName}}',\r\n '{{userFirstName}}',\r\n '{{userLastName}}',\r\n '{{userEmail}}',\r\n '{{priority}}',\r\n '{{type}}',\r\n '{{status}}',\r\n '{{agentName}}',\r\n '{{agentFirstName}}',\r\n '{{createdAt}}',\r\n '{{resolvedAt}}',\r\n '{{resolution}}',\r\n ];\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('templates.title', 'Response Templates') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold flex items-center gap-2\">\r\n <FileText className=\"w-6 h-6\" />\r\n {t('templates.title')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('templates.subtitle')}\r\n </p>\r\n </div>\r\n <button onClick={handleCreate} className=\"btn btn-primary flex items-center gap-2\">\r\n <Plus className=\"w-4 h-4\" />\r\n {t('templates.newTemplate')}\r\n </button>\r\n </div>\r\n\r\n {/* Filters */}\r\n <div className=\"flex flex-col md:flex-row gap-4\">\r\n <div className=\"relative flex-1\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n placeholder={t('templates.searchPlaceholder')}\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n className=\"input w-full pl-10\"\r\n />\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <Filter className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <select\r\n value={categoryFilter}\r\n onChange={(e) => setCategoryFilter(e.target.value)}\r\n className=\"input\"\r\n >\r\n <option value=\"\">{t('templates.allCategories')}</option>\r\n {categories.map((cat) => (\r\n <option key={cat} value={cat}>\r\n {getCategoryLabel(cat)}\r\n </option>\r\n ))}\r\n </select>\r\n <label className=\"flex items-center gap-2 text-sm\">\r\n <input\r\n type=\"checkbox\"\r\n checked={showInactive}\r\n onChange={(e) => setShowInactive(e.target.checked)}\r\n className=\"rounded border-[var(--border-color)]\"\r\n />\r\n {t('templates.showInactive')}\r\n </label>\r\n </div>\r\n </div>\r\n\r\n {/* Templates Grid */}\r\n {loading && (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n )}\r\n {!loading && filteredTemplates.length > 0 && (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n {filteredTemplates.map((template) => (\r\n <div\r\n key={template.id}\r\n className={`card p-4 ${!template.isActive ? 'opacity-60' : ''}`}\r\n >\r\n <div className=\"flex items-start justify-between mb-3\">\r\n <span\r\n className={`text-xs px-2 py-1 rounded-[var(--radius-badge)] font-medium ${\r\n categoryColors[template.category] || 'bg-[var(--bg-secondary)] text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n {getCategoryLabel(template.category)}\r\n </span>\r\n <div className=\"flex items-center gap-1\">\r\n {!template.isActive && (\r\n <span className=\"text-xs text-[var(--error-text)] mr-2\">{t('templates.inactive')}</span>\r\n )}\r\n <button\r\n onClick={() => handleCopyContent(template)}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)]\"\r\n title={t('templates.actions.copyContent')}\r\n >\r\n {copiedId === template.id ? (\r\n <Check className=\"w-4 h-4 text-[var(--success-text)]\" />\r\n ) : (\r\n <Copy className=\"w-4 h-4\" />\r\n )}\r\n </button>\r\n <button\r\n onClick={() => handleEdit(template)}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)]\"\r\n title={t('templates.actions.edit')}\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => handleToggleActive(template)}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)]\"\r\n title={template.isActive ? t('templates.actions.deactivate') : t('templates.actions.activate')}\r\n >\r\n {template.isActive ? (\r\n <EyeOff className=\"w-4 h-4\" />\r\n ) : (\r\n <Eye className=\"w-4 h-4\" />\r\n )}\r\n </button>\r\n <button\r\n onClick={() => handleDelete(template.id)}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)] text-[var(--error-text)]\"\r\n title={t('templates.actions.delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <h3 className=\"font-semibold mb-2\">{template.title}</h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] line-clamp-3 whitespace-pre-wrap\">\r\n {template.content}\r\n </p>\r\n\r\n <div className=\"mt-3 pt-3 border-t border-[var(--border-color)] flex items-center justify-between text-xs text-[var(--text-secondary)]\">\r\n <span>{t('templates.labels.order')}: {template.displayOrder}</span>\r\n <span>\r\n {t('templates.labels.updated')}: {template.updatedAt\r\n ? new Date(template.updatedAt).toLocaleDateString()\r\n : new Date(template.createdAt).toLocaleDateString()}\r\n </span>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n {!loading && filteredTemplates.length === 0 && (\r\n <div className=\"card p-12 text-center\">\r\n <FileText className=\"w-16 h-16 mx-auto mb-4 opacity-30\" />\r\n <h3 className=\"text-lg font-medium mb-2\">{t('templates.noTemplates')}</h3>\r\n <p className=\"text-[var(--text-secondary)] mb-4\">\r\n {search || categoryFilter\r\n ? t('templates.adjustFilters')\r\n : t('templates.createFirst')}\r\n </p>\r\n {!search && !categoryFilter && (\r\n <button onClick={handleCreate} className=\"btn btn-primary\">\r\n {t('templates.createTemplate')}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Create/Edit Modal */}\r\n {showModal && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-lg shadow-xl w-full max-w-2xl max-h-[90vh] overflow-hidden\">\r\n <div className=\"p-4 border-b border-[var(--border-color)] flex items-center justify-between\">\r\n <h2 className=\"text-lg font-semibold\">\r\n {editingTemplate ? t('templates.editTemplate') : t('templates.createTemplate')}\r\n </h2>\r\n <button\r\n onClick={() => setShowModal(false)}\r\n className=\"p-1 rounded hover:bg-[var(--bg-hover)]\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"p-4 overflow-y-auto\" style={{ maxHeight: 'calc(90vh - 140px)' }}>\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('templates.form.title')} *</label>\r\n <input\r\n type=\"text\"\r\n value={formData.title}\r\n onChange={(e) => setFormData({ ...formData, title: e.target.value })}\r\n className=\"input w-full\"\r\n placeholder={t('templates.form.titlePlaceholder')}\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('templates.form.category')} *</label>\r\n <select\r\n value={formData.category}\r\n onChange={(e) => setFormData({ ...formData, category: e.target.value })}\r\n className=\"input w-full\"\r\n >\r\n {categories.map((cat) => (\r\n <option key={cat} value={cat}>\r\n {getCategoryLabel(cat)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('templates.form.displayOrder')}</label>\r\n <input\r\n type=\"number\"\r\n min=\"0\"\r\n value={formData.displayOrder}\r\n onChange={(e) =>\r\n setFormData({ ...formData, displayOrder: parseInt(e.target.value) || 0 })\r\n }\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('templates.form.content')} *</label>\r\n <textarea\r\n value={formData.content}\r\n onChange={(e) => setFormData({ ...formData, content: e.target.value })}\r\n className=\"input w-full h-48 font-mono text-sm\"\r\n placeholder={t('templates.form.contentPlaceholder')}\r\n />\r\n </div>\r\n\r\n {/* Variables Reference */}\r\n <div className=\"bg-[var(--bg-secondary)] p-3 rounded-lg\">\r\n <h4 className=\"text-sm font-medium mb-2\">{t('templates.form.availableVariables')}</h4>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {variables.map((variable) => (\r\n <button\r\n key={variable}\r\n type=\"button\"\r\n onClick={() => {\r\n const textarea = document.querySelector('textarea');\r\n if (textarea) {\r\n const start = textarea.selectionStart;\r\n const end = textarea.selectionEnd;\r\n const newContent =\r\n formData.content.substring(0, start) +\r\n variable +\r\n formData.content.substring(end);\r\n setFormData({ ...formData, content: newContent });\r\n } else {\r\n setFormData({ ...formData, content: formData.content + variable });\r\n }\r\n }}\r\n className=\"text-xs px-2 py-1 bg-[var(--bg-primary)] rounded border border-[var(--border-color)] hover:bg-[var(--bg-hover)] font-mono\"\r\n >\r\n {variable}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"p-4 border-t border-[var(--border-color)] flex justify-end gap-2\">\r\n <button onClick={() => setShowModal(false)} className=\"btn btn-secondary\">\r\n {t('templates.actions.cancel')}\r\n </button>\r\n <button\r\n onClick={handleSave}\r\n disabled={!formData.title || !formData.content || !formData.category || saving}\r\n className=\"btn btn-primary flex items-center gap-2\"\r\n >\r\n {saving ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Save className=\"w-4 h-4\" />\r\n )}\r\n {editingTemplate ? t('templates.actions.update') : t('templates.actions.create')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["categoryColors","TemplatesPage","t","useTranslation","getCategoryLabel","category","key","translated","loading","setLoading","useState","templates","setTemplates","categories","setCategories","search","setSearch","categoryFilter","setCategoryFilter","showInactive","setShowInactive","showModal","setShowModal","editingTemplate","setEditingTemplate","saving","setSaving","copiedId","setCopiedId","formData","setFormData","loadData","useCallback","templatesRes","categoriesRes","templatesApi","error","useEffect","filteredTemplates","handleCreate","handleEdit","template","handleSave","handleDelete","id","handleToggleActive","handleCopyContent","variables","jsxs","jsx","Breadcrumb","FileText","Plus","Search","e","Filter","cat","Loader2","Check","Copy","Edit","EyeOff","Eye","Trash2","X","variable","textarea","start","end","newContent","Save"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { jsxs as s, jsx as t } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState as c, useCallback as V, useEffect as X } from "react";
|
|
3
3
|
import { useTranslation as J } from "react-i18next";
|
|
4
4
|
import { FileText as A, Plus as K, Search as Q, Filter as U, Loader2 as F, Check as W, Copy as Y, Edit as Z, EyeOff as _, Eye as ee, Trash2 as te, X as ae, Save as se } from "lucide-react";
|
|
5
|
-
import { a4 as o, B as re } from "./index-
|
|
5
|
+
import { a4 as o, B as re } from "./index-lpIzhufD.js";
|
|
6
6
|
const le = {
|
|
7
7
|
Greeting: "bg-[var(--info-bg)] text-[var(--info-text)]",
|
|
8
8
|
Acknowledgment: "bg-[var(--success-bg)] text-[var(--success-text)]",
|
|
@@ -364,4 +364,4 @@ function me() {
|
|
|
364
364
|
export {
|
|
365
365
|
me as TemplatesPage
|
|
366
366
|
};
|
|
367
|
-
//# sourceMappingURL=TemplatesPage-
|
|
367
|
+
//# sourceMappingURL=TemplatesPage-DiEk538p.js.map
|