openvsx-webui-test 0.17.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/LICENSE +277 -0
- package/lib/components/banner.d.ts +21 -0
- package/lib/components/banner.d.ts.map +1 -0
- package/lib/components/banner.js +41 -0
- package/lib/components/banner.js.map +1 -0
- package/lib/components/button-with-progress.d.ts +21 -0
- package/lib/components/button-with-progress.d.ts.map +1 -0
- package/lib/components/button-with-progress.js +26 -0
- package/lib/components/button-with-progress.js.map +1 -0
- package/lib/components/copy-to-clipboard.d.ts +21 -0
- package/lib/components/copy-to-clipboard.d.ts.map +1 -0
- package/lib/components/copy-to-clipboard.js +25 -0
- package/lib/components/copy-to-clipboard.js.map +1 -0
- package/lib/components/delayed-load-indicator.d.ts +17 -0
- package/lib/components/delayed-load-indicator.d.ts.map +1 -0
- package/lib/components/delayed-load-indicator.js +40 -0
- package/lib/components/delayed-load-indicator.js.map +1 -0
- package/lib/components/error-dialog.d.ts +18 -0
- package/lib/components/error-dialog.d.ts.map +1 -0
- package/lib/components/error-dialog.js +65 -0
- package/lib/components/error-dialog.js.map +1 -0
- package/lib/components/hover-popover.d.ts +17 -0
- package/lib/components/hover-popover.d.ts.map +1 -0
- package/lib/components/hover-popover.js +24 -0
- package/lib/components/hover-popover.js.map +1 -0
- package/lib/components/info-dialog.d.ts +17 -0
- package/lib/components/info-dialog.d.ts.map +1 -0
- package/lib/components/info-dialog.js +29 -0
- package/lib/components/info-dialog.js.map +1 -0
- package/lib/components/link-icon.d.ts +16 -0
- package/lib/components/link-icon.d.ts.map +1 -0
- package/lib/components/link-icon.js +13 -0
- package/lib/components/link-icon.js.map +1 -0
- package/lib/components/sanitized-markdown.d.ts +17 -0
- package/lib/components/sanitized-markdown.d.ts.map +1 -0
- package/lib/components/sanitized-markdown.js +106 -0
- package/lib/components/sanitized-markdown.js.map +1 -0
- package/lib/components/sidepanel/navigation-item.d.ts +19 -0
- package/lib/components/sidepanel/navigation-item.d.ts.map +1 -0
- package/lib/components/sidepanel/navigation-item.js +36 -0
- package/lib/components/sidepanel/navigation-item.js.map +1 -0
- package/lib/components/sidepanel/sidepanel.d.ts +12 -0
- package/lib/components/sidepanel/sidepanel.d.ts.map +1 -0
- package/lib/components/sidepanel/sidepanel.js +27 -0
- package/lib/components/sidepanel/sidepanel.js.map +1 -0
- package/lib/components/text-divider.d.ts +16 -0
- package/lib/components/text-divider.d.ts.map +1 -0
- package/lib/components/text-divider.js +20 -0
- package/lib/components/text-divider.js.map +1 -0
- package/lib/components/timestamp.d.ts +17 -0
- package/lib/components/timestamp.d.ts.map +1 -0
- package/lib/components/timestamp.js +19 -0
- package/lib/components/timestamp.js.map +1 -0
- package/lib/context.d.ts +24 -0
- package/lib/context.d.ts.map +1 -0
- package/lib/context.js +13 -0
- package/lib/context.js.map +1 -0
- package/lib/default/about.d.ts +13 -0
- package/lib/default/about.d.ts.map +1 -0
- package/lib/default/about.js +30 -0
- package/lib/default/about.js.map +1 -0
- package/lib/default/default-app.d.ts +11 -0
- package/lib/default/default-app.d.ts.map +1 -0
- package/lib/default/default-app.js +71 -0
- package/lib/default/default-app.js.map +1 -0
- package/lib/default/login.d.ts +16 -0
- package/lib/default/login.d.ts.map +1 -0
- package/lib/default/login.js +28 -0
- package/lib/default/login.js.map +1 -0
- package/lib/default/menu-content.d.ts +43 -0
- package/lib/default/menu-content.d.ts.map +1 -0
- package/lib/default/menu-content.js +156 -0
- package/lib/default/menu-content.js.map +1 -0
- package/lib/default/openvsx-registry-logo.d.ts +18 -0
- package/lib/default/openvsx-registry-logo.d.ts.map +1 -0
- package/lib/default/openvsx-registry-logo.js +18 -0
- package/lib/default/openvsx-registry-logo.js.map +1 -0
- package/lib/default/page-settings.d.ts +12 -0
- package/lib/default/page-settings.d.ts.map +1 -0
- package/lib/default/page-settings.js +110 -0
- package/lib/default/page-settings.js.map +1 -0
- package/lib/default/server.d.ts +11 -0
- package/lib/default/server.d.ts.map +1 -0
- package/lib/default/server.js +50 -0
- package/lib/default/server.js.map +1 -0
- package/lib/default/theme.d.ts +29 -0
- package/lib/default/theme.d.ts.map +1 -0
- package/lib/default/theme.js +40 -0
- package/lib/default/theme.js.map +1 -0
- package/lib/extension-registry-service.d.ts +115 -0
- package/lib/extension-registry-service.d.ts.map +1 -0
- package/lib/extension-registry-service.js +571 -0
- package/lib/extension-registry-service.js.map +1 -0
- package/lib/extension-registry-types.d.ts +215 -0
- package/lib/extension-registry-types.d.ts.map +1 -0
- package/lib/extension-registry-types.js +20 -0
- package/lib/extension-registry-types.js.map +1 -0
- package/lib/header-menu.d.ts +16 -0
- package/lib/header-menu.d.ts.map +1 -0
- package/lib/header-menu.js +48 -0
- package/lib/header-menu.js.map +1 -0
- package/lib/index.d.ts +18 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +18 -0
- package/lib/index.js.map +1 -0
- package/lib/main.d.ts +20 -0
- package/lib/main.d.ts.map +1 -0
- package/lib/main.js +112 -0
- package/lib/main.js.map +1 -0
- package/lib/not-found.d.ts +3 -0
- package/lib/not-found.d.ts.map +1 -0
- package/lib/not-found.js +10 -0
- package/lib/not-found.js.map +1 -0
- package/lib/other-pages.d.ts +8 -0
- package/lib/other-pages.d.ts.map +1 -0
- package/lib/other-pages.js +94 -0
- package/lib/other-pages.js.map +1 -0
- package/lib/page-settings.d.ts +71 -0
- package/lib/page-settings.d.ts.map +1 -0
- package/lib/page-settings.js +11 -0
- package/lib/page-settings.js.map +1 -0
- package/lib/pages/admin-dashboard/admin-dashboard.d.ts +22 -0
- package/lib/pages/admin-dashboard/admin-dashboard.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/admin-dashboard.js +75 -0
- package/lib/pages/admin-dashboard/admin-dashboard.js.map +1 -0
- package/lib/pages/admin-dashboard/extension-admin.d.ts +12 -0
- package/lib/pages/admin-dashboard/extension-admin.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/extension-admin.js +98 -0
- package/lib/pages/admin-dashboard/extension-admin.js.map +1 -0
- package/lib/pages/admin-dashboard/extension-remove-dialog.d.ts +18 -0
- package/lib/pages/admin-dashboard/extension-remove-dialog.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/extension-remove-dialog.js +73 -0
- package/lib/pages/admin-dashboard/extension-remove-dialog.js.map +1 -0
- package/lib/pages/admin-dashboard/extension-version-container.d.ts +17 -0
- package/lib/pages/admin-dashboard/extension-version-container.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/extension-version-container.js +136 -0
- package/lib/pages/admin-dashboard/extension-version-container.js.map +1 -0
- package/lib/pages/admin-dashboard/namespace-admin.d.ts +12 -0
- package/lib/pages/admin-dashboard/namespace-admin.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/namespace-admin.js +103 -0
- package/lib/pages/admin-dashboard/namespace-admin.js.map +1 -0
- package/lib/pages/admin-dashboard/namespace-change-dialog.d.ts +19 -0
- package/lib/pages/admin-dashboard/namespace-change-dialog.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/namespace-change-dialog.js +99 -0
- package/lib/pages/admin-dashboard/namespace-change-dialog.js.map +1 -0
- package/lib/pages/admin-dashboard/namespace-input.d.ts +21 -0
- package/lib/pages/admin-dashboard/namespace-input.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/namespace-input.js +53 -0
- package/lib/pages/admin-dashboard/namespace-input.js.map +1 -0
- package/lib/pages/admin-dashboard/publisher-admin.d.ts +15 -0
- package/lib/pages/admin-dashboard/publisher-admin.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/publisher-admin.js +84 -0
- package/lib/pages/admin-dashboard/publisher-admin.js.map +1 -0
- package/lib/pages/admin-dashboard/publisher-details.d.ts +17 -0
- package/lib/pages/admin-dashboard/publisher-details.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/publisher-details.js +36 -0
- package/lib/pages/admin-dashboard/publisher-details.js.map +1 -0
- package/lib/pages/admin-dashboard/publisher-revoke-dialog.d.ts +16 -0
- package/lib/pages/admin-dashboard/publisher-revoke-dialog.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/publisher-revoke-dialog.js +105 -0
- package/lib/pages/admin-dashboard/publisher-revoke-dialog.js.map +1 -0
- package/lib/pages/admin-dashboard/publisher-revoke-tokens-button.d.ts +16 -0
- package/lib/pages/admin-dashboard/publisher-revoke-tokens-button.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/publisher-revoke-tokens-button.js +55 -0
- package/lib/pages/admin-dashboard/publisher-revoke-tokens-button.js.map +1 -0
- package/lib/pages/admin-dashboard/search-list-container.d.ts +17 -0
- package/lib/pages/admin-dashboard/search-list-container.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/search-list-container.js +24 -0
- package/lib/pages/admin-dashboard/search-list-container.js.map +1 -0
- package/lib/pages/admin-dashboard/welcome.d.ts +12 -0
- package/lib/pages/admin-dashboard/welcome.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/welcome.js +42 -0
- package/lib/pages/admin-dashboard/welcome.js.map +1 -0
- package/lib/pages/extension-detail/extension-detail-changes.d.ts +16 -0
- package/lib/pages/extension-detail/extension-detail-changes.d.ts.map +1 -0
- package/lib/pages/extension-detail/extension-detail-changes.js +91 -0
- package/lib/pages/extension-detail/extension-detail-changes.js.map +1 -0
- package/lib/pages/extension-detail/extension-detail-downloads-menu.d.ts +18 -0
- package/lib/pages/extension-detail/extension-detail-downloads-menu.d.ts.map +1 -0
- package/lib/pages/extension-detail/extension-detail-downloads-menu.js +30 -0
- package/lib/pages/extension-detail/extension-detail-downloads-menu.js.map +1 -0
- package/lib/pages/extension-detail/extension-detail-overview.d.ts +17 -0
- package/lib/pages/extension-detail/extension-detail-overview.d.ts.map +1 -0
- package/lib/pages/extension-detail/extension-detail-overview.js +296 -0
- package/lib/pages/extension-detail/extension-detail-overview.js.map +1 -0
- package/lib/pages/extension-detail/extension-detail-reviews.d.ts +17 -0
- package/lib/pages/extension-detail/extension-detail-reviews.d.ts.map +1 -0
- package/lib/pages/extension-detail/extension-detail-reviews.js +136 -0
- package/lib/pages/extension-detail/extension-detail-reviews.js.map +1 -0
- package/lib/pages/extension-detail/extension-detail.d.ts +31 -0
- package/lib/pages/extension-detail/extension-detail.d.ts.map +1 -0
- package/lib/pages/extension-detail/extension-detail.js +378 -0
- package/lib/pages/extension-detail/extension-detail.js.map +1 -0
- package/lib/pages/extension-detail/extension-rating-star-setter.d.ts +15 -0
- package/lib/pages/extension-detail/extension-rating-star-setter.d.ts.map +1 -0
- package/lib/pages/extension-detail/extension-rating-star-setter.js +32 -0
- package/lib/pages/extension-detail/extension-rating-star-setter.js.map +1 -0
- package/lib/pages/extension-detail/extension-rating-stars.d.ts +16 -0
- package/lib/pages/extension-detail/extension-rating-stars.d.ts.map +1 -0
- package/lib/pages/extension-detail/extension-rating-stars.js +31 -0
- package/lib/pages/extension-detail/extension-rating-stars.js.map +1 -0
- package/lib/pages/extension-detail/extension-review-dialog.d.ts +18 -0
- package/lib/pages/extension-detail/extension-review-dialog.d.ts.map +1 -0
- package/lib/pages/extension-detail/extension-review-dialog.js +100 -0
- package/lib/pages/extension-detail/extension-review-dialog.js.map +1 -0
- package/lib/pages/extension-list/extension-list-container.d.ts +15 -0
- package/lib/pages/extension-list/extension-list-container.d.ts.map +1 -0
- package/lib/pages/extension-list/extension-list-container.js +79 -0
- package/lib/pages/extension-list/extension-list-container.js.map +1 -0
- package/lib/pages/extension-list/extension-list-header.d.ts +25 -0
- package/lib/pages/extension-list/extension-list-header.d.ts.map +1 -0
- package/lib/pages/extension-list/extension-list-header.js +148 -0
- package/lib/pages/extension-list/extension-list-header.js.map +1 -0
- package/lib/pages/extension-list/extension-list-item.d.ts +18 -0
- package/lib/pages/extension-list/extension-list-item.d.ts.map +1 -0
- package/lib/pages/extension-list/extension-list-item.js +89 -0
- package/lib/pages/extension-list/extension-list-item.js.map +1 -0
- package/lib/pages/extension-list/extension-list-searchfield.d.ts +22 -0
- package/lib/pages/extension-list/extension-list-searchfield.d.ts.map +1 -0
- package/lib/pages/extension-list/extension-list-searchfield.js +54 -0
- package/lib/pages/extension-list/extension-list-searchfield.js.map +1 -0
- package/lib/pages/extension-list/extension-list.d.ts +18 -0
- package/lib/pages/extension-list/extension-list.d.ts.map +1 -0
- package/lib/pages/extension-list/extension-list.js +141 -0
- package/lib/pages/extension-list/extension-list.js.map +1 -0
- package/lib/pages/namespace-detail/namespace-detail.d.ts +19 -0
- package/lib/pages/namespace-detail/namespace-detail.d.ts.map +1 -0
- package/lib/pages/namespace-detail/namespace-detail.js +175 -0
- package/lib/pages/namespace-detail/namespace-detail.js.map +1 -0
- package/lib/pages/user/add-namespace-member-dialog.d.ts +22 -0
- package/lib/pages/user/add-namespace-member-dialog.d.ts.map +1 -0
- package/lib/pages/user/add-namespace-member-dialog.js +114 -0
- package/lib/pages/user/add-namespace-member-dialog.js.map +1 -0
- package/lib/pages/user/avatar.d.ts +12 -0
- package/lib/pages/user/avatar.d.ts.map +1 -0
- package/lib/pages/user/avatar.js +59 -0
- package/lib/pages/user/avatar.js.map +1 -0
- package/lib/pages/user/create-namespace-dialog.d.ts +15 -0
- package/lib/pages/user/create-namespace-dialog.d.ts.map +1 -0
- package/lib/pages/user/create-namespace-dialog.js +90 -0
- package/lib/pages/user/create-namespace-dialog.js.map +1 -0
- package/lib/pages/user/generate-token-dialog.d.ts +15 -0
- package/lib/pages/user/generate-token-dialog.d.ts.map +1 -0
- package/lib/pages/user/generate-token-dialog.js +101 -0
- package/lib/pages/user/generate-token-dialog.js.map +1 -0
- package/lib/pages/user/logout.d.ts +12 -0
- package/lib/pages/user/logout.d.ts.map +1 -0
- package/lib/pages/user/logout.js +55 -0
- package/lib/pages/user/logout.js.map +1 -0
- package/lib/pages/user/publish-extension-dialog.d.ts +15 -0
- package/lib/pages/user/publish-extension-dialog.d.ts.map +1 -0
- package/lib/pages/user/publish-extension-dialog.js +202 -0
- package/lib/pages/user/publish-extension-dialog.js.map +1 -0
- package/lib/pages/user/user-extension-list.d.ts +19 -0
- package/lib/pages/user/user-extension-list.d.ts.map +1 -0
- package/lib/pages/user/user-extension-list.js +26 -0
- package/lib/pages/user/user-extension-list.js.map +1 -0
- package/lib/pages/user/user-namespace-details.d.ts +16 -0
- package/lib/pages/user/user-namespace-details.d.ts.map +1 -0
- package/lib/pages/user/user-namespace-details.js +473 -0
- package/lib/pages/user/user-namespace-details.js.map +1 -0
- package/lib/pages/user/user-namespace-extension-list-item.d.ts +17 -0
- package/lib/pages/user/user-namespace-extension-list-item.d.ts.map +1 -0
- package/lib/pages/user/user-namespace-extension-list-item.js +100 -0
- package/lib/pages/user/user-namespace-extension-list-item.js.map +1 -0
- package/lib/pages/user/user-namespace-extension-list.d.ts +16 -0
- package/lib/pages/user/user-namespace-extension-list.d.ts.map +1 -0
- package/lib/pages/user/user-namespace-extension-list.js +65 -0
- package/lib/pages/user/user-namespace-extension-list.js.map +1 -0
- package/lib/pages/user/user-namespace-member-component.d.ts +20 -0
- package/lib/pages/user/user-namespace-member-component.d.ts.map +1 -0
- package/lib/pages/user/user-namespace-member-component.js +54 -0
- package/lib/pages/user/user-namespace-member-component.js.map +1 -0
- package/lib/pages/user/user-namespace-member-list.d.ts +19 -0
- package/lib/pages/user/user-namespace-member-list.d.ts.map +1 -0
- package/lib/pages/user/user-namespace-member-list.js +89 -0
- package/lib/pages/user/user-namespace-member-list.js.map +1 -0
- package/lib/pages/user/user-publisher-agreement.d.ts +16 -0
- package/lib/pages/user/user-publisher-agreement.d.ts.map +1 -0
- package/lib/pages/user/user-publisher-agreement.js +129 -0
- package/lib/pages/user/user-publisher-agreement.js.map +1 -0
- package/lib/pages/user/user-setting-tabs.d.ts +12 -0
- package/lib/pages/user/user-setting-tabs.d.ts.map +1 -0
- package/lib/pages/user/user-setting-tabs.js +33 -0
- package/lib/pages/user/user-setting-tabs.js.map +1 -0
- package/lib/pages/user/user-settings-delete-extension.d.ts +16 -0
- package/lib/pages/user/user-settings-delete-extension.d.ts.map +1 -0
- package/lib/pages/user/user-settings-delete-extension.js +75 -0
- package/lib/pages/user/user-settings-delete-extension.js.map +1 -0
- package/lib/pages/user/user-settings-extensions.d.ts +12 -0
- package/lib/pages/user/user-settings-extensions.d.ts.map +1 -0
- package/lib/pages/user/user-settings-extensions.js +81 -0
- package/lib/pages/user/user-settings-extensions.js.map +1 -0
- package/lib/pages/user/user-settings-namespace-detail.d.ts +25 -0
- package/lib/pages/user/user-settings-namespace-detail.d.ts.map +1 -0
- package/lib/pages/user/user-settings-namespace-detail.js +105 -0
- package/lib/pages/user/user-settings-namespace-detail.js.map +1 -0
- package/lib/pages/user/user-settings-namespaces.d.ts +12 -0
- package/lib/pages/user/user-settings-namespaces.d.ts.map +1 -0
- package/lib/pages/user/user-settings-namespaces.js +112 -0
- package/lib/pages/user/user-settings-namespaces.js.map +1 -0
- package/lib/pages/user/user-settings-profile.d.ts +17 -0
- package/lib/pages/user/user-settings-profile.d.ts.map +1 -0
- package/lib/pages/user/user-settings-profile.js +79 -0
- package/lib/pages/user/user-settings-profile.js.map +1 -0
- package/lib/pages/user/user-settings-tokens.d.ts +19 -0
- package/lib/pages/user/user-settings-tokens.d.ts.map +1 -0
- package/lib/pages/user/user-settings-tokens.js +153 -0
- package/lib/pages/user/user-settings-tokens.js.map +1 -0
- package/lib/pages/user/user-settings.d.ts +24 -0
- package/lib/pages/user/user-settings.d.ts.map +1 -0
- package/lib/pages/user/user-settings.js +90 -0
- package/lib/pages/user/user-settings.js.map +1 -0
- package/lib/server-request.d.ts +19 -0
- package/lib/server-request.d.ts.map +1 -0
- package/lib/server-request.js +88 -0
- package/lib/server-request.js.map +1 -0
- package/lib/utils.d.ts +44 -0
- package/lib/utils.d.ts.map +1 -0
- package/lib/utils.js +203 -0
- package/lib/utils.js.map +1 -0
- package/package.json +122 -0
- package/src/components/banner.tsx +69 -0
- package/src/components/button-with-progress.tsx +51 -0
- package/src/components/copy-to-clipboard.tsx +49 -0
- package/src/components/delayed-load-indicator.tsx +50 -0
- package/src/components/error-dialog.tsx +96 -0
- package/src/components/hover-popover.tsx +50 -0
- package/src/components/info-dialog.tsx +48 -0
- package/src/components/link-icon.ts +13 -0
- package/src/components/sanitized-markdown.tsx +119 -0
- package/src/components/sidepanel/navigation-item.tsx +54 -0
- package/src/components/sidepanel/sidepanel.tsx +38 -0
- package/src/components/text-divider.tsx +29 -0
- package/src/components/timestamp.tsx +30 -0
- package/src/context.ts +27 -0
- package/src/default/about.tsx +36 -0
- package/src/default/default-app.tsx +75 -0
- package/src/default/login.tsx +43 -0
- package/src/default/menu-content.tsx +252 -0
- package/src/default/openvsx-registry-logo.tsx +29 -0
- package/src/default/page-settings.tsx +135 -0
- package/src/default/server.ts +56 -0
- package/src/default/theme.tsx +58 -0
- package/src/extension-registry-service.ts +605 -0
- package/src/extension-registry-types.ts +260 -0
- package/src/header-menu.tsx +69 -0
- package/src/index.ts +18 -0
- package/src/main.css +26 -0
- package/src/main.tsx +135 -0
- package/src/not-found.tsx +12 -0
- package/src/other-pages.tsx +134 -0
- package/src/page-settings.ts +55 -0
- package/src/pages/admin-dashboard/admin-dashboard.tsx +91 -0
- package/src/pages/admin-dashboard/extension-admin.tsx +117 -0
- package/src/pages/admin-dashboard/extension-remove-dialog.tsx +96 -0
- package/src/pages/admin-dashboard/extension-version-container.tsx +187 -0
- package/src/pages/admin-dashboard/namespace-admin.tsx +112 -0
- package/src/pages/admin-dashboard/namespace-change-dialog.tsx +132 -0
- package/src/pages/admin-dashboard/namespace-input.tsx +82 -0
- package/src/pages/admin-dashboard/publisher-admin.tsx +86 -0
- package/src/pages/admin-dashboard/publisher-details.tsx +46 -0
- package/src/pages/admin-dashboard/publisher-revoke-dialog.tsx +130 -0
- package/src/pages/admin-dashboard/publisher-revoke-tokens-button.tsx +58 -0
- package/src/pages/admin-dashboard/search-list-container.tsx +39 -0
- package/src/pages/admin-dashboard/welcome.tsx +57 -0
- package/src/pages/extension-detail/extension-detail-changes.tsx +102 -0
- package/src/pages/extension-detail/extension-detail-downloads-menu.tsx +62 -0
- package/src/pages/extension-detail/extension-detail-overview.tsx +395 -0
- package/src/pages/extension-detail/extension-detail-reviews.tsx +176 -0
- package/src/pages/extension-detail/extension-detail.tsx +496 -0
- package/src/pages/extension-detail/extension-rating-star-setter.tsx +44 -0
- package/src/pages/extension-detail/extension-rating-stars.tsx +38 -0
- package/src/pages/extension-detail/extension-review-dialog.tsx +130 -0
- package/src/pages/extension-list/extension-list-container.tsx +106 -0
- package/src/pages/extension-list/extension-list-header.tsx +209 -0
- package/src/pages/extension-list/extension-list-item.tsx +109 -0
- package/src/pages/extension-list/extension-list-searchfield.tsx +91 -0
- package/src/pages/extension-list/extension-list.tsx +166 -0
- package/src/pages/namespace-detail/namespace-detail.tsx +232 -0
- package/src/pages/user/add-namespace-member-dialog.tsx +163 -0
- package/src/pages/user/avatar.tsx +102 -0
- package/src/pages/user/create-namespace-dialog.tsx +117 -0
- package/src/pages/user/generate-token-dialog.tsx +157 -0
- package/src/pages/user/logout.tsx +53 -0
- package/src/pages/user/publish-extension-dialog.tsx +241 -0
- package/src/pages/user/user-extension-list.tsx +45 -0
- package/src/pages/user/user-namespace-details.tsx +631 -0
- package/src/pages/user/user-namespace-extension-list-item.tsx +135 -0
- package/src/pages/user/user-namespace-extension-list.tsx +72 -0
- package/src/pages/user/user-namespace-member-component.tsx +91 -0
- package/src/pages/user/user-namespace-member-list.tsx +113 -0
- package/src/pages/user/user-publisher-agreement.tsx +164 -0
- package/src/pages/user/user-setting-tabs.tsx +47 -0
- package/src/pages/user/user-settings-delete-extension.tsx +81 -0
- package/src/pages/user/user-settings-extensions.tsx +91 -0
- package/src/pages/user/user-settings-namespace-detail.tsx +148 -0
- package/src/pages/user/user-settings-namespaces.tsx +157 -0
- package/src/pages/user/user-settings-profile.tsx +92 -0
- package/src/pages/user/user-settings-tokens.tsx +217 -0
- package/src/pages/user/user-settings.tsx +116 -0
- package/src/server-request.ts +95 -0
- package/src/svg.d.ts +14 -0
- package/src/utils.ts +219 -0
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2019 TypeFox and others
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made available under the
|
|
5
|
+
* terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
* http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
*
|
|
8
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
+
********************************************************************************/
|
|
10
|
+
|
|
11
|
+
export type UrlString = string;
|
|
12
|
+
export type TimestampString = string;
|
|
13
|
+
|
|
14
|
+
export interface SuccessResult {
|
|
15
|
+
success: string;
|
|
16
|
+
}
|
|
17
|
+
export function isSuccess(obj: unknown): obj is SuccessResult {
|
|
18
|
+
return typeof obj === 'object' && typeof (obj as any).success === 'string';
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface ErrorResult {
|
|
22
|
+
error: string;
|
|
23
|
+
}
|
|
24
|
+
export function isError(obj: unknown): obj is ErrorResult {
|
|
25
|
+
return typeof obj === 'object' && typeof (obj as any).error === 'string';
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface ReportedError {
|
|
29
|
+
message: string;
|
|
30
|
+
code?: number | string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface SearchResult {
|
|
34
|
+
offset: number;
|
|
35
|
+
totalSize: number;
|
|
36
|
+
extensions: SearchEntry[];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface SearchEntry {
|
|
40
|
+
url: UrlString;
|
|
41
|
+
// key: file type, value: url
|
|
42
|
+
files: { [id: string]: UrlString };
|
|
43
|
+
name: string;
|
|
44
|
+
namespace: string;
|
|
45
|
+
version: string;
|
|
46
|
+
timestamp?: TimestampString;
|
|
47
|
+
allVersions: {
|
|
48
|
+
url: UrlString;
|
|
49
|
+
// key: file type, value: url
|
|
50
|
+
files: { [id: string]: UrlString };
|
|
51
|
+
version: string;
|
|
52
|
+
// key: engine, value: version constraint
|
|
53
|
+
engines?: { [engine: string]: string };
|
|
54
|
+
}[];
|
|
55
|
+
averageRating?: number;
|
|
56
|
+
reviewCount?: number;
|
|
57
|
+
downloadCount?: number;
|
|
58
|
+
displayName?: string;
|
|
59
|
+
description?: string;
|
|
60
|
+
deprecated: boolean;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export const VERSION_ALIASES = ['latest', 'pre-release'];
|
|
64
|
+
|
|
65
|
+
export interface Extension {
|
|
66
|
+
namespaceUrl: UrlString;
|
|
67
|
+
reviewsUrl: UrlString;
|
|
68
|
+
// key: file type, value: url
|
|
69
|
+
files: { [id: string]: UrlString };
|
|
70
|
+
|
|
71
|
+
name: string;
|
|
72
|
+
namespace: string;
|
|
73
|
+
version: string;
|
|
74
|
+
targetPlatform: string;
|
|
75
|
+
preRelease?: boolean;
|
|
76
|
+
publishedBy: UserData;
|
|
77
|
+
verified: boolean;
|
|
78
|
+
// key: version, value: url
|
|
79
|
+
allVersions: { [version: string]: UrlString };
|
|
80
|
+
active?: boolean;
|
|
81
|
+
|
|
82
|
+
averageRating?: number;
|
|
83
|
+
downloadCount: number;
|
|
84
|
+
reviewCount: number;
|
|
85
|
+
|
|
86
|
+
versionAlias: string[];
|
|
87
|
+
timestamp: TimestampString;
|
|
88
|
+
preview?: boolean;
|
|
89
|
+
displayName?: string;
|
|
90
|
+
namespaceDisplayName: string;
|
|
91
|
+
description?: string;
|
|
92
|
+
|
|
93
|
+
// key: engine, value: version constraint
|
|
94
|
+
engines?: Record<string, string>;
|
|
95
|
+
categories?: string[];
|
|
96
|
+
tags?: string[];
|
|
97
|
+
license?: string;
|
|
98
|
+
homepage?: string;
|
|
99
|
+
repository?: string;
|
|
100
|
+
bugs?: string;
|
|
101
|
+
markdown?: 'github' | 'standard';
|
|
102
|
+
galleryColor: string;
|
|
103
|
+
galleryTheme: 'light' | 'dark' | '';
|
|
104
|
+
qna?: UrlString | 'marketplace' | 'false';
|
|
105
|
+
badges?: Badge[];
|
|
106
|
+
dependencies?: ExtensionReference[];
|
|
107
|
+
bundledExtensions?: ExtensionReference[];
|
|
108
|
+
|
|
109
|
+
// key: target platform, value: download link
|
|
110
|
+
downloads: { [targetPlatform: string]: UrlString };
|
|
111
|
+
allTargetPlatformVersions?: VersionTargetPlatforms[];
|
|
112
|
+
|
|
113
|
+
deprecated: boolean
|
|
114
|
+
replacement?: {
|
|
115
|
+
url: string
|
|
116
|
+
displayName: string
|
|
117
|
+
}
|
|
118
|
+
downloadable: boolean
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export interface Badge {
|
|
122
|
+
url: UrlString;
|
|
123
|
+
href: UrlString;
|
|
124
|
+
description: string;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export interface ExtensionReference {
|
|
128
|
+
namespace: string;
|
|
129
|
+
extension: string;
|
|
130
|
+
version?: string;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export interface VersionTargetPlatforms {
|
|
134
|
+
version: string;
|
|
135
|
+
targetPlatforms: string[];
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export type StarRating = 1 | 2 | 3 | 4 | 5;
|
|
139
|
+
export interface NewReview {
|
|
140
|
+
rating: StarRating;
|
|
141
|
+
title?: string;
|
|
142
|
+
comment: string;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export interface ExtensionReview extends NewReview {
|
|
146
|
+
user: UserData;
|
|
147
|
+
timestamp: TimestampString;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export interface ExtensionReviewList {
|
|
151
|
+
postUrl: UrlString;
|
|
152
|
+
deleteUrl: UrlString;
|
|
153
|
+
reviews: ExtensionReview[];
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export interface UserData {
|
|
157
|
+
loginName: string;
|
|
158
|
+
tokensUrl: UrlString;
|
|
159
|
+
createTokenUrl: UrlString;
|
|
160
|
+
fullName?: string;
|
|
161
|
+
avatarUrl?: UrlString;
|
|
162
|
+
homepage?: string;
|
|
163
|
+
provider?: string;
|
|
164
|
+
role?: string;
|
|
165
|
+
publisherAgreement?: {
|
|
166
|
+
status: 'none' | 'signed' | 'outdated';
|
|
167
|
+
timestamp?: TimestampString;
|
|
168
|
+
},
|
|
169
|
+
additionalLogins?: UserData[];
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export function isEqualUser(u1: UserData, u2: UserData): boolean {
|
|
173
|
+
return u1.loginName === u2.loginName;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export interface PersonalAccessToken {
|
|
177
|
+
id: number;
|
|
178
|
+
value?: string;
|
|
179
|
+
createdTimestamp: TimestampString;
|
|
180
|
+
accessedTimestamp?: TimestampString;
|
|
181
|
+
description: string;
|
|
182
|
+
deleteTokenUrl: UrlString;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export type ExtensionCategory =
|
|
186
|
+
'Programming Languages' |
|
|
187
|
+
'Snippets' |
|
|
188
|
+
'Linters' |
|
|
189
|
+
'Themes' |
|
|
190
|
+
'Debuggers' |
|
|
191
|
+
'Formatters' |
|
|
192
|
+
'Keymaps' |
|
|
193
|
+
'SCM Providers' |
|
|
194
|
+
'Other' |
|
|
195
|
+
'Extension Packs' |
|
|
196
|
+
'Language Packs' |
|
|
197
|
+
'Data Science' |
|
|
198
|
+
'Machine Learning' |
|
|
199
|
+
'Visualization' |
|
|
200
|
+
'Notebooks';
|
|
201
|
+
|
|
202
|
+
export interface CsrfTokenJson {
|
|
203
|
+
value: string;
|
|
204
|
+
header: string;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export interface NamespaceMembership {
|
|
208
|
+
namespace: string;
|
|
209
|
+
role: MembershipRole;
|
|
210
|
+
user: UserData;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export interface NamespaceMembershipList {
|
|
214
|
+
namespaceMemberships: NamespaceMembership[];
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export interface Namespace {
|
|
218
|
+
name: string;
|
|
219
|
+
extensions: { [key: string]: string };
|
|
220
|
+
verified: boolean;
|
|
221
|
+
membersUrl: UrlString;
|
|
222
|
+
roleUrl: UrlString;
|
|
223
|
+
detailsUrl: UrlString;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export interface NamespaceDetails {
|
|
227
|
+
name: string;
|
|
228
|
+
displayName: string;
|
|
229
|
+
description?: string;
|
|
230
|
+
logo?: UrlString;
|
|
231
|
+
logoBytes?: string;
|
|
232
|
+
website?: UrlString;
|
|
233
|
+
supportLink?: UrlString;
|
|
234
|
+
socialLinks: { [key: string]: UrlString | undefined };
|
|
235
|
+
extensions?: SearchEntry[];
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export interface PublisherInfo {
|
|
239
|
+
user: UserData;
|
|
240
|
+
extensions: Extension[];
|
|
241
|
+
activeAccessTokenNum: number;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
export interface TargetPlatformVersion {
|
|
245
|
+
targetPlatform: string;
|
|
246
|
+
version: string;
|
|
247
|
+
checked: boolean;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
export interface RegistryVersion {
|
|
251
|
+
version: string
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
export interface LoginProviders {
|
|
255
|
+
loginProviders: Record<string, string>
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
export type MembershipRole = 'contributor' | 'owner';
|
|
259
|
+
export type SortBy = 'relevance' | 'timestamp' | 'rating' | 'downloadCount';
|
|
260
|
+
export type SortOrder = 'asc' | 'desc';
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2020 TypeFox and others
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made available under the
|
|
5
|
+
* terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
* http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
*
|
|
8
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
+
********************************************************************************/
|
|
10
|
+
|
|
11
|
+
import React, { ComponentType, FunctionComponent, useContext, useEffect, useState } from 'react';
|
|
12
|
+
import { Menu, IconButton, useTheme } from '@mui/material';
|
|
13
|
+
import useMediaQuery from '@mui/material/useMediaQuery';
|
|
14
|
+
import MenuIcon from '@mui/icons-material/Menu';
|
|
15
|
+
import { MainContext } from './context';
|
|
16
|
+
import { useLocation } from 'react-router-dom';
|
|
17
|
+
|
|
18
|
+
export const HeaderMenu: FunctionComponent = () => {
|
|
19
|
+
const theme = useTheme();
|
|
20
|
+
const { pageSettings } = useContext(MainContext);
|
|
21
|
+
const {
|
|
22
|
+
defaultMenuContent: DefaultMenuContent,
|
|
23
|
+
mobileMenuContent: MobileMenuContent
|
|
24
|
+
} = pageSettings.elements;
|
|
25
|
+
const isMobile = useMediaQuery(theme.breakpoints.down('lg'));
|
|
26
|
+
if (isMobile && MobileMenuContent) {
|
|
27
|
+
return <MobileHeaderMenu menuContent={MobileMenuContent} />;
|
|
28
|
+
} else if (DefaultMenuContent) {
|
|
29
|
+
return <DefaultMenuContent />;
|
|
30
|
+
} else {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export const MobileHeaderMenu: FunctionComponent<MobileHeaderMenuProps> = props => {
|
|
36
|
+
|
|
37
|
+
const location = useLocation();
|
|
38
|
+
const [open, setOpen] = useState(false);
|
|
39
|
+
const [anchorEl, setAnchorEl] = useState<Element>();
|
|
40
|
+
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
setOpen(false);
|
|
43
|
+
}, [location]);
|
|
44
|
+
|
|
45
|
+
const MenuContent = props.menuContent;
|
|
46
|
+
return <>
|
|
47
|
+
<IconButton
|
|
48
|
+
title='Menu'
|
|
49
|
+
aria-label='Menu'
|
|
50
|
+
onClick={(event) => {
|
|
51
|
+
setAnchorEl(event.currentTarget);
|
|
52
|
+
setOpen(!open);
|
|
53
|
+
}}>
|
|
54
|
+
<MenuIcon />
|
|
55
|
+
</IconButton>
|
|
56
|
+
<Menu
|
|
57
|
+
open={open}
|
|
58
|
+
anchorEl={anchorEl}
|
|
59
|
+
anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
|
|
60
|
+
transformOrigin={{ vertical: 'top', horizontal: 'right' }}
|
|
61
|
+
onClose={() => setOpen(false)} >
|
|
62
|
+
<MenuContent />
|
|
63
|
+
</Menu>
|
|
64
|
+
</>;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export interface MobileHeaderMenuProps {
|
|
68
|
+
menuContent: ComponentType;
|
|
69
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2020 TypeFox and others
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made available under the
|
|
5
|
+
* terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
* http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
*
|
|
8
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
+
********************************************************************************/
|
|
10
|
+
|
|
11
|
+
export * from './main';
|
|
12
|
+
export * from './page-settings';
|
|
13
|
+
export * from './extension-registry-service';
|
|
14
|
+
export * from './extension-registry-types';
|
|
15
|
+
export * from './pages/extension-detail/extension-detail';
|
|
16
|
+
export * from './pages/extension-list/extension-list';
|
|
17
|
+
export * from './pages/namespace-detail/namespace-detail';
|
|
18
|
+
export * from './pages/user/user-settings';
|
package/src/main.css
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
html, body {
|
|
2
|
+
height: 100%;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
img {
|
|
6
|
+
object-fit: contain;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.visually-hidden {
|
|
10
|
+
position: absolute;
|
|
11
|
+
left: -100000rem;
|
|
12
|
+
top: auto;
|
|
13
|
+
width: 1px;
|
|
14
|
+
height: 1px;
|
|
15
|
+
overflow: hidden;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@keyframes fadein {
|
|
19
|
+
0% { opacity: 0; }
|
|
20
|
+
100% { opacity: 1; }
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@keyframes fadeout {
|
|
24
|
+
0% { opacity: 1; }
|
|
25
|
+
100% { opacity: 0; }
|
|
26
|
+
}
|
package/src/main.tsx
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2019 TypeFox and others
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made available under the
|
|
5
|
+
* terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
* http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
*
|
|
8
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
+
********************************************************************************/
|
|
10
|
+
|
|
11
|
+
import React, { FunctionComponent, ReactNode, useEffect, useState, useRef } from 'react';
|
|
12
|
+
import { CssBaseline } from '@mui/material';
|
|
13
|
+
import { Route, Routes } from 'react-router-dom';
|
|
14
|
+
import { AdminDashboard, AdminDashboardRoutes } from './pages/admin-dashboard/admin-dashboard';
|
|
15
|
+
import { ErrorDialog } from './components/error-dialog';
|
|
16
|
+
import { handleError } from './utils';
|
|
17
|
+
import { ExtensionRegistryService } from './extension-registry-service';
|
|
18
|
+
import { UserData, isError, ReportedError, isSuccess, LoginProviders } from './extension-registry-types';
|
|
19
|
+
import { MainContext } from './context';
|
|
20
|
+
import { PageSettings } from './page-settings';
|
|
21
|
+
import { ErrorResponse } from './server-request';
|
|
22
|
+
|
|
23
|
+
import '../src/main.css';
|
|
24
|
+
import { OtherPages } from './other-pages';
|
|
25
|
+
|
|
26
|
+
export const Main: FunctionComponent<MainProps> = props => {
|
|
27
|
+
const [user, setUser] = useState<UserData>();
|
|
28
|
+
const [userLoading, setUserLoading] = useState<boolean>(true);
|
|
29
|
+
const [loginProviders, setLoginProviders] = useState<Record<string, string> | undefined>(props.loginProviders);
|
|
30
|
+
const [error, setError] = useState<{message: string, code?: number | string}>();
|
|
31
|
+
const [isErrorDialogOpen, setIsErrorDialogOpen] = useState<boolean>(false);
|
|
32
|
+
const abortController = useRef<AbortController>(new AbortController());
|
|
33
|
+
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
getLoginProviders();
|
|
36
|
+
|
|
37
|
+
// If there was an authentication error, get the message from the server and show it
|
|
38
|
+
const searchParams = new URLSearchParams(window.location.search);
|
|
39
|
+
if (searchParams.has('auth-error')) {
|
|
40
|
+
props.service.getUserAuthError(abortController.current).then(onError);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Get data of the currently logged in user
|
|
44
|
+
updateUser();
|
|
45
|
+
|
|
46
|
+
return () => abortController.current.abort();
|
|
47
|
+
}, []);
|
|
48
|
+
|
|
49
|
+
const updateUser = async () => {
|
|
50
|
+
try {
|
|
51
|
+
setUserLoading(true);
|
|
52
|
+
const user = await props.service.getUser(abortController.current);
|
|
53
|
+
if (isError(user)) {
|
|
54
|
+
// An error result with HTTP OK status indicates that the user is not logged in.
|
|
55
|
+
setUser(undefined);
|
|
56
|
+
} else {
|
|
57
|
+
setUser(user as UserData);
|
|
58
|
+
}
|
|
59
|
+
} catch (err) {
|
|
60
|
+
onError(err);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
setUserLoading(false);
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
const getLoginProviders = async () => {
|
|
67
|
+
if (props.loginProviders != null) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const data = await props.service.getLoginProviders(abortController.current);
|
|
72
|
+
if (isSuccess(data)) {
|
|
73
|
+
console.log(data.success);
|
|
74
|
+
} else {
|
|
75
|
+
setLoginProviders((data as LoginProviders).loginProviders);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const onError = (err: Error | Partial<ErrorResponse> | ReportedError) => {
|
|
80
|
+
if (err instanceof DOMException && err.message.trim() === 'The operation was aborted.') {
|
|
81
|
+
// ignore error caused by AbortController.abort()
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const message = handleError(err);
|
|
86
|
+
const code = (err as ReportedError).code;
|
|
87
|
+
setError({ message, code });
|
|
88
|
+
setIsErrorDialogOpen(true);
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const onErrorDialogClose = () => {
|
|
92
|
+
setIsErrorDialogOpen(false);
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const renderPageContent = (): ReactNode => {
|
|
96
|
+
const { mainHeadTags: MainHeadTagsComponent } = props.pageSettings.elements;
|
|
97
|
+
return <>
|
|
98
|
+
{ MainHeadTagsComponent ? <MainHeadTagsComponent pageSettings={props.pageSettings}/> : null }
|
|
99
|
+
<Routes>
|
|
100
|
+
<Route path={AdminDashboardRoutes.MAIN + '/*'} element={<AdminDashboard userLoading={userLoading} />} />
|
|
101
|
+
<Route path='*' element={ <OtherPages user={user} userLoading={userLoading} /> } />
|
|
102
|
+
</Routes>
|
|
103
|
+
{
|
|
104
|
+
error ?
|
|
105
|
+
<ErrorDialog
|
|
106
|
+
errorMessage={error.message}
|
|
107
|
+
errorCode={error.code}
|
|
108
|
+
isErrorDialogOpen={isErrorDialogOpen}
|
|
109
|
+
handleCloseDialog={onErrorDialogClose} />
|
|
110
|
+
: null
|
|
111
|
+
}
|
|
112
|
+
</>;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const mainContext: MainContext = {
|
|
116
|
+
service: props.service,
|
|
117
|
+
pageSettings: props.pageSettings,
|
|
118
|
+
user,
|
|
119
|
+
updateUser,
|
|
120
|
+
loginProviders,
|
|
121
|
+
handleError: onError
|
|
122
|
+
};
|
|
123
|
+
return <>
|
|
124
|
+
<CssBaseline />
|
|
125
|
+
<MainContext.Provider value={mainContext}>
|
|
126
|
+
{renderPageContent()}
|
|
127
|
+
</MainContext.Provider>
|
|
128
|
+
</>;
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
export interface MainProps {
|
|
132
|
+
service: ExtensionRegistryService;
|
|
133
|
+
pageSettings: PageSettings;
|
|
134
|
+
loginProviders?: Record<string, string>;
|
|
135
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React, { FunctionComponent } from 'react';
|
|
2
|
+
import { Box, Container, Typography } from '@mui/material';
|
|
3
|
+
import BrokenImageIcon from '@mui/icons-material/BrokenImage';
|
|
4
|
+
|
|
5
|
+
export const NotFound: FunctionComponent = () => {
|
|
6
|
+
return <Container>
|
|
7
|
+
<Box height='30vh' display='flex' flexWrap='wrap' justifyContent='center' alignItems='center'>
|
|
8
|
+
<Typography variant='h3'>Oooups...this is a 404 page.</Typography>
|
|
9
|
+
<BrokenImageIcon sx={{ fontSize: '4rem', flexBasis: '100%' }} />
|
|
10
|
+
</Box>
|
|
11
|
+
</Container>;
|
|
12
|
+
};
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import React, { FunctionComponent, useContext, useEffect, useState } from 'react';
|
|
2
|
+
import { Routes, Route } from 'react-router-dom';
|
|
3
|
+
import { AppBar, Box, Toolbar } from '@mui/material';
|
|
4
|
+
import { styled, Theme } from '@mui/material/styles';
|
|
5
|
+
import { Banner } from './components/banner';
|
|
6
|
+
import { MainContext } from './context';
|
|
7
|
+
import { HeaderMenu } from './header-menu';
|
|
8
|
+
import { ExtensionListContainer, ExtensionListRoutes } from './pages/extension-list/extension-list-container';
|
|
9
|
+
import { UserSettings, UserSettingsRoutes } from './pages/user/user-settings';
|
|
10
|
+
import { NamespaceDetail, NamespaceDetailRoutes } from './pages/namespace-detail/namespace-detail';
|
|
11
|
+
import { ExtensionDetail, ExtensionDetailRoutes } from './pages/extension-detail/extension-detail';
|
|
12
|
+
import { getCookieValueByKey, setCookie } from './utils';
|
|
13
|
+
import { UserData } from './extension-registry-types';
|
|
14
|
+
import { NotFound } from './not-found';
|
|
15
|
+
|
|
16
|
+
const ToolbarItem = styled(Box)({
|
|
17
|
+
display: 'flex',
|
|
18
|
+
alignItems: 'center'
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const Wrapper = styled(Box)({
|
|
22
|
+
display: 'flex',
|
|
23
|
+
flexDirection: 'column',
|
|
24
|
+
position: 'relative',
|
|
25
|
+
minHeight: '100vh'
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const Footer = styled('footer')(({ theme }: { theme: Theme }) => ({
|
|
29
|
+
position: 'fixed',
|
|
30
|
+
bottom: 0,
|
|
31
|
+
width: '100%',
|
|
32
|
+
padding: `${theme.spacing(1)} ${theme.spacing(2)}`,
|
|
33
|
+
backgroundColor: theme.palette.background.paper,
|
|
34
|
+
boxShadow: '0px -2px 6px 0px rgba(0, 0, 0, 0.5)',
|
|
35
|
+
backgroundImage: theme.palette.mode == 'dark' ? 'linear-gradient(rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.08))' : undefined
|
|
36
|
+
}));
|
|
37
|
+
|
|
38
|
+
export const OtherPages: FunctionComponent<OtherPagesProps> = (props) => {
|
|
39
|
+
const { pageSettings } = useContext(MainContext);
|
|
40
|
+
const {
|
|
41
|
+
additionalRoutes: AdditionalRoutes,
|
|
42
|
+
banner: BannerComponent,
|
|
43
|
+
footer: FooterComponent,
|
|
44
|
+
toolbarContent: ToolbarContent
|
|
45
|
+
} = pageSettings.elements;
|
|
46
|
+
|
|
47
|
+
const [isBannerOpen, setIsBannerOpen] = useState(false);
|
|
48
|
+
const [isFooterExpanded, setIsFooterExpanded] = useState(false);
|
|
49
|
+
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
// Check a cookie to determine whether a banner should be shown
|
|
52
|
+
const banner = pageSettings.elements.banner;
|
|
53
|
+
if (banner) {
|
|
54
|
+
let open = true;
|
|
55
|
+
if (banner.cookie) {
|
|
56
|
+
const bannerClosedCookie = getCookieValueByKey(banner.cookie.key);
|
|
57
|
+
if (bannerClosedCookie === banner.cookie.value) {
|
|
58
|
+
open = false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
setIsBannerOpen(open);
|
|
62
|
+
}
|
|
63
|
+
}, []);
|
|
64
|
+
|
|
65
|
+
const onDismissBannerButtonClick = () => {
|
|
66
|
+
const onClose = pageSettings.elements.banner?.props?.onClose;
|
|
67
|
+
if (onClose) {
|
|
68
|
+
onClose();
|
|
69
|
+
}
|
|
70
|
+
const cookie = pageSettings.elements.banner?.cookie;
|
|
71
|
+
if (cookie) {
|
|
72
|
+
setCookie(cookie);
|
|
73
|
+
}
|
|
74
|
+
setIsBannerOpen(false);
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const getContentPadding = (): number => {
|
|
78
|
+
const footerHeight = pageSettings.elements.footer?.props.footerHeight;
|
|
79
|
+
return footerHeight ? footerHeight + 24 : 0;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
return <Wrapper>
|
|
83
|
+
<AppBar position='relative' color='inherit' elevation={3}>
|
|
84
|
+
<Toolbar sx={{ justifyContent: 'space-between' }}>
|
|
85
|
+
<ToolbarItem>
|
|
86
|
+
{ToolbarContent ? <ToolbarContent /> : null}
|
|
87
|
+
</ToolbarItem>
|
|
88
|
+
<ToolbarItem>
|
|
89
|
+
<HeaderMenu />
|
|
90
|
+
</ToolbarItem>
|
|
91
|
+
</Toolbar>
|
|
92
|
+
</AppBar>
|
|
93
|
+
{
|
|
94
|
+
BannerComponent ?
|
|
95
|
+
<Banner
|
|
96
|
+
open={isBannerOpen}
|
|
97
|
+
showDismissButton={BannerComponent.props?.dismissButton?.show}
|
|
98
|
+
dismissButtonLabel={BannerComponent.props?.dismissButton?.label}
|
|
99
|
+
dismissButtonOnClick={onDismissBannerButtonClick}
|
|
100
|
+
color={BannerComponent.props?.color}
|
|
101
|
+
theme={pageSettings.themeType}
|
|
102
|
+
>
|
|
103
|
+
<BannerComponent.content />
|
|
104
|
+
</Banner>
|
|
105
|
+
: null
|
|
106
|
+
}
|
|
107
|
+
<Box pb={`${getContentPadding()}px`}>
|
|
108
|
+
<Routes>
|
|
109
|
+
<Route path={ExtensionListRoutes.MAIN} element={ <ExtensionListContainer /> } />
|
|
110
|
+
<Route path={UserSettingsRoutes.MAIN} element={<UserSettings userLoading={props.userLoading} />} />
|
|
111
|
+
<Route path={UserSettingsRoutes.DELETE_EXTENSION} element={<UserSettings userLoading={props.userLoading} />} />
|
|
112
|
+
<Route path={NamespaceDetailRoutes.MAIN} element={ <NamespaceDetail /> } />
|
|
113
|
+
<Route path={ExtensionDetailRoutes.MAIN} element={<ExtensionDetail />} />
|
|
114
|
+
<Route path={ExtensionDetailRoutes.MAIN_TARGET} element={<ExtensionDetail />} />
|
|
115
|
+
{AdditionalRoutes ?? null}
|
|
116
|
+
<Route path='*' element={<NotFound />} />
|
|
117
|
+
</Routes>
|
|
118
|
+
</Box>
|
|
119
|
+
{
|
|
120
|
+
FooterComponent ?
|
|
121
|
+
<Footer
|
|
122
|
+
onMouseEnter={() => setIsFooterExpanded(true)}
|
|
123
|
+
onMouseLeave={() => setIsFooterExpanded(false)} >
|
|
124
|
+
<FooterComponent.content expanded={isFooterExpanded} />
|
|
125
|
+
</Footer>
|
|
126
|
+
: null
|
|
127
|
+
}
|
|
128
|
+
</Wrapper>;
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
export interface OtherPagesProps {
|
|
132
|
+
user?: UserData;
|
|
133
|
+
userLoading: boolean;
|
|
134
|
+
}
|