@atlashub/smartstack 3.39.0-preview.1049 → 3.40.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-DgqyaZwI.js → AgentSkillsPage-BS_W2KTh.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-DgqyaZwI.js.map → AgentSkillsPage-BS_W2KTh.js.map} +1 -1
- package/dist/chunks/{AgentSkillsPage-ojivq0Cu.js → AgentSkillsPage-CmDFLnp7.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-ojivq0Cu.js.map → AgentSkillsPage-CmDFLnp7.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-BGGTfOLs.js → AgentWorkloadPage-C8IvYfhT.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-BGGTfOLs.js.map → AgentWorkloadPage-C8IvYfhT.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-DWsC5VoS.js → AgentWorkloadPage-JXsQbwuM.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-DWsC5VoS.js.map → AgentWorkloadPage-JXsQbwuM.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-7EifQOAh.js → ApiCatalogDetailPage-CYOt34Vy.js} +2 -2
- package/dist/chunks/{ApiCatalogDetailPage-7EifQOAh.js.map → ApiCatalogDetailPage-CYOt34Vy.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-BD7XE4xK.js → ApiCatalogDetailPage-wFZDsTGy.js} +3 -3
- package/dist/chunks/{ApiCatalogDetailPage-BD7XE4xK.js.map → ApiCatalogDetailPage-wFZDsTGy.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BfPoZGD3.js → ApiCatalogPage-Bdm3HNGP.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BfPoZGD3.js.map → ApiCatalogPage-Bdm3HNGP.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BOPTnk-b.js → ApiCatalogPage-m_TWQyGv.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BOPTnk-b.js.map → ApiCatalogPage-m_TWQyGv.js.map} +1 -1
- package/dist/chunks/ApplicationDetailPage-C2BSpEoW.js +2 -0
- package/dist/chunks/{ApplicationDetailPage-CWdz0TS4.js.map → ApplicationDetailPage-C2BSpEoW.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-CDQqViuH.js → ApplicationDetailPage-CcgDAP-J.js} +503 -501
- package/dist/chunks/{ApplicationDetailPage-CDQqViuH.js.map → ApplicationDetailPage-CcgDAP-J.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-ZyXm2Cd1.js → ApplicationsDashboardPage-CDIjziL3.js} +3 -3
- package/dist/chunks/{ApplicationsDashboardPage-ZyXm2Cd1.js.map → ApplicationsDashboardPage-CDIjziL3.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-BH4S3qA2.js → ApplicationsDashboardPage-DslDyNzJ.js} +2 -2
- package/dist/chunks/{ApplicationsDashboardPage-BH4S3qA2.js.map → ApplicationsDashboardPage-DslDyNzJ.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-D0fU1_Le.js → ApplicationsGridPage-BCjsQGU0.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-D0fU1_Le.js.map → ApplicationsGridPage-BCjsQGU0.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-C1WF2Htv.js → ApplicationsGridPage-CIfKiCND.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-C1WF2Htv.js.map → ApplicationsGridPage-CIfKiCND.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-Cxvt2_WQ.js → ApplicationsListPage-CT75kNcH.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-Cxvt2_WQ.js.map → ApplicationsListPage-CT75kNcH.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-B3ItaY4r.js → ApplicationsListPage-D2B4PZ5n.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-B3ItaY4r.js.map → ApplicationsListPage-D2B4PZ5n.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-BqfNR-kc.js → ApplicationsPage-CaTBtduL.js} +2 -2
- package/dist/chunks/{ApplicationsPage-BqfNR-kc.js.map → ApplicationsPage-CaTBtduL.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-DuxuWfrN.js → ApplicationsPage-DW1LhL0U.js} +4 -4
- package/dist/chunks/{ApplicationsPage-DuxuWfrN.js.map → ApplicationsPage-DW1LhL0U.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-CR1C7V0a.js → AssignmentRulesPage-Bt9M0ki7.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-CR1C7V0a.js.map → AssignmentRulesPage-Bt9M0ki7.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-C4Jouh2g.js → AssignmentRulesPage-Y7xv60NY.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-C4Jouh2g.js.map → AssignmentRulesPage-Y7xv60NY.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-v8QUJkE7.js → AssignmentsPage-1eQGTjTi.js} +2 -2
- package/dist/chunks/{AssignmentsPage-v8QUJkE7.js.map → AssignmentsPage-1eQGTjTi.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-CjuGAd8n.js → AssignmentsPage-RURdPvfZ.js} +2 -2
- package/dist/chunks/{AssignmentsPage-CjuGAd8n.js.map → AssignmentsPage-RURdPvfZ.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-BxIXPUJk.js → AuthCallbackPage-8hF0jYlK.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-BxIXPUJk.js.map → AuthCallbackPage-8hF0jYlK.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-CuS-efzY.js → AuthCallbackPage-DPL68Asu.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-CuS-efzY.js.map → AuthCallbackPage-DPL68Asu.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-CWIqy2bT.js → ConfirmEmailPage-BKlpZkVk.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-CWIqy2bT.js.map → ConfirmEmailPage-BKlpZkVk.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-CkN8IfP-.js → ConfirmEmailPage-CawSZypI.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-CkN8IfP-.js.map → ConfirmEmailPage-CawSZypI.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-Df0ow5ge.js → CreateSupportTicketPage-AwbMbBIH.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-Df0ow5ge.js.map → CreateSupportTicketPage-AwbMbBIH.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-CmrDfFxP.js → CreateSupportTicketPage-Dg1YW1eA.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-CmrDfFxP.js.map → CreateSupportTicketPage-Dg1YW1eA.js.map} +1 -1
- package/dist/chunks/{DashboardPage-B4Pi5P3O.js → DashboardPage-B4YxOF-9.js} +3 -3
- package/dist/chunks/{DashboardPage-B4Pi5P3O.js.map → DashboardPage-B4YxOF-9.js.map} +1 -1
- package/dist/chunks/{DashboardPage-wEKZ_DWf.js → DashboardPage-BZxjinar.js} +2 -2
- package/dist/chunks/{DashboardPage-wEKZ_DWf.js.map → DashboardPage-BZxjinar.js.map} +1 -1
- package/dist/chunks/{DashboardPage-BAqpoxCW.js → DashboardPage-Bo09y8r7.js} +3 -3
- package/dist/chunks/{DashboardPage-BAqpoxCW.js.map → DashboardPage-Bo09y8r7.js.map} +1 -1
- package/dist/chunks/{DashboardPage-BT5kFaQA.js → DashboardPage-Cq5adDjP.js} +2 -2
- package/dist/chunks/{DashboardPage-BT5kFaQA.js.map → DashboardPage-Cq5adDjP.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-4pF38E4N.js → EscalationConfigPage-C8Hv5naz.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-4pF38E4N.js.map → EscalationConfigPage-C8Hv5naz.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-Bcifnt_h.js → EscalationConfigPage-DNAqMRxA.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-Bcifnt_h.js.map → EscalationConfigPage-DNAqMRxA.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-CBaMV_PS.js → ForceChangePasswordPage-BURE_vNg.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-CBaMV_PS.js.map → ForceChangePasswordPage-BURE_vNg.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-ClDXluX1.js → ForceChangePasswordPage-C6jDZshk.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-ClDXluX1.js.map → ForceChangePasswordPage-C6jDZshk.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage--ueWRNSO.js → ForgotPasswordPage-C5HLYbz4.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage--ueWRNSO.js.map → ForgotPasswordPage-C5HLYbz4.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-CzpAkP5R.js → ForgotPasswordPage-D3ZQBtjd.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-CzpAkP5R.js.map → ForgotPasswordPage-D3ZQBtjd.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-dXNOoSXE.js → GroupDetailPage-CTuzp9Vp.js} +5 -5
- package/dist/chunks/{GroupDetailPage-dXNOoSXE.js.map → GroupDetailPage-CTuzp9Vp.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-BIgBzQk0.js → GroupDetailPage-NJc2zCxC.js} +2 -2
- package/dist/chunks/{GroupDetailPage-BIgBzQk0.js.map → GroupDetailPage-NJc2zCxC.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-K2NXkdy4.js → MyAccessRequestsPage-Cvr29Pnq.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-K2NXkdy4.js.map → MyAccessRequestsPage-Cvr29Pnq.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-Be8VvLhh.js → MyAccessRequestsPage-t6I24rHN.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-Be8VvLhh.js.map → MyAccessRequestsPage-t6I24rHN.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-BXx1nPC8.js → MyTenantsPage-Dy2RZ_Ei.js} +2 -2
- package/dist/chunks/{MyTenantsPage-BXx1nPC8.js.map → MyTenantsPage-Dy2RZ_Ei.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-B9ZAUeCa.js → MyTenantsPage-SvDCQ4Wt.js} +3 -3
- package/dist/chunks/{MyTenantsPage-B9ZAUeCa.js.map → MyTenantsPage-SvDCQ4Wt.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-C9MSmmR5.js → MyTicketsPage-C3lEBFD9.js} +2 -2
- package/dist/chunks/{MyTicketsPage-C9MSmmR5.js.map → MyTicketsPage-C3lEBFD9.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-d0PoJpnX.js → MyTicketsPage-DydDgFyz.js} +2 -2
- package/dist/chunks/{MyTicketsPage-d0PoJpnX.js.map → MyTicketsPage-DydDgFyz.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-CJ3BjLlz.js → NavigationAppsPage-Dyv767w8.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-CJ3BjLlz.js.map → NavigationAppsPage-Dyv767w8.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-8t2xbddT.js → NavigationAppsPage-WqSspaVo.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-8t2xbddT.js.map → NavigationAppsPage-WqSspaVo.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-_62-bmuk.js → NotificationsPage-Di4I95PM.js} +2 -2
- package/dist/chunks/{NotificationsPage-_62-bmuk.js.map → NotificationsPage-Di4I95PM.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-CLHfVUxm.js → NotificationsPage-elSovpBw.js} +2 -2
- package/dist/chunks/{NotificationsPage-CLHfVUxm.js.map → NotificationsPage-elSovpBw.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-Dkc22Jc4.js → OnboardingWizardPage-fdWdkwiT.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-Dkc22Jc4.js.map → OnboardingWizardPage-fdWdkwiT.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-D1rzD6gR.js → OnboardingWizardPage-nPLe2buQ.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-D1rzD6gR.js.map → OnboardingWizardPage-nPLe2buQ.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-BSvSe4SI.js → PermissionDetailPage-B8C7tWFP.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-BSvSe4SI.js.map → PermissionDetailPage-B8C7tWFP.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-_HhbxzlG.js → PermissionDetailPage-IUgUaTkE.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-_HhbxzlG.js.map → PermissionDetailPage-IUgUaTkE.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-Xb92YAHn.js → PermissionsPage-CmX5sQf2.js} +2 -2
- package/dist/chunks/{PermissionsPage-Xb92YAHn.js.map → PermissionsPage-CmX5sQf2.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-B0M4gA5m.js → PermissionsPage-Kg0rduOM.js} +2 -2
- package/dist/chunks/{PermissionsPage-B0M4gA5m.js.map → PermissionsPage-Kg0rduOM.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-DTeMESj9.js → PortalDashboardPage-CCAYuhtI.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-DTeMESj9.js.map → PortalDashboardPage-CCAYuhtI.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-pt9hipR4.js → PortalDashboardPage-Dme1XmzN.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-pt9hipR4.js.map → PortalDashboardPage-Dme1XmzN.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-Cy30AWIN.js → PreferencesPage-Ct6xWAFp.js} +2 -2
- package/dist/chunks/{PreferencesPage-Cy30AWIN.js.map → PreferencesPage-Ct6xWAFp.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-CsHVGMgp.js → PreferencesPage-Db2RjMpm.js} +2 -2
- package/dist/chunks/{PreferencesPage-CsHVGMgp.js.map → PreferencesPage-Db2RjMpm.js.map} +1 -1
- package/dist/chunks/{ProfilePage-6Gf7igUI.js → ProfilePage-D6Xb1ALH.js} +2 -2
- package/dist/chunks/{ProfilePage-6Gf7igUI.js.map → ProfilePage-D6Xb1ALH.js.map} +1 -1
- package/dist/chunks/{ProfilePage-BzBWkztf.js → ProfilePage-DN2s-lfp.js} +2 -2
- package/dist/chunks/{ProfilePage-BzBWkztf.js.map → ProfilePage-DN2s-lfp.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-DEDoHrnU.js → ReferencesManagementPage-B5mcshG1.js} +2 -2
- package/dist/chunks/{ReferencesManagementPage-DEDoHrnU.js.map → ReferencesManagementPage-B5mcshG1.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-DD1QiFYr.js → ReferencesManagementPage-DB975ktX.js} +3 -3
- package/dist/chunks/{ReferencesManagementPage-DD1QiFYr.js.map → ReferencesManagementPage-DB975ktX.js.map} +1 -1
- package/dist/chunks/{RegisterPage-asdx33fV.js → RegisterPage-ZskZrLZH.js} +2 -2
- package/dist/chunks/{RegisterPage-asdx33fV.js.map → RegisterPage-ZskZrLZH.js.map} +1 -1
- package/dist/chunks/{RegisterPage-CIPHRYkl.js → RegisterPage-b8yIPVgh.js} +2 -2
- package/dist/chunks/{RegisterPage-CIPHRYkl.js.map → RegisterPage-b8yIPVgh.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-B4Dj24vU.js → ResetPasswordPage-CeAvfsE-.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-B4Dj24vU.js.map → ResetPasswordPage-CeAvfsE-.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-B8MWH_Vi.js → ResetPasswordPage-Dzp5dCp8.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-B8MWH_Vi.js.map → ResetPasswordPage-Dzp5dCp8.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-Cs6T441o.js → ResolutionModal-CRVN7gHv.js} +2 -2
- package/dist/chunks/{ResolutionModal-Cs6T441o.js.map → ResolutionModal-CRVN7gHv.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-rLoFOxm9.js → ResolutionModal-DJOw1sLT.js} +2 -2
- package/dist/chunks/{ResolutionModal-rLoFOxm9.js.map → ResolutionModal-DJOw1sLT.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-Pkw0wU5g.js → RoleDetailPage-CLVoFVF8.js} +2 -2
- package/dist/chunks/{RoleDetailPage-Pkw0wU5g.js.map → RoleDetailPage-CLVoFVF8.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-CNFG6j6P.js → RoleDetailPage-XGnPD_8C.js} +3 -3
- package/dist/chunks/{RoleDetailPage-CNFG6j6P.js.map → RoleDetailPage-XGnPD_8C.js.map} +1 -1
- package/dist/chunks/{RolesPage-BHEkMR2O.js → RolesPage-BnAMpR2b.js} +2 -2
- package/dist/chunks/{RolesPage-BHEkMR2O.js.map → RolesPage-BnAMpR2b.js.map} +1 -1
- package/dist/chunks/{RolesPage-D35jwDJU.js → RolesPage-Czj9LMkL.js} +2 -2
- package/dist/chunks/{RolesPage-D35jwDJU.js.map → RolesPage-Czj9LMkL.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-DtonDehw.js → SlaConfigPage-HM0MpIlg.js} +2 -2
- package/dist/chunks/{SlaConfigPage-DtonDehw.js.map → SlaConfigPage-HM0MpIlg.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-C5Jstix-.js → SlaConfigPage-ZRyAs8aY.js} +2 -2
- package/dist/chunks/{SlaConfigPage-C5Jstix-.js.map → SlaConfigPage-ZRyAs8aY.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-6pC73oCY.js → SupportPermissionsPage-CxJuGgcQ.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-6pC73oCY.js.map → SupportPermissionsPage-CxJuGgcQ.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-CsJKGt__.js → SupportPermissionsPage-DNd323OK.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-CsJKGt__.js.map → SupportPermissionsPage-DNd323OK.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-DjmYOGEC.js → TemplatesPage-CdwPLsHj.js} +2 -2
- package/dist/chunks/{TemplatesPage-DjmYOGEC.js.map → TemplatesPage-CdwPLsHj.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-DlY91VO_.js → TemplatesPage-Co3ygZvF.js} +2 -2
- package/dist/chunks/{TemplatesPage-DlY91VO_.js.map → TemplatesPage-Co3ygZvF.js.map} +1 -1
- package/dist/chunks/{TenantCard-BHLcv2gD.js → TenantCard-CmCfIK2F.js} +2 -2
- package/dist/chunks/{TenantCard-BHLcv2gD.js.map → TenantCard-CmCfIK2F.js.map} +1 -1
- package/dist/chunks/{TenantCard-DGCKVvKI.js → TenantCard-DI66acce.js} +2 -2
- package/dist/chunks/{TenantCard-DGCKVvKI.js.map → TenantCard-DI66acce.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-dsSwnOWg.js → TenantScopeSelector-5NOwmFX2.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-dsSwnOWg.js.map → TenantScopeSelector-5NOwmFX2.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-CU5z5PJH.js → TenantScopeSelector-CEFgxiWt.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-CU5z5PJH.js.map → TenantScopeSelector-CEFgxiWt.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-BQHMaRmq.js → TicketDetailPage-BhZ-mpv7.js} +2 -2
- package/dist/chunks/{TicketDetailPage-BQHMaRmq.js.map → TicketDetailPage-BhZ-mpv7.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-Bk_0uQ3B.js → TicketDetailPage-BxOiOG22.js} +2 -2
- package/dist/chunks/{TicketDetailPage-Bk_0uQ3B.js.map → TicketDetailPage-BxOiOG22.js.map} +1 -1
- package/dist/chunks/{TicketsPage-CufUJctx.js → TicketsPage-BiTvIcM8.js} +2 -2
- package/dist/chunks/{TicketsPage-CufUJctx.js.map → TicketsPage-BiTvIcM8.js.map} +1 -1
- package/dist/chunks/{TicketsPage-C8QQ4SKy.js → TicketsPage-CSiinHME.js} +2 -2
- package/dist/chunks/{TicketsPage-C8QQ4SKy.js.map → TicketsPage-CSiinHME.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-DoEMtJoe.js → UserCreateTicketPage-B3TW1oV7.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-DoEMtJoe.js.map → UserCreateTicketPage-B3TW1oV7.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-XxjNlR9K.js → UserCreateTicketPage-BszUd_WZ.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-XxjNlR9K.js.map → UserCreateTicketPage-BszUd_WZ.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-fdhZwMLg.js → UserDashboardPage-C6MvatAb.js} +2 -2
- package/dist/chunks/{UserDashboardPage-fdhZwMLg.js.map → UserDashboardPage-C6MvatAb.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-BV1d2hMG.js → UserDashboardPage-Dtt9VzG_.js} +2 -2
- package/dist/chunks/{UserDashboardPage-BV1d2hMG.js.map → UserDashboardPage-Dtt9VzG_.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-C97e-Dax.js → UserDetailPage-BEEV2vlJ.js} +5 -5
- package/dist/chunks/{UserDetailPage-C97e-Dax.js.map → UserDetailPage-BEEV2vlJ.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-BcA7Vhb2.js → UserDetailPage-Dw5OHheZ.js} +2 -2
- package/dist/chunks/{UserDetailPage-BcA7Vhb2.js.map → UserDetailPage-Dw5OHheZ.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-BA2syxXG.js → UserTicketDetailPage-B4YkzzbR.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-BA2syxXG.js.map → UserTicketDetailPage-B4YkzzbR.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-CXuZVAa2.js → UserTicketDetailPage-DCFV-0ny.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-CXuZVAa2.js.map → UserTicketDetailPage-DCFV-0ny.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-CPVk31Dh.js → UsersGroupsPage-CY-l9fTp.js} +3 -3
- package/dist/chunks/{UsersGroupsPage-CPVk31Dh.js.map → UsersGroupsPage-CY-l9fTp.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-DS2YiUE4.js → UsersGroupsPage-c28vYHN9.js} +2 -2
- package/dist/chunks/{UsersGroupsPage-DS2YiUE4.js.map → UsersGroupsPage-c28vYHN9.js.map} +1 -1
- package/dist/chunks/{UsersPage-BIXWHFmG.js → UsersPage-1sLlq9QD.js} +2 -2
- package/dist/chunks/{UsersPage-BIXWHFmG.js.map → UsersPage-1sLlq9QD.js.map} +1 -1
- package/dist/chunks/{UsersPage-DS8aWUKj.js → UsersPage-Bm-uNxh0.js} +2 -2
- package/dist/chunks/{UsersPage-DS8aWUKj.js.map → UsersPage-Bm-uNxh0.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-C-r0mrCH.js → accessRequestsApi-CJPjyEkH.js} +2 -2
- package/dist/chunks/{accessRequestsApi-C-r0mrCH.js.map → accessRequestsApi-CJPjyEkH.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-k3ZwhcFb.js → accessRequestsApi-D_pj1wl6.js} +2 -2
- package/dist/chunks/{accessRequestsApi-k3ZwhcFb.js.map → accessRequestsApi-D_pj1wl6.js.map} +1 -1
- package/dist/chunks/{aiApi-B-H-76wM.js → aiApi-ByF-oo1J.js} +2 -2
- package/dist/chunks/{aiApi-B-H-76wM.js.map → aiApi-ByF-oo1J.js.map} +1 -1
- package/dist/chunks/{aiApi-CcdrBILv.js → aiApi-Dt3fj0dU.js} +2 -2
- package/dist/chunks/{aiApi-CcdrBILv.js.map → aiApi-Dt3fj0dU.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-CO3tk6Ju.js → applicationAnalyticsApi-BgG3SGJm.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-CO3tk6Ju.js.map → applicationAnalyticsApi-BgG3SGJm.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-CLVdVLDu.js → applicationAnalyticsApi-ktD65iLO.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-CLVdVLDu.js.map → applicationAnalyticsApi-ktD65iLO.js.map} +1 -1
- package/dist/chunks/{groupsApi-DExOJZPF.js → groupsApi-C-FLWPCO.js} +2 -2
- package/dist/chunks/{groupsApi-DExOJZPF.js.map → groupsApi-C-FLWPCO.js.map} +1 -1
- package/dist/chunks/{groupsApi-CyqyYsmi.js → groupsApi-CBI5vMLa.js} +2 -2
- package/dist/chunks/{groupsApi-CyqyYsmi.js.map → groupsApi-CBI5vMLa.js.map} +1 -1
- package/dist/chunks/{index-DtAReZI6.js → index-B727-QSU.js} +2 -2
- package/dist/chunks/{index-DtAReZI6.js.map → index-B727-QSU.js.map} +1 -1
- package/dist/chunks/{index-BlOgmQzc.js → index-B9q3vx13.js} +2 -2
- package/dist/chunks/{index-BlOgmQzc.js.map → index-B9q3vx13.js.map} +1 -1
- package/dist/chunks/{index-VSQ2prtJ.js → index-BD-REzV9.js} +2 -2
- package/dist/chunks/{index-VSQ2prtJ.js.map → index-BD-REzV9.js.map} +1 -1
- package/dist/chunks/{index-XOOiD_zY.js → index-BDRogQH_.js} +3 -3
- package/dist/chunks/{index-XOOiD_zY.js.map → index-BDRogQH_.js.map} +1 -1
- package/dist/chunks/{index-DOQyf5yZ.js → index-C-DYxdvd.js} +8 -8
- package/dist/chunks/{index-DOQyf5yZ.js.map → index-C-DYxdvd.js.map} +1 -1
- package/dist/chunks/{index-Cq80YBne.js → index-CBtjGPod.js} +105 -105
- package/dist/chunks/{index-Cq80YBne.js.map → index-CBtjGPod.js.map} +1 -1
- package/dist/chunks/{index-dlXYTPWH.js → index-CF1cvNUL.js} +4 -4
- package/dist/chunks/{index-dlXYTPWH.js.map → index-CF1cvNUL.js.map} +1 -1
- package/dist/chunks/{index-COA_xJVJ.js → index-CH0pTHy1.js} +2 -2
- package/dist/chunks/{index-COA_xJVJ.js.map → index-CH0pTHy1.js.map} +1 -1
- package/dist/chunks/{index-DjZQ6ZG_.js → index-Ca88RIuT.js} +2 -2
- package/dist/chunks/{index-DjZQ6ZG_.js.map → index-Ca88RIuT.js.map} +1 -1
- package/dist/chunks/{index-Cj-9tGpd.js → index-CkWvsvKW.js} +2 -2
- package/dist/chunks/{index-Cj-9tGpd.js.map → index-CkWvsvKW.js.map} +1 -1
- package/dist/chunks/{index-EL_ZNnMH.js → index-CzYKE5fL.js} +2 -2
- package/dist/chunks/{index-EL_ZNnMH.js.map → index-CzYKE5fL.js.map} +1 -1
- package/dist/chunks/{index-qXfYaEmV.js → index-D32ol7lq.js} +2 -2
- package/dist/chunks/{index-qXfYaEmV.js.map → index-D32ol7lq.js.map} +1 -1
- package/dist/chunks/{index-DMQQ0KyA.js → index-D7hmx9IX.js} +2 -2
- package/dist/chunks/{index-DMQQ0KyA.js.map → index-D7hmx9IX.js.map} +1 -1
- package/dist/chunks/{index-BetDcNZm.js → index-DThcQmwZ.js} +2 -2
- package/dist/chunks/{index-BetDcNZm.js.map → index-DThcQmwZ.js.map} +1 -1
- package/dist/chunks/{index-C7h5yvcP.js → index-D_3J6ziZ.js} +2 -2
- package/dist/chunks/{index-C7h5yvcP.js.map → index-D_3J6ziZ.js.map} +1 -1
- package/dist/chunks/{index-C_nDTEP5.js → index-JSjfMShT.js} +2 -2
- package/dist/chunks/{index-C_nDTEP5.js.map → index-JSjfMShT.js.map} +1 -1
- package/dist/chunks/{index-COXxU0FH.js → index-gzXJw_ow.js} +3 -3
- package/dist/chunks/{index-COXxU0FH.js.map → index-gzXJw_ow.js.map} +1 -1
- package/dist/chunks/{index-jJxtz2bs.js → index-rRAbl04H.js} +2 -2
- package/dist/chunks/{index-jJxtz2bs.js.map → index-rRAbl04H.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-Ddvguo0l.js → tenantIconMap-Cw-hQ9n4.js} +2 -2
- package/dist/chunks/{tenantIconMap-Ddvguo0l.js.map → tenantIconMap-Cw-hQ9n4.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-DBa5MjIz.js → tenantIconMap-DinwojNW.js} +2 -2
- package/dist/chunks/{tenantIconMap-DBa5MjIz.js.map → tenantIconMap-DinwojNW.js.map} +1 -1
- package/dist/chunks/{ticketingApi-Cr6QSv0g.js → ticketingApi-CcWdebXv.js} +2 -2
- package/dist/chunks/{ticketingApi-Cr6QSv0g.js.map → ticketingApi-CcWdebXv.js.map} +1 -1
- package/dist/chunks/{ticketingApi-D6s75rOB.js → ticketingApi-x0BwZ1NH.js} +2 -2
- package/dist/chunks/{ticketingApi-D6s75rOB.js.map → ticketingApi-x0BwZ1NH.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-VuQT-n-P.js → useAccessRequests-BBTIYht3.js} +2 -2
- package/dist/chunks/{useAccessRequests-VuQT-n-P.js.map → useAccessRequests-BBTIYht3.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-CanI2ypo.js → useAccessRequests-BBUj9XY9.js} +71 -71
- package/dist/chunks/{useAccessRequests-CanI2ypo.js.map → useAccessRequests-BBUj9XY9.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-BEVZLX_M.js → useUserAccessRequests-BKQxcOXH.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-BEVZLX_M.js.map → useUserAccessRequests-BKQxcOXH.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-Ba40FDLm.js → useUserAccessRequests-BPUPiP55.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-Ba40FDLm.js.map → useUserAccessRequests-BPUPiP55.js.map} +1 -1
- package/dist/pages/platform/administration/applications/ApplicationDetailPage.d.ts.map +1 -1
- package/dist/smartstack.cjs +1 -1
- package/dist/smartstack.js +1 -1
- package/package.json +1 -1
- package/dist/chunks/ApplicationDetailPage-CWdz0TS4.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAccessRequests-VuQT-n-P.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); // eslint-disable-line react-hooks/set-state-in-effect -- async data fetch\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); // eslint-disable-line react-hooks/set-state-in-effect -- async data fetch\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(''); // eslint-disable-line react-hooks/set-state-in-effect -- conditional reset\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): {\r\n requests: AccessRequest[];\r\n loading: boolean;\r\n error: string | null;\r\n loadRequests: (status?: string) => Promise<void>;\r\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: unknown) {\r\n setError((err as { message?: string }).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-BBTIYht3.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); // eslint-disable-line react-hooks/set-state-in-effect -- async data fetch\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); // eslint-disable-line react-hooks/set-state-in-effect -- async data fetch\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(''); // eslint-disable-line react-hooks/set-state-in-effect -- conditional reset\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, useCallback } 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): {\r\n requests: AccessRequest[];\r\n loading: boolean;\r\n error: string | null;\r\n loadRequests: (status?: string) => Promise<void>;\r\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 = useCallback(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: unknown) {\r\n setError((err as { message?: string }).message || 'Failed to load requests');\r\n setRequests([]);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [type, id]);\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","loadRequests","useCallback","status"],"mappings":"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"}
|
|
@@ -1,61 +1,61 @@
|
|
|
1
1
|
import { jsx as e, jsxs as s, Fragment as P } from "react/jsx-runtime";
|
|
2
|
-
import { useState as
|
|
2
|
+
import { useState as u, useEffect as G, useCallback as T } from "react";
|
|
3
3
|
import { useTranslation as F } from "react-i18next";
|
|
4
|
-
import { k as E, D as
|
|
5
|
-
import { A as
|
|
6
|
-
import { X as
|
|
7
|
-
import { a as w } from "./accessRequestsApi-
|
|
8
|
-
function
|
|
9
|
-
open:
|
|
10
|
-
onClose:
|
|
11
|
-
onConfirm:
|
|
4
|
+
import { k as E, D as B } from "./index-CBtjGPod.js";
|
|
5
|
+
import { A as D } from "./AccessRequestStatusBadge-CjkJPKuE.js";
|
|
6
|
+
import { X as H, Users as X, Shield as z, Loader2 as q, CheckCircle as K, XCircle as U } from "lucide-react";
|
|
7
|
+
import { a as w } from "./accessRequestsApi-D_pj1wl6.js";
|
|
8
|
+
function J({
|
|
9
|
+
open: i,
|
|
10
|
+
onClose: v,
|
|
11
|
+
onConfirm: p,
|
|
12
12
|
request: o,
|
|
13
13
|
action: r,
|
|
14
|
-
processing:
|
|
14
|
+
processing: d
|
|
15
15
|
}) {
|
|
16
|
-
const { t: a } = F("admin"), [n,
|
|
16
|
+
const { t: a } = F("admin"), [n, m] = u(""), [l, h] = u("group"), [g, f] = u(""), [x, N] = u(""), [t, y] = u([]), [A, k] = u([]), [C, L] = u(!1), [I, S] = u(!1), R = r === "deny", b = r === "approve";
|
|
17
17
|
G(() => {
|
|
18
|
-
!
|
|
18
|
+
!i || !b || (S(!0), E.tenants.getGroups(o.tenantId).then((c) => {
|
|
19
19
|
k(c.filter((M) => M.isActive));
|
|
20
20
|
}).catch(() => {
|
|
21
21
|
k([]);
|
|
22
22
|
}).finally(() => {
|
|
23
23
|
S(!1);
|
|
24
24
|
}));
|
|
25
|
-
}, [
|
|
26
|
-
!
|
|
25
|
+
}, [i, b, o.tenantId]), G(() => {
|
|
26
|
+
!i || !b || l !== "role" || t.length > 0 || (L(!0), E.roles.getByApplication(o.applicationId).then((c) => {
|
|
27
27
|
y(c);
|
|
28
28
|
}).catch(() => {
|
|
29
29
|
y([]);
|
|
30
30
|
}).finally(() => {
|
|
31
31
|
L(!1);
|
|
32
32
|
}));
|
|
33
|
-
}, [
|
|
34
|
-
|
|
35
|
-
}, [
|
|
33
|
+
}, [i, b, l, o.applicationId, t.length]), G(() => {
|
|
34
|
+
i || (m(""), h("group"), f(""), N(""), y([]), k([]));
|
|
35
|
+
}, [i]);
|
|
36
36
|
const $ = async () => {
|
|
37
37
|
if (R) {
|
|
38
|
-
await
|
|
38
|
+
await p({ notes: n || void 0 });
|
|
39
39
|
return;
|
|
40
40
|
}
|
|
41
|
-
await
|
|
41
|
+
await p({
|
|
42
42
|
roleId: l === "role" ? g : void 0,
|
|
43
43
|
groupId: l === "group" ? x : void 0,
|
|
44
44
|
notes: n || void 0
|
|
45
45
|
});
|
|
46
46
|
};
|
|
47
|
-
if (!
|
|
48
|
-
const j = b ? (l === "role" && g !== "" || l === "group" && x !== "") && !
|
|
47
|
+
if (!i) return null;
|
|
48
|
+
const j = b ? (l === "role" && g !== "" || l === "group" && x !== "") && !d : n !== "" && !d;
|
|
49
49
|
return /* @__PURE__ */ e("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm", children: /* @__PURE__ */ s("div", { className: "bg-[var(--bg-primary)] rounded-[var(--radius-card)] p-6 max-w-md w-full max-h-[90vh] overflow-y-auto", children: [
|
|
50
50
|
/* @__PURE__ */ s("div", { className: "flex items-center justify-between mb-4", children: [
|
|
51
51
|
/* @__PURE__ */ e("h3", { className: "text-lg font-semibold", children: a(`accessRequests.modal.${r}Title`) }),
|
|
52
52
|
/* @__PURE__ */ e(
|
|
53
53
|
"button",
|
|
54
54
|
{
|
|
55
|
-
onClick:
|
|
55
|
+
onClick: v,
|
|
56
56
|
className: "p-1 hover:bg-[var(--bg-hover)] rounded",
|
|
57
|
-
disabled:
|
|
58
|
-
children: /* @__PURE__ */ e(
|
|
57
|
+
disabled: d,
|
|
58
|
+
children: /* @__PURE__ */ e(H, { className: "w-5 h-5" })
|
|
59
59
|
}
|
|
60
60
|
)
|
|
61
61
|
] }),
|
|
@@ -88,10 +88,10 @@ function U({
|
|
|
88
88
|
"button",
|
|
89
89
|
{
|
|
90
90
|
type: "button",
|
|
91
|
-
onClick: () =>
|
|
91
|
+
onClick: () => h("group"),
|
|
92
92
|
className: `flex items-center gap-2 px-3 py-2.5 rounded-[var(--radius-input)] border text-sm font-medium transition-colors ${l === "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)]"}`,
|
|
93
93
|
children: [
|
|
94
|
-
/* @__PURE__ */ e(
|
|
94
|
+
/* @__PURE__ */ e(X, { className: "w-4 h-4" }),
|
|
95
95
|
a("accessRequests.modal.addToGroup")
|
|
96
96
|
]
|
|
97
97
|
}
|
|
@@ -100,10 +100,10 @@ function U({
|
|
|
100
100
|
"button",
|
|
101
101
|
{
|
|
102
102
|
type: "button",
|
|
103
|
-
onClick: () =>
|
|
103
|
+
onClick: () => h("role"),
|
|
104
104
|
className: `flex items-center gap-2 px-3 py-2.5 rounded-[var(--radius-input)] border text-sm font-medium transition-colors ${l === "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)]"}`,
|
|
105
105
|
children: [
|
|
106
|
-
/* @__PURE__ */ e(
|
|
106
|
+
/* @__PURE__ */ e(z, { className: "w-4 h-4" }),
|
|
107
107
|
a("accessRequests.modal.assignRole")
|
|
108
108
|
]
|
|
109
109
|
}
|
|
@@ -179,7 +179,7 @@ function U({
|
|
|
179
179
|
"textarea",
|
|
180
180
|
{
|
|
181
181
|
value: n,
|
|
182
|
-
onChange: (c) =>
|
|
182
|
+
onChange: (c) => m(c.target.value),
|
|
183
183
|
className: "w-full px-3 py-2 border rounded-[var(--radius-input)] bg-[var(--bg-primary)] border-[var(--border-color)]",
|
|
184
184
|
rows: 3,
|
|
185
185
|
placeholder: a(`accessRequests.modal.${r}NotesPlaceholder`),
|
|
@@ -191,9 +191,9 @@ function U({
|
|
|
191
191
|
/* @__PURE__ */ e(
|
|
192
192
|
"button",
|
|
193
193
|
{
|
|
194
|
-
onClick:
|
|
194
|
+
onClick: v,
|
|
195
195
|
className: "px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] hover:bg-[var(--bg-hover)]",
|
|
196
|
-
disabled:
|
|
196
|
+
disabled: d,
|
|
197
197
|
children: a("common:cancel")
|
|
198
198
|
}
|
|
199
199
|
),
|
|
@@ -204,7 +204,7 @@ function U({
|
|
|
204
204
|
disabled: !j,
|
|
205
205
|
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)]"}`,
|
|
206
206
|
children: [
|
|
207
|
-
|
|
207
|
+
d && /* @__PURE__ */ e(q, { className: "w-4 h-4 animate-spin" }),
|
|
208
208
|
a(`accessRequests.actions.${r}`)
|
|
209
209
|
]
|
|
210
210
|
}
|
|
@@ -213,35 +213,35 @@ function U({
|
|
|
213
213
|
] })
|
|
214
214
|
] }) });
|
|
215
215
|
}
|
|
216
|
-
function
|
|
217
|
-
const [
|
|
218
|
-
return { approve: async (n,
|
|
219
|
-
|
|
216
|
+
function O(i) {
|
|
217
|
+
const [v, p] = u(!1), [o, r] = u(null);
|
|
218
|
+
return { approve: async (n, m) => {
|
|
219
|
+
p(!0), r(null);
|
|
220
220
|
try {
|
|
221
|
-
await w.approveRequest(n,
|
|
221
|
+
await w.approveRequest(n, m), i?.();
|
|
222
222
|
} catch (l) {
|
|
223
223
|
throw r(l instanceof Error ? l.message : "Failed to approve request"), l;
|
|
224
224
|
} finally {
|
|
225
|
-
|
|
225
|
+
p(!1);
|
|
226
226
|
}
|
|
227
|
-
}, deny: async (n,
|
|
228
|
-
|
|
227
|
+
}, deny: async (n, m) => {
|
|
228
|
+
p(!0), r(null);
|
|
229
229
|
try {
|
|
230
|
-
await w.denyRequest(n,
|
|
230
|
+
await w.denyRequest(n, m), i?.();
|
|
231
231
|
} catch (l) {
|
|
232
232
|
throw r(l instanceof Error ? l.message : "Failed to deny request"), l;
|
|
233
233
|
} finally {
|
|
234
|
-
|
|
234
|
+
p(!1);
|
|
235
235
|
}
|
|
236
|
-
}, processing:
|
|
236
|
+
}, processing: v, error: o };
|
|
237
237
|
}
|
|
238
|
-
function
|
|
239
|
-
const { t: r } = F("admin"), [
|
|
240
|
-
a(null),
|
|
238
|
+
function se({ requests: i, loading: v, onReload: p, showTenantColumn: o = !1 }) {
|
|
239
|
+
const { t: r } = F("admin"), [d, a] = u(null), [n, m] = u(null), { approve: l, deny: h, processing: g } = O(() => {
|
|
240
|
+
a(null), m(null), p();
|
|
241
241
|
}), f = (t, y) => {
|
|
242
|
-
a(t),
|
|
242
|
+
a(t), m(y);
|
|
243
243
|
}, x = async (t) => {
|
|
244
|
-
|
|
244
|
+
d && (n === "approve" ? await l(d.id, t) : n === "deny" && t.notes && await h(d.id, t.notes));
|
|
245
245
|
}, N = [
|
|
246
246
|
{
|
|
247
247
|
key: "userFullName",
|
|
@@ -273,7 +273,7 @@ function ee({ requests: u, loading: h, onReload: m, showTenantColumn: o = !1 })
|
|
|
273
273
|
{
|
|
274
274
|
key: "status",
|
|
275
275
|
label: r("accessRequests.table.status"),
|
|
276
|
-
render: (t) => /* @__PURE__ */ e(
|
|
276
|
+
render: (t) => /* @__PURE__ */ e(D, { status: t.status })
|
|
277
277
|
},
|
|
278
278
|
{
|
|
279
279
|
key: "actions",
|
|
@@ -286,7 +286,7 @@ function ee({ requests: u, loading: h, onReload: m, showTenantColumn: o = !1 })
|
|
|
286
286
|
onClick: () => f(t, "approve"),
|
|
287
287
|
className: "p-1 rounded hover:bg-[var(--success-bg)] text-[var(--success-text)]",
|
|
288
288
|
title: r("accessRequests.actions.approve"),
|
|
289
|
-
children: /* @__PURE__ */ e(
|
|
289
|
+
children: /* @__PURE__ */ e(K, { className: "w-4 h-4" })
|
|
290
290
|
}
|
|
291
291
|
),
|
|
292
292
|
/* @__PURE__ */ e(
|
|
@@ -295,17 +295,17 @@ function ee({ requests: u, loading: h, onReload: m, showTenantColumn: o = !1 })
|
|
|
295
295
|
onClick: () => f(t, "deny"),
|
|
296
296
|
className: "p-1 rounded hover:bg-[var(--error-bg)] text-[var(--error-text)]",
|
|
297
297
|
title: r("accessRequests.actions.deny"),
|
|
298
|
-
children: /* @__PURE__ */ e(
|
|
298
|
+
children: /* @__PURE__ */ e(U, { className: "w-4 h-4" })
|
|
299
299
|
}
|
|
300
300
|
)
|
|
301
301
|
] }) : /* @__PURE__ */ e("div", { className: "text-sm text-[var(--text-secondary)]", children: t.processedBy })
|
|
302
302
|
}
|
|
303
303
|
];
|
|
304
|
-
return
|
|
304
|
+
return v ? /* @__PURE__ */ e("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ e(q, { className: "w-6 h-6 animate-spin text-[var(--color-accent-500)]" }) }) : /* @__PURE__ */ s("div", { className: "space-y-4", children: [
|
|
305
305
|
/* @__PURE__ */ e(
|
|
306
|
-
|
|
306
|
+
B,
|
|
307
307
|
{
|
|
308
|
-
data:
|
|
308
|
+
data: i,
|
|
309
309
|
columns: N,
|
|
310
310
|
searchable: !0,
|
|
311
311
|
searchPlaceholder: r("accessRequests.search"),
|
|
@@ -313,37 +313,37 @@ function ee({ requests: u, loading: h, onReload: m, showTenantColumn: o = !1 })
|
|
|
313
313
|
emptyMessage: r("accessRequests.empty")
|
|
314
314
|
}
|
|
315
315
|
),
|
|
316
|
-
|
|
317
|
-
|
|
316
|
+
d && n && /* @__PURE__ */ e(
|
|
317
|
+
J,
|
|
318
318
|
{
|
|
319
319
|
open: !0,
|
|
320
320
|
onClose: () => {
|
|
321
|
-
a(null),
|
|
321
|
+
a(null), m(null);
|
|
322
322
|
},
|
|
323
323
|
onConfirm: x,
|
|
324
|
-
request:
|
|
324
|
+
request: d,
|
|
325
325
|
action: n,
|
|
326
326
|
processing: g
|
|
327
327
|
}
|
|
328
328
|
)
|
|
329
329
|
] });
|
|
330
330
|
}
|
|
331
|
-
function
|
|
332
|
-
const [
|
|
333
|
-
|
|
334
|
-
i(!0), n(null);
|
|
331
|
+
function ae(i, v) {
|
|
332
|
+
const [p, o] = u([]), [r, d] = u(!1), [a, n] = u(null), m = T(async (l) => {
|
|
333
|
+
d(!0), n(null);
|
|
335
334
|
try {
|
|
336
|
-
const
|
|
337
|
-
o(Array.isArray(
|
|
338
|
-
} catch (
|
|
339
|
-
n(
|
|
335
|
+
const h = i === "application" ? await w.getRequestsByApplication(v, l) : await w.getRequestsByTenant(v, l);
|
|
336
|
+
o(Array.isArray(h) ? h : []);
|
|
337
|
+
} catch (h) {
|
|
338
|
+
n(h.message || "Failed to load requests"), o([]);
|
|
340
339
|
} finally {
|
|
341
|
-
|
|
340
|
+
d(!1);
|
|
342
341
|
}
|
|
343
|
-
}
|
|
342
|
+
}, [i, v]);
|
|
343
|
+
return { requests: p, loading: r, error: a, loadRequests: m };
|
|
344
344
|
}
|
|
345
345
|
export {
|
|
346
|
-
|
|
347
|
-
|
|
346
|
+
se as A,
|
|
347
|
+
ae as u
|
|
348
348
|
};
|
|
349
|
-
//# sourceMappingURL=useAccessRequests-
|
|
349
|
+
//# sourceMappingURL=useAccessRequests-BBUj9XY9.js.map
|