@atlashub/smartstack 3.21.0 → 3.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js → AgentSkillsPage-BWQSCYl-.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js.map → AgentSkillsPage-BWQSCYl-.js.map} +1 -1
- package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js → AgentSkillsPage-IQcMnBaD.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js.map → AgentSkillsPage-IQcMnBaD.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js → AgentWorkloadPage-DqrjkvWL.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js.map → AgentWorkloadPage-DqrjkvWL.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js → AgentWorkloadPage-w-HiyFYP.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js.map → AgentWorkloadPage-w-HiyFYP.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js → ApiCatalogDetailPage-D3L8Yf4G.js} +3 -3
- package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js.map → ApiCatalogDetailPage-D3L8Yf4G.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js → ApiCatalogDetailPage-MPT3Kz6H.js} +2 -2
- package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js.map → ApiCatalogDetailPage-MPT3Kz6H.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js → ApiCatalogPage-D4Hg3uiS.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js.map → ApiCatalogPage-D4Hg3uiS.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js → ApiCatalogPage-DRg5Cz0r.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js.map → ApiCatalogPage-DRg5Cz0r.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js → ApplicationDetailPage-Caizuyn2.js} +2 -2
- package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js.map → ApplicationDetailPage-Caizuyn2.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js → ApplicationDetailPage-CuCW6aMB.js} +4 -4
- package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js.map → ApplicationDetailPage-CuCW6aMB.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js → ApplicationsDashboardPage-B2MW8-Kc.js} +2 -2
- package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js.map → ApplicationsDashboardPage-B2MW8-Kc.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js → ApplicationsDashboardPage-BDIjFIYZ.js} +3 -3
- package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js.map → ApplicationsDashboardPage-BDIjFIYZ.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js → ApplicationsGridPage-DV-FihKj.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js.map → ApplicationsGridPage-DV-FihKj.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js → ApplicationsGridPage-DXsTfXPI.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js.map → ApplicationsGridPage-DXsTfXPI.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js → ApplicationsListPage--CGkyBuJ.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js.map → ApplicationsListPage--CGkyBuJ.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-C91v2rZt.js → ApplicationsListPage-JUX823bh.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-C91v2rZt.js.map → ApplicationsListPage-JUX823bh.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-BCbgotIx.js → ApplicationsPage-6zgFye6w.js} +2 -2
- package/dist/chunks/{ApplicationsPage-BCbgotIx.js.map → ApplicationsPage-6zgFye6w.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js → ApplicationsPage-CQPuuiO6.js} +4 -4
- package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js.map → ApplicationsPage-CQPuuiO6.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js → AssignmentRulesPage-CFffeEbo.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js.map → AssignmentRulesPage-CFffeEbo.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js → AssignmentRulesPage-D78UeUId.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js.map → AssignmentRulesPage-D78UeUId.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-DmfBYQAD.js → AssignmentsPage-Cww2ifZF.js} +2 -2
- package/dist/chunks/{AssignmentsPage-DmfBYQAD.js.map → AssignmentsPage-Cww2ifZF.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-sRCCBmRc.js → AssignmentsPage-DE_QS2LO.js} +2 -2
- package/dist/chunks/{AssignmentsPage-sRCCBmRc.js.map → AssignmentsPage-DE_QS2LO.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js → AuthCallbackPage-CA2nO6DG.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js.map → AuthCallbackPage-CA2nO6DG.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js → AuthCallbackPage-CDUAoX-N.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js.map → AuthCallbackPage-CDUAoX-N.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js → ConfirmEmailPage-BqsILAYH.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js.map → ConfirmEmailPage-BqsILAYH.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js → ConfirmEmailPage-INeHCuMB.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js.map → ConfirmEmailPage-INeHCuMB.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js → CreateSupportTicketPage-BWeuV2aU.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js.map → CreateSupportTicketPage-BWeuV2aU.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js → CreateSupportTicketPage-OBwF4v7b.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js.map → CreateSupportTicketPage-OBwF4v7b.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CUZ80NGV.js → DashboardPage-CKHqWrdS.js} +3 -3
- package/dist/chunks/{DashboardPage-CUZ80NGV.js.map → DashboardPage-CKHqWrdS.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CaNOAstg.js → DashboardPage-COmc9b__.js} +3 -3
- package/dist/chunks/{DashboardPage-CaNOAstg.js.map → DashboardPage-COmc9b__.js.map} +1 -1
- package/dist/chunks/{DashboardPage-B48_rQFi.js → DashboardPage-CfKZHiSj.js} +2 -2
- package/dist/chunks/{DashboardPage-B48_rQFi.js.map → DashboardPage-CfKZHiSj.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CUZV1J9t.js → DashboardPage-CwEZZ3jx.js} +2 -2
- package/dist/chunks/{DashboardPage-CUZV1J9t.js.map → DashboardPage-CwEZZ3jx.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js → EscalationConfigPage--7lgZ0kJ.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js.map → EscalationConfigPage--7lgZ0kJ.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js → EscalationConfigPage-DPyiBcqV.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js.map → EscalationConfigPage-DPyiBcqV.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js → ForceChangePasswordPage-BE-6umub.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js.map → ForceChangePasswordPage-BE-6umub.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js → ForceChangePasswordPage-CnsYoWmV.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js.map → ForceChangePasswordPage-CnsYoWmV.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js → ForgotPasswordPage-CSq4DnFF.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js.map → ForgotPasswordPage-CSq4DnFF.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js → ForgotPasswordPage-DZLVolAC.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js.map → ForgotPasswordPage-DZLVolAC.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-DFBvVO1S.js → GroupDetailPage-Bf9Wb_2j.js} +5 -5
- package/dist/chunks/{GroupDetailPage-DFBvVO1S.js.map → GroupDetailPage-Bf9Wb_2j.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-B2FkKrGG.js → GroupDetailPage-R-hf3rJ7.js} +2 -2
- package/dist/chunks/{GroupDetailPage-B2FkKrGG.js.map → GroupDetailPage-R-hf3rJ7.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js → MyAccessRequestsPage-BIisvWM6.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js.map → MyAccessRequestsPage-BIisvWM6.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js → MyAccessRequestsPage-BLSV7Tbx.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js.map → MyAccessRequestsPage-BLSV7Tbx.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-BEcYYdGR.js → MyTenantsPage-D-7k9CP1.js} +3 -3
- package/dist/chunks/{MyTenantsPage-BEcYYdGR.js.map → MyTenantsPage-D-7k9CP1.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-D9f85zjF.js → MyTenantsPage-DqGW6aDt.js} +2 -2
- package/dist/chunks/{MyTenantsPage-D9f85zjF.js.map → MyTenantsPage-DqGW6aDt.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DJR8h6y1.js → MyTicketsPage--DgDsnZA.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DJR8h6y1.js.map → MyTicketsPage--DgDsnZA.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DiOUExKJ.js → MyTicketsPage-CqJ3Aqob.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DiOUExKJ.js.map → MyTicketsPage-CqJ3Aqob.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js → NavigationAppsPage-Bebis_RT.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js.map → NavigationAppsPage-Bebis_RT.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-If7tmCFY.js → NavigationAppsPage-THNPOAjv.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-If7tmCFY.js.map → NavigationAppsPage-THNPOAjv.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-C29Lln5o.js → NotificationsPage-CAbNW_Cn.js} +2 -2
- package/dist/chunks/{NotificationsPage-C29Lln5o.js.map → NotificationsPage-CAbNW_Cn.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-BiaLRb0s.js → NotificationsPage-DxwizUhL.js} +2 -2
- package/dist/chunks/{NotificationsPage-BiaLRb0s.js.map → NotificationsPage-DxwizUhL.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js → OnboardingWizardPage-C6HlbJ3K.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js.map → OnboardingWizardPage-C6HlbJ3K.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js → OnboardingWizardPage-CyC2zONO.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js.map → OnboardingWizardPage-CyC2zONO.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js → PermissionDetailPage-BDHiNgky.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js.map → PermissionDetailPage-BDHiNgky.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js → PermissionDetailPage-C5K17ydY.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js.map → PermissionDetailPage-C5K17ydY.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-l0PnY-EE.js → PermissionsPage-COI5LJPo.js} +2 -2
- package/dist/chunks/{PermissionsPage-l0PnY-EE.js.map → PermissionsPage-COI5LJPo.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-DLy9U3P3.js → PermissionsPage-CkOwH2_d.js} +2 -2
- package/dist/chunks/{PermissionsPage-DLy9U3P3.js.map → PermissionsPage-CkOwH2_d.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-DFBx38-x.js → PortalDashboardPage-CoEC4CmC.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-DFBx38-x.js.map → PortalDashboardPage-CoEC4CmC.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js → PortalDashboardPage-DrYymEf-.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js.map → PortalDashboardPage-DrYymEf-.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-BBu8yZQB.js → PreferencesPage-CJRaU3ba.js} +2 -2
- package/dist/chunks/{PreferencesPage-BBu8yZQB.js.map → PreferencesPage-CJRaU3ba.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-B81MsNV1.js → PreferencesPage-Cqr9mAab.js} +2 -2
- package/dist/chunks/{PreferencesPage-B81MsNV1.js.map → PreferencesPage-Cqr9mAab.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DDrl10zj.js → ProfilePage-BZVpg6-l.js} +2 -2
- package/dist/chunks/{ProfilePage-DDrl10zj.js.map → ProfilePage-BZVpg6-l.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DPoXwdnc.js → ProfilePage-Cu_FITeL.js} +2 -2
- package/dist/chunks/{ProfilePage-DPoXwdnc.js.map → ProfilePage-Cu_FITeL.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js → ReferencesManagementPage-DUlVk9Ps.js} +3 -3
- package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js.map → ReferencesManagementPage-DUlVk9Ps.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js → ReferencesManagementPage-ZCuYtqd7.js} +2 -2
- package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js.map → ReferencesManagementPage-ZCuYtqd7.js.map} +1 -1
- package/dist/chunks/{RegisterPage-CiQib3-6.js → RegisterPage-C4xmVwh9.js} +2 -2
- package/dist/chunks/{RegisterPage-CiQib3-6.js.map → RegisterPage-C4xmVwh9.js.map} +1 -1
- package/dist/chunks/{RegisterPage-bXCcJD88.js → RegisterPage-DGyzoIHT.js} +2 -2
- package/dist/chunks/{RegisterPage-bXCcJD88.js.map → RegisterPage-DGyzoIHT.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js → ResetPasswordPage-DqDD6VPR.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js.map → ResetPasswordPage-DqDD6VPR.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-CubPG3yv.js → ResetPasswordPage-Glu-aeqv.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-CubPG3yv.js.map → ResetPasswordPage-Glu-aeqv.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-Bg7XZmR1.js → ResolutionModal-CxjANAOP.js} +2 -2
- package/dist/chunks/{ResolutionModal-Bg7XZmR1.js.map → ResolutionModal-CxjANAOP.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-DqRk_T0n.js → ResolutionModal-Duat18qV.js} +2 -2
- package/dist/chunks/{ResolutionModal-DqRk_T0n.js.map → ResolutionModal-Duat18qV.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-Blau6_4c.js → RoleDetailPage-BQffUSnt.js} +3 -3
- package/dist/chunks/{RoleDetailPage-Blau6_4c.js.map → RoleDetailPage-BQffUSnt.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-CiRVxxIP.js → RoleDetailPage-JTm5lD1_.js} +2 -2
- package/dist/chunks/{RoleDetailPage-CiRVxxIP.js.map → RoleDetailPage-JTm5lD1_.js.map} +1 -1
- package/dist/chunks/{RolesPage-Pm-RN3lP.js → RolesPage-B9rRzciI.js} +2 -2
- package/dist/chunks/{RolesPage-Pm-RN3lP.js.map → RolesPage-B9rRzciI.js.map} +1 -1
- package/dist/chunks/{RolesPage-Cb8joqdJ.js → RolesPage-BN8_zMOC.js} +2 -2
- package/dist/chunks/{RolesPage-Cb8joqdJ.js.map → RolesPage-BN8_zMOC.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-B86McKM6.js → SlaConfigPage-B7kZNig4.js} +2 -2
- package/dist/chunks/{SlaConfigPage-B86McKM6.js.map → SlaConfigPage-B7kZNig4.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-BY7gvYU6.js → SlaConfigPage-okvZfA_K.js} +2 -2
- package/dist/chunks/{SlaConfigPage-BY7gvYU6.js.map → SlaConfigPage-okvZfA_K.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js → SupportPermissionsPage-DGAPqJbl.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js.map → SupportPermissionsPage-DGAPqJbl.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js → SupportPermissionsPage-Dg_wLOme.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js.map → SupportPermissionsPage-Dg_wLOme.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-BDguJ401.js → TemplatesPage-DT9fhlAU.js} +2 -2
- package/dist/chunks/{TemplatesPage-BDguJ401.js.map → TemplatesPage-DT9fhlAU.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-DdnGgioU.js → TemplatesPage-DiEk538p.js} +2 -2
- package/dist/chunks/{TemplatesPage-DdnGgioU.js.map → TemplatesPage-DiEk538p.js.map} +1 -1
- package/dist/chunks/{TenantCard-ffwWsgFQ.js → TenantCard-BbSYk9_Z.js} +2 -2
- package/dist/chunks/{TenantCard-ffwWsgFQ.js.map → TenantCard-BbSYk9_Z.js.map} +1 -1
- package/dist/chunks/{TenantCard-CUjb6og9.js → TenantCard-CEkiKxcZ.js} +2 -2
- package/dist/chunks/{TenantCard-CUjb6og9.js.map → TenantCard-CEkiKxcZ.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js → TenantScopeSelector-BWfYxvEa.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js.map → TenantScopeSelector-BWfYxvEa.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js → TenantScopeSelector-D-BKgQPV.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js.map → TenantScopeSelector-D-BKgQPV.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-GOh9GX7E.js → TicketDetailPage-C1mNS9Up.js} +2 -2
- package/dist/chunks/{TicketDetailPage-GOh9GX7E.js.map → TicketDetailPage-C1mNS9Up.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-Du8WMyqf.js → TicketDetailPage-ieVDRh42.js} +2 -2
- package/dist/chunks/{TicketDetailPage-Du8WMyqf.js.map → TicketDetailPage-ieVDRh42.js.map} +1 -1
- package/dist/chunks/{TicketsPage-Bqd6moQy.js → TicketsPage-CnuWsnIW.js} +2 -2
- package/dist/chunks/{TicketsPage-Bqd6moQy.js.map → TicketsPage-CnuWsnIW.js.map} +1 -1
- package/dist/chunks/{TicketsPage-WdU4Bb7M.js → TicketsPage-jjyY15_D.js} +2 -2
- package/dist/chunks/{TicketsPage-WdU4Bb7M.js.map → TicketsPage-jjyY15_D.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js → UserCreateTicketPage-B8Tvf-ag.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js.map → UserCreateTicketPage-B8Tvf-ag.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js → UserCreateTicketPage-DnOsDlfO.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js.map → UserCreateTicketPage-DnOsDlfO.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-BP5WeXPS.js → UserDashboardPage-BrtkJ-NB.js} +2 -2
- package/dist/chunks/{UserDashboardPage-BP5WeXPS.js.map → UserDashboardPage-BrtkJ-NB.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-B53C8fUq.js → UserDashboardPage-KLB5CQP5.js} +2 -2
- package/dist/chunks/{UserDashboardPage-B53C8fUq.js.map → UserDashboardPage-KLB5CQP5.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-B110bmGX.js → UserDetailPage-U7smBQoF.js} +5 -5
- package/dist/chunks/{UserDetailPage-B110bmGX.js.map → UserDetailPage-U7smBQoF.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-CV2VCE46.js → UserDetailPage-_J6lcKAU.js} +2 -2
- package/dist/chunks/{UserDetailPage-CV2VCE46.js.map → UserDetailPage-_J6lcKAU.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js → UserTicketDetailPage-CWoYQgH-.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js.map → UserTicketDetailPage-CWoYQgH-.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js → UserTicketDetailPage-DkufSlvZ.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js.map → UserTicketDetailPage-DkufSlvZ.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js → UsersGroupsPage-C38s2-Rq.js} +3 -3
- package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js.map → UsersGroupsPage-C38s2-Rq.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js → UsersGroupsPage-Dq3rAteo.js} +2 -2
- package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js.map → UsersGroupsPage-Dq3rAteo.js.map} +1 -1
- package/dist/chunks/{UsersPage-Bg7033pp.js → UsersPage-B5C5KEUR.js} +2 -2
- package/dist/chunks/{UsersPage-Bg7033pp.js.map → UsersPage-B5C5KEUR.js.map} +1 -1
- package/dist/chunks/{UsersPage-TYAfwPY1.js → UsersPage-CXC9Hvq6.js} +2 -2
- package/dist/chunks/{UsersPage-TYAfwPY1.js.map → UsersPage-CXC9Hvq6.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-DZeDvzwv.js → accessRequestsApi-B-4TJ5_U.js} +2 -2
- package/dist/chunks/{accessRequestsApi-DZeDvzwv.js.map → accessRequestsApi-B-4TJ5_U.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-ZXFPCid2.js → accessRequestsApi-DZSfThpd.js} +2 -2
- package/dist/chunks/{accessRequestsApi-ZXFPCid2.js.map → accessRequestsApi-DZSfThpd.js.map} +1 -1
- package/dist/chunks/{aiApi-CsH8DXgs.js → aiApi-B20Teu2v.js} +2 -2
- package/dist/chunks/{aiApi-CsH8DXgs.js.map → aiApi-B20Teu2v.js.map} +1 -1
- package/dist/chunks/{aiApi-CVPzFTXa.js → aiApi-DMGz-RPM.js} +2 -2
- package/dist/chunks/{aiApi-CVPzFTXa.js.map → aiApi-DMGz-RPM.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js → applicationAnalyticsApi-Bwa75Fzd.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js.map → applicationAnalyticsApi-Bwa75Fzd.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js → applicationAnalyticsApi-CLBqRPfN.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js.map → applicationAnalyticsApi-CLBqRPfN.js.map} +1 -1
- package/dist/chunks/{groupsApi-BgCk2fsp.js → groupsApi-QzXI-5xu.js} +2 -2
- package/dist/chunks/{groupsApi-BgCk2fsp.js.map → groupsApi-QzXI-5xu.js.map} +1 -1
- package/dist/chunks/{groupsApi-BIbG665N.js → groupsApi-hB9kSWEd.js} +2 -2
- package/dist/chunks/{groupsApi-BIbG665N.js.map → groupsApi-hB9kSWEd.js.map} +1 -1
- package/dist/chunks/{index-Cb3LotuT.js → index--NGcBYUu.js} +3 -3
- package/dist/chunks/{index-Cb3LotuT.js.map → index--NGcBYUu.js.map} +1 -1
- package/dist/chunks/{index-C33zcyF4.js → index--aPwOFjF.js} +2 -2
- package/dist/chunks/{index-C33zcyF4.js.map → index--aPwOFjF.js.map} +1 -1
- package/dist/chunks/{index-sMr9qND_.js → index-0VrOtwP0.js} +2 -2
- package/dist/chunks/{index-sMr9qND_.js.map → index-0VrOtwP0.js.map} +1 -1
- package/dist/chunks/{index-DDKetfKq.js → index-37U271aw.js} +2 -2
- package/dist/chunks/{index-DDKetfKq.js.map → index-37U271aw.js.map} +1 -1
- package/dist/chunks/{index-B9fS7ir6.js → index-B7qZTuQ-.js} +2 -2
- package/dist/chunks/{index-B9fS7ir6.js.map → index-B7qZTuQ-.js.map} +1 -1
- package/dist/chunks/{index-CdjBY7L8.js → index-Bedzmqr-.js} +2 -2
- package/dist/chunks/{index-CdjBY7L8.js.map → index-Bedzmqr-.js.map} +1 -1
- package/dist/chunks/{index-CHG_O1fS.js → index-Betxo5g5.js} +2 -2
- package/dist/chunks/{index-CHG_O1fS.js.map → index-Betxo5g5.js.map} +1 -1
- package/dist/chunks/{index-jiGu-H8x.js → index-BmaJz475.js} +2 -2
- package/dist/chunks/{index-jiGu-H8x.js.map → index-BmaJz475.js.map} +1 -1
- package/dist/chunks/{index-C53JoVNk.js → index-Buhqag3v.js} +2 -2
- package/dist/chunks/{index-C53JoVNk.js.map → index-Buhqag3v.js.map} +1 -1
- package/dist/chunks/{index-DO0Rw7hX.js → index-C3VxlfKq.js} +2 -2
- package/dist/chunks/{index-DO0Rw7hX.js.map → index-C3VxlfKq.js.map} +1 -1
- package/dist/chunks/{index-CSQ60fpG.js → index-CgpRo8Oe.js} +2 -2
- package/dist/chunks/{index-CSQ60fpG.js.map → index-CgpRo8Oe.js.map} +1 -1
- package/dist/chunks/{index-B-e-ELsf.js → index-DOY0w8Iu.js} +8 -8
- package/dist/chunks/{index-B-e-ELsf.js.map → index-DOY0w8Iu.js.map} +1 -1
- package/dist/chunks/{index-D2REDIRX.js → index-DwuvIOrQ.js} +2 -2
- package/dist/chunks/{index-D2REDIRX.js.map → index-DwuvIOrQ.js.map} +1 -1
- package/dist/chunks/{index-DCcl7Qof.js → index-DzedSLdI.js} +2 -2
- package/dist/chunks/{index-DCcl7Qof.js.map → index-DzedSLdI.js.map} +1 -1
- package/dist/chunks/{index-2wUhd9Lu.js → index-IgLVXPg8.js} +10 -10
- package/dist/chunks/index-IgLVXPg8.js.map +1 -0
- package/dist/chunks/{index-CwSaRXXg.js → index-lpIzhufD.js} +1916 -1900
- package/dist/chunks/index-lpIzhufD.js.map +1 -0
- package/dist/chunks/{index-Cuwn2q-f.js → index-mLUKwbGl.js} +4 -4
- package/dist/chunks/{index-Cuwn2q-f.js.map → index-mLUKwbGl.js.map} +1 -1
- package/dist/chunks/{index-B0mk2tNY.js → index-tO6MMIFB.js} +2 -2
- package/dist/chunks/{index-B0mk2tNY.js.map → index-tO6MMIFB.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-BpNANQ5s.js → tenantIconMap-BQD9byc8.js} +2 -2
- package/dist/chunks/{tenantIconMap-BpNANQ5s.js.map → tenantIconMap-BQD9byc8.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-DtdUgvJO.js → tenantIconMap-CTMuSt18.js} +2 -2
- package/dist/chunks/{tenantIconMap-DtdUgvJO.js.map → tenantIconMap-CTMuSt18.js.map} +1 -1
- package/dist/chunks/{ticketingApi-Bu4rKwLl.js → ticketingApi-BNIdox5t.js} +2 -2
- package/dist/chunks/{ticketingApi-Bu4rKwLl.js.map → ticketingApi-BNIdox5t.js.map} +1 -1
- package/dist/chunks/{ticketingApi-r4Avm9iS.js → ticketingApi-J0vC_t7r.js} +2 -2
- package/dist/chunks/{ticketingApi-r4Avm9iS.js.map → ticketingApi-J0vC_t7r.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-B9bF4swg.js → useAccessRequests-DCNNLnxk.js} +3 -3
- package/dist/chunks/{useAccessRequests-B9bF4swg.js.map → useAccessRequests-DCNNLnxk.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-JyPUX3Om.js → useAccessRequests-DT7X4FAK.js} +2 -2
- package/dist/chunks/{useAccessRequests-JyPUX3Om.js.map → useAccessRequests-DT7X4FAK.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-DjPQenC2.js → useUserAccessRequests-BYbmG4c7.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-DjPQenC2.js.map → useUserAccessRequests-BYbmG4c7.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-BB6FHW14.js → useUserAccessRequests-CylKxRN6.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-BB6FHW14.js.map → useUserAccessRequests-CylKxRN6.js.map} +1 -1
- package/dist/hooks/useCollapsibleState.d.ts +5 -2
- package/dist/hooks/useCollapsibleState.d.ts.map +1 -1
- package/dist/i18n/config.d.ts +1 -0
- package/dist/i18n/config.d.ts.map +1 -1
- package/dist/main.d.ts +0 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/smartstack.cjs +1 -1
- package/dist/smartstack.js +1 -1
- package/dist/utils/permissions.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/index-2wUhd9Lu.js.map +0 -1
- package/dist/chunks/index-CwSaRXXg.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useState as s, useCallback as l, useEffect as S } from "react";
|
|
2
|
-
import { i as b } from "./index-
|
|
2
|
+
import { i as b } from "./index-lpIzhufD.js";
|
|
3
3
|
import { Laptop as v, Monitor as C, Database as L, Cloud as T, HardDrive as k, Landmark as O, Factory as B, Store as h, Warehouse as I, Crown as P, Users as F, Shield as M, Globe as U, Briefcase as _, Home as w, Building as D, Server as E, User as N, Building2 as d } from "lucide-react";
|
|
4
4
|
const H = {
|
|
5
5
|
getAll: () => b.get("/administration/tenants/type-settings"),
|
|
@@ -92,4 +92,4 @@ export {
|
|
|
92
92
|
H as t,
|
|
93
93
|
W as u
|
|
94
94
|
};
|
|
95
|
-
//# sourceMappingURL=tenantIconMap-
|
|
95
|
+
//# sourceMappingURL=tenantIconMap-BQD9byc8.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenantIconMap-
|
|
1
|
+
{"version":3,"file":"tenantIconMap-BQD9byc8.js","sources":["../../src/services/api/tenantTypeSettingsApi.ts","../../src/hooks/useTenantTypeSettings.ts","../../src/utils/tenantIconMap.ts"],"sourcesContent":["import { api } from './apiClient';\r\nimport type { TenantType } from './adminApi';\r\n\r\nexport interface TenantTypeSettingsDto {\r\n id: string;\r\n type: TenantType;\r\n icon: string;\r\n iconType: 'Lucide' | 'Url' | 'Svg';\r\n color: string;\r\n displayName: string;\r\n description: string | null;\r\n}\r\n\r\nexport interface UpdateTenantTypeSettingsRequest {\r\n icon: string;\r\n iconType: 'Lucide' | 'Url' | 'Svg';\r\n color: string;\r\n displayName: string;\r\n description: string | null;\r\n}\r\n\r\nexport const tenantTypeSettingsApi = {\r\n getAll: () =>\r\n api.get<TenantTypeSettingsDto[]>('/administration/tenants/type-settings'),\r\n\r\n update: (type: TenantType, data: UpdateTenantTypeSettingsRequest) =>\r\n api.put<TenantTypeSettingsDto>(`/administration/tenants/type-settings/${type}`, data),\r\n};\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport { tenantTypeSettingsApi, type TenantTypeSettingsDto } from '@/services/api/tenantTypeSettingsApi';\r\nimport type { TenantType } from '@/services/api/adminApi';\r\n\r\ninterface TenantTypeIcon {\r\n icon: string;\r\n iconType: string;\r\n color: string;\r\n}\r\n\r\ninterface UseTenantTypeSettingsReturn {\r\n settings: TenantTypeSettingsDto[];\r\n loading: boolean;\r\n error: string | null;\r\n getIconForType: (type: TenantType | string) => TenantTypeIcon;\r\n reload: () => Promise<void>;\r\n}\r\n\r\n// Module-level cache to avoid refetching on every mount\r\nlet cachedSettings: TenantTypeSettingsDto[] | null = null;\r\nlet cachePromise: Promise<TenantTypeSettingsDto[]> | null = null;\r\n\r\nconst DEFAULT_ICONS: Record<string, TenantTypeIcon> = {\r\n Personal: { icon: 'User', iconType: 'Lucide', color: 'violet' },\r\n Business: { icon: 'Building2', iconType: 'Lucide', color: 'blue' },\r\n System: { icon: 'Server', iconType: 'Lucide', color: 'gray' },\r\n};\r\n\r\nexport function useTenantTypeSettings(): UseTenantTypeSettingsReturn {\r\n const [settings, setSettings] = useState<TenantTypeSettingsDto[]>(cachedSettings ?? []);\r\n const [loading, setLoading] = useState(!cachedSettings);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const load = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n\r\n // Deduplicate concurrent fetches\r\n if (!cachePromise) {\r\n cachePromise = tenantTypeSettingsApi.getAll();\r\n }\r\n\r\n const data = await cachePromise;\r\n const items = Array.isArray(data) ? data : [];\r\n cachedSettings = items;\r\n cachePromise = null;\r\n setSettings(items);\r\n } catch {\r\n cachePromise = null;\r\n setError('Failed to load tenant type settings');\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!cachedSettings) {\r\n load();\r\n }\r\n }, [load]);\r\n\r\n const getIconForType = useCallback(\r\n (type: TenantType | string): TenantTypeIcon => {\r\n const found = (settings ?? []).find((s) => s.type === type);\r\n if (found) {\r\n return { icon: found.icon, iconType: found.iconType, color: found.color };\r\n }\r\n return DEFAULT_ICONS[type] ?? DEFAULT_ICONS.Business;\r\n },\r\n [settings]\r\n );\r\n\r\n const reload = useCallback(async () => {\r\n cachedSettings = null;\r\n cachePromise = null;\r\n await load();\r\n }, [load]);\r\n\r\n return { settings, loading, error, getIconForType, reload };\r\n}\r\n","import {\r\n Building2,\r\n User,\r\n Server,\r\n Building,\r\n Home,\r\n Briefcase,\r\n Globe,\r\n Shield,\r\n Users,\r\n Crown,\r\n Warehouse,\r\n Store,\r\n Factory,\r\n Landmark,\r\n HardDrive,\r\n Cloud,\r\n Database,\r\n Monitor,\r\n Laptop,\r\n type LucideIcon,\r\n} from 'lucide-react';\r\n\r\nconst ICON_MAP: Record<string, LucideIcon> = {\r\n Building2,\r\n User,\r\n Server,\r\n Building,\r\n Home,\r\n Briefcase,\r\n Globe,\r\n Shield,\r\n Users,\r\n Crown,\r\n Warehouse,\r\n Store,\r\n Factory,\r\n Landmark,\r\n HardDrive,\r\n Cloud,\r\n Database,\r\n Monitor,\r\n Laptop,\r\n};\r\n\r\n/**\r\n * Resolves a Lucide icon name (string) to its React component.\r\n * Falls back to Building2 if the name is unknown.\r\n */\r\nexport const getLucideIcon = (name: string): LucideIcon =>\r\n ICON_MAP[name] ?? Building2;\r\n\r\n/**\r\n * Returns a list of all available icon names for the admin UI picker.\r\n */\r\nexport const getAvailableIconNames = (): string[] => Object.keys(ICON_MAP);\r\n\r\n/**\r\n * Maps a color name to Tailwind background and text classes.\r\n */\r\nexport const getColorClasses = (color: string): { bg: string; text: string } => {\r\n const COLOR_MAP: Record<string, { bg: string; text: string }> = {\r\n blue: { bg: 'bg-blue-500/10', text: 'text-blue-500' },\r\n violet: { bg: 'bg-violet-500/10', text: 'text-violet-500' },\r\n gray: { bg: 'bg-gray-500/10', text: 'text-gray-500' },\r\n green: { bg: 'bg-green-500/10', text: 'text-green-500' },\r\n red: { bg: 'bg-red-500/10', text: 'text-red-500' },\r\n amber: { bg: 'bg-amber-500/10', text: 'text-amber-500' },\r\n purple: { bg: 'bg-purple-500/10', text: 'text-purple-500' },\r\n cyan: { bg: 'bg-cyan-500/10', text: 'text-cyan-500' },\r\n pink: { bg: 'bg-pink-500/10', text: 'text-pink-500' },\r\n emerald: { bg: 'bg-emerald-500/10', text: 'text-emerald-500' },\r\n orange: { bg: 'bg-orange-500/10', text: 'text-orange-500' },\r\n indigo: { bg: 'bg-indigo-500/10', text: 'text-indigo-500' },\r\n };\r\n\r\n return COLOR_MAP[color] ?? { bg: 'bg-gray-500/10', text: 'text-gray-500' };\r\n};\r\n\r\n/**\r\n * Returns a list of all available color names for the admin UI picker.\r\n */\r\nexport const getAvailableColors = (): string[] => [\r\n 'blue', 'violet', 'gray', 'green', 'red', 'amber',\r\n 'purple', 'cyan', 'pink', 'emerald', 'orange', 'indigo',\r\n];\r\n"],"names":["tenantTypeSettingsApi","api","type","data","cachedSettings","cachePromise","DEFAULT_ICONS","useTenantTypeSettings","settings","setSettings","useState","loading","setLoading","error","setError","load","useCallback","items","useEffect","getIconForType","found","s","reload","ICON_MAP","Building2","User","Server","Building","Home","Briefcase","Globe","Shield","Users","Crown","Warehouse","Store","Factory","Landmark","HardDrive","Cloud","Database","Monitor","Laptop","getLucideIcon","name","getAvailableIconNames","getColorClasses","color","getAvailableColors"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const o=require("react"),u=require("./index-
|
|
2
|
-
//# sourceMappingURL=tenantIconMap-
|
|
1
|
+
"use strict";const o=require("react"),u=require("./index-IgLVXPg8.js"),e=require("lucide-react"),d={getAll:()=>u.api.get("/administration/tenants/type-settings"),update:(t,s)=>u.api.put(`/administration/tenants/type-settings/${t}`,s)};let i=null,r=null;const b={Personal:{icon:"User",iconType:"Lucide",color:"violet"},Business:{icon:"Building2",iconType:"Lucide",color:"blue"},System:{icon:"Server",iconType:"Lucide",color:"gray"}};function v(){const[t,s]=o.useState(i??[]),[y,g]=o.useState(!i),[x,c]=o.useState(null),l=o.useCallback(async()=>{try{g(!0),c(null),r||(r=d.getAll());const a=await r,n=Array.isArray(a)?a:[];i=n,r=null,s(n)}catch{r=null,c("Failed to load tenant type settings")}finally{g(!1)}},[]);o.useEffect(()=>{i||l()},[l]);const m=o.useCallback(a=>{const n=(t??[]).find(C=>C.type===a);return n?{icon:n.icon,iconType:n.iconType,color:n.color}:b[a]??b.Business},[t]),S=o.useCallback(async()=>{i=null,r=null,await l()},[l]);return{settings:t,loading:y,error:x,getIconForType:m,reload:S}}const p={Building2:e.Building2,User:e.User,Server:e.Server,Building:e.Building,Home:e.Home,Briefcase:e.Briefcase,Globe:e.Globe,Shield:e.Shield,Users:e.Users,Crown:e.Crown,Warehouse:e.Warehouse,Store:e.Store,Factory:e.Factory,Landmark:e.Landmark,HardDrive:e.HardDrive,Cloud:e.Cloud,Database:e.Database,Monitor:e.Monitor,Laptop:e.Laptop},A=t=>p[t]??e.Building2,L=()=>Object.keys(p),T=t=>({blue:{bg:"bg-blue-500/10",text:"text-blue-500"},violet:{bg:"bg-violet-500/10",text:"text-violet-500"},gray:{bg:"bg-gray-500/10",text:"text-gray-500"},green:{bg:"bg-green-500/10",text:"text-green-500"},red:{bg:"bg-red-500/10",text:"text-red-500"},amber:{bg:"bg-amber-500/10",text:"text-amber-500"},purple:{bg:"bg-purple-500/10",text:"text-purple-500"},cyan:{bg:"bg-cyan-500/10",text:"text-cyan-500"},pink:{bg:"bg-pink-500/10",text:"text-pink-500"},emerald:{bg:"bg-emerald-500/10",text:"text-emerald-500"},orange:{bg:"bg-orange-500/10",text:"text-orange-500"},indigo:{bg:"bg-indigo-500/10",text:"text-indigo-500"}})[t]??{bg:"bg-gray-500/10",text:"text-gray-500"},f=()=>["blue","violet","gray","green","red","amber","purple","cyan","pink","emerald","orange","indigo"];exports.getAvailableColors=f;exports.getAvailableIconNames=L;exports.getColorClasses=T;exports.getLucideIcon=A;exports.tenantTypeSettingsApi=d;exports.useTenantTypeSettings=v;
|
|
2
|
+
//# sourceMappingURL=tenantIconMap-CTMuSt18.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenantIconMap-
|
|
1
|
+
{"version":3,"file":"tenantIconMap-CTMuSt18.js","sources":["../../src/services/api/tenantTypeSettingsApi.ts","../../src/hooks/useTenantTypeSettings.ts","../../src/utils/tenantIconMap.ts"],"sourcesContent":["import { api } from './apiClient';\r\nimport type { TenantType } from './adminApi';\r\n\r\nexport interface TenantTypeSettingsDto {\r\n id: string;\r\n type: TenantType;\r\n icon: string;\r\n iconType: 'Lucide' | 'Url' | 'Svg';\r\n color: string;\r\n displayName: string;\r\n description: string | null;\r\n}\r\n\r\nexport interface UpdateTenantTypeSettingsRequest {\r\n icon: string;\r\n iconType: 'Lucide' | 'Url' | 'Svg';\r\n color: string;\r\n displayName: string;\r\n description: string | null;\r\n}\r\n\r\nexport const tenantTypeSettingsApi = {\r\n getAll: () =>\r\n api.get<TenantTypeSettingsDto[]>('/administration/tenants/type-settings'),\r\n\r\n update: (type: TenantType, data: UpdateTenantTypeSettingsRequest) =>\r\n api.put<TenantTypeSettingsDto>(`/administration/tenants/type-settings/${type}`, data),\r\n};\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport { tenantTypeSettingsApi, type TenantTypeSettingsDto } from '@/services/api/tenantTypeSettingsApi';\r\nimport type { TenantType } from '@/services/api/adminApi';\r\n\r\ninterface TenantTypeIcon {\r\n icon: string;\r\n iconType: string;\r\n color: string;\r\n}\r\n\r\ninterface UseTenantTypeSettingsReturn {\r\n settings: TenantTypeSettingsDto[];\r\n loading: boolean;\r\n error: string | null;\r\n getIconForType: (type: TenantType | string) => TenantTypeIcon;\r\n reload: () => Promise<void>;\r\n}\r\n\r\n// Module-level cache to avoid refetching on every mount\r\nlet cachedSettings: TenantTypeSettingsDto[] | null = null;\r\nlet cachePromise: Promise<TenantTypeSettingsDto[]> | null = null;\r\n\r\nconst DEFAULT_ICONS: Record<string, TenantTypeIcon> = {\r\n Personal: { icon: 'User', iconType: 'Lucide', color: 'violet' },\r\n Business: { icon: 'Building2', iconType: 'Lucide', color: 'blue' },\r\n System: { icon: 'Server', iconType: 'Lucide', color: 'gray' },\r\n};\r\n\r\nexport function useTenantTypeSettings(): UseTenantTypeSettingsReturn {\r\n const [settings, setSettings] = useState<TenantTypeSettingsDto[]>(cachedSettings ?? []);\r\n const [loading, setLoading] = useState(!cachedSettings);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const load = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n\r\n // Deduplicate concurrent fetches\r\n if (!cachePromise) {\r\n cachePromise = tenantTypeSettingsApi.getAll();\r\n }\r\n\r\n const data = await cachePromise;\r\n const items = Array.isArray(data) ? data : [];\r\n cachedSettings = items;\r\n cachePromise = null;\r\n setSettings(items);\r\n } catch {\r\n cachePromise = null;\r\n setError('Failed to load tenant type settings');\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!cachedSettings) {\r\n load();\r\n }\r\n }, [load]);\r\n\r\n const getIconForType = useCallback(\r\n (type: TenantType | string): TenantTypeIcon => {\r\n const found = (settings ?? []).find((s) => s.type === type);\r\n if (found) {\r\n return { icon: found.icon, iconType: found.iconType, color: found.color };\r\n }\r\n return DEFAULT_ICONS[type] ?? DEFAULT_ICONS.Business;\r\n },\r\n [settings]\r\n );\r\n\r\n const reload = useCallback(async () => {\r\n cachedSettings = null;\r\n cachePromise = null;\r\n await load();\r\n }, [load]);\r\n\r\n return { settings, loading, error, getIconForType, reload };\r\n}\r\n","import {\r\n Building2,\r\n User,\r\n Server,\r\n Building,\r\n Home,\r\n Briefcase,\r\n Globe,\r\n Shield,\r\n Users,\r\n Crown,\r\n Warehouse,\r\n Store,\r\n Factory,\r\n Landmark,\r\n HardDrive,\r\n Cloud,\r\n Database,\r\n Monitor,\r\n Laptop,\r\n type LucideIcon,\r\n} from 'lucide-react';\r\n\r\nconst ICON_MAP: Record<string, LucideIcon> = {\r\n Building2,\r\n User,\r\n Server,\r\n Building,\r\n Home,\r\n Briefcase,\r\n Globe,\r\n Shield,\r\n Users,\r\n Crown,\r\n Warehouse,\r\n Store,\r\n Factory,\r\n Landmark,\r\n HardDrive,\r\n Cloud,\r\n Database,\r\n Monitor,\r\n Laptop,\r\n};\r\n\r\n/**\r\n * Resolves a Lucide icon name (string) to its React component.\r\n * Falls back to Building2 if the name is unknown.\r\n */\r\nexport const getLucideIcon = (name: string): LucideIcon =>\r\n ICON_MAP[name] ?? Building2;\r\n\r\n/**\r\n * Returns a list of all available icon names for the admin UI picker.\r\n */\r\nexport const getAvailableIconNames = (): string[] => Object.keys(ICON_MAP);\r\n\r\n/**\r\n * Maps a color name to Tailwind background and text classes.\r\n */\r\nexport const getColorClasses = (color: string): { bg: string; text: string } => {\r\n const COLOR_MAP: Record<string, { bg: string; text: string }> = {\r\n blue: { bg: 'bg-blue-500/10', text: 'text-blue-500' },\r\n violet: { bg: 'bg-violet-500/10', text: 'text-violet-500' },\r\n gray: { bg: 'bg-gray-500/10', text: 'text-gray-500' },\r\n green: { bg: 'bg-green-500/10', text: 'text-green-500' },\r\n red: { bg: 'bg-red-500/10', text: 'text-red-500' },\r\n amber: { bg: 'bg-amber-500/10', text: 'text-amber-500' },\r\n purple: { bg: 'bg-purple-500/10', text: 'text-purple-500' },\r\n cyan: { bg: 'bg-cyan-500/10', text: 'text-cyan-500' },\r\n pink: { bg: 'bg-pink-500/10', text: 'text-pink-500' },\r\n emerald: { bg: 'bg-emerald-500/10', text: 'text-emerald-500' },\r\n orange: { bg: 'bg-orange-500/10', text: 'text-orange-500' },\r\n indigo: { bg: 'bg-indigo-500/10', text: 'text-indigo-500' },\r\n };\r\n\r\n return COLOR_MAP[color] ?? { bg: 'bg-gray-500/10', text: 'text-gray-500' };\r\n};\r\n\r\n/**\r\n * Returns a list of all available color names for the admin UI picker.\r\n */\r\nexport const getAvailableColors = (): string[] => [\r\n 'blue', 'violet', 'gray', 'green', 'red', 'amber',\r\n 'purple', 'cyan', 'pink', 'emerald', 'orange', 'indigo',\r\n];\r\n"],"names":["tenantTypeSettingsApi","api","type","data","cachedSettings","cachePromise","DEFAULT_ICONS","useTenantTypeSettings","settings","setSettings","useState","loading","setLoading","error","setError","load","useCallback","items","useEffect","getIconForType","found","s","reload","ICON_MAP","Building2","User","Server","Building","Home","Briefcase","Globe","Shield","Users","Crown","Warehouse","Store","Factory","Landmark","HardDrive","Cloud","Database","Monitor","Laptop","getLucideIcon","name","getAvailableIconNames","getColorClasses","color","getAvailableColors"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i } from "./index-
|
|
1
|
+
import { i } from "./index-lpIzhufD.js";
|
|
2
2
|
const o = {
|
|
3
3
|
getConfiguration: (t) => i.get(`/api/administration/tenants/${t}/ticketing/configuration`),
|
|
4
4
|
saveConfiguration: (t, n) => i.put(`/api/administration/tenants/${t}/ticketing/configuration`, n),
|
|
@@ -8,4 +8,4 @@ const o = {
|
|
|
8
8
|
export {
|
|
9
9
|
o as t
|
|
10
10
|
};
|
|
11
|
-
//# sourceMappingURL=ticketingApi-
|
|
11
|
+
//# sourceMappingURL=ticketingApi-BNIdox5t.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ticketingApi-
|
|
1
|
+
{"version":3,"file":"ticketingApi-BNIdox5t.js","sources":["../../src/services/api/ticketingApi.ts"],"sourcesContent":["import { api } from './apiClient';\r\n\r\n// DTOs\r\n\r\nexport interface TenantTicketingConfigurationDto {\r\n id: string;\r\n tenantId: string;\r\n provider: string;\r\n glpiBaseUrl: string | null;\r\n glpiClientId: string | null;\r\n hasGlpiClientSecret: boolean;\r\n glpiUsername: string | null;\r\n hasGlpiPassword: boolean;\r\n glpiEntityId: number | null;\r\n glpiRequestTypeId: number | null;\r\n syncEnabled: boolean;\r\n syncIntervalMinutes: number;\r\n lastSyncAt: string | null;\r\n lastSyncError: string | null;\r\n isConfigured: boolean;\r\n createdAt: string;\r\n updatedAt: string | null;\r\n}\r\n\r\nexport interface SaveTicketingConfigurationRequest {\r\n provider: string;\r\n glpiBaseUrl?: string;\r\n glpiClientId?: string;\r\n glpiClientSecret?: string;\r\n glpiUsername?: string;\r\n glpiPassword?: string;\r\n glpiEntityId?: number;\r\n glpiRequestTypeId?: number;\r\n syncEnabled: boolean;\r\n syncIntervalMinutes: number;\r\n}\r\n\r\nexport interface TicketingSyncResultDto {\r\n success: boolean;\r\n ticketsUpdated: number;\r\n ticketsFailed: number;\r\n errorMessage: string | null;\r\n}\r\n\r\n// API\r\n\r\nexport const ticketingApi = {\r\n getConfiguration: (tenantId: string) =>\r\n api.get<TenantTicketingConfigurationDto>(`/api/administration/tenants/${tenantId}/ticketing/configuration`),\r\n\r\n saveConfiguration: (tenantId: string, data: SaveTicketingConfigurationRequest) =>\r\n api.put<TenantTicketingConfigurationDto>(`/api/administration/tenants/${tenantId}/ticketing/configuration`, data),\r\n\r\n testConnection: (tenantId: string, data: {\r\n glpiBaseUrl: string;\r\n glpiClientId: string;\r\n glpiClientSecret?: string;\r\n glpiUsername: string;\r\n glpiPassword?: string;\r\n }) =>\r\n api.post<{ success: boolean; errorMessage: string | null }>(`/api/administration/tenants/${tenantId}/ticketing/test-connection`, data),\r\n\r\n triggerSync: (tenantId: string) =>\r\n api.post<TicketingSyncResultDto>(`/api/administration/tenants/${tenantId}/ticketing/sync`),\r\n};\r\n"],"names":["ticketingApi","tenantId","api","data"],"mappings":";AA8CO,MAAMA,IAAe;AAAA,EAC1B,kBAAkB,CAACC,MACjBC,EAAI,IAAqC,+BAA+BD,CAAQ,0BAA0B;AAAA,EAE5G,mBAAmB,CAACA,GAAkBE,MACpCD,EAAI,IAAqC,+BAA+BD,CAAQ,4BAA4BE,CAAI;AAAA,EAElH,gBAAgB,CAACF,GAAkBE,MAOjCD,EAAI,KAAwD,+BAA+BD,CAAQ,8BAA8BE,CAAI;AAAA,EAEvI,aAAa,CAACF,MACZC,EAAI,KAA6B,+BAA+BD,CAAQ,iBAAiB;AAC7F;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const t=require("./index-
|
|
2
|
-
//# sourceMappingURL=ticketingApi-
|
|
1
|
+
"use strict";const t=require("./index-IgLVXPg8.js"),a={getConfiguration:i=>t.api.get(`/api/administration/tenants/${i}/ticketing/configuration`),saveConfiguration:(i,n)=>t.api.put(`/api/administration/tenants/${i}/ticketing/configuration`,n),testConnection:(i,n)=>t.api.post(`/api/administration/tenants/${i}/ticketing/test-connection`,n),triggerSync:i=>t.api.post(`/api/administration/tenants/${i}/ticketing/sync`)};exports.ticketingApi=a;
|
|
2
|
+
//# sourceMappingURL=ticketingApi-J0vC_t7r.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ticketingApi-
|
|
1
|
+
{"version":3,"file":"ticketingApi-J0vC_t7r.js","sources":["../../src/services/api/ticketingApi.ts"],"sourcesContent":["import { api } from './apiClient';\r\n\r\n// DTOs\r\n\r\nexport interface TenantTicketingConfigurationDto {\r\n id: string;\r\n tenantId: string;\r\n provider: string;\r\n glpiBaseUrl: string | null;\r\n glpiClientId: string | null;\r\n hasGlpiClientSecret: boolean;\r\n glpiUsername: string | null;\r\n hasGlpiPassword: boolean;\r\n glpiEntityId: number | null;\r\n glpiRequestTypeId: number | null;\r\n syncEnabled: boolean;\r\n syncIntervalMinutes: number;\r\n lastSyncAt: string | null;\r\n lastSyncError: string | null;\r\n isConfigured: boolean;\r\n createdAt: string;\r\n updatedAt: string | null;\r\n}\r\n\r\nexport interface SaveTicketingConfigurationRequest {\r\n provider: string;\r\n glpiBaseUrl?: string;\r\n glpiClientId?: string;\r\n glpiClientSecret?: string;\r\n glpiUsername?: string;\r\n glpiPassword?: string;\r\n glpiEntityId?: number;\r\n glpiRequestTypeId?: number;\r\n syncEnabled: boolean;\r\n syncIntervalMinutes: number;\r\n}\r\n\r\nexport interface TicketingSyncResultDto {\r\n success: boolean;\r\n ticketsUpdated: number;\r\n ticketsFailed: number;\r\n errorMessage: string | null;\r\n}\r\n\r\n// API\r\n\r\nexport const ticketingApi = {\r\n getConfiguration: (tenantId: string) =>\r\n api.get<TenantTicketingConfigurationDto>(`/api/administration/tenants/${tenantId}/ticketing/configuration`),\r\n\r\n saveConfiguration: (tenantId: string, data: SaveTicketingConfigurationRequest) =>\r\n api.put<TenantTicketingConfigurationDto>(`/api/administration/tenants/${tenantId}/ticketing/configuration`, data),\r\n\r\n testConnection: (tenantId: string, data: {\r\n glpiBaseUrl: string;\r\n glpiClientId: string;\r\n glpiClientSecret?: string;\r\n glpiUsername: string;\r\n glpiPassword?: string;\r\n }) =>\r\n api.post<{ success: boolean; errorMessage: string | null }>(`/api/administration/tenants/${tenantId}/ticketing/test-connection`, data),\r\n\r\n triggerSync: (tenantId: string) =>\r\n api.post<TicketingSyncResultDto>(`/api/administration/tenants/${tenantId}/ticketing/sync`),\r\n};\r\n"],"names":["ticketingApi","tenantId","api","data"],"mappings":"oDA8CaA,EAAe,CAC1B,iBAAmBC,GACjBC,MAAI,IAAqC,+BAA+BD,CAAQ,0BAA0B,EAE5G,kBAAmB,CAACA,EAAkBE,IACpCD,MAAI,IAAqC,+BAA+BD,CAAQ,2BAA4BE,CAAI,EAElH,eAAgB,CAACF,EAAkBE,IAOjCD,MAAI,KAAwD,+BAA+BD,CAAQ,6BAA8BE,CAAI,EAEvI,YAAcF,GACZC,EAAAA,IAAI,KAA6B,+BAA+BD,CAAQ,iBAAiB,CAC7F"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsx as e, jsxs as s, Fragment as P } from "react/jsx-runtime";
|
|
2
2
|
import { useState as d, useEffect as G } from "react";
|
|
3
3
|
import { useTranslation as F } from "react-i18next";
|
|
4
|
-
import { k as E, D as T } from "./index-
|
|
4
|
+
import { k as E, D as T } from "./index-lpIzhufD.js";
|
|
5
5
|
import { A as B } from "./AccessRequestStatusBadge-CjkJPKuE.js";
|
|
6
6
|
import { X as D, Users as H, Shield as X, Loader2 as q, CheckCircle as z, XCircle as K } from "lucide-react";
|
|
7
|
-
import { a as w } from "./accessRequestsApi-
|
|
7
|
+
import { a as w } from "./accessRequestsApi-DZSfThpd.js";
|
|
8
8
|
function U({
|
|
9
9
|
open: u,
|
|
10
10
|
onClose: h,
|
|
@@ -346,4 +346,4 @@ export {
|
|
|
346
346
|
ee as A,
|
|
347
347
|
se as u
|
|
348
348
|
};
|
|
349
|
-
//# sourceMappingURL=useAccessRequests-
|
|
349
|
+
//# sourceMappingURL=useAccessRequests-DCNNLnxk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAccessRequests-B9bF4swg.js","sources":["../../src/components/platform/administration/access-requests/AccessRequestApprovalModal.tsx","../../src/hooks/useAccessRequestActions.ts","../../src/components/platform/administration/access-requests/AccessRequestsListTab.tsx","../../src/hooks/useAccessRequests.ts"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { AccessRequest } from '@/services/api/accessRequestsApi';\r\nimport { adminApi, type RoleListDto, type TenantGroupDto } from '@/services/api/adminApi';\r\nimport { Loader2, X, Users, Shield } from 'lucide-react';\r\n\r\ntype AssignmentMode = 'group' | 'role';\r\n\r\ninterface AccessRequestApprovalModalProps {\r\n readonly open: boolean;\r\n readonly onClose: () => void;\r\n readonly onConfirm: (data: { roleId?: string; groupId?: string; notes?: string }) => Promise<void>;\r\n readonly request: AccessRequest;\r\n readonly action: 'approve' | 'deny';\r\n readonly processing: boolean;\r\n}\r\n\r\nexport function AccessRequestApprovalModal({\r\n open,\r\n onClose,\r\n onConfirm,\r\n request,\r\n action,\r\n processing,\r\n}: AccessRequestApprovalModalProps): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const [notes, setNotes] = useState('');\r\n const [assignmentMode, setAssignmentMode] = useState<AssignmentMode>('group');\r\n const [selectedRoleId, setSelectedRoleId] = useState('');\r\n const [selectedGroupId, setSelectedGroupId] = useState('');\r\n const [roles, setRoles] = useState<RoleListDto[]>([]);\r\n const [groups, setGroups] = useState<TenantGroupDto[]>([]);\r\n const [loadingRoles, setLoadingRoles] = useState(false);\r\n const [loadingGroups, setLoadingGroups] = useState(false);\r\n\r\n const isDeny = action === 'deny';\r\n const isApprove = action === 'approve';\r\n\r\n // Load groups for the tenant when modal opens in approve mode\r\n useEffect(() => {\r\n if (!open || !isApprove) return;\r\n\r\n setLoadingGroups(true);\r\n adminApi.tenants.getGroups(request.tenantId)\r\n .then((groups) => {\r\n setGroups(groups.filter(g => g.isActive));\r\n })\r\n .catch(() => {\r\n setGroups([]);\r\n })\r\n .finally(() => {\r\n setLoadingGroups(false);\r\n });\r\n }, [open, isApprove, request.tenantId]);\r\n\r\n // Load roles when switching to role mode or on initial open\r\n useEffect(() => {\r\n if (!open || !isApprove || assignmentMode !== 'role') return;\r\n if (roles.length > 0) return; // Already loaded\r\n\r\n setLoadingRoles(true);\r\n adminApi.roles.getByApplication(request.applicationId)\r\n .then((roles) => {\r\n setRoles(roles);\r\n })\r\n .catch(() => {\r\n setRoles([]);\r\n })\r\n .finally(() => {\r\n setLoadingRoles(false);\r\n });\r\n }, [open, isApprove, assignmentMode, request.applicationId, roles.length]);\r\n\r\n // Reset state when modal closes\r\n useEffect(() => {\r\n if (!open) {\r\n setNotes('');\r\n setAssignmentMode('group');\r\n setSelectedRoleId('');\r\n setSelectedGroupId('');\r\n setRoles([]);\r\n setGroups([]);\r\n }\r\n }, [open]);\r\n\r\n const handleSubmit = async () => {\r\n if (isDeny) {\r\n await onConfirm({ notes: notes || undefined });\r\n return;\r\n }\r\n\r\n await onConfirm({\r\n roleId: assignmentMode === 'role' ? selectedRoleId : undefined,\r\n groupId: assignmentMode === 'group' ? selectedGroupId : undefined,\r\n notes: notes || undefined,\r\n });\r\n };\r\n\r\n if (!open) return null;\r\n\r\n const canSubmit = isApprove\r\n ? ((assignmentMode === 'role' && selectedRoleId !== '') ||\r\n (assignmentMode === 'group' && selectedGroupId !== '')) && !processing\r\n : notes !== '' && !processing;\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] p-6 max-w-md w-full max-h-[90vh] overflow-y-auto\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold\">{t(`accessRequests.modal.${action}Title`)}</h3>\r\n <button\r\n onClick={onClose}\r\n className=\"p-1 hover:bg-[var(--bg-hover)] rounded\"\r\n disabled={processing}\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n <div>\r\n <div className=\"font-medium mb-1\">{t('accessRequests.modal.user')}</div>\r\n <div>{request.userFullName} ({request.userEmail})</div>\r\n </div>\r\n\r\n <div>\r\n <div className=\"font-medium mb-1\">{t('accessRequests.modal.application')}</div>\r\n <div>{request.applicationLabel}</div>\r\n </div>\r\n\r\n {request.reason && (\r\n <div>\r\n <div className=\"font-medium mb-1\">{t('accessRequests.modal.userReason')}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">{request.reason}</div>\r\n </div>\r\n )}\r\n\r\n {isApprove && (\r\n <>\r\n {/* Assignment mode toggle */}\r\n <div>\r\n <label className=\"block font-medium mb-2\">\r\n {t('accessRequests.modal.assignmentMethod')}\r\n <span className=\"text-[var(--error-text)] ml-1\">*</span>\r\n </label>\r\n <div className=\"grid grid-cols-2 gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setAssignmentMode('group')}\r\n className={`flex items-center gap-2 px-3 py-2.5 rounded-[var(--radius-input)] border text-sm font-medium transition-colors ${\r\n assignmentMode === 'group'\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] text-[var(--color-accent-700)]'\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <Users className=\"w-4 h-4\" />\r\n {t('accessRequests.modal.addToGroup')}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setAssignmentMode('role')}\r\n className={`flex items-center gap-2 px-3 py-2.5 rounded-[var(--radius-input)] border text-sm font-medium transition-colors ${\r\n assignmentMode === 'role'\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] text-[var(--color-accent-700)]'\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <Shield className=\"w-4 h-4\" />\r\n {t('accessRequests.modal.assignRole')}\r\n </button>\r\n </div>\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1.5\">\r\n {assignmentMode === 'group'\r\n ? t('accessRequests.modal.groupHint')\r\n : t('accessRequests.modal.roleHint')}\r\n </p>\r\n </div>\r\n\r\n {/* Group selector */}\r\n {assignmentMode === 'group' && (\r\n <div>\r\n <label className=\"block font-medium mb-2\">\r\n {t('accessRequests.modal.selectGroup')}\r\n <span className=\"text-[var(--error-text)] ml-1\">*</span>\r\n </label>\r\n {loadingGroups && (\r\n <div className=\"flex items-center gap-2 text-sm text-[var(--text-secondary)]\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {t('accessRequests.modal.loadingGroups')}\r\n </div>\r\n )}\r\n {!loadingGroups && groups.length === 0 && (\r\n <div className=\"text-sm text-[var(--warning-text)]\">\r\n {t('accessRequests.modal.noGroupsAvailable')}\r\n </div>\r\n )}\r\n {!loadingGroups && groups.length > 0 && (\r\n <select\r\n value={selectedGroupId}\r\n onChange={(e) => setSelectedGroupId(e.target.value)}\r\n className=\"w-full px-3 py-2 border rounded-[var(--radius-input)] bg-[var(--bg-primary)] border-[var(--border-color)]\"\r\n >\r\n <option value=\"\">{t('accessRequests.modal.selectGroupPlaceholder')}</option>\r\n {groups.map((group) => (\r\n <option key={group.groupId} value={group.groupId}>\r\n {group.name} ({group.memberCount} {t('accessRequests.modal.members')})\r\n </option>\r\n ))}\r\n </select>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Role selector */}\r\n {assignmentMode === 'role' && (\r\n <div>\r\n <label className=\"block font-medium mb-2\">\r\n {t('accessRequests.modal.selectRole')}\r\n <span className=\"text-[var(--error-text)] ml-1\">*</span>\r\n </label>\r\n {loadingRoles && (\r\n <div className=\"flex items-center gap-2 text-sm text-[var(--text-secondary)]\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {t('accessRequests.modal.loadingRoles')}\r\n </div>\r\n )}\r\n {!loadingRoles && roles.length === 0 && (\r\n <div className=\"text-sm text-[var(--warning-text)]\">\r\n {t('accessRequests.modal.noRolesAvailable')}\r\n </div>\r\n )}\r\n {!loadingRoles && roles.length > 0 && (\r\n <select\r\n value={selectedRoleId}\r\n onChange={(e) => setSelectedRoleId(e.target.value)}\r\n className=\"w-full px-3 py-2 border rounded-[var(--radius-input)] bg-[var(--bg-primary)] border-[var(--border-color)]\"\r\n >\r\n <option value=\"\">{t('accessRequests.modal.selectRolePlaceholder')}</option>\r\n {roles.map((role) => (\r\n <option key={role.id} value={role.id}>\r\n {role.name} ({role.shortName})\r\n </option>\r\n ))}\r\n </select>\r\n )}\r\n </div>\r\n )}\r\n </>\r\n )}\r\n\r\n <div>\r\n <label className=\"block font-medium mb-2\">\r\n {t(`accessRequests.modal.${action}Notes`)}\r\n {isDeny && <span className=\"text-[var(--error-text)] ml-1\">*</span>}\r\n </label>\r\n <textarea\r\n value={notes}\r\n onChange={(e) => setNotes(e.target.value)}\r\n className=\"w-full px-3 py-2 border rounded-[var(--radius-input)] bg-[var(--bg-primary)] border-[var(--border-color)]\"\r\n rows={3}\r\n placeholder={t(`accessRequests.modal.${action}NotesPlaceholder`)}\r\n required={isDeny}\r\n />\r\n </div>\r\n\r\n <div className=\"flex justify-end gap-2 pt-2\">\r\n <button\r\n onClick={onClose}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] hover:bg-[var(--bg-hover)]\"\r\n disabled={processing}\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={handleSubmit}\r\n disabled={!canSubmit}\r\n className={`px-4 py-2 rounded-[var(--radius-button)] text-white disabled:opacity-50 flex items-center gap-2 ${\r\n isDeny ? 'bg-[var(--error-text)]' : 'bg-[var(--success-text)]'\r\n }`}\r\n >\r\n {processing && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t(`accessRequests.actions.${action}`)}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState } from 'react';\r\nimport { accessRequestsApi } from '@/services/api/accessRequestsApi';\r\n\r\nexport function useAccessRequestActions(onSuccess?: () => void): {\n approve: (requestId: string, data: { roleId?: string; groupId?: string; notes?: string }) => Promise<void>;\n deny: (requestId: string, notes: string) => Promise<void>;\n processing: boolean;\n error: string | null;\n} {\r\n const [processing, setProcessing] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const approve = async (requestId: string, data: { roleId?: string; groupId?: string; notes?: string }) => {\r\n setProcessing(true);\r\n setError(null);\r\n try {\r\n await accessRequestsApi.approveRequest(requestId, data);\r\n onSuccess?.();\r\n } catch (err: unknown) {\r\n setError(err instanceof Error ? err.message : 'Failed to approve request');\r\n throw err;\r\n } finally {\r\n setProcessing(false);\r\n }\r\n };\r\n\r\n const deny = async (requestId: string, notes: string) => {\r\n setProcessing(true);\r\n setError(null);\r\n try {\r\n await accessRequestsApi.denyRequest(requestId, notes);\r\n onSuccess?.();\r\n } catch (err: unknown) {\r\n setError(err instanceof Error ? err.message : 'Failed to deny request');\r\n throw err;\r\n } finally {\r\n setProcessing(false);\r\n }\r\n };\r\n\r\n return { approve, deny, processing, error };\r\n}\r\n","import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { DataTable } from '@/components/ui/DataTable';\r\nimport type { DataTableColumn } from '@/components/ui/DataTable';\r\nimport { AccessRequestStatusBadge } from './AccessRequestStatusBadge';\r\nimport { AccessRequestApprovalModal } from './AccessRequestApprovalModal';\r\nimport { CheckCircle, XCircle, Loader2 } from 'lucide-react';\r\nimport type { AccessRequest } from '@/services/api/accessRequestsApi';\r\nimport { useAccessRequestActions } from '@/hooks/useAccessRequestActions';\r\n\r\ninterface AccessRequestsListTabProps {\r\n readonly requests: AccessRequest[];\r\n readonly loading: boolean;\r\n readonly onReload: () => void;\r\n readonly showTenantColumn?: boolean;\r\n}\r\n\r\nexport function AccessRequestsListTab({ requests, loading, onReload, showTenantColumn = false }: AccessRequestsListTabProps): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const [selectedRequest, setSelectedRequest] = useState<AccessRequest | null>(null);\r\n const [modalAction, setModalAction] = useState<'approve' | 'deny' | null>(null);\r\n\r\n const { approve, deny, processing } = useAccessRequestActions(() => {\r\n setSelectedRequest(null);\r\n setModalAction(null);\r\n onReload();\r\n });\r\n\r\n const handleAction = (request: AccessRequest, action: 'approve' | 'deny') => {\r\n setSelectedRequest(request);\r\n setModalAction(action);\r\n };\r\n\r\n const handleConfirm = async (data: { roleId?: string; groupId?: string; notes?: string }) => {\r\n if (!selectedRequest) return;\r\n\r\n if (modalAction === 'approve') {\r\n await approve(selectedRequest.id, data);\r\n } else if (modalAction === 'deny' && data.notes) {\r\n await deny(selectedRequest.id, data.notes);\r\n }\r\n };\r\n\r\n const columns: DataTableColumn<AccessRequest>[] = [\r\n {\r\n key: 'userFullName',\r\n label: t('accessRequests.table.user'),\r\n render: (req) => (\r\n <div>\r\n <div className=\"font-medium\">{req.userFullName}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">{req.userEmail}</div>\r\n </div>\r\n ),\r\n },\r\n ...(showTenantColumn ? [{\r\n key: 'tenantName' as const,\r\n label: t('accessRequests.table.tenant'),\r\n render: (req: AccessRequest) => req.tenantName,\r\n }] : []),\r\n {\r\n key: 'applicationLabel',\r\n label: t('accessRequests.table.application'),\r\n },\r\n {\r\n key: 'reason',\r\n label: t('accessRequests.table.reason'),\r\n render: (req) => req.reason || '-',\r\n },\r\n {\r\n key: 'requestedAt',\r\n label: t('accessRequests.table.requestedAt'),\r\n render: (req) => new Date(req.requestedAt).toLocaleString(),\r\n },\r\n {\r\n key: 'status',\r\n label: t('accessRequests.table.status'),\r\n render: (req) => <AccessRequestStatusBadge status={req.status} />,\r\n },\r\n {\r\n key: 'actions',\r\n label: t('common:actionsColumn'),\r\n align: 'right',\r\n render: (req) => (\r\n req.status === 'Pending' ? (\r\n <div className=\"flex gap-2\">\r\n <button\r\n onClick={() => handleAction(req, 'approve')}\r\n className=\"p-1 rounded hover:bg-[var(--success-bg)] text-[var(--success-text)]\"\r\n title={t('accessRequests.actions.approve')}\r\n >\r\n <CheckCircle className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => handleAction(req, 'deny')}\r\n className=\"p-1 rounded hover:bg-[var(--error-bg)] text-[var(--error-text)]\"\r\n title={t('accessRequests.actions.deny')}\r\n >\r\n <XCircle className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n ) : (\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {req.processedBy}\r\n </div>\r\n )\r\n ),\r\n },\r\n ];\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n <DataTable\r\n data={requests}\r\n columns={columns}\r\n searchable\r\n searchPlaceholder={t('accessRequests.search')}\r\n getRowKey={(req) => req.id}\r\n emptyMessage={t('accessRequests.empty')}\r\n />\r\n\r\n {selectedRequest && modalAction && (\r\n <AccessRequestApprovalModal\r\n open={true}\r\n onClose={() => {\r\n setSelectedRequest(null);\r\n setModalAction(null);\r\n }}\r\n onConfirm={handleConfirm}\r\n request={selectedRequest}\r\n action={modalAction}\r\n processing={processing}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState } from 'react';\r\nimport { accessRequestsApi } from '@/services/api/accessRequestsApi';\r\nimport type { AccessRequest } from '@/services/api/accessRequestsApi';\r\n\r\nexport function useAccessRequests(type: 'application' | 'tenant', id: string): {\n requests: AccessRequest[];\n loading: boolean;\n error: string | null;\n loadRequests: (status?: string) => Promise<void>;\n} {\r\n const [requests, setRequests] = useState<AccessRequest[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadRequests = async (status?: string) => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const data = type === 'application'\r\n ? await accessRequestsApi.getRequestsByApplication(id, status)\r\n : await accessRequestsApi.getRequestsByTenant(id, status);\r\n setRequests(Array.isArray(data) ? data : []);\r\n } catch (err: any) {\r\n setError(err.message || 'Failed to load requests');\r\n setRequests([]); // Reset to empty array on error\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n return { requests, loading, error, loadRequests };\r\n}\r\n"],"names":["AccessRequestApprovalModal","open","onClose","onConfirm","request","action","processing","t","useTranslation","notes","setNotes","useState","assignmentMode","setAssignmentMode","selectedRoleId","setSelectedRoleId","selectedGroupId","setSelectedGroupId","roles","setRoles","groups","setGroups","loadingRoles","setLoadingRoles","loadingGroups","setLoadingGroups","isDeny","isApprove","useEffect","adminApi","g","handleSubmit","canSubmit","jsxs","jsx","X","Fragment","Users","Shield","Loader2","e","group","role","useAccessRequestActions","onSuccess","setProcessing","error","setError","requestId","data","accessRequestsApi","err","AccessRequestsListTab","requests","loading","onReload","showTenantColumn","selectedRequest","setSelectedRequest","modalAction","setModalAction","approve","deny","handleAction","handleConfirm","columns","req","AccessRequestStatusBadge","CheckCircle","XCircle","DataTable","useAccessRequests","type","id","setRequests","setLoading","status"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useAccessRequests-DCNNLnxk.js","sources":["../../src/components/platform/administration/access-requests/AccessRequestApprovalModal.tsx","../../src/hooks/useAccessRequestActions.ts","../../src/components/platform/administration/access-requests/AccessRequestsListTab.tsx","../../src/hooks/useAccessRequests.ts"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { AccessRequest } from '@/services/api/accessRequestsApi';\r\nimport { adminApi, type RoleListDto, type TenantGroupDto } from '@/services/api/adminApi';\r\nimport { Loader2, X, Users, Shield } from 'lucide-react';\r\n\r\ntype AssignmentMode = 'group' | 'role';\r\n\r\ninterface AccessRequestApprovalModalProps {\r\n readonly open: boolean;\r\n readonly onClose: () => void;\r\n readonly onConfirm: (data: { roleId?: string; groupId?: string; notes?: string }) => Promise<void>;\r\n readonly request: AccessRequest;\r\n readonly action: 'approve' | 'deny';\r\n readonly processing: boolean;\r\n}\r\n\r\nexport function AccessRequestApprovalModal({\r\n open,\r\n onClose,\r\n onConfirm,\r\n request,\r\n action,\r\n processing,\r\n}: AccessRequestApprovalModalProps): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const [notes, setNotes] = useState('');\r\n const [assignmentMode, setAssignmentMode] = useState<AssignmentMode>('group');\r\n const [selectedRoleId, setSelectedRoleId] = useState('');\r\n const [selectedGroupId, setSelectedGroupId] = useState('');\r\n const [roles, setRoles] = useState<RoleListDto[]>([]);\r\n const [groups, setGroups] = useState<TenantGroupDto[]>([]);\r\n const [loadingRoles, setLoadingRoles] = useState(false);\r\n const [loadingGroups, setLoadingGroups] = useState(false);\r\n\r\n const isDeny = action === 'deny';\r\n const isApprove = action === 'approve';\r\n\r\n // Load groups for the tenant when modal opens in approve mode\r\n useEffect(() => {\r\n if (!open || !isApprove) return;\r\n\r\n setLoadingGroups(true);\r\n adminApi.tenants.getGroups(request.tenantId)\r\n .then((groups) => {\r\n setGroups(groups.filter(g => g.isActive));\r\n })\r\n .catch(() => {\r\n setGroups([]);\r\n })\r\n .finally(() => {\r\n setLoadingGroups(false);\r\n });\r\n }, [open, isApprove, request.tenantId]);\r\n\r\n // Load roles when switching to role mode or on initial open\r\n useEffect(() => {\r\n if (!open || !isApprove || assignmentMode !== 'role') return;\r\n if (roles.length > 0) return; // Already loaded\r\n\r\n setLoadingRoles(true);\r\n adminApi.roles.getByApplication(request.applicationId)\r\n .then((roles) => {\r\n setRoles(roles);\r\n })\r\n .catch(() => {\r\n setRoles([]);\r\n })\r\n .finally(() => {\r\n setLoadingRoles(false);\r\n });\r\n }, [open, isApprove, assignmentMode, request.applicationId, roles.length]);\r\n\r\n // Reset state when modal closes\r\n useEffect(() => {\r\n if (!open) {\r\n setNotes('');\r\n setAssignmentMode('group');\r\n setSelectedRoleId('');\r\n setSelectedGroupId('');\r\n setRoles([]);\r\n setGroups([]);\r\n }\r\n }, [open]);\r\n\r\n const handleSubmit = async () => {\r\n if (isDeny) {\r\n await onConfirm({ notes: notes || undefined });\r\n return;\r\n }\r\n\r\n await onConfirm({\r\n roleId: assignmentMode === 'role' ? selectedRoleId : undefined,\r\n groupId: assignmentMode === 'group' ? selectedGroupId : undefined,\r\n notes: notes || undefined,\r\n });\r\n };\r\n\r\n if (!open) return null;\r\n\r\n const canSubmit = isApprove\r\n ? ((assignmentMode === 'role' && selectedRoleId !== '') ||\r\n (assignmentMode === 'group' && selectedGroupId !== '')) && !processing\r\n : notes !== '' && !processing;\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] p-6 max-w-md w-full max-h-[90vh] overflow-y-auto\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold\">{t(`accessRequests.modal.${action}Title`)}</h3>\r\n <button\r\n onClick={onClose}\r\n className=\"p-1 hover:bg-[var(--bg-hover)] rounded\"\r\n disabled={processing}\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n <div>\r\n <div className=\"font-medium mb-1\">{t('accessRequests.modal.user')}</div>\r\n <div>{request.userFullName} ({request.userEmail})</div>\r\n </div>\r\n\r\n <div>\r\n <div className=\"font-medium mb-1\">{t('accessRequests.modal.application')}</div>\r\n <div>{request.applicationLabel}</div>\r\n </div>\r\n\r\n {request.reason && (\r\n <div>\r\n <div className=\"font-medium mb-1\">{t('accessRequests.modal.userReason')}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">{request.reason}</div>\r\n </div>\r\n )}\r\n\r\n {isApprove && (\r\n <>\r\n {/* Assignment mode toggle */}\r\n <div>\r\n <label className=\"block font-medium mb-2\">\r\n {t('accessRequests.modal.assignmentMethod')}\r\n <span className=\"text-[var(--error-text)] ml-1\">*</span>\r\n </label>\r\n <div className=\"grid grid-cols-2 gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setAssignmentMode('group')}\r\n className={`flex items-center gap-2 px-3 py-2.5 rounded-[var(--radius-input)] border text-sm font-medium transition-colors ${\r\n assignmentMode === 'group'\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] text-[var(--color-accent-700)]'\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <Users className=\"w-4 h-4\" />\r\n {t('accessRequests.modal.addToGroup')}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setAssignmentMode('role')}\r\n className={`flex items-center gap-2 px-3 py-2.5 rounded-[var(--radius-input)] border text-sm font-medium transition-colors ${\r\n assignmentMode === 'role'\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] text-[var(--color-accent-700)]'\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <Shield className=\"w-4 h-4\" />\r\n {t('accessRequests.modal.assignRole')}\r\n </button>\r\n </div>\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1.5\">\r\n {assignmentMode === 'group'\r\n ? t('accessRequests.modal.groupHint')\r\n : t('accessRequests.modal.roleHint')}\r\n </p>\r\n </div>\r\n\r\n {/* Group selector */}\r\n {assignmentMode === 'group' && (\r\n <div>\r\n <label className=\"block font-medium mb-2\">\r\n {t('accessRequests.modal.selectGroup')}\r\n <span className=\"text-[var(--error-text)] ml-1\">*</span>\r\n </label>\r\n {loadingGroups && (\r\n <div className=\"flex items-center gap-2 text-sm text-[var(--text-secondary)]\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {t('accessRequests.modal.loadingGroups')}\r\n </div>\r\n )}\r\n {!loadingGroups && groups.length === 0 && (\r\n <div className=\"text-sm text-[var(--warning-text)]\">\r\n {t('accessRequests.modal.noGroupsAvailable')}\r\n </div>\r\n )}\r\n {!loadingGroups && groups.length > 0 && (\r\n <select\r\n value={selectedGroupId}\r\n onChange={(e) => setSelectedGroupId(e.target.value)}\r\n className=\"w-full px-3 py-2 border rounded-[var(--radius-input)] bg-[var(--bg-primary)] border-[var(--border-color)]\"\r\n >\r\n <option value=\"\">{t('accessRequests.modal.selectGroupPlaceholder')}</option>\r\n {groups.map((group) => (\r\n <option key={group.groupId} value={group.groupId}>\r\n {group.name} ({group.memberCount} {t('accessRequests.modal.members')})\r\n </option>\r\n ))}\r\n </select>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Role selector */}\r\n {assignmentMode === 'role' && (\r\n <div>\r\n <label className=\"block font-medium mb-2\">\r\n {t('accessRequests.modal.selectRole')}\r\n <span className=\"text-[var(--error-text)] ml-1\">*</span>\r\n </label>\r\n {loadingRoles && (\r\n <div className=\"flex items-center gap-2 text-sm text-[var(--text-secondary)]\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {t('accessRequests.modal.loadingRoles')}\r\n </div>\r\n )}\r\n {!loadingRoles && roles.length === 0 && (\r\n <div className=\"text-sm text-[var(--warning-text)]\">\r\n {t('accessRequests.modal.noRolesAvailable')}\r\n </div>\r\n )}\r\n {!loadingRoles && roles.length > 0 && (\r\n <select\r\n value={selectedRoleId}\r\n onChange={(e) => setSelectedRoleId(e.target.value)}\r\n className=\"w-full px-3 py-2 border rounded-[var(--radius-input)] bg-[var(--bg-primary)] border-[var(--border-color)]\"\r\n >\r\n <option value=\"\">{t('accessRequests.modal.selectRolePlaceholder')}</option>\r\n {roles.map((role) => (\r\n <option key={role.id} value={role.id}>\r\n {role.name} ({role.shortName})\r\n </option>\r\n ))}\r\n </select>\r\n )}\r\n </div>\r\n )}\r\n </>\r\n )}\r\n\r\n <div>\r\n <label className=\"block font-medium mb-2\">\r\n {t(`accessRequests.modal.${action}Notes`)}\r\n {isDeny && <span className=\"text-[var(--error-text)] ml-1\">*</span>}\r\n </label>\r\n <textarea\r\n value={notes}\r\n onChange={(e) => setNotes(e.target.value)}\r\n className=\"w-full px-3 py-2 border rounded-[var(--radius-input)] bg-[var(--bg-primary)] border-[var(--border-color)]\"\r\n rows={3}\r\n placeholder={t(`accessRequests.modal.${action}NotesPlaceholder`)}\r\n required={isDeny}\r\n />\r\n </div>\r\n\r\n <div className=\"flex justify-end gap-2 pt-2\">\r\n <button\r\n onClick={onClose}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] hover:bg-[var(--bg-hover)]\"\r\n disabled={processing}\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={handleSubmit}\r\n disabled={!canSubmit}\r\n className={`px-4 py-2 rounded-[var(--radius-button)] text-white disabled:opacity-50 flex items-center gap-2 ${\r\n isDeny ? 'bg-[var(--error-text)]' : 'bg-[var(--success-text)]'\r\n }`}\r\n >\r\n {processing && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t(`accessRequests.actions.${action}`)}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState } from 'react';\r\nimport { accessRequestsApi } from '@/services/api/accessRequestsApi';\r\n\r\nexport function useAccessRequestActions(onSuccess?: () => void): {\n approve: (requestId: string, data: { roleId?: string; groupId?: string; notes?: string }) => Promise<void>;\n deny: (requestId: string, notes: string) => Promise<void>;\n processing: boolean;\n error: string | null;\n} {\r\n const [processing, setProcessing] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const approve = async (requestId: string, data: { roleId?: string; groupId?: string; notes?: string }) => {\r\n setProcessing(true);\r\n setError(null);\r\n try {\r\n await accessRequestsApi.approveRequest(requestId, data);\r\n onSuccess?.();\r\n } catch (err: unknown) {\r\n setError(err instanceof Error ? err.message : 'Failed to approve request');\r\n throw err;\r\n } finally {\r\n setProcessing(false);\r\n }\r\n };\r\n\r\n const deny = async (requestId: string, notes: string) => {\r\n setProcessing(true);\r\n setError(null);\r\n try {\r\n await accessRequestsApi.denyRequest(requestId, notes);\r\n onSuccess?.();\r\n } catch (err: unknown) {\r\n setError(err instanceof Error ? err.message : 'Failed to deny request');\r\n throw err;\r\n } finally {\r\n setProcessing(false);\r\n }\r\n };\r\n\r\n return { approve, deny, processing, error };\r\n}\r\n","import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { DataTable } from '@/components/ui/DataTable';\r\nimport type { DataTableColumn } from '@/components/ui/DataTable';\r\nimport { AccessRequestStatusBadge } from './AccessRequestStatusBadge';\r\nimport { AccessRequestApprovalModal } from './AccessRequestApprovalModal';\r\nimport { CheckCircle, XCircle, Loader2 } from 'lucide-react';\r\nimport type { AccessRequest } from '@/services/api/accessRequestsApi';\r\nimport { useAccessRequestActions } from '@/hooks/useAccessRequestActions';\r\n\r\ninterface AccessRequestsListTabProps {\r\n readonly requests: AccessRequest[];\r\n readonly loading: boolean;\r\n readonly onReload: () => void;\r\n readonly showTenantColumn?: boolean;\r\n}\r\n\r\nexport function AccessRequestsListTab({ requests, loading, onReload, showTenantColumn = false }: AccessRequestsListTabProps): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const [selectedRequest, setSelectedRequest] = useState<AccessRequest | null>(null);\r\n const [modalAction, setModalAction] = useState<'approve' | 'deny' | null>(null);\r\n\r\n const { approve, deny, processing } = useAccessRequestActions(() => {\r\n setSelectedRequest(null);\r\n setModalAction(null);\r\n onReload();\r\n });\r\n\r\n const handleAction = (request: AccessRequest, action: 'approve' | 'deny') => {\r\n setSelectedRequest(request);\r\n setModalAction(action);\r\n };\r\n\r\n const handleConfirm = async (data: { roleId?: string; groupId?: string; notes?: string }) => {\r\n if (!selectedRequest) return;\r\n\r\n if (modalAction === 'approve') {\r\n await approve(selectedRequest.id, data);\r\n } else if (modalAction === 'deny' && data.notes) {\r\n await deny(selectedRequest.id, data.notes);\r\n }\r\n };\r\n\r\n const columns: DataTableColumn<AccessRequest>[] = [\r\n {\r\n key: 'userFullName',\r\n label: t('accessRequests.table.user'),\r\n render: (req) => (\r\n <div>\r\n <div className=\"font-medium\">{req.userFullName}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">{req.userEmail}</div>\r\n </div>\r\n ),\r\n },\r\n ...(showTenantColumn ? [{\r\n key: 'tenantName' as const,\r\n label: t('accessRequests.table.tenant'),\r\n render: (req: AccessRequest) => req.tenantName,\r\n }] : []),\r\n {\r\n key: 'applicationLabel',\r\n label: t('accessRequests.table.application'),\r\n },\r\n {\r\n key: 'reason',\r\n label: t('accessRequests.table.reason'),\r\n render: (req) => req.reason || '-',\r\n },\r\n {\r\n key: 'requestedAt',\r\n label: t('accessRequests.table.requestedAt'),\r\n render: (req) => new Date(req.requestedAt).toLocaleString(),\r\n },\r\n {\r\n key: 'status',\r\n label: t('accessRequests.table.status'),\r\n render: (req) => <AccessRequestStatusBadge status={req.status} />,\r\n },\r\n {\r\n key: 'actions',\r\n label: t('common:actionsColumn'),\r\n align: 'right',\r\n render: (req) => (\r\n req.status === 'Pending' ? (\r\n <div className=\"flex gap-2\">\r\n <button\r\n onClick={() => handleAction(req, 'approve')}\r\n className=\"p-1 rounded hover:bg-[var(--success-bg)] text-[var(--success-text)]\"\r\n title={t('accessRequests.actions.approve')}\r\n >\r\n <CheckCircle className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => handleAction(req, 'deny')}\r\n className=\"p-1 rounded hover:bg-[var(--error-bg)] text-[var(--error-text)]\"\r\n title={t('accessRequests.actions.deny')}\r\n >\r\n <XCircle className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n ) : (\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {req.processedBy}\r\n </div>\r\n )\r\n ),\r\n },\r\n ];\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n <DataTable\r\n data={requests}\r\n columns={columns}\r\n searchable\r\n searchPlaceholder={t('accessRequests.search')}\r\n getRowKey={(req) => req.id}\r\n emptyMessage={t('accessRequests.empty')}\r\n />\r\n\r\n {selectedRequest && modalAction && (\r\n <AccessRequestApprovalModal\r\n open={true}\r\n onClose={() => {\r\n setSelectedRequest(null);\r\n setModalAction(null);\r\n }}\r\n onConfirm={handleConfirm}\r\n request={selectedRequest}\r\n action={modalAction}\r\n processing={processing}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState } from 'react';\r\nimport { accessRequestsApi } from '@/services/api/accessRequestsApi';\r\nimport type { AccessRequest } from '@/services/api/accessRequestsApi';\r\n\r\nexport function useAccessRequests(type: 'application' | 'tenant', id: string): {\n requests: AccessRequest[];\n loading: boolean;\n error: string | null;\n loadRequests: (status?: string) => Promise<void>;\n} {\r\n const [requests, setRequests] = useState<AccessRequest[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadRequests = async (status?: string) => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const data = type === 'application'\r\n ? await accessRequestsApi.getRequestsByApplication(id, status)\r\n : await accessRequestsApi.getRequestsByTenant(id, status);\r\n setRequests(Array.isArray(data) ? data : []);\r\n } catch (err: any) {\r\n setError(err.message || 'Failed to load requests');\r\n setRequests([]); // Reset to empty array on error\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n return { requests, loading, error, loadRequests };\r\n}\r\n"],"names":["AccessRequestApprovalModal","open","onClose","onConfirm","request","action","processing","t","useTranslation","notes","setNotes","useState","assignmentMode","setAssignmentMode","selectedRoleId","setSelectedRoleId","selectedGroupId","setSelectedGroupId","roles","setRoles","groups","setGroups","loadingRoles","setLoadingRoles","loadingGroups","setLoadingGroups","isDeny","isApprove","useEffect","adminApi","g","handleSubmit","canSubmit","jsxs","jsx","X","Fragment","Users","Shield","Loader2","e","group","role","useAccessRequestActions","onSuccess","setProcessing","error","setError","requestId","data","accessRequestsApi","err","AccessRequestsListTab","requests","loading","onReload","showTenantColumn","selectedRequest","setSelectedRequest","modalAction","setModalAction","approve","deny","handleAction","handleConfirm","columns","req","AccessRequestStatusBadge","CheckCircle","XCircle","DataTable","useAccessRequests","type","id","setRequests","setLoading","status"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const e=require("react/jsx-runtime"),l=require("react"),L=require("react-i18next"),k=require("./index-
|
|
2
|
-
//# sourceMappingURL=useAccessRequests-
|
|
1
|
+
"use strict";const e=require("react/jsx-runtime"),l=require("react"),L=require("react-i18next"),k=require("./index-IgLVXPg8.js"),F=require("./AccessRequestStatusBadge-CNTI7EDr.js"),v=require("lucide-react"),N=require("./accessRequestsApi-B-4TJ5_U.js");function $({open:d,onClose:p,onConfirm:u,request:n,action:t,processing:i}){const{t:s}=L.useTranslation("admin"),[o,m]=l.useState(""),[r,x]=l.useState("group"),[b,g]=l.useState(""),[j,y]=l.useState(""),[a,f]=l.useState([]),[q,w]=l.useState([]),[A,C]=l.useState(!1),[S,I]=l.useState(!1),R=t==="deny",h=t==="approve";l.useEffect(()=>{!d||!h||(I(!0),k.adminApi.tenants.getGroups(n.tenantId).then(c=>{w(c.filter(T=>T.isActive))}).catch(()=>{w([])}).finally(()=>{I(!1)}))},[d,h,n.tenantId]),l.useEffect(()=>{!d||!h||r!=="role"||a.length>0||(C(!0),k.adminApi.roles.getByApplication(n.applicationId).then(c=>{f(c)}).catch(()=>{f([])}).finally(()=>{C(!1)}))},[d,h,r,n.applicationId,a.length]),l.useEffect(()=>{d||(m(""),x("group"),g(""),y(""),f([]),w([]))},[d]);const G=async()=>{if(R){await u({notes:o||void 0});return}await u({roleId:r==="role"?b:void 0,groupId:r==="group"?j:void 0,notes:o||void 0})};if(!d)return null;const E=h?(r==="role"&&b!==""||r==="group"&&j!=="")&&!i:o!==""&&!i;return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm",children:e.jsxs("div",{className:"bg-[var(--bg-primary)] rounded-[var(--radius-card)] p-6 max-w-md w-full max-h-[90vh] overflow-y-auto",children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsx("h3",{className:"text-lg font-semibold",children:s(`accessRequests.modal.${t}Title`)}),e.jsx("button",{onClick:p,className:"p-1 hover:bg-[var(--bg-hover)] rounded",disabled:i,children:e.jsx(v.X,{className:"w-5 h-5"})})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("div",{className:"font-medium mb-1",children:s("accessRequests.modal.user")}),e.jsxs("div",{children:[n.userFullName," (",n.userEmail,")"]})]}),e.jsxs("div",{children:[e.jsx("div",{className:"font-medium mb-1",children:s("accessRequests.modal.application")}),e.jsx("div",{children:n.applicationLabel})]}),n.reason&&e.jsxs("div",{children:[e.jsx("div",{className:"font-medium mb-1",children:s("accessRequests.modal.userReason")}),e.jsx("div",{className:"text-sm text-[var(--text-secondary)]",children:n.reason})]}),h&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsxs("label",{className:"block font-medium mb-2",children:[s("accessRequests.modal.assignmentMethod"),e.jsx("span",{className:"text-[var(--error-text)] ml-1",children:"*"})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[e.jsxs("button",{type:"button",onClick:()=>x("group"),className:`flex items-center gap-2 px-3 py-2.5 rounded-[var(--radius-input)] border text-sm font-medium transition-colors ${r==="group"?"border-[var(--color-accent-500)] bg-[var(--color-accent-50)] text-[var(--color-accent-700)]":"border-[var(--border-color)] hover:bg-[var(--bg-hover)]"}`,children:[e.jsx(v.Users,{className:"w-4 h-4"}),s("accessRequests.modal.addToGroup")]}),e.jsxs("button",{type:"button",onClick:()=>x("role"),className:`flex items-center gap-2 px-3 py-2.5 rounded-[var(--radius-input)] border text-sm font-medium transition-colors ${r==="role"?"border-[var(--color-accent-500)] bg-[var(--color-accent-50)] text-[var(--color-accent-700)]":"border-[var(--border-color)] hover:bg-[var(--bg-hover)]"}`,children:[e.jsx(v.Shield,{className:"w-4 h-4"}),s("accessRequests.modal.assignRole")]})]}),e.jsx("p",{className:"text-xs text-[var(--text-secondary)] mt-1.5",children:s(r==="group"?"accessRequests.modal.groupHint":"accessRequests.modal.roleHint")})]}),r==="group"&&e.jsxs("div",{children:[e.jsxs("label",{className:"block font-medium mb-2",children:[s("accessRequests.modal.selectGroup"),e.jsx("span",{className:"text-[var(--error-text)] ml-1",children:"*"})]}),S&&e.jsxs("div",{className:"flex items-center gap-2 text-sm text-[var(--text-secondary)]",children:[e.jsx(v.Loader2,{className:"w-4 h-4 animate-spin"}),s("accessRequests.modal.loadingGroups")]}),!S&&q.length===0&&e.jsx("div",{className:"text-sm text-[var(--warning-text)]",children:s("accessRequests.modal.noGroupsAvailable")}),!S&&q.length>0&&e.jsxs("select",{value:j,onChange:c=>y(c.target.value),className:"w-full px-3 py-2 border rounded-[var(--radius-input)] bg-[var(--bg-primary)] border-[var(--border-color)]",children:[e.jsx("option",{value:"",children:s("accessRequests.modal.selectGroupPlaceholder")}),q.map(c=>e.jsxs("option",{value:c.groupId,children:[c.name," (",c.memberCount," ",s("accessRequests.modal.members"),")"]},c.groupId))]})]}),r==="role"&&e.jsxs("div",{children:[e.jsxs("label",{className:"block font-medium mb-2",children:[s("accessRequests.modal.selectRole"),e.jsx("span",{className:"text-[var(--error-text)] ml-1",children:"*"})]}),A&&e.jsxs("div",{className:"flex items-center gap-2 text-sm text-[var(--text-secondary)]",children:[e.jsx(v.Loader2,{className:"w-4 h-4 animate-spin"}),s("accessRequests.modal.loadingRoles")]}),!A&&a.length===0&&e.jsx("div",{className:"text-sm text-[var(--warning-text)]",children:s("accessRequests.modal.noRolesAvailable")}),!A&&a.length>0&&e.jsxs("select",{value:b,onChange:c=>g(c.target.value),className:"w-full px-3 py-2 border rounded-[var(--radius-input)] bg-[var(--bg-primary)] border-[var(--border-color)]",children:[e.jsx("option",{value:"",children:s("accessRequests.modal.selectRolePlaceholder")}),a.map(c=>e.jsxs("option",{value:c.id,children:[c.name," (",c.shortName,")"]},c.id))]})]})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block font-medium mb-2",children:[s(`accessRequests.modal.${t}Notes`),R&&e.jsx("span",{className:"text-[var(--error-text)] ml-1",children:"*"})]}),e.jsx("textarea",{value:o,onChange:c=>m(c.target.value),className:"w-full px-3 py-2 border rounded-[var(--radius-input)] bg-[var(--bg-primary)] border-[var(--border-color)]",rows:3,placeholder:s(`accessRequests.modal.${t}NotesPlaceholder`),required:R})]}),e.jsxs("div",{className:"flex justify-end gap-2 pt-2",children:[e.jsx("button",{onClick:p,className:"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] hover:bg-[var(--bg-hover)]",disabled:i,children:s("common:cancel")}),e.jsxs("button",{onClick:G,disabled:!E,className:`px-4 py-2 rounded-[var(--radius-button)] text-white disabled:opacity-50 flex items-center gap-2 ${R?"bg-[var(--error-text)]":"bg-[var(--success-text)]"}`,children:[i&&e.jsx(v.Loader2,{className:"w-4 h-4 animate-spin"}),s(`accessRequests.actions.${t}`)]})]})]})]})})}function B(d){const[p,u]=l.useState(!1),[n,t]=l.useState(null);return{approve:async(o,m)=>{u(!0),t(null);try{await N.accessRequestsApi.approveRequest(o,m),d?.()}catch(r){throw t(r instanceof Error?r.message:"Failed to approve request"),r}finally{u(!1)}},deny:async(o,m)=>{u(!0),t(null);try{await N.accessRequestsApi.denyRequest(o,m),d?.()}catch(r){throw t(r instanceof Error?r.message:"Failed to deny request"),r}finally{u(!1)}},processing:p,error:n}}function M({requests:d,loading:p,onReload:u,showTenantColumn:n=!1}){const{t}=L.useTranslation("admin"),[i,s]=l.useState(null),[o,m]=l.useState(null),{approve:r,deny:x,processing:b}=B(()=>{s(null),m(null),u()}),g=(a,f)=>{s(a),m(f)},j=async a=>{i&&(o==="approve"?await r(i.id,a):o==="deny"&&a.notes&&await x(i.id,a.notes))},y=[{key:"userFullName",label:t("accessRequests.table.user"),render:a=>e.jsxs("div",{children:[e.jsx("div",{className:"font-medium",children:a.userFullName}),e.jsx("div",{className:"text-sm text-[var(--text-secondary)]",children:a.userEmail})]})},...n?[{key:"tenantName",label:t("accessRequests.table.tenant"),render:a=>a.tenantName}]:[],{key:"applicationLabel",label:t("accessRequests.table.application")},{key:"reason",label:t("accessRequests.table.reason"),render:a=>a.reason||"-"},{key:"requestedAt",label:t("accessRequests.table.requestedAt"),render:a=>new Date(a.requestedAt).toLocaleString()},{key:"status",label:t("accessRequests.table.status"),render:a=>e.jsx(F.AccessRequestStatusBadge,{status:a.status})},{key:"actions",label:t("common:actionsColumn"),align:"right",render:a=>a.status==="Pending"?e.jsxs("div",{className:"flex gap-2",children:[e.jsx("button",{onClick:()=>g(a,"approve"),className:"p-1 rounded hover:bg-[var(--success-bg)] text-[var(--success-text)]",title:t("accessRequests.actions.approve"),children:e.jsx(v.CheckCircle,{className:"w-4 h-4"})}),e.jsx("button",{onClick:()=>g(a,"deny"),className:"p-1 rounded hover:bg-[var(--error-bg)] text-[var(--error-text)]",title:t("accessRequests.actions.deny"),children:e.jsx(v.XCircle,{className:"w-4 h-4"})})]}):e.jsx("div",{className:"text-sm text-[var(--text-secondary)]",children:a.processedBy})}];return p?e.jsx("div",{className:"flex items-center justify-center py-8",children:e.jsx(v.Loader2,{className:"w-6 h-6 animate-spin text-[var(--color-accent-500)]"})}):e.jsxs("div",{className:"space-y-4",children:[e.jsx(k.DataTable,{data:d,columns:y,searchable:!0,searchPlaceholder:t("accessRequests.search"),getRowKey:a=>a.id,emptyMessage:t("accessRequests.empty")}),i&&o&&e.jsx($,{open:!0,onClose:()=>{s(null),m(null)},onConfirm:j,request:i,action:o,processing:b})]})}function P(d,p){const[u,n]=l.useState([]),[t,i]=l.useState(!1),[s,o]=l.useState(null);return{requests:u,loading:t,error:s,loadRequests:async r=>{i(!0),o(null);try{const x=d==="application"?await N.accessRequestsApi.getRequestsByApplication(p,r):await N.accessRequestsApi.getRequestsByTenant(p,r);n(Array.isArray(x)?x:[])}catch(x){o(x.message||"Failed to load requests"),n([])}finally{i(!1)}}}}exports.AccessRequestsListTab=M;exports.useAccessRequests=P;
|
|
2
|
+
//# sourceMappingURL=useAccessRequests-DT7X4FAK.js.map
|