@atlashub/smartstack 3.21.0 → 3.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js → AgentSkillsPage-BWQSCYl-.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js.map → AgentSkillsPage-BWQSCYl-.js.map} +1 -1
- package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js → AgentSkillsPage-IQcMnBaD.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js.map → AgentSkillsPage-IQcMnBaD.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js → AgentWorkloadPage-DqrjkvWL.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js.map → AgentWorkloadPage-DqrjkvWL.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js → AgentWorkloadPage-w-HiyFYP.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js.map → AgentWorkloadPage-w-HiyFYP.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js → ApiCatalogDetailPage-D3L8Yf4G.js} +3 -3
- package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js.map → ApiCatalogDetailPage-D3L8Yf4G.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js → ApiCatalogDetailPage-MPT3Kz6H.js} +2 -2
- package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js.map → ApiCatalogDetailPage-MPT3Kz6H.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js → ApiCatalogPage-D4Hg3uiS.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js.map → ApiCatalogPage-D4Hg3uiS.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js → ApiCatalogPage-DRg5Cz0r.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js.map → ApiCatalogPage-DRg5Cz0r.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js → ApplicationDetailPage-Caizuyn2.js} +2 -2
- package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js.map → ApplicationDetailPage-Caizuyn2.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js → ApplicationDetailPage-CuCW6aMB.js} +4 -4
- package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js.map → ApplicationDetailPage-CuCW6aMB.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js → ApplicationsDashboardPage-B2MW8-Kc.js} +2 -2
- package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js.map → ApplicationsDashboardPage-B2MW8-Kc.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js → ApplicationsDashboardPage-BDIjFIYZ.js} +3 -3
- package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js.map → ApplicationsDashboardPage-BDIjFIYZ.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js → ApplicationsGridPage-DV-FihKj.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js.map → ApplicationsGridPage-DV-FihKj.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js → ApplicationsGridPage-DXsTfXPI.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js.map → ApplicationsGridPage-DXsTfXPI.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js → ApplicationsListPage--CGkyBuJ.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js.map → ApplicationsListPage--CGkyBuJ.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-C91v2rZt.js → ApplicationsListPage-JUX823bh.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-C91v2rZt.js.map → ApplicationsListPage-JUX823bh.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-BCbgotIx.js → ApplicationsPage-6zgFye6w.js} +2 -2
- package/dist/chunks/{ApplicationsPage-BCbgotIx.js.map → ApplicationsPage-6zgFye6w.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js → ApplicationsPage-CQPuuiO6.js} +4 -4
- package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js.map → ApplicationsPage-CQPuuiO6.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js → AssignmentRulesPage-CFffeEbo.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js.map → AssignmentRulesPage-CFffeEbo.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js → AssignmentRulesPage-D78UeUId.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js.map → AssignmentRulesPage-D78UeUId.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-DmfBYQAD.js → AssignmentsPage-Cww2ifZF.js} +2 -2
- package/dist/chunks/{AssignmentsPage-DmfBYQAD.js.map → AssignmentsPage-Cww2ifZF.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-sRCCBmRc.js → AssignmentsPage-DE_QS2LO.js} +2 -2
- package/dist/chunks/{AssignmentsPage-sRCCBmRc.js.map → AssignmentsPage-DE_QS2LO.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js → AuthCallbackPage-CA2nO6DG.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js.map → AuthCallbackPage-CA2nO6DG.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js → AuthCallbackPage-CDUAoX-N.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js.map → AuthCallbackPage-CDUAoX-N.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js → ConfirmEmailPage-BqsILAYH.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js.map → ConfirmEmailPage-BqsILAYH.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js → ConfirmEmailPage-INeHCuMB.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js.map → ConfirmEmailPage-INeHCuMB.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js → CreateSupportTicketPage-BWeuV2aU.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js.map → CreateSupportTicketPage-BWeuV2aU.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js → CreateSupportTicketPage-OBwF4v7b.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js.map → CreateSupportTicketPage-OBwF4v7b.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CUZ80NGV.js → DashboardPage-CKHqWrdS.js} +3 -3
- package/dist/chunks/{DashboardPage-CUZ80NGV.js.map → DashboardPage-CKHqWrdS.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CaNOAstg.js → DashboardPage-COmc9b__.js} +3 -3
- package/dist/chunks/{DashboardPage-CaNOAstg.js.map → DashboardPage-COmc9b__.js.map} +1 -1
- package/dist/chunks/{DashboardPage-B48_rQFi.js → DashboardPage-CfKZHiSj.js} +2 -2
- package/dist/chunks/{DashboardPage-B48_rQFi.js.map → DashboardPage-CfKZHiSj.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CUZV1J9t.js → DashboardPage-CwEZZ3jx.js} +2 -2
- package/dist/chunks/{DashboardPage-CUZV1J9t.js.map → DashboardPage-CwEZZ3jx.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js → EscalationConfigPage--7lgZ0kJ.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js.map → EscalationConfigPage--7lgZ0kJ.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js → EscalationConfigPage-DPyiBcqV.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js.map → EscalationConfigPage-DPyiBcqV.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js → ForceChangePasswordPage-BE-6umub.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js.map → ForceChangePasswordPage-BE-6umub.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js → ForceChangePasswordPage-CnsYoWmV.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js.map → ForceChangePasswordPage-CnsYoWmV.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js → ForgotPasswordPage-CSq4DnFF.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js.map → ForgotPasswordPage-CSq4DnFF.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js → ForgotPasswordPage-DZLVolAC.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js.map → ForgotPasswordPage-DZLVolAC.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-DFBvVO1S.js → GroupDetailPage-Bf9Wb_2j.js} +5 -5
- package/dist/chunks/{GroupDetailPage-DFBvVO1S.js.map → GroupDetailPage-Bf9Wb_2j.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-B2FkKrGG.js → GroupDetailPage-R-hf3rJ7.js} +2 -2
- package/dist/chunks/{GroupDetailPage-B2FkKrGG.js.map → GroupDetailPage-R-hf3rJ7.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js → MyAccessRequestsPage-BIisvWM6.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js.map → MyAccessRequestsPage-BIisvWM6.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js → MyAccessRequestsPage-BLSV7Tbx.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js.map → MyAccessRequestsPage-BLSV7Tbx.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-BEcYYdGR.js → MyTenantsPage-D-7k9CP1.js} +3 -3
- package/dist/chunks/{MyTenantsPage-BEcYYdGR.js.map → MyTenantsPage-D-7k9CP1.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-D9f85zjF.js → MyTenantsPage-DqGW6aDt.js} +2 -2
- package/dist/chunks/{MyTenantsPage-D9f85zjF.js.map → MyTenantsPage-DqGW6aDt.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DJR8h6y1.js → MyTicketsPage--DgDsnZA.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DJR8h6y1.js.map → MyTicketsPage--DgDsnZA.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DiOUExKJ.js → MyTicketsPage-CqJ3Aqob.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DiOUExKJ.js.map → MyTicketsPage-CqJ3Aqob.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js → NavigationAppsPage-Bebis_RT.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js.map → NavigationAppsPage-Bebis_RT.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-If7tmCFY.js → NavigationAppsPage-THNPOAjv.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-If7tmCFY.js.map → NavigationAppsPage-THNPOAjv.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-C29Lln5o.js → NotificationsPage-CAbNW_Cn.js} +2 -2
- package/dist/chunks/{NotificationsPage-C29Lln5o.js.map → NotificationsPage-CAbNW_Cn.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-BiaLRb0s.js → NotificationsPage-DxwizUhL.js} +2 -2
- package/dist/chunks/{NotificationsPage-BiaLRb0s.js.map → NotificationsPage-DxwizUhL.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js → OnboardingWizardPage-C6HlbJ3K.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js.map → OnboardingWizardPage-C6HlbJ3K.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js → OnboardingWizardPage-CyC2zONO.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js.map → OnboardingWizardPage-CyC2zONO.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js → PermissionDetailPage-BDHiNgky.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js.map → PermissionDetailPage-BDHiNgky.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js → PermissionDetailPage-C5K17ydY.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js.map → PermissionDetailPage-C5K17ydY.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-l0PnY-EE.js → PermissionsPage-COI5LJPo.js} +2 -2
- package/dist/chunks/{PermissionsPage-l0PnY-EE.js.map → PermissionsPage-COI5LJPo.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-DLy9U3P3.js → PermissionsPage-CkOwH2_d.js} +2 -2
- package/dist/chunks/{PermissionsPage-DLy9U3P3.js.map → PermissionsPage-CkOwH2_d.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-DFBx38-x.js → PortalDashboardPage-CoEC4CmC.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-DFBx38-x.js.map → PortalDashboardPage-CoEC4CmC.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js → PortalDashboardPage-DrYymEf-.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js.map → PortalDashboardPage-DrYymEf-.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-BBu8yZQB.js → PreferencesPage-CJRaU3ba.js} +2 -2
- package/dist/chunks/{PreferencesPage-BBu8yZQB.js.map → PreferencesPage-CJRaU3ba.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-B81MsNV1.js → PreferencesPage-Cqr9mAab.js} +2 -2
- package/dist/chunks/{PreferencesPage-B81MsNV1.js.map → PreferencesPage-Cqr9mAab.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DDrl10zj.js → ProfilePage-BZVpg6-l.js} +2 -2
- package/dist/chunks/{ProfilePage-DDrl10zj.js.map → ProfilePage-BZVpg6-l.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DPoXwdnc.js → ProfilePage-Cu_FITeL.js} +2 -2
- package/dist/chunks/{ProfilePage-DPoXwdnc.js.map → ProfilePage-Cu_FITeL.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js → ReferencesManagementPage-DUlVk9Ps.js} +3 -3
- package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js.map → ReferencesManagementPage-DUlVk9Ps.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js → ReferencesManagementPage-ZCuYtqd7.js} +2 -2
- package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js.map → ReferencesManagementPage-ZCuYtqd7.js.map} +1 -1
- package/dist/chunks/{RegisterPage-CiQib3-6.js → RegisterPage-C4xmVwh9.js} +2 -2
- package/dist/chunks/{RegisterPage-CiQib3-6.js.map → RegisterPage-C4xmVwh9.js.map} +1 -1
- package/dist/chunks/{RegisterPage-bXCcJD88.js → RegisterPage-DGyzoIHT.js} +2 -2
- package/dist/chunks/{RegisterPage-bXCcJD88.js.map → RegisterPage-DGyzoIHT.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js → ResetPasswordPage-DqDD6VPR.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js.map → ResetPasswordPage-DqDD6VPR.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-CubPG3yv.js → ResetPasswordPage-Glu-aeqv.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-CubPG3yv.js.map → ResetPasswordPage-Glu-aeqv.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-Bg7XZmR1.js → ResolutionModal-CxjANAOP.js} +2 -2
- package/dist/chunks/{ResolutionModal-Bg7XZmR1.js.map → ResolutionModal-CxjANAOP.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-DqRk_T0n.js → ResolutionModal-Duat18qV.js} +2 -2
- package/dist/chunks/{ResolutionModal-DqRk_T0n.js.map → ResolutionModal-Duat18qV.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-Blau6_4c.js → RoleDetailPage-BQffUSnt.js} +3 -3
- package/dist/chunks/{RoleDetailPage-Blau6_4c.js.map → RoleDetailPage-BQffUSnt.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-CiRVxxIP.js → RoleDetailPage-JTm5lD1_.js} +2 -2
- package/dist/chunks/{RoleDetailPage-CiRVxxIP.js.map → RoleDetailPage-JTm5lD1_.js.map} +1 -1
- package/dist/chunks/{RolesPage-Pm-RN3lP.js → RolesPage-B9rRzciI.js} +2 -2
- package/dist/chunks/{RolesPage-Pm-RN3lP.js.map → RolesPage-B9rRzciI.js.map} +1 -1
- package/dist/chunks/{RolesPage-Cb8joqdJ.js → RolesPage-BN8_zMOC.js} +2 -2
- package/dist/chunks/{RolesPage-Cb8joqdJ.js.map → RolesPage-BN8_zMOC.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-B86McKM6.js → SlaConfigPage-B7kZNig4.js} +2 -2
- package/dist/chunks/{SlaConfigPage-B86McKM6.js.map → SlaConfigPage-B7kZNig4.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-BY7gvYU6.js → SlaConfigPage-okvZfA_K.js} +2 -2
- package/dist/chunks/{SlaConfigPage-BY7gvYU6.js.map → SlaConfigPage-okvZfA_K.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js → SupportPermissionsPage-DGAPqJbl.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js.map → SupportPermissionsPage-DGAPqJbl.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js → SupportPermissionsPage-Dg_wLOme.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js.map → SupportPermissionsPage-Dg_wLOme.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-BDguJ401.js → TemplatesPage-DT9fhlAU.js} +2 -2
- package/dist/chunks/{TemplatesPage-BDguJ401.js.map → TemplatesPage-DT9fhlAU.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-DdnGgioU.js → TemplatesPage-DiEk538p.js} +2 -2
- package/dist/chunks/{TemplatesPage-DdnGgioU.js.map → TemplatesPage-DiEk538p.js.map} +1 -1
- package/dist/chunks/{TenantCard-ffwWsgFQ.js → TenantCard-BbSYk9_Z.js} +2 -2
- package/dist/chunks/{TenantCard-ffwWsgFQ.js.map → TenantCard-BbSYk9_Z.js.map} +1 -1
- package/dist/chunks/{TenantCard-CUjb6og9.js → TenantCard-CEkiKxcZ.js} +2 -2
- package/dist/chunks/{TenantCard-CUjb6og9.js.map → TenantCard-CEkiKxcZ.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js → TenantScopeSelector-BWfYxvEa.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js.map → TenantScopeSelector-BWfYxvEa.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js → TenantScopeSelector-D-BKgQPV.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js.map → TenantScopeSelector-D-BKgQPV.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-GOh9GX7E.js → TicketDetailPage-C1mNS9Up.js} +2 -2
- package/dist/chunks/{TicketDetailPage-GOh9GX7E.js.map → TicketDetailPage-C1mNS9Up.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-Du8WMyqf.js → TicketDetailPage-ieVDRh42.js} +2 -2
- package/dist/chunks/{TicketDetailPage-Du8WMyqf.js.map → TicketDetailPage-ieVDRh42.js.map} +1 -1
- package/dist/chunks/{TicketsPage-Bqd6moQy.js → TicketsPage-CnuWsnIW.js} +2 -2
- package/dist/chunks/{TicketsPage-Bqd6moQy.js.map → TicketsPage-CnuWsnIW.js.map} +1 -1
- package/dist/chunks/{TicketsPage-WdU4Bb7M.js → TicketsPage-jjyY15_D.js} +2 -2
- package/dist/chunks/{TicketsPage-WdU4Bb7M.js.map → TicketsPage-jjyY15_D.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js → UserCreateTicketPage-B8Tvf-ag.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js.map → UserCreateTicketPage-B8Tvf-ag.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js → UserCreateTicketPage-DnOsDlfO.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js.map → UserCreateTicketPage-DnOsDlfO.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-BP5WeXPS.js → UserDashboardPage-BrtkJ-NB.js} +2 -2
- package/dist/chunks/{UserDashboardPage-BP5WeXPS.js.map → UserDashboardPage-BrtkJ-NB.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-B53C8fUq.js → UserDashboardPage-KLB5CQP5.js} +2 -2
- package/dist/chunks/{UserDashboardPage-B53C8fUq.js.map → UserDashboardPage-KLB5CQP5.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-B110bmGX.js → UserDetailPage-U7smBQoF.js} +5 -5
- package/dist/chunks/{UserDetailPage-B110bmGX.js.map → UserDetailPage-U7smBQoF.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-CV2VCE46.js → UserDetailPage-_J6lcKAU.js} +2 -2
- package/dist/chunks/{UserDetailPage-CV2VCE46.js.map → UserDetailPage-_J6lcKAU.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js → UserTicketDetailPage-CWoYQgH-.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js.map → UserTicketDetailPage-CWoYQgH-.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js → UserTicketDetailPage-DkufSlvZ.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js.map → UserTicketDetailPage-DkufSlvZ.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js → UsersGroupsPage-C38s2-Rq.js} +3 -3
- package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js.map → UsersGroupsPage-C38s2-Rq.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js → UsersGroupsPage-Dq3rAteo.js} +2 -2
- package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js.map → UsersGroupsPage-Dq3rAteo.js.map} +1 -1
- package/dist/chunks/{UsersPage-Bg7033pp.js → UsersPage-B5C5KEUR.js} +2 -2
- package/dist/chunks/{UsersPage-Bg7033pp.js.map → UsersPage-B5C5KEUR.js.map} +1 -1
- package/dist/chunks/{UsersPage-TYAfwPY1.js → UsersPage-CXC9Hvq6.js} +2 -2
- package/dist/chunks/{UsersPage-TYAfwPY1.js.map → UsersPage-CXC9Hvq6.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-DZeDvzwv.js → accessRequestsApi-B-4TJ5_U.js} +2 -2
- package/dist/chunks/{accessRequestsApi-DZeDvzwv.js.map → accessRequestsApi-B-4TJ5_U.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-ZXFPCid2.js → accessRequestsApi-DZSfThpd.js} +2 -2
- package/dist/chunks/{accessRequestsApi-ZXFPCid2.js.map → accessRequestsApi-DZSfThpd.js.map} +1 -1
- package/dist/chunks/{aiApi-CsH8DXgs.js → aiApi-B20Teu2v.js} +2 -2
- package/dist/chunks/{aiApi-CsH8DXgs.js.map → aiApi-B20Teu2v.js.map} +1 -1
- package/dist/chunks/{aiApi-CVPzFTXa.js → aiApi-DMGz-RPM.js} +2 -2
- package/dist/chunks/{aiApi-CVPzFTXa.js.map → aiApi-DMGz-RPM.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js → applicationAnalyticsApi-Bwa75Fzd.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js.map → applicationAnalyticsApi-Bwa75Fzd.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js → applicationAnalyticsApi-CLBqRPfN.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js.map → applicationAnalyticsApi-CLBqRPfN.js.map} +1 -1
- package/dist/chunks/{groupsApi-BgCk2fsp.js → groupsApi-QzXI-5xu.js} +2 -2
- package/dist/chunks/{groupsApi-BgCk2fsp.js.map → groupsApi-QzXI-5xu.js.map} +1 -1
- package/dist/chunks/{groupsApi-BIbG665N.js → groupsApi-hB9kSWEd.js} +2 -2
- package/dist/chunks/{groupsApi-BIbG665N.js.map → groupsApi-hB9kSWEd.js.map} +1 -1
- package/dist/chunks/{index-Cb3LotuT.js → index--NGcBYUu.js} +3 -3
- package/dist/chunks/{index-Cb3LotuT.js.map → index--NGcBYUu.js.map} +1 -1
- package/dist/chunks/{index-C33zcyF4.js → index--aPwOFjF.js} +2 -2
- package/dist/chunks/{index-C33zcyF4.js.map → index--aPwOFjF.js.map} +1 -1
- package/dist/chunks/{index-sMr9qND_.js → index-0VrOtwP0.js} +2 -2
- package/dist/chunks/{index-sMr9qND_.js.map → index-0VrOtwP0.js.map} +1 -1
- package/dist/chunks/{index-DDKetfKq.js → index-37U271aw.js} +2 -2
- package/dist/chunks/{index-DDKetfKq.js.map → index-37U271aw.js.map} +1 -1
- package/dist/chunks/{index-B9fS7ir6.js → index-B7qZTuQ-.js} +2 -2
- package/dist/chunks/{index-B9fS7ir6.js.map → index-B7qZTuQ-.js.map} +1 -1
- package/dist/chunks/{index-CdjBY7L8.js → index-Bedzmqr-.js} +2 -2
- package/dist/chunks/{index-CdjBY7L8.js.map → index-Bedzmqr-.js.map} +1 -1
- package/dist/chunks/{index-CHG_O1fS.js → index-Betxo5g5.js} +2 -2
- package/dist/chunks/{index-CHG_O1fS.js.map → index-Betxo5g5.js.map} +1 -1
- package/dist/chunks/{index-jiGu-H8x.js → index-BmaJz475.js} +2 -2
- package/dist/chunks/{index-jiGu-H8x.js.map → index-BmaJz475.js.map} +1 -1
- package/dist/chunks/{index-C53JoVNk.js → index-Buhqag3v.js} +2 -2
- package/dist/chunks/{index-C53JoVNk.js.map → index-Buhqag3v.js.map} +1 -1
- package/dist/chunks/{index-DO0Rw7hX.js → index-C3VxlfKq.js} +2 -2
- package/dist/chunks/{index-DO0Rw7hX.js.map → index-C3VxlfKq.js.map} +1 -1
- package/dist/chunks/{index-CSQ60fpG.js → index-CgpRo8Oe.js} +2 -2
- package/dist/chunks/{index-CSQ60fpG.js.map → index-CgpRo8Oe.js.map} +1 -1
- package/dist/chunks/{index-B-e-ELsf.js → index-DOY0w8Iu.js} +8 -8
- package/dist/chunks/{index-B-e-ELsf.js.map → index-DOY0w8Iu.js.map} +1 -1
- package/dist/chunks/{index-D2REDIRX.js → index-DwuvIOrQ.js} +2 -2
- package/dist/chunks/{index-D2REDIRX.js.map → index-DwuvIOrQ.js.map} +1 -1
- package/dist/chunks/{index-DCcl7Qof.js → index-DzedSLdI.js} +2 -2
- package/dist/chunks/{index-DCcl7Qof.js.map → index-DzedSLdI.js.map} +1 -1
- package/dist/chunks/{index-2wUhd9Lu.js → index-IgLVXPg8.js} +10 -10
- package/dist/chunks/index-IgLVXPg8.js.map +1 -0
- package/dist/chunks/{index-CwSaRXXg.js → index-lpIzhufD.js} +1916 -1900
- package/dist/chunks/index-lpIzhufD.js.map +1 -0
- package/dist/chunks/{index-Cuwn2q-f.js → index-mLUKwbGl.js} +4 -4
- package/dist/chunks/{index-Cuwn2q-f.js.map → index-mLUKwbGl.js.map} +1 -1
- package/dist/chunks/{index-B0mk2tNY.js → index-tO6MMIFB.js} +2 -2
- package/dist/chunks/{index-B0mk2tNY.js.map → index-tO6MMIFB.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-BpNANQ5s.js → tenantIconMap-BQD9byc8.js} +2 -2
- package/dist/chunks/{tenantIconMap-BpNANQ5s.js.map → tenantIconMap-BQD9byc8.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-DtdUgvJO.js → tenantIconMap-CTMuSt18.js} +2 -2
- package/dist/chunks/{tenantIconMap-DtdUgvJO.js.map → tenantIconMap-CTMuSt18.js.map} +1 -1
- package/dist/chunks/{ticketingApi-Bu4rKwLl.js → ticketingApi-BNIdox5t.js} +2 -2
- package/dist/chunks/{ticketingApi-Bu4rKwLl.js.map → ticketingApi-BNIdox5t.js.map} +1 -1
- package/dist/chunks/{ticketingApi-r4Avm9iS.js → ticketingApi-J0vC_t7r.js} +2 -2
- package/dist/chunks/{ticketingApi-r4Avm9iS.js.map → ticketingApi-J0vC_t7r.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-B9bF4swg.js → useAccessRequests-DCNNLnxk.js} +3 -3
- package/dist/chunks/{useAccessRequests-B9bF4swg.js.map → useAccessRequests-DCNNLnxk.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-JyPUX3Om.js → useAccessRequests-DT7X4FAK.js} +2 -2
- package/dist/chunks/{useAccessRequests-JyPUX3Om.js.map → useAccessRequests-DT7X4FAK.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-DjPQenC2.js → useUserAccessRequests-BYbmG4c7.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-DjPQenC2.js.map → useUserAccessRequests-BYbmG4c7.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-BB6FHW14.js → useUserAccessRequests-CylKxRN6.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-BB6FHW14.js.map → useUserAccessRequests-CylKxRN6.js.map} +1 -1
- package/dist/hooks/useCollapsibleState.d.ts +5 -2
- package/dist/hooks/useCollapsibleState.d.ts.map +1 -1
- package/dist/i18n/config.d.ts +1 -0
- package/dist/i18n/config.d.ts.map +1 -1
- package/dist/main.d.ts +0 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/smartstack.cjs +1 -1
- package/dist/smartstack.js +1 -1
- package/dist/utils/permissions.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/index-2wUhd9Lu.js.map +0 -1
- package/dist/chunks/index-CwSaRXXg.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReferencesManagementPage-DhVsuElE.js","sources":["../../src/services/api/referencesApi.ts","../../src/pages/platform/administration/users/ReferencesManagementPage.tsx"],"sourcesContent":["import { api, apiClient } from './apiClient';\r\nimport type { PaginatedResult } from '../../types/pagination';\r\n\r\n/**\r\n * Creates API methods with a specific tenant context.\r\n */\r\nconst withTenantContext = (tenantSlug?: string) => ({\r\n get: <T>(url: string, config?: Parameters<typeof apiClient.get>[1]) =>\r\n apiClient.get<T>(url, {\r\n ...config,\r\n headers: tenantSlug ? { ...config?.headers, 'X-Tenant-Slug': tenantSlug } : config?.headers,\r\n }).then(res => res.data),\r\n\r\n post: <T>(url: string, data?: unknown, config?: Parameters<typeof apiClient.post>[2]) =>\r\n apiClient.post<T>(url, data, {\r\n ...config,\r\n headers: tenantSlug ? { ...config?.headers, 'X-Tenant-Slug': tenantSlug } : config?.headers,\r\n }).then(res => res.data),\r\n\r\n put: <T>(url: string, data?: unknown, config?: Parameters<typeof apiClient.put>[2]) =>\r\n apiClient.put<T>(url, data, {\r\n ...config,\r\n headers: tenantSlug ? { ...config?.headers, 'X-Tenant-Slug': tenantSlug } : config?.headers,\r\n }).then(res => res.data),\r\n\r\n patch: <T>(url: string, data?: unknown, config?: Parameters<typeof apiClient.patch>[2]) =>\r\n apiClient.patch<T>(url, data, {\r\n ...config,\r\n headers: tenantSlug ? { ...config?.headers, 'X-Tenant-Slug': tenantSlug } : config?.headers,\r\n }).then(res => res.data),\r\n\r\n delete: <T>(url: string, config?: Parameters<typeof apiClient.delete>[1]) =>\r\n apiClient.delete<T>(url, {\r\n ...config,\r\n headers: tenantSlug ? { ...config?.headers, 'X-Tenant-Slug': tenantSlug } : config?.headers,\r\n }).then(res => res.data),\r\n});\r\n\r\n// Reference types\r\nexport const ReferenceType = {\r\n Company: 0,\r\n Department: 1,\r\n JobTitle: 2,\r\n Office: 3,\r\n} as const;\r\nexport type ReferenceType = typeof ReferenceType[keyof typeof ReferenceType];\r\n\r\n// Types\r\nexport interface ReferenceListDto {\r\n id: string;\r\n code: string;\r\n name: string;\r\n shortName: string | null;\r\n description: string | null;\r\n isActive: boolean;\r\n isMerged: boolean;\r\n mergedIntoId: string | null;\r\n isFromEntra: boolean;\r\n entraValue: string | null;\r\n userCount: number;\r\n createdAt: string;\r\n tenantId: string | null;\r\n tenantName: string | null;\r\n}\r\n\r\nexport interface OfficeListDto extends ReferenceListDto {\r\n address: string | null;\r\n city: string | null;\r\n country: string | null;\r\n}\r\n\r\nexport interface CreateReferenceRequest {\r\n code: string;\r\n name: string;\r\n shortName?: string | null;\r\n description?: string | null;\r\n}\r\n\r\nexport interface CreateOfficeRequest extends CreateReferenceRequest {\r\n address?: string | null;\r\n city?: string | null;\r\n country?: string | null;\r\n}\r\n\r\nexport interface UpdateReferenceRequest {\r\n name: string;\r\n shortName?: string | null;\r\n description?: string | null;\r\n}\r\n\r\nexport interface UpdateOfficeRequest extends UpdateReferenceRequest {\r\n address?: string | null;\r\n city?: string | null;\r\n country?: string | null;\r\n}\r\n\r\n// Merge Types\r\nexport interface MergeReferencesRequest {\r\n tenantId?: string | null;\r\n referenceType: ReferenceType;\r\n targetId: string;\r\n sourceIds: string[];\r\n reason?: string | null;\r\n}\r\n\r\nexport interface MergePreviewRequest {\r\n tenantId?: string | null;\r\n referenceType: ReferenceType;\r\n sourceIds: string[];\r\n}\r\n\r\nexport interface MergeResultDto {\r\n targetId: string;\r\n targetName: string;\r\n totalSourcesMerged: number;\r\n totalUsersReassigned: number;\r\n sourceResults: MergeSourceResultDto[];\r\n}\r\n\r\nexport interface MergeSourceResultDto {\r\n sourceId: string;\r\n sourceName: string;\r\n sourceCode: string;\r\n usersReassigned: number;\r\n}\r\n\r\nexport interface MergePreviewDto {\r\n sources: MergeSourcePreviewDto[];\r\n totalUsersAffected: number;\r\n}\r\n\r\nexport interface MergeSourcePreviewDto {\r\n id: string;\r\n code: string;\r\n name: string;\r\n shortName: string | null;\r\n userCount: number;\r\n}\r\n\r\nexport interface MergeHistoryDto {\r\n id: string;\r\n tenantId: string | null;\r\n referenceType: ReferenceType;\r\n targetReferenceId: string;\r\n targetReferenceName: string;\r\n sourceReferenceId: string;\r\n sourceReferenceName: string;\r\n sourceReferenceCode: string;\r\n sourceReferenceShortName: string | null;\r\n affectedUserCount: number;\r\n mergedByUserId: string;\r\n mergedByUserName: string;\r\n mergeReason: string | null;\r\n mergedAt: string;\r\n}\r\n\r\n\r\nconst BASE_URL = '/api/administration/users/references';\r\n\r\n/**\r\n * Factory function to create references API with explicit tenant context.\r\n * @param tenantSlug - Optional tenant slug to use for all requests\r\n */\r\nconst _createReferencesApi = (tenantSlug?: string) => {\r\n const apiContext = tenantSlug ? withTenantContext(tenantSlug) : api;\r\n\r\n const buildUrl = (path: string, tenantId?: string | null, params?: Record<string, string | boolean | number | undefined>) => {\r\n const urlParams = new URLSearchParams();\r\n if (tenantId) urlParams.append('tenantId', tenantId);\r\n if (params) {\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== undefined) urlParams.append(key, String(value));\r\n });\r\n }\r\n const queryString = urlParams.toString();\r\n return queryString ? `${BASE_URL}/${path}?${queryString}` : `${BASE_URL}/${path}`;\r\n };\r\n\r\n return {\r\n // === COMPANIES ===\r\n companies: {\r\n getAll: async (tenantId?: string | null, search?: string, isActive?: boolean, source?: 'entra' | 'manual', page: number = 1, pageSize: number = 20): Promise<PaginatedResult<ReferenceListDto>> => {\r\n const url = buildUrl('companies', tenantId, { search, isActive, source, page, pageSize });\r\n return apiContext.get<PaginatedResult<ReferenceListDto>>(url);\r\n },\r\n\r\n create: async (tenantId: string | null, data: CreateReferenceRequest): Promise<ReferenceListDto> => {\r\n const url = buildUrl('companies', tenantId);\r\n return apiContext.post<ReferenceListDto>(url, data);\r\n },\r\n\r\n update: async (id: string, data: UpdateReferenceRequest): Promise<void> => {\r\n await apiContext.put(`${BASE_URL}/companies/${id}`, data);\r\n },\r\n\r\n activate: async (id: string): Promise<void> => {\r\n await apiContext.patch(`${BASE_URL}/companies/${id}/activate`);\r\n },\r\n\r\n deactivate: async (id: string): Promise<void> => {\r\n await apiContext.patch(`${BASE_URL}/companies/${id}/deactivate`);\r\n },\r\n\r\n delete: async (id: string): Promise<void> => {\r\n await apiContext.delete(`${BASE_URL}/companies/${id}`);\r\n },\r\n },\r\n\r\n // === DEPARTMENTS ===\r\n departments: {\r\n getAll: async (tenantId?: string | null, search?: string, isActive?: boolean, source?: 'entra' | 'manual', page: number = 1, pageSize: number = 20): Promise<PaginatedResult<ReferenceListDto>> => {\r\n const url = buildUrl('departments', tenantId, { search, isActive, source, page, pageSize });\r\n return apiContext.get<PaginatedResult<ReferenceListDto>>(url);\r\n },\r\n\r\n create: async (tenantId: string | null, data: CreateReferenceRequest): Promise<ReferenceListDto> => {\r\n const url = buildUrl('departments', tenantId);\r\n return apiContext.post<ReferenceListDto>(url, data);\r\n },\r\n\r\n update: async (id: string, data: UpdateReferenceRequest): Promise<void> => {\r\n await apiContext.put(`${BASE_URL}/departments/${id}`, data);\r\n },\r\n\r\n activate: async (id: string): Promise<void> => {\r\n await apiContext.patch(`${BASE_URL}/departments/${id}/activate`);\r\n },\r\n\r\n deactivate: async (id: string): Promise<void> => {\r\n await apiContext.patch(`${BASE_URL}/departments/${id}/deactivate`);\r\n },\r\n\r\n delete: async (id: string): Promise<void> => {\r\n await apiContext.delete(`${BASE_URL}/departments/${id}`);\r\n },\r\n },\r\n\r\n // === JOB TITLES ===\r\n jobTitles: {\r\n getAll: async (tenantId?: string | null, search?: string, isActive?: boolean, source?: 'entra' | 'manual', page: number = 1, pageSize: number = 20): Promise<PaginatedResult<ReferenceListDto>> => {\r\n const url = buildUrl('job-titles', tenantId, { search, isActive, source, page, pageSize });\r\n return apiContext.get<PaginatedResult<ReferenceListDto>>(url);\r\n },\r\n\r\n create: async (tenantId: string | null, data: CreateReferenceRequest): Promise<ReferenceListDto> => {\r\n const url = buildUrl('job-titles', tenantId);\r\n return apiContext.post<ReferenceListDto>(url, data);\r\n },\r\n\r\n update: async (id: string, data: UpdateReferenceRequest): Promise<void> => {\r\n await apiContext.put(`${BASE_URL}/job-titles/${id}`, data);\r\n },\r\n\r\n activate: async (id: string): Promise<void> => {\r\n await apiContext.patch(`${BASE_URL}/job-titles/${id}/activate`);\r\n },\r\n\r\n deactivate: async (id: string): Promise<void> => {\r\n await apiContext.patch(`${BASE_URL}/job-titles/${id}/deactivate`);\r\n },\r\n\r\n delete: async (id: string): Promise<void> => {\r\n await apiContext.delete(`${BASE_URL}/job-titles/${id}`);\r\n },\r\n },\r\n\r\n // === OFFICES ===\r\n offices: {\r\n getAll: async (tenantId?: string | null, search?: string, isActive?: boolean, source?: 'entra' | 'manual', page: number = 1, pageSize: number = 20): Promise<PaginatedResult<OfficeListDto>> => {\r\n const url = buildUrl('offices', tenantId, { search, isActive, source, page, pageSize });\r\n return apiContext.get<PaginatedResult<OfficeListDto>>(url);\r\n },\r\n\r\n create: async (tenantId: string | null, data: CreateOfficeRequest): Promise<OfficeListDto> => {\r\n const url = buildUrl('offices', tenantId);\r\n return apiContext.post<OfficeListDto>(url, data);\r\n },\r\n\r\n update: async (id: string, data: UpdateOfficeRequest): Promise<void> => {\r\n await apiContext.put(`${BASE_URL}/offices/${id}`, data);\r\n },\r\n\r\n activate: async (id: string): Promise<void> => {\r\n await apiContext.patch(`${BASE_URL}/offices/${id}/activate`);\r\n },\r\n\r\n deactivate: async (id: string): Promise<void> => {\r\n await apiContext.patch(`${BASE_URL}/offices/${id}/deactivate`);\r\n },\r\n\r\n delete: async (id: string): Promise<void> => {\r\n await apiContext.delete(`${BASE_URL}/offices/${id}`);\r\n },\r\n },\r\n\r\n // === MERGE OPERATIONS ===\r\n merge: {\r\n execute: async (request: MergeReferencesRequest): Promise<MergeResultDto> => {\r\n return apiContext.post<MergeResultDto>(`${BASE_URL}/merge`, request);\r\n },\r\n\r\n preview: async (request: MergePreviewRequest): Promise<MergePreviewDto> => {\r\n return apiContext.post<MergePreviewDto>(`${BASE_URL}/merge/preview`, request);\r\n },\r\n\r\n getHistory: async (\r\n tenantId?: string | null,\r\n referenceType?: ReferenceType,\r\n from?: string,\r\n to?: string\r\n ): Promise<MergeHistoryDto[]> => {\r\n const params = new URLSearchParams();\r\n if (tenantId) params.append('tenantId', tenantId);\r\n if (referenceType !== undefined) params.append('referenceType', String(referenceType));\r\n if (from) params.append('from', from);\r\n if (to) params.append('to', to);\r\n\r\n const queryString = params.toString();\r\n const url = queryString ? `${BASE_URL}/merge/history?${queryString}` : `${BASE_URL}/merge/history`;\r\n return apiContext.get<MergeHistoryDto[]>(url);\r\n },\r\n },\r\n };\r\n};\r\nexport type ReferencesApi = ReturnType<typeof _createReferencesApi>;\r\nexport const createReferencesApi: (tenantSlug?: string) => ReferencesApi = _createReferencesApi;\r\n\r\n// Default export uses localStorage tenant slug (backward compatible)\r\nexport const referencesApi = createReferencesApi();\r\n","import { useState, useEffect, useCallback, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Building2, Briefcase, MapPin, Users, Search, Plus, Edit2, Trash2, GitMerge, MoreHorizontal, X, Loader2, History, Check, AlertCircle, Globe } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { useAdminTenants } from '@/hooks/useAdminTenants';\r\nimport { TenantScopeSelector, type ScopeValue } from '@/components/ui/TenantScopeSelector';\r\nimport {\r\n createReferencesApi,\r\n ReferenceType,\r\n} from '@/services/api/referencesApi';\r\nimport type {\r\n ReferenceListDto,\r\n MergePreviewDto,\r\n MergeHistoryDto,\r\n CreateReferenceRequest,\r\n UpdateReferenceRequest,\r\n} from '@/services/api/referencesApi';\r\n\r\ntype TabType = 'companies' | 'departments' | 'jobTitles' | 'offices';\r\n\r\ninterface Tab {\r\n id: TabType;\r\n label: string;\r\n icon: React.ElementType;\r\n referenceType: ReferenceType;\r\n}\r\n\r\nexport function ReferencesManagementPage(): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const { currentTenant, userTenants, switchTenant } = useTenant();\r\n const { tenants: adminTenantsList } = useAdminTenants();\r\n\r\n // Tenant scope selector state\r\n const [selectedScope, setSelectedScope] = useState<ScopeValue>(\r\n currentTenant ? { tenantId: currentTenant.id, tenantSlug: currentTenant.slug, tenantUserId: '', tenantName: currentTenant.name } : 'global'\r\n );\r\n const isGlobalScope = selectedScope === 'global';\r\n const selectedTenantId = isGlobalScope ? null : selectedScope.tenantId;\r\n const tenantSlug = isGlobalScope ? undefined : selectedScope.tenantSlug;\r\n const api = useMemo(() => createReferencesApi(tenantSlug), [tenantSlug]);\r\n\r\n // State\r\n const [activeTab, setActiveTab] = useState<TabType>('departments');\r\n const [items, setItems] = useState<ReferenceListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [search, setSearch] = useState('');\r\n const [showInactive, setShowInactive] = useState(false);\r\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\r\n\r\n // Pagination state\r\n const [page, setPage] = useState(1);\r\n const [pageSize] = useState(20);\r\n const [totalCount, setTotalCount] = useState(0);\r\n const [totalPages, setTotalPages] = useState(0);\r\n\r\n // Modal states\r\n const [showCreateModal, setShowCreateModal] = useState(false);\r\n const [showEditModal, setShowEditModal] = useState(false);\r\n const [showMergeModal, setShowMergeModal] = useState(false);\r\n const [showHistoryModal, setShowHistoryModal] = useState(false);\r\n const [editingItem, setEditingItem] = useState<ReferenceListDto | null>(null);\r\n const [mergePreview, setMergePreview] = useState<MergePreviewDto | null>(null);\r\n const [mergeHistory, setMergeHistory] = useState<MergeHistoryDto[]>([]);\r\n const [menuOpen, setMenuOpen] = useState<string | null>(null);\r\n\r\n // Form states\r\n const [formData, setFormData] = useState<CreateReferenceRequest>({ code: '', name: '' });\r\n const [mergeTargetId, setMergeTargetId] = useState<string | null>(null);\r\n const [mergeReason, setMergeReason] = useState('');\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const tabs: Tab[] = [\r\n { id: 'departments', label: t('references.tabs.departments', 'Departments'), icon: Users, referenceType: ReferenceType.Department },\r\n { id: 'companies', label: t('references.tabs.companies', 'Companies'), icon: Building2, referenceType: ReferenceType.Company },\r\n { id: 'jobTitles', label: t('references.tabs.jobTitles', 'Job Titles'), icon: Briefcase, referenceType: ReferenceType.JobTitle },\r\n { id: 'offices', label: t('references.tabs.offices', 'Offices'), icon: MapPin, referenceType: ReferenceType.Office },\r\n ];\r\n\r\n const currentTab = tabs.find(tab => tab.id === activeTab)!;\r\n const tenantId = selectedTenantId;\r\n\r\n const loadItems = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n // Create API instance inside callback to avoid dependency loop\r\n const apiInstance = createReferencesApi(tenantSlug ?? undefined);\r\n\r\n const isActiveFilter = showInactive ? undefined : true;\r\n\r\n let paginatedResult;\r\n\r\n switch (activeTab) {\r\n case 'companies':\r\n paginatedResult = await apiInstance.companies.getAll(tenantId, search || undefined, isActiveFilter, undefined, page, pageSize);\r\n break;\r\n case 'departments':\r\n paginatedResult = await apiInstance.departments.getAll(tenantId, search || undefined, isActiveFilter, undefined, page, pageSize);\r\n break;\r\n case 'jobTitles':\r\n paginatedResult = await apiInstance.jobTitles.getAll(tenantId, search || undefined, isActiveFilter, undefined, page, pageSize);\r\n break;\r\n case 'offices':\r\n paginatedResult = await apiInstance.offices.getAll(tenantId, search || undefined, isActiveFilter, undefined, page, pageSize);\r\n break;\r\n default:\r\n paginatedResult = { items: [], totalCount: 0, page: 1, pageSize: 20, totalPages: 0, hasPreviousPage: false, hasNextPage: false };\r\n }\r\n\r\n setItems(paginatedResult.items);\r\n setTotalCount(paginatedResult.totalCount);\r\n setTotalPages(paginatedResult.totalPages);\r\n setSelectedIds(new Set());\r\n } catch (err) {\r\n console.error('Failed to load references:', err);\r\n setError('Failed to load references');\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [tenantSlug, activeTab, tenantId, search, showInactive, page, pageSize]);\r\n\r\n useEffect(() => {\r\n loadItems();\r\n }, [loadItems]);\r\n\r\n // Reset to page 1 when filters change\r\n useEffect(() => {\r\n setPage(1);\r\n }, [activeTab, search, showInactive, selectedScope]);\r\n\r\n // Selection handlers\r\n const toggleSelection = (id: string) => {\r\n const newSelected = new Set(selectedIds);\r\n if (newSelected.has(id)) {\r\n newSelected.delete(id);\r\n } else {\r\n newSelected.add(id);\r\n }\r\n setSelectedIds(newSelected);\r\n };\r\n\r\n const toggleSelectAll = () => {\r\n if (selectedIds.size === items.length) {\r\n setSelectedIds(new Set());\r\n } else {\r\n setSelectedIds(new Set(items.map(item => item.id)));\r\n }\r\n };\r\n\r\n // Switch to a specific tenant from global view\r\n const handleSwitchToTenant = async (itemTenantId: string) => {\r\n try {\r\n await switchTenant(itemTenantId);\r\n const tenant = userTenants.find(t => t.id === itemTenantId);\r\n if (tenant) {\r\n setSelectedScope({ tenantId: tenant.id, tenantSlug: tenant.slug, tenantUserId: '', tenantName: tenant.name });\r\n }\r\n } catch (err) {\r\n console.error('Failed to switch tenant:', err);\r\n }\r\n };\r\n\r\n // CRUD handlers\r\n const handleCreate = async () => {\r\n if (!tenantId) return;\r\n\r\n try {\r\n setSaving(true);\r\n setError(null);\r\n\r\n switch (activeTab) {\r\n case 'companies':\r\n await api.companies.create(tenantId, formData);\r\n break;\r\n case 'departments':\r\n await api.departments.create(tenantId, formData);\r\n break;\r\n case 'jobTitles':\r\n await api.jobTitles.create(tenantId, formData);\r\n break;\r\n case 'offices':\r\n await api.offices.create(tenantId, formData);\r\n break;\r\n }\r\n\r\n setShowCreateModal(false);\r\n setFormData({ code: '', name: '' });\r\n loadItems();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'Failed to create';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleUpdate = async () => {\r\n if (!editingItem) return;\r\n\r\n try {\r\n setSaving(true);\r\n setError(null);\r\n\r\n const updateData: UpdateReferenceRequest = {\r\n name: formData.name,\r\n shortName: formData.shortName,\r\n description: formData.description,\r\n };\r\n\r\n switch (activeTab) {\r\n case 'companies':\r\n await api.companies.update(editingItem.id, updateData);\r\n break;\r\n case 'departments':\r\n await api.departments.update(editingItem.id, updateData);\r\n break;\r\n case 'jobTitles':\r\n await api.jobTitles.update(editingItem.id, updateData);\r\n break;\r\n case 'offices':\r\n await api.offices.update(editingItem.id, updateData);\r\n break;\r\n }\r\n\r\n setShowEditModal(false);\r\n setEditingItem(null);\r\n loadItems();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'Failed to update';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleDelete = async (id: string) => {\r\n if (!confirm(t('references.confirmDelete', 'Are you sure you want to delete this reference?'))) return;\r\n\r\n try {\r\n switch (activeTab) {\r\n case 'companies':\r\n await api.companies.delete(id);\r\n break;\r\n case 'departments':\r\n await api.departments.delete(id);\r\n break;\r\n case 'jobTitles':\r\n await api.jobTitles.delete(id);\r\n break;\r\n case 'offices':\r\n await api.offices.delete(id);\r\n break;\r\n }\r\n loadItems();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'Failed to delete';\r\n setError(message);\r\n }\r\n };\r\n\r\n const handleToggleActive = async (item: ReferenceListDto) => {\r\n try {\r\n if (item.isActive) {\r\n switch (activeTab) {\r\n case 'companies':\r\n await api.companies.deactivate(item.id);\r\n break;\r\n case 'departments':\r\n await api.departments.deactivate(item.id);\r\n break;\r\n case 'jobTitles':\r\n await api.jobTitles.deactivate(item.id);\r\n break;\r\n case 'offices':\r\n await api.offices.deactivate(item.id);\r\n break;\r\n }\r\n } else {\r\n switch (activeTab) {\r\n case 'companies':\r\n await api.companies.activate(item.id);\r\n break;\r\n case 'departments':\r\n await api.departments.activate(item.id);\r\n break;\r\n case 'jobTitles':\r\n await api.jobTitles.activate(item.id);\r\n break;\r\n case 'offices':\r\n await api.offices.activate(item.id);\r\n break;\r\n }\r\n }\r\n loadItems();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'Failed to toggle status';\r\n setError(message);\r\n }\r\n };\r\n\r\n // Merge handlers\r\n const openMergeModal = async () => {\r\n if (selectedIds.size < 2) return;\r\n\r\n try {\r\n const preview = await api.merge.preview({\r\n tenantId,\r\n referenceType: currentTab.referenceType,\r\n sourceIds: Array.from(selectedIds),\r\n });\r\n\r\n setMergePreview(preview);\r\n setMergeTargetId(null);\r\n setMergeReason('');\r\n setShowMergeModal(true);\r\n } catch (err) {\r\n console.error('Failed to get merge preview:', err);\r\n setError('Failed to preview merge');\r\n }\r\n };\r\n\r\n const handleMerge = async () => {\r\n if (!mergeTargetId || !mergePreview) return;\r\n\r\n const sourceIds = Array.from(selectedIds).filter(id => id !== mergeTargetId);\r\n\r\n try {\r\n setSaving(true);\r\n setError(null);\r\n\r\n await api.merge.execute({\r\n tenantId,\r\n referenceType: currentTab.referenceType,\r\n targetId: mergeTargetId,\r\n sourceIds,\r\n reason: mergeReason || undefined,\r\n });\r\n\r\n setShowMergeModal(false);\r\n setSelectedIds(new Set());\r\n setMergePreview(null);\r\n loadItems();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'Failed to merge';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const openHistoryModal = async () => {\r\n try {\r\n const history = await api.merge.getHistory(tenantId, currentTab.referenceType);\r\n setMergeHistory(history);\r\n setShowHistoryModal(true);\r\n } catch (err) {\r\n console.error('Failed to load merge history:', err);\r\n setError('Failed to load merge history');\r\n }\r\n };\r\n\r\n // Edit modal opener\r\n const openEditModal = (item: ReferenceListDto) => {\r\n setEditingItem(item);\r\n setFormData({\r\n code: item.code,\r\n name: item.name,\r\n shortName: item.shortName,\r\n description: item.description,\r\n });\r\n setShowEditModal(true);\r\n setMenuOpen(null);\r\n };\r\n\r\n // Render helpers\r\n const renderStatusBadge = (item: ReferenceListDto) => {\r\n if (item.isMerged) {\r\n return (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-full bg-[var(--info-bg)] text-[var(--info-text)]\">\r\n <GitMerge className=\"w-3 h-3\" />\r\n {t('references.merged', 'Merged')}\r\n </span>\r\n );\r\n }\r\n if (!item.isActive) {\r\n return (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-full bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {t('references.inactive', 'Inactive')}\r\n </span>\r\n );\r\n }\r\n return null;\r\n };\r\n\r\n return (\r\n <div className=\"p-6\">\r\n <div className=\"mb-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('admin.title', 'Administration'), href: '/administration' },\r\n { label: t('users.title', 'Users'), href: '/administration/users' },\r\n { label: t('references.title', 'References') },\r\n ]}\r\n />\r\n </div>\r\n\r\n {/* Header */}\r\n <div className=\"mb-6\">\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('references.title', 'Reference Data Management')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n {t('references.description', 'Manage companies, departments, job titles, and offices for your organization')}\r\n </p>\r\n\r\n {/* Tenant Scope Selector */}\r\n <div className=\"mt-4\">\r\n <TenantScopeSelector\r\n value={selectedScope}\r\n onChange={setSelectedScope}\r\n adminTenants={adminTenantsList.map(ut => ({\r\n tenantId: ut.id,\r\n tenantSlug: ut.slug,\r\n tenantName: ut.name,\r\n tenantType: ut.type\r\n }))}\r\n />\r\n {isGlobalScope && (\r\n <p className=\"mt-2 text-sm text-[var(--text-secondary)] flex items-center gap-1.5\">\r\n <Globe className=\"w-4 h-4\" />\r\n {t('references.globalModeInfo', 'Showing references from all tenants. Select a tenant to manage its data.')}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Error message */}\r\n {error && (\r\n <div className=\"mb-4 p-4 bg-[var(--error-bg)] border border-[var(--error-border)] rounded-[var(--radius-card)]\">\r\n <div className=\"flex items-center\">\r\n <AlertCircle className=\"w-5 h-5 text-[var(--error-text)]\" />\r\n <span className=\"ml-2 text-[var(--error-text)]\">{error}</span>\r\n <button onClick={() => setError(null)} className=\"ml-auto text-[var(--error-text)]\">\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n <button\r\n onClick={() => loadItems()}\r\n className=\"mt-2 text-sm text-[var(--error-text)] hover:opacity-80 underline\"\r\n >\r\n {t('common.retry', 'Retry')}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Tabs */}\r\n <div className=\"border-b border-[var(--border-color)] mb-6\">\r\n <nav className=\"flex gap-4 -mb-px\">\r\n {tabs.map(tab => {\r\n const Icon = tab.icon;\r\n const isActive = activeTab === tab.id;\r\n return (\r\n <button\r\n key={tab.id}\r\n onClick={() => {\r\n setActiveTab(tab.id);\r\n setSelectedIds(new Set());\r\n }}\r\n className={`flex items-center gap-2 px-4 py-3 border-b-2 font-medium text-sm transition-colors ${\r\n isActive\r\n ? 'border-[var(--color-accent-500)] text-[var(--color-accent-600)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]'\r\n }`}\r\n >\r\n <Icon className=\"w-4 h-4\" />\r\n {tab.label}\r\n </button>\r\n );\r\n })}\r\n </nav>\r\n </div>\r\n\r\n {/* Actions bar */}\r\n <div className=\"flex items-center justify-between gap-4 mb-4\">\r\n <div className=\"flex items-center gap-4\">\r\n {/* Search */}\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={e => setSearch(e.target.value)}\r\n placeholder={t('common.search', 'Search...')}\r\n className=\"pl-10 pr-4 py-2 border border-[var(--border-color)] rounded-[var(--radius-input)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n\r\n {/* Show inactive toggle */}\r\n <label className=\"flex items-center gap-2 text-sm text-[var(--text-secondary)]\">\r\n <input\r\n type=\"checkbox\"\r\n checked={showInactive}\r\n onChange={e => setShowInactive(e.target.checked)}\r\n className=\"rounded border-[var(--border-color)]\"\r\n />\r\n {t('references.showInactive', 'Show inactive')}\r\n </label>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n {/* Merge button */}\r\n {selectedIds.size >= 2 && !isGlobalScope && (\r\n <button\r\n onClick={openMergeModal}\r\n className=\"flex items-center gap-2 px-4 py-2 bg-[var(--info-dot)] text-white rounded-[var(--radius-button)] hover:opacity-90 transition-opacity\"\r\n >\r\n <GitMerge className=\"w-4 h-4\" />\r\n {t('references.merge', 'Merge')} ({selectedIds.size})\r\n </button>\r\n )}\r\n\r\n {/* History button */}\r\n {!isGlobalScope && (\r\n <button\r\n onClick={openHistoryModal}\r\n className=\"flex items-center gap-2 px-4 py-2 border border-[var(--border-color)] text-[var(--text-primary)] rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <History className=\"w-4 h-4\" />\r\n {t('references.history', 'History')}\r\n </button>\r\n )}\r\n\r\n {/* Create button */}\r\n <button\r\n onClick={() => {\r\n setFormData({ code: '', name: '' });\r\n setShowCreateModal(true);\r\n }}\r\n disabled={isGlobalScope}\r\n title={isGlobalScope ? t('references.selectTenantToCreate', 'Select a tenant to create a reference') : undefined}\r\n className={`flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] transition-colors ${\r\n isGlobalScope\r\n ? 'bg-[var(--bg-secondary)] text-[var(--text-tertiary)] cursor-not-allowed'\r\n : 'bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)]'\r\n }`}\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('common.create', 'Create')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Table */}\r\n <div className=\"card overflow-hidden\">\r\n {loading && (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n )}\r\n {!loading && items.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('references.noItems', 'No items found')}\r\n </div>\r\n )}\r\n {!loading && items.length > 0 && (\r\n <>\r\n <table className=\"w-full\">\r\n <thead className=\"bg-[var(--bg-secondary)] border-b border-[var(--border-color)]\">\r\n <tr>\r\n <th className=\"w-12 px-4 py-3\">\r\n {!isGlobalScope && (\r\n <input\r\n type=\"checkbox\"\r\n checked={selectedIds.size === items.length && items.length > 0}\r\n onChange={toggleSelectAll}\r\n className=\"rounded border-[var(--border-color)]\"\r\n />\r\n )}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('references.code', 'Code')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('references.name', 'Name')}\r\n </th>\r\n {isGlobalScope && (\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('references.tenant', 'Tenant')}\r\n </th>\r\n )}\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('references.shortName', 'Short Name')}\r\n </th>\r\n <th className=\"px-4 py-3 text-center text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('references.users', 'Users')}\r\n </th>\r\n <th className=\"px-4 py-3 text-center text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('references.status', 'Status')}\r\n </th>\r\n <th className=\"w-20 px-4 py-3\"></th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {items.map(item => (\r\n <tr\r\n key={item.id}\r\n className={`hover:bg-[var(--bg-hover)] transition-colors ${\r\n selectedIds.has(item.id) ? 'bg-[var(--info-bg)]' : ''\r\n } ${item.isMerged ? 'opacity-60' : ''}`}\r\n >\r\n <td className=\"px-4 py-3\">\r\n {!isGlobalScope && (\r\n <input\r\n type=\"checkbox\"\r\n checked={selectedIds.has(item.id)}\r\n onChange={() => toggleSelection(item.id)}\r\n disabled={item.isMerged}\r\n className=\"rounded border-[var(--border-color)]\"\r\n />\r\n )}\r\n </td>\r\n <td className=\"px-4 py-3 font-mono text-sm text-[var(--text-primary)]\">\r\n {item.code}\r\n </td>\r\n <td className=\"px-4 py-3 text-[var(--text-primary)]\">\r\n {item.name}\r\n </td>\r\n {isGlobalScope && (\r\n <td className=\"px-4 py-3\">\r\n {item.tenantName ? (\r\n <button\r\n onClick={() => item.tenantId && handleSwitchToTenant(item.tenantId)}\r\n className=\"inline-flex items-center gap-1.5 px-2 py-1 text-xs font-medium rounded-full bg-[var(--info-bg)] text-[var(--info-text)] hover:opacity-80 transition-opacity\"\r\n title={t('references.switchToTenant', 'Switch to this tenant')}\r\n >\r\n <Building2 className=\"w-3 h-3\" />\r\n {item.tenantName}\r\n </button>\r\n ) : (\r\n <span className=\"text-[var(--text-tertiary)]\">-</span>\r\n )}\r\n </td>\r\n )}\r\n <td className=\"px-4 py-3 text-[var(--text-secondary)]\">\r\n {item.shortName || '-'}\r\n </td>\r\n <td className=\"px-4 py-3 text-center\">\r\n <span className=\"inline-flex items-center gap-1 text-[var(--text-secondary)]\">\r\n <Users className=\"w-4 h-4\" />\r\n {item.userCount}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3 text-center\">\r\n {renderStatusBadge(item)}\r\n {item.isActive && !item.isMerged && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-full bg-[var(--success-bg)] text-[var(--success-text)]\">\r\n <Check className=\"w-3 h-3\" />\r\n {t('references.active', 'Active')}\r\n </span>\r\n )}\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"relative\">\r\n <button\r\n onClick={() => setMenuOpen(menuOpen === item.id ? null : item.id)}\r\n className=\"p-2 hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] transition-colors\"\r\n disabled={item.isMerged || isGlobalScope}\r\n >\r\n <MoreHorizontal className=\"w-4 h-4\" />\r\n </button>\r\n\r\n {menuOpen === item.id && (\r\n <div className=\"absolute right-0 top-full mt-1 w-48 bg-[var(--bg-primary)] border border-[var(--border-color)] rounded-[var(--radius-card)] shadow-lg z-10\">\r\n <button\r\n onClick={() => openEditModal(item)}\r\n className=\"flex items-center gap-2 w-full px-4 py-2 text-left text-sm text-[var(--text-primary)] hover:bg-[var(--bg-hover)]\"\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n {t('common.edit', 'Edit')}\r\n </button>\r\n <button\r\n onClick={() => {\r\n handleToggleActive(item);\r\n setMenuOpen(null);\r\n }}\r\n className=\"flex items-center gap-2 w-full px-4 py-2 text-left text-sm text-[var(--text-primary)] hover:bg-[var(--bg-hover)]\"\r\n >\r\n {item.isActive ? t('common.deactivate', 'Deactivate') : t('common.activate', 'Activate')}\r\n </button>\r\n {item.userCount === 0 && (\r\n <button\r\n onClick={() => {\r\n handleDelete(item.id);\r\n setMenuOpen(null);\r\n }}\r\n className=\"flex items-center gap-2 w-full px-4 py-2 text-left text-sm text-[var(--error-text)] hover:bg-[var(--error-bg)]\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n {t('common.delete', 'Delete')}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n\r\n {/* Pagination Controls */}\r\n <div className=\"flex items-center justify-between px-6 py-4 border-t border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('references.showing', 'Showing')} {((page - 1) * pageSize) + 1} {t('references.to', 'to')} {Math.min(page * pageSize, totalCount)} {t('references.of', 'of')} {totalCount} {t('references.results', 'results')}\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => setPage(p => Math.max(1, p - 1))}\r\n disabled={page === 1}\r\n className=\"px-3 py-1.5 border border-[var(--border-color)] rounded-[var(--radius-button)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\r\n >\r\n {t('common.previous', 'Previous')}\r\n </button>\r\n <div className=\"flex items-center gap-1\">\r\n {Array.from({ length: Math.min(5, totalPages) }, (_, i) => {\r\n let pageNum;\r\n if (totalPages <= 5) {\r\n pageNum = i + 1;\r\n } else if (page <= 3) {\r\n pageNum = i + 1;\r\n } else if (page >= totalPages - 2) {\r\n pageNum = totalPages - 4 + i;\r\n } else {\r\n pageNum = page - 2 + i;\r\n }\r\n return (\r\n <button\r\n key={pageNum}\r\n onClick={() => setPage(pageNum)}\r\n className={`px-3 py-1.5 rounded-[var(--radius-button)] transition-colors ${\r\n page === pageNum\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'border border-[var(--border-color)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n {pageNum}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n <button\r\n onClick={() => setPage(p => Math.min(totalPages, p + 1))}\r\n disabled={page === totalPages}\r\n className=\"px-3 py-1.5 border border-[var(--border-color)] rounded-[var(--radius-button)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\r\n >\r\n {t('common.next', 'Next')}\r\n </button>\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Create Modal */}\r\n {showCreateModal && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50\">\r\n <div className=\"card w-full max-w-md p-6 m-4\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h2 className=\"text-xl font-semibold text-[var(--text-primary)]\">\r\n {t('references.createTitle', 'Create Reference')}\r\n </h2>\r\n <button onClick={() => setShowCreateModal(false)} className=\"text-[var(--text-tertiary)] hover:text-[var(--text-primary)]\">\r\n <X className=\"w-5 h-5\" />\r\n </button>\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('references.code', 'Code')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.code}\r\n onChange={e => setFormData({ ...formData, code: e.target.value })}\r\n className=\"w-full px-4 py-2 border border-[var(--border-color)] rounded-[var(--radius-input)] 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('references.name', 'Name')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.name}\r\n onChange={e => setFormData({ ...formData, name: e.target.value })}\r\n className=\"w-full px-4 py-2 border border-[var(--border-color)] rounded-[var(--radius-input)] 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('references.shortName', 'Short Name')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.shortName || ''}\r\n onChange={e => setFormData({ ...formData, shortName: e.target.value || null })}\r\n className=\"w-full px-4 py-2 border border-[var(--border-color)] rounded-[var(--radius-input)] 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('references.description', 'Description')}\r\n </label>\r\n <textarea\r\n value={formData.description || ''}\r\n onChange={e => setFormData({ ...formData, description: e.target.value || null })}\r\n rows={3}\r\n className=\"w-full px-4 py-2 border border-[var(--border-color)] rounded-[var(--radius-input)] 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\r\n <div className=\"flex justify-end gap-3 mt-6\">\r\n <button\r\n onClick={() => setShowCreateModal(false)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.cancel', 'Cancel')}\r\n </button>\r\n <button\r\n onClick={handleCreate}\r\n disabled={saving || !formData.code || !formData.name}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] transition-colors disabled:opacity-50\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.create', 'Create')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Edit Modal */}\r\n {showEditModal && editingItem && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50\">\r\n <div className=\"card w-full max-w-md p-6 m-4\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h2 className=\"text-xl font-semibold text-[var(--text-primary)]\">\r\n {t('references.editTitle', 'Edit Reference')}\r\n </h2>\r\n <button onClick={() => setShowEditModal(false)} className=\"text-[var(--text-tertiary)] hover:text-[var(--text-primary)]\">\r\n <X className=\"w-5 h-5\" />\r\n </button>\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('references.code', 'Code')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.code}\r\n disabled\r\n className=\"w-full px-4 py-2 border border-[var(--border-color)] rounded-[var(--radius-input)] bg-[var(--bg-secondary)] text-[var(--text-tertiary)] cursor-not-allowed\"\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('references.name', 'Name')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.name}\r\n onChange={e => setFormData({ ...formData, name: e.target.value })}\r\n className=\"w-full px-4 py-2 border border-[var(--border-color)] rounded-[var(--radius-input)] 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('references.shortName', 'Short Name')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.shortName || ''}\r\n onChange={e => setFormData({ ...formData, shortName: e.target.value || null })}\r\n className=\"w-full px-4 py-2 border border-[var(--border-color)] rounded-[var(--radius-input)] 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('references.description', 'Description')}\r\n </label>\r\n <textarea\r\n value={formData.description || ''}\r\n onChange={e => setFormData({ ...formData, description: e.target.value || null })}\r\n rows={3}\r\n className=\"w-full px-4 py-2 border border-[var(--border-color)] rounded-[var(--radius-input)] 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\r\n <div className=\"flex justify-end gap-3 mt-6\">\r\n <button\r\n onClick={() => setShowEditModal(false)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.cancel', 'Cancel')}\r\n </button>\r\n <button\r\n onClick={handleUpdate}\r\n disabled={saving || !formData.name}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] transition-colors disabled:opacity-50\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.save', 'Save')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Merge Modal */}\r\n {showMergeModal && mergePreview && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50\">\r\n <div className=\"card w-full max-w-lg p-6 m-4\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h2 className=\"text-xl font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <GitMerge className=\"w-5 h-5 text-[var(--info-dot)]\" />\r\n {t('references.mergeTitle', 'Merge References')}\r\n </h2>\r\n <button onClick={() => setShowMergeModal(false)} className=\"text-[var(--text-tertiary)] hover:text-[var(--text-primary)]\">\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n <p className=\"text-sm text-[var(--text-secondary)] mb-4\">\r\n {t('references.mergeDescription', 'Select the target reference. All other selected references will be merged into it and their users will be reassigned.')}\r\n </p>\r\n\r\n <div className=\"space-y-2 mb-4\">\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('references.selectTarget', 'Select target reference')}\r\n </label>\r\n {mergePreview.sources.map(source => (\r\n <label\r\n key={source.id}\r\n className={`flex items-center gap-3 p-3 border rounded-[var(--radius-card)] cursor-pointer transition-colors ${\r\n mergeTargetId === source.id\r\n ? 'border-[var(--info-dot)] bg-[var(--info-bg)]'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-500)]'\r\n }`}\r\n >\r\n <input\r\n type=\"radio\"\r\n name=\"mergeTarget\"\r\n value={source.id}\r\n checked={mergeTargetId === source.id}\r\n onChange={() => setMergeTargetId(source.id)}\r\n className=\"text-[var(--info-dot)]\"\r\n />\r\n <div className=\"flex-1\">\r\n <div className=\"font-medium text-[var(--text-primary)]\">{source.name}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {source.code} {source.shortName && `(${source.shortName})`}\r\n </div>\r\n </div>\r\n <span className=\"text-sm text-[var(--text-secondary)]\">\r\n {source.userCount} {t('references.users', 'users')}\r\n </span>\r\n </label>\r\n ))}\r\n </div>\r\n\r\n <div className=\"mb-4\">\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('references.mergeReason', 'Reason (optional)')}\r\n </label>\r\n <textarea\r\n value={mergeReason}\r\n onChange={e => setMergeReason(e.target.value)}\r\n rows={2}\r\n placeholder={t('references.mergeReasonPlaceholder', 'Why are you merging these references?')}\r\n className=\"w-full px-4 py-2 border border-[var(--border-color)] rounded-[var(--radius-input)] 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 className=\"p-3 bg-[var(--warning-bg)] border border-[var(--warning-border)] rounded-[var(--radius-card)] mb-4\">\r\n <p className=\"text-sm text-[var(--warning-text)]\">\r\n <strong>{mergePreview.totalUsersAffected}</strong> {t('references.usersWillBeReassigned', 'users will be reassigned')}\r\n </p>\r\n </div>\r\n\r\n <div className=\"flex justify-end gap-3\">\r\n <button\r\n onClick={() => setShowMergeModal(false)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.cancel', 'Cancel')}\r\n </button>\r\n <button\r\n onClick={handleMerge}\r\n disabled={saving || !mergeTargetId}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--info-dot)] text-white hover:opacity-90 transition-opacity disabled:opacity-50\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n <GitMerge className=\"w-4 h-4\" />\r\n {t('references.merge', 'Merge')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* History Modal */}\r\n {showHistoryModal && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50\">\r\n <div className=\"card w-full max-w-2xl p-6 m-4 max-h-[80vh] overflow-hidden flex flex-col\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h2 className=\"text-xl font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <History className=\"w-5 h-5\" />\r\n {t('references.historyTitle', 'Merge History')}\r\n </h2>\r\n <button onClick={() => setShowHistoryModal(false)} className=\"text-[var(--text-tertiary)] hover:text-[var(--text-primary)]\">\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"overflow-y-auto flex-1\">\r\n {mergeHistory.length === 0 ? (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {t('references.noHistory', 'No merge history found')}\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3\">\r\n {mergeHistory.map(entry => (\r\n <div\r\n key={entry.id}\r\n className=\"p-4 border border-[var(--border-color)] rounded-[var(--radius-card)]\"\r\n >\r\n <div className=\"flex items-center gap-2 mb-2\">\r\n <GitMerge className=\"w-4 h-4 text-[var(--info-dot)]\" />\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {entry.sourceReferenceName}\r\n </span>\r\n <span className=\"text-[var(--text-secondary)]\">→</span>\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {entry.targetReferenceName}\r\n </span>\r\n </div>\r\n <div className=\"text-sm text-[var(--text-secondary)] space-y-1\">\r\n <div>{entry.affectedUserCount} users reassigned</div>\r\n <div>By {entry.mergedByUserName}</div>\r\n <div>{new Date(entry.mergedAt).toLocaleString()}</div>\r\n {entry.mergeReason && (\r\n <div className=\"italic\">\"{entry.mergeReason}\"</div>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex justify-end mt-4 pt-4 border-t border-[var(--border-color)]\">\r\n <button\r\n onClick={() => setShowHistoryModal(false)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.close', 'Close')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Click outside handler for menu */}\r\n {menuOpen && (\r\n <button\r\n type=\"button\"\r\n className=\"fixed inset-0 z-0\"\r\n onClick={() => setMenuOpen(null)}\r\n aria-label=\"Close menu\"\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["withTenantContext","tenantSlug","url","config","apiClient","res","data","ReferenceType","BASE_URL","_createReferencesApi","apiContext","api","buildUrl","path","tenantId","params","urlParams","key","value","queryString","search","isActive","source","page","pageSize","id","request","referenceType","from","to","createReferencesApi","ReferencesManagementPage","t","useTranslation","currentTenant","userTenants","switchTenant","useTenant","adminTenantsList","useAdminTenants","selectedScope","setSelectedScope","useState","isGlobalScope","selectedTenantId","useMemo","activeTab","setActiveTab","items","setItems","loading","setLoading","setSearch","showInactive","setShowInactive","selectedIds","setSelectedIds","setPage","totalCount","setTotalCount","totalPages","setTotalPages","showCreateModal","setShowCreateModal","showEditModal","setShowEditModal","showMergeModal","setShowMergeModal","showHistoryModal","setShowHistoryModal","editingItem","setEditingItem","mergePreview","setMergePreview","mergeHistory","setMergeHistory","menuOpen","setMenuOpen","formData","setFormData","mergeTargetId","setMergeTargetId","mergeReason","setMergeReason","saving","setSaving","error","setError","tabs","Users","Building2","Briefcase","MapPin","currentTab","tab","loadItems","useCallback","apiInstance","isActiveFilter","paginatedResult","err","useEffect","toggleSelection","newSelected","toggleSelectAll","item","handleSwitchToTenant","itemTenantId","tenant","handleCreate","message","handleUpdate","updateData","handleDelete","handleToggleActive","openMergeModal","preview","handleMerge","sourceIds","openHistoryModal","history","openEditModal","renderStatusBadge","jsxs","jsx","GitMerge","Breadcrumb","TenantScopeSelector","ut","Globe","AlertCircle","X","Icon","Search","e","History","Plus","Loader2","Fragment","Check","MoreHorizontal","Edit2","Trash2","p","_","i","pageNum","entry"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ReferencesManagementPage-ZCuYtqd7.js","sources":["../../src/services/api/referencesApi.ts","../../src/pages/platform/administration/users/ReferencesManagementPage.tsx"],"sourcesContent":["import { api, apiClient } from './apiClient';\r\nimport type { PaginatedResult } from '../../types/pagination';\r\n\r\n/**\r\n * Creates API methods with a specific tenant context.\r\n */\r\nconst withTenantContext = (tenantSlug?: string) => ({\r\n get: <T>(url: string, config?: Parameters<typeof apiClient.get>[1]) =>\r\n apiClient.get<T>(url, {\r\n ...config,\r\n headers: tenantSlug ? { ...config?.headers, 'X-Tenant-Slug': tenantSlug } : config?.headers,\r\n }).then(res => res.data),\r\n\r\n post: <T>(url: string, data?: unknown, config?: Parameters<typeof apiClient.post>[2]) =>\r\n apiClient.post<T>(url, data, {\r\n ...config,\r\n headers: tenantSlug ? { ...config?.headers, 'X-Tenant-Slug': tenantSlug } : config?.headers,\r\n }).then(res => res.data),\r\n\r\n put: <T>(url: string, data?: unknown, config?: Parameters<typeof apiClient.put>[2]) =>\r\n apiClient.put<T>(url, data, {\r\n ...config,\r\n headers: tenantSlug ? { ...config?.headers, 'X-Tenant-Slug': tenantSlug } : config?.headers,\r\n }).then(res => res.data),\r\n\r\n patch: <T>(url: string, data?: unknown, config?: Parameters<typeof apiClient.patch>[2]) =>\r\n apiClient.patch<T>(url, data, {\r\n ...config,\r\n headers: tenantSlug ? { ...config?.headers, 'X-Tenant-Slug': tenantSlug } : config?.headers,\r\n }).then(res => res.data),\r\n\r\n delete: <T>(url: string, config?: Parameters<typeof apiClient.delete>[1]) =>\r\n apiClient.delete<T>(url, {\r\n ...config,\r\n headers: tenantSlug ? { ...config?.headers, 'X-Tenant-Slug': tenantSlug } : config?.headers,\r\n }).then(res => res.data),\r\n});\r\n\r\n// Reference types\r\nexport const ReferenceType = {\r\n Company: 0,\r\n Department: 1,\r\n JobTitle: 2,\r\n Office: 3,\r\n} as const;\r\nexport type ReferenceType = typeof ReferenceType[keyof typeof ReferenceType];\r\n\r\n// Types\r\nexport interface ReferenceListDto {\r\n id: string;\r\n code: string;\r\n name: string;\r\n shortName: string | null;\r\n description: string | null;\r\n isActive: boolean;\r\n isMerged: boolean;\r\n mergedIntoId: string | null;\r\n isFromEntra: boolean;\r\n entraValue: string | null;\r\n userCount: number;\r\n createdAt: string;\r\n tenantId: string | null;\r\n tenantName: string | null;\r\n}\r\n\r\nexport interface OfficeListDto extends ReferenceListDto {\r\n address: string | null;\r\n city: string | null;\r\n country: string | null;\r\n}\r\n\r\nexport interface CreateReferenceRequest {\r\n code: string;\r\n name: string;\r\n shortName?: string | null;\r\n description?: string | null;\r\n}\r\n\r\nexport interface CreateOfficeRequest extends CreateReferenceRequest {\r\n address?: string | null;\r\n city?: string | null;\r\n country?: string | null;\r\n}\r\n\r\nexport interface UpdateReferenceRequest {\r\n name: string;\r\n shortName?: string | null;\r\n description?: string | null;\r\n}\r\n\r\nexport interface UpdateOfficeRequest extends UpdateReferenceRequest {\r\n address?: string | null;\r\n city?: string | null;\r\n country?: string | null;\r\n}\r\n\r\n// Merge Types\r\nexport interface MergeReferencesRequest {\r\n tenantId?: string | null;\r\n referenceType: ReferenceType;\r\n targetId: string;\r\n sourceIds: string[];\r\n reason?: string | null;\r\n}\r\n\r\nexport interface MergePreviewRequest {\r\n tenantId?: string | null;\r\n referenceType: ReferenceType;\r\n sourceIds: string[];\r\n}\r\n\r\nexport interface MergeResultDto {\r\n targetId: string;\r\n targetName: string;\r\n totalSourcesMerged: number;\r\n totalUsersReassigned: number;\r\n sourceResults: MergeSourceResultDto[];\r\n}\r\n\r\nexport interface MergeSourceResultDto {\r\n sourceId: string;\r\n sourceName: string;\r\n sourceCode: string;\r\n usersReassigned: number;\r\n}\r\n\r\nexport interface MergePreviewDto {\r\n sources: MergeSourcePreviewDto[];\r\n totalUsersAffected: number;\r\n}\r\n\r\nexport interface MergeSourcePreviewDto {\r\n id: string;\r\n code: string;\r\n name: string;\r\n shortName: string | null;\r\n userCount: number;\r\n}\r\n\r\nexport interface MergeHistoryDto {\r\n id: string;\r\n tenantId: string | null;\r\n referenceType: ReferenceType;\r\n targetReferenceId: string;\r\n targetReferenceName: string;\r\n sourceReferenceId: string;\r\n sourceReferenceName: string;\r\n sourceReferenceCode: string;\r\n sourceReferenceShortName: string | null;\r\n affectedUserCount: number;\r\n mergedByUserId: string;\r\n mergedByUserName: string;\r\n mergeReason: string | null;\r\n mergedAt: string;\r\n}\r\n\r\n\r\nconst BASE_URL = '/api/administration/users/references';\r\n\r\n/**\r\n * Factory function to create references API with explicit tenant context.\r\n * @param tenantSlug - Optional tenant slug to use for all requests\r\n */\r\nconst _createReferencesApi = (tenantSlug?: string) => {\r\n const apiContext = tenantSlug ? withTenantContext(tenantSlug) : api;\r\n\r\n const buildUrl = (path: string, tenantId?: string | null, params?: Record<string, string | boolean | number | undefined>) => {\r\n const urlParams = new URLSearchParams();\r\n if (tenantId) urlParams.append('tenantId', tenantId);\r\n if (params) {\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== undefined) urlParams.append(key, String(value));\r\n });\r\n }\r\n const queryString = urlParams.toString();\r\n return queryString ? `${BASE_URL}/${path}?${queryString}` : `${BASE_URL}/${path}`;\r\n };\r\n\r\n return {\r\n // === COMPANIES ===\r\n companies: {\r\n getAll: async (tenantId?: string | null, search?: string, isActive?: boolean, source?: 'entra' | 'manual', page: number = 1, pageSize: number = 20): Promise<PaginatedResult<ReferenceListDto>> => {\r\n const url = buildUrl('companies', tenantId, { search, isActive, source, page, pageSize });\r\n return apiContext.get<PaginatedResult<ReferenceListDto>>(url);\r\n },\r\n\r\n create: async (tenantId: string | null, data: CreateReferenceRequest): Promise<ReferenceListDto> => {\r\n const url = buildUrl('companies', tenantId);\r\n return apiContext.post<ReferenceListDto>(url, data);\r\n },\r\n\r\n update: async (id: string, data: UpdateReferenceRequest): Promise<void> => {\r\n await apiContext.put(`${BASE_URL}/companies/${id}`, data);\r\n },\r\n\r\n activate: async (id: string): Promise<void> => {\r\n await apiContext.patch(`${BASE_URL}/companies/${id}/activate`);\r\n },\r\n\r\n deactivate: async (id: string): Promise<void> => {\r\n await apiContext.patch(`${BASE_URL}/companies/${id}/deactivate`);\r\n },\r\n\r\n delete: async (id: string): Promise<void> => {\r\n await apiContext.delete(`${BASE_URL}/companies/${id}`);\r\n },\r\n },\r\n\r\n // === DEPARTMENTS ===\r\n departments: {\r\n getAll: async (tenantId?: string | null, search?: string, isActive?: boolean, source?: 'entra' | 'manual', page: number = 1, pageSize: number = 20): Promise<PaginatedResult<ReferenceListDto>> => {\r\n const url = buildUrl('departments', tenantId, { search, isActive, source, page, pageSize });\r\n return apiContext.get<PaginatedResult<ReferenceListDto>>(url);\r\n },\r\n\r\n create: async (tenantId: string | null, data: CreateReferenceRequest): Promise<ReferenceListDto> => {\r\n const url = buildUrl('departments', tenantId);\r\n return apiContext.post<ReferenceListDto>(url, data);\r\n },\r\n\r\n update: async (id: string, data: UpdateReferenceRequest): Promise<void> => {\r\n await apiContext.put(`${BASE_URL}/departments/${id}`, data);\r\n },\r\n\r\n activate: async (id: string): Promise<void> => {\r\n await apiContext.patch(`${BASE_URL}/departments/${id}/activate`);\r\n },\r\n\r\n deactivate: async (id: string): Promise<void> => {\r\n await apiContext.patch(`${BASE_URL}/departments/${id}/deactivate`);\r\n },\r\n\r\n delete: async (id: string): Promise<void> => {\r\n await apiContext.delete(`${BASE_URL}/departments/${id}`);\r\n },\r\n },\r\n\r\n // === JOB TITLES ===\r\n jobTitles: {\r\n getAll: async (tenantId?: string | null, search?: string, isActive?: boolean, source?: 'entra' | 'manual', page: number = 1, pageSize: number = 20): Promise<PaginatedResult<ReferenceListDto>> => {\r\n const url = buildUrl('job-titles', tenantId, { search, isActive, source, page, pageSize });\r\n return apiContext.get<PaginatedResult<ReferenceListDto>>(url);\r\n },\r\n\r\n create: async (tenantId: string | null, data: CreateReferenceRequest): Promise<ReferenceListDto> => {\r\n const url = buildUrl('job-titles', tenantId);\r\n return apiContext.post<ReferenceListDto>(url, data);\r\n },\r\n\r\n update: async (id: string, data: UpdateReferenceRequest): Promise<void> => {\r\n await apiContext.put(`${BASE_URL}/job-titles/${id}`, data);\r\n },\r\n\r\n activate: async (id: string): Promise<void> => {\r\n await apiContext.patch(`${BASE_URL}/job-titles/${id}/activate`);\r\n },\r\n\r\n deactivate: async (id: string): Promise<void> => {\r\n await apiContext.patch(`${BASE_URL}/job-titles/${id}/deactivate`);\r\n },\r\n\r\n delete: async (id: string): Promise<void> => {\r\n await apiContext.delete(`${BASE_URL}/job-titles/${id}`);\r\n },\r\n },\r\n\r\n // === OFFICES ===\r\n offices: {\r\n getAll: async (tenantId?: string | null, search?: string, isActive?: boolean, source?: 'entra' | 'manual', page: number = 1, pageSize: number = 20): Promise<PaginatedResult<OfficeListDto>> => {\r\n const url = buildUrl('offices', tenantId, { search, isActive, source, page, pageSize });\r\n return apiContext.get<PaginatedResult<OfficeListDto>>(url);\r\n },\r\n\r\n create: async (tenantId: string | null, data: CreateOfficeRequest): Promise<OfficeListDto> => {\r\n const url = buildUrl('offices', tenantId);\r\n return apiContext.post<OfficeListDto>(url, data);\r\n },\r\n\r\n update: async (id: string, data: UpdateOfficeRequest): Promise<void> => {\r\n await apiContext.put(`${BASE_URL}/offices/${id}`, data);\r\n },\r\n\r\n activate: async (id: string): Promise<void> => {\r\n await apiContext.patch(`${BASE_URL}/offices/${id}/activate`);\r\n },\r\n\r\n deactivate: async (id: string): Promise<void> => {\r\n await apiContext.patch(`${BASE_URL}/offices/${id}/deactivate`);\r\n },\r\n\r\n delete: async (id: string): Promise<void> => {\r\n await apiContext.delete(`${BASE_URL}/offices/${id}`);\r\n },\r\n },\r\n\r\n // === MERGE OPERATIONS ===\r\n merge: {\r\n execute: async (request: MergeReferencesRequest): Promise<MergeResultDto> => {\r\n return apiContext.post<MergeResultDto>(`${BASE_URL}/merge`, request);\r\n },\r\n\r\n preview: async (request: MergePreviewRequest): Promise<MergePreviewDto> => {\r\n return apiContext.post<MergePreviewDto>(`${BASE_URL}/merge/preview`, request);\r\n },\r\n\r\n getHistory: async (\r\n tenantId?: string | null,\r\n referenceType?: ReferenceType,\r\n from?: string,\r\n to?: string\r\n ): Promise<MergeHistoryDto[]> => {\r\n const params = new URLSearchParams();\r\n if (tenantId) params.append('tenantId', tenantId);\r\n if (referenceType !== undefined) params.append('referenceType', String(referenceType));\r\n if (from) params.append('from', from);\r\n if (to) params.append('to', to);\r\n\r\n const queryString = params.toString();\r\n const url = queryString ? `${BASE_URL}/merge/history?${queryString}` : `${BASE_URL}/merge/history`;\r\n return apiContext.get<MergeHistoryDto[]>(url);\r\n },\r\n },\r\n };\r\n};\r\nexport type ReferencesApi = ReturnType<typeof _createReferencesApi>;\r\nexport const createReferencesApi: (tenantSlug?: string) => ReferencesApi = _createReferencesApi;\r\n\r\n// Default export uses localStorage tenant slug (backward compatible)\r\nexport const referencesApi = createReferencesApi();\r\n","import { useState, useEffect, useCallback, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Building2, Briefcase, MapPin, Users, Search, Plus, Edit2, Trash2, GitMerge, MoreHorizontal, X, Loader2, History, Check, AlertCircle, Globe } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { useAdminTenants } from '@/hooks/useAdminTenants';\r\nimport { TenantScopeSelector, type ScopeValue } from '@/components/ui/TenantScopeSelector';\r\nimport {\r\n createReferencesApi,\r\n ReferenceType,\r\n} from '@/services/api/referencesApi';\r\nimport type {\r\n ReferenceListDto,\r\n MergePreviewDto,\r\n MergeHistoryDto,\r\n CreateReferenceRequest,\r\n UpdateReferenceRequest,\r\n} from '@/services/api/referencesApi';\r\n\r\ntype TabType = 'companies' | 'departments' | 'jobTitles' | 'offices';\r\n\r\ninterface Tab {\r\n id: TabType;\r\n label: string;\r\n icon: React.ElementType;\r\n referenceType: ReferenceType;\r\n}\r\n\r\nexport function ReferencesManagementPage(): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const { currentTenant, userTenants, switchTenant } = useTenant();\r\n const { tenants: adminTenantsList } = useAdminTenants();\r\n\r\n // Tenant scope selector state\r\n const [selectedScope, setSelectedScope] = useState<ScopeValue>(\r\n currentTenant ? { tenantId: currentTenant.id, tenantSlug: currentTenant.slug, tenantUserId: '', tenantName: currentTenant.name } : 'global'\r\n );\r\n const isGlobalScope = selectedScope === 'global';\r\n const selectedTenantId = isGlobalScope ? null : selectedScope.tenantId;\r\n const tenantSlug = isGlobalScope ? undefined : selectedScope.tenantSlug;\r\n const api = useMemo(() => createReferencesApi(tenantSlug), [tenantSlug]);\r\n\r\n // State\r\n const [activeTab, setActiveTab] = useState<TabType>('departments');\r\n const [items, setItems] = useState<ReferenceListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [search, setSearch] = useState('');\r\n const [showInactive, setShowInactive] = useState(false);\r\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\r\n\r\n // Pagination state\r\n const [page, setPage] = useState(1);\r\n const [pageSize] = useState(20);\r\n const [totalCount, setTotalCount] = useState(0);\r\n const [totalPages, setTotalPages] = useState(0);\r\n\r\n // Modal states\r\n const [showCreateModal, setShowCreateModal] = useState(false);\r\n const [showEditModal, setShowEditModal] = useState(false);\r\n const [showMergeModal, setShowMergeModal] = useState(false);\r\n const [showHistoryModal, setShowHistoryModal] = useState(false);\r\n const [editingItem, setEditingItem] = useState<ReferenceListDto | null>(null);\r\n const [mergePreview, setMergePreview] = useState<MergePreviewDto | null>(null);\r\n const [mergeHistory, setMergeHistory] = useState<MergeHistoryDto[]>([]);\r\n const [menuOpen, setMenuOpen] = useState<string | null>(null);\r\n\r\n // Form states\r\n const [formData, setFormData] = useState<CreateReferenceRequest>({ code: '', name: '' });\r\n const [mergeTargetId, setMergeTargetId] = useState<string | null>(null);\r\n const [mergeReason, setMergeReason] = useState('');\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const tabs: Tab[] = [\r\n { id: 'departments', label: t('references.tabs.departments', 'Departments'), icon: Users, referenceType: ReferenceType.Department },\r\n { id: 'companies', label: t('references.tabs.companies', 'Companies'), icon: Building2, referenceType: ReferenceType.Company },\r\n { id: 'jobTitles', label: t('references.tabs.jobTitles', 'Job Titles'), icon: Briefcase, referenceType: ReferenceType.JobTitle },\r\n { id: 'offices', label: t('references.tabs.offices', 'Offices'), icon: MapPin, referenceType: ReferenceType.Office },\r\n ];\r\n\r\n const currentTab = tabs.find(tab => tab.id === activeTab)!;\r\n const tenantId = selectedTenantId;\r\n\r\n const loadItems = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n // Create API instance inside callback to avoid dependency loop\r\n const apiInstance = createReferencesApi(tenantSlug ?? undefined);\r\n\r\n const isActiveFilter = showInactive ? undefined : true;\r\n\r\n let paginatedResult;\r\n\r\n switch (activeTab) {\r\n case 'companies':\r\n paginatedResult = await apiInstance.companies.getAll(tenantId, search || undefined, isActiveFilter, undefined, page, pageSize);\r\n break;\r\n case 'departments':\r\n paginatedResult = await apiInstance.departments.getAll(tenantId, search || undefined, isActiveFilter, undefined, page, pageSize);\r\n break;\r\n case 'jobTitles':\r\n paginatedResult = await apiInstance.jobTitles.getAll(tenantId, search || undefined, isActiveFilter, undefined, page, pageSize);\r\n break;\r\n case 'offices':\r\n paginatedResult = await apiInstance.offices.getAll(tenantId, search || undefined, isActiveFilter, undefined, page, pageSize);\r\n break;\r\n default:\r\n paginatedResult = { items: [], totalCount: 0, page: 1, pageSize: 20, totalPages: 0, hasPreviousPage: false, hasNextPage: false };\r\n }\r\n\r\n setItems(paginatedResult.items);\r\n setTotalCount(paginatedResult.totalCount);\r\n setTotalPages(paginatedResult.totalPages);\r\n setSelectedIds(new Set());\r\n } catch (err) {\r\n console.error('Failed to load references:', err);\r\n setError('Failed to load references');\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [tenantSlug, activeTab, tenantId, search, showInactive, page, pageSize]);\r\n\r\n useEffect(() => {\r\n loadItems();\r\n }, [loadItems]);\r\n\r\n // Reset to page 1 when filters change\r\n useEffect(() => {\r\n setPage(1);\r\n }, [activeTab, search, showInactive, selectedScope]);\r\n\r\n // Selection handlers\r\n const toggleSelection = (id: string) => {\r\n const newSelected = new Set(selectedIds);\r\n if (newSelected.has(id)) {\r\n newSelected.delete(id);\r\n } else {\r\n newSelected.add(id);\r\n }\r\n setSelectedIds(newSelected);\r\n };\r\n\r\n const toggleSelectAll = () => {\r\n if (selectedIds.size === items.length) {\r\n setSelectedIds(new Set());\r\n } else {\r\n setSelectedIds(new Set(items.map(item => item.id)));\r\n }\r\n };\r\n\r\n // Switch to a specific tenant from global view\r\n const handleSwitchToTenant = async (itemTenantId: string) => {\r\n try {\r\n await switchTenant(itemTenantId);\r\n const tenant = userTenants.find(t => t.id === itemTenantId);\r\n if (tenant) {\r\n setSelectedScope({ tenantId: tenant.id, tenantSlug: tenant.slug, tenantUserId: '', tenantName: tenant.name });\r\n }\r\n } catch (err) {\r\n console.error('Failed to switch tenant:', err);\r\n }\r\n };\r\n\r\n // CRUD handlers\r\n const handleCreate = async () => {\r\n if (!tenantId) return;\r\n\r\n try {\r\n setSaving(true);\r\n setError(null);\r\n\r\n switch (activeTab) {\r\n case 'companies':\r\n await api.companies.create(tenantId, formData);\r\n break;\r\n case 'departments':\r\n await api.departments.create(tenantId, formData);\r\n break;\r\n case 'jobTitles':\r\n await api.jobTitles.create(tenantId, formData);\r\n break;\r\n case 'offices':\r\n await api.offices.create(tenantId, formData);\r\n break;\r\n }\r\n\r\n setShowCreateModal(false);\r\n setFormData({ code: '', name: '' });\r\n loadItems();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'Failed to create';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleUpdate = async () => {\r\n if (!editingItem) return;\r\n\r\n try {\r\n setSaving(true);\r\n setError(null);\r\n\r\n const updateData: UpdateReferenceRequest = {\r\n name: formData.name,\r\n shortName: formData.shortName,\r\n description: formData.description,\r\n };\r\n\r\n switch (activeTab) {\r\n case 'companies':\r\n await api.companies.update(editingItem.id, updateData);\r\n break;\r\n case 'departments':\r\n await api.departments.update(editingItem.id, updateData);\r\n break;\r\n case 'jobTitles':\r\n await api.jobTitles.update(editingItem.id, updateData);\r\n break;\r\n case 'offices':\r\n await api.offices.update(editingItem.id, updateData);\r\n break;\r\n }\r\n\r\n setShowEditModal(false);\r\n setEditingItem(null);\r\n loadItems();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'Failed to update';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleDelete = async (id: string) => {\r\n if (!confirm(t('references.confirmDelete', 'Are you sure you want to delete this reference?'))) return;\r\n\r\n try {\r\n switch (activeTab) {\r\n case 'companies':\r\n await api.companies.delete(id);\r\n break;\r\n case 'departments':\r\n await api.departments.delete(id);\r\n break;\r\n case 'jobTitles':\r\n await api.jobTitles.delete(id);\r\n break;\r\n case 'offices':\r\n await api.offices.delete(id);\r\n break;\r\n }\r\n loadItems();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'Failed to delete';\r\n setError(message);\r\n }\r\n };\r\n\r\n const handleToggleActive = async (item: ReferenceListDto) => {\r\n try {\r\n if (item.isActive) {\r\n switch (activeTab) {\r\n case 'companies':\r\n await api.companies.deactivate(item.id);\r\n break;\r\n case 'departments':\r\n await api.departments.deactivate(item.id);\r\n break;\r\n case 'jobTitles':\r\n await api.jobTitles.deactivate(item.id);\r\n break;\r\n case 'offices':\r\n await api.offices.deactivate(item.id);\r\n break;\r\n }\r\n } else {\r\n switch (activeTab) {\r\n case 'companies':\r\n await api.companies.activate(item.id);\r\n break;\r\n case 'departments':\r\n await api.departments.activate(item.id);\r\n break;\r\n case 'jobTitles':\r\n await api.jobTitles.activate(item.id);\r\n break;\r\n case 'offices':\r\n await api.offices.activate(item.id);\r\n break;\r\n }\r\n }\r\n loadItems();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'Failed to toggle status';\r\n setError(message);\r\n }\r\n };\r\n\r\n // Merge handlers\r\n const openMergeModal = async () => {\r\n if (selectedIds.size < 2) return;\r\n\r\n try {\r\n const preview = await api.merge.preview({\r\n tenantId,\r\n referenceType: currentTab.referenceType,\r\n sourceIds: Array.from(selectedIds),\r\n });\r\n\r\n setMergePreview(preview);\r\n setMergeTargetId(null);\r\n setMergeReason('');\r\n setShowMergeModal(true);\r\n } catch (err) {\r\n console.error('Failed to get merge preview:', err);\r\n setError('Failed to preview merge');\r\n }\r\n };\r\n\r\n const handleMerge = async () => {\r\n if (!mergeTargetId || !mergePreview) return;\r\n\r\n const sourceIds = Array.from(selectedIds).filter(id => id !== mergeTargetId);\r\n\r\n try {\r\n setSaving(true);\r\n setError(null);\r\n\r\n await api.merge.execute({\r\n tenantId,\r\n referenceType: currentTab.referenceType,\r\n targetId: mergeTargetId,\r\n sourceIds,\r\n reason: mergeReason || undefined,\r\n });\r\n\r\n setShowMergeModal(false);\r\n setSelectedIds(new Set());\r\n setMergePreview(null);\r\n loadItems();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'Failed to merge';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const openHistoryModal = async () => {\r\n try {\r\n const history = await api.merge.getHistory(tenantId, currentTab.referenceType);\r\n setMergeHistory(history);\r\n setShowHistoryModal(true);\r\n } catch (err) {\r\n console.error('Failed to load merge history:', err);\r\n setError('Failed to load merge history');\r\n }\r\n };\r\n\r\n // Edit modal opener\r\n const openEditModal = (item: ReferenceListDto) => {\r\n setEditingItem(item);\r\n setFormData({\r\n code: item.code,\r\n name: item.name,\r\n shortName: item.shortName,\r\n description: item.description,\r\n });\r\n setShowEditModal(true);\r\n setMenuOpen(null);\r\n };\r\n\r\n // Render helpers\r\n const renderStatusBadge = (item: ReferenceListDto) => {\r\n if (item.isMerged) {\r\n return (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-full bg-[var(--info-bg)] text-[var(--info-text)]\">\r\n <GitMerge className=\"w-3 h-3\" />\r\n {t('references.merged', 'Merged')}\r\n </span>\r\n );\r\n }\r\n if (!item.isActive) {\r\n return (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-full bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {t('references.inactive', 'Inactive')}\r\n </span>\r\n );\r\n }\r\n return null;\r\n };\r\n\r\n return (\r\n <div className=\"p-6\">\r\n <div className=\"mb-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('admin.title', 'Administration'), href: '/administration' },\r\n { label: t('users.title', 'Users'), href: '/administration/users' },\r\n { label: t('references.title', 'References') },\r\n ]}\r\n />\r\n </div>\r\n\r\n {/* Header */}\r\n <div className=\"mb-6\">\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('references.title', 'Reference Data Management')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n {t('references.description', 'Manage companies, departments, job titles, and offices for your organization')}\r\n </p>\r\n\r\n {/* Tenant Scope Selector */}\r\n <div className=\"mt-4\">\r\n <TenantScopeSelector\r\n value={selectedScope}\r\n onChange={setSelectedScope}\r\n adminTenants={adminTenantsList.map(ut => ({\r\n tenantId: ut.id,\r\n tenantSlug: ut.slug,\r\n tenantName: ut.name,\r\n tenantType: ut.type\r\n }))}\r\n />\r\n {isGlobalScope && (\r\n <p className=\"mt-2 text-sm text-[var(--text-secondary)] flex items-center gap-1.5\">\r\n <Globe className=\"w-4 h-4\" />\r\n {t('references.globalModeInfo', 'Showing references from all tenants. Select a tenant to manage its data.')}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Error message */}\r\n {error && (\r\n <div className=\"mb-4 p-4 bg-[var(--error-bg)] border border-[var(--error-border)] rounded-[var(--radius-card)]\">\r\n <div className=\"flex items-center\">\r\n <AlertCircle className=\"w-5 h-5 text-[var(--error-text)]\" />\r\n <span className=\"ml-2 text-[var(--error-text)]\">{error}</span>\r\n <button onClick={() => setError(null)} className=\"ml-auto text-[var(--error-text)]\">\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n <button\r\n onClick={() => loadItems()}\r\n className=\"mt-2 text-sm text-[var(--error-text)] hover:opacity-80 underline\"\r\n >\r\n {t('common.retry', 'Retry')}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Tabs */}\r\n <div className=\"border-b border-[var(--border-color)] mb-6\">\r\n <nav className=\"flex gap-4 -mb-px\">\r\n {tabs.map(tab => {\r\n const Icon = tab.icon;\r\n const isActive = activeTab === tab.id;\r\n return (\r\n <button\r\n key={tab.id}\r\n onClick={() => {\r\n setActiveTab(tab.id);\r\n setSelectedIds(new Set());\r\n }}\r\n className={`flex items-center gap-2 px-4 py-3 border-b-2 font-medium text-sm transition-colors ${\r\n isActive\r\n ? 'border-[var(--color-accent-500)] text-[var(--color-accent-600)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]'\r\n }`}\r\n >\r\n <Icon className=\"w-4 h-4\" />\r\n {tab.label}\r\n </button>\r\n );\r\n })}\r\n </nav>\r\n </div>\r\n\r\n {/* Actions bar */}\r\n <div className=\"flex items-center justify-between gap-4 mb-4\">\r\n <div className=\"flex items-center gap-4\">\r\n {/* Search */}\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={e => setSearch(e.target.value)}\r\n placeholder={t('common.search', 'Search...')}\r\n className=\"pl-10 pr-4 py-2 border border-[var(--border-color)] rounded-[var(--radius-input)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n\r\n {/* Show inactive toggle */}\r\n <label className=\"flex items-center gap-2 text-sm text-[var(--text-secondary)]\">\r\n <input\r\n type=\"checkbox\"\r\n checked={showInactive}\r\n onChange={e => setShowInactive(e.target.checked)}\r\n className=\"rounded border-[var(--border-color)]\"\r\n />\r\n {t('references.showInactive', 'Show inactive')}\r\n </label>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n {/* Merge button */}\r\n {selectedIds.size >= 2 && !isGlobalScope && (\r\n <button\r\n onClick={openMergeModal}\r\n className=\"flex items-center gap-2 px-4 py-2 bg-[var(--info-dot)] text-white rounded-[var(--radius-button)] hover:opacity-90 transition-opacity\"\r\n >\r\n <GitMerge className=\"w-4 h-4\" />\r\n {t('references.merge', 'Merge')} ({selectedIds.size})\r\n </button>\r\n )}\r\n\r\n {/* History button */}\r\n {!isGlobalScope && (\r\n <button\r\n onClick={openHistoryModal}\r\n className=\"flex items-center gap-2 px-4 py-2 border border-[var(--border-color)] text-[var(--text-primary)] rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <History className=\"w-4 h-4\" />\r\n {t('references.history', 'History')}\r\n </button>\r\n )}\r\n\r\n {/* Create button */}\r\n <button\r\n onClick={() => {\r\n setFormData({ code: '', name: '' });\r\n setShowCreateModal(true);\r\n }}\r\n disabled={isGlobalScope}\r\n title={isGlobalScope ? t('references.selectTenantToCreate', 'Select a tenant to create a reference') : undefined}\r\n className={`flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] transition-colors ${\r\n isGlobalScope\r\n ? 'bg-[var(--bg-secondary)] text-[var(--text-tertiary)] cursor-not-allowed'\r\n : 'bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)]'\r\n }`}\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('common.create', 'Create')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Table */}\r\n <div className=\"card overflow-hidden\">\r\n {loading && (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n )}\r\n {!loading && items.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('references.noItems', 'No items found')}\r\n </div>\r\n )}\r\n {!loading && items.length > 0 && (\r\n <>\r\n <table className=\"w-full\">\r\n <thead className=\"bg-[var(--bg-secondary)] border-b border-[var(--border-color)]\">\r\n <tr>\r\n <th className=\"w-12 px-4 py-3\">\r\n {!isGlobalScope && (\r\n <input\r\n type=\"checkbox\"\r\n checked={selectedIds.size === items.length && items.length > 0}\r\n onChange={toggleSelectAll}\r\n className=\"rounded border-[var(--border-color)]\"\r\n />\r\n )}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('references.code', 'Code')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('references.name', 'Name')}\r\n </th>\r\n {isGlobalScope && (\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('references.tenant', 'Tenant')}\r\n </th>\r\n )}\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('references.shortName', 'Short Name')}\r\n </th>\r\n <th className=\"px-4 py-3 text-center text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('references.users', 'Users')}\r\n </th>\r\n <th className=\"px-4 py-3 text-center text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('references.status', 'Status')}\r\n </th>\r\n <th className=\"w-20 px-4 py-3\"></th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {items.map(item => (\r\n <tr\r\n key={item.id}\r\n className={`hover:bg-[var(--bg-hover)] transition-colors ${\r\n selectedIds.has(item.id) ? 'bg-[var(--info-bg)]' : ''\r\n } ${item.isMerged ? 'opacity-60' : ''}`}\r\n >\r\n <td className=\"px-4 py-3\">\r\n {!isGlobalScope && (\r\n <input\r\n type=\"checkbox\"\r\n checked={selectedIds.has(item.id)}\r\n onChange={() => toggleSelection(item.id)}\r\n disabled={item.isMerged}\r\n className=\"rounded border-[var(--border-color)]\"\r\n />\r\n )}\r\n </td>\r\n <td className=\"px-4 py-3 font-mono text-sm text-[var(--text-primary)]\">\r\n {item.code}\r\n </td>\r\n <td className=\"px-4 py-3 text-[var(--text-primary)]\">\r\n {item.name}\r\n </td>\r\n {isGlobalScope && (\r\n <td className=\"px-4 py-3\">\r\n {item.tenantName ? (\r\n <button\r\n onClick={() => item.tenantId && handleSwitchToTenant(item.tenantId)}\r\n className=\"inline-flex items-center gap-1.5 px-2 py-1 text-xs font-medium rounded-full bg-[var(--info-bg)] text-[var(--info-text)] hover:opacity-80 transition-opacity\"\r\n title={t('references.switchToTenant', 'Switch to this tenant')}\r\n >\r\n <Building2 className=\"w-3 h-3\" />\r\n {item.tenantName}\r\n </button>\r\n ) : (\r\n <span className=\"text-[var(--text-tertiary)]\">-</span>\r\n )}\r\n </td>\r\n )}\r\n <td className=\"px-4 py-3 text-[var(--text-secondary)]\">\r\n {item.shortName || '-'}\r\n </td>\r\n <td className=\"px-4 py-3 text-center\">\r\n <span className=\"inline-flex items-center gap-1 text-[var(--text-secondary)]\">\r\n <Users className=\"w-4 h-4\" />\r\n {item.userCount}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3 text-center\">\r\n {renderStatusBadge(item)}\r\n {item.isActive && !item.isMerged && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-full bg-[var(--success-bg)] text-[var(--success-text)]\">\r\n <Check className=\"w-3 h-3\" />\r\n {t('references.active', 'Active')}\r\n </span>\r\n )}\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"relative\">\r\n <button\r\n onClick={() => setMenuOpen(menuOpen === item.id ? null : item.id)}\r\n className=\"p-2 hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] transition-colors\"\r\n disabled={item.isMerged || isGlobalScope}\r\n >\r\n <MoreHorizontal className=\"w-4 h-4\" />\r\n </button>\r\n\r\n {menuOpen === item.id && (\r\n <div className=\"absolute right-0 top-full mt-1 w-48 bg-[var(--bg-primary)] border border-[var(--border-color)] rounded-[var(--radius-card)] shadow-lg z-10\">\r\n <button\r\n onClick={() => openEditModal(item)}\r\n className=\"flex items-center gap-2 w-full px-4 py-2 text-left text-sm text-[var(--text-primary)] hover:bg-[var(--bg-hover)]\"\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n {t('common.edit', 'Edit')}\r\n </button>\r\n <button\r\n onClick={() => {\r\n handleToggleActive(item);\r\n setMenuOpen(null);\r\n }}\r\n className=\"flex items-center gap-2 w-full px-4 py-2 text-left text-sm text-[var(--text-primary)] hover:bg-[var(--bg-hover)]\"\r\n >\r\n {item.isActive ? t('common.deactivate', 'Deactivate') : t('common.activate', 'Activate')}\r\n </button>\r\n {item.userCount === 0 && (\r\n <button\r\n onClick={() => {\r\n handleDelete(item.id);\r\n setMenuOpen(null);\r\n }}\r\n className=\"flex items-center gap-2 w-full px-4 py-2 text-left text-sm text-[var(--error-text)] hover:bg-[var(--error-bg)]\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n {t('common.delete', 'Delete')}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n\r\n {/* Pagination Controls */}\r\n <div className=\"flex items-center justify-between px-6 py-4 border-t border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('references.showing', 'Showing')} {((page - 1) * pageSize) + 1} {t('references.to', 'to')} {Math.min(page * pageSize, totalCount)} {t('references.of', 'of')} {totalCount} {t('references.results', 'results')}\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => setPage(p => Math.max(1, p - 1))}\r\n disabled={page === 1}\r\n className=\"px-3 py-1.5 border border-[var(--border-color)] rounded-[var(--radius-button)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\r\n >\r\n {t('common.previous', 'Previous')}\r\n </button>\r\n <div className=\"flex items-center gap-1\">\r\n {Array.from({ length: Math.min(5, totalPages) }, (_, i) => {\r\n let pageNum;\r\n if (totalPages <= 5) {\r\n pageNum = i + 1;\r\n } else if (page <= 3) {\r\n pageNum = i + 1;\r\n } else if (page >= totalPages - 2) {\r\n pageNum = totalPages - 4 + i;\r\n } else {\r\n pageNum = page - 2 + i;\r\n }\r\n return (\r\n <button\r\n key={pageNum}\r\n onClick={() => setPage(pageNum)}\r\n className={`px-3 py-1.5 rounded-[var(--radius-button)] transition-colors ${\r\n page === pageNum\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'border border-[var(--border-color)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n {pageNum}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n <button\r\n onClick={() => setPage(p => Math.min(totalPages, p + 1))}\r\n disabled={page === totalPages}\r\n className=\"px-3 py-1.5 border border-[var(--border-color)] rounded-[var(--radius-button)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\r\n >\r\n {t('common.next', 'Next')}\r\n </button>\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Create Modal */}\r\n {showCreateModal && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50\">\r\n <div className=\"card w-full max-w-md p-6 m-4\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h2 className=\"text-xl font-semibold text-[var(--text-primary)]\">\r\n {t('references.createTitle', 'Create Reference')}\r\n </h2>\r\n <button onClick={() => setShowCreateModal(false)} className=\"text-[var(--text-tertiary)] hover:text-[var(--text-primary)]\">\r\n <X className=\"w-5 h-5\" />\r\n </button>\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('references.code', 'Code')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.code}\r\n onChange={e => setFormData({ ...formData, code: e.target.value })}\r\n className=\"w-full px-4 py-2 border border-[var(--border-color)] rounded-[var(--radius-input)] 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('references.name', 'Name')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.name}\r\n onChange={e => setFormData({ ...formData, name: e.target.value })}\r\n className=\"w-full px-4 py-2 border border-[var(--border-color)] rounded-[var(--radius-input)] 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('references.shortName', 'Short Name')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.shortName || ''}\r\n onChange={e => setFormData({ ...formData, shortName: e.target.value || null })}\r\n className=\"w-full px-4 py-2 border border-[var(--border-color)] rounded-[var(--radius-input)] 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('references.description', 'Description')}\r\n </label>\r\n <textarea\r\n value={formData.description || ''}\r\n onChange={e => setFormData({ ...formData, description: e.target.value || null })}\r\n rows={3}\r\n className=\"w-full px-4 py-2 border border-[var(--border-color)] rounded-[var(--radius-input)] 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\r\n <div className=\"flex justify-end gap-3 mt-6\">\r\n <button\r\n onClick={() => setShowCreateModal(false)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.cancel', 'Cancel')}\r\n </button>\r\n <button\r\n onClick={handleCreate}\r\n disabled={saving || !formData.code || !formData.name}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] transition-colors disabled:opacity-50\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.create', 'Create')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Edit Modal */}\r\n {showEditModal && editingItem && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50\">\r\n <div className=\"card w-full max-w-md p-6 m-4\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h2 className=\"text-xl font-semibold text-[var(--text-primary)]\">\r\n {t('references.editTitle', 'Edit Reference')}\r\n </h2>\r\n <button onClick={() => setShowEditModal(false)} className=\"text-[var(--text-tertiary)] hover:text-[var(--text-primary)]\">\r\n <X className=\"w-5 h-5\" />\r\n </button>\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('references.code', 'Code')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.code}\r\n disabled\r\n className=\"w-full px-4 py-2 border border-[var(--border-color)] rounded-[var(--radius-input)] bg-[var(--bg-secondary)] text-[var(--text-tertiary)] cursor-not-allowed\"\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('references.name', 'Name')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.name}\r\n onChange={e => setFormData({ ...formData, name: e.target.value })}\r\n className=\"w-full px-4 py-2 border border-[var(--border-color)] rounded-[var(--radius-input)] 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('references.shortName', 'Short Name')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.shortName || ''}\r\n onChange={e => setFormData({ ...formData, shortName: e.target.value || null })}\r\n className=\"w-full px-4 py-2 border border-[var(--border-color)] rounded-[var(--radius-input)] 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('references.description', 'Description')}\r\n </label>\r\n <textarea\r\n value={formData.description || ''}\r\n onChange={e => setFormData({ ...formData, description: e.target.value || null })}\r\n rows={3}\r\n className=\"w-full px-4 py-2 border border-[var(--border-color)] rounded-[var(--radius-input)] 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\r\n <div className=\"flex justify-end gap-3 mt-6\">\r\n <button\r\n onClick={() => setShowEditModal(false)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.cancel', 'Cancel')}\r\n </button>\r\n <button\r\n onClick={handleUpdate}\r\n disabled={saving || !formData.name}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] transition-colors disabled:opacity-50\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.save', 'Save')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Merge Modal */}\r\n {showMergeModal && mergePreview && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50\">\r\n <div className=\"card w-full max-w-lg p-6 m-4\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h2 className=\"text-xl font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <GitMerge className=\"w-5 h-5 text-[var(--info-dot)]\" />\r\n {t('references.mergeTitle', 'Merge References')}\r\n </h2>\r\n <button onClick={() => setShowMergeModal(false)} className=\"text-[var(--text-tertiary)] hover:text-[var(--text-primary)]\">\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n <p className=\"text-sm text-[var(--text-secondary)] mb-4\">\r\n {t('references.mergeDescription', 'Select the target reference. All other selected references will be merged into it and their users will be reassigned.')}\r\n </p>\r\n\r\n <div className=\"space-y-2 mb-4\">\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('references.selectTarget', 'Select target reference')}\r\n </label>\r\n {mergePreview.sources.map(source => (\r\n <label\r\n key={source.id}\r\n className={`flex items-center gap-3 p-3 border rounded-[var(--radius-card)] cursor-pointer transition-colors ${\r\n mergeTargetId === source.id\r\n ? 'border-[var(--info-dot)] bg-[var(--info-bg)]'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-500)]'\r\n }`}\r\n >\r\n <input\r\n type=\"radio\"\r\n name=\"mergeTarget\"\r\n value={source.id}\r\n checked={mergeTargetId === source.id}\r\n onChange={() => setMergeTargetId(source.id)}\r\n className=\"text-[var(--info-dot)]\"\r\n />\r\n <div className=\"flex-1\">\r\n <div className=\"font-medium text-[var(--text-primary)]\">{source.name}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {source.code} {source.shortName && `(${source.shortName})`}\r\n </div>\r\n </div>\r\n <span className=\"text-sm text-[var(--text-secondary)]\">\r\n {source.userCount} {t('references.users', 'users')}\r\n </span>\r\n </label>\r\n ))}\r\n </div>\r\n\r\n <div className=\"mb-4\">\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('references.mergeReason', 'Reason (optional)')}\r\n </label>\r\n <textarea\r\n value={mergeReason}\r\n onChange={e => setMergeReason(e.target.value)}\r\n rows={2}\r\n placeholder={t('references.mergeReasonPlaceholder', 'Why are you merging these references?')}\r\n className=\"w-full px-4 py-2 border border-[var(--border-color)] rounded-[var(--radius-input)] 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 className=\"p-3 bg-[var(--warning-bg)] border border-[var(--warning-border)] rounded-[var(--radius-card)] mb-4\">\r\n <p className=\"text-sm text-[var(--warning-text)]\">\r\n <strong>{mergePreview.totalUsersAffected}</strong> {t('references.usersWillBeReassigned', 'users will be reassigned')}\r\n </p>\r\n </div>\r\n\r\n <div className=\"flex justify-end gap-3\">\r\n <button\r\n onClick={() => setShowMergeModal(false)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.cancel', 'Cancel')}\r\n </button>\r\n <button\r\n onClick={handleMerge}\r\n disabled={saving || !mergeTargetId}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--info-dot)] text-white hover:opacity-90 transition-opacity disabled:opacity-50\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n <GitMerge className=\"w-4 h-4\" />\r\n {t('references.merge', 'Merge')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* History Modal */}\r\n {showHistoryModal && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50\">\r\n <div className=\"card w-full max-w-2xl p-6 m-4 max-h-[80vh] overflow-hidden flex flex-col\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h2 className=\"text-xl font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <History className=\"w-5 h-5\" />\r\n {t('references.historyTitle', 'Merge History')}\r\n </h2>\r\n <button onClick={() => setShowHistoryModal(false)} className=\"text-[var(--text-tertiary)] hover:text-[var(--text-primary)]\">\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"overflow-y-auto flex-1\">\r\n {mergeHistory.length === 0 ? (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {t('references.noHistory', 'No merge history found')}\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3\">\r\n {mergeHistory.map(entry => (\r\n <div\r\n key={entry.id}\r\n className=\"p-4 border border-[var(--border-color)] rounded-[var(--radius-card)]\"\r\n >\r\n <div className=\"flex items-center gap-2 mb-2\">\r\n <GitMerge className=\"w-4 h-4 text-[var(--info-dot)]\" />\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {entry.sourceReferenceName}\r\n </span>\r\n <span className=\"text-[var(--text-secondary)]\">→</span>\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {entry.targetReferenceName}\r\n </span>\r\n </div>\r\n <div className=\"text-sm text-[var(--text-secondary)] space-y-1\">\r\n <div>{entry.affectedUserCount} users reassigned</div>\r\n <div>By {entry.mergedByUserName}</div>\r\n <div>{new Date(entry.mergedAt).toLocaleString()}</div>\r\n {entry.mergeReason && (\r\n <div className=\"italic\">\"{entry.mergeReason}\"</div>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex justify-end mt-4 pt-4 border-t border-[var(--border-color)]\">\r\n <button\r\n onClick={() => setShowHistoryModal(false)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common.close', 'Close')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Click outside handler for menu */}\r\n {menuOpen && (\r\n <button\r\n type=\"button\"\r\n className=\"fixed inset-0 z-0\"\r\n onClick={() => setMenuOpen(null)}\r\n aria-label=\"Close menu\"\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["withTenantContext","tenantSlug","url","config","apiClient","res","data","ReferenceType","BASE_URL","_createReferencesApi","apiContext","api","buildUrl","path","tenantId","params","urlParams","key","value","queryString","search","isActive","source","page","pageSize","id","request","referenceType","from","to","createReferencesApi","ReferencesManagementPage","t","useTranslation","currentTenant","userTenants","switchTenant","useTenant","adminTenantsList","useAdminTenants","selectedScope","setSelectedScope","useState","isGlobalScope","selectedTenantId","useMemo","activeTab","setActiveTab","items","setItems","loading","setLoading","setSearch","showInactive","setShowInactive","selectedIds","setSelectedIds","setPage","totalCount","setTotalCount","totalPages","setTotalPages","showCreateModal","setShowCreateModal","showEditModal","setShowEditModal","showMergeModal","setShowMergeModal","showHistoryModal","setShowHistoryModal","editingItem","setEditingItem","mergePreview","setMergePreview","mergeHistory","setMergeHistory","menuOpen","setMenuOpen","formData","setFormData","mergeTargetId","setMergeTargetId","mergeReason","setMergeReason","saving","setSaving","error","setError","tabs","Users","Building2","Briefcase","MapPin","currentTab","tab","loadItems","useCallback","apiInstance","isActiveFilter","paginatedResult","err","useEffect","toggleSelection","newSelected","toggleSelectAll","item","handleSwitchToTenant","itemTenantId","tenant","handleCreate","message","handleUpdate","updateData","handleDelete","handleToggleActive","openMergeModal","preview","handleMerge","sourceIds","openHistoryModal","history","openEditModal","renderStatusBadge","jsxs","jsx","GitMerge","Breadcrumb","TenantScopeSelector","ut","Globe","AlertCircle","X","Icon","Search","e","History","Plus","Loader2","Fragment","Check","MoreHorizontal","Edit2","Trash2","p","_","i","pageNum","entry"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),r=require("react"),s=require("lucide-react"),E=require("react-router-dom"),o=require("./index-
|
|
2
|
-
//# sourceMappingURL=RegisterPage-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),r=require("react"),s=require("lucide-react"),E=require("react-router-dom"),o=require("./index-IgLVXPg8.js");function q(){const[i,h]=r.useState(""),[c,p]=r.useState(""),[d,b]=r.useState(""),[m,f]=r.useState(""),[x,y]=r.useState(""),[u,k]=r.useState(!1),[g,S]=r.useState(!1),[l,j]=r.useState(!1),[v,n]=r.useState(null),[N,w]=r.useState(null),C=()=>!i||!c||!d||!m||!x?(n("Tous les champs sont requis"),!1):c!==d?(n("Les mots de passe ne correspondent pas"),!1):c.length<8?(n("Le mot de passe doit contenir au moins 8 caractères"),!1):!0,L=async t=>{if(t.preventDefault(),n(null),w(null),!!C()){j(!0);try{o.logService.logEvent("register_attempt","auth",{email:i});const a=await o.authApi.register({email:i,password:c,firstName:m,lastName:x});o.logService.logEvent("register_success","auth",{email:i}),w(a.message),h(""),p(""),b(""),f(""),y("")}catch(a){if(a instanceof o.NetworkError)n(a.message);else{const P=a instanceof Error?a.message:"Une erreur inattendue est survenue";n(P)}o.logService.logError(a instanceof Error?a:new Error(String(a)),"RegisterPage.handleSubmit",{email:i})}finally{j(!1)}}};return e.jsxs("div",{className:"min-h-screen flex",children:[e.jsxs("div",{className:"hidden lg:flex lg:w-1/2 bg-gradient-to-br from-blue-600 via-purple-600 to-indigo-600 p-12 text-white flex-col justify-between relative overflow-hidden",children:[e.jsx("div",{className:"absolute inset-0 opacity-10",children:e.jsx("div",{className:"absolute inset-0",style:{backgroundImage:"radial-gradient(circle at 2px 2px, white 1px, transparent 0)",backgroundSize:"40px 40px"}})}),e.jsxs("div",{className:"relative z-10",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-12",children:[e.jsx("div",{className:"p-2 bg-white/20 backdrop-blur-sm rounded-lg",children:e.jsx("div",{className:"w-8 h-8 flex items-center justify-center",children:e.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"w-6 h-6",children:e.jsx("path",{d:"M12 2L2 7V17L12 22L22 17V7L12 2ZM12 4.5L19 8.27V15.73L12 19.5L5 15.73V8.27L12 4.5Z"})})})}),e.jsx("div",{className:"text-2xl font-bold tracking-tight",children:"SmartStack"})]}),e.jsxs("div",{className:"space-y-6",children:[e.jsxs("h1",{className:"text-4xl font-bold leading-tight",children:["Créez votre compte",e.jsx("br",{}),e.jsx("span",{className:"text-white/80",children:"et rejoignez-nous"})]}),e.jsx("p",{className:"text-white/80 text-lg max-w-md",children:"Accédez à une plateforme complète de gestion avec authentification sécurisée et tableau de bord personnalisé."})]})]}),e.jsxs("div",{className:"relative z-10 text-sm text-white/60",children:["© ",new Date().getFullYear()," SmartStack. Tous droits réservés."]})]}),e.jsx("div",{className:"w-full lg:w-1/2 flex items-center justify-center p-8 bg-white dark:bg-gray-900",children:e.jsxs("div",{className:"w-full max-w-md",children:[e.jsx("div",{className:"flex justify-end mb-8",children:e.jsx(o.ThemeSwitcher,{})}),e.jsxs("div",{className:"text-center mb-8",children:[e.jsx("h2",{className:"text-3xl font-bold text-gray-900 dark:text-white mb-2",children:"Créer un compte"}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400",children:"Remplissez vos informations pour commencer"})]}),N&&e.jsxs("div",{className:"mb-6 p-4 bg-green-500/10 border border-green-500/20 rounded-lg flex items-start gap-3",children:[e.jsx(s.CheckCircle2,{className:"w-5 h-5 text-green-600 dark:text-green-400 flex-shrink-0 mt-0.5"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-sm text-green-600 dark:text-green-400",children:N}),e.jsx("p",{className:"text-xs text-green-600/80 dark:text-green-400/80 mt-1",children:"Consultez vos emails pour confirmer votre adresse."})]})]}),v&&e.jsxs("div",{className:"mb-6 p-4 bg-red-500/10 border border-red-500/20 rounded-lg flex items-start gap-3",children:[e.jsx(s.AlertCircle,{className:"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5"}),e.jsx("p",{className:"text-sm text-red-500 flex-1",children:v})]}),e.jsxs("form",{onSubmit:L,className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"firstName",className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2",children:"Prénom"}),e.jsxs("div",{className:"relative",children:[e.jsx("div",{className:"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none",children:e.jsx(s.User,{className:"h-5 w-5 text-gray-400"})}),e.jsx("input",{id:"firstName",type:"text",value:m,onChange:t=>f(t.target.value),className:"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors",placeholder:"Jean",required:!0,autoComplete:"given-name",disabled:l})]})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"lastName",className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2",children:"Nom"}),e.jsxs("div",{className:"relative",children:[e.jsx("div",{className:"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none",children:e.jsx(s.User,{className:"h-5 w-5 text-gray-400"})}),e.jsx("input",{id:"lastName",type:"text",value:x,onChange:t=>y(t.target.value),className:"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors",placeholder:"Dupont",required:!0,autoComplete:"family-name",disabled:l})]})]})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"email",className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2",children:"Adresse email"}),e.jsxs("div",{className:"relative",children:[e.jsx("div",{className:"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none",children:e.jsx(s.Mail,{className:"h-5 w-5 text-gray-400"})}),e.jsx("input",{id:"email",type:"email",value:i,onChange:t=>h(t.target.value),className:"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors",placeholder:"vous@exemple.com",required:!0,autoComplete:"email",disabled:l})]})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"password",className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2",children:"Mot de passe"}),e.jsxs("div",{className:"relative",children:[e.jsx("div",{className:"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none",children:e.jsx(s.Lock,{className:"h-5 w-5 text-gray-400"})}),e.jsx("input",{id:"password",type:u?"text":"password",value:c,onChange:t=>p(t.target.value),className:"block w-full pl-10 pr-10 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors",placeholder:"••••••••",required:!0,autoComplete:"new-password",disabled:l}),e.jsx("button",{type:"button",onClick:()=>k(!u),className:"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600 dark:hover:text-gray-300",tabIndex:-1,children:u?e.jsx(s.EyeOff,{className:"h-5 w-5"}):e.jsx(s.Eye,{className:"h-5 w-5"})})]}),e.jsx("p",{className:"mt-1 text-xs text-gray-500 dark:text-gray-400",children:"Minimum 8 caractères"})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"confirmPassword",className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2",children:"Confirmer le mot de passe"}),e.jsxs("div",{className:"relative",children:[e.jsx("div",{className:"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none",children:e.jsx(s.Lock,{className:"h-5 w-5 text-gray-400"})}),e.jsx("input",{id:"confirmPassword",type:g?"text":"password",value:d,onChange:t=>b(t.target.value),className:"block w-full pl-10 pr-10 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors",placeholder:"••••••••",required:!0,autoComplete:"new-password",disabled:l}),e.jsx("button",{type:"button",onClick:()=>S(!g),className:"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600 dark:hover:text-gray-300",tabIndex:-1,children:g?e.jsx(s.EyeOff,{className:"h-5 w-5"}):e.jsx(s.Eye,{className:"h-5 w-5"})})]})]}),e.jsx("button",{type:"submit",disabled:l,className:"w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-all disabled:opacity-50 disabled:cursor-not-allowed",children:l?e.jsxs(e.Fragment,{children:[e.jsx(s.Loader2,{className:"h-5 w-5 animate-spin"}),"Création en cours..."]}):e.jsx(e.Fragment,{children:"Créer mon compte"})})]}),e.jsx("div",{className:"mt-6 text-center space-y-2",children:e.jsxs("p",{className:"text-sm text-gray-600 dark:text-gray-400",children:["Vous avez déjà un compte ?"," ",e.jsx(E.Link,{to:"/login",className:"text-blue-600 dark:text-blue-400 hover:underline font-medium",children:"Se connecter"})]})})]})})]})}exports.RegisterPage=q;
|
|
2
|
+
//# sourceMappingURL=RegisterPage-C4xmVwh9.js.map
|