@atlashub/smartstack 3.21.0 → 3.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js → AgentSkillsPage-BWQSCYl-.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js.map → AgentSkillsPage-BWQSCYl-.js.map} +1 -1
- package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js → AgentSkillsPage-IQcMnBaD.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js.map → AgentSkillsPage-IQcMnBaD.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js → AgentWorkloadPage-DqrjkvWL.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js.map → AgentWorkloadPage-DqrjkvWL.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js → AgentWorkloadPage-w-HiyFYP.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js.map → AgentWorkloadPage-w-HiyFYP.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js → ApiCatalogDetailPage-D3L8Yf4G.js} +3 -3
- package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js.map → ApiCatalogDetailPage-D3L8Yf4G.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js → ApiCatalogDetailPage-MPT3Kz6H.js} +2 -2
- package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js.map → ApiCatalogDetailPage-MPT3Kz6H.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js → ApiCatalogPage-D4Hg3uiS.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js.map → ApiCatalogPage-D4Hg3uiS.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js → ApiCatalogPage-DRg5Cz0r.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js.map → ApiCatalogPage-DRg5Cz0r.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js → ApplicationDetailPage-Caizuyn2.js} +2 -2
- package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js.map → ApplicationDetailPage-Caizuyn2.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js → ApplicationDetailPage-CuCW6aMB.js} +4 -4
- package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js.map → ApplicationDetailPage-CuCW6aMB.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js → ApplicationsDashboardPage-B2MW8-Kc.js} +2 -2
- package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js.map → ApplicationsDashboardPage-B2MW8-Kc.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js → ApplicationsDashboardPage-BDIjFIYZ.js} +3 -3
- package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js.map → ApplicationsDashboardPage-BDIjFIYZ.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js → ApplicationsGridPage-DV-FihKj.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js.map → ApplicationsGridPage-DV-FihKj.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js → ApplicationsGridPage-DXsTfXPI.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js.map → ApplicationsGridPage-DXsTfXPI.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js → ApplicationsListPage--CGkyBuJ.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js.map → ApplicationsListPage--CGkyBuJ.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-C91v2rZt.js → ApplicationsListPage-JUX823bh.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-C91v2rZt.js.map → ApplicationsListPage-JUX823bh.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-BCbgotIx.js → ApplicationsPage-6zgFye6w.js} +2 -2
- package/dist/chunks/{ApplicationsPage-BCbgotIx.js.map → ApplicationsPage-6zgFye6w.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js → ApplicationsPage-CQPuuiO6.js} +4 -4
- package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js.map → ApplicationsPage-CQPuuiO6.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js → AssignmentRulesPage-CFffeEbo.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js.map → AssignmentRulesPage-CFffeEbo.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js → AssignmentRulesPage-D78UeUId.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js.map → AssignmentRulesPage-D78UeUId.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-DmfBYQAD.js → AssignmentsPage-Cww2ifZF.js} +2 -2
- package/dist/chunks/{AssignmentsPage-DmfBYQAD.js.map → AssignmentsPage-Cww2ifZF.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-sRCCBmRc.js → AssignmentsPage-DE_QS2LO.js} +2 -2
- package/dist/chunks/{AssignmentsPage-sRCCBmRc.js.map → AssignmentsPage-DE_QS2LO.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js → AuthCallbackPage-CA2nO6DG.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js.map → AuthCallbackPage-CA2nO6DG.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js → AuthCallbackPage-CDUAoX-N.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js.map → AuthCallbackPage-CDUAoX-N.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js → ConfirmEmailPage-BqsILAYH.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js.map → ConfirmEmailPage-BqsILAYH.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js → ConfirmEmailPage-INeHCuMB.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js.map → ConfirmEmailPage-INeHCuMB.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js → CreateSupportTicketPage-BWeuV2aU.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js.map → CreateSupportTicketPage-BWeuV2aU.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js → CreateSupportTicketPage-OBwF4v7b.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js.map → CreateSupportTicketPage-OBwF4v7b.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CUZ80NGV.js → DashboardPage-CKHqWrdS.js} +3 -3
- package/dist/chunks/{DashboardPage-CUZ80NGV.js.map → DashboardPage-CKHqWrdS.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CaNOAstg.js → DashboardPage-COmc9b__.js} +3 -3
- package/dist/chunks/{DashboardPage-CaNOAstg.js.map → DashboardPage-COmc9b__.js.map} +1 -1
- package/dist/chunks/{DashboardPage-B48_rQFi.js → DashboardPage-CfKZHiSj.js} +2 -2
- package/dist/chunks/{DashboardPage-B48_rQFi.js.map → DashboardPage-CfKZHiSj.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CUZV1J9t.js → DashboardPage-CwEZZ3jx.js} +2 -2
- package/dist/chunks/{DashboardPage-CUZV1J9t.js.map → DashboardPage-CwEZZ3jx.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js → EscalationConfigPage--7lgZ0kJ.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js.map → EscalationConfigPage--7lgZ0kJ.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js → EscalationConfigPage-DPyiBcqV.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js.map → EscalationConfigPage-DPyiBcqV.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js → ForceChangePasswordPage-BE-6umub.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js.map → ForceChangePasswordPage-BE-6umub.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js → ForceChangePasswordPage-CnsYoWmV.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js.map → ForceChangePasswordPage-CnsYoWmV.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js → ForgotPasswordPage-CSq4DnFF.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js.map → ForgotPasswordPage-CSq4DnFF.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js → ForgotPasswordPage-DZLVolAC.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js.map → ForgotPasswordPage-DZLVolAC.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-DFBvVO1S.js → GroupDetailPage-Bf9Wb_2j.js} +5 -5
- package/dist/chunks/{GroupDetailPage-DFBvVO1S.js.map → GroupDetailPage-Bf9Wb_2j.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-B2FkKrGG.js → GroupDetailPage-R-hf3rJ7.js} +2 -2
- package/dist/chunks/{GroupDetailPage-B2FkKrGG.js.map → GroupDetailPage-R-hf3rJ7.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js → MyAccessRequestsPage-BIisvWM6.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js.map → MyAccessRequestsPage-BIisvWM6.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js → MyAccessRequestsPage-BLSV7Tbx.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js.map → MyAccessRequestsPage-BLSV7Tbx.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-BEcYYdGR.js → MyTenantsPage-D-7k9CP1.js} +3 -3
- package/dist/chunks/{MyTenantsPage-BEcYYdGR.js.map → MyTenantsPage-D-7k9CP1.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-D9f85zjF.js → MyTenantsPage-DqGW6aDt.js} +2 -2
- package/dist/chunks/{MyTenantsPage-D9f85zjF.js.map → MyTenantsPage-DqGW6aDt.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DJR8h6y1.js → MyTicketsPage--DgDsnZA.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DJR8h6y1.js.map → MyTicketsPage--DgDsnZA.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DiOUExKJ.js → MyTicketsPage-CqJ3Aqob.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DiOUExKJ.js.map → MyTicketsPage-CqJ3Aqob.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js → NavigationAppsPage-Bebis_RT.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js.map → NavigationAppsPage-Bebis_RT.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-If7tmCFY.js → NavigationAppsPage-THNPOAjv.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-If7tmCFY.js.map → NavigationAppsPage-THNPOAjv.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-C29Lln5o.js → NotificationsPage-CAbNW_Cn.js} +2 -2
- package/dist/chunks/{NotificationsPage-C29Lln5o.js.map → NotificationsPage-CAbNW_Cn.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-BiaLRb0s.js → NotificationsPage-DxwizUhL.js} +2 -2
- package/dist/chunks/{NotificationsPage-BiaLRb0s.js.map → NotificationsPage-DxwizUhL.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js → OnboardingWizardPage-C6HlbJ3K.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js.map → OnboardingWizardPage-C6HlbJ3K.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js → OnboardingWizardPage-CyC2zONO.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js.map → OnboardingWizardPage-CyC2zONO.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js → PermissionDetailPage-BDHiNgky.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js.map → PermissionDetailPage-BDHiNgky.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js → PermissionDetailPage-C5K17ydY.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js.map → PermissionDetailPage-C5K17ydY.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-l0PnY-EE.js → PermissionsPage-COI5LJPo.js} +2 -2
- package/dist/chunks/{PermissionsPage-l0PnY-EE.js.map → PermissionsPage-COI5LJPo.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-DLy9U3P3.js → PermissionsPage-CkOwH2_d.js} +2 -2
- package/dist/chunks/{PermissionsPage-DLy9U3P3.js.map → PermissionsPage-CkOwH2_d.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-DFBx38-x.js → PortalDashboardPage-CoEC4CmC.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-DFBx38-x.js.map → PortalDashboardPage-CoEC4CmC.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js → PortalDashboardPage-DrYymEf-.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js.map → PortalDashboardPage-DrYymEf-.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-BBu8yZQB.js → PreferencesPage-CJRaU3ba.js} +2 -2
- package/dist/chunks/{PreferencesPage-BBu8yZQB.js.map → PreferencesPage-CJRaU3ba.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-B81MsNV1.js → PreferencesPage-Cqr9mAab.js} +2 -2
- package/dist/chunks/{PreferencesPage-B81MsNV1.js.map → PreferencesPage-Cqr9mAab.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DDrl10zj.js → ProfilePage-BZVpg6-l.js} +2 -2
- package/dist/chunks/{ProfilePage-DDrl10zj.js.map → ProfilePage-BZVpg6-l.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DPoXwdnc.js → ProfilePage-Cu_FITeL.js} +2 -2
- package/dist/chunks/{ProfilePage-DPoXwdnc.js.map → ProfilePage-Cu_FITeL.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js → ReferencesManagementPage-DUlVk9Ps.js} +3 -3
- package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js.map → ReferencesManagementPage-DUlVk9Ps.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js → ReferencesManagementPage-ZCuYtqd7.js} +2 -2
- package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js.map → ReferencesManagementPage-ZCuYtqd7.js.map} +1 -1
- package/dist/chunks/{RegisterPage-CiQib3-6.js → RegisterPage-C4xmVwh9.js} +2 -2
- package/dist/chunks/{RegisterPage-CiQib3-6.js.map → RegisterPage-C4xmVwh9.js.map} +1 -1
- package/dist/chunks/{RegisterPage-bXCcJD88.js → RegisterPage-DGyzoIHT.js} +2 -2
- package/dist/chunks/{RegisterPage-bXCcJD88.js.map → RegisterPage-DGyzoIHT.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js → ResetPasswordPage-DqDD6VPR.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js.map → ResetPasswordPage-DqDD6VPR.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-CubPG3yv.js → ResetPasswordPage-Glu-aeqv.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-CubPG3yv.js.map → ResetPasswordPage-Glu-aeqv.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-Bg7XZmR1.js → ResolutionModal-CxjANAOP.js} +2 -2
- package/dist/chunks/{ResolutionModal-Bg7XZmR1.js.map → ResolutionModal-CxjANAOP.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-DqRk_T0n.js → ResolutionModal-Duat18qV.js} +2 -2
- package/dist/chunks/{ResolutionModal-DqRk_T0n.js.map → ResolutionModal-Duat18qV.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-Blau6_4c.js → RoleDetailPage-BQffUSnt.js} +3 -3
- package/dist/chunks/{RoleDetailPage-Blau6_4c.js.map → RoleDetailPage-BQffUSnt.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-CiRVxxIP.js → RoleDetailPage-JTm5lD1_.js} +2 -2
- package/dist/chunks/{RoleDetailPage-CiRVxxIP.js.map → RoleDetailPage-JTm5lD1_.js.map} +1 -1
- package/dist/chunks/{RolesPage-Pm-RN3lP.js → RolesPage-B9rRzciI.js} +2 -2
- package/dist/chunks/{RolesPage-Pm-RN3lP.js.map → RolesPage-B9rRzciI.js.map} +1 -1
- package/dist/chunks/{RolesPage-Cb8joqdJ.js → RolesPage-BN8_zMOC.js} +2 -2
- package/dist/chunks/{RolesPage-Cb8joqdJ.js.map → RolesPage-BN8_zMOC.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-B86McKM6.js → SlaConfigPage-B7kZNig4.js} +2 -2
- package/dist/chunks/{SlaConfigPage-B86McKM6.js.map → SlaConfigPage-B7kZNig4.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-BY7gvYU6.js → SlaConfigPage-okvZfA_K.js} +2 -2
- package/dist/chunks/{SlaConfigPage-BY7gvYU6.js.map → SlaConfigPage-okvZfA_K.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js → SupportPermissionsPage-DGAPqJbl.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js.map → SupportPermissionsPage-DGAPqJbl.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js → SupportPermissionsPage-Dg_wLOme.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js.map → SupportPermissionsPage-Dg_wLOme.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-BDguJ401.js → TemplatesPage-DT9fhlAU.js} +2 -2
- package/dist/chunks/{TemplatesPage-BDguJ401.js.map → TemplatesPage-DT9fhlAU.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-DdnGgioU.js → TemplatesPage-DiEk538p.js} +2 -2
- package/dist/chunks/{TemplatesPage-DdnGgioU.js.map → TemplatesPage-DiEk538p.js.map} +1 -1
- package/dist/chunks/{TenantCard-ffwWsgFQ.js → TenantCard-BbSYk9_Z.js} +2 -2
- package/dist/chunks/{TenantCard-ffwWsgFQ.js.map → TenantCard-BbSYk9_Z.js.map} +1 -1
- package/dist/chunks/{TenantCard-CUjb6og9.js → TenantCard-CEkiKxcZ.js} +2 -2
- package/dist/chunks/{TenantCard-CUjb6og9.js.map → TenantCard-CEkiKxcZ.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js → TenantScopeSelector-BWfYxvEa.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js.map → TenantScopeSelector-BWfYxvEa.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js → TenantScopeSelector-D-BKgQPV.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js.map → TenantScopeSelector-D-BKgQPV.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-GOh9GX7E.js → TicketDetailPage-C1mNS9Up.js} +2 -2
- package/dist/chunks/{TicketDetailPage-GOh9GX7E.js.map → TicketDetailPage-C1mNS9Up.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-Du8WMyqf.js → TicketDetailPage-ieVDRh42.js} +2 -2
- package/dist/chunks/{TicketDetailPage-Du8WMyqf.js.map → TicketDetailPage-ieVDRh42.js.map} +1 -1
- package/dist/chunks/{TicketsPage-Bqd6moQy.js → TicketsPage-CnuWsnIW.js} +2 -2
- package/dist/chunks/{TicketsPage-Bqd6moQy.js.map → TicketsPage-CnuWsnIW.js.map} +1 -1
- package/dist/chunks/{TicketsPage-WdU4Bb7M.js → TicketsPage-jjyY15_D.js} +2 -2
- package/dist/chunks/{TicketsPage-WdU4Bb7M.js.map → TicketsPage-jjyY15_D.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js → UserCreateTicketPage-B8Tvf-ag.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js.map → UserCreateTicketPage-B8Tvf-ag.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js → UserCreateTicketPage-DnOsDlfO.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js.map → UserCreateTicketPage-DnOsDlfO.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-BP5WeXPS.js → UserDashboardPage-BrtkJ-NB.js} +2 -2
- package/dist/chunks/{UserDashboardPage-BP5WeXPS.js.map → UserDashboardPage-BrtkJ-NB.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-B53C8fUq.js → UserDashboardPage-KLB5CQP5.js} +2 -2
- package/dist/chunks/{UserDashboardPage-B53C8fUq.js.map → UserDashboardPage-KLB5CQP5.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-B110bmGX.js → UserDetailPage-U7smBQoF.js} +5 -5
- package/dist/chunks/{UserDetailPage-B110bmGX.js.map → UserDetailPage-U7smBQoF.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-CV2VCE46.js → UserDetailPage-_J6lcKAU.js} +2 -2
- package/dist/chunks/{UserDetailPage-CV2VCE46.js.map → UserDetailPage-_J6lcKAU.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js → UserTicketDetailPage-CWoYQgH-.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js.map → UserTicketDetailPage-CWoYQgH-.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js → UserTicketDetailPage-DkufSlvZ.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js.map → UserTicketDetailPage-DkufSlvZ.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js → UsersGroupsPage-C38s2-Rq.js} +3 -3
- package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js.map → UsersGroupsPage-C38s2-Rq.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js → UsersGroupsPage-Dq3rAteo.js} +2 -2
- package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js.map → UsersGroupsPage-Dq3rAteo.js.map} +1 -1
- package/dist/chunks/{UsersPage-Bg7033pp.js → UsersPage-B5C5KEUR.js} +2 -2
- package/dist/chunks/{UsersPage-Bg7033pp.js.map → UsersPage-B5C5KEUR.js.map} +1 -1
- package/dist/chunks/{UsersPage-TYAfwPY1.js → UsersPage-CXC9Hvq6.js} +2 -2
- package/dist/chunks/{UsersPage-TYAfwPY1.js.map → UsersPage-CXC9Hvq6.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-DZeDvzwv.js → accessRequestsApi-B-4TJ5_U.js} +2 -2
- package/dist/chunks/{accessRequestsApi-DZeDvzwv.js.map → accessRequestsApi-B-4TJ5_U.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-ZXFPCid2.js → accessRequestsApi-DZSfThpd.js} +2 -2
- package/dist/chunks/{accessRequestsApi-ZXFPCid2.js.map → accessRequestsApi-DZSfThpd.js.map} +1 -1
- package/dist/chunks/{aiApi-CsH8DXgs.js → aiApi-B20Teu2v.js} +2 -2
- package/dist/chunks/{aiApi-CsH8DXgs.js.map → aiApi-B20Teu2v.js.map} +1 -1
- package/dist/chunks/{aiApi-CVPzFTXa.js → aiApi-DMGz-RPM.js} +2 -2
- package/dist/chunks/{aiApi-CVPzFTXa.js.map → aiApi-DMGz-RPM.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js → applicationAnalyticsApi-Bwa75Fzd.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js.map → applicationAnalyticsApi-Bwa75Fzd.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js → applicationAnalyticsApi-CLBqRPfN.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js.map → applicationAnalyticsApi-CLBqRPfN.js.map} +1 -1
- package/dist/chunks/{groupsApi-BgCk2fsp.js → groupsApi-QzXI-5xu.js} +2 -2
- package/dist/chunks/{groupsApi-BgCk2fsp.js.map → groupsApi-QzXI-5xu.js.map} +1 -1
- package/dist/chunks/{groupsApi-BIbG665N.js → groupsApi-hB9kSWEd.js} +2 -2
- package/dist/chunks/{groupsApi-BIbG665N.js.map → groupsApi-hB9kSWEd.js.map} +1 -1
- package/dist/chunks/{index-Cb3LotuT.js → index--NGcBYUu.js} +3 -3
- package/dist/chunks/{index-Cb3LotuT.js.map → index--NGcBYUu.js.map} +1 -1
- package/dist/chunks/{index-C33zcyF4.js → index--aPwOFjF.js} +2 -2
- package/dist/chunks/{index-C33zcyF4.js.map → index--aPwOFjF.js.map} +1 -1
- package/dist/chunks/{index-sMr9qND_.js → index-0VrOtwP0.js} +2 -2
- package/dist/chunks/{index-sMr9qND_.js.map → index-0VrOtwP0.js.map} +1 -1
- package/dist/chunks/{index-DDKetfKq.js → index-37U271aw.js} +2 -2
- package/dist/chunks/{index-DDKetfKq.js.map → index-37U271aw.js.map} +1 -1
- package/dist/chunks/{index-B9fS7ir6.js → index-B7qZTuQ-.js} +2 -2
- package/dist/chunks/{index-B9fS7ir6.js.map → index-B7qZTuQ-.js.map} +1 -1
- package/dist/chunks/{index-CdjBY7L8.js → index-Bedzmqr-.js} +2 -2
- package/dist/chunks/{index-CdjBY7L8.js.map → index-Bedzmqr-.js.map} +1 -1
- package/dist/chunks/{index-CHG_O1fS.js → index-Betxo5g5.js} +2 -2
- package/dist/chunks/{index-CHG_O1fS.js.map → index-Betxo5g5.js.map} +1 -1
- package/dist/chunks/{index-jiGu-H8x.js → index-BmaJz475.js} +2 -2
- package/dist/chunks/{index-jiGu-H8x.js.map → index-BmaJz475.js.map} +1 -1
- package/dist/chunks/{index-C53JoVNk.js → index-Buhqag3v.js} +2 -2
- package/dist/chunks/{index-C53JoVNk.js.map → index-Buhqag3v.js.map} +1 -1
- package/dist/chunks/{index-DO0Rw7hX.js → index-C3VxlfKq.js} +2 -2
- package/dist/chunks/{index-DO0Rw7hX.js.map → index-C3VxlfKq.js.map} +1 -1
- package/dist/chunks/{index-CSQ60fpG.js → index-CgpRo8Oe.js} +2 -2
- package/dist/chunks/{index-CSQ60fpG.js.map → index-CgpRo8Oe.js.map} +1 -1
- package/dist/chunks/{index-B-e-ELsf.js → index-DOY0w8Iu.js} +8 -8
- package/dist/chunks/{index-B-e-ELsf.js.map → index-DOY0w8Iu.js.map} +1 -1
- package/dist/chunks/{index-D2REDIRX.js → index-DwuvIOrQ.js} +2 -2
- package/dist/chunks/{index-D2REDIRX.js.map → index-DwuvIOrQ.js.map} +1 -1
- package/dist/chunks/{index-DCcl7Qof.js → index-DzedSLdI.js} +2 -2
- package/dist/chunks/{index-DCcl7Qof.js.map → index-DzedSLdI.js.map} +1 -1
- package/dist/chunks/{index-2wUhd9Lu.js → index-IgLVXPg8.js} +10 -10
- package/dist/chunks/index-IgLVXPg8.js.map +1 -0
- package/dist/chunks/{index-CwSaRXXg.js → index-lpIzhufD.js} +1916 -1900
- package/dist/chunks/index-lpIzhufD.js.map +1 -0
- package/dist/chunks/{index-Cuwn2q-f.js → index-mLUKwbGl.js} +4 -4
- package/dist/chunks/{index-Cuwn2q-f.js.map → index-mLUKwbGl.js.map} +1 -1
- package/dist/chunks/{index-B0mk2tNY.js → index-tO6MMIFB.js} +2 -2
- package/dist/chunks/{index-B0mk2tNY.js.map → index-tO6MMIFB.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-BpNANQ5s.js → tenantIconMap-BQD9byc8.js} +2 -2
- package/dist/chunks/{tenantIconMap-BpNANQ5s.js.map → tenantIconMap-BQD9byc8.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-DtdUgvJO.js → tenantIconMap-CTMuSt18.js} +2 -2
- package/dist/chunks/{tenantIconMap-DtdUgvJO.js.map → tenantIconMap-CTMuSt18.js.map} +1 -1
- package/dist/chunks/{ticketingApi-Bu4rKwLl.js → ticketingApi-BNIdox5t.js} +2 -2
- package/dist/chunks/{ticketingApi-Bu4rKwLl.js.map → ticketingApi-BNIdox5t.js.map} +1 -1
- package/dist/chunks/{ticketingApi-r4Avm9iS.js → ticketingApi-J0vC_t7r.js} +2 -2
- package/dist/chunks/{ticketingApi-r4Avm9iS.js.map → ticketingApi-J0vC_t7r.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-B9bF4swg.js → useAccessRequests-DCNNLnxk.js} +3 -3
- package/dist/chunks/{useAccessRequests-B9bF4swg.js.map → useAccessRequests-DCNNLnxk.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-JyPUX3Om.js → useAccessRequests-DT7X4FAK.js} +2 -2
- package/dist/chunks/{useAccessRequests-JyPUX3Om.js.map → useAccessRequests-DT7X4FAK.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-DjPQenC2.js → useUserAccessRequests-BYbmG4c7.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-DjPQenC2.js.map → useUserAccessRequests-BYbmG4c7.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-BB6FHW14.js → useUserAccessRequests-CylKxRN6.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-BB6FHW14.js.map → useUserAccessRequests-CylKxRN6.js.map} +1 -1
- package/dist/hooks/useCollapsibleState.d.ts +5 -2
- package/dist/hooks/useCollapsibleState.d.ts.map +1 -1
- package/dist/i18n/config.d.ts +1 -0
- package/dist/i18n/config.d.ts.map +1 -1
- package/dist/main.d.ts +0 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/smartstack.cjs +1 -1
- package/dist/smartstack.js +1 -1
- package/dist/utils/permissions.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/index-2wUhd9Lu.js.map +0 -1
- package/dist/chunks/index-CwSaRXXg.js.map +0 -1
package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js.map → ApiCatalogDetailPage-MPT3Kz6H.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiCatalogDetailPage-BQ53xuwD.js","sources":["../../src/pages/platform/api/apis/ApiCatalogDetailPage.tsx"],"sourcesContent":["import { useEffect, useState, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useParams, useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n ArrowLeft, BookOpen, Shield, Zap, Database, Code2, Copy, Check,\r\n Clock, Layers, AlertTriangle, Loader2, Brain, FileCode2\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { adminApi } from '@/services/api/adminApi';\r\nimport { aiApi } from '@/services/api/aiApi';\r\nimport type { DataApiEndpointDto } from '@/services/api/adminApi';\r\nimport type { AiSkillDetailDto } from '@/services/api/aiApi';\r\n\r\n// Response schema definitions per entity type\r\nconst responseSchemas: Record<string, { fields: { name: string; type: string; description: string; nullable?: boolean }[]; paginated: boolean }> = {\r\n User: {\r\n paginated: true,\r\n fields: [\r\n { name: 'id', type: 'Guid', description: 'Unique user identifier' },\r\n { name: 'email', type: 'string', description: 'User email address' },\r\n { name: 'firstName', type: 'string', description: 'First name', nullable: true },\r\n { name: 'lastName', type: 'string', description: 'Last name', nullable: true },\r\n { name: 'displayName', type: 'string', description: 'Display name', nullable: true },\r\n { name: 'isActive', type: 'boolean', description: 'Account active status' },\r\n { name: 'createdAt', type: 'DateTime', description: 'Creation date (UTC)' },\r\n { name: 'updatedAt', type: 'DateTime', description: 'Last update date (UTC)', nullable: true },\r\n { name: 'roles', type: 'string[]', description: 'Assigned role names' },\r\n { name: 'tenantIds', type: 'Guid[]', description: 'Associated tenant identifiers' },\r\n ],\r\n },\r\n Tenant: {\r\n paginated: true,\r\n fields: [\r\n { name: 'id', type: 'Guid', description: 'Unique tenant identifier' },\r\n { name: 'name', type: 'string', description: 'Tenant name' },\r\n { name: 'slug', type: 'string', description: 'URL-friendly slug' },\r\n { name: 'type', type: 'string', description: 'Tenant type (B2C/B2B)' },\r\n { name: 'status', type: 'string', description: 'Current status' },\r\n { name: 'description', type: 'string', description: 'Tenant description', nullable: true },\r\n { name: 'createdAt', type: 'DateTime', description: 'Creation date (UTC)' },\r\n { name: 'updatedAt', type: 'DateTime', description: 'Last update date (UTC)', nullable: true },\r\n { name: 'memberCount', type: 'int', description: 'Number of active members' },\r\n ],\r\n },\r\n Role: {\r\n paginated: true,\r\n fields: [\r\n { name: 'id', type: 'Guid', description: 'Unique role identifier' },\r\n { name: 'name', type: 'string', description: 'Role display name' },\r\n { name: 'shortName', type: 'string', description: 'Short name', nullable: true },\r\n { name: 'code', type: 'string', description: 'Unique role code', nullable: true },\r\n { name: 'category', type: 'string', description: 'Role category' },\r\n { name: 'description', type: 'string', description: 'Role description', nullable: true },\r\n { name: 'isSystem', type: 'boolean', description: 'System-managed role flag' },\r\n { name: 'createdAt', type: 'DateTime', description: 'Creation date (UTC)' },\r\n { name: 'updatedAt', type: 'DateTime', description: 'Last update date (UTC)', nullable: true },\r\n { name: 'permissions', type: 'string[]', description: 'Assigned permission codes' },\r\n ],\r\n },\r\n Ticket: {\r\n paginated: true,\r\n fields: [\r\n { name: 'id', type: 'Guid', description: 'Unique ticket identifier' },\r\n { name: 'title', type: 'string', description: 'Ticket title' },\r\n { name: 'type', type: 'string', description: 'Ticket type (Incident/Request/Task)' },\r\n { name: 'status', type: 'string', description: 'Current status' },\r\n { name: 'priority', type: 'string', description: 'Priority level' },\r\n { name: 'assignedToUserId', type: 'Guid', description: 'Assigned user', nullable: true },\r\n { name: 'createdByUserId', type: 'Guid', description: 'Creator user' },\r\n { name: 'tenantId', type: 'Guid', description: 'Owning tenant', nullable: true },\r\n { name: 'createdAt', type: 'DateTime', description: 'Creation date (UTC)' },\r\n { name: 'updatedAt', type: 'DateTime', description: 'Last update date (UTC)', nullable: true },\r\n { name: 'resolvedAt', type: 'DateTime', description: 'Resolution date', nullable: true },\r\n { name: 'closedAt', type: 'DateTime', description: 'Closing date', nullable: true },\r\n ],\r\n },\r\n NavigationApplication: {\r\n paginated: false,\r\n fields: [\r\n { name: 'id', type: 'Guid', description: 'Application identifier' },\r\n { name: 'code', type: 'string', description: 'Application code' },\r\n { name: 'label', type: 'string', description: 'Display label' },\r\n { name: 'modules', type: 'Module[]', description: 'Child modules' },\r\n { name: 'modules[].id', type: 'Guid', description: 'Module identifier' },\r\n { name: 'modules[].code', type: 'string', description: 'Module code' },\r\n { name: 'modules[].label', type: 'string', description: 'Module display label' },\r\n ],\r\n },\r\n};\r\n\r\n// Query parameters metadata per endpoint code (matches ExternalAppPromptTab)\r\nconst endpointQueryParams: Record<string, { name: string; type: string; default: string; description: string }[]> = {\r\n users: [\r\n { name: 'tenantId', type: 'UUID', default: '(requis)', description: 'ID du tenant - scope aux utilisateurs de ce tenant' },\r\n { name: 'page', type: 'int', default: '1', description: 'Numero de page (commence a 1)' },\r\n { name: 'pageSize', type: 'int', default: '100', description: 'Elements par page (max 1000)' },\r\n { name: 'modifiedSince', type: 'DateTime?', default: 'null', description: 'Filtre incremental UTC' },\r\n { name: 'isActive', type: 'bool?', default: 'null', description: 'Filtre par statut actif/inactif' },\r\n ],\r\n tenants: [\r\n { name: 'tenantId', type: 'UUID', default: '(requis)', description: 'ID du tenant a exporter' },\r\n { name: 'page', type: 'int', default: '1', description: 'Numero de page (commence a 1)' },\r\n { name: 'pageSize', type: 'int', default: '100', description: 'Elements par page (max 1000)' },\r\n { name: 'modifiedSince', type: 'DateTime?', default: 'null', description: 'Filtre incremental UTC' },\r\n ],\r\n roles: [\r\n { name: 'tenantId', type: 'UUID', default: '(requis)', description: 'ID du tenant - exporte les roles de ce tenant' },\r\n { name: 'page', type: 'int', default: '1', description: 'Numero de page (commence a 1)' },\r\n { name: 'pageSize', type: 'int', default: '100', description: 'Elements par page (max 1000)' },\r\n { name: 'modifiedSince', type: 'DateTime?', default: 'null', description: 'Filtre incremental UTC' },\r\n ],\r\n tickets: [\r\n { name: 'tenantId', type: 'UUID', default: '(requis)', description: 'ID du tenant - exporte les tickets de ce tenant' },\r\n { name: 'page', type: 'int', default: '1', description: 'Numero de page (commence a 1)' },\r\n { name: 'pageSize', type: 'int', default: '100', description: 'Elements par page (max 500)' },\r\n { name: 'modifiedSince', type: 'DateTime?', default: 'null', description: 'Filtre incremental UTC' },\r\n ],\r\n navigation: [],\r\n};\r\n\r\nfunction getJsonExampleValue(type: string): string {\r\n switch (type) {\r\n case 'Guid': return '\"3fa85f64-5717-4562-b3fc-2c963f66afa6\"';\r\n case 'string': return '\"...\"';\r\n case 'boolean': return 'true';\r\n case 'int': return '0';\r\n case 'DateTime': return '\"2026-01-15T10:30:00Z\"';\r\n case 'string[]': return '[\"item1\", \"item2\"]';\r\n case 'Guid[]': return '[\"uuid1\", \"uuid2\"]';\r\n default: return '\"...\"';\r\n }\r\n}\r\n\r\nfunction addAuthSection(lines: string[]): void {\r\n lines.push('## 1. Authentification (HMAC-JWT Assertion)');\r\n lines.push('');\r\n lines.push('### Etape 1 : Creer une assertion JWT signee HMAC-SHA256');\r\n lines.push('');\r\n lines.push('```');\r\n lines.push('Header: { \"alg\": \"HS256\", \"typ\": \"JWT\" }');\r\n lines.push('Payload: {');\r\n lines.push(' \"sub\": \"<YOUR_CLIENT_ID>\", // ton clientId');\r\n lines.push(' \"iat\": <timestamp-unix-actuel>, // timestamp Unix actuel');\r\n lines.push(' \"exp\": <timestamp-unix + 300>, // expiration (max 5 min apres iat)');\r\n lines.push(' \"jti\": \"<uuid-unique>\" // nonce anti-replay');\r\n lines.push('}');\r\n lines.push('Signature: HMAC-SHA256(header.payload, Base64Decode(clientSecret))');\r\n lines.push('```');\r\n lines.push('');\r\n lines.push('**Important** : Le `clientSecret` est encode en Base64. Tu dois le **decoder** avant de l\\'utiliser comme cle HMAC.');\r\n lines.push('');\r\n lines.push('### Etape 2 : Echanger l\\'assertion contre un access token');\r\n lines.push('');\r\n lines.push('```http');\r\n lines.push('POST {baseUrl}/api/auth/external-app/token');\r\n lines.push('Content-Type: application/json');\r\n lines.push('');\r\n lines.push('{ \"assertion\": \"<jwt-assertion-de-etape-1>\" }');\r\n lines.push('```');\r\n lines.push('');\r\n lines.push('**Reponse succes (200)** :');\r\n lines.push('```json');\r\n lines.push('{');\r\n lines.push(' \"accessToken\": \"eyJhbGciOiJIUz...\",');\r\n lines.push(' \"expiresAt\": \"2026-02-25T11:00:00Z\",');\r\n lines.push(' \"permissions\": [\"administration.users.read\", ...]');\r\n lines.push('}');\r\n lines.push('```');\r\n lines.push('');\r\n lines.push('Cache le token et renouvelle-le 5 min avant `expiresAt`.');\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n}\r\n\r\nfunction addTenantScopingSection(lines: string[], code: string): void {\r\n if (code !== 'navigation') {\r\n lines.push('## 2. Isolation par tenant (OBLIGATOIRE)');\r\n lines.push('');\r\n lines.push('Le parametre `tenantId` (UUID) est **obligatoire** en query string. Il scope l\\'export aux donnees du tenant specifie. Sans ce parametre, l\\'API retourne une erreur 400.');\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n }\r\n}\r\n\r\nfunction addEndpointSection(lines: string[], endpoint: DataApiEndpointDto): void {\r\n lines.push(`## 3. Endpoint : ${endpoint.name}`);\r\n lines.push('');\r\n lines.push('```http');\r\n lines.push(`GET {baseUrl}${endpoint.routeTemplate}`);\r\n lines.push('Authorization: Bearer <accessToken>');\r\n lines.push('```');\r\n lines.push('');\r\n}\r\n\r\nfunction addParamsSection(lines: string[], params: typeof endpointQueryParams[string]): void {\r\n if (params.length > 0) {\r\n lines.push('**Parametres (query string)** :');\r\n lines.push('');\r\n lines.push('| Parametre | Type | Defaut | Description |');\r\n lines.push('|-----------|------|--------|-------------|');\r\n for (const p of params) {\r\n lines.push(`| \\`${p.name}\\` | ${p.type} | ${p.default} | ${p.description} |`);\r\n }\r\n lines.push('');\r\n } else {\r\n lines.push('**Aucun parametre** - appel direct sans query string.');\r\n lines.push('');\r\n }\r\n}\r\n\r\nconst buildFieldLines = (schema: typeof responseSchemas[string], isNested: boolean): string[] => {\r\n const lines: string[] = [];\r\n const indent = isNested ? ' ' : ' ';\r\n for (let i = 0; i < schema.fields.length; i++) {\r\n const f = schema.fields[i];\r\n if (f.name.includes('[].')) continue;\r\n const comma = i < schema.fields.length - 1 ? ',' : '';\r\n lines.push(`${indent}\"${f.name}\": ${getJsonExampleValue(f.type)}${comma} // ${f.type}${f.nullable ? '?' : ''} - ${f.description}`);\r\n }\r\n return lines;\r\n};\r\n\r\nconst buildPaginatedResponseExample = (schema: typeof responseSchemas[string]): string[] => {\r\n const lines: string[] = [];\r\n lines.push('**Reponse (paginee)** :');\r\n lines.push('```json');\r\n lines.push('{');\r\n lines.push(' \"items\": [');\r\n lines.push(' {');\r\n lines.push(...buildFieldLines(schema, true));\r\n lines.push(' }');\r\n lines.push(' ],');\r\n lines.push(' \"page\": 1,');\r\n lines.push(' \"pageSize\": 100,');\r\n lines.push(' \"totalCount\": 250,');\r\n lines.push(' \"totalPages\": 3,');\r\n lines.push(' \"hasMore\": true');\r\n lines.push('}');\r\n lines.push('```');\r\n return lines;\r\n};\r\n\r\nconst buildArrayResponseExample = (schema: typeof responseSchemas[string]): string[] => {\r\n const lines: string[] = [];\r\n lines.push('**Reponse (tableau direct, NON pagine)** :');\r\n lines.push('```json');\r\n lines.push('[');\r\n lines.push(' {');\r\n lines.push(...buildFieldLines(schema, false));\r\n lines.push(' }');\r\n lines.push(']');\r\n lines.push('```');\r\n return lines;\r\n};\r\n\r\nfunction buildResponseExample(schema: typeof responseSchemas[string], isPaginated: boolean): string[] {\r\n return isPaginated\r\n ? buildPaginatedResponseExample(schema)\r\n : buildArrayResponseExample(schema);\r\n}\r\n\r\nfunction addResponseSection(lines: string[], schema: typeof responseSchemas[string] | undefined): void {\r\n if (schema) {\r\n const responseLines = buildResponseExample(schema, schema.paginated);\r\n lines.push(...responseLines);\r\n lines.push('');\r\n }\r\n}\r\n\r\nfunction addRateLimitSection(lines: string[], endpoint: DataApiEndpointDto): void {\r\n lines.push(`**Rate limit** : ${endpoint.defaultRateLimitPerMinute} requetes/minute | Page size max : ${endpoint.defaultMaxPageSize}`);\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n}\r\n\r\nfunction addPaginationSection(lines: string[], schema: typeof responseSchemas[string] | undefined): void {\r\n if (schema?.paginated) {\r\n lines.push('## 4. Pagination');\r\n lines.push('');\r\n lines.push('Boucle tant que `hasMore === true`, en incrementant `page`. Les resultats sont tries par `createdAt ASC`.');\r\n lines.push('');\r\n lines.push('## 5. Synchronisation incrementale');\r\n lines.push('');\r\n lines.push('Utilise `modifiedSince` pour ne recuperer que les changements :');\r\n lines.push('1. Premiere synchro : appelle sans `modifiedSince` (recupere tout)');\r\n lines.push('2. Stocke `DateTime.UtcNow` du debut de la synchro');\r\n lines.push('3. Synchros suivantes : passe `modifiedSince=<timestamp-stocke>`');\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n }\r\n}\r\n\r\nfunction addRateLimitingDetailSection(lines: string[]): void {\r\n lines.push('## 6. Rate Limiting');\r\n lines.push('');\r\n lines.push('Quand tu depasses la limite :');\r\n lines.push('```');\r\n lines.push('HTTP/1.1 429 Too Many Requests');\r\n lines.push('Retry-After: 42');\r\n lines.push('```');\r\n lines.push('Lis le header `Retry-After` et attends. Implemente un backoff exponentiel.');\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n}\r\n\r\nfunction addErrorHandlingSection(lines: string[]): void {\r\n lines.push('## 7. Gestion des erreurs');\r\n lines.push('');\r\n lines.push('| HTTP | Action |');\r\n lines.push('|------|--------|');\r\n lines.push('| 200 | Traite les donnees |');\r\n lines.push('| 400 | tenantId manquant ou invalide |');\r\n lines.push('| 401 | Renouvelle le token et relance |');\r\n lines.push('| 403 | Acces export non accorde - contacte l\\'admin |');\r\n lines.push('| 404 | Tenant non trouve - verifie le tenantId |');\r\n lines.push('| 429 | Attends `Retry-After` secondes |');\r\n lines.push('| 500 | Retry avec backoff exponentiel |');\r\n}\r\n\r\nfunction generateEndpointPrompt(endpoint: DataApiEndpointDto): string {\r\n const schema = responseSchemas[endpoint.entityType];\r\n const params = endpointQueryParams[endpoint.code] || [];\r\n const lines: string[] = [];\r\n\r\n lines.push('## Contexte');\r\n lines.push('');\r\n lines.push(`Tu dois implementer un client HTTP qui consomme l'endpoint **${endpoint.name}** de l'API DataExport de SmartStack en mode machine-to-machine (M2M). L'application s'authentifie avec un \\`clientId\\` et un \\`clientSecret\\`, obtient un token JWT, puis appelle l'endpoint d'export.`);\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n\r\n addAuthSection(lines);\r\n addTenantScopingSection(lines, endpoint.code);\r\n addEndpointSection(lines, endpoint);\r\n addParamsSection(lines, params);\r\n addResponseSection(lines, schema);\r\n addRateLimitSection(lines, endpoint);\r\n addPaginationSection(lines, schema);\r\n addRateLimitingDetailSection(lines);\r\n addErrorHandlingSection(lines);\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction generateCurlExample(endpoint: DataApiEndpointDto): string {\r\n const baseUrl = 'https://your-api.smartstack.app';\r\n const route = endpoint.routeTemplate;\r\n const isPaginated = responseSchemas[endpoint.entityType]?.paginated;\r\n\r\n let curl = `curl -X GET \"${baseUrl}${route}`;\r\n if (isPaginated) {\r\n curl += '?page=1&pageSize=100';\r\n }\r\n curl += `\" \\\\\\n -H \"Authorization: Bearer <API_KEY>\" \\\\\\n -H \"Accept: application/json\"`;\r\n return curl;\r\n}\r\n\r\nconst buildExampleFieldValue = (field: { name: string; type: string; nullable?: boolean }): unknown => {\r\n if (field.name === 'modules') return [{ id: '...', code: 'users', label: 'Users' }];\r\n\r\n switch (field.type) {\r\n case 'Guid': return '3fa85f64-5717-4562-b3fc-2c963f66afa6';\r\n case 'string': return field.nullable ? null : `example-${field.name}`;\r\n case 'boolean': return true;\r\n case 'int': return 42;\r\n case 'DateTime': return field.nullable ? null : '2026-02-25T10:00:00Z';\r\n case 'string[]': return ['value1', 'value2'];\r\n case 'Guid[]': return ['3fa85f64-5717-4562-b3fc-2c963f66afa6'];\r\n default: return '...';\r\n }\r\n};\r\n\r\nconst buildExampleItem = (schema: typeof responseSchemas[string]): Record<string, unknown> => {\r\n const exampleItem: Record<string, unknown> = {};\r\n for (const field of schema.fields) {\r\n if (field.name.includes('[].')) continue;\r\n exampleItem[field.name] = buildExampleFieldValue(field);\r\n }\r\n return exampleItem;\r\n};\r\n\r\nfunction generateJsonExample(endpoint: DataApiEndpointDto): string {\r\n const schema = responseSchemas[endpoint.entityType];\r\n if (!schema) return '// Schema not available';\r\n\r\n const exampleItem = buildExampleItem(schema);\r\n const responseBody = schema.paginated\r\n ? { items: [exampleItem], page: 1, pageSize: 100, totalCount: 1, totalPages: 1, hasMore: false }\r\n : [exampleItem];\r\n\r\n return JSON.stringify(responseBody, null, 2);\r\n}\r\n\r\nfunction CopyButton({ text }: { text: string }) {\r\n const [copied, setCopied] = useState(false);\r\n const handleCopy = async () => {\r\n await navigator.clipboard.writeText(text);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n };\r\n return (\r\n <button\r\n onClick={handleCopy}\r\n className=\"absolute top-2 right-2 p-1.5 rounded-md bg-[var(--bg-secondary)] hover:bg-[var(--bg-hover)] text-[var(--text-tertiary)] transition-colors\"\r\n title=\"Copy\"\r\n >\r\n {copied ? <Check className=\"h-4 w-4 text-[var(--success-text)]\" /> : <Copy className=\"h-4 w-4\" />}\r\n </button>\r\n );\r\n}\r\n\r\nfunction PromptBlocksContent({ prompt }: { prompt: AiSkillDetailDto }) {\r\n return (\r\n <div className=\"space-y-3\">\r\n {prompt.blocks\r\n .filter(b => b.isEnabled !== false)\r\n .sort((a, b) => a.displayOrder - b.displayOrder)\r\n .map((block) => (\r\n <div key={block.id} className=\"rounded-lg border border-[var(--border-color)] overflow-hidden\">\r\n <div className=\"flex items-center gap-2 px-4 py-2 bg-[var(--bg-secondary)] border-b border-[var(--border-color)]\">\r\n <span className=\"inline-flex items-center rounded-full bg-[var(--info-bg)] px-2 py-0.5 text-xs font-medium text-[var(--info-text)]\">\r\n {block.blockType}\r\n </span>\r\n {block.label && (\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{block.label}</span>\r\n )}\r\n </div>\r\n <div className=\"relative p-4\">\r\n <CopyButton text={block.content} />\r\n <pre className=\"text-sm font-mono text-[var(--text-secondary)] whitespace-pre-wrap pr-10\">\r\n {block.content}\r\n </pre>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction PromptVariablesContent({ variables, t }: { variables: string[]; t: any }) {\r\n return (\r\n <div>\r\n <h4 className=\"text-sm font-medium text-[var(--text-tertiary)] mb-2\">{t('externalApps.apis.catalog.detail.variables')}</h4>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {variables.map(v => (\r\n <code key={v} className=\"rounded bg-[var(--bg-secondary)] px-2 py-1 text-xs font-mono text-[var(--color-primary-600)]\">\r\n {`{${v}}`}\r\n </code>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction LoadedPromptContent({ t, prompt }: { t: any; prompt: AiSkillDetailDto }) {\r\n return (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-medium text-[var(--text-primary)]\">{prompt.name}</h3>\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">\r\n v{prompt.version} · {prompt.status}\r\n {prompt.description && <> · {prompt.description}</>}\r\n </p>\r\n </div>\r\n <a\r\n href={`/administration/ai/skills/${prompt.id}`}\r\n className=\"text-sm text-[var(--color-primary-600)] hover:underline\"\r\n >\r\n {t('externalApps.apis.catalog.detail.viewPrompt')}\r\n </a>\r\n </div>\r\n {(prompt.blocks?.length ?? 0) > 0 && (\r\n <PromptBlocksContent prompt={prompt} />\r\n )}\r\n {(prompt.variables?.length ?? 0) > 0 && (\r\n <PromptVariablesContent variables={prompt.variables} t={t} />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction GeneratedPromptContent({ t, endpoint, generatedPrompt }: { t: any; endpoint: DataApiEndpointDto; generatedPrompt: string }) {\r\n return (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-medium text-[var(--text-primary)]\">\r\n {t('externalApps.apis.catalog.detail.generatedPromptTitle')}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">\r\n {t('externalApps.apis.catalog.detail.generatedPromptHint', { code: `data-export-${endpoint.code}` })}\r\n </p>\r\n </div>\r\n <CopyButton text={generatedPrompt} />\r\n </div>\r\n <pre className=\"rounded-lg bg-[var(--bg-secondary)] p-4 text-sm font-mono text-[var(--text-primary)] whitespace-pre-wrap overflow-x-auto max-h-[600px] overflow-y-auto leading-relaxed\">\r\n {generatedPrompt}\r\n </pre>\r\n </div>\r\n );\r\n}\r\n\r\nasync function tryLoadPrompt(endpointCode: string): Promise<AiSkillDetailDto | null> {\r\n const codesToTry = [\r\n `data-export-${endpointCode}`,\r\n `export-${endpointCode}`,\r\n endpointCode,\r\n ];\r\n\r\n for (const code of codesToTry) {\r\n try {\r\n const detail = await aiApi.skills.getByCode(code);\r\n if (detail) return detail;\r\n } catch {\r\n // Code not found (404), try next\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport function ApiCatalogDetailPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const { endpointCode } = useParams<{ endpointCode: string }>();\r\n const navigate = useNavigate();\r\n const [endpoint, setEndpoint] = useState<DataApiEndpointDto | null>(null);\r\n const [prompt, setPrompt] = useState<AiSkillDetailDto | null>(null);\r\n const [promptLoading, setPromptLoading] = useState(false);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n\r\n const fetchData = async () => {\r\n try {\r\n setLoading(true);\r\n const endpoints = await adminApi.externalApps.getApiEndpoints();\r\n if (cancelled) return;\r\n\r\n const found = endpoints.find(ep => ep.code === endpointCode);\r\n if (!found) {\r\n setError('Endpoint not found');\r\n return;\r\n }\r\n setEndpoint(found);\r\n\r\n setPromptLoading(true);\r\n try {\r\n const detail = await tryLoadPrompt(found.code);\r\n if (!cancelled && detail) {\r\n setPrompt(detail);\r\n }\r\n } catch {\r\n // Prompts are optional, ignore errors\r\n } finally {\r\n if (!cancelled) setPromptLoading(false);\r\n }\r\n } catch (err) {\r\n if (!cancelled) {\r\n setError(err instanceof Error ? err.message : 'Failed to load endpoint');\r\n }\r\n } finally {\r\n if (!cancelled) setLoading(false);\r\n }\r\n };\r\n fetchData();\r\n\r\n return () => { cancelled = true; };\r\n }, [endpointCode]);\r\n\r\n const schema = useMemo(() => endpoint ? responseSchemas[endpoint.entityType] : null, [endpoint]);\r\n const curlExample = useMemo(() => endpoint ? generateCurlExample(endpoint) : '', [endpoint]);\r\n const jsonExample = useMemo(() => endpoint ? generateJsonExample(endpoint) : '', [endpoint]);\r\n const generatedPrompt = useMemo(() => endpoint ? generateEndpointPrompt(endpoint) : '', [endpoint]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex h-96 items-center justify-center\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !endpoint) {\r\n return (\r\n <div className=\"space-y-4\">\r\n <button onClick={() => navigate(-1)} className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors\">\r\n <ArrowLeft className=\"h-4 w-4\" />\r\n {t('common:back')}\r\n </button>\r\n <div className=\"rounded-lg border border-[var(--error-border)] bg-[var(--error-bg)] p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <AlertTriangle className=\"h-5 w-5 text-[var(--error-text)]\" />\r\n <p className=\"text-[var(--error-text)]\">{error || 'Endpoint not found'}</p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('externalApps.navigation.api'), href: '/api' },\r\n { label: t('externalApps.apis.catalog.title'), href: '/api/apis/catalog' },\r\n { label: endpoint.name }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-start gap-4\">\r\n <button onClick={() => navigate(-1)} className=\"mt-1 p-2 rounded-md hover:bg-[var(--bg-hover)] text-[var(--text-secondary)] transition-colors\">\r\n <ArrowLeft className=\"h-5 w-5\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3\">\r\n <BookOpen className=\"h-7 w-7 text-[var(--color-accent-600)]\" />\r\n <h1 className=\"text-3xl font-bold text-[var(--text-primary)]\">{endpoint.name}</h1>\r\n <div className=\"inline-flex items-center gap-2 rounded-full px-2.5 py-0.5 text-xs font-medium\">\r\n {endpoint.isActive ? (\r\n <>\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--success-text)]\" />\r\n <span className=\"text-[var(--success-text)]\">{t('externalApps.apis.catalog.active')}</span>\r\n </>\r\n ) : (\r\n <>\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--warning-text)]\" />\r\n <span className=\"text-[var(--warning-text)]\">{t('externalApps.apis.catalog.inactive')}</span>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n {endpoint.description && (\r\n <p className=\"mt-2 text-[var(--text-secondary)]\">{endpoint.description}</p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Metadata cards */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n <div className=\"card p-4 border border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Layers className=\"h-4 w-4\" />\r\n <span className=\"text-xs font-medium uppercase\">{t('externalApps.apis.catalog.columns.application')}</span>\r\n </div>\r\n <span className=\"inline-flex items-center rounded-full bg-[var(--info-bg)] px-2.5 py-0.5 text-sm font-medium text-[var(--info-text)]\">\r\n {endpoint.applicationLabel}\r\n </span>\r\n </div>\r\n <div className=\"card p-4 border border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Database className=\"h-4 w-4\" />\r\n <span className=\"text-xs font-medium uppercase\">{t('externalApps.apis.catalog.columns.module')}</span>\r\n </div>\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{endpoint.moduleLabel}</span>\r\n </div>\r\n <div className=\"card p-4 border border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Zap className=\"h-4 w-4\" />\r\n <span className=\"text-xs font-medium uppercase\">{t('externalApps.apis.catalog.columns.rateLimit')}</span>\r\n </div>\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{endpoint.defaultRateLimitPerMinute}/min</span>\r\n </div>\r\n <div className=\"card p-4 border border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Clock className=\"h-4 w-4\" />\r\n <span className=\"text-xs font-medium uppercase\">{t('externalApps.apis.catalog.columns.maxPageSize')}</span>\r\n </div>\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{endpoint.defaultMaxPageSize}</span>\r\n </div>\r\n </div>\r\n\r\n {/* Technical details */}\r\n <div className=\"card border border-[var(--border-color)]\">\r\n <div className=\"px-6 py-4 border-b border-[var(--border-color)]\">\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">{t('externalApps.apis.catalog.detail.technical')}</h2>\r\n </div>\r\n <div className=\"p-6 grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n <div>\r\n <label className=\"text-xs font-medium uppercase text-[var(--text-tertiary)]\">{t('externalApps.apis.catalog.columns.route')}</label>\r\n <div className=\"mt-1 flex items-center gap-2\">\r\n <code className=\"rounded-md bg-[var(--bg-secondary)] px-3 py-1.5 text-sm font-mono text-[var(--color-primary-600)]\">\r\n GET {endpoint.routeTemplate}\r\n </code>\r\n </div>\r\n </div>\r\n <div>\r\n <label className=\"text-xs font-medium uppercase text-[var(--text-tertiary)]\">{t('externalApps.apis.catalog.columns.permission')}</label>\r\n <div className=\"mt-1 flex items-center gap-2\">\r\n <Shield className=\"h-4 w-4 text-[var(--warning-text)]\" />\r\n <code className=\"rounded-md bg-[var(--bg-secondary)] px-3 py-1.5 text-sm font-mono text-[var(--text-primary)]\">\r\n {endpoint.requiredPermission}\r\n </code>\r\n </div>\r\n </div>\r\n <div>\r\n <label className=\"text-xs font-medium uppercase text-[var(--text-tertiary)]\">{t('externalApps.apis.catalog.columns.entityType')}</label>\r\n <div className=\"mt-1 flex items-center gap-2\">\r\n <Database className=\"h-4 w-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{endpoint.entityType}</span>\r\n </div>\r\n </div>\r\n <div>\r\n <label className=\"text-xs font-medium uppercase text-[var(--text-tertiary)]\">{t('externalApps.apis.catalog.columns.code')}</label>\r\n <div className=\"mt-1\">\r\n <code className=\"rounded-md bg-[var(--bg-secondary)] px-3 py-1.5 text-sm font-mono text-[var(--text-primary)]\">\r\n {endpoint.code}\r\n </code>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* cURL Example */}\r\n <div className=\"card border border-[var(--border-color)]\">\r\n <div className=\"px-6 py-4 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2\">\r\n <Code2 className=\"h-5 w-5 text-[var(--text-tertiary)]\" />\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">{t('externalApps.apis.catalog.detail.curlExample')}</h2>\r\n </div>\r\n </div>\r\n <div className=\"p-6 relative\">\r\n <CopyButton text={curlExample} />\r\n <pre className=\"rounded-lg bg-[var(--bg-secondary)] p-4 text-sm font-mono text-[var(--text-primary)] overflow-x-auto whitespace-pre-wrap\">\r\n {curlExample}\r\n </pre>\r\n </div>\r\n </div>\r\n\r\n {/* Response Schema */}\r\n {schema && (\r\n <div className=\"card border border-[var(--border-color)]\">\r\n <div className=\"px-6 py-4 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-2\">\r\n <FileCode2 className=\"h-5 w-5 text-[var(--text-tertiary)]\" />\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">{t('externalApps.apis.catalog.detail.responseSchema')}</h2>\r\n </div>\r\n {schema.paginated && (\r\n <span className=\"inline-flex items-center rounded-full bg-[var(--info-bg)] px-2.5 py-0.5 text-xs font-medium text-[var(--info-text)]\">\r\n {t('externalApps.apis.catalog.detail.paginated')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left px-6 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('externalApps.apis.catalog.detail.field')}</th>\r\n <th className=\"text-left px-6 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('externalApps.apis.catalog.detail.type')}</th>\r\n <th className=\"text-left px-6 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('externalApps.apis.catalog.detail.nullable')}</th>\r\n <th className=\"text-left px-6 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('externalApps.apis.catalog.detail.fieldDescription')}</th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {schema.fields.map((field) => (\r\n <tr key={field.name} className=\"hover:bg-[var(--bg-hover)] transition-colors\">\r\n <td className=\"px-6 py-3\">\r\n <code className=\"text-sm font-mono text-[var(--color-primary-600)]\">{field.name}</code>\r\n </td>\r\n <td className=\"px-6 py-3\">\r\n <code className=\"rounded bg-[var(--bg-secondary)] px-2 py-0.5 text-xs font-mono text-[var(--text-secondary)]\">{field.type}</code>\r\n </td>\r\n <td className=\"px-6 py-3 text-sm text-[var(--text-secondary)]\">\r\n {field.nullable ? '?' : '-'}\r\n </td>\r\n <td className=\"px-6 py-3 text-sm text-[var(--text-secondary)]\">{field.description}</td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n {/* JSON Example */}\r\n <div className=\"border-t border-[var(--border-color)] p-6\">\r\n <h3 className=\"text-sm font-semibold text-[var(--text-tertiary)] uppercase mb-3\">{t('externalApps.apis.catalog.detail.jsonExample')}</h3>\r\n <div className=\"relative\">\r\n <CopyButton text={jsonExample} />\r\n <pre className=\"rounded-lg bg-[var(--bg-secondary)] p-4 text-sm font-mono text-[var(--text-primary)] overflow-x-auto max-h-96 overflow-y-auto\">\r\n {jsonExample}\r\n </pre>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* AI Prompt section */}\r\n <div className=\"card border border-[var(--border-color)]\">\r\n <div className=\"px-6 py-4 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2\">\r\n <Brain className=\"h-5 w-5 text-[var(--color-accent-600)]\" />\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">{t('externalApps.apis.catalog.detail.dedicatedPrompt')}</h2>\r\n </div>\r\n <p className=\"mt-1 text-sm text-[var(--text-tertiary)]\">{t('externalApps.apis.catalog.detail.promptDescription')}</p>\r\n </div>\r\n <div className=\"p-6\">\r\n {promptLoading && (\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)]\">\r\n <Loader2 className=\"h-4 w-4 animate-spin\" />\r\n <span className=\"text-sm\">{t('common:loading')}</span>\r\n </div>\r\n )}\r\n {!promptLoading && prompt && (\r\n <LoadedPromptContent t={t} prompt={prompt} />\r\n )}\r\n {!promptLoading && !prompt && (\r\n <GeneratedPromptContent t={t} endpoint={endpoint} generatedPrompt={generatedPrompt} />\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["responseSchemas","endpointQueryParams","getJsonExampleValue","type","addAuthSection","lines","addTenantScopingSection","code","addEndpointSection","endpoint","addParamsSection","params","p","buildFieldLines","schema","isNested","indent","i","f","comma","buildPaginatedResponseExample","buildArrayResponseExample","buildResponseExample","isPaginated","addResponseSection","responseLines","addRateLimitSection","addPaginationSection","addRateLimitingDetailSection","addErrorHandlingSection","generateEndpointPrompt","generateCurlExample","baseUrl","route","curl","buildExampleFieldValue","field","buildExampleItem","exampleItem","generateJsonExample","responseBody","CopyButton","text","copied","setCopied","useState","handleCopy","jsx","Check","Copy","PromptBlocksContent","prompt","b","block","jsxs","PromptVariablesContent","variables","t","v","LoadedPromptContent","Fragment","GeneratedPromptContent","generatedPrompt","tryLoadPrompt","endpointCode","codesToTry","detail","aiApi","ApiCatalogDetailPage","useTranslation","useParams","navigate","useNavigate","setEndpoint","setPrompt","promptLoading","setPromptLoading","loading","setLoading","error","setError","useEffect","cancelled","endpoints","adminApi","found","ep","err","useMemo","curlExample","jsonExample","Loader2","ArrowLeft","AlertTriangle","Breadcrumb","BookOpen","Layers","Database","Zap","Clock","Shield","Code2","FileCode2","Brain"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ApiCatalogDetailPage-MPT3Kz6H.js","sources":["../../src/pages/platform/api/apis/ApiCatalogDetailPage.tsx"],"sourcesContent":["import { useEffect, useState, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useParams, useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n ArrowLeft, BookOpen, Shield, Zap, Database, Code2, Copy, Check,\r\n Clock, Layers, AlertTriangle, Loader2, Brain, FileCode2\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { adminApi } from '@/services/api/adminApi';\r\nimport { aiApi } from '@/services/api/aiApi';\r\nimport type { DataApiEndpointDto } from '@/services/api/adminApi';\r\nimport type { AiSkillDetailDto } from '@/services/api/aiApi';\r\n\r\n// Response schema definitions per entity type\r\nconst responseSchemas: Record<string, { fields: { name: string; type: string; description: string; nullable?: boolean }[]; paginated: boolean }> = {\r\n User: {\r\n paginated: true,\r\n fields: [\r\n { name: 'id', type: 'Guid', description: 'Unique user identifier' },\r\n { name: 'email', type: 'string', description: 'User email address' },\r\n { name: 'firstName', type: 'string', description: 'First name', nullable: true },\r\n { name: 'lastName', type: 'string', description: 'Last name', nullable: true },\r\n { name: 'displayName', type: 'string', description: 'Display name', nullable: true },\r\n { name: 'isActive', type: 'boolean', description: 'Account active status' },\r\n { name: 'createdAt', type: 'DateTime', description: 'Creation date (UTC)' },\r\n { name: 'updatedAt', type: 'DateTime', description: 'Last update date (UTC)', nullable: true },\r\n { name: 'roles', type: 'string[]', description: 'Assigned role names' },\r\n { name: 'tenantIds', type: 'Guid[]', description: 'Associated tenant identifiers' },\r\n ],\r\n },\r\n Tenant: {\r\n paginated: true,\r\n fields: [\r\n { name: 'id', type: 'Guid', description: 'Unique tenant identifier' },\r\n { name: 'name', type: 'string', description: 'Tenant name' },\r\n { name: 'slug', type: 'string', description: 'URL-friendly slug' },\r\n { name: 'type', type: 'string', description: 'Tenant type (B2C/B2B)' },\r\n { name: 'status', type: 'string', description: 'Current status' },\r\n { name: 'description', type: 'string', description: 'Tenant description', nullable: true },\r\n { name: 'createdAt', type: 'DateTime', description: 'Creation date (UTC)' },\r\n { name: 'updatedAt', type: 'DateTime', description: 'Last update date (UTC)', nullable: true },\r\n { name: 'memberCount', type: 'int', description: 'Number of active members' },\r\n ],\r\n },\r\n Role: {\r\n paginated: true,\r\n fields: [\r\n { name: 'id', type: 'Guid', description: 'Unique role identifier' },\r\n { name: 'name', type: 'string', description: 'Role display name' },\r\n { name: 'shortName', type: 'string', description: 'Short name', nullable: true },\r\n { name: 'code', type: 'string', description: 'Unique role code', nullable: true },\r\n { name: 'category', type: 'string', description: 'Role category' },\r\n { name: 'description', type: 'string', description: 'Role description', nullable: true },\r\n { name: 'isSystem', type: 'boolean', description: 'System-managed role flag' },\r\n { name: 'createdAt', type: 'DateTime', description: 'Creation date (UTC)' },\r\n { name: 'updatedAt', type: 'DateTime', description: 'Last update date (UTC)', nullable: true },\r\n { name: 'permissions', type: 'string[]', description: 'Assigned permission codes' },\r\n ],\r\n },\r\n Ticket: {\r\n paginated: true,\r\n fields: [\r\n { name: 'id', type: 'Guid', description: 'Unique ticket identifier' },\r\n { name: 'title', type: 'string', description: 'Ticket title' },\r\n { name: 'type', type: 'string', description: 'Ticket type (Incident/Request/Task)' },\r\n { name: 'status', type: 'string', description: 'Current status' },\r\n { name: 'priority', type: 'string', description: 'Priority level' },\r\n { name: 'assignedToUserId', type: 'Guid', description: 'Assigned user', nullable: true },\r\n { name: 'createdByUserId', type: 'Guid', description: 'Creator user' },\r\n { name: 'tenantId', type: 'Guid', description: 'Owning tenant', nullable: true },\r\n { name: 'createdAt', type: 'DateTime', description: 'Creation date (UTC)' },\r\n { name: 'updatedAt', type: 'DateTime', description: 'Last update date (UTC)', nullable: true },\r\n { name: 'resolvedAt', type: 'DateTime', description: 'Resolution date', nullable: true },\r\n { name: 'closedAt', type: 'DateTime', description: 'Closing date', nullable: true },\r\n ],\r\n },\r\n NavigationApplication: {\r\n paginated: false,\r\n fields: [\r\n { name: 'id', type: 'Guid', description: 'Application identifier' },\r\n { name: 'code', type: 'string', description: 'Application code' },\r\n { name: 'label', type: 'string', description: 'Display label' },\r\n { name: 'modules', type: 'Module[]', description: 'Child modules' },\r\n { name: 'modules[].id', type: 'Guid', description: 'Module identifier' },\r\n { name: 'modules[].code', type: 'string', description: 'Module code' },\r\n { name: 'modules[].label', type: 'string', description: 'Module display label' },\r\n ],\r\n },\r\n};\r\n\r\n// Query parameters metadata per endpoint code (matches ExternalAppPromptTab)\r\nconst endpointQueryParams: Record<string, { name: string; type: string; default: string; description: string }[]> = {\r\n users: [\r\n { name: 'tenantId', type: 'UUID', default: '(requis)', description: 'ID du tenant - scope aux utilisateurs de ce tenant' },\r\n { name: 'page', type: 'int', default: '1', description: 'Numero de page (commence a 1)' },\r\n { name: 'pageSize', type: 'int', default: '100', description: 'Elements par page (max 1000)' },\r\n { name: 'modifiedSince', type: 'DateTime?', default: 'null', description: 'Filtre incremental UTC' },\r\n { name: 'isActive', type: 'bool?', default: 'null', description: 'Filtre par statut actif/inactif' },\r\n ],\r\n tenants: [\r\n { name: 'tenantId', type: 'UUID', default: '(requis)', description: 'ID du tenant a exporter' },\r\n { name: 'page', type: 'int', default: '1', description: 'Numero de page (commence a 1)' },\r\n { name: 'pageSize', type: 'int', default: '100', description: 'Elements par page (max 1000)' },\r\n { name: 'modifiedSince', type: 'DateTime?', default: 'null', description: 'Filtre incremental UTC' },\r\n ],\r\n roles: [\r\n { name: 'tenantId', type: 'UUID', default: '(requis)', description: 'ID du tenant - exporte les roles de ce tenant' },\r\n { name: 'page', type: 'int', default: '1', description: 'Numero de page (commence a 1)' },\r\n { name: 'pageSize', type: 'int', default: '100', description: 'Elements par page (max 1000)' },\r\n { name: 'modifiedSince', type: 'DateTime?', default: 'null', description: 'Filtre incremental UTC' },\r\n ],\r\n tickets: [\r\n { name: 'tenantId', type: 'UUID', default: '(requis)', description: 'ID du tenant - exporte les tickets de ce tenant' },\r\n { name: 'page', type: 'int', default: '1', description: 'Numero de page (commence a 1)' },\r\n { name: 'pageSize', type: 'int', default: '100', description: 'Elements par page (max 500)' },\r\n { name: 'modifiedSince', type: 'DateTime?', default: 'null', description: 'Filtre incremental UTC' },\r\n ],\r\n navigation: [],\r\n};\r\n\r\nfunction getJsonExampleValue(type: string): string {\r\n switch (type) {\r\n case 'Guid': return '\"3fa85f64-5717-4562-b3fc-2c963f66afa6\"';\r\n case 'string': return '\"...\"';\r\n case 'boolean': return 'true';\r\n case 'int': return '0';\r\n case 'DateTime': return '\"2026-01-15T10:30:00Z\"';\r\n case 'string[]': return '[\"item1\", \"item2\"]';\r\n case 'Guid[]': return '[\"uuid1\", \"uuid2\"]';\r\n default: return '\"...\"';\r\n }\r\n}\r\n\r\nfunction addAuthSection(lines: string[]): void {\r\n lines.push('## 1. Authentification (HMAC-JWT Assertion)');\r\n lines.push('');\r\n lines.push('### Etape 1 : Creer une assertion JWT signee HMAC-SHA256');\r\n lines.push('');\r\n lines.push('```');\r\n lines.push('Header: { \"alg\": \"HS256\", \"typ\": \"JWT\" }');\r\n lines.push('Payload: {');\r\n lines.push(' \"sub\": \"<YOUR_CLIENT_ID>\", // ton clientId');\r\n lines.push(' \"iat\": <timestamp-unix-actuel>, // timestamp Unix actuel');\r\n lines.push(' \"exp\": <timestamp-unix + 300>, // expiration (max 5 min apres iat)');\r\n lines.push(' \"jti\": \"<uuid-unique>\" // nonce anti-replay');\r\n lines.push('}');\r\n lines.push('Signature: HMAC-SHA256(header.payload, Base64Decode(clientSecret))');\r\n lines.push('```');\r\n lines.push('');\r\n lines.push('**Important** : Le `clientSecret` est encode en Base64. Tu dois le **decoder** avant de l\\'utiliser comme cle HMAC.');\r\n lines.push('');\r\n lines.push('### Etape 2 : Echanger l\\'assertion contre un access token');\r\n lines.push('');\r\n lines.push('```http');\r\n lines.push('POST {baseUrl}/api/auth/external-app/token');\r\n lines.push('Content-Type: application/json');\r\n lines.push('');\r\n lines.push('{ \"assertion\": \"<jwt-assertion-de-etape-1>\" }');\r\n lines.push('```');\r\n lines.push('');\r\n lines.push('**Reponse succes (200)** :');\r\n lines.push('```json');\r\n lines.push('{');\r\n lines.push(' \"accessToken\": \"eyJhbGciOiJIUz...\",');\r\n lines.push(' \"expiresAt\": \"2026-02-25T11:00:00Z\",');\r\n lines.push(' \"permissions\": [\"administration.users.read\", ...]');\r\n lines.push('}');\r\n lines.push('```');\r\n lines.push('');\r\n lines.push('Cache le token et renouvelle-le 5 min avant `expiresAt`.');\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n}\r\n\r\nfunction addTenantScopingSection(lines: string[], code: string): void {\r\n if (code !== 'navigation') {\r\n lines.push('## 2. Isolation par tenant (OBLIGATOIRE)');\r\n lines.push('');\r\n lines.push('Le parametre `tenantId` (UUID) est **obligatoire** en query string. Il scope l\\'export aux donnees du tenant specifie. Sans ce parametre, l\\'API retourne une erreur 400.');\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n }\r\n}\r\n\r\nfunction addEndpointSection(lines: string[], endpoint: DataApiEndpointDto): void {\r\n lines.push(`## 3. Endpoint : ${endpoint.name}`);\r\n lines.push('');\r\n lines.push('```http');\r\n lines.push(`GET {baseUrl}${endpoint.routeTemplate}`);\r\n lines.push('Authorization: Bearer <accessToken>');\r\n lines.push('```');\r\n lines.push('');\r\n}\r\n\r\nfunction addParamsSection(lines: string[], params: typeof endpointQueryParams[string]): void {\r\n if (params.length > 0) {\r\n lines.push('**Parametres (query string)** :');\r\n lines.push('');\r\n lines.push('| Parametre | Type | Defaut | Description |');\r\n lines.push('|-----------|------|--------|-------------|');\r\n for (const p of params) {\r\n lines.push(`| \\`${p.name}\\` | ${p.type} | ${p.default} | ${p.description} |`);\r\n }\r\n lines.push('');\r\n } else {\r\n lines.push('**Aucun parametre** - appel direct sans query string.');\r\n lines.push('');\r\n }\r\n}\r\n\r\nconst buildFieldLines = (schema: typeof responseSchemas[string], isNested: boolean): string[] => {\r\n const lines: string[] = [];\r\n const indent = isNested ? ' ' : ' ';\r\n for (let i = 0; i < schema.fields.length; i++) {\r\n const f = schema.fields[i];\r\n if (f.name.includes('[].')) continue;\r\n const comma = i < schema.fields.length - 1 ? ',' : '';\r\n lines.push(`${indent}\"${f.name}\": ${getJsonExampleValue(f.type)}${comma} // ${f.type}${f.nullable ? '?' : ''} - ${f.description}`);\r\n }\r\n return lines;\r\n};\r\n\r\nconst buildPaginatedResponseExample = (schema: typeof responseSchemas[string]): string[] => {\r\n const lines: string[] = [];\r\n lines.push('**Reponse (paginee)** :');\r\n lines.push('```json');\r\n lines.push('{');\r\n lines.push(' \"items\": [');\r\n lines.push(' {');\r\n lines.push(...buildFieldLines(schema, true));\r\n lines.push(' }');\r\n lines.push(' ],');\r\n lines.push(' \"page\": 1,');\r\n lines.push(' \"pageSize\": 100,');\r\n lines.push(' \"totalCount\": 250,');\r\n lines.push(' \"totalPages\": 3,');\r\n lines.push(' \"hasMore\": true');\r\n lines.push('}');\r\n lines.push('```');\r\n return lines;\r\n};\r\n\r\nconst buildArrayResponseExample = (schema: typeof responseSchemas[string]): string[] => {\r\n const lines: string[] = [];\r\n lines.push('**Reponse (tableau direct, NON pagine)** :');\r\n lines.push('```json');\r\n lines.push('[');\r\n lines.push(' {');\r\n lines.push(...buildFieldLines(schema, false));\r\n lines.push(' }');\r\n lines.push(']');\r\n lines.push('```');\r\n return lines;\r\n};\r\n\r\nfunction buildResponseExample(schema: typeof responseSchemas[string], isPaginated: boolean): string[] {\r\n return isPaginated\r\n ? buildPaginatedResponseExample(schema)\r\n : buildArrayResponseExample(schema);\r\n}\r\n\r\nfunction addResponseSection(lines: string[], schema: typeof responseSchemas[string] | undefined): void {\r\n if (schema) {\r\n const responseLines = buildResponseExample(schema, schema.paginated);\r\n lines.push(...responseLines);\r\n lines.push('');\r\n }\r\n}\r\n\r\nfunction addRateLimitSection(lines: string[], endpoint: DataApiEndpointDto): void {\r\n lines.push(`**Rate limit** : ${endpoint.defaultRateLimitPerMinute} requetes/minute | Page size max : ${endpoint.defaultMaxPageSize}`);\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n}\r\n\r\nfunction addPaginationSection(lines: string[], schema: typeof responseSchemas[string] | undefined): void {\r\n if (schema?.paginated) {\r\n lines.push('## 4. Pagination');\r\n lines.push('');\r\n lines.push('Boucle tant que `hasMore === true`, en incrementant `page`. Les resultats sont tries par `createdAt ASC`.');\r\n lines.push('');\r\n lines.push('## 5. Synchronisation incrementale');\r\n lines.push('');\r\n lines.push('Utilise `modifiedSince` pour ne recuperer que les changements :');\r\n lines.push('1. Premiere synchro : appelle sans `modifiedSince` (recupere tout)');\r\n lines.push('2. Stocke `DateTime.UtcNow` du debut de la synchro');\r\n lines.push('3. Synchros suivantes : passe `modifiedSince=<timestamp-stocke>`');\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n }\r\n}\r\n\r\nfunction addRateLimitingDetailSection(lines: string[]): void {\r\n lines.push('## 6. Rate Limiting');\r\n lines.push('');\r\n lines.push('Quand tu depasses la limite :');\r\n lines.push('```');\r\n lines.push('HTTP/1.1 429 Too Many Requests');\r\n lines.push('Retry-After: 42');\r\n lines.push('```');\r\n lines.push('Lis le header `Retry-After` et attends. Implemente un backoff exponentiel.');\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n}\r\n\r\nfunction addErrorHandlingSection(lines: string[]): void {\r\n lines.push('## 7. Gestion des erreurs');\r\n lines.push('');\r\n lines.push('| HTTP | Action |');\r\n lines.push('|------|--------|');\r\n lines.push('| 200 | Traite les donnees |');\r\n lines.push('| 400 | tenantId manquant ou invalide |');\r\n lines.push('| 401 | Renouvelle le token et relance |');\r\n lines.push('| 403 | Acces export non accorde - contacte l\\'admin |');\r\n lines.push('| 404 | Tenant non trouve - verifie le tenantId |');\r\n lines.push('| 429 | Attends `Retry-After` secondes |');\r\n lines.push('| 500 | Retry avec backoff exponentiel |');\r\n}\r\n\r\nfunction generateEndpointPrompt(endpoint: DataApiEndpointDto): string {\r\n const schema = responseSchemas[endpoint.entityType];\r\n const params = endpointQueryParams[endpoint.code] || [];\r\n const lines: string[] = [];\r\n\r\n lines.push('## Contexte');\r\n lines.push('');\r\n lines.push(`Tu dois implementer un client HTTP qui consomme l'endpoint **${endpoint.name}** de l'API DataExport de SmartStack en mode machine-to-machine (M2M). L'application s'authentifie avec un \\`clientId\\` et un \\`clientSecret\\`, obtient un token JWT, puis appelle l'endpoint d'export.`);\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n\r\n addAuthSection(lines);\r\n addTenantScopingSection(lines, endpoint.code);\r\n addEndpointSection(lines, endpoint);\r\n addParamsSection(lines, params);\r\n addResponseSection(lines, schema);\r\n addRateLimitSection(lines, endpoint);\r\n addPaginationSection(lines, schema);\r\n addRateLimitingDetailSection(lines);\r\n addErrorHandlingSection(lines);\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction generateCurlExample(endpoint: DataApiEndpointDto): string {\r\n const baseUrl = 'https://your-api.smartstack.app';\r\n const route = endpoint.routeTemplate;\r\n const isPaginated = responseSchemas[endpoint.entityType]?.paginated;\r\n\r\n let curl = `curl -X GET \"${baseUrl}${route}`;\r\n if (isPaginated) {\r\n curl += '?page=1&pageSize=100';\r\n }\r\n curl += `\" \\\\\\n -H \"Authorization: Bearer <API_KEY>\" \\\\\\n -H \"Accept: application/json\"`;\r\n return curl;\r\n}\r\n\r\nconst buildExampleFieldValue = (field: { name: string; type: string; nullable?: boolean }): unknown => {\r\n if (field.name === 'modules') return [{ id: '...', code: 'users', label: 'Users' }];\r\n\r\n switch (field.type) {\r\n case 'Guid': return '3fa85f64-5717-4562-b3fc-2c963f66afa6';\r\n case 'string': return field.nullable ? null : `example-${field.name}`;\r\n case 'boolean': return true;\r\n case 'int': return 42;\r\n case 'DateTime': return field.nullable ? null : '2026-02-25T10:00:00Z';\r\n case 'string[]': return ['value1', 'value2'];\r\n case 'Guid[]': return ['3fa85f64-5717-4562-b3fc-2c963f66afa6'];\r\n default: return '...';\r\n }\r\n};\r\n\r\nconst buildExampleItem = (schema: typeof responseSchemas[string]): Record<string, unknown> => {\r\n const exampleItem: Record<string, unknown> = {};\r\n for (const field of schema.fields) {\r\n if (field.name.includes('[].')) continue;\r\n exampleItem[field.name] = buildExampleFieldValue(field);\r\n }\r\n return exampleItem;\r\n};\r\n\r\nfunction generateJsonExample(endpoint: DataApiEndpointDto): string {\r\n const schema = responseSchemas[endpoint.entityType];\r\n if (!schema) return '// Schema not available';\r\n\r\n const exampleItem = buildExampleItem(schema);\r\n const responseBody = schema.paginated\r\n ? { items: [exampleItem], page: 1, pageSize: 100, totalCount: 1, totalPages: 1, hasMore: false }\r\n : [exampleItem];\r\n\r\n return JSON.stringify(responseBody, null, 2);\r\n}\r\n\r\nfunction CopyButton({ text }: { text: string }) {\r\n const [copied, setCopied] = useState(false);\r\n const handleCopy = async () => {\r\n await navigator.clipboard.writeText(text);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n };\r\n return (\r\n <button\r\n onClick={handleCopy}\r\n className=\"absolute top-2 right-2 p-1.5 rounded-md bg-[var(--bg-secondary)] hover:bg-[var(--bg-hover)] text-[var(--text-tertiary)] transition-colors\"\r\n title=\"Copy\"\r\n >\r\n {copied ? <Check className=\"h-4 w-4 text-[var(--success-text)]\" /> : <Copy className=\"h-4 w-4\" />}\r\n </button>\r\n );\r\n}\r\n\r\nfunction PromptBlocksContent({ prompt }: { prompt: AiSkillDetailDto }) {\r\n return (\r\n <div className=\"space-y-3\">\r\n {prompt.blocks\r\n .filter(b => b.isEnabled !== false)\r\n .sort((a, b) => a.displayOrder - b.displayOrder)\r\n .map((block) => (\r\n <div key={block.id} className=\"rounded-lg border border-[var(--border-color)] overflow-hidden\">\r\n <div className=\"flex items-center gap-2 px-4 py-2 bg-[var(--bg-secondary)] border-b border-[var(--border-color)]\">\r\n <span className=\"inline-flex items-center rounded-full bg-[var(--info-bg)] px-2 py-0.5 text-xs font-medium text-[var(--info-text)]\">\r\n {block.blockType}\r\n </span>\r\n {block.label && (\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{block.label}</span>\r\n )}\r\n </div>\r\n <div className=\"relative p-4\">\r\n <CopyButton text={block.content} />\r\n <pre className=\"text-sm font-mono text-[var(--text-secondary)] whitespace-pre-wrap pr-10\">\r\n {block.content}\r\n </pre>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction PromptVariablesContent({ variables, t }: { variables: string[]; t: any }) {\r\n return (\r\n <div>\r\n <h4 className=\"text-sm font-medium text-[var(--text-tertiary)] mb-2\">{t('externalApps.apis.catalog.detail.variables')}</h4>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {variables.map(v => (\r\n <code key={v} className=\"rounded bg-[var(--bg-secondary)] px-2 py-1 text-xs font-mono text-[var(--color-primary-600)]\">\r\n {`{${v}}`}\r\n </code>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction LoadedPromptContent({ t, prompt }: { t: any; prompt: AiSkillDetailDto }) {\r\n return (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-medium text-[var(--text-primary)]\">{prompt.name}</h3>\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">\r\n v{prompt.version} · {prompt.status}\r\n {prompt.description && <> · {prompt.description}</>}\r\n </p>\r\n </div>\r\n <a\r\n href={`/administration/ai/skills/${prompt.id}`}\r\n className=\"text-sm text-[var(--color-primary-600)] hover:underline\"\r\n >\r\n {t('externalApps.apis.catalog.detail.viewPrompt')}\r\n </a>\r\n </div>\r\n {(prompt.blocks?.length ?? 0) > 0 && (\r\n <PromptBlocksContent prompt={prompt} />\r\n )}\r\n {(prompt.variables?.length ?? 0) > 0 && (\r\n <PromptVariablesContent variables={prompt.variables} t={t} />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction GeneratedPromptContent({ t, endpoint, generatedPrompt }: { t: any; endpoint: DataApiEndpointDto; generatedPrompt: string }) {\r\n return (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-medium text-[var(--text-primary)]\">\r\n {t('externalApps.apis.catalog.detail.generatedPromptTitle')}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">\r\n {t('externalApps.apis.catalog.detail.generatedPromptHint', { code: `data-export-${endpoint.code}` })}\r\n </p>\r\n </div>\r\n <CopyButton text={generatedPrompt} />\r\n </div>\r\n <pre className=\"rounded-lg bg-[var(--bg-secondary)] p-4 text-sm font-mono text-[var(--text-primary)] whitespace-pre-wrap overflow-x-auto max-h-[600px] overflow-y-auto leading-relaxed\">\r\n {generatedPrompt}\r\n </pre>\r\n </div>\r\n );\r\n}\r\n\r\nasync function tryLoadPrompt(endpointCode: string): Promise<AiSkillDetailDto | null> {\r\n const codesToTry = [\r\n `data-export-${endpointCode}`,\r\n `export-${endpointCode}`,\r\n endpointCode,\r\n ];\r\n\r\n for (const code of codesToTry) {\r\n try {\r\n const detail = await aiApi.skills.getByCode(code);\r\n if (detail) return detail;\r\n } catch {\r\n // Code not found (404), try next\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport function ApiCatalogDetailPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const { endpointCode } = useParams<{ endpointCode: string }>();\r\n const navigate = useNavigate();\r\n const [endpoint, setEndpoint] = useState<DataApiEndpointDto | null>(null);\r\n const [prompt, setPrompt] = useState<AiSkillDetailDto | null>(null);\r\n const [promptLoading, setPromptLoading] = useState(false);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n\r\n const fetchData = async () => {\r\n try {\r\n setLoading(true);\r\n const endpoints = await adminApi.externalApps.getApiEndpoints();\r\n if (cancelled) return;\r\n\r\n const found = endpoints.find(ep => ep.code === endpointCode);\r\n if (!found) {\r\n setError('Endpoint not found');\r\n return;\r\n }\r\n setEndpoint(found);\r\n\r\n setPromptLoading(true);\r\n try {\r\n const detail = await tryLoadPrompt(found.code);\r\n if (!cancelled && detail) {\r\n setPrompt(detail);\r\n }\r\n } catch {\r\n // Prompts are optional, ignore errors\r\n } finally {\r\n if (!cancelled) setPromptLoading(false);\r\n }\r\n } catch (err) {\r\n if (!cancelled) {\r\n setError(err instanceof Error ? err.message : 'Failed to load endpoint');\r\n }\r\n } finally {\r\n if (!cancelled) setLoading(false);\r\n }\r\n };\r\n fetchData();\r\n\r\n return () => { cancelled = true; };\r\n }, [endpointCode]);\r\n\r\n const schema = useMemo(() => endpoint ? responseSchemas[endpoint.entityType] : null, [endpoint]);\r\n const curlExample = useMemo(() => endpoint ? generateCurlExample(endpoint) : '', [endpoint]);\r\n const jsonExample = useMemo(() => endpoint ? generateJsonExample(endpoint) : '', [endpoint]);\r\n const generatedPrompt = useMemo(() => endpoint ? generateEndpointPrompt(endpoint) : '', [endpoint]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex h-96 items-center justify-center\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !endpoint) {\r\n return (\r\n <div className=\"space-y-4\">\r\n <button onClick={() => navigate(-1)} className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors\">\r\n <ArrowLeft className=\"h-4 w-4\" />\r\n {t('common:back')}\r\n </button>\r\n <div className=\"rounded-lg border border-[var(--error-border)] bg-[var(--error-bg)] p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <AlertTriangle className=\"h-5 w-5 text-[var(--error-text)]\" />\r\n <p className=\"text-[var(--error-text)]\">{error || 'Endpoint not found'}</p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('externalApps.navigation.api'), href: '/api' },\r\n { label: t('externalApps.apis.catalog.title'), href: '/api/apis/catalog' },\r\n { label: endpoint.name }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-start gap-4\">\r\n <button onClick={() => navigate(-1)} className=\"mt-1 p-2 rounded-md hover:bg-[var(--bg-hover)] text-[var(--text-secondary)] transition-colors\">\r\n <ArrowLeft className=\"h-5 w-5\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3\">\r\n <BookOpen className=\"h-7 w-7 text-[var(--color-accent-600)]\" />\r\n <h1 className=\"text-3xl font-bold text-[var(--text-primary)]\">{endpoint.name}</h1>\r\n <div className=\"inline-flex items-center gap-2 rounded-full px-2.5 py-0.5 text-xs font-medium\">\r\n {endpoint.isActive ? (\r\n <>\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--success-text)]\" />\r\n <span className=\"text-[var(--success-text)]\">{t('externalApps.apis.catalog.active')}</span>\r\n </>\r\n ) : (\r\n <>\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--warning-text)]\" />\r\n <span className=\"text-[var(--warning-text)]\">{t('externalApps.apis.catalog.inactive')}</span>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n {endpoint.description && (\r\n <p className=\"mt-2 text-[var(--text-secondary)]\">{endpoint.description}</p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Metadata cards */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n <div className=\"card p-4 border border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Layers className=\"h-4 w-4\" />\r\n <span className=\"text-xs font-medium uppercase\">{t('externalApps.apis.catalog.columns.application')}</span>\r\n </div>\r\n <span className=\"inline-flex items-center rounded-full bg-[var(--info-bg)] px-2.5 py-0.5 text-sm font-medium text-[var(--info-text)]\">\r\n {endpoint.applicationLabel}\r\n </span>\r\n </div>\r\n <div className=\"card p-4 border border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Database className=\"h-4 w-4\" />\r\n <span className=\"text-xs font-medium uppercase\">{t('externalApps.apis.catalog.columns.module')}</span>\r\n </div>\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{endpoint.moduleLabel}</span>\r\n </div>\r\n <div className=\"card p-4 border border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Zap className=\"h-4 w-4\" />\r\n <span className=\"text-xs font-medium uppercase\">{t('externalApps.apis.catalog.columns.rateLimit')}</span>\r\n </div>\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{endpoint.defaultRateLimitPerMinute}/min</span>\r\n </div>\r\n <div className=\"card p-4 border border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Clock className=\"h-4 w-4\" />\r\n <span className=\"text-xs font-medium uppercase\">{t('externalApps.apis.catalog.columns.maxPageSize')}</span>\r\n </div>\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{endpoint.defaultMaxPageSize}</span>\r\n </div>\r\n </div>\r\n\r\n {/* Technical details */}\r\n <div className=\"card border border-[var(--border-color)]\">\r\n <div className=\"px-6 py-4 border-b border-[var(--border-color)]\">\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">{t('externalApps.apis.catalog.detail.technical')}</h2>\r\n </div>\r\n <div className=\"p-6 grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n <div>\r\n <label className=\"text-xs font-medium uppercase text-[var(--text-tertiary)]\">{t('externalApps.apis.catalog.columns.route')}</label>\r\n <div className=\"mt-1 flex items-center gap-2\">\r\n <code className=\"rounded-md bg-[var(--bg-secondary)] px-3 py-1.5 text-sm font-mono text-[var(--color-primary-600)]\">\r\n GET {endpoint.routeTemplate}\r\n </code>\r\n </div>\r\n </div>\r\n <div>\r\n <label className=\"text-xs font-medium uppercase text-[var(--text-tertiary)]\">{t('externalApps.apis.catalog.columns.permission')}</label>\r\n <div className=\"mt-1 flex items-center gap-2\">\r\n <Shield className=\"h-4 w-4 text-[var(--warning-text)]\" />\r\n <code className=\"rounded-md bg-[var(--bg-secondary)] px-3 py-1.5 text-sm font-mono text-[var(--text-primary)]\">\r\n {endpoint.requiredPermission}\r\n </code>\r\n </div>\r\n </div>\r\n <div>\r\n <label className=\"text-xs font-medium uppercase text-[var(--text-tertiary)]\">{t('externalApps.apis.catalog.columns.entityType')}</label>\r\n <div className=\"mt-1 flex items-center gap-2\">\r\n <Database className=\"h-4 w-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{endpoint.entityType}</span>\r\n </div>\r\n </div>\r\n <div>\r\n <label className=\"text-xs font-medium uppercase text-[var(--text-tertiary)]\">{t('externalApps.apis.catalog.columns.code')}</label>\r\n <div className=\"mt-1\">\r\n <code className=\"rounded-md bg-[var(--bg-secondary)] px-3 py-1.5 text-sm font-mono text-[var(--text-primary)]\">\r\n {endpoint.code}\r\n </code>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* cURL Example */}\r\n <div className=\"card border border-[var(--border-color)]\">\r\n <div className=\"px-6 py-4 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2\">\r\n <Code2 className=\"h-5 w-5 text-[var(--text-tertiary)]\" />\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">{t('externalApps.apis.catalog.detail.curlExample')}</h2>\r\n </div>\r\n </div>\r\n <div className=\"p-6 relative\">\r\n <CopyButton text={curlExample} />\r\n <pre className=\"rounded-lg bg-[var(--bg-secondary)] p-4 text-sm font-mono text-[var(--text-primary)] overflow-x-auto whitespace-pre-wrap\">\r\n {curlExample}\r\n </pre>\r\n </div>\r\n </div>\r\n\r\n {/* Response Schema */}\r\n {schema && (\r\n <div className=\"card border border-[var(--border-color)]\">\r\n <div className=\"px-6 py-4 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-2\">\r\n <FileCode2 className=\"h-5 w-5 text-[var(--text-tertiary)]\" />\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">{t('externalApps.apis.catalog.detail.responseSchema')}</h2>\r\n </div>\r\n {schema.paginated && (\r\n <span className=\"inline-flex items-center rounded-full bg-[var(--info-bg)] px-2.5 py-0.5 text-xs font-medium text-[var(--info-text)]\">\r\n {t('externalApps.apis.catalog.detail.paginated')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left px-6 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('externalApps.apis.catalog.detail.field')}</th>\r\n <th className=\"text-left px-6 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('externalApps.apis.catalog.detail.type')}</th>\r\n <th className=\"text-left px-6 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('externalApps.apis.catalog.detail.nullable')}</th>\r\n <th className=\"text-left px-6 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('externalApps.apis.catalog.detail.fieldDescription')}</th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {schema.fields.map((field) => (\r\n <tr key={field.name} className=\"hover:bg-[var(--bg-hover)] transition-colors\">\r\n <td className=\"px-6 py-3\">\r\n <code className=\"text-sm font-mono text-[var(--color-primary-600)]\">{field.name}</code>\r\n </td>\r\n <td className=\"px-6 py-3\">\r\n <code className=\"rounded bg-[var(--bg-secondary)] px-2 py-0.5 text-xs font-mono text-[var(--text-secondary)]\">{field.type}</code>\r\n </td>\r\n <td className=\"px-6 py-3 text-sm text-[var(--text-secondary)]\">\r\n {field.nullable ? '?' : '-'}\r\n </td>\r\n <td className=\"px-6 py-3 text-sm text-[var(--text-secondary)]\">{field.description}</td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n {/* JSON Example */}\r\n <div className=\"border-t border-[var(--border-color)] p-6\">\r\n <h3 className=\"text-sm font-semibold text-[var(--text-tertiary)] uppercase mb-3\">{t('externalApps.apis.catalog.detail.jsonExample')}</h3>\r\n <div className=\"relative\">\r\n <CopyButton text={jsonExample} />\r\n <pre className=\"rounded-lg bg-[var(--bg-secondary)] p-4 text-sm font-mono text-[var(--text-primary)] overflow-x-auto max-h-96 overflow-y-auto\">\r\n {jsonExample}\r\n </pre>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* AI Prompt section */}\r\n <div className=\"card border border-[var(--border-color)]\">\r\n <div className=\"px-6 py-4 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2\">\r\n <Brain className=\"h-5 w-5 text-[var(--color-accent-600)]\" />\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">{t('externalApps.apis.catalog.detail.dedicatedPrompt')}</h2>\r\n </div>\r\n <p className=\"mt-1 text-sm text-[var(--text-tertiary)]\">{t('externalApps.apis.catalog.detail.promptDescription')}</p>\r\n </div>\r\n <div className=\"p-6\">\r\n {promptLoading && (\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)]\">\r\n <Loader2 className=\"h-4 w-4 animate-spin\" />\r\n <span className=\"text-sm\">{t('common:loading')}</span>\r\n </div>\r\n )}\r\n {!promptLoading && prompt && (\r\n <LoadedPromptContent t={t} prompt={prompt} />\r\n )}\r\n {!promptLoading && !prompt && (\r\n <GeneratedPromptContent t={t} endpoint={endpoint} generatedPrompt={generatedPrompt} />\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["responseSchemas","endpointQueryParams","getJsonExampleValue","type","addAuthSection","lines","addTenantScopingSection","code","addEndpointSection","endpoint","addParamsSection","params","p","buildFieldLines","schema","isNested","indent","i","f","comma","buildPaginatedResponseExample","buildArrayResponseExample","buildResponseExample","isPaginated","addResponseSection","responseLines","addRateLimitSection","addPaginationSection","addRateLimitingDetailSection","addErrorHandlingSection","generateEndpointPrompt","generateCurlExample","baseUrl","route","curl","buildExampleFieldValue","field","buildExampleItem","exampleItem","generateJsonExample","responseBody","CopyButton","text","copied","setCopied","useState","handleCopy","jsx","Check","Copy","PromptBlocksContent","prompt","b","block","jsxs","PromptVariablesContent","variables","t","v","LoadedPromptContent","Fragment","GeneratedPromptContent","generatedPrompt","tryLoadPrompt","endpointCode","codesToTry","detail","aiApi","ApiCatalogDetailPage","useTranslation","useParams","navigate","useNavigate","setEndpoint","setPrompt","promptLoading","setPromptLoading","loading","setLoading","error","setError","useEffect","cancelled","endpoints","adminApi","found","ep","err","useMemo","curlExample","jsonExample","Loader2","ArrowLeft","AlertTriangle","Breadcrumb","BookOpen","Layers","Database","Zap","Clock","Shield","Code2","FileCode2","Brain"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { useState as n, useEffect as A, useMemo as x } from "react";
|
|
|
3
3
|
import { useTranslation as P } from "react-i18next";
|
|
4
4
|
import { useNavigate as $ } from "react-router-dom";
|
|
5
5
|
import { Loader2 as j, AlertTriangle as B, Search as z, BookOpen as R } from "lucide-react";
|
|
6
|
-
import { B as O, k as q } from "./index-
|
|
6
|
+
import { B as O, k as q } from "./index-lpIzhufD.js";
|
|
7
7
|
const h = {
|
|
8
8
|
blue: "bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)]",
|
|
9
9
|
green: "bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]",
|
|
@@ -176,4 +176,4 @@ function Q() {
|
|
|
176
176
|
export {
|
|
177
177
|
Q as ApiCatalogPage
|
|
178
178
|
};
|
|
179
|
-
//# sourceMappingURL=ApiCatalogPage-
|
|
179
|
+
//# sourceMappingURL=ApiCatalogPage-D4Hg3uiS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiCatalogPage-BEqTDJz8.js","sources":["../../src/pages/platform/api/apis/ApiCatalogPage.tsx"],"sourcesContent":["import { useEffect, useState, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { Search, AlertTriangle, Loader2, BookOpen } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { adminApi } from '@/services/api/adminApi';\r\nimport type { DataApiEndpointDto } from '@/services/api/adminApi';\r\n\r\nconst colorClasses = {\r\n blue: 'bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)]',\r\n green: 'bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]',\r\n neutral: 'bg-[var(--bg-secondary)] text-[var(--text-primary)] border-[var(--border-color)]',\r\n};\r\n\r\nexport function ApiCatalogPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const navigate = useNavigate();\r\n const [endpoints, setEndpoints] = useState<DataApiEndpointDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [searchTerm, setSearchTerm] = useState('');\r\n const [statusFilter, setStatusFilter] = useState('all');\r\n const [appFilter, setAppFilter] = useState('all');\r\n const [moduleFilter, setModuleFilter] = useState('all');\r\n\r\n useEffect(() => {\r\n const fetchEndpoints = async () => {\r\n try {\r\n setLoading(true);\r\n const data = await adminApi.externalApps.getApiEndpoints();\r\n setEndpoints(data);\r\n setError(null);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load endpoints');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n fetchEndpoints();\r\n }, []);\r\n\r\n const applications = useMemo(() => {\r\n const map = new Map<string, string>();\r\n endpoints.forEach(ep => map.set(ep.applicationCode, ep.applicationLabel));\r\n return [...map.entries()].sort((a, b) => a[1].localeCompare(b[1]));\r\n }, [endpoints]);\r\n\r\n const modules = useMemo(() => {\r\n const filtered = appFilter === 'all' ? endpoints : endpoints.filter(ep => ep.applicationCode === appFilter);\r\n const map = new Map<string, string>();\r\n filtered.forEach(ep => map.set(ep.moduleCode, ep.moduleLabel));\r\n return [...map.entries()].sort((a, b) => a[1].localeCompare(b[1]));\r\n }, [endpoints, appFilter]);\r\n\r\n // Reset module filter when app changes\r\n useEffect(() => {\r\n setModuleFilter('all');\r\n }, [appFilter]);\r\n\r\n const filtered = useMemo(() => {\r\n return endpoints.filter(ep => {\r\n const matchesSearch = !searchTerm ||\r\n ep.name.toLowerCase().includes(searchTerm.toLowerCase()) ||\r\n ep.code.toLowerCase().includes(searchTerm.toLowerCase()) ||\r\n ep.routeTemplate.toLowerCase().includes(searchTerm.toLowerCase()) ||\r\n ep.applicationLabel.toLowerCase().includes(searchTerm.toLowerCase()) ||\r\n ep.moduleLabel.toLowerCase().includes(searchTerm.toLowerCase());\r\n const matchesStatus = statusFilter === 'all' ||\r\n (statusFilter === 'active' && ep.isActive) ||\r\n (statusFilter === 'inactive' && !ep.isActive);\r\n const matchesApp = appFilter === 'all' || ep.applicationCode === appFilter;\r\n const matchesModule = moduleFilter === 'all' || ep.moduleCode === moduleFilter;\r\n return matchesSearch && matchesStatus && matchesApp && matchesModule;\r\n });\r\n }, [endpoints, searchTerm, statusFilter, appFilter, moduleFilter]);\r\n\r\n const stats = useMemo(() => ({\r\n total: endpoints.length,\r\n active: endpoints.filter(e => e.isActive).length,\r\n inactive: endpoints.filter(e => !e.isActive).length,\r\n }), [endpoints]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex h-96 items-center justify-center\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"rounded-lg border border-[var(--error-border)] bg-[var(--error-bg)] p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <AlertTriangle className=\"h-5 w-5 text-[var(--error-text)]\" />\r\n <p className=\"text-[var(--error-text)]\">{error}</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('externalApps.navigation.api'), href: '/api' },\r\n { label: t('externalApps.apis.catalog.title') }\r\n ]}\r\n />\r\n\r\n <div>\r\n <h1 className=\"text-3xl font-bold text-[var(--text-primary)]\">{t('externalApps.apis.catalog.title')}</h1>\r\n <p className=\"mt-2 text-[var(--text-secondary)]\">{t('externalApps.apis.catalog.description')}</p>\r\n </div>\r\n\r\n {/* KPI Cards */}\r\n <div className=\"grid grid-cols-3 gap-4\">\r\n <div className={`card p-4 text-center border ${colorClasses.blue}`}>\r\n <div className=\"text-2xl font-bold\">{stats.total}</div>\r\n <div className=\"text-sm opacity-80\">{t('externalApps.apis.catalog.kpi.total')}</div>\r\n </div>\r\n <div className={`card p-4 text-center border ${colorClasses.green}`}>\r\n <div className=\"text-2xl font-bold\">{stats.active}</div>\r\n <div className=\"text-sm opacity-80\">{t('externalApps.apis.catalog.kpi.active')}</div>\r\n </div>\r\n <div className={`card p-4 text-center border ${colorClasses.neutral}`}>\r\n <div className=\"text-2xl font-bold\">{stats.inactive}</div>\r\n <div className=\"text-sm opacity-80\">{t('externalApps.apis.catalog.kpi.inactive')}</div>\r\n </div>\r\n </div>\r\n\r\n {/* Toolbar */}\r\n <div className=\"space-y-4 rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center\">\r\n <div className=\"flex-1 relative\">\r\n <Search className=\"absolute left-3 top-1/2 h-5 w-5 -translate-y-1/2 text-[var(--text-tertiary)]\" />\r\n <input\r\n type=\"text\"\r\n placeholder={t('externalApps.apis.catalog.search')}\r\n value={searchTerm}\r\n onChange={(e) => setSearchTerm(e.target.value)}\r\n className=\"w-full rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] py-2 pl-10 pr-4 text-[var(--text-primary)] placeholder-[var(--text-tertiary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n />\r\n </div>\r\n <select\r\n value={appFilter}\r\n onChange={(e) => setAppFilter(e.target.value)}\r\n className=\"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n >\r\n <option value=\"all\">{t('externalApps.apis.catalog.columns.application')}</option>\r\n {applications.map(([code, label]) => (\r\n <option key={code} value={code}>{label}</option>\r\n ))}\r\n </select>\r\n <select\r\n value={moduleFilter}\r\n onChange={(e) => setModuleFilter(e.target.value)}\r\n className=\"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n >\r\n <option value=\"all\">{t('externalApps.apis.catalog.columns.module')}</option>\r\n {modules.map(([code, label]) => (\r\n <option key={code} value={code}>{label}</option>\r\n ))}\r\n </select>\r\n <select\r\n value={statusFilter}\r\n onChange={(e) => setStatusFilter(e.target.value)}\r\n className=\"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n >\r\n <option value=\"all\">{t('admin:common.all')}</option>\r\n <option value=\"active\">{t('externalApps.apis.catalog.active')}</option>\r\n <option value=\"inactive\">{t('externalApps.apis.catalog.inactive')}</option>\r\n </select>\r\n </div>\r\n <span className=\"text-sm text-[var(--text-tertiary)]\">\r\n {filtered.length} / {endpoints.length} {t('externalApps.apis.catalog.kpi.total').toLowerCase()}\r\n </span>\r\n </div>\r\n\r\n {/* Table */}\r\n {filtered.length === 0 ? (\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-12 text-center\">\r\n <p className=\"text-[var(--text-secondary)]\">{t('externalApps.apis.catalog.noResults')}</p>\r\n </div>\r\n ) : (\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">\r\n {t('externalApps.apis.catalog.columns.application')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">\r\n {t('externalApps.apis.catalog.columns.module')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">\r\n {t('externalApps.apis.catalog.columns.name')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">\r\n {t('externalApps.apis.catalog.columns.route')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">\r\n {t('externalApps.apis.catalog.columns.entityType')}\r\n </th>\r\n <th className=\"text-right px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">\r\n {t('externalApps.apis.catalog.columns.rateLimit')}\r\n </th>\r\n <th className=\"text-right px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">\r\n {t('externalApps.apis.catalog.columns.maxPageSize')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">\r\n {t('externalApps.apis.catalog.columns.status')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {filtered.map((ep) => (\r\n <tr key={ep.id} className=\"hover:bg-[var(--bg-hover)] transition-colors cursor-pointer\" onClick={() => navigate(`/api/apis/catalog/${ep.code}`)}>\r\n <td className=\"px-4 py-3\">\r\n <span className=\"inline-flex items-center gap-1.5 rounded-full bg-[var(--info-bg)] px-2.5 py-0.5 text-xs font-medium text-[var(--info-text)]\">\r\n {ep.applicationLabel}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className=\"text-sm text-[var(--text-primary)]\">{ep.moduleLabel}</span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-3\">\r\n <BookOpen className=\"h-4 w-4 text-[var(--color-accent-600)] flex-shrink-0\" />\r\n <div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{ep.name}</p>\r\n {ep.description && (\r\n <p className=\"mt-0.5 text-xs text-[var(--text-tertiary)] line-clamp-1\">{ep.description}</p>\r\n )}\r\n </div>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)] font-mono hidden lg:table-cell\">\r\n {ep.routeTemplate}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)] hidden lg:table-cell\">\r\n {ep.entityType}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-right text-[var(--text-secondary)] hidden lg:table-cell\">\r\n {ep.defaultRateLimitPerMinute}/min\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-right text-[var(--text-secondary)] hidden lg:table-cell\">\r\n {ep.defaultMaxPageSize}\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"inline-flex items-center gap-2 rounded-full px-2.5 py-0.5 text-xs font-medium\">\r\n {ep.isActive ? (\r\n <>\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--success-text)]\" />\r\n <span className=\"text-[var(--success-text)]\">{t('externalApps.apis.catalog.active')}</span>\r\n </>\r\n ) : (\r\n <>\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--warning-text)]\" />\r\n <span className=\"text-[var(--warning-text)]\">{t('externalApps.apis.catalog.inactive')}</span>\r\n </>\r\n )}\r\n </div>\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["colorClasses","ApiCatalogPage","t","useTranslation","navigate","useNavigate","endpoints","setEndpoints","useState","loading","setLoading","error","setError","searchTerm","setSearchTerm","statusFilter","setStatusFilter","appFilter","setAppFilter","moduleFilter","setModuleFilter","useEffect","data","adminApi","err","applications","useMemo","map","ep","a","b","modules","filtered","matchesSearch","matchesStatus","matchesApp","matchesModule","stats","e","jsx","Loader2","jsxs","AlertTriangle","Breadcrumb","Search","code","label","BookOpen","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ApiCatalogPage-D4Hg3uiS.js","sources":["../../src/pages/platform/api/apis/ApiCatalogPage.tsx"],"sourcesContent":["import { useEffect, useState, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { Search, AlertTriangle, Loader2, BookOpen } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { adminApi } from '@/services/api/adminApi';\r\nimport type { DataApiEndpointDto } from '@/services/api/adminApi';\r\n\r\nconst colorClasses = {\r\n blue: 'bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)]',\r\n green: 'bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]',\r\n neutral: 'bg-[var(--bg-secondary)] text-[var(--text-primary)] border-[var(--border-color)]',\r\n};\r\n\r\nexport function ApiCatalogPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const navigate = useNavigate();\r\n const [endpoints, setEndpoints] = useState<DataApiEndpointDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [searchTerm, setSearchTerm] = useState('');\r\n const [statusFilter, setStatusFilter] = useState('all');\r\n const [appFilter, setAppFilter] = useState('all');\r\n const [moduleFilter, setModuleFilter] = useState('all');\r\n\r\n useEffect(() => {\r\n const fetchEndpoints = async () => {\r\n try {\r\n setLoading(true);\r\n const data = await adminApi.externalApps.getApiEndpoints();\r\n setEndpoints(data);\r\n setError(null);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load endpoints');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n fetchEndpoints();\r\n }, []);\r\n\r\n const applications = useMemo(() => {\r\n const map = new Map<string, string>();\r\n endpoints.forEach(ep => map.set(ep.applicationCode, ep.applicationLabel));\r\n return [...map.entries()].sort((a, b) => a[1].localeCompare(b[1]));\r\n }, [endpoints]);\r\n\r\n const modules = useMemo(() => {\r\n const filtered = appFilter === 'all' ? endpoints : endpoints.filter(ep => ep.applicationCode === appFilter);\r\n const map = new Map<string, string>();\r\n filtered.forEach(ep => map.set(ep.moduleCode, ep.moduleLabel));\r\n return [...map.entries()].sort((a, b) => a[1].localeCompare(b[1]));\r\n }, [endpoints, appFilter]);\r\n\r\n // Reset module filter when app changes\r\n useEffect(() => {\r\n setModuleFilter('all');\r\n }, [appFilter]);\r\n\r\n const filtered = useMemo(() => {\r\n return endpoints.filter(ep => {\r\n const matchesSearch = !searchTerm ||\r\n ep.name.toLowerCase().includes(searchTerm.toLowerCase()) ||\r\n ep.code.toLowerCase().includes(searchTerm.toLowerCase()) ||\r\n ep.routeTemplate.toLowerCase().includes(searchTerm.toLowerCase()) ||\r\n ep.applicationLabel.toLowerCase().includes(searchTerm.toLowerCase()) ||\r\n ep.moduleLabel.toLowerCase().includes(searchTerm.toLowerCase());\r\n const matchesStatus = statusFilter === 'all' ||\r\n (statusFilter === 'active' && ep.isActive) ||\r\n (statusFilter === 'inactive' && !ep.isActive);\r\n const matchesApp = appFilter === 'all' || ep.applicationCode === appFilter;\r\n const matchesModule = moduleFilter === 'all' || ep.moduleCode === moduleFilter;\r\n return matchesSearch && matchesStatus && matchesApp && matchesModule;\r\n });\r\n }, [endpoints, searchTerm, statusFilter, appFilter, moduleFilter]);\r\n\r\n const stats = useMemo(() => ({\r\n total: endpoints.length,\r\n active: endpoints.filter(e => e.isActive).length,\r\n inactive: endpoints.filter(e => !e.isActive).length,\r\n }), [endpoints]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex h-96 items-center justify-center\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"rounded-lg border border-[var(--error-border)] bg-[var(--error-bg)] p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <AlertTriangle className=\"h-5 w-5 text-[var(--error-text)]\" />\r\n <p className=\"text-[var(--error-text)]\">{error}</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('externalApps.navigation.api'), href: '/api' },\r\n { label: t('externalApps.apis.catalog.title') }\r\n ]}\r\n />\r\n\r\n <div>\r\n <h1 className=\"text-3xl font-bold text-[var(--text-primary)]\">{t('externalApps.apis.catalog.title')}</h1>\r\n <p className=\"mt-2 text-[var(--text-secondary)]\">{t('externalApps.apis.catalog.description')}</p>\r\n </div>\r\n\r\n {/* KPI Cards */}\r\n <div className=\"grid grid-cols-3 gap-4\">\r\n <div className={`card p-4 text-center border ${colorClasses.blue}`}>\r\n <div className=\"text-2xl font-bold\">{stats.total}</div>\r\n <div className=\"text-sm opacity-80\">{t('externalApps.apis.catalog.kpi.total')}</div>\r\n </div>\r\n <div className={`card p-4 text-center border ${colorClasses.green}`}>\r\n <div className=\"text-2xl font-bold\">{stats.active}</div>\r\n <div className=\"text-sm opacity-80\">{t('externalApps.apis.catalog.kpi.active')}</div>\r\n </div>\r\n <div className={`card p-4 text-center border ${colorClasses.neutral}`}>\r\n <div className=\"text-2xl font-bold\">{stats.inactive}</div>\r\n <div className=\"text-sm opacity-80\">{t('externalApps.apis.catalog.kpi.inactive')}</div>\r\n </div>\r\n </div>\r\n\r\n {/* Toolbar */}\r\n <div className=\"space-y-4 rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center\">\r\n <div className=\"flex-1 relative\">\r\n <Search className=\"absolute left-3 top-1/2 h-5 w-5 -translate-y-1/2 text-[var(--text-tertiary)]\" />\r\n <input\r\n type=\"text\"\r\n placeholder={t('externalApps.apis.catalog.search')}\r\n value={searchTerm}\r\n onChange={(e) => setSearchTerm(e.target.value)}\r\n className=\"w-full rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] py-2 pl-10 pr-4 text-[var(--text-primary)] placeholder-[var(--text-tertiary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n />\r\n </div>\r\n <select\r\n value={appFilter}\r\n onChange={(e) => setAppFilter(e.target.value)}\r\n className=\"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n >\r\n <option value=\"all\">{t('externalApps.apis.catalog.columns.application')}</option>\r\n {applications.map(([code, label]) => (\r\n <option key={code} value={code}>{label}</option>\r\n ))}\r\n </select>\r\n <select\r\n value={moduleFilter}\r\n onChange={(e) => setModuleFilter(e.target.value)}\r\n className=\"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n >\r\n <option value=\"all\">{t('externalApps.apis.catalog.columns.module')}</option>\r\n {modules.map(([code, label]) => (\r\n <option key={code} value={code}>{label}</option>\r\n ))}\r\n </select>\r\n <select\r\n value={statusFilter}\r\n onChange={(e) => setStatusFilter(e.target.value)}\r\n className=\"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n >\r\n <option value=\"all\">{t('admin:common.all')}</option>\r\n <option value=\"active\">{t('externalApps.apis.catalog.active')}</option>\r\n <option value=\"inactive\">{t('externalApps.apis.catalog.inactive')}</option>\r\n </select>\r\n </div>\r\n <span className=\"text-sm text-[var(--text-tertiary)]\">\r\n {filtered.length} / {endpoints.length} {t('externalApps.apis.catalog.kpi.total').toLowerCase()}\r\n </span>\r\n </div>\r\n\r\n {/* Table */}\r\n {filtered.length === 0 ? (\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-12 text-center\">\r\n <p className=\"text-[var(--text-secondary)]\">{t('externalApps.apis.catalog.noResults')}</p>\r\n </div>\r\n ) : (\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">\r\n {t('externalApps.apis.catalog.columns.application')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">\r\n {t('externalApps.apis.catalog.columns.module')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">\r\n {t('externalApps.apis.catalog.columns.name')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">\r\n {t('externalApps.apis.catalog.columns.route')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">\r\n {t('externalApps.apis.catalog.columns.entityType')}\r\n </th>\r\n <th className=\"text-right px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">\r\n {t('externalApps.apis.catalog.columns.rateLimit')}\r\n </th>\r\n <th className=\"text-right px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">\r\n {t('externalApps.apis.catalog.columns.maxPageSize')}\r\n </th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">\r\n {t('externalApps.apis.catalog.columns.status')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {filtered.map((ep) => (\r\n <tr key={ep.id} className=\"hover:bg-[var(--bg-hover)] transition-colors cursor-pointer\" onClick={() => navigate(`/api/apis/catalog/${ep.code}`)}>\r\n <td className=\"px-4 py-3\">\r\n <span className=\"inline-flex items-center gap-1.5 rounded-full bg-[var(--info-bg)] px-2.5 py-0.5 text-xs font-medium text-[var(--info-text)]\">\r\n {ep.applicationLabel}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className=\"text-sm text-[var(--text-primary)]\">{ep.moduleLabel}</span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-3\">\r\n <BookOpen className=\"h-4 w-4 text-[var(--color-accent-600)] flex-shrink-0\" />\r\n <div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{ep.name}</p>\r\n {ep.description && (\r\n <p className=\"mt-0.5 text-xs text-[var(--text-tertiary)] line-clamp-1\">{ep.description}</p>\r\n )}\r\n </div>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)] font-mono hidden lg:table-cell\">\r\n {ep.routeTemplate}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)] hidden lg:table-cell\">\r\n {ep.entityType}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-right text-[var(--text-secondary)] hidden lg:table-cell\">\r\n {ep.defaultRateLimitPerMinute}/min\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-right text-[var(--text-secondary)] hidden lg:table-cell\">\r\n {ep.defaultMaxPageSize}\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"inline-flex items-center gap-2 rounded-full px-2.5 py-0.5 text-xs font-medium\">\r\n {ep.isActive ? (\r\n <>\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--success-text)]\" />\r\n <span className=\"text-[var(--success-text)]\">{t('externalApps.apis.catalog.active')}</span>\r\n </>\r\n ) : (\r\n <>\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--warning-text)]\" />\r\n <span className=\"text-[var(--warning-text)]\">{t('externalApps.apis.catalog.inactive')}</span>\r\n </>\r\n )}\r\n </div>\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["colorClasses","ApiCatalogPage","t","useTranslation","navigate","useNavigate","endpoints","setEndpoints","useState","loading","setLoading","error","setError","searchTerm","setSearchTerm","statusFilter","setStatusFilter","appFilter","setAppFilter","moduleFilter","setModuleFilter","useEffect","data","adminApi","err","applications","useMemo","map","ep","a","b","modules","filtered","matchesSearch","matchesStatus","matchesApp","matchesModule","stats","e","jsx","Loader2","jsxs","AlertTriangle","Breadcrumb","Search","code","label","BookOpen","Fragment"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),s=require("react"),E=require("react-i18next"),F=require("react-router-dom"),x=require("lucide-react"),j=require("./index-
|
|
2
|
-
//# sourceMappingURL=ApiCatalogPage-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),s=require("react"),E=require("react-i18next"),F=require("react-router-dom"),x=require("lucide-react"),j=require("./index-IgLVXPg8.js"),v={blue:"bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)]",green:"bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]",neutral:"bg-[var(--bg-secondary)] text-[var(--text-primary)] border-[var(--border-color)]"};function T(){const{t:a}=E.useTranslation("admin"),y=F.useNavigate(),[l,N]=s.useState([]),[A,h]=s.useState(!0),[g,b]=s.useState(null),[c,w]=s.useState(""),[o,C]=s.useState("all"),[n,L]=s.useState("all"),[d,f]=s.useState("all");s.useEffect(()=>{(async()=>{try{h(!0);const r=await j.adminApi.externalApps.getApiEndpoints();N(r),b(null)}catch(r){b(r instanceof Error?r.message:"Failed to load endpoints")}finally{h(!1)}})()},[]);const S=s.useMemo(()=>{const t=new Map;return l.forEach(r=>t.set(r.applicationCode,r.applicationLabel)),[...t.entries()].sort((r,i)=>r[1].localeCompare(i[1]))},[l]),k=s.useMemo(()=>{const t=n==="all"?l:l.filter(i=>i.applicationCode===n),r=new Map;return t.forEach(i=>r.set(i.moduleCode,i.moduleLabel)),[...r.entries()].sort((i,u)=>i[1].localeCompare(u[1]))},[l,n]);s.useEffect(()=>{f("all")},[n]);const p=s.useMemo(()=>l.filter(t=>{const r=!c||t.name.toLowerCase().includes(c.toLowerCase())||t.code.toLowerCase().includes(c.toLowerCase())||t.routeTemplate.toLowerCase().includes(c.toLowerCase())||t.applicationLabel.toLowerCase().includes(c.toLowerCase())||t.moduleLabel.toLowerCase().includes(c.toLowerCase()),i=o==="all"||o==="active"&&t.isActive||o==="inactive"&&!t.isActive,u=n==="all"||t.applicationCode===n,M=d==="all"||t.moduleCode===d;return r&&i&&u&&M}),[l,c,o,n,d]),m=s.useMemo(()=>({total:l.length,active:l.filter(t=>t.isActive).length,inactive:l.filter(t=>!t.isActive).length}),[l]);return A?e.jsx("div",{className:"flex h-96 items-center justify-center",children:e.jsx(x.Loader2,{className:"h-8 w-8 animate-spin text-[var(--color-primary-600)]"})}):g?e.jsx("div",{className:"rounded-lg border border-[var(--error-border)] bg-[var(--error-bg)] p-4",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(x.AlertTriangle,{className:"h-5 w-5 text-[var(--error-text)]"}),e.jsx("p",{className:"text-[var(--error-text)]",children:g})]})}):e.jsxs("div",{className:"space-y-6",children:[e.jsx(j.Breadcrumb,{items:[{label:a("externalApps.navigation.api"),href:"/api"},{label:a("externalApps.apis.catalog.title")}]}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-3xl font-bold text-[var(--text-primary)]",children:a("externalApps.apis.catalog.title")}),e.jsx("p",{className:"mt-2 text-[var(--text-secondary)]",children:a("externalApps.apis.catalog.description")})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsxs("div",{className:`card p-4 text-center border ${v.blue}`,children:[e.jsx("div",{className:"text-2xl font-bold",children:m.total}),e.jsx("div",{className:"text-sm opacity-80",children:a("externalApps.apis.catalog.kpi.total")})]}),e.jsxs("div",{className:`card p-4 text-center border ${v.green}`,children:[e.jsx("div",{className:"text-2xl font-bold",children:m.active}),e.jsx("div",{className:"text-sm opacity-80",children:a("externalApps.apis.catalog.kpi.active")})]}),e.jsxs("div",{className:`card p-4 text-center border ${v.neutral}`,children:[e.jsx("div",{className:"text-2xl font-bold",children:m.inactive}),e.jsx("div",{className:"text-sm opacity-80",children:a("externalApps.apis.catalog.kpi.inactive")})]})]}),e.jsxs("div",{className:"space-y-4 rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4",children:[e.jsxs("div",{className:"flex flex-col gap-4 md:flex-row md:items-center",children:[e.jsxs("div",{className:"flex-1 relative",children:[e.jsx(x.Search,{className:"absolute left-3 top-1/2 h-5 w-5 -translate-y-1/2 text-[var(--text-tertiary)]"}),e.jsx("input",{type:"text",placeholder:a("externalApps.apis.catalog.search"),value:c,onChange:t=>w(t.target.value),className:"w-full rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] py-2 pl-10 pr-4 text-[var(--text-primary)] placeholder-[var(--text-tertiary)] focus:border-[var(--color-primary-600)] focus:outline-none"})]}),e.jsxs("select",{value:n,onChange:t=>L(t.target.value),className:"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none",children:[e.jsx("option",{value:"all",children:a("externalApps.apis.catalog.columns.application")}),S.map(([t,r])=>e.jsx("option",{value:t,children:r},t))]}),e.jsxs("select",{value:d,onChange:t=>f(t.target.value),className:"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none",children:[e.jsx("option",{value:"all",children:a("externalApps.apis.catalog.columns.module")}),k.map(([t,r])=>e.jsx("option",{value:t,children:r},t))]}),e.jsxs("select",{value:o,onChange:t=>C(t.target.value),className:"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none",children:[e.jsx("option",{value:"all",children:a("admin:common.all")}),e.jsx("option",{value:"active",children:a("externalApps.apis.catalog.active")}),e.jsx("option",{value:"inactive",children:a("externalApps.apis.catalog.inactive")})]})]}),e.jsxs("span",{className:"text-sm text-[var(--text-tertiary)]",children:[p.length," / ",l.length," ",a("externalApps.apis.catalog.kpi.total").toLowerCase()]})]}),p.length===0?e.jsx("div",{className:"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-12 text-center",children:e.jsx("p",{className:"text-[var(--text-secondary)]",children:a("externalApps.apis.catalog.noResults")})}):e.jsx("div",{className:"card overflow-hidden",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"bg-[var(--bg-secondary)]",children:[e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider",children:a("externalApps.apis.catalog.columns.application")}),e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider",children:a("externalApps.apis.catalog.columns.module")}),e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider",children:a("externalApps.apis.catalog.columns.name")}),e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell",children:a("externalApps.apis.catalog.columns.route")}),e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell",children:a("externalApps.apis.catalog.columns.entityType")}),e.jsx("th",{className:"text-right px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell",children:a("externalApps.apis.catalog.columns.rateLimit")}),e.jsx("th",{className:"text-right px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell",children:a("externalApps.apis.catalog.columns.maxPageSize")}),e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider",children:a("externalApps.apis.catalog.columns.status")})]})}),e.jsx("tbody",{className:"divide-y divide-[var(--border-color)]",children:p.map(t=>e.jsxs("tr",{className:"hover:bg-[var(--bg-hover)] transition-colors cursor-pointer",onClick:()=>y(`/api/apis/catalog/${t.code}`),children:[e.jsx("td",{className:"px-4 py-3",children:e.jsx("span",{className:"inline-flex items-center gap-1.5 rounded-full bg-[var(--info-bg)] px-2.5 py-0.5 text-xs font-medium text-[var(--info-text)]",children:t.applicationLabel})}),e.jsx("td",{className:"px-4 py-3",children:e.jsx("span",{className:"text-sm text-[var(--text-primary)]",children:t.moduleLabel})}),e.jsx("td",{className:"px-4 py-3",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(x.BookOpen,{className:"h-4 w-4 text-[var(--color-accent-600)] flex-shrink-0"}),e.jsxs("div",{children:[e.jsx("p",{className:"font-medium text-[var(--text-primary)]",children:t.name}),t.description&&e.jsx("p",{className:"mt-0.5 text-xs text-[var(--text-tertiary)] line-clamp-1",children:t.description})]})]})}),e.jsx("td",{className:"px-4 py-3 text-sm text-[var(--text-secondary)] font-mono hidden lg:table-cell",children:t.routeTemplate}),e.jsx("td",{className:"px-4 py-3 text-sm text-[var(--text-secondary)] hidden lg:table-cell",children:t.entityType}),e.jsxs("td",{className:"px-4 py-3 text-sm text-right text-[var(--text-secondary)] hidden lg:table-cell",children:[t.defaultRateLimitPerMinute,"/min"]}),e.jsx("td",{className:"px-4 py-3 text-sm text-right text-[var(--text-secondary)] hidden lg:table-cell",children:t.defaultMaxPageSize}),e.jsx("td",{className:"px-4 py-3",children:e.jsx("div",{className:"inline-flex items-center gap-2 rounded-full px-2.5 py-0.5 text-xs font-medium",children:t.isActive?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-2 w-2 rounded-full bg-[var(--success-text)]"}),e.jsx("span",{className:"text-[var(--success-text)]",children:a("externalApps.apis.catalog.active")})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-2 w-2 rounded-full bg-[var(--warning-text)]"}),e.jsx("span",{className:"text-[var(--warning-text)]",children:a("externalApps.apis.catalog.inactive")})]})})})]},t.id))})]})})]})}exports.ApiCatalogPage=T;
|
|
2
|
+
//# sourceMappingURL=ApiCatalogPage-DRg5Cz0r.js.map
|