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,135 @@
|
|
|
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, { useContext, FunctionComponent, useState, useEffect, useRef, ReactNode, MouseEvent } from 'react';
|
|
12
|
+
import { Extension } from '../../extension-registry-types';
|
|
13
|
+
import { Paper, Typography, Box, styled, IconButton } from '@mui/material';
|
|
14
|
+
import { Link as RouteLink, useNavigate } from 'react-router-dom';
|
|
15
|
+
import { MainContext } from '../../context';
|
|
16
|
+
import { createRoute } from '../../utils';
|
|
17
|
+
import { Timestamp } from '../../components/timestamp';
|
|
18
|
+
import { ExtensionDetailRoutes } from '../extension-detail/extension-detail';
|
|
19
|
+
import DeleteIcon from '@mui/icons-material/Delete';
|
|
20
|
+
import { UserSettingsRoutes } from './user-settings';
|
|
21
|
+
|
|
22
|
+
const getOpacity = (extension: Extension) => {
|
|
23
|
+
if (extension.deprecated) {
|
|
24
|
+
return 0.5;
|
|
25
|
+
} else if (extension.active === false) {
|
|
26
|
+
return 0.75;
|
|
27
|
+
} else {
|
|
28
|
+
return 1;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const noOverflow = {
|
|
33
|
+
whiteSpace: 'nowrap',
|
|
34
|
+
overflow: 'hidden',
|
|
35
|
+
textOverflow: 'ellipsis',
|
|
36
|
+
ml: 0.5
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const Paragraph = styled(Box)({
|
|
40
|
+
display: 'flex',
|
|
41
|
+
justifyContent: 'space-between',
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
export const UserNamespaceExtensionListItem: FunctionComponent<UserNamespaceExtensionListItemProps> = props => {
|
|
45
|
+
const { pageSettings, service } = useContext(MainContext);
|
|
46
|
+
const [icon, setIcon] = useState<string | undefined>(undefined);
|
|
47
|
+
const { extension } = props;
|
|
48
|
+
const route = extension && createRoute([ExtensionDetailRoutes.ROOT, extension.namespace, extension.name]) || '';
|
|
49
|
+
const deleteRoute = extension && createRoute([UserSettingsRoutes.EXTENSIONS, extension.namespace, extension.name, 'delete']) || '';
|
|
50
|
+
const inactive = extension.active === false;
|
|
51
|
+
const abortController = useRef<AbortController>(new AbortController());
|
|
52
|
+
const navigate = useNavigate();
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
return () => {
|
|
55
|
+
abortController.current.abort();
|
|
56
|
+
};
|
|
57
|
+
}, []);
|
|
58
|
+
useEffect(() => {
|
|
59
|
+
if (icon) {
|
|
60
|
+
URL.revokeObjectURL(icon);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
service.getExtensionIcon(abortController.current, extension).then(setIcon);
|
|
64
|
+
}, [extension]);
|
|
65
|
+
|
|
66
|
+
let status: ReactNode = null;
|
|
67
|
+
if (inactive) {
|
|
68
|
+
status = <Box mt={0.25}>
|
|
69
|
+
Deactivated
|
|
70
|
+
</Box>;
|
|
71
|
+
} else if (extension.timestamp) {
|
|
72
|
+
status = <Paragraph mt={0.25}>
|
|
73
|
+
<span>Published:</span>
|
|
74
|
+
<Timestamp
|
|
75
|
+
value={extension.timestamp}
|
|
76
|
+
sx={noOverflow} />
|
|
77
|
+
</Paragraph>;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const gotoDeleteRoute = (e: MouseEvent) => {
|
|
81
|
+
e.preventDefault();
|
|
82
|
+
navigate(deleteRoute);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
return (
|
|
86
|
+
extension ? (
|
|
87
|
+
<RouteLink to={route} style={{ textDecoration: 'none' }}>
|
|
88
|
+
<Paper
|
|
89
|
+
elevation={3}
|
|
90
|
+
title={`${extension.namespace}.${extension.name} ${extension.version} ${inactive ? '(deactivated)' : ''}`}
|
|
91
|
+
sx={{
|
|
92
|
+
display: 'flex',
|
|
93
|
+
alignItems: 'center',
|
|
94
|
+
p: 1,
|
|
95
|
+
opacity: getOpacity(extension),
|
|
96
|
+
filter: extension.deprecated ? 'grayscale(100%)' : null
|
|
97
|
+
}}>
|
|
98
|
+
<Box
|
|
99
|
+
component='img'
|
|
100
|
+
src={icon ?? pageSettings?.urls.extensionDefaultIcon ?? ''}
|
|
101
|
+
alt={extension.displayName ?? extension.name}
|
|
102
|
+
sx={{
|
|
103
|
+
flex: '0 0 15%',
|
|
104
|
+
display: 'block',
|
|
105
|
+
mr: 2,
|
|
106
|
+
width: '3rem',
|
|
107
|
+
maxHeight: '4rem',
|
|
108
|
+
}}
|
|
109
|
+
/>
|
|
110
|
+
<Box component='div' sx={{ flex: '1', overflow: 'hidden' }}>
|
|
111
|
+
<Paragraph>
|
|
112
|
+
<Typography variant='h6' noWrap sx={{ fontSize: '1.15rem' }}>
|
|
113
|
+
{extension.displayName ?? extension.name}
|
|
114
|
+
</Typography>
|
|
115
|
+
{props.canDelete && deleteRoute && <IconButton onClick={gotoDeleteRoute}>
|
|
116
|
+
<DeleteIcon color='error' sx={{ fontSize: '1.15rem' }}/>
|
|
117
|
+
</IconButton>}
|
|
118
|
+
</Paragraph>
|
|
119
|
+
<Paragraph>
|
|
120
|
+
<span>Version:</span>
|
|
121
|
+
<Box component='span' sx={noOverflow}>{extension.version}</Box>
|
|
122
|
+
</Paragraph>
|
|
123
|
+
{status}
|
|
124
|
+
</Box>
|
|
125
|
+
</Paper>
|
|
126
|
+
</RouteLink>
|
|
127
|
+
)
|
|
128
|
+
: null
|
|
129
|
+
);
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
export interface UserNamespaceExtensionListItemProps {
|
|
133
|
+
extension: Extension;
|
|
134
|
+
canDelete?: boolean
|
|
135
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
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, { FunctionComponent, useContext, useEffect, useState, useRef } from 'react';
|
|
12
|
+
import { Namespace, isError, Extension, ErrorResult } from '../../extension-registry-types';
|
|
13
|
+
import { MainContext } from '../../context';
|
|
14
|
+
import { UserExtensionList } from './user-extension-list';
|
|
15
|
+
import { Typography } from '@mui/material';
|
|
16
|
+
|
|
17
|
+
export const UserNamespaceExtensionListContainer: FunctionComponent<UserNamespaceExtensionListContainerProps> = props => {
|
|
18
|
+
const [extensions, setExtensions] = useState<Extension[]>();
|
|
19
|
+
const [loading, setLoading] = useState<boolean>(true);
|
|
20
|
+
const context = useContext(MainContext);
|
|
21
|
+
|
|
22
|
+
const abortController = useRef<AbortController>(new AbortController());
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
updateExtensions();
|
|
25
|
+
return () => abortController.current.abort();
|
|
26
|
+
}, []);
|
|
27
|
+
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
setExtensions(undefined);
|
|
30
|
+
setLoading(true);
|
|
31
|
+
updateExtensions();
|
|
32
|
+
}, [props.namespace.name]);
|
|
33
|
+
|
|
34
|
+
const updateExtensions = async (): Promise<void> => {
|
|
35
|
+
const extensionsURLs: string[] = Object.keys(props.namespace.extensions).map((key: string) => props.namespace.extensions[key]);
|
|
36
|
+
|
|
37
|
+
const getExtension = async (url: string) => {
|
|
38
|
+
let result: Extension | ErrorResult;
|
|
39
|
+
try {
|
|
40
|
+
result = await context.service.getExtensionDetail(abortController.current, url);
|
|
41
|
+
if (isError(result)) {
|
|
42
|
+
throw result;
|
|
43
|
+
}
|
|
44
|
+
return result;
|
|
45
|
+
} catch (error) {
|
|
46
|
+
context.handleError(error);
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const extensionUnfiltered = await Promise.all(
|
|
52
|
+
extensionsURLs.map((url: string) => getExtension(url))
|
|
53
|
+
);
|
|
54
|
+
const extensions = extensionUnfiltered.filter(e => e != null) as Extension[];
|
|
55
|
+
|
|
56
|
+
setExtensions(extensions);
|
|
57
|
+
setLoading(false);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
return <>
|
|
61
|
+
<Typography variant='h5'>Extensions</Typography>
|
|
62
|
+
{
|
|
63
|
+
extensions && extensions.length > 0
|
|
64
|
+
? <UserExtensionList extensions={extensions} loading={loading} canDelete />
|
|
65
|
+
: <Typography variant='body1'>No extensions published under this namespace yet.</Typography>
|
|
66
|
+
}
|
|
67
|
+
</>;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export interface UserNamespaceExtensionListContainerProps {
|
|
71
|
+
namespace: Namespace;
|
|
72
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
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, { FunctionComponent, useContext } from 'react';
|
|
12
|
+
import { Box, Typography, Avatar, Select, MenuItem, Button, SelectChangeEvent } from '@mui/material';
|
|
13
|
+
import { NamespaceMembership, MembershipRole, Namespace, UserData } from '../../extension-registry-types';
|
|
14
|
+
import { MainContext } from '../../context';
|
|
15
|
+
|
|
16
|
+
export const UserNamespaceMember: FunctionComponent<UserNamespaceMemberProps> = props => {
|
|
17
|
+
const equalUser = (user1: UserData | undefined, user2: UserData | undefined) => {
|
|
18
|
+
return user1?.loginName === user2?.loginName && user1?.provider === user2?.provider;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const memberUser = props.member.user;
|
|
22
|
+
const context = useContext(MainContext);
|
|
23
|
+
const contextUser = context.user;
|
|
24
|
+
return <Box key={'member:' + memberUser.loginName} p={2} display='flex' alignItems='center'>
|
|
25
|
+
<Box alignItems='center' overflow='auto' width='33%'>
|
|
26
|
+
<Typography sx={{ fontWeight: 'bold', overflow: 'hidden', textOverflow: 'ellipsis' }}>{memberUser.loginName}</Typography>
|
|
27
|
+
{memberUser.fullName ? <Typography variant='body2'>{memberUser.fullName}</Typography> : ''}
|
|
28
|
+
</Box>
|
|
29
|
+
{
|
|
30
|
+
memberUser.avatarUrl ?
|
|
31
|
+
<Box display='flex' alignItems='center'>
|
|
32
|
+
<Avatar src={memberUser.avatarUrl}></Avatar>
|
|
33
|
+
</Box>
|
|
34
|
+
: ''
|
|
35
|
+
}
|
|
36
|
+
<Box
|
|
37
|
+
sx={{
|
|
38
|
+
flex: 1,
|
|
39
|
+
display: 'flex',
|
|
40
|
+
justifyContent: 'flex-end',
|
|
41
|
+
alignItems: 'center',
|
|
42
|
+
flexDirection: { xs: 'column', sm: 'column', md: 'row', lg: 'row', xl: 'row' }
|
|
43
|
+
}}
|
|
44
|
+
>
|
|
45
|
+
{
|
|
46
|
+
props.fixSelf && equalUser(memberUser, contextUser) ?
|
|
47
|
+
<Box
|
|
48
|
+
sx={{
|
|
49
|
+
fontFamily: '"Roboto", "Helvetica", "Arial", sans-serif',
|
|
50
|
+
fontWeight: 500,
|
|
51
|
+
lineHeight: '1.75',
|
|
52
|
+
letterSpacing: '0.02857em',
|
|
53
|
+
textTransform: 'uppercase',
|
|
54
|
+
border: '1px solid rgba(0, 0, 0, 0.23)',
|
|
55
|
+
borderRadius: 4,
|
|
56
|
+
padding: '5px 15px',
|
|
57
|
+
fontSize: '0.875rem'
|
|
58
|
+
}}
|
|
59
|
+
>
|
|
60
|
+
Owner
|
|
61
|
+
</Box>
|
|
62
|
+
:
|
|
63
|
+
<>
|
|
64
|
+
<Box m={1}>
|
|
65
|
+
<Select
|
|
66
|
+
variant='outlined'
|
|
67
|
+
value={props.member.role}
|
|
68
|
+
onChange={(event: SelectChangeEvent<MembershipRole>) => props.onChangeRole(event.target.value as MembershipRole)}>
|
|
69
|
+
<MenuItem value='contributor'>Contributor</MenuItem>
|
|
70
|
+
<MenuItem value='owner'>Owner</MenuItem>
|
|
71
|
+
</Select>
|
|
72
|
+
</Box>
|
|
73
|
+
<Button
|
|
74
|
+
variant='outlined'
|
|
75
|
+
sx={{ color: 'error.main', height: 36 }}
|
|
76
|
+
onClick={() => props.onRemoveUser()}>
|
|
77
|
+
Delete
|
|
78
|
+
</Button>
|
|
79
|
+
</>
|
|
80
|
+
}
|
|
81
|
+
</Box>
|
|
82
|
+
</Box>;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export interface UserNamespaceMemberProps {
|
|
86
|
+
namespace: Namespace;
|
|
87
|
+
member: NamespaceMembership;
|
|
88
|
+
fixSelf: boolean;
|
|
89
|
+
onChangeRole: (role: MembershipRole) => void;
|
|
90
|
+
onRemoveUser: () => void;
|
|
91
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
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, { FunctionComponent, useEffect, useState, useContext, useRef } from 'react';
|
|
12
|
+
import { Box, Typography, Button, Paper } from '@mui/material';
|
|
13
|
+
import { UserNamespaceMember } from './user-namespace-member-component';
|
|
14
|
+
import { Namespace, NamespaceMembership, MembershipRole, isError, UserData } from '../../extension-registry-types';
|
|
15
|
+
import { AddMemberDialog } from './add-namespace-member-dialog';
|
|
16
|
+
import { MainContext } from '../../context';
|
|
17
|
+
|
|
18
|
+
export const UserNamespaceMemberList: FunctionComponent<UserNamespaceMemberListProps> = props => {
|
|
19
|
+
const { service, user, handleError } = useContext(MainContext);
|
|
20
|
+
const [members, setMembers] = useState<NamespaceMembership[]>([]);
|
|
21
|
+
const [addDialogIsOpen, setAddDialogIsOpen] = useState(false);
|
|
22
|
+
const abortController = useRef<AbortController>(new AbortController());
|
|
23
|
+
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
fetchMembers();
|
|
26
|
+
}, [props.namespace]);
|
|
27
|
+
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
return () => {
|
|
30
|
+
abortController.current.abort();
|
|
31
|
+
};
|
|
32
|
+
}, []);
|
|
33
|
+
|
|
34
|
+
const handleCloseAddDialog = async () => {
|
|
35
|
+
setAddDialogIsOpen(false);
|
|
36
|
+
fetchMembers();
|
|
37
|
+
};
|
|
38
|
+
const handleOpenAddDialog = () => {
|
|
39
|
+
setAddDialogIsOpen(true);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const fetchMembers = async () => {
|
|
43
|
+
try {
|
|
44
|
+
const membershipList = await service.getNamespaceMembers(abortController.current, props.namespace);
|
|
45
|
+
const members = membershipList.namespaceMemberships;
|
|
46
|
+
setMembers(members);
|
|
47
|
+
} catch (err) {
|
|
48
|
+
handleError(err);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const changeRole = async (membership: NamespaceMembership, role: MembershipRole | 'remove') => {
|
|
53
|
+
try {
|
|
54
|
+
props.setLoadingState(true);
|
|
55
|
+
const endpoint = props.namespace.roleUrl;
|
|
56
|
+
const result = await service.setNamespaceMember(abortController.current, endpoint, membership.user, role);
|
|
57
|
+
if (isError(result)) {
|
|
58
|
+
throw result;
|
|
59
|
+
}
|
|
60
|
+
await fetchMembers();
|
|
61
|
+
props.setLoadingState(false);
|
|
62
|
+
} catch (err) {
|
|
63
|
+
handleError(err);
|
|
64
|
+
props.setLoadingState(false);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
if (!user) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
return <>
|
|
72
|
+
<Box
|
|
73
|
+
sx={{
|
|
74
|
+
display: 'flex',
|
|
75
|
+
justifyContent: 'space-between',
|
|
76
|
+
alignItems: 'center',
|
|
77
|
+
mb: 1,
|
|
78
|
+
flexDirection: { xs: 'column', sm: 'column', md: 'row', lg: 'row', xl: 'row' }
|
|
79
|
+
}}
|
|
80
|
+
>
|
|
81
|
+
<Typography variant='h5'>Members</Typography>
|
|
82
|
+
<Button sx={{ ml: { xs: 2, sm: 2, md: 2, lg: 0, xl: 0 } }} variant='outlined' onClick={handleOpenAddDialog}>
|
|
83
|
+
Add Namespace Member
|
|
84
|
+
</Button>
|
|
85
|
+
</Box>
|
|
86
|
+
{members.length ?
|
|
87
|
+
<Paper elevation={3}>
|
|
88
|
+
{members.map(member =>
|
|
89
|
+
<UserNamespaceMember
|
|
90
|
+
key={'nspcmbr-' + member.user.loginName + member.user.provider}
|
|
91
|
+
namespace={props.namespace}
|
|
92
|
+
member={member}
|
|
93
|
+
fixSelf={props.fixSelf}
|
|
94
|
+
onChangeRole={role => changeRole(member, role)}
|
|
95
|
+
onRemoveUser={() => changeRole(member, 'remove')} />)}
|
|
96
|
+
</Paper> :
|
|
97
|
+
<Typography variant='body1'>There are no members assigned yet.</Typography>}
|
|
98
|
+
<AddMemberDialog
|
|
99
|
+
members={members}
|
|
100
|
+
namespace={props.namespace}
|
|
101
|
+
onClose={handleCloseAddDialog}
|
|
102
|
+
open={addDialogIsOpen}
|
|
103
|
+
setLoadingState={props.setLoadingState}
|
|
104
|
+
filterUsers={props.filterUsers} />
|
|
105
|
+
</>;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
export interface UserNamespaceMemberListProps {
|
|
109
|
+
namespace: Namespace;
|
|
110
|
+
setLoadingState: (loadingState: boolean) => void;
|
|
111
|
+
filterUsers: (user: UserData) => boolean;
|
|
112
|
+
fixSelf: boolean;
|
|
113
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
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, { FunctionComponent, useContext, useState, useEffect, useRef, ReactNode } from 'react';
|
|
12
|
+
import {
|
|
13
|
+
Box, Typography, Paper, Button, Dialog, DialogContent, DialogContentText, Link
|
|
14
|
+
} from '@mui/material';
|
|
15
|
+
import { UserData, isError, ReportedError } from '../../extension-registry-types';
|
|
16
|
+
import { SanitizedMarkdown } from '../../components/sanitized-markdown';
|
|
17
|
+
import { Timestamp } from '../../components/timestamp';
|
|
18
|
+
import { ButtonWithProgress } from '../../components/button-with-progress';
|
|
19
|
+
import { createAbsoluteURL } from '../../utils';
|
|
20
|
+
import { MainContext } from '../../context';
|
|
21
|
+
import CircularProgress from '@mui/material/CircularProgress';
|
|
22
|
+
|
|
23
|
+
export const UserPublisherAgreement: FunctionComponent<UserPublisherAgreementProps> = props => {
|
|
24
|
+
const { service, pageSettings, updateUser, handleError } = useContext(MainContext);
|
|
25
|
+
const [dialogOpen, setDialogOpen] = useState(false);
|
|
26
|
+
const [working, setWorking] = useState(false);
|
|
27
|
+
const [agreementText, setAgreementText] = useState('');
|
|
28
|
+
const abortController = useRef<AbortController>(new AbortController());
|
|
29
|
+
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
return () => {
|
|
32
|
+
abortController.current.abort();
|
|
33
|
+
};
|
|
34
|
+
}, []);
|
|
35
|
+
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
if (dialogOpen) {
|
|
38
|
+
onDialogOpened();
|
|
39
|
+
}
|
|
40
|
+
}, [dialogOpen]);
|
|
41
|
+
|
|
42
|
+
const signPublisherAgreement = async (): Promise<void> => {
|
|
43
|
+
try {
|
|
44
|
+
setWorking(true);
|
|
45
|
+
const result = await service.signPublisherAgreement(abortController.current);
|
|
46
|
+
if (isError(result)) {
|
|
47
|
+
throw result;
|
|
48
|
+
}
|
|
49
|
+
updateUser();
|
|
50
|
+
setDialogOpen(false);
|
|
51
|
+
} catch (err) {
|
|
52
|
+
if (!(err as ReportedError).code) {
|
|
53
|
+
Object.assign(err, { code: 'publisher-agreement-problem' });
|
|
54
|
+
}
|
|
55
|
+
handleError(err);
|
|
56
|
+
} finally {
|
|
57
|
+
setWorking(false);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const openPublisherAgreement = () => {
|
|
62
|
+
if (!pageSettings.urls.publisherAgreement) {
|
|
63
|
+
handleError({ error: 'Publisher agreement text is not available.' });
|
|
64
|
+
} else {
|
|
65
|
+
setDialogOpen(true);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const onDialogOpened = async () => {
|
|
70
|
+
const agreementURL = pageSettings.urls.publisherAgreement;
|
|
71
|
+
if (agreementURL) {
|
|
72
|
+
try {
|
|
73
|
+
const agreementMd = await service.getStaticContent(abortController.current, agreementURL);
|
|
74
|
+
setAgreementText(agreementMd);
|
|
75
|
+
} catch (err) {
|
|
76
|
+
handleError(err);
|
|
77
|
+
}
|
|
78
|
+
} else {
|
|
79
|
+
setAgreementText('Publisher agreement text is not available.');
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const onClose = () => {
|
|
84
|
+
setDialogOpen(false);
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const user = props.user;
|
|
88
|
+
if (!user.publisherAgreement) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
let content: ReactNode;
|
|
93
|
+
if (user.publisherAgreement.status === 'signed') {
|
|
94
|
+
content = <Typography variant='body1'>
|
|
95
|
+
{
|
|
96
|
+
user.publisherAgreement.timestamp
|
|
97
|
+
? <>You signed the Eclipse Foundation Open VSX Publisher Agreement <Timestamp value={user.publisherAgreement.timestamp} />.</>
|
|
98
|
+
: 'You signed the Eclipse Foundation Open VSX Publisher Agreement.'
|
|
99
|
+
}
|
|
100
|
+
</Typography>;
|
|
101
|
+
} else if (user.additionalLogins?.find(login => login.provider === 'eclipse')) {
|
|
102
|
+
content = <>
|
|
103
|
+
<Typography variant='body1'>
|
|
104
|
+
You need to sign the Eclipse Foundation Open VSX Publisher Agreement before you can publish
|
|
105
|
+
any extension to this registry.
|
|
106
|
+
</Typography>
|
|
107
|
+
<Box mt={2} display='flex' justifyContent='flex-end'>
|
|
108
|
+
<Button onClick={openPublisherAgreement} variant='outlined' color='secondary'>
|
|
109
|
+
Show Publisher Agreement
|
|
110
|
+
</Button>
|
|
111
|
+
</Box>
|
|
112
|
+
</>;
|
|
113
|
+
} else {
|
|
114
|
+
content = <>
|
|
115
|
+
<Typography variant='body1'>
|
|
116
|
+
You need to sign the Eclipse Foundation Open VSX Publisher Agreement before you can publish
|
|
117
|
+
any extension to this registry. To start the signing process, please log in with
|
|
118
|
+
an Eclipse Foundation account.
|
|
119
|
+
</Typography>
|
|
120
|
+
<Box mt={2} display='flex' justifyContent='flex-end'>
|
|
121
|
+
<Link href={createAbsoluteURL([service.serverUrl, 'oauth2', 'authorization', 'eclipse'])}>
|
|
122
|
+
<Button variant='outlined' color='secondary'>
|
|
123
|
+
Log in with Eclipse
|
|
124
|
+
</Button>
|
|
125
|
+
</Link>
|
|
126
|
+
</Box>
|
|
127
|
+
</>;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return <>
|
|
131
|
+
<Paper sx={{ p: 2 }} elevation={3}>{content}</Paper>
|
|
132
|
+
<Dialog
|
|
133
|
+
open={dialogOpen}
|
|
134
|
+
onClose={onClose}
|
|
135
|
+
maxWidth='md'
|
|
136
|
+
sx={{ paperScrollPaper: { height: '75%', width: '100%' } }}>
|
|
137
|
+
<DialogContent>
|
|
138
|
+
{
|
|
139
|
+
agreementText ?
|
|
140
|
+
<DialogContentText component='div'>
|
|
141
|
+
<SanitizedMarkdown
|
|
142
|
+
content={agreementText}
|
|
143
|
+
sanitize={false}
|
|
144
|
+
linkify={false} />
|
|
145
|
+
<Box display='flex' justifyContent='flex-end' >
|
|
146
|
+
<ButtonWithProgress working={working} onClick={signPublisherAgreement}>
|
|
147
|
+
Agree
|
|
148
|
+
</ButtonWithProgress>
|
|
149
|
+
</Box>
|
|
150
|
+
</DialogContentText>
|
|
151
|
+
:
|
|
152
|
+
<Box height={1} display='flex' justifyContent='center' alignItems='center'>
|
|
153
|
+
<CircularProgress color='secondary' />
|
|
154
|
+
</Box>
|
|
155
|
+
}
|
|
156
|
+
</DialogContent>
|
|
157
|
+
</Dialog>
|
|
158
|
+
</>;
|
|
159
|
+
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
export interface UserPublisherAgreementProps {
|
|
163
|
+
user: UserData;
|
|
164
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
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, { ChangeEvent, ReactElement } from 'react';
|
|
12
|
+
import { Tabs, Tab, useTheme, useMediaQuery } from '@mui/material';
|
|
13
|
+
import { useNavigate, useParams } from 'react-router-dom';
|
|
14
|
+
import { createRoute } from '../../utils';
|
|
15
|
+
import { UserSettingsRoutes } from './user-settings';
|
|
16
|
+
|
|
17
|
+
export const UserSettingTabs = (): ReactElement => {
|
|
18
|
+
|
|
19
|
+
const theme = useTheme();
|
|
20
|
+
const isATablet = useMediaQuery(theme.breakpoints.down('md'));
|
|
21
|
+
const isAMobile = useMediaQuery(theme.breakpoints.down('sm'));
|
|
22
|
+
const { tab } = useParams();
|
|
23
|
+
const navigate = useNavigate();
|
|
24
|
+
|
|
25
|
+
const handleChange = (event: ChangeEvent, newTab: string) => {
|
|
26
|
+
navigate(generateRoute(newTab));
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const generateRoute = (tab: string) => {
|
|
30
|
+
return createRoute([UserSettingsRoutes.ROOT, tab]);
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
<Tabs
|
|
35
|
+
value={tab}
|
|
36
|
+
onChange={handleChange}
|
|
37
|
+
orientation={isATablet ? 'horizontal' : 'vertical'}
|
|
38
|
+
centered={isAMobile ? true : false}
|
|
39
|
+
indicatorColor='secondary'
|
|
40
|
+
>
|
|
41
|
+
<Tab value='profile' label='Profile' />
|
|
42
|
+
<Tab value='tokens' label='Access Tokens' />
|
|
43
|
+
<Tab value='namespaces' label='Namespaces' />
|
|
44
|
+
<Tab value='extensions' label='Extensions' />
|
|
45
|
+
</Tabs>
|
|
46
|
+
);
|
|
47
|
+
};
|