@rancher/shell 3.0.7 → 3.0.8-rc.10
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/assets/brand/suse/banner.svg +1 -0
- package/assets/brand/suse/dark/banner.svg +1 -0
- package/assets/brand/suse/dark/login-landscape.svg +1 -0
- package/assets/brand/suse/dark/rancher-logo.svg +1 -1
- package/assets/brand/suse/favicon.png +0 -0
- package/assets/brand/suse/login-landscape.svg +1 -0
- package/assets/brand/suse/metadata.json +11 -1
- package/assets/brand/suse/rancher-logo.svg +1 -1
- package/assets/fonts/suse/suse-v2-latin-300.woff +0 -0
- package/assets/fonts/suse/suse-v2-latin-300.woff2 +0 -0
- package/assets/fonts/suse/suse-v2-latin-600.woff +0 -0
- package/assets/fonts/suse/suse-v2-latin-600.woff2 +0 -0
- package/assets/fonts/suse/suse-v2-latin-700.woff +0 -0
- package/assets/fonts/suse/suse-v2-latin-700.woff2 +0 -0
- package/assets/fonts/suse/suse-v2-latin-800.woff +0 -0
- package/assets/fonts/suse/suse-v2-latin-800.woff2 +0 -0
- package/assets/fonts/suse/suse-v2-latin-regular.woff +0 -0
- package/assets/fonts/suse/suse-v2-latin-regular.woff2 +0 -0
- package/assets/images/content/README.md +5 -0
- package/assets/images/content/cloud-native.svg +84 -0
- package/assets/images/content/dark/cloud-native.svg +21 -0
- package/assets/images/content/dark/shield.svg +59 -0
- package/assets/images/content/dark/suse.svg +10 -0
- package/assets/images/content/shield.svg +59 -0
- package/assets/images/content/suse.svg +10 -0
- package/assets/images/vendor/githubapp.svg +13 -0
- package/assets/styles/base/_typography.scss +2 -1
- package/assets/styles/fonts/_fontstack.scss +53 -1
- package/assets/styles/global/_cards.scss +0 -3
- package/assets/styles/global/_layout.scss +21 -35
- package/assets/styles/themes/_dark.scss +1 -1
- package/assets/styles/themes/_light.scss +1 -1
- package/assets/styles/themes/_modern.scss +16 -8
- package/assets/styles/themes/_suse.scss +116 -24
- package/assets/translations/en-us.yaml +185 -21
- package/assets/translations/zh-hans.yaml +0 -4
- package/components/AutoscalerCard.vue +113 -0
- package/components/AutoscalerTab.vue +94 -0
- package/components/BackLink.vue +8 -0
- package/components/BannerGraphic.vue +36 -21
- package/components/BrandImage.vue +17 -6
- package/components/ClusterIconMenu.vue +1 -1
- package/components/ClusterProviderIcon.vue +1 -1
- package/components/Cron/CronExpressionEditor.vue +1 -1
- package/components/Cron/CronExpressionEditorModal.vue +1 -1
- package/components/Drawer/Chrome.vue +2 -6
- package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +4 -9
- package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +3 -8
- package/components/Drawer/ResourceDetailDrawer/composables.ts +3 -4
- package/components/Drawer/ResourceDetailDrawer/index.vue +4 -9
- package/components/Drawer/ResourceDetailDrawer/types.ts +17 -0
- package/components/Drawer/types.ts +3 -0
- package/components/DynamicContent/DynamicContentBanner.vue +102 -0
- package/components/DynamicContent/DynamicContentCloseButton.vue +42 -0
- package/components/DynamicContent/DynamicContentIcon.vue +132 -0
- package/components/DynamicContent/DynamicContentPanel.vue +112 -0
- package/components/DynamicContent/content.ts +78 -0
- package/components/EmberPage.vue +1 -1
- package/components/IconOrSvg.vue +2 -2
- package/components/Inactivity.vue +222 -106
- package/components/InstallHelmCharts.vue +2 -2
- package/components/PaginatedResourceTable.vue +2 -6
- package/components/PopoverCard.vue +192 -0
- package/components/Questions/__tests__/index.test.ts +159 -0
- package/components/Resource/Detail/CopyToClipboard.vue +4 -1
- package/components/Resource/Detail/FetchLoader/composables.ts +18 -4
- package/components/Resource/Detail/Metadata/Annotations/index.vue +2 -2
- package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +1 -1
- package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +4 -0
- package/components/Resource/Detail/Metadata/KeyValueRow.vue +1 -1
- package/components/Resource/Detail/Metadata/Labels/index.vue +2 -2
- package/components/Resource/Detail/Metadata/composables.ts +9 -9
- package/components/Resource/Detail/Metadata/index.vue +3 -3
- package/components/Resource/Detail/ResourcePopover/ResourcePopoverCard.vue +2 -19
- package/components/Resource/Detail/ResourcePopover/__tests__/ResourcePopoverCard.test.ts +0 -29
- package/components/Resource/Detail/ResourcePopover/__tests__/index.test.ts +132 -150
- package/components/Resource/Detail/ResourcePopover/index.vue +54 -159
- package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +0 -2
- package/components/Resource/Detail/TitleBar/composables.ts +2 -1
- package/components/Resource/Detail/TitleBar/index.vue +10 -6
- package/components/Resource/Detail/composables.ts +12 -0
- package/components/ResourceDetail/Masthead/latest.vue +29 -0
- package/components/ResourceDetail/index.vue +5 -2
- package/components/ResourceList/Masthead.vue +1 -1
- package/components/SortableTable/index.vue +18 -2
- package/components/Tabbed/__tests__/index.test.ts +86 -0
- package/components/{nav/WindowManager → Window}/ContainerLogs.vue +1 -1
- package/components/{nav/WindowManager → Window}/ContainerLogsActions.vue +1 -0
- package/components/{nav/WindowManager → Window}/__tests__/ContainerLogs.test.ts +1 -1
- package/components/{nav/WindowManager → Window}/__tests__/ContainerShell.test.ts +2 -2
- package/components/__tests__/AutoscalerCard.test.ts +154 -0
- package/components/__tests__/AutoscalerTab.test.ts +125 -0
- package/components/__tests__/PopoverCard.test.ts +204 -0
- package/components/auth/SelectPrincipal.vue +24 -6
- package/components/auth/__tests__/SelectPrincipal.test.ts +119 -0
- package/components/fleet/FleetConfigMapSelector.vue +117 -0
- package/components/fleet/FleetSecretSelector.vue +127 -0
- package/components/fleet/__tests__/FleetConfigMapSelector.test.ts +125 -0
- package/components/fleet/__tests__/FleetSecretSelector.test.ts +82 -0
- package/components/form/FileImageSelector.vue +13 -4
- package/components/form/FileSelector.vue +11 -2
- package/components/form/ResourceLabeledSelect.vue +1 -0
- package/components/form/__tests__/ResourceLabeledSelect.test.ts +90 -0
- package/components/formatter/Autoscaler.vue +97 -0
- package/components/formatter/InternalExternalIP.vue +198 -24
- package/components/formatter/__tests__/Autoscaler.test.ts +156 -0
- package/components/formatter/__tests__/InternalExternalIP.test.ts +133 -0
- package/components/google/util/__tests__/formatter.test.ts +47 -0
- package/components/google/util/formatter.ts +5 -2
- package/components/nav/Group.vue +12 -3
- package/components/nav/Header.vue +37 -16
- package/components/nav/NamespaceFilter.vue +13 -1
- package/components/nav/NotificationCenter/index.vue +2 -1
- package/components/nav/TopLevelMenu.helper.ts +16 -6
- package/components/nav/TopLevelMenu.vue +4 -2
- package/components/{DraggableZone.vue → nav/WindowManager/PinArea.vue} +47 -80
- package/components/nav/WindowManager/composables/useComponentsMount.ts +70 -0
- package/components/nav/WindowManager/composables/useDimensionsHandler.ts +105 -0
- package/components/nav/WindowManager/composables/useDragHandler.ts +99 -0
- package/components/nav/WindowManager/composables/usePanelHandler.ts +72 -0
- package/components/nav/WindowManager/composables/usePanelsHandler.ts +14 -0
- package/components/nav/WindowManager/composables/useResizeHandler.ts +167 -0
- package/components/nav/WindowManager/composables/useTabsHandler.ts +51 -0
- package/components/nav/WindowManager/constants.ts +23 -0
- package/components/nav/WindowManager/index.vue +61 -575
- package/components/nav/WindowManager/panels/HorizontalPanel.vue +265 -0
- package/components/nav/WindowManager/panels/TabBodyContainer.vue +39 -0
- package/components/nav/WindowManager/panels/VerticalPanel.vue +308 -0
- package/components/templates/default.vue +4 -40
- package/components/templates/home.vue +31 -5
- package/components/templates/plain.vue +30 -4
- package/components/templates/standalone.vue +1 -1
- package/composables/useI18n.ts +10 -1
- package/composables/useInterval.ts +15 -0
- package/config/__test__/uiplugins.test.ts +309 -0
- package/config/labels-annotations.js +9 -1
- package/config/product/auth.js +1 -0
- package/config/product/explorer.js +3 -1
- package/config/product/manager.js +20 -9
- package/config/query-params.js +1 -0
- package/config/router/routes.js +10 -2
- package/config/settings.ts +10 -2
- package/config/store.js +4 -2
- package/config/table-headers.js +8 -0
- package/config/types.js +11 -0
- package/config/uiplugins.js +46 -2
- package/config/version.js +1 -1
- package/core/__test__/extension-manager-impl.test.js +236 -0
- package/core/extension-manager-impl.js +23 -6
- package/core/plugin-helpers.ts +2 -0
- package/core/types-provisioning.ts +4 -1
- package/detail/pod.vue +1 -0
- package/detail/provisioning.cattle.io.cluster.vue +13 -1
- package/dialog/AddonConfigConfirmationDialog.vue +45 -1
- package/dialog/DeveloperLoadExtensionDialog.vue +12 -3
- package/dialog/RollbackWorkloadDialog.vue +2 -5
- package/directives/ui-context.ts +103 -0
- package/edit/__tests__/fleet.cattle.io.helmop.test.ts +52 -11
- package/edit/auth/AuthProviderWarningBanners.vue +14 -1
- package/edit/auth/__tests__/oidc.test.ts +26 -0
- package/edit/auth/github-app-steps.vue +97 -0
- package/edit/auth/github-steps.vue +75 -0
- package/edit/auth/github.vue +99 -65
- package/edit/auth/oidc.vue +5 -1
- package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -0
- package/edit/cloudcredential.vue +1 -1
- package/edit/configmap.vue +1 -0
- package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
- package/edit/fleet.cattle.io.gitrepo.vue +0 -10
- package/edit/fleet.cattle.io.helmop.vue +51 -2
- package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
- package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
- package/edit/logging-flow/index.vue +1 -0
- package/edit/logging.banzaicloud.io.output/index.vue +1 -0
- package/edit/management.cattle.io.fleetworkspace.vue +1 -1
- package/edit/management.cattle.io.project.vue +1 -0
- package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +4 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +2 -1
- package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
- package/edit/monitoring.coreos.com.receiver/index.vue +2 -1
- package/edit/monitoring.coreos.com.route.vue +1 -1
- package/edit/namespace.vue +1 -0
- package/edit/networking.istio.io.destinationrule/index.vue +1 -0
- package/edit/networking.k8s.io.ingress/index.vue +1 -0
- package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +15 -5
- package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +1 -0
- package/edit/networking.k8s.io.networkpolicy/index.vue +1 -0
- package/edit/node.vue +1 -0
- package/edit/persistentvolume/index.vue +27 -22
- package/edit/persistentvolume/plugins/awsElasticBlockStore.vue +13 -14
- package/edit/persistentvolume/plugins/azureDisk.vue +49 -48
- package/edit/persistentvolume/plugins/azureFile.vue +15 -14
- package/edit/persistentvolume/plugins/cephfs.vue +15 -14
- package/edit/persistentvolume/plugins/cinder.vue +15 -14
- package/edit/persistentvolume/plugins/csi.vue +18 -16
- package/edit/persistentvolume/plugins/fc.vue +13 -14
- package/edit/persistentvolume/plugins/flexVolume.vue +15 -14
- package/edit/persistentvolume/plugins/flocker.vue +1 -3
- package/edit/persistentvolume/plugins/gcePersistentDisk.vue +13 -14
- package/edit/persistentvolume/plugins/glusterfs.vue +15 -14
- package/edit/persistentvolume/plugins/hostPath.vue +40 -39
- package/edit/persistentvolume/plugins/iscsi.vue +13 -14
- package/edit/persistentvolume/plugins/local.vue +1 -3
- package/edit/persistentvolume/plugins/longhorn.vue +23 -22
- package/edit/persistentvolume/plugins/nfs.vue +15 -14
- package/edit/persistentvolume/plugins/photonPersistentDisk.vue +1 -14
- package/edit/persistentvolume/plugins/portworxVolume.vue +15 -14
- package/edit/persistentvolume/plugins/quobyte.vue +15 -14
- package/edit/persistentvolume/plugins/rbd.vue +15 -14
- package/edit/persistentvolume/plugins/scaleIO.vue +15 -14
- package/edit/persistentvolume/plugins/storageos.vue +15 -14
- package/edit/persistentvolume/plugins/vsphereVolume.vue +1 -3
- package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +32 -5
- package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +35 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/Networking.test.ts +155 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +11 -9
- package/edit/provisioning.cattle.io.cluster/index.vue +25 -15
- package/edit/provisioning.cattle.io.cluster/rke2.vue +98 -17
- package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +28 -2
- package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +107 -5
- package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +92 -4
- package/edit/secret/index.vue +1 -1
- package/edit/service.vue +9 -4
- package/edit/serviceaccount.vue +1 -0
- package/edit/storage.k8s.io.storageclass/index.vue +1 -0
- package/edit/workload/index.vue +2 -1
- package/edit/workload/mixins/workload.js +1 -1
- package/initialize/App.vue +4 -4
- package/initialize/install-directives.js +2 -0
- package/initialize/install-plugins.js +19 -2
- package/list/projectsecret.vue +1 -1
- package/list/provisioning.cattle.io.cluster.vue +15 -2
- package/machine-config/amazonec2.vue +42 -135
- package/machine-config/azure.vue +1 -1
- package/machine-config/components/EC2Networking.vue +490 -0
- package/machine-config/components/__tests__/EC2Networking.test.ts +148 -0
- package/machine-config/components/__tests__/utils/vpcSubnetMockData.js +294 -0
- package/machine-config/digitalocean.vue +11 -0
- package/machine-config/google.vue +1 -1
- package/mixins/__tests__/brand.spec.ts +2 -2
- package/mixins/__tests__/chart.test.ts +21 -0
- package/mixins/brand.js +1 -7
- package/mixins/chart.js +8 -2
- package/mixins/create-edit-view/index.js +5 -0
- package/models/__tests__/chart.test.ts +49 -12
- package/models/__tests__/compliance.cattle.io.clusterscanprofile.spec.js +30 -0
- package/models/__tests__/provisioning.cattle.io.cluster.test.ts +112 -5
- package/models/catalog.cattle.io.app.js +1 -1
- package/models/chart.js +28 -14
- package/models/cluster/node.js +13 -6
- package/models/cluster.x-k8s.io.machine.js +10 -20
- package/models/cluster.x-k8s.io.machinedeployment.js +5 -1
- package/models/compliance.cattle.io.clusterscanprofile.js +1 -1
- package/models/management.cattle.io.authconfig.js +1 -0
- package/models/management.cattle.io.cluster.js +21 -3
- package/models/management.cattle.io.kontainerdriver.js +1 -0
- package/models/provisioning.cattle.io.cluster.js +249 -33
- package/package.json +6 -5
- package/pages/auth/login.vue +43 -4
- package/pages/auth/verify.vue +1 -1
- package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +3 -2
- package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +135 -0
- package/pages/c/_cluster/apps/charts/chart.vue +35 -17
- package/pages/c/_cluster/apps/charts/index.vue +11 -13
- package/pages/c/_cluster/apps/charts/install.vue +1 -1
- package/pages/c/_cluster/explorer/EventsTable.vue +89 -3
- package/pages/c/_cluster/explorer/index.vue +8 -6
- package/pages/c/_cluster/explorer/tools/index.vue +3 -3
- package/pages/c/_cluster/manager/hostedprovider/index.vue +220 -0
- package/pages/c/_cluster/settings/brand.vue +1 -1
- package/pages/c/_cluster/settings/performance.vue +12 -25
- package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +7 -0
- package/pages/c/_cluster/uiplugins/catalogs.vue +147 -0
- package/pages/c/_cluster/uiplugins/index.vue +126 -184
- package/pages/home.vue +327 -16
- package/pkg/dynamic-importer.lib.js +4 -0
- package/plugins/axios.js +2 -1
- package/plugins/dashboard-client-init.js +3 -0
- package/plugins/dashboard-store/actions.js +1 -1
- package/plugins/dashboard-store/getters.js +18 -1
- package/plugins/dashboard-store/resource-class.js +21 -6
- package/plugins/dynamic-content.js +13 -0
- package/plugins/i18n.js +8 -0
- package/plugins/steve/__tests__/steve-pagination-utils.test.ts +333 -0
- package/plugins/steve/steve-pagination-utils.ts +41 -22
- package/plugins/steve/subscribe.js +17 -9
- package/plugins/subscribe-events.ts +4 -2
- package/rancher-components/Form/Checkbox/Checkbox.vue +1 -1
- package/rancher-components/Pill/RcStatusBadge/RcStatusBadge.vue +6 -34
- package/rancher-components/Pill/RcStatusBadge/index.ts +0 -1
- package/rancher-components/Pill/RcStatusBadge/types.ts +1 -1
- package/rancher-components/Pill/RcStatusIndicator/RcStatusIndicator.vue +5 -28
- package/rancher-components/Pill/RcStatusIndicator/types.ts +2 -1
- package/rancher-components/Pill/types.ts +0 -1
- package/rancher-components/RcDropdown/RcDropdownItem.vue +1 -0
- package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +5 -1
- package/rancher-components/RcIcon/RcIcon.test.ts +51 -0
- package/rancher-components/RcIcon/RcIcon.vue +46 -0
- package/rancher-components/RcIcon/index.ts +1 -0
- package/rancher-components/RcIcon/types.ts +160 -0
- package/rancher-components/utils/status.test.ts +67 -0
- package/rancher-components/utils/status.ts +77 -0
- package/scripts/extension/publish +1 -1
- package/scripts/typegen.sh +1 -0
- package/store/action-menu.js +8 -0
- package/store/auth.js +11 -6
- package/store/aws.js +8 -6
- package/store/catalog.js +6 -0
- package/store/features.js +2 -0
- package/store/index.js +45 -20
- package/store/notifications.ts +51 -4
- package/store/plugins.js +7 -3
- package/store/prefs.js +12 -6
- package/store/type-map.js +3 -3
- package/store/ui-context.ts +86 -0
- package/store/wm.ts +244 -0
- package/types/kube/kube-api.ts +2 -1
- package/types/notifications/index.ts +27 -3
- package/types/rancher/index.d.ts +1 -0
- package/types/resources/settings.d.ts +29 -7
- package/types/shell/index.d.ts +138 -4
- package/types/store/__tests__/pagination.types.spec.ts +137 -0
- package/types/store/pagination.types.ts +157 -9
- package/types/store/subscribe-events.types.ts +8 -1
- package/types/store/subscribe.types.ts +1 -0
- package/types/window-manager.ts +24 -0
- package/utils/__tests__/cluster.test.ts +379 -1
- package/utils/__tests__/object.test.ts +19 -0
- package/utils/__tests__/provider.test.ts +98 -0
- package/utils/__tests__/selector-typed.test.ts +263 -0
- package/utils/__tests__/version.test.ts +19 -1
- package/utils/autoscaler-utils.ts +7 -0
- package/utils/back-off.ts +3 -3
- package/utils/brand.ts +29 -0
- package/utils/chart.js +18 -0
- package/utils/cluster.js +157 -3
- package/utils/color.js +1 -1
- package/utils/dynamic-content/__tests__/announcement.test.ts +498 -0
- package/utils/dynamic-content/__tests__/config.test.ts +187 -0
- package/utils/dynamic-content/__tests__/index.test.ts +390 -0
- package/utils/dynamic-content/__tests__/info.test.ts +275 -0
- package/utils/dynamic-content/__tests__/new-release.test.ts +216 -0
- package/utils/dynamic-content/__tests__/support-notice.test.ts +262 -0
- package/utils/dynamic-content/__tests__/util.test.ts +235 -0
- package/utils/dynamic-content/announcement.ts +142 -0
- package/utils/dynamic-content/config.ts +55 -0
- package/utils/dynamic-content/example.json +40 -0
- package/utils/dynamic-content/index.ts +277 -0
- package/utils/dynamic-content/info.ts +261 -0
- package/utils/dynamic-content/new-release.ts +126 -0
- package/utils/dynamic-content/notification-handler.ts +48 -0
- package/utils/dynamic-content/support-notice.ts +169 -0
- package/utils/dynamic-content/types.d.ts +153 -0
- package/utils/dynamic-content/util.ts +122 -0
- package/utils/dynamic-importer.js +2 -2
- package/utils/favicon.js +4 -4
- package/utils/inactivity.ts +104 -0
- package/utils/object.js +20 -2
- package/utils/pagination-utils.ts +19 -4
- package/utils/pagination-wrapper.ts +12 -8
- package/utils/provider.ts +14 -0
- package/utils/release-notes.ts +1 -1
- package/utils/scroll.js +7 -0
- package/utils/selector-typed.ts +6 -2
- package/utils/settings.ts +15 -0
- package/utils/validators/machine-pool.ts +13 -3
- package/utils/version.js +15 -0
- package/assets/images/icons/document.svg +0 -3
- package/plugins/nuxt-client-init.js +0 -3
- package/store/wm.js +0 -95
- /package/components/{nav/WindowManager → Window}/ChartReadme.vue +0 -0
- /package/components/{nav/WindowManager → Window}/ContainerShell.vue +0 -0
- /package/components/{nav/WindowManager → Window}/KubectlShell.vue +0 -0
- /package/components/{nav/WindowManager → Window}/MachineSsh.vue +0 -0
- /package/components/{nav/WindowManager → Window}/Window.vue +0 -0
|
@@ -67,18 +67,19 @@ export default {
|
|
|
67
67
|
const shellShortcut = '(Ctrl+`)';
|
|
68
68
|
|
|
69
69
|
return {
|
|
70
|
-
authInfo:
|
|
71
|
-
show:
|
|
72
|
-
showTooltip:
|
|
73
|
-
isUserMenuOpen:
|
|
74
|
-
isPageActionMenuOpen:
|
|
75
|
-
kubeConfigCopying:
|
|
70
|
+
authInfo: {},
|
|
71
|
+
show: false,
|
|
72
|
+
showTooltip: false,
|
|
73
|
+
isUserMenuOpen: false,
|
|
74
|
+
isPageActionMenuOpen: false,
|
|
75
|
+
kubeConfigCopying: false,
|
|
76
76
|
searchShortcut,
|
|
77
77
|
shellShortcut,
|
|
78
78
|
LOGGED_OUT,
|
|
79
|
-
navHeaderRight:
|
|
80
|
-
extensionHeaderActions:
|
|
81
|
-
|
|
79
|
+
navHeaderRight: null,
|
|
80
|
+
extensionHeaderActions: getApplicableExtensionEnhancements(this, ExtensionPoint.ACTION, ActionLocation.HEADER, this.$route),
|
|
81
|
+
extensionActionsEnabled: {},
|
|
82
|
+
ctx: this
|
|
82
83
|
};
|
|
83
84
|
},
|
|
84
85
|
|
|
@@ -96,7 +97,6 @@ export default {
|
|
|
96
97
|
'isSingleProduct',
|
|
97
98
|
'isRancherInHarvester',
|
|
98
99
|
'showTopLevelMenu',
|
|
99
|
-
'isMultiCluster',
|
|
100
100
|
'showWorkspaceSwitcher'
|
|
101
101
|
]),
|
|
102
102
|
|
|
@@ -252,6 +252,7 @@ export default {
|
|
|
252
252
|
handler(neu) {
|
|
253
253
|
if (neu) {
|
|
254
254
|
this.extensionHeaderActions = getApplicableExtensionEnhancements(this, ExtensionPoint.ACTION, ActionLocation.HEADER, neu);
|
|
255
|
+
this.updateExtensionActionsEnabled();
|
|
255
256
|
|
|
256
257
|
this.navHeaderRight = this.$plugin?.getDynamic('component', 'NavHeaderRight');
|
|
257
258
|
}
|
|
@@ -368,7 +369,7 @@ export default {
|
|
|
368
369
|
});
|
|
369
370
|
},
|
|
370
371
|
|
|
371
|
-
handleExtensionAction(action, event) {
|
|
372
|
+
async handleExtensionAction(action, event) {
|
|
372
373
|
const fn = action.invoke;
|
|
373
374
|
const opts = {
|
|
374
375
|
event,
|
|
@@ -377,7 +378,7 @@ export default {
|
|
|
377
378
|
product: this.currentProduct.name,
|
|
378
379
|
cluster: this.currentCluster,
|
|
379
380
|
};
|
|
380
|
-
const enabled =
|
|
381
|
+
const enabled = await this.isActionEnabled(action);
|
|
381
382
|
|
|
382
383
|
if (fn && enabled) {
|
|
383
384
|
fn.apply(this, [opts, [], { $route: this.$route }]);
|
|
@@ -393,7 +394,25 @@ export default {
|
|
|
393
394
|
}
|
|
394
395
|
|
|
395
396
|
return null;
|
|
396
|
-
}
|
|
397
|
+
},
|
|
398
|
+
|
|
399
|
+
async updateExtensionActionsEnabled() {
|
|
400
|
+
for (const [i, action] of this.extensionHeaderActions.entries()) {
|
|
401
|
+
this.extensionActionsEnabled[i] = await this.isActionEnabled(action);
|
|
402
|
+
}
|
|
403
|
+
},
|
|
404
|
+
|
|
405
|
+
async isActionEnabled(action) {
|
|
406
|
+
if (action.enabled === undefined) {
|
|
407
|
+
return true;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
if (typeof action.enabled === 'function') {
|
|
411
|
+
return await action.enabled(this.ctx);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
return action.enabled;
|
|
415
|
+
},
|
|
397
416
|
}
|
|
398
417
|
};
|
|
399
418
|
</script>
|
|
@@ -404,7 +423,7 @@ export default {
|
|
|
404
423
|
data-testid="header"
|
|
405
424
|
>
|
|
406
425
|
<div>
|
|
407
|
-
<TopLevelMenu v-if="
|
|
426
|
+
<TopLevelMenu v-if="showTopLevelMenu" />
|
|
408
427
|
</div>
|
|
409
428
|
|
|
410
429
|
<div
|
|
@@ -475,7 +494,7 @@ export default {
|
|
|
475
494
|
:alt="t('branding.logos.label')"
|
|
476
495
|
/>
|
|
477
496
|
<div
|
|
478
|
-
v-if="!currentCluster"
|
|
497
|
+
v-if="!currentCluster && !$route.path.startsWith('/c/')"
|
|
479
498
|
class="simple-title"
|
|
480
499
|
>
|
|
481
500
|
<BrandImage
|
|
@@ -642,7 +661,7 @@ export default {
|
|
|
642
661
|
:key="`${action.label}${i}`"
|
|
643
662
|
v-clean-tooltip="handleExtensionTooltip(action)"
|
|
644
663
|
v-shortkey="action.shortcutKey"
|
|
645
|
-
:disabled="
|
|
664
|
+
:disabled="!extensionActionsEnabled[i]"
|
|
646
665
|
type="button"
|
|
647
666
|
class="btn header-btn role-tertiary"
|
|
648
667
|
:data-testid="`extension-header-action-${ action.labelKey || action.label }`"
|
|
@@ -837,11 +856,13 @@ export default {
|
|
|
837
856
|
|
|
838
857
|
.product-name {
|
|
839
858
|
font-size: 16px;
|
|
859
|
+
font-family: var(--title-font-family, unset); // Use the var if set, otherwise unset and use the font defined by the parent
|
|
840
860
|
}
|
|
841
861
|
|
|
842
862
|
.side-menu-logo {
|
|
843
863
|
align-items: center;
|
|
844
864
|
display: flex;
|
|
865
|
+
height: 55px;
|
|
845
866
|
margin-right: 8px;
|
|
846
867
|
max-width: 200px;
|
|
847
868
|
padding: 12px 0;
|
|
@@ -673,9 +673,16 @@ export default {
|
|
|
673
673
|
},
|
|
674
674
|
|
|
675
675
|
removeOption(ns, event) {
|
|
676
|
-
this.selectOption(ns);
|
|
677
676
|
event.preventDefault();
|
|
678
677
|
event.stopPropagation();
|
|
678
|
+
|
|
679
|
+
this.selectOption(ns);
|
|
680
|
+
|
|
681
|
+
if (event.type !== 'keydown' || this.value.length !== 0) {
|
|
682
|
+
return;
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
this.$refs.namespaceFilterInput.focus();
|
|
679
686
|
},
|
|
680
687
|
|
|
681
688
|
defaultOption() {
|
|
@@ -782,6 +789,7 @@ export default {
|
|
|
782
789
|
ghost
|
|
783
790
|
class="ns-chip-button"
|
|
784
791
|
:data-testid="`namespaces-values-close-${j}`"
|
|
792
|
+
:aria-label="t('namespaceFilter.removeNamespace', { name: ns.label })"
|
|
785
793
|
@click="removeOption(ns, $event)"
|
|
786
794
|
@keydown.enter.space.stop="removeOption(ns, $event)"
|
|
787
795
|
@mousedown="handleValueMouseDown(ns, $event)"
|
|
@@ -951,6 +959,10 @@ export default {
|
|
|
951
959
|
display: inline-block;
|
|
952
960
|
border-radius: var(--border-radius);
|
|
953
961
|
|
|
962
|
+
&:focus, &.focused {
|
|
963
|
+
@include focus-outline;
|
|
964
|
+
}
|
|
965
|
+
|
|
954
966
|
.ns-glass {
|
|
955
967
|
top: 0;
|
|
956
968
|
bottom: 0;
|
|
@@ -13,7 +13,8 @@ import {
|
|
|
13
13
|
} from '@components/RcDropdown';
|
|
14
14
|
|
|
15
15
|
const store = useStore();
|
|
16
|
-
|
|
16
|
+
// We don't want any hidden notifications showing in the notification center (these are shown elsewhere, e.g. home page dynamic content announcements)
|
|
17
|
+
const allNotifications = computed(() => store.getters['notifications/visible']);
|
|
17
18
|
const unreadLevelClass = computed(() => {
|
|
18
19
|
return store.getters['notifications/unreadCount'] === 0 ? '' : 'unread';
|
|
19
20
|
});
|
|
@@ -28,6 +28,7 @@ interface UpdateArgs {
|
|
|
28
28
|
searchTerm: string,
|
|
29
29
|
pinnedIds: string[],
|
|
30
30
|
unPinnedMax?: number,
|
|
31
|
+
forceWatch?: boolean
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
type MgmtCluster = {
|
|
@@ -192,9 +193,12 @@ export class TopLevelMenuHelperPagination extends BaseTopLevelMenuHelper impleme
|
|
|
192
193
|
this.clustersOthersWrapper = new PaginationWrapper({
|
|
193
194
|
$store,
|
|
194
195
|
id: 'tlm-unpinned-clusters',
|
|
195
|
-
onChange: async() => {
|
|
196
|
+
onChange: async({ forceWatch }) => {
|
|
196
197
|
if (this.args) {
|
|
197
|
-
await this.update(
|
|
198
|
+
await this.update({
|
|
199
|
+
...this.args,
|
|
200
|
+
forceWatch
|
|
201
|
+
});
|
|
198
202
|
}
|
|
199
203
|
},
|
|
200
204
|
enabledFor: {
|
|
@@ -210,9 +214,12 @@ export class TopLevelMenuHelperPagination extends BaseTopLevelMenuHelper impleme
|
|
|
210
214
|
this.provClusterWrapper = new PaginationWrapper({
|
|
211
215
|
$store,
|
|
212
216
|
id: 'tlm-prov-clusters',
|
|
213
|
-
onChange: async() => {
|
|
217
|
+
onChange: async({ forceWatch }) => {
|
|
214
218
|
if (this.args) {
|
|
215
|
-
await this.update(
|
|
219
|
+
await this.update({
|
|
220
|
+
...this.args,
|
|
221
|
+
forceWatch
|
|
222
|
+
});
|
|
216
223
|
}
|
|
217
224
|
},
|
|
218
225
|
enabledFor: {
|
|
@@ -244,7 +251,7 @@ export class TopLevelMenuHelperPagination extends BaseTopLevelMenuHelper impleme
|
|
|
244
251
|
pinned: MgmtCluster[],
|
|
245
252
|
notPinned: MgmtCluster[]
|
|
246
253
|
} = await allHash(promises) as any;
|
|
247
|
-
const provClusters = await this.updateProvCluster(res.notPinned, res.pinned);
|
|
254
|
+
const provClusters = await this.updateProvCluster(res.notPinned, res.pinned, args.forceWatch || false);
|
|
248
255
|
const provClustersByMgmtId = provClusters.reduce((res: { [mgmtId: string]: ProvCluster}, provCluster: ProvCluster) => {
|
|
249
256
|
if (provCluster.mgmtClusterId) {
|
|
250
257
|
res[provCluster.mgmtClusterId] = provCluster;
|
|
@@ -340,6 +347,7 @@ export class TopLevelMenuHelperPagination extends BaseTopLevelMenuHelper impleme
|
|
|
340
347
|
}
|
|
341
348
|
|
|
342
349
|
return this.clustersPinnedWrapper.request({
|
|
350
|
+
forceWatch: args.forceWatch,
|
|
343
351
|
pagination: {
|
|
344
352
|
filters: this.constructParams({
|
|
345
353
|
pinnedIds: args.pinnedIds,
|
|
@@ -357,6 +365,7 @@ export class TopLevelMenuHelperPagination extends BaseTopLevelMenuHelper impleme
|
|
|
357
365
|
*/
|
|
358
366
|
private async updateOthers(args: UpdateArgs): Promise<MgmtCluster[]> {
|
|
359
367
|
return this.clustersOthersWrapper.request({
|
|
368
|
+
forceWatch: args.forceWatch,
|
|
360
369
|
pagination: {
|
|
361
370
|
filters: this.constructParams({
|
|
362
371
|
searchTerm: args.searchTerm,
|
|
@@ -375,8 +384,9 @@ export class TopLevelMenuHelperPagination extends BaseTopLevelMenuHelper impleme
|
|
|
375
384
|
/**
|
|
376
385
|
* Find all provisioning clusters associated with the displayed mgmt clusters
|
|
377
386
|
*/
|
|
378
|
-
private async updateProvCluster(notPinned: MgmtCluster[], pinned: MgmtCluster[]): Promise<ProvCluster[]> {
|
|
387
|
+
private async updateProvCluster(notPinned: MgmtCluster[], pinned: MgmtCluster[], forceWatch: boolean): Promise<ProvCluster[]> {
|
|
379
388
|
return this.provClusterWrapper.request({
|
|
389
|
+
forceWatch,
|
|
380
390
|
pagination: {
|
|
381
391
|
filters: [
|
|
382
392
|
PaginationParamFilter.createMultipleFields(
|
|
@@ -975,6 +975,8 @@ export default {
|
|
|
975
975
|
$option-height: $icon-size + $option-padding + $option-padding;
|
|
976
976
|
|
|
977
977
|
.side-menu {
|
|
978
|
+
font-family: var(--title-font-family, unset); // Use the var if set, otherwise unset and use the font defined by the parent
|
|
979
|
+
|
|
978
980
|
.menu {
|
|
979
981
|
position: absolute;
|
|
980
982
|
width: $app-bar-collapsed-width;
|
|
@@ -1086,7 +1088,7 @@ export default {
|
|
|
1086
1088
|
align-items: center;
|
|
1087
1089
|
cursor: pointer;
|
|
1088
1090
|
display: flex;
|
|
1089
|
-
color: var(--link);
|
|
1091
|
+
color: var(--on-tertiary, var(--link));
|
|
1090
1092
|
font-size: 14px;
|
|
1091
1093
|
height: $option-height;
|
|
1092
1094
|
white-space: nowrap;
|
|
@@ -1177,7 +1179,7 @@ export default {
|
|
|
1177
1179
|
.rancher-provider-icon,
|
|
1178
1180
|
svg {
|
|
1179
1181
|
margin-right: 16px;
|
|
1180
|
-
fill: var(--link);
|
|
1182
|
+
fill: var(--on-tertiary, var(--link));
|
|
1181
1183
|
}
|
|
1182
1184
|
|
|
1183
1185
|
.top-menu-icon {
|
|
@@ -1,105 +1,71 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import {
|
|
3
|
-
import { mapState } from 'vuex';
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { onMounted } from 'vue';
|
|
4
3
|
import { BOTTOM, CENTER, LEFT, RIGHT } from '@shell/utils/position';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
computed: {
|
|
28
|
-
|
|
29
|
-
...mapState('wm', ['userPin']),
|
|
30
|
-
|
|
31
|
-
pin: {
|
|
32
|
-
get(): Zone {
|
|
33
|
-
return this.userPin;
|
|
34
|
-
},
|
|
35
|
-
|
|
36
|
-
set(pin: Zone) {
|
|
37
|
-
if (pin === CENTER) {
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
window.localStorage.setItem('wm-pin', pin as string);
|
|
41
|
-
this.$store.commit('wm/setUserPin', pin);
|
|
42
|
-
},
|
|
43
|
-
},
|
|
44
|
-
|
|
45
|
-
},
|
|
46
|
-
|
|
47
|
-
methods: {
|
|
48
|
-
|
|
49
|
-
onDragStart() {
|
|
50
|
-
this.drag.active = true;
|
|
51
|
-
},
|
|
52
|
-
|
|
53
|
-
onDragOver(event: DragEvent, zone: Zone) {
|
|
54
|
-
this.drag.zone = zone;
|
|
55
|
-
if (zone !== CENTER) {
|
|
56
|
-
event.preventDefault();
|
|
57
|
-
}
|
|
58
|
-
},
|
|
59
|
-
|
|
60
|
-
onDragEnd() {
|
|
61
|
-
this.pin = this.drag.zone;
|
|
62
|
-
this.drag = {
|
|
63
|
-
active: false,
|
|
64
|
-
zone: CENTER,
|
|
65
|
-
};
|
|
66
|
-
},
|
|
67
|
-
|
|
68
|
-
}
|
|
4
|
+
import useDragHandler from './composables/useDragHandler';
|
|
5
|
+
import { Z_INDEX } from './constants';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* This component is responsible for rendering the pin area used during tab dragging.
|
|
9
|
+
*
|
|
10
|
+
* Behavior:
|
|
11
|
+
* - Enable drag areas for each position (left, right, bottom, center) when dragging is active.
|
|
12
|
+
* - Highlights the area where the tab can be pinned.
|
|
13
|
+
* - Uses z-index variables to ensure proper layering of drag areas.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const {
|
|
17
|
+
dragOverPositionsActive, pin, pinArea, lockedPositions, onDragPositionOver
|
|
18
|
+
} = useDragHandler();
|
|
19
|
+
|
|
20
|
+
onMounted(() => {
|
|
21
|
+
Object.keys(Z_INDEX).forEach((key) => {
|
|
22
|
+
document.documentElement.style.setProperty(
|
|
23
|
+
`--drag-area-${ key.toLowerCase().replaceAll('_', '-') }-z-index`, (Z_INDEX as any)[key].toString()
|
|
24
|
+
);
|
|
25
|
+
});
|
|
69
26
|
});
|
|
70
27
|
</script>
|
|
71
28
|
|
|
72
29
|
<template>
|
|
73
|
-
<div
|
|
30
|
+
<div
|
|
31
|
+
v-if="dragOverPositionsActive"
|
|
32
|
+
class="pin-area-container"
|
|
33
|
+
>
|
|
74
34
|
<span
|
|
75
|
-
v-if="
|
|
35
|
+
v-if="pinArea != pin"
|
|
76
36
|
class="pin-effect-area"
|
|
77
|
-
:class="
|
|
37
|
+
:class="pinArea"
|
|
78
38
|
/>
|
|
79
39
|
<span
|
|
80
40
|
class="drag-area center"
|
|
81
|
-
@dragover="
|
|
41
|
+
@dragover="onDragPositionOver($event, CENTER)"
|
|
82
42
|
/>
|
|
83
43
|
<span
|
|
44
|
+
v-if="!lockedPositions.includes(RIGHT)"
|
|
84
45
|
class="drag-area right"
|
|
85
|
-
@dragover="
|
|
46
|
+
@dragover="onDragPositionOver($event, RIGHT)"
|
|
86
47
|
/>
|
|
87
48
|
<span
|
|
88
|
-
|
|
89
|
-
|
|
49
|
+
v-if="!lockedPositions.includes(LEFT)"
|
|
50
|
+
class="drag-area left"
|
|
51
|
+
@dragover="onDragPositionOver($event, LEFT)"
|
|
90
52
|
/>
|
|
91
53
|
<span
|
|
92
|
-
|
|
93
|
-
|
|
54
|
+
v-if="!lockedPositions.includes(BOTTOM)"
|
|
55
|
+
class="drag-area bottom"
|
|
56
|
+
@dragover="onDragPositionOver($event, BOTTOM)"
|
|
94
57
|
/>
|
|
95
58
|
</div>
|
|
96
59
|
</template>
|
|
97
60
|
|
|
98
61
|
<style lang='scss' scoped>
|
|
62
|
+
.pin-area-container {
|
|
63
|
+
display: contents;
|
|
64
|
+
}
|
|
99
65
|
|
|
100
66
|
.pin-effect-area {
|
|
101
67
|
position: absolute;
|
|
102
|
-
z-index:
|
|
68
|
+
z-index: var(--drag-area-pin-effect-z-index);
|
|
103
69
|
width: 0;
|
|
104
70
|
height: 0;
|
|
105
71
|
border-style: hidden;
|
|
@@ -142,10 +108,8 @@ export default defineComponent({
|
|
|
142
108
|
}
|
|
143
109
|
}
|
|
144
110
|
|
|
145
|
-
// ToDo make height and width as input variable
|
|
146
111
|
.drag-area {
|
|
147
112
|
position: absolute;
|
|
148
|
-
z-index: 999;
|
|
149
113
|
width: 0;
|
|
150
114
|
height: 0;
|
|
151
115
|
opacity: 0;
|
|
@@ -155,7 +119,7 @@ export default defineComponent({
|
|
|
155
119
|
right: 0;
|
|
156
120
|
width: 100%;
|
|
157
121
|
height: 100%;
|
|
158
|
-
z-index:
|
|
122
|
+
z-index: var(--drag-area-center-z-index);
|
|
159
123
|
}
|
|
160
124
|
|
|
161
125
|
&.right {
|
|
@@ -163,6 +127,7 @@ export default defineComponent({
|
|
|
163
127
|
right: 0;
|
|
164
128
|
width: 300px;
|
|
165
129
|
height: 100%;
|
|
130
|
+
z-index: var(--drag-area-right-z-index);
|
|
166
131
|
}
|
|
167
132
|
|
|
168
133
|
&.left {
|
|
@@ -170,12 +135,14 @@ export default defineComponent({
|
|
|
170
135
|
left: 0;
|
|
171
136
|
width: 300px;
|
|
172
137
|
height: 100%;
|
|
138
|
+
z-index: var(--drag-area-left-z-index);
|
|
173
139
|
}
|
|
174
140
|
|
|
175
141
|
&.bottom {
|
|
176
142
|
bottom: 0;
|
|
177
143
|
height: 270px;
|
|
178
144
|
width: 100%;
|
|
145
|
+
z-index: var(--drag-area-bottom-z-index);
|
|
179
146
|
}
|
|
180
147
|
}
|
|
181
148
|
</style>
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ref,
|
|
3
|
+
markRaw,
|
|
4
|
+
} from 'vue';
|
|
5
|
+
import { useStore } from 'vuex';
|
|
6
|
+
|
|
7
|
+
const warn = (msg: string, ...args: any[]) => {
|
|
8
|
+
console.warn(`[wm] ${ msg } ${ args?.reduce((acc, v) => `${ acc } '${ v }'`, '') }`); /* eslint-disable-line no-console */
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* This composable is responsible for loading the tabs body components.
|
|
13
|
+
*
|
|
14
|
+
* - It supports loading components from Rancher extensions as well as from the TypeMap (defined in shell/components/Window directory).
|
|
15
|
+
* - The component is cached after the first load to optimize performance.
|
|
16
|
+
*
|
|
17
|
+
* Loading a component from extension:
|
|
18
|
+
*
|
|
19
|
+
* // Register the component in the extension index file:
|
|
20
|
+
* plugin.register('component', 'TestComponent', defineAsyncComponent(() => import('./pages/TestComponent.vue')));
|
|
21
|
+
*
|
|
22
|
+
* // Use the component in a tab by specifying its name and extensionId:
|
|
23
|
+
* store.dispatch('wm/open', {
|
|
24
|
+
* id: PRODUCT_NAME,
|
|
25
|
+
* extensionId: PRODUCT_NAME,
|
|
26
|
+
* label: 'Label',
|
|
27
|
+
* component: 'TestComponent',
|
|
28
|
+
* position: 'bottom',
|
|
29
|
+
* layouts: [
|
|
30
|
+
* Layout.default,
|
|
31
|
+
* Layout.home
|
|
32
|
+
* ],
|
|
33
|
+
* showHeader: false,
|
|
34
|
+
* }, { root: true });
|
|
35
|
+
*
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
export default () => {
|
|
39
|
+
const store = useStore();
|
|
40
|
+
|
|
41
|
+
const components = ref<any>({});
|
|
42
|
+
|
|
43
|
+
function loadComponent(tab: { component?: string, extensionId?: string }) {
|
|
44
|
+
const { component: name, extensionId } = tab || {};
|
|
45
|
+
|
|
46
|
+
if (!name) {
|
|
47
|
+
warn('component name not provided');
|
|
48
|
+
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (!components.value[name]) {
|
|
53
|
+
if (!!extensionId) {
|
|
54
|
+
warn(`loading component from extension`, name, extensionId);
|
|
55
|
+
components.value[name] = markRaw((store as any).$extension?.getDynamic('component', name));
|
|
56
|
+
} else if (store.getters['type-map/hasCustomWindowComponent'](name)) {
|
|
57
|
+
warn(`loading component from TypeMap`, name);
|
|
58
|
+
components.value[name] = markRaw(store.getters['type-map/importWindowComponent'](name));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (!components.value[name]) {
|
|
63
|
+
warn(`component not found for`, name);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return components.value[name];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return { loadComponent };
|
|
70
|
+
};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { computed } from 'vue';
|
|
2
|
+
import debounce from 'lodash/debounce';
|
|
3
|
+
import { useStore } from 'vuex';
|
|
4
|
+
import { BOTTOM, LEFT, RIGHT } from '@shell/utils/position';
|
|
5
|
+
import { Position } from '@shell/types/window-manager';
|
|
6
|
+
import { CSS_KEY } from '../constants';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* This composable is responsible for handling the dimensions of the window manager panels.
|
|
10
|
+
*/
|
|
11
|
+
export default (props: { position: Position }) => {
|
|
12
|
+
const store = useStore();
|
|
13
|
+
|
|
14
|
+
const height = computed({
|
|
15
|
+
get() {
|
|
16
|
+
const panelHeight = store.state.wm.panelHeight[props.position];
|
|
17
|
+
|
|
18
|
+
if (panelHeight) {
|
|
19
|
+
return panelHeight;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const windowHeight = window.innerHeight;
|
|
23
|
+
let height = panelHeight ? parseInt(panelHeight, 10) : 0;
|
|
24
|
+
|
|
25
|
+
if ( !height ) {
|
|
26
|
+
height = Math.round(windowHeight / 2);
|
|
27
|
+
}
|
|
28
|
+
height = Math.min(height, 3 * windowHeight / 4);
|
|
29
|
+
|
|
30
|
+
setDimensions({ height });
|
|
31
|
+
|
|
32
|
+
return height;
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
set(height) {
|
|
36
|
+
setDimensions({ height });
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const width = computed({
|
|
41
|
+
get() {
|
|
42
|
+
const panelWidth = store.state.wm.panelWidth[props.position];
|
|
43
|
+
|
|
44
|
+
if (panelWidth) {
|
|
45
|
+
return panelWidth;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const windowWidth = window.innerWidth;
|
|
49
|
+
let width = panelWidth ? parseInt(panelWidth, 10) : 0;
|
|
50
|
+
|
|
51
|
+
if (!width) {
|
|
52
|
+
width = Math.round(windowWidth / 8);
|
|
53
|
+
}
|
|
54
|
+
width = Math.min(width, 3 * windowWidth / 4);
|
|
55
|
+
|
|
56
|
+
setDimensions({ width });
|
|
57
|
+
|
|
58
|
+
return width;
|
|
59
|
+
},
|
|
60
|
+
set(width) {
|
|
61
|
+
setDimensions({ width });
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
function openPanel(position: Position) {
|
|
66
|
+
setCssVariable(position, position === BOTTOM ? height.value : width.value);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function closePanel(position: Position) {
|
|
70
|
+
setCssVariable(position, 0);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function setDimensions(args: { width?: number, height?: number } = {}) {
|
|
74
|
+
const h = Number(args.height || height.value) || 0;
|
|
75
|
+
const w = Number(args.width || width.value) || 0;
|
|
76
|
+
|
|
77
|
+
switch (props.position) {
|
|
78
|
+
case RIGHT:
|
|
79
|
+
case LEFT:
|
|
80
|
+
setCssVariable(props.position, w);
|
|
81
|
+
debouncedSetPanelWidth(props.position, w);
|
|
82
|
+
break;
|
|
83
|
+
case BOTTOM:
|
|
84
|
+
setCssVariable(BOTTOM, h);
|
|
85
|
+
debouncedSetPanelHeight(props.position, h);
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const debouncedSetPanelWidth = debounce((position, width) => {
|
|
91
|
+
store.commit('wm/setPanelWidth', { position, width });
|
|
92
|
+
}, 250);
|
|
93
|
+
|
|
94
|
+
const debouncedSetPanelHeight = debounce((position, height) => {
|
|
95
|
+
store.commit('wm/setPanelHeight', { position, height });
|
|
96
|
+
}, 250);
|
|
97
|
+
|
|
98
|
+
function setCssVariable(position: Position, value: number) {
|
|
99
|
+
document.documentElement.style.setProperty(CSS_KEY[position as keyof typeof CSS_KEY], `${ value }px`);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return {
|
|
103
|
+
width, height, setDimensions, openPanel, closePanel,
|
|
104
|
+
};
|
|
105
|
+
};
|