@rancher/shell 0.5.3 → 2.0.0
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/data/aws-regions.json +9 -0
- package/assets/images/vendor/openid.svg +18 -0
- package/assets/styles/app.scss +1 -2
- package/assets/styles/fonts/_icons.scss +3 -3
- package/assets/styles/global/_columns.scss +1 -1
- package/assets/styles/global/_labeled-input.scss +2 -0
- package/assets/styles/themes/_csp.scss +2 -2
- package/assets/styles/themes/_dark.scss +8 -2
- package/assets/styles/themes/_light.scss +2 -1
- package/assets/styles/themes/_suse.scss +1 -1
- package/assets/styles/vendor/vue-select.scss +5 -0
- package/assets/translations/en-us.yaml +296 -58
- package/assets/translations/zh-hans.yaml +5 -27
- package/babel.config.js +1 -1
- package/chart/__tests__/S3.test.ts +9 -2
- package/chart/monitoring/grafana/index.vue +6 -2
- package/chart/monitoring/prometheus/index.vue +2 -2
- package/chart/rancher-backup/S3.vue +11 -9
- package/chart/rancher-backup/index.vue +15 -5
- package/cloud-credential/__tests__/harvester.test.ts +18 -0
- package/cloud-credential/generic.vue +18 -9
- package/cloud-credential/harvester.vue +11 -3
- package/components/AppModal.vue +167 -0
- package/components/AssignTo.vue +7 -4
- package/components/AsyncButton.vue +18 -5
- package/components/BackLink.vue +4 -4
- package/components/BannerGraphic.vue +1 -0
- package/components/BrandImage.vue +47 -1
- package/components/Carousel.vue +14 -8
- package/components/Certificates.vue +8 -11
- package/components/ClusterBadge.vue +12 -3
- package/components/ClusterIconMenu.vue +44 -16
- package/components/ClusterProviderIcon.vue +14 -3
- package/components/CodeMirror.vue +73 -38
- package/components/CommunityLinks.vue +12 -8
- package/components/CreateDriver.vue +81 -0
- package/components/CruResource.vue +51 -27
- package/components/DetailTop.vue +2 -2
- package/components/Dialog.vue +6 -5
- package/components/DisableAuthProviderModal.vue +14 -8
- package/components/DraggableZone.vue +2 -2
- package/components/ExplorerMembers.vue +3 -3
- package/components/ExplorerProjectsNamespaces.vue +6 -6
- package/components/FixedBanner.vue +47 -36
- package/components/GlobalRoleBindings.vue +26 -0
- package/components/Import.vue +10 -6
- package/components/Inactivity.vue +1 -5
- package/components/KeyValueView.vue +14 -10
- package/components/MessageLink.vue +2 -2
- package/components/ModalWithCard.vue +5 -8
- package/components/MoveModal.vue +35 -33
- package/components/PodSecurityAdmission.vue +3 -3
- package/components/PromptChangePassword.vue +33 -33
- package/components/PromptModal.vue +11 -21
- package/components/PromptRemove.vue +11 -17
- package/components/PromptRestore.vue +18 -16
- package/components/Questions/__tests__/Boolean.test.ts +9 -19
- package/components/Questions/__tests__/Float.test.ts +9 -19
- package/components/Questions/__tests__/Int.test.ts +9 -19
- package/components/Questions/__tests__/String.test.ts +9 -19
- package/components/Questions/__tests__/Yaml.test.ts +9 -20
- package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
- package/components/Questions/index.vue +18 -2
- package/components/ResourceCancelModal.vue +34 -29
- package/components/ResourceDetail/Masthead.vue +23 -7
- package/components/ResourceDetail/index.vue +5 -0
- package/components/ResourceList/Masthead.vue +28 -10
- package/components/ResourceList/index.vue +65 -14
- package/components/ResourceTable.vue +73 -19
- package/components/ResourceYaml.vue +1 -0
- package/components/SelectIconGrid.vue +3 -3
- package/components/SideNav.vue +15 -37
- package/components/SingleClusterInfo.vue +4 -4
- package/components/SortableTable/THead.vue +26 -12
- package/components/SortableTable/filtering.js +9 -1
- package/components/SortableTable/grouping.js +8 -1
- package/components/SortableTable/index.vue +142 -42
- package/components/SortableTable/paging.js +36 -7
- package/components/SortableTable/selection.js +2 -1
- package/components/SortableTable/sorting.js +24 -7
- package/components/TabTitle.vue +84 -0
- package/components/Tabbed/index.vue +6 -1
- package/components/TableDataUserIcon.vue +47 -0
- package/components/TypeDescription.vue +1 -0
- package/components/Wizard.vue +1 -0
- package/components/__tests__/AppModal.test.ts +98 -0
- package/components/__tests__/AsyncButton.test.ts +1 -3
- package/components/__tests__/BackLink.test.ts +1 -1
- package/components/__tests__/ButtonGroup.test.ts +3 -6
- package/components/__tests__/Carousel.test.ts +43 -0
- package/components/__tests__/Certificates.test.ts +29 -0
- package/components/__tests__/{CodeMirror.spec.ts → CodeMirror.test.ts} +5 -17
- package/components/__tests__/CruResource.test.ts +10 -9
- package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
- package/components/__tests__/FixedBanner.test.ts +5 -20
- package/components/__tests__/NamespaceFilter.test.ts +9 -18
- package/components/__tests__/TabTitle.test.ts +129 -0
- package/components/auth/AzureWarning.vue +2 -2
- package/components/auth/RoleDetailEdit.vue +10 -0
- package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
- package/components/auth/login/oidc.vue +7 -1
- package/components/fleet/FleetClusters.vue +9 -9
- package/components/fleet/FleetIntro.vue +11 -17
- package/components/fleet/FleetNoWorkspaces.vue +2 -2
- package/components/fleet/FleetRepos.vue +1 -0
- package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
- package/components/form/ArrayList.vue +30 -19
- package/components/form/ArrayListSelect.vue +9 -4
- package/components/form/ClusterAppearance.vue +132 -0
- package/components/form/ColorInput.vue +1 -0
- package/components/form/Error.vue +3 -3
- package/components/form/Footer.vue +2 -2
- package/components/form/GitPicker.vue +83 -38
- package/components/form/KeyValue.vue +67 -48
- package/components/form/LabeledSelect.vue +143 -43
- package/components/form/Labels.vue +3 -1
- package/components/form/NameNsDescription.vue +26 -9
- package/components/form/ResourceLabeledSelect.vue +187 -0
- package/components/form/ResourceTabs/index.vue +31 -15
- package/components/form/SecretSelector.vue +93 -18
- package/components/form/Select.vue +1 -1
- package/components/form/SelectOrCreateAuthSecret.vue +135 -62
- package/components/form/SimpleSecretSelector.vue +88 -28
- package/components/form/__tests__/BannerSettings.test.ts +53 -0
- package/components/form/__tests__/KeyValue.test.ts +121 -12
- package/components/form/__tests__/LabeledSelect.test.ts +0 -18
- package/components/form/__tests__/NameNsDescription.test.ts +25 -15
- package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
- package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
- package/components/formatter/AppSummaryGraph.vue +2 -2
- package/components/formatter/CloudCredPublicData.vue +30 -0
- package/components/formatter/ClusterLink.vue +2 -2
- package/components/formatter/FleetSummaryGraph.vue +2 -1
- package/components/formatter/ImagePercentageBar.vue +0 -4
- package/components/formatter/IngressTarget.vue +18 -7
- package/components/formatter/Link.vue +2 -2
- package/components/formatter/LinkDetail.vue +2 -2
- package/components/formatter/LinkDetailImage.vue +2 -2
- package/components/formatter/LinkName.vue +2 -2
- package/components/formatter/LiveDate.vue +16 -0
- package/components/formatter/PrincipalGroupBindings.vue +2 -2
- package/components/formatter/SecretType.vue +2 -2
- package/components/formatter/VirtualServiceGateways.vue +2 -2
- package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
- package/components/nav/Group.vue +7 -5
- package/components/nav/Header.vue +82 -43
- package/components/nav/NamespaceFilter.vue +8 -1
- package/components/nav/TopLevelMenu.vue +336 -125
- package/components/nav/Type.vue +58 -102
- package/components/nav/__tests__/TopLevelMenu.test.ts +370 -9
- package/components/nav/__tests__/Type.test.ts +321 -126
- package/components/nuxt/nuxt-child.js +0 -5
- package/components/nuxt/nuxt-error.vue +1 -1
- package/components/nuxt/nuxt-link.client.js +13 -95
- package/components/templates/default.vue +3 -3
- package/components/templates/error.vue +6 -10
- package/components/templates/standalone.vue +0 -4
- package/components/templates/unauthenticated.vue +1 -2
- package/components/user.retention/user-retention-header.vue +34 -0
- package/composables/useCompactInput.test.ts +36 -0
- package/composables/useCompactInput.ts +2 -2
- package/composables/useI18n.ts +26 -0
- package/composables/useLabeledFormElement.test.ts +135 -0
- package/composables/useStore.ts +16 -0
- package/config/home-links.js +32 -1
- package/config/labels-annotations.js +2 -1
- package/config/middleware.js +0 -6
- package/config/pagination-table-headers.js +57 -0
- package/config/pod-security-admission.ts +1 -1
- package/config/private-label.js +1 -3
- package/config/product/auth.js +1 -0
- package/config/product/explorer.js +167 -46
- package/config/product/legacy.js +3 -95
- package/config/product/manager.js +44 -11
- package/config/query-params.js +1 -0
- package/config/roles.ts +23 -0
- package/config/router/index.js +23 -0
- package/config/router/navigation-guards/attempt-first-login.js +73 -0
- package/config/router/navigation-guards/authentication.js +63 -0
- package/config/router/navigation-guards/index.js +15 -0
- package/config/router/navigation-guards/load-initial-settings.js +15 -0
- package/config/router/routes.js +487 -0
- package/config/settings.ts +38 -2
- package/config/store.js +7 -3
- package/config/table-headers.js +46 -1
- package/config/types.js +36 -16
- package/config/uiplugins.js +10 -5
- package/core/plugin-helpers.js +1 -1
- package/core/plugin.ts +2 -1
- package/core/plugins.js +289 -282
- package/creators/app/files/.eslintignore +0 -2
- package/creators/app/files/.vscode/settings.json +0 -1
- package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
- package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
- package/creators/pkg/init +32 -0
- package/detail/__tests__/service.test.ts +62 -0
- package/detail/catalog.cattle.io.app.vue +1 -1
- package/detail/cis.cattle.io.clusterscan.vue +14 -3
- package/detail/fleet.cattle.io.gitrepo.vue +15 -9
- package/detail/namespace.vue +2 -2
- package/detail/networking.k8s.io.ingress.vue +52 -19
- package/detail/node.vue +20 -43
- package/detail/pod.vue +1 -68
- package/detail/provisioning.cattle.io.cluster.vue +2 -1
- package/detail/service.vue +1 -1
- package/detail/workload/index.vue +2 -15
- package/dialog/AddCustomBadgeDialog.vue +318 -161
- package/dialog/DeactivateDriverDialog.vue +118 -0
- package/dialog/RollbackWorkloadDialog.vue +2 -2
- package/dialog/RotateCertificatesDialog.vue +0 -21
- package/directives/clean-html.js +15 -0
- package/directives/clean-tooltip.js +32 -0
- package/directives/focus.js +41 -0
- package/directives/int-number.js +21 -0
- package/directives/positive-int-number.js +19 -0
- package/directives/trim-whitespace.js +19 -0
- package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
- package/edit/__tests__/kontainerDriver.test.ts +107 -0
- package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
- package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
- package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
- package/edit/__tests__/nodeDriver.test.ts +107 -0
- package/edit/__tests__/service.test.ts +1 -5
- package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
- package/edit/auth/AuthProviderWarningBanners.vue +34 -0
- package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
- package/edit/auth/__tests__/azuread.test.ts +241 -0
- package/edit/auth/__tests__/oidc.test.ts +137 -0
- package/edit/auth/azuread.vue +133 -31
- package/edit/auth/github.vue +5 -17
- package/edit/auth/googleoauth.vue +5 -18
- package/edit/auth/ldap/index.vue +5 -17
- package/edit/auth/oidc.vue +143 -42
- package/edit/auth/saml.vue +5 -14
- package/edit/catalog.cattle.io.clusterrepo.vue +175 -20
- package/edit/cis.cattle.io.clusterscan.vue +5 -2
- package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
- package/edit/cloudcredential.vue +26 -4
- package/edit/configmap.vue +10 -4
- package/edit/fleet.cattle.io.gitrepo.vue +7 -4
- package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
- package/edit/kontainerDriver.vue +65 -0
- package/edit/logging-flow/Match.vue +10 -9
- package/edit/logging-flow/index.vue +4 -19
- package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
- package/edit/logging.banzaicloud.io.output/index.vue +43 -26
- package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
- package/edit/management.cattle.io.project.vue +2 -1
- package/edit/management.cattle.io.setting.vue +20 -0
- package/edit/management.cattle.io.user.vue +2 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
- package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +1 -0
- package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +3 -0
- package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +2 -0
- package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
- package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
- package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
- package/edit/networking.k8s.io.ingress/index.vue +64 -8
- package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
- package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
- package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +45 -6
- package/edit/networking.k8s.io.networkpolicy/__tests__/utils/selectors.test.ts +1 -1
- package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
- package/edit/nodeDriver.vue +65 -0
- package/edit/persistentvolume/index.vue +2 -2
- package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +18 -9
- package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +165 -1
- package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +1 -1
- package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +0 -3
- package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +70 -12
- package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +5 -0
- package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
- package/edit/provisioning.cattle.io.cluster/index.vue +21 -15
- package/edit/provisioning.cattle.io.cluster/rke2.vue +185 -114
- package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +67 -7
- package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +19 -6
- package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
- package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +7 -0
- package/edit/provisioning.cattle.io.cluster/tabs/etcd/S3Config.vue +1 -0
- package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +1 -0
- package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +3 -0
- package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +1 -0
- package/edit/resources.cattle.io.backup.vue +139 -124
- package/edit/resources.cattle.io.restore.vue +146 -126
- package/edit/service.vue +1 -0
- package/edit/serviceaccount.vue +46 -4
- package/edit/workload/__tests__/Job.test.ts +1 -3
- package/edit/workload/__tests__/Upgrading.test.ts +2 -2
- package/edit/workload/mixins/workload.js +34 -1
- package/edit/workload/storage/emptyDir.vue +2 -2
- package/initialize/App.vue +75 -0
- package/initialize/app-extended.js +128 -0
- package/initialize/entry-helpers.js +549 -0
- package/initialize/entry.js +32 -0
- package/initialize/install-components.js +23 -0
- package/initialize/install-directives.js +59 -0
- package/initialize/install-plugins.js +123 -0
- package/list/__tests__/workload.test.ts +1 -1
- package/list/cis.cattle.io.clusterscan.vue +16 -10
- package/list/group.principal.vue +2 -2
- package/list/management.cattle.io.feature.vue +11 -7
- package/list/management.cattle.io.user.vue +36 -3
- package/list/networking.k8s.io.ingress.vue +36 -0
- package/list/node.vue +211 -73
- package/list/provisioning.cattle.io.cluster.vue +17 -4
- package/list/ui.cattle.io.navlink.vue +2 -2
- package/list/workload.vue +22 -0
- package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
- package/machine-config/__tests__/vmwarevsphere.test.ts +162 -59
- package/machine-config/amazonec2.vue +1 -1
- package/machine-config/azure.vue +38 -21
- package/machine-config/generic.vue +11 -15
- package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
- package/machine-config/vmwarevsphere.vue +20 -11
- package/middleware/authenticated.js +9 -361
- package/mixins/__tests__/chart.test.ts +48 -6
- package/mixins/__tests__/create-edit-view.test.ts +2 -3
- package/mixins/auth-config.js +3 -2
- package/mixins/brand.js +75 -57
- package/mixins/chart.js +27 -13
- package/mixins/create-edit-view/index.js +2 -2
- package/mixins/fetch.client.js +42 -48
- package/mixins/labeled-form-element.ts +21 -1
- package/mixins/page-actions.js +7 -5
- package/mixins/resource-fetch-api-pagination.js +304 -0
- package/mixins/resource-fetch-namespaced.js +1 -1
- package/mixins/resource-fetch.js +46 -5
- package/models/__tests__/cluster.test.ts +44 -0
- package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
- package/models/__tests__/schema.tests.ts +24 -0
- package/models/__tests__/steve-schema.test.ts +73 -0
- package/models/__tests__/workload.test.ts +1 -1
- package/models/catalog.cattle.io.app.js +8 -0
- package/models/catalog.cattle.io.clusterrepo.js +9 -1
- package/models/catalog.cattle.io.uiplugin.js +7 -8
- package/models/cis.cattle.io.clusterscan.js +29 -8
- package/models/cloudcredential.js +9 -1
- package/models/cluster/node.js +4 -0
- package/models/cluster/schema.js +6 -0
- package/models/cluster.js +33 -0
- package/models/driver.js +62 -0
- package/models/fleet.cattle.io.cluster.js +23 -11
- package/models/fleet.cattle.io.gitrepo.js +10 -0
- package/models/helm.cattle.io.projecthelmchart.js +1 -1
- package/models/kontainerdriver.js +68 -0
- package/models/management/schema.js +6 -0
- package/models/management.cattle.io.authconfig.js +3 -2
- package/models/management.cattle.io.cluster.js +5 -4
- package/models/management.cattle.io.globalrole.js +2 -0
- package/models/management.cattle.io.user.js +67 -2
- package/models/monitoring.coreos.com.receiver.js +3 -1
- package/models/monitoring.coreos.com.route.js +1 -1
- package/models/networking.k8s.io.ingress.js +2 -1
- package/models/nodedriver.js +68 -0
- package/models/provisioning.cattle.io.cluster.js +34 -1
- package/models/schema.js +28 -7
- package/models/service.js +2 -0
- package/models/steve-schema.ts +254 -0
- package/models/workload.js +1 -0
- package/package.json +6 -5
- package/pages/about.vue +12 -5
- package/pages/account/index.vue +7 -2
- package/pages/auth/login.vue +106 -102
- package/pages/auth/logout.vue +2 -2
- package/pages/auth/setup.vue +57 -64
- package/pages/auth/verify.vue +17 -17
- package/pages/c/_cluster/apps/charts/chart.vue +54 -9
- package/pages/c/_cluster/apps/charts/index.vue +37 -13
- package/pages/c/_cluster/apps/charts/install.vue +4 -4
- package/pages/c/_cluster/auth/config/_id.vue +0 -6
- package/pages/c/_cluster/auth/config/index.vue +15 -9
- package/pages/c/_cluster/auth/roles/index.vue +8 -10
- package/pages/c/_cluster/auth/user.retention/index.vue +384 -0
- package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
- package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
- package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
- package/pages/c/_cluster/explorer/index.vue +231 -72
- package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
- package/pages/c/_cluster/explorer/tools/index.vue +12 -176
- package/pages/c/_cluster/fleet/index.vue +88 -93
- package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
- package/pages/c/_cluster/longhorn/index.vue +52 -17
- package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
- package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
- package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
- package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +94 -0
- package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
- package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
- package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +63 -0
- package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
- package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
- package/pages/c/_cluster/monitoring/index.vue +1 -17
- package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
- package/pages/c/_cluster/neuvector/index.vue +1 -0
- package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
- package/pages/c/_cluster/settings/banners.vue +86 -8
- package/pages/c/_cluster/settings/brand.vue +258 -36
- package/pages/c/_cluster/settings/index.vue +4 -4
- package/pages/c/_cluster/settings/links.vue +5 -3
- package/pages/c/_cluster/settings/performance.vue +71 -2
- package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
- package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +10 -7
- package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
- package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
- package/pages/c/_cluster/uiplugins/InstallDialog.vue +53 -18
- package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
- package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
- package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
- package/pages/c/_cluster/uiplugins/index.vue +38 -52
- package/pages/diagnostic.vue +1 -0
- package/pages/fail-whale.vue +103 -41
- package/pages/home.vue +81 -24
- package/pages/prefs.vue +8 -3
- package/pages/support/index.vue +12 -2
- package/plugins/clean-html-directive.js +5 -12
- package/plugins/clean-tooltip-directive.js +6 -31
- package/plugins/codemirror.js +0 -9
- package/plugins/dashboard-store/__tests__/mutations.test.ts +296 -313
- package/plugins/dashboard-store/actions.js +140 -32
- package/plugins/dashboard-store/getters.js +86 -39
- package/plugins/dashboard-store/index.js +0 -99
- package/plugins/dashboard-store/mutations.js +150 -48
- package/plugins/dashboard-store/resource-class.js +14 -109
- package/plugins/directives.js +6 -39
- package/plugins/ember-cookie.js +13 -0
- package/plugins/global-formatters.js +26 -5
- package/plugins/i18n.js +90 -56
- package/plugins/int-number.js +6 -20
- package/plugins/plugin.js +3 -3
- package/plugins/positive-int-number.js +6 -17
- package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +124 -31
- package/plugins/steve/__tests__/mutations.test.ts +49 -0
- package/plugins/steve/__tests__/subscribe.spec.ts +109 -0
- package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
- package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
- package/plugins/steve/actions.js +0 -1
- package/plugins/steve/getters.js +183 -63
- package/plugins/steve/hybrid-class.js +5 -1
- package/plugins/steve/mutations.js +29 -5
- package/plugins/steve/norman-class.js +123 -2
- package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
- package/plugins/steve/schema.d.ts +22 -0
- package/plugins/steve/steve-pagination-utils.ts +368 -0
- package/plugins/steve/subscribe.js +37 -75
- package/plugins/trim-whitespace.js +6 -34
- package/plugins/vue-js-modal.js +1 -1
- package/public/index.html +1 -0
- package/rancher-components/Accordion/Accordion.vue +3 -2
- package/rancher-components/BadgeState/BadgeState.vue +3 -3
- package/rancher-components/Banner/Banner.test.ts +1 -5
- package/rancher-components/Banner/Banner.vue +2 -2
- package/rancher-components/Card/Card.vue +4 -4
- package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
- package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +1 -1
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +66 -30
- package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
- package/rancher-components/Form/Radio/RadioButton.vue +13 -7
- package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
- package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
- package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
- package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
- package/rancher-components/StringList/StringList.vue +8 -8
- package/rancher-components/components/Accordion/Accordion.vue +3 -2
- package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
- package/rancher-components/components/Banner/Banner.test.ts +1 -5
- package/rancher-components/components/Banner/Banner.vue +2 -2
- package/rancher-components/components/Card/Card.vue +4 -4
- package/rancher-components/components/Form/Checkbox/Checkbox.vue +4 -3
- package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +1 -1
- package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +66 -30
- package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -3
- package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
- package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
- package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
- package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
- package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
- package/rancher-components/components/StringList/StringList.vue +8 -8
- package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +27 -8
- package/scripts/clean +1 -1
- package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
- package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
- package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
- package/scripts/extension/helm/package/Dockerfile +1 -1
- package/scripts/extension/helm/scripts/patch +27 -0
- package/scripts/extension/publish +6 -6
- package/scripts/serve-pkgs +0 -2
- package/scripts/test-plugins-build.sh +6 -6
- package/scripts/vue-migrate.js +683 -0
- package/store/__tests__/catalog.test.ts +224 -0
- package/store/auth.js +23 -4
- package/store/aws.js +53 -6
- package/store/catalog.js +21 -5
- package/store/cru-resource.ts +26 -0
- package/store/customisation.js +35 -0
- package/store/features.js +6 -4
- package/store/index.js +132 -39
- package/store/plugins.js +8 -4
- package/store/type-map.js +143 -143
- package/store/type-map.utils.ts +226 -0
- package/tsconfig.json +0 -1
- package/tsconfig.paths.json +4 -1
- package/types/components/labeledSelect.ts +50 -0
- package/types/resources/settings.d.ts +32 -0
- package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
- package/types/shell/index.d.ts +996 -782
- package/types/store/dashboard-store.types.ts +42 -0
- package/types/store/pagination.types.ts +457 -0
- package/types/store/type-map.ts +30 -0
- package/types/store/vuex.d.ts +9 -0
- package/types/vue-shim.d.ts +51 -0
- package/utils/__tests__/cluster.test.ts +20 -18
- package/utils/__tests__/create-yaml.test.ts +359 -2
- package/utils/__tests__/kontainer.test.ts +92 -0
- package/utils/__tests__/pod-security-admission.test.ts +1 -1
- package/utils/alertmanagerconfig.js +19 -0
- package/utils/array.ts +40 -1
- package/utils/async.ts +2 -0
- package/utils/auth.js +152 -4
- package/utils/axios.js +2 -2
- package/utils/banners.js +103 -0
- package/utils/cluster.js +1 -1
- package/utils/config.js +4 -0
- package/utils/create-yaml.js +54 -27
- package/utils/error.js +25 -0
- package/utils/formatter.js +5 -3
- package/utils/git.ts +1 -1
- package/utils/install-redirect.js +1 -1
- package/utils/kontainer.ts +186 -0
- package/utils/monitoring.js +2 -37
- package/utils/pagination-utils.ts +154 -0
- package/utils/pod-security-admission.ts +1 -1
- package/utils/router.js +86 -0
- package/utils/settings.ts +46 -0
- package/utils/socket.js +1 -0
- package/utils/time.js +1 -0
- package/utils/title.ts +3 -0
- package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
- package/utils/validators/formRules/__tests__/index.test.ts +21 -0
- package/utils/validators/formRules/index.ts +3 -0
- package/utils/validators/index.js +1 -0
- package/vue.config.js +376 -421
- package/assets/styles/vendor/vue-js-modal.scss +0 -16
- package/chart/monitoring/steps/uninstall-v1.vue +0 -135
- package/components/EventsTable.vue +0 -67
- package/components/TabbedLinks/index.vue +0 -94
- package/components/nuxt/nuxt-link.server.js +0 -16
- package/components/nuxt/nuxt.js +0 -101
- package/config/router.js +0 -425
- package/initialize/App.js +0 -152
- package/initialize/client.js +0 -734
- package/initialize/index.js +0 -287
- package/middleware/i18n.js +0 -10
- package/middleware/unauthenticated.js +0 -22
- package/mixins/v1-workload-metrics.js +0 -43
- package/pages/c/_cluster/apps/index.vue +0 -15
- package/pages/c/_cluster/auth/index.vue +0 -17
- package/pages/c/_cluster/index.vue +0 -15
- package/pages/c/_cluster/legacy/index.vue +0 -22
- package/pages/c/_cluster/manager/index.vue +0 -22
- package/pages/c/_cluster/mcapps/index.vue +0 -21
- package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
- package/plugins/dashboard-store/rehydrate-all.js +0 -44
- package/plugins/index.js +0 -11
- package/plugins/portal-vue.js +0 -4
- package/plugins/portal.js +0 -4
- package/plugins/resize.js +0 -5
- package/plugins/shortkey.js +0 -4
- package/plugins/tooltip.js +0 -4
- package/plugins/v-select.js +0 -4
- package/utils/group.js +0 -70
- package/utils/nuxt.js +0 -638
- package/utils/router.scrollBehavior.js +0 -78
- /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
- /package/models/__tests__/{node.ts → node.test.ts} +0 -0
- /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
- /package/plugins/steve/__tests__/{steve-class.spec.ts → steve-class.test.ts} +0 -0
- /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
- /package/rancher-components/components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
- /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
package/utils/auth.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { Popup, popupWindowOptions } from '@shell/utils/window';
|
|
2
2
|
import { parse as parseUrl, addParam } from '@shell/utils/url';
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import {
|
|
4
|
+
BACK_TO, SPA, _EDIT, _FLAGGED, TIMED_OUT
|
|
5
|
+
} from '@shell/config/query-params';
|
|
6
|
+
import { MANAGEMENT, NORMAN } from '@shell/config/types';
|
|
5
7
|
import { allHash } from '@shell/utils/promise';
|
|
8
|
+
import { getProductFromRoute, getResourceFromRoute } from '@shell/utils/router';
|
|
9
|
+
import { NAME as EXPLORER } from '@shell/config/product/explorer';
|
|
10
|
+
import { findBy } from '@shell/utils/array';
|
|
6
11
|
|
|
7
12
|
export function openAuthPopup(url, provider) {
|
|
8
13
|
const popup = new Popup(() => {
|
|
@@ -64,10 +69,10 @@ export function returnTo(opt, vm) {
|
|
|
64
69
|
export const authProvidersInfo = async(store) => {
|
|
65
70
|
const rows = await store.dispatch(`management/findAll`, { type: MANAGEMENT.AUTH_CONFIG });
|
|
66
71
|
const nonLocal = rows.filter((x) => x.name !== 'local');
|
|
67
|
-
// Generic OIDC is returned via API but not supported (and will be removed or fixed in future)
|
|
68
|
-
const supportedNonLocal = nonLocal.filter((x) => x.id !== 'oidc');
|
|
69
72
|
const enabled = nonLocal.filter((x) => x.enabled === true );
|
|
70
73
|
|
|
74
|
+
const supportedNonLocal = nonLocal.filter((x) => x.id !== 'genericoidc');
|
|
75
|
+
|
|
71
76
|
const enabledLocation = enabled.length === 1 ? {
|
|
72
77
|
name: 'c-cluster-auth-config-id',
|
|
73
78
|
params: { id: enabled[0].id },
|
|
@@ -161,3 +166,146 @@ export const canViewResource = (store, resource) => {
|
|
|
161
166
|
|
|
162
167
|
return !!validResource;
|
|
163
168
|
};
|
|
169
|
+
|
|
170
|
+
// ************************************************************
|
|
171
|
+
//
|
|
172
|
+
// BELOW ARE METHODS THAT ARE A PART OF THE AUTHENTICATED MIDDLEWARE REMOVAL. THIS IS A TEMPORARY HOME FOR THESE UTILS AND SHOULD BE REWRITTEN, MOVED OR DELETED.
|
|
173
|
+
//
|
|
174
|
+
// TODO: Remove and refactor everything below for more clarity and better organization. https://github.com/rancher/dashboard/issues/11111
|
|
175
|
+
//
|
|
176
|
+
// ************************************************************
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Attempt to set the product in our datastore if the route matches a known product. Otherwise show an error page instead.
|
|
180
|
+
*/
|
|
181
|
+
export function setProduct(store, to) {
|
|
182
|
+
let product = getProductFromRoute(to);
|
|
183
|
+
|
|
184
|
+
// since all products are hardcoded as routes (ex: c-local-explorer), if we match the wildcard route it means that the product does not exist
|
|
185
|
+
if ((product && (!to.matched.length || (to.matched.length && to.matched[0].path === '/c/:cluster/:product'))) ||
|
|
186
|
+
// if the product grabbed from the route is not registered, then we don't have it!
|
|
187
|
+
(product && !store.getters['type-map/isProductRegistered'](product))) {
|
|
188
|
+
const error = new Error(store.getters['i18n/t']('nav.failWhale.productNotFound', { productNotFound: product }, true));
|
|
189
|
+
|
|
190
|
+
store.dispatch('loadingError', error);
|
|
191
|
+
|
|
192
|
+
throw new Error('loadingError', new Error(store.getters['i18n/t']('nav.failWhale.productNotFound', { productNotFound: product }, true)));
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if ( !product ) {
|
|
196
|
+
product = EXPLORER;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
const oldProduct = store.getters['productId'];
|
|
200
|
+
const oldStore = store.getters['currentProduct']?.inStore;
|
|
201
|
+
|
|
202
|
+
if ( product !== oldProduct ) {
|
|
203
|
+
store.commit('setProduct', product);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const neuStore = store.getters['currentProduct']?.inStore;
|
|
207
|
+
|
|
208
|
+
if ( neuStore !== oldStore ) {
|
|
209
|
+
// If the product store changes, clear the catalog.
|
|
210
|
+
// There might be management catalog items in it vs cluster.
|
|
211
|
+
store.commit('catalog/reset');
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Check that the resource is valid, if not redirect to fail whale
|
|
217
|
+
*
|
|
218
|
+
* This requires that
|
|
219
|
+
* - product is set
|
|
220
|
+
* - product's store is set and setup (so we can check schema's within it)
|
|
221
|
+
* - product's store has the schemaFor getter (extension stores might not have it)
|
|
222
|
+
* - there's a resource associated with route (meta or param)
|
|
223
|
+
*/
|
|
224
|
+
export function validateResource(store, to) {
|
|
225
|
+
const product = store.getters['currentProduct'];
|
|
226
|
+
const resource = getResourceFromRoute(to);
|
|
227
|
+
|
|
228
|
+
// In order to check a resource is valid we need these
|
|
229
|
+
if (!product || !resource) {
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (canViewResource(store, resource)) {
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Unknown resource, redirect to fail whale
|
|
238
|
+
|
|
239
|
+
const error = new Error(store.getters['i18n/t']('nav.failWhale.resourceNotFound', { resource }, true));
|
|
240
|
+
|
|
241
|
+
store.dispatch('loadingError', error);
|
|
242
|
+
|
|
243
|
+
throw error;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Attempt to load the current user's principal
|
|
248
|
+
*/
|
|
249
|
+
export async function findMe(store) {
|
|
250
|
+
// First thing we do in loadManagement is fetch principals anyway.... so don't ?me=true here
|
|
251
|
+
const principals = await store.dispatch('rancher/findAll', {
|
|
252
|
+
type: NORMAN.PRINCIPAL,
|
|
253
|
+
opt: {
|
|
254
|
+
url: '/v3/principals',
|
|
255
|
+
redirectUnauthorized: false,
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
const me = findBy(principals, 'me', true);
|
|
260
|
+
|
|
261
|
+
return me;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Attempt to login with default credentials. Note: I think that this may actually be outdated since we don't use these default credentials anymore on setup.
|
|
266
|
+
*/
|
|
267
|
+
export async function tryInitialSetup(store, password = 'admin') {
|
|
268
|
+
try {
|
|
269
|
+
const res = await store.dispatch('auth/login', {
|
|
270
|
+
provider: 'local',
|
|
271
|
+
body: {
|
|
272
|
+
username: 'admin',
|
|
273
|
+
password
|
|
274
|
+
},
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
return res._status === 200;
|
|
278
|
+
} catch (e) {
|
|
279
|
+
console.error('Error trying initial setup', e); // eslint-disable-line no-console
|
|
280
|
+
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Record in our state management that we're indeed logged in
|
|
287
|
+
*/
|
|
288
|
+
export function isLoggedIn(store, me) {
|
|
289
|
+
store.commit('auth/hasAuth', true);
|
|
290
|
+
store.commit('auth/loggedInAs', me.id);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Record in our state management that we're not logged in and then redirect to the login page
|
|
295
|
+
*/
|
|
296
|
+
export function notLoggedIn(store, redirect, route) {
|
|
297
|
+
store.commit('auth/hasAuth', true);
|
|
298
|
+
|
|
299
|
+
if ( route.name === 'index' ) {
|
|
300
|
+
return redirect('/auth/login');
|
|
301
|
+
} else {
|
|
302
|
+
return redirect(`/auth/login?${ TIMED_OUT }`);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Record in our state management that we don't have any auth providers
|
|
308
|
+
*/
|
|
309
|
+
export function noAuth(store) {
|
|
310
|
+
store.commit('auth/hasAuth', false);
|
|
311
|
+
}
|
package/utils/axios.js
CHANGED
|
@@ -84,9 +84,9 @@ const setupProgress = (axios) => {
|
|
|
84
84
|
};
|
|
85
85
|
|
|
86
86
|
const $loading = () => {
|
|
87
|
-
const $
|
|
87
|
+
const $globalApp = window.$globalApp;
|
|
88
88
|
|
|
89
|
-
return ($
|
|
89
|
+
return ($globalApp && $globalApp.$loading && $globalApp.$loading.set) ? $globalApp.$loading : noopLoading;
|
|
90
90
|
};
|
|
91
91
|
|
|
92
92
|
let currentRequests = 0;
|
package/utils/banners.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* Helper utilities for the fixed banners that can be configured to show on pages
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { MANAGEMENT } from '@shell/config/types';
|
|
8
|
+
import { SETTING } from '@shell/config/settings';
|
|
9
|
+
|
|
10
|
+
const BANNER_HEADER = 'bannerHeader';
|
|
11
|
+
const BANNER_FOOTER = 'bannerFooter';
|
|
12
|
+
const BANNER_LOGIN = 'bannerConsent';
|
|
13
|
+
|
|
14
|
+
const INDIVIDUAL_BANNERS = {
|
|
15
|
+
'ui-banner-header': BANNER_HEADER,
|
|
16
|
+
'ui-banner-footer': BANNER_FOOTER,
|
|
17
|
+
'ui-banner-login-consent': BANNER_LOGIN,
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const BANNER_SHOW_KEY_MAP = {
|
|
21
|
+
[BANNER_HEADER]: 'showHeader',
|
|
22
|
+
[BANNER_FOOTER]: 'showFooter',
|
|
23
|
+
[BANNER_LOGIN]: 'showConsent',
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Get the individual banner settings
|
|
28
|
+
*/
|
|
29
|
+
export function getIndividualBanners(store) {
|
|
30
|
+
const banners = {};
|
|
31
|
+
|
|
32
|
+
// Go through all settings looking for the individual settings
|
|
33
|
+
const allSettings = store.getters['management/all'](MANAGEMENT.SETTING);
|
|
34
|
+
|
|
35
|
+
allSettings.forEach((setting) => {
|
|
36
|
+
if (setting.value && !!INDIVIDUAL_BANNERS[setting.id]) {
|
|
37
|
+
const settingId = INDIVIDUAL_BANNERS[setting.id];
|
|
38
|
+
|
|
39
|
+
banners[settingId] = setting;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
return banners;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Overlay settings from the individual banner settings onto the single banner setting
|
|
48
|
+
*/
|
|
49
|
+
export function overlayIndividualBanners(parsedBanner, banners) {
|
|
50
|
+
Object.keys(banners).forEach((id) => {
|
|
51
|
+
try {
|
|
52
|
+
const parsedIndividualBanner = JSON.parse(banners[id].value);
|
|
53
|
+
const shownID = BANNER_SHOW_KEY_MAP[id];
|
|
54
|
+
|
|
55
|
+
parsedBanner[id] = parsedIndividualBanner;
|
|
56
|
+
parsedBanner[shownID] = 'true'; // If there is an individual banner setting, then banner is shown
|
|
57
|
+
} catch {}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Converts a pixel value to an em value based on the default font size.
|
|
63
|
+
* @param {number} elementFontSize - The font size of the element in pixels.
|
|
64
|
+
* @param {number} [defaultFontSize=14] - The default font size in pixels.
|
|
65
|
+
* @returns {string} The converted value in em units.
|
|
66
|
+
*/
|
|
67
|
+
function pxToEm(elementFontSize, defaultFontSize = 14) {
|
|
68
|
+
const lineHeightInPx = 2 * parseInt(elementFontSize);
|
|
69
|
+
const lineHeightInEm = lineHeightInPx / defaultFontSize;
|
|
70
|
+
|
|
71
|
+
return `${ lineHeightInEm }em`;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Get banner font sizes - used to add margins when header and footer banners are present
|
|
76
|
+
**/
|
|
77
|
+
export function getGlobalBannerFontSizes(store) {
|
|
78
|
+
const settings = store.getters['management/all'](MANAGEMENT.SETTING);
|
|
79
|
+
const bannerSettings = settings?.find((s) => s.id === SETTING.BANNERS);
|
|
80
|
+
const individualBannerSettings = getIndividualBanners(store);
|
|
81
|
+
|
|
82
|
+
if (bannerSettings) {
|
|
83
|
+
const parsed = JSON.parse(bannerSettings.value);
|
|
84
|
+
|
|
85
|
+
overlayIndividualBanners(parsed, individualBannerSettings);
|
|
86
|
+
|
|
87
|
+
const {
|
|
88
|
+
showFooter, showHeader, bannerFooter, bannerHeader, banner
|
|
89
|
+
} = parsed;
|
|
90
|
+
|
|
91
|
+
// add defaults to accommodate older JSON structures for banner definitions without breaking the UI
|
|
92
|
+
// https://github.com/rancher/dashboard/issues/10140
|
|
93
|
+
const bannerHeaderFontSize = bannerHeader?.fontSize || banner?.fontSize || '14px';
|
|
94
|
+
const bannerFooterFontSize = bannerFooter?.fontSize || banner?.fontSize || '14px';
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
headerFont: showHeader === 'true' ? pxToEm(bannerHeaderFontSize) : '0px',
|
|
98
|
+
footerFont: showFooter === 'true' ? pxToEm(bannerFooterFontSize) : '0px'
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
package/utils/cluster.js
CHANGED
|
@@ -85,7 +85,7 @@ export function abbreviateClusterName(input) {
|
|
|
85
85
|
break;
|
|
86
86
|
}
|
|
87
87
|
default:
|
|
88
|
-
result = segments.slice(0,
|
|
88
|
+
result = segments.slice(0, 2).map((segment) => segment[0]).join('') + segments.slice(-1)[0].slice(-1);
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
return result;
|
package/utils/config.js
ADDED
package/utils/create-yaml.js
CHANGED
|
@@ -2,6 +2,7 @@ import { indent as _indent } from '@shell/utils/string';
|
|
|
2
2
|
import { addObject, findBy, removeObject, removeObjects } from '@shell/utils/array';
|
|
3
3
|
import jsyaml from 'js-yaml';
|
|
4
4
|
import { cleanUp, isEmpty } from '@shell/utils/object';
|
|
5
|
+
import { parseType } from '@shell/models/schema';
|
|
5
6
|
|
|
6
7
|
export const SIMPLE_TYPES = [
|
|
7
8
|
'string',
|
|
@@ -87,26 +88,47 @@ export function createYaml(
|
|
|
87
88
|
depth = 0,
|
|
88
89
|
path = '',
|
|
89
90
|
rootType = null,
|
|
90
|
-
dataOptions = {}
|
|
91
|
+
dataOptions = {},
|
|
91
92
|
) {
|
|
92
|
-
|
|
93
|
+
data = data || {};
|
|
93
94
|
|
|
94
|
-
|
|
95
|
-
rootType = type;
|
|
96
|
-
}
|
|
95
|
+
let schema, rootSchema, schemaDefinitions, schemaResourceFields;
|
|
97
96
|
|
|
98
|
-
if (
|
|
99
|
-
|
|
100
|
-
|
|
97
|
+
if (depth === 0) {
|
|
98
|
+
// `type` is a schema id
|
|
99
|
+
schema = findBy(schemas, 'id', type);
|
|
101
100
|
|
|
102
|
-
|
|
101
|
+
if ( !schema ) { // schema is only needed at the root level.
|
|
102
|
+
return `Error loading schema for ${ type }`;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
rootSchema = schema;
|
|
106
|
+
|
|
107
|
+
schemaDefinitions = rootSchema.schemaDefinitions;
|
|
108
|
+
schemaResourceFields = rootSchema.resourceFields;
|
|
103
109
|
|
|
104
|
-
if ( depth === 0 ) {
|
|
105
110
|
const attr = schema.attributes || {};
|
|
106
111
|
|
|
107
112
|
// Default to data.apiVersion/kind to accommodate spoofed types that aggregate multiple types
|
|
108
113
|
data.apiVersion = (attr.group ? `${ attr.group }/${ attr.version }` : attr.version) || data.apiVersion;
|
|
109
114
|
data.kind = attr.kind || data.kind;
|
|
115
|
+
} else {
|
|
116
|
+
rootSchema = findBy(schemas, 'id', rootType);
|
|
117
|
+
|
|
118
|
+
if (rootSchema.requiresResourceFields) { // See `requiresResourceFields` definition
|
|
119
|
+
schemaDefinitions = rootSchema.schemaDefinitions;
|
|
120
|
+
schemaResourceFields = schemaDefinitions[type]?.resourceFields;
|
|
121
|
+
} else {
|
|
122
|
+
schema = findBy(schemas, 'id', type);
|
|
123
|
+
if ( !schema ) { // schema is only needed at the root level.
|
|
124
|
+
return `Error loading schema for ${ type }`;
|
|
125
|
+
}
|
|
126
|
+
schemaResourceFields = schema.resourceFields;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if ( !rootType ) {
|
|
131
|
+
rootType = type;
|
|
110
132
|
}
|
|
111
133
|
|
|
112
134
|
const regularFields = [];
|
|
@@ -131,14 +153,14 @@ export function createYaml(
|
|
|
131
153
|
const key = parts[parts.length - 1];
|
|
132
154
|
const prefix = parts.slice(0, -1).join('.');
|
|
133
155
|
|
|
134
|
-
if ( prefix === path &&
|
|
156
|
+
if ( prefix === path && schemaResourceFields && schemaResourceFields[key] ) {
|
|
135
157
|
addObject(regularFields, key);
|
|
136
158
|
}
|
|
137
159
|
}
|
|
138
160
|
}
|
|
139
161
|
|
|
140
162
|
// Include all fields in schema's resourceFields as comments
|
|
141
|
-
const commentFields = Object.keys(
|
|
163
|
+
const commentFields = Object.keys(schemaResourceFields || {});
|
|
142
164
|
|
|
143
165
|
commentFields.forEach((key) => {
|
|
144
166
|
if ( typeof data[key] !== 'undefined' || (depth === 0 && key === '_type') ) {
|
|
@@ -170,7 +192,7 @@ export function createYaml(
|
|
|
170
192
|
const key = parts[parts.length - 1];
|
|
171
193
|
const prefix = parts.slice(0, -1).join('.');
|
|
172
194
|
|
|
173
|
-
if ( prefix === path &&
|
|
195
|
+
if ( prefix === path && schemaResourceFields && schemaResourceFields[key] ) {
|
|
174
196
|
removeObject(commentFields, key);
|
|
175
197
|
}
|
|
176
198
|
}
|
|
@@ -182,8 +204,6 @@ export function createYaml(
|
|
|
182
204
|
const comments = commentFields.map((k) => {
|
|
183
205
|
// Don't add a namespace comment for types that aren't namespaced.
|
|
184
206
|
if ( path === 'metadata' && k === 'namespace' ) {
|
|
185
|
-
const rootSchema = findBy(schemas, 'id', rootType);
|
|
186
|
-
|
|
187
207
|
if ( rootSchema && !rootSchema.attributes?.namespaced ) {
|
|
188
208
|
return null;
|
|
189
209
|
}
|
|
@@ -202,7 +222,7 @@ export function createYaml(
|
|
|
202
222
|
// ---------------
|
|
203
223
|
|
|
204
224
|
function stringifyField(key) {
|
|
205
|
-
const field =
|
|
225
|
+
const field = schemaResourceFields?.[key];
|
|
206
226
|
let out = `${ key }:`;
|
|
207
227
|
|
|
208
228
|
// '_type' in steve maps to kubernetes 'type' field; show 'type' field in yaml
|
|
@@ -233,8 +253,8 @@ export function createYaml(
|
|
|
233
253
|
}
|
|
234
254
|
|
|
235
255
|
const type = typeMunge(field.type);
|
|
236
|
-
const mapOf = typeRef('map', type);
|
|
237
|
-
const arrayOf = typeRef('array', type);
|
|
256
|
+
const mapOf = typeRef('map', type, field);
|
|
257
|
+
const arrayOf = typeRef('array', type, field);
|
|
238
258
|
const referenceTo = typeRef('reference', type);
|
|
239
259
|
|
|
240
260
|
// type == map[mapOf]
|
|
@@ -254,7 +274,7 @@ export function createYaml(
|
|
|
254
274
|
if ( SIMPLE_TYPES.includes(mapOf) ) {
|
|
255
275
|
out += `# key: ${ mapOf }`;
|
|
256
276
|
} else {
|
|
257
|
-
// If not a simple type ie some sort of object/array,
|
|
277
|
+
// If not a simple type ie some sort of object/array, recursively build out commented fields (note data = null here) per the type's (mapOf's) schema
|
|
258
278
|
const chunk = createYaml(schemas, mapOf, null, processAlwaysAdd, depth + 1, (path ? `${ path }.${ key }` : key), rootType, dataOptions);
|
|
259
279
|
let indented = indent(chunk);
|
|
260
280
|
|
|
@@ -279,7 +299,7 @@ export function createYaml(
|
|
|
279
299
|
out += `\n${ indent(parsedData.trim()) }`;
|
|
280
300
|
}
|
|
281
301
|
} catch (e) {
|
|
282
|
-
console.error(`Error:
|
|
302
|
+
console.error(`Error: Unable to parse array data for yaml of type: ${ type }`, e); // eslint-disable-line no-console
|
|
283
303
|
}
|
|
284
304
|
}
|
|
285
305
|
|
|
@@ -335,7 +355,7 @@ export function createYaml(
|
|
|
335
355
|
}
|
|
336
356
|
}
|
|
337
357
|
|
|
338
|
-
const subDef = findBy(schemas, 'id', type);
|
|
358
|
+
const subDef = schemaDefinitions?.[type] || findBy(schemas, 'id', type);
|
|
339
359
|
|
|
340
360
|
if ( subDef) {
|
|
341
361
|
let chunk;
|
|
@@ -411,12 +431,19 @@ function getBlockIndentation(blockHeader) {
|
|
|
411
431
|
return indentation?.[0] || '';
|
|
412
432
|
}
|
|
413
433
|
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
434
|
+
/**
|
|
435
|
+
* Check for a specific type and if valid return it's sub type or self
|
|
436
|
+
* @param {string} type required type
|
|
437
|
+
* @param {string} str actual type
|
|
438
|
+
* @param {ResourceField} field resourceField entry to the actual type
|
|
439
|
+
*
|
|
440
|
+
* @returns the sub type, or if not found the type
|
|
441
|
+
*/
|
|
442
|
+
export function typeRef(type, str, field = null) {
|
|
443
|
+
const [foundType, foundSubType] = parseType(str, field);
|
|
417
444
|
|
|
418
|
-
if (
|
|
419
|
-
return typeMunge(
|
|
445
|
+
if (type === foundType) {
|
|
446
|
+
return typeMunge(foundSubType || foundType);
|
|
420
447
|
}
|
|
421
448
|
}
|
|
422
449
|
|
|
@@ -460,7 +487,7 @@ export function saferDump(obj) {
|
|
|
460
487
|
*
|
|
461
488
|
* @returns the result of jsyaml.dump with the addition of multiline indicators
|
|
462
489
|
*/
|
|
463
|
-
export function dumpBlock(data, options = {}) {
|
|
490
|
+
export function dumpBlock(data, options = { lineWidth: -1 }) {
|
|
464
491
|
const parsed = jsyaml.dump(data, options);
|
|
465
492
|
|
|
466
493
|
let out = parsed;
|
package/utils/error.js
CHANGED
|
@@ -104,3 +104,28 @@ export function exceptionToErrorsArray(err) {
|
|
|
104
104
|
return [err];
|
|
105
105
|
}
|
|
106
106
|
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Imported from path-to-regexp
|
|
110
|
+
* @param {*} err
|
|
111
|
+
* @returns
|
|
112
|
+
*/
|
|
113
|
+
export const normalizeError = (err) => {
|
|
114
|
+
let message;
|
|
115
|
+
|
|
116
|
+
if (!(err.message || typeof err === 'string')) {
|
|
117
|
+
try {
|
|
118
|
+
message = JSON.stringify(err, null, 2);
|
|
119
|
+
} catch (e) {
|
|
120
|
+
message = `[${ err.constructor.name }]`;
|
|
121
|
+
}
|
|
122
|
+
} else {
|
|
123
|
+
message = err.message || err;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return {
|
|
127
|
+
...err,
|
|
128
|
+
message,
|
|
129
|
+
statusCode: (err.statusCode || err.status || (err.response && err.response.status) || 500)
|
|
130
|
+
};
|
|
131
|
+
};
|
package/utils/formatter.js
CHANGED
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
import { SECRET_TYPES } from '@shell/config/secret';
|
|
3
3
|
|
|
4
4
|
export function formatEncryptionSecretNames(secrets, chartNamespace) {
|
|
5
|
-
return secrets
|
|
6
|
-
(secret) => (secret.data || {})['encryption-provider-config.yaml'] &&
|
|
5
|
+
return secrets
|
|
6
|
+
.filter((secret) => (secret.data || {})['encryption-provider-config.yaml'] &&
|
|
7
7
|
secret.metadata.namespace === chartNamespace &&
|
|
8
8
|
!secret.metadata?.state?.error &&
|
|
9
9
|
secret._type === SECRET_TYPES.OPAQUE
|
|
10
|
-
|
|
10
|
+
)
|
|
11
|
+
.map((secret) => secret.metadata.name)
|
|
12
|
+
.sort();
|
|
11
13
|
}
|
package/utils/git.ts
CHANGED
|
@@ -26,7 +26,7 @@ export default function(product, chartName, defaultResourceOrRoute, install = tr
|
|
|
26
26
|
} else if (install) {
|
|
27
27
|
// The product is not installed, redirect to the details chart
|
|
28
28
|
|
|
29
|
-
await store.dispatch('catalog/load'
|
|
29
|
+
await store.dispatch('catalog/load');
|
|
30
30
|
|
|
31
31
|
const chart = store.getters['catalog/chart']({ chartName });
|
|
32
32
|
|