@rancher/shell 3.0.12-rc.2 → 3.0.12-rc.4
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/apis/impl/apis.ts +6 -0
- package/apis/index.ts +26 -0
- package/apis/intf/resources-api/cluster-api.ts +18 -0
- package/apis/intf/resources-api/mgmt-api.ts +15 -0
- package/apis/intf/resources-api/resource-base.ts +107 -0
- package/apis/intf/resources-api/resource-constants.ts +147 -0
- package/apis/intf/resources-api/resources-api.ts +143 -0
- package/apis/intf/resources.ts +49 -0
- package/apis/intf/{modal.ts → shell-api/modal.ts} +21 -26
- package/apis/intf/shell-api/proxy.ts +216 -0
- package/apis/intf/{slide-in.ts → shell-api/slide-in.ts} +4 -3
- package/apis/intf/{system.ts → shell-api/system.ts} +4 -1
- package/apis/intf/shell.ts +12 -6
- package/apis/resources/__tests__/resources-api-class.test.ts +550 -0
- package/apis/resources/index.ts +22 -0
- package/apis/resources/resources-api-class.ts +187 -0
- package/apis/shell/__tests__/proxy.test.ts +369 -0
- package/apis/shell/index.ts +8 -1
- package/apis/shell/modal.ts +4 -1
- package/apis/shell/notifications.ts +9 -6
- package/apis/shell/proxy.ts +256 -0
- package/apis/shell/slide-in.ts +4 -1
- package/apis/vue-shim.d.ts +2 -1
- package/assets/data/aws-regions.json +4 -0
- package/assets/fonts/lato/LatoLatin-Black.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Black.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-BlackItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-BlackItalic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Bold.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Bold.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-BoldItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-BoldItalic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Heavy.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Heavy.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-HeavyItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-HeavyItalic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Italic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Italic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Light.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Light.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-LightItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-LightItalic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Medium.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Medium.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-MediumItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-MediumItalic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Regular.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Regular.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Semibold.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Semibold.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-SemiboldItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-SemiboldItalic.woff2 +0 -0
- package/assets/styles/base/_variables.scss +2 -0
- package/assets/styles/fonts/_fontstack.scss +132 -8
- package/assets/styles/global/_layout.scss +4 -0
- package/assets/translations/en-us.yaml +165 -45
- package/assets/translations/zh-hans.yaml +1 -7
- package/chart/monitoring/ClusterSelector.vue +0 -21
- package/chart/monitoring/index.vue +10 -1
- package/chart/monitoring/prometheus/index.vue +6 -3
- package/components/ActionDropdownShell.vue +2 -1
- package/components/CruResource.vue +161 -14
- package/components/CruResourceFooter.vue +9 -5
- package/components/ExplorerMembers.vue +8 -4
- package/components/ExplorerProjectsNamespaces.vue +11 -7
- package/components/GrowlManager.vue +4 -0
- package/components/InstallHelmCharts.vue +2 -2
- package/components/LandingPagePreference.vue +14 -5
- package/components/MgmtNodeList.vue +184 -0
- package/components/Resource/Detail/Card/StateCard/__tests__/composables.test.ts +90 -1
- package/components/Resource/Detail/Card/StateCard/composables.ts +57 -87
- package/components/Resource/Detail/Card/StatusCard/__tests__/StatusCard.test.ts +61 -0
- package/components/Resource/Detail/Card/StatusCard/index.vue +61 -15
- package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +17 -1
- package/components/Resource/Detail/Metadata/KeyValue.vue +5 -2
- package/components/Resource/Detail/Metadata/KeyValueRow.vue +2 -6
- package/components/Resource/Detail/Metadata/index.vue +6 -0
- package/components/Resource/Detail/ResourcePopover/index.vue +12 -1
- package/components/Resource/Detail/SpacedRow.vue +3 -1
- package/components/Resource/Detail/TitleBar/index.vue +10 -11
- package/components/ResourceDetail/index.vue +1 -1
- package/components/ResourceList/Masthead.vue +19 -9
- package/components/ResourceList/index.vue +82 -1
- package/components/RichTranslation.vue +5 -2
- package/components/SelectIconGrid.vue +0 -10
- package/components/Setting.vue +1 -0
- package/components/SingleClusterInfo.vue +1 -0
- package/components/SortableTable/__tests__/sorting.test.ts +126 -0
- package/components/SortableTable/index.vue +6 -9
- package/components/SortableTable/selection.js +23 -5
- package/components/SortableTable/sorting.js +6 -3
- package/components/SubtleLink.vue +31 -6
- package/components/Tabbed/Tab.vue +29 -3
- package/components/Tabbed/index.vue +25 -3
- package/components/TableOfContents/TableOfContents.vue +109 -0
- package/components/TableOfContents/composables.ts +258 -0
- package/components/Window/ContainerShell.vue +21 -11
- package/components/Window/__tests__/ContainerShell.test.ts +107 -37
- package/components/Wizard.vue +23 -17
- package/components/fleet/AppCoChartGrid.vue +401 -0
- package/components/fleet/AppCoEmptyState.vue +127 -0
- package/components/fleet/AppCoPageHeader.vue +119 -0
- package/components/fleet/AppCoVersionSelect.vue +70 -0
- package/components/fleet/FleetBundles.vue +100 -12
- package/components/fleet/FleetClusterTargets/ClusterSelectionFields.vue +217 -0
- package/components/fleet/FleetClusterTargets/TargetsList.vue +123 -35
- package/components/fleet/FleetClusterTargets/index.vue +226 -161
- package/components/fleet/FleetIntro.vue +7 -3
- package/components/fleet/FleetNoWorkspaces.vue +7 -3
- package/components/fleet/FleetSecretSelector.vue +5 -3
- package/components/fleet/FleetValuesFrom.vue +8 -2
- package/components/fleet/GitRepoTargetTab.vue +0 -2
- package/components/fleet/HelmOpAdvancedTab.vue +19 -53
- package/components/fleet/HelmOpAppCoConfigTab.vue +593 -0
- package/components/fleet/HelmOpAppCoResourcesSection.vue +162 -0
- package/components/fleet/HelmOpResourcesSection.vue +82 -0
- package/components/fleet/HelmOpTargetOptionsSection.vue +89 -0
- package/components/fleet/HelmOpTargetTab.vue +64 -60
- package/components/fleet/HelmOpValuesTab.vue +129 -105
- package/components/fleet/__tests__/AppCoEmptyState.test.ts +71 -0
- package/components/fleet/__tests__/AppCoVersionSelect.test.ts +36 -0
- package/components/fleet/__tests__/ClusterSelectionFields.test.ts +62 -0
- package/components/fleet/__tests__/FleetClusterTargets.test.ts +402 -115
- package/components/fleet/__tests__/FleetClusters.test.ts +12 -12
- package/components/fleet/__tests__/FleetSecretSelector.test.ts +16 -0
- package/components/fleet/__tests__/FleetValuesFrom.test.ts +44 -0
- package/components/fleet/__tests__/HelmOpAppCoConfigTab.test.ts +59 -0
- package/components/fleet/__tests__/HelmOpAppCoResourcesSection.test.ts +62 -0
- package/components/fleet/__tests__/HelmOpResourcesSection.test.ts +43 -0
- package/components/fleet/__tests__/HelmOpTargetOptionsSection.test.ts +34 -0
- package/components/fleet/__tests__/HelmOpValuesTab.test.ts +39 -0
- package/components/fleet/__tests__/__snapshots__/AppCoEmptyState.test.ts.snap +97 -0
- package/components/fleet/__tests__/__snapshots__/AppCoVersionSelect.test.ts.snap +30 -0
- package/components/fleet/__tests__/__snapshots__/ClusterSelectionFields.test.ts.snap +209 -0
- package/components/fleet/__tests__/__snapshots__/HelmOpTargetOptionsSection.test.ts.snap +140 -0
- package/components/fleet/dashboard/Empty.vue +8 -4
- package/components/fleet/dashboard/ResourceCard.vue +28 -0
- package/components/fleet/dashboard/ResourceDetails.vue +28 -0
- package/components/fleet/dashboard/__tests__/ResourceCard.test.ts +87 -0
- package/components/form/ArrayList.vue +61 -4
- package/components/form/KeyValue.vue +23 -2
- package/components/form/LabeledSelect.vue +59 -4
- package/components/form/Labels.vue +22 -3
- package/components/form/NameNsDescription.vue +24 -5
- package/components/form/ResourceTabs/index.vue +1 -0
- package/components/form/Security.vue +6 -2
- package/components/form/WorkloadPorts.vue +2 -7
- package/components/form/__tests__/NameNsDescription.test.ts +75 -0
- package/components/form/__tests__/Security.test.ts +76 -0
- package/components/formatter/Autoscaler.vue +4 -4
- package/components/formatter/ClusterKubeVersion.vue +27 -0
- package/components/formatter/ClusterLink.vue +1 -7
- package/components/formatter/ClusterProvider.vue +6 -10
- package/components/formatter/FleetSummaryGraph.vue +0 -3
- package/components/formatter/InternalExternalIP.vue +10 -4
- package/components/formatter/MachineSummaryGraph.vue +1 -1
- package/components/formatter/PodsUsage.vue +2 -2
- package/components/formatter/ServiceTargets.vue +26 -7
- package/components/formatter/__tests__/Autoscaler.test.ts +19 -22
- package/components/formatter/__tests__/FleetSummaryGraph.test.ts +216 -0
- package/components/formatter/__tests__/InternalExternalIP.test.ts +132 -0
- package/components/formatter/__tests__/PodsUsage.test.ts +6 -10
- package/components/formatter/__tests__/ServiceTargets.test.ts +412 -0
- package/components/nav/Header.vue +4 -0
- package/components/nav/NamespaceFilter.vue +2 -2
- package/components/nav/TopLevelMenu.helper.ts +15 -3
- package/components/nav/TopLevelMenu.vue +22 -6
- package/components/nav/__tests__/Header.test.ts +15 -0
- package/components/nav/__tests__/TopLevelMenu.test.ts +263 -21
- package/components/templates/default.vue +9 -4
- package/components/templates/home.vue +23 -0
- package/components/templates/plain.vue +23 -0
- package/components/templates/standalone.vue +17 -0
- package/composables/useFormValidation.ts +93 -0
- package/composables/useHelmOpResources.test.ts +56 -0
- package/composables/useHelmOpResources.ts +32 -0
- package/composables/useStateColor.test.ts +325 -0
- package/composables/useStateColor.ts +128 -0
- package/composables/useVeeValidateField.test.ts +159 -0
- package/composables/useVeeValidateField.ts +67 -0
- package/config/home-links.js +1 -1
- package/config/labels-annotations.js +1 -0
- package/config/pagination-table-headers.js +18 -1
- package/config/product/explorer.js +17 -4
- package/config/product/manager.js +84 -21
- package/config/router/index.js +16 -0
- package/config/router/navigation-guards/__tests__/authentication.test.ts +130 -0
- package/config/router/navigation-guards/authentication.js +10 -4
- package/config/router/routes.js +26 -6
- package/config/settings.ts +0 -2
- package/config/table-headers.js +23 -5
- package/config/types.js +11 -1
- package/core/__tests__/plugin-products.test.ts +904 -20
- package/core/plugin-products-base.ts +110 -10
- package/core/plugin-products.ts +4 -0
- package/core/plugin-types.ts +194 -31
- package/core/plugin.ts +18 -7
- package/core/productDebugger.js +9 -4
- package/core/types-provisioning.ts +77 -31
- package/core/types.ts +72 -22
- package/detail/__tests__/pod.test.ts +41 -0
- package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +114 -0
- package/detail/__tests__/workload.test.ts +3 -152
- package/detail/catalog.cattle.io.clusterrepo.vue +1 -1
- package/detail/harvesterhci.io.management.cluster.vue +6 -2
- package/detail/pod.vue +1 -1
- package/detail/provisioning.cattle.io.cluster.vue +34 -14
- package/detail/workload/index.vue +12 -55
- package/edit/__tests__/catalog.cattle.io.clusterrepo.test.ts +248 -0
- package/edit/__tests__/fleet.cattle.io.helmop.test.ts +105 -0
- package/edit/auditlog.cattle.io.auditpolicy/__tests__/__snapshots__/General.test.ts.snap +6 -0
- package/edit/auditlog.cattle.io.auditpolicy/__tests__/__snapshots__/index.test.ts.snap +1 -0
- package/edit/auth/__tests__/azuread.test.ts +247 -39
- package/edit/auth/__tests__/github.test.ts +234 -0
- package/edit/auth/__tests__/oidc.test.ts +26 -6
- package/edit/auth/__tests__/saml.test.ts +196 -0
- package/edit/auth/azuread.vue +197 -56
- package/edit/auth/github.vue +72 -13
- package/edit/auth/ldap/__tests__/index.test.ts +206 -0
- package/edit/auth/ldap/config.vue +8 -0
- package/edit/auth/ldap/index.vue +75 -1
- package/edit/auth/oidc.vue +119 -73
- package/edit/auth/saml.vue +76 -12
- package/edit/catalog.cattle.io.clusterrepo.vue +140 -32
- package/edit/fleet.cattle.io.helmop.vue +491 -136
- package/edit/management.cattle.io.user.vue +5 -2
- package/edit/networking.k8s.io.ingress/DefaultBackend.vue +13 -4
- package/edit/networking.k8s.io.ingress/RulePath.vue +8 -4
- package/edit/networking.k8s.io.ingress/index.vue +75 -20
- package/edit/provisioning.cattle.io.cluster/__tests__/MachinePool.test.ts +104 -0
- package/edit/provisioning.cattle.io.cluster/index.vue +11 -7
- package/edit/provisioning.cattle.io.cluster/rke2.vue +92 -14
- package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +22 -0
- package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +37 -4
- package/edit/provisioning.cattle.io.cluster/tabs/registries/__tests__/RegistryConfigs.test.ts +132 -7
- package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +2 -1
- package/edit/secret/__tests__/ssh.test.ts +5 -6
- package/edit/secret/basic.vue +31 -0
- package/edit/secret/index.vue +68 -17
- package/edit/secret/registry.vue +38 -0
- package/edit/secret/ssh.vue +29 -0
- package/edit/secret/tls.vue +30 -0
- package/edit/service.vue +4 -4
- package/edit/workload/Upgrading.vue +3 -3
- package/edit/workload/__tests__/Upgrading.test.ts +6 -9
- package/edit/workload/mixins/workload.js +2 -1
- package/list/fleet.cattle.io.bundle.vue +7 -104
- package/list/fleet.cattle.io.clusterregistrationtoken.vue +20 -0
- package/list/group.principal.vue +5 -4
- package/list/harvesterhci.io.management.cluster.vue +8 -9
- package/list/management.cattle.io.user.vue +12 -9
- package/list/provisioning.cattle.io.cluster.vue +268 -180
- package/list/utils/management.cattle.io.cluster.utils.ts +128 -0
- package/mixins/__tests__/auth-config.test.ts +90 -0
- package/mixins/__tests__/chart.test.ts +206 -0
- package/mixins/__tests__/resource-fetch-api-pagination.test.ts +48 -0
- package/mixins/auth-config.js +7 -0
- package/mixins/brand.js +2 -1
- package/mixins/chart.js +22 -9
- package/mixins/child-hook.js +12 -6
- package/mixins/create-edit-view/impl.js +5 -3
- package/mixins/resource-fetch-api-pagination.js +62 -6
- package/models/__tests__/catalog.cattle.io.clusterrepo.test.ts +57 -0
- package/models/__tests__/compliance.cattle.io.clusterscan.test.ts +144 -0
- package/models/__tests__/ext.cattle.io.kubeconfig.test.ts +67 -67
- package/models/__tests__/fleet-application.test.ts +175 -0
- package/models/__tests__/fleet.cattle.io.bundle.test.ts +169 -0
- package/models/__tests__/fleet.cattle.io.helmop.test.ts +84 -0
- package/models/__tests__/management.cattle.io.cluster.test.ts +1 -1
- package/models/__tests__/management.cattle.io.node.ts +28 -5
- package/models/__tests__/management.cattle.io.nodepool.ts +5 -4
- package/models/__tests__/namespace.test.ts +36 -0
- package/models/__tests__/provisioning.cattle.io.cluster.test.ts +81 -11
- package/models/__tests__/workload.test.ts +401 -26
- package/models/base-cluster.x-k8s.io.js +26 -0
- package/models/catalog.cattle.io.clusterrepo.js +28 -4
- package/models/cluster.js +1 -1
- package/models/cluster.x-k8s.io.machine.js +4 -22
- package/models/cluster.x-k8s.io.machinedeployment.js +2 -20
- package/models/cluster.x-k8s.io.machineset.js +2 -20
- package/models/compliance.cattle.io.clusterscan.js +165 -2
- package/models/ext.cattle.io.kubeconfig.ts +4 -7
- package/models/fleet-application.js +7 -1
- package/models/fleet.cattle.io.helmop.js +20 -1
- package/models/management.cattle.io.cluster.js +434 -41
- package/models/management.cattle.io.node.js +50 -7
- package/models/management.cattle.io.nodepool.js +1 -1
- package/models/namespace.js +1 -1
- package/models/networking.k8s.io.ingress.js +12 -4
- package/models/pod.js +33 -1
- package/models/provisioning.cattle.io.cluster.js +51 -334
- package/models/rke.cattle.io.etcdsnapshot.js +1 -2
- package/models/workload.js +108 -13
- package/models/workload.service.js +5 -0
- package/package.json +22 -39
- package/pages/__tests__/readme.test.ts +49 -0
- package/pages/about.vue +5 -6
- package/pages/auth/login.vue +0 -35
- package/pages/auth/setup.vue +13 -3
- package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +2 -2
- package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +10 -1
- package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +76 -0
- package/pages/c/_cluster/apps/charts/__tests__/index.test.ts +93 -0
- package/pages/c/_cluster/apps/charts/chart.vue +62 -9
- package/pages/c/_cluster/apps/charts/index.vue +48 -10
- package/pages/c/_cluster/apps/charts/install.vue +122 -113
- package/pages/c/_cluster/auth/roles/index.vue +5 -4
- package/pages/c/_cluster/explorer/__tests__/index.test.ts +23 -25
- package/pages/c/_cluster/explorer/index.vue +5 -49
- package/pages/c/_cluster/explorer/workload-dashboard/ByNamespaceSection.vue +31 -0
- package/pages/c/_cluster/explorer/workload-dashboard/ByStateSection.vue +138 -0
- package/pages/c/_cluster/explorer/workload-dashboard/ByTypeSection.vue +30 -0
- package/pages/c/_cluster/explorer/workload-dashboard/WorkloadCard.vue +155 -0
- package/pages/c/_cluster/explorer/workload-dashboard/WorkloadNamespaceCard.vue +142 -0
- package/pages/c/_cluster/explorer/workload-dashboard/WorkloadTypeCard.vue +159 -0
- package/pages/c/_cluster/explorer/workload-dashboard/__tests__/composable.test.ts +561 -0
- package/pages/c/_cluster/explorer/workload-dashboard/composable.ts +440 -0
- package/pages/c/_cluster/explorer/workload-dashboard/index.vue +187 -0
- package/pages/c/_cluster/explorer/workload-dashboard/types.ts +80 -0
- package/pages/c/_cluster/fleet/application/create.vue +187 -136
- package/pages/c/_cluster/fleet/application/index.vue +5 -3
- package/pages/c/_cluster/fleet/application/suse-app-collection/ChartDetailBody.vue +338 -0
- package/pages/c/_cluster/fleet/application/suse-app-collection/ChartDetailHeader.vue +121 -0
- package/pages/c/_cluster/fleet/application/suse-app-collection/chart.vue +369 -0
- package/pages/c/_cluster/fleet/application/suse-app-collection/charts.vue +248 -0
- package/pages/c/_cluster/fleet/application/suse-app-collection/credentials.vue +310 -0
- package/pages/c/_cluster/fleet/index.vue +2 -2
- package/pages/c/_cluster/istio/__tests__/istio.index.test.ts +194 -0
- package/pages/c/_cluster/istio/index.vue +21 -6
- package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +1 -0
- package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +815 -2
- package/pages/c/_cluster/uiplugins/index.vue +218 -197
- package/pages/diagnostic.vue +13 -17
- package/pages/fail-whale.vue +30 -7
- package/pages/home.vue +93 -306
- package/pages/readme.vue +88 -0
- package/plugins/clean-html.d.ts +9 -0
- package/plugins/dashboard-store/__tests__/resource-class.test.ts +181 -0
- package/plugins/dashboard-store/actions.js +40 -18
- package/plugins/dashboard-store/resource-class.js +67 -9
- package/plugins/steve/__tests__/actions.test.ts +212 -0
- package/plugins/steve/__tests__/subscribe.spec.ts +6 -3
- package/plugins/steve/actions.js +96 -0
- package/plugins/steve/steve-pagination-utils.ts +12 -4
- package/plugins/steve/subscribe.js +35 -5
- package/rancher-components/Accordion/Accordion.vue +53 -9
- package/rancher-components/Form/Checkbox/Checkbox.vue +14 -0
- package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +10 -4
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +7 -52
- package/rancher-components/Form/Radio/RadioButton.vue +17 -1
- package/rancher-components/Form/Radio/RadioGroup.vue +10 -0
- package/rancher-components/Pill/RcTag/RcTag.vue +3 -2
- package/rancher-components/RcButton/RcButton.test.ts +140 -1
- package/rancher-components/RcButton/RcButton.vue +126 -17
- package/rancher-components/RcButton/types.ts +3 -0
- package/rancher-components/RcDropdown/RcDropdownTrigger.vue +10 -8
- package/rancher-components/RcItemCard/RcItemCard.test.ts +18 -0
- package/rancher-components/RcItemCard/RcItemCard.vue +2 -2
- package/rancher-components/RcSection/RcSection.vue +28 -3
- package/scripts/extension/helm/package/Dockerfile +1 -1
- package/scripts/test-plugins-build.sh +2 -1
- package/store/__tests__/catalog.test.ts +115 -1
- package/store/__tests__/notifications.test.ts +434 -0
- package/store/__tests__/type-map.test.ts +556 -1
- package/store/action-menu.js +8 -3
- package/store/auth.js +1 -1
- package/store/aws.js +27 -16
- package/store/catalog.js +84 -3
- package/store/digitalocean.js +20 -38
- package/store/index.js +2 -0
- package/store/linode.js +25 -40
- package/store/plugins.js +7 -4
- package/store/pnap.js +1 -0
- package/store/type-map.js +111 -29
- package/tsconfig.paths.json +8 -8
- package/types/components/buttonGroup.ts +5 -0
- package/types/kube/kube-api.ts +14 -1
- package/types/rancher/steve.api.ts +12 -12
- package/types/resources/settings.d.ts +2 -1
- package/types/shell/index.d.ts +206 -72
- package/types/store/dashboard-store.types.ts +108 -11
- package/types/store/pagination.types.ts +6 -3
- package/utils/__tests__/alertmanagerconfig.test.ts +117 -0
- package/utils/__tests__/async.test.ts +87 -0
- package/utils/__tests__/auth.test.ts +273 -0
- package/utils/__tests__/aws.test.ts +140 -0
- package/utils/__tests__/banners.test.ts +176 -0
- package/utils/__tests__/chart.test.ts +64 -1
- package/utils/__tests__/color.test.ts +226 -0
- package/utils/__tests__/computed.test.ts +193 -0
- package/utils/__tests__/cspAdaptor.test.ts +163 -0
- package/utils/__tests__/dom.test.ts +81 -0
- package/utils/__tests__/duration.test.ts +176 -0
- package/utils/__tests__/dynamic-importer.test.ts +102 -0
- package/utils/__tests__/fleet-appco.test.ts +312 -0
- package/utils/__tests__/fleet.test.ts +340 -0
- package/utils/__tests__/ingress.test.ts +553 -0
- package/utils/__tests__/kube.test.ts +68 -0
- package/utils/__tests__/monitoring.test.ts +130 -0
- package/utils/__tests__/namespace-filter.test.ts +109 -0
- package/utils/__tests__/object.test.ts +22 -0
- package/utils/__tests__/pagination-utils.test.ts +361 -0
- package/utils/__tests__/parse-externalid.test.ts +137 -0
- package/utils/__tests__/perf-setting.utils.test.ts +98 -0
- package/utils/__tests__/platform.test.ts +91 -0
- package/utils/__tests__/poller-sequential.test.ts +177 -0
- package/utils/__tests__/poller.test.ts +170 -0
- package/utils/__tests__/position.test.ts +237 -0
- package/utils/__tests__/promise.test.ts +346 -0
- package/utils/__tests__/provider.test.ts +51 -1
- package/utils/__tests__/queue.test.ts +232 -0
- package/utils/__tests__/release-notes.test.ts +221 -0
- package/utils/__tests__/router.test.js +254 -1
- package/utils/__tests__/select.test.ts +208 -0
- package/utils/__tests__/settings.test.ts +140 -0
- package/utils/__tests__/sort-utils.test.ts +301 -0
- package/utils/__tests__/string-utils.test.ts +798 -0
- package/utils/__tests__/string.test.ts +23 -1
- package/utils/__tests__/style.test.ts +154 -0
- package/utils/__tests__/svg-filter.test.ts +184 -0
- package/utils/__tests__/time.test.ts +265 -1
- package/utils/__tests__/title.test.ts +47 -0
- package/utils/__tests__/units.test.ts +417 -0
- package/utils/__tests__/versions.test.ts +128 -0
- package/utils/__tests__/width.test.ts +53 -0
- package/utils/__tests__/window.test.ts +158 -0
- package/utils/__tests__/xccdf.test.ts +511 -0
- package/utils/chart.js +36 -0
- package/utils/crypto/__tests__/browserHashUtils.test.ts +98 -0
- package/utils/crypto/__tests__/index.test.ts +144 -0
- package/utils/duration.ts +104 -0
- package/utils/dynamic-content/__tests__/notification-handler.test.ts +196 -0
- package/utils/dynamic-content/info.ts +2 -1
- package/utils/error.js +13 -0
- package/utils/fleet-appco.ts +323 -0
- package/utils/fleet.ts +13 -3
- package/utils/gatekeeper/__tests__/util.test.ts +174 -0
- package/utils/gc/__tests__/gc-interval.test.ts +119 -0
- package/utils/gc/__tests__/gc-root-store.test.ts +225 -0
- package/utils/gc/__tests__/gc-route-changed.test.ts +96 -0
- package/utils/gc/__tests__/gc.test.ts +487 -0
- package/utils/ingress.ts +9 -1
- package/utils/object.js +22 -2
- package/utils/pagination-utils.ts +2 -1
- package/utils/provider.ts +12 -0
- package/utils/string.js +25 -2
- package/utils/uiplugins.ts +5 -5
- package/utils/validators/__tests__/cluster-name.test.ts +110 -0
- package/utils/validators/__tests__/container-images.test.ts +104 -0
- package/utils/validators/__tests__/cron-schedule.test.ts +79 -0
- package/utils/validators/__tests__/flow-output.test.ts +91 -0
- package/utils/validators/__tests__/index.test.ts +481 -0
- package/utils/validators/__tests__/kubernetes-name.test.ts +163 -0
- package/utils/validators/__tests__/logging-outputs.test.ts +58 -0
- package/utils/validators/__tests__/misc-validators.test.ts +246 -0
- package/utils/validators/__tests__/monitoring-route.test.ts +119 -0
- package/utils/validators/__tests__/pod-affinity.test.ts +382 -0
- package/utils/validators/__tests__/prometheusrule.test.ts +211 -0
- package/utils/validators/__tests__/role-template.test.ts +149 -0
- package/utils/validators/__tests__/service.test.ts +283 -0
- package/utils/validators/__tests__/setting.test.js +32 -0
- package/utils/validators/formRules/__tests__/index.test.ts +50 -0
- package/utils/validators/formRules/index.ts +5 -5
- package/utils/validators/machine-pool.ts +1 -1
- package/utils/validators/setting.js +18 -3
- package/utils/xccdf.ts +415 -0
- package/vue.config.js +1 -1
- package/assets/fonts/lato/lato-v17-latin-700.woff +0 -0
- package/assets/fonts/lato/lato-v17-latin-700.woff2 +0 -0
- package/assets/fonts/lato/lato-v17-latin-regular.woff +0 -0
- package/assets/fonts/lato/lato-v17-latin-regular.woff2 +0 -0
- package/pages/support/index.vue +0 -264
- package/utils/duration.js +0 -43
|
@@ -1,25 +1,50 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
+
import { computed } from 'vue';
|
|
2
3
|
import { RouterLink, RouteLocationRaw } from 'vue-router';
|
|
3
4
|
|
|
4
5
|
export interface Props {
|
|
5
|
-
to
|
|
6
|
+
to?: RouteLocationRaw;
|
|
7
|
+
href?: string;
|
|
8
|
+
target?: string;
|
|
9
|
+
openInNewTabLabel?: string;
|
|
6
10
|
}
|
|
7
11
|
|
|
8
|
-
const
|
|
12
|
+
const props = defineProps<Props>();
|
|
13
|
+
|
|
14
|
+
const isExternal = computed(() => !!props.href);
|
|
9
15
|
</script>
|
|
10
16
|
|
|
11
17
|
<template>
|
|
12
|
-
<
|
|
18
|
+
<component
|
|
19
|
+
:is="isExternal ? 'a' : RouterLink"
|
|
13
20
|
class="subtle-link"
|
|
14
|
-
|
|
21
|
+
v-bind="isExternal
|
|
22
|
+
? { href, target, rel: target === '_blank' ? 'noopener noreferrer nofollow' : undefined }
|
|
23
|
+
: { to }"
|
|
15
24
|
>
|
|
16
|
-
<
|
|
17
|
-
|
|
25
|
+
<span
|
|
26
|
+
v-if="openInNewTabLabel"
|
|
27
|
+
class="sr-only"
|
|
28
|
+
>{{ openInNewTabLabel }}</span>
|
|
29
|
+
<slot name="default" /><span v-if="openInNewTabLabel"> </span><i
|
|
30
|
+
v-if="openInNewTabLabel"
|
|
31
|
+
class="link-icon icon icon-external-link"
|
|
32
|
+
/>
|
|
33
|
+
</component>
|
|
18
34
|
</template>
|
|
19
35
|
|
|
20
36
|
<style lang="scss" scoped>
|
|
21
37
|
.subtle-link {
|
|
22
38
|
text-decoration: underline;
|
|
23
39
|
color: var(--body-text);
|
|
40
|
+
|
|
41
|
+
&:hover,
|
|
42
|
+
&:active {
|
|
43
|
+
text-decoration: none;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.link-icon {
|
|
48
|
+
display: inline;
|
|
24
49
|
}
|
|
25
50
|
</style>
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
<script>
|
|
2
2
|
import { useTabCountWatcher } from '@shell/components/form/ResourceTabs/composable';
|
|
3
|
+
import { useInSummary } from '@shell/components/TableOfContents/composables';
|
|
4
|
+
import { computed, inject, useTemplateRef } from 'vue';
|
|
5
|
+
import { useStore } from 'vuex';
|
|
6
|
+
import { useI18n } from '@shell/composables/useI18n';
|
|
3
7
|
|
|
4
8
|
export default {
|
|
5
|
-
|
|
9
|
+
name: 'Tab',
|
|
10
|
+
|
|
11
|
+
inject: ['addTab', 'removeTab', 'sideTabs', 'select'],
|
|
6
12
|
|
|
7
13
|
emits: ['active'],
|
|
8
14
|
|
|
@@ -64,9 +70,28 @@ export default {
|
|
|
64
70
|
},
|
|
65
71
|
|
|
66
72
|
setup(props) {
|
|
67
|
-
const
|
|
73
|
+
const select = inject('select');
|
|
74
|
+
const store = useStore();
|
|
75
|
+
const { t } = useI18n(store);
|
|
76
|
+
const label = computed(() => {
|
|
77
|
+
if (props.labelKey && typeof t === 'function') {
|
|
78
|
+
return t(props.labelKey);
|
|
79
|
+
}
|
|
68
80
|
|
|
69
|
-
|
|
81
|
+
return props.label ?? props.name;
|
|
82
|
+
});
|
|
83
|
+
const { count, isCountVisible } = useTabCountWatcher();
|
|
84
|
+
const summarizedContainerRef = useTemplateRef('tab-summarized-container');
|
|
85
|
+
// when a Tab is scrolled to, call its Tabbed's 'select' method to ensure the Tab is active
|
|
86
|
+
const { summary } = useInSummary({
|
|
87
|
+
scrollTo: () => select(props.name),
|
|
88
|
+
label,
|
|
89
|
+
elementRef: summarizedContainerRef,
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
return {
|
|
93
|
+
inferredCount: count, isInferredCountVisible: isCountVisible, summary
|
|
94
|
+
};
|
|
70
95
|
},
|
|
71
96
|
|
|
72
97
|
data() {
|
|
@@ -143,6 +168,7 @@ export default {
|
|
|
143
168
|
<section
|
|
144
169
|
v-show="active"
|
|
145
170
|
:id="name"
|
|
171
|
+
ref="tab-summarized-container"
|
|
146
172
|
:aria-hidden="!active"
|
|
147
173
|
role="tabpanel"
|
|
148
174
|
:aria-labelledby="`tab-${name}`"
|
|
@@ -7,10 +7,11 @@ import findIndex from 'lodash/findIndex';
|
|
|
7
7
|
import { ExtensionPoint, TabLocation } from '@shell/core/types';
|
|
8
8
|
import { getApplicableExtensionEnhancements } from '@shell/core/plugin-helpers';
|
|
9
9
|
import Tab from '@shell/components/Tabbed/Tab';
|
|
10
|
-
import { ref } from 'vue';
|
|
10
|
+
import { computed, ref, useTemplateRef } from 'vue';
|
|
11
11
|
import { useIsInResourceDetailDrawer } from '@shell/components/Drawer/ResourceDetailDrawer/composables';
|
|
12
12
|
import { useIsInResourceDetailPage } from '@shell/composables/resourceDetail';
|
|
13
13
|
import { useIsInResourceCreatePage, useIsInResourceEditPage } from '@shell/composables/cruResource';
|
|
14
|
+
import { useInSummary } from '@shell/components/TableOfContents/composables';
|
|
14
15
|
|
|
15
16
|
export default {
|
|
16
17
|
name: 'Tabbed',
|
|
@@ -94,6 +95,17 @@ export default {
|
|
|
94
95
|
removeBorders: {
|
|
95
96
|
type: Boolean,
|
|
96
97
|
default: false,
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* title is NOT displayed within the Tabbed component itself
|
|
102
|
+
* this prop is used to determine a label to use for the set of tabs in the table of contents component
|
|
103
|
+
* if a title is not provided a random string will be used
|
|
104
|
+
* components using the table of contents may exclude tabbed and only show tab components, too
|
|
105
|
+
*/
|
|
106
|
+
title: {
|
|
107
|
+
type: String,
|
|
108
|
+
default: null,
|
|
97
109
|
}
|
|
98
110
|
},
|
|
99
111
|
|
|
@@ -101,6 +113,8 @@ export default {
|
|
|
101
113
|
const tabs = this.tabs;
|
|
102
114
|
|
|
103
115
|
return {
|
|
116
|
+
select: this.select,
|
|
117
|
+
|
|
104
118
|
sideTabs: this.sideTabs,
|
|
105
119
|
|
|
106
120
|
addTab(tab) {
|
|
@@ -156,14 +170,20 @@ export default {
|
|
|
156
170
|
},
|
|
157
171
|
},
|
|
158
172
|
|
|
159
|
-
setup() {
|
|
173
|
+
setup(props) {
|
|
160
174
|
const isInResourceDetailDrawer = ref(useIsInResourceDetailDrawer());
|
|
161
175
|
const isInResourceDetailPage = ref(useIsInResourceDetailPage());
|
|
162
176
|
const isInResourceEditPage = ref(useIsInResourceEditPage());
|
|
163
177
|
const isInResourceCreatePage = ref(useIsInResourceCreatePage());
|
|
178
|
+
const tabbedSummarizedContainer = useTemplateRef('tabbed-summarized-container');
|
|
179
|
+
const { summary } = useInSummary({
|
|
180
|
+
label: computed(() => props.title ?? ''),
|
|
181
|
+
scrollTo: () => tabbedSummarizedContainer.value?.scrollIntoView(true),
|
|
182
|
+
elementRef: tabbedSummarizedContainer,
|
|
183
|
+
});
|
|
164
184
|
|
|
165
185
|
return {
|
|
166
|
-
isInResourceDetailDrawer, isInResourceDetailPage, isInResourceEditPage, isInResourceCreatePage
|
|
186
|
+
isInResourceDetailDrawer, isInResourceDetailPage, isInResourceEditPage, isInResourceCreatePage, summary
|
|
167
187
|
};
|
|
168
188
|
},
|
|
169
189
|
|
|
@@ -311,6 +331,7 @@ export default {
|
|
|
311
331
|
|
|
312
332
|
<template>
|
|
313
333
|
<div
|
|
334
|
+
ref="tabbed-summarized-container"
|
|
314
335
|
class="tabbed-container"
|
|
315
336
|
:class="{
|
|
316
337
|
'side-tabs': !!sideTabs,
|
|
@@ -435,6 +456,7 @@ export default {
|
|
|
435
456
|
<component
|
|
436
457
|
:is="tab.component"
|
|
437
458
|
:resource="resource"
|
|
459
|
+
@select="select(tab.name)"
|
|
438
460
|
/>
|
|
439
461
|
</Tab>
|
|
440
462
|
</div>
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
const props = defineProps({
|
|
3
|
+
accordions: {
|
|
4
|
+
type: Array,
|
|
5
|
+
required: true,
|
|
6
|
+
}
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
const handleScrollTo = (entry, event) => {
|
|
10
|
+
entry?.scrollTo?.();
|
|
11
|
+
event?.currentTarget?.blur?.();
|
|
12
|
+
};
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
<template>
|
|
16
|
+
<div class="toc-root">
|
|
17
|
+
<div class="toc-container">
|
|
18
|
+
<h4>
|
|
19
|
+
{{ t('cruResource.tableOfContents.jumpTo') }}
|
|
20
|
+
</h4>
|
|
21
|
+
<ul>
|
|
22
|
+
<li
|
|
23
|
+
v-for="(acc, i) in props.accordions"
|
|
24
|
+
:key="i"
|
|
25
|
+
:data-testid="`toc-list-item-${i}`"
|
|
26
|
+
>
|
|
27
|
+
<button
|
|
28
|
+
v-if="acc.scrollTo"
|
|
29
|
+
type="button"
|
|
30
|
+
class="btn role-link accordion-link"
|
|
31
|
+
@click="handleScrollTo(acc, $event)"
|
|
32
|
+
>
|
|
33
|
+
{{ acc.label }}
|
|
34
|
+
</button>
|
|
35
|
+
<span v-else>{{ acc.label }}</span>
|
|
36
|
+
<template v-if="acc?.children?.length">
|
|
37
|
+
<ul data-testid="toc-list">
|
|
38
|
+
<li
|
|
39
|
+
v-for="(childAcc, j) in acc.children"
|
|
40
|
+
:key="j"
|
|
41
|
+
:data-testid="`toc-list-item-${i}-${j}`"
|
|
42
|
+
>
|
|
43
|
+
<button
|
|
44
|
+
v-if="childAcc.scrollTo"
|
|
45
|
+
type="button"
|
|
46
|
+
class="btn role-link accordion-link"
|
|
47
|
+
@click="handleScrollTo(childAcc, $event)"
|
|
48
|
+
>
|
|
49
|
+
{{ childAcc.label }}
|
|
50
|
+
</button>
|
|
51
|
+
<span v-else>{{ childAcc.label }}</span>
|
|
52
|
+
</li>
|
|
53
|
+
</ul>
|
|
54
|
+
</template>
|
|
55
|
+
</li>
|
|
56
|
+
</ul>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
</template>
|
|
60
|
+
|
|
61
|
+
<style lang="scss" scoped>
|
|
62
|
+
ul {
|
|
63
|
+
list-style-type: none;
|
|
64
|
+
margin: 0;
|
|
65
|
+
padding: 0;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
li:not(:last-child) {
|
|
69
|
+
margin-bottom: var(--gap);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
h4 {
|
|
73
|
+
margin-bottom: 12px;
|
|
74
|
+
margin-top: 0px
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
li ul {
|
|
78
|
+
padding-left: var(--gap-md);
|
|
79
|
+
& li {
|
|
80
|
+
margin-top: var(--gap);
|
|
81
|
+
margin-bottom: 0px;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.toc-container {
|
|
86
|
+
padding: var(--gap-md);
|
|
87
|
+
border-radius: var(--border-radius);
|
|
88
|
+
background-color: var(--subtle-overlay-bg);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.accordion-link {
|
|
92
|
+
padding: 0px;
|
|
93
|
+
min-height: 0px;
|
|
94
|
+
line-height: 1.3em;
|
|
95
|
+
white-space: normal;
|
|
96
|
+
overflow-wrap: anywhere;
|
|
97
|
+
word-break: break-word;
|
|
98
|
+
text-align: left;
|
|
99
|
+
display: block;
|
|
100
|
+
width: 100%;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
li > span {
|
|
104
|
+
white-space: normal;
|
|
105
|
+
overflow-wrap: anywhere;
|
|
106
|
+
word-break: break-word;
|
|
107
|
+
display: block;
|
|
108
|
+
}
|
|
109
|
+
</style>
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import debounce from 'lodash/debounce';
|
|
2
|
+
import { randomStr } from '@shell/utils/string';
|
|
3
|
+
import {
|
|
4
|
+
computed, inject, onMounted, onUnmounted, provide, ref, watch
|
|
5
|
+
} from 'vue';
|
|
6
|
+
import type {
|
|
7
|
+
ComputedRef,
|
|
8
|
+
Ref,
|
|
9
|
+
VNode
|
|
10
|
+
} from 'vue';
|
|
11
|
+
|
|
12
|
+
type SummaryInfo = {
|
|
13
|
+
id: string;
|
|
14
|
+
label?: ComputedRef<string> | string;
|
|
15
|
+
scrollTo?: () => void;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
type SummaryComponent = {
|
|
19
|
+
summary: SummaryInfo;
|
|
20
|
+
summaryID: string;
|
|
21
|
+
$options?: { name?: string };
|
|
22
|
+
$?: { type?: { name?: string } };
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
type SummaryEntry = {
|
|
26
|
+
node: VNode;
|
|
27
|
+
children: SummaryEntry[];
|
|
28
|
+
label?: string | ComputedRef<string>;
|
|
29
|
+
scrollTo?: () => void;
|
|
30
|
+
component?: SummaryComponent;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
type RegisterComponent = (component?: SummaryComponent | null) => void;
|
|
34
|
+
|
|
35
|
+
type FormSummaryContext = {
|
|
36
|
+
registerComponent: RegisterComponent;
|
|
37
|
+
unRegisterComponent: RegisterComponent;
|
|
38
|
+
refreshComponents: () => void;
|
|
39
|
+
updateComponentLabel: (summaryID: string, label: string) => boolean;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
type ElementWithVNodeChildren = {
|
|
43
|
+
children?: ArrayLike<Element>;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
type ElementWithSummaryID = HTMLElement & {
|
|
47
|
+
summaryID?: string;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// Unique key used by provide/inject so each form subtree gets its own
|
|
51
|
+
// summary registration context
|
|
52
|
+
const FORM_SUMMARY_KEY = Symbol('formSummary');
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* useFormSummary will determine the relative position of all descendant components
|
|
56
|
+
* that are using the useInSummary composable. It is used to build summaries of elaborate form components
|
|
57
|
+
* that may have interactable elements deeply nested in child components. The list of located components
|
|
58
|
+
* returned by locateComponentsByNamePattern includes access to the component instance and a scrollTo method.
|
|
59
|
+
*/
|
|
60
|
+
export function useFormSummary(rootComponentRef: Readonly<Ref<HTMLElement | null>>) {
|
|
61
|
+
const registeredComponents = ref<Record<string, SummaryComponent>>({});
|
|
62
|
+
const locatedComponents = ref<SummaryEntry[]>([]);
|
|
63
|
+
const buildTree = (
|
|
64
|
+
components: SummaryEntry[] = [],
|
|
65
|
+
node?: any,
|
|
66
|
+
found = new Set<string>()
|
|
67
|
+
) => {
|
|
68
|
+
let nextInput = components;
|
|
69
|
+
|
|
70
|
+
const summaryID = node?.el ? (node?.el as ElementWithSummaryID | null | undefined)?.summaryID || '' : node?.summaryID || '';
|
|
71
|
+
const component = registeredComponents.value[summaryID];
|
|
72
|
+
const summary = component?.summary;
|
|
73
|
+
|
|
74
|
+
if (component && summary && registeredComponents.value[summary.id] && !found.has(summary.id)) {
|
|
75
|
+
found.add(summary.id);
|
|
76
|
+
|
|
77
|
+
const out: SummaryEntry = {
|
|
78
|
+
node: node as VNode,
|
|
79
|
+
children: [],
|
|
80
|
+
...summary,
|
|
81
|
+
scrollTo: component ? () => scrollToComponent(component) : undefined
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
out.component = component;
|
|
85
|
+
|
|
86
|
+
components.push(out);
|
|
87
|
+
nextInput = out.children;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (!node) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const children = node.el ? Array.from((node.el as ElementWithVNodeChildren | null | undefined)?.children ?? []) : Array.from(node.children ?? []);
|
|
95
|
+
|
|
96
|
+
children.forEach((child: any) => {
|
|
97
|
+
buildTree(nextInput, child, found);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
return components;
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const locateRegisteredComponents = () => {
|
|
104
|
+
if (rootComponentRef?.value) {
|
|
105
|
+
locatedComponents.value = buildTree([], rootComponentRef.value) || [];
|
|
106
|
+
} else {
|
|
107
|
+
locatedComponents.value = [];
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
// when forms initially this is called synchonously by every component using the summary composable
|
|
112
|
+
// debounce without a delay reduces that to one call on initial page load
|
|
113
|
+
const debouncedLocateRegisteredComponents = debounce(locateRegisteredComponents);
|
|
114
|
+
|
|
115
|
+
// onMounted fires on the calling component (CruResource) after its template refs are
|
|
116
|
+
// populated and after all children have run their own onMounted hooks. This guarantees
|
|
117
|
+
// rootComponentRef is available and all child registrations have arrived.
|
|
118
|
+
onMounted(() => {
|
|
119
|
+
debouncedLocateRegisteredComponents();
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
const findParent = (component: SummaryComponent) => {
|
|
123
|
+
const walk = (entries: SummaryEntry[] = [], parent: SummaryEntry | null = null): SummaryEntry | null => {
|
|
124
|
+
for (const entry of entries) {
|
|
125
|
+
if (entry?.component?.summary?.id === component?.summary?.id) {
|
|
126
|
+
return parent;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (entry?.children?.length) {
|
|
130
|
+
const found = walk(entry.children, entry);
|
|
131
|
+
|
|
132
|
+
if (found) {
|
|
133
|
+
return found;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return null;
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
return walk(locatedComponents.value);
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
const updateComponentLabel = (summaryID: string, label: string) => {
|
|
145
|
+
const walk = (entries: SummaryEntry[] = []): boolean => {
|
|
146
|
+
for (const entry of entries) {
|
|
147
|
+
if (entry?.component?.summary?.id === summaryID) {
|
|
148
|
+
entry.label = label;
|
|
149
|
+
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (entry?.children?.length && walk(entry.children)) {
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return false;
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
return walk(locatedComponents.value);
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
const scrollToComponent = (component: SummaryComponent) => {
|
|
165
|
+
const parent = findParent(component);
|
|
166
|
+
|
|
167
|
+
if (parent?.component) {
|
|
168
|
+
scrollToComponent(parent.component);
|
|
169
|
+
}
|
|
170
|
+
if (component?.summary?.scrollTo) {
|
|
171
|
+
component.summary.scrollTo();
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
const registerComponent: RegisterComponent = (component) => {
|
|
176
|
+
if (!component || !component.summary?.id) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
registeredComponents.value[component.summary?.id] = component;
|
|
180
|
+
debouncedLocateRegisteredComponents();
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
const unRegisterComponent: RegisterComponent = (component) => {
|
|
184
|
+
if (!component || !component.summary?.id) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
delete registeredComponents.value[component.summary?.id];
|
|
189
|
+
debouncedLocateRegisteredComponents();
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
// Provide the register/unregister functions to all descendants
|
|
193
|
+
provide<FormSummaryContext>(FORM_SUMMARY_KEY, {
|
|
194
|
+
registerComponent,
|
|
195
|
+
unRegisterComponent,
|
|
196
|
+
refreshComponents: debouncedLocateRegisteredComponents,
|
|
197
|
+
updateComponentLabel,
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
return { locatedComponents };
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Hook to register a component in the summary system.
|
|
205
|
+
* Injects register/unregister from the nearest ancestor that called useFormSummary().
|
|
206
|
+
* When the component is mounted (including after v-if re-reveals it), it re-registers
|
|
207
|
+
* into the correct scoped context. Components using inFormSummary will register themselves
|
|
208
|
+
* with the nearest ancestor containing useFormSummary
|
|
209
|
+
*
|
|
210
|
+
* @param options.scrollTo - Scroll handler. The ToC system calls this function when the
|
|
211
|
+
* user navigates to this component via the Table of Contents. Use this to perform any
|
|
212
|
+
* additional work before scrolling (e.g. expanding an accordion, revealing a tab).
|
|
213
|
+
* @param options.label - Label for this component's ToC entry. Accepts a plain string or
|
|
214
|
+
* a `ComputedRef<string>`.
|
|
215
|
+
* @param options.elementRef - A template ref pointing to the component's root element.
|
|
216
|
+
* Used by the ToC system to locate this component during DOM tree traversal.
|
|
217
|
+
*/
|
|
218
|
+
export function useInSummary(options: { scrollTo: () => void; label: ComputedRef<string> | string; elementRef: Readonly<Ref<HTMLElement | null>> }) {
|
|
219
|
+
const {
|
|
220
|
+
registerComponent = () => {},
|
|
221
|
+
unRegisterComponent = () => {},
|
|
222
|
+
refreshComponents = () => {},
|
|
223
|
+
updateComponentLabel = () => false
|
|
224
|
+
} = inject<FormSummaryContext>(FORM_SUMMARY_KEY) || {};
|
|
225
|
+
|
|
226
|
+
const { scrollTo, label, elementRef } = options;
|
|
227
|
+
|
|
228
|
+
const summaryID = randomStr();
|
|
229
|
+
const summary: SummaryInfo = { id: summaryID, scrollTo };
|
|
230
|
+
|
|
231
|
+
// Wrap a plain string in a computed so the type is always ComputedRef<string>.
|
|
232
|
+
summary.label = typeof label === 'string' ? computed(() => label) : label;
|
|
233
|
+
|
|
234
|
+
watch(summary.label, (label) => {
|
|
235
|
+
const updated = updateComponentLabel(summaryID, label);
|
|
236
|
+
|
|
237
|
+
if (!updated) {
|
|
238
|
+
refreshComponents();
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
onMounted(() => {
|
|
243
|
+
if (elementRef.value) {
|
|
244
|
+
(elementRef.value as ElementWithSummaryID).summaryID = summaryID;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
registerComponent({ summary, summaryID } as SummaryComponent);
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
onUnmounted(() => {
|
|
251
|
+
// Unregister by summary ID — only the ID is needed for deletion
|
|
252
|
+
const stub = { summary } as SummaryComponent;
|
|
253
|
+
|
|
254
|
+
unRegisterComponent(stub);
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
return { summary };
|
|
258
|
+
}
|
|
@@ -80,7 +80,6 @@ export default {
|
|
|
80
80
|
fitAddon: null,
|
|
81
81
|
searchAddon: null,
|
|
82
82
|
webglAddon: null,
|
|
83
|
-
canvasAddon: null,
|
|
84
83
|
isOpen: false,
|
|
85
84
|
isOpening: false,
|
|
86
85
|
backlog: [],
|
|
@@ -168,7 +167,7 @@ export default {
|
|
|
168
167
|
try {
|
|
169
168
|
const schema = this.$store.getters[`cluster/schemaFor`](NODE);
|
|
170
169
|
|
|
171
|
-
if (schema) {
|
|
170
|
+
if (schema && nodeId) {
|
|
172
171
|
await this.$store.dispatch('cluster/find', { type: NODE, id: nodeId });
|
|
173
172
|
}
|
|
174
173
|
} catch {}
|
|
@@ -215,14 +214,13 @@ export default {
|
|
|
215
214
|
|
|
216
215
|
async setupTerminal() {
|
|
217
216
|
const docStyle = getComputedStyle(document.querySelector('body'));
|
|
218
|
-
const xterm = await import(/* webpackChunkName: "xterm" */ 'xterm');
|
|
217
|
+
const xterm = await import(/* webpackChunkName: "xterm" */ '@xterm/xterm');
|
|
219
218
|
|
|
220
219
|
const addons = await allHash({
|
|
221
|
-
fit: import(/* webpackChunkName: "xterm" */ 'xterm
|
|
222
|
-
webgl: import(/* webpackChunkName: "xterm" */ 'xterm
|
|
223
|
-
weblinks: import(/* webpackChunkName: "xterm" */ 'xterm
|
|
224
|
-
search: import(/* webpackChunkName: "xterm" */ 'xterm
|
|
225
|
-
canvas: import(/* webpackChunkName: "xterm" */ 'xterm-addon-canvas')
|
|
220
|
+
fit: import(/* webpackChunkName: "xterm" */ '@xterm/addon-fit'),
|
|
221
|
+
webgl: import(/* webpackChunkName: "xterm" */ '@xterm/addon-webgl'),
|
|
222
|
+
weblinks: import(/* webpackChunkName: "xterm" */ '@xterm/addon-web-links'),
|
|
223
|
+
search: import(/* webpackChunkName: "xterm" */ '@xterm/addon-search'),
|
|
226
224
|
});
|
|
227
225
|
|
|
228
226
|
const terminal = new xterm.Terminal({
|
|
@@ -242,9 +240,21 @@ export default {
|
|
|
242
240
|
terminal.loadAddon(new addons.weblinks.WebLinksAddon());
|
|
243
241
|
terminal.open(this.$refs.xterm);
|
|
244
242
|
|
|
243
|
+
// if user is using Safari with webGPU disabled, webglAddon will silently fail
|
|
244
|
+
// and we do not have a way to detect that.
|
|
245
|
+
// To avoid it, default to DOM rendering for Safari browsers
|
|
245
246
|
try {
|
|
246
|
-
|
|
247
|
-
|
|
247
|
+
const ua = window.navigator.userAgent.toLowerCase();
|
|
248
|
+
const isSafari = ua.includes('safari') &&
|
|
249
|
+
!ua.includes('crios') && // Chrome iOS
|
|
250
|
+
!ua.includes('fxios') && // Firefox iOS
|
|
251
|
+
!ua.includes('edgios') && // Edge iOS
|
|
252
|
+
!ua.includes('opr'); // Opera
|
|
253
|
+
|
|
254
|
+
if (!isSafari) {
|
|
255
|
+
this.webglAddon = new addons.webgl.WebglAddon();
|
|
256
|
+
terminal.loadAddon(this.webglAddon);
|
|
257
|
+
}
|
|
248
258
|
} catch (e) {
|
|
249
259
|
// Some browsers (Safari) don't support the webgl renderer, so don't use it.
|
|
250
260
|
this.webglAddon = null;
|
|
@@ -288,7 +298,7 @@ export default {
|
|
|
288
298
|
}
|
|
289
299
|
|
|
290
300
|
const url = addParams(
|
|
291
|
-
`${ this.pod.links
|
|
301
|
+
`${ this.pod.links?.view.replace(/^http/, 'ws') }/exec`,
|
|
292
302
|
{
|
|
293
303
|
container: this.container,
|
|
294
304
|
stdout: 1,
|