openvsx-webui-test 0.17.2 → 0.18.0-dev.1
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/lib/components/button-with-progress.d.ts +1 -0
- package/lib/components/button-with-progress.d.ts.map +1 -1
- package/lib/components/button-with-progress.js +1 -1
- package/lib/components/button-with-progress.js.map +1 -1
- package/lib/components/sanitized-markdown.d.ts.map +1 -1
- package/lib/components/sanitized-markdown.js +79 -1
- package/lib/components/sanitized-markdown.js.map +1 -1
- package/lib/components/scan-admin/common/auto-refresh.d.ts +21 -0
- package/lib/components/scan-admin/common/auto-refresh.d.ts.map +1 -0
- package/lib/components/scan-admin/common/auto-refresh.js +45 -0
- package/lib/components/scan-admin/common/auto-refresh.js.map +1 -0
- package/lib/components/scan-admin/common/conditional-tooltip.d.ts +24 -0
- package/lib/components/scan-admin/common/conditional-tooltip.d.ts.map +1 -0
- package/lib/components/scan-admin/common/conditional-tooltip.js +63 -0
- package/lib/components/scan-admin/common/conditional-tooltip.js.map +1 -0
- package/lib/components/scan-admin/common/file-table.d.ts +23 -0
- package/lib/components/scan-admin/common/file-table.d.ts.map +1 -0
- package/lib/components/scan-admin/common/file-table.js +350 -0
- package/lib/components/scan-admin/common/file-table.js.map +1 -0
- package/lib/components/scan-admin/common/index.d.ts +18 -0
- package/lib/components/scan-admin/common/index.d.ts.map +1 -0
- package/lib/components/scan-admin/common/index.js +18 -0
- package/lib/components/scan-admin/common/index.js.map +1 -0
- package/lib/components/scan-admin/common/tab-panel.d.ts +25 -0
- package/lib/components/scan-admin/common/tab-panel.d.ts.map +1 -0
- package/lib/components/scan-admin/common/tab-panel.js +22 -0
- package/lib/components/scan-admin/common/tab-panel.js.map +1 -0
- package/lib/components/scan-admin/common/utils.d.ts +15 -0
- package/lib/components/scan-admin/common/utils.d.ts.map +1 -0
- package/lib/components/scan-admin/common/utils.js +46 -0
- package/lib/components/scan-admin/common/utils.js.map +1 -0
- package/lib/components/scan-admin/dialogs/file-dialog.d.ts +19 -0
- package/lib/components/scan-admin/dialogs/file-dialog.d.ts.map +1 -0
- package/lib/components/scan-admin/dialogs/file-dialog.js +85 -0
- package/lib/components/scan-admin/dialogs/file-dialog.js.map +1 -0
- package/lib/components/scan-admin/dialogs/index.d.ts +15 -0
- package/lib/components/scan-admin/dialogs/index.d.ts.map +1 -0
- package/lib/components/scan-admin/dialogs/index.js +15 -0
- package/lib/components/scan-admin/dialogs/index.js.map +1 -0
- package/lib/components/scan-admin/dialogs/quarantine-dialog.d.ts +23 -0
- package/lib/components/scan-admin/dialogs/quarantine-dialog.d.ts.map +1 -0
- package/lib/components/scan-admin/dialogs/quarantine-dialog.js +192 -0
- package/lib/components/scan-admin/dialogs/quarantine-dialog.js.map +1 -0
- package/lib/components/scan-admin/index.d.ts +20 -0
- package/lib/components/scan-admin/index.d.ts.map +1 -0
- package/lib/components/scan-admin/index.js +25 -0
- package/lib/components/scan-admin/index.js.map +1 -0
- package/lib/components/scan-admin/scan-card/index.d.ts +20 -0
- package/lib/components/scan-admin/scan-card/index.d.ts.map +1 -0
- package/lib/components/scan-admin/scan-card/index.js +20 -0
- package/lib/components/scan-admin/scan-card/index.js.map +1 -0
- package/lib/components/scan-admin/scan-card/scan-card-content.d.ts +30 -0
- package/lib/components/scan-admin/scan-card/scan-card-content.d.ts.map +1 -0
- package/lib/components/scan-admin/scan-card/scan-card-content.js +232 -0
- package/lib/components/scan-admin/scan-card/scan-card-content.js.map +1 -0
- package/lib/components/scan-admin/scan-card/scan-card-expand-strip-badges.d.ts +26 -0
- package/lib/components/scan-admin/scan-card/scan-card-expand-strip-badges.d.ts.map +1 -0
- package/lib/components/scan-admin/scan-card/scan-card-expand-strip-badges.js +121 -0
- package/lib/components/scan-admin/scan-card/scan-card-expand-strip-badges.js.map +1 -0
- package/lib/components/scan-admin/scan-card/scan-card-expand-strip.d.ts +27 -0
- package/lib/components/scan-admin/scan-card/scan-card-expand-strip.d.ts.map +1 -0
- package/lib/components/scan-admin/scan-card/scan-card-expand-strip.js +66 -0
- package/lib/components/scan-admin/scan-card/scan-card-expand-strip.js.map +1 -0
- package/lib/components/scan-admin/scan-card/scan-card-expanded-content.d.ts +26 -0
- package/lib/components/scan-admin/scan-card/scan-card-expanded-content.d.ts.map +1 -0
- package/lib/components/scan-admin/scan-card/scan-card-expanded-content.js +151 -0
- package/lib/components/scan-admin/scan-card/scan-card-expanded-content.js.map +1 -0
- package/lib/components/scan-admin/scan-card/scan-card-header.d.ts +26 -0
- package/lib/components/scan-admin/scan-card/scan-card-header.d.ts.map +1 -0
- package/lib/components/scan-admin/scan-card/scan-card-header.js +101 -0
- package/lib/components/scan-admin/scan-card/scan-card-header.js.map +1 -0
- package/lib/components/scan-admin/scan-card/scan-card.d.ts +34 -0
- package/lib/components/scan-admin/scan-card/scan-card.d.ts.map +1 -0
- package/lib/components/scan-admin/scan-card/scan-card.js +90 -0
- package/lib/components/scan-admin/scan-card/scan-card.js.map +1 -0
- package/lib/components/scan-admin/scan-card/scan-detail-card.d.ts +38 -0
- package/lib/components/scan-admin/scan-card/scan-detail-card.d.ts.map +1 -0
- package/lib/components/scan-admin/scan-card/scan-detail-card.js +72 -0
- package/lib/components/scan-admin/scan-card/scan-detail-card.js.map +1 -0
- package/lib/components/scan-admin/scan-card/utils.d.ts +48 -0
- package/lib/components/scan-admin/scan-card/utils.d.ts.map +1 -0
- package/lib/components/scan-admin/scan-card/utils.js +166 -0
- package/lib/components/scan-admin/scan-card/utils.js.map +1 -0
- package/lib/components/scan-admin/tab-contents/allow-list-tab-content.d.ts +19 -0
- package/lib/components/scan-admin/tab-contents/allow-list-tab-content.d.ts.map +1 -0
- package/lib/components/scan-admin/tab-contents/allow-list-tab-content.js +55 -0
- package/lib/components/scan-admin/tab-contents/allow-list-tab-content.js.map +1 -0
- package/lib/components/scan-admin/tab-contents/auto-rejected-tab-content.d.ts +19 -0
- package/lib/components/scan-admin/tab-contents/auto-rejected-tab-content.d.ts.map +1 -0
- package/lib/components/scan-admin/tab-contents/auto-rejected-tab-content.js +43 -0
- package/lib/components/scan-admin/tab-contents/auto-rejected-tab-content.js.map +1 -0
- package/lib/components/scan-admin/tab-contents/block-list-tab-content.d.ts +19 -0
- package/lib/components/scan-admin/tab-contents/block-list-tab-content.d.ts.map +1 -0
- package/lib/components/scan-admin/tab-contents/block-list-tab-content.js +55 -0
- package/lib/components/scan-admin/tab-contents/block-list-tab-content.js.map +1 -0
- package/lib/components/scan-admin/tab-contents/index.d.ts +18 -0
- package/lib/components/scan-admin/tab-contents/index.d.ts.map +1 -0
- package/lib/components/scan-admin/tab-contents/index.js +18 -0
- package/lib/components/scan-admin/tab-contents/index.js.map +1 -0
- package/lib/components/scan-admin/tab-contents/quarantined-tab-content.d.ts +19 -0
- package/lib/components/scan-admin/tab-contents/quarantined-tab-content.d.ts.map +1 -0
- package/lib/components/scan-admin/tab-contents/quarantined-tab-content.js +78 -0
- package/lib/components/scan-admin/tab-contents/quarantined-tab-content.js.map +1 -0
- package/lib/components/scan-admin/tab-contents/scans-tab-content.d.ts +19 -0
- package/lib/components/scan-admin/tab-contents/scans-tab-content.d.ts.map +1 -0
- package/lib/components/scan-admin/tab-contents/scans-tab-content.js +52 -0
- package/lib/components/scan-admin/tab-contents/scans-tab-content.js.map +1 -0
- package/lib/components/scan-admin/toolbars/counts-toolbar.d.ts +35 -0
- package/lib/components/scan-admin/toolbars/counts-toolbar.d.ts.map +1 -0
- package/lib/components/scan-admin/toolbars/counts-toolbar.js +132 -0
- package/lib/components/scan-admin/toolbars/counts-toolbar.js.map +1 -0
- package/lib/components/scan-admin/toolbars/index.d.ts +16 -0
- package/lib/components/scan-admin/toolbars/index.d.ts.map +1 -0
- package/lib/components/scan-admin/toolbars/index.js +16 -0
- package/lib/components/scan-admin/toolbars/index.js.map +1 -0
- package/lib/components/scan-admin/toolbars/search-toolbar.d.ts +43 -0
- package/lib/components/scan-admin/toolbars/search-toolbar.d.ts.map +1 -0
- package/lib/components/scan-admin/toolbars/search-toolbar.js +106 -0
- package/lib/components/scan-admin/toolbars/search-toolbar.js.map +1 -0
- package/lib/components/scan-admin/toolbars/tab-toolbar.d.ts +25 -0
- package/lib/components/scan-admin/toolbars/tab-toolbar.d.ts.map +1 -0
- package/lib/components/scan-admin/toolbars/tab-toolbar.js +33 -0
- package/lib/components/scan-admin/toolbars/tab-toolbar.js.map +1 -0
- package/lib/context/scan-admin/index.d.ts +21 -0
- package/lib/context/scan-admin/index.d.ts.map +1 -0
- package/lib/context/scan-admin/index.js +27 -0
- package/lib/context/scan-admin/index.js.map +1 -0
- package/lib/context/scan-admin/scan-actions.d.ts +19 -0
- package/lib/context/scan-admin/scan-actions.d.ts.map +1 -0
- package/lib/context/scan-admin/scan-actions.js +64 -0
- package/lib/context/scan-admin/scan-actions.js.map +1 -0
- package/lib/context/scan-admin/scan-api-actions.d.ts +26 -0
- package/lib/context/scan-admin/scan-api-actions.d.ts.map +1 -0
- package/lib/context/scan-admin/scan-api-actions.js +118 -0
- package/lib/context/scan-admin/scan-api-actions.js.map +1 -0
- package/lib/context/scan-admin/scan-api-effects.d.ts +40 -0
- package/lib/context/scan-admin/scan-api-effects.d.ts.map +1 -0
- package/lib/context/scan-admin/scan-api-effects.js +446 -0
- package/lib/context/scan-admin/scan-api-effects.js.map +1 -0
- package/lib/context/scan-admin/scan-context-types.d.ts +69 -0
- package/lib/context/scan-admin/scan-context-types.d.ts.map +1 -0
- package/lib/context/scan-admin/scan-context-types.js +14 -0
- package/lib/context/scan-admin/scan-context-types.js.map +1 -0
- package/lib/context/scan-admin/scan-context.d.ts +17 -0
- package/lib/context/scan-admin/scan-context.d.ts.map +1 -0
- package/lib/context/scan-admin/scan-context.js +90 -0
- package/lib/context/scan-admin/scan-context.js.map +1 -0
- package/lib/context/scan-admin/scan-helpers.d.ts +28 -0
- package/lib/context/scan-admin/scan-helpers.d.ts.map +1 -0
- package/lib/context/scan-admin/scan-helpers.js +56 -0
- package/lib/context/scan-admin/scan-helpers.js.map +1 -0
- package/lib/context/scan-admin/scan-reducer.d.ts +18 -0
- package/lib/context/scan-admin/scan-reducer.d.ts.map +1 -0
- package/lib/context/scan-admin/scan-reducer.js +194 -0
- package/lib/context/scan-admin/scan-reducer.js.map +1 -0
- package/lib/context/scan-admin/scan-types.d.ts +292 -0
- package/lib/context/scan-admin/scan-types.d.ts.map +1 -0
- package/lib/context/scan-admin/scan-types.js +67 -0
- package/lib/context/scan-admin/scan-types.js.map +1 -0
- package/lib/default/page-settings.d.ts.map +1 -1
- package/lib/default/page-settings.js +3 -0
- package/lib/default/page-settings.js.map +1 -1
- package/lib/default/theme.d.ts +50 -12
- package/lib/default/theme.d.ts.map +1 -1
- package/lib/default/theme.js +42 -0
- package/lib/default/theme.js.map +1 -1
- package/lib/extension-registry-service.d.ts +106 -1
- package/lib/extension-registry-service.d.ts.map +1 -1
- package/lib/extension-registry-service.js +348 -1
- package/lib/extension-registry-service.js.map +1 -1
- package/lib/extension-registry-types.d.ts +181 -0
- package/lib/extension-registry-types.d.ts.map +1 -1
- package/lib/extension-registry-types.js +16 -0
- package/lib/extension-registry-types.js.map +1 -1
- package/lib/hooks/scan-admin/index.d.ts +34 -0
- package/lib/hooks/scan-admin/index.d.ts.map +1 -0
- package/lib/hooks/scan-admin/index.js +28 -0
- package/lib/hooks/scan-admin/index.js.map +1 -0
- package/lib/hooks/scan-admin/use-auto-rejected-tab.d.ts +76 -0
- package/lib/hooks/scan-admin/use-auto-rejected-tab.d.ts.map +1 -0
- package/lib/hooks/scan-admin/use-auto-rejected-tab.js +79 -0
- package/lib/hooks/scan-admin/use-auto-rejected-tab.js.map +1 -0
- package/lib/hooks/scan-admin/use-dialogs.d.ts +43 -0
- package/lib/hooks/scan-admin/use-dialogs.d.ts.map +1 -0
- package/lib/hooks/scan-admin/use-dialogs.js +55 -0
- package/lib/hooks/scan-admin/use-dialogs.js.map +1 -0
- package/lib/hooks/scan-admin/use-file-list-tab.d.ts +208 -0
- package/lib/hooks/scan-admin/use-file-list-tab.d.ts.map +1 -0
- package/lib/hooks/scan-admin/use-file-list-tab.js +125 -0
- package/lib/hooks/scan-admin/use-file-list-tab.js.map +1 -0
- package/lib/hooks/scan-admin/use-pagination.d.ts +36 -0
- package/lib/hooks/scan-admin/use-pagination.d.ts.map +1 -0
- package/lib/hooks/scan-admin/use-pagination.js +79 -0
- package/lib/hooks/scan-admin/use-pagination.js.map +1 -0
- package/lib/hooks/scan-admin/use-quarantined-tab.d.ts +92 -0
- package/lib/hooks/scan-admin/use-quarantined-tab.d.ts.map +1 -0
- package/lib/hooks/scan-admin/use-quarantined-tab.js +125 -0
- package/lib/hooks/scan-admin/use-quarantined-tab.js.map +1 -0
- package/lib/hooks/scan-admin/use-scan-card-state.d.ts +29 -0
- package/lib/hooks/scan-admin/use-scan-card-state.d.ts.map +1 -0
- package/lib/hooks/scan-admin/use-scan-card-state.js +50 -0
- package/lib/hooks/scan-admin/use-scan-card-state.js.map +1 -0
- package/lib/hooks/scan-admin/use-scan-filters.d.ts +53 -0
- package/lib/hooks/scan-admin/use-scan-filters.d.ts.map +1 -0
- package/lib/hooks/scan-admin/use-scan-filters.js +75 -0
- package/lib/hooks/scan-admin/use-scan-filters.js.map +1 -0
- package/lib/hooks/scan-admin/use-scans-tab.d.ts +85 -0
- package/lib/hooks/scan-admin/use-scans-tab.d.ts.map +1 -0
- package/lib/hooks/scan-admin/use-scans-tab.js +87 -0
- package/lib/hooks/scan-admin/use-scans-tab.js.map +1 -0
- package/lib/hooks/scan-admin/use-search.d.ts +32 -0
- package/lib/hooks/scan-admin/use-search.d.ts.map +1 -0
- package/lib/hooks/scan-admin/use-search.js +48 -0
- package/lib/hooks/scan-admin/use-search.js.map +1 -0
- package/lib/hooks/scan-admin/use-tab-navigation.d.ts +96 -0
- package/lib/hooks/scan-admin/use-tab-navigation.d.ts.map +1 -0
- package/lib/hooks/scan-admin/use-tab-navigation.js +70 -0
- package/lib/hooks/scan-admin/use-tab-navigation.js.map +1 -0
- package/lib/hooks/scan-admin/use-url-sync.d.ts +22 -0
- package/lib/hooks/scan-admin/use-url-sync.d.ts.map +1 -0
- package/lib/hooks/scan-admin/use-url-sync.js +252 -0
- package/lib/hooks/scan-admin/use-url-sync.js.map +1 -0
- package/lib/page-settings.d.ts +4 -0
- package/lib/page-settings.d.ts.map +1 -1
- package/lib/pages/admin-dashboard/admin-dashboard.d.ts +4 -0
- package/lib/pages/admin-dashboard/admin-dashboard.d.ts.map +1 -1
- package/lib/pages/admin-dashboard/admin-dashboard.js +55 -5
- package/lib/pages/admin-dashboard/admin-dashboard.js.map +1 -1
- package/lib/pages/admin-dashboard/components/data-grid-filter-operators.d.ts +28 -0
- package/lib/pages/admin-dashboard/components/data-grid-filter-operators.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/components/data-grid-filter-operators.js +93 -0
- package/lib/pages/admin-dashboard/components/data-grid-filter-operators.js.map +1 -0
- package/lib/pages/admin-dashboard/components/index.d.ts +2 -0
- package/lib/pages/admin-dashboard/components/index.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/components/index.js +14 -0
- package/lib/pages/admin-dashboard/components/index.js.map +1 -0
- package/lib/pages/admin-dashboard/customers/customer-form-dialog.d.ts +23 -0
- package/lib/pages/admin-dashboard/customers/customer-form-dialog.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/customers/customer-form-dialog.js +225 -0
- package/lib/pages/admin-dashboard/customers/customer-form-dialog.js.map +1 -0
- package/lib/pages/admin-dashboard/customers/customers.d.ts +15 -0
- package/lib/pages/admin-dashboard/customers/customers.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/customers/customers.js +175 -0
- package/lib/pages/admin-dashboard/customers/customers.js.map +1 -0
- package/lib/pages/admin-dashboard/customers/delete-customer-dialog.d.ts +23 -0
- package/lib/pages/admin-dashboard/customers/delete-customer-dialog.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/customers/delete-customer-dialog.js +64 -0
- package/lib/pages/admin-dashboard/customers/delete-customer-dialog.js.map +1 -0
- package/lib/pages/admin-dashboard/publisher-admin.js +5 -5
- package/lib/pages/admin-dashboard/publisher-admin.js.map +1 -1
- package/lib/pages/admin-dashboard/publisher-revoke-dialog.d.ts.map +1 -1
- package/lib/pages/admin-dashboard/publisher-revoke-dialog.js +1 -1
- package/lib/pages/admin-dashboard/publisher-revoke-dialog.js.map +1 -1
- package/lib/pages/admin-dashboard/scan-admin.d.ts +20 -0
- package/lib/pages/admin-dashboard/scan-admin.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/scan-admin.js +66 -0
- package/lib/pages/admin-dashboard/scan-admin.js.map +1 -0
- package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.d.ts +23 -0
- package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.js +55 -0
- package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.js.map +1 -0
- package/lib/pages/admin-dashboard/tiers/tier-form-dialog.d.ts +23 -0
- package/lib/pages/admin-dashboard/tiers/tier-form-dialog.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/tiers/tier-form-dialog.js +215 -0
- package/lib/pages/admin-dashboard/tiers/tier-form-dialog.js.map +1 -0
- package/lib/pages/admin-dashboard/tiers/tiers.d.ts +15 -0
- package/lib/pages/admin-dashboard/tiers/tiers.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/tiers/tiers.js +174 -0
- package/lib/pages/admin-dashboard/tiers/tiers.js.map +1 -0
- package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.d.ts +23 -0
- package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.js +106 -0
- package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.js.map +1 -0
- package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.d.ts +26 -0
- package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.js +50 -0
- package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.js.map +1 -0
- package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.d.ts +14 -0
- package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.js +16 -0
- package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.js.map +1 -0
- package/lib/pages/admin-dashboard/usage-stats/usage-stats.d.ts +15 -0
- package/lib/pages/admin-dashboard/usage-stats/usage-stats.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/usage-stats/usage-stats.js +103 -0
- package/lib/pages/admin-dashboard/usage-stats/usage-stats.js.map +1 -0
- package/lib/pages/admin-dashboard/welcome.d.ts.map +1 -1
- package/lib/pages/admin-dashboard/welcome.js +5 -1
- package/lib/pages/admin-dashboard/welcome.js.map +1 -1
- package/lib/pages/extension-detail/extension-detail-overview.d.ts.map +1 -1
- package/lib/pages/extension-detail/extension-detail-overview.js +9 -1
- package/lib/pages/extension-detail/extension-detail-overview.js.map +1 -1
- package/lib/pages/extension-detail/extension-detail-reviews.d.ts.map +1 -1
- package/lib/pages/extension-detail/extension-detail-reviews.js +67 -18
- package/lib/pages/extension-detail/extension-detail-reviews.js.map +1 -1
- package/lib/pages/extension-detail/extension-detail.js +2 -2
- package/lib/pages/extension-detail/extension-detail.js.map +1 -1
- package/lib/pages/extension-detail/extension-rating-stars.d.ts +2 -2
- package/lib/pages/extension-detail/extension-rating-stars.d.ts.map +1 -1
- package/lib/pages/extension-detail/extension-rating-stars.js +1 -1
- package/lib/pages/extension-detail/extension-rating-stars.js.map +1 -1
- package/lib/pages/extension-list/extension-list-item.js +2 -2
- package/lib/pages/extension-list/extension-list-item.js.map +1 -1
- package/lib/pages/user/user-namespace-extension-list-item.d.ts.map +1 -1
- package/lib/pages/user/user-namespace-extension-list-item.js +23 -9
- package/lib/pages/user/user-namespace-extension-list-item.js.map +1 -1
- package/lib/pages/user/user-publisher-agreement.d.ts.map +1 -1
- package/lib/pages/user/user-publisher-agreement.js +34 -13
- package/lib/pages/user/user-publisher-agreement.js.map +1 -1
- package/lib/pages/user/user-settings-profile.d.ts.map +1 -1
- package/lib/pages/user/user-settings-profile.js +10 -5
- package/lib/pages/user/user-settings-profile.js.map +1 -1
- package/lib/pages/user/user-settings-tokens.d.ts.map +1 -1
- package/lib/pages/user/user-settings-tokens.js +13 -5
- package/lib/pages/user/user-settings-tokens.js.map +1 -1
- package/lib/server-request.d.ts +1 -1
- package/lib/server-request.d.ts.map +1 -1
- package/lib/server-request.js +3 -3
- package/lib/server-request.js.map +1 -1
- package/package.json +17 -9
- package/src/components/button-with-progress.tsx +2 -1
- package/src/components/sanitized-markdown.tsx +81 -1
- package/src/components/scan-admin/common/auto-refresh.tsx +79 -0
- package/src/components/scan-admin/common/conditional-tooltip.tsx +74 -0
- package/src/components/scan-admin/common/file-table.tsx +508 -0
- package/src/components/scan-admin/common/index.ts +18 -0
- package/src/components/scan-admin/common/tab-panel.tsx +42 -0
- package/src/components/scan-admin/common/utils.ts +48 -0
- package/src/components/scan-admin/dialogs/file-dialog.tsx +137 -0
- package/src/components/scan-admin/dialogs/index.ts +15 -0
- package/src/components/scan-admin/dialogs/quarantine-dialog.tsx +270 -0
- package/src/components/scan-admin/index.ts +52 -0
- package/src/components/scan-admin/scan-card/index.ts +20 -0
- package/src/components/scan-admin/scan-card/scan-card-content.tsx +457 -0
- package/src/components/scan-admin/scan-card/scan-card-expand-strip-badges.tsx +186 -0
- package/src/components/scan-admin/scan-card/scan-card-expand-strip.tsx +104 -0
- package/src/components/scan-admin/scan-card/scan-card-expanded-content.tsx +262 -0
- package/src/components/scan-admin/scan-card/scan-card-header.tsx +176 -0
- package/src/components/scan-admin/scan-card/scan-card.tsx +152 -0
- package/src/components/scan-admin/scan-card/scan-detail-card.tsx +144 -0
- package/src/components/scan-admin/scan-card/utils.ts +199 -0
- package/src/components/scan-admin/tab-contents/allow-list-tab-content.tsx +119 -0
- package/src/components/scan-admin/tab-contents/auto-rejected-tab-content.tsx +106 -0
- package/src/components/scan-admin/tab-contents/block-list-tab-content.tsx +119 -0
- package/src/components/scan-admin/tab-contents/index.ts +18 -0
- package/src/components/scan-admin/tab-contents/quarantined-tab-content.tsx +158 -0
- package/src/components/scan-admin/tab-contents/scans-tab-content.tsx +113 -0
- package/src/components/scan-admin/toolbars/counts-toolbar.tsx +262 -0
- package/src/components/scan-admin/toolbars/index.ts +16 -0
- package/src/components/scan-admin/toolbars/search-toolbar.tsx +255 -0
- package/src/components/scan-admin/toolbars/tab-toolbar.tsx +56 -0
- package/src/context/scan-admin/index.ts +43 -0
- package/src/context/scan-admin/scan-actions.ts +87 -0
- package/src/context/scan-admin/scan-api-actions.ts +137 -0
- package/src/context/scan-admin/scan-api-effects.ts +491 -0
- package/src/context/scan-admin/scan-context-types.ts +102 -0
- package/src/context/scan-admin/scan-context.tsx +123 -0
- package/src/context/scan-admin/scan-helpers.ts +63 -0
- package/src/context/scan-admin/scan-reducer.ts +321 -0
- package/src/context/scan-admin/scan-types.ts +337 -0
- package/src/default/page-settings.tsx +3 -0
- package/src/default/theme.tsx +102 -13
- package/src/extension-registry-service.ts +372 -1
- package/src/extension-registry-types.ts +207 -0
- package/src/hooks/scan-admin/index.ts +48 -0
- package/src/hooks/scan-admin/use-auto-rejected-tab.ts +85 -0
- package/src/hooks/scan-admin/use-dialogs.ts +83 -0
- package/src/hooks/scan-admin/use-file-list-tab.ts +149 -0
- package/src/hooks/scan-admin/use-pagination.ts +90 -0
- package/src/hooks/scan-admin/use-quarantined-tab.ts +138 -0
- package/src/hooks/scan-admin/use-scan-card-state.ts +73 -0
- package/src/hooks/scan-admin/use-scan-filters.ts +83 -0
- package/src/hooks/scan-admin/use-scans-tab.ts +92 -0
- package/src/hooks/scan-admin/use-search.ts +54 -0
- package/src/hooks/scan-admin/use-tab-navigation.ts +82 -0
- package/src/hooks/scan-admin/use-url-sync.ts +293 -0
- package/src/page-settings.ts +4 -0
- package/src/pages/admin-dashboard/admin-dashboard.tsx +71 -4
- package/src/pages/admin-dashboard/components/data-grid-filter-operators.tsx +126 -0
- package/src/pages/admin-dashboard/components/index.ts +18 -0
- package/src/pages/admin-dashboard/customers/customer-form-dialog.tsx +348 -0
- package/src/pages/admin-dashboard/customers/customers.tsx +279 -0
- package/src/pages/admin-dashboard/customers/delete-customer-dialog.tsx +94 -0
- package/src/pages/admin-dashboard/publisher-admin.tsx +5 -5
- package/src/pages/admin-dashboard/publisher-revoke-dialog.tsx +2 -1
- package/src/pages/admin-dashboard/scan-admin.tsx +109 -0
- package/src/pages/admin-dashboard/tiers/delete-tier-dialog.tsx +83 -0
- package/src/pages/admin-dashboard/tiers/tier-form-dialog.tsx +372 -0
- package/src/pages/admin-dashboard/tiers/tiers.tsx +254 -0
- package/src/pages/admin-dashboard/usage-stats/usage-stats-chart.tsx +189 -0
- package/src/pages/admin-dashboard/usage-stats/usage-stats-search.tsx +83 -0
- package/src/pages/admin-dashboard/usage-stats/usage-stats-utils.ts +16 -0
- package/src/pages/admin-dashboard/usage-stats/usage-stats.tsx +127 -0
- package/src/pages/admin-dashboard/welcome.tsx +4 -0
- package/src/pages/extension-detail/extension-detail-overview.tsx +16 -2
- package/src/pages/extension-detail/extension-detail-reviews.tsx +116 -30
- package/src/pages/extension-detail/extension-detail.tsx +2 -2
- package/src/pages/extension-detail/extension-rating-stars.tsx +2 -2
- package/src/pages/extension-list/extension-list-item.tsx +2 -2
- package/src/pages/user/user-namespace-extension-list-item.tsx +38 -13
- package/src/pages/user/user-publisher-agreement.tsx +30 -11
- package/src/pages/user/user-settings-profile.tsx +10 -6
- package/src/pages/user/user-settings-tokens.tsx +15 -6
- package/src/server-request.ts +3 -3
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2026 Contributors to the Eclipse Foundation
|
|
3
|
+
*
|
|
4
|
+
* See the NOTICE file(s) distributed with this work for additional
|
|
5
|
+
* information regarding copyright ownership.
|
|
6
|
+
*
|
|
7
|
+
* This program and the accompanying materials are made available under the
|
|
8
|
+
* terms of the Eclipse Public License 2.0 which is available at
|
|
9
|
+
* https://www.eclipse.org/legal/epl-2.0
|
|
10
|
+
*
|
|
11
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
12
|
+
********************************************************************************/
|
|
13
|
+
|
|
14
|
+
import { useMemo } from 'react';
|
|
15
|
+
import { useScanContext } from '../../context/scan-admin';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Hook for managing scan filter state and actions.
|
|
19
|
+
* Provides access to global filters (date range, enforcement) and
|
|
20
|
+
* tab-specific filters (status, quarantine, threat scanner, validation type).
|
|
21
|
+
*/
|
|
22
|
+
export const useScanFilters = () => {
|
|
23
|
+
const { state, actions } = useScanContext();
|
|
24
|
+
|
|
25
|
+
// Global filters
|
|
26
|
+
const globalFilters = useMemo(() => ({
|
|
27
|
+
dateRange: state.dateRange,
|
|
28
|
+
enforcement: state.enforcement,
|
|
29
|
+
setDateRange: actions.setDateRange,
|
|
30
|
+
setEnforcement: actions.setEnforcement,
|
|
31
|
+
}), [state.dateRange, state.enforcement, actions]);
|
|
32
|
+
|
|
33
|
+
// Status filters (for Scans tab)
|
|
34
|
+
const statusFilters = useMemo(() => ({
|
|
35
|
+
filters: state.statusFilters,
|
|
36
|
+
toggle: actions.toggleStatusFilter,
|
|
37
|
+
menuAnchor: state.filterMenuAnchor,
|
|
38
|
+
openMenu: actions.openFilterMenu,
|
|
39
|
+
closeMenu: actions.closeFilterMenu,
|
|
40
|
+
}), [state.statusFilters, state.filterMenuAnchor, actions]);
|
|
41
|
+
|
|
42
|
+
// Quarantine filters (for Quarantined tab)
|
|
43
|
+
const quarantineFilters = useMemo(() => ({
|
|
44
|
+
filters: state.quarantineFilters,
|
|
45
|
+
toggle: actions.toggleQuarantineFilter,
|
|
46
|
+
threatScannerFilters: state.threatScannerFilters,
|
|
47
|
+
toggleThreatScanner: actions.toggleThreatScannerFilter,
|
|
48
|
+
availableThreatScanners: state.availableThreatScanners,
|
|
49
|
+
menuAnchor: state.quarantineFilterMenuAnchor,
|
|
50
|
+
openMenu: actions.openQuarantineFilterMenu,
|
|
51
|
+
closeMenu: actions.closeQuarantineFilterMenu,
|
|
52
|
+
}), [
|
|
53
|
+
state.quarantineFilters,
|
|
54
|
+
state.threatScannerFilters,
|
|
55
|
+
state.availableThreatScanners,
|
|
56
|
+
state.quarantineFilterMenuAnchor,
|
|
57
|
+
actions,
|
|
58
|
+
]);
|
|
59
|
+
|
|
60
|
+
// Validation type filters (for Auto Rejected tab)
|
|
61
|
+
const validationTypeFilters = useMemo(() => ({
|
|
62
|
+
filters: state.validationTypeFilters,
|
|
63
|
+
toggle: actions.toggleValidationTypeFilter,
|
|
64
|
+
availableValidationTypes: state.availableValidationTypes,
|
|
65
|
+
menuAnchor: state.autoRejectedFilterMenuAnchor,
|
|
66
|
+
openMenu: actions.openAutoRejectedFilterMenu,
|
|
67
|
+
closeMenu: actions.closeAutoRejectedFilterMenu,
|
|
68
|
+
}), [
|
|
69
|
+
state.validationTypeFilters,
|
|
70
|
+
state.availableValidationTypes,
|
|
71
|
+
state.autoRejectedFilterMenuAnchor,
|
|
72
|
+
actions,
|
|
73
|
+
]);
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
globalFilters,
|
|
77
|
+
statusFilters,
|
|
78
|
+
quarantineFilters,
|
|
79
|
+
validationTypeFilters,
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export type UseScanFiltersReturn = ReturnType<typeof useScanFilters>;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2026 Contributors to the Eclipse Foundation
|
|
3
|
+
*
|
|
4
|
+
* See the NOTICE file(s) distributed with this work for additional
|
|
5
|
+
* information regarding copyright ownership.
|
|
6
|
+
*
|
|
7
|
+
* This program and the accompanying materials are made available under the
|
|
8
|
+
* terms of the Eclipse Public License 2.0 which is available at
|
|
9
|
+
* https://www.eclipse.org/legal/epl-2.0
|
|
10
|
+
*
|
|
11
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
12
|
+
********************************************************************************/
|
|
13
|
+
|
|
14
|
+
import { useMemo } from 'react';
|
|
15
|
+
import { useScanContext } from '../../context/scan-admin';
|
|
16
|
+
import { useScanFilters } from './use-scan-filters';
|
|
17
|
+
import { usePagination } from './use-pagination';
|
|
18
|
+
import { useSearch } from './use-search';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Hook for the main Scans tab (tab index 0).
|
|
22
|
+
* Provides all data and actions needed for displaying scan overview.
|
|
23
|
+
*/
|
|
24
|
+
export const useScansTab = () => {
|
|
25
|
+
const { state, actions } = useScanContext();
|
|
26
|
+
const { globalFilters, statusFilters } = useScanFilters();
|
|
27
|
+
const pagination = usePagination();
|
|
28
|
+
const search = useSearch();
|
|
29
|
+
|
|
30
|
+
// Get scan counts for display
|
|
31
|
+
const counts = useMemo(() => {
|
|
32
|
+
if (!state.scanCounts) {
|
|
33
|
+
return {
|
|
34
|
+
started: 0,
|
|
35
|
+
validating: 0,
|
|
36
|
+
scanning: 0,
|
|
37
|
+
passed: 0,
|
|
38
|
+
quarantined: 0,
|
|
39
|
+
autoRejected: 0,
|
|
40
|
+
error: 0,
|
|
41
|
+
allowed: 0,
|
|
42
|
+
blocked: 0,
|
|
43
|
+
needsReview: 0,
|
|
44
|
+
total: 0,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
started: state.scanCounts.STARTED,
|
|
49
|
+
validating: state.scanCounts.VALIDATING,
|
|
50
|
+
scanning: state.scanCounts.SCANNING,
|
|
51
|
+
passed: state.scanCounts.PASSED,
|
|
52
|
+
quarantined: state.scanCounts.QUARANTINED,
|
|
53
|
+
autoRejected: state.scanCounts.AUTO_REJECTED,
|
|
54
|
+
error: state.scanCounts.ERROR,
|
|
55
|
+
allowed: state.scanCounts.ALLOWED,
|
|
56
|
+
blocked: state.scanCounts.BLOCKED,
|
|
57
|
+
needsReview: state.scanCounts.NEEDS_REVIEW,
|
|
58
|
+
// Total = sum of scan statuses only (ALLOWED/BLOCKED/NEEDS_REVIEW are admin decisions, not statuses)
|
|
59
|
+
total: state.scanCounts.STARTED + state.scanCounts.VALIDATING + state.scanCounts.SCANNING +
|
|
60
|
+
state.scanCounts.PASSED + state.scanCounts.QUARANTINED + state.scanCounts.AUTO_REJECTED +
|
|
61
|
+
state.scanCounts.ERROR,
|
|
62
|
+
};
|
|
63
|
+
}, [state.scanCounts]);
|
|
64
|
+
|
|
65
|
+
return useMemo(() => ({
|
|
66
|
+
tabIndex: 0,
|
|
67
|
+
tabName: 'Scans',
|
|
68
|
+
scans: state.scans,
|
|
69
|
+
isLoading: state.isLoadingScans,
|
|
70
|
+
lastRefreshed: state.lastRefreshed,
|
|
71
|
+
autoRefresh: state.autoRefresh,
|
|
72
|
+
onAutoRefreshChange: actions.setAutoRefresh,
|
|
73
|
+
counts,
|
|
74
|
+
search,
|
|
75
|
+
globalFilters,
|
|
76
|
+
statusFilters,
|
|
77
|
+
pagination,
|
|
78
|
+
}), [
|
|
79
|
+
state.scans,
|
|
80
|
+
state.isLoadingScans,
|
|
81
|
+
state.lastRefreshed,
|
|
82
|
+
state.autoRefresh,
|
|
83
|
+
actions.setAutoRefresh,
|
|
84
|
+
counts,
|
|
85
|
+
search,
|
|
86
|
+
globalFilters,
|
|
87
|
+
statusFilters,
|
|
88
|
+
pagination,
|
|
89
|
+
]);
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export type UseScansTabReturn = ReturnType<typeof useScansTab>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2026 Contributors to the Eclipse Foundation
|
|
3
|
+
*
|
|
4
|
+
* See the NOTICE file(s) distributed with this work for additional
|
|
5
|
+
* information regarding copyright ownership.
|
|
6
|
+
*
|
|
7
|
+
* This program and the accompanying materials are made available under the
|
|
8
|
+
* terms of the Eclipse Public License 2.0 which is available at
|
|
9
|
+
* https://www.eclipse.org/legal/epl-2.0
|
|
10
|
+
*
|
|
11
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
12
|
+
********************************************************************************/
|
|
13
|
+
|
|
14
|
+
import { useMemo, useCallback } from 'react';
|
|
15
|
+
import { useScanContext } from '../../context/scan-admin';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Hook for managing search state and actions.
|
|
19
|
+
* Provides publisher, namespace, and name search functionality.
|
|
20
|
+
*/
|
|
21
|
+
export const useSearch = () => {
|
|
22
|
+
const { state, actions, dispatch } = useScanContext();
|
|
23
|
+
|
|
24
|
+
const clearSearch = useCallback(() => {
|
|
25
|
+
dispatch({ type: 'CLEAR_SEARCH' });
|
|
26
|
+
}, [dispatch]);
|
|
27
|
+
|
|
28
|
+
const hasActiveSearch = useMemo(() => {
|
|
29
|
+
return !!(state.publisherQuery || state.namespaceQuery || state.nameQuery);
|
|
30
|
+
}, [state.publisherQuery, state.namespaceQuery, state.nameQuery]);
|
|
31
|
+
|
|
32
|
+
return useMemo(() => ({
|
|
33
|
+
publisherQuery: state.publisherQuery,
|
|
34
|
+
namespaceQuery: state.namespaceQuery,
|
|
35
|
+
nameQuery: state.nameQuery,
|
|
36
|
+
setPublisherQuery: actions.setPublisherQuery,
|
|
37
|
+
setNamespaceQuery: actions.setNamespaceQuery,
|
|
38
|
+
setNameQuery: actions.setNameQuery,
|
|
39
|
+
handlePublisherChange: actions.handlePublisherChange,
|
|
40
|
+
handleNamespaceChange: actions.handleNamespaceChange,
|
|
41
|
+
handleNameChange: actions.handleNameChange,
|
|
42
|
+
clearSearch,
|
|
43
|
+
hasActiveSearch,
|
|
44
|
+
}), [
|
|
45
|
+
state.publisherQuery,
|
|
46
|
+
state.namespaceQuery,
|
|
47
|
+
state.nameQuery,
|
|
48
|
+
actions,
|
|
49
|
+
clearSearch,
|
|
50
|
+
hasActiveSearch,
|
|
51
|
+
]);
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export type UseSearchReturn = ReturnType<typeof useSearch>;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2026 Contributors to the Eclipse Foundation
|
|
3
|
+
*
|
|
4
|
+
* See the NOTICE file(s) distributed with this work for additional
|
|
5
|
+
* information regarding copyright ownership.
|
|
6
|
+
*
|
|
7
|
+
* This program and the accompanying materials are made available under the
|
|
8
|
+
* terms of the Eclipse Public License 2.0 which is available at
|
|
9
|
+
* https://www.eclipse.org/legal/epl-2.0
|
|
10
|
+
*
|
|
11
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
12
|
+
********************************************************************************/
|
|
13
|
+
|
|
14
|
+
import { useMemo, useCallback } from 'react';
|
|
15
|
+
import { useScanContext } from '../../context/scan-admin';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Tab definitions for the Scans Admin page.
|
|
19
|
+
*/
|
|
20
|
+
export const TAB_DEFINITIONS = [
|
|
21
|
+
{ index: 0, name: 'Scans', path: 'scans' },
|
|
22
|
+
{ index: 1, name: 'Quarantined', path: 'quarantined' },
|
|
23
|
+
{ index: 2, name: 'Auto Rejected', path: 'auto-rejected' },
|
|
24
|
+
{ index: 3, name: 'Allowed Files', path: 'allowed-files' },
|
|
25
|
+
{ index: 4, name: 'Blocked Files', path: 'blocked-files' },
|
|
26
|
+
] as const;
|
|
27
|
+
|
|
28
|
+
export type TabIndex = 0 | 1 | 2 | 3 | 4;
|
|
29
|
+
export type TabName = typeof TAB_DEFINITIONS[number]['name'];
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Hook for managing tab navigation state and actions.
|
|
33
|
+
*/
|
|
34
|
+
export const useTabNavigation = () => {
|
|
35
|
+
const { state, actions } = useScanContext();
|
|
36
|
+
|
|
37
|
+
const setTab = useCallback((tab: number) => {
|
|
38
|
+
if (tab >= 0 && tab <= 4) {
|
|
39
|
+
actions.setTab(tab);
|
|
40
|
+
}
|
|
41
|
+
}, [actions]);
|
|
42
|
+
|
|
43
|
+
const currentTab = useMemo(() => {
|
|
44
|
+
return TAB_DEFINITIONS[state.selectedTab] || TAB_DEFINITIONS[0];
|
|
45
|
+
}, [state.selectedTab]);
|
|
46
|
+
|
|
47
|
+
const isScansTab = state.selectedTab === 0;
|
|
48
|
+
const isQuarantinedTab = state.selectedTab === 1;
|
|
49
|
+
const isAutoRejectedTab = state.selectedTab === 2;
|
|
50
|
+
const isAllowListTab = state.selectedTab === 3;
|
|
51
|
+
const isBlockListTab = state.selectedTab === 4;
|
|
52
|
+
|
|
53
|
+
const isScanDataTab = state.selectedTab <= 2;
|
|
54
|
+
const isFileDataTab = state.selectedTab >= 3;
|
|
55
|
+
|
|
56
|
+
return useMemo(() => ({
|
|
57
|
+
selectedTab: state.selectedTab,
|
|
58
|
+
currentTab,
|
|
59
|
+
tabs: TAB_DEFINITIONS,
|
|
60
|
+
setTab,
|
|
61
|
+
isScansTab,
|
|
62
|
+
isQuarantinedTab,
|
|
63
|
+
isAutoRejectedTab,
|
|
64
|
+
isAllowListTab,
|
|
65
|
+
isBlockListTab,
|
|
66
|
+
isScanDataTab,
|
|
67
|
+
isFileDataTab,
|
|
68
|
+
}), [
|
|
69
|
+
state.selectedTab,
|
|
70
|
+
currentTab,
|
|
71
|
+
setTab,
|
|
72
|
+
isScansTab,
|
|
73
|
+
isQuarantinedTab,
|
|
74
|
+
isAutoRejectedTab,
|
|
75
|
+
isAllowListTab,
|
|
76
|
+
isBlockListTab,
|
|
77
|
+
isScanDataTab,
|
|
78
|
+
isFileDataTab,
|
|
79
|
+
]);
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export type UseTabNavigationReturn = ReturnType<typeof useTabNavigation>;
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2026 Contributors to the Eclipse Foundation
|
|
3
|
+
*
|
|
4
|
+
* See the NOTICE file(s) distributed with this work for additional
|
|
5
|
+
* information regarding copyright ownership.
|
|
6
|
+
*
|
|
7
|
+
* This program and the accompanying materials are made available under the
|
|
8
|
+
* terms of the Eclipse Public License 2.0 which is available at
|
|
9
|
+
* https://www.eclipse.org/legal/epl-2.0
|
|
10
|
+
*
|
|
11
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
12
|
+
********************************************************************************/
|
|
13
|
+
|
|
14
|
+
import { useEffect, useRef, useCallback } from 'react';
|
|
15
|
+
import { useScanContext } from '../../context/scan-admin';
|
|
16
|
+
import { DateRangeType, EnforcementType } from '../../context/scan-admin/scan-types';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* URL parameter keys
|
|
20
|
+
*/
|
|
21
|
+
const URL_PARAMS = {
|
|
22
|
+
TAB: 'tab',
|
|
23
|
+
PAGE: 'page',
|
|
24
|
+
PUBLISHER: 'publisher',
|
|
25
|
+
NAMESPACE: 'namespace',
|
|
26
|
+
NAME: 'name',
|
|
27
|
+
DATE_RANGE: 'dateRange',
|
|
28
|
+
FILE_DATE_RANGE: 'fileDateRange',
|
|
29
|
+
ENFORCEMENT: 'enforcement',
|
|
30
|
+
// Checkbox filters
|
|
31
|
+
STATUS_FILTERS: 'status',
|
|
32
|
+
QUARANTINE_FILTERS: 'quarantine',
|
|
33
|
+
THREAT_SCANNER_FILTERS: 'threatScanner',
|
|
34
|
+
VALIDATION_TYPE_FILTERS: 'validationType',
|
|
35
|
+
} as const;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Tab name to index mapping
|
|
39
|
+
*/
|
|
40
|
+
const TAB_NAME_TO_INDEX: Record<string, number> = {
|
|
41
|
+
'scans': 0,
|
|
42
|
+
'quarantined': 1,
|
|
43
|
+
'auto-rejected': 2,
|
|
44
|
+
'allowed-files': 3,
|
|
45
|
+
'blocked-files': 4,
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const TAB_INDEX_TO_NAME: Record<number, string> = {
|
|
49
|
+
0: 'scans',
|
|
50
|
+
1: 'quarantined',
|
|
51
|
+
2: 'auto-rejected',
|
|
52
|
+
3: 'allowed-files',
|
|
53
|
+
4: 'blocked-files',
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Valid date range values
|
|
58
|
+
*/
|
|
59
|
+
const VALID_DATE_RANGES: DateRangeType[] = ['today', 'last7days', 'last30days', 'last90days', 'all'];
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Valid enforcement values
|
|
63
|
+
*/
|
|
64
|
+
const VALID_ENFORCEMENTS: EnforcementType[] = ['enforced', 'notEnforced', 'all'];
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Hook to sync scan admin state with URL parameters.
|
|
68
|
+
* This enables bookmarkable URLs and browser back/forward navigation.
|
|
69
|
+
*/
|
|
70
|
+
export const useUrlSync = () => {
|
|
71
|
+
const { state, dispatch } = useScanContext();
|
|
72
|
+
const isInitialized = useRef(false);
|
|
73
|
+
const isUpdatingFromUrl = useRef(false);
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Parse URL parameters and apply to state on initial load
|
|
77
|
+
*/
|
|
78
|
+
const initializeFromUrl = useCallback(() => {
|
|
79
|
+
const params = new URLSearchParams(window.location.search);
|
|
80
|
+
|
|
81
|
+
// Tab
|
|
82
|
+
const tabParam = params.get(URL_PARAMS.TAB);
|
|
83
|
+
if (tabParam && TAB_NAME_TO_INDEX[tabParam] !== undefined) {
|
|
84
|
+
dispatch({ type: 'SET_TAB', payload: TAB_NAME_TO_INDEX[tabParam] });
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Page (URL is 1-indexed, state is 0-indexed)
|
|
88
|
+
const pageParam = params.get(URL_PARAMS.PAGE);
|
|
89
|
+
if (pageParam) {
|
|
90
|
+
const page = parseInt(pageParam, 10);
|
|
91
|
+
if (!isNaN(page) && page >= 1) {
|
|
92
|
+
dispatch({ type: 'SET_PAGE', payload: page - 1 });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Search queries
|
|
97
|
+
const publisherParam = params.get(URL_PARAMS.PUBLISHER);
|
|
98
|
+
if (publisherParam) {
|
|
99
|
+
dispatch({ type: 'SET_PUBLISHER_QUERY', payload: publisherParam });
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const namespaceParam = params.get(URL_PARAMS.NAMESPACE);
|
|
103
|
+
if (namespaceParam) {
|
|
104
|
+
dispatch({ type: 'SET_NAMESPACE_QUERY', payload: namespaceParam });
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const nameParam = params.get(URL_PARAMS.NAME);
|
|
108
|
+
if (nameParam) {
|
|
109
|
+
dispatch({ type: 'SET_NAME_QUERY', payload: nameParam });
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Date range
|
|
113
|
+
const dateRangeParam = params.get(URL_PARAMS.DATE_RANGE);
|
|
114
|
+
if (dateRangeParam && VALID_DATE_RANGES.indexOf(dateRangeParam as DateRangeType) !== -1) {
|
|
115
|
+
dispatch({ type: 'SET_DATE_RANGE', payload: dateRangeParam as DateRangeType });
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// File date range
|
|
119
|
+
const fileDateRangeParam = params.get(URL_PARAMS.FILE_DATE_RANGE);
|
|
120
|
+
if (fileDateRangeParam && VALID_DATE_RANGES.indexOf(fileDateRangeParam as DateRangeType) !== -1) {
|
|
121
|
+
dispatch({ type: 'SET_FILE_DATE_RANGE', payload: fileDateRangeParam as DateRangeType });
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Enforcement
|
|
125
|
+
const enforcementParam = params.get(URL_PARAMS.ENFORCEMENT);
|
|
126
|
+
if (enforcementParam && VALID_ENFORCEMENTS.indexOf(enforcementParam as EnforcementType) !== -1) {
|
|
127
|
+
dispatch({ type: 'SET_ENFORCEMENT', payload: enforcementParam as EnforcementType });
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Status filters (comma-separated)
|
|
131
|
+
const statusFiltersParam = params.get(URL_PARAMS.STATUS_FILTERS);
|
|
132
|
+
if (statusFiltersParam) {
|
|
133
|
+
const filters = new Set(statusFiltersParam.split(',').filter(Boolean));
|
|
134
|
+
if (filters.size > 0) {
|
|
135
|
+
dispatch({ type: 'SET_STATUS_FILTERS', payload: filters });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Quarantine filters (comma-separated)
|
|
140
|
+
const quarantineFiltersParam = params.get(URL_PARAMS.QUARANTINE_FILTERS);
|
|
141
|
+
if (quarantineFiltersParam) {
|
|
142
|
+
const filters = new Set(quarantineFiltersParam.split(',').filter(Boolean));
|
|
143
|
+
if (filters.size > 0) {
|
|
144
|
+
dispatch({ type: 'SET_QUARANTINE_FILTERS', payload: filters });
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Threat scanner filters (comma-separated)
|
|
149
|
+
const threatScannerFiltersParam = params.get(URL_PARAMS.THREAT_SCANNER_FILTERS);
|
|
150
|
+
if (threatScannerFiltersParam) {
|
|
151
|
+
const filters = new Set(threatScannerFiltersParam.split(',').filter(Boolean));
|
|
152
|
+
if (filters.size > 0) {
|
|
153
|
+
dispatch({ type: 'SET_THREAT_SCANNER_FILTERS', payload: filters });
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Validation type filters (comma-separated)
|
|
158
|
+
const validationTypeFiltersParam = params.get(URL_PARAMS.VALIDATION_TYPE_FILTERS);
|
|
159
|
+
if (validationTypeFiltersParam) {
|
|
160
|
+
const filters = new Set(validationTypeFiltersParam.split(',').filter(Boolean));
|
|
161
|
+
if (filters.size > 0) {
|
|
162
|
+
dispatch({ type: 'SET_VALIDATION_TYPE_FILTERS', payload: filters });
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}, [dispatch]);
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Update URL parameters from state
|
|
169
|
+
*/
|
|
170
|
+
const updateUrlFromState = useCallback(() => {
|
|
171
|
+
if (isUpdatingFromUrl.current) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const params = new URLSearchParams();
|
|
176
|
+
|
|
177
|
+
// Tab (only add if not default)
|
|
178
|
+
if (state.selectedTab !== 0) {
|
|
179
|
+
params.set(URL_PARAMS.TAB, TAB_INDEX_TO_NAME[state.selectedTab] || 'scans');
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Page (only add if not first page, URL is 1-indexed)
|
|
183
|
+
if (state.currentPage > 0) {
|
|
184
|
+
params.set(URL_PARAMS.PAGE, String(state.currentPage + 1));
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Search queries (only add if not empty)
|
|
188
|
+
if (state.publisherQuery) {
|
|
189
|
+
params.set(URL_PARAMS.PUBLISHER, state.publisherQuery);
|
|
190
|
+
}
|
|
191
|
+
if (state.namespaceQuery) {
|
|
192
|
+
params.set(URL_PARAMS.NAMESPACE, state.namespaceQuery);
|
|
193
|
+
}
|
|
194
|
+
if (state.nameQuery) {
|
|
195
|
+
params.set(URL_PARAMS.NAME, state.nameQuery);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Date range (only add if not default)
|
|
199
|
+
if (state.dateRange !== 'all') {
|
|
200
|
+
params.set(URL_PARAMS.DATE_RANGE, state.dateRange);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// File date range (only add if not default)
|
|
204
|
+
if (state.fileDateRange !== 'all') {
|
|
205
|
+
params.set(URL_PARAMS.FILE_DATE_RANGE, state.fileDateRange);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Enforcement (only add if not tab-specific default)
|
|
209
|
+
// Tabs 1 (Quarantined) and 2 (Auto Rejected) default to 'enforced', others default to 'all'
|
|
210
|
+
const defaultEnforcement = (state.selectedTab === 1 || state.selectedTab === 2) ? 'enforced' : 'all';
|
|
211
|
+
if (state.enforcement !== defaultEnforcement) {
|
|
212
|
+
params.set(URL_PARAMS.ENFORCEMENT, state.enforcement);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Status filters (only add if any are selected)
|
|
216
|
+
if (state.statusFilters.size > 0) {
|
|
217
|
+
params.set(URL_PARAMS.STATUS_FILTERS, Array.from(state.statusFilters).join(','));
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Quarantine filters (only add if any are selected - default is empty)
|
|
221
|
+
if (state.quarantineFilters.size > 0) {
|
|
222
|
+
params.set(URL_PARAMS.QUARANTINE_FILTERS, Array.from(state.quarantineFilters).join(','));
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Threat scanner filters (only add if any are selected)
|
|
226
|
+
if (state.threatScannerFilters.size > 0) {
|
|
227
|
+
params.set(URL_PARAMS.THREAT_SCANNER_FILTERS, Array.from(state.threatScannerFilters).join(','));
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Validation type filters (only add if any are selected)
|
|
231
|
+
if (state.validationTypeFilters.size > 0) {
|
|
232
|
+
params.set(URL_PARAMS.VALIDATION_TYPE_FILTERS, Array.from(state.validationTypeFilters).join(','));
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Build new URL
|
|
236
|
+
const newSearch = params.toString();
|
|
237
|
+
const newUrl = newSearch
|
|
238
|
+
? `${window.location.pathname}?${newSearch}`
|
|
239
|
+
: window.location.pathname;
|
|
240
|
+
|
|
241
|
+
// Update URL without triggering a page reload
|
|
242
|
+
if (window.location.search !== (newSearch ? `?${newSearch}` : '')) {
|
|
243
|
+
window.history.replaceState(null, '', newUrl);
|
|
244
|
+
}
|
|
245
|
+
}, [state.selectedTab, state.currentPage, state.publisherQuery, state.namespaceQuery, state.nameQuery, state.dateRange, state.fileDateRange, state.enforcement, state.statusFilters, state.quarantineFilters, state.threatScannerFilters, state.validationTypeFilters]);
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Handle browser back/forward navigation
|
|
249
|
+
*/
|
|
250
|
+
const handlePopState = useCallback(() => {
|
|
251
|
+
isUpdatingFromUrl.current = true;
|
|
252
|
+
initializeFromUrl();
|
|
253
|
+
// Reset the flag after a short delay to allow state to settle
|
|
254
|
+
setTimeout(() => {
|
|
255
|
+
isUpdatingFromUrl.current = false;
|
|
256
|
+
}, 100);
|
|
257
|
+
}, [initializeFromUrl]);
|
|
258
|
+
|
|
259
|
+
// Initialize from URL on mount
|
|
260
|
+
useEffect(() => {
|
|
261
|
+
if (!isInitialized.current) {
|
|
262
|
+
isInitialized.current = true;
|
|
263
|
+
isUpdatingFromUrl.current = true;
|
|
264
|
+
initializeFromUrl();
|
|
265
|
+
// Reset the flag after initialization
|
|
266
|
+
setTimeout(() => {
|
|
267
|
+
isUpdatingFromUrl.current = false;
|
|
268
|
+
}, 100);
|
|
269
|
+
}
|
|
270
|
+
}, [initializeFromUrl]);
|
|
271
|
+
|
|
272
|
+
// Update URL when state changes
|
|
273
|
+
useEffect(() => {
|
|
274
|
+
if (isInitialized.current) {
|
|
275
|
+
updateUrlFromState();
|
|
276
|
+
}
|
|
277
|
+
}, [updateUrlFromState]);
|
|
278
|
+
|
|
279
|
+
// Listen for browser back/forward
|
|
280
|
+
useEffect(() => {
|
|
281
|
+
window.addEventListener('popstate', handlePopState);
|
|
282
|
+
return () => {
|
|
283
|
+
window.removeEventListener('popstate', handlePopState);
|
|
284
|
+
};
|
|
285
|
+
}, [handlePopState]);
|
|
286
|
+
|
|
287
|
+
return {
|
|
288
|
+
initializeFromUrl,
|
|
289
|
+
updateUrlFromState,
|
|
290
|
+
};
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
export type UseUrlSyncReturn = ReturnType<typeof useUrlSync>;
|
package/src/page-settings.ts
CHANGED
|
@@ -16,6 +16,10 @@ import { Cookie } from './utils';
|
|
|
16
16
|
export interface PageSettings {
|
|
17
17
|
pageTitle: string;
|
|
18
18
|
themeType?: 'light' | 'dark';
|
|
19
|
+
publisherAgreement?: {
|
|
20
|
+
name?: string;
|
|
21
|
+
email?: string;
|
|
22
|
+
};
|
|
19
23
|
elements: {
|
|
20
24
|
toolbarContent?: ComponentType;
|
|
21
25
|
defaultMenuContent?: ComponentType;
|