@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":"TemplatesPage-DdnGgioU.js","sources":["../../src/pages/platform/support/TemplatesPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n FileText,\r\n Plus,\r\n Edit,\r\n Trash2,\r\n Eye,\r\n EyeOff,\r\n Loader2,\r\n Search,\r\n Filter,\r\n X,\r\n Save,\r\n Copy,\r\n Check,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n templatesApi,\r\n type ResponseTemplateDto,\r\n} from '@/services/api/supportApi';\r\n\r\nconst categoryColors: Record<string, string> = {\r\n Greeting: 'bg-[var(--info-bg)] text-[var(--info-text)]',\r\n Acknowledgment: 'bg-[var(--success-bg)] text-[var(--success-text)]',\r\n RequestInfo: 'bg-[var(--warning-bg)] text-[var(--warning-text)]',\r\n Resolution: 'bg-[var(--accent-bg)] text-[var(--accent-text)]',\r\n Escalation: 'bg-[var(--warning-bg)] text-[var(--warning-text)]',\r\n Closure: 'bg-[var(--bg-secondary)] text-[var(--text-secondary)]',\r\n};\r\n\r\nexport function TemplatesPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n\r\n // Get translated category label (fallback to raw value if not found)\r\n const getCategoryLabel = (category: string) => {\r\n const key = `templates.categories.${category}`;\r\n const translated = t(key);\r\n return translated !== key ? translated : category;\r\n };\r\n const [loading, setLoading] = useState(true);\r\n const [templates, setTemplates] = useState<ResponseTemplateDto[]>([]);\r\n const [categories, setCategories] = useState<string[]>([]);\r\n const [search, setSearch] = useState('');\r\n const [categoryFilter, setCategoryFilter] = useState('');\r\n const [showInactive, setShowInactive] = useState(false);\r\n const [showModal, setShowModal] = useState(false);\r\n const [editingTemplate, setEditingTemplate] = useState<ResponseTemplateDto | null>(null);\r\n const [saving, setSaving] = useState(false);\r\n const [copiedId, setCopiedId] = useState<string | null>(null);\r\n\r\n // Form state\r\n const [formData, setFormData] = useState<{\r\n title: string;\r\n content: string;\r\n category: string;\r\n displayOrder: number;\r\n }>({\r\n title: '',\r\n content: '',\r\n category: '',\r\n displayOrder: 0,\r\n });\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const [templatesRes, categoriesRes] = await Promise.all([\r\n templatesApi.getAll(categoryFilter || undefined, !showInactive),\r\n templatesApi.getCategories(),\r\n ]);\r\n setTemplates(templatesRes);\r\n setCategories(categoriesRes);\r\n } catch (error) {\r\n console.error('Failed to load templates:', error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [categoryFilter, showInactive]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const filteredTemplates = templates.filter((t) =>\r\n t.title.toLowerCase().includes(search.toLowerCase()) ||\r\n t.content.toLowerCase().includes(search.toLowerCase())\r\n );\r\n\r\n const handleCreate = () => {\r\n setEditingTemplate(null);\r\n setFormData({\r\n title: '',\r\n content: '',\r\n category: categories[0] || '',\r\n displayOrder: 0,\r\n });\r\n setShowModal(true);\r\n };\r\n\r\n const handleEdit = (template: ResponseTemplateDto) => {\r\n setEditingTemplate(template);\r\n setFormData({\r\n title: template.title,\r\n content: template.content,\r\n category: template.category,\r\n displayOrder: template.displayOrder,\r\n });\r\n setShowModal(true);\r\n };\r\n\r\n const handleSave = async () => {\r\n try {\r\n setSaving(true);\r\n\r\n if (editingTemplate) {\r\n await templatesApi.update(editingTemplate.id, {\r\n title: formData.title,\r\n content: formData.content,\r\n category: formData.category,\r\n displayOrder: formData.displayOrder,\r\n });\r\n } else {\r\n await templatesApi.create({\r\n title: formData.title,\r\n content: formData.content,\r\n category: formData.category,\r\n });\r\n }\r\n\r\n setShowModal(false);\r\n loadData();\r\n } catch (error) {\r\n console.error('Failed to save template:', error);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleDelete = async (id: string) => {\r\n if (!confirm(t('templates.confirmDelete'))) return;\r\n\r\n try {\r\n await templatesApi.delete(id);\r\n loadData();\r\n } catch (error) {\r\n console.error('Failed to delete template:', error);\r\n }\r\n };\r\n\r\n const handleToggleActive = async (template: ResponseTemplateDto) => {\r\n try {\r\n if (template.isActive) {\r\n await templatesApi.deactivate(template.id);\r\n } else {\r\n await templatesApi.activate(template.id);\r\n }\r\n loadData();\r\n } catch (error) {\r\n console.error('Failed to toggle template status:', error);\r\n }\r\n };\r\n\r\n const handleCopyContent = async (template: ResponseTemplateDto) => {\r\n try {\r\n await navigator.clipboard.writeText(template.content);\r\n setCopiedId(template.id);\r\n setTimeout(() => setCopiedId(null), 2000);\r\n } catch (error) {\r\n console.error('Failed to copy:', error);\r\n }\r\n };\r\n\r\n // Available variables for reference\r\n const variables = [\r\n '{{ticketNumber}}',\r\n '{{ticketTitle}}',\r\n '{{userName}}',\r\n '{{userFirstName}}',\r\n '{{userLastName}}',\r\n '{{userEmail}}',\r\n '{{priority}}',\r\n '{{type}}',\r\n '{{status}}',\r\n '{{agentName}}',\r\n '{{agentFirstName}}',\r\n '{{createdAt}}',\r\n '{{resolvedAt}}',\r\n '{{resolution}}',\r\n ];\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('templates.title', 'Response Templates') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold flex items-center gap-2\">\r\n <FileText className=\"w-6 h-6\" />\r\n {t('templates.title')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('templates.subtitle')}\r\n </p>\r\n </div>\r\n <button onClick={handleCreate} className=\"btn btn-primary flex items-center gap-2\">\r\n <Plus className=\"w-4 h-4\" />\r\n {t('templates.newTemplate')}\r\n </button>\r\n </div>\r\n\r\n {/* Filters */}\r\n <div className=\"flex flex-col md:flex-row gap-4\">\r\n <div className=\"relative flex-1\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n placeholder={t('templates.searchPlaceholder')}\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n className=\"input w-full pl-10\"\r\n />\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <Filter className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <select\r\n value={categoryFilter}\r\n onChange={(e) => setCategoryFilter(e.target.value)}\r\n className=\"input\"\r\n >\r\n <option value=\"\">{t('templates.allCategories')}</option>\r\n {categories.map((cat) => (\r\n <option key={cat} value={cat}>\r\n {getCategoryLabel(cat)}\r\n </option>\r\n ))}\r\n </select>\r\n <label className=\"flex items-center gap-2 text-sm\">\r\n <input\r\n type=\"checkbox\"\r\n checked={showInactive}\r\n onChange={(e) => setShowInactive(e.target.checked)}\r\n className=\"rounded border-[var(--border-color)]\"\r\n />\r\n {t('templates.showInactive')}\r\n </label>\r\n </div>\r\n </div>\r\n\r\n {/* Templates Grid */}\r\n {loading && (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n )}\r\n {!loading && filteredTemplates.length > 0 && (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n {filteredTemplates.map((template) => (\r\n <div\r\n key={template.id}\r\n className={`card p-4 ${!template.isActive ? 'opacity-60' : ''}`}\r\n >\r\n <div className=\"flex items-start justify-between mb-3\">\r\n <span\r\n className={`text-xs px-2 py-1 rounded-[var(--radius-badge)] font-medium ${\r\n categoryColors[template.category] || 'bg-[var(--bg-secondary)] text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n {getCategoryLabel(template.category)}\r\n </span>\r\n <div className=\"flex items-center gap-1\">\r\n {!template.isActive && (\r\n <span className=\"text-xs text-[var(--error-text)] mr-2\">{t('templates.inactive')}</span>\r\n )}\r\n <button\r\n onClick={() => handleCopyContent(template)}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)]\"\r\n title={t('templates.actions.copyContent')}\r\n >\r\n {copiedId === template.id ? (\r\n <Check className=\"w-4 h-4 text-[var(--success-text)]\" />\r\n ) : (\r\n <Copy className=\"w-4 h-4\" />\r\n )}\r\n </button>\r\n <button\r\n onClick={() => handleEdit(template)}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)]\"\r\n title={t('templates.actions.edit')}\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => handleToggleActive(template)}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)]\"\r\n title={template.isActive ? t('templates.actions.deactivate') : t('templates.actions.activate')}\r\n >\r\n {template.isActive ? (\r\n <EyeOff className=\"w-4 h-4\" />\r\n ) : (\r\n <Eye className=\"w-4 h-4\" />\r\n )}\r\n </button>\r\n <button\r\n onClick={() => handleDelete(template.id)}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)] text-[var(--error-text)]\"\r\n title={t('templates.actions.delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <h3 className=\"font-semibold mb-2\">{template.title}</h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] line-clamp-3 whitespace-pre-wrap\">\r\n {template.content}\r\n </p>\r\n\r\n <div className=\"mt-3 pt-3 border-t border-[var(--border-color)] flex items-center justify-between text-xs text-[var(--text-secondary)]\">\r\n <span>{t('templates.labels.order')}: {template.displayOrder}</span>\r\n <span>\r\n {t('templates.labels.updated')}: {template.updatedAt\r\n ? new Date(template.updatedAt).toLocaleDateString()\r\n : new Date(template.createdAt).toLocaleDateString()}\r\n </span>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n {!loading && filteredTemplates.length === 0 && (\r\n <div className=\"card p-12 text-center\">\r\n <FileText className=\"w-16 h-16 mx-auto mb-4 opacity-30\" />\r\n <h3 className=\"text-lg font-medium mb-2\">{t('templates.noTemplates')}</h3>\r\n <p className=\"text-[var(--text-secondary)] mb-4\">\r\n {search || categoryFilter\r\n ? t('templates.adjustFilters')\r\n : t('templates.createFirst')}\r\n </p>\r\n {!search && !categoryFilter && (\r\n <button onClick={handleCreate} className=\"btn btn-primary\">\r\n {t('templates.createTemplate')}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Create/Edit Modal */}\r\n {showModal && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-lg shadow-xl w-full max-w-2xl max-h-[90vh] overflow-hidden\">\r\n <div className=\"p-4 border-b border-[var(--border-color)] flex items-center justify-between\">\r\n <h2 className=\"text-lg font-semibold\">\r\n {editingTemplate ? t('templates.editTemplate') : t('templates.createTemplate')}\r\n </h2>\r\n <button\r\n onClick={() => setShowModal(false)}\r\n className=\"p-1 rounded hover:bg-[var(--bg-hover)]\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"p-4 overflow-y-auto\" style={{ maxHeight: 'calc(90vh - 140px)' }}>\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('templates.form.title')} *</label>\r\n <input\r\n type=\"text\"\r\n value={formData.title}\r\n onChange={(e) => setFormData({ ...formData, title: e.target.value })}\r\n className=\"input w-full\"\r\n placeholder={t('templates.form.titlePlaceholder')}\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('templates.form.category')} *</label>\r\n <select\r\n value={formData.category}\r\n onChange={(e) => setFormData({ ...formData, category: e.target.value })}\r\n className=\"input w-full\"\r\n >\r\n {categories.map((cat) => (\r\n <option key={cat} value={cat}>\r\n {getCategoryLabel(cat)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('templates.form.displayOrder')}</label>\r\n <input\r\n type=\"number\"\r\n min=\"0\"\r\n value={formData.displayOrder}\r\n onChange={(e) =>\r\n setFormData({ ...formData, displayOrder: parseInt(e.target.value) || 0 })\r\n }\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('templates.form.content')} *</label>\r\n <textarea\r\n value={formData.content}\r\n onChange={(e) => setFormData({ ...formData, content: e.target.value })}\r\n className=\"input w-full h-48 font-mono text-sm\"\r\n placeholder={t('templates.form.contentPlaceholder')}\r\n />\r\n </div>\r\n\r\n {/* Variables Reference */}\r\n <div className=\"bg-[var(--bg-secondary)] p-3 rounded-lg\">\r\n <h4 className=\"text-sm font-medium mb-2\">{t('templates.form.availableVariables')}</h4>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {variables.map((variable) => (\r\n <button\r\n key={variable}\r\n type=\"button\"\r\n onClick={() => {\r\n const textarea = document.querySelector('textarea');\r\n if (textarea) {\r\n const start = textarea.selectionStart;\r\n const end = textarea.selectionEnd;\r\n const newContent =\r\n formData.content.substring(0, start) +\r\n variable +\r\n formData.content.substring(end);\r\n setFormData({ ...formData, content: newContent });\r\n } else {\r\n setFormData({ ...formData, content: formData.content + variable });\r\n }\r\n }}\r\n className=\"text-xs px-2 py-1 bg-[var(--bg-primary)] rounded border border-[var(--border-color)] hover:bg-[var(--bg-hover)] font-mono\"\r\n >\r\n {variable}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"p-4 border-t border-[var(--border-color)] flex justify-end gap-2\">\r\n <button onClick={() => setShowModal(false)} className=\"btn btn-secondary\">\r\n {t('templates.actions.cancel')}\r\n </button>\r\n <button\r\n onClick={handleSave}\r\n disabled={!formData.title || !formData.content || !formData.category || saving}\r\n className=\"btn btn-primary flex items-center gap-2\"\r\n >\r\n {saving ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Save className=\"w-4 h-4\" />\r\n )}\r\n {editingTemplate ? t('templates.actions.update') : t('templates.actions.create')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["categoryColors","TemplatesPage","t","useTranslation","getCategoryLabel","category","key","translated","loading","setLoading","useState","templates","setTemplates","categories","setCategories","search","setSearch","categoryFilter","setCategoryFilter","showInactive","setShowInactive","showModal","setShowModal","editingTemplate","setEditingTemplate","saving","setSaving","copiedId","setCopiedId","formData","setFormData","loadData","useCallback","templatesRes","categoriesRes","templatesApi","error","useEffect","filteredTemplates","handleCreate","handleEdit","template","handleSave","handleDelete","id","handleToggleActive","handleCopyContent","variables","jsxs","jsx","Breadcrumb","FileText","Plus","Search","Filter","cat","Loader2","Check","Copy","Edit","EyeOff","Eye","Trash2","X","variable","textarea","start","end","newContent","Save"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TemplatesPage-DiEk538p.js","sources":["../../src/pages/platform/support/TemplatesPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n FileText,\r\n Plus,\r\n Edit,\r\n Trash2,\r\n Eye,\r\n EyeOff,\r\n Loader2,\r\n Search,\r\n Filter,\r\n X,\r\n Save,\r\n Copy,\r\n Check,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n templatesApi,\r\n type ResponseTemplateDto,\r\n} from '@/services/api/supportApi';\r\n\r\nconst categoryColors: Record<string, string> = {\r\n Greeting: 'bg-[var(--info-bg)] text-[var(--info-text)]',\r\n Acknowledgment: 'bg-[var(--success-bg)] text-[var(--success-text)]',\r\n RequestInfo: 'bg-[var(--warning-bg)] text-[var(--warning-text)]',\r\n Resolution: 'bg-[var(--accent-bg)] text-[var(--accent-text)]',\r\n Escalation: 'bg-[var(--warning-bg)] text-[var(--warning-text)]',\r\n Closure: 'bg-[var(--bg-secondary)] text-[var(--text-secondary)]',\r\n};\r\n\r\nexport function TemplatesPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n\r\n // Get translated category label (fallback to raw value if not found)\r\n const getCategoryLabel = (category: string) => {\r\n const key = `templates.categories.${category}`;\r\n const translated = t(key);\r\n return translated !== key ? translated : category;\r\n };\r\n const [loading, setLoading] = useState(true);\r\n const [templates, setTemplates] = useState<ResponseTemplateDto[]>([]);\r\n const [categories, setCategories] = useState<string[]>([]);\r\n const [search, setSearch] = useState('');\r\n const [categoryFilter, setCategoryFilter] = useState('');\r\n const [showInactive, setShowInactive] = useState(false);\r\n const [showModal, setShowModal] = useState(false);\r\n const [editingTemplate, setEditingTemplate] = useState<ResponseTemplateDto | null>(null);\r\n const [saving, setSaving] = useState(false);\r\n const [copiedId, setCopiedId] = useState<string | null>(null);\r\n\r\n // Form state\r\n const [formData, setFormData] = useState<{\r\n title: string;\r\n content: string;\r\n category: string;\r\n displayOrder: number;\r\n }>({\r\n title: '',\r\n content: '',\r\n category: '',\r\n displayOrder: 0,\r\n });\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const [templatesRes, categoriesRes] = await Promise.all([\r\n templatesApi.getAll(categoryFilter || undefined, !showInactive),\r\n templatesApi.getCategories(),\r\n ]);\r\n setTemplates(templatesRes);\r\n setCategories(categoriesRes);\r\n } catch (error) {\r\n console.error('Failed to load templates:', error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [categoryFilter, showInactive]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const filteredTemplates = templates.filter((t) =>\r\n t.title.toLowerCase().includes(search.toLowerCase()) ||\r\n t.content.toLowerCase().includes(search.toLowerCase())\r\n );\r\n\r\n const handleCreate = () => {\r\n setEditingTemplate(null);\r\n setFormData({\r\n title: '',\r\n content: '',\r\n category: categories[0] || '',\r\n displayOrder: 0,\r\n });\r\n setShowModal(true);\r\n };\r\n\r\n const handleEdit = (template: ResponseTemplateDto) => {\r\n setEditingTemplate(template);\r\n setFormData({\r\n title: template.title,\r\n content: template.content,\r\n category: template.category,\r\n displayOrder: template.displayOrder,\r\n });\r\n setShowModal(true);\r\n };\r\n\r\n const handleSave = async () => {\r\n try {\r\n setSaving(true);\r\n\r\n if (editingTemplate) {\r\n await templatesApi.update(editingTemplate.id, {\r\n title: formData.title,\r\n content: formData.content,\r\n category: formData.category,\r\n displayOrder: formData.displayOrder,\r\n });\r\n } else {\r\n await templatesApi.create({\r\n title: formData.title,\r\n content: formData.content,\r\n category: formData.category,\r\n });\r\n }\r\n\r\n setShowModal(false);\r\n loadData();\r\n } catch (error) {\r\n console.error('Failed to save template:', error);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleDelete = async (id: string) => {\r\n if (!confirm(t('templates.confirmDelete'))) return;\r\n\r\n try {\r\n await templatesApi.delete(id);\r\n loadData();\r\n } catch (error) {\r\n console.error('Failed to delete template:', error);\r\n }\r\n };\r\n\r\n const handleToggleActive = async (template: ResponseTemplateDto) => {\r\n try {\r\n if (template.isActive) {\r\n await templatesApi.deactivate(template.id);\r\n } else {\r\n await templatesApi.activate(template.id);\r\n }\r\n loadData();\r\n } catch (error) {\r\n console.error('Failed to toggle template status:', error);\r\n }\r\n };\r\n\r\n const handleCopyContent = async (template: ResponseTemplateDto) => {\r\n try {\r\n await navigator.clipboard.writeText(template.content);\r\n setCopiedId(template.id);\r\n setTimeout(() => setCopiedId(null), 2000);\r\n } catch (error) {\r\n console.error('Failed to copy:', error);\r\n }\r\n };\r\n\r\n // Available variables for reference\r\n const variables = [\r\n '{{ticketNumber}}',\r\n '{{ticketTitle}}',\r\n '{{userName}}',\r\n '{{userFirstName}}',\r\n '{{userLastName}}',\r\n '{{userEmail}}',\r\n '{{priority}}',\r\n '{{type}}',\r\n '{{status}}',\r\n '{{agentName}}',\r\n '{{agentFirstName}}',\r\n '{{createdAt}}',\r\n '{{resolvedAt}}',\r\n '{{resolution}}',\r\n ];\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('templates.title', 'Response Templates') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold flex items-center gap-2\">\r\n <FileText className=\"w-6 h-6\" />\r\n {t('templates.title')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('templates.subtitle')}\r\n </p>\r\n </div>\r\n <button onClick={handleCreate} className=\"btn btn-primary flex items-center gap-2\">\r\n <Plus className=\"w-4 h-4\" />\r\n {t('templates.newTemplate')}\r\n </button>\r\n </div>\r\n\r\n {/* Filters */}\r\n <div className=\"flex flex-col md:flex-row gap-4\">\r\n <div className=\"relative flex-1\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n placeholder={t('templates.searchPlaceholder')}\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n className=\"input w-full pl-10\"\r\n />\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <Filter className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <select\r\n value={categoryFilter}\r\n onChange={(e) => setCategoryFilter(e.target.value)}\r\n className=\"input\"\r\n >\r\n <option value=\"\">{t('templates.allCategories')}</option>\r\n {categories.map((cat) => (\r\n <option key={cat} value={cat}>\r\n {getCategoryLabel(cat)}\r\n </option>\r\n ))}\r\n </select>\r\n <label className=\"flex items-center gap-2 text-sm\">\r\n <input\r\n type=\"checkbox\"\r\n checked={showInactive}\r\n onChange={(e) => setShowInactive(e.target.checked)}\r\n className=\"rounded border-[var(--border-color)]\"\r\n />\r\n {t('templates.showInactive')}\r\n </label>\r\n </div>\r\n </div>\r\n\r\n {/* Templates Grid */}\r\n {loading && (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n )}\r\n {!loading && filteredTemplates.length > 0 && (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n {filteredTemplates.map((template) => (\r\n <div\r\n key={template.id}\r\n className={`card p-4 ${!template.isActive ? 'opacity-60' : ''}`}\r\n >\r\n <div className=\"flex items-start justify-between mb-3\">\r\n <span\r\n className={`text-xs px-2 py-1 rounded-[var(--radius-badge)] font-medium ${\r\n categoryColors[template.category] || 'bg-[var(--bg-secondary)] text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n {getCategoryLabel(template.category)}\r\n </span>\r\n <div className=\"flex items-center gap-1\">\r\n {!template.isActive && (\r\n <span className=\"text-xs text-[var(--error-text)] mr-2\">{t('templates.inactive')}</span>\r\n )}\r\n <button\r\n onClick={() => handleCopyContent(template)}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)]\"\r\n title={t('templates.actions.copyContent')}\r\n >\r\n {copiedId === template.id ? (\r\n <Check className=\"w-4 h-4 text-[var(--success-text)]\" />\r\n ) : (\r\n <Copy className=\"w-4 h-4\" />\r\n )}\r\n </button>\r\n <button\r\n onClick={() => handleEdit(template)}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)]\"\r\n title={t('templates.actions.edit')}\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => handleToggleActive(template)}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)]\"\r\n title={template.isActive ? t('templates.actions.deactivate') : t('templates.actions.activate')}\r\n >\r\n {template.isActive ? (\r\n <EyeOff className=\"w-4 h-4\" />\r\n ) : (\r\n <Eye className=\"w-4 h-4\" />\r\n )}\r\n </button>\r\n <button\r\n onClick={() => handleDelete(template.id)}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)] text-[var(--error-text)]\"\r\n title={t('templates.actions.delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <h3 className=\"font-semibold mb-2\">{template.title}</h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] line-clamp-3 whitespace-pre-wrap\">\r\n {template.content}\r\n </p>\r\n\r\n <div className=\"mt-3 pt-3 border-t border-[var(--border-color)] flex items-center justify-between text-xs text-[var(--text-secondary)]\">\r\n <span>{t('templates.labels.order')}: {template.displayOrder}</span>\r\n <span>\r\n {t('templates.labels.updated')}: {template.updatedAt\r\n ? new Date(template.updatedAt).toLocaleDateString()\r\n : new Date(template.createdAt).toLocaleDateString()}\r\n </span>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n {!loading && filteredTemplates.length === 0 && (\r\n <div className=\"card p-12 text-center\">\r\n <FileText className=\"w-16 h-16 mx-auto mb-4 opacity-30\" />\r\n <h3 className=\"text-lg font-medium mb-2\">{t('templates.noTemplates')}</h3>\r\n <p className=\"text-[var(--text-secondary)] mb-4\">\r\n {search || categoryFilter\r\n ? t('templates.adjustFilters')\r\n : t('templates.createFirst')}\r\n </p>\r\n {!search && !categoryFilter && (\r\n <button onClick={handleCreate} className=\"btn btn-primary\">\r\n {t('templates.createTemplate')}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Create/Edit Modal */}\r\n {showModal && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-lg shadow-xl w-full max-w-2xl max-h-[90vh] overflow-hidden\">\r\n <div className=\"p-4 border-b border-[var(--border-color)] flex items-center justify-between\">\r\n <h2 className=\"text-lg font-semibold\">\r\n {editingTemplate ? t('templates.editTemplate') : t('templates.createTemplate')}\r\n </h2>\r\n <button\r\n onClick={() => setShowModal(false)}\r\n className=\"p-1 rounded hover:bg-[var(--bg-hover)]\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"p-4 overflow-y-auto\" style={{ maxHeight: 'calc(90vh - 140px)' }}>\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('templates.form.title')} *</label>\r\n <input\r\n type=\"text\"\r\n value={formData.title}\r\n onChange={(e) => setFormData({ ...formData, title: e.target.value })}\r\n className=\"input w-full\"\r\n placeholder={t('templates.form.titlePlaceholder')}\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('templates.form.category')} *</label>\r\n <select\r\n value={formData.category}\r\n onChange={(e) => setFormData({ ...formData, category: e.target.value })}\r\n className=\"input w-full\"\r\n >\r\n {categories.map((cat) => (\r\n <option key={cat} value={cat}>\r\n {getCategoryLabel(cat)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('templates.form.displayOrder')}</label>\r\n <input\r\n type=\"number\"\r\n min=\"0\"\r\n value={formData.displayOrder}\r\n onChange={(e) =>\r\n setFormData({ ...formData, displayOrder: parseInt(e.target.value) || 0 })\r\n }\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('templates.form.content')} *</label>\r\n <textarea\r\n value={formData.content}\r\n onChange={(e) => setFormData({ ...formData, content: e.target.value })}\r\n className=\"input w-full h-48 font-mono text-sm\"\r\n placeholder={t('templates.form.contentPlaceholder')}\r\n />\r\n </div>\r\n\r\n {/* Variables Reference */}\r\n <div className=\"bg-[var(--bg-secondary)] p-3 rounded-lg\">\r\n <h4 className=\"text-sm font-medium mb-2\">{t('templates.form.availableVariables')}</h4>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {variables.map((variable) => (\r\n <button\r\n key={variable}\r\n type=\"button\"\r\n onClick={() => {\r\n const textarea = document.querySelector('textarea');\r\n if (textarea) {\r\n const start = textarea.selectionStart;\r\n const end = textarea.selectionEnd;\r\n const newContent =\r\n formData.content.substring(0, start) +\r\n variable +\r\n formData.content.substring(end);\r\n setFormData({ ...formData, content: newContent });\r\n } else {\r\n setFormData({ ...formData, content: formData.content + variable });\r\n }\r\n }}\r\n className=\"text-xs px-2 py-1 bg-[var(--bg-primary)] rounded border border-[var(--border-color)] hover:bg-[var(--bg-hover)] font-mono\"\r\n >\r\n {variable}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"p-4 border-t border-[var(--border-color)] flex justify-end gap-2\">\r\n <button onClick={() => setShowModal(false)} className=\"btn btn-secondary\">\r\n {t('templates.actions.cancel')}\r\n </button>\r\n <button\r\n onClick={handleSave}\r\n disabled={!formData.title || !formData.content || !formData.category || saving}\r\n className=\"btn btn-primary flex items-center gap-2\"\r\n >\r\n {saving ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Save className=\"w-4 h-4\" />\r\n )}\r\n {editingTemplate ? t('templates.actions.update') : t('templates.actions.create')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["categoryColors","TemplatesPage","t","useTranslation","getCategoryLabel","category","key","translated","loading","setLoading","useState","templates","setTemplates","categories","setCategories","search","setSearch","categoryFilter","setCategoryFilter","showInactive","setShowInactive","showModal","setShowModal","editingTemplate","setEditingTemplate","saving","setSaving","copiedId","setCopiedId","formData","setFormData","loadData","useCallback","templatesRes","categoriesRes","templatesApi","error","useEffect","filteredTemplates","handleCreate","handleEdit","template","handleSave","handleDelete","id","handleToggleActive","handleCopyContent","variables","jsxs","jsx","Breadcrumb","FileText","Plus","Search","Filter","cat","Loader2","Check","Copy","Edit","EyeOff","Eye","Trash2","X","variable","textarea","start","end","newContent","Save"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { jsxs as r, jsx as e } from "react/jsx-runtime";
|
|
|
2
2
|
import { Link as k } from "react-router-dom";
|
|
3
3
|
import { Check as P, Crown as j, Star as h, Users as A, Link2 as S, UserCheck as b, ArrowRight as T, Trash2 as $ } from "lucide-react";
|
|
4
4
|
import { useTranslation as G } from "react-i18next";
|
|
5
|
-
import { u as D, g as I, a as L } from "./tenantIconMap-
|
|
5
|
+
import { u as D, g as I, a as L } from "./tenantIconMap-BQD9byc8.js";
|
|
6
6
|
const f = {
|
|
7
7
|
Pending: {
|
|
8
8
|
bg: "var(--info-bg)",
|
|
@@ -171,4 +171,4 @@ function F({
|
|
|
171
171
|
export {
|
|
172
172
|
F as T
|
|
173
173
|
};
|
|
174
|
-
//# sourceMappingURL=TenantCard-
|
|
174
|
+
//# sourceMappingURL=TenantCard-BbSYk9_Z.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TenantCard-ffwWsgFQ.js","sources":["../../src/components/tenants/TenantCard.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { Crown, Star, Check, ArrowRight, Users, Trash2, Link2, UserCheck } from 'lucide-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { UserTenantDto } from '@/services/api/adminApi';\r\nimport { useTenantTypeSettings } from '@/hooks/useTenantTypeSettings';\r\nimport { getLucideIcon, getColorClasses } from '@/utils/tenantIconMap';\r\n\r\ninterface TenantCardProps {\r\n readonly tenant: UserTenantDto;\r\n readonly isSelected?: boolean;\r\n readonly isDisabled?: boolean;\r\n readonly disabledReason?: string;\r\n readonly onSelect?: () => void;\r\n readonly onSetDefault?: () => void;\r\n readonly onEnter?: () => void;\r\n readonly onManage?: () => void;\r\n readonly onRemove?: () => void;\r\n readonly showActions?: boolean;\r\n readonly navigateTo?: string;\r\n}\r\n\r\nconst statusColors: Record<string, { bg: string; text: string; dot: string }> = {\r\n Pending: {\r\n bg: 'var(--info-bg)',\r\n text: 'var(--info-text)',\r\n dot: 'var(--info-dot)'\r\n },\r\n Active: {\r\n bg: 'var(--success-bg)',\r\n text: 'var(--success-text)',\r\n dot: 'var(--success-dot)'\r\n },\r\n Suspended: {\r\n bg: 'var(--warning-bg)',\r\n text: 'var(--warning-text)',\r\n dot: 'var(--warning-dot)'\r\n },\r\n Archived: {\r\n bg: 'var(--error-bg)',\r\n text: 'var(--error-text)',\r\n dot: 'var(--error-dot)'\r\n }\r\n};\r\n\r\nexport function TenantCard({\r\n tenant,\r\n isSelected = false,\r\n isDisabled = false,\r\n disabledReason,\r\n onSelect,\r\n onSetDefault,\r\n onEnter,\r\n onManage: _onManage,\r\n onRemove,\r\n showActions = true,\r\n navigateTo\r\n}: TenantCardProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n const { getIconForType } = useTenantTypeSettings();\r\n const isActive = tenant.status === 'Active';\r\n const colors = statusColors[tenant.status] || statusColors.Active;\r\n const effectiveShowActions = showActions && !isDisabled;\r\n\r\n const typeInfo = getIconForType(tenant.type);\r\n const TenantIcon = getLucideIcon(typeInfo.icon);\r\n const typeColors = getColorClasses(typeInfo.color);\r\n\r\n return (\r\n <div\r\n className={`group relative bg-[var(--bg-card)] border overflow-hidden transition-all duration-200 ${\r\n isSelected\r\n ? 'border-emerald-500 ring-2 ring-emerald-500/20'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-300)]'\r\n } ${!isActive ? 'opacity-60' : ''} ${isDisabled ? 'opacity-50 grayscale' : ''}`}\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n title={isDisabled && disabledReason ? disabledReason : undefined}\r\n >\r\n <div className=\"p-5\">\r\n {/* Header with icon and badges */}\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div className=\"flex items-center gap-3\">\r\n {/* Icon */}\r\n <div className={`w-12 h-12 rounded-xl flex items-center justify-center ${typeColors.bg}`}>\r\n <TenantIcon className={`w-6 h-6 ${typeColors.text}`} />\r\n </div>\r\n\r\n {/* Name and slug */}\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)] line-clamp-1\">\r\n {navigateTo ? (\r\n <Link\r\n to={navigateTo}\r\n className=\"hover:text-[var(--color-accent-600)] hover:underline transition-colors\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {tenant.name}\r\n </Link>\r\n ) : (\r\n tenant.name\r\n )}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">{tenant.slug}</p>\r\n </div>\r\n </div>\r\n\r\n {/* Selection indicator */}\r\n {isSelected && (\r\n <div className=\"w-6 h-6 rounded-full bg-emerald-500 flex items-center justify-center\">\r\n <Check className=\"w-4 h-4 text-white\" />\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Organization name (B2B only) */}\r\n {tenant.organisationName && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mb-3 line-clamp-1\">\r\n {tenant.organisationName}\r\n </p>\r\n )}\r\n\r\n {/* Status and badges */}\r\n <div className=\"flex items-center gap-2 flex-wrap mb-4\">\r\n {/* Status badge */}\r\n <span\r\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs font-medium rounded-full\"\r\n style={{ backgroundColor: colors.bg, color: colors.text }}\r\n >\r\n <span\r\n className=\"w-1.5 h-1.5 rounded-full\"\r\n style={{ backgroundColor: colors.dot }}\r\n />\r\n {t(`tenants.status.${tenant.status.toLowerCase()}`, { defaultValue: tenant.status })}\r\n </span>\r\n\r\n {/* Owner badge */}\r\n {tenant.isOwner && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-full bg-amber-500/10 text-amber-600\">\r\n <Crown className=\"w-3 h-3\" />\r\n {t('tenants.owner', 'Owner')}\r\n </span>\r\n )}\r\n\r\n {/* Default badge */}\r\n {tenant.isDefault && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-full bg-[var(--color-accent-500)]/10 text-[var(--color-accent-600)]\">\r\n <Star className=\"w-3 h-3 fill-current\" />\r\n {t('tenants.default', 'Default')}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Membership Source */}\r\n {tenant.membershipSource && tenant.membershipSource !== 'Direct' && (\r\n <div className=\"mb-4 p-2 rounded-lg bg-[var(--bg-secondary)] border border-[var(--border-subtle)]\">\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n {tenant.membershipSource === 'Group' ? (\r\n <Users className=\"w-3.5 h-3.5 text-blue-500\" />\r\n ) : (\r\n <Link2 className=\"w-3.5 h-3.5 text-violet-500\" />\r\n )}\r\n <span className=\"text-xs font-medium text-[var(--text-secondary)]\">\r\n {tenant.membershipSource === 'Group'\r\n ? t('tenants.viaGroup', 'Via groupe')\r\n : t('tenants.directAndGroup', 'Direct + Groupe')}\r\n </span>\r\n </div>\r\n {(tenant.groupPaths?.length ?? 0) > 0 && (\r\n <div className=\"mt-1 space-y-1\">\r\n {tenant.groupPaths?.slice(0, 2).map((path) => (\r\n <div key={path.lineage} className=\"text-xs text-[var(--text-tertiary)] flex items-center gap-1\">\r\n <UserCheck className=\"w-3 h-3\" />\r\n <span className=\"truncate\" title={path.lineage}>\r\n {path.lineage}\r\n </span>\r\n </div>\r\n ))}\r\n {(tenant.groupPaths?.length ?? 0) > 2 && (\r\n <span className=\"text-xs text-[var(--text-tertiary)]\">\r\n +{(tenant.groupPaths?.length ?? 0) - 2} {t('common.more', 'autres')}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Direct membership indicator */}\r\n {tenant.membershipSource === 'Direct' && (\r\n <div className=\"mb-4 flex items-center gap-1.5 text-xs text-[var(--text-tertiary)]\">\r\n <UserCheck className=\"w-3.5 h-3.5 text-green-500\" />\r\n {t('tenants.directMember', 'Membre direct')}\r\n </div>\r\n )}\r\n\r\n {/* Actions */}\r\n {effectiveShowActions && (\r\n <div className=\"flex items-center gap-2 pt-3 border-t border-[var(--border-color)]\">\r\n {/* Set as default */}\r\n {!tenant.isDefault && isActive && onSetDefault && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onSetDefault();\r\n }}\r\n className=\"flex items-center justify-center px-3 py-2 text-[var(--text-secondary)] hover:text-amber-500 hover:bg-[var(--bg-tertiary)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n title={t('tenants.setDefault', 'Set default')}\r\n >\r\n <Star className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n\r\n {/* Enter */}\r\n {isActive && onEnter && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onEnter();\r\n }}\r\n className=\"flex items-center justify-center gap-1.5 px-4 py-2 text-sm font-medium text-white bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n {t('tenants.enter', 'Enter')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n\r\n {/* Remove */}\r\n {onRemove && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onRemove();\r\n }}\r\n className=\"flex items-center justify-center gap-1.5 px-3 py-2 text-sm font-medium text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n title={t('tenants.remove', 'Retirer')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Selectable overlay */}\r\n {onSelect && isActive && (\r\n <button\r\n onClick={onSelect}\r\n className=\"absolute inset-0 z-10\"\r\n aria-label={t('tenants.select', 'Select tenant')}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default TenantCard;\r\n"],"names":["statusColors","TenantCard","tenant","isSelected","isDisabled","disabledReason","onSelect","onSetDefault","onEnter","_onManage","onRemove","showActions","navigateTo","t","useTranslation","getIconForType","useTenantTypeSettings","isActive","colors","effectiveShowActions","typeInfo","TenantIcon","getLucideIcon","typeColors","getColorClasses","jsxs","jsx","Link","e","Check","Crown","Star","Users","Link2","path","UserCheck","ArrowRight","Trash2"],"mappings":";;;;;AAsBA,MAAMA,IAA0E;AAAA,EAC9E,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,KAAK;AAAA,EAAA;AAAA,EAEP,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,KAAK;AAAA,EAAA;AAAA,EAEP,WAAW;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,KAAK;AAAA,EAAA;AAAA,EAEP,UAAU;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,KAAK;AAAA,EAAA;AAET;AAEO,SAASC,EAAW;AAAA,EACzB,QAAAC;AAAA,EACA,YAAAC,IAAa;AAAA,EACb,YAAAC,IAAa;AAAA,EACb,gBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,cAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAUC;AAAA,EACV,UAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,YAAAC;AACF,GAAkC;AAChC,QAAM,EAAE,GAAAC,EAAA,IAAMC,EAAe,YAAY,GACnC,EAAE,gBAAAC,EAAA,IAAmBC,EAAA,GACrBC,IAAWf,EAAO,WAAW,UAC7BgB,IAASlB,EAAaE,EAAO,MAAM,KAAKF,EAAa,QACrDmB,IAAuBR,KAAe,CAACP,GAEvCgB,IAAWL,EAAeb,EAAO,IAAI,GACrCmB,IAAaC,EAAcF,EAAS,IAAI,GACxCG,IAAaC,EAAgBJ,EAAS,KAAK;AAEjD,SACE,gBAAAK;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,yFACTtB,IACI,kDACA,qEACN,IAAKc,IAA0B,KAAf,YAAiB,IAAIb,IAAa,yBAAyB,EAAE;AAAA,MAC7E,OAAO,EAAE,cAAc,qBAAA;AAAA,MACvB,OAAOA,KAAcC,IAAiBA,IAAiB;AAAA,MAEvD,UAAA;AAAA,QAAA,gBAAAoB,EAAC,OAAA,EAAI,WAAU,OAEb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BAEb,UAAA;AAAA,cAAA,gBAAAC,EAAC,OAAA,EAAI,WAAW,yDAAyDH,EAAW,EAAE,IACpF,UAAA,gBAAAG,EAACL,GAAA,EAAW,WAAW,WAAWE,EAAW,IAAI,IAAI,GACvD;AAAA,gCAGC,OAAA,EACC,UAAA;AAAA,gBAAA,gBAAAG,EAAC,MAAA,EAAG,WAAU,yDACX,UAAAd,IACC,gBAAAc;AAAA,kBAACC;AAAA,kBAAA;AAAA,oBACC,IAAIf;AAAA,oBACJ,WAAU;AAAA,oBACV,SAAS,CAACgB,MAAMA,EAAE,gBAAA;AAAA,oBAEjB,UAAA1B,EAAO;AAAA,kBAAA;AAAA,gBAAA,IAGVA,EAAO,MAEX;AAAA,gBACA,gBAAAwB,EAAC,KAAA,EAAE,WAAU,uCAAuC,YAAO,KAAA,CAAK;AAAA,cAAA,EAAA,CAClE;AAAA,YAAA,GACF;AAAA,YAGCvB,uBACE,OAAA,EAAI,WAAU,wEACb,UAAA,gBAAAuB,EAACG,GAAA,EAAM,WAAU,qBAAA,CAAqB,EAAA,CACxC;AAAA,UAAA,GAEJ;AAAA,UAGC3B,EAAO,oBACN,gBAAAwB,EAAC,OAAE,WAAU,0DACV,YAAO,kBACV;AAAA,UAIF,gBAAAD,EAAC,OAAA,EAAI,WAAU,0CAEb,UAAA;AAAA,YAAA,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO,EAAE,iBAAiBP,EAAO,IAAI,OAAOA,EAAO,KAAA;AAAA,gBAEnD,UAAA;AAAA,kBAAA,gBAAAQ;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,OAAO,EAAE,iBAAiBR,EAAO,IAAA;AAAA,oBAAI;AAAA,kBAAA;AAAA,kBAEtCL,EAAE,kBAAkBX,EAAO,OAAO,aAAa,IAAI,EAAE,cAAcA,EAAO,OAAA,CAAQ;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAIpFA,EAAO,WACN,gBAAAuB,EAAC,QAAA,EAAK,WAAU,4GACd,UAAA;AAAA,cAAA,gBAAAC,EAACI,GAAA,EAAM,WAAU,UAAA,CAAU;AAAA,cAC1BjB,EAAE,iBAAiB,OAAO;AAAA,YAAA,GAC7B;AAAA,YAIDX,EAAO,aACN,gBAAAuB,EAAC,QAAA,EAAK,WAAU,4IACd,UAAA;AAAA,cAAA,gBAAAC,EAACK,GAAA,EAAK,WAAU,uBAAA,CAAuB;AAAA,cACtClB,EAAE,mBAAmB,SAAS;AAAA,YAAA,EAAA,CACjC;AAAA,UAAA,GAEJ;AAAA,UAGCX,EAAO,oBAAoBA,EAAO,qBAAqB,YACtD,gBAAAuB,EAAC,OAAA,EAAI,WAAU,qFACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,gCACZ,UAAA;AAAA,cAAAvB,EAAO,qBAAqB,UAC3B,gBAAAwB,EAACM,GAAA,EAAM,WAAU,6BAA4B,IAE7C,gBAAAN,EAACO,GAAA,EAAM,WAAU,8BAAA,CAA8B;AAAA,cAEjD,gBAAAP,EAAC,QAAA,EAAK,WAAU,oDACb,YAAO,qBAAqB,UACzBb,EAAE,oBAAoB,YAAY,IAClCA,EAAE,0BAA0B,iBAAiB,EAAA,CACnD;AAAA,YAAA,GACF;AAAA,aACEX,EAAO,YAAY,UAAU,KAAK,KAClC,gBAAAuB,EAAC,OAAA,EAAI,WAAU,kBACZ,UAAA;AAAA,cAAAvB,EAAO,YAAY,MAAM,GAAG,CAAC,EAAE,IAAI,CAACgC,MACnC,gBAAAT,EAAC,OAAA,EAAuB,WAAU,+DAChC,UAAA;AAAA,gBAAA,gBAAAC,EAACS,GAAA,EAAU,WAAU,UAAA,CAAU;AAAA,gBAC/B,gBAAAT,EAAC,UAAK,WAAU,YAAW,OAAOQ,EAAK,SACpC,YAAK,QAAA,CACR;AAAA,cAAA,KAJQA,EAAK,OAKf,CACD;AAAA,eACChC,EAAO,YAAY,UAAU,KAAK,KAClC,gBAAAuB,EAAC,QAAA,EAAK,WAAU,uCAAsC,UAAA;AAAA,gBAAA;AAAA,iBACjDvB,EAAO,YAAY,UAAU,KAAK;AAAA,gBAAE;AAAA,gBAAEW,EAAE,eAAe,QAAQ;AAAA,cAAA,EAAA,CACpE;AAAA,YAAA,EAAA,CAEJ;AAAA,UAAA,GAEJ;AAAA,UAIDX,EAAO,qBAAqB,YAC3B,gBAAAuB,EAAC,OAAA,EAAI,WAAU,sEACb,UAAA;AAAA,YAAA,gBAAAC,EAACS,GAAA,EAAU,WAAU,6BAAA,CAA6B;AAAA,YACjDtB,EAAE,wBAAwB,eAAe;AAAA,UAAA,GAC5C;AAAA,UAIDM,KACC,gBAAAM,EAAC,OAAA,EAAI,WAAU,sEAEZ,UAAA;AAAA,YAAA,CAACvB,EAAO,aAAae,KAAYV,KAChC,gBAAAmB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,CAACE,MAAM;AACd,kBAAAA,EAAE,gBAAA,GACFrB,EAAA;AAAA,gBACF;AAAA,gBACA,WAAU;AAAA,gBACV,OAAO,EAAE,cAAc,uBAAA;AAAA,gBACvB,OAAOM,EAAE,sBAAsB,aAAa;AAAA,gBAE5C,UAAA,gBAAAa,EAACK,GAAA,EAAK,WAAU,UAAA,CAAU;AAAA,cAAA;AAAA,YAAA;AAAA,YAK7Bd,KAAYT,KACX,gBAAAiB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,CAACG,MAAM;AACd,kBAAAA,EAAE,gBAAA,GACFpB,EAAA;AAAA,gBACF;AAAA,gBACA,WAAU;AAAA,gBACV,OAAO,EAAE,cAAc,uBAAA;AAAA,gBAEtB,UAAA;AAAA,kBAAAK,EAAE,iBAAiB,OAAO;AAAA,kBAC3B,gBAAAa,EAACU,GAAA,EAAW,WAAU,UAAA,CAAU;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAKnC1B,KACC,gBAAAgB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,CAACE,MAAM;AACd,kBAAAA,EAAE,gBAAA,GACFlB,EAAA;AAAA,gBACF;AAAA,gBACA,WAAU;AAAA,gBACV,OAAO,EAAE,cAAc,uBAAA;AAAA,gBACvB,OAAOG,EAAE,kBAAkB,SAAS;AAAA,gBAEpC,UAAA,gBAAAa,EAACW,GAAA,EAAO,WAAU,UAAA,CAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UAC9B,EAAA,CAEJ;AAAA,QAAA,GAEJ;AAAA,QAGC/B,KAAYW,KACX,gBAAAS;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASpB;AAAA,YACT,WAAU;AAAA,YACV,cAAYO,EAAE,kBAAkB,eAAe;AAAA,UAAA;AAAA,QAAA;AAAA,MACjD;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
|
1
|
+
{"version":3,"file":"TenantCard-BbSYk9_Z.js","sources":["../../src/components/tenants/TenantCard.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { Crown, Star, Check, ArrowRight, Users, Trash2, Link2, UserCheck } from 'lucide-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { UserTenantDto } from '@/services/api/adminApi';\r\nimport { useTenantTypeSettings } from '@/hooks/useTenantTypeSettings';\r\nimport { getLucideIcon, getColorClasses } from '@/utils/tenantIconMap';\r\n\r\ninterface TenantCardProps {\r\n readonly tenant: UserTenantDto;\r\n readonly isSelected?: boolean;\r\n readonly isDisabled?: boolean;\r\n readonly disabledReason?: string;\r\n readonly onSelect?: () => void;\r\n readonly onSetDefault?: () => void;\r\n readonly onEnter?: () => void;\r\n readonly onManage?: () => void;\r\n readonly onRemove?: () => void;\r\n readonly showActions?: boolean;\r\n readonly navigateTo?: string;\r\n}\r\n\r\nconst statusColors: Record<string, { bg: string; text: string; dot: string }> = {\r\n Pending: {\r\n bg: 'var(--info-bg)',\r\n text: 'var(--info-text)',\r\n dot: 'var(--info-dot)'\r\n },\r\n Active: {\r\n bg: 'var(--success-bg)',\r\n text: 'var(--success-text)',\r\n dot: 'var(--success-dot)'\r\n },\r\n Suspended: {\r\n bg: 'var(--warning-bg)',\r\n text: 'var(--warning-text)',\r\n dot: 'var(--warning-dot)'\r\n },\r\n Archived: {\r\n bg: 'var(--error-bg)',\r\n text: 'var(--error-text)',\r\n dot: 'var(--error-dot)'\r\n }\r\n};\r\n\r\nexport function TenantCard({\r\n tenant,\r\n isSelected = false,\r\n isDisabled = false,\r\n disabledReason,\r\n onSelect,\r\n onSetDefault,\r\n onEnter,\r\n onManage: _onManage,\r\n onRemove,\r\n showActions = true,\r\n navigateTo\r\n}: TenantCardProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n const { getIconForType } = useTenantTypeSettings();\r\n const isActive = tenant.status === 'Active';\r\n const colors = statusColors[tenant.status] || statusColors.Active;\r\n const effectiveShowActions = showActions && !isDisabled;\r\n\r\n const typeInfo = getIconForType(tenant.type);\r\n const TenantIcon = getLucideIcon(typeInfo.icon);\r\n const typeColors = getColorClasses(typeInfo.color);\r\n\r\n return (\r\n <div\r\n className={`group relative bg-[var(--bg-card)] border overflow-hidden transition-all duration-200 ${\r\n isSelected\r\n ? 'border-emerald-500 ring-2 ring-emerald-500/20'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-300)]'\r\n } ${!isActive ? 'opacity-60' : ''} ${isDisabled ? 'opacity-50 grayscale' : ''}`}\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n title={isDisabled && disabledReason ? disabledReason : undefined}\r\n >\r\n <div className=\"p-5\">\r\n {/* Header with icon and badges */}\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div className=\"flex items-center gap-3\">\r\n {/* Icon */}\r\n <div className={`w-12 h-12 rounded-xl flex items-center justify-center ${typeColors.bg}`}>\r\n <TenantIcon className={`w-6 h-6 ${typeColors.text}`} />\r\n </div>\r\n\r\n {/* Name and slug */}\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)] line-clamp-1\">\r\n {navigateTo ? (\r\n <Link\r\n to={navigateTo}\r\n className=\"hover:text-[var(--color-accent-600)] hover:underline transition-colors\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {tenant.name}\r\n </Link>\r\n ) : (\r\n tenant.name\r\n )}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">{tenant.slug}</p>\r\n </div>\r\n </div>\r\n\r\n {/* Selection indicator */}\r\n {isSelected && (\r\n <div className=\"w-6 h-6 rounded-full bg-emerald-500 flex items-center justify-center\">\r\n <Check className=\"w-4 h-4 text-white\" />\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Organization name (B2B only) */}\r\n {tenant.organisationName && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mb-3 line-clamp-1\">\r\n {tenant.organisationName}\r\n </p>\r\n )}\r\n\r\n {/* Status and badges */}\r\n <div className=\"flex items-center gap-2 flex-wrap mb-4\">\r\n {/* Status badge */}\r\n <span\r\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs font-medium rounded-full\"\r\n style={{ backgroundColor: colors.bg, color: colors.text }}\r\n >\r\n <span\r\n className=\"w-1.5 h-1.5 rounded-full\"\r\n style={{ backgroundColor: colors.dot }}\r\n />\r\n {t(`tenants.status.${tenant.status.toLowerCase()}`, { defaultValue: tenant.status })}\r\n </span>\r\n\r\n {/* Owner badge */}\r\n {tenant.isOwner && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-full bg-amber-500/10 text-amber-600\">\r\n <Crown className=\"w-3 h-3\" />\r\n {t('tenants.owner', 'Owner')}\r\n </span>\r\n )}\r\n\r\n {/* Default badge */}\r\n {tenant.isDefault && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-full bg-[var(--color-accent-500)]/10 text-[var(--color-accent-600)]\">\r\n <Star className=\"w-3 h-3 fill-current\" />\r\n {t('tenants.default', 'Default')}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Membership Source */}\r\n {tenant.membershipSource && tenant.membershipSource !== 'Direct' && (\r\n <div className=\"mb-4 p-2 rounded-lg bg-[var(--bg-secondary)] border border-[var(--border-subtle)]\">\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n {tenant.membershipSource === 'Group' ? (\r\n <Users className=\"w-3.5 h-3.5 text-blue-500\" />\r\n ) : (\r\n <Link2 className=\"w-3.5 h-3.5 text-violet-500\" />\r\n )}\r\n <span className=\"text-xs font-medium text-[var(--text-secondary)]\">\r\n {tenant.membershipSource === 'Group'\r\n ? t('tenants.viaGroup', 'Via groupe')\r\n : t('tenants.directAndGroup', 'Direct + Groupe')}\r\n </span>\r\n </div>\r\n {(tenant.groupPaths?.length ?? 0) > 0 && (\r\n <div className=\"mt-1 space-y-1\">\r\n {tenant.groupPaths?.slice(0, 2).map((path) => (\r\n <div key={path.lineage} className=\"text-xs text-[var(--text-tertiary)] flex items-center gap-1\">\r\n <UserCheck className=\"w-3 h-3\" />\r\n <span className=\"truncate\" title={path.lineage}>\r\n {path.lineage}\r\n </span>\r\n </div>\r\n ))}\r\n {(tenant.groupPaths?.length ?? 0) > 2 && (\r\n <span className=\"text-xs text-[var(--text-tertiary)]\">\r\n +{(tenant.groupPaths?.length ?? 0) - 2} {t('common.more', 'autres')}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Direct membership indicator */}\r\n {tenant.membershipSource === 'Direct' && (\r\n <div className=\"mb-4 flex items-center gap-1.5 text-xs text-[var(--text-tertiary)]\">\r\n <UserCheck className=\"w-3.5 h-3.5 text-green-500\" />\r\n {t('tenants.directMember', 'Membre direct')}\r\n </div>\r\n )}\r\n\r\n {/* Actions */}\r\n {effectiveShowActions && (\r\n <div className=\"flex items-center gap-2 pt-3 border-t border-[var(--border-color)]\">\r\n {/* Set as default */}\r\n {!tenant.isDefault && isActive && onSetDefault && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onSetDefault();\r\n }}\r\n className=\"flex items-center justify-center px-3 py-2 text-[var(--text-secondary)] hover:text-amber-500 hover:bg-[var(--bg-tertiary)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n title={t('tenants.setDefault', 'Set default')}\r\n >\r\n <Star className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n\r\n {/* Enter */}\r\n {isActive && onEnter && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onEnter();\r\n }}\r\n className=\"flex items-center justify-center gap-1.5 px-4 py-2 text-sm font-medium text-white bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n {t('tenants.enter', 'Enter')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n\r\n {/* Remove */}\r\n {onRemove && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onRemove();\r\n }}\r\n className=\"flex items-center justify-center gap-1.5 px-3 py-2 text-sm font-medium text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n title={t('tenants.remove', 'Retirer')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Selectable overlay */}\r\n {onSelect && isActive && (\r\n <button\r\n onClick={onSelect}\r\n className=\"absolute inset-0 z-10\"\r\n aria-label={t('tenants.select', 'Select tenant')}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default TenantCard;\r\n"],"names":["statusColors","TenantCard","tenant","isSelected","isDisabled","disabledReason","onSelect","onSetDefault","onEnter","_onManage","onRemove","showActions","navigateTo","t","useTranslation","getIconForType","useTenantTypeSettings","isActive","colors","effectiveShowActions","typeInfo","TenantIcon","getLucideIcon","typeColors","getColorClasses","jsxs","jsx","Link","e","Check","Crown","Star","Users","Link2","path","UserCheck","ArrowRight","Trash2"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const e=require("react/jsx-runtime"),w=require("react-router-dom"),a=require("lucide-react"),C=require("react-i18next"),n=require("./tenantIconMap-
|
|
2
|
-
//# sourceMappingURL=TenantCard-
|
|
1
|
+
"use strict";const e=require("react/jsx-runtime"),w=require("react-router-dom"),a=require("lucide-react"),C=require("react-i18next"),n=require("./tenantIconMap-CTMuSt18.js"),b={Pending:{bg:"var(--info-bg)",text:"var(--info-text)",dot:"var(--info-dot)"},Active:{bg:"var(--success-bg)",text:"var(--success-text)",dot:"var(--success-dot)"},Suspended:{bg:"var(--warning-bg)",text:"var(--warning-text)",dot:"var(--warning-dot)"},Archived:{bg:"var(--error-bg)",text:"var(--error-text)",dot:"var(--error-dot)"}};function k({tenant:t,isSelected:l=!1,isDisabled:c=!1,disabledReason:d,onSelect:x,onSetDefault:m,onEnter:u,onManage:P,onRemove:p,showActions:f=!0,navigateTo:g}){const{t:s}=C.useTranslation("navigation"),{getIconForType:j}=n.useTenantTypeSettings(),o=t.status==="Active",i=b[t.status]||b.Active,N=f&&!c,v=j(t.type),y=n.getLucideIcon(v.icon),h=n.getColorClasses(v.color);return e.jsxs("div",{className:`group relative bg-[var(--bg-card)] border overflow-hidden transition-all duration-200 ${l?"border-emerald-500 ring-2 ring-emerald-500/20":"border-[var(--border-color)] hover:border-[var(--color-accent-300)]"} ${o?"":"opacity-60"} ${c?"opacity-50 grayscale":""}`,style:{borderRadius:"var(--radius-card)"},title:c&&d?d:void 0,children:[e.jsxs("div",{className:"p-5",children:[e.jsxs("div",{className:"flex items-start justify-between mb-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:`w-12 h-12 rounded-xl flex items-center justify-center ${h.bg}`,children:e.jsx(y,{className:`w-6 h-6 ${h.text}`})}),e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold text-[var(--text-primary)] line-clamp-1",children:g?e.jsx(w.Link,{to:g,className:"hover:text-[var(--color-accent-600)] hover:underline transition-colors",onClick:r=>r.stopPropagation(),children:t.name}):t.name}),e.jsx("p",{className:"text-sm text-[var(--text-tertiary)]",children:t.slug})]})]}),l&&e.jsx("div",{className:"w-6 h-6 rounded-full bg-emerald-500 flex items-center justify-center",children:e.jsx(a.Check,{className:"w-4 h-4 text-white"})})]}),t.organisationName&&e.jsx("p",{className:"text-sm text-[var(--text-secondary)] mb-3 line-clamp-1",children:t.organisationName}),e.jsxs("div",{className:"flex items-center gap-2 flex-wrap mb-4",children:[e.jsxs("span",{className:"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs font-medium rounded-full",style:{backgroundColor:i.bg,color:i.text},children:[e.jsx("span",{className:"w-1.5 h-1.5 rounded-full",style:{backgroundColor:i.dot}}),s(`tenants.status.${t.status.toLowerCase()}`,{defaultValue:t.status})]}),t.isOwner&&e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-full bg-amber-500/10 text-amber-600",children:[e.jsx(a.Crown,{className:"w-3 h-3"}),s("tenants.owner","Owner")]}),t.isDefault&&e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-full bg-[var(--color-accent-500)]/10 text-[var(--color-accent-600)]",children:[e.jsx(a.Star,{className:"w-3 h-3 fill-current"}),s("tenants.default","Default")]})]}),t.membershipSource&&t.membershipSource!=="Direct"&&e.jsxs("div",{className:"mb-4 p-2 rounded-lg bg-[var(--bg-secondary)] border border-[var(--border-subtle)]",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[t.membershipSource==="Group"?e.jsx(a.Users,{className:"w-3.5 h-3.5 text-blue-500"}):e.jsx(a.Link2,{className:"w-3.5 h-3.5 text-violet-500"}),e.jsx("span",{className:"text-xs font-medium text-[var(--text-secondary)]",children:t.membershipSource==="Group"?s("tenants.viaGroup","Via groupe"):s("tenants.directAndGroup","Direct + Groupe")})]}),(t.groupPaths?.length??0)>0&&e.jsxs("div",{className:"mt-1 space-y-1",children:[t.groupPaths?.slice(0,2).map(r=>e.jsxs("div",{className:"text-xs text-[var(--text-tertiary)] flex items-center gap-1",children:[e.jsx(a.UserCheck,{className:"w-3 h-3"}),e.jsx("span",{className:"truncate",title:r.lineage,children:r.lineage})]},r.lineage)),(t.groupPaths?.length??0)>2&&e.jsxs("span",{className:"text-xs text-[var(--text-tertiary)]",children:["+",(t.groupPaths?.length??0)-2," ",s("common.more","autres")]})]})]}),t.membershipSource==="Direct"&&e.jsxs("div",{className:"mb-4 flex items-center gap-1.5 text-xs text-[var(--text-tertiary)]",children:[e.jsx(a.UserCheck,{className:"w-3.5 h-3.5 text-green-500"}),s("tenants.directMember","Membre direct")]}),N&&e.jsxs("div",{className:"flex items-center gap-2 pt-3 border-t border-[var(--border-color)]",children:[!t.isDefault&&o&&m&&e.jsx("button",{onClick:r=>{r.stopPropagation(),m()},className:"flex items-center justify-center px-3 py-2 text-[var(--text-secondary)] hover:text-amber-500 hover:bg-[var(--bg-tertiary)] transition-colors",style:{borderRadius:"var(--radius-button)"},title:s("tenants.setDefault","Set default"),children:e.jsx(a.Star,{className:"w-4 h-4"})}),o&&u&&e.jsxs("button",{onClick:r=>{r.stopPropagation(),u()},className:"flex items-center justify-center gap-1.5 px-4 py-2 text-sm font-medium text-white bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] transition-colors",style:{borderRadius:"var(--radius-button)"},children:[s("tenants.enter","Enter"),e.jsx(a.ArrowRight,{className:"w-4 h-4"})]}),p&&e.jsx("button",{onClick:r=>{r.stopPropagation(),p()},className:"flex items-center justify-center gap-1.5 px-3 py-2 text-sm font-medium text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-colors",style:{borderRadius:"var(--radius-button)"},title:s("tenants.remove","Retirer"),children:e.jsx(a.Trash2,{className:"w-4 h-4"})})]})]}),x&&o&&e.jsx("button",{onClick:x,className:"absolute inset-0 z-10","aria-label":s("tenants.select","Select tenant")})]})}exports.TenantCard=k;
|
|
2
|
+
//# sourceMappingURL=TenantCard-CEkiKxcZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TenantCard-CUjb6og9.js","sources":["../../src/components/tenants/TenantCard.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { Crown, Star, Check, ArrowRight, Users, Trash2, Link2, UserCheck } from 'lucide-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { UserTenantDto } from '@/services/api/adminApi';\r\nimport { useTenantTypeSettings } from '@/hooks/useTenantTypeSettings';\r\nimport { getLucideIcon, getColorClasses } from '@/utils/tenantIconMap';\r\n\r\ninterface TenantCardProps {\r\n readonly tenant: UserTenantDto;\r\n readonly isSelected?: boolean;\r\n readonly isDisabled?: boolean;\r\n readonly disabledReason?: string;\r\n readonly onSelect?: () => void;\r\n readonly onSetDefault?: () => void;\r\n readonly onEnter?: () => void;\r\n readonly onManage?: () => void;\r\n readonly onRemove?: () => void;\r\n readonly showActions?: boolean;\r\n readonly navigateTo?: string;\r\n}\r\n\r\nconst statusColors: Record<string, { bg: string; text: string; dot: string }> = {\r\n Pending: {\r\n bg: 'var(--info-bg)',\r\n text: 'var(--info-text)',\r\n dot: 'var(--info-dot)'\r\n },\r\n Active: {\r\n bg: 'var(--success-bg)',\r\n text: 'var(--success-text)',\r\n dot: 'var(--success-dot)'\r\n },\r\n Suspended: {\r\n bg: 'var(--warning-bg)',\r\n text: 'var(--warning-text)',\r\n dot: 'var(--warning-dot)'\r\n },\r\n Archived: {\r\n bg: 'var(--error-bg)',\r\n text: 'var(--error-text)',\r\n dot: 'var(--error-dot)'\r\n }\r\n};\r\n\r\nexport function TenantCard({\r\n tenant,\r\n isSelected = false,\r\n isDisabled = false,\r\n disabledReason,\r\n onSelect,\r\n onSetDefault,\r\n onEnter,\r\n onManage: _onManage,\r\n onRemove,\r\n showActions = true,\r\n navigateTo\r\n}: TenantCardProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n const { getIconForType } = useTenantTypeSettings();\r\n const isActive = tenant.status === 'Active';\r\n const colors = statusColors[tenant.status] || statusColors.Active;\r\n const effectiveShowActions = showActions && !isDisabled;\r\n\r\n const typeInfo = getIconForType(tenant.type);\r\n const TenantIcon = getLucideIcon(typeInfo.icon);\r\n const typeColors = getColorClasses(typeInfo.color);\r\n\r\n return (\r\n <div\r\n className={`group relative bg-[var(--bg-card)] border overflow-hidden transition-all duration-200 ${\r\n isSelected\r\n ? 'border-emerald-500 ring-2 ring-emerald-500/20'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-300)]'\r\n } ${!isActive ? 'opacity-60' : ''} ${isDisabled ? 'opacity-50 grayscale' : ''}`}\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n title={isDisabled && disabledReason ? disabledReason : undefined}\r\n >\r\n <div className=\"p-5\">\r\n {/* Header with icon and badges */}\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div className=\"flex items-center gap-3\">\r\n {/* Icon */}\r\n <div className={`w-12 h-12 rounded-xl flex items-center justify-center ${typeColors.bg}`}>\r\n <TenantIcon className={`w-6 h-6 ${typeColors.text}`} />\r\n </div>\r\n\r\n {/* Name and slug */}\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)] line-clamp-1\">\r\n {navigateTo ? (\r\n <Link\r\n to={navigateTo}\r\n className=\"hover:text-[var(--color-accent-600)] hover:underline transition-colors\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {tenant.name}\r\n </Link>\r\n ) : (\r\n tenant.name\r\n )}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">{tenant.slug}</p>\r\n </div>\r\n </div>\r\n\r\n {/* Selection indicator */}\r\n {isSelected && (\r\n <div className=\"w-6 h-6 rounded-full bg-emerald-500 flex items-center justify-center\">\r\n <Check className=\"w-4 h-4 text-white\" />\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Organization name (B2B only) */}\r\n {tenant.organisationName && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mb-3 line-clamp-1\">\r\n {tenant.organisationName}\r\n </p>\r\n )}\r\n\r\n {/* Status and badges */}\r\n <div className=\"flex items-center gap-2 flex-wrap mb-4\">\r\n {/* Status badge */}\r\n <span\r\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs font-medium rounded-full\"\r\n style={{ backgroundColor: colors.bg, color: colors.text }}\r\n >\r\n <span\r\n className=\"w-1.5 h-1.5 rounded-full\"\r\n style={{ backgroundColor: colors.dot }}\r\n />\r\n {t(`tenants.status.${tenant.status.toLowerCase()}`, { defaultValue: tenant.status })}\r\n </span>\r\n\r\n {/* Owner badge */}\r\n {tenant.isOwner && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-full bg-amber-500/10 text-amber-600\">\r\n <Crown className=\"w-3 h-3\" />\r\n {t('tenants.owner', 'Owner')}\r\n </span>\r\n )}\r\n\r\n {/* Default badge */}\r\n {tenant.isDefault && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-full bg-[var(--color-accent-500)]/10 text-[var(--color-accent-600)]\">\r\n <Star className=\"w-3 h-3 fill-current\" />\r\n {t('tenants.default', 'Default')}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Membership Source */}\r\n {tenant.membershipSource && tenant.membershipSource !== 'Direct' && (\r\n <div className=\"mb-4 p-2 rounded-lg bg-[var(--bg-secondary)] border border-[var(--border-subtle)]\">\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n {tenant.membershipSource === 'Group' ? (\r\n <Users className=\"w-3.5 h-3.5 text-blue-500\" />\r\n ) : (\r\n <Link2 className=\"w-3.5 h-3.5 text-violet-500\" />\r\n )}\r\n <span className=\"text-xs font-medium text-[var(--text-secondary)]\">\r\n {tenant.membershipSource === 'Group'\r\n ? t('tenants.viaGroup', 'Via groupe')\r\n : t('tenants.directAndGroup', 'Direct + Groupe')}\r\n </span>\r\n </div>\r\n {(tenant.groupPaths?.length ?? 0) > 0 && (\r\n <div className=\"mt-1 space-y-1\">\r\n {tenant.groupPaths?.slice(0, 2).map((path) => (\r\n <div key={path.lineage} className=\"text-xs text-[var(--text-tertiary)] flex items-center gap-1\">\r\n <UserCheck className=\"w-3 h-3\" />\r\n <span className=\"truncate\" title={path.lineage}>\r\n {path.lineage}\r\n </span>\r\n </div>\r\n ))}\r\n {(tenant.groupPaths?.length ?? 0) > 2 && (\r\n <span className=\"text-xs text-[var(--text-tertiary)]\">\r\n +{(tenant.groupPaths?.length ?? 0) - 2} {t('common.more', 'autres')}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Direct membership indicator */}\r\n {tenant.membershipSource === 'Direct' && (\r\n <div className=\"mb-4 flex items-center gap-1.5 text-xs text-[var(--text-tertiary)]\">\r\n <UserCheck className=\"w-3.5 h-3.5 text-green-500\" />\r\n {t('tenants.directMember', 'Membre direct')}\r\n </div>\r\n )}\r\n\r\n {/* Actions */}\r\n {effectiveShowActions && (\r\n <div className=\"flex items-center gap-2 pt-3 border-t border-[var(--border-color)]\">\r\n {/* Set as default */}\r\n {!tenant.isDefault && isActive && onSetDefault && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onSetDefault();\r\n }}\r\n className=\"flex items-center justify-center px-3 py-2 text-[var(--text-secondary)] hover:text-amber-500 hover:bg-[var(--bg-tertiary)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n title={t('tenants.setDefault', 'Set default')}\r\n >\r\n <Star className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n\r\n {/* Enter */}\r\n {isActive && onEnter && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onEnter();\r\n }}\r\n className=\"flex items-center justify-center gap-1.5 px-4 py-2 text-sm font-medium text-white bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n {t('tenants.enter', 'Enter')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n\r\n {/* Remove */}\r\n {onRemove && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onRemove();\r\n }}\r\n className=\"flex items-center justify-center gap-1.5 px-3 py-2 text-sm font-medium text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n title={t('tenants.remove', 'Retirer')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Selectable overlay */}\r\n {onSelect && isActive && (\r\n <button\r\n onClick={onSelect}\r\n className=\"absolute inset-0 z-10\"\r\n aria-label={t('tenants.select', 'Select tenant')}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default TenantCard;\r\n"],"names":["statusColors","TenantCard","tenant","isSelected","isDisabled","disabledReason","onSelect","onSetDefault","onEnter","_onManage","onRemove","showActions","navigateTo","t","useTranslation","getIconForType","useTenantTypeSettings","isActive","colors","effectiveShowActions","typeInfo","TenantIcon","getLucideIcon","typeColors","getColorClasses","jsxs","jsx","Link","e","Check","Crown","Star","Users","Link2","path","UserCheck","ArrowRight","Trash2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TenantCard-CEkiKxcZ.js","sources":["../../src/components/tenants/TenantCard.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { Crown, Star, Check, ArrowRight, Users, Trash2, Link2, UserCheck } from 'lucide-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { UserTenantDto } from '@/services/api/adminApi';\r\nimport { useTenantTypeSettings } from '@/hooks/useTenantTypeSettings';\r\nimport { getLucideIcon, getColorClasses } from '@/utils/tenantIconMap';\r\n\r\ninterface TenantCardProps {\r\n readonly tenant: UserTenantDto;\r\n readonly isSelected?: boolean;\r\n readonly isDisabled?: boolean;\r\n readonly disabledReason?: string;\r\n readonly onSelect?: () => void;\r\n readonly onSetDefault?: () => void;\r\n readonly onEnter?: () => void;\r\n readonly onManage?: () => void;\r\n readonly onRemove?: () => void;\r\n readonly showActions?: boolean;\r\n readonly navigateTo?: string;\r\n}\r\n\r\nconst statusColors: Record<string, { bg: string; text: string; dot: string }> = {\r\n Pending: {\r\n bg: 'var(--info-bg)',\r\n text: 'var(--info-text)',\r\n dot: 'var(--info-dot)'\r\n },\r\n Active: {\r\n bg: 'var(--success-bg)',\r\n text: 'var(--success-text)',\r\n dot: 'var(--success-dot)'\r\n },\r\n Suspended: {\r\n bg: 'var(--warning-bg)',\r\n text: 'var(--warning-text)',\r\n dot: 'var(--warning-dot)'\r\n },\r\n Archived: {\r\n bg: 'var(--error-bg)',\r\n text: 'var(--error-text)',\r\n dot: 'var(--error-dot)'\r\n }\r\n};\r\n\r\nexport function TenantCard({\r\n tenant,\r\n isSelected = false,\r\n isDisabled = false,\r\n disabledReason,\r\n onSelect,\r\n onSetDefault,\r\n onEnter,\r\n onManage: _onManage,\r\n onRemove,\r\n showActions = true,\r\n navigateTo\r\n}: TenantCardProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n const { getIconForType } = useTenantTypeSettings();\r\n const isActive = tenant.status === 'Active';\r\n const colors = statusColors[tenant.status] || statusColors.Active;\r\n const effectiveShowActions = showActions && !isDisabled;\r\n\r\n const typeInfo = getIconForType(tenant.type);\r\n const TenantIcon = getLucideIcon(typeInfo.icon);\r\n const typeColors = getColorClasses(typeInfo.color);\r\n\r\n return (\r\n <div\r\n className={`group relative bg-[var(--bg-card)] border overflow-hidden transition-all duration-200 ${\r\n isSelected\r\n ? 'border-emerald-500 ring-2 ring-emerald-500/20'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-300)]'\r\n } ${!isActive ? 'opacity-60' : ''} ${isDisabled ? 'opacity-50 grayscale' : ''}`}\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n title={isDisabled && disabledReason ? disabledReason : undefined}\r\n >\r\n <div className=\"p-5\">\r\n {/* Header with icon and badges */}\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div className=\"flex items-center gap-3\">\r\n {/* Icon */}\r\n <div className={`w-12 h-12 rounded-xl flex items-center justify-center ${typeColors.bg}`}>\r\n <TenantIcon className={`w-6 h-6 ${typeColors.text}`} />\r\n </div>\r\n\r\n {/* Name and slug */}\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)] line-clamp-1\">\r\n {navigateTo ? (\r\n <Link\r\n to={navigateTo}\r\n className=\"hover:text-[var(--color-accent-600)] hover:underline transition-colors\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {tenant.name}\r\n </Link>\r\n ) : (\r\n tenant.name\r\n )}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">{tenant.slug}</p>\r\n </div>\r\n </div>\r\n\r\n {/* Selection indicator */}\r\n {isSelected && (\r\n <div className=\"w-6 h-6 rounded-full bg-emerald-500 flex items-center justify-center\">\r\n <Check className=\"w-4 h-4 text-white\" />\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Organization name (B2B only) */}\r\n {tenant.organisationName && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mb-3 line-clamp-1\">\r\n {tenant.organisationName}\r\n </p>\r\n )}\r\n\r\n {/* Status and badges */}\r\n <div className=\"flex items-center gap-2 flex-wrap mb-4\">\r\n {/* Status badge */}\r\n <span\r\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs font-medium rounded-full\"\r\n style={{ backgroundColor: colors.bg, color: colors.text }}\r\n >\r\n <span\r\n className=\"w-1.5 h-1.5 rounded-full\"\r\n style={{ backgroundColor: colors.dot }}\r\n />\r\n {t(`tenants.status.${tenant.status.toLowerCase()}`, { defaultValue: tenant.status })}\r\n </span>\r\n\r\n {/* Owner badge */}\r\n {tenant.isOwner && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-full bg-amber-500/10 text-amber-600\">\r\n <Crown className=\"w-3 h-3\" />\r\n {t('tenants.owner', 'Owner')}\r\n </span>\r\n )}\r\n\r\n {/* Default badge */}\r\n {tenant.isDefault && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-full bg-[var(--color-accent-500)]/10 text-[var(--color-accent-600)]\">\r\n <Star className=\"w-3 h-3 fill-current\" />\r\n {t('tenants.default', 'Default')}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Membership Source */}\r\n {tenant.membershipSource && tenant.membershipSource !== 'Direct' && (\r\n <div className=\"mb-4 p-2 rounded-lg bg-[var(--bg-secondary)] border border-[var(--border-subtle)]\">\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n {tenant.membershipSource === 'Group' ? (\r\n <Users className=\"w-3.5 h-3.5 text-blue-500\" />\r\n ) : (\r\n <Link2 className=\"w-3.5 h-3.5 text-violet-500\" />\r\n )}\r\n <span className=\"text-xs font-medium text-[var(--text-secondary)]\">\r\n {tenant.membershipSource === 'Group'\r\n ? t('tenants.viaGroup', 'Via groupe')\r\n : t('tenants.directAndGroup', 'Direct + Groupe')}\r\n </span>\r\n </div>\r\n {(tenant.groupPaths?.length ?? 0) > 0 && (\r\n <div className=\"mt-1 space-y-1\">\r\n {tenant.groupPaths?.slice(0, 2).map((path) => (\r\n <div key={path.lineage} className=\"text-xs text-[var(--text-tertiary)] flex items-center gap-1\">\r\n <UserCheck className=\"w-3 h-3\" />\r\n <span className=\"truncate\" title={path.lineage}>\r\n {path.lineage}\r\n </span>\r\n </div>\r\n ))}\r\n {(tenant.groupPaths?.length ?? 0) > 2 && (\r\n <span className=\"text-xs text-[var(--text-tertiary)]\">\r\n +{(tenant.groupPaths?.length ?? 0) - 2} {t('common.more', 'autres')}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Direct membership indicator */}\r\n {tenant.membershipSource === 'Direct' && (\r\n <div className=\"mb-4 flex items-center gap-1.5 text-xs text-[var(--text-tertiary)]\">\r\n <UserCheck className=\"w-3.5 h-3.5 text-green-500\" />\r\n {t('tenants.directMember', 'Membre direct')}\r\n </div>\r\n )}\r\n\r\n {/* Actions */}\r\n {effectiveShowActions && (\r\n <div className=\"flex items-center gap-2 pt-3 border-t border-[var(--border-color)]\">\r\n {/* Set as default */}\r\n {!tenant.isDefault && isActive && onSetDefault && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onSetDefault();\r\n }}\r\n className=\"flex items-center justify-center px-3 py-2 text-[var(--text-secondary)] hover:text-amber-500 hover:bg-[var(--bg-tertiary)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n title={t('tenants.setDefault', 'Set default')}\r\n >\r\n <Star className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n\r\n {/* Enter */}\r\n {isActive && onEnter && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onEnter();\r\n }}\r\n className=\"flex items-center justify-center gap-1.5 px-4 py-2 text-sm font-medium text-white bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n {t('tenants.enter', 'Enter')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n\r\n {/* Remove */}\r\n {onRemove && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onRemove();\r\n }}\r\n className=\"flex items-center justify-center gap-1.5 px-3 py-2 text-sm font-medium text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n title={t('tenants.remove', 'Retirer')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Selectable overlay */}\r\n {onSelect && isActive && (\r\n <button\r\n onClick={onSelect}\r\n className=\"absolute inset-0 z-10\"\r\n aria-label={t('tenants.select', 'Select tenant')}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default TenantCard;\r\n"],"names":["statusColors","TenantCard","tenant","isSelected","isDisabled","disabledReason","onSelect","onSetDefault","onEnter","_onManage","onRemove","showActions","navigateTo","t","useTranslation","getIconForType","useTenantTypeSettings","isActive","colors","effectiveShowActions","typeInfo","TenantIcon","getLucideIcon","typeColors","getColorClasses","jsxs","jsx","Link","e","Check","Crown","Star","Users","Link2","path","UserCheck","ArrowRight","Trash2"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useState as u, useCallback as U, useEffect as g, useRef as B, useMemo as I } from "react";
|
|
2
|
-
import { k as D } from "./index-
|
|
2
|
+
import { k as D } from "./index-lpIzhufD.js";
|
|
3
3
|
import { jsxs as r, jsx as t, Fragment as $ } from "react/jsx-runtime";
|
|
4
4
|
import { useTranslation as P } from "react-i18next";
|
|
5
5
|
import { Globe as S, Building2 as E, ChevronDown as Q, Search as q, Check as L, AlertTriangle as z, User as H } from "lucide-react";
|
|
@@ -241,4 +241,4 @@ export {
|
|
|
241
241
|
Z as T,
|
|
242
242
|
Y as u
|
|
243
243
|
};
|
|
244
|
-
//# sourceMappingURL=TenantScopeSelector-
|
|
244
|
+
//# sourceMappingURL=TenantScopeSelector-BWfYxvEa.js.map
|
package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js.map → TenantScopeSelector-BWfYxvEa.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TenantScopeSelector-Dz7i1I43.js","sources":["../../src/hooks/useAdminTenants.ts","../../src/components/ui/TenantScopeSelector.tsx"],"sourcesContent":["import { useState, useCallback, useEffect } from 'react';\r\nimport { adminApi, type UserTenantDto } from '@/services/api/adminApi';\r\n\r\n/**\r\n * Hook that fetches ALL tenants directly from the API for admin pages.\r\n * Unlike useTenant().userTenants (which is cached from /api/auth/me at login),\r\n * this hook always returns fresh data including newly created tenants.\r\n *\r\n * Use this for admin pages that need the complete tenant list:\r\n * - GroupDetailPage (role assignment by tenant)\r\n * - UserDetailPage (role assignment by tenant)\r\n * - Any admin page with a TenantScopeSelector\r\n */\r\nexport function useAdminTenants(): {\n tenants: UserTenantDto[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n} {\r\n const [tenants, setTenants] = useState<UserTenantDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadTenants = useCallback(async () => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const data = await adminApi.myTenants.getAll();\r\n setTenants(data);\r\n } catch (err) {\r\n console.error('Failed to load admin tenants:', err);\r\n setError('Failed to load tenants');\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadTenants();\r\n }, [loadTenants]);\r\n\r\n return { tenants, loading, error, refresh: loadTenants };\r\n}\r\n","import { useState, useRef, useEffect, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Globe, Building2, ChevronDown, Check, AlertTriangle, Search, User } from 'lucide-react';\r\n\r\nexport type ScopeValue = 'global' | { tenantId: string; tenantSlug: string; tenantUserId: string; tenantName: string };\r\n\r\ninterface TenantInfo {\r\n tenantId: string;\r\n tenantSlug: string;\r\n tenantName: string;\r\n tenantType?: string;\r\n}\r\n\r\ninterface TenantMembership extends TenantInfo {\r\n tenantUserId: string;\r\n}\r\n\r\ninterface TenantScopeSelectorProps {\r\n /** Current scope value */\r\n readonly value: ScopeValue;\r\n /** Callback when scope changes */\r\n readonly onChange: (scope: ScopeValue) => void;\r\n /** All tenants the admin has access to */\r\n readonly adminTenants: TenantInfo[];\r\n /** User's tenant memberships (with tenantUserId for API calls) - optional for backwards compat */\r\n readonly userTenantMemberships?: TenantMembership[];\r\n /** Whether the selector is disabled */\r\n readonly disabled?: boolean;\r\n /** Show warning when user is not member of selected tenant */\r\n readonly showNotMemberWarning?: boolean;\r\n}\r\n\r\ntype FilterType = 'all' | 'b2b' | 'b2c';\r\n\r\n/**\r\n * Selector component for choosing between Global scope (platform-wide)\r\n * and Tenant scope (tenant-specific roles/permissions).\r\n * Features: search, B2B/B2C filtering, membership indicators.\r\n */\r\nexport function TenantScopeSelector({\r\n value,\r\n onChange,\r\n adminTenants,\r\n userTenantMemberships = [],\r\n disabled = false,\r\n showNotMemberWarning = false,\r\n}: TenantScopeSelectorProps): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [filterType, setFilterType] = useState<FilterType>('all');\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n const searchInputRef = useRef<HTMLInputElement>(null);\r\n\r\n // Close on click outside\r\n useEffect(() => {\r\n function handleClickOutside(event: MouseEvent) {\r\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\r\n setIsOpen(false);\r\n }\r\n }\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => document.removeEventListener('mousedown', handleClickOutside);\r\n }, []);\r\n\r\n // Close on Escape\r\n useEffect(() => {\r\n function handleEscape(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n setIsOpen(false);\r\n }\r\n }\r\n document.addEventListener('keydown', handleEscape);\r\n return () => document.removeEventListener('keydown', handleEscape);\r\n }, []);\r\n\r\n // Focus search input when opening\r\n useEffect(() => {\r\n if (isOpen && searchInputRef.current) {\r\n setTimeout(() => searchInputRef.current?.focus(), 50);\r\n }\r\n }, [isOpen]);\r\n\r\n // Create a map for quick membership lookup\r\n const membershipMap = useMemo(() => {\r\n const map = new Map<string, TenantMembership>();\r\n userTenantMemberships.forEach(m => map.set(m.tenantId, m));\r\n return map;\r\n }, [userTenantMemberships]);\r\n\r\n // Filter and categorize tenants\r\n const { b2bTenants, b2cTenants, filteredTenants } = useMemo(() => {\r\n const b2b = adminTenants.filter(t => t.tenantType === 'Business');\r\n const b2c = adminTenants.filter(t => t.tenantType === 'Personal');\r\n\r\n let filtered = adminTenants;\r\n\r\n // Apply type filter\r\n if (filterType === 'b2b') {\r\n filtered = b2b;\r\n } else if (filterType === 'b2c') {\r\n filtered = b2c;\r\n }\r\n\r\n // Apply search filter\r\n if (searchQuery.trim()) {\r\n const query = searchQuery.toLowerCase().trim();\r\n filtered = filtered.filter(t => t.tenantName.toLowerCase().includes(query));\r\n }\r\n\r\n return { b2bTenants: b2b, b2cTenants: b2c, filteredTenants: filtered };\r\n }, [adminTenants, filterType, searchQuery]);\r\n\r\n const isGlobal = value === 'global';\r\n const selectedTenant = !isGlobal ? value : null;\r\n\r\n const handleSelectGlobal = () => {\r\n onChange('global');\r\n setIsOpen(false);\r\n setSearchQuery('');\r\n };\r\n\r\n const handleSelectTenant = (tenant: TenantInfo) => {\r\n const membership = membershipMap.get(tenant.tenantId);\r\n onChange({\r\n tenantId: tenant.tenantId,\r\n tenantSlug: tenant.tenantSlug,\r\n tenantUserId: membership?.tenantUserId || '',\r\n tenantName: tenant.tenantName,\r\n });\r\n setIsOpen(false);\r\n setSearchQuery('');\r\n };\r\n\r\n // Don't render if no tenants\r\n if (adminTenants.length === 0) {\r\n return null;\r\n }\r\n\r\n const renderTenantOption = (tenant: TenantInfo) => {\r\n const isSelected = !isGlobal && selectedTenant?.tenantId === tenant.tenantId;\r\n const isB2B = tenant.tenantType === 'Business';\r\n const isMember = membershipMap.has(tenant.tenantId);\r\n\r\n return (\r\n <button\r\n key={tenant.tenantId}\r\n type=\"button\"\r\n onClick={() => handleSelectTenant(tenant)}\r\n className={`w-full flex items-center gap-3 px-3 py-2.5 text-left transition-colors ${\r\n isSelected\r\n ? 'bg-blue-500/10 text-blue-700'\r\n : 'hover:bg-[var(--bg-tertiary)] text-[var(--text-primary)]'\r\n }`}\r\n role=\"option\"\r\n aria-selected={isSelected}\r\n >\r\n <div\r\n className={`flex-shrink-0 w-8 h-8 flex items-center justify-center ${\r\n isB2B ? 'bg-blue-500/10' : 'bg-violet-500/10'\r\n }`}\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <Building2 className={`w-4 h-4 ${isB2B ? 'text-blue-500' : 'text-violet-500'}`} />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium truncate\">{tenant.tenantName}</span>\r\n {isMember && (\r\n <span className=\"flex-shrink-0 text-xs px-1.5 py-0.5 rounded bg-emerald-500/10 text-emerald-600\">\r\n <User className=\"w-3 h-3 inline mr-0.5\" />\r\n {t('userRoles.scope.selector.member', 'Membre')}\r\n </span>\r\n )}\r\n </div>\r\n <span className=\"text-xs text-[var(--text-tertiary)]\">\r\n {isB2B\r\n ? t('userRoles.scope.selector.b2b', 'Business')\r\n : t('userRoles.scope.selector.b2c', 'Personnel')}\r\n </span>\r\n </div>\r\n {isSelected && <Check className=\"w-4 h-4 text-blue-600 flex-shrink-0\" />}\r\n </button>\r\n );\r\n };\r\n\r\n return (\r\n <div ref={menuRef} className=\"relative inline-block\">\r\n {/* Trigger Button */}\r\n <button\r\n type=\"button\"\r\n onClick={() => !disabled && setIsOpen(!isOpen)}\r\n disabled={disabled}\r\n className={`flex items-center gap-2 px-3 py-2 text-sm font-medium border transition-colors ${\r\n isGlobal\r\n ? 'bg-emerald-500/10 border-emerald-500/30 text-emerald-700 hover:bg-emerald-500/20'\r\n : 'bg-blue-500/10 border-blue-500/30 text-blue-700 hover:bg-blue-500/20'\r\n } ${disabled ? 'opacity-50 cursor-not-allowed' : ''}`}\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n aria-expanded={isOpen}\r\n aria-haspopup=\"listbox\"\r\n >\r\n {isGlobal ? (\r\n <>\r\n <Globe className=\"w-4 h-4\" />\r\n <span>{t('userRoles.scope.selector.global', 'Global (plateforme)')}</span>\r\n </>\r\n ) : (\r\n <>\r\n <Building2 className=\"w-4 h-4\" />\r\n <span className=\"max-w-[150px] truncate\">{selectedTenant?.tenantName}</span>\r\n </>\r\n )}\r\n <ChevronDown className={`w-4 h-4 transition-transform ${isOpen ? 'rotate-180' : ''}`} />\r\n </button>\r\n\r\n {/* Dropdown Menu */}\r\n <div\r\n className={`absolute left-0 mt-1 w-80 z-50 transition-all duration-150 ease-out ${\r\n isOpen\r\n ? 'opacity-100 scale-100 translate-y-0'\r\n : 'opacity-0 scale-95 -translate-y-1 pointer-events-none'\r\n }`}\r\n >\r\n <div\r\n className=\"bg-[var(--bg-card)] border border-[var(--border-color)] shadow-xl overflow-hidden\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n {/* Header with Search */}\r\n <div className=\"px-3 py-2 border-b border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-muted)]\" />\r\n <input\r\n ref={searchInputRef}\r\n type=\"text\"\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(e.target.value)}\r\n placeholder={t('userRoles.scope.selector.search', 'Rechercher un tenant...')}\r\n className=\"w-full pl-8 pr-3 py-1.5 text-sm bg-[var(--bg-primary)] border border-[var(--border-color)] rounded-md text-[var(--text-primary)] placeholder-[var(--text-muted)] focus:outline-none focus:ring-1 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Filter Tabs */}\r\n <div className=\"flex items-center gap-1 px-3 py-2 border-b border-[var(--border-color)] bg-[var(--bg-tertiary)]\" role=\"tablist\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setFilterType('all')}\r\n className={`px-2.5 py-1 text-xs font-medium rounded-md transition-colors ${\r\n filterType === 'all'\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n role=\"tab\"\r\n aria-selected={filterType === 'all'}\r\n >\r\n {t('userRoles.scope.selector.filterAll', 'Tous')} ({adminTenants.length})\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setFilterType('b2b')}\r\n className={`px-2.5 py-1 text-xs font-medium rounded-md transition-colors ${\r\n filterType === 'b2b'\r\n ? 'bg-blue-600 text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n role=\"tab\"\r\n aria-selected={filterType === 'b2b'}\r\n >\r\n {t('userRoles.scope.selector.filterB2B', 'B2B')} ({b2bTenants.length})\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setFilterType('b2c')}\r\n className={`px-2.5 py-1 text-xs font-medium rounded-md transition-colors ${\r\n filterType === 'b2c'\r\n ? 'bg-violet-600 text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n role=\"tab\"\r\n aria-selected={filterType === 'b2c'}\r\n >\r\n {t('userRoles.scope.selector.filterB2C', 'B2C')} ({b2cTenants.length})\r\n </button>\r\n </div>\r\n\r\n {/* Options */}\r\n <div className=\"py-1 max-h-72 overflow-y-auto\" role=\"listbox\">\r\n {/* Global Option */}\r\n <button\r\n type=\"button\"\r\n onClick={handleSelectGlobal}\r\n className={`w-full flex items-center gap-3 px-3 py-2.5 text-left transition-colors ${\r\n isGlobal\r\n ? 'bg-emerald-500/10 text-emerald-700'\r\n : 'hover:bg-[var(--bg-tertiary)] text-[var(--text-primary)]'\r\n }`}\r\n role=\"option\"\r\n aria-selected={isGlobal}\r\n >\r\n <div\r\n className=\"flex-shrink-0 w-8 h-8 flex items-center justify-center bg-emerald-500/10\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <Globe className=\"w-4 h-4 text-emerald-600\" />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <span className=\"font-medium block\">\r\n {t('userRoles.scope.selector.global', 'Global (plateforme)')}\r\n </span>\r\n <span className=\"text-xs text-[var(--text-tertiary)]\">\r\n {t('userRoles.scope.selector.globalDesc', 'Rôles applicables sur toute la plateforme')}\r\n </span>\r\n </div>\r\n {isGlobal && <Check className=\"w-4 h-4 text-emerald-600 flex-shrink-0\" />}\r\n </button>\r\n\r\n {/* Divider */}\r\n {filteredTenants.length > 0 && (\r\n <div className=\"border-t border-[var(--border-color)] my-1\" />\r\n )}\r\n\r\n {/* Tenant Options */}\r\n {filteredTenants.length > 0 ? (\r\n filteredTenants.map(renderTenantOption)\r\n ) : (\r\n <div className=\"px-3 py-4 text-center text-sm text-[var(--text-muted)]\">\r\n {t('userRoles.scope.selector.noResults', 'Aucun tenant trouvé')}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Not Member Warning */}\r\n {showNotMemberWarning && !isGlobal && (\r\n <div className=\"mt-2 flex items-center gap-2 text-sm text-amber-600\">\r\n <AlertTriangle className=\"w-4 h-4\" />\r\n <span>{t('userRoles.scope.notMember', \"L'utilisateur n'est pas membre de ce tenant\")}</span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["useAdminTenants","tenants","setTenants","useState","loading","setLoading","error","setError","loadTenants","useCallback","data","adminApi","err","useEffect","TenantScopeSelector","value","onChange","adminTenants","userTenantMemberships","disabled","showNotMemberWarning","t","useTranslation","isOpen","setIsOpen","searchQuery","setSearchQuery","filterType","setFilterType","menuRef","useRef","searchInputRef","handleClickOutside","event","handleEscape","membershipMap","useMemo","map","m","b2bTenants","b2cTenants","filteredTenants","b2b","b2c","filtered","query","isGlobal","selectedTenant","handleSelectGlobal","handleSelectTenant","tenant","membership","renderTenantOption","isSelected","isB2B","isMember","jsxs","jsx","Building2","User","Check","Fragment","Globe","ChevronDown","Search","AlertTriangle"],"mappings":";;;;;AAaO,SAASA,IAKd;AACA,QAAM,CAACC,GAASC,CAAU,IAAIC,EAA0B,CAAA,CAAE,GACpD,CAACC,GAASC,CAAU,IAAIF,EAAS,EAAI,GACrC,CAACG,GAAOC,CAAQ,IAAIJ,EAAwB,IAAI,GAEhDK,IAAcC,EAAY,YAAY;AAC1C,IAAAJ,EAAW,EAAI,GACfE,EAAS,IAAI;AACb,QAAI;AACF,YAAMG,IAAO,MAAMC,EAAS,UAAU,OAAA;AACtC,MAAAT,EAAWQ,CAAI;AAAA,IACjB,SAASE,GAAK;AACZ,cAAQ,MAAM,iCAAiCA,CAAG,GAClDL,EAAS,wBAAwB;AAAA,IACnC,UAAA;AACE,MAAAF,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,SAAAQ,EAAU,MAAM;AACd,IAAAL,EAAA;AAAA,EACF,GAAG,CAACA,CAAW,CAAC,GAET,EAAE,SAAAP,GAAS,SAAAG,GAAS,OAAAE,GAAO,SAASE,EAAA;AAC7C;ACFO,SAASM,EAAoB;AAAA,EAClC,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,cAAAC;AAAA,EACA,uBAAAC,IAAwB,CAAA;AAAA,EACxB,UAAAC,IAAW;AAAA,EACX,sBAAAC,IAAuB;AACzB,GAAkD;AAChD,QAAM,EAAE,GAAAC,EAAA,IAAMC,EAAe,OAAO,GAC9B,CAACC,GAAQC,CAAS,IAAIrB,EAAS,EAAK,GACpC,CAACsB,GAAaC,CAAc,IAAIvB,EAAS,EAAE,GAC3C,CAACwB,GAAYC,CAAa,IAAIzB,EAAqB,KAAK,GACxD0B,IAAUC,EAAuB,IAAI,GACrCC,IAAiBD,EAAyB,IAAI;AAGpD,EAAAjB,EAAU,MAAM;AACd,aAASmB,EAAmBC,GAAmB;AAC7C,MAAIJ,EAAQ,WAAW,CAACA,EAAQ,QAAQ,SAASI,EAAM,MAAc,KACnET,EAAU,EAAK;AAAA,IAEnB;AACA,oBAAS,iBAAiB,aAAaQ,CAAkB,GAClD,MAAM,SAAS,oBAAoB,aAAaA,CAAkB;AAAA,EAC3E,GAAG,CAAA,CAAE,GAGLnB,EAAU,MAAM;AACd,aAASqB,EAAaD,GAAsB;AAC1C,MAAIA,EAAM,QAAQ,YAChBT,EAAU,EAAK;AAAA,IAEnB;AACA,oBAAS,iBAAiB,WAAWU,CAAY,GAC1C,MAAM,SAAS,oBAAoB,WAAWA,CAAY;AAAA,EACnE,GAAG,CAAA,CAAE,GAGLrB,EAAU,MAAM;AACd,IAAIU,KAAUQ,EAAe,WAC3B,WAAW,MAAMA,EAAe,SAAS,MAAA,GAAS,EAAE;AAAA,EAExD,GAAG,CAACR,CAAM,CAAC;AAGX,QAAMY,IAAgBC,EAAQ,MAAM;AAClC,UAAMC,wBAAU,IAAA;AAChB,WAAAnB,EAAsB,QAAQ,CAAAoB,MAAKD,EAAI,IAAIC,EAAE,UAAUA,CAAC,CAAC,GAClDD;AAAA,EACT,GAAG,CAACnB,CAAqB,CAAC,GAGpB,EAAE,YAAAqB,GAAY,YAAAC,GAAY,iBAAAC,EAAA,IAAoBL,EAAQ,MAAM;AAChE,UAAMM,IAAMzB,EAAa,OAAO,CAAAI,MAAKA,EAAE,eAAe,UAAU,GAC1DsB,IAAM1B,EAAa,OAAO,CAAAI,MAAKA,EAAE,eAAe,UAAU;AAEhE,QAAIuB,IAAW3B;AAUf,QAPIU,MAAe,QACjBiB,IAAWF,IACFf,MAAe,UACxBiB,IAAWD,IAITlB,EAAY,QAAQ;AACtB,YAAMoB,IAAQpB,EAAY,YAAA,EAAc,KAAA;AACxC,MAAAmB,IAAWA,EAAS,OAAO,CAAAvB,MAAKA,EAAE,WAAW,YAAA,EAAc,SAASwB,CAAK,CAAC;AAAA,IAC5E;AAEA,WAAO,EAAE,YAAYH,GAAK,YAAYC,GAAK,iBAAiBC,EAAA;AAAA,EAC9D,GAAG,CAAC3B,GAAcU,GAAYF,CAAW,CAAC,GAEpCqB,IAAW/B,MAAU,UACrBgC,IAAkBD,IAAmB,OAAR/B,GAE7BiC,IAAqB,MAAM;AAC/B,IAAAhC,EAAS,QAAQ,GACjBQ,EAAU,EAAK,GACfE,EAAe,EAAE;AAAA,EACnB,GAEMuB,IAAqB,CAACC,MAAuB;AACjD,UAAMC,IAAahB,EAAc,IAAIe,EAAO,QAAQ;AACpD,IAAAlC,EAAS;AAAA,MACP,UAAUkC,EAAO;AAAA,MACjB,YAAYA,EAAO;AAAA,MACnB,cAAcC,GAAY,gBAAgB;AAAA,MAC1C,YAAYD,EAAO;AAAA,IAAA,CACpB,GACD1B,EAAU,EAAK,GACfE,EAAe,EAAE;AAAA,EACnB;AAGA,MAAIT,EAAa,WAAW;AAC1B,WAAO;AAGT,QAAMmC,IAAqB,CAACF,MAAuB;AACjD,UAAMG,IAAa,CAACP,KAAYC,GAAgB,aAAaG,EAAO,UAC9DI,IAAQJ,EAAO,eAAe,YAC9BK,IAAWpB,EAAc,IAAIe,EAAO,QAAQ;AAElD,WACE,gBAAAM;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,SAAS,MAAMP,EAAmBC,CAAM;AAAA,QACxC,WAAW,0EACTG,IACI,iCACA,0DACN;AAAA,QACA,MAAK;AAAA,QACL,iBAAeA;AAAA,QAEf,UAAA;AAAA,UAAA,gBAAAI;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW,0DACTH,IAAQ,mBAAmB,kBAC7B;AAAA,cACA,OAAO,EAAE,cAAc,qBAAA;AAAA,cAEvB,4BAACI,GAAA,EAAU,WAAW,WAAWJ,IAAQ,kBAAkB,iBAAiB,GAAA,CAAI;AAAA,YAAA;AAAA,UAAA;AAAA,UAElF,gBAAAE,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,cAAA,gBAAAC,EAAC,QAAA,EAAK,WAAU,wBAAwB,UAAAP,EAAO,YAAW;AAAA,cACzDK,KACC,gBAAAC,EAAC,QAAA,EAAK,WAAU,kFACd,UAAA;AAAA,gBAAA,gBAAAC,EAACE,GAAA,EAAK,WAAU,wBAAA,CAAwB;AAAA,gBACvCtC,EAAE,mCAAmC,QAAQ;AAAA,cAAA,EAAA,CAChD;AAAA,YAAA,GAEJ;AAAA,YACA,gBAAAoC,EAAC,QAAA,EAAK,WAAU,uCACb,UAAAH,IACGjC,EAAE,gCAAgC,UAAU,IAC5CA,EAAE,gCAAgC,WAAW,EAAA,CACnD;AAAA,UAAA,GACF;AAAA,UACCgC,KAAc,gBAAAI,EAACG,GAAA,EAAM,WAAU,sCAAA,CAAsC;AAAA,QAAA;AAAA,MAAA;AAAA,MAnCjEV,EAAO;AAAA,IAAA;AAAA,EAsClB;AAEA,SACE,gBAAAM,EAAC,OAAA,EAAI,KAAK3B,GAAS,WAAU,yBAE3B,UAAA;AAAA,IAAA,gBAAA2B;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,CAACrC,KAAYK,EAAU,CAACD,CAAM;AAAA,QAC7C,UAAAJ;AAAA,QACA,WAAW,kFACT2B,IACI,qFACA,sEACN,IAAI3B,IAAW,kCAAkC,EAAE;AAAA,QACnD,OAAO,EAAE,cAAc,uBAAA;AAAA,QACvB,iBAAeI;AAAA,QACf,iBAAc;AAAA,QAEb,UAAA;AAAA,UAAAuB,IACC,gBAAAU,EAAAK,GAAA,EACE,UAAA;AAAA,YAAA,gBAAAJ,EAACK,GAAA,EAAM,WAAU,UAAA,CAAU;AAAA,YAC3B,gBAAAL,EAAC,QAAA,EAAM,UAAApC,EAAE,mCAAmC,qBAAqB,EAAA,CAAE;AAAA,UAAA,EAAA,CACrE,IAEA,gBAAAmC,EAAAK,GAAA,EACE,UAAA;AAAA,YAAA,gBAAAJ,EAACC,GAAA,EAAU,WAAU,UAAA,CAAU;AAAA,YAC/B,gBAAAD,EAAC,QAAA,EAAK,WAAU,0BAA0B,aAAgB,WAAA,CAAW;AAAA,UAAA,GACvE;AAAA,4BAEDM,GAAA,EAAY,WAAW,gCAAgCxC,IAAS,eAAe,EAAE,GAAA,CAAI;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAIxF,gBAAAkC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,uEACTlC,IACI,wCACA,uDACN;AAAA,QAEA,UAAA,gBAAAiC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,cAAc,qBAAA;AAAA,YAGvB,UAAA;AAAA,cAAA,gBAAAC,EAAC,SAAI,WAAU,4EACb,UAAA,gBAAAD,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,gBAAA,gBAAAC,EAACO,GAAA,EAAO,WAAU,8EAAA,CAA8E;AAAA,gBAChG,gBAAAP;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,KAAK1B;AAAA,oBACL,MAAK;AAAA,oBACL,OAAON;AAAA,oBACP,UAAU,CAAC,MAAMC,EAAe,EAAE,OAAO,KAAK;AAAA,oBAC9C,aAAaL,EAAE,mCAAmC,yBAAyB;AAAA,oBAC3E,WAAU;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACZ,EAAA,CACF,EAAA,CACF;AAAA,cAGA,gBAAAmC,EAAC,OAAA,EAAI,WAAU,mGAAkG,MAAK,WACpH,UAAA;AAAA,gBAAA,gBAAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM5B,EAAc,KAAK;AAAA,oBAClC,WAAW,gEACTD,MAAe,QACX,4CACA,yDACN;AAAA,oBACA,MAAK;AAAA,oBACL,iBAAeA,MAAe;AAAA,oBAE7B,UAAA;AAAA,sBAAAN,EAAE,sCAAsC,MAAM;AAAA,sBAAE;AAAA,sBAAGJ,EAAa;AAAA,sBAAO;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAE1E,gBAAAuC;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM5B,EAAc,KAAK;AAAA,oBAClC,WAAW,gEACTD,MAAe,QACX,2BACA,yDACN;AAAA,oBACA,MAAK;AAAA,oBACL,iBAAeA,MAAe;AAAA,oBAE7B,UAAA;AAAA,sBAAAN,EAAE,sCAAsC,KAAK;AAAA,sBAAE;AAAA,sBAAGkB,EAAW;AAAA,sBAAO;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEvE,gBAAAiB;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM5B,EAAc,KAAK;AAAA,oBAClC,WAAW,gEACTD,MAAe,QACX,6BACA,yDACN;AAAA,oBACA,MAAK;AAAA,oBACL,iBAAeA,MAAe;AAAA,oBAE7B,UAAA;AAAA,sBAAAN,EAAE,sCAAsC,KAAK;AAAA,sBAAE;AAAA,sBAAGmB,EAAW;AAAA,sBAAO;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACvE,GACF;AAAA,cAGA,gBAAAgB,EAAC,OAAA,EAAI,WAAU,iCAAgC,MAAK,WAElD,UAAA;AAAA,gBAAA,gBAAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAASR;AAAA,oBACT,WAAW,0EACTF,IACI,uCACA,0DACN;AAAA,oBACA,MAAK;AAAA,oBACL,iBAAeA;AAAA,oBAEf,UAAA;AAAA,sBAAA,gBAAAW;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,WAAU;AAAA,0BACV,OAAO,EAAE,cAAc,qBAAA;AAAA,0BAEvB,UAAA,gBAAAA,EAACK,GAAA,EAAM,WAAU,2BAAA,CAA2B;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAE9C,gBAAAN,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,wBAAA,gBAAAC,EAAC,UAAK,WAAU,qBACb,UAAApC,EAAE,mCAAmC,qBAAqB,GAC7D;AAAA,0CACC,QAAA,EAAK,WAAU,uCACb,UAAAA,EAAE,uCAAuC,2CAA2C,EAAA,CACvF;AAAA,sBAAA,GACF;AAAA,sBACCyB,KAAY,gBAAAW,EAACG,GAAA,EAAM,WAAU,yCAAA,CAAyC;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAIxEnB,EAAgB,SAAS,KACxB,gBAAAgB,EAAC,OAAA,EAAI,WAAU,8CAA6C;AAAA,gBAI7DhB,EAAgB,SAAS,IACxBA,EAAgB,IAAIW,CAAkB,IAEtC,gBAAAK,EAAC,OAAA,EAAI,WAAU,0DACZ,UAAApC,EAAE,sCAAsC,qBAAqB,EAAA,CAChE;AAAA,cAAA,EAAA,CAEJ;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,IAIDD,KAAwB,CAAC0B,KACxB,gBAAAU,EAAC,OAAA,EAAI,WAAU,uDACb,UAAA;AAAA,MAAA,gBAAAC,EAACQ,GAAA,EAAc,WAAU,UAAA,CAAU;AAAA,MACnC,gBAAAR,EAAC,QAAA,EAAM,UAAApC,EAAE,6BAA6B,6CAA6C,EAAA,CAAE;AAAA,IAAA,EAAA,CACvF;AAAA,EAAA,GAEJ;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"TenantScopeSelector-BWfYxvEa.js","sources":["../../src/hooks/useAdminTenants.ts","../../src/components/ui/TenantScopeSelector.tsx"],"sourcesContent":["import { useState, useCallback, useEffect } from 'react';\r\nimport { adminApi, type UserTenantDto } from '@/services/api/adminApi';\r\n\r\n/**\r\n * Hook that fetches ALL tenants directly from the API for admin pages.\r\n * Unlike useTenant().userTenants (which is cached from /api/auth/me at login),\r\n * this hook always returns fresh data including newly created tenants.\r\n *\r\n * Use this for admin pages that need the complete tenant list:\r\n * - GroupDetailPage (role assignment by tenant)\r\n * - UserDetailPage (role assignment by tenant)\r\n * - Any admin page with a TenantScopeSelector\r\n */\r\nexport function useAdminTenants(): {\n tenants: UserTenantDto[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n} {\r\n const [tenants, setTenants] = useState<UserTenantDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadTenants = useCallback(async () => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const data = await adminApi.myTenants.getAll();\r\n setTenants(data);\r\n } catch (err) {\r\n console.error('Failed to load admin tenants:', err);\r\n setError('Failed to load tenants');\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadTenants();\r\n }, [loadTenants]);\r\n\r\n return { tenants, loading, error, refresh: loadTenants };\r\n}\r\n","import { useState, useRef, useEffect, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Globe, Building2, ChevronDown, Check, AlertTriangle, Search, User } from 'lucide-react';\r\n\r\nexport type ScopeValue = 'global' | { tenantId: string; tenantSlug: string; tenantUserId: string; tenantName: string };\r\n\r\ninterface TenantInfo {\r\n tenantId: string;\r\n tenantSlug: string;\r\n tenantName: string;\r\n tenantType?: string;\r\n}\r\n\r\ninterface TenantMembership extends TenantInfo {\r\n tenantUserId: string;\r\n}\r\n\r\ninterface TenantScopeSelectorProps {\r\n /** Current scope value */\r\n readonly value: ScopeValue;\r\n /** Callback when scope changes */\r\n readonly onChange: (scope: ScopeValue) => void;\r\n /** All tenants the admin has access to */\r\n readonly adminTenants: TenantInfo[];\r\n /** User's tenant memberships (with tenantUserId for API calls) - optional for backwards compat */\r\n readonly userTenantMemberships?: TenantMembership[];\r\n /** Whether the selector is disabled */\r\n readonly disabled?: boolean;\r\n /** Show warning when user is not member of selected tenant */\r\n readonly showNotMemberWarning?: boolean;\r\n}\r\n\r\ntype FilterType = 'all' | 'b2b' | 'b2c';\r\n\r\n/**\r\n * Selector component for choosing between Global scope (platform-wide)\r\n * and Tenant scope (tenant-specific roles/permissions).\r\n * Features: search, B2B/B2C filtering, membership indicators.\r\n */\r\nexport function TenantScopeSelector({\r\n value,\r\n onChange,\r\n adminTenants,\r\n userTenantMemberships = [],\r\n disabled = false,\r\n showNotMemberWarning = false,\r\n}: TenantScopeSelectorProps): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [filterType, setFilterType] = useState<FilterType>('all');\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n const searchInputRef = useRef<HTMLInputElement>(null);\r\n\r\n // Close on click outside\r\n useEffect(() => {\r\n function handleClickOutside(event: MouseEvent) {\r\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\r\n setIsOpen(false);\r\n }\r\n }\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => document.removeEventListener('mousedown', handleClickOutside);\r\n }, []);\r\n\r\n // Close on Escape\r\n useEffect(() => {\r\n function handleEscape(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n setIsOpen(false);\r\n }\r\n }\r\n document.addEventListener('keydown', handleEscape);\r\n return () => document.removeEventListener('keydown', handleEscape);\r\n }, []);\r\n\r\n // Focus search input when opening\r\n useEffect(() => {\r\n if (isOpen && searchInputRef.current) {\r\n setTimeout(() => searchInputRef.current?.focus(), 50);\r\n }\r\n }, [isOpen]);\r\n\r\n // Create a map for quick membership lookup\r\n const membershipMap = useMemo(() => {\r\n const map = new Map<string, TenantMembership>();\r\n userTenantMemberships.forEach(m => map.set(m.tenantId, m));\r\n return map;\r\n }, [userTenantMemberships]);\r\n\r\n // Filter and categorize tenants\r\n const { b2bTenants, b2cTenants, filteredTenants } = useMemo(() => {\r\n const b2b = adminTenants.filter(t => t.tenantType === 'Business');\r\n const b2c = adminTenants.filter(t => t.tenantType === 'Personal');\r\n\r\n let filtered = adminTenants;\r\n\r\n // Apply type filter\r\n if (filterType === 'b2b') {\r\n filtered = b2b;\r\n } else if (filterType === 'b2c') {\r\n filtered = b2c;\r\n }\r\n\r\n // Apply search filter\r\n if (searchQuery.trim()) {\r\n const query = searchQuery.toLowerCase().trim();\r\n filtered = filtered.filter(t => t.tenantName.toLowerCase().includes(query));\r\n }\r\n\r\n return { b2bTenants: b2b, b2cTenants: b2c, filteredTenants: filtered };\r\n }, [adminTenants, filterType, searchQuery]);\r\n\r\n const isGlobal = value === 'global';\r\n const selectedTenant = !isGlobal ? value : null;\r\n\r\n const handleSelectGlobal = () => {\r\n onChange('global');\r\n setIsOpen(false);\r\n setSearchQuery('');\r\n };\r\n\r\n const handleSelectTenant = (tenant: TenantInfo) => {\r\n const membership = membershipMap.get(tenant.tenantId);\r\n onChange({\r\n tenantId: tenant.tenantId,\r\n tenantSlug: tenant.tenantSlug,\r\n tenantUserId: membership?.tenantUserId || '',\r\n tenantName: tenant.tenantName,\r\n });\r\n setIsOpen(false);\r\n setSearchQuery('');\r\n };\r\n\r\n // Don't render if no tenants\r\n if (adminTenants.length === 0) {\r\n return null;\r\n }\r\n\r\n const renderTenantOption = (tenant: TenantInfo) => {\r\n const isSelected = !isGlobal && selectedTenant?.tenantId === tenant.tenantId;\r\n const isB2B = tenant.tenantType === 'Business';\r\n const isMember = membershipMap.has(tenant.tenantId);\r\n\r\n return (\r\n <button\r\n key={tenant.tenantId}\r\n type=\"button\"\r\n onClick={() => handleSelectTenant(tenant)}\r\n className={`w-full flex items-center gap-3 px-3 py-2.5 text-left transition-colors ${\r\n isSelected\r\n ? 'bg-blue-500/10 text-blue-700'\r\n : 'hover:bg-[var(--bg-tertiary)] text-[var(--text-primary)]'\r\n }`}\r\n role=\"option\"\r\n aria-selected={isSelected}\r\n >\r\n <div\r\n className={`flex-shrink-0 w-8 h-8 flex items-center justify-center ${\r\n isB2B ? 'bg-blue-500/10' : 'bg-violet-500/10'\r\n }`}\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <Building2 className={`w-4 h-4 ${isB2B ? 'text-blue-500' : 'text-violet-500'}`} />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium truncate\">{tenant.tenantName}</span>\r\n {isMember && (\r\n <span className=\"flex-shrink-0 text-xs px-1.5 py-0.5 rounded bg-emerald-500/10 text-emerald-600\">\r\n <User className=\"w-3 h-3 inline mr-0.5\" />\r\n {t('userRoles.scope.selector.member', 'Membre')}\r\n </span>\r\n )}\r\n </div>\r\n <span className=\"text-xs text-[var(--text-tertiary)]\">\r\n {isB2B\r\n ? t('userRoles.scope.selector.b2b', 'Business')\r\n : t('userRoles.scope.selector.b2c', 'Personnel')}\r\n </span>\r\n </div>\r\n {isSelected && <Check className=\"w-4 h-4 text-blue-600 flex-shrink-0\" />}\r\n </button>\r\n );\r\n };\r\n\r\n return (\r\n <div ref={menuRef} className=\"relative inline-block\">\r\n {/* Trigger Button */}\r\n <button\r\n type=\"button\"\r\n onClick={() => !disabled && setIsOpen(!isOpen)}\r\n disabled={disabled}\r\n className={`flex items-center gap-2 px-3 py-2 text-sm font-medium border transition-colors ${\r\n isGlobal\r\n ? 'bg-emerald-500/10 border-emerald-500/30 text-emerald-700 hover:bg-emerald-500/20'\r\n : 'bg-blue-500/10 border-blue-500/30 text-blue-700 hover:bg-blue-500/20'\r\n } ${disabled ? 'opacity-50 cursor-not-allowed' : ''}`}\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n aria-expanded={isOpen}\r\n aria-haspopup=\"listbox\"\r\n >\r\n {isGlobal ? (\r\n <>\r\n <Globe className=\"w-4 h-4\" />\r\n <span>{t('userRoles.scope.selector.global', 'Global (plateforme)')}</span>\r\n </>\r\n ) : (\r\n <>\r\n <Building2 className=\"w-4 h-4\" />\r\n <span className=\"max-w-[150px] truncate\">{selectedTenant?.tenantName}</span>\r\n </>\r\n )}\r\n <ChevronDown className={`w-4 h-4 transition-transform ${isOpen ? 'rotate-180' : ''}`} />\r\n </button>\r\n\r\n {/* Dropdown Menu */}\r\n <div\r\n className={`absolute left-0 mt-1 w-80 z-50 transition-all duration-150 ease-out ${\r\n isOpen\r\n ? 'opacity-100 scale-100 translate-y-0'\r\n : 'opacity-0 scale-95 -translate-y-1 pointer-events-none'\r\n }`}\r\n >\r\n <div\r\n className=\"bg-[var(--bg-card)] border border-[var(--border-color)] shadow-xl overflow-hidden\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n {/* Header with Search */}\r\n <div className=\"px-3 py-2 border-b border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-muted)]\" />\r\n <input\r\n ref={searchInputRef}\r\n type=\"text\"\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(e.target.value)}\r\n placeholder={t('userRoles.scope.selector.search', 'Rechercher un tenant...')}\r\n className=\"w-full pl-8 pr-3 py-1.5 text-sm bg-[var(--bg-primary)] border border-[var(--border-color)] rounded-md text-[var(--text-primary)] placeholder-[var(--text-muted)] focus:outline-none focus:ring-1 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Filter Tabs */}\r\n <div className=\"flex items-center gap-1 px-3 py-2 border-b border-[var(--border-color)] bg-[var(--bg-tertiary)]\" role=\"tablist\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setFilterType('all')}\r\n className={`px-2.5 py-1 text-xs font-medium rounded-md transition-colors ${\r\n filterType === 'all'\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n role=\"tab\"\r\n aria-selected={filterType === 'all'}\r\n >\r\n {t('userRoles.scope.selector.filterAll', 'Tous')} ({adminTenants.length})\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setFilterType('b2b')}\r\n className={`px-2.5 py-1 text-xs font-medium rounded-md transition-colors ${\r\n filterType === 'b2b'\r\n ? 'bg-blue-600 text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n role=\"tab\"\r\n aria-selected={filterType === 'b2b'}\r\n >\r\n {t('userRoles.scope.selector.filterB2B', 'B2B')} ({b2bTenants.length})\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setFilterType('b2c')}\r\n className={`px-2.5 py-1 text-xs font-medium rounded-md transition-colors ${\r\n filterType === 'b2c'\r\n ? 'bg-violet-600 text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n role=\"tab\"\r\n aria-selected={filterType === 'b2c'}\r\n >\r\n {t('userRoles.scope.selector.filterB2C', 'B2C')} ({b2cTenants.length})\r\n </button>\r\n </div>\r\n\r\n {/* Options */}\r\n <div className=\"py-1 max-h-72 overflow-y-auto\" role=\"listbox\">\r\n {/* Global Option */}\r\n <button\r\n type=\"button\"\r\n onClick={handleSelectGlobal}\r\n className={`w-full flex items-center gap-3 px-3 py-2.5 text-left transition-colors ${\r\n isGlobal\r\n ? 'bg-emerald-500/10 text-emerald-700'\r\n : 'hover:bg-[var(--bg-tertiary)] text-[var(--text-primary)]'\r\n }`}\r\n role=\"option\"\r\n aria-selected={isGlobal}\r\n >\r\n <div\r\n className=\"flex-shrink-0 w-8 h-8 flex items-center justify-center bg-emerald-500/10\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <Globe className=\"w-4 h-4 text-emerald-600\" />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <span className=\"font-medium block\">\r\n {t('userRoles.scope.selector.global', 'Global (plateforme)')}\r\n </span>\r\n <span className=\"text-xs text-[var(--text-tertiary)]\">\r\n {t('userRoles.scope.selector.globalDesc', 'Rôles applicables sur toute la plateforme')}\r\n </span>\r\n </div>\r\n {isGlobal && <Check className=\"w-4 h-4 text-emerald-600 flex-shrink-0\" />}\r\n </button>\r\n\r\n {/* Divider */}\r\n {filteredTenants.length > 0 && (\r\n <div className=\"border-t border-[var(--border-color)] my-1\" />\r\n )}\r\n\r\n {/* Tenant Options */}\r\n {filteredTenants.length > 0 ? (\r\n filteredTenants.map(renderTenantOption)\r\n ) : (\r\n <div className=\"px-3 py-4 text-center text-sm text-[var(--text-muted)]\">\r\n {t('userRoles.scope.selector.noResults', 'Aucun tenant trouvé')}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Not Member Warning */}\r\n {showNotMemberWarning && !isGlobal && (\r\n <div className=\"mt-2 flex items-center gap-2 text-sm text-amber-600\">\r\n <AlertTriangle className=\"w-4 h-4\" />\r\n <span>{t('userRoles.scope.notMember', \"L'utilisateur n'est pas membre de ce tenant\")}</span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["useAdminTenants","tenants","setTenants","useState","loading","setLoading","error","setError","loadTenants","useCallback","data","adminApi","err","useEffect","TenantScopeSelector","value","onChange","adminTenants","userTenantMemberships","disabled","showNotMemberWarning","t","useTranslation","isOpen","setIsOpen","searchQuery","setSearchQuery","filterType","setFilterType","menuRef","useRef","searchInputRef","handleClickOutside","event","handleEscape","membershipMap","useMemo","map","m","b2bTenants","b2cTenants","filteredTenants","b2b","b2c","filtered","query","isGlobal","selectedTenant","handleSelectGlobal","handleSelectTenant","tenant","membership","renderTenantOption","isSelected","isB2B","isMember","jsxs","jsx","Building2","User","Check","Fragment","Globe","ChevronDown","Search","AlertTriangle"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const a=require("react"),$=require("./index-
|
|
2
|
-
//# sourceMappingURL=TenantScopeSelector-
|
|
1
|
+
"use strict";const a=require("react"),$=require("./index-IgLVXPg8.js"),e=require("react/jsx-runtime"),L=require("react-i18next"),n=require("lucide-react");function A(){const[p,h]=a.useState([]),[i,x]=a.useState(!0),[m,f]=a.useState(null),s=a.useCallback(async()=>{x(!0),f(null);try{const l=await $.adminApi.myTenants.getAll();h(l)}catch(l){console.error("Failed to load admin tenants:",l),f("Failed to load tenants")}finally{x(!1)}},[]);return a.useEffect(()=>{s()},[s]),{tenants:p,loading:i,error:m,refresh:s}}function q({value:p,onChange:h,adminTenants:i,userTenantMemberships:x=[],disabled:m=!1,showNotMemberWarning:f=!1}){const{t:s}=L.useTranslation("admin"),[l,b]=a.useState(!1),[v,g]=a.useState(""),[o,y]=a.useState("all"),j=a.useRef(null),N=a.useRef(null);a.useEffect(()=>{function t(r){j.current&&!j.current.contains(r.target)&&b(!1)}return document.addEventListener("mousedown",t),()=>document.removeEventListener("mousedown",t)},[]),a.useEffect(()=>{function t(r){r.key==="Escape"&&b(!1)}return document.addEventListener("keydown",t),()=>document.removeEventListener("keydown",t)},[]),a.useEffect(()=>{l&&N.current&&setTimeout(()=>N.current?.focus(),50)},[l]);const R=a.useMemo(()=>{const t=new Map;return x.forEach(r=>t.set(r.tenantId,r)),t},[x]),{b2bTenants:T,b2cTenants:S,filteredTenants:w}=a.useMemo(()=>{const t=i.filter(u=>u.tenantType==="Business"),r=i.filter(u=>u.tenantType==="Personal");let c=i;if(o==="b2b"?c=t:o==="b2c"&&(c=r),v.trim()){const u=v.toLowerCase().trim();c=c.filter(E=>E.tenantName.toLowerCase().includes(u))}return{b2bTenants:t,b2cTenants:r,filteredTenants:c}},[i,o,v]),d=p==="global",k=d?null:p,C=()=>{h("global"),b(!1),g("")},I=t=>{const r=R.get(t.tenantId);h({tenantId:t.tenantId,tenantSlug:t.tenantSlug,tenantUserId:r?.tenantUserId||"",tenantName:t.tenantName}),b(!1),g("")};if(i.length===0)return null;const B=t=>{const r=!d&&k?.tenantId===t.tenantId,c=t.tenantType==="Business",u=R.has(t.tenantId);return e.jsxs("button",{type:"button",onClick:()=>I(t),className:`w-full flex items-center gap-3 px-3 py-2.5 text-left transition-colors ${r?"bg-blue-500/10 text-blue-700":"hover:bg-[var(--bg-tertiary)] text-[var(--text-primary)]"}`,role:"option","aria-selected":r,children:[e.jsx("div",{className:`flex-shrink-0 w-8 h-8 flex items-center justify-center ${c?"bg-blue-500/10":"bg-violet-500/10"}`,style:{borderRadius:"var(--radius-card)"},children:e.jsx(n.Building2,{className:`w-4 h-4 ${c?"text-blue-500":"text-violet-500"}`})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"font-medium truncate",children:t.tenantName}),u&&e.jsxs("span",{className:"flex-shrink-0 text-xs px-1.5 py-0.5 rounded bg-emerald-500/10 text-emerald-600",children:[e.jsx(n.User,{className:"w-3 h-3 inline mr-0.5"}),s("userRoles.scope.selector.member","Membre")]})]}),e.jsx("span",{className:"text-xs text-[var(--text-tertiary)]",children:c?s("userRoles.scope.selector.b2b","Business"):s("userRoles.scope.selector.b2c","Personnel")})]}),r&&e.jsx(n.Check,{className:"w-4 h-4 text-blue-600 flex-shrink-0"})]},t.tenantId)};return e.jsxs("div",{ref:j,className:"relative inline-block",children:[e.jsxs("button",{type:"button",onClick:()=>!m&&b(!l),disabled:m,className:`flex items-center gap-2 px-3 py-2 text-sm font-medium border transition-colors ${d?"bg-emerald-500/10 border-emerald-500/30 text-emerald-700 hover:bg-emerald-500/20":"bg-blue-500/10 border-blue-500/30 text-blue-700 hover:bg-blue-500/20"} ${m?"opacity-50 cursor-not-allowed":""}`,style:{borderRadius:"var(--radius-button)"},"aria-expanded":l,"aria-haspopup":"listbox",children:[d?e.jsxs(e.Fragment,{children:[e.jsx(n.Globe,{className:"w-4 h-4"}),e.jsx("span",{children:s("userRoles.scope.selector.global","Global (plateforme)")})]}):e.jsxs(e.Fragment,{children:[e.jsx(n.Building2,{className:"w-4 h-4"}),e.jsx("span",{className:"max-w-[150px] truncate",children:k?.tenantName})]}),e.jsx(n.ChevronDown,{className:`w-4 h-4 transition-transform ${l?"rotate-180":""}`})]}),e.jsx("div",{className:`absolute left-0 mt-1 w-80 z-50 transition-all duration-150 ease-out ${l?"opacity-100 scale-100 translate-y-0":"opacity-0 scale-95 -translate-y-1 pointer-events-none"}`,children:e.jsxs("div",{className:"bg-[var(--bg-card)] border border-[var(--border-color)] shadow-xl overflow-hidden",style:{borderRadius:"var(--radius-card)"},children:[e.jsx("div",{className:"px-3 py-2 border-b border-[var(--border-color)] bg-[var(--bg-secondary)]",children:e.jsxs("div",{className:"relative",children:[e.jsx(n.Search,{className:"absolute left-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-muted)]"}),e.jsx("input",{ref:N,type:"text",value:v,onChange:t=>g(t.target.value),placeholder:s("userRoles.scope.selector.search","Rechercher un tenant..."),className:"w-full pl-8 pr-3 py-1.5 text-sm bg-[var(--bg-primary)] border border-[var(--border-color)] rounded-md text-[var(--text-primary)] placeholder-[var(--text-muted)] focus:outline-none focus:ring-1 focus:ring-[var(--color-accent-500)]"})]})}),e.jsxs("div",{className:"flex items-center gap-1 px-3 py-2 border-b border-[var(--border-color)] bg-[var(--bg-tertiary)]",role:"tablist",children:[e.jsxs("button",{type:"button",onClick:()=>y("all"),className:`px-2.5 py-1 text-xs font-medium rounded-md transition-colors ${o==="all"?"bg-[var(--color-accent-600)] text-white":"text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]"}`,role:"tab","aria-selected":o==="all",children:[s("userRoles.scope.selector.filterAll","Tous")," (",i.length,")"]}),e.jsxs("button",{type:"button",onClick:()=>y("b2b"),className:`px-2.5 py-1 text-xs font-medium rounded-md transition-colors ${o==="b2b"?"bg-blue-600 text-white":"text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]"}`,role:"tab","aria-selected":o==="b2b",children:[s("userRoles.scope.selector.filterB2B","B2B")," (",T.length,")"]}),e.jsxs("button",{type:"button",onClick:()=>y("b2c"),className:`px-2.5 py-1 text-xs font-medium rounded-md transition-colors ${o==="b2c"?"bg-violet-600 text-white":"text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]"}`,role:"tab","aria-selected":o==="b2c",children:[s("userRoles.scope.selector.filterB2C","B2C")," (",S.length,")"]})]}),e.jsxs("div",{className:"py-1 max-h-72 overflow-y-auto",role:"listbox",children:[e.jsxs("button",{type:"button",onClick:C,className:`w-full flex items-center gap-3 px-3 py-2.5 text-left transition-colors ${d?"bg-emerald-500/10 text-emerald-700":"hover:bg-[var(--bg-tertiary)] text-[var(--text-primary)]"}`,role:"option","aria-selected":d,children:[e.jsx("div",{className:"flex-shrink-0 w-8 h-8 flex items-center justify-center bg-emerald-500/10",style:{borderRadius:"var(--radius-card)"},children:e.jsx(n.Globe,{className:"w-4 h-4 text-emerald-600"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("span",{className:"font-medium block",children:s("userRoles.scope.selector.global","Global (plateforme)")}),e.jsx("span",{className:"text-xs text-[var(--text-tertiary)]",children:s("userRoles.scope.selector.globalDesc","Rôles applicables sur toute la plateforme")})]}),d&&e.jsx(n.Check,{className:"w-4 h-4 text-emerald-600 flex-shrink-0"})]}),w.length>0&&e.jsx("div",{className:"border-t border-[var(--border-color)] my-1"}),w.length>0?w.map(B):e.jsx("div",{className:"px-3 py-4 text-center text-sm text-[var(--text-muted)]",children:s("userRoles.scope.selector.noResults","Aucun tenant trouvé")})]})]})}),f&&!d&&e.jsxs("div",{className:"mt-2 flex items-center gap-2 text-sm text-amber-600",children:[e.jsx(n.AlertTriangle,{className:"w-4 h-4"}),e.jsx("span",{children:s("userRoles.scope.notMember","L'utilisateur n'est pas membre de ce tenant")})]})]})}exports.TenantScopeSelector=q;exports.useAdminTenants=A;
|
|
2
|
+
//# sourceMappingURL=TenantScopeSelector-D-BKgQPV.js.map
|