@atlashub/smartstack 3.21.0 → 3.25.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":"index-C53JoVNk.js","sources":["../../src/services/api/communicationsApi.ts","../../src/pages/platform/administration/workflows/EmailTemplatesListPage.tsx","../../src/pages/platform/administration/workflows/EmailTemplateCreatePage.tsx","../../src/pages/platform/administration/workflows/EmailTemplateDetailPage.tsx","../../src/components/email/EmailEditor.tsx","../../src/pages/platform/administration/workflows/EmailTemplateEditPage.tsx","../../src/pages/platform/administration/workflows/SmsTemplatesListPage.tsx","../../src/pages/platform/administration/workflows/WorkflowsListPage.tsx","../../src/pages/platform/administration/workflows/WorkflowsTriggersPage.tsx","../../src/pages/platform/administration/workflows/WorkflowCreatePage.tsx","../../src/pages/platform/administration/workflows/WorkflowDetailPage.tsx","../../src/components/platform/administration/workflows/WorkflowStepsEditor.tsx","../../src/pages/platform/administration/workflows/WorkflowEditPage.tsx","../../src/pages/platform/administration/workflows/WorkflowHistoryPage.tsx"],"sourcesContent":["import { api } from './apiClient';\r\n\r\n// Email Template Types\r\nexport interface EmailTemplateListDto {\r\n id: string;\r\n code: string;\r\n name: string;\r\n description: string | null;\r\n category: string;\r\n isSystem: boolean;\r\n isActive: boolean;\r\n applicationName: string | null;\r\n languages: string[];\r\n createdAt: string;\r\n updatedAt: string | null;\r\n}\r\n\r\nexport interface EmailTemplateDetailDto {\r\n id: string;\r\n code: string;\r\n name: string;\r\n description: string | null;\r\n category: string;\r\n isSystem: boolean;\r\n isActive: boolean;\r\n applicationId: string | null;\r\n applicationName: string | null;\r\n variablesJson: string | null;\r\n translations: EmailTemplateTranslationDto[];\r\n createdAt: string;\r\n updatedAt: string | null;\r\n}\r\n\r\nexport interface EmailTemplateTranslationDto {\r\n id: string;\r\n languageCode: string;\r\n subject: string;\r\n htmlBody: string;\r\n textBody: string | null;\r\n}\r\n\r\nexport interface CreateEmailTemplateRequest {\r\n code: string;\r\n name: string;\r\n description?: string;\r\n category: string;\r\n applicationId?: string;\r\n variablesJson?: string;\r\n}\r\n\r\nexport interface UpdateEmailTemplateRequest {\r\n name: string;\r\n description?: string;\r\n category: string;\r\n isActive: boolean;\r\n variablesJson?: string;\r\n}\r\n\r\nexport interface CreateTranslationRequest {\r\n languageCode: string;\r\n subject: string;\r\n htmlBody: string;\r\n textBody?: string;\r\n}\r\n\r\nexport interface UpdateTranslationRequest {\r\n subject: string;\r\n htmlBody: string;\r\n textBody?: string;\r\n}\r\n\r\nexport interface PreviewTemplateRequest {\r\n languageCode: string;\r\n variables?: Record<string, string>;\r\n}\r\n\r\nexport interface PreviewTemplateResponse {\r\n subject: string;\r\n htmlBody: string;\r\n textBody: string | null;\r\n}\r\n\r\n// Workflow Types\r\nexport interface WorkflowTriggerDto {\r\n id: string;\r\n code: string;\r\n name: string;\r\n triggerType: string;\r\n availableVariablesJson: string | null;\r\n}\r\n\r\nexport interface WorkflowListDto {\r\n id: string;\r\n code: string;\r\n name: string;\r\n description: string | null;\r\n triggerName: string;\r\n triggerCode: string;\r\n isSystem: boolean;\r\n isActive: boolean;\r\n priority: number;\r\n applicationName: string | null;\r\n stepCount: number;\r\n tenantId: string | null;\r\n tenantName: string | null;\r\n createdAt: string;\r\n updatedAt: string | null;\r\n}\r\n\r\nexport interface WorkflowDetailDto {\r\n id: string;\r\n code: string;\r\n name: string;\r\n description: string | null;\r\n triggerId: string;\r\n triggerName: string;\r\n triggerCode: string;\r\n triggerVariablesJson: string | null;\r\n isSystem: boolean;\r\n isActive: boolean;\r\n priority: number;\r\n applicationId: string | null;\r\n applicationName: string | null;\r\n tenantId: string | null;\r\n tenantName: string | null;\r\n steps: WorkflowStepDto[];\r\n createdAt: string;\r\n updatedAt: string | null;\r\n}\r\n\r\nexport interface WorkflowStepDto {\r\n id: string;\r\n stepOrder: number;\r\n name: string;\r\n stepType: string;\r\n isActive: boolean;\r\n emailTemplateId: string | null;\r\n emailTemplateName: string | null;\r\n delayMinutes: number | null;\r\n configurationJson: string | null;\r\n}\r\n\r\nexport interface CreateWorkflowRequest {\r\n code: string;\r\n name: string;\r\n description?: string;\r\n triggerId: string;\r\n priority?: number;\r\n applicationId?: string;\r\n}\r\n\r\nexport interface UpdateWorkflowRequest {\r\n name: string;\r\n description?: string;\r\n triggerId: string;\r\n applicationId?: string;\r\n priority: number;\r\n}\r\n\r\nexport interface CreateWorkflowStepRequest {\r\n name: string;\r\n stepType: string;\r\n emailTemplateId?: string;\r\n delayMinutes?: number;\r\n configurationJson?: string;\r\n}\r\n\r\nexport interface UpdateWorkflowStepRequest {\r\n name: string;\r\n stepOrder: number;\r\n isActive: boolean;\r\n emailTemplateId?: string;\r\n delayMinutes?: number;\r\n configurationJson?: string;\r\n}\r\n\r\n// API Service\r\nexport const communicationsApi = {\r\n // Email Templates\r\n emailTemplates: {\r\n getAll: (params?: { search?: string; category?: string; isActive?: boolean }) =>\r\n api.get<EmailTemplateListDto[]>('/api/administration/workflows/email-templates', { params }),\r\n\r\n getById: (id: string) =>\r\n api.get<EmailTemplateDetailDto>(`/api/administration/workflows/email-templates/${id}`),\r\n\r\n getByCode: (code: string) =>\r\n api.get<EmailTemplateDetailDto>(`/api/administration/workflows/email-templates/by-code/${code}`),\r\n\r\n create: (data: CreateEmailTemplateRequest) =>\r\n api.post<EmailTemplateDetailDto>('/api/administration/workflows/email-templates', data),\r\n\r\n update: (id: string, data: UpdateEmailTemplateRequest) =>\r\n api.put<EmailTemplateDetailDto>(`/api/administration/workflows/email-templates/${id}`, data),\r\n\r\n delete: (id: string) =>\r\n api.delete(`/api/administration/workflows/email-templates/${id}`),\r\n\r\n activate: (id: string) =>\r\n api.patch(`/api/administration/workflows/email-templates/${id}/activate`),\r\n\r\n deactivate: (id: string) =>\r\n api.patch(`/api/administration/workflows/email-templates/${id}/deactivate`),\r\n\r\n preview: (id: string, data: PreviewTemplateRequest) =>\r\n api.post<PreviewTemplateResponse>(`/api/administration/workflows/email-templates/${id}/preview`, data),\r\n\r\n testSend: (id: string, data: { email: string; languageCode: string; variables?: Record<string, string> }) =>\r\n api.post<{ message: string }>(`/api/administration/workflows/email-templates/${id}/test-send`, data),\r\n\r\n // Translations\r\n getTranslation: (templateId: string, languageCode: string) =>\r\n api.get<EmailTemplateTranslationDto>(`/api/administration/workflows/email-templates/${templateId}/translations/${languageCode}`),\r\n\r\n createTranslation: (templateId: string, data: CreateTranslationRequest) =>\r\n api.post<EmailTemplateTranslationDto>(`/api/administration/workflows/email-templates/${templateId}/translations`, data),\r\n\r\n updateTranslation: (templateId: string, languageCode: string, data: UpdateTranslationRequest) =>\r\n api.put<EmailTemplateTranslationDto>(`/api/administration/workflows/email-templates/${templateId}/translations/${languageCode}`, data)\r\n },\r\n\r\n // Workflows\r\n workflows: {\r\n getAll: (params?: { search?: string; triggerId?: string; isActive?: boolean }) =>\r\n api.get<WorkflowListDto[]>('/api/administration/workflows/definitions', { params }),\r\n\r\n getById: (id: string) =>\r\n api.get<WorkflowDetailDto>(`/api/administration/workflows/definitions/${id}`),\r\n\r\n create: (data: CreateWorkflowRequest) =>\r\n api.post<WorkflowDetailDto>('/api/administration/workflows/definitions', data),\r\n\r\n update: (id: string, data: UpdateWorkflowRequest) =>\r\n api.put<WorkflowDetailDto>(`/api/administration/workflows/definitions/${id}`, data),\r\n\r\n delete: (id: string) =>\r\n api.delete(`/api/administration/workflows/definitions/${id}`),\r\n\r\n activate: (id: string) =>\r\n api.patch(`/api/administration/workflows/definitions/${id}/activate`),\r\n\r\n deactivate: (id: string) =>\r\n api.patch(`/api/administration/workflows/definitions/${id}/deactivate`),\r\n\r\n // Steps\r\n addStep: (workflowId: string, data: CreateWorkflowStepRequest) =>\r\n api.post<WorkflowStepDto>(`/api/administration/workflows/definitions/${workflowId}/steps`, data),\r\n\r\n updateStep: (workflowId: string, stepId: string, data: UpdateWorkflowStepRequest) =>\r\n api.put<WorkflowStepDto>(`/api/administration/workflows/definitions/${workflowId}/steps/${stepId}`, data),\r\n\r\n deleteStep: (workflowId: string, stepId: string) =>\r\n api.delete(`/api/administration/workflows/definitions/${workflowId}/steps/${stepId}`),\r\n\r\n reorderSteps: (workflowId: string, stepOrder: string[]) =>\r\n api.post(`/api/administration/workflows/definitions/${workflowId}/steps/reorder`, { stepOrder })\r\n },\r\n\r\n // Triggers\r\n triggers: {\r\n getAll: () =>\r\n api.get<WorkflowTriggerDto[]>('/api/administration/workflows/definitions/triggers')\r\n }\r\n};\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Plus, Search, Edit2, Trash2, Eye, Mail, Languages, Loader2, Filter } from 'lucide-react';\r\nimport { communicationsApi, type EmailTemplateListDto } from '@/services/api/communicationsApi';\r\nimport { ViewToggle, StatusBadge, Pagination, type ViewMode } from '@/components/ui/DataView';\r\nimport { TemplateCard } from '@/components/ui/EntityCard';\r\nimport { PageHeader } from '@/components/ui/PageHeader';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\nexport function EmailTemplatesListPage(): ReactElement {\r\n const { t } = useTranslation('communications');\r\n const navigate = useNavigate();\r\n const { currentTenant, isGlobalView } = useTenant();\r\n const [templates, setTemplates] = useState<EmailTemplateListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [search, setSearch] = useState('');\r\n const [viewMode, setViewMode] = useState<ViewMode>('table');\r\n const [page, setPage] = useState(1);\r\n const pageSize = 20;\r\n\r\n const loadTemplates = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const data = await communicationsApi.emailTemplates.getAll({ search: search || undefined });\r\n setTemplates(Array.isArray(data) ? data : []);\r\n } catch (err) {\r\n console.error('Failed to load templates:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n // TENANT ISOLATION: Re-fetch when tenant changes\r\n }, [search, currentTenant?.id, isGlobalView]);\r\n\r\n useEffect(() => {\r\n loadTemplates();\r\n }, [loadTemplates]);\r\n\r\n const handleSearch = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setPage(1);\r\n loadTemplates();\r\n };\r\n\r\n const handleDelete = async (template: EmailTemplateListDto, e?: React.MouseEvent) => {\r\n e?.stopPropagation();\r\n if (template.isSystem) {\r\n alert(t('emailTemplates.cannotDeleteSystem'));\r\n return;\r\n }\r\n if (!confirm(t('emailTemplates.confirmDelete', { name: template.name }))) return;\r\n\r\n try {\r\n await communicationsApi.emailTemplates.delete(template.id);\r\n loadTemplates();\r\n } catch (err) {\r\n console.error('Failed to delete template:', err);\r\n }\r\n };\r\n\r\n // Filter for current page\r\n const startIndex = (page - 1) * pageSize;\r\n const paginatedTemplates = templates.slice(startIndex, startIndex + pageSize);\r\n const totalPages = Math.ceil(templates.length / pageSize);\r\n\r\n // Grouper par categorie pour le Kanban\r\n const templatesByCategory = {\r\n transactional: templates.filter(t => t.category === 'transactional'),\r\n notification: templates.filter(t => t.category === 'notification'),\r\n marketing: templates.filter(t => t.category === 'marketing'),\r\n system: templates.filter(t => t.category === 'system')\r\n };\r\n\r\n const getCategoryLabel = (category: string) => {\r\n return t(`emailTemplates.categories.${category.toLowerCase()}`) || category;\r\n };\r\n\r\n const renderTableView = () => (\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-[var(--bg-secondary)]\">\r\n <th className=\"w-12 px-4 py-3\">\r\n <input type=\"checkbox\" className=\"w-4 h-4 rounded border-[var(--border-color)]\" />\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('emailTemplates.columns.code')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('emailTemplates.columns.name')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden md:table-cell\">{t('emailTemplates.columns.category')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">{t('emailTemplates.columns.translations')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('emailTemplates.columns.status')}</th>\r\n <th className=\"w-32 px-4 py-3\"></th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {loading && (\r\n <tr>\r\n <td colSpan={7} className=\"px-6 py-16 text-center\">\r\n <div className=\"flex flex-col items-center gap-3\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-primary-500\" />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{t('common.loading', { defaultValue: 'Chargement...' })}</span>\r\n </div>\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && paginatedTemplates.length === 0 && (\r\n <tr>\r\n <td colSpan={7} className=\"px-6 py-16 text-center\">\r\n <div className=\"flex flex-col items-center gap-3\">\r\n <div className=\"w-16 h-16 rounded-full bg-[var(--bg-secondary)] flex items-center justify-center\">\r\n <Mail className=\"w-8 h-8 text-[var(--text-tertiary)]\" />\r\n </div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('emailTemplates.noResults')}</span>\r\n </div>\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && paginatedTemplates.length > 0 && (\r\n paginatedTemplates.map(template => (\r\n <tr\r\n key={template.id}\r\n className=\"group hover:bg-[var(--bg-hover)] transition-all cursor-pointer\"\r\n onClick={() => navigate(`/administration/workflows/email-templates/${template.id}`)}\r\n >\r\n <td className=\"px-4 py-3\" onClick={e => e.stopPropagation()}>\r\n <input type=\"checkbox\" className=\"w-4 h-4 rounded border-[var(--border-color)]\" />\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-2\">\r\n <Mail className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <code className=\"text-sm bg-[var(--bg-secondary)] px-2 py-0.5 rounded text-[var(--text-primary)]\">{template.code}</code>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"min-w-0\">\r\n <p className=\"font-medium text-[var(--text-primary)] group-hover:text-primary-600 transition-colors\">\r\n {template.name}\r\n </p>\r\n {template.isSystem && (\r\n <span className=\"inline-flex items-center gap-1 mt-1 px-2 py-0.5 rounded-[var(--radius-badge)] text-xs font-medium bg-[var(--info-bg)] text-[var(--info-text)] border border-[var(--info-border)]\">\r\n System\r\n </span>\r\n )}\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 hidden md:table-cell\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{getCategoryLabel(template.category)}</span>\r\n </td>\r\n <td className=\"px-4 py-3 hidden lg:table-cell\">\r\n <div className=\"flex items-center gap-1.5 text-[var(--text-secondary)]\">\r\n <Languages className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm\">{template.languages.length}</span>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <StatusBadge\r\n status={template.isActive ? 'active' : 'inactive'}\r\n label={template.isActive ? t('emailTemplates.active') : t('emailTemplates.inactive')}\r\n />\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center justify-end gap-1\" onClick={e => e.stopPropagation()}>\r\n <button\r\n onClick={() => navigate(`/administration/workflows/email-templates/${template.id}`)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-primary-600 hover:bg-[var(--accent-bg)] transition-all\"\r\n title={t('emailTemplates.view')}\r\n >\r\n <Eye className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={(e) => { e.stopPropagation(); navigate(`/administration/workflows/email-templates/${template.id}/edit`); }}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--info-text)] hover:bg-[var(--info-bg)] transition-all\"\r\n title={t('emailTemplates.edit.title')}\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n </button>\r\n {!template.isSystem && (\r\n <button\r\n onClick={(e) => handleDelete(template, e)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n title={t('emailTemplates.delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n </td>\r\n </tr>\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n\r\n const getCardsViewContent = () => {\r\n if (loading) {\r\n return (\r\n <div className=\"col-span-full flex flex-col items-center justify-center py-16\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n <span className=\"mt-3 text-sm text-[var(--text-secondary)]\">{t('common.loading', { defaultValue: 'Chargement...' })}</span>\r\n </div>\r\n );\r\n }\r\n if (paginatedTemplates.length === 0) {\r\n return (\r\n <div className=\"col-span-full flex flex-col items-center justify-center py-16\">\r\n <div className=\"w-16 h-16 rounded-lg bg-[var(--color-accent-50)] flex items-center justify-center mb-3\">\r\n <Mail className=\"w-8 h-8 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('emailTemplates.noResults')}</span>\r\n </div>\r\n );\r\n }\r\n return (\r\n paginatedTemplates.map(template => (\r\n <TemplateCard\r\n key={template.id}\r\n name={template.name}\r\n code={template.code}\r\n category={getCategoryLabel(template.category)}\r\n isActive={template.isActive}\r\n isSystem={template.isSystem}\r\n icon={Mail}\r\n iconColor=\"var(--color-accent-500)\"\r\n translationsCount={template.languages.length}\r\n onClick={() => navigate(`/administration/workflows/email-templates/${template.id}`)}\r\n onEdit={() => navigate(`/administration/workflows/email-templates/${template.id}/edit`)}\r\n onDelete={() => handleDelete(template)}\r\n labels={{\r\n activeLabel: t('emailTemplates.active'),\r\n inactiveLabel: t('emailTemplates.inactive'),\r\n systemLabel: 'System',\r\n editLabel: t('emailTemplates.edit.title'),\r\n deleteLabel: t('emailTemplates.delete'),\r\n }}\r\n />\r\n ))\r\n );\r\n };\r\n\r\n const renderCardsView = () => (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {getCardsViewContent()}\r\n </div>\r\n );\r\n\r\n const getCategoryDotColor = (category: string): string => {\r\n if (category === 'transactional') return 'bg-[var(--success-dot)]';\r\n if (category === 'notification') return 'bg-[var(--warning-dot)]';\r\n if (category === 'marketing') return 'bg-blue-500';\r\n return 'bg-[var(--text-muted)]';\r\n };\r\n\r\n const renderTemplateCard = (template: EmailTemplateListDto) => (\r\n <button\r\n type=\"button\"\r\n key={template.id}\r\n onClick={() => navigate(`/administration/workflows/email-templates/${template.id}`)}\r\n className=\"bg-[var(--bg-card)] border-2 border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)] rounded-[var(--radius-card)] overflow-hidden transition-all hover:shadow-md hover:border-[var(--color-accent-400)] cursor-pointer text-left w-full\"\r\n >\r\n <div className=\"bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20 p-3 border-b border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-8 h-8 rounded-lg bg-[var(--color-accent-500)] flex items-center justify-center shadow-lg\">\r\n <Mail className=\"w-4 h-4 text-white\" />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"font-medium text-sm text-[var(--text-primary)] truncate\">{template.name}</p>\r\n <code className=\"text-xs text-[var(--text-secondary)]\">{template.code}</code>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"p-3\">\r\n <div className=\"flex items-center justify-between\">\r\n <span className={`inline-flex items-center gap-1.5 px-2 py-0.5 text-xs rounded-full font-medium ${\r\n template.isActive\r\n ? 'bg-[var(--success-bg)] text-[var(--success-text)]'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`}>\r\n <span className={`w-1.5 h-1.5 rounded-full ${template.isActive ? 'bg-[var(--success-dot)]' : 'bg-[var(--text-muted)]'}`} />\r\n {template.isActive ? t('emailTemplates.active') : t('emailTemplates.inactive')}\r\n </span>\r\n <div className=\"flex items-center gap-1 text-[var(--text-tertiary)]\">\r\n <Languages className=\"w-3 h-3\" />\r\n <span className=\"text-xs\">{template.languages.length}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </button>\r\n );\r\n\r\n const renderKanbanView = () => (\r\n <div className=\"flex gap-6 overflow-x-auto pb-4\">\r\n {loading ? (\r\n <div className=\"flex-1 flex flex-col items-center justify-center py-16\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n <span className=\"mt-3 text-sm text-[var(--text-secondary)]\">{t('common.loading', { defaultValue: 'Chargement...' })}</span>\r\n </div>\r\n ) : (\r\n <>\r\n {Object.entries(templatesByCategory).map(([category, categoryTemplates]) => (\r\n <div key={category} className=\"min-w-[280px] flex-1 rounded-lg p-2\">\r\n <div className=\"flex items-center gap-2 mb-4\">\r\n <span className={`w-2 h-2 rounded-full ${getCategoryDotColor(category)}`} />\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">{getCategoryLabel(category)}</h3>\r\n <span className=\"px-2 py-0.5 rounded-full text-xs font-medium bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {categoryTemplates.length}\r\n </span>\r\n </div>\r\n <div className=\"space-y-3 min-h-[100px]\">\r\n {categoryTemplates.map(renderTemplateCard)}\r\n {categoryTemplates.length === 0 && (\r\n <div className=\"border-2 border-dashed border-[var(--color-accent-200)] rounded-lg p-6 text-center\">\r\n <Mail className=\"w-6 h-6 mx-auto mb-2 text-[var(--text-muted)]\" />\r\n <p className=\"text-xs text-[var(--text-muted)]\">{t('emailTemplates.noResults')}</p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </>\r\n )}\r\n </div>\r\n );\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('communications.title', 'Communications'), href: '/administration/communications' },\r\n { label: t('communications.emailTemplates', 'Email Templates') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <PageHeader\r\n title={t('emailTemplates.title')}\r\n subtitle={`${templates.length} templates`}\r\n icon={<Mail className=\"w-6 h-6\" />}\r\n actions={\r\n <button\r\n onClick={() => navigate('/administration/workflows/email-templates/create')}\r\n className=\"btn btn-primary\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('emailTemplates.create')}\r\n </button>\r\n }\r\n />\r\n\r\n {/* Toolbar */}\r\n <div className=\"card p-4\">\r\n <div className=\"flex flex-col md:flex-row md:items-center justify-between gap-4\">\r\n {/* Search & Filters */}\r\n <form onSubmit={handleSearch} className=\"flex items-center gap-3 flex-1\">\r\n <div className=\"relative flex-1 max-w-md\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-muted)]\" />\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={e => setSearch(e.target.value)}\r\n placeholder={t('emailTemplates.searchPlaceholder')}\r\n className=\"input w-full pl-10\"\r\n />\r\n </div>\r\n <button type=\"submit\" className=\"btn btn-secondary\">\r\n <Filter className=\"w-4 h-4\" />\r\n <span className=\"hidden sm:inline\">Filtres</span>\r\n </button>\r\n </form>\r\n\r\n {/* View Toggle */}\r\n <ViewToggle\r\n viewMode={viewMode}\r\n onChange={setViewMode}\r\n tableLabel=\"Table\"\r\n cardsLabel=\"Cards\"\r\n kanbanLabel=\"Kanban\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Content based on view mode */}\r\n {viewMode === 'table' && renderTableView()}\r\n {viewMode === 'cards' && renderCardsView()}\r\n {viewMode === 'kanban' && renderKanbanView()}\r\n\r\n {/* Pagination (only for table and cards) */}\r\n {viewMode !== 'kanban' && templates.length > 0 && (\r\n <Pagination\r\n page={page}\r\n totalPages={totalPages}\r\n totalCount={templates.length}\r\n pageSize={pageSize}\r\n onPageChange={setPage}\r\n itemLabel=\"templates\"\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ArrowLeft, Save, Loader2, Mail } from 'lucide-react';\r\nimport { communicationsApi } from '@/services/api/communicationsApi';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\ninterface CreateTemplateForm {\r\n code: string;\r\n name: string;\r\n description: string;\r\n category: string;\r\n}\r\n\r\nexport function EmailTemplateCreatePage(): ReactElement {\r\n const { t } = useTranslation('communications');\r\n const navigate = useNavigate();\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [formData, setFormData] = useState<CreateTemplateForm>({\r\n code: '',\r\n name: '',\r\n description: '',\r\n category: 'transactional'\r\n });\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setSaving(true);\r\n setError(null);\r\n\r\n try {\r\n const data = await communicationsApi.emailTemplates.create({\r\n code: formData.code,\r\n name: formData.name,\r\n description: formData.description || undefined,\r\n category: formData.category\r\n });\r\n navigate(`/administration/email-templates/${data.id}`);\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'An error occurred while creating the template';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\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('header.title'), href: '/administration' },\r\n { label: t('communications.title', 'Communications'), href: '/administration/communications' },\r\n { label: t('communications.emailTemplates', 'Email Templates'), href: '/administration/workflows/email-templates' },\r\n { label: t('emailTemplates.create', 'Create') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"max-w-2xl\">\r\n <button\r\n onClick={() => navigate('/administration/email-templates/list')}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors mb-4\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('emailTemplates.backToList')}\r\n </button>\r\n\r\n <div className=\"flex items-center gap-4\">\r\n <div className=\"w-12 h-12 rounded-full bg-gradient-to-br from-violet-500 to-purple-500 flex items-center justify-center shadow-lg shadow-primary-500/20\">\r\n <Mail className=\"w-6 h-6 text-white\" />\r\n </div>\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{t('emailTemplates.createTitle')}</h1>\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">{t('emailTemplates.description')}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Form */}\r\n <form onSubmit={handleSubmit} className=\"space-y-6 max-w-2xl\">\r\n {error && (\r\n <div className=\"p-4 rounded-lg bg-[var(--error-bg)] text-[var(--error-text)] text-sm border border-[var(--error-border)]\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div className=\"card p-6 space-y-5\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1.5\">\r\n {t('emailTemplates.form.code')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={formData.code}\r\n onChange={(e) => setFormData(prev => ({ ...prev, code: e.target.value.toLowerCase().replace(/[^a-z0-9-]/g, '-') }))}\r\n placeholder=\"e.g., welcome-email\"\r\n className=\"input w-full\"\r\n />\r\n <p className=\"text-xs text-[var(--text-muted)] mt-1.5\">{t('emailTemplates.form.codeHelp')}</p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1.5\">\r\n {t('emailTemplates.form.name')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={formData.name}\r\n onChange={(e) => setFormData(prev => ({ ...prev, name: e.target.value }))}\r\n placeholder=\"e.g., Welcome Email\"\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1.5\">\r\n {t('emailTemplates.form.description')}\r\n </label>\r\n <textarea\r\n value={formData.description}\r\n onChange={(e) => setFormData(prev => ({ ...prev, description: e.target.value }))}\r\n rows={3}\r\n placeholder={t('emailTemplates.form.descriptionPlaceholder')}\r\n className=\"input w-full resize-none\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1.5\">\r\n {t('emailTemplates.form.category')}\r\n </label>\r\n <select\r\n value={formData.category}\r\n onChange={(e) => setFormData(prev => ({ ...prev, category: e.target.value }))}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"transactional\">{t('emailTemplates.categories.transactional')}</option>\r\n <option value=\"marketing\">{t('emailTemplates.categories.marketing')}</option>\r\n <option value=\"notification\">{t('emailTemplates.categories.notification')}</option>\r\n <option value=\"system\">{t('emailTemplates.categories.system')}</option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n {/* Actions */}\r\n <div className=\"flex justify-end gap-3\">\r\n <button\r\n type=\"button\"\r\n onClick={() => navigate('/administration/email-templates/list')}\r\n className=\"btn btn-secondary\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={saving}\r\n className=\"btn btn-primary disabled:opacity-50\"\r\n >\r\n {saving ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useParams, useNavigate, Link, useSearchParams } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n ArrowLeft,\r\n Settings,\r\n Loader2,\r\n Edit,\r\n Trash2,\r\n Play,\r\n Pause,\r\n AlertTriangle,\r\n CheckCircle,\r\n Languages,\r\n Mail,\r\n Eye,\r\n Plus,\r\n Code,\r\n ChevronDown,\r\n ChevronUp,\r\n FileText,\r\n Copy,\r\n Check\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n communicationsApi,\r\n type EmailTemplateDetailDto,\r\n type EmailTemplateTranslationDto\r\n} from '@/services/api/communicationsApi';\r\n\r\ntype TabId = 'info' | 'preview' | 'translations';\r\n\r\ninterface TemplateVariable {\r\n name: string;\r\n description?: string;\r\n type?: string;\r\n required?: boolean;\r\n}\r\n\r\n// Default user variables available in all email templates (from User entity, excluding technical fields)\r\nconst DEFAULT_USER_VARIABLES: TemplateVariable[] = [\r\n // User Identity\r\n { name: 'userName', description: 'Nom complet de l\\'utilisateur' },\r\n { name: 'firstName', description: 'Prenom' },\r\n { name: 'lastName', description: 'Nom de famille' },\r\n { name: 'displayName', description: 'Nom d\\'affichage (Entra)' },\r\n { name: 'email', description: 'Adresse email' },\r\n // Contact\r\n { name: 'phoneNumber', description: 'Telephone fixe' },\r\n { name: 'mobilePhone', description: 'Telephone mobile' },\r\n // Location\r\n { name: 'city', description: 'Ville' },\r\n { name: 'country', description: 'Pays' },\r\n { name: 'streetAddress', description: 'Adresse' },\r\n { name: 'postalCode', description: 'Code postal' },\r\n // Organization\r\n { name: 'company', description: 'Nom de l\\'entreprise' },\r\n { name: 'department', description: 'Departement' },\r\n { name: 'jobTitle', description: 'Fonction/Poste' },\r\n { name: 'office', description: 'Bureau/Site' },\r\n { name: 'employeeId', description: 'Numero d\\'employe' },\r\n { name: 'managerName', description: 'Nom du manager' },\r\n];\r\n\r\n// Common email template variables (actions, links, etc.)\r\nconst DEFAULT_EMAIL_VARIABLES: TemplateVariable[] = [\r\n { name: 'company_logo_url', description: 'URL du logo de l\\'entreprise' },\r\n { name: 'appName', description: 'Nom de l\\'application' },\r\n { name: 'resetUrl', description: 'Lien de reinitialisation du mot de passe' },\r\n { name: 'confirmUrl', description: 'Lien de confirmation d\\'email' },\r\n { name: 'adminName', description: 'Nom de l\\'administrateur (action admin)' },\r\n { name: 'expiresIn', description: 'Delai d\\'expiration du lien' },\r\n { name: 'currentDate', description: 'Date actuelle' },\r\n { name: 'currentYear', description: 'Annee en cours' },\r\n];\r\n\r\nexport function EmailTemplateDetailPage(): ReactElement | null {\r\n const { t, i18n } = useTranslation('communications');\r\n const { id: templateId } = useParams<{ id: string }>();\r\n const navigate = useNavigate();\r\n\r\n const [template, setTemplate] = useState<EmailTemplateDetailDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n const activeTab = (searchParams.get('tab') as TabId) || 'preview';\r\n const setActiveTab = (tab: TabId) => setSearchParams({ tab });\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n const [actionLoading, setActionLoading] = useState(false);\r\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\r\n const [previewLang, setPreviewLang] = useState<string | null>(null);\r\n const [previewContent, setPreviewContent] = useState<{ subject: string; htmlBody: string } | null>(null);\r\n const [previewLoading, setPreviewLoading] = useState(false);\r\n const [selectedPreviewLanguage, setSelectedPreviewLanguage] = useState<string>('');\r\n\r\n const loadTemplate = useCallback(async () => {\r\n if (!templateId) return;\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const data = await communicationsApi.emailTemplates.getById(templateId);\r\n setTemplate(data);\r\n } catch (err) {\r\n console.error('Failed to load template:', err);\r\n setError(t('emailTemplates.detail.errors.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [templateId, t]);\r\n\r\n useEffect(() => {\r\n loadTemplate();\r\n }, [loadTemplate]);\r\n\r\n const handleActivate = async () => {\r\n if (!templateId || !template) return;\r\n try {\r\n setActionLoading(true);\r\n setError(null);\r\n await communicationsApi.emailTemplates.update(templateId, {\r\n name: template.name,\r\n description: template.description || undefined,\r\n category: template.category,\r\n isActive: true,\r\n });\r\n setSuccess(t('emailTemplates.detail.success.activated'));\r\n loadTemplate();\r\n } catch (err) {\r\n console.error('Failed to activate template:', err);\r\n setError(t('emailTemplates.detail.errors.activateFailed'));\r\n } finally {\r\n setActionLoading(false);\r\n }\r\n };\r\n\r\n const handleDeactivate = async () => {\r\n if (!templateId || !template) return;\r\n try {\r\n setActionLoading(true);\r\n setError(null);\r\n await communicationsApi.emailTemplates.update(templateId, {\r\n name: template.name,\r\n description: template.description || undefined,\r\n category: template.category,\r\n isActive: false,\r\n });\r\n setSuccess(t('emailTemplates.detail.success.deactivated'));\r\n loadTemplate();\r\n } catch (err) {\r\n console.error('Failed to deactivate template:', err);\r\n setError(t('emailTemplates.detail.errors.deactivateFailed'));\r\n } finally {\r\n setActionLoading(false);\r\n }\r\n };\r\n\r\n const handleDelete = async () => {\r\n if (!templateId || !template) return;\r\n\r\n if (template.isSystem) {\r\n setError(t('emailTemplates.cannotDeleteSystem'));\r\n return;\r\n }\r\n\r\n try {\r\n setActionLoading(true);\r\n setError(null);\r\n await communicationsApi.emailTemplates.delete(templateId);\r\n navigate('/administration/workflows/email-templates');\r\n } catch (err) {\r\n console.error('Failed to delete template:', err);\r\n setError(t('emailTemplates.detail.errors.deleteFailed'));\r\n setShowDeleteConfirm(false);\r\n } finally {\r\n setActionLoading(false);\r\n }\r\n };\r\n\r\n const handlePreview = async (languageCode: string) => {\r\n if (!templateId) return;\r\n try {\r\n setPreviewLoading(true);\r\n setPreviewLang(languageCode);\r\n const preview = await communicationsApi.emailTemplates.preview(templateId, { languageCode });\r\n setPreviewContent({ subject: preview.subject, htmlBody: preview.htmlBody });\r\n } catch (err) {\r\n console.error('Failed to preview template:', err);\r\n setError(t('emailTemplates.detail.errors.previewFailed'));\r\n } finally {\r\n setPreviewLoading(false);\r\n }\r\n };\r\n\r\n const closePreview = () => {\r\n setPreviewLang(null);\r\n setPreviewContent(null);\r\n };\r\n\r\n // Parse variables from JSON or use defaults\r\n const templateVariables = useMemo((): { user: TemplateVariable[]; email: TemplateVariable[]; custom: TemplateVariable[] } => {\r\n let customVariables: TemplateVariable[] = [];\r\n\r\n if (template?.variablesJson) {\r\n try {\r\n const parsed = JSON.parse(template.variablesJson);\r\n if (Array.isArray(parsed)) {\r\n customVariables = parsed.filter(v => v?.name);\r\n } else if (typeof parsed === 'object') {\r\n customVariables = Object.entries(parsed)\r\n .filter(([name]) => name && name !== 'undefined')\r\n .map(([name, value]) => ({\r\n name,\r\n description: typeof value === 'object' && value !== null ? (value as Record<string, unknown>).description as string : undefined,\r\n type: typeof value === 'object' && value !== null ? (value as Record<string, unknown>).type as string : undefined,\r\n required: typeof value === 'object' && value !== null ? (value as Record<string, unknown>).required as boolean : false\r\n }));\r\n }\r\n } catch {\r\n // Invalid JSON, ignore\r\n }\r\n }\r\n\r\n return {\r\n user: DEFAULT_USER_VARIABLES,\r\n email: DEFAULT_EMAIL_VARIABLES,\r\n custom: customVariables\r\n };\r\n }, [template?.variablesJson]);\r\n\r\n // Auto-select preview language based on current UI language\r\n useEffect(() => {\r\n if (template?.translations && template.translations.length > 0) {\r\n const currentLang = i18n.language.split('-')[0];\r\n const matchingTranslation = template.translations.find(tr => tr.languageCode === currentLang);\r\n setSelectedPreviewLanguage(matchingTranslation?.languageCode || template.translations[0].languageCode);\r\n }\r\n }, [template?.translations, i18n.language]);\r\n\r\n // Get current translation for preview\r\n const currentPreviewTranslation = useMemo(() => {\r\n if (!template?.translations || !selectedPreviewLanguage) return null;\r\n return template.translations.find(tr => tr.languageCode === selectedPreviewLanguage) || null;\r\n }, [template?.translations, selectedPreviewLanguage]);\r\n\r\n const tabs: { id: TabId; label: string; icon: React.ReactNode }[] = [\r\n { id: 'preview', label: t('emailTemplates.detail.tabs.preview'), icon: <Eye className=\"w-4 h-4\" /> },\r\n { id: 'info', label: t('emailTemplates.detail.tabs.info'), icon: <Settings className=\"w-4 h-4\" /> },\r\n { id: 'translations', label: t('emailTemplates.detail.tabs.translations'), icon: <Languages className=\"w-4 h-4\" /> }\r\n ];\r\n\r\n const getCategoryLabel = (category: string) => {\r\n return t(`emailTemplates.categories.${category.toLowerCase()}`) || category;\r\n };\r\n\r\n const getLanguageLabel = (code: string) => {\r\n return t(`languages.${code}`, { defaultValue: code.toUpperCase() });\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (!template) {\r\n return (\r\n <div className=\"text-center py-12\">\r\n <p className=\"text-[var(--text-secondary)]\">{t('emailTemplates.detail.notFound')}</p>\r\n <button\r\n onClick={() => navigate('/administration/workflows/email-templates')}\r\n className=\"mt-4 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white\"\r\n >\r\n {t('emailTemplates.backToList')}\r\n </button>\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('header.title'), href: '/administration' },\r\n { label: t('communications.title', 'Communications'), href: '/administration/communications' },\r\n { label: t('communications.emailTemplates', 'Email Templates'), href: '/administration/workflows/email-templates' },\r\n { label: template?.name || '' }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center gap-4\">\r\n <button\r\n onClick={() => navigate('/administration/workflows/email-templates')}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3\">\r\n <h1 className=\"text-xl sm:text-2xl font-bold text-[var(--text-primary)]\">{template.name}</h1>\r\n {template.isSystem && (\r\n <span className=\"flex items-center gap-1 px-2 py-1 rounded-[var(--radius-badge)] text-xs bg-[var(--bg-tertiary)] text-[var(--text-secondary)] border border-[var(--border-color)]\">\r\n {t('emailTemplates.detail.system')}\r\n </span>\r\n )}\r\n <span className={`px-2 py-1 rounded-[var(--radius-badge)] text-xs font-medium ${\r\n template.isActive\r\n ? 'bg-[var(--success-bg)] text-[var(--success-text)] border border-[var(--success-border)]'\r\n : 'bg-[var(--error-bg)] text-[var(--error-text)] border border-[var(--error-border)]'\r\n }`}>\r\n {template.isActive ? t('emailTemplates.active') : t('emailTemplates.inactive')}\r\n </span>\r\n </div>\r\n {template.description && (\r\n <p className=\"text-sm sm:text-base text-[var(--text-secondary)] mt-1\">{template.description}</p>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => navigate(`/administration/workflows/email-templates/${templateId}/edit`)}\r\n className=\"flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] transition-colors\"\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n <span className=\"hidden sm:inline\">{t('emailTemplates.edit.title')}</span>\r\n </button>\r\n <button\r\n onClick={template.isActive ? handleDeactivate : handleActivate}\r\n disabled={actionLoading}\r\n className={`flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] border transition-colors ${\r\n template.isActive\r\n ? 'border-[var(--warning-border)] text-[var(--warning-text)] hover:bg-[var(--warning-bg)]'\r\n : 'border-[var(--success-border)] text-[var(--success-text)] hover:bg-[var(--success-bg)]'\r\n }`}\r\n >\r\n {actionLoading && (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n )}\r\n {!actionLoading && template.isActive && (\r\n <Pause className=\"w-4 h-4\" />\r\n )}\r\n {!actionLoading && !template.isActive && (\r\n <Play className=\"w-4 h-4\" />\r\n )}\r\n <span className=\"hidden sm:inline\">\r\n {template.isActive ? t('emailTemplates.deactivate') : t('emailTemplates.activate')}\r\n </span>\r\n </button>\r\n <button\r\n onClick={() => setShowDeleteConfirm(true)}\r\n className=\"flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] border border-[var(--error-border)] text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-colors\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n <span className=\"hidden sm:inline\">{t('emailTemplates.delete')}</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Alerts */}\r\n {error && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)] text-[var(--error-text)] flex items-center gap-2\">\r\n <AlertTriangle className=\"w-5 h-5 flex-shrink-0\" />\r\n {error}\r\n </div>\r\n )}\r\n {success && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--success-bg)] border border-[var(--success-border)] text-[var(--success-text)] flex items-center gap-2\">\r\n <CheckCircle className=\"w-5 h-5 flex-shrink-0\" />\r\n {success}\r\n </div>\r\n )}\r\n\r\n\r\n {/* Tabs */}\r\n <div className=\"flex gap-1 p-1 bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n {tabs.map(tab => (\r\n <button\r\n key={tab.id}\r\n onClick={() => setActiveTab(tab.id)}\r\n className={`flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium transition-colors ${\r\n activeTab === tab.id\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n {tab.icon}\r\n <span className=\"hidden sm:inline\">{tab.label}</span>\r\n {tab.id === 'translations' && (\r\n <span className={`ml-1 px-1.5 py-0.5 rounded text-xs ${\r\n activeTab === tab.id ? 'bg-white/20' : 'bg-[var(--bg-tertiary)]'\r\n }`}>\r\n {template.translations.length}\r\n </span>\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div className=\"bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4 sm:p-6\">\r\n {/* Preview Tab */}\r\n {activeTab === 'preview' && (\r\n <div className=\"space-y-6\">\r\n {/* Language Selector */}\r\n {template.translations.length > 0 ? (\r\n <div className=\"flex items-center justify-between flex-wrap gap-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <label className=\"text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('emailTemplates.detail.previewLanguage', { defaultValue: 'Langue' })}:\r\n </label>\r\n <div className=\"flex gap-1 p-1 bg-[var(--bg-tertiary)] rounded-[var(--radius-button)]\">\r\n {template.translations.map(tr => (\r\n <button\r\n key={tr.languageCode}\r\n onClick={() => setSelectedPreviewLanguage(tr.languageCode)}\r\n className={`px-3 py-1.5 rounded text-sm font-medium transition-colors ${\r\n selectedPreviewLanguage === tr.languageCode\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n {getLanguageLabel(tr.languageCode)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n <button\r\n onClick={() => navigate(`/administration/workflows/email-templates/${templateId}/edit`)}\r\n className=\"flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] transition-colors\"\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n {t('emailTemplates.edit.title')}\r\n </button>\r\n </div>\r\n ) : (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n <Mail className=\"w-12 h-12 mx-auto mb-4 opacity-50\" />\r\n <p className=\"mb-4\">{t('emailTemplates.detail.noTranslations')}</p>\r\n <Link\r\n to={`/administration/workflows/email-templates/${templateId}/edit`}\r\n className=\"inline-flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('emailTemplates.detail.addFirstTranslation')}\r\n </Link>\r\n </div>\r\n )}\r\n\r\n {/* Email Preview */}\r\n {currentPreviewTranslation && (\r\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\r\n {/* Email Content - Main Area */}\r\n <div className=\"lg:col-span-2 space-y-4\">\r\n {/* Subject */}\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n <div className=\"px-4 py-2 bg-[var(--bg-tertiary)] border-b border-[var(--border-color)] flex items-center gap-2\">\r\n <Mail className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('emailTemplates.detail.subject')}\r\n </span>\r\n </div>\r\n <div className=\"px-4 py-3\">\r\n <p className=\"text-[var(--text-primary)] font-medium\">{currentPreviewTranslation.subject}</p>\r\n </div>\r\n </div>\r\n\r\n {/* HTML Body Preview */}\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n <div className=\"px-4 py-2 bg-[var(--bg-tertiary)] border-b border-[var(--border-color)] flex items-center justify-between\">\r\n <div className=\"flex items-center gap-2\">\r\n <FileText className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('emailTemplates.detail.emailBody', { defaultValue: 'Contenu de l\\'email' })}\r\n </span>\r\n </div>\r\n <button\r\n onClick={() => handlePreview(currentPreviewTranslation.languageCode)}\r\n className=\"flex items-center gap-1 px-2 py-1 rounded text-xs text-[var(--color-accent-600)] hover:bg-[var(--color-accent-50)] dark:hover:bg-[var(--color-accent-900)] transition-colors\"\r\n >\r\n <Eye className=\"w-3 h-3\" />\r\n {t('emailTemplates.detail.fullPreview', { defaultValue: 'Plein ecran' })}\r\n </button>\r\n </div>\r\n <div className=\"bg-white\">\r\n <iframe\r\n srcDoc={currentPreviewTranslation.htmlBody}\r\n className=\"w-full min-h-[400px] border-0\"\r\n title=\"Email Preview\"\r\n sandbox=\"allow-same-origin\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Text Body (if exists) */}\r\n {currentPreviewTranslation.textBody && (\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n <div className=\"px-4 py-2 bg-[var(--bg-tertiary)] border-b border-[var(--border-color)] flex items-center gap-2\">\r\n <FileText className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('emailTemplates.detail.textVersion', { defaultValue: 'Version texte' })}\r\n </span>\r\n </div>\r\n <div className=\"px-4 py-3\">\r\n <pre className=\"whitespace-pre-wrap text-sm text-[var(--text-secondary)] font-mono\">\r\n {currentPreviewTranslation.textBody}\r\n </pre>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Variables Panel - Sidebar */}\r\n <div className=\"space-y-4\">\r\n {/* Template Variables */}\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n <div className=\"px-4 py-2 bg-[var(--bg-tertiary)] border-b border-[var(--border-color)] flex items-center gap-2\">\r\n <Code className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('emailTemplates.detail.variables')}\r\n </span>\r\n </div>\r\n <div className=\"p-4 space-y-4 max-h-[500px] overflow-y-auto\">\r\n {/* Custom Variables (if any) */}\r\n {templateVariables.custom.length > 0 && (\r\n <VariableSection\r\n title={t('emailTemplates.detail.customVariables')}\r\n variables={templateVariables.custom}\r\n t={t}\r\n defaultExpanded={true}\r\n />\r\n )}\r\n\r\n {/* User Variables */}\r\n <VariableSection\r\n title={t('emailTemplates.detail.userVariables')}\r\n variables={templateVariables.user}\r\n t={t}\r\n defaultExpanded={false}\r\n />\r\n\r\n {/* Email Variables */}\r\n <VariableSection\r\n title={t('emailTemplates.detail.emailVariables')}\r\n variables={templateVariables.email}\r\n t={t}\r\n defaultExpanded={false}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Template Info Card */}\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n <div className=\"px-4 py-2 bg-[var(--bg-tertiary)] border-b border-[var(--border-color)] flex items-center gap-2\">\r\n <Settings className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('emailTemplates.detail.quickInfo')}\r\n </span>\r\n </div>\r\n <div className=\"p-4 space-y-3 text-sm\">\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-[var(--text-tertiary)]\">{t('emailTemplates.form.code')}</span>\r\n <code className=\"px-2 py-0.5 bg-[var(--bg-tertiary)] rounded text-[var(--text-primary)] text-xs\">\r\n {template.code}\r\n </code>\r\n </div>\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-[var(--text-tertiary)]\">{t('emailTemplates.form.category')}</span>\r\n <span className=\"text-[var(--text-primary)]\">{getCategoryLabel(template.category)}</span>\r\n </div>\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-[var(--text-tertiary)]\">{t('emailTemplates.columns.translations')}</span>\r\n <span className=\"text-[var(--text-primary)]\">{template.translations.length}/4</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Info Tab */}\r\n {activeTab === 'info' && (\r\n <div className=\"space-y-6\">\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.form.code')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)] font-mono text-sm\">\r\n {template.code}\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.form.name')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)]\">\r\n {template.name}\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.form.description')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)] min-h-[60px]\">\r\n {template.description || <span className=\"text-[var(--text-tertiary)]\">-</span>}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.form.category')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)]\">\r\n {getCategoryLabel(template.category)}\r\n </div>\r\n </div>\r\n\r\n {template.applicationId && (\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.detail.application')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)]\">\r\n {template.applicationId}\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.detail.createdAt')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)] text-sm\">\r\n {new Date(template.createdAt).toLocaleString()}\r\n </div>\r\n </div>\r\n {template.updatedAt && (\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.detail.updatedAt')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)] text-sm\">\r\n {new Date(template.updatedAt).toLocaleString()}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Translations Tab */}\r\n {activeTab === 'translations' && (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('emailTemplates.detail.translationsTitle')} ({template.translations.length})\r\n </h3>\r\n <Link\r\n to={`/administration/workflows/email-templates/${templateId}/edit`}\r\n className=\"flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('emailTemplates.detail.addTranslation')}\r\n </Link>\r\n </div>\r\n\r\n {template.translations.length === 0 ? (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n <Languages className=\"w-12 h-12 mx-auto mb-4 opacity-50\" />\r\n <p>{t('emailTemplates.detail.noTranslations')}</p>\r\n <Link\r\n to={`/administration/workflows/email-templates/${templateId}/edit`}\r\n className=\"inline-flex items-center gap-2 mt-4 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('emailTemplates.detail.addFirstTranslation')}\r\n </Link>\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3\">\r\n {template.translations.map((translation) => (\r\n <TranslationCard\r\n key={translation.id}\r\n translation={translation}\r\n templateId={templateId!}\r\n onPreview={() => handlePreview(translation.languageCode)}\r\n t={t}\r\n getLanguageLabel={getLanguageLabel}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Delete Confirmation Modal */}\r\n {showDeleteConfirm && (\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-[var(--radius-card)] border border-[var(--border-color)] p-6 max-w-md w-full shadow-xl\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-2\">\r\n {t('emailTemplates.detail.confirmDelete.title')}\r\n </h3>\r\n <p className=\"text-[var(--text-secondary)] mb-6\">\r\n {t('emailTemplates.confirmDelete', { name: template.name })}\r\n </p>\r\n <div className=\"flex justify-end gap-3\">\r\n <button\r\n onClick={() => setShowDeleteConfirm(false)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n onClick={handleDelete}\r\n disabled={actionLoading}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--error-600)] hover:bg-[var(--error-700)] text-white font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {actionLoading ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Trash2 className=\"w-4 h-4\" />\r\n )}\r\n {t('emailTemplates.delete')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Preview Modal */}\r\n {previewLang && previewContent && (\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-[var(--radius-card)] border border-[var(--border-color)] p-6 max-w-4xl w-full max-h-[90vh] overflow-hidden shadow-xl flex flex-col\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('emailTemplates.detail.preview')} - {getLanguageLabel(previewLang)}\r\n </h3>\r\n <button\r\n onClick={closePreview}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <span className=\"sr-only\">Close</span>\r\n ×\r\n </button>\r\n </div>\r\n <div className=\"mb-4\">\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.detail.subject')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)]\">\r\n {previewContent.subject}\r\n </div>\r\n </div>\r\n <div className=\"flex-1 overflow-auto border border-[var(--border-color)] rounded-[var(--radius-card)] bg-white\">\r\n <iframe\r\n srcDoc={previewContent.htmlBody}\r\n className=\"w-full h-full min-h-[400px]\"\r\n title=\"Email Preview\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {previewLoading && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-white\" />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\ninterface TranslationCardProps {\r\n readonly translation: EmailTemplateTranslationDto;\r\n readonly templateId: string;\r\n readonly onPreview: () => void;\r\n readonly t: (key: string, options?: Record<string, unknown>) => string;\r\n readonly getLanguageLabel: (code: string) => string;\r\n}\r\n\r\nfunction TranslationCard({ translation, templateId, onPreview, t, getLanguageLabel }: TranslationCardProps) {\r\n const navigate = useNavigate();\r\n const [expanded, setExpanded] = useState(false);\r\n\r\n return (\r\n <div className=\"rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)] hover:border-[var(--color-accent-300)] transition-colors overflow-hidden\">\r\n {/* Header */}\r\n <div className=\"p-4\">\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"flex items-center gap-3 flex-1 min-w-0\">\r\n <div className=\"w-10 h-10 rounded-full bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] flex items-center justify-center flex-shrink-0\">\r\n <span className=\"text-sm font-bold text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)] uppercase\">\r\n {translation.languageCode}\r\n </span>\r\n </div>\r\n <div className=\"min-w-0 flex-1\">\r\n <div className=\"font-medium text-[var(--text-primary)]\">{getLanguageLabel(translation.languageCode)}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">{translation.subject}</div>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2 flex-shrink-0\">\r\n <button\r\n onClick={() => setExpanded(!expanded)}\r\n className=\"flex items-center gap-1 px-2 py-1 rounded-[var(--radius-button)] text-sm text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {expanded ? <ChevronUp className=\"w-4 h-4\" /> : <ChevronDown className=\"w-4 h-4\" />}\r\n {expanded ? t('emailTemplates.detail.collapse', { defaultValue: 'Reduire' }) : t('emailTemplates.detail.expand', { defaultValue: 'Voir le contenu' })}\r\n </button>\r\n <button\r\n onClick={onPreview}\r\n className=\"flex items-center gap-1 px-2 py-1 rounded-[var(--radius-button)] text-sm text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <Eye className=\"w-4 h-4\" />\r\n {t('emailTemplates.detail.preview')}\r\n </button>\r\n <button\r\n onClick={() => navigate(`/administration/workflows/email-templates/${templateId}/edit`)}\r\n className=\"flex items-center gap-1 px-2 py-1 rounded-[var(--radius-button)] text-sm text-[var(--color-accent-600)] hover:bg-[var(--color-accent-50)] dark:hover:bg-[var(--color-accent-900)] transition-colors\"\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n {t('emailTemplates.edit.title')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Expanded Content */}\r\n {expanded && (\r\n <div className=\"border-t border-[var(--border-color)]\">\r\n <div className=\"bg-white max-h-[300px] overflow-auto\">\r\n <iframe\r\n srcDoc={translation.htmlBody}\r\n className=\"w-full min-h-[200px] border-0\"\r\n title={`Email Preview - ${translation.languageCode}`}\r\n sandbox=\"allow-same-origin\"\r\n />\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// Variable Section Component (collapsible)\r\ninterface VariableSectionProps {\r\n readonly title: string;\r\n readonly variables: TemplateVariable[];\r\n readonly t: (key: string, options?: Record<string, unknown>) => string;\r\n readonly defaultExpanded?: boolean;\r\n}\r\n\r\nfunction VariableSection({ title, variables, t, defaultExpanded = false }: VariableSectionProps) {\r\n const [expanded, setExpanded] = useState(defaultExpanded);\r\n\r\n return (\r\n <div className=\"border border-[var(--border-color)] rounded-lg overflow-hidden\">\r\n <button\r\n onClick={() => setExpanded(!expanded)}\r\n className=\"w-full flex items-center justify-between px-3 py-2 bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] transition-colors text-left\"\r\n >\r\n <span className=\"text-xs font-medium text-[var(--text-secondary)]\">{title}</span>\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-xs text-[var(--text-tertiary)]\">{variables.length}</span>\r\n {expanded ? <ChevronUp className=\"w-3 h-3\" /> : <ChevronDown className=\"w-3 h-3\" />}\r\n </div>\r\n </button>\r\n {expanded && (\r\n <div className=\"p-2 space-y-1\">\r\n {variables.map((variable) => (\r\n <VariableItem key={variable.name} variable={variable} t={t} />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// Variable Item Component\r\ninterface VariableItemProps {\r\n readonly variable: TemplateVariable;\r\n readonly t: (key: string, options?: Record<string, unknown>) => string;\r\n}\r\n\r\nfunction VariableItem({ variable, t }: VariableItemProps) {\r\n const [copied, setCopied] = useState(false);\r\n const variableSyntax = `{{ ${variable.name} }}`;\r\n\r\n const handleCopy = () => {\r\n navigator.clipboard.writeText(variableSyntax);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n };\r\n\r\n return (\r\n <div className=\"group flex items-center justify-between p-2 rounded hover:bg-[var(--bg-tertiary)] transition-colors\">\r\n <div className=\"min-w-0 flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <code className=\"text-sm font-mono text-[var(--color-accent-600)]\">{variableSyntax}</code>\r\n {variable.required && (\r\n <span className=\"text-xs text-[var(--error-text)]\">*</span>\r\n )}\r\n </div>\r\n {variable.description && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-0.5 truncate\">{variable.description}</p>\r\n )}\r\n </div>\r\n <button\r\n onClick={handleCopy}\r\n className=\"opacity-0 group-hover:opacity-100 p-1 rounded hover:bg-[var(--bg-hover)] transition-all\"\r\n title={t('emailTemplates.detail.copyVariable', { defaultValue: 'Copier' })}\r\n >\r\n {copied ? (\r\n <Check className=\"w-3.5 h-3.5 text-[var(--success-text)]\" />\r\n ) : (\r\n <Copy className=\"w-3.5 h-3.5 text-[var(--text-tertiary)]\" />\r\n )}\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\nexport default EmailTemplateDetailPage;\r\n","import { useEditor, EditorContent } from '@tiptap/react';\r\nimport StarterKit from '@tiptap/starter-kit';\r\nimport Link from '@tiptap/extension-link';\r\nimport Image from '@tiptap/extension-image';\r\nimport Placeholder from '@tiptap/extension-placeholder';\r\nimport TextAlign from '@tiptap/extension-text-align';\r\nimport Underline from '@tiptap/extension-underline';\r\nimport { TextStyle } from '@tiptap/extension-text-style';\r\nimport { Color } from '@tiptap/extension-color';\r\nimport Highlight from '@tiptap/extension-highlight';\r\nimport { useState, useCallback, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport {\r\n Bold,\r\n Italic,\r\n Underline as UnderlineIcon,\r\n Strikethrough,\r\n AlignLeft,\r\n AlignCenter,\r\n AlignRight,\r\n List,\r\n ListOrdered,\r\n Link as LinkIcon,\r\n Image as ImageIcon,\r\n Code,\r\n Eye,\r\n Heading1,\r\n Heading2,\r\n Heading3,\r\n Undo,\r\n Redo,\r\n Palette,\r\n Highlighter,\r\n Quote,\r\n Minus,\r\n X,\r\n Check\r\n} from 'lucide-react';\r\nimport Editor from '@monaco-editor/react';\r\n\r\ninterface EmailEditorProps {\r\n readonly content: string;\r\n readonly onChange: (html: string) => void;\r\n readonly placeholder?: string;\r\n readonly onInsertVariable?: (varName: string) => void;\r\n readonly className?: string;\r\n}\r\n\r\nexport function EmailEditor({ content, onChange, placeholder, className }: EmailEditorProps): ReactElement {\r\n const [mode, setMode] = useState<'visual' | 'code'>('visual');\r\n const [codeContent, setCodeContent] = useState(content);\r\n const [linkUrl, setLinkUrl] = useState('');\r\n const [showLinkInput, setShowLinkInput] = useState(false);\r\n const [imageUrl, setImageUrl] = useState('');\r\n const [showImageInput, setShowImageInput] = useState(false);\r\n\r\n const editor = useEditor({\r\n extensions: [\r\n StarterKit.configure({\r\n heading: {\r\n levels: [1, 2, 3],\r\n },\r\n }),\r\n Link.configure({\r\n openOnClick: false,\r\n HTMLAttributes: {\r\n class: 'text-[var(--color-accent-600)] underline',\r\n },\r\n }),\r\n Image.configure({\r\n HTMLAttributes: {\r\n class: 'max-w-full h-auto rounded',\r\n },\r\n }),\r\n Placeholder.configure({\r\n placeholder: placeholder || 'Commencez a ecrire votre email...',\r\n }),\r\n TextAlign.configure({\r\n types: ['heading', 'paragraph'],\r\n }),\r\n Underline,\r\n TextStyle,\r\n Color,\r\n Highlight.configure({\r\n multicolor: true,\r\n }),\r\n ],\r\n content: content,\r\n onUpdate: ({ editor }) => {\r\n const html = editor.getHTML();\r\n onChange(html);\r\n setCodeContent(html);\r\n },\r\n editorProps: {\r\n attributes: {\r\n class: 'prose prose-sm max-w-none focus:outline-none min-h-[300px] p-4',\r\n },\r\n },\r\n });\r\n\r\n // Sync content when switching modes\r\n useEffect(() => {\r\n if (mode === 'visual' && editor && codeContent !== editor.getHTML()) {\r\n editor.commands.setContent(codeContent);\r\n }\r\n }, [mode, editor, codeContent]);\r\n\r\n // Update code content when visual editor changes\r\n useEffect(() => {\r\n if (editor) {\r\n setCodeContent(editor.getHTML());\r\n }\r\n }, [editor?.getHTML()]);\r\n\r\n const handleCodeChange = useCallback((value: string | undefined) => {\r\n const newContent = value || '';\r\n setCodeContent(newContent);\r\n onChange(newContent);\r\n }, [onChange]);\r\n\r\n const switchToVisual = useCallback(() => {\r\n if (editor) {\r\n editor.commands.setContent(codeContent);\r\n }\r\n setMode('visual');\r\n }, [editor, codeContent]);\r\n\r\n const switchToCode = useCallback(() => {\r\n if (editor) {\r\n setCodeContent(editor.getHTML());\r\n }\r\n setMode('code');\r\n }, [editor]);\r\n\r\n const addLink = useCallback(() => {\r\n if (linkUrl && editor) {\r\n editor.chain().focus().extendMarkRange('link').setLink({ href: linkUrl }).run();\r\n setLinkUrl('');\r\n setShowLinkInput(false);\r\n }\r\n }, [editor, linkUrl]);\r\n\r\n const removeLink = useCallback(() => {\r\n if (editor) {\r\n editor.chain().focus().unsetLink().run();\r\n setShowLinkInput(false);\r\n }\r\n }, [editor]);\r\n\r\n const addImage = useCallback(() => {\r\n if (imageUrl && editor) {\r\n editor.chain().focus().setImage({ src: imageUrl }).run();\r\n setImageUrl('');\r\n setShowImageInput(false);\r\n }\r\n }, [editor, imageUrl]);\r\n\r\n const insertVariable = useCallback((varName: string) => {\r\n if (editor) {\r\n const variableSyntax = `{{ ${varName} }}`;\r\n editor.chain().focus().insertContent(`<span class=\"variable-tag\" data-variable=\"${varName}\">${variableSyntax}</span>`).run();\r\n }\r\n }, [editor]);\r\n\r\n // Expose insertVariable method\r\n useEffect(() => {\r\n if (typeof window !== 'undefined') {\r\n (window as unknown as Record<string, unknown>).__emailEditorInsertVariable = insertVariable;\r\n }\r\n return () => {\r\n if (typeof window !== 'undefined') {\r\n delete (window as unknown as Record<string, unknown>).__emailEditorInsertVariable;\r\n }\r\n };\r\n }, [insertVariable]);\r\n\r\n if (!editor) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"animate-pulse text-[var(--text-tertiary)]\">Chargement de l'editeur...</div>\r\n </div>\r\n );\r\n }\r\n\r\n const ToolbarButton = ({\r\n onClick,\r\n isActive = false,\r\n disabled = false,\r\n title,\r\n children\r\n }: {\r\n onClick: () => void;\r\n isActive?: boolean;\r\n disabled?: boolean;\r\n title: string;\r\n children: React.ReactNode;\r\n }) => (\r\n <button\r\n type=\"button\"\r\n onClick={onClick}\r\n disabled={disabled}\r\n title={title}\r\n className={`p-1.5 rounded transition-colors ${\r\n isActive\r\n ? 'bg-[var(--color-accent-100)] text-[var(--color-accent-700)] dark:bg-[var(--color-accent-900)] dark:text-[var(--color-accent-300)]'\r\n : 'hover:bg-[var(--bg-hover)] text-[var(--text-secondary)]'\r\n } ${disabled ? 'opacity-50 cursor-not-allowed' : ''}`}\r\n >\r\n {children}\r\n </button>\r\n );\r\n\r\n const ToolbarDivider = () => (\r\n <div className=\"w-px h-6 bg-[var(--border-color)] mx-1\" />\r\n );\r\n\r\n return (\r\n <div className={`border border-[var(--border-color)] rounded-lg overflow-hidden bg-[var(--bg-primary)] ${className || ''}`}>\r\n {/* Toolbar */}\r\n <div className=\"flex flex-wrap items-center gap-0.5 p-2 border-b border-[var(--border-color)] bg-[var(--bg-tertiary)]\">\r\n {/* Mode Toggle */}\r\n <div className=\"flex items-center gap-1 mr-2\">\r\n <button\r\n type=\"button\"\r\n onClick={switchToVisual}\r\n className={`flex items-center gap-1 px-2 py-1 rounded text-xs font-medium transition-colors ${\r\n mode === 'visual'\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <Eye className=\"w-3 h-3\" />\r\n Visuel\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={switchToCode}\r\n className={`flex items-center gap-1 px-2 py-1 rounded text-xs font-medium transition-colors ${\r\n mode === 'code'\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <Code className=\"w-3 h-3\" />\r\n Code\r\n </button>\r\n </div>\r\n\r\n {mode === 'visual' && (\r\n <>\r\n <ToolbarDivider />\r\n\r\n {/* Undo/Redo */}\r\n <ToolbarButton onClick={() => editor.chain().focus().undo().run()} disabled={!editor.can().undo()} title=\"Annuler\">\r\n <Undo className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <ToolbarButton onClick={() => editor.chain().focus().redo().run()} disabled={!editor.can().redo()} title=\"Retablir\">\r\n <Redo className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n\r\n <ToolbarDivider />\r\n\r\n {/* Headings */}\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().toggleHeading({ level: 1 }).run()}\r\n isActive={editor.isActive('heading', { level: 1 })}\r\n title=\"Titre 1\"\r\n >\r\n <Heading1 className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}\r\n isActive={editor.isActive('heading', { level: 2 })}\r\n title=\"Titre 2\"\r\n >\r\n <Heading2 className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().toggleHeading({ level: 3 }).run()}\r\n isActive={editor.isActive('heading', { level: 3 })}\r\n title=\"Titre 3\"\r\n >\r\n <Heading3 className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n\r\n <ToolbarDivider />\r\n\r\n {/* Text Formatting */}\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().toggleBold().run()}\r\n isActive={editor.isActive('bold')}\r\n title=\"Gras\"\r\n >\r\n <Bold className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().toggleItalic().run()}\r\n isActive={editor.isActive('italic')}\r\n title=\"Italique\"\r\n >\r\n <Italic className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().toggleUnderline().run()}\r\n isActive={editor.isActive('underline')}\r\n title=\"Souligne\"\r\n >\r\n <UnderlineIcon className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().toggleStrike().run()}\r\n isActive={editor.isActive('strike')}\r\n title=\"Barre\"\r\n >\r\n <Strikethrough className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n\r\n <ToolbarDivider />\r\n\r\n {/* Text Alignment */}\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().setTextAlign('left').run()}\r\n isActive={editor.isActive({ textAlign: 'left' })}\r\n title=\"Aligner a gauche\"\r\n >\r\n <AlignLeft className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().setTextAlign('center').run()}\r\n isActive={editor.isActive({ textAlign: 'center' })}\r\n title=\"Centrer\"\r\n >\r\n <AlignCenter className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().setTextAlign('right').run()}\r\n isActive={editor.isActive({ textAlign: 'right' })}\r\n title=\"Aligner a droite\"\r\n >\r\n <AlignRight className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n\r\n <ToolbarDivider />\r\n\r\n {/* Lists */}\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().toggleBulletList().run()}\r\n isActive={editor.isActive('bulletList')}\r\n title=\"Liste a puces\"\r\n >\r\n <List className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\r\n isActive={editor.isActive('orderedList')}\r\n title=\"Liste numerotee\"\r\n >\r\n <ListOrdered className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n\r\n <ToolbarDivider />\r\n\r\n {/* Block Elements */}\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\r\n isActive={editor.isActive('blockquote')}\r\n title=\"Citation\"\r\n >\r\n <Quote className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().setHorizontalRule().run()}\r\n title=\"Ligne horizontale\"\r\n >\r\n <Minus className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n\r\n <ToolbarDivider />\r\n\r\n {/* Link */}\r\n <div className=\"relative\">\r\n <ToolbarButton\r\n onClick={() => setShowLinkInput(!showLinkInput)}\r\n isActive={editor.isActive('link') || showLinkInput}\r\n title=\"Lien\"\r\n >\r\n <LinkIcon className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n {showLinkInput && (\r\n <div className=\"absolute top-full left-0 mt-1 p-2 bg-[var(--bg-primary)] border border-[var(--border-color)] rounded-lg shadow-lg z-10 flex items-center gap-2\">\r\n <input\r\n type=\"url\"\r\n value={linkUrl}\r\n onChange={(e) => setLinkUrl(e.target.value)}\r\n placeholder=\"https://...\"\r\n className=\"px-2 py-1 text-sm border border-[var(--border-color)] rounded bg-[var(--bg-primary)] text-[var(--text-primary)] w-48\"\r\n onKeyDown={(e) => e.key === 'Enter' && addLink()}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={addLink}\r\n className=\"p-1 text-[var(--success-text)] hover:bg-[var(--success-bg)] rounded\"\r\n >\r\n <Check className=\"w-4 h-4\" />\r\n </button>\r\n {editor.isActive('link') && (\r\n <button\r\n type=\"button\"\r\n onClick={removeLink}\r\n className=\"p-1 text-[var(--error-text)] hover:bg-[var(--error-bg)] rounded\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Image */}\r\n <div className=\"relative\">\r\n <ToolbarButton\r\n onClick={() => setShowImageInput(!showImageInput)}\r\n isActive={showImageInput}\r\n title=\"Image\"\r\n >\r\n <ImageIcon className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n {showImageInput && (\r\n <div className=\"absolute top-full left-0 mt-1 p-2 bg-[var(--bg-primary)] border border-[var(--border-color)] rounded-lg shadow-lg z-10 flex items-center gap-2\">\r\n <input\r\n type=\"url\"\r\n value={imageUrl}\r\n onChange={(e) => setImageUrl(e.target.value)}\r\n placeholder=\"URL de l'image...\"\r\n className=\"px-2 py-1 text-sm border border-[var(--border-color)] rounded bg-[var(--bg-primary)] text-[var(--text-primary)] w-48\"\r\n onKeyDown={(e) => e.key === 'Enter' && addImage()}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={addImage}\r\n className=\"p-1 text-[var(--success-text)] hover:bg-[var(--success-bg)] rounded\"\r\n >\r\n <Check className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowImageInput(false)}\r\n className=\"p-1 text-[var(--error-text)] hover:bg-[var(--error-bg)] rounded\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Logo shortcut */}\r\n <ToolbarButton\r\n onClick={() => {\r\n editor.chain().focus().insertContent('<img src=\"{{ company_logo_url }}\" alt=\"Logo\" style=\"max-width: 200px; height: auto;\" />').run();\r\n }}\r\n title=\"Inserer le logo\"\r\n >\r\n <span className=\"text-xs font-medium\">Logo</span>\r\n </ToolbarButton>\r\n\r\n <ToolbarDivider />\r\n\r\n {/* Colors */}\r\n <div className=\"relative group\">\r\n <ToolbarButton onClick={() => {}} title=\"Couleur du texte\">\r\n <Palette className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <div className=\"absolute top-full left-0 mt-1 p-2 bg-[var(--bg-primary)] border border-[var(--border-color)] rounded-lg shadow-lg z-10 hidden group-hover:grid grid-cols-5 gap-1\">\r\n {['#000000', '#374151', '#dc2626', '#ea580c', '#ca8a04', '#16a34a', '#0891b2', '#2563eb', '#7c3aed', '#db2777'].map(color => (\r\n <button\r\n key={color}\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().setColor(color).run()}\r\n className=\"w-6 h-6 rounded border border-[var(--border-color)]\"\r\n style={{ backgroundColor: color }}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n\r\n <div className=\"relative group\">\r\n <ToolbarButton onClick={() => {}} title=\"Surligner\">\r\n <Highlighter className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <div className=\"absolute top-full left-0 mt-1 p-2 bg-[var(--bg-primary)] border border-[var(--border-color)] rounded-lg shadow-lg z-10 hidden group-hover:grid grid-cols-5 gap-1\">\r\n {['#fef08a', '#bbf7d0', '#bfdbfe', '#ddd6fe', '#fbcfe8'].map(color => (\r\n <button\r\n key={color}\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().toggleHighlight({ color }).run()}\r\n className=\"w-6 h-6 rounded border border-[var(--border-color)]\"\r\n style={{ backgroundColor: color }}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Editor Content */}\r\n <div className=\"min-h-[400px]\">\r\n {mode === 'visual' ? (\r\n <EditorContent\r\n editor={editor}\r\n className=\"[&_.ProseMirror]:min-h-[400px] [&_.ProseMirror]:p-4 [&_.ProseMirror]:focus:outline-none [&_.ProseMirror_p.is-editor-empty:first-child::before]:content-[attr(data-placeholder)] [&_.ProseMirror_p.is-editor-empty:first-child::before]:text-[var(--text-tertiary)] [&_.ProseMirror_p.is-editor-empty:first-child::before]:float-left [&_.ProseMirror_p.is-editor-empty:first-child::before]:h-0 [&_.ProseMirror_p.is-editor-empty:first-child::before]:pointer-events-none\"\r\n />\r\n ) : (\r\n <Editor\r\n height=\"400px\"\r\n language=\"html\"\r\n theme=\"vs-dark\"\r\n value={codeContent}\r\n onChange={handleCodeChange}\r\n options={{\r\n minimap: { enabled: false },\r\n fontSize: 13,\r\n wordWrap: 'on',\r\n formatOnPaste: true,\r\n automaticLayout: true,\r\n scrollBeyondLastLine: false,\r\n lineNumbers: 'on',\r\n tabSize: 2,\r\n folding: true,\r\n renderWhitespace: 'selection',\r\n }}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// Export a method to programmatically insert variables\r\nexport function insertEmailVariable(varName: string): void {\r\n const insertFn = (window as unknown as Record<string, unknown>).__emailEditorInsertVariable as ((varName: string) => void) | undefined;\r\n if (insertFn) {\r\n insertFn(varName);\r\n }\r\n}\r\n\r\nexport default EmailEditor;\r\n","import { useState, useEffect, useCallback, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useParams, useNavigate, useSearchParams } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n ArrowLeft,\r\n Settings,\r\n Loader2,\r\n Save,\r\n AlertTriangle,\r\n CheckCircle,\r\n Languages,\r\n Plus,\r\n Trash2,\r\n Eye,\r\n Code,\r\n Check,\r\n Columns,\r\n Maximize2,\r\n Minimize2,\r\n ChevronDown,\r\n ChevronUp\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { EmailEditor } from '@/components/email';\r\nimport {\r\n communicationsApi,\r\n type EmailTemplateDetailDto,\r\n type EmailTemplateTranslationDto\r\n} from '@/services/api/communicationsApi';\r\n\r\ninterface TemplateVariable {\r\n name: string;\r\n description?: string;\r\n type?: string;\r\n required?: boolean;\r\n}\r\n\r\n// Default user variables available in all email templates (from User entity, excluding technical fields)\r\nconst DEFAULT_USER_VARIABLES: TemplateVariable[] = [\r\n // User Identity\r\n { name: 'userName', description: 'Nom complet de l\\'utilisateur' },\r\n { name: 'firstName', description: 'Prenom' },\r\n { name: 'lastName', description: 'Nom de famille' },\r\n { name: 'displayName', description: 'Nom d\\'affichage (Entra)' },\r\n { name: 'email', description: 'Adresse email' },\r\n // Contact\r\n { name: 'phoneNumber', description: 'Telephone fixe' },\r\n { name: 'mobilePhone', description: 'Telephone mobile' },\r\n // Location\r\n { name: 'city', description: 'Ville' },\r\n { name: 'country', description: 'Pays' },\r\n { name: 'streetAddress', description: 'Adresse' },\r\n { name: 'postalCode', description: 'Code postal' },\r\n // Organization\r\n { name: 'company', description: 'Nom de l\\'entreprise' },\r\n { name: 'department', description: 'Departement' },\r\n { name: 'jobTitle', description: 'Fonction/Poste' },\r\n { name: 'office', description: 'Bureau/Site' },\r\n { name: 'employeeId', description: 'Numero d\\'employe' },\r\n { name: 'managerName', description: 'Nom du manager' },\r\n];\r\n\r\n// Common email template variables (actions, links, etc.)\r\nconst DEFAULT_EMAIL_VARIABLES: TemplateVariable[] = [\r\n { name: 'company_logo_url', description: 'URL du logo de l\\'entreprise' },\r\n { name: 'appName', description: 'Nom de l\\'application' },\r\n { name: 'resetUrl', description: 'Lien de reinitialisation du mot de passe' },\r\n { name: 'confirmUrl', description: 'Lien de confirmation d\\'email' },\r\n { name: 'adminName', description: 'Nom de l\\'administrateur (action admin)' },\r\n { name: 'expiresIn', description: 'Delai d\\'expiration du lien' },\r\n { name: 'currentDate', description: 'Date actuelle' },\r\n { name: 'currentYear', description: 'Annee en cours' },\r\n];\r\n\r\ntype TabId = 'info' | 'translations';\r\n\r\ninterface FormData {\r\n name: string;\r\n description: string;\r\n category: string;\r\n}\r\n\r\ninterface TranslationFormData {\r\n languageCode: string;\r\n subject: string;\r\n htmlBody: string;\r\n textBody: string;\r\n}\r\n\r\nconst SUPPORTED_LANGUAGES = ['fr', 'en', 'de', 'it'];\r\n\r\n// Sample values for preview - realistic demo data\r\nconst PREVIEW_SAMPLE_VALUES: Record<string, string> = {\r\n // User Identity\r\n userName: 'Jean Dupont',\r\n firstName: 'Jean',\r\n lastName: 'Dupont',\r\n displayName: 'Jean Dupont',\r\n email: 'jean.dupont@example.com',\r\n user_email: 'jean.dupont@example.com',\r\n userEmail: 'jean.dupont@example.com',\r\n // Contact\r\n phoneNumber: '+41 21 123 45 67',\r\n phone: '+41 21 123 45 67',\r\n mobilePhone: '+41 79 123 45 67',\r\n mobile: '+41 79 123 45 67',\r\n // Location\r\n city: 'Lausanne',\r\n country: 'Suisse',\r\n streetAddress: 'Rue du Lac 15',\r\n address: 'Rue du Lac 15, 1003 Lausanne',\r\n postalCode: '1003',\r\n zipCode: '1003',\r\n // Organization\r\n company: 'SmartStack SA',\r\n companyName: 'SmartStack SA',\r\n company_name: 'SmartStack SA',\r\n organization: 'SmartStack SA',\r\n department: 'Informatique',\r\n jobTitle: 'Developpeur Senior',\r\n job_title: 'Developpeur Senior',\r\n position: 'Developpeur Senior',\r\n office: 'Lausanne HQ',\r\n employeeId: 'EMP-001234',\r\n employee_id: 'EMP-001234',\r\n managerName: 'Marie Martin',\r\n manager: 'Marie Martin',\r\n manager_name: 'Marie Martin',\r\n // Email & Application\r\n company_logo_url: 'https://example.com/logo.png',\r\n logo_url: 'https://example.com/logo.png',\r\n logoUrl: 'https://example.com/logo.png',\r\n appName: 'SmartStack',\r\n app_name: 'SmartStack',\r\n applicationName: 'SmartStack',\r\n siteName: 'SmartStack',\r\n site_name: 'SmartStack',\r\n // URLs & Links\r\n resetUrl: 'https://app.smartstack.ch/reset-password?token=abc123',\r\n reset_url: 'https://app.smartstack.ch/reset-password?token=abc123',\r\n resetLink: 'https://app.smartstack.ch/reset-password?token=abc123',\r\n reset_link: 'https://app.smartstack.ch/reset-password?token=abc123',\r\n confirmUrl: 'https://app.smartstack.ch/confirm-email?token=xyz789',\r\n confirm_url: 'https://app.smartstack.ch/confirm-email?token=xyz789',\r\n confirmationUrl: 'https://app.smartstack.ch/confirm-email?token=xyz789',\r\n confirmation_url: 'https://app.smartstack.ch/confirm-email?token=xyz789',\r\n confirmLink: 'https://app.smartstack.ch/confirm-email?token=xyz789',\r\n activationUrl: 'https://app.smartstack.ch/activate?token=xyz789',\r\n activation_url: 'https://app.smartstack.ch/activate?token=xyz789',\r\n activationLink: 'https://app.smartstack.ch/activate?token=xyz789',\r\n loginUrl: 'https://app.smartstack.ch/login',\r\n login_url: 'https://app.smartstack.ch/login',\r\n loginLink: 'https://app.smartstack.ch/login',\r\n dashboardUrl: 'https://app.smartstack.ch/dashboard',\r\n dashboard_url: 'https://app.smartstack.ch/dashboard',\r\n profileUrl: 'https://app.smartstack.ch/profile',\r\n profile_url: 'https://app.smartstack.ch/profile',\r\n unsubscribeUrl: 'https://app.smartstack.ch/unsubscribe?token=abc',\r\n unsubscribe_url: 'https://app.smartstack.ch/unsubscribe?token=abc',\r\n // Admin & System\r\n adminName: 'Admin Systeme',\r\n admin_name: 'Admin Systeme',\r\n adminEmail: 'admin@smartstack.ch',\r\n admin_email: 'admin@smartstack.ch',\r\n supportEmail: 'support@atlashub.ch',\r\n support_email: 'support@atlashub.ch',\r\n supportPhone: '+41 21 123 00 00',\r\n support_phone: '+41 21 123 00 00',\r\n // Time & Dates\r\n expiresIn: '24 heures',\r\n expires_in: '24 heures',\r\n expirationTime: '24 heures',\r\n expiration_time: '24 heures',\r\n expiryDate: '16 janvier 2026',\r\n expiry_date: '16 janvier 2026',\r\n currentDate: new Date().toLocaleDateString('fr-CH'),\r\n current_date: new Date().toLocaleDateString('fr-CH'),\r\n date: new Date().toLocaleDateString('fr-CH'),\r\n today: new Date().toLocaleDateString('fr-CH'),\r\n currentYear: new Date().getFullYear().toString(),\r\n current_year: new Date().getFullYear().toString(),\r\n year: new Date().getFullYear().toString(),\r\n currentTime: new Date().toLocaleTimeString('fr-CH'),\r\n current_time: new Date().toLocaleTimeString('fr-CH'),\r\n time: new Date().toLocaleTimeString('fr-CH'),\r\n // Password & Security\r\n temporaryPassword: 'TempPass123!',\r\n temporary_password: 'TempPass123!',\r\n tempPassword: 'TempPass123!',\r\n temp_password: 'TempPass123!',\r\n newPassword: 'NewPass456!',\r\n new_password: 'NewPass456!',\r\n password: '********',\r\n token: 'abc123xyz789',\r\n verificationCode: '123456',\r\n verification_code: '123456',\r\n code: '123456',\r\n otp: '123456',\r\n // Ticket & Support\r\n ticketId: 'TKT-2026-00123',\r\n ticket_id: 'TKT-2026-00123',\r\n ticketNumber: 'TKT-2026-00123',\r\n ticket_number: 'TKT-2026-00123',\r\n ticketSubject: 'Question technique',\r\n ticket_subject: 'Question technique',\r\n ticketStatus: 'En cours',\r\n ticket_status: 'En cours',\r\n // Order & Invoice\r\n orderId: 'ORD-2026-00456',\r\n order_id: 'ORD-2026-00456',\r\n orderNumber: 'ORD-2026-00456',\r\n order_number: 'ORD-2026-00456',\r\n invoiceId: 'INV-2026-00789',\r\n invoice_id: 'INV-2026-00789',\r\n invoiceNumber: 'INV-2026-00789',\r\n invoice_number: 'INV-2026-00789',\r\n amount: 'CHF 150.00',\r\n total: 'CHF 150.00',\r\n price: 'CHF 150.00',\r\n // Misc\r\n reason: 'Mise a jour de securite',\r\n message: 'Votre demande a ete traitee avec succes.',\r\n description: 'Description de l\\'element',\r\n title: 'Titre de l\\'element',\r\n name: 'Nom de l\\'element',\r\n value: 'Valeur exemple',\r\n count: '5',\r\n number: '42',\r\n id: '12345',\r\n};\r\n\r\n// Generate a fallback value for unknown variables based on their name\r\nfunction generateFallbackValue(varName: string): string {\r\n const lowerName = varName.toLowerCase();\r\n\r\n // URL patterns\r\n if (lowerName.includes('url') || lowerName.includes('link')) {\r\n return 'https://app.smartstack.ch/example';\r\n }\r\n // Email patterns\r\n if (lowerName.includes('email') || lowerName.includes('mail')) {\r\n return 'exemple@smartstack.ch';\r\n }\r\n // Phone patterns\r\n if (lowerName.includes('phone') || lowerName.includes('tel') || lowerName.includes('mobile')) {\r\n return '+41 21 123 45 67';\r\n }\r\n // Date patterns\r\n if (lowerName.includes('date') || lowerName.includes('time') || lowerName.includes('at')) {\r\n return new Date().toLocaleDateString('fr-CH');\r\n }\r\n // Year patterns\r\n if (lowerName.includes('year')) {\r\n return new Date().getFullYear().toString();\r\n }\r\n // Name patterns\r\n if (lowerName.includes('name') || lowerName.includes('nom')) {\r\n return 'Jean Dupont';\r\n }\r\n // Password patterns\r\n if (lowerName.includes('password') || lowerName.includes('pwd') || lowerName.includes('pass')) {\r\n return 'MotDePasse123!';\r\n }\r\n // Code/Token patterns\r\n if (lowerName.includes('code') || lowerName.includes('token') || lowerName.includes('otp')) {\r\n return '123456';\r\n }\r\n // ID patterns\r\n if (lowerName.includes('id') || lowerName.includes('number') || lowerName.includes('num')) {\r\n return '12345';\r\n }\r\n // Amount/Price patterns\r\n if (lowerName.includes('amount') || lowerName.includes('price') || lowerName.includes('total') || lowerName.includes('cost')) {\r\n return 'CHF 100.00';\r\n }\r\n // Count patterns\r\n if (lowerName.includes('count') || lowerName.includes('qty') || lowerName.includes('quantity')) {\r\n return '5';\r\n }\r\n\r\n // Default: Convert camelCase/snake_case to readable format\r\n const readable = varName\r\n .replace(/_/g, ' ')\r\n .replace(/([A-Z])/g, ' $1')\r\n .trim()\r\n .toLowerCase();\r\n return `[${readable}]`;\r\n}\r\n\r\n// Replace Liquid variables with sample values for preview\r\nfunction replaceVariablesForPreview(html: string): string {\r\n if (!html) return html;\r\n\r\n let result = html;\r\n\r\n // Replace {{ variable }} syntax (with optional spaces)\r\n result = result.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (_match, varName) => {\r\n return PREVIEW_SAMPLE_VALUES[varName] || generateFallbackValue(varName);\r\n });\r\n\r\n // Handle {% if condition %} blocks - show the content (assume true for preview)\r\n result = result.replace(/\\{%\\s*if\\s+\\w+\\s*%\\}([\\s\\S]*?)\\{%\\s*endif\\s*%\\}/gi, '$1');\r\n\r\n // Handle {% else %} blocks - remove them (since we assume if is true)\r\n result = result.replace(/\\{%\\s*else\\s*%\\}[\\s\\S]*?(?=\\{%|\\$)/gi, '');\r\n\r\n // Clean up any remaining Liquid tags\r\n result = result.replace(/\\{%[^%]*%\\}/g, '');\r\n\r\n return result;\r\n}\r\n\r\nexport function EmailTemplateEditPage(): ReactElement {\r\n const { t } = useTranslation('communications');\r\n const { id: templateId } = useParams<{ id: string }>();\r\n const navigate = useNavigate();\r\n\r\n const [template, setTemplate] = useState<EmailTemplateDetailDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [saving, setSaving] = useState(false);\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n const activeTab = (searchParams.get('tab') as TabId) || 'info';\r\n const setActiveTab = (tab: TabId) => setSearchParams({ tab });\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n const [formData, setFormData] = useState<FormData>({\r\n name: '',\r\n description: '',\r\n category: ''\r\n });\r\n\r\n // Translation editing\r\n const [editingTranslation, setEditingTranslation] = useState<TranslationFormData | null>(null);\r\n const [isNewTranslation, setIsNewTranslation] = useState(false);\r\n const [savingTranslation, setSavingTranslation] = useState(false);\r\n const [showPreview, setShowPreview] = useState(true);\r\n const [fullscreenPreview, setFullscreenPreview] = useState(false);\r\n\r\n // Parse variables from JSON or use defaults\r\n const templateVariables = useMemo((): { user: TemplateVariable[]; email: TemplateVariable[]; custom: TemplateVariable[] } => {\r\n let customVariables: TemplateVariable[] = [];\r\n\r\n if (template?.variablesJson) {\r\n try {\r\n const parsed = JSON.parse(template.variablesJson);\r\n if (Array.isArray(parsed)) {\r\n customVariables = parsed.filter(v => v?.name);\r\n } else if (typeof parsed === 'object') {\r\n customVariables = Object.entries(parsed)\r\n .filter(([name]) => name && name !== 'undefined')\r\n .map(([name, value]) => ({\r\n name,\r\n description: typeof value === 'object' && value !== null ? (value as Record<string, unknown>).description as string : undefined,\r\n type: typeof value === 'object' && value !== null ? (value as Record<string, unknown>).type as string : undefined,\r\n required: typeof value === 'object' && value !== null ? (value as Record<string, unknown>).required as boolean : false\r\n }));\r\n }\r\n } catch {\r\n // Invalid JSON, ignore\r\n }\r\n }\r\n\r\n return {\r\n user: DEFAULT_USER_VARIABLES,\r\n email: DEFAULT_EMAIL_VARIABLES,\r\n custom: customVariables\r\n };\r\n }, [template?.variablesJson]);\r\n\r\n const loadTemplate = useCallback(async () => {\r\n if (!templateId) return;\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const data = await communicationsApi.emailTemplates.getById(templateId);\r\n setTemplate(data);\r\n setFormData({\r\n name: data.name,\r\n description: data.description || '',\r\n category: data.category\r\n });\r\n } catch (err) {\r\n console.error('Failed to load template:', err);\r\n setError(t('emailTemplates.edit.errors.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [templateId, t]);\r\n\r\n useEffect(() => {\r\n loadTemplate();\r\n }, [loadTemplate]);\r\n\r\n const handleSave = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!templateId || !template) return;\r\n\r\n try {\r\n setSaving(true);\r\n setError(null);\r\n await communicationsApi.emailTemplates.update(templateId, {\r\n name: formData.name,\r\n description: formData.description || undefined,\r\n category: formData.category,\r\n isActive: template.isActive,\r\n });\r\n setSuccess(t('emailTemplates.edit.success.saved'));\r\n loadTemplate();\r\n } catch (err) {\r\n console.error('Failed to save template:', err);\r\n setError(t('emailTemplates.edit.errors.saveFailed'));\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleAddTranslation = () => {\r\n const existingLangs = template?.translations.map(tr => tr.languageCode) || [];\r\n const availableLangs = SUPPORTED_LANGUAGES.filter(lang => !existingLangs.includes(lang));\r\n\r\n if (availableLangs.length === 0) {\r\n setError(t('emailTemplates.edit.errors.allLanguagesExist'));\r\n return;\r\n }\r\n\r\n setEditingTranslation({\r\n languageCode: availableLangs[0],\r\n subject: '',\r\n htmlBody: '',\r\n textBody: ''\r\n });\r\n setIsNewTranslation(true);\r\n };\r\n\r\n const handleEditTranslation = (translation: EmailTemplateTranslationDto) => {\r\n setEditingTranslation({\r\n languageCode: translation.languageCode,\r\n subject: translation.subject,\r\n htmlBody: translation.htmlBody,\r\n textBody: translation.textBody || ''\r\n });\r\n setIsNewTranslation(false);\r\n };\r\n\r\n const handleSaveTranslation = async () => {\r\n if (!templateId || !editingTranslation) return;\r\n\r\n try {\r\n setSavingTranslation(true);\r\n setError(null);\r\n\r\n if (isNewTranslation) {\r\n await communicationsApi.emailTemplates.createTranslation(templateId, {\r\n languageCode: editingTranslation.languageCode,\r\n subject: editingTranslation.subject,\r\n htmlBody: editingTranslation.htmlBody,\r\n textBody: editingTranslation.textBody || undefined\r\n });\r\n setSuccess(t('emailTemplates.edit.success.translationAdded'));\r\n } else {\r\n await communicationsApi.emailTemplates.updateTranslation(\r\n templateId,\r\n editingTranslation.languageCode,\r\n {\r\n subject: editingTranslation.subject,\r\n htmlBody: editingTranslation.htmlBody,\r\n textBody: editingTranslation.textBody || undefined\r\n }\r\n );\r\n setSuccess(t('emailTemplates.edit.success.translationUpdated'));\r\n }\r\n\r\n setEditingTranslation(null);\r\n loadTemplate();\r\n } catch (err) {\r\n console.error('Failed to save translation:', err);\r\n setError(t('emailTemplates.edit.errors.translationSaveFailed'));\r\n } finally {\r\n setSavingTranslation(false);\r\n }\r\n };\r\n\r\n const handleDeleteTranslation = async (languageCode: string) => {\r\n if (!templateId) return;\r\n if (!languageCode || !confirm(t('emailTemplates.edit.confirmDeleteTranslation'))) return;\r\n\r\n try {\r\n setSavingTranslation(true);\r\n setError(null);\r\n // TODO: API endpoint for deleting translations doesn't exist yet\r\n // await communicationsApi.emailTemplates.deleteTranslation(templateId, languageCode);\r\n setError('Delete translation API not implemented yet');\r\n // setSuccess(t('emailTemplates.edit.success.translationDeleted'));\r\n // loadTemplate();\r\n } catch (err) {\r\n console.error('Failed to delete translation:', err);\r\n setError(t('emailTemplates.edit.errors.translationDeleteFailed'));\r\n } finally {\r\n setSavingTranslation(false);\r\n }\r\n };\r\n\r\n const tabs: { id: TabId; label: string; icon: React.ReactNode }[] = [\r\n { id: 'info', label: t('emailTemplates.edit.tabs.info'), icon: <Settings className=\"w-4 h-4\" /> },\r\n { id: 'translations', label: t('emailTemplates.edit.tabs.translations'), icon: <Languages className=\"w-4 h-4\" /> }\r\n ];\r\n\r\n const getLanguageLabel = (code: string) => {\r\n return t(`languages.${code}`, { defaultValue: code.toUpperCase() });\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (!template) {\r\n return (\r\n <div className=\"text-center py-12\">\r\n <p className=\"text-[var(--text-secondary)]\">{t('emailTemplates.detail.notFound')}</p>\r\n <button\r\n onClick={() => navigate('/administration/workflows/email-templates')}\r\n className=\"mt-4 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white\"\r\n >\r\n {t('emailTemplates.backToList')}\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n const existingLangs = template.translations.map(tr => tr.languageCode);\r\n const availableLangs = SUPPORTED_LANGUAGES.filter(lang => !existingLangs.includes(lang));\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('communications.title', 'Communications'), href: '/administration/communications' },\r\n { label: t('communications.emailTemplates', 'Email Templates'), href: '/administration/workflows/email-templates' },\r\n { label: template?.name || '' }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center gap-4\">\r\n <button\r\n onClick={() => navigate(`/administration/workflows/email-templates/${templateId}`)}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3\">\r\n <h1 className=\"text-xl sm:text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('emailTemplates.edit.title')}\r\n </h1>\r\n {template.isSystem && (\r\n <span className=\"flex items-center gap-1 px-2 py-1 rounded-[var(--radius-badge)] text-xs bg-[var(--bg-tertiary)] text-[var(--text-secondary)] border border-[var(--border-color)]\">\r\n {t('emailTemplates.edit.systemTemplate')}\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1 font-mono\">{template.code}</p>\r\n </div>\r\n </div>\r\n\r\n {/* Alerts */}\r\n {error && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)] text-[var(--error-text)] flex items-center gap-2\">\r\n <AlertTriangle className=\"w-5 h-5 flex-shrink-0\" />\r\n {error}\r\n </div>\r\n )}\r\n {success && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--success-bg)] border border-[var(--success-border)] text-[var(--success-text)] flex items-center gap-2\">\r\n <CheckCircle className=\"w-5 h-5 flex-shrink-0\" />\r\n {success}\r\n </div>\r\n )}\r\n\r\n\r\n {/* Tabs */}\r\n <div className=\"flex gap-1 p-1 bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n {tabs.map(tab => (\r\n <button\r\n key={tab.id}\r\n onClick={() => setActiveTab(tab.id)}\r\n className={`flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium transition-colors ${\r\n activeTab === tab.id\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n {tab.icon}\r\n <span className=\"hidden sm:inline\">{tab.label}</span>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div className=\"bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4 sm:p-6\">\r\n {/* Info Tab */}\r\n {activeTab === 'info' && (\r\n <form onSubmit={handleSave} className=\"space-y-6\">\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.form.code')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)] font-mono text-sm\">\r\n {template.code}\r\n </div>\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {t('emailTemplates.edit.codeReadOnly')}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.form.name')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={formData.name}\r\n onChange={(e) => setFormData(prev => ({ ...prev, name: e.target.value }))}\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.form.description')}\r\n </label>\r\n <textarea\r\n value={formData.description}\r\n onChange={(e) => setFormData(prev => ({ ...prev, description: e.target.value }))}\r\n rows={3}\r\n placeholder={t('emailTemplates.form.descriptionPlaceholder')}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:border-[var(--color-accent-500)] focus:ring-1 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.form.category')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <select\r\n required\r\n value={formData.category}\r\n onChange={(e) => setFormData(prev => ({ ...prev, category: e.target.value }))}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"transactional\">{t('emailTemplates.categories.transactional')}</option>\r\n <option value=\"notification\">{t('emailTemplates.categories.notification')}</option>\r\n <option value=\"marketing\">{t('emailTemplates.categories.marketing')}</option>\r\n <option value=\"system\">{t('emailTemplates.categories.system')}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Save button */}\r\n <div className=\"flex justify-end gap-3 pt-4 border-t border-[var(--border-color)]\">\r\n <button\r\n type=\"button\"\r\n onClick={() => navigate(`/administration/workflows/email-templates/${templateId}`)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={saving}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {saving ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </form>\r\n )}\r\n\r\n {/* Translations Tab */}\r\n {activeTab === 'translations' && !editingTranslation && (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('emailTemplates.edit.tabs.translations')} ({template.translations.length}/4)\r\n </h3>\r\n {availableLangs.length > 0 && (\r\n <button\r\n onClick={handleAddTranslation}\r\n className=\"flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('emailTemplates.edit.addTranslation')}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {template.translations.length === 0 ? (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n <Languages className=\"w-12 h-12 mx-auto mb-4 opacity-50\" />\r\n <p>{t('emailTemplates.detail.noTranslations')}</p>\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3\">\r\n {template.translations.map((translation) => (\r\n <div\r\n key={translation.id}\r\n className=\"p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)] hover:border-[var(--color-accent-300)] transition-colors\"\r\n >\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-10 h-10 rounded-full bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] flex items-center justify-center\">\r\n <span className=\"text-sm font-bold text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)] uppercase\">\r\n {translation.languageCode}\r\n </span>\r\n </div>\r\n <div>\r\n <div className=\"font-medium text-[var(--text-primary)]\">\r\n {getLanguageLabel(translation.languageCode)}\r\n </div>\r\n <div className=\"text-sm text-[var(--text-secondary)] truncate max-w-md\">\r\n {translation.subject}\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => handleEditTranslation(translation)}\r\n className=\"flex items-center gap-1 px-2 py-1 rounded-[var(--radius-button)] text-sm text-[var(--color-accent-600)] hover:bg-[var(--color-accent-50)] dark:hover:bg-[var(--color-accent-900)] transition-colors\"\r\n >\r\n <Settings className=\"w-4 h-4\" />\r\n {t('emailTemplates.edit.editTranslation')}\r\n </button>\r\n <button\r\n onClick={() => handleDeleteTranslation(translation.languageCode)}\r\n disabled={savingTranslation}\r\n className=\"flex items-center gap-1 px-2 py-1 rounded-[var(--radius-button)] text-sm text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-colors\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Translation Editor */}\r\n {activeTab === 'translations' && editingTranslation && (\r\n <div className=\"space-y-4\">\r\n {/* Editor Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {isNewTranslation\r\n ? t('emailTemplates.edit.addTranslation')\r\n : t('emailTemplates.edit.editTranslation')}\r\n </h3>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => setShowPreview(!showPreview)}\r\n className={`flex items-center gap-1 px-2 py-1 rounded text-sm transition-colors ${\r\n showPreview\r\n ? 'bg-[var(--color-accent-100)] text-[var(--color-accent-700)] dark:bg-[var(--color-accent-900)] dark:text-[var(--color-accent-300)]'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <Columns className=\"w-4 h-4\" />\r\n {t('emailTemplates.edit.showPreview')}\r\n </button>\r\n <button\r\n onClick={() => setEditingTranslation(null)}\r\n className=\"text-sm text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Main Content Grid */}\r\n <div className={`grid gap-6 ${showPreview ? 'grid-cols-1 xl:grid-cols-2' : 'grid-cols-1'}`}>\r\n {/* Editor Column */}\r\n <div className=\"space-y-4\">\r\n {/* Language Selection */}\r\n {isNewTranslation && (\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.edit.language')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <select\r\n value={editingTranslation.languageCode}\r\n onChange={(e) => setEditingTranslation(prev => prev ? { ...prev, languageCode: e.target.value } : null)}\r\n className=\"input w-full max-w-xs\"\r\n >\r\n {availableLangs.map(lang => (\r\n <option key={lang} value={lang}>{getLanguageLabel(lang)}</option>\r\n ))}\r\n </select>\r\n </div>\r\n )}\r\n\r\n {/* Subject */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.edit.subject')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={editingTranslation.subject}\r\n onChange={(e) => setEditingTranslation(prev => prev ? { ...prev, subject: e.target.value } : null)}\r\n placeholder={t('emailTemplates.edit.subjectPlaceholder')}\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n\r\n {/* HTML Body - WYSIWYG Editor */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.edit.htmlBody')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <EmailEditor\r\n content={editingTranslation.htmlBody}\r\n onChange={(html) => setEditingTranslation(prev => prev ? { ...prev, htmlBody: html } : null)}\r\n placeholder={t('emailTemplates.edit.htmlBodyPlaceholder')}\r\n />\r\n </div>\r\n\r\n {/* Text Body */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.edit.textBody')}\r\n </label>\r\n <textarea\r\n value={editingTranslation.textBody}\r\n onChange={(e) => setEditingTranslation(prev => prev ? { ...prev, textBody: e.target.value } : null)}\r\n rows={4}\r\n placeholder={t('emailTemplates.edit.textBodyPlaceholder')}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:border-[var(--color-accent-500)] focus:ring-1 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {t('emailTemplates.edit.textBodyHelp')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {/* Preview Column */}\r\n {showPreview && (\r\n <div className=\"space-y-4\">\r\n {/* Variables Panel */}\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n <div className=\"px-4 py-2 bg-[var(--bg-tertiary)] border-b border-[var(--border-color)] flex items-center gap-2\">\r\n <Code className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('emailTemplates.edit.availableVariables')}\r\n </span>\r\n </div>\r\n <div className=\"p-3 space-y-3 max-h-[300px] overflow-auto\">\r\n {/* Custom Variables (if any) */}\r\n {templateVariables.custom.length > 0 && (\r\n <VariableSectionEdit\r\n title={t('emailTemplates.detail.customVariables')}\r\n variables={templateVariables.custom}\r\n onInsert={(varName) => {\r\n const varSyntax = `{{ ${varName} }}`;\r\n setEditingTranslation(prev => prev ? {\r\n ...prev,\r\n htmlBody: prev.htmlBody + varSyntax\r\n } : null);\r\n }}\r\n defaultExpanded={true}\r\n />\r\n )}\r\n\r\n {/* User Variables */}\r\n <VariableSectionEdit\r\n title={t('emailTemplates.detail.userVariables')}\r\n variables={templateVariables.user}\r\n onInsert={(varName) => {\r\n const varSyntax = `{{ ${varName} }}`;\r\n setEditingTranslation(prev => prev ? {\r\n ...prev,\r\n htmlBody: prev.htmlBody + varSyntax\r\n } : null);\r\n }}\r\n defaultExpanded={false}\r\n />\r\n\r\n {/* Email Variables */}\r\n <VariableSectionEdit\r\n title={t('emailTemplates.detail.emailVariables')}\r\n variables={templateVariables.email}\r\n onInsert={(varName) => {\r\n const varSyntax = `{{ ${varName} }}`;\r\n setEditingTranslation(prev => prev ? {\r\n ...prev,\r\n htmlBody: prev.htmlBody + varSyntax\r\n } : null);\r\n }}\r\n defaultExpanded={false}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Live Preview */}\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden flex flex-col\">\r\n <div className=\"px-4 py-2 bg-[var(--bg-tertiary)] border-b border-[var(--border-color)] flex items-center justify-between\">\r\n <div className=\"flex items-center gap-2\">\r\n <Eye className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('emailTemplates.edit.livePreview')}\r\n </span>\r\n </div>\r\n <button\r\n onClick={() => setFullscreenPreview(true)}\r\n className=\"p-1 rounded hover:bg-[var(--bg-hover)] transition-colors\"\r\n title={t('emailTemplates.edit.fullscreen')}\r\n >\r\n <Maximize2 className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n </button>\r\n </div>\r\n\r\n {/* Subject Preview */}\r\n <div className=\"px-4 py-2 border-b border-[var(--border-color)] bg-[var(--bg-tertiary)]/50\">\r\n <div className=\"text-xs text-[var(--text-tertiary)] mb-1\">{t('emailTemplates.edit.subject')}</div>\r\n <div className=\"text-sm font-medium text-[var(--text-primary)]\">\r\n {editingTranslation.subject ? replaceVariablesForPreview(editingTranslation.subject) : <span className=\"text-[var(--text-tertiary)] italic\">{t('emailTemplates.edit.subjectPlaceholder')}</span>}\r\n </div>\r\n </div>\r\n\r\n {/* HTML Preview */}\r\n <div className=\"flex-1 bg-white min-h-[300px]\">\r\n {editingTranslation.htmlBody ? (\r\n <iframe\r\n srcDoc={`<!DOCTYPE html>\r\n<html>\r\n<head>\r\n <meta charset=\"UTF-8\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n <style>\r\n body {\r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\r\n font-size: 14px;\r\n line-height: 1.6;\r\n color: #333;\r\n margin: 0;\r\n padding: 16px;\r\n background: #fff;\r\n }\r\n h1 { font-size: 24px; margin: 0 0 16px; color: #111; }\r\n h2 { font-size: 20px; margin: 0 0 12px; color: #111; }\r\n h3 { font-size: 16px; margin: 0 0 8px; color: #111; }\r\n p { margin: 0 0 12px; }\r\n a { color: #2563eb; text-decoration: underline; }\r\n strong { font-weight: 600; }\r\n img { max-width: 100%; height: auto; }\r\n ul, ol { margin: 0 0 12px; padding-left: 24px; }\r\n li { margin-bottom: 4px; }\r\n blockquote {\r\n margin: 12px 0;\r\n padding: 8px 16px;\r\n border-left: 4px solid #e5e7eb;\r\n background: #f9fafb;\r\n color: #6b7280;\r\n }\r\n hr { border: none; border-top: 1px solid #e5e7eb; margin: 16px 0; }\r\n code {\r\n background: #f3f4f6;\r\n padding: 2px 6px;\r\n border-radius: 4px;\r\n font-family: monospace;\r\n font-size: 13px;\r\n }\r\n .button, a.button {\r\n display: inline-block;\r\n padding: 12px 24px;\r\n background: #2563eb;\r\n color: #fff !important;\r\n text-decoration: none;\r\n border-radius: 6px;\r\n font-weight: 500;\r\n }\r\n </style>\r\n</head>\r\n<body>${replaceVariablesForPreview(editingTranslation.htmlBody)}</body>\r\n</html>`}\r\n className=\"w-full h-full min-h-[300px] border-0\"\r\n title=\"Email Preview\"\r\n sandbox=\"allow-same-origin\"\r\n />\r\n ) : (\r\n <div className=\"flex items-center justify-center h-full min-h-[300px] text-[var(--text-tertiary)]\">\r\n <div className=\"text-center\">\r\n <Eye className=\"w-8 h-8 mx-auto mb-2 opacity-50\" />\r\n <p className=\"text-sm\">{t('emailTemplates.edit.noContentYet')}</p>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Save Actions */}\r\n <div className=\"flex justify-end gap-3 pt-4 border-t border-[var(--border-color)]\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setEditingTranslation(null)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n onClick={handleSaveTranslation}\r\n disabled={savingTranslation || !editingTranslation.subject || !editingTranslation.htmlBody}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {savingTranslation ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Fullscreen Preview Modal */}\r\n {fullscreenPreview && editingTranslation && (\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-[var(--radius-card)] border border-[var(--border-color)] max-w-4xl w-full max-h-[90vh] overflow-hidden shadow-xl flex flex-col\">\r\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-[var(--border-color)]\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('emailTemplates.edit.preview')}\r\n </h3>\r\n <button\r\n onClick={() => setFullscreenPreview(false)}\r\n className=\"p-2 rounded hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <Minimize2 className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n <div className=\"px-4 py-2 border-b border-[var(--border-color)] bg-[var(--bg-tertiary)]\">\r\n <div className=\"text-xs text-[var(--text-tertiary)] mb-1\">{t('emailTemplates.edit.subject')}</div>\r\n <div className=\"font-medium text-[var(--text-primary)]\">{replaceVariablesForPreview(editingTranslation.subject)}</div>\r\n </div>\r\n <div className=\"flex-1 overflow-auto bg-white\">\r\n <iframe\r\n srcDoc={`<!DOCTYPE html>\r\n<html>\r\n<head>\r\n <meta charset=\"UTF-8\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n <style>\r\n body {\r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\r\n font-size: 14px;\r\n line-height: 1.6;\r\n color: #333;\r\n margin: 0;\r\n padding: 24px;\r\n background: #fff;\r\n }\r\n h1 { font-size: 24px; margin: 0 0 16px; color: #111; }\r\n h2 { font-size: 20px; margin: 0 0 12px; color: #111; }\r\n h3 { font-size: 16px; margin: 0 0 8px; color: #111; }\r\n p { margin: 0 0 12px; }\r\n a { color: #2563eb; text-decoration: underline; }\r\n strong { font-weight: 600; }\r\n img { max-width: 100%; height: auto; }\r\n ul, ol { margin: 0 0 12px; padding-left: 24px; }\r\n li { margin-bottom: 4px; }\r\n blockquote {\r\n margin: 12px 0;\r\n padding: 8px 16px;\r\n border-left: 4px solid #e5e7eb;\r\n background: #f9fafb;\r\n color: #6b7280;\r\n }\r\n hr { border: none; border-top: 1px solid #e5e7eb; margin: 16px 0; }\r\n code {\r\n background: #f3f4f6;\r\n padding: 2px 6px;\r\n border-radius: 4px;\r\n font-family: monospace;\r\n font-size: 13px;\r\n }\r\n .button, a.button {\r\n display: inline-block;\r\n padding: 12px 24px;\r\n background: #2563eb;\r\n color: #fff !important;\r\n text-decoration: none;\r\n border-radius: 6px;\r\n font-weight: 500;\r\n }\r\n </style>\r\n</head>\r\n<body>${replaceVariablesForPreview(editingTranslation.htmlBody)}</body>\r\n</html>`}\r\n className=\"w-full h-full min-h-[500px] border-0\"\r\n title=\"Email Preview Fullscreen\"\r\n sandbox=\"allow-same-origin\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// Variable Section Component (collapsible) for Edit page\r\ninterface VariableSectionEditProps {\r\n readonly title: string;\r\n readonly variables: TemplateVariable[];\r\n readonly onInsert: (varName: string) => void;\r\n readonly defaultExpanded?: boolean;\r\n}\r\n\r\nfunction VariableSectionEdit({ title, variables, onInsert, defaultExpanded = false }: VariableSectionEditProps) {\r\n const [expanded, setExpanded] = useState(defaultExpanded);\r\n\r\n return (\r\n <div className=\"border border-[var(--border-color)] rounded-lg overflow-hidden\">\r\n <button\r\n onClick={() => setExpanded(!expanded)}\r\n className=\"w-full flex items-center justify-between px-2 py-1.5 bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] transition-colors text-left\"\r\n >\r\n <span className=\"text-xs font-medium text-[var(--text-secondary)]\">{title}</span>\r\n <div className=\"flex items-center gap-1\">\r\n <span className=\"text-xs text-[var(--text-tertiary)]\">{variables.length}</span>\r\n {expanded ? <ChevronUp className=\"w-3 h-3\" /> : <ChevronDown className=\"w-3 h-3\" />}\r\n </div>\r\n </button>\r\n {expanded && (\r\n <div className=\"p-2 flex flex-wrap gap-1.5\">\r\n {variables.map((variable) => (\r\n <VariableBadgeInsert key={variable.name} variable={variable} onInsert={onInsert} />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// Variable Badge Component with insert action\r\nfunction VariableBadgeInsert({ variable, onInsert }: { variable: TemplateVariable; onInsert: (varName: string) => void }) {\r\n const [copied, setCopied] = useState(false);\r\n const variableSyntax = `{{ ${variable.name} }}`;\r\n\r\n const handleClick = () => {\r\n onInsert(variable.name);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 1000);\r\n };\r\n\r\n return (\r\n <button\r\n onClick={handleClick}\r\n className=\"group inline-flex items-center gap-1 px-1.5 py-0.5 rounded bg-[var(--bg-tertiary)] hover:bg-[var(--color-accent-100)] dark:hover:bg-[var(--color-accent-900)] transition-colors text-xs\"\r\n title={variable.description || `Inserer ${variableSyntax}`}\r\n >\r\n <code className=\"font-mono text-[var(--color-accent-600)]\">{variable.name}</code>\r\n {copied && <Check className=\"w-2.5 h-2.5 text-[var(--success-text)]\" />}\r\n </button>\r\n );\r\n}\r\n\r\n\r\nexport default EmailTemplateEditPage;\r\n","import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport { MessageSquare } from 'lucide-react';\r\nimport { UnderDevelopment } from '@/components/ui/UnderDevelopment';\r\nimport { PageHeader } from '@/components/ui/PageHeader';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\nexport function SmsTemplatesListPage(): ReactElement {\r\n const { t } = useTranslation('communications');\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('communications.title', 'Communications'), href: '/administration/communications' },\r\n { label: t('communications.smsTemplates', 'SMS Templates') }\r\n ]}\r\n />\r\n\r\n <PageHeader\r\n title={t('smsTemplates.title', 'SMS Templates')}\r\n subtitle={t('smsTemplates.subtitle', 'Manage SMS notification templates')}\r\n icon={<MessageSquare className=\"w-6 h-6\" />}\r\n />\r\n\r\n <div className=\"card\">\r\n <UnderDevelopment\r\n title={t('smsTemplates.underDevelopment.title', 'SMS Templates')}\r\n description={t('smsTemplates.underDevelopment.description', 'SMS notification templates will be available soon. This feature will allow you to create and manage SMS templates for automated notifications.')}\r\n icon={<MessageSquare className=\"w-10 h-10 text-amber-600 dark:text-amber-400\" />}\r\n showBackButton={true}\r\n backUrl=\"/administration/workflows/email-templates\"\r\n />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default SmsTemplatesListPage;\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Plus, Search, Edit2, Trash2, Play, Pause, Workflow, Zap, Loader2, Filter, Eye } from 'lucide-react';\r\nimport { communicationsApi, type WorkflowListDto } from '@/services/api/communicationsApi';\r\nimport { ViewToggle, StatusBadge, Pagination, type ViewMode } from '@/components/ui/DataView';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\nexport function WorkflowsListPage(): ReactElement {\r\n const { t } = useTranslation('communications');\r\n const navigate = useNavigate();\r\n const { currentTenant, isGlobalView } = useTenant();\r\n const [workflows, setWorkflows] = useState<WorkflowListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [search, setSearch] = useState('');\r\n const [viewMode, setViewMode] = useState<ViewMode>('table');\r\n const [page, setPage] = useState(1);\r\n const pageSize = 20;\r\n\r\n const loadWorkflows = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const data = await communicationsApi.workflows.getAll({ search: search || undefined });\r\n setWorkflows(Array.isArray(data) ? data : []);\r\n } catch (err) {\r\n console.error('Failed to load workflows:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n // TENANT ISOLATION: Re-fetch when tenant changes\r\n }, [search, currentTenant?.id, isGlobalView]);\r\n\r\n useEffect(() => {\r\n loadWorkflows();\r\n }, [loadWorkflows]);\r\n\r\n const handleSearch = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setPage(1);\r\n loadWorkflows();\r\n };\r\n\r\n const handleToggleActive = async (workflow: WorkflowListDto, e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n try {\r\n if (workflow.isActive) {\r\n await communicationsApi.workflows.deactivate(workflow.id);\r\n } else {\r\n await communicationsApi.workflows.activate(workflow.id);\r\n }\r\n loadWorkflows();\r\n } catch (err) {\r\n console.error('Failed to toggle workflow:', err);\r\n }\r\n };\r\n\r\n const handleDelete = async (workflow: WorkflowListDto, e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n if (workflow.isSystem) {\r\n alert(t('workflows.cannotDeleteSystem'));\r\n return;\r\n }\r\n if (!confirm(t('workflows.confirmDelete', { name: workflow.name }))) return;\r\n\r\n try {\r\n await communicationsApi.workflows.delete(workflow.id);\r\n loadWorkflows();\r\n } catch (err) {\r\n console.error('Failed to delete workflow:', err);\r\n }\r\n };\r\n\r\n // Filter for current page\r\n const startIndex = (page - 1) * pageSize;\r\n const paginatedWorkflows = workflows.slice(startIndex, startIndex + pageSize);\r\n const totalPages = Math.ceil(workflows.length / pageSize);\r\n\r\n // Grouper par statut pour le Kanban\r\n const activeWorkflows = workflows.filter(w => w.isActive);\r\n const inactiveWorkflows = workflows.filter(w => !w.isActive);\r\n\r\n const renderTableView = () => (\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-[var(--bg-secondary)]\">\r\n <th className=\"w-12 px-4 py-3\">\r\n <input type=\"checkbox\" className=\"w-4 h-4 rounded border-[var(--border-color)]\" />\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('workflows.columns.name')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden md:table-cell\">{t('workflows.columns.trigger')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">{t('workflows.columns.steps')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">{t('workflows.columns.priority')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('workflows.columns.status')}</th>\r\n <th className=\"w-32 px-4 py-3\"></th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {loading && (\r\n <tr>\r\n <td colSpan={7} className=\"px-6 py-16 text-center\">\r\n <div className=\"flex flex-col items-center gap-3\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-primary-500\" />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{t('common.loading', { defaultValue: 'Chargement...' })}</span>\r\n </div>\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && paginatedWorkflows.length === 0 && (\r\n <tr>\r\n <td colSpan={7} className=\"px-6 py-16 text-center\">\r\n <div className=\"flex flex-col items-center gap-3\">\r\n <div className=\"w-16 h-16 rounded-full bg-[var(--bg-secondary)] flex items-center justify-center\">\r\n <Workflow className=\"w-8 h-8 text-[var(--text-tertiary)]\" />\r\n </div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('workflows.noResults')}</span>\r\n </div>\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && paginatedWorkflows.length > 0 && (\r\n paginatedWorkflows.map(workflow => (\r\n <tr\r\n key={workflow.id}\r\n className=\"group hover:bg-[var(--bg-hover)] transition-all cursor-pointer\"\r\n onClick={() => navigate(`/administration/workflows/${workflow.id}`)}\r\n >\r\n <td className=\"px-4 py-3\" onClick={e => e.stopPropagation()}>\r\n <input type=\"checkbox\" className=\"w-4 h-4 rounded border-[var(--border-color)]\" />\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-10 h-10 rounded-lg bg-gradient-to-br from-emerald-500 to-teal-500 flex items-center justify-center shadow-md\">\r\n <Workflow className=\"w-5 h-5 text-white\" />\r\n </div>\r\n <div className=\"min-w-0\">\r\n <p className=\"font-medium text-[var(--text-primary)] group-hover:text-primary-600 transition-colors\">\r\n {workflow.name}\r\n </p>\r\n {workflow.description && (\r\n <p className=\"text-sm text-[var(--text-tertiary)] truncate max-w-xs\">{workflow.description}</p>\r\n )}\r\n <div className=\"flex items-center gap-1.5 mt-1\">\r\n {workflow.isSystem && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-[var(--radius-badge)] text-xs font-medium bg-[var(--info-bg)] text-[var(--info-text)] border border-[var(--info-border)]\">\r\n System\r\n </span>\r\n )}\r\n {isGlobalView && workflow.tenantName && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-[var(--radius-badge)] text-xs font-medium bg-[var(--bg-secondary)] text-[var(--text-secondary)] border border-[var(--border-color)]\">\r\n {workflow.tenantName}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 hidden md:table-cell\">\r\n <div className=\"flex items-center gap-2\">\r\n <Zap className=\"w-4 h-4 text-amber-500\" />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{workflow.triggerName}</span>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 hidden lg:table-cell\">\r\n <span className=\"px-2 py-1 rounded-[var(--radius-badge)] text-xs font-medium bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {workflow.stepCount} {t('workflows.columns.steps').toLowerCase()}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3 hidden lg:table-cell\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{workflow.priority}</span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <StatusBadge\r\n status={workflow.isActive ? 'active' : 'inactive'}\r\n label={workflow.isActive ? t('workflows.active') : t('workflows.inactive')}\r\n />\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center justify-end gap-1\" onClick={e => e.stopPropagation()}>\r\n <button\r\n onClick={() => navigate(`/administration/workflows/${workflow.id}`)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-primary-600 hover:bg-[var(--accent-bg)] transition-all\"\r\n title={t('workflows.edit')}\r\n >\r\n <Eye className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={(e) => handleToggleActive(workflow, e)}\r\n className={`p-2 rounded-lg transition-all ${\r\n workflow.isActive\r\n ? 'text-[var(--text-tertiary)] hover:text-[var(--warning-text)] hover:bg-[var(--warning-bg)]'\r\n : 'text-[var(--text-tertiary)] hover:text-[var(--success-text)] hover:bg-[var(--success-bg)]'\r\n }`}\r\n title={workflow.isActive ? t('workflows.deactivate') : t('workflows.activate')}\r\n >\r\n {workflow.isActive ? <Pause className=\"w-4 h-4\" /> : <Play className=\"w-4 h-4\" />}\r\n </button>\r\n <button\r\n onClick={(e) => { e.stopPropagation(); navigate(`/administration/workflows/${workflow.id}/edit`); }}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--info-text)] hover:bg-[var(--info-bg)] transition-all\"\r\n title={t('workflows.edit')}\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n </button>\r\n {!workflow.isSystem && (\r\n <button\r\n onClick={(e) => handleDelete(workflow, e)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n title={t('workflows.delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n </td>\r\n </tr>\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n\r\n const renderCardsView = () => (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {loading && (\r\n <div className=\"col-span-full flex flex-col items-center justify-center py-16\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-primary-500\" />\r\n <span className=\"mt-3 text-sm text-[var(--text-secondary)]\">{t('common.loading', { defaultValue: 'Chargement...' })}</span>\r\n </div>\r\n )}\r\n {!loading && paginatedWorkflows.length === 0 && (\r\n <div className=\"col-span-full flex flex-col items-center justify-center py-16\">\r\n <div className=\"w-16 h-16 rounded-lg bg-[var(--bg-secondary)] flex items-center justify-center mb-3\">\r\n <Workflow className=\"w-8 h-8 text-[var(--text-tertiary)]\" />\r\n </div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('workflows.noResults')}</span>\r\n </div>\r\n )}\r\n {!loading && paginatedWorkflows.length > 0 && (\r\n paginatedWorkflows.map(workflow => (\r\n <button\r\n key={workflow.id}\r\n onClick={() => navigate(`/administration/workflows/${workflow.id}`)}\r\n className=\"bg-[var(--bg-card)] border-2 border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)] rounded-[var(--radius-card)] overflow-hidden transition-all hover:shadow-lg hover:border-[var(--color-accent-400)] cursor-pointer flex flex-col text-left\"\r\n type=\"button\"\r\n >\r\n {/* Header with colored background */}\r\n <div className=\"bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20 p-4 border-b border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-10 h-10 rounded-lg bg-gradient-to-br from-emerald-500 to-teal-500 flex items-center justify-center shadow-lg\">\r\n <Workflow className=\"w-5 h-5 text-white\" />\r\n </div>\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)] truncate\">{workflow.name}</h3>\r\n <div className=\"flex items-center gap-1 text-xs text-[var(--text-tertiary)]\">\r\n <Zap className=\"w-3 h-3 text-amber-500\" />\r\n {workflow.triggerName}\r\n </div>\r\n </div>\r\n </div>\r\n {/* Status badge */}\r\n <div className=\"flex items-center gap-2\">\r\n {workflow.isSystem && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-400\">\r\n System\r\n </span>\r\n )}\r\n {isGlobalView && workflow.tenantName && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400\">\r\n {workflow.tenantName}\r\n </span>\r\n )}\r\n <span className={`inline-flex items-center gap-1.5 px-2 py-0.5 text-xs rounded-full font-medium ${\r\n workflow.isActive\r\n ? 'bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-400'\r\n : 'bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400'\r\n }`}>\r\n {workflow.isActive ? t('workflows.active') : t('workflows.inactive')}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n {/* Body */}\r\n <div className=\"p-4 flex flex-col flex-1\">\r\n {workflow.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] line-clamp-2 mb-3\">{workflow.description}</p>\r\n )}\r\n {/* Spacer */}\r\n <div className=\"flex-1\" />\r\n {/* Stats */}\r\n <div className=\"flex items-center gap-2 text-xs text-[var(--text-tertiary)] mb-3\">\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-md bg-[var(--bg-secondary)]\">\r\n {workflow.stepCount} {t('workflows.columns.steps').toLowerCase()}\r\n </span>\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-md bg-[var(--bg-secondary)]\">\r\n P{workflow.priority}\r\n </span>\r\n </div>\r\n {/* Actions */}\r\n <div className=\"flex items-center justify-end gap-1 pt-3 border-t border-[var(--border-color)]\" onClick={e => e.stopPropagation()}>\r\n <button\r\n onClick={() => navigate(`/administration/workflows/${workflow.id}`)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-primary-600 hover:bg-[var(--accent-bg)] transition-all\"\r\n title={t('workflows.view')}\r\n >\r\n <Eye className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={(e) => handleToggleActive(workflow, e)}\r\n className={`p-2 rounded-lg transition-all ${\r\n workflow.isActive\r\n ? 'text-[var(--text-tertiary)] hover:text-[var(--warning-text)] hover:bg-[var(--warning-bg)]'\r\n : 'text-[var(--text-tertiary)] hover:text-[var(--success-text)] hover:bg-[var(--success-bg)]'\r\n }`}\r\n title={workflow.isActive ? t('workflows.deactivate') : t('workflows.activate')}\r\n >\r\n {workflow.isActive ? <Pause className=\"w-4 h-4\" /> : <Play className=\"w-4 h-4\" />}\r\n </button>\r\n <button\r\n onClick={(e) => { e.stopPropagation(); navigate(`/administration/workflows/${workflow.id}/edit`); }}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--info-text)] hover:bg-[var(--info-bg)] transition-all\"\r\n title={t('workflows.edit')}\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n </button>\r\n {!workflow.isSystem && (\r\n <button\r\n onClick={(e) => handleDelete(workflow, e)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n title={t('workflows.delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </button>\r\n ))\r\n )}\r\n </div>\r\n );\r\n\r\n const renderKanbanView = () => (\r\n <div className=\"flex gap-6 overflow-x-auto pb-4\">\r\n {loading ? (\r\n <div className=\"flex-1 flex flex-col items-center justify-center py-16\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-primary-500\" />\r\n <span className=\"mt-3 text-sm text-[var(--text-secondary)]\">{t('common.loading', { defaultValue: 'Chargement...' })}</span>\r\n </div>\r\n ) : (\r\n <>\r\n {/* Active Workflows */}\r\n <div className=\"min-w-[320px] flex-1 rounded-lg p-2\">\r\n <div className=\"flex items-center gap-2 mb-4\">\r\n <span className=\"w-2 h-2 rounded-full bg-[var(--success-dot)]\" />\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">{t('workflows.active')}</h3>\r\n <span className=\"px-2 py-0.5 rounded-full text-xs font-medium bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {activeWorkflows.length}\r\n </span>\r\n </div>\r\n <div className=\"space-y-3 min-h-[100px]\">\r\n {activeWorkflows.map(workflow => (\r\n <button\r\n type=\"button\"\r\n key={workflow.id}\r\n onClick={() => navigate(`/administration/workflows/${workflow.id}`)}\r\n className=\"bg-[var(--bg-card)] border-2 border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)] rounded-[var(--radius-card)] overflow-hidden transition-all hover:shadow-md hover:border-[var(--color-accent-400)] cursor-pointer text-left w-full\"\r\n >\r\n <div className=\"bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20 p-3 border-b border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-8 h-8 rounded-lg bg-gradient-to-br from-emerald-500 to-teal-500 flex items-center justify-center shadow-md\">\r\n <Workflow className=\"w-4 h-4 text-white\" />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"font-medium text-sm text-[var(--text-primary)] truncate\">{workflow.name}</p>\r\n <div className=\"flex items-center gap-1 text-xs text-[var(--text-tertiary)]\">\r\n <Zap className=\"w-3 h-3 text-amber-500\" />\r\n {workflow.triggerName}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"p-3 flex items-center justify-between\">\r\n <span className=\"text-xs px-2 py-0.5 rounded-md bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {workflow.stepCount} steps\r\n </span>\r\n <span\r\n onClick={(e) => handleToggleActive(workflow, e)}\r\n role=\"button\"\r\n tabIndex={-1}\r\n className=\"text-xs px-2 py-1 rounded-md bg-[var(--warning-bg)] text-[var(--warning-text)] hover:opacity-80 transition-opacity\"\r\n >\r\n {t('workflows.deactivate')}\r\n </span>\r\n </div>\r\n </button>\r\n ))}\r\n {activeWorkflows.length === 0 && (\r\n <div className=\"border border-dashed border-[var(--border-color)] rounded-lg p-6 text-center\">\r\n <Play className=\"w-6 h-6 mx-auto mb-2 text-[var(--text-muted)]\" />\r\n <p className=\"text-xs text-[var(--text-muted)]\">{t('workflows.noResults')}</p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Inactive Workflows */}\r\n <div className=\"min-w-[320px] flex-1 rounded-lg p-2\">\r\n <div className=\"flex items-center gap-2 mb-4\">\r\n <span className=\"w-2 h-2 rounded-full bg-[var(--text-muted)]\" />\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">{t('workflows.inactive')}</h3>\r\n <span className=\"px-2 py-0.5 rounded-full text-xs font-medium bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {inactiveWorkflows.length}\r\n </span>\r\n </div>\r\n <div className=\"space-y-3 min-h-[100px]\">\r\n {inactiveWorkflows.map(workflow => (\r\n <button\r\n type=\"button\"\r\n key={workflow.id}\r\n onClick={() => navigate(`/administration/workflows/${workflow.id}`)}\r\n className=\"bg-[var(--bg-card)] border-2 border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)] rounded-[var(--radius-card)] overflow-hidden transition-all hover:shadow-md hover:border-[var(--color-accent-400)] cursor-pointer opacity-75 text-left w-full\"\r\n >\r\n <div className=\"bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20 p-3 border-b border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-8 h-8 rounded-lg bg-gradient-to-br from-gray-400 to-gray-500 flex items-center justify-center shadow-md\">\r\n <Workflow className=\"w-4 h-4 text-white\" />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"font-medium text-sm text-[var(--text-primary)] truncate\">{workflow.name}</p>\r\n <div className=\"flex items-center gap-1 text-xs text-[var(--text-tertiary)]\">\r\n <Zap className=\"w-3 h-3 text-amber-500\" />\r\n {workflow.triggerName}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"p-3 flex items-center justify-between\">\r\n <span className=\"text-xs px-2 py-0.5 rounded-md bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {workflow.stepCount} steps\r\n </span>\r\n <span\r\n onClick={(e) => handleToggleActive(workflow, e)}\r\n role=\"button\"\r\n tabIndex={-1}\r\n className=\"text-xs px-2 py-1 rounded-md bg-[var(--success-bg)] text-[var(--success-text)] hover:opacity-80 transition-opacity\"\r\n >\r\n {t('workflows.activate')}\r\n </span>\r\n </div>\r\n </button>\r\n ))}\r\n {inactiveWorkflows.length === 0 && (\r\n <div className=\"border border-dashed border-[var(--border-color)] rounded-lg p-6 text-center\">\r\n <Pause className=\"w-6 h-6 mx-auto mb-2 text-[var(--text-muted)]\" />\r\n <p className=\"text-xs text-[var(--text-muted)]\">{t('workflows.noResults')}</p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('workflows.title') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex flex-col sm:flex-row sm:items-center justify-between gap-4\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{t('workflows.title')}</h1>\r\n <p className=\"text-sm text-[var(--text-tertiary)] mt-1\">\r\n {workflows.length} workflows\r\n </p>\r\n </div>\r\n <button\r\n onClick={() => navigate('/administration/workflows/create')}\r\n className=\"btn btn-primary\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('workflows.create')}\r\n </button>\r\n </div>\r\n\r\n {/* Toolbar */}\r\n <div className=\"card p-4\">\r\n <div className=\"flex flex-col md:flex-row md:items-center justify-between gap-4\">\r\n {/* Search & Filters */}\r\n <form onSubmit={handleSearch} className=\"flex items-center gap-3 flex-1\">\r\n <div className=\"relative flex-1 max-w-md\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-muted)]\" />\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={e => setSearch(e.target.value)}\r\n placeholder={t('workflows.searchPlaceholder')}\r\n className=\"input w-full pl-10\"\r\n />\r\n </div>\r\n <button type=\"submit\" className=\"btn btn-secondary\">\r\n <Filter className=\"w-4 h-4\" />\r\n <span className=\"hidden sm:inline\">Filtres</span>\r\n </button>\r\n </form>\r\n\r\n {/* View Toggle */}\r\n <ViewToggle\r\n viewMode={viewMode}\r\n onChange={setViewMode}\r\n tableLabel=\"Table\"\r\n cardsLabel=\"Cards\"\r\n kanbanLabel=\"Kanban\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Content based on view mode */}\r\n {viewMode === 'table' && renderTableView()}\r\n {viewMode === 'cards' && renderCardsView()}\r\n {viewMode === 'kanban' && renderKanbanView()}\r\n\r\n {/* Pagination (only for table and cards) */}\r\n {viewMode !== 'kanban' && workflows.length > 0 && (\r\n <Pagination\r\n page={page}\r\n totalPages={totalPages}\r\n totalCount={workflows.length}\r\n pageSize={pageSize}\r\n onPageChange={setPage}\r\n itemLabel=\"workflows\"\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Zap, Loader2, Info } from 'lucide-react';\r\nimport { communicationsApi, type WorkflowTriggerDto } from '@/services/api/communicationsApi';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\nexport function WorkflowsTriggersPage(): ReactElement {\r\n const { t } = useTranslation('communications');\r\n const [triggers, setTriggers] = useState<WorkflowTriggerDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [selectedTrigger, setSelectedTrigger] = useState<WorkflowTriggerDto | null>(null);\r\n\r\n useEffect(() => {\r\n const loadTriggers = async () => {\r\n try {\r\n setLoading(true);\r\n const data = await communicationsApi.triggers.getAll();\r\n setTriggers(Array.isArray(data) ? data : []);\r\n } catch (err) {\r\n console.error('Failed to load triggers:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n loadTriggers();\r\n }, []);\r\n\r\n const getTriggerTypeStyles = (type: string) => {\r\n switch (type) {\r\n case 'UserEvent':\r\n return 'bg-blue-500/10 text-blue-600 dark:text-blue-400 border-blue-500/20';\r\n case 'TicketEvent':\r\n return 'bg-purple-500/10 text-purple-600 dark:text-purple-400 border-purple-500/20';\r\n case 'SystemEvent':\r\n return 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)] border-[var(--border-color)]';\r\n case 'Scheduled':\r\n return 'bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-500/20';\r\n default:\r\n return 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)] border-[var(--border-color)]';\r\n }\r\n };\r\n\r\n const parseVariables = (variablesJson: string | null): string[] => {\r\n if (!variablesJson) return [];\r\n try {\r\n return JSON.parse(variablesJson);\r\n } catch {\r\n return [];\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('header.title'), href: '/administration' },\r\n { label: t('workflows.title'), href: '/administration/workflows' },\r\n { label: t('triggers.title') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{t('triggers.title')}</h1>\r\n <p className=\"text-sm text-[var(--text-tertiary)] mt-1\">{t('triggers.description')}</p>\r\n </div>\r\n\r\n {loading ? (\r\n <div className=\"flex flex-col items-center justify-center py-16\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-primary-500\" />\r\n <span className=\"mt-3 text-sm text-[var(--text-secondary)]\">{t('workflows.loadingTriggers')}</span>\r\n </div>\r\n ) : (\r\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\r\n {/* Triggers List */}\r\n <div className=\"lg:col-span-2 space-y-3\">\r\n {triggers.map((trigger) => {\r\n const variables = parseVariables(trigger.availableVariablesJson);\r\n return (\r\n <button\r\n type=\"button\"\r\n key={trigger.id}\r\n onClick={() => setSelectedTrigger(trigger)}\r\n className={`card p-4 cursor-pointer transition-all text-left w-full ${\r\n selectedTrigger?.id === trigger.id\r\n ? 'ring-2 ring-[var(--color-accent-500)] border-[var(--color-accent-500)]'\r\n : 'hover:border-[var(--color-accent-500)]/50'\r\n }`}\r\n >\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"flex items-start gap-3\">\r\n <div className=\"p-2.5 rounded-lg bg-amber-500/10\">\r\n <Zap className=\"w-5 h-5 text-amber-500\" />\r\n </div>\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">{trigger.name}</h3>\r\n <code className=\"text-sm text-[var(--text-tertiary)] bg-[var(--bg-secondary)] px-1.5 py-0.5 rounded\">{trigger.code}</code>\r\n </div>\r\n </div>\r\n <span className={`px-2 py-1 rounded-[var(--radius-badge)] text-xs font-medium border ${getTriggerTypeStyles(trigger.triggerType)}`}>\r\n {trigger.triggerType}\r\n </span>\r\n </div>\r\n <div className=\"mt-3 flex items-center gap-4 text-sm text-[var(--text-tertiary)]\">\r\n <span>{variables.length} {t('triggers.variables')}</span>\r\n </div>\r\n </button>\r\n );\r\n })}\r\n\r\n {triggers.length === 0 && (\r\n <div className=\"card p-12 text-center\">\r\n <Zap className=\"w-12 h-12 mx-auto text-[var(--text-muted)] mb-3\" />\r\n <p className=\"text-[var(--text-secondary)]\">No triggers available</p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Details Panel */}\r\n <div className=\"lg:col-span-1\">\r\n {selectedTrigger ? (\r\n <div className=\"card p-5 sticky top-6\">\r\n <div className=\"flex items-center gap-2 mb-5 pb-4 border-b border-[var(--border-color)]\">\r\n <div className=\"p-2 rounded-lg bg-[var(--accent-bg)]\">\r\n <Info className=\"w-5 h-5 text-[var(--accent-text)]\" />\r\n </div>\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('triggers.details')}</h2>\r\n </div>\r\n\r\n <div className=\"space-y-5\">\r\n <div>\r\n <label className=\"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wider\">{t('triggers.name')}</label>\r\n <p className=\"font-medium text-[var(--text-primary)] mt-1\">{selectedTrigger.name}</p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wider\">{t('triggers.code')}</label>\r\n <code className=\"block bg-[var(--bg-secondary)] px-3 py-2 rounded-lg text-sm text-[var(--text-primary)] mt-1 font-mono\">\r\n {selectedTrigger.code}\r\n </code>\r\n </div>\r\n\r\n <div>\r\n <label className=\"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wider\">{t('triggers.type')}</label>\r\n <div className=\"mt-1\">\r\n <span className={`inline-flex px-2.5 py-1 rounded-[var(--radius-badge)] text-xs font-medium border ${getTriggerTypeStyles(selectedTrigger.triggerType)}`}>\r\n {selectedTrigger.triggerType}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wider\">{t('triggers.availableVariables')}</label>\r\n <div className=\"mt-2 space-y-1.5 max-h-48 overflow-y-auto\">\r\n {parseVariables(selectedTrigger.availableVariablesJson).map((variable) => (\r\n <code\r\n key={variable}\r\n className=\"flex items-center gap-2 bg-[var(--bg-secondary)] px-3 py-2 rounded-lg text-xs text-[var(--text-primary)] font-mono\"\r\n >\r\n <span className=\"text-amber-500\">{`{{`}</span>\r\n <span>{variable}</span>\r\n <span className=\"text-amber-500\">{`}}`}</span>\r\n </code>\r\n ))}\r\n {parseVariables(selectedTrigger.availableVariablesJson).length === 0 && (\r\n <p className=\"text-sm text-[var(--text-muted)] italic\">No variables available</p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"card p-8 text-center bg-[var(--bg-secondary)]/50\">\r\n <div className=\"w-16 h-16 rounded-full bg-[var(--bg-secondary)] flex items-center justify-center mx-auto mb-4\">\r\n <Info className=\"w-8 h-8 text-[var(--text-muted)]\" />\r\n </div>\r\n <p className=\"text-[var(--text-secondary)]\">{t('triggers.selectToViewDetails')}</p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ArrowLeft, Save, Loader2, Zap, Workflow } from 'lucide-react';\r\nimport { communicationsApi, type WorkflowTriggerDto } from '@/services/api/communicationsApi';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\ninterface CreateWorkflowForm {\r\n code: string;\r\n name: string;\r\n description: string;\r\n triggerId: string;\r\n priority: number;\r\n}\r\n\r\nexport function WorkflowCreatePage(): ReactElement {\r\n const { t } = useTranslation('communications');\r\n const navigate = useNavigate();\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [triggers, setTriggers] = useState<WorkflowTriggerDto[]>([]);\r\n const [loadingTriggers, setLoadingTriggers] = useState(true);\r\n const [formData, setFormData] = useState<CreateWorkflowForm>({\r\n code: '',\r\n name: '',\r\n description: '',\r\n triggerId: '',\r\n priority: 0\r\n });\r\n\r\n useEffect(() => {\r\n const loadTriggers = async () => {\r\n try {\r\n setLoadingTriggers(true);\r\n const data = await communicationsApi.triggers.getAll();\r\n setTriggers(data);\r\n } catch (err) {\r\n console.error('Failed to load triggers:', err);\r\n } finally {\r\n setLoadingTriggers(false);\r\n }\r\n };\r\n loadTriggers();\r\n }, []);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setSaving(true);\r\n setError(null);\r\n\r\n try {\r\n const data = await communicationsApi.workflows.create({\r\n code: formData.code,\r\n name: formData.name,\r\n description: formData.description || undefined,\r\n triggerId: formData.triggerId,\r\n priority: formData.priority\r\n });\r\n navigate(`/administration/workflows/${data.id}`);\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'An error occurred while creating the workflow';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const selectedTrigger = triggers.find(t => t.id === formData.triggerId);\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('workflows.title'), href: '/administration/workflows' },\r\n { label: t('workflows.create', 'Create') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"max-w-2xl\">\r\n <button\r\n onClick={() => navigate('/administration/workflows/list')}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors mb-4\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('workflows.backToList')}\r\n </button>\r\n\r\n <div className=\"flex items-center gap-4\">\r\n <div className=\"w-12 h-12 rounded-full bg-gradient-to-br from-emerald-500 to-teal-500 flex items-center justify-center shadow-lg shadow-emerald-500/20\">\r\n <Workflow className=\"w-6 h-6 text-white\" />\r\n </div>\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{t('workflows.createTitle')}</h1>\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">{t('workflows.description')}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Form */}\r\n <form onSubmit={handleSubmit} className=\"space-y-6 max-w-2xl\">\r\n {error && (\r\n <div className=\"p-4 rounded-lg bg-[var(--error-bg)] text-[var(--error-text)] text-sm border border-[var(--error-border)]\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div className=\"card p-6 space-y-5\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1.5\">\r\n {t('workflows.form.code')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={formData.code}\r\n onChange={(e) => setFormData(prev => ({ ...prev, code: e.target.value.toLowerCase().replace(/[^a-z0-9-]/g, '-') }))}\r\n placeholder=\"e.g., user-welcome-flow\"\r\n className=\"input w-full\"\r\n />\r\n <p className=\"text-xs text-[var(--text-muted)] mt-1.5\">{t('workflows.form.codeHelp')}</p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1.5\">\r\n {t('workflows.form.name')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={formData.name}\r\n onChange={(e) => setFormData(prev => ({ ...prev, name: e.target.value }))}\r\n placeholder=\"e.g., User Welcome Flow\"\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1.5\">\r\n {t('workflows.form.description')}\r\n </label>\r\n <textarea\r\n value={formData.description}\r\n onChange={(e) => setFormData(prev => ({ ...prev, description: e.target.value }))}\r\n rows={3}\r\n placeholder={t('workflows.form.descriptionPlaceholder')}\r\n className=\"input w-full resize-none\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1.5\">\r\n {t('workflows.form.trigger')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n {loadingTriggers ? (\r\n <div className=\"flex items-center gap-2 text-[var(--text-secondary)] py-2\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {t('workflows.loadingTriggers')}\r\n </div>\r\n ) : (\r\n <select\r\n required\r\n value={formData.triggerId}\r\n onChange={(e) => setFormData(prev => ({ ...prev, triggerId: e.target.value }))}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">{t('workflows.form.selectTrigger')}</option>\r\n {triggers.map(trigger => (\r\n <option key={trigger.id} value={trigger.id}>\r\n {trigger.name} ({trigger.code})\r\n </option>\r\n ))}\r\n </select>\r\n )}\r\n {selectedTrigger && (\r\n <div className=\"mt-3 p-3 rounded-lg bg-[var(--bg-secondary)] border border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2 text-sm text-[var(--text-secondary)]\">\r\n <Zap className=\"w-4 h-4 text-amber-500\" />\r\n <span>{t('workflows.form.triggerSelected')}</span>\r\n </div>\r\n <div className=\"mt-2 flex items-center gap-2\">\r\n <span className=\"text-xs px-2 py-0.5 rounded-[var(--radius-badge)] bg-amber-500/10 text-amber-600 border border-amber-500/20\">\r\n {selectedTrigger.triggerType}\r\n </span>\r\n <code className=\"text-xs text-[var(--text-tertiary)]\">{selectedTrigger.code}</code>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1.5\">\r\n {t('workflows.form.priority')}\r\n </label>\r\n <div className=\"flex items-center gap-4\">\r\n <input\r\n type=\"range\"\r\n min={0}\r\n max={100}\r\n value={formData.priority}\r\n onChange={(e) => setFormData(prev => ({ ...prev, priority: parseInt(e.target.value) || 0 }))}\r\n className=\"flex-1 h-2 bg-[var(--bg-secondary)] rounded-lg appearance-none cursor-pointer accent-[var(--color-accent-600)]\"\r\n />\r\n <input\r\n type=\"number\"\r\n min={0}\r\n max={100}\r\n value={formData.priority}\r\n onChange={(e) => setFormData(prev => ({ ...prev, priority: Math.min(100, Math.max(0, parseInt(e.target.value) || 0)) }))}\r\n className=\"input w-20 text-center\"\r\n />\r\n </div>\r\n <p className=\"text-xs text-[var(--text-muted)] mt-1.5\">{t('workflows.form.priorityHelp')}</p>\r\n </div>\r\n </div>\r\n\r\n {/* Actions */}\r\n <div className=\"flex justify-end gap-3\">\r\n <button\r\n type=\"button\"\r\n onClick={() => navigate('/administration/workflows/list')}\r\n className=\"btn btn-secondary\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={saving || !formData.triggerId}\r\n className=\"btn btn-primary disabled:opacity-50\"\r\n >\r\n {saving ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useParams, useNavigate, Link } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n ArrowLeft,\r\n Settings,\r\n Loader2,\r\n Edit,\r\n Trash2,\r\n Play,\r\n Pause,\r\n Lock,\r\n AlertTriangle,\r\n CheckCircle,\r\n ListOrdered,\r\n Mail,\r\n Clock,\r\n GitBranch,\r\n Webhook,\r\n Plus\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n communicationsApi,\r\n type WorkflowDetailDto,\r\n type WorkflowStepDto\r\n} from '@/services/api/communicationsApi';\r\n\r\ntype TabId = 'info' | 'steps';\r\n\r\n// Step type icons mapping\r\nconst stepTypeIcons: Record<string, React.ReactNode> = {\r\n SendEmail: <Mail className=\"w-4 h-4\" />,\r\n Wait: <Clock className=\"w-4 h-4\" />,\r\n Condition: <GitBranch className=\"w-4 h-4\" />,\r\n Webhook: <Webhook className=\"w-4 h-4\" />\r\n};\r\n\r\n// Step type colors\r\nconst stepTypeColors: Record<string, string> = {\r\n SendEmail: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\r\n Wait: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\r\n Condition: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400',\r\n Webhook: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400'\r\n};\r\n\r\nexport function WorkflowDetailPage(): ReactElement {\r\n const { t } = useTranslation('communications');\r\n const { id: workflowId } = useParams<{ id: string }>();\r\n const navigate = useNavigate();\r\n\r\n const [workflow, setWorkflow] = useState<WorkflowDetailDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [activeTab, setActiveTab] = useState<TabId>('info');\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n const [actionLoading, setActionLoading] = useState(false);\r\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\r\n\r\n const loadWorkflow = useCallback(async () => {\r\n if (!workflowId) return;\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const data = await communicationsApi.workflows.getById(workflowId);\r\n setWorkflow(data);\r\n } catch (err) {\r\n console.error('Failed to load workflow:', err);\r\n setError(t('workflows.detail.errors.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [workflowId, t]);\r\n\r\n useEffect(() => {\r\n loadWorkflow();\r\n }, [loadWorkflow]);\r\n\r\n const handleActivate = async () => {\r\n if (!workflowId) return;\r\n try {\r\n setActionLoading(true);\r\n setError(null);\r\n await communicationsApi.workflows.activate(workflowId);\r\n setSuccess(t('workflows.detail.success.activated'));\r\n loadWorkflow();\r\n } catch (err) {\r\n console.error('Failed to activate workflow:', err);\r\n setError(t('workflows.detail.errors.activateFailed'));\r\n } finally {\r\n setActionLoading(false);\r\n }\r\n };\r\n\r\n const handleDeactivate = async () => {\r\n if (!workflowId) return;\r\n try {\r\n setActionLoading(true);\r\n setError(null);\r\n await communicationsApi.workflows.deactivate(workflowId);\r\n setSuccess(t('workflows.detail.success.deactivated'));\r\n loadWorkflow();\r\n } catch (err) {\r\n console.error('Failed to deactivate workflow:', err);\r\n setError(t('workflows.detail.errors.deactivateFailed'));\r\n } finally {\r\n setActionLoading(false);\r\n }\r\n };\r\n\r\n const handleDelete = async () => {\r\n if (!workflowId || !workflow) return;\r\n\r\n if (workflow.isSystem) {\r\n setError(t('workflows.cannotDeleteSystem'));\r\n return;\r\n }\r\n\r\n try {\r\n setActionLoading(true);\r\n setError(null);\r\n await communicationsApi.workflows.delete(workflowId);\r\n navigate('/administration/workflows/list');\r\n } catch (err) {\r\n console.error('Failed to delete workflow:', err);\r\n setError(t('workflows.detail.errors.deleteFailed'));\r\n setShowDeleteConfirm(false);\r\n } finally {\r\n setActionLoading(false);\r\n }\r\n };\r\n\r\n const tabs: { id: TabId; label: string; icon: React.ReactNode }[] = [\r\n { id: 'info', label: t('workflows.detail.tabs.info'), icon: <Settings className=\"w-4 h-4\" /> },\r\n { id: 'steps', label: t('workflows.detail.tabs.steps'), icon: <ListOrdered className=\"w-4 h-4\" /> }\r\n ];\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (!workflow) {\r\n return (\r\n <div className=\"text-center py-12\">\r\n <p className=\"text-[var(--text-secondary)]\">{t('workflows.detail.notFound')}</p>\r\n <button\r\n onClick={() => navigate('/administration/workflows/list')}\r\n className=\"mt-4 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white\"\r\n >\r\n {t('workflows.backToList')}\r\n </button>\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('header.title'), href: '/administration' },\r\n { label: t('workflows.title'), href: '/administration/workflows' },\r\n { label: workflow?.name || '' }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center gap-4\">\r\n <button\r\n onClick={() => navigate('/administration/workflows/list')}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3\">\r\n <h1 className=\"text-xl sm:text-2xl font-bold text-[var(--text-primary)]\">{workflow.name}</h1>\r\n {workflow.isSystem && (\r\n <span className=\"flex items-center gap-1 px-2 py-1 rounded-[var(--radius-badge)] text-xs bg-[var(--warning-bg)] text-[var(--warning-text)] border border-[var(--warning-border)]\">\r\n <Lock className=\"w-3 h-3\" />\r\n {t('workflows.detail.system')}\r\n </span>\r\n )}\r\n {workflow.tenantName && (\r\n <span className=\"flex items-center gap-1 px-2 py-1 rounded-[var(--radius-badge)] text-xs bg-[var(--bg-secondary)] text-[var(--text-secondary)] border border-[var(--border-color)]\">\r\n {workflow.tenantName}\r\n </span>\r\n )}\r\n <span className={`px-2 py-1 rounded-[var(--radius-badge)] text-xs font-medium ${\r\n workflow.isActive\r\n ? 'bg-[var(--success-bg)] text-[var(--success-text)] border border-[var(--success-border)]'\r\n : 'bg-[var(--error-bg)] text-[var(--error-text)] border border-[var(--error-border)]'\r\n }`}>\r\n {workflow.isActive ? t('workflows.active') : t('workflows.inactive')}\r\n </span>\r\n </div>\r\n {workflow.description && (\r\n <p className=\"text-sm sm:text-base text-[var(--text-secondary)] mt-1\">{workflow.description}</p>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n {!workflow.isSystem && (\r\n <>\r\n <button\r\n onClick={() => navigate(`/administration/workflows/${workflowId}/edit`)}\r\n className=\"flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] transition-colors\"\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n <span className=\"hidden sm:inline\">{t('workflows.edit')}</span>\r\n </button>\r\n <button\r\n onClick={workflow.isActive ? handleDeactivate : handleActivate}\r\n disabled={actionLoading}\r\n className={`flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] border transition-colors ${\r\n workflow.isActive\r\n ? 'border-[var(--warning-border)] text-[var(--warning-text)] hover:bg-[var(--warning-bg)]'\r\n : 'border-[var(--success-border)] text-[var(--success-text)] hover:bg-[var(--success-bg)]'\r\n }`}\r\n >\r\n {actionLoading && (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n )}\r\n {!actionLoading && workflow.isActive && (\r\n <Pause className=\"w-4 h-4\" />\r\n )}\r\n {!actionLoading && !workflow.isActive && (\r\n <Play className=\"w-4 h-4\" />\r\n )}\r\n <span className=\"hidden sm:inline\">\r\n {workflow.isActive ? t('workflows.deactivate') : t('workflows.activate')}\r\n </span>\r\n </button>\r\n <button\r\n onClick={() => setShowDeleteConfirm(true)}\r\n className=\"flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] border border-[var(--error-border)] text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-colors\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n <span className=\"hidden sm:inline\">{t('workflows.delete')}</span>\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Alerts */}\r\n {error && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)] text-[var(--error-text)] flex items-center gap-2\">\r\n <AlertTriangle className=\"w-5 h-5 flex-shrink-0\" />\r\n {error}\r\n </div>\r\n )}\r\n {success && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--success-bg)] border border-[var(--success-border)] text-[var(--success-text)] flex items-center gap-2\">\r\n <CheckCircle className=\"w-5 h-5 flex-shrink-0\" />\r\n {success}\r\n </div>\r\n )}\r\n\r\n {/* System workflow warning */}\r\n {workflow.isSystem && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--warning-bg)] border border-[var(--warning-border)] text-[var(--warning-text)] flex items-center gap-2\">\r\n <Lock className=\"w-5 h-5 flex-shrink-0\" />\r\n {t('workflows.detail.systemReadOnly')}\r\n </div>\r\n )}\r\n\r\n {/* Tabs */}\r\n <div className=\"flex gap-1 p-1 bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n {tabs.map(tab => (\r\n <button\r\n key={tab.id}\r\n onClick={() => setActiveTab(tab.id)}\r\n className={`flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium transition-colors ${\r\n activeTab === tab.id\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n {tab.icon}\r\n <span className=\"hidden sm:inline\">{tab.label}</span>\r\n {tab.id === 'steps' && (\r\n <span className={`ml-1 px-1.5 py-0.5 rounded text-xs ${\r\n activeTab === tab.id ? 'bg-white/20' : 'bg-[var(--bg-tertiary)]'\r\n }`}>\r\n {workflow.steps.length}\r\n </span>\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div className=\"bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4 sm:p-6\">\r\n {/* Info Tab */}\r\n {activeTab === 'info' && (\r\n <div className=\"space-y-6\">\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.form.code')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)] font-mono text-sm\">\r\n {workflow.code}\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.form.name')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)]\">\r\n {workflow.name}\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.form.description')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)] min-h-[60px]\">\r\n {workflow.description || <span className=\"text-[var(--text-tertiary)]\">-</span>}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.form.trigger')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)]\">\r\n <div className=\"font-medium\">{workflow.triggerName}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)] font-mono\">{workflow.triggerCode}</div>\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.form.priority')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)]\">\r\n {workflow.priority}\r\n </div>\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 text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.detail.createdAt')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)] text-sm\">\r\n {new Date(workflow.createdAt).toLocaleString()}\r\n </div>\r\n </div>\r\n {workflow.updatedAt && (\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.detail.updatedAt')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)] text-sm\">\r\n {new Date(workflow.updatedAt).toLocaleString()}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Steps Tab */}\r\n {activeTab === 'steps' && (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('workflows.detail.stepsTitle')} ({workflow.steps.length})\r\n </h3>\r\n {!workflow.isSystem && (\r\n <Link\r\n to={`/administration/workflows/${workflowId}/edit`}\r\n className=\"flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('workflows.detail.addStep')}\r\n </Link>\r\n )}\r\n </div>\r\n\r\n {workflow.steps.length === 0 ? (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n <ListOrdered className=\"w-12 h-12 mx-auto mb-4 opacity-50\" />\r\n <p>{t('workflows.detail.noSteps')}</p>\r\n {!workflow.isSystem && (\r\n <Link\r\n to={`/administration/workflows/${workflowId}/edit`}\r\n className=\"inline-flex items-center gap-2 mt-4 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('workflows.detail.addFirstStep')}\r\n </Link>\r\n )}\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3\">\r\n {workflow.steps\r\n .sort((a, b) => a.stepOrder - b.stepOrder)\r\n .map((step, index) => (\r\n <StepCard\r\n key={step.id}\r\n step={step}\r\n index={index}\r\n isLast={index === workflow.steps.length - 1}\r\n t={t}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Delete Confirmation Modal */}\r\n {showDeleteConfirm && (\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-[var(--radius-card)] border border-[var(--border-color)] p-6 max-w-md w-full shadow-xl\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-2\">\r\n {t('workflows.detail.confirmDelete.title')}\r\n </h3>\r\n <p className=\"text-[var(--text-secondary)] mb-6\">\r\n {t('workflows.confirmDelete', { name: workflow.name })}\r\n </p>\r\n <div className=\"flex justify-end gap-3\">\r\n <button\r\n onClick={() => setShowDeleteConfirm(false)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n onClick={handleDelete}\r\n disabled={actionLoading}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--error-600)] hover:bg-[var(--error-700)] text-white font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {actionLoading ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Trash2 className=\"w-4 h-4\" />\r\n )}\r\n {t('workflows.delete')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// Step Card Component\r\ninterface StepCardProps {\r\n readonly step: WorkflowStepDto;\r\n readonly index: number;\r\n readonly isLast: boolean;\r\n readonly t: (key: string, options?: Record<string, unknown>) => string;\r\n}\r\n\r\nfunction StepCard({ step, index, isLast, t }: StepCardProps) {\r\n const stepIcon = stepTypeIcons[step.stepType] || <Settings className=\"w-4 h-4\" />;\r\n const stepColor = stepTypeColors[step.stepType] || 'bg-gray-100 text-gray-700';\r\n\r\n const getStepDetails = () => {\r\n switch (step.stepType) {\r\n case 'SendEmail':\r\n return step.emailTemplateName\r\n ? t('workflows.detail.stepDetails.emailTemplate', { template: step.emailTemplateName })\r\n : t('workflows.detail.stepDetails.noTemplate');\r\n case 'Wait':\r\n return t('workflows.detail.stepDetails.waitMinutes', { minutes: step.delayMinutes || 0 });\r\n case 'Condition':\r\n return t('workflows.detail.stepDetails.condition');\r\n case 'Webhook':\r\n if (step.configurationJson) {\r\n try {\r\n const config = JSON.parse(step.configurationJson);\r\n return config.url || t('workflows.detail.stepDetails.webhookConfigured');\r\n } catch {\r\n return t('workflows.detail.stepDetails.webhookConfigured');\r\n }\r\n }\r\n return t('workflows.detail.stepDetails.noWebhook');\r\n default:\r\n return '';\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"relative\">\r\n {/* Connection line */}\r\n {!isLast && (\r\n <div className=\"absolute left-6 top-14 bottom-0 w-0.5 bg-[var(--border-color)]\" style={{ height: 'calc(100% - 20px)' }} />\r\n )}\r\n\r\n <div className=\"flex items-start gap-4 p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)] hover:border-[var(--color-accent-300)] transition-colors\">\r\n {/* Step number */}\r\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] flex items-center justify-center\">\r\n <span className=\"text-sm font-bold text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)]\">\r\n {index + 1}\r\n </span>\r\n </div>\r\n\r\n {/* Step content */}\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n <span className={`flex items-center gap-1.5 px-2 py-0.5 rounded-full text-xs font-medium ${stepColor}`}>\r\n {stepIcon}\r\n {t(`workflows.stepTypes.${step.stepType}`)}\r\n </span>\r\n </div>\r\n <div className=\"font-medium text-[var(--text-primary)]\">{step.name}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)] mt-0.5\">{getStepDetails()}</div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default WorkflowDetailPage;\r\n","import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Plus,\r\n Loader2,\r\n AlertTriangle,\r\n CheckCircle,\r\n Mail,\r\n Clock,\r\n GitBranch,\r\n Webhook,\r\n Settings,\r\n Trash2,\r\n Edit,\r\n ChevronUp,\r\n ChevronDown,\r\n X,\r\n ListOrdered\r\n} from 'lucide-react';\r\nimport {\r\n communicationsApi,\r\n type WorkflowStepDto,\r\n type CreateWorkflowStepRequest,\r\n type UpdateWorkflowStepRequest,\r\n type EmailTemplateListDto\r\n} from '@/services/api/communicationsApi';\r\n\r\ninterface WorkflowStepsEditorProps {\r\n readonly workflowId: string;\r\n readonly steps: WorkflowStepDto[];\r\n readonly onStepsChange: () => void;\r\n readonly readOnly?: boolean;\r\n}\r\n\r\n// Step type icons mapping\r\nconst stepTypeIcons: Record<string, React.ReactNode> = {\r\n SendEmail: <Mail className=\"w-4 h-4\" />,\r\n Wait: <Clock className=\"w-4 h-4\" />,\r\n Condition: <GitBranch className=\"w-4 h-4\" />,\r\n Webhook: <Webhook className=\"w-4 h-4\" />\r\n};\r\n\r\n// Step type colors\r\nconst stepTypeColors: Record<string, string> = {\r\n SendEmail: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\r\n Wait: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\r\n Condition: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400',\r\n Webhook: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400'\r\n};\r\n\r\nconst stepTypes = ['SendEmail', 'Wait', 'Condition', 'Webhook'];\r\n\r\nexport function WorkflowStepsEditor({ workflowId, steps, onStepsChange, readOnly = false }: WorkflowStepsEditorProps): ReactElement {\r\n const { t } = useTranslation('communications');\r\n\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n const [showAddModal, setShowAddModal] = useState(false);\r\n const [showEditModal, setShowEditModal] = useState(false);\r\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\r\n const [editingStep, setEditingStep] = useState<WorkflowStepDto | null>(null);\r\n const [emailTemplates, setEmailTemplates] = useState<EmailTemplateListDto[]>([]);\r\n const [loadingTemplates, setLoadingTemplates] = useState(false);\r\n\r\n // Form state\r\n const [formData, setFormData] = useState({\r\n name: '',\r\n stepType: '',\r\n emailTemplateId: '',\r\n delayMinutes: 5,\r\n configurationJson: ''\r\n });\r\n\r\n // Load email templates when needed\r\n const loadEmailTemplates = async () => {\r\n if (emailTemplates.length > 0) return;\r\n try {\r\n setLoadingTemplates(true);\r\n const templates = await communicationsApi.emailTemplates.getAll({ isActive: true });\r\n setEmailTemplates(templates);\r\n } catch (err) {\r\n console.error('Failed to load email templates:', err);\r\n } finally {\r\n setLoadingTemplates(false);\r\n }\r\n };\r\n\r\n const resetForm = () => {\r\n setFormData({\r\n name: '',\r\n stepType: '',\r\n emailTemplateId: '',\r\n delayMinutes: 5,\r\n configurationJson: ''\r\n });\r\n };\r\n\r\n const handleOpenAddModal = () => {\r\n resetForm();\r\n loadEmailTemplates();\r\n setShowAddModal(true);\r\n };\r\n\r\n const handleOpenEditModal = (step: WorkflowStepDto) => {\r\n setEditingStep(step);\r\n loadEmailTemplates();\r\n setFormData({\r\n name: step.name,\r\n stepType: step.stepType,\r\n emailTemplateId: step.emailTemplateId || '',\r\n delayMinutes: step.delayMinutes || 5,\r\n configurationJson: step.configurationJson || ''\r\n });\r\n setShowEditModal(true);\r\n };\r\n\r\n const handleOpenDeleteConfirm = (step: WorkflowStepDto) => {\r\n setEditingStep(step);\r\n setShowDeleteConfirm(true);\r\n };\r\n\r\n const handleAddStep = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!formData.name || !formData.stepType) {\r\n setError(t('workflows.steps.errors.nameRequired'));\r\n return;\r\n }\r\n\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n\r\n const request: CreateWorkflowStepRequest = {\r\n name: formData.name,\r\n stepType: formData.stepType,\r\n emailTemplateId: formData.stepType === 'SendEmail' ? formData.emailTemplateId || undefined : undefined,\r\n delayMinutes: formData.stepType === 'Wait' ? formData.delayMinutes : undefined,\r\n configurationJson: ['Condition', 'Webhook'].includes(formData.stepType) ? formData.configurationJson || undefined : undefined\r\n };\r\n\r\n await communicationsApi.workflows.addStep(workflowId, request);\r\n setSuccess(t('workflows.steps.success.added'));\r\n setShowAddModal(false);\r\n resetForm();\r\n onStepsChange();\r\n } catch (err) {\r\n console.error('Failed to add step:', err);\r\n setError(t('workflows.steps.errors.addFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleUpdateStep = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!editingStep || !formData.name || !formData.stepType) {\r\n setError(t('workflows.steps.errors.nameRequired'));\r\n return;\r\n }\r\n\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n\r\n const request: UpdateWorkflowStepRequest = {\r\n name: formData.name,\r\n stepOrder: editingStep.stepOrder,\r\n isActive: editingStep.isActive,\r\n emailTemplateId: formData.stepType === 'SendEmail' ? formData.emailTemplateId || undefined : undefined,\r\n delayMinutes: formData.stepType === 'Wait' ? formData.delayMinutes : undefined,\r\n configurationJson: ['Condition', 'Webhook'].includes(formData.stepType) ? formData.configurationJson || undefined : undefined\r\n };\r\n\r\n await communicationsApi.workflows.updateStep(workflowId, editingStep.id, request);\r\n setSuccess(t('workflows.steps.success.updated'));\r\n setShowEditModal(false);\r\n setEditingStep(null);\r\n resetForm();\r\n onStepsChange();\r\n } catch (err) {\r\n console.error('Failed to update step:', err);\r\n setError(t('workflows.steps.errors.updateFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleDeleteStep = async () => {\r\n if (!editingStep) return;\r\n\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n await communicationsApi.workflows.deleteStep(workflowId, editingStep.id);\r\n setSuccess(t('workflows.steps.success.deleted'));\r\n setShowDeleteConfirm(false);\r\n setEditingStep(null);\r\n onStepsChange();\r\n } catch (err) {\r\n console.error('Failed to delete step:', err);\r\n setError(t('workflows.steps.errors.deleteFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleMoveStep = async (step: WorkflowStepDto, direction: 'up' | 'down') => {\r\n const sortedSteps = [...steps].sort((a, b) => a.stepOrder - b.stepOrder);\r\n const currentIndex = sortedSteps.findIndex(s => s.id === step.id);\r\n const newIndex = direction === 'up' ? currentIndex - 1 : currentIndex + 1;\r\n\r\n if (newIndex < 0 || newIndex >= sortedSteps.length) return;\r\n\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n\r\n // Swap orders\r\n const otherStep = sortedSteps[newIndex];\r\n\r\n // Update the current step with new order\r\n const request: UpdateWorkflowStepRequest = {\r\n name: step.name,\r\n stepOrder: otherStep.stepOrder,\r\n isActive: step.isActive,\r\n emailTemplateId: step.emailTemplateId || undefined,\r\n delayMinutes: step.delayMinutes || undefined,\r\n configurationJson: step.configurationJson || undefined\r\n };\r\n\r\n await communicationsApi.workflows.updateStep(workflowId, step.id, request);\r\n\r\n // Update the other step with swapped order\r\n const otherRequest: UpdateWorkflowStepRequest = {\r\n name: otherStep.name,\r\n stepOrder: step.stepOrder,\r\n isActive: otherStep.isActive,\r\n emailTemplateId: otherStep.emailTemplateId || undefined,\r\n delayMinutes: otherStep.delayMinutes || undefined,\r\n configurationJson: otherStep.configurationJson || undefined\r\n };\r\n\r\n await communicationsApi.workflows.updateStep(workflowId, otherStep.id, otherRequest);\r\n onStepsChange();\r\n } catch (err) {\r\n console.error('Failed to reorder steps:', err);\r\n setError(t('workflows.steps.errors.updateFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n // Clear messages after 3 seconds\r\n useEffect(() => {\r\n if (success) {\r\n const timer = setTimeout(() => setSuccess(null), 3000);\r\n return () => clearTimeout(timer);\r\n }\r\n }, [success]);\r\n\r\n useEffect(() => {\r\n if (error) {\r\n const timer = setTimeout(() => setError(null), 5000);\r\n return () => clearTimeout(timer);\r\n }\r\n }, [error]);\r\n\r\n const sortedSteps = [...steps].sort((a, b) => a.stepOrder - b.stepOrder);\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('workflows.steps.title')} ({steps.length})\r\n </h3>\r\n {!readOnly && (\r\n <button\r\n onClick={handleOpenAddModal}\r\n className=\"flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('workflows.steps.add')}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Alerts */}\r\n {error && (\r\n <div className=\"p-3 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)] text-[var(--error-text)] flex items-center gap-2 text-sm\">\r\n <AlertTriangle className=\"w-4 h-4 flex-shrink-0\" />\r\n {error}\r\n </div>\r\n )}\r\n {success && (\r\n <div className=\"p-3 rounded-[var(--radius-card)] bg-[var(--success-bg)] border border-[var(--success-border)] text-[var(--success-text)] flex items-center gap-2 text-sm\">\r\n <CheckCircle className=\"w-4 h-4 flex-shrink-0\" />\r\n {success}\r\n </div>\r\n )}\r\n\r\n {/* Steps List */}\r\n {steps.length === 0 ? (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n <ListOrdered className=\"w-12 h-12 mx-auto mb-4 opacity-50\" />\r\n <p>{t('workflows.steps.noSteps')}</p>\r\n {!readOnly && (\r\n <p className=\"text-sm mt-2\">{t('workflows.steps.addFirstStep')}</p>\r\n )}\r\n </div>\r\n ) : (\r\n <div className=\"space-y-2\">\r\n {sortedSteps.map((step, index) => (\r\n <StepRow\r\n key={step.id}\r\n step={step}\r\n index={index}\r\n isFirst={index === 0}\r\n isLast={index === sortedSteps.length - 1}\r\n onEdit={() => handleOpenEditModal(step)}\r\n onDelete={() => handleOpenDeleteConfirm(step)}\r\n onMoveUp={() => handleMoveStep(step, 'up')}\r\n onMoveDown={() => handleMoveStep(step, 'down')}\r\n readOnly={readOnly}\r\n loading={loading}\r\n t={t}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Add Step Modal */}\r\n {showAddModal && (\r\n <StepFormModal\r\n title={t('workflows.steps.add')}\r\n formData={formData}\r\n setFormData={setFormData}\r\n emailTemplates={emailTemplates}\r\n loadingTemplates={loadingTemplates}\r\n loading={loading}\r\n onSubmit={handleAddStep}\r\n onClose={() => {\r\n setShowAddModal(false);\r\n resetForm();\r\n }}\r\n t={t}\r\n />\r\n )}\r\n\r\n {/* Edit Step Modal */}\r\n {showEditModal && editingStep && (\r\n <StepFormModal\r\n title={t('workflows.steps.edit')}\r\n formData={formData}\r\n setFormData={setFormData}\r\n emailTemplates={emailTemplates}\r\n loadingTemplates={loadingTemplates}\r\n loading={loading}\r\n onSubmit={handleUpdateStep}\r\n onClose={() => {\r\n setShowEditModal(false);\r\n setEditingStep(null);\r\n resetForm();\r\n }}\r\n t={t}\r\n />\r\n )}\r\n\r\n {/* Delete Confirmation Modal */}\r\n {showDeleteConfirm && editingStep && (\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-[var(--radius-card)] border border-[var(--border-color)] p-6 max-w-md w-full shadow-xl\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-2\">\r\n {t('workflows.steps.delete')}\r\n </h3>\r\n <p className=\"text-[var(--text-secondary)] mb-6\">\r\n {t('workflows.steps.confirmDelete')}\r\n </p>\r\n <div className=\"flex justify-end gap-3\">\r\n <button\r\n onClick={() => {\r\n setShowDeleteConfirm(false);\r\n setEditingStep(null);\r\n }}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n onClick={handleDeleteStep}\r\n disabled={loading}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--error-600)] hover:bg-[var(--error-700)] text-white font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {loading ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Trash2 className=\"w-4 h-4\" />\r\n )}\r\n {t('workflows.steps.delete')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// Step Row Component\r\ninterface StepRowProps {\r\n readonly step: WorkflowStepDto;\r\n readonly index: number;\r\n readonly isFirst: boolean;\r\n readonly isLast: boolean;\r\n readonly onEdit: () => void;\r\n readonly onDelete: () => void;\r\n readonly onMoveUp: () => void;\r\n readonly onMoveDown: () => void;\r\n readonly readOnly: boolean;\r\n readonly loading: boolean;\r\n readonly t: (key: string, options?: Record<string, unknown>) => string;\r\n}\r\n\r\nfunction StepRow({ step, index, isFirst, isLast, onEdit, onDelete, onMoveUp, onMoveDown, readOnly, loading, t }: StepRowProps) {\r\n const stepIcon = stepTypeIcons[step.stepType] || <Settings className=\"w-4 h-4\" />;\r\n const stepColor = stepTypeColors[step.stepType] || 'bg-gray-100 text-gray-700';\r\n\r\n const getStepDetails = () => {\r\n switch (step.stepType) {\r\n case 'SendEmail':\r\n return step.emailTemplateName || t('workflows.detail.stepDetails.noTemplate');\r\n case 'Wait':\r\n return t('workflows.detail.stepDetails.waitMinutes', { minutes: step.delayMinutes || 0 });\r\n case 'Condition':\r\n return t('workflows.detail.stepDetails.condition');\r\n case 'Webhook':\r\n if (step.configurationJson) {\r\n try {\r\n const config = JSON.parse(step.configurationJson);\r\n return config.url || t('workflows.detail.stepDetails.webhookConfigured');\r\n } catch {\r\n return t('workflows.detail.stepDetails.webhookConfigured');\r\n }\r\n }\r\n return t('workflows.detail.stepDetails.noWebhook');\r\n default:\r\n return '';\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"flex items-center gap-3 p-3 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)] hover:border-[var(--color-accent-300)] transition-colors\">\r\n {/* Step number */}\r\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] flex items-center justify-center\">\r\n <span className=\"text-sm font-bold text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)]\">\r\n {index + 1}\r\n </span>\r\n </div>\r\n\r\n {/* Step info */}\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2 mb-0.5\">\r\n <span className={`flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium ${stepColor}`}>\r\n {stepIcon}\r\n {t(`workflows.stepTypes.${step.stepType}`)}\r\n </span>\r\n </div>\r\n <div className=\"font-medium text-[var(--text-primary)] truncate\">{step.name}</div>\r\n <div className=\"text-xs text-[var(--text-secondary)] truncate\">{getStepDetails()}</div>\r\n </div>\r\n\r\n {/* Actions */}\r\n {!readOnly && (\r\n <div className=\"flex items-center gap-1\">\r\n <button\r\n onClick={onMoveUp}\r\n disabled={isFirst || loading}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)] text-[var(--text-secondary)] disabled:opacity-30 disabled:cursor-not-allowed transition-colors\"\r\n title={t('workflows.steps.moveUp')}\r\n >\r\n <ChevronUp className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={onMoveDown}\r\n disabled={isLast || loading}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)] text-[var(--text-secondary)] disabled:opacity-30 disabled:cursor-not-allowed transition-colors\"\r\n title={t('workflows.steps.moveDown')}\r\n >\r\n <ChevronDown className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={onEdit}\r\n disabled={loading}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)] text-[var(--text-secondary)] hover:text-[var(--color-accent-600)] disabled:opacity-30 transition-colors\"\r\n title={t('workflows.steps.edit')}\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={onDelete}\r\n disabled={loading}\r\n className=\"p-1.5 rounded hover:bg-[var(--error-bg)] text-[var(--text-secondary)] hover:text-[var(--error-text)] disabled:opacity-30 transition-colors\"\r\n title={t('workflows.steps.delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// Step Form Modal Component\r\ninterface StepFormModalProps {\r\n readonly title: string;\r\n readonly formData: {\r\n readonly name: string;\r\n readonly stepType: string;\r\n readonly emailTemplateId: string;\r\n readonly delayMinutes: number;\r\n readonly configurationJson: string;\r\n };\r\n readonly setFormData: React.Dispatch<React.SetStateAction<{\r\n readonly name: string;\r\n readonly stepType: string;\r\n readonly emailTemplateId: string;\r\n readonly delayMinutes: number;\r\n readonly configurationJson: string;\r\n }>>;\r\n readonly emailTemplates: EmailTemplateListDto[];\r\n readonly loadingTemplates: boolean;\r\n readonly loading: boolean;\r\n readonly onSubmit: (e: React.FormEvent) => void;\r\n readonly onClose: () => void;\r\n readonly t: (key: string, options?: Record<string, unknown>) => string;\r\n}\r\n\r\nfunction StepFormModal({ title, formData, setFormData, emailTemplates, loadingTemplates, loading, onSubmit, onClose, t }: StepFormModalProps) {\r\n return (\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-[var(--radius-card)] border border-[var(--border-color)] w-full max-w-lg shadow-xl max-h-[90vh] overflow-y-auto\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between p-4 border-b border-[var(--border-color)]\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">{title}</h3>\r\n <button\r\n onClick={onClose}\r\n className=\"p-1 rounded hover:bg-[var(--bg-hover)] text-[var(--text-secondary)] transition-colors\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n {/* Form */}\r\n <form onSubmit={onSubmit} className=\"p-4 space-y-4\">\r\n {/* Name */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.steps.form.name')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={formData.name}\r\n onChange={e => setFormData(prev => ({ ...prev, name: e.target.value }))}\r\n placeholder={t('workflows.steps.form.namePlaceholder')}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n\r\n {/* Step Type */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.steps.form.type')} *\r\n </label>\r\n <select\r\n required\r\n value={formData.stepType}\r\n onChange={e => setFormData(prev => ({ ...prev, stepType: e.target.value }))}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n >\r\n <option value=\"\">{t('workflows.steps.form.selectType')}</option>\r\n {stepTypes.map(type => (\r\n <option key={type} value={type}>\r\n {t(`workflows.stepTypes.${type}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n {/* Type-specific fields */}\r\n {formData.stepType === 'SendEmail' && (\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.steps.form.emailTemplate')}\r\n </label>\r\n <select\r\n value={formData.emailTemplateId}\r\n onChange={e => setFormData(prev => ({ ...prev, emailTemplateId: e.target.value }))}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n >\r\n <option value=\"\">{t('workflows.steps.form.selectTemplate')}</option>\r\n {loadingTemplates ? (\r\n <option disabled>Loading...</option>\r\n ) : (\r\n emailTemplates.map(template => (\r\n <option key={template.id} value={template.id}>\r\n {template.name} ({template.code})\r\n </option>\r\n ))\r\n )}\r\n </select>\r\n </div>\r\n )}\r\n\r\n {formData.stepType === 'Wait' && (\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.steps.form.delayMinutes')}\r\n </label>\r\n <div className=\"flex gap-2 mb-2\">\r\n {[\r\n { label: t('workflows.steps.form.delayPresets.5min'), value: 5 },\r\n { label: t('workflows.steps.form.delayPresets.15min'), value: 15 },\r\n { label: t('workflows.steps.form.delayPresets.1hour'), value: 60 },\r\n { label: t('workflows.steps.form.delayPresets.24hours'), value: 1440 }\r\n ].map(preset => (\r\n <button\r\n key={preset.value}\r\n type=\"button\"\r\n onClick={() => setFormData(prev => ({ ...prev, delayMinutes: preset.value }))}\r\n className={`px-2 py-1 text-xs rounded border transition-colors ${\r\n formData.delayMinutes === preset.value\r\n ? 'bg-[var(--color-accent-100)] border-[var(--color-accent-500)] text-[var(--color-accent-700)]'\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n {preset.label}\r\n </button>\r\n ))}\r\n </div>\r\n <input\r\n type=\"number\"\r\n min={1}\r\n value={formData.delayMinutes}\r\n onChange={e => setFormData(prev => ({ ...prev, delayMinutes: parseInt(e.target.value) || 1 }))}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n )}\r\n\r\n {formData.stepType === 'Condition' && (\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.steps.form.condition')}\r\n </label>\r\n <textarea\r\n value={formData.configurationJson}\r\n onChange={e => setFormData(prev => ({ ...prev, configurationJson: e.target.value }))}\r\n rows={4}\r\n placeholder='{\"field\": \"value\", \"operator\": \"equals\"}'\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] font-mono text-sm focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] resize-none\"\r\n />\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {t('workflows.steps.form.conditionHelp')}\r\n </p>\r\n </div>\r\n )}\r\n\r\n {formData.stepType === 'Webhook' && (\r\n <>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.steps.form.webhookUrl')}\r\n </label>\r\n <input\r\n type=\"url\"\r\n value={formData.configurationJson ? (() => {\r\n try {\r\n return JSON.parse(formData.configurationJson).url || '';\r\n } catch {\r\n return '';\r\n }\r\n })() : ''}\r\n onChange={e => {\r\n const config = formData.configurationJson ? JSON.parse(formData.configurationJson) : {};\r\n config.url = e.target.value;\r\n setFormData(prev => ({ ...prev, configurationJson: JSON.stringify(config) }));\r\n }}\r\n placeholder={t('workflows.steps.form.webhookUrlPlaceholder')}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.steps.form.webhookMethod')}\r\n </label>\r\n <select\r\n value={formData.configurationJson ? (() => {\r\n try {\r\n return JSON.parse(formData.configurationJson).method || 'POST';\r\n } catch {\r\n return 'POST';\r\n }\r\n })() : 'POST'}\r\n onChange={e => {\r\n const config = formData.configurationJson ? JSON.parse(formData.configurationJson) : {};\r\n config.method = e.target.value;\r\n setFormData(prev => ({ ...prev, configurationJson: JSON.stringify(config) }));\r\n }}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n >\r\n <option value=\"POST\">POST</option>\r\n <option value=\"PUT\">PUT</option>\r\n <option value=\"PATCH\">PATCH</option>\r\n <option value=\"GET\">GET</option>\r\n </select>\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* Actions */}\r\n <div className=\"flex justify-end gap-3 pt-4 border-t border-[var(--border-color)]\">\r\n <button\r\n type=\"button\"\r\n onClick={onClose}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={loading}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {loading && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default WorkflowStepsEditor;\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useParams, useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n ArrowLeft,\r\n Loader2,\r\n Save,\r\n AlertTriangle,\r\n CheckCircle,\r\n Lock,\r\n ListOrdered\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n communicationsApi,\r\n type WorkflowDetailDto,\r\n type UpdateWorkflowRequest\r\n} from '@/services/api/communicationsApi';\r\nimport { WorkflowStepsEditor } from '@/components/platform/administration/workflows/WorkflowStepsEditor';\r\n\r\ntype TabId = 'info' | 'steps';\r\n\r\nexport function WorkflowEditPage(): ReactElement {\r\n const { t } = useTranslation('communications');\r\n const { id: workflowId } = useParams<{ id: string }>();\r\n const navigate = useNavigate();\r\n\r\n const [workflow, setWorkflow] = useState<WorkflowDetailDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [saving, setSaving] = useState(false);\r\n const [activeTab, setActiveTab] = useState<TabId>('info');\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n const [formData, setFormData] = useState({\r\n name: '',\r\n description: '',\r\n priority: 0\r\n });\r\n\r\n const loadWorkflow = useCallback(async () => {\r\n if (!workflowId) return;\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const data = await communicationsApi.workflows.getById(workflowId);\r\n setWorkflow(data);\r\n setFormData({\r\n name: data.name,\r\n description: data.description || '',\r\n priority: data.priority\r\n });\r\n } catch (err) {\r\n console.error('Failed to load workflow:', err);\r\n setError(t('workflows.edit.errors.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [workflowId, t]);\r\n\r\n useEffect(() => {\r\n loadWorkflow();\r\n }, [loadWorkflow]);\r\n\r\n const handleSave = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!workflowId || !workflow) return;\r\n\r\n if (workflow.isSystem) {\r\n setError(t('workflows.edit.errors.cannotEditSystem'));\r\n return;\r\n }\r\n\r\n setSaving(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const updateData: UpdateWorkflowRequest = {\r\n name: formData.name,\r\n description: formData.description || undefined,\r\n triggerId: workflow.triggerId,\r\n priority: formData.priority\r\n };\r\n await communicationsApi.workflows.update(workflowId, updateData);\r\n setSuccess(t('workflows.edit.success.saved'));\r\n loadWorkflow();\r\n } catch (err: unknown) {\r\n setError(err instanceof Error ? err.message : t('workflows.edit.errors.saveFailed'));\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleStepsChange = () => {\r\n // Reload workflow to get updated steps\r\n loadWorkflow();\r\n };\r\n\r\n const tabs: { id: TabId; label: string; icon: React.ReactNode }[] = [\r\n { id: 'info', label: t('workflows.edit.tabs.info'), icon: <Save className=\"w-4 h-4\" /> },\r\n { id: 'steps', label: t('workflows.edit.tabs.steps'), icon: <ListOrdered className=\"w-4 h-4\" /> }\r\n ];\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (!workflow) {\r\n return (\r\n <div className=\"text-center py-12\">\r\n <p className=\"text-[var(--text-secondary)]\">{t('workflows.detail.notFound')}</p>\r\n <button\r\n onClick={() => navigate('/administration/workflows/list')}\r\n className=\"mt-4 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white\"\r\n >\r\n {t('workflows.backToList')}\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n // System workflows cannot be edited\r\n if (workflow.isSystem) {\r\n return (\r\n <div className=\"space-y-6\">\r\n <div className=\"flex items-center gap-4\">\r\n <button\r\n onClick={() => navigate(`/administration/workflows/${workflowId}`)}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n <h1 className=\"text-xl sm:text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('workflows.edit.title')}\r\n </h1>\r\n </div>\r\n <div className=\"p-6 rounded-[var(--radius-card)] bg-[var(--warning-bg)] border border-[var(--warning-border)] text-[var(--warning-text)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <Lock className=\"w-6 h-6\" />\r\n <div>\r\n <h3 className=\"font-semibold\">{t('workflows.edit.systemWorkflow')}</h3>\r\n <p className=\"text-sm mt-1\">{t('workflows.detail.systemReadOnly')}</p>\r\n </div>\r\n </div>\r\n </div>\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('header.title'), href: '/administration' },\r\n { label: t('workflows.title'), href: '/administration/workflows' },\r\n { label: workflow?.name || '' }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center gap-4\">\r\n <button\r\n onClick={() => navigate(`/administration/workflows/${workflowId}`)}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <h1 className=\"text-xl sm:text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('workflows.edit.title')}: {workflow.name}\r\n </h1>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1 font-mono\">{workflow.code}</p>\r\n </div>\r\n </div>\r\n\r\n {/* Alerts */}\r\n {error && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)] text-[var(--error-text)] flex items-center gap-2\">\r\n <AlertTriangle className=\"w-5 h-5 flex-shrink-0\" />\r\n {error}\r\n </div>\r\n )}\r\n {success && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--success-bg)] border border-[var(--success-border)] text-[var(--success-text)] flex items-center gap-2\">\r\n <CheckCircle className=\"w-5 h-5 flex-shrink-0\" />\r\n {success}\r\n </div>\r\n )}\r\n\r\n {/* Tabs */}\r\n <div className=\"flex gap-1 p-1 bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n {tabs.map(tab => (\r\n <button\r\n key={tab.id}\r\n onClick={() => setActiveTab(tab.id)}\r\n className={`flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium transition-colors ${\r\n activeTab === tab.id\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n {tab.icon}\r\n <span className=\"hidden sm:inline\">{tab.label}</span>\r\n {tab.id === 'steps' && (\r\n <span className={`ml-1 px-1.5 py-0.5 rounded text-xs ${\r\n activeTab === tab.id ? 'bg-white/20' : 'bg-[var(--bg-tertiary)]'\r\n }`}>\r\n {workflow.steps.length}\r\n </span>\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div className=\"bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4 sm:p-6\">\r\n {/* Info Tab */}\r\n {activeTab === 'info' && (\r\n <form onSubmit={handleSave} className=\"space-y-6 max-w-2xl\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.form.code')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-secondary)] font-mono text-sm cursor-not-allowed\">\r\n {workflow.code}\r\n </div>\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {t('workflows.edit.codeReadOnly')}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.form.name')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={formData.name}\r\n onChange={e => setFormData(prev => ({ ...prev, name: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.form.description')}\r\n </label>\r\n <textarea\r\n value={formData.description}\r\n onChange={e => setFormData(prev => ({ ...prev, description: e.target.value }))}\r\n rows={3}\r\n placeholder={t('workflows.form.descriptionPlaceholder')}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] resize-none\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.form.trigger')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)]\">\r\n <div className=\"font-medium\">{workflow.triggerName}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)] font-mono\">{workflow.triggerCode}</div>\r\n </div>\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {t('workflows.edit.triggerReadOnly')}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.form.priority')}\r\n </label>\r\n <input\r\n type=\"number\"\r\n min={0}\r\n max={100}\r\n value={formData.priority}\r\n onChange={e => setFormData(prev => ({ ...prev, priority: parseInt(e.target.value) || 0 }))}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {t('workflows.form.priorityHelp')}\r\n </p>\r\n </div>\r\n\r\n <div className=\"flex justify-end gap-3 pt-4\">\r\n <button\r\n type=\"button\"\r\n onClick={() => navigate(`/administration/workflows/${workflowId}`)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={saving}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {saving ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </form>\r\n )}\r\n\r\n {/* Steps Tab */}\r\n {activeTab === 'steps' && workflowId && (\r\n <WorkflowStepsEditor\r\n workflowId={workflowId}\r\n steps={workflow.steps}\r\n onStepsChange={handleStepsChange}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default WorkflowEditPage;\r\n","import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport { History } from 'lucide-react';\r\nimport { UnderDevelopment } from '@/components/ui/UnderDevelopment';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\n/**\r\n * Workflow History / Dashboard Page\r\n *\r\n * This page will display workflow execution analytics and history.\r\n * Requires backend implementation of:\r\n * - WorkflowExecution entity\r\n * - Analytics endpoints (GET /api/administration/communications/workflows/analytics/*)\r\n *\r\n * Planned features:\r\n * - KPIs: Total executions, success rate, failures, avg latency\r\n * - Charts: Executions over time, workflow distribution\r\n * - Recent activity list\r\n * - Alerts panel\r\n * - Export functionality\r\n */\r\nexport function WorkflowHistoryPage(): ReactElement {\r\n const { t } = useTranslation('communications');\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('workflows.title'), href: '/administration/workflows' },\r\n { label: t('dashboard.title', 'History') }\r\n ]}\r\n />\r\n\r\n <UnderDevelopment\r\n title={t('dashboard.title')}\r\n description={t('dashboard.underDevelopment', 'Le tableau de bord des workflows sera disponible prochainement. Il affichera les statistiques d\\'exécution, les graphiques de performance et l\\'historique des workflows.')}\r\n icon={<History className=\"w-10 h-10 text-amber-600\" />}\r\n showBackButton={true}\r\n backUrl=\"/administration/workflows\"\r\n />\r\n </div>\r\n );\r\n}\r\n"],"names":["communicationsApi","params","api","id","code","data","templateId","languageCode","workflowId","stepId","stepOrder","EmailTemplatesListPage","useTranslation","navigate","useNavigate","currentTenant","isGlobalView","useTenant","templates","setTemplates","useState","loading","setLoading","search","setSearch","viewMode","setViewMode","page","setPage","pageSize","loadTemplates","useCallback","err","useEffect","handleSearch","e","handleDelete","template","startIndex","paginatedTemplates","totalPages","templatesByCategory","t","getCategoryLabel","category","renderTableView","jsx","jsxs","Loader2","Mail","Languages","StatusBadge","Eye","Edit2","Trash2","getCardsViewContent","TemplateCard","renderCardsView","getCategoryDotColor","renderTemplateCard","renderKanbanView","Fragment","categoryTemplates","Breadcrumb","PageHeader","Plus","Search","Filter","ViewToggle","Pagination","EmailTemplateCreatePage","saving","setSaving","error","setError","formData","setFormData","handleSubmit","message","ArrowLeft","prev","Save","DEFAULT_USER_VARIABLES","DEFAULT_EMAIL_VARIABLES","EmailTemplateDetailPage","i18n","useParams","setTemplate","searchParams","setSearchParams","useSearchParams","activeTab","setActiveTab","tab","success","setSuccess","actionLoading","setActionLoading","showDeleteConfirm","setShowDeleteConfirm","previewLang","setPreviewLang","previewContent","setPreviewContent","previewLoading","setPreviewLoading","selectedPreviewLanguage","setSelectedPreviewLanguage","loadTemplate","handleActivate","handleDeactivate","handlePreview","preview","closePreview","templateVariables","useMemo","customVariables","parsed","v","name","value","currentLang","matchingTranslation","tr","currentPreviewTranslation","tabs","Settings","getLanguageLabel","Edit","Pause","Play","AlertTriangle","CheckCircle","Link","FileText","Code","VariableSection","translation","TranslationCard","onPreview","expanded","setExpanded","ChevronUp","ChevronDown","title","variables","defaultExpanded","variable","VariableItem","copied","setCopied","variableSyntax","handleCopy","Check","Copy","EmailEditor","content","onChange","placeholder","className","mode","setMode","codeContent","setCodeContent","linkUrl","setLinkUrl","showLinkInput","setShowLinkInput","imageUrl","setImageUrl","showImageInput","setShowImageInput","editor","useEditor","StarterKit","Image","Placeholder","TextAlign","Underline","TextStyle","Color","Highlight","html","handleCodeChange","newContent","switchToVisual","switchToCode","addLink","removeLink","addImage","insertVariable","varName","ToolbarButton","onClick","isActive","disabled","children","ToolbarDivider","Undo","Redo","Heading1","Heading2","Heading3","Bold","Italic","UnderlineIcon","Strikethrough","AlignLeft","AlignCenter","AlignRight","List","ListOrdered","Quote","Minus","LinkIcon","X","ImageIcon","Palette","color","Highlighter","EditorContent","Editor","SUPPORTED_LANGUAGES","PREVIEW_SAMPLE_VALUES","generateFallbackValue","lowerName","replaceVariablesForPreview","result","_match","EmailTemplateEditPage","editingTranslation","setEditingTranslation","isNewTranslation","setIsNewTranslation","savingTranslation","setSavingTranslation","showPreview","setShowPreview","fullscreenPreview","setFullscreenPreview","handleSave","handleAddTranslation","existingLangs","availableLangs","lang","handleEditTranslation","handleSaveTranslation","handleDeleteTranslation","Columns","VariableSectionEdit","varSyntax","Maximize2","Minimize2","onInsert","VariableBadgeInsert","handleClick","SmsTemplatesListPage","MessageSquare","UnderDevelopment","WorkflowsListPage","workflows","setWorkflows","loadWorkflows","handleToggleActive","workflow","paginatedWorkflows","activeWorkflows","w","inactiveWorkflows","Workflow","Zap","WorkflowsTriggersPage","triggers","setTriggers","selectedTrigger","setSelectedTrigger","getTriggerTypeStyles","type","parseVariables","variablesJson","trigger","Info","WorkflowCreatePage","loadingTriggers","setLoadingTriggers","stepTypeIcons","Clock","GitBranch","Webhook","stepTypeColors","WorkflowDetailPage","setWorkflow","loadWorkflow","Lock","a","b","step","index","StepCard","isLast","stepIcon","stepColor","getStepDetails","stepTypes","WorkflowStepsEditor","steps","onStepsChange","readOnly","showAddModal","setShowAddModal","showEditModal","setShowEditModal","editingStep","setEditingStep","emailTemplates","setEmailTemplates","loadingTemplates","setLoadingTemplates","loadEmailTemplates","resetForm","handleOpenAddModal","handleOpenEditModal","handleOpenDeleteConfirm","handleAddStep","request","handleUpdateStep","handleDeleteStep","handleMoveStep","direction","sortedSteps","currentIndex","s","newIndex","otherStep","otherRequest","timer","StepRow","StepFormModal","isFirst","onEdit","onDelete","onMoveUp","onMoveDown","onSubmit","onClose","preset","config","WorkflowEditPage","updateData","handleStepsChange","WorkflowHistoryPage","History"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-Buhqag3v.js","sources":["../../src/services/api/communicationsApi.ts","../../src/pages/platform/administration/workflows/EmailTemplatesListPage.tsx","../../src/pages/platform/administration/workflows/EmailTemplateCreatePage.tsx","../../src/pages/platform/administration/workflows/EmailTemplateDetailPage.tsx","../../src/components/email/EmailEditor.tsx","../../src/pages/platform/administration/workflows/EmailTemplateEditPage.tsx","../../src/pages/platform/administration/workflows/SmsTemplatesListPage.tsx","../../src/pages/platform/administration/workflows/WorkflowsListPage.tsx","../../src/pages/platform/administration/workflows/WorkflowsTriggersPage.tsx","../../src/pages/platform/administration/workflows/WorkflowCreatePage.tsx","../../src/pages/platform/administration/workflows/WorkflowDetailPage.tsx","../../src/components/platform/administration/workflows/WorkflowStepsEditor.tsx","../../src/pages/platform/administration/workflows/WorkflowEditPage.tsx","../../src/pages/platform/administration/workflows/WorkflowHistoryPage.tsx"],"sourcesContent":["import { api } from './apiClient';\r\n\r\n// Email Template Types\r\nexport interface EmailTemplateListDto {\r\n id: string;\r\n code: string;\r\n name: string;\r\n description: string | null;\r\n category: string;\r\n isSystem: boolean;\r\n isActive: boolean;\r\n applicationName: string | null;\r\n languages: string[];\r\n createdAt: string;\r\n updatedAt: string | null;\r\n}\r\n\r\nexport interface EmailTemplateDetailDto {\r\n id: string;\r\n code: string;\r\n name: string;\r\n description: string | null;\r\n category: string;\r\n isSystem: boolean;\r\n isActive: boolean;\r\n applicationId: string | null;\r\n applicationName: string | null;\r\n variablesJson: string | null;\r\n translations: EmailTemplateTranslationDto[];\r\n createdAt: string;\r\n updatedAt: string | null;\r\n}\r\n\r\nexport interface EmailTemplateTranslationDto {\r\n id: string;\r\n languageCode: string;\r\n subject: string;\r\n htmlBody: string;\r\n textBody: string | null;\r\n}\r\n\r\nexport interface CreateEmailTemplateRequest {\r\n code: string;\r\n name: string;\r\n description?: string;\r\n category: string;\r\n applicationId?: string;\r\n variablesJson?: string;\r\n}\r\n\r\nexport interface UpdateEmailTemplateRequest {\r\n name: string;\r\n description?: string;\r\n category: string;\r\n isActive: boolean;\r\n variablesJson?: string;\r\n}\r\n\r\nexport interface CreateTranslationRequest {\r\n languageCode: string;\r\n subject: string;\r\n htmlBody: string;\r\n textBody?: string;\r\n}\r\n\r\nexport interface UpdateTranslationRequest {\r\n subject: string;\r\n htmlBody: string;\r\n textBody?: string;\r\n}\r\n\r\nexport interface PreviewTemplateRequest {\r\n languageCode: string;\r\n variables?: Record<string, string>;\r\n}\r\n\r\nexport interface PreviewTemplateResponse {\r\n subject: string;\r\n htmlBody: string;\r\n textBody: string | null;\r\n}\r\n\r\n// Workflow Types\r\nexport interface WorkflowTriggerDto {\r\n id: string;\r\n code: string;\r\n name: string;\r\n triggerType: string;\r\n availableVariablesJson: string | null;\r\n}\r\n\r\nexport interface WorkflowListDto {\r\n id: string;\r\n code: string;\r\n name: string;\r\n description: string | null;\r\n triggerName: string;\r\n triggerCode: string;\r\n isSystem: boolean;\r\n isActive: boolean;\r\n priority: number;\r\n applicationName: string | null;\r\n stepCount: number;\r\n tenantId: string | null;\r\n tenantName: string | null;\r\n createdAt: string;\r\n updatedAt: string | null;\r\n}\r\n\r\nexport interface WorkflowDetailDto {\r\n id: string;\r\n code: string;\r\n name: string;\r\n description: string | null;\r\n triggerId: string;\r\n triggerName: string;\r\n triggerCode: string;\r\n triggerVariablesJson: string | null;\r\n isSystem: boolean;\r\n isActive: boolean;\r\n priority: number;\r\n applicationId: string | null;\r\n applicationName: string | null;\r\n tenantId: string | null;\r\n tenantName: string | null;\r\n steps: WorkflowStepDto[];\r\n createdAt: string;\r\n updatedAt: string | null;\r\n}\r\n\r\nexport interface WorkflowStepDto {\r\n id: string;\r\n stepOrder: number;\r\n name: string;\r\n stepType: string;\r\n isActive: boolean;\r\n emailTemplateId: string | null;\r\n emailTemplateName: string | null;\r\n delayMinutes: number | null;\r\n configurationJson: string | null;\r\n}\r\n\r\nexport interface CreateWorkflowRequest {\r\n code: string;\r\n name: string;\r\n description?: string;\r\n triggerId: string;\r\n priority?: number;\r\n applicationId?: string;\r\n}\r\n\r\nexport interface UpdateWorkflowRequest {\r\n name: string;\r\n description?: string;\r\n triggerId: string;\r\n applicationId?: string;\r\n priority: number;\r\n}\r\n\r\nexport interface CreateWorkflowStepRequest {\r\n name: string;\r\n stepType: string;\r\n emailTemplateId?: string;\r\n delayMinutes?: number;\r\n configurationJson?: string;\r\n}\r\n\r\nexport interface UpdateWorkflowStepRequest {\r\n name: string;\r\n stepOrder: number;\r\n isActive: boolean;\r\n emailTemplateId?: string;\r\n delayMinutes?: number;\r\n configurationJson?: string;\r\n}\r\n\r\n// API Service\r\nexport const communicationsApi = {\r\n // Email Templates\r\n emailTemplates: {\r\n getAll: (params?: { search?: string; category?: string; isActive?: boolean }) =>\r\n api.get<EmailTemplateListDto[]>('/api/administration/workflows/email-templates', { params }),\r\n\r\n getById: (id: string) =>\r\n api.get<EmailTemplateDetailDto>(`/api/administration/workflows/email-templates/${id}`),\r\n\r\n getByCode: (code: string) =>\r\n api.get<EmailTemplateDetailDto>(`/api/administration/workflows/email-templates/by-code/${code}`),\r\n\r\n create: (data: CreateEmailTemplateRequest) =>\r\n api.post<EmailTemplateDetailDto>('/api/administration/workflows/email-templates', data),\r\n\r\n update: (id: string, data: UpdateEmailTemplateRequest) =>\r\n api.put<EmailTemplateDetailDto>(`/api/administration/workflows/email-templates/${id}`, data),\r\n\r\n delete: (id: string) =>\r\n api.delete(`/api/administration/workflows/email-templates/${id}`),\r\n\r\n activate: (id: string) =>\r\n api.patch(`/api/administration/workflows/email-templates/${id}/activate`),\r\n\r\n deactivate: (id: string) =>\r\n api.patch(`/api/administration/workflows/email-templates/${id}/deactivate`),\r\n\r\n preview: (id: string, data: PreviewTemplateRequest) =>\r\n api.post<PreviewTemplateResponse>(`/api/administration/workflows/email-templates/${id}/preview`, data),\r\n\r\n testSend: (id: string, data: { email: string; languageCode: string; variables?: Record<string, string> }) =>\r\n api.post<{ message: string }>(`/api/administration/workflows/email-templates/${id}/test-send`, data),\r\n\r\n // Translations\r\n getTranslation: (templateId: string, languageCode: string) =>\r\n api.get<EmailTemplateTranslationDto>(`/api/administration/workflows/email-templates/${templateId}/translations/${languageCode}`),\r\n\r\n createTranslation: (templateId: string, data: CreateTranslationRequest) =>\r\n api.post<EmailTemplateTranslationDto>(`/api/administration/workflows/email-templates/${templateId}/translations`, data),\r\n\r\n updateTranslation: (templateId: string, languageCode: string, data: UpdateTranslationRequest) =>\r\n api.put<EmailTemplateTranslationDto>(`/api/administration/workflows/email-templates/${templateId}/translations/${languageCode}`, data)\r\n },\r\n\r\n // Workflows\r\n workflows: {\r\n getAll: (params?: { search?: string; triggerId?: string; isActive?: boolean }) =>\r\n api.get<WorkflowListDto[]>('/api/administration/workflows/definitions', { params }),\r\n\r\n getById: (id: string) =>\r\n api.get<WorkflowDetailDto>(`/api/administration/workflows/definitions/${id}`),\r\n\r\n create: (data: CreateWorkflowRequest) =>\r\n api.post<WorkflowDetailDto>('/api/administration/workflows/definitions', data),\r\n\r\n update: (id: string, data: UpdateWorkflowRequest) =>\r\n api.put<WorkflowDetailDto>(`/api/administration/workflows/definitions/${id}`, data),\r\n\r\n delete: (id: string) =>\r\n api.delete(`/api/administration/workflows/definitions/${id}`),\r\n\r\n activate: (id: string) =>\r\n api.patch(`/api/administration/workflows/definitions/${id}/activate`),\r\n\r\n deactivate: (id: string) =>\r\n api.patch(`/api/administration/workflows/definitions/${id}/deactivate`),\r\n\r\n // Steps\r\n addStep: (workflowId: string, data: CreateWorkflowStepRequest) =>\r\n api.post<WorkflowStepDto>(`/api/administration/workflows/definitions/${workflowId}/steps`, data),\r\n\r\n updateStep: (workflowId: string, stepId: string, data: UpdateWorkflowStepRequest) =>\r\n api.put<WorkflowStepDto>(`/api/administration/workflows/definitions/${workflowId}/steps/${stepId}`, data),\r\n\r\n deleteStep: (workflowId: string, stepId: string) =>\r\n api.delete(`/api/administration/workflows/definitions/${workflowId}/steps/${stepId}`),\r\n\r\n reorderSteps: (workflowId: string, stepOrder: string[]) =>\r\n api.post(`/api/administration/workflows/definitions/${workflowId}/steps/reorder`, { stepOrder })\r\n },\r\n\r\n // Triggers\r\n triggers: {\r\n getAll: () =>\r\n api.get<WorkflowTriggerDto[]>('/api/administration/workflows/definitions/triggers')\r\n }\r\n};\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Plus, Search, Edit2, Trash2, Eye, Mail, Languages, Loader2, Filter } from 'lucide-react';\r\nimport { communicationsApi, type EmailTemplateListDto } from '@/services/api/communicationsApi';\r\nimport { ViewToggle, StatusBadge, Pagination, type ViewMode } from '@/components/ui/DataView';\r\nimport { TemplateCard } from '@/components/ui/EntityCard';\r\nimport { PageHeader } from '@/components/ui/PageHeader';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\nexport function EmailTemplatesListPage(): ReactElement {\r\n const { t } = useTranslation('communications');\r\n const navigate = useNavigate();\r\n const { currentTenant, isGlobalView } = useTenant();\r\n const [templates, setTemplates] = useState<EmailTemplateListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [search, setSearch] = useState('');\r\n const [viewMode, setViewMode] = useState<ViewMode>('table');\r\n const [page, setPage] = useState(1);\r\n const pageSize = 20;\r\n\r\n const loadTemplates = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const data = await communicationsApi.emailTemplates.getAll({ search: search || undefined });\r\n setTemplates(Array.isArray(data) ? data : []);\r\n } catch (err) {\r\n console.error('Failed to load templates:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n // TENANT ISOLATION: Re-fetch when tenant changes\r\n }, [search, currentTenant?.id, isGlobalView]);\r\n\r\n useEffect(() => {\r\n loadTemplates();\r\n }, [loadTemplates]);\r\n\r\n const handleSearch = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setPage(1);\r\n loadTemplates();\r\n };\r\n\r\n const handleDelete = async (template: EmailTemplateListDto, e?: React.MouseEvent) => {\r\n e?.stopPropagation();\r\n if (template.isSystem) {\r\n alert(t('emailTemplates.cannotDeleteSystem'));\r\n return;\r\n }\r\n if (!confirm(t('emailTemplates.confirmDelete', { name: template.name }))) return;\r\n\r\n try {\r\n await communicationsApi.emailTemplates.delete(template.id);\r\n loadTemplates();\r\n } catch (err) {\r\n console.error('Failed to delete template:', err);\r\n }\r\n };\r\n\r\n // Filter for current page\r\n const startIndex = (page - 1) * pageSize;\r\n const paginatedTemplates = templates.slice(startIndex, startIndex + pageSize);\r\n const totalPages = Math.ceil(templates.length / pageSize);\r\n\r\n // Grouper par categorie pour le Kanban\r\n const templatesByCategory = {\r\n transactional: templates.filter(t => t.category === 'transactional'),\r\n notification: templates.filter(t => t.category === 'notification'),\r\n marketing: templates.filter(t => t.category === 'marketing'),\r\n system: templates.filter(t => t.category === 'system')\r\n };\r\n\r\n const getCategoryLabel = (category: string) => {\r\n return t(`emailTemplates.categories.${category.toLowerCase()}`) || category;\r\n };\r\n\r\n const renderTableView = () => (\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-[var(--bg-secondary)]\">\r\n <th className=\"w-12 px-4 py-3\">\r\n <input type=\"checkbox\" className=\"w-4 h-4 rounded border-[var(--border-color)]\" />\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('emailTemplates.columns.code')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('emailTemplates.columns.name')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden md:table-cell\">{t('emailTemplates.columns.category')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">{t('emailTemplates.columns.translations')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('emailTemplates.columns.status')}</th>\r\n <th className=\"w-32 px-4 py-3\"></th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {loading && (\r\n <tr>\r\n <td colSpan={7} className=\"px-6 py-16 text-center\">\r\n <div className=\"flex flex-col items-center gap-3\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-primary-500\" />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{t('common.loading', { defaultValue: 'Chargement...' })}</span>\r\n </div>\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && paginatedTemplates.length === 0 && (\r\n <tr>\r\n <td colSpan={7} className=\"px-6 py-16 text-center\">\r\n <div className=\"flex flex-col items-center gap-3\">\r\n <div className=\"w-16 h-16 rounded-full bg-[var(--bg-secondary)] flex items-center justify-center\">\r\n <Mail className=\"w-8 h-8 text-[var(--text-tertiary)]\" />\r\n </div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('emailTemplates.noResults')}</span>\r\n </div>\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && paginatedTemplates.length > 0 && (\r\n paginatedTemplates.map(template => (\r\n <tr\r\n key={template.id}\r\n className=\"group hover:bg-[var(--bg-hover)] transition-all cursor-pointer\"\r\n onClick={() => navigate(`/administration/workflows/email-templates/${template.id}`)}\r\n >\r\n <td className=\"px-4 py-3\" onClick={e => e.stopPropagation()}>\r\n <input type=\"checkbox\" className=\"w-4 h-4 rounded border-[var(--border-color)]\" />\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-2\">\r\n <Mail className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <code className=\"text-sm bg-[var(--bg-secondary)] px-2 py-0.5 rounded text-[var(--text-primary)]\">{template.code}</code>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"min-w-0\">\r\n <p className=\"font-medium text-[var(--text-primary)] group-hover:text-primary-600 transition-colors\">\r\n {template.name}\r\n </p>\r\n {template.isSystem && (\r\n <span className=\"inline-flex items-center gap-1 mt-1 px-2 py-0.5 rounded-[var(--radius-badge)] text-xs font-medium bg-[var(--info-bg)] text-[var(--info-text)] border border-[var(--info-border)]\">\r\n System\r\n </span>\r\n )}\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 hidden md:table-cell\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{getCategoryLabel(template.category)}</span>\r\n </td>\r\n <td className=\"px-4 py-3 hidden lg:table-cell\">\r\n <div className=\"flex items-center gap-1.5 text-[var(--text-secondary)]\">\r\n <Languages className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm\">{template.languages.length}</span>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <StatusBadge\r\n status={template.isActive ? 'active' : 'inactive'}\r\n label={template.isActive ? t('emailTemplates.active') : t('emailTemplates.inactive')}\r\n />\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center justify-end gap-1\" onClick={e => e.stopPropagation()}>\r\n <button\r\n onClick={() => navigate(`/administration/workflows/email-templates/${template.id}`)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-primary-600 hover:bg-[var(--accent-bg)] transition-all\"\r\n title={t('emailTemplates.view')}\r\n >\r\n <Eye className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={(e) => { e.stopPropagation(); navigate(`/administration/workflows/email-templates/${template.id}/edit`); }}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--info-text)] hover:bg-[var(--info-bg)] transition-all\"\r\n title={t('emailTemplates.edit.title')}\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n </button>\r\n {!template.isSystem && (\r\n <button\r\n onClick={(e) => handleDelete(template, e)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n title={t('emailTemplates.delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n </td>\r\n </tr>\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n\r\n const getCardsViewContent = () => {\r\n if (loading) {\r\n return (\r\n <div className=\"col-span-full flex flex-col items-center justify-center py-16\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n <span className=\"mt-3 text-sm text-[var(--text-secondary)]\">{t('common.loading', { defaultValue: 'Chargement...' })}</span>\r\n </div>\r\n );\r\n }\r\n if (paginatedTemplates.length === 0) {\r\n return (\r\n <div className=\"col-span-full flex flex-col items-center justify-center py-16\">\r\n <div className=\"w-16 h-16 rounded-lg bg-[var(--color-accent-50)] flex items-center justify-center mb-3\">\r\n <Mail className=\"w-8 h-8 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('emailTemplates.noResults')}</span>\r\n </div>\r\n );\r\n }\r\n return (\r\n paginatedTemplates.map(template => (\r\n <TemplateCard\r\n key={template.id}\r\n name={template.name}\r\n code={template.code}\r\n category={getCategoryLabel(template.category)}\r\n isActive={template.isActive}\r\n isSystem={template.isSystem}\r\n icon={Mail}\r\n iconColor=\"var(--color-accent-500)\"\r\n translationsCount={template.languages.length}\r\n onClick={() => navigate(`/administration/workflows/email-templates/${template.id}`)}\r\n onEdit={() => navigate(`/administration/workflows/email-templates/${template.id}/edit`)}\r\n onDelete={() => handleDelete(template)}\r\n labels={{\r\n activeLabel: t('emailTemplates.active'),\r\n inactiveLabel: t('emailTemplates.inactive'),\r\n systemLabel: 'System',\r\n editLabel: t('emailTemplates.edit.title'),\r\n deleteLabel: t('emailTemplates.delete'),\r\n }}\r\n />\r\n ))\r\n );\r\n };\r\n\r\n const renderCardsView = () => (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {getCardsViewContent()}\r\n </div>\r\n );\r\n\r\n const getCategoryDotColor = (category: string): string => {\r\n if (category === 'transactional') return 'bg-[var(--success-dot)]';\r\n if (category === 'notification') return 'bg-[var(--warning-dot)]';\r\n if (category === 'marketing') return 'bg-blue-500';\r\n return 'bg-[var(--text-muted)]';\r\n };\r\n\r\n const renderTemplateCard = (template: EmailTemplateListDto) => (\r\n <button\r\n type=\"button\"\r\n key={template.id}\r\n onClick={() => navigate(`/administration/workflows/email-templates/${template.id}`)}\r\n className=\"bg-[var(--bg-card)] border-2 border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)] rounded-[var(--radius-card)] overflow-hidden transition-all hover:shadow-md hover:border-[var(--color-accent-400)] cursor-pointer text-left w-full\"\r\n >\r\n <div className=\"bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20 p-3 border-b border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-8 h-8 rounded-lg bg-[var(--color-accent-500)] flex items-center justify-center shadow-lg\">\r\n <Mail className=\"w-4 h-4 text-white\" />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"font-medium text-sm text-[var(--text-primary)] truncate\">{template.name}</p>\r\n <code className=\"text-xs text-[var(--text-secondary)]\">{template.code}</code>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"p-3\">\r\n <div className=\"flex items-center justify-between\">\r\n <span className={`inline-flex items-center gap-1.5 px-2 py-0.5 text-xs rounded-full font-medium ${\r\n template.isActive\r\n ? 'bg-[var(--success-bg)] text-[var(--success-text)]'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`}>\r\n <span className={`w-1.5 h-1.5 rounded-full ${template.isActive ? 'bg-[var(--success-dot)]' : 'bg-[var(--text-muted)]'}`} />\r\n {template.isActive ? t('emailTemplates.active') : t('emailTemplates.inactive')}\r\n </span>\r\n <div className=\"flex items-center gap-1 text-[var(--text-tertiary)]\">\r\n <Languages className=\"w-3 h-3\" />\r\n <span className=\"text-xs\">{template.languages.length}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </button>\r\n );\r\n\r\n const renderKanbanView = () => (\r\n <div className=\"flex gap-6 overflow-x-auto pb-4\">\r\n {loading ? (\r\n <div className=\"flex-1 flex flex-col items-center justify-center py-16\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n <span className=\"mt-3 text-sm text-[var(--text-secondary)]\">{t('common.loading', { defaultValue: 'Chargement...' })}</span>\r\n </div>\r\n ) : (\r\n <>\r\n {Object.entries(templatesByCategory).map(([category, categoryTemplates]) => (\r\n <div key={category} className=\"min-w-[280px] flex-1 rounded-lg p-2\">\r\n <div className=\"flex items-center gap-2 mb-4\">\r\n <span className={`w-2 h-2 rounded-full ${getCategoryDotColor(category)}`} />\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">{getCategoryLabel(category)}</h3>\r\n <span className=\"px-2 py-0.5 rounded-full text-xs font-medium bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {categoryTemplates.length}\r\n </span>\r\n </div>\r\n <div className=\"space-y-3 min-h-[100px]\">\r\n {categoryTemplates.map(renderTemplateCard)}\r\n {categoryTemplates.length === 0 && (\r\n <div className=\"border-2 border-dashed border-[var(--color-accent-200)] rounded-lg p-6 text-center\">\r\n <Mail className=\"w-6 h-6 mx-auto mb-2 text-[var(--text-muted)]\" />\r\n <p className=\"text-xs text-[var(--text-muted)]\">{t('emailTemplates.noResults')}</p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </>\r\n )}\r\n </div>\r\n );\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('communications.title', 'Communications'), href: '/administration/communications' },\r\n { label: t('communications.emailTemplates', 'Email Templates') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <PageHeader\r\n title={t('emailTemplates.title')}\r\n subtitle={`${templates.length} templates`}\r\n icon={<Mail className=\"w-6 h-6\" />}\r\n actions={\r\n <button\r\n onClick={() => navigate('/administration/workflows/email-templates/create')}\r\n className=\"btn btn-primary\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('emailTemplates.create')}\r\n </button>\r\n }\r\n />\r\n\r\n {/* Toolbar */}\r\n <div className=\"card p-4\">\r\n <div className=\"flex flex-col md:flex-row md:items-center justify-between gap-4\">\r\n {/* Search & Filters */}\r\n <form onSubmit={handleSearch} className=\"flex items-center gap-3 flex-1\">\r\n <div className=\"relative flex-1 max-w-md\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-muted)]\" />\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={e => setSearch(e.target.value)}\r\n placeholder={t('emailTemplates.searchPlaceholder')}\r\n className=\"input w-full pl-10\"\r\n />\r\n </div>\r\n <button type=\"submit\" className=\"btn btn-secondary\">\r\n <Filter className=\"w-4 h-4\" />\r\n <span className=\"hidden sm:inline\">Filtres</span>\r\n </button>\r\n </form>\r\n\r\n {/* View Toggle */}\r\n <ViewToggle\r\n viewMode={viewMode}\r\n onChange={setViewMode}\r\n tableLabel=\"Table\"\r\n cardsLabel=\"Cards\"\r\n kanbanLabel=\"Kanban\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Content based on view mode */}\r\n {viewMode === 'table' && renderTableView()}\r\n {viewMode === 'cards' && renderCardsView()}\r\n {viewMode === 'kanban' && renderKanbanView()}\r\n\r\n {/* Pagination (only for table and cards) */}\r\n {viewMode !== 'kanban' && templates.length > 0 && (\r\n <Pagination\r\n page={page}\r\n totalPages={totalPages}\r\n totalCount={templates.length}\r\n pageSize={pageSize}\r\n onPageChange={setPage}\r\n itemLabel=\"templates\"\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ArrowLeft, Save, Loader2, Mail } from 'lucide-react';\r\nimport { communicationsApi } from '@/services/api/communicationsApi';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\ninterface CreateTemplateForm {\r\n code: string;\r\n name: string;\r\n description: string;\r\n category: string;\r\n}\r\n\r\nexport function EmailTemplateCreatePage(): ReactElement {\r\n const { t } = useTranslation('communications');\r\n const navigate = useNavigate();\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [formData, setFormData] = useState<CreateTemplateForm>({\r\n code: '',\r\n name: '',\r\n description: '',\r\n category: 'transactional'\r\n });\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setSaving(true);\r\n setError(null);\r\n\r\n try {\r\n const data = await communicationsApi.emailTemplates.create({\r\n code: formData.code,\r\n name: formData.name,\r\n description: formData.description || undefined,\r\n category: formData.category\r\n });\r\n navigate(`/administration/email-templates/${data.id}`);\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'An error occurred while creating the template';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\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('header.title'), href: '/administration' },\r\n { label: t('communications.title', 'Communications'), href: '/administration/communications' },\r\n { label: t('communications.emailTemplates', 'Email Templates'), href: '/administration/workflows/email-templates' },\r\n { label: t('emailTemplates.create', 'Create') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"max-w-2xl\">\r\n <button\r\n onClick={() => navigate('/administration/email-templates/list')}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors mb-4\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('emailTemplates.backToList')}\r\n </button>\r\n\r\n <div className=\"flex items-center gap-4\">\r\n <div className=\"w-12 h-12 rounded-full bg-gradient-to-br from-violet-500 to-purple-500 flex items-center justify-center shadow-lg shadow-primary-500/20\">\r\n <Mail className=\"w-6 h-6 text-white\" />\r\n </div>\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{t('emailTemplates.createTitle')}</h1>\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">{t('emailTemplates.description')}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Form */}\r\n <form onSubmit={handleSubmit} className=\"space-y-6 max-w-2xl\">\r\n {error && (\r\n <div className=\"p-4 rounded-lg bg-[var(--error-bg)] text-[var(--error-text)] text-sm border border-[var(--error-border)]\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div className=\"card p-6 space-y-5\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1.5\">\r\n {t('emailTemplates.form.code')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={formData.code}\r\n onChange={(e) => setFormData(prev => ({ ...prev, code: e.target.value.toLowerCase().replace(/[^a-z0-9-]/g, '-') }))}\r\n placeholder=\"e.g., welcome-email\"\r\n className=\"input w-full\"\r\n />\r\n <p className=\"text-xs text-[var(--text-muted)] mt-1.5\">{t('emailTemplates.form.codeHelp')}</p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1.5\">\r\n {t('emailTemplates.form.name')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={formData.name}\r\n onChange={(e) => setFormData(prev => ({ ...prev, name: e.target.value }))}\r\n placeholder=\"e.g., Welcome Email\"\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1.5\">\r\n {t('emailTemplates.form.description')}\r\n </label>\r\n <textarea\r\n value={formData.description}\r\n onChange={(e) => setFormData(prev => ({ ...prev, description: e.target.value }))}\r\n rows={3}\r\n placeholder={t('emailTemplates.form.descriptionPlaceholder')}\r\n className=\"input w-full resize-none\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1.5\">\r\n {t('emailTemplates.form.category')}\r\n </label>\r\n <select\r\n value={formData.category}\r\n onChange={(e) => setFormData(prev => ({ ...prev, category: e.target.value }))}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"transactional\">{t('emailTemplates.categories.transactional')}</option>\r\n <option value=\"marketing\">{t('emailTemplates.categories.marketing')}</option>\r\n <option value=\"notification\">{t('emailTemplates.categories.notification')}</option>\r\n <option value=\"system\">{t('emailTemplates.categories.system')}</option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n {/* Actions */}\r\n <div className=\"flex justify-end gap-3\">\r\n <button\r\n type=\"button\"\r\n onClick={() => navigate('/administration/email-templates/list')}\r\n className=\"btn btn-secondary\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={saving}\r\n className=\"btn btn-primary disabled:opacity-50\"\r\n >\r\n {saving ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useParams, useNavigate, Link, useSearchParams } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n ArrowLeft,\r\n Settings,\r\n Loader2,\r\n Edit,\r\n Trash2,\r\n Play,\r\n Pause,\r\n AlertTriangle,\r\n CheckCircle,\r\n Languages,\r\n Mail,\r\n Eye,\r\n Plus,\r\n Code,\r\n ChevronDown,\r\n ChevronUp,\r\n FileText,\r\n Copy,\r\n Check\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n communicationsApi,\r\n type EmailTemplateDetailDto,\r\n type EmailTemplateTranslationDto\r\n} from '@/services/api/communicationsApi';\r\n\r\ntype TabId = 'info' | 'preview' | 'translations';\r\n\r\ninterface TemplateVariable {\r\n name: string;\r\n description?: string;\r\n type?: string;\r\n required?: boolean;\r\n}\r\n\r\n// Default user variables available in all email templates (from User entity, excluding technical fields)\r\nconst DEFAULT_USER_VARIABLES: TemplateVariable[] = [\r\n // User Identity\r\n { name: 'userName', description: 'Nom complet de l\\'utilisateur' },\r\n { name: 'firstName', description: 'Prenom' },\r\n { name: 'lastName', description: 'Nom de famille' },\r\n { name: 'displayName', description: 'Nom d\\'affichage (Entra)' },\r\n { name: 'email', description: 'Adresse email' },\r\n // Contact\r\n { name: 'phoneNumber', description: 'Telephone fixe' },\r\n { name: 'mobilePhone', description: 'Telephone mobile' },\r\n // Location\r\n { name: 'city', description: 'Ville' },\r\n { name: 'country', description: 'Pays' },\r\n { name: 'streetAddress', description: 'Adresse' },\r\n { name: 'postalCode', description: 'Code postal' },\r\n // Organization\r\n { name: 'company', description: 'Nom de l\\'entreprise' },\r\n { name: 'department', description: 'Departement' },\r\n { name: 'jobTitle', description: 'Fonction/Poste' },\r\n { name: 'office', description: 'Bureau/Site' },\r\n { name: 'employeeId', description: 'Numero d\\'employe' },\r\n { name: 'managerName', description: 'Nom du manager' },\r\n];\r\n\r\n// Common email template variables (actions, links, etc.)\r\nconst DEFAULT_EMAIL_VARIABLES: TemplateVariable[] = [\r\n { name: 'company_logo_url', description: 'URL du logo de l\\'entreprise' },\r\n { name: 'appName', description: 'Nom de l\\'application' },\r\n { name: 'resetUrl', description: 'Lien de reinitialisation du mot de passe' },\r\n { name: 'confirmUrl', description: 'Lien de confirmation d\\'email' },\r\n { name: 'adminName', description: 'Nom de l\\'administrateur (action admin)' },\r\n { name: 'expiresIn', description: 'Delai d\\'expiration du lien' },\r\n { name: 'currentDate', description: 'Date actuelle' },\r\n { name: 'currentYear', description: 'Annee en cours' },\r\n];\r\n\r\nexport function EmailTemplateDetailPage(): ReactElement | null {\r\n const { t, i18n } = useTranslation('communications');\r\n const { id: templateId } = useParams<{ id: string }>();\r\n const navigate = useNavigate();\r\n\r\n const [template, setTemplate] = useState<EmailTemplateDetailDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n const activeTab = (searchParams.get('tab') as TabId) || 'preview';\r\n const setActiveTab = (tab: TabId) => setSearchParams({ tab });\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n const [actionLoading, setActionLoading] = useState(false);\r\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\r\n const [previewLang, setPreviewLang] = useState<string | null>(null);\r\n const [previewContent, setPreviewContent] = useState<{ subject: string; htmlBody: string } | null>(null);\r\n const [previewLoading, setPreviewLoading] = useState(false);\r\n const [selectedPreviewLanguage, setSelectedPreviewLanguage] = useState<string>('');\r\n\r\n const loadTemplate = useCallback(async () => {\r\n if (!templateId) return;\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const data = await communicationsApi.emailTemplates.getById(templateId);\r\n setTemplate(data);\r\n } catch (err) {\r\n console.error('Failed to load template:', err);\r\n setError(t('emailTemplates.detail.errors.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [templateId, t]);\r\n\r\n useEffect(() => {\r\n loadTemplate();\r\n }, [loadTemplate]);\r\n\r\n const handleActivate = async () => {\r\n if (!templateId || !template) return;\r\n try {\r\n setActionLoading(true);\r\n setError(null);\r\n await communicationsApi.emailTemplates.update(templateId, {\r\n name: template.name,\r\n description: template.description || undefined,\r\n category: template.category,\r\n isActive: true,\r\n });\r\n setSuccess(t('emailTemplates.detail.success.activated'));\r\n loadTemplate();\r\n } catch (err) {\r\n console.error('Failed to activate template:', err);\r\n setError(t('emailTemplates.detail.errors.activateFailed'));\r\n } finally {\r\n setActionLoading(false);\r\n }\r\n };\r\n\r\n const handleDeactivate = async () => {\r\n if (!templateId || !template) return;\r\n try {\r\n setActionLoading(true);\r\n setError(null);\r\n await communicationsApi.emailTemplates.update(templateId, {\r\n name: template.name,\r\n description: template.description || undefined,\r\n category: template.category,\r\n isActive: false,\r\n });\r\n setSuccess(t('emailTemplates.detail.success.deactivated'));\r\n loadTemplate();\r\n } catch (err) {\r\n console.error('Failed to deactivate template:', err);\r\n setError(t('emailTemplates.detail.errors.deactivateFailed'));\r\n } finally {\r\n setActionLoading(false);\r\n }\r\n };\r\n\r\n const handleDelete = async () => {\r\n if (!templateId || !template) return;\r\n\r\n if (template.isSystem) {\r\n setError(t('emailTemplates.cannotDeleteSystem'));\r\n return;\r\n }\r\n\r\n try {\r\n setActionLoading(true);\r\n setError(null);\r\n await communicationsApi.emailTemplates.delete(templateId);\r\n navigate('/administration/workflows/email-templates');\r\n } catch (err) {\r\n console.error('Failed to delete template:', err);\r\n setError(t('emailTemplates.detail.errors.deleteFailed'));\r\n setShowDeleteConfirm(false);\r\n } finally {\r\n setActionLoading(false);\r\n }\r\n };\r\n\r\n const handlePreview = async (languageCode: string) => {\r\n if (!templateId) return;\r\n try {\r\n setPreviewLoading(true);\r\n setPreviewLang(languageCode);\r\n const preview = await communicationsApi.emailTemplates.preview(templateId, { languageCode });\r\n setPreviewContent({ subject: preview.subject, htmlBody: preview.htmlBody });\r\n } catch (err) {\r\n console.error('Failed to preview template:', err);\r\n setError(t('emailTemplates.detail.errors.previewFailed'));\r\n } finally {\r\n setPreviewLoading(false);\r\n }\r\n };\r\n\r\n const closePreview = () => {\r\n setPreviewLang(null);\r\n setPreviewContent(null);\r\n };\r\n\r\n // Parse variables from JSON or use defaults\r\n const templateVariables = useMemo((): { user: TemplateVariable[]; email: TemplateVariable[]; custom: TemplateVariable[] } => {\r\n let customVariables: TemplateVariable[] = [];\r\n\r\n if (template?.variablesJson) {\r\n try {\r\n const parsed = JSON.parse(template.variablesJson);\r\n if (Array.isArray(parsed)) {\r\n customVariables = parsed.filter(v => v?.name);\r\n } else if (typeof parsed === 'object') {\r\n customVariables = Object.entries(parsed)\r\n .filter(([name]) => name && name !== 'undefined')\r\n .map(([name, value]) => ({\r\n name,\r\n description: typeof value === 'object' && value !== null ? (value as Record<string, unknown>).description as string : undefined,\r\n type: typeof value === 'object' && value !== null ? (value as Record<string, unknown>).type as string : undefined,\r\n required: typeof value === 'object' && value !== null ? (value as Record<string, unknown>).required as boolean : false\r\n }));\r\n }\r\n } catch {\r\n // Invalid JSON, ignore\r\n }\r\n }\r\n\r\n return {\r\n user: DEFAULT_USER_VARIABLES,\r\n email: DEFAULT_EMAIL_VARIABLES,\r\n custom: customVariables\r\n };\r\n }, [template?.variablesJson]);\r\n\r\n // Auto-select preview language based on current UI language\r\n useEffect(() => {\r\n if (template?.translations && template.translations.length > 0) {\r\n const currentLang = i18n.language.split('-')[0];\r\n const matchingTranslation = template.translations.find(tr => tr.languageCode === currentLang);\r\n setSelectedPreviewLanguage(matchingTranslation?.languageCode || template.translations[0].languageCode);\r\n }\r\n }, [template?.translations, i18n.language]);\r\n\r\n // Get current translation for preview\r\n const currentPreviewTranslation = useMemo(() => {\r\n if (!template?.translations || !selectedPreviewLanguage) return null;\r\n return template.translations.find(tr => tr.languageCode === selectedPreviewLanguage) || null;\r\n }, [template?.translations, selectedPreviewLanguage]);\r\n\r\n const tabs: { id: TabId; label: string; icon: React.ReactNode }[] = [\r\n { id: 'preview', label: t('emailTemplates.detail.tabs.preview'), icon: <Eye className=\"w-4 h-4\" /> },\r\n { id: 'info', label: t('emailTemplates.detail.tabs.info'), icon: <Settings className=\"w-4 h-4\" /> },\r\n { id: 'translations', label: t('emailTemplates.detail.tabs.translations'), icon: <Languages className=\"w-4 h-4\" /> }\r\n ];\r\n\r\n const getCategoryLabel = (category: string) => {\r\n return t(`emailTemplates.categories.${category.toLowerCase()}`) || category;\r\n };\r\n\r\n const getLanguageLabel = (code: string) => {\r\n return t(`languages.${code}`, { defaultValue: code.toUpperCase() });\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (!template) {\r\n return (\r\n <div className=\"text-center py-12\">\r\n <p className=\"text-[var(--text-secondary)]\">{t('emailTemplates.detail.notFound')}</p>\r\n <button\r\n onClick={() => navigate('/administration/workflows/email-templates')}\r\n className=\"mt-4 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white\"\r\n >\r\n {t('emailTemplates.backToList')}\r\n </button>\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('header.title'), href: '/administration' },\r\n { label: t('communications.title', 'Communications'), href: '/administration/communications' },\r\n { label: t('communications.emailTemplates', 'Email Templates'), href: '/administration/workflows/email-templates' },\r\n { label: template?.name || '' }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center gap-4\">\r\n <button\r\n onClick={() => navigate('/administration/workflows/email-templates')}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3\">\r\n <h1 className=\"text-xl sm:text-2xl font-bold text-[var(--text-primary)]\">{template.name}</h1>\r\n {template.isSystem && (\r\n <span className=\"flex items-center gap-1 px-2 py-1 rounded-[var(--radius-badge)] text-xs bg-[var(--bg-tertiary)] text-[var(--text-secondary)] border border-[var(--border-color)]\">\r\n {t('emailTemplates.detail.system')}\r\n </span>\r\n )}\r\n <span className={`px-2 py-1 rounded-[var(--radius-badge)] text-xs font-medium ${\r\n template.isActive\r\n ? 'bg-[var(--success-bg)] text-[var(--success-text)] border border-[var(--success-border)]'\r\n : 'bg-[var(--error-bg)] text-[var(--error-text)] border border-[var(--error-border)]'\r\n }`}>\r\n {template.isActive ? t('emailTemplates.active') : t('emailTemplates.inactive')}\r\n </span>\r\n </div>\r\n {template.description && (\r\n <p className=\"text-sm sm:text-base text-[var(--text-secondary)] mt-1\">{template.description}</p>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => navigate(`/administration/workflows/email-templates/${templateId}/edit`)}\r\n className=\"flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] transition-colors\"\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n <span className=\"hidden sm:inline\">{t('emailTemplates.edit.title')}</span>\r\n </button>\r\n <button\r\n onClick={template.isActive ? handleDeactivate : handleActivate}\r\n disabled={actionLoading}\r\n className={`flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] border transition-colors ${\r\n template.isActive\r\n ? 'border-[var(--warning-border)] text-[var(--warning-text)] hover:bg-[var(--warning-bg)]'\r\n : 'border-[var(--success-border)] text-[var(--success-text)] hover:bg-[var(--success-bg)]'\r\n }`}\r\n >\r\n {actionLoading && (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n )}\r\n {!actionLoading && template.isActive && (\r\n <Pause className=\"w-4 h-4\" />\r\n )}\r\n {!actionLoading && !template.isActive && (\r\n <Play className=\"w-4 h-4\" />\r\n )}\r\n <span className=\"hidden sm:inline\">\r\n {template.isActive ? t('emailTemplates.deactivate') : t('emailTemplates.activate')}\r\n </span>\r\n </button>\r\n <button\r\n onClick={() => setShowDeleteConfirm(true)}\r\n className=\"flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] border border-[var(--error-border)] text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-colors\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n <span className=\"hidden sm:inline\">{t('emailTemplates.delete')}</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Alerts */}\r\n {error && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)] text-[var(--error-text)] flex items-center gap-2\">\r\n <AlertTriangle className=\"w-5 h-5 flex-shrink-0\" />\r\n {error}\r\n </div>\r\n )}\r\n {success && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--success-bg)] border border-[var(--success-border)] text-[var(--success-text)] flex items-center gap-2\">\r\n <CheckCircle className=\"w-5 h-5 flex-shrink-0\" />\r\n {success}\r\n </div>\r\n )}\r\n\r\n\r\n {/* Tabs */}\r\n <div className=\"flex gap-1 p-1 bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n {tabs.map(tab => (\r\n <button\r\n key={tab.id}\r\n onClick={() => setActiveTab(tab.id)}\r\n className={`flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium transition-colors ${\r\n activeTab === tab.id\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n {tab.icon}\r\n <span className=\"hidden sm:inline\">{tab.label}</span>\r\n {tab.id === 'translations' && (\r\n <span className={`ml-1 px-1.5 py-0.5 rounded text-xs ${\r\n activeTab === tab.id ? 'bg-white/20' : 'bg-[var(--bg-tertiary)]'\r\n }`}>\r\n {template.translations.length}\r\n </span>\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div className=\"bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4 sm:p-6\">\r\n {/* Preview Tab */}\r\n {activeTab === 'preview' && (\r\n <div className=\"space-y-6\">\r\n {/* Language Selector */}\r\n {template.translations.length > 0 ? (\r\n <div className=\"flex items-center justify-between flex-wrap gap-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <label className=\"text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('emailTemplates.detail.previewLanguage', { defaultValue: 'Langue' })}:\r\n </label>\r\n <div className=\"flex gap-1 p-1 bg-[var(--bg-tertiary)] rounded-[var(--radius-button)]\">\r\n {template.translations.map(tr => (\r\n <button\r\n key={tr.languageCode}\r\n onClick={() => setSelectedPreviewLanguage(tr.languageCode)}\r\n className={`px-3 py-1.5 rounded text-sm font-medium transition-colors ${\r\n selectedPreviewLanguage === tr.languageCode\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n {getLanguageLabel(tr.languageCode)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n <button\r\n onClick={() => navigate(`/administration/workflows/email-templates/${templateId}/edit`)}\r\n className=\"flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] transition-colors\"\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n {t('emailTemplates.edit.title')}\r\n </button>\r\n </div>\r\n ) : (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n <Mail className=\"w-12 h-12 mx-auto mb-4 opacity-50\" />\r\n <p className=\"mb-4\">{t('emailTemplates.detail.noTranslations')}</p>\r\n <Link\r\n to={`/administration/workflows/email-templates/${templateId}/edit`}\r\n className=\"inline-flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('emailTemplates.detail.addFirstTranslation')}\r\n </Link>\r\n </div>\r\n )}\r\n\r\n {/* Email Preview */}\r\n {currentPreviewTranslation && (\r\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\r\n {/* Email Content - Main Area */}\r\n <div className=\"lg:col-span-2 space-y-4\">\r\n {/* Subject */}\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n <div className=\"px-4 py-2 bg-[var(--bg-tertiary)] border-b border-[var(--border-color)] flex items-center gap-2\">\r\n <Mail className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('emailTemplates.detail.subject')}\r\n </span>\r\n </div>\r\n <div className=\"px-4 py-3\">\r\n <p className=\"text-[var(--text-primary)] font-medium\">{currentPreviewTranslation.subject}</p>\r\n </div>\r\n </div>\r\n\r\n {/* HTML Body Preview */}\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n <div className=\"px-4 py-2 bg-[var(--bg-tertiary)] border-b border-[var(--border-color)] flex items-center justify-between\">\r\n <div className=\"flex items-center gap-2\">\r\n <FileText className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('emailTemplates.detail.emailBody', { defaultValue: 'Contenu de l\\'email' })}\r\n </span>\r\n </div>\r\n <button\r\n onClick={() => handlePreview(currentPreviewTranslation.languageCode)}\r\n className=\"flex items-center gap-1 px-2 py-1 rounded text-xs text-[var(--color-accent-600)] hover:bg-[var(--color-accent-50)] dark:hover:bg-[var(--color-accent-900)] transition-colors\"\r\n >\r\n <Eye className=\"w-3 h-3\" />\r\n {t('emailTemplates.detail.fullPreview', { defaultValue: 'Plein ecran' })}\r\n </button>\r\n </div>\r\n <div className=\"bg-white\">\r\n <iframe\r\n srcDoc={currentPreviewTranslation.htmlBody}\r\n className=\"w-full min-h-[400px] border-0\"\r\n title=\"Email Preview\"\r\n sandbox=\"allow-same-origin\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Text Body (if exists) */}\r\n {currentPreviewTranslation.textBody && (\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n <div className=\"px-4 py-2 bg-[var(--bg-tertiary)] border-b border-[var(--border-color)] flex items-center gap-2\">\r\n <FileText className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('emailTemplates.detail.textVersion', { defaultValue: 'Version texte' })}\r\n </span>\r\n </div>\r\n <div className=\"px-4 py-3\">\r\n <pre className=\"whitespace-pre-wrap text-sm text-[var(--text-secondary)] font-mono\">\r\n {currentPreviewTranslation.textBody}\r\n </pre>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Variables Panel - Sidebar */}\r\n <div className=\"space-y-4\">\r\n {/* Template Variables */}\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n <div className=\"px-4 py-2 bg-[var(--bg-tertiary)] border-b border-[var(--border-color)] flex items-center gap-2\">\r\n <Code className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('emailTemplates.detail.variables')}\r\n </span>\r\n </div>\r\n <div className=\"p-4 space-y-4 max-h-[500px] overflow-y-auto\">\r\n {/* Custom Variables (if any) */}\r\n {templateVariables.custom.length > 0 && (\r\n <VariableSection\r\n title={t('emailTemplates.detail.customVariables')}\r\n variables={templateVariables.custom}\r\n t={t}\r\n defaultExpanded={true}\r\n />\r\n )}\r\n\r\n {/* User Variables */}\r\n <VariableSection\r\n title={t('emailTemplates.detail.userVariables')}\r\n variables={templateVariables.user}\r\n t={t}\r\n defaultExpanded={false}\r\n />\r\n\r\n {/* Email Variables */}\r\n <VariableSection\r\n title={t('emailTemplates.detail.emailVariables')}\r\n variables={templateVariables.email}\r\n t={t}\r\n defaultExpanded={false}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Template Info Card */}\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n <div className=\"px-4 py-2 bg-[var(--bg-tertiary)] border-b border-[var(--border-color)] flex items-center gap-2\">\r\n <Settings className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('emailTemplates.detail.quickInfo')}\r\n </span>\r\n </div>\r\n <div className=\"p-4 space-y-3 text-sm\">\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-[var(--text-tertiary)]\">{t('emailTemplates.form.code')}</span>\r\n <code className=\"px-2 py-0.5 bg-[var(--bg-tertiary)] rounded text-[var(--text-primary)] text-xs\">\r\n {template.code}\r\n </code>\r\n </div>\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-[var(--text-tertiary)]\">{t('emailTemplates.form.category')}</span>\r\n <span className=\"text-[var(--text-primary)]\">{getCategoryLabel(template.category)}</span>\r\n </div>\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-[var(--text-tertiary)]\">{t('emailTemplates.columns.translations')}</span>\r\n <span className=\"text-[var(--text-primary)]\">{template.translations.length}/4</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Info Tab */}\r\n {activeTab === 'info' && (\r\n <div className=\"space-y-6\">\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.form.code')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)] font-mono text-sm\">\r\n {template.code}\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.form.name')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)]\">\r\n {template.name}\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.form.description')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)] min-h-[60px]\">\r\n {template.description || <span className=\"text-[var(--text-tertiary)]\">-</span>}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.form.category')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)]\">\r\n {getCategoryLabel(template.category)}\r\n </div>\r\n </div>\r\n\r\n {template.applicationId && (\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.detail.application')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)]\">\r\n {template.applicationId}\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.detail.createdAt')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)] text-sm\">\r\n {new Date(template.createdAt).toLocaleString()}\r\n </div>\r\n </div>\r\n {template.updatedAt && (\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.detail.updatedAt')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)] text-sm\">\r\n {new Date(template.updatedAt).toLocaleString()}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Translations Tab */}\r\n {activeTab === 'translations' && (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('emailTemplates.detail.translationsTitle')} ({template.translations.length})\r\n </h3>\r\n <Link\r\n to={`/administration/workflows/email-templates/${templateId}/edit`}\r\n className=\"flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('emailTemplates.detail.addTranslation')}\r\n </Link>\r\n </div>\r\n\r\n {template.translations.length === 0 ? (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n <Languages className=\"w-12 h-12 mx-auto mb-4 opacity-50\" />\r\n <p>{t('emailTemplates.detail.noTranslations')}</p>\r\n <Link\r\n to={`/administration/workflows/email-templates/${templateId}/edit`}\r\n className=\"inline-flex items-center gap-2 mt-4 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('emailTemplates.detail.addFirstTranslation')}\r\n </Link>\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3\">\r\n {template.translations.map((translation) => (\r\n <TranslationCard\r\n key={translation.id}\r\n translation={translation}\r\n templateId={templateId!}\r\n onPreview={() => handlePreview(translation.languageCode)}\r\n t={t}\r\n getLanguageLabel={getLanguageLabel}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Delete Confirmation Modal */}\r\n {showDeleteConfirm && (\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-[var(--radius-card)] border border-[var(--border-color)] p-6 max-w-md w-full shadow-xl\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-2\">\r\n {t('emailTemplates.detail.confirmDelete.title')}\r\n </h3>\r\n <p className=\"text-[var(--text-secondary)] mb-6\">\r\n {t('emailTemplates.confirmDelete', { name: template.name })}\r\n </p>\r\n <div className=\"flex justify-end gap-3\">\r\n <button\r\n onClick={() => setShowDeleteConfirm(false)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n onClick={handleDelete}\r\n disabled={actionLoading}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--error-600)] hover:bg-[var(--error-700)] text-white font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {actionLoading ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Trash2 className=\"w-4 h-4\" />\r\n )}\r\n {t('emailTemplates.delete')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Preview Modal */}\r\n {previewLang && previewContent && (\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-[var(--radius-card)] border border-[var(--border-color)] p-6 max-w-4xl w-full max-h-[90vh] overflow-hidden shadow-xl flex flex-col\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('emailTemplates.detail.preview')} - {getLanguageLabel(previewLang)}\r\n </h3>\r\n <button\r\n onClick={closePreview}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <span className=\"sr-only\">Close</span>\r\n ×\r\n </button>\r\n </div>\r\n <div className=\"mb-4\">\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.detail.subject')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)]\">\r\n {previewContent.subject}\r\n </div>\r\n </div>\r\n <div className=\"flex-1 overflow-auto border border-[var(--border-color)] rounded-[var(--radius-card)] bg-white\">\r\n <iframe\r\n srcDoc={previewContent.htmlBody}\r\n className=\"w-full h-full min-h-[400px]\"\r\n title=\"Email Preview\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {previewLoading && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-white\" />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\ninterface TranslationCardProps {\r\n readonly translation: EmailTemplateTranslationDto;\r\n readonly templateId: string;\r\n readonly onPreview: () => void;\r\n readonly t: (key: string, options?: Record<string, unknown>) => string;\r\n readonly getLanguageLabel: (code: string) => string;\r\n}\r\n\r\nfunction TranslationCard({ translation, templateId, onPreview, t, getLanguageLabel }: TranslationCardProps) {\r\n const navigate = useNavigate();\r\n const [expanded, setExpanded] = useState(false);\r\n\r\n return (\r\n <div className=\"rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)] hover:border-[var(--color-accent-300)] transition-colors overflow-hidden\">\r\n {/* Header */}\r\n <div className=\"p-4\">\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"flex items-center gap-3 flex-1 min-w-0\">\r\n <div className=\"w-10 h-10 rounded-full bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] flex items-center justify-center flex-shrink-0\">\r\n <span className=\"text-sm font-bold text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)] uppercase\">\r\n {translation.languageCode}\r\n </span>\r\n </div>\r\n <div className=\"min-w-0 flex-1\">\r\n <div className=\"font-medium text-[var(--text-primary)]\">{getLanguageLabel(translation.languageCode)}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">{translation.subject}</div>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2 flex-shrink-0\">\r\n <button\r\n onClick={() => setExpanded(!expanded)}\r\n className=\"flex items-center gap-1 px-2 py-1 rounded-[var(--radius-button)] text-sm text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {expanded ? <ChevronUp className=\"w-4 h-4\" /> : <ChevronDown className=\"w-4 h-4\" />}\r\n {expanded ? t('emailTemplates.detail.collapse', { defaultValue: 'Reduire' }) : t('emailTemplates.detail.expand', { defaultValue: 'Voir le contenu' })}\r\n </button>\r\n <button\r\n onClick={onPreview}\r\n className=\"flex items-center gap-1 px-2 py-1 rounded-[var(--radius-button)] text-sm text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <Eye className=\"w-4 h-4\" />\r\n {t('emailTemplates.detail.preview')}\r\n </button>\r\n <button\r\n onClick={() => navigate(`/administration/workflows/email-templates/${templateId}/edit`)}\r\n className=\"flex items-center gap-1 px-2 py-1 rounded-[var(--radius-button)] text-sm text-[var(--color-accent-600)] hover:bg-[var(--color-accent-50)] dark:hover:bg-[var(--color-accent-900)] transition-colors\"\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n {t('emailTemplates.edit.title')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Expanded Content */}\r\n {expanded && (\r\n <div className=\"border-t border-[var(--border-color)]\">\r\n <div className=\"bg-white max-h-[300px] overflow-auto\">\r\n <iframe\r\n srcDoc={translation.htmlBody}\r\n className=\"w-full min-h-[200px] border-0\"\r\n title={`Email Preview - ${translation.languageCode}`}\r\n sandbox=\"allow-same-origin\"\r\n />\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// Variable Section Component (collapsible)\r\ninterface VariableSectionProps {\r\n readonly title: string;\r\n readonly variables: TemplateVariable[];\r\n readonly t: (key: string, options?: Record<string, unknown>) => string;\r\n readonly defaultExpanded?: boolean;\r\n}\r\n\r\nfunction VariableSection({ title, variables, t, defaultExpanded = false }: VariableSectionProps) {\r\n const [expanded, setExpanded] = useState(defaultExpanded);\r\n\r\n return (\r\n <div className=\"border border-[var(--border-color)] rounded-lg overflow-hidden\">\r\n <button\r\n onClick={() => setExpanded(!expanded)}\r\n className=\"w-full flex items-center justify-between px-3 py-2 bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] transition-colors text-left\"\r\n >\r\n <span className=\"text-xs font-medium text-[var(--text-secondary)]\">{title}</span>\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-xs text-[var(--text-tertiary)]\">{variables.length}</span>\r\n {expanded ? <ChevronUp className=\"w-3 h-3\" /> : <ChevronDown className=\"w-3 h-3\" />}\r\n </div>\r\n </button>\r\n {expanded && (\r\n <div className=\"p-2 space-y-1\">\r\n {variables.map((variable) => (\r\n <VariableItem key={variable.name} variable={variable} t={t} />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// Variable Item Component\r\ninterface VariableItemProps {\r\n readonly variable: TemplateVariable;\r\n readonly t: (key: string, options?: Record<string, unknown>) => string;\r\n}\r\n\r\nfunction VariableItem({ variable, t }: VariableItemProps) {\r\n const [copied, setCopied] = useState(false);\r\n const variableSyntax = `{{ ${variable.name} }}`;\r\n\r\n const handleCopy = () => {\r\n navigator.clipboard.writeText(variableSyntax);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n };\r\n\r\n return (\r\n <div className=\"group flex items-center justify-between p-2 rounded hover:bg-[var(--bg-tertiary)] transition-colors\">\r\n <div className=\"min-w-0 flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <code className=\"text-sm font-mono text-[var(--color-accent-600)]\">{variableSyntax}</code>\r\n {variable.required && (\r\n <span className=\"text-xs text-[var(--error-text)]\">*</span>\r\n )}\r\n </div>\r\n {variable.description && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-0.5 truncate\">{variable.description}</p>\r\n )}\r\n </div>\r\n <button\r\n onClick={handleCopy}\r\n className=\"opacity-0 group-hover:opacity-100 p-1 rounded hover:bg-[var(--bg-hover)] transition-all\"\r\n title={t('emailTemplates.detail.copyVariable', { defaultValue: 'Copier' })}\r\n >\r\n {copied ? (\r\n <Check className=\"w-3.5 h-3.5 text-[var(--success-text)]\" />\r\n ) : (\r\n <Copy className=\"w-3.5 h-3.5 text-[var(--text-tertiary)]\" />\r\n )}\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\nexport default EmailTemplateDetailPage;\r\n","import { useEditor, EditorContent } from '@tiptap/react';\r\nimport StarterKit from '@tiptap/starter-kit';\r\nimport Link from '@tiptap/extension-link';\r\nimport Image from '@tiptap/extension-image';\r\nimport Placeholder from '@tiptap/extension-placeholder';\r\nimport TextAlign from '@tiptap/extension-text-align';\r\nimport Underline from '@tiptap/extension-underline';\r\nimport { TextStyle } from '@tiptap/extension-text-style';\r\nimport { Color } from '@tiptap/extension-color';\r\nimport Highlight from '@tiptap/extension-highlight';\r\nimport { useState, useCallback, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport {\r\n Bold,\r\n Italic,\r\n Underline as UnderlineIcon,\r\n Strikethrough,\r\n AlignLeft,\r\n AlignCenter,\r\n AlignRight,\r\n List,\r\n ListOrdered,\r\n Link as LinkIcon,\r\n Image as ImageIcon,\r\n Code,\r\n Eye,\r\n Heading1,\r\n Heading2,\r\n Heading3,\r\n Undo,\r\n Redo,\r\n Palette,\r\n Highlighter,\r\n Quote,\r\n Minus,\r\n X,\r\n Check\r\n} from 'lucide-react';\r\nimport Editor from '@monaco-editor/react';\r\n\r\ninterface EmailEditorProps {\r\n readonly content: string;\r\n readonly onChange: (html: string) => void;\r\n readonly placeholder?: string;\r\n readonly onInsertVariable?: (varName: string) => void;\r\n readonly className?: string;\r\n}\r\n\r\nexport function EmailEditor({ content, onChange, placeholder, className }: EmailEditorProps): ReactElement {\r\n const [mode, setMode] = useState<'visual' | 'code'>('visual');\r\n const [codeContent, setCodeContent] = useState(content);\r\n const [linkUrl, setLinkUrl] = useState('');\r\n const [showLinkInput, setShowLinkInput] = useState(false);\r\n const [imageUrl, setImageUrl] = useState('');\r\n const [showImageInput, setShowImageInput] = useState(false);\r\n\r\n const editor = useEditor({\r\n extensions: [\r\n StarterKit.configure({\r\n heading: {\r\n levels: [1, 2, 3],\r\n },\r\n }),\r\n Link.configure({\r\n openOnClick: false,\r\n HTMLAttributes: {\r\n class: 'text-[var(--color-accent-600)] underline',\r\n },\r\n }),\r\n Image.configure({\r\n HTMLAttributes: {\r\n class: 'max-w-full h-auto rounded',\r\n },\r\n }),\r\n Placeholder.configure({\r\n placeholder: placeholder || 'Commencez a ecrire votre email...',\r\n }),\r\n TextAlign.configure({\r\n types: ['heading', 'paragraph'],\r\n }),\r\n Underline,\r\n TextStyle,\r\n Color,\r\n Highlight.configure({\r\n multicolor: true,\r\n }),\r\n ],\r\n content: content,\r\n onUpdate: ({ editor }) => {\r\n const html = editor.getHTML();\r\n onChange(html);\r\n setCodeContent(html);\r\n },\r\n editorProps: {\r\n attributes: {\r\n class: 'prose prose-sm max-w-none focus:outline-none min-h-[300px] p-4',\r\n },\r\n },\r\n });\r\n\r\n // Sync content when switching modes\r\n useEffect(() => {\r\n if (mode === 'visual' && editor && codeContent !== editor.getHTML()) {\r\n editor.commands.setContent(codeContent);\r\n }\r\n }, [mode, editor, codeContent]);\r\n\r\n // Update code content when visual editor changes\r\n useEffect(() => {\r\n if (editor) {\r\n setCodeContent(editor.getHTML());\r\n }\r\n }, [editor?.getHTML()]);\r\n\r\n const handleCodeChange = useCallback((value: string | undefined) => {\r\n const newContent = value || '';\r\n setCodeContent(newContent);\r\n onChange(newContent);\r\n }, [onChange]);\r\n\r\n const switchToVisual = useCallback(() => {\r\n if (editor) {\r\n editor.commands.setContent(codeContent);\r\n }\r\n setMode('visual');\r\n }, [editor, codeContent]);\r\n\r\n const switchToCode = useCallback(() => {\r\n if (editor) {\r\n setCodeContent(editor.getHTML());\r\n }\r\n setMode('code');\r\n }, [editor]);\r\n\r\n const addLink = useCallback(() => {\r\n if (linkUrl && editor) {\r\n editor.chain().focus().extendMarkRange('link').setLink({ href: linkUrl }).run();\r\n setLinkUrl('');\r\n setShowLinkInput(false);\r\n }\r\n }, [editor, linkUrl]);\r\n\r\n const removeLink = useCallback(() => {\r\n if (editor) {\r\n editor.chain().focus().unsetLink().run();\r\n setShowLinkInput(false);\r\n }\r\n }, [editor]);\r\n\r\n const addImage = useCallback(() => {\r\n if (imageUrl && editor) {\r\n editor.chain().focus().setImage({ src: imageUrl }).run();\r\n setImageUrl('');\r\n setShowImageInput(false);\r\n }\r\n }, [editor, imageUrl]);\r\n\r\n const insertVariable = useCallback((varName: string) => {\r\n if (editor) {\r\n const variableSyntax = `{{ ${varName} }}`;\r\n editor.chain().focus().insertContent(`<span class=\"variable-tag\" data-variable=\"${varName}\">${variableSyntax}</span>`).run();\r\n }\r\n }, [editor]);\r\n\r\n // Expose insertVariable method\r\n useEffect(() => {\r\n if (typeof window !== 'undefined') {\r\n (window as unknown as Record<string, unknown>).__emailEditorInsertVariable = insertVariable;\r\n }\r\n return () => {\r\n if (typeof window !== 'undefined') {\r\n delete (window as unknown as Record<string, unknown>).__emailEditorInsertVariable;\r\n }\r\n };\r\n }, [insertVariable]);\r\n\r\n if (!editor) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"animate-pulse text-[var(--text-tertiary)]\">Chargement de l'editeur...</div>\r\n </div>\r\n );\r\n }\r\n\r\n const ToolbarButton = ({\r\n onClick,\r\n isActive = false,\r\n disabled = false,\r\n title,\r\n children\r\n }: {\r\n onClick: () => void;\r\n isActive?: boolean;\r\n disabled?: boolean;\r\n title: string;\r\n children: React.ReactNode;\r\n }) => (\r\n <button\r\n type=\"button\"\r\n onClick={onClick}\r\n disabled={disabled}\r\n title={title}\r\n className={`p-1.5 rounded transition-colors ${\r\n isActive\r\n ? 'bg-[var(--color-accent-100)] text-[var(--color-accent-700)] dark:bg-[var(--color-accent-900)] dark:text-[var(--color-accent-300)]'\r\n : 'hover:bg-[var(--bg-hover)] text-[var(--text-secondary)]'\r\n } ${disabled ? 'opacity-50 cursor-not-allowed' : ''}`}\r\n >\r\n {children}\r\n </button>\r\n );\r\n\r\n const ToolbarDivider = () => (\r\n <div className=\"w-px h-6 bg-[var(--border-color)] mx-1\" />\r\n );\r\n\r\n return (\r\n <div className={`border border-[var(--border-color)] rounded-lg overflow-hidden bg-[var(--bg-primary)] ${className || ''}`}>\r\n {/* Toolbar */}\r\n <div className=\"flex flex-wrap items-center gap-0.5 p-2 border-b border-[var(--border-color)] bg-[var(--bg-tertiary)]\">\r\n {/* Mode Toggle */}\r\n <div className=\"flex items-center gap-1 mr-2\">\r\n <button\r\n type=\"button\"\r\n onClick={switchToVisual}\r\n className={`flex items-center gap-1 px-2 py-1 rounded text-xs font-medium transition-colors ${\r\n mode === 'visual'\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <Eye className=\"w-3 h-3\" />\r\n Visuel\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={switchToCode}\r\n className={`flex items-center gap-1 px-2 py-1 rounded text-xs font-medium transition-colors ${\r\n mode === 'code'\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <Code className=\"w-3 h-3\" />\r\n Code\r\n </button>\r\n </div>\r\n\r\n {mode === 'visual' && (\r\n <>\r\n <ToolbarDivider />\r\n\r\n {/* Undo/Redo */}\r\n <ToolbarButton onClick={() => editor.chain().focus().undo().run()} disabled={!editor.can().undo()} title=\"Annuler\">\r\n <Undo className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <ToolbarButton onClick={() => editor.chain().focus().redo().run()} disabled={!editor.can().redo()} title=\"Retablir\">\r\n <Redo className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n\r\n <ToolbarDivider />\r\n\r\n {/* Headings */}\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().toggleHeading({ level: 1 }).run()}\r\n isActive={editor.isActive('heading', { level: 1 })}\r\n title=\"Titre 1\"\r\n >\r\n <Heading1 className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}\r\n isActive={editor.isActive('heading', { level: 2 })}\r\n title=\"Titre 2\"\r\n >\r\n <Heading2 className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().toggleHeading({ level: 3 }).run()}\r\n isActive={editor.isActive('heading', { level: 3 })}\r\n title=\"Titre 3\"\r\n >\r\n <Heading3 className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n\r\n <ToolbarDivider />\r\n\r\n {/* Text Formatting */}\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().toggleBold().run()}\r\n isActive={editor.isActive('bold')}\r\n title=\"Gras\"\r\n >\r\n <Bold className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().toggleItalic().run()}\r\n isActive={editor.isActive('italic')}\r\n title=\"Italique\"\r\n >\r\n <Italic className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().toggleUnderline().run()}\r\n isActive={editor.isActive('underline')}\r\n title=\"Souligne\"\r\n >\r\n <UnderlineIcon className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().toggleStrike().run()}\r\n isActive={editor.isActive('strike')}\r\n title=\"Barre\"\r\n >\r\n <Strikethrough className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n\r\n <ToolbarDivider />\r\n\r\n {/* Text Alignment */}\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().setTextAlign('left').run()}\r\n isActive={editor.isActive({ textAlign: 'left' })}\r\n title=\"Aligner a gauche\"\r\n >\r\n <AlignLeft className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().setTextAlign('center').run()}\r\n isActive={editor.isActive({ textAlign: 'center' })}\r\n title=\"Centrer\"\r\n >\r\n <AlignCenter className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().setTextAlign('right').run()}\r\n isActive={editor.isActive({ textAlign: 'right' })}\r\n title=\"Aligner a droite\"\r\n >\r\n <AlignRight className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n\r\n <ToolbarDivider />\r\n\r\n {/* Lists */}\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().toggleBulletList().run()}\r\n isActive={editor.isActive('bulletList')}\r\n title=\"Liste a puces\"\r\n >\r\n <List className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\r\n isActive={editor.isActive('orderedList')}\r\n title=\"Liste numerotee\"\r\n >\r\n <ListOrdered className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n\r\n <ToolbarDivider />\r\n\r\n {/* Block Elements */}\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\r\n isActive={editor.isActive('blockquote')}\r\n title=\"Citation\"\r\n >\r\n <Quote className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <ToolbarButton\r\n onClick={() => editor.chain().focus().setHorizontalRule().run()}\r\n title=\"Ligne horizontale\"\r\n >\r\n <Minus className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n\r\n <ToolbarDivider />\r\n\r\n {/* Link */}\r\n <div className=\"relative\">\r\n <ToolbarButton\r\n onClick={() => setShowLinkInput(!showLinkInput)}\r\n isActive={editor.isActive('link') || showLinkInput}\r\n title=\"Lien\"\r\n >\r\n <LinkIcon className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n {showLinkInput && (\r\n <div className=\"absolute top-full left-0 mt-1 p-2 bg-[var(--bg-primary)] border border-[var(--border-color)] rounded-lg shadow-lg z-10 flex items-center gap-2\">\r\n <input\r\n type=\"url\"\r\n value={linkUrl}\r\n onChange={(e) => setLinkUrl(e.target.value)}\r\n placeholder=\"https://...\"\r\n className=\"px-2 py-1 text-sm border border-[var(--border-color)] rounded bg-[var(--bg-primary)] text-[var(--text-primary)] w-48\"\r\n onKeyDown={(e) => e.key === 'Enter' && addLink()}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={addLink}\r\n className=\"p-1 text-[var(--success-text)] hover:bg-[var(--success-bg)] rounded\"\r\n >\r\n <Check className=\"w-4 h-4\" />\r\n </button>\r\n {editor.isActive('link') && (\r\n <button\r\n type=\"button\"\r\n onClick={removeLink}\r\n className=\"p-1 text-[var(--error-text)] hover:bg-[var(--error-bg)] rounded\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Image */}\r\n <div className=\"relative\">\r\n <ToolbarButton\r\n onClick={() => setShowImageInput(!showImageInput)}\r\n isActive={showImageInput}\r\n title=\"Image\"\r\n >\r\n <ImageIcon className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n {showImageInput && (\r\n <div className=\"absolute top-full left-0 mt-1 p-2 bg-[var(--bg-primary)] border border-[var(--border-color)] rounded-lg shadow-lg z-10 flex items-center gap-2\">\r\n <input\r\n type=\"url\"\r\n value={imageUrl}\r\n onChange={(e) => setImageUrl(e.target.value)}\r\n placeholder=\"URL de l'image...\"\r\n className=\"px-2 py-1 text-sm border border-[var(--border-color)] rounded bg-[var(--bg-primary)] text-[var(--text-primary)] w-48\"\r\n onKeyDown={(e) => e.key === 'Enter' && addImage()}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={addImage}\r\n className=\"p-1 text-[var(--success-text)] hover:bg-[var(--success-bg)] rounded\"\r\n >\r\n <Check className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowImageInput(false)}\r\n className=\"p-1 text-[var(--error-text)] hover:bg-[var(--error-bg)] rounded\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Logo shortcut */}\r\n <ToolbarButton\r\n onClick={() => {\r\n editor.chain().focus().insertContent('<img src=\"{{ company_logo_url }}\" alt=\"Logo\" style=\"max-width: 200px; height: auto;\" />').run();\r\n }}\r\n title=\"Inserer le logo\"\r\n >\r\n <span className=\"text-xs font-medium\">Logo</span>\r\n </ToolbarButton>\r\n\r\n <ToolbarDivider />\r\n\r\n {/* Colors */}\r\n <div className=\"relative group\">\r\n <ToolbarButton onClick={() => {}} title=\"Couleur du texte\">\r\n <Palette className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <div className=\"absolute top-full left-0 mt-1 p-2 bg-[var(--bg-primary)] border border-[var(--border-color)] rounded-lg shadow-lg z-10 hidden group-hover:grid grid-cols-5 gap-1\">\r\n {['#000000', '#374151', '#dc2626', '#ea580c', '#ca8a04', '#16a34a', '#0891b2', '#2563eb', '#7c3aed', '#db2777'].map(color => (\r\n <button\r\n key={color}\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().setColor(color).run()}\r\n className=\"w-6 h-6 rounded border border-[var(--border-color)]\"\r\n style={{ backgroundColor: color }}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n\r\n <div className=\"relative group\">\r\n <ToolbarButton onClick={() => {}} title=\"Surligner\">\r\n <Highlighter className=\"w-4 h-4\" />\r\n </ToolbarButton>\r\n <div className=\"absolute top-full left-0 mt-1 p-2 bg-[var(--bg-primary)] border border-[var(--border-color)] rounded-lg shadow-lg z-10 hidden group-hover:grid grid-cols-5 gap-1\">\r\n {['#fef08a', '#bbf7d0', '#bfdbfe', '#ddd6fe', '#fbcfe8'].map(color => (\r\n <button\r\n key={color}\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().toggleHighlight({ color }).run()}\r\n className=\"w-6 h-6 rounded border border-[var(--border-color)]\"\r\n style={{ backgroundColor: color }}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Editor Content */}\r\n <div className=\"min-h-[400px]\">\r\n {mode === 'visual' ? (\r\n <EditorContent\r\n editor={editor}\r\n className=\"[&_.ProseMirror]:min-h-[400px] [&_.ProseMirror]:p-4 [&_.ProseMirror]:focus:outline-none [&_.ProseMirror_p.is-editor-empty:first-child::before]:content-[attr(data-placeholder)] [&_.ProseMirror_p.is-editor-empty:first-child::before]:text-[var(--text-tertiary)] [&_.ProseMirror_p.is-editor-empty:first-child::before]:float-left [&_.ProseMirror_p.is-editor-empty:first-child::before]:h-0 [&_.ProseMirror_p.is-editor-empty:first-child::before]:pointer-events-none\"\r\n />\r\n ) : (\r\n <Editor\r\n height=\"400px\"\r\n language=\"html\"\r\n theme=\"vs-dark\"\r\n value={codeContent}\r\n onChange={handleCodeChange}\r\n options={{\r\n minimap: { enabled: false },\r\n fontSize: 13,\r\n wordWrap: 'on',\r\n formatOnPaste: true,\r\n automaticLayout: true,\r\n scrollBeyondLastLine: false,\r\n lineNumbers: 'on',\r\n tabSize: 2,\r\n folding: true,\r\n renderWhitespace: 'selection',\r\n }}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// Export a method to programmatically insert variables\r\nexport function insertEmailVariable(varName: string): void {\r\n const insertFn = (window as unknown as Record<string, unknown>).__emailEditorInsertVariable as ((varName: string) => void) | undefined;\r\n if (insertFn) {\r\n insertFn(varName);\r\n }\r\n}\r\n\r\nexport default EmailEditor;\r\n","import { useState, useEffect, useCallback, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useParams, useNavigate, useSearchParams } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n ArrowLeft,\r\n Settings,\r\n Loader2,\r\n Save,\r\n AlertTriangle,\r\n CheckCircle,\r\n Languages,\r\n Plus,\r\n Trash2,\r\n Eye,\r\n Code,\r\n Check,\r\n Columns,\r\n Maximize2,\r\n Minimize2,\r\n ChevronDown,\r\n ChevronUp\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { EmailEditor } from '@/components/email';\r\nimport {\r\n communicationsApi,\r\n type EmailTemplateDetailDto,\r\n type EmailTemplateTranslationDto\r\n} from '@/services/api/communicationsApi';\r\n\r\ninterface TemplateVariable {\r\n name: string;\r\n description?: string;\r\n type?: string;\r\n required?: boolean;\r\n}\r\n\r\n// Default user variables available in all email templates (from User entity, excluding technical fields)\r\nconst DEFAULT_USER_VARIABLES: TemplateVariable[] = [\r\n // User Identity\r\n { name: 'userName', description: 'Nom complet de l\\'utilisateur' },\r\n { name: 'firstName', description: 'Prenom' },\r\n { name: 'lastName', description: 'Nom de famille' },\r\n { name: 'displayName', description: 'Nom d\\'affichage (Entra)' },\r\n { name: 'email', description: 'Adresse email' },\r\n // Contact\r\n { name: 'phoneNumber', description: 'Telephone fixe' },\r\n { name: 'mobilePhone', description: 'Telephone mobile' },\r\n // Location\r\n { name: 'city', description: 'Ville' },\r\n { name: 'country', description: 'Pays' },\r\n { name: 'streetAddress', description: 'Adresse' },\r\n { name: 'postalCode', description: 'Code postal' },\r\n // Organization\r\n { name: 'company', description: 'Nom de l\\'entreprise' },\r\n { name: 'department', description: 'Departement' },\r\n { name: 'jobTitle', description: 'Fonction/Poste' },\r\n { name: 'office', description: 'Bureau/Site' },\r\n { name: 'employeeId', description: 'Numero d\\'employe' },\r\n { name: 'managerName', description: 'Nom du manager' },\r\n];\r\n\r\n// Common email template variables (actions, links, etc.)\r\nconst DEFAULT_EMAIL_VARIABLES: TemplateVariable[] = [\r\n { name: 'company_logo_url', description: 'URL du logo de l\\'entreprise' },\r\n { name: 'appName', description: 'Nom de l\\'application' },\r\n { name: 'resetUrl', description: 'Lien de reinitialisation du mot de passe' },\r\n { name: 'confirmUrl', description: 'Lien de confirmation d\\'email' },\r\n { name: 'adminName', description: 'Nom de l\\'administrateur (action admin)' },\r\n { name: 'expiresIn', description: 'Delai d\\'expiration du lien' },\r\n { name: 'currentDate', description: 'Date actuelle' },\r\n { name: 'currentYear', description: 'Annee en cours' },\r\n];\r\n\r\ntype TabId = 'info' | 'translations';\r\n\r\ninterface FormData {\r\n name: string;\r\n description: string;\r\n category: string;\r\n}\r\n\r\ninterface TranslationFormData {\r\n languageCode: string;\r\n subject: string;\r\n htmlBody: string;\r\n textBody: string;\r\n}\r\n\r\nconst SUPPORTED_LANGUAGES = ['fr', 'en', 'de', 'it'];\r\n\r\n// Sample values for preview - realistic demo data\r\nconst PREVIEW_SAMPLE_VALUES: Record<string, string> = {\r\n // User Identity\r\n userName: 'Jean Dupont',\r\n firstName: 'Jean',\r\n lastName: 'Dupont',\r\n displayName: 'Jean Dupont',\r\n email: 'jean.dupont@example.com',\r\n user_email: 'jean.dupont@example.com',\r\n userEmail: 'jean.dupont@example.com',\r\n // Contact\r\n phoneNumber: '+41 21 123 45 67',\r\n phone: '+41 21 123 45 67',\r\n mobilePhone: '+41 79 123 45 67',\r\n mobile: '+41 79 123 45 67',\r\n // Location\r\n city: 'Lausanne',\r\n country: 'Suisse',\r\n streetAddress: 'Rue du Lac 15',\r\n address: 'Rue du Lac 15, 1003 Lausanne',\r\n postalCode: '1003',\r\n zipCode: '1003',\r\n // Organization\r\n company: 'SmartStack SA',\r\n companyName: 'SmartStack SA',\r\n company_name: 'SmartStack SA',\r\n organization: 'SmartStack SA',\r\n department: 'Informatique',\r\n jobTitle: 'Developpeur Senior',\r\n job_title: 'Developpeur Senior',\r\n position: 'Developpeur Senior',\r\n office: 'Lausanne HQ',\r\n employeeId: 'EMP-001234',\r\n employee_id: 'EMP-001234',\r\n managerName: 'Marie Martin',\r\n manager: 'Marie Martin',\r\n manager_name: 'Marie Martin',\r\n // Email & Application\r\n company_logo_url: 'https://example.com/logo.png',\r\n logo_url: 'https://example.com/logo.png',\r\n logoUrl: 'https://example.com/logo.png',\r\n appName: 'SmartStack',\r\n app_name: 'SmartStack',\r\n applicationName: 'SmartStack',\r\n siteName: 'SmartStack',\r\n site_name: 'SmartStack',\r\n // URLs & Links\r\n resetUrl: 'https://app.smartstack.ch/reset-password?token=abc123',\r\n reset_url: 'https://app.smartstack.ch/reset-password?token=abc123',\r\n resetLink: 'https://app.smartstack.ch/reset-password?token=abc123',\r\n reset_link: 'https://app.smartstack.ch/reset-password?token=abc123',\r\n confirmUrl: 'https://app.smartstack.ch/confirm-email?token=xyz789',\r\n confirm_url: 'https://app.smartstack.ch/confirm-email?token=xyz789',\r\n confirmationUrl: 'https://app.smartstack.ch/confirm-email?token=xyz789',\r\n confirmation_url: 'https://app.smartstack.ch/confirm-email?token=xyz789',\r\n confirmLink: 'https://app.smartstack.ch/confirm-email?token=xyz789',\r\n activationUrl: 'https://app.smartstack.ch/activate?token=xyz789',\r\n activation_url: 'https://app.smartstack.ch/activate?token=xyz789',\r\n activationLink: 'https://app.smartstack.ch/activate?token=xyz789',\r\n loginUrl: 'https://app.smartstack.ch/login',\r\n login_url: 'https://app.smartstack.ch/login',\r\n loginLink: 'https://app.smartstack.ch/login',\r\n dashboardUrl: 'https://app.smartstack.ch/dashboard',\r\n dashboard_url: 'https://app.smartstack.ch/dashboard',\r\n profileUrl: 'https://app.smartstack.ch/profile',\r\n profile_url: 'https://app.smartstack.ch/profile',\r\n unsubscribeUrl: 'https://app.smartstack.ch/unsubscribe?token=abc',\r\n unsubscribe_url: 'https://app.smartstack.ch/unsubscribe?token=abc',\r\n // Admin & System\r\n adminName: 'Admin Systeme',\r\n admin_name: 'Admin Systeme',\r\n adminEmail: 'admin@smartstack.ch',\r\n admin_email: 'admin@smartstack.ch',\r\n supportEmail: 'support@atlashub.ch',\r\n support_email: 'support@atlashub.ch',\r\n supportPhone: '+41 21 123 00 00',\r\n support_phone: '+41 21 123 00 00',\r\n // Time & Dates\r\n expiresIn: '24 heures',\r\n expires_in: '24 heures',\r\n expirationTime: '24 heures',\r\n expiration_time: '24 heures',\r\n expiryDate: '16 janvier 2026',\r\n expiry_date: '16 janvier 2026',\r\n currentDate: new Date().toLocaleDateString('fr-CH'),\r\n current_date: new Date().toLocaleDateString('fr-CH'),\r\n date: new Date().toLocaleDateString('fr-CH'),\r\n today: new Date().toLocaleDateString('fr-CH'),\r\n currentYear: new Date().getFullYear().toString(),\r\n current_year: new Date().getFullYear().toString(),\r\n year: new Date().getFullYear().toString(),\r\n currentTime: new Date().toLocaleTimeString('fr-CH'),\r\n current_time: new Date().toLocaleTimeString('fr-CH'),\r\n time: new Date().toLocaleTimeString('fr-CH'),\r\n // Password & Security\r\n temporaryPassword: 'TempPass123!',\r\n temporary_password: 'TempPass123!',\r\n tempPassword: 'TempPass123!',\r\n temp_password: 'TempPass123!',\r\n newPassword: 'NewPass456!',\r\n new_password: 'NewPass456!',\r\n password: '********',\r\n token: 'abc123xyz789',\r\n verificationCode: '123456',\r\n verification_code: '123456',\r\n code: '123456',\r\n otp: '123456',\r\n // Ticket & Support\r\n ticketId: 'TKT-2026-00123',\r\n ticket_id: 'TKT-2026-00123',\r\n ticketNumber: 'TKT-2026-00123',\r\n ticket_number: 'TKT-2026-00123',\r\n ticketSubject: 'Question technique',\r\n ticket_subject: 'Question technique',\r\n ticketStatus: 'En cours',\r\n ticket_status: 'En cours',\r\n // Order & Invoice\r\n orderId: 'ORD-2026-00456',\r\n order_id: 'ORD-2026-00456',\r\n orderNumber: 'ORD-2026-00456',\r\n order_number: 'ORD-2026-00456',\r\n invoiceId: 'INV-2026-00789',\r\n invoice_id: 'INV-2026-00789',\r\n invoiceNumber: 'INV-2026-00789',\r\n invoice_number: 'INV-2026-00789',\r\n amount: 'CHF 150.00',\r\n total: 'CHF 150.00',\r\n price: 'CHF 150.00',\r\n // Misc\r\n reason: 'Mise a jour de securite',\r\n message: 'Votre demande a ete traitee avec succes.',\r\n description: 'Description de l\\'element',\r\n title: 'Titre de l\\'element',\r\n name: 'Nom de l\\'element',\r\n value: 'Valeur exemple',\r\n count: '5',\r\n number: '42',\r\n id: '12345',\r\n};\r\n\r\n// Generate a fallback value for unknown variables based on their name\r\nfunction generateFallbackValue(varName: string): string {\r\n const lowerName = varName.toLowerCase();\r\n\r\n // URL patterns\r\n if (lowerName.includes('url') || lowerName.includes('link')) {\r\n return 'https://app.smartstack.ch/example';\r\n }\r\n // Email patterns\r\n if (lowerName.includes('email') || lowerName.includes('mail')) {\r\n return 'exemple@smartstack.ch';\r\n }\r\n // Phone patterns\r\n if (lowerName.includes('phone') || lowerName.includes('tel') || lowerName.includes('mobile')) {\r\n return '+41 21 123 45 67';\r\n }\r\n // Date patterns\r\n if (lowerName.includes('date') || lowerName.includes('time') || lowerName.includes('at')) {\r\n return new Date().toLocaleDateString('fr-CH');\r\n }\r\n // Year patterns\r\n if (lowerName.includes('year')) {\r\n return new Date().getFullYear().toString();\r\n }\r\n // Name patterns\r\n if (lowerName.includes('name') || lowerName.includes('nom')) {\r\n return 'Jean Dupont';\r\n }\r\n // Password patterns\r\n if (lowerName.includes('password') || lowerName.includes('pwd') || lowerName.includes('pass')) {\r\n return 'MotDePasse123!';\r\n }\r\n // Code/Token patterns\r\n if (lowerName.includes('code') || lowerName.includes('token') || lowerName.includes('otp')) {\r\n return '123456';\r\n }\r\n // ID patterns\r\n if (lowerName.includes('id') || lowerName.includes('number') || lowerName.includes('num')) {\r\n return '12345';\r\n }\r\n // Amount/Price patterns\r\n if (lowerName.includes('amount') || lowerName.includes('price') || lowerName.includes('total') || lowerName.includes('cost')) {\r\n return 'CHF 100.00';\r\n }\r\n // Count patterns\r\n if (lowerName.includes('count') || lowerName.includes('qty') || lowerName.includes('quantity')) {\r\n return '5';\r\n }\r\n\r\n // Default: Convert camelCase/snake_case to readable format\r\n const readable = varName\r\n .replace(/_/g, ' ')\r\n .replace(/([A-Z])/g, ' $1')\r\n .trim()\r\n .toLowerCase();\r\n return `[${readable}]`;\r\n}\r\n\r\n// Replace Liquid variables with sample values for preview\r\nfunction replaceVariablesForPreview(html: string): string {\r\n if (!html) return html;\r\n\r\n let result = html;\r\n\r\n // Replace {{ variable }} syntax (with optional spaces)\r\n result = result.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (_match, varName) => {\r\n return PREVIEW_SAMPLE_VALUES[varName] || generateFallbackValue(varName);\r\n });\r\n\r\n // Handle {% if condition %} blocks - show the content (assume true for preview)\r\n result = result.replace(/\\{%\\s*if\\s+\\w+\\s*%\\}([\\s\\S]*?)\\{%\\s*endif\\s*%\\}/gi, '$1');\r\n\r\n // Handle {% else %} blocks - remove them (since we assume if is true)\r\n result = result.replace(/\\{%\\s*else\\s*%\\}[\\s\\S]*?(?=\\{%|\\$)/gi, '');\r\n\r\n // Clean up any remaining Liquid tags\r\n result = result.replace(/\\{%[^%]*%\\}/g, '');\r\n\r\n return result;\r\n}\r\n\r\nexport function EmailTemplateEditPage(): ReactElement {\r\n const { t } = useTranslation('communications');\r\n const { id: templateId } = useParams<{ id: string }>();\r\n const navigate = useNavigate();\r\n\r\n const [template, setTemplate] = useState<EmailTemplateDetailDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [saving, setSaving] = useState(false);\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n const activeTab = (searchParams.get('tab') as TabId) || 'info';\r\n const setActiveTab = (tab: TabId) => setSearchParams({ tab });\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n const [formData, setFormData] = useState<FormData>({\r\n name: '',\r\n description: '',\r\n category: ''\r\n });\r\n\r\n // Translation editing\r\n const [editingTranslation, setEditingTranslation] = useState<TranslationFormData | null>(null);\r\n const [isNewTranslation, setIsNewTranslation] = useState(false);\r\n const [savingTranslation, setSavingTranslation] = useState(false);\r\n const [showPreview, setShowPreview] = useState(true);\r\n const [fullscreenPreview, setFullscreenPreview] = useState(false);\r\n\r\n // Parse variables from JSON or use defaults\r\n const templateVariables = useMemo((): { user: TemplateVariable[]; email: TemplateVariable[]; custom: TemplateVariable[] } => {\r\n let customVariables: TemplateVariable[] = [];\r\n\r\n if (template?.variablesJson) {\r\n try {\r\n const parsed = JSON.parse(template.variablesJson);\r\n if (Array.isArray(parsed)) {\r\n customVariables = parsed.filter(v => v?.name);\r\n } else if (typeof parsed === 'object') {\r\n customVariables = Object.entries(parsed)\r\n .filter(([name]) => name && name !== 'undefined')\r\n .map(([name, value]) => ({\r\n name,\r\n description: typeof value === 'object' && value !== null ? (value as Record<string, unknown>).description as string : undefined,\r\n type: typeof value === 'object' && value !== null ? (value as Record<string, unknown>).type as string : undefined,\r\n required: typeof value === 'object' && value !== null ? (value as Record<string, unknown>).required as boolean : false\r\n }));\r\n }\r\n } catch {\r\n // Invalid JSON, ignore\r\n }\r\n }\r\n\r\n return {\r\n user: DEFAULT_USER_VARIABLES,\r\n email: DEFAULT_EMAIL_VARIABLES,\r\n custom: customVariables\r\n };\r\n }, [template?.variablesJson]);\r\n\r\n const loadTemplate = useCallback(async () => {\r\n if (!templateId) return;\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const data = await communicationsApi.emailTemplates.getById(templateId);\r\n setTemplate(data);\r\n setFormData({\r\n name: data.name,\r\n description: data.description || '',\r\n category: data.category\r\n });\r\n } catch (err) {\r\n console.error('Failed to load template:', err);\r\n setError(t('emailTemplates.edit.errors.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [templateId, t]);\r\n\r\n useEffect(() => {\r\n loadTemplate();\r\n }, [loadTemplate]);\r\n\r\n const handleSave = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!templateId || !template) return;\r\n\r\n try {\r\n setSaving(true);\r\n setError(null);\r\n await communicationsApi.emailTemplates.update(templateId, {\r\n name: formData.name,\r\n description: formData.description || undefined,\r\n category: formData.category,\r\n isActive: template.isActive,\r\n });\r\n setSuccess(t('emailTemplates.edit.success.saved'));\r\n loadTemplate();\r\n } catch (err) {\r\n console.error('Failed to save template:', err);\r\n setError(t('emailTemplates.edit.errors.saveFailed'));\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleAddTranslation = () => {\r\n const existingLangs = template?.translations.map(tr => tr.languageCode) || [];\r\n const availableLangs = SUPPORTED_LANGUAGES.filter(lang => !existingLangs.includes(lang));\r\n\r\n if (availableLangs.length === 0) {\r\n setError(t('emailTemplates.edit.errors.allLanguagesExist'));\r\n return;\r\n }\r\n\r\n setEditingTranslation({\r\n languageCode: availableLangs[0],\r\n subject: '',\r\n htmlBody: '',\r\n textBody: ''\r\n });\r\n setIsNewTranslation(true);\r\n };\r\n\r\n const handleEditTranslation = (translation: EmailTemplateTranslationDto) => {\r\n setEditingTranslation({\r\n languageCode: translation.languageCode,\r\n subject: translation.subject,\r\n htmlBody: translation.htmlBody,\r\n textBody: translation.textBody || ''\r\n });\r\n setIsNewTranslation(false);\r\n };\r\n\r\n const handleSaveTranslation = async () => {\r\n if (!templateId || !editingTranslation) return;\r\n\r\n try {\r\n setSavingTranslation(true);\r\n setError(null);\r\n\r\n if (isNewTranslation) {\r\n await communicationsApi.emailTemplates.createTranslation(templateId, {\r\n languageCode: editingTranslation.languageCode,\r\n subject: editingTranslation.subject,\r\n htmlBody: editingTranslation.htmlBody,\r\n textBody: editingTranslation.textBody || undefined\r\n });\r\n setSuccess(t('emailTemplates.edit.success.translationAdded'));\r\n } else {\r\n await communicationsApi.emailTemplates.updateTranslation(\r\n templateId,\r\n editingTranslation.languageCode,\r\n {\r\n subject: editingTranslation.subject,\r\n htmlBody: editingTranslation.htmlBody,\r\n textBody: editingTranslation.textBody || undefined\r\n }\r\n );\r\n setSuccess(t('emailTemplates.edit.success.translationUpdated'));\r\n }\r\n\r\n setEditingTranslation(null);\r\n loadTemplate();\r\n } catch (err) {\r\n console.error('Failed to save translation:', err);\r\n setError(t('emailTemplates.edit.errors.translationSaveFailed'));\r\n } finally {\r\n setSavingTranslation(false);\r\n }\r\n };\r\n\r\n const handleDeleteTranslation = async (languageCode: string) => {\r\n if (!templateId) return;\r\n if (!languageCode || !confirm(t('emailTemplates.edit.confirmDeleteTranslation'))) return;\r\n\r\n try {\r\n setSavingTranslation(true);\r\n setError(null);\r\n // TODO: API endpoint for deleting translations doesn't exist yet\r\n // await communicationsApi.emailTemplates.deleteTranslation(templateId, languageCode);\r\n setError('Delete translation API not implemented yet');\r\n // setSuccess(t('emailTemplates.edit.success.translationDeleted'));\r\n // loadTemplate();\r\n } catch (err) {\r\n console.error('Failed to delete translation:', err);\r\n setError(t('emailTemplates.edit.errors.translationDeleteFailed'));\r\n } finally {\r\n setSavingTranslation(false);\r\n }\r\n };\r\n\r\n const tabs: { id: TabId; label: string; icon: React.ReactNode }[] = [\r\n { id: 'info', label: t('emailTemplates.edit.tabs.info'), icon: <Settings className=\"w-4 h-4\" /> },\r\n { id: 'translations', label: t('emailTemplates.edit.tabs.translations'), icon: <Languages className=\"w-4 h-4\" /> }\r\n ];\r\n\r\n const getLanguageLabel = (code: string) => {\r\n return t(`languages.${code}`, { defaultValue: code.toUpperCase() });\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (!template) {\r\n return (\r\n <div className=\"text-center py-12\">\r\n <p className=\"text-[var(--text-secondary)]\">{t('emailTemplates.detail.notFound')}</p>\r\n <button\r\n onClick={() => navigate('/administration/workflows/email-templates')}\r\n className=\"mt-4 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white\"\r\n >\r\n {t('emailTemplates.backToList')}\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n const existingLangs = template.translations.map(tr => tr.languageCode);\r\n const availableLangs = SUPPORTED_LANGUAGES.filter(lang => !existingLangs.includes(lang));\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('communications.title', 'Communications'), href: '/administration/communications' },\r\n { label: t('communications.emailTemplates', 'Email Templates'), href: '/administration/workflows/email-templates' },\r\n { label: template?.name || '' }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center gap-4\">\r\n <button\r\n onClick={() => navigate(`/administration/workflows/email-templates/${templateId}`)}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3\">\r\n <h1 className=\"text-xl sm:text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('emailTemplates.edit.title')}\r\n </h1>\r\n {template.isSystem && (\r\n <span className=\"flex items-center gap-1 px-2 py-1 rounded-[var(--radius-badge)] text-xs bg-[var(--bg-tertiary)] text-[var(--text-secondary)] border border-[var(--border-color)]\">\r\n {t('emailTemplates.edit.systemTemplate')}\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1 font-mono\">{template.code}</p>\r\n </div>\r\n </div>\r\n\r\n {/* Alerts */}\r\n {error && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)] text-[var(--error-text)] flex items-center gap-2\">\r\n <AlertTriangle className=\"w-5 h-5 flex-shrink-0\" />\r\n {error}\r\n </div>\r\n )}\r\n {success && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--success-bg)] border border-[var(--success-border)] text-[var(--success-text)] flex items-center gap-2\">\r\n <CheckCircle className=\"w-5 h-5 flex-shrink-0\" />\r\n {success}\r\n </div>\r\n )}\r\n\r\n\r\n {/* Tabs */}\r\n <div className=\"flex gap-1 p-1 bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n {tabs.map(tab => (\r\n <button\r\n key={tab.id}\r\n onClick={() => setActiveTab(tab.id)}\r\n className={`flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium transition-colors ${\r\n activeTab === tab.id\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n {tab.icon}\r\n <span className=\"hidden sm:inline\">{tab.label}</span>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div className=\"bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4 sm:p-6\">\r\n {/* Info Tab */}\r\n {activeTab === 'info' && (\r\n <form onSubmit={handleSave} className=\"space-y-6\">\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.form.code')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)] font-mono text-sm\">\r\n {template.code}\r\n </div>\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {t('emailTemplates.edit.codeReadOnly')}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.form.name')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={formData.name}\r\n onChange={(e) => setFormData(prev => ({ ...prev, name: e.target.value }))}\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.form.description')}\r\n </label>\r\n <textarea\r\n value={formData.description}\r\n onChange={(e) => setFormData(prev => ({ ...prev, description: e.target.value }))}\r\n rows={3}\r\n placeholder={t('emailTemplates.form.descriptionPlaceholder')}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:border-[var(--color-accent-500)] focus:ring-1 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.form.category')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <select\r\n required\r\n value={formData.category}\r\n onChange={(e) => setFormData(prev => ({ ...prev, category: e.target.value }))}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"transactional\">{t('emailTemplates.categories.transactional')}</option>\r\n <option value=\"notification\">{t('emailTemplates.categories.notification')}</option>\r\n <option value=\"marketing\">{t('emailTemplates.categories.marketing')}</option>\r\n <option value=\"system\">{t('emailTemplates.categories.system')}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Save button */}\r\n <div className=\"flex justify-end gap-3 pt-4 border-t border-[var(--border-color)]\">\r\n <button\r\n type=\"button\"\r\n onClick={() => navigate(`/administration/workflows/email-templates/${templateId}`)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={saving}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {saving ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </form>\r\n )}\r\n\r\n {/* Translations Tab */}\r\n {activeTab === 'translations' && !editingTranslation && (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('emailTemplates.edit.tabs.translations')} ({template.translations.length}/4)\r\n </h3>\r\n {availableLangs.length > 0 && (\r\n <button\r\n onClick={handleAddTranslation}\r\n className=\"flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('emailTemplates.edit.addTranslation')}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {template.translations.length === 0 ? (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n <Languages className=\"w-12 h-12 mx-auto mb-4 opacity-50\" />\r\n <p>{t('emailTemplates.detail.noTranslations')}</p>\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3\">\r\n {template.translations.map((translation) => (\r\n <div\r\n key={translation.id}\r\n className=\"p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)] hover:border-[var(--color-accent-300)] transition-colors\"\r\n >\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-10 h-10 rounded-full bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] flex items-center justify-center\">\r\n <span className=\"text-sm font-bold text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)] uppercase\">\r\n {translation.languageCode}\r\n </span>\r\n </div>\r\n <div>\r\n <div className=\"font-medium text-[var(--text-primary)]\">\r\n {getLanguageLabel(translation.languageCode)}\r\n </div>\r\n <div className=\"text-sm text-[var(--text-secondary)] truncate max-w-md\">\r\n {translation.subject}\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => handleEditTranslation(translation)}\r\n className=\"flex items-center gap-1 px-2 py-1 rounded-[var(--radius-button)] text-sm text-[var(--color-accent-600)] hover:bg-[var(--color-accent-50)] dark:hover:bg-[var(--color-accent-900)] transition-colors\"\r\n >\r\n <Settings className=\"w-4 h-4\" />\r\n {t('emailTemplates.edit.editTranslation')}\r\n </button>\r\n <button\r\n onClick={() => handleDeleteTranslation(translation.languageCode)}\r\n disabled={savingTranslation}\r\n className=\"flex items-center gap-1 px-2 py-1 rounded-[var(--radius-button)] text-sm text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-colors\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Translation Editor */}\r\n {activeTab === 'translations' && editingTranslation && (\r\n <div className=\"space-y-4\">\r\n {/* Editor Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {isNewTranslation\r\n ? t('emailTemplates.edit.addTranslation')\r\n : t('emailTemplates.edit.editTranslation')}\r\n </h3>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => setShowPreview(!showPreview)}\r\n className={`flex items-center gap-1 px-2 py-1 rounded text-sm transition-colors ${\r\n showPreview\r\n ? 'bg-[var(--color-accent-100)] text-[var(--color-accent-700)] dark:bg-[var(--color-accent-900)] dark:text-[var(--color-accent-300)]'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <Columns className=\"w-4 h-4\" />\r\n {t('emailTemplates.edit.showPreview')}\r\n </button>\r\n <button\r\n onClick={() => setEditingTranslation(null)}\r\n className=\"text-sm text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Main Content Grid */}\r\n <div className={`grid gap-6 ${showPreview ? 'grid-cols-1 xl:grid-cols-2' : 'grid-cols-1'}`}>\r\n {/* Editor Column */}\r\n <div className=\"space-y-4\">\r\n {/* Language Selection */}\r\n {isNewTranslation && (\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.edit.language')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <select\r\n value={editingTranslation.languageCode}\r\n onChange={(e) => setEditingTranslation(prev => prev ? { ...prev, languageCode: e.target.value } : null)}\r\n className=\"input w-full max-w-xs\"\r\n >\r\n {availableLangs.map(lang => (\r\n <option key={lang} value={lang}>{getLanguageLabel(lang)}</option>\r\n ))}\r\n </select>\r\n </div>\r\n )}\r\n\r\n {/* Subject */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.edit.subject')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={editingTranslation.subject}\r\n onChange={(e) => setEditingTranslation(prev => prev ? { ...prev, subject: e.target.value } : null)}\r\n placeholder={t('emailTemplates.edit.subjectPlaceholder')}\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n\r\n {/* HTML Body - WYSIWYG Editor */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.edit.htmlBody')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <EmailEditor\r\n content={editingTranslation.htmlBody}\r\n onChange={(html) => setEditingTranslation(prev => prev ? { ...prev, htmlBody: html } : null)}\r\n placeholder={t('emailTemplates.edit.htmlBodyPlaceholder')}\r\n />\r\n </div>\r\n\r\n {/* Text Body */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('emailTemplates.edit.textBody')}\r\n </label>\r\n <textarea\r\n value={editingTranslation.textBody}\r\n onChange={(e) => setEditingTranslation(prev => prev ? { ...prev, textBody: e.target.value } : null)}\r\n rows={4}\r\n placeholder={t('emailTemplates.edit.textBodyPlaceholder')}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:border-[var(--color-accent-500)] focus:ring-1 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {t('emailTemplates.edit.textBodyHelp')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {/* Preview Column */}\r\n {showPreview && (\r\n <div className=\"space-y-4\">\r\n {/* Variables Panel */}\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n <div className=\"px-4 py-2 bg-[var(--bg-tertiary)] border-b border-[var(--border-color)] flex items-center gap-2\">\r\n <Code className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('emailTemplates.edit.availableVariables')}\r\n </span>\r\n </div>\r\n <div className=\"p-3 space-y-3 max-h-[300px] overflow-auto\">\r\n {/* Custom Variables (if any) */}\r\n {templateVariables.custom.length > 0 && (\r\n <VariableSectionEdit\r\n title={t('emailTemplates.detail.customVariables')}\r\n variables={templateVariables.custom}\r\n onInsert={(varName) => {\r\n const varSyntax = `{{ ${varName} }}`;\r\n setEditingTranslation(prev => prev ? {\r\n ...prev,\r\n htmlBody: prev.htmlBody + varSyntax\r\n } : null);\r\n }}\r\n defaultExpanded={true}\r\n />\r\n )}\r\n\r\n {/* User Variables */}\r\n <VariableSectionEdit\r\n title={t('emailTemplates.detail.userVariables')}\r\n variables={templateVariables.user}\r\n onInsert={(varName) => {\r\n const varSyntax = `{{ ${varName} }}`;\r\n setEditingTranslation(prev => prev ? {\r\n ...prev,\r\n htmlBody: prev.htmlBody + varSyntax\r\n } : null);\r\n }}\r\n defaultExpanded={false}\r\n />\r\n\r\n {/* Email Variables */}\r\n <VariableSectionEdit\r\n title={t('emailTemplates.detail.emailVariables')}\r\n variables={templateVariables.email}\r\n onInsert={(varName) => {\r\n const varSyntax = `{{ ${varName} }}`;\r\n setEditingTranslation(prev => prev ? {\r\n ...prev,\r\n htmlBody: prev.htmlBody + varSyntax\r\n } : null);\r\n }}\r\n defaultExpanded={false}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Live Preview */}\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden flex flex-col\">\r\n <div className=\"px-4 py-2 bg-[var(--bg-tertiary)] border-b border-[var(--border-color)] flex items-center justify-between\">\r\n <div className=\"flex items-center gap-2\">\r\n <Eye className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('emailTemplates.edit.livePreview')}\r\n </span>\r\n </div>\r\n <button\r\n onClick={() => setFullscreenPreview(true)}\r\n className=\"p-1 rounded hover:bg-[var(--bg-hover)] transition-colors\"\r\n title={t('emailTemplates.edit.fullscreen')}\r\n >\r\n <Maximize2 className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n </button>\r\n </div>\r\n\r\n {/* Subject Preview */}\r\n <div className=\"px-4 py-2 border-b border-[var(--border-color)] bg-[var(--bg-tertiary)]/50\">\r\n <div className=\"text-xs text-[var(--text-tertiary)] mb-1\">{t('emailTemplates.edit.subject')}</div>\r\n <div className=\"text-sm font-medium text-[var(--text-primary)]\">\r\n {editingTranslation.subject ? replaceVariablesForPreview(editingTranslation.subject) : <span className=\"text-[var(--text-tertiary)] italic\">{t('emailTemplates.edit.subjectPlaceholder')}</span>}\r\n </div>\r\n </div>\r\n\r\n {/* HTML Preview */}\r\n <div className=\"flex-1 bg-white min-h-[300px]\">\r\n {editingTranslation.htmlBody ? (\r\n <iframe\r\n srcDoc={`<!DOCTYPE html>\r\n<html>\r\n<head>\r\n <meta charset=\"UTF-8\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n <style>\r\n body {\r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\r\n font-size: 14px;\r\n line-height: 1.6;\r\n color: #333;\r\n margin: 0;\r\n padding: 16px;\r\n background: #fff;\r\n }\r\n h1 { font-size: 24px; margin: 0 0 16px; color: #111; }\r\n h2 { font-size: 20px; margin: 0 0 12px; color: #111; }\r\n h3 { font-size: 16px; margin: 0 0 8px; color: #111; }\r\n p { margin: 0 0 12px; }\r\n a { color: #2563eb; text-decoration: underline; }\r\n strong { font-weight: 600; }\r\n img { max-width: 100%; height: auto; }\r\n ul, ol { margin: 0 0 12px; padding-left: 24px; }\r\n li { margin-bottom: 4px; }\r\n blockquote {\r\n margin: 12px 0;\r\n padding: 8px 16px;\r\n border-left: 4px solid #e5e7eb;\r\n background: #f9fafb;\r\n color: #6b7280;\r\n }\r\n hr { border: none; border-top: 1px solid #e5e7eb; margin: 16px 0; }\r\n code {\r\n background: #f3f4f6;\r\n padding: 2px 6px;\r\n border-radius: 4px;\r\n font-family: monospace;\r\n font-size: 13px;\r\n }\r\n .button, a.button {\r\n display: inline-block;\r\n padding: 12px 24px;\r\n background: #2563eb;\r\n color: #fff !important;\r\n text-decoration: none;\r\n border-radius: 6px;\r\n font-weight: 500;\r\n }\r\n </style>\r\n</head>\r\n<body>${replaceVariablesForPreview(editingTranslation.htmlBody)}</body>\r\n</html>`}\r\n className=\"w-full h-full min-h-[300px] border-0\"\r\n title=\"Email Preview\"\r\n sandbox=\"allow-same-origin\"\r\n />\r\n ) : (\r\n <div className=\"flex items-center justify-center h-full min-h-[300px] text-[var(--text-tertiary)]\">\r\n <div className=\"text-center\">\r\n <Eye className=\"w-8 h-8 mx-auto mb-2 opacity-50\" />\r\n <p className=\"text-sm\">{t('emailTemplates.edit.noContentYet')}</p>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Save Actions */}\r\n <div className=\"flex justify-end gap-3 pt-4 border-t border-[var(--border-color)]\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setEditingTranslation(null)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n onClick={handleSaveTranslation}\r\n disabled={savingTranslation || !editingTranslation.subject || !editingTranslation.htmlBody}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {savingTranslation ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Fullscreen Preview Modal */}\r\n {fullscreenPreview && editingTranslation && (\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-[var(--radius-card)] border border-[var(--border-color)] max-w-4xl w-full max-h-[90vh] overflow-hidden shadow-xl flex flex-col\">\r\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-[var(--border-color)]\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('emailTemplates.edit.preview')}\r\n </h3>\r\n <button\r\n onClick={() => setFullscreenPreview(false)}\r\n className=\"p-2 rounded hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <Minimize2 className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n <div className=\"px-4 py-2 border-b border-[var(--border-color)] bg-[var(--bg-tertiary)]\">\r\n <div className=\"text-xs text-[var(--text-tertiary)] mb-1\">{t('emailTemplates.edit.subject')}</div>\r\n <div className=\"font-medium text-[var(--text-primary)]\">{replaceVariablesForPreview(editingTranslation.subject)}</div>\r\n </div>\r\n <div className=\"flex-1 overflow-auto bg-white\">\r\n <iframe\r\n srcDoc={`<!DOCTYPE html>\r\n<html>\r\n<head>\r\n <meta charset=\"UTF-8\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n <style>\r\n body {\r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\r\n font-size: 14px;\r\n line-height: 1.6;\r\n color: #333;\r\n margin: 0;\r\n padding: 24px;\r\n background: #fff;\r\n }\r\n h1 { font-size: 24px; margin: 0 0 16px; color: #111; }\r\n h2 { font-size: 20px; margin: 0 0 12px; color: #111; }\r\n h3 { font-size: 16px; margin: 0 0 8px; color: #111; }\r\n p { margin: 0 0 12px; }\r\n a { color: #2563eb; text-decoration: underline; }\r\n strong { font-weight: 600; }\r\n img { max-width: 100%; height: auto; }\r\n ul, ol { margin: 0 0 12px; padding-left: 24px; }\r\n li { margin-bottom: 4px; }\r\n blockquote {\r\n margin: 12px 0;\r\n padding: 8px 16px;\r\n border-left: 4px solid #e5e7eb;\r\n background: #f9fafb;\r\n color: #6b7280;\r\n }\r\n hr { border: none; border-top: 1px solid #e5e7eb; margin: 16px 0; }\r\n code {\r\n background: #f3f4f6;\r\n padding: 2px 6px;\r\n border-radius: 4px;\r\n font-family: monospace;\r\n font-size: 13px;\r\n }\r\n .button, a.button {\r\n display: inline-block;\r\n padding: 12px 24px;\r\n background: #2563eb;\r\n color: #fff !important;\r\n text-decoration: none;\r\n border-radius: 6px;\r\n font-weight: 500;\r\n }\r\n </style>\r\n</head>\r\n<body>${replaceVariablesForPreview(editingTranslation.htmlBody)}</body>\r\n</html>`}\r\n className=\"w-full h-full min-h-[500px] border-0\"\r\n title=\"Email Preview Fullscreen\"\r\n sandbox=\"allow-same-origin\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// Variable Section Component (collapsible) for Edit page\r\ninterface VariableSectionEditProps {\r\n readonly title: string;\r\n readonly variables: TemplateVariable[];\r\n readonly onInsert: (varName: string) => void;\r\n readonly defaultExpanded?: boolean;\r\n}\r\n\r\nfunction VariableSectionEdit({ title, variables, onInsert, defaultExpanded = false }: VariableSectionEditProps) {\r\n const [expanded, setExpanded] = useState(defaultExpanded);\r\n\r\n return (\r\n <div className=\"border border-[var(--border-color)] rounded-lg overflow-hidden\">\r\n <button\r\n onClick={() => setExpanded(!expanded)}\r\n className=\"w-full flex items-center justify-between px-2 py-1.5 bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] transition-colors text-left\"\r\n >\r\n <span className=\"text-xs font-medium text-[var(--text-secondary)]\">{title}</span>\r\n <div className=\"flex items-center gap-1\">\r\n <span className=\"text-xs text-[var(--text-tertiary)]\">{variables.length}</span>\r\n {expanded ? <ChevronUp className=\"w-3 h-3\" /> : <ChevronDown className=\"w-3 h-3\" />}\r\n </div>\r\n </button>\r\n {expanded && (\r\n <div className=\"p-2 flex flex-wrap gap-1.5\">\r\n {variables.map((variable) => (\r\n <VariableBadgeInsert key={variable.name} variable={variable} onInsert={onInsert} />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// Variable Badge Component with insert action\r\nfunction VariableBadgeInsert({ variable, onInsert }: { variable: TemplateVariable; onInsert: (varName: string) => void }) {\r\n const [copied, setCopied] = useState(false);\r\n const variableSyntax = `{{ ${variable.name} }}`;\r\n\r\n const handleClick = () => {\r\n onInsert(variable.name);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 1000);\r\n };\r\n\r\n return (\r\n <button\r\n onClick={handleClick}\r\n className=\"group inline-flex items-center gap-1 px-1.5 py-0.5 rounded bg-[var(--bg-tertiary)] hover:bg-[var(--color-accent-100)] dark:hover:bg-[var(--color-accent-900)] transition-colors text-xs\"\r\n title={variable.description || `Inserer ${variableSyntax}`}\r\n >\r\n <code className=\"font-mono text-[var(--color-accent-600)]\">{variable.name}</code>\r\n {copied && <Check className=\"w-2.5 h-2.5 text-[var(--success-text)]\" />}\r\n </button>\r\n );\r\n}\r\n\r\n\r\nexport default EmailTemplateEditPage;\r\n","import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport { MessageSquare } from 'lucide-react';\r\nimport { UnderDevelopment } from '@/components/ui/UnderDevelopment';\r\nimport { PageHeader } from '@/components/ui/PageHeader';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\nexport function SmsTemplatesListPage(): ReactElement {\r\n const { t } = useTranslation('communications');\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('communications.title', 'Communications'), href: '/administration/communications' },\r\n { label: t('communications.smsTemplates', 'SMS Templates') }\r\n ]}\r\n />\r\n\r\n <PageHeader\r\n title={t('smsTemplates.title', 'SMS Templates')}\r\n subtitle={t('smsTemplates.subtitle', 'Manage SMS notification templates')}\r\n icon={<MessageSquare className=\"w-6 h-6\" />}\r\n />\r\n\r\n <div className=\"card\">\r\n <UnderDevelopment\r\n title={t('smsTemplates.underDevelopment.title', 'SMS Templates')}\r\n description={t('smsTemplates.underDevelopment.description', 'SMS notification templates will be available soon. This feature will allow you to create and manage SMS templates for automated notifications.')}\r\n icon={<MessageSquare className=\"w-10 h-10 text-amber-600 dark:text-amber-400\" />}\r\n showBackButton={true}\r\n backUrl=\"/administration/workflows/email-templates\"\r\n />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default SmsTemplatesListPage;\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Plus, Search, Edit2, Trash2, Play, Pause, Workflow, Zap, Loader2, Filter, Eye } from 'lucide-react';\r\nimport { communicationsApi, type WorkflowListDto } from '@/services/api/communicationsApi';\r\nimport { ViewToggle, StatusBadge, Pagination, type ViewMode } from '@/components/ui/DataView';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\nexport function WorkflowsListPage(): ReactElement {\r\n const { t } = useTranslation('communications');\r\n const navigate = useNavigate();\r\n const { currentTenant, isGlobalView } = useTenant();\r\n const [workflows, setWorkflows] = useState<WorkflowListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [search, setSearch] = useState('');\r\n const [viewMode, setViewMode] = useState<ViewMode>('table');\r\n const [page, setPage] = useState(1);\r\n const pageSize = 20;\r\n\r\n const loadWorkflows = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const data = await communicationsApi.workflows.getAll({ search: search || undefined });\r\n setWorkflows(Array.isArray(data) ? data : []);\r\n } catch (err) {\r\n console.error('Failed to load workflows:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n // TENANT ISOLATION: Re-fetch when tenant changes\r\n }, [search, currentTenant?.id, isGlobalView]);\r\n\r\n useEffect(() => {\r\n loadWorkflows();\r\n }, [loadWorkflows]);\r\n\r\n const handleSearch = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setPage(1);\r\n loadWorkflows();\r\n };\r\n\r\n const handleToggleActive = async (workflow: WorkflowListDto, e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n try {\r\n if (workflow.isActive) {\r\n await communicationsApi.workflows.deactivate(workflow.id);\r\n } else {\r\n await communicationsApi.workflows.activate(workflow.id);\r\n }\r\n loadWorkflows();\r\n } catch (err) {\r\n console.error('Failed to toggle workflow:', err);\r\n }\r\n };\r\n\r\n const handleDelete = async (workflow: WorkflowListDto, e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n if (workflow.isSystem) {\r\n alert(t('workflows.cannotDeleteSystem'));\r\n return;\r\n }\r\n if (!confirm(t('workflows.confirmDelete', { name: workflow.name }))) return;\r\n\r\n try {\r\n await communicationsApi.workflows.delete(workflow.id);\r\n loadWorkflows();\r\n } catch (err) {\r\n console.error('Failed to delete workflow:', err);\r\n }\r\n };\r\n\r\n // Filter for current page\r\n const startIndex = (page - 1) * pageSize;\r\n const paginatedWorkflows = workflows.slice(startIndex, startIndex + pageSize);\r\n const totalPages = Math.ceil(workflows.length / pageSize);\r\n\r\n // Grouper par statut pour le Kanban\r\n const activeWorkflows = workflows.filter(w => w.isActive);\r\n const inactiveWorkflows = workflows.filter(w => !w.isActive);\r\n\r\n const renderTableView = () => (\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-[var(--bg-secondary)]\">\r\n <th className=\"w-12 px-4 py-3\">\r\n <input type=\"checkbox\" className=\"w-4 h-4 rounded border-[var(--border-color)]\" />\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('workflows.columns.name')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden md:table-cell\">{t('workflows.columns.trigger')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">{t('workflows.columns.steps')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">{t('workflows.columns.priority')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('workflows.columns.status')}</th>\r\n <th className=\"w-32 px-4 py-3\"></th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {loading && (\r\n <tr>\r\n <td colSpan={7} className=\"px-6 py-16 text-center\">\r\n <div className=\"flex flex-col items-center gap-3\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-primary-500\" />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{t('common.loading', { defaultValue: 'Chargement...' })}</span>\r\n </div>\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && paginatedWorkflows.length === 0 && (\r\n <tr>\r\n <td colSpan={7} className=\"px-6 py-16 text-center\">\r\n <div className=\"flex flex-col items-center gap-3\">\r\n <div className=\"w-16 h-16 rounded-full bg-[var(--bg-secondary)] flex items-center justify-center\">\r\n <Workflow className=\"w-8 h-8 text-[var(--text-tertiary)]\" />\r\n </div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('workflows.noResults')}</span>\r\n </div>\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && paginatedWorkflows.length > 0 && (\r\n paginatedWorkflows.map(workflow => (\r\n <tr\r\n key={workflow.id}\r\n className=\"group hover:bg-[var(--bg-hover)] transition-all cursor-pointer\"\r\n onClick={() => navigate(`/administration/workflows/${workflow.id}`)}\r\n >\r\n <td className=\"px-4 py-3\" onClick={e => e.stopPropagation()}>\r\n <input type=\"checkbox\" className=\"w-4 h-4 rounded border-[var(--border-color)]\" />\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-10 h-10 rounded-lg bg-gradient-to-br from-emerald-500 to-teal-500 flex items-center justify-center shadow-md\">\r\n <Workflow className=\"w-5 h-5 text-white\" />\r\n </div>\r\n <div className=\"min-w-0\">\r\n <p className=\"font-medium text-[var(--text-primary)] group-hover:text-primary-600 transition-colors\">\r\n {workflow.name}\r\n </p>\r\n {workflow.description && (\r\n <p className=\"text-sm text-[var(--text-tertiary)] truncate max-w-xs\">{workflow.description}</p>\r\n )}\r\n <div className=\"flex items-center gap-1.5 mt-1\">\r\n {workflow.isSystem && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-[var(--radius-badge)] text-xs font-medium bg-[var(--info-bg)] text-[var(--info-text)] border border-[var(--info-border)]\">\r\n System\r\n </span>\r\n )}\r\n {isGlobalView && workflow.tenantName && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-[var(--radius-badge)] text-xs font-medium bg-[var(--bg-secondary)] text-[var(--text-secondary)] border border-[var(--border-color)]\">\r\n {workflow.tenantName}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 hidden md:table-cell\">\r\n <div className=\"flex items-center gap-2\">\r\n <Zap className=\"w-4 h-4 text-amber-500\" />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{workflow.triggerName}</span>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 hidden lg:table-cell\">\r\n <span className=\"px-2 py-1 rounded-[var(--radius-badge)] text-xs font-medium bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {workflow.stepCount} {t('workflows.columns.steps').toLowerCase()}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3 hidden lg:table-cell\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{workflow.priority}</span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <StatusBadge\r\n status={workflow.isActive ? 'active' : 'inactive'}\r\n label={workflow.isActive ? t('workflows.active') : t('workflows.inactive')}\r\n />\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center justify-end gap-1\" onClick={e => e.stopPropagation()}>\r\n <button\r\n onClick={() => navigate(`/administration/workflows/${workflow.id}`)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-primary-600 hover:bg-[var(--accent-bg)] transition-all\"\r\n title={t('workflows.edit')}\r\n >\r\n <Eye className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={(e) => handleToggleActive(workflow, e)}\r\n className={`p-2 rounded-lg transition-all ${\r\n workflow.isActive\r\n ? 'text-[var(--text-tertiary)] hover:text-[var(--warning-text)] hover:bg-[var(--warning-bg)]'\r\n : 'text-[var(--text-tertiary)] hover:text-[var(--success-text)] hover:bg-[var(--success-bg)]'\r\n }`}\r\n title={workflow.isActive ? t('workflows.deactivate') : t('workflows.activate')}\r\n >\r\n {workflow.isActive ? <Pause className=\"w-4 h-4\" /> : <Play className=\"w-4 h-4\" />}\r\n </button>\r\n <button\r\n onClick={(e) => { e.stopPropagation(); navigate(`/administration/workflows/${workflow.id}/edit`); }}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--info-text)] hover:bg-[var(--info-bg)] transition-all\"\r\n title={t('workflows.edit')}\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n </button>\r\n {!workflow.isSystem && (\r\n <button\r\n onClick={(e) => handleDelete(workflow, e)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n title={t('workflows.delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n </td>\r\n </tr>\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n\r\n const renderCardsView = () => (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {loading && (\r\n <div className=\"col-span-full flex flex-col items-center justify-center py-16\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-primary-500\" />\r\n <span className=\"mt-3 text-sm text-[var(--text-secondary)]\">{t('common.loading', { defaultValue: 'Chargement...' })}</span>\r\n </div>\r\n )}\r\n {!loading && paginatedWorkflows.length === 0 && (\r\n <div className=\"col-span-full flex flex-col items-center justify-center py-16\">\r\n <div className=\"w-16 h-16 rounded-lg bg-[var(--bg-secondary)] flex items-center justify-center mb-3\">\r\n <Workflow className=\"w-8 h-8 text-[var(--text-tertiary)]\" />\r\n </div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('workflows.noResults')}</span>\r\n </div>\r\n )}\r\n {!loading && paginatedWorkflows.length > 0 && (\r\n paginatedWorkflows.map(workflow => (\r\n <button\r\n key={workflow.id}\r\n onClick={() => navigate(`/administration/workflows/${workflow.id}`)}\r\n className=\"bg-[var(--bg-card)] border-2 border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)] rounded-[var(--radius-card)] overflow-hidden transition-all hover:shadow-lg hover:border-[var(--color-accent-400)] cursor-pointer flex flex-col text-left\"\r\n type=\"button\"\r\n >\r\n {/* Header with colored background */}\r\n <div className=\"bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20 p-4 border-b border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-10 h-10 rounded-lg bg-gradient-to-br from-emerald-500 to-teal-500 flex items-center justify-center shadow-lg\">\r\n <Workflow className=\"w-5 h-5 text-white\" />\r\n </div>\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)] truncate\">{workflow.name}</h3>\r\n <div className=\"flex items-center gap-1 text-xs text-[var(--text-tertiary)]\">\r\n <Zap className=\"w-3 h-3 text-amber-500\" />\r\n {workflow.triggerName}\r\n </div>\r\n </div>\r\n </div>\r\n {/* Status badge */}\r\n <div className=\"flex items-center gap-2\">\r\n {workflow.isSystem && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-400\">\r\n System\r\n </span>\r\n )}\r\n {isGlobalView && workflow.tenantName && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400\">\r\n {workflow.tenantName}\r\n </span>\r\n )}\r\n <span className={`inline-flex items-center gap-1.5 px-2 py-0.5 text-xs rounded-full font-medium ${\r\n workflow.isActive\r\n ? 'bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-400'\r\n : 'bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400'\r\n }`}>\r\n {workflow.isActive ? t('workflows.active') : t('workflows.inactive')}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n {/* Body */}\r\n <div className=\"p-4 flex flex-col flex-1\">\r\n {workflow.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] line-clamp-2 mb-3\">{workflow.description}</p>\r\n )}\r\n {/* Spacer */}\r\n <div className=\"flex-1\" />\r\n {/* Stats */}\r\n <div className=\"flex items-center gap-2 text-xs text-[var(--text-tertiary)] mb-3\">\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-md bg-[var(--bg-secondary)]\">\r\n {workflow.stepCount} {t('workflows.columns.steps').toLowerCase()}\r\n </span>\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-md bg-[var(--bg-secondary)]\">\r\n P{workflow.priority}\r\n </span>\r\n </div>\r\n {/* Actions */}\r\n <div className=\"flex items-center justify-end gap-1 pt-3 border-t border-[var(--border-color)]\" onClick={e => e.stopPropagation()}>\r\n <button\r\n onClick={() => navigate(`/administration/workflows/${workflow.id}`)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-primary-600 hover:bg-[var(--accent-bg)] transition-all\"\r\n title={t('workflows.view')}\r\n >\r\n <Eye className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={(e) => handleToggleActive(workflow, e)}\r\n className={`p-2 rounded-lg transition-all ${\r\n workflow.isActive\r\n ? 'text-[var(--text-tertiary)] hover:text-[var(--warning-text)] hover:bg-[var(--warning-bg)]'\r\n : 'text-[var(--text-tertiary)] hover:text-[var(--success-text)] hover:bg-[var(--success-bg)]'\r\n }`}\r\n title={workflow.isActive ? t('workflows.deactivate') : t('workflows.activate')}\r\n >\r\n {workflow.isActive ? <Pause className=\"w-4 h-4\" /> : <Play className=\"w-4 h-4\" />}\r\n </button>\r\n <button\r\n onClick={(e) => { e.stopPropagation(); navigate(`/administration/workflows/${workflow.id}/edit`); }}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--info-text)] hover:bg-[var(--info-bg)] transition-all\"\r\n title={t('workflows.edit')}\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n </button>\r\n {!workflow.isSystem && (\r\n <button\r\n onClick={(e) => handleDelete(workflow, e)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n title={t('workflows.delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </button>\r\n ))\r\n )}\r\n </div>\r\n );\r\n\r\n const renderKanbanView = () => (\r\n <div className=\"flex gap-6 overflow-x-auto pb-4\">\r\n {loading ? (\r\n <div className=\"flex-1 flex flex-col items-center justify-center py-16\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-primary-500\" />\r\n <span className=\"mt-3 text-sm text-[var(--text-secondary)]\">{t('common.loading', { defaultValue: 'Chargement...' })}</span>\r\n </div>\r\n ) : (\r\n <>\r\n {/* Active Workflows */}\r\n <div className=\"min-w-[320px] flex-1 rounded-lg p-2\">\r\n <div className=\"flex items-center gap-2 mb-4\">\r\n <span className=\"w-2 h-2 rounded-full bg-[var(--success-dot)]\" />\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">{t('workflows.active')}</h3>\r\n <span className=\"px-2 py-0.5 rounded-full text-xs font-medium bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {activeWorkflows.length}\r\n </span>\r\n </div>\r\n <div className=\"space-y-3 min-h-[100px]\">\r\n {activeWorkflows.map(workflow => (\r\n <button\r\n type=\"button\"\r\n key={workflow.id}\r\n onClick={() => navigate(`/administration/workflows/${workflow.id}`)}\r\n className=\"bg-[var(--bg-card)] border-2 border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)] rounded-[var(--radius-card)] overflow-hidden transition-all hover:shadow-md hover:border-[var(--color-accent-400)] cursor-pointer text-left w-full\"\r\n >\r\n <div className=\"bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20 p-3 border-b border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-8 h-8 rounded-lg bg-gradient-to-br from-emerald-500 to-teal-500 flex items-center justify-center shadow-md\">\r\n <Workflow className=\"w-4 h-4 text-white\" />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"font-medium text-sm text-[var(--text-primary)] truncate\">{workflow.name}</p>\r\n <div className=\"flex items-center gap-1 text-xs text-[var(--text-tertiary)]\">\r\n <Zap className=\"w-3 h-3 text-amber-500\" />\r\n {workflow.triggerName}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"p-3 flex items-center justify-between\">\r\n <span className=\"text-xs px-2 py-0.5 rounded-md bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {workflow.stepCount} steps\r\n </span>\r\n <span\r\n onClick={(e) => handleToggleActive(workflow, e)}\r\n role=\"button\"\r\n tabIndex={-1}\r\n className=\"text-xs px-2 py-1 rounded-md bg-[var(--warning-bg)] text-[var(--warning-text)] hover:opacity-80 transition-opacity\"\r\n >\r\n {t('workflows.deactivate')}\r\n </span>\r\n </div>\r\n </button>\r\n ))}\r\n {activeWorkflows.length === 0 && (\r\n <div className=\"border border-dashed border-[var(--border-color)] rounded-lg p-6 text-center\">\r\n <Play className=\"w-6 h-6 mx-auto mb-2 text-[var(--text-muted)]\" />\r\n <p className=\"text-xs text-[var(--text-muted)]\">{t('workflows.noResults')}</p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Inactive Workflows */}\r\n <div className=\"min-w-[320px] flex-1 rounded-lg p-2\">\r\n <div className=\"flex items-center gap-2 mb-4\">\r\n <span className=\"w-2 h-2 rounded-full bg-[var(--text-muted)]\" />\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">{t('workflows.inactive')}</h3>\r\n <span className=\"px-2 py-0.5 rounded-full text-xs font-medium bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {inactiveWorkflows.length}\r\n </span>\r\n </div>\r\n <div className=\"space-y-3 min-h-[100px]\">\r\n {inactiveWorkflows.map(workflow => (\r\n <button\r\n type=\"button\"\r\n key={workflow.id}\r\n onClick={() => navigate(`/administration/workflows/${workflow.id}`)}\r\n className=\"bg-[var(--bg-card)] border-2 border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)] rounded-[var(--radius-card)] overflow-hidden transition-all hover:shadow-md hover:border-[var(--color-accent-400)] cursor-pointer opacity-75 text-left w-full\"\r\n >\r\n <div className=\"bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20 p-3 border-b border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-8 h-8 rounded-lg bg-gradient-to-br from-gray-400 to-gray-500 flex items-center justify-center shadow-md\">\r\n <Workflow className=\"w-4 h-4 text-white\" />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"font-medium text-sm text-[var(--text-primary)] truncate\">{workflow.name}</p>\r\n <div className=\"flex items-center gap-1 text-xs text-[var(--text-tertiary)]\">\r\n <Zap className=\"w-3 h-3 text-amber-500\" />\r\n {workflow.triggerName}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"p-3 flex items-center justify-between\">\r\n <span className=\"text-xs px-2 py-0.5 rounded-md bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {workflow.stepCount} steps\r\n </span>\r\n <span\r\n onClick={(e) => handleToggleActive(workflow, e)}\r\n role=\"button\"\r\n tabIndex={-1}\r\n className=\"text-xs px-2 py-1 rounded-md bg-[var(--success-bg)] text-[var(--success-text)] hover:opacity-80 transition-opacity\"\r\n >\r\n {t('workflows.activate')}\r\n </span>\r\n </div>\r\n </button>\r\n ))}\r\n {inactiveWorkflows.length === 0 && (\r\n <div className=\"border border-dashed border-[var(--border-color)] rounded-lg p-6 text-center\">\r\n <Pause className=\"w-6 h-6 mx-auto mb-2 text-[var(--text-muted)]\" />\r\n <p className=\"text-xs text-[var(--text-muted)]\">{t('workflows.noResults')}</p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('workflows.title') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex flex-col sm:flex-row sm:items-center justify-between gap-4\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{t('workflows.title')}</h1>\r\n <p className=\"text-sm text-[var(--text-tertiary)] mt-1\">\r\n {workflows.length} workflows\r\n </p>\r\n </div>\r\n <button\r\n onClick={() => navigate('/administration/workflows/create')}\r\n className=\"btn btn-primary\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('workflows.create')}\r\n </button>\r\n </div>\r\n\r\n {/* Toolbar */}\r\n <div className=\"card p-4\">\r\n <div className=\"flex flex-col md:flex-row md:items-center justify-between gap-4\">\r\n {/* Search & Filters */}\r\n <form onSubmit={handleSearch} className=\"flex items-center gap-3 flex-1\">\r\n <div className=\"relative flex-1 max-w-md\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-muted)]\" />\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={e => setSearch(e.target.value)}\r\n placeholder={t('workflows.searchPlaceholder')}\r\n className=\"input w-full pl-10\"\r\n />\r\n </div>\r\n <button type=\"submit\" className=\"btn btn-secondary\">\r\n <Filter className=\"w-4 h-4\" />\r\n <span className=\"hidden sm:inline\">Filtres</span>\r\n </button>\r\n </form>\r\n\r\n {/* View Toggle */}\r\n <ViewToggle\r\n viewMode={viewMode}\r\n onChange={setViewMode}\r\n tableLabel=\"Table\"\r\n cardsLabel=\"Cards\"\r\n kanbanLabel=\"Kanban\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Content based on view mode */}\r\n {viewMode === 'table' && renderTableView()}\r\n {viewMode === 'cards' && renderCardsView()}\r\n {viewMode === 'kanban' && renderKanbanView()}\r\n\r\n {/* Pagination (only for table and cards) */}\r\n {viewMode !== 'kanban' && workflows.length > 0 && (\r\n <Pagination\r\n page={page}\r\n totalPages={totalPages}\r\n totalCount={workflows.length}\r\n pageSize={pageSize}\r\n onPageChange={setPage}\r\n itemLabel=\"workflows\"\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Zap, Loader2, Info } from 'lucide-react';\r\nimport { communicationsApi, type WorkflowTriggerDto } from '@/services/api/communicationsApi';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\nexport function WorkflowsTriggersPage(): ReactElement {\r\n const { t } = useTranslation('communications');\r\n const [triggers, setTriggers] = useState<WorkflowTriggerDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [selectedTrigger, setSelectedTrigger] = useState<WorkflowTriggerDto | null>(null);\r\n\r\n useEffect(() => {\r\n const loadTriggers = async () => {\r\n try {\r\n setLoading(true);\r\n const data = await communicationsApi.triggers.getAll();\r\n setTriggers(Array.isArray(data) ? data : []);\r\n } catch (err) {\r\n console.error('Failed to load triggers:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n loadTriggers();\r\n }, []);\r\n\r\n const getTriggerTypeStyles = (type: string) => {\r\n switch (type) {\r\n case 'UserEvent':\r\n return 'bg-blue-500/10 text-blue-600 dark:text-blue-400 border-blue-500/20';\r\n case 'TicketEvent':\r\n return 'bg-purple-500/10 text-purple-600 dark:text-purple-400 border-purple-500/20';\r\n case 'SystemEvent':\r\n return 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)] border-[var(--border-color)]';\r\n case 'Scheduled':\r\n return 'bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-500/20';\r\n default:\r\n return 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)] border-[var(--border-color)]';\r\n }\r\n };\r\n\r\n const parseVariables = (variablesJson: string | null): string[] => {\r\n if (!variablesJson) return [];\r\n try {\r\n return JSON.parse(variablesJson);\r\n } catch {\r\n return [];\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('header.title'), href: '/administration' },\r\n { label: t('workflows.title'), href: '/administration/workflows' },\r\n { label: t('triggers.title') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{t('triggers.title')}</h1>\r\n <p className=\"text-sm text-[var(--text-tertiary)] mt-1\">{t('triggers.description')}</p>\r\n </div>\r\n\r\n {loading ? (\r\n <div className=\"flex flex-col items-center justify-center py-16\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-primary-500\" />\r\n <span className=\"mt-3 text-sm text-[var(--text-secondary)]\">{t('workflows.loadingTriggers')}</span>\r\n </div>\r\n ) : (\r\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\r\n {/* Triggers List */}\r\n <div className=\"lg:col-span-2 space-y-3\">\r\n {triggers.map((trigger) => {\r\n const variables = parseVariables(trigger.availableVariablesJson);\r\n return (\r\n <button\r\n type=\"button\"\r\n key={trigger.id}\r\n onClick={() => setSelectedTrigger(trigger)}\r\n className={`card p-4 cursor-pointer transition-all text-left w-full ${\r\n selectedTrigger?.id === trigger.id\r\n ? 'ring-2 ring-[var(--color-accent-500)] border-[var(--color-accent-500)]'\r\n : 'hover:border-[var(--color-accent-500)]/50'\r\n }`}\r\n >\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"flex items-start gap-3\">\r\n <div className=\"p-2.5 rounded-lg bg-amber-500/10\">\r\n <Zap className=\"w-5 h-5 text-amber-500\" />\r\n </div>\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">{trigger.name}</h3>\r\n <code className=\"text-sm text-[var(--text-tertiary)] bg-[var(--bg-secondary)] px-1.5 py-0.5 rounded\">{trigger.code}</code>\r\n </div>\r\n </div>\r\n <span className={`px-2 py-1 rounded-[var(--radius-badge)] text-xs font-medium border ${getTriggerTypeStyles(trigger.triggerType)}`}>\r\n {trigger.triggerType}\r\n </span>\r\n </div>\r\n <div className=\"mt-3 flex items-center gap-4 text-sm text-[var(--text-tertiary)]\">\r\n <span>{variables.length} {t('triggers.variables')}</span>\r\n </div>\r\n </button>\r\n );\r\n })}\r\n\r\n {triggers.length === 0 && (\r\n <div className=\"card p-12 text-center\">\r\n <Zap className=\"w-12 h-12 mx-auto text-[var(--text-muted)] mb-3\" />\r\n <p className=\"text-[var(--text-secondary)]\">No triggers available</p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Details Panel */}\r\n <div className=\"lg:col-span-1\">\r\n {selectedTrigger ? (\r\n <div className=\"card p-5 sticky top-6\">\r\n <div className=\"flex items-center gap-2 mb-5 pb-4 border-b border-[var(--border-color)]\">\r\n <div className=\"p-2 rounded-lg bg-[var(--accent-bg)]\">\r\n <Info className=\"w-5 h-5 text-[var(--accent-text)]\" />\r\n </div>\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('triggers.details')}</h2>\r\n </div>\r\n\r\n <div className=\"space-y-5\">\r\n <div>\r\n <label className=\"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wider\">{t('triggers.name')}</label>\r\n <p className=\"font-medium text-[var(--text-primary)] mt-1\">{selectedTrigger.name}</p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wider\">{t('triggers.code')}</label>\r\n <code className=\"block bg-[var(--bg-secondary)] px-3 py-2 rounded-lg text-sm text-[var(--text-primary)] mt-1 font-mono\">\r\n {selectedTrigger.code}\r\n </code>\r\n </div>\r\n\r\n <div>\r\n <label className=\"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wider\">{t('triggers.type')}</label>\r\n <div className=\"mt-1\">\r\n <span className={`inline-flex px-2.5 py-1 rounded-[var(--radius-badge)] text-xs font-medium border ${getTriggerTypeStyles(selectedTrigger.triggerType)}`}>\r\n {selectedTrigger.triggerType}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"text-xs font-medium text-[var(--text-muted)] uppercase tracking-wider\">{t('triggers.availableVariables')}</label>\r\n <div className=\"mt-2 space-y-1.5 max-h-48 overflow-y-auto\">\r\n {parseVariables(selectedTrigger.availableVariablesJson).map((variable) => (\r\n <code\r\n key={variable}\r\n className=\"flex items-center gap-2 bg-[var(--bg-secondary)] px-3 py-2 rounded-lg text-xs text-[var(--text-primary)] font-mono\"\r\n >\r\n <span className=\"text-amber-500\">{`{{`}</span>\r\n <span>{variable}</span>\r\n <span className=\"text-amber-500\">{`}}`}</span>\r\n </code>\r\n ))}\r\n {parseVariables(selectedTrigger.availableVariablesJson).length === 0 && (\r\n <p className=\"text-sm text-[var(--text-muted)] italic\">No variables available</p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"card p-8 text-center bg-[var(--bg-secondary)]/50\">\r\n <div className=\"w-16 h-16 rounded-full bg-[var(--bg-secondary)] flex items-center justify-center mx-auto mb-4\">\r\n <Info className=\"w-8 h-8 text-[var(--text-muted)]\" />\r\n </div>\r\n <p className=\"text-[var(--text-secondary)]\">{t('triggers.selectToViewDetails')}</p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ArrowLeft, Save, Loader2, Zap, Workflow } from 'lucide-react';\r\nimport { communicationsApi, type WorkflowTriggerDto } from '@/services/api/communicationsApi';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\ninterface CreateWorkflowForm {\r\n code: string;\r\n name: string;\r\n description: string;\r\n triggerId: string;\r\n priority: number;\r\n}\r\n\r\nexport function WorkflowCreatePage(): ReactElement {\r\n const { t } = useTranslation('communications');\r\n const navigate = useNavigate();\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [triggers, setTriggers] = useState<WorkflowTriggerDto[]>([]);\r\n const [loadingTriggers, setLoadingTriggers] = useState(true);\r\n const [formData, setFormData] = useState<CreateWorkflowForm>({\r\n code: '',\r\n name: '',\r\n description: '',\r\n triggerId: '',\r\n priority: 0\r\n });\r\n\r\n useEffect(() => {\r\n const loadTriggers = async () => {\r\n try {\r\n setLoadingTriggers(true);\r\n const data = await communicationsApi.triggers.getAll();\r\n setTriggers(data);\r\n } catch (err) {\r\n console.error('Failed to load triggers:', err);\r\n } finally {\r\n setLoadingTriggers(false);\r\n }\r\n };\r\n loadTriggers();\r\n }, []);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setSaving(true);\r\n setError(null);\r\n\r\n try {\r\n const data = await communicationsApi.workflows.create({\r\n code: formData.code,\r\n name: formData.name,\r\n description: formData.description || undefined,\r\n triggerId: formData.triggerId,\r\n priority: formData.priority\r\n });\r\n navigate(`/administration/workflows/${data.id}`);\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'An error occurred while creating the workflow';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const selectedTrigger = triggers.find(t => t.id === formData.triggerId);\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('workflows.title'), href: '/administration/workflows' },\r\n { label: t('workflows.create', 'Create') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"max-w-2xl\">\r\n <button\r\n onClick={() => navigate('/administration/workflows/list')}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors mb-4\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('workflows.backToList')}\r\n </button>\r\n\r\n <div className=\"flex items-center gap-4\">\r\n <div className=\"w-12 h-12 rounded-full bg-gradient-to-br from-emerald-500 to-teal-500 flex items-center justify-center shadow-lg shadow-emerald-500/20\">\r\n <Workflow className=\"w-6 h-6 text-white\" />\r\n </div>\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{t('workflows.createTitle')}</h1>\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">{t('workflows.description')}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Form */}\r\n <form onSubmit={handleSubmit} className=\"space-y-6 max-w-2xl\">\r\n {error && (\r\n <div className=\"p-4 rounded-lg bg-[var(--error-bg)] text-[var(--error-text)] text-sm border border-[var(--error-border)]\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div className=\"card p-6 space-y-5\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1.5\">\r\n {t('workflows.form.code')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={formData.code}\r\n onChange={(e) => setFormData(prev => ({ ...prev, code: e.target.value.toLowerCase().replace(/[^a-z0-9-]/g, '-') }))}\r\n placeholder=\"e.g., user-welcome-flow\"\r\n className=\"input w-full\"\r\n />\r\n <p className=\"text-xs text-[var(--text-muted)] mt-1.5\">{t('workflows.form.codeHelp')}</p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1.5\">\r\n {t('workflows.form.name')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={formData.name}\r\n onChange={(e) => setFormData(prev => ({ ...prev, name: e.target.value }))}\r\n placeholder=\"e.g., User Welcome Flow\"\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1.5\">\r\n {t('workflows.form.description')}\r\n </label>\r\n <textarea\r\n value={formData.description}\r\n onChange={(e) => setFormData(prev => ({ ...prev, description: e.target.value }))}\r\n rows={3}\r\n placeholder={t('workflows.form.descriptionPlaceholder')}\r\n className=\"input w-full resize-none\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1.5\">\r\n {t('workflows.form.trigger')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n {loadingTriggers ? (\r\n <div className=\"flex items-center gap-2 text-[var(--text-secondary)] py-2\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {t('workflows.loadingTriggers')}\r\n </div>\r\n ) : (\r\n <select\r\n required\r\n value={formData.triggerId}\r\n onChange={(e) => setFormData(prev => ({ ...prev, triggerId: e.target.value }))}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">{t('workflows.form.selectTrigger')}</option>\r\n {triggers.map(trigger => (\r\n <option key={trigger.id} value={trigger.id}>\r\n {trigger.name} ({trigger.code})\r\n </option>\r\n ))}\r\n </select>\r\n )}\r\n {selectedTrigger && (\r\n <div className=\"mt-3 p-3 rounded-lg bg-[var(--bg-secondary)] border border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2 text-sm text-[var(--text-secondary)]\">\r\n <Zap className=\"w-4 h-4 text-amber-500\" />\r\n <span>{t('workflows.form.triggerSelected')}</span>\r\n </div>\r\n <div className=\"mt-2 flex items-center gap-2\">\r\n <span className=\"text-xs px-2 py-0.5 rounded-[var(--radius-badge)] bg-amber-500/10 text-amber-600 border border-amber-500/20\">\r\n {selectedTrigger.triggerType}\r\n </span>\r\n <code className=\"text-xs text-[var(--text-tertiary)]\">{selectedTrigger.code}</code>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1.5\">\r\n {t('workflows.form.priority')}\r\n </label>\r\n <div className=\"flex items-center gap-4\">\r\n <input\r\n type=\"range\"\r\n min={0}\r\n max={100}\r\n value={formData.priority}\r\n onChange={(e) => setFormData(prev => ({ ...prev, priority: parseInt(e.target.value) || 0 }))}\r\n className=\"flex-1 h-2 bg-[var(--bg-secondary)] rounded-lg appearance-none cursor-pointer accent-[var(--color-accent-600)]\"\r\n />\r\n <input\r\n type=\"number\"\r\n min={0}\r\n max={100}\r\n value={formData.priority}\r\n onChange={(e) => setFormData(prev => ({ ...prev, priority: Math.min(100, Math.max(0, parseInt(e.target.value) || 0)) }))}\r\n className=\"input w-20 text-center\"\r\n />\r\n </div>\r\n <p className=\"text-xs text-[var(--text-muted)] mt-1.5\">{t('workflows.form.priorityHelp')}</p>\r\n </div>\r\n </div>\r\n\r\n {/* Actions */}\r\n <div className=\"flex justify-end gap-3\">\r\n <button\r\n type=\"button\"\r\n onClick={() => navigate('/administration/workflows/list')}\r\n className=\"btn btn-secondary\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={saving || !formData.triggerId}\r\n className=\"btn btn-primary disabled:opacity-50\"\r\n >\r\n {saving ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useParams, useNavigate, Link } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n ArrowLeft,\r\n Settings,\r\n Loader2,\r\n Edit,\r\n Trash2,\r\n Play,\r\n Pause,\r\n Lock,\r\n AlertTriangle,\r\n CheckCircle,\r\n ListOrdered,\r\n Mail,\r\n Clock,\r\n GitBranch,\r\n Webhook,\r\n Plus\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n communicationsApi,\r\n type WorkflowDetailDto,\r\n type WorkflowStepDto\r\n} from '@/services/api/communicationsApi';\r\n\r\ntype TabId = 'info' | 'steps';\r\n\r\n// Step type icons mapping\r\nconst stepTypeIcons: Record<string, React.ReactNode> = {\r\n SendEmail: <Mail className=\"w-4 h-4\" />,\r\n Wait: <Clock className=\"w-4 h-4\" />,\r\n Condition: <GitBranch className=\"w-4 h-4\" />,\r\n Webhook: <Webhook className=\"w-4 h-4\" />\r\n};\r\n\r\n// Step type colors\r\nconst stepTypeColors: Record<string, string> = {\r\n SendEmail: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\r\n Wait: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\r\n Condition: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400',\r\n Webhook: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400'\r\n};\r\n\r\nexport function WorkflowDetailPage(): ReactElement {\r\n const { t } = useTranslation('communications');\r\n const { id: workflowId } = useParams<{ id: string }>();\r\n const navigate = useNavigate();\r\n\r\n const [workflow, setWorkflow] = useState<WorkflowDetailDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [activeTab, setActiveTab] = useState<TabId>('info');\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n const [actionLoading, setActionLoading] = useState(false);\r\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\r\n\r\n const loadWorkflow = useCallback(async () => {\r\n if (!workflowId) return;\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const data = await communicationsApi.workflows.getById(workflowId);\r\n setWorkflow(data);\r\n } catch (err) {\r\n console.error('Failed to load workflow:', err);\r\n setError(t('workflows.detail.errors.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [workflowId, t]);\r\n\r\n useEffect(() => {\r\n loadWorkflow();\r\n }, [loadWorkflow]);\r\n\r\n const handleActivate = async () => {\r\n if (!workflowId) return;\r\n try {\r\n setActionLoading(true);\r\n setError(null);\r\n await communicationsApi.workflows.activate(workflowId);\r\n setSuccess(t('workflows.detail.success.activated'));\r\n loadWorkflow();\r\n } catch (err) {\r\n console.error('Failed to activate workflow:', err);\r\n setError(t('workflows.detail.errors.activateFailed'));\r\n } finally {\r\n setActionLoading(false);\r\n }\r\n };\r\n\r\n const handleDeactivate = async () => {\r\n if (!workflowId) return;\r\n try {\r\n setActionLoading(true);\r\n setError(null);\r\n await communicationsApi.workflows.deactivate(workflowId);\r\n setSuccess(t('workflows.detail.success.deactivated'));\r\n loadWorkflow();\r\n } catch (err) {\r\n console.error('Failed to deactivate workflow:', err);\r\n setError(t('workflows.detail.errors.deactivateFailed'));\r\n } finally {\r\n setActionLoading(false);\r\n }\r\n };\r\n\r\n const handleDelete = async () => {\r\n if (!workflowId || !workflow) return;\r\n\r\n if (workflow.isSystem) {\r\n setError(t('workflows.cannotDeleteSystem'));\r\n return;\r\n }\r\n\r\n try {\r\n setActionLoading(true);\r\n setError(null);\r\n await communicationsApi.workflows.delete(workflowId);\r\n navigate('/administration/workflows/list');\r\n } catch (err) {\r\n console.error('Failed to delete workflow:', err);\r\n setError(t('workflows.detail.errors.deleteFailed'));\r\n setShowDeleteConfirm(false);\r\n } finally {\r\n setActionLoading(false);\r\n }\r\n };\r\n\r\n const tabs: { id: TabId; label: string; icon: React.ReactNode }[] = [\r\n { id: 'info', label: t('workflows.detail.tabs.info'), icon: <Settings className=\"w-4 h-4\" /> },\r\n { id: 'steps', label: t('workflows.detail.tabs.steps'), icon: <ListOrdered className=\"w-4 h-4\" /> }\r\n ];\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (!workflow) {\r\n return (\r\n <div className=\"text-center py-12\">\r\n <p className=\"text-[var(--text-secondary)]\">{t('workflows.detail.notFound')}</p>\r\n <button\r\n onClick={() => navigate('/administration/workflows/list')}\r\n className=\"mt-4 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white\"\r\n >\r\n {t('workflows.backToList')}\r\n </button>\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('header.title'), href: '/administration' },\r\n { label: t('workflows.title'), href: '/administration/workflows' },\r\n { label: workflow?.name || '' }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center gap-4\">\r\n <button\r\n onClick={() => navigate('/administration/workflows/list')}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3\">\r\n <h1 className=\"text-xl sm:text-2xl font-bold text-[var(--text-primary)]\">{workflow.name}</h1>\r\n {workflow.isSystem && (\r\n <span className=\"flex items-center gap-1 px-2 py-1 rounded-[var(--radius-badge)] text-xs bg-[var(--warning-bg)] text-[var(--warning-text)] border border-[var(--warning-border)]\">\r\n <Lock className=\"w-3 h-3\" />\r\n {t('workflows.detail.system')}\r\n </span>\r\n )}\r\n {workflow.tenantName && (\r\n <span className=\"flex items-center gap-1 px-2 py-1 rounded-[var(--radius-badge)] text-xs bg-[var(--bg-secondary)] text-[var(--text-secondary)] border border-[var(--border-color)]\">\r\n {workflow.tenantName}\r\n </span>\r\n )}\r\n <span className={`px-2 py-1 rounded-[var(--radius-badge)] text-xs font-medium ${\r\n workflow.isActive\r\n ? 'bg-[var(--success-bg)] text-[var(--success-text)] border border-[var(--success-border)]'\r\n : 'bg-[var(--error-bg)] text-[var(--error-text)] border border-[var(--error-border)]'\r\n }`}>\r\n {workflow.isActive ? t('workflows.active') : t('workflows.inactive')}\r\n </span>\r\n </div>\r\n {workflow.description && (\r\n <p className=\"text-sm sm:text-base text-[var(--text-secondary)] mt-1\">{workflow.description}</p>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n {!workflow.isSystem && (\r\n <>\r\n <button\r\n onClick={() => navigate(`/administration/workflows/${workflowId}/edit`)}\r\n className=\"flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] transition-colors\"\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n <span className=\"hidden sm:inline\">{t('workflows.edit')}</span>\r\n </button>\r\n <button\r\n onClick={workflow.isActive ? handleDeactivate : handleActivate}\r\n disabled={actionLoading}\r\n className={`flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] border transition-colors ${\r\n workflow.isActive\r\n ? 'border-[var(--warning-border)] text-[var(--warning-text)] hover:bg-[var(--warning-bg)]'\r\n : 'border-[var(--success-border)] text-[var(--success-text)] hover:bg-[var(--success-bg)]'\r\n }`}\r\n >\r\n {actionLoading && (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n )}\r\n {!actionLoading && workflow.isActive && (\r\n <Pause className=\"w-4 h-4\" />\r\n )}\r\n {!actionLoading && !workflow.isActive && (\r\n <Play className=\"w-4 h-4\" />\r\n )}\r\n <span className=\"hidden sm:inline\">\r\n {workflow.isActive ? t('workflows.deactivate') : t('workflows.activate')}\r\n </span>\r\n </button>\r\n <button\r\n onClick={() => setShowDeleteConfirm(true)}\r\n className=\"flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] border border-[var(--error-border)] text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-colors\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n <span className=\"hidden sm:inline\">{t('workflows.delete')}</span>\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Alerts */}\r\n {error && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)] text-[var(--error-text)] flex items-center gap-2\">\r\n <AlertTriangle className=\"w-5 h-5 flex-shrink-0\" />\r\n {error}\r\n </div>\r\n )}\r\n {success && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--success-bg)] border border-[var(--success-border)] text-[var(--success-text)] flex items-center gap-2\">\r\n <CheckCircle className=\"w-5 h-5 flex-shrink-0\" />\r\n {success}\r\n </div>\r\n )}\r\n\r\n {/* System workflow warning */}\r\n {workflow.isSystem && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--warning-bg)] border border-[var(--warning-border)] text-[var(--warning-text)] flex items-center gap-2\">\r\n <Lock className=\"w-5 h-5 flex-shrink-0\" />\r\n {t('workflows.detail.systemReadOnly')}\r\n </div>\r\n )}\r\n\r\n {/* Tabs */}\r\n <div className=\"flex gap-1 p-1 bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n {tabs.map(tab => (\r\n <button\r\n key={tab.id}\r\n onClick={() => setActiveTab(tab.id)}\r\n className={`flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium transition-colors ${\r\n activeTab === tab.id\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n {tab.icon}\r\n <span className=\"hidden sm:inline\">{tab.label}</span>\r\n {tab.id === 'steps' && (\r\n <span className={`ml-1 px-1.5 py-0.5 rounded text-xs ${\r\n activeTab === tab.id ? 'bg-white/20' : 'bg-[var(--bg-tertiary)]'\r\n }`}>\r\n {workflow.steps.length}\r\n </span>\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div className=\"bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4 sm:p-6\">\r\n {/* Info Tab */}\r\n {activeTab === 'info' && (\r\n <div className=\"space-y-6\">\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.form.code')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)] font-mono text-sm\">\r\n {workflow.code}\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.form.name')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)]\">\r\n {workflow.name}\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.form.description')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)] min-h-[60px]\">\r\n {workflow.description || <span className=\"text-[var(--text-tertiary)]\">-</span>}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.form.trigger')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)]\">\r\n <div className=\"font-medium\">{workflow.triggerName}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)] font-mono\">{workflow.triggerCode}</div>\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.form.priority')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)]\">\r\n {workflow.priority}\r\n </div>\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 text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.detail.createdAt')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)] text-sm\">\r\n {new Date(workflow.createdAt).toLocaleString()}\r\n </div>\r\n </div>\r\n {workflow.updatedAt && (\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.detail.updatedAt')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)] text-sm\">\r\n {new Date(workflow.updatedAt).toLocaleString()}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Steps Tab */}\r\n {activeTab === 'steps' && (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('workflows.detail.stepsTitle')} ({workflow.steps.length})\r\n </h3>\r\n {!workflow.isSystem && (\r\n <Link\r\n to={`/administration/workflows/${workflowId}/edit`}\r\n className=\"flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('workflows.detail.addStep')}\r\n </Link>\r\n )}\r\n </div>\r\n\r\n {workflow.steps.length === 0 ? (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n <ListOrdered className=\"w-12 h-12 mx-auto mb-4 opacity-50\" />\r\n <p>{t('workflows.detail.noSteps')}</p>\r\n {!workflow.isSystem && (\r\n <Link\r\n to={`/administration/workflows/${workflowId}/edit`}\r\n className=\"inline-flex items-center gap-2 mt-4 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('workflows.detail.addFirstStep')}\r\n </Link>\r\n )}\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3\">\r\n {workflow.steps\r\n .sort((a, b) => a.stepOrder - b.stepOrder)\r\n .map((step, index) => (\r\n <StepCard\r\n key={step.id}\r\n step={step}\r\n index={index}\r\n isLast={index === workflow.steps.length - 1}\r\n t={t}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Delete Confirmation Modal */}\r\n {showDeleteConfirm && (\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-[var(--radius-card)] border border-[var(--border-color)] p-6 max-w-md w-full shadow-xl\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-2\">\r\n {t('workflows.detail.confirmDelete.title')}\r\n </h3>\r\n <p className=\"text-[var(--text-secondary)] mb-6\">\r\n {t('workflows.confirmDelete', { name: workflow.name })}\r\n </p>\r\n <div className=\"flex justify-end gap-3\">\r\n <button\r\n onClick={() => setShowDeleteConfirm(false)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n onClick={handleDelete}\r\n disabled={actionLoading}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--error-600)] hover:bg-[var(--error-700)] text-white font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {actionLoading ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Trash2 className=\"w-4 h-4\" />\r\n )}\r\n {t('workflows.delete')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// Step Card Component\r\ninterface StepCardProps {\r\n readonly step: WorkflowStepDto;\r\n readonly index: number;\r\n readonly isLast: boolean;\r\n readonly t: (key: string, options?: Record<string, unknown>) => string;\r\n}\r\n\r\nfunction StepCard({ step, index, isLast, t }: StepCardProps) {\r\n const stepIcon = stepTypeIcons[step.stepType] || <Settings className=\"w-4 h-4\" />;\r\n const stepColor = stepTypeColors[step.stepType] || 'bg-gray-100 text-gray-700';\r\n\r\n const getStepDetails = () => {\r\n switch (step.stepType) {\r\n case 'SendEmail':\r\n return step.emailTemplateName\r\n ? t('workflows.detail.stepDetails.emailTemplate', { template: step.emailTemplateName })\r\n : t('workflows.detail.stepDetails.noTemplate');\r\n case 'Wait':\r\n return t('workflows.detail.stepDetails.waitMinutes', { minutes: step.delayMinutes || 0 });\r\n case 'Condition':\r\n return t('workflows.detail.stepDetails.condition');\r\n case 'Webhook':\r\n if (step.configurationJson) {\r\n try {\r\n const config = JSON.parse(step.configurationJson);\r\n return config.url || t('workflows.detail.stepDetails.webhookConfigured');\r\n } catch {\r\n return t('workflows.detail.stepDetails.webhookConfigured');\r\n }\r\n }\r\n return t('workflows.detail.stepDetails.noWebhook');\r\n default:\r\n return '';\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"relative\">\r\n {/* Connection line */}\r\n {!isLast && (\r\n <div className=\"absolute left-6 top-14 bottom-0 w-0.5 bg-[var(--border-color)]\" style={{ height: 'calc(100% - 20px)' }} />\r\n )}\r\n\r\n <div className=\"flex items-start gap-4 p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)] hover:border-[var(--color-accent-300)] transition-colors\">\r\n {/* Step number */}\r\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] flex items-center justify-center\">\r\n <span className=\"text-sm font-bold text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)]\">\r\n {index + 1}\r\n </span>\r\n </div>\r\n\r\n {/* Step content */}\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n <span className={`flex items-center gap-1.5 px-2 py-0.5 rounded-full text-xs font-medium ${stepColor}`}>\r\n {stepIcon}\r\n {t(`workflows.stepTypes.${step.stepType}`)}\r\n </span>\r\n </div>\r\n <div className=\"font-medium text-[var(--text-primary)]\">{step.name}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)] mt-0.5\">{getStepDetails()}</div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default WorkflowDetailPage;\r\n","import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Plus,\r\n Loader2,\r\n AlertTriangle,\r\n CheckCircle,\r\n Mail,\r\n Clock,\r\n GitBranch,\r\n Webhook,\r\n Settings,\r\n Trash2,\r\n Edit,\r\n ChevronUp,\r\n ChevronDown,\r\n X,\r\n ListOrdered\r\n} from 'lucide-react';\r\nimport {\r\n communicationsApi,\r\n type WorkflowStepDto,\r\n type CreateWorkflowStepRequest,\r\n type UpdateWorkflowStepRequest,\r\n type EmailTemplateListDto\r\n} from '@/services/api/communicationsApi';\r\n\r\ninterface WorkflowStepsEditorProps {\r\n readonly workflowId: string;\r\n readonly steps: WorkflowStepDto[];\r\n readonly onStepsChange: () => void;\r\n readonly readOnly?: boolean;\r\n}\r\n\r\n// Step type icons mapping\r\nconst stepTypeIcons: Record<string, React.ReactNode> = {\r\n SendEmail: <Mail className=\"w-4 h-4\" />,\r\n Wait: <Clock className=\"w-4 h-4\" />,\r\n Condition: <GitBranch className=\"w-4 h-4\" />,\r\n Webhook: <Webhook className=\"w-4 h-4\" />\r\n};\r\n\r\n// Step type colors\r\nconst stepTypeColors: Record<string, string> = {\r\n SendEmail: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\r\n Wait: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\r\n Condition: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400',\r\n Webhook: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400'\r\n};\r\n\r\nconst stepTypes = ['SendEmail', 'Wait', 'Condition', 'Webhook'];\r\n\r\nexport function WorkflowStepsEditor({ workflowId, steps, onStepsChange, readOnly = false }: WorkflowStepsEditorProps): ReactElement {\r\n const { t } = useTranslation('communications');\r\n\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n const [showAddModal, setShowAddModal] = useState(false);\r\n const [showEditModal, setShowEditModal] = useState(false);\r\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\r\n const [editingStep, setEditingStep] = useState<WorkflowStepDto | null>(null);\r\n const [emailTemplates, setEmailTemplates] = useState<EmailTemplateListDto[]>([]);\r\n const [loadingTemplates, setLoadingTemplates] = useState(false);\r\n\r\n // Form state\r\n const [formData, setFormData] = useState({\r\n name: '',\r\n stepType: '',\r\n emailTemplateId: '',\r\n delayMinutes: 5,\r\n configurationJson: ''\r\n });\r\n\r\n // Load email templates when needed\r\n const loadEmailTemplates = async () => {\r\n if (emailTemplates.length > 0) return;\r\n try {\r\n setLoadingTemplates(true);\r\n const templates = await communicationsApi.emailTemplates.getAll({ isActive: true });\r\n setEmailTemplates(templates);\r\n } catch (err) {\r\n console.error('Failed to load email templates:', err);\r\n } finally {\r\n setLoadingTemplates(false);\r\n }\r\n };\r\n\r\n const resetForm = () => {\r\n setFormData({\r\n name: '',\r\n stepType: '',\r\n emailTemplateId: '',\r\n delayMinutes: 5,\r\n configurationJson: ''\r\n });\r\n };\r\n\r\n const handleOpenAddModal = () => {\r\n resetForm();\r\n loadEmailTemplates();\r\n setShowAddModal(true);\r\n };\r\n\r\n const handleOpenEditModal = (step: WorkflowStepDto) => {\r\n setEditingStep(step);\r\n loadEmailTemplates();\r\n setFormData({\r\n name: step.name,\r\n stepType: step.stepType,\r\n emailTemplateId: step.emailTemplateId || '',\r\n delayMinutes: step.delayMinutes || 5,\r\n configurationJson: step.configurationJson || ''\r\n });\r\n setShowEditModal(true);\r\n };\r\n\r\n const handleOpenDeleteConfirm = (step: WorkflowStepDto) => {\r\n setEditingStep(step);\r\n setShowDeleteConfirm(true);\r\n };\r\n\r\n const handleAddStep = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!formData.name || !formData.stepType) {\r\n setError(t('workflows.steps.errors.nameRequired'));\r\n return;\r\n }\r\n\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n\r\n const request: CreateWorkflowStepRequest = {\r\n name: formData.name,\r\n stepType: formData.stepType,\r\n emailTemplateId: formData.stepType === 'SendEmail' ? formData.emailTemplateId || undefined : undefined,\r\n delayMinutes: formData.stepType === 'Wait' ? formData.delayMinutes : undefined,\r\n configurationJson: ['Condition', 'Webhook'].includes(formData.stepType) ? formData.configurationJson || undefined : undefined\r\n };\r\n\r\n await communicationsApi.workflows.addStep(workflowId, request);\r\n setSuccess(t('workflows.steps.success.added'));\r\n setShowAddModal(false);\r\n resetForm();\r\n onStepsChange();\r\n } catch (err) {\r\n console.error('Failed to add step:', err);\r\n setError(t('workflows.steps.errors.addFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleUpdateStep = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!editingStep || !formData.name || !formData.stepType) {\r\n setError(t('workflows.steps.errors.nameRequired'));\r\n return;\r\n }\r\n\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n\r\n const request: UpdateWorkflowStepRequest = {\r\n name: formData.name,\r\n stepOrder: editingStep.stepOrder,\r\n isActive: editingStep.isActive,\r\n emailTemplateId: formData.stepType === 'SendEmail' ? formData.emailTemplateId || undefined : undefined,\r\n delayMinutes: formData.stepType === 'Wait' ? formData.delayMinutes : undefined,\r\n configurationJson: ['Condition', 'Webhook'].includes(formData.stepType) ? formData.configurationJson || undefined : undefined\r\n };\r\n\r\n await communicationsApi.workflows.updateStep(workflowId, editingStep.id, request);\r\n setSuccess(t('workflows.steps.success.updated'));\r\n setShowEditModal(false);\r\n setEditingStep(null);\r\n resetForm();\r\n onStepsChange();\r\n } catch (err) {\r\n console.error('Failed to update step:', err);\r\n setError(t('workflows.steps.errors.updateFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleDeleteStep = async () => {\r\n if (!editingStep) return;\r\n\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n await communicationsApi.workflows.deleteStep(workflowId, editingStep.id);\r\n setSuccess(t('workflows.steps.success.deleted'));\r\n setShowDeleteConfirm(false);\r\n setEditingStep(null);\r\n onStepsChange();\r\n } catch (err) {\r\n console.error('Failed to delete step:', err);\r\n setError(t('workflows.steps.errors.deleteFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleMoveStep = async (step: WorkflowStepDto, direction: 'up' | 'down') => {\r\n const sortedSteps = [...steps].sort((a, b) => a.stepOrder - b.stepOrder);\r\n const currentIndex = sortedSteps.findIndex(s => s.id === step.id);\r\n const newIndex = direction === 'up' ? currentIndex - 1 : currentIndex + 1;\r\n\r\n if (newIndex < 0 || newIndex >= sortedSteps.length) return;\r\n\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n\r\n // Swap orders\r\n const otherStep = sortedSteps[newIndex];\r\n\r\n // Update the current step with new order\r\n const request: UpdateWorkflowStepRequest = {\r\n name: step.name,\r\n stepOrder: otherStep.stepOrder,\r\n isActive: step.isActive,\r\n emailTemplateId: step.emailTemplateId || undefined,\r\n delayMinutes: step.delayMinutes || undefined,\r\n configurationJson: step.configurationJson || undefined\r\n };\r\n\r\n await communicationsApi.workflows.updateStep(workflowId, step.id, request);\r\n\r\n // Update the other step with swapped order\r\n const otherRequest: UpdateWorkflowStepRequest = {\r\n name: otherStep.name,\r\n stepOrder: step.stepOrder,\r\n isActive: otherStep.isActive,\r\n emailTemplateId: otherStep.emailTemplateId || undefined,\r\n delayMinutes: otherStep.delayMinutes || undefined,\r\n configurationJson: otherStep.configurationJson || undefined\r\n };\r\n\r\n await communicationsApi.workflows.updateStep(workflowId, otherStep.id, otherRequest);\r\n onStepsChange();\r\n } catch (err) {\r\n console.error('Failed to reorder steps:', err);\r\n setError(t('workflows.steps.errors.updateFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n // Clear messages after 3 seconds\r\n useEffect(() => {\r\n if (success) {\r\n const timer = setTimeout(() => setSuccess(null), 3000);\r\n return () => clearTimeout(timer);\r\n }\r\n }, [success]);\r\n\r\n useEffect(() => {\r\n if (error) {\r\n const timer = setTimeout(() => setError(null), 5000);\r\n return () => clearTimeout(timer);\r\n }\r\n }, [error]);\r\n\r\n const sortedSteps = [...steps].sort((a, b) => a.stepOrder - b.stepOrder);\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('workflows.steps.title')} ({steps.length})\r\n </h3>\r\n {!readOnly && (\r\n <button\r\n onClick={handleOpenAddModal}\r\n className=\"flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('workflows.steps.add')}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Alerts */}\r\n {error && (\r\n <div className=\"p-3 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)] text-[var(--error-text)] flex items-center gap-2 text-sm\">\r\n <AlertTriangle className=\"w-4 h-4 flex-shrink-0\" />\r\n {error}\r\n </div>\r\n )}\r\n {success && (\r\n <div className=\"p-3 rounded-[var(--radius-card)] bg-[var(--success-bg)] border border-[var(--success-border)] text-[var(--success-text)] flex items-center gap-2 text-sm\">\r\n <CheckCircle className=\"w-4 h-4 flex-shrink-0\" />\r\n {success}\r\n </div>\r\n )}\r\n\r\n {/* Steps List */}\r\n {steps.length === 0 ? (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n <ListOrdered className=\"w-12 h-12 mx-auto mb-4 opacity-50\" />\r\n <p>{t('workflows.steps.noSteps')}</p>\r\n {!readOnly && (\r\n <p className=\"text-sm mt-2\">{t('workflows.steps.addFirstStep')}</p>\r\n )}\r\n </div>\r\n ) : (\r\n <div className=\"space-y-2\">\r\n {sortedSteps.map((step, index) => (\r\n <StepRow\r\n key={step.id}\r\n step={step}\r\n index={index}\r\n isFirst={index === 0}\r\n isLast={index === sortedSteps.length - 1}\r\n onEdit={() => handleOpenEditModal(step)}\r\n onDelete={() => handleOpenDeleteConfirm(step)}\r\n onMoveUp={() => handleMoveStep(step, 'up')}\r\n onMoveDown={() => handleMoveStep(step, 'down')}\r\n readOnly={readOnly}\r\n loading={loading}\r\n t={t}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Add Step Modal */}\r\n {showAddModal && (\r\n <StepFormModal\r\n title={t('workflows.steps.add')}\r\n formData={formData}\r\n setFormData={setFormData}\r\n emailTemplates={emailTemplates}\r\n loadingTemplates={loadingTemplates}\r\n loading={loading}\r\n onSubmit={handleAddStep}\r\n onClose={() => {\r\n setShowAddModal(false);\r\n resetForm();\r\n }}\r\n t={t}\r\n />\r\n )}\r\n\r\n {/* Edit Step Modal */}\r\n {showEditModal && editingStep && (\r\n <StepFormModal\r\n title={t('workflows.steps.edit')}\r\n formData={formData}\r\n setFormData={setFormData}\r\n emailTemplates={emailTemplates}\r\n loadingTemplates={loadingTemplates}\r\n loading={loading}\r\n onSubmit={handleUpdateStep}\r\n onClose={() => {\r\n setShowEditModal(false);\r\n setEditingStep(null);\r\n resetForm();\r\n }}\r\n t={t}\r\n />\r\n )}\r\n\r\n {/* Delete Confirmation Modal */}\r\n {showDeleteConfirm && editingStep && (\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-[var(--radius-card)] border border-[var(--border-color)] p-6 max-w-md w-full shadow-xl\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-2\">\r\n {t('workflows.steps.delete')}\r\n </h3>\r\n <p className=\"text-[var(--text-secondary)] mb-6\">\r\n {t('workflows.steps.confirmDelete')}\r\n </p>\r\n <div className=\"flex justify-end gap-3\">\r\n <button\r\n onClick={() => {\r\n setShowDeleteConfirm(false);\r\n setEditingStep(null);\r\n }}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n onClick={handleDeleteStep}\r\n disabled={loading}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--error-600)] hover:bg-[var(--error-700)] text-white font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {loading ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Trash2 className=\"w-4 h-4\" />\r\n )}\r\n {t('workflows.steps.delete')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// Step Row Component\r\ninterface StepRowProps {\r\n readonly step: WorkflowStepDto;\r\n readonly index: number;\r\n readonly isFirst: boolean;\r\n readonly isLast: boolean;\r\n readonly onEdit: () => void;\r\n readonly onDelete: () => void;\r\n readonly onMoveUp: () => void;\r\n readonly onMoveDown: () => void;\r\n readonly readOnly: boolean;\r\n readonly loading: boolean;\r\n readonly t: (key: string, options?: Record<string, unknown>) => string;\r\n}\r\n\r\nfunction StepRow({ step, index, isFirst, isLast, onEdit, onDelete, onMoveUp, onMoveDown, readOnly, loading, t }: StepRowProps) {\r\n const stepIcon = stepTypeIcons[step.stepType] || <Settings className=\"w-4 h-4\" />;\r\n const stepColor = stepTypeColors[step.stepType] || 'bg-gray-100 text-gray-700';\r\n\r\n const getStepDetails = () => {\r\n switch (step.stepType) {\r\n case 'SendEmail':\r\n return step.emailTemplateName || t('workflows.detail.stepDetails.noTemplate');\r\n case 'Wait':\r\n return t('workflows.detail.stepDetails.waitMinutes', { minutes: step.delayMinutes || 0 });\r\n case 'Condition':\r\n return t('workflows.detail.stepDetails.condition');\r\n case 'Webhook':\r\n if (step.configurationJson) {\r\n try {\r\n const config = JSON.parse(step.configurationJson);\r\n return config.url || t('workflows.detail.stepDetails.webhookConfigured');\r\n } catch {\r\n return t('workflows.detail.stepDetails.webhookConfigured');\r\n }\r\n }\r\n return t('workflows.detail.stepDetails.noWebhook');\r\n default:\r\n return '';\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"flex items-center gap-3 p-3 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)] hover:border-[var(--color-accent-300)] transition-colors\">\r\n {/* Step number */}\r\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] flex items-center justify-center\">\r\n <span className=\"text-sm font-bold text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)]\">\r\n {index + 1}\r\n </span>\r\n </div>\r\n\r\n {/* Step info */}\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2 mb-0.5\">\r\n <span className={`flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium ${stepColor}`}>\r\n {stepIcon}\r\n {t(`workflows.stepTypes.${step.stepType}`)}\r\n </span>\r\n </div>\r\n <div className=\"font-medium text-[var(--text-primary)] truncate\">{step.name}</div>\r\n <div className=\"text-xs text-[var(--text-secondary)] truncate\">{getStepDetails()}</div>\r\n </div>\r\n\r\n {/* Actions */}\r\n {!readOnly && (\r\n <div className=\"flex items-center gap-1\">\r\n <button\r\n onClick={onMoveUp}\r\n disabled={isFirst || loading}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)] text-[var(--text-secondary)] disabled:opacity-30 disabled:cursor-not-allowed transition-colors\"\r\n title={t('workflows.steps.moveUp')}\r\n >\r\n <ChevronUp className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={onMoveDown}\r\n disabled={isLast || loading}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)] text-[var(--text-secondary)] disabled:opacity-30 disabled:cursor-not-allowed transition-colors\"\r\n title={t('workflows.steps.moveDown')}\r\n >\r\n <ChevronDown className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={onEdit}\r\n disabled={loading}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)] text-[var(--text-secondary)] hover:text-[var(--color-accent-600)] disabled:opacity-30 transition-colors\"\r\n title={t('workflows.steps.edit')}\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={onDelete}\r\n disabled={loading}\r\n className=\"p-1.5 rounded hover:bg-[var(--error-bg)] text-[var(--text-secondary)] hover:text-[var(--error-text)] disabled:opacity-30 transition-colors\"\r\n title={t('workflows.steps.delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// Step Form Modal Component\r\ninterface StepFormModalProps {\r\n readonly title: string;\r\n readonly formData: {\r\n readonly name: string;\r\n readonly stepType: string;\r\n readonly emailTemplateId: string;\r\n readonly delayMinutes: number;\r\n readonly configurationJson: string;\r\n };\r\n readonly setFormData: React.Dispatch<React.SetStateAction<{\r\n readonly name: string;\r\n readonly stepType: string;\r\n readonly emailTemplateId: string;\r\n readonly delayMinutes: number;\r\n readonly configurationJson: string;\r\n }>>;\r\n readonly emailTemplates: EmailTemplateListDto[];\r\n readonly loadingTemplates: boolean;\r\n readonly loading: boolean;\r\n readonly onSubmit: (e: React.FormEvent) => void;\r\n readonly onClose: () => void;\r\n readonly t: (key: string, options?: Record<string, unknown>) => string;\r\n}\r\n\r\nfunction StepFormModal({ title, formData, setFormData, emailTemplates, loadingTemplates, loading, onSubmit, onClose, t }: StepFormModalProps) {\r\n return (\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-[var(--radius-card)] border border-[var(--border-color)] w-full max-w-lg shadow-xl max-h-[90vh] overflow-y-auto\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between p-4 border-b border-[var(--border-color)]\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">{title}</h3>\r\n <button\r\n onClick={onClose}\r\n className=\"p-1 rounded hover:bg-[var(--bg-hover)] text-[var(--text-secondary)] transition-colors\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n {/* Form */}\r\n <form onSubmit={onSubmit} className=\"p-4 space-y-4\">\r\n {/* Name */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.steps.form.name')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={formData.name}\r\n onChange={e => setFormData(prev => ({ ...prev, name: e.target.value }))}\r\n placeholder={t('workflows.steps.form.namePlaceholder')}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n\r\n {/* Step Type */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.steps.form.type')} *\r\n </label>\r\n <select\r\n required\r\n value={formData.stepType}\r\n onChange={e => setFormData(prev => ({ ...prev, stepType: e.target.value }))}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n >\r\n <option value=\"\">{t('workflows.steps.form.selectType')}</option>\r\n {stepTypes.map(type => (\r\n <option key={type} value={type}>\r\n {t(`workflows.stepTypes.${type}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n {/* Type-specific fields */}\r\n {formData.stepType === 'SendEmail' && (\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.steps.form.emailTemplate')}\r\n </label>\r\n <select\r\n value={formData.emailTemplateId}\r\n onChange={e => setFormData(prev => ({ ...prev, emailTemplateId: e.target.value }))}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n >\r\n <option value=\"\">{t('workflows.steps.form.selectTemplate')}</option>\r\n {loadingTemplates ? (\r\n <option disabled>Loading...</option>\r\n ) : (\r\n emailTemplates.map(template => (\r\n <option key={template.id} value={template.id}>\r\n {template.name} ({template.code})\r\n </option>\r\n ))\r\n )}\r\n </select>\r\n </div>\r\n )}\r\n\r\n {formData.stepType === 'Wait' && (\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.steps.form.delayMinutes')}\r\n </label>\r\n <div className=\"flex gap-2 mb-2\">\r\n {[\r\n { label: t('workflows.steps.form.delayPresets.5min'), value: 5 },\r\n { label: t('workflows.steps.form.delayPresets.15min'), value: 15 },\r\n { label: t('workflows.steps.form.delayPresets.1hour'), value: 60 },\r\n { label: t('workflows.steps.form.delayPresets.24hours'), value: 1440 }\r\n ].map(preset => (\r\n <button\r\n key={preset.value}\r\n type=\"button\"\r\n onClick={() => setFormData(prev => ({ ...prev, delayMinutes: preset.value }))}\r\n className={`px-2 py-1 text-xs rounded border transition-colors ${\r\n formData.delayMinutes === preset.value\r\n ? 'bg-[var(--color-accent-100)] border-[var(--color-accent-500)] text-[var(--color-accent-700)]'\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n {preset.label}\r\n </button>\r\n ))}\r\n </div>\r\n <input\r\n type=\"number\"\r\n min={1}\r\n value={formData.delayMinutes}\r\n onChange={e => setFormData(prev => ({ ...prev, delayMinutes: parseInt(e.target.value) || 1 }))}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n )}\r\n\r\n {formData.stepType === 'Condition' && (\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.steps.form.condition')}\r\n </label>\r\n <textarea\r\n value={formData.configurationJson}\r\n onChange={e => setFormData(prev => ({ ...prev, configurationJson: e.target.value }))}\r\n rows={4}\r\n placeholder='{\"field\": \"value\", \"operator\": \"equals\"}'\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] font-mono text-sm focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] resize-none\"\r\n />\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {t('workflows.steps.form.conditionHelp')}\r\n </p>\r\n </div>\r\n )}\r\n\r\n {formData.stepType === 'Webhook' && (\r\n <>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.steps.form.webhookUrl')}\r\n </label>\r\n <input\r\n type=\"url\"\r\n value={formData.configurationJson ? (() => {\r\n try {\r\n return JSON.parse(formData.configurationJson).url || '';\r\n } catch {\r\n return '';\r\n }\r\n })() : ''}\r\n onChange={e => {\r\n const config = formData.configurationJson ? JSON.parse(formData.configurationJson) : {};\r\n config.url = e.target.value;\r\n setFormData(prev => ({ ...prev, configurationJson: JSON.stringify(config) }));\r\n }}\r\n placeholder={t('workflows.steps.form.webhookUrlPlaceholder')}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.steps.form.webhookMethod')}\r\n </label>\r\n <select\r\n value={formData.configurationJson ? (() => {\r\n try {\r\n return JSON.parse(formData.configurationJson).method || 'POST';\r\n } catch {\r\n return 'POST';\r\n }\r\n })() : 'POST'}\r\n onChange={e => {\r\n const config = formData.configurationJson ? JSON.parse(formData.configurationJson) : {};\r\n config.method = e.target.value;\r\n setFormData(prev => ({ ...prev, configurationJson: JSON.stringify(config) }));\r\n }}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n >\r\n <option value=\"POST\">POST</option>\r\n <option value=\"PUT\">PUT</option>\r\n <option value=\"PATCH\">PATCH</option>\r\n <option value=\"GET\">GET</option>\r\n </select>\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* Actions */}\r\n <div className=\"flex justify-end gap-3 pt-4 border-t border-[var(--border-color)]\">\r\n <button\r\n type=\"button\"\r\n onClick={onClose}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={loading}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {loading && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default WorkflowStepsEditor;\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useParams, useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n ArrowLeft,\r\n Loader2,\r\n Save,\r\n AlertTriangle,\r\n CheckCircle,\r\n Lock,\r\n ListOrdered\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n communicationsApi,\r\n type WorkflowDetailDto,\r\n type UpdateWorkflowRequest\r\n} from '@/services/api/communicationsApi';\r\nimport { WorkflowStepsEditor } from '@/components/platform/administration/workflows/WorkflowStepsEditor';\r\n\r\ntype TabId = 'info' | 'steps';\r\n\r\nexport function WorkflowEditPage(): ReactElement {\r\n const { t } = useTranslation('communications');\r\n const { id: workflowId } = useParams<{ id: string }>();\r\n const navigate = useNavigate();\r\n\r\n const [workflow, setWorkflow] = useState<WorkflowDetailDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [saving, setSaving] = useState(false);\r\n const [activeTab, setActiveTab] = useState<TabId>('info');\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n const [formData, setFormData] = useState({\r\n name: '',\r\n description: '',\r\n priority: 0\r\n });\r\n\r\n const loadWorkflow = useCallback(async () => {\r\n if (!workflowId) return;\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const data = await communicationsApi.workflows.getById(workflowId);\r\n setWorkflow(data);\r\n setFormData({\r\n name: data.name,\r\n description: data.description || '',\r\n priority: data.priority\r\n });\r\n } catch (err) {\r\n console.error('Failed to load workflow:', err);\r\n setError(t('workflows.edit.errors.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [workflowId, t]);\r\n\r\n useEffect(() => {\r\n loadWorkflow();\r\n }, [loadWorkflow]);\r\n\r\n const handleSave = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!workflowId || !workflow) return;\r\n\r\n if (workflow.isSystem) {\r\n setError(t('workflows.edit.errors.cannotEditSystem'));\r\n return;\r\n }\r\n\r\n setSaving(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const updateData: UpdateWorkflowRequest = {\r\n name: formData.name,\r\n description: formData.description || undefined,\r\n triggerId: workflow.triggerId,\r\n priority: formData.priority\r\n };\r\n await communicationsApi.workflows.update(workflowId, updateData);\r\n setSuccess(t('workflows.edit.success.saved'));\r\n loadWorkflow();\r\n } catch (err: unknown) {\r\n setError(err instanceof Error ? err.message : t('workflows.edit.errors.saveFailed'));\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleStepsChange = () => {\r\n // Reload workflow to get updated steps\r\n loadWorkflow();\r\n };\r\n\r\n const tabs: { id: TabId; label: string; icon: React.ReactNode }[] = [\r\n { id: 'info', label: t('workflows.edit.tabs.info'), icon: <Save className=\"w-4 h-4\" /> },\r\n { id: 'steps', label: t('workflows.edit.tabs.steps'), icon: <ListOrdered className=\"w-4 h-4\" /> }\r\n ];\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (!workflow) {\r\n return (\r\n <div className=\"text-center py-12\">\r\n <p className=\"text-[var(--text-secondary)]\">{t('workflows.detail.notFound')}</p>\r\n <button\r\n onClick={() => navigate('/administration/workflows/list')}\r\n className=\"mt-4 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white\"\r\n >\r\n {t('workflows.backToList')}\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n // System workflows cannot be edited\r\n if (workflow.isSystem) {\r\n return (\r\n <div className=\"space-y-6\">\r\n <div className=\"flex items-center gap-4\">\r\n <button\r\n onClick={() => navigate(`/administration/workflows/${workflowId}`)}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n <h1 className=\"text-xl sm:text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('workflows.edit.title')}\r\n </h1>\r\n </div>\r\n <div className=\"p-6 rounded-[var(--radius-card)] bg-[var(--warning-bg)] border border-[var(--warning-border)] text-[var(--warning-text)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <Lock className=\"w-6 h-6\" />\r\n <div>\r\n <h3 className=\"font-semibold\">{t('workflows.edit.systemWorkflow')}</h3>\r\n <p className=\"text-sm mt-1\">{t('workflows.detail.systemReadOnly')}</p>\r\n </div>\r\n </div>\r\n </div>\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('header.title'), href: '/administration' },\r\n { label: t('workflows.title'), href: '/administration/workflows' },\r\n { label: workflow?.name || '' }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center gap-4\">\r\n <button\r\n onClick={() => navigate(`/administration/workflows/${workflowId}`)}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <h1 className=\"text-xl sm:text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('workflows.edit.title')}: {workflow.name}\r\n </h1>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1 font-mono\">{workflow.code}</p>\r\n </div>\r\n </div>\r\n\r\n {/* Alerts */}\r\n {error && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)] text-[var(--error-text)] flex items-center gap-2\">\r\n <AlertTriangle className=\"w-5 h-5 flex-shrink-0\" />\r\n {error}\r\n </div>\r\n )}\r\n {success && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--success-bg)] border border-[var(--success-border)] text-[var(--success-text)] flex items-center gap-2\">\r\n <CheckCircle className=\"w-5 h-5 flex-shrink-0\" />\r\n {success}\r\n </div>\r\n )}\r\n\r\n {/* Tabs */}\r\n <div className=\"flex gap-1 p-1 bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n {tabs.map(tab => (\r\n <button\r\n key={tab.id}\r\n onClick={() => setActiveTab(tab.id)}\r\n className={`flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium transition-colors ${\r\n activeTab === tab.id\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n {tab.icon}\r\n <span className=\"hidden sm:inline\">{tab.label}</span>\r\n {tab.id === 'steps' && (\r\n <span className={`ml-1 px-1.5 py-0.5 rounded text-xs ${\r\n activeTab === tab.id ? 'bg-white/20' : 'bg-[var(--bg-tertiary)]'\r\n }`}>\r\n {workflow.steps.length}\r\n </span>\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div className=\"bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4 sm:p-6\">\r\n {/* Info Tab */}\r\n {activeTab === 'info' && (\r\n <form onSubmit={handleSave} className=\"space-y-6 max-w-2xl\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.form.code')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-secondary)] font-mono text-sm cursor-not-allowed\">\r\n {workflow.code}\r\n </div>\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {t('workflows.edit.codeReadOnly')}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.form.name')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={formData.name}\r\n onChange={e => setFormData(prev => ({ ...prev, name: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.form.description')}\r\n </label>\r\n <textarea\r\n value={formData.description}\r\n onChange={e => setFormData(prev => ({ ...prev, description: e.target.value }))}\r\n rows={3}\r\n placeholder={t('workflows.form.descriptionPlaceholder')}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] resize-none\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.form.trigger')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] bg-[var(--bg-tertiary)] text-[var(--text-primary)]\">\r\n <div className=\"font-medium\">{workflow.triggerName}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)] font-mono\">{workflow.triggerCode}</div>\r\n </div>\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {t('workflows.edit.triggerReadOnly')}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('workflows.form.priority')}\r\n </label>\r\n <input\r\n type=\"number\"\r\n min={0}\r\n max={100}\r\n value={formData.priority}\r\n onChange={e => setFormData(prev => ({ ...prev, priority: parseInt(e.target.value) || 0 }))}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {t('workflows.form.priorityHelp')}\r\n </p>\r\n </div>\r\n\r\n <div className=\"flex justify-end gap-3 pt-4\">\r\n <button\r\n type=\"button\"\r\n onClick={() => navigate(`/administration/workflows/${workflowId}`)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={saving}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {saving ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </form>\r\n )}\r\n\r\n {/* Steps Tab */}\r\n {activeTab === 'steps' && workflowId && (\r\n <WorkflowStepsEditor\r\n workflowId={workflowId}\r\n steps={workflow.steps}\r\n onStepsChange={handleStepsChange}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default WorkflowEditPage;\r\n","import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport { History } from 'lucide-react';\r\nimport { UnderDevelopment } from '@/components/ui/UnderDevelopment';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\n/**\r\n * Workflow History / Dashboard Page\r\n *\r\n * This page will display workflow execution analytics and history.\r\n * Requires backend implementation of:\r\n * - WorkflowExecution entity\r\n * - Analytics endpoints (GET /api/administration/communications/workflows/analytics/*)\r\n *\r\n * Planned features:\r\n * - KPIs: Total executions, success rate, failures, avg latency\r\n * - Charts: Executions over time, workflow distribution\r\n * - Recent activity list\r\n * - Alerts panel\r\n * - Export functionality\r\n */\r\nexport function WorkflowHistoryPage(): ReactElement {\r\n const { t } = useTranslation('communications');\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('workflows.title'), href: '/administration/workflows' },\r\n { label: t('dashboard.title', 'History') }\r\n ]}\r\n />\r\n\r\n <UnderDevelopment\r\n title={t('dashboard.title')}\r\n description={t('dashboard.underDevelopment', 'Le tableau de bord des workflows sera disponible prochainement. Il affichera les statistiques d\\'exécution, les graphiques de performance et l\\'historique des workflows.')}\r\n icon={<History className=\"w-10 h-10 text-amber-600\" />}\r\n showBackButton={true}\r\n backUrl=\"/administration/workflows\"\r\n />\r\n </div>\r\n );\r\n}\r\n"],"names":["communicationsApi","params","api","id","code","data","templateId","languageCode","workflowId","stepId","stepOrder","EmailTemplatesListPage","useTranslation","navigate","useNavigate","currentTenant","isGlobalView","useTenant","templates","setTemplates","useState","loading","setLoading","search","setSearch","viewMode","setViewMode","page","setPage","pageSize","loadTemplates","useCallback","err","useEffect","handleSearch","e","handleDelete","template","startIndex","paginatedTemplates","totalPages","templatesByCategory","t","getCategoryLabel","category","renderTableView","jsx","jsxs","Loader2","Mail","Languages","StatusBadge","Eye","Edit2","Trash2","getCardsViewContent","TemplateCard","renderCardsView","getCategoryDotColor","renderTemplateCard","renderKanbanView","Fragment","categoryTemplates","Breadcrumb","PageHeader","Plus","Search","Filter","ViewToggle","Pagination","EmailTemplateCreatePage","saving","setSaving","error","setError","formData","setFormData","handleSubmit","message","ArrowLeft","prev","Save","DEFAULT_USER_VARIABLES","DEFAULT_EMAIL_VARIABLES","EmailTemplateDetailPage","i18n","useParams","setTemplate","searchParams","setSearchParams","useSearchParams","activeTab","setActiveTab","tab","success","setSuccess","actionLoading","setActionLoading","showDeleteConfirm","setShowDeleteConfirm","previewLang","setPreviewLang","previewContent","setPreviewContent","previewLoading","setPreviewLoading","selectedPreviewLanguage","setSelectedPreviewLanguage","loadTemplate","handleActivate","handleDeactivate","handlePreview","preview","closePreview","templateVariables","useMemo","customVariables","parsed","v","name","value","currentLang","matchingTranslation","tr","currentPreviewTranslation","tabs","Settings","getLanguageLabel","Edit","Pause","Play","AlertTriangle","CheckCircle","Link","FileText","Code","VariableSection","translation","TranslationCard","onPreview","expanded","setExpanded","ChevronUp","ChevronDown","title","variables","defaultExpanded","variable","VariableItem","copied","setCopied","variableSyntax","handleCopy","Check","Copy","EmailEditor","content","onChange","placeholder","className","mode","setMode","codeContent","setCodeContent","linkUrl","setLinkUrl","showLinkInput","setShowLinkInput","imageUrl","setImageUrl","showImageInput","setShowImageInput","editor","useEditor","StarterKit","Image","Placeholder","TextAlign","Underline","TextStyle","Color","Highlight","html","handleCodeChange","newContent","switchToVisual","switchToCode","addLink","removeLink","addImage","insertVariable","varName","ToolbarButton","onClick","isActive","disabled","children","ToolbarDivider","Undo","Redo","Heading1","Heading2","Heading3","Bold","Italic","UnderlineIcon","Strikethrough","AlignLeft","AlignCenter","AlignRight","List","ListOrdered","Quote","Minus","LinkIcon","X","ImageIcon","Palette","color","Highlighter","EditorContent","Editor","SUPPORTED_LANGUAGES","PREVIEW_SAMPLE_VALUES","generateFallbackValue","lowerName","replaceVariablesForPreview","result","_match","EmailTemplateEditPage","editingTranslation","setEditingTranslation","isNewTranslation","setIsNewTranslation","savingTranslation","setSavingTranslation","showPreview","setShowPreview","fullscreenPreview","setFullscreenPreview","handleSave","handleAddTranslation","existingLangs","availableLangs","lang","handleEditTranslation","handleSaveTranslation","handleDeleteTranslation","Columns","VariableSectionEdit","varSyntax","Maximize2","Minimize2","onInsert","VariableBadgeInsert","handleClick","SmsTemplatesListPage","MessageSquare","UnderDevelopment","WorkflowsListPage","workflows","setWorkflows","loadWorkflows","handleToggleActive","workflow","paginatedWorkflows","activeWorkflows","w","inactiveWorkflows","Workflow","Zap","WorkflowsTriggersPage","triggers","setTriggers","selectedTrigger","setSelectedTrigger","getTriggerTypeStyles","type","parseVariables","variablesJson","trigger","Info","WorkflowCreatePage","loadingTriggers","setLoadingTriggers","stepTypeIcons","Clock","GitBranch","Webhook","stepTypeColors","WorkflowDetailPage","setWorkflow","loadWorkflow","Lock","a","b","step","index","StepCard","isLast","stepIcon","stepColor","getStepDetails","stepTypes","WorkflowStepsEditor","steps","onStepsChange","readOnly","showAddModal","setShowAddModal","showEditModal","setShowEditModal","editingStep","setEditingStep","emailTemplates","setEmailTemplates","loadingTemplates","setLoadingTemplates","loadEmailTemplates","resetForm","handleOpenAddModal","handleOpenEditModal","handleOpenDeleteConfirm","handleAddStep","request","handleUpdateStep","handleDeleteStep","handleMoveStep","direction","sortedSteps","currentIndex","s","newIndex","otherStep","otherRequest","timer","StepRow","StepFormModal","isFirst","onEdit","onDelete","onMoveUp","onMoveDown","onSubmit","onClose","preset","config","WorkflowEditPage","updateData","handleStepsChange","WorkflowHistoryPage","History"],"mappings":"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"}
|