@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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import Vue from 'vue';
|
|
1
|
+
import Vue, { markRaw } from 'vue';
|
|
2
2
|
import { addObject, addObjects, clear, removeObject } from '@shell/utils/array';
|
|
3
3
|
import { SCHEMA, COUNT } from '@shell/config/types';
|
|
4
4
|
import { normalizeType, keyFieldFor } from '@shell/plugins/dashboard-store/normalize';
|
|
@@ -14,15 +14,31 @@ function registerType(state, type) {
|
|
|
14
14
|
list: [],
|
|
15
15
|
haveAll: false,
|
|
16
16
|
haveSelector: {},
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
/**
|
|
18
|
+
* If the cached list only contains resources for a namespace, this will contain the ns name
|
|
19
|
+
*/
|
|
20
|
+
haveNamespace: undefined,
|
|
21
|
+
/**
|
|
22
|
+
* If the cached list only contains resources from a pagination request, this will contain the pagination settings (`StorePagination`)
|
|
23
|
+
*/
|
|
24
|
+
havePage: undefined,
|
|
25
|
+
/**
|
|
26
|
+
* The highest known resourceVersion from the server for this type
|
|
27
|
+
*/
|
|
28
|
+
revision: 0,
|
|
29
|
+
/**
|
|
30
|
+
* Updated every time something is loaded for this type
|
|
31
|
+
*/
|
|
32
|
+
generation: 0,
|
|
33
|
+
/**
|
|
34
|
+
* Used to cancel incremental loads if the page changes during load
|
|
35
|
+
*/
|
|
36
|
+
loadCounter: 0,
|
|
37
|
+
|
|
38
|
+
// Not enumerable so they don't get sent back to the client for SSR
|
|
39
|
+
map: markRaw(new Map()),
|
|
21
40
|
};
|
|
22
41
|
|
|
23
|
-
// Not enumerable so they don't get sent back to the client for SSR
|
|
24
|
-
Object.defineProperty(cache, 'map', { value: new Map() });
|
|
25
|
-
|
|
26
42
|
Vue.set(state.types, type, cache);
|
|
27
43
|
}
|
|
28
44
|
|
|
@@ -47,11 +63,28 @@ function replaceResource(existing, data, getters) {
|
|
|
47
63
|
return replace(existing, data);
|
|
48
64
|
}
|
|
49
65
|
|
|
50
|
-
|
|
66
|
+
/**
|
|
67
|
+
* `load` can be called as part of a loop. to avoid common look ups create them up front and pass as `cachedArgs`
|
|
68
|
+
*/
|
|
69
|
+
export function createLoadArgs(ctx, dataType) {
|
|
51
70
|
const { getters } = ctx;
|
|
52
|
-
|
|
71
|
+
const type = normalizeType(dataType);
|
|
53
72
|
const keyField = getters.keyFieldForType(type);
|
|
54
73
|
const opts = ctx.rootGetters[`type-map/optionsFor`](type);
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
type, keyField, opts
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function load(state, {
|
|
81
|
+
data, ctx, existing, cachedArgs
|
|
82
|
+
}) {
|
|
83
|
+
const { getters } = ctx;
|
|
84
|
+
// Optimisation. This can run once per resource loaded.., so pass in from parent
|
|
85
|
+
const { type: cachedType, keyField, opts } = cachedArgs || createLoadArgs(ctx, data.type);
|
|
86
|
+
let type = cachedType;
|
|
87
|
+
|
|
55
88
|
const limit = opts?.limit;
|
|
56
89
|
|
|
57
90
|
// Inject special fields for indexing schemas
|
|
@@ -65,37 +98,52 @@ export function load(state, { data, ctx, existing }) {
|
|
|
65
98
|
|
|
66
99
|
cache.generation++;
|
|
67
100
|
|
|
68
|
-
let entry;
|
|
101
|
+
let entry = cache.map.get(id);
|
|
102
|
+
const inMap = !!entry;
|
|
69
103
|
|
|
104
|
+
//
|
|
105
|
+
// Determine the `entry` that should be in the local map and list cache
|
|
106
|
+
//
|
|
70
107
|
if ( existing && !existing.id ) {
|
|
71
|
-
// A specific proxy instance to
|
|
72
|
-
//
|
|
73
|
-
|
|
74
|
-
addObject(cache.list, entry);
|
|
75
|
-
cache.map.set(id, entry);
|
|
76
|
-
// console.log('### Mutation added from existing proxy', type, id);
|
|
77
|
-
} else {
|
|
78
|
-
entry = cache.map.get(id);
|
|
108
|
+
// A specific proxy instance to use was passed in (for create -> save), use it instead of making a new proxy
|
|
109
|
+
// `existing` is a classified resource created locally that is most probably not in the store (unless a slow connection means it's added by socket before the API responds)
|
|
110
|
+
// Note - `existing` has no `id` because the resource was created locally and not supplied by Rancher API
|
|
79
111
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
112
|
+
// Get the latest and greatest version of the resource
|
|
113
|
+
const latestEntry = replaceResource(existing, data, getters);
|
|
114
|
+
|
|
115
|
+
if (inMap) {
|
|
116
|
+
// There's already an entry in the store, so merge changes into it. The list entry is a reference to the map (and vice versa)
|
|
117
|
+
entry = replaceResource(entry, latestEntry, getters);
|
|
118
|
+
} else {
|
|
119
|
+
// There's no entry, using existing proxy
|
|
120
|
+
entry = latestEntry;
|
|
121
|
+
}
|
|
122
|
+
} else {
|
|
123
|
+
if (inMap) {
|
|
124
|
+
// There's already an entry in the store, so merge changes into it. The list entry is a reference to the map (and vice versa)
|
|
125
|
+
entry = replaceResource(entry, data, getters);
|
|
84
126
|
} else {
|
|
85
127
|
// There's no entry, make a new proxy
|
|
86
128
|
entry = classify(ctx, data);
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
// console.log('### Mutation', type, id);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
90
131
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
132
|
+
//
|
|
133
|
+
// Ensure the `entry` is in both both list and cache
|
|
134
|
+
// Note - We should be safe assuming the two collections have parity (not in map means not in list)
|
|
135
|
+
//
|
|
136
|
+
if (!inMap) {
|
|
137
|
+
cache.list.push(entry);
|
|
138
|
+
cache.map.set(id, entry);
|
|
139
|
+
}
|
|
95
140
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
141
|
+
// If there is a limit to the number of resources we can store for this type then
|
|
142
|
+
// remove the first one to keep the list size to that limit
|
|
143
|
+
if (limit && cache.list.length > limit) {
|
|
144
|
+
const rm = cache.list.shift();
|
|
145
|
+
|
|
146
|
+
cache.map.delete(rm.id);
|
|
99
147
|
}
|
|
100
148
|
|
|
101
149
|
if ( data.baseType ) {
|
|
@@ -117,6 +165,7 @@ export function forgetType(state, type) {
|
|
|
117
165
|
cache.haveAll = false;
|
|
118
166
|
cache.haveSelector = {};
|
|
119
167
|
cache.haveNamespace = undefined;
|
|
168
|
+
cache.havePage = undefined;
|
|
120
169
|
cache.revision = 0;
|
|
121
170
|
cache.generation = 0;
|
|
122
171
|
clear(cache.list);
|
|
@@ -291,13 +340,39 @@ export function loadAll(state, {
|
|
|
291
340
|
|
|
292
341
|
// Allow requester to skip setting that everything has loaded
|
|
293
342
|
if (!skipHaveAll) {
|
|
294
|
-
|
|
295
|
-
|
|
343
|
+
if (namespace) {
|
|
344
|
+
cache.havePage = false;
|
|
345
|
+
cache.haveNamespace = namespace;
|
|
346
|
+
cache.haveAll = false;
|
|
347
|
+
} else {
|
|
348
|
+
cache.havePage = false;
|
|
349
|
+
cache.haveNamespace = false;
|
|
350
|
+
cache.haveAll = true;
|
|
351
|
+
}
|
|
296
352
|
}
|
|
297
353
|
|
|
298
354
|
return proxies;
|
|
299
355
|
}
|
|
300
356
|
|
|
357
|
+
/**
|
|
358
|
+
* Add a set of resources to the store for a given type
|
|
359
|
+
*
|
|
360
|
+
* Don't mark the 'haveAll' field - this is used for incremental loading
|
|
361
|
+
*/
|
|
362
|
+
export function loadAdd(state, { type, data: allLatest, ctx }) {
|
|
363
|
+
const { getters } = ctx;
|
|
364
|
+
const keyField = getters.keyFieldForType(type);
|
|
365
|
+
const cachedArgs = createLoadArgs(ctx, allLatest?.[0]?.type);
|
|
366
|
+
|
|
367
|
+
allLatest.forEach((entry) => {
|
|
368
|
+
const existing = state.types[type].map.get(entry[keyField]);
|
|
369
|
+
|
|
370
|
+
load(state, {
|
|
371
|
+
data: entry, ctx, existing, cachedArgs
|
|
372
|
+
});
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
|
|
301
376
|
export default {
|
|
302
377
|
registerType,
|
|
303
378
|
load,
|
|
@@ -310,8 +385,12 @@ export default {
|
|
|
310
385
|
Object.assign(state.config, config);
|
|
311
386
|
},
|
|
312
387
|
|
|
388
|
+
/**
|
|
389
|
+
* Load multiple different types of resources
|
|
390
|
+
*/
|
|
313
391
|
loadMulti(state, { data, ctx }) {
|
|
314
392
|
// console.log('### Mutation loadMulti', data?.length);
|
|
393
|
+
|
|
315
394
|
for ( const entry of data ) {
|
|
316
395
|
load(state, { data: entry, ctx });
|
|
317
396
|
}
|
|
@@ -321,9 +400,12 @@ export default {
|
|
|
321
400
|
type, entries, ctx, selector, revision
|
|
322
401
|
}) {
|
|
323
402
|
const cache = registerType(state, type);
|
|
403
|
+
const cachedArgs = createLoadArgs(ctx, entries?.[0]?.type);
|
|
324
404
|
|
|
325
405
|
for ( const data of entries ) {
|
|
326
|
-
load(state, {
|
|
406
|
+
load(state, {
|
|
407
|
+
data, ctx, cachedArgs
|
|
408
|
+
});
|
|
327
409
|
}
|
|
328
410
|
|
|
329
411
|
cache.haveSelector[selector] = true;
|
|
@@ -343,12 +425,13 @@ export default {
|
|
|
343
425
|
// const allExisting = getters.all({type});
|
|
344
426
|
const keyField = getters.keyFieldForType(type);
|
|
345
427
|
const cache = state.types[type];
|
|
428
|
+
const cachedArgs = createLoadArgs(ctx, allLatest?.[0].type);
|
|
346
429
|
|
|
347
430
|
allLatest.forEach((entry) => {
|
|
348
431
|
const existing = state.types[type].map.get(entry[keyField]);
|
|
349
432
|
|
|
350
433
|
load(state, {
|
|
351
|
-
data: entry, ctx, existing
|
|
434
|
+
data: entry, ctx, existing, cachedArgs
|
|
352
435
|
});
|
|
353
436
|
});
|
|
354
437
|
cache.list.forEach((entry) => {
|
|
@@ -358,19 +441,38 @@ export default {
|
|
|
358
441
|
});
|
|
359
442
|
},
|
|
360
443
|
|
|
361
|
-
|
|
362
|
-
// Don't mark the 'haveAll' field - this is used for incremental loading
|
|
363
|
-
loadAdd(state, { type, data: allLatest, ctx }) {
|
|
364
|
-
const { getters } = ctx;
|
|
365
|
-
const keyField = getters.keyFieldForType(type);
|
|
444
|
+
loadAdd,
|
|
366
445
|
|
|
367
|
-
|
|
368
|
-
|
|
446
|
+
loadPage(state, {
|
|
447
|
+
type,
|
|
448
|
+
data,
|
|
449
|
+
ctx,
|
|
450
|
+
pagination,
|
|
451
|
+
}) {
|
|
452
|
+
if (!data) {
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
369
455
|
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
456
|
+
const keyField = ctx.getters.keyFieldForType(type);
|
|
457
|
+
const proxies = data.map((x) => classify(ctx, x));
|
|
458
|
+
const cache = registerType(state, type);
|
|
459
|
+
|
|
460
|
+
clear(cache.list);
|
|
461
|
+
cache.map.clear();
|
|
462
|
+
cache.generation++;
|
|
463
|
+
|
|
464
|
+
addObjects(cache.list, proxies);
|
|
465
|
+
|
|
466
|
+
for ( let i = 0 ; i < proxies.length ; i++ ) {
|
|
467
|
+
cache.map.set(proxies[i][keyField], proxies[i]);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// havePage is of type `StorePagination`
|
|
471
|
+
cache.havePage = pagination;
|
|
472
|
+
cache.haveNamespace = undefined;
|
|
473
|
+
cache.haveAll = undefined;
|
|
474
|
+
|
|
475
|
+
return proxies;
|
|
374
476
|
},
|
|
375
477
|
|
|
376
478
|
forgetAll(state, { type }) {
|
|
@@ -16,10 +16,8 @@ import { downloadFile, generateZip } from '@shell/utils/download';
|
|
|
16
16
|
import { clone, get } from '@shell/utils/object';
|
|
17
17
|
import { eachLimit } from '@shell/utils/promise';
|
|
18
18
|
import { sortableNumericSuffix } from '@shell/utils/sort';
|
|
19
|
-
import {
|
|
19
|
+
import { escapeHtml, ucFirst } from '@shell/utils/string';
|
|
20
20
|
import {
|
|
21
|
-
displayKeyFor,
|
|
22
|
-
validateBoolean,
|
|
23
21
|
validateChars,
|
|
24
22
|
validateDnsLikeTypes,
|
|
25
23
|
validateLength,
|
|
@@ -32,26 +30,12 @@ import forIn from 'lodash/forIn';
|
|
|
32
30
|
import isEmpty from 'lodash/isEmpty';
|
|
33
31
|
import isFunction from 'lodash/isFunction';
|
|
34
32
|
import isString from 'lodash/isString';
|
|
35
|
-
import uniq from 'lodash/uniq';
|
|
36
33
|
import Vue from 'vue';
|
|
37
34
|
|
|
38
|
-
import { normalizeType } from './normalize';
|
|
39
|
-
|
|
40
35
|
import { ExtensionPoint, ActionLocation } from '@shell/core/types';
|
|
41
36
|
import { getApplicableExtensionEnhancements } from '@shell/core/plugin-helpers';
|
|
42
37
|
|
|
43
|
-
const
|
|
44
|
-
'string',
|
|
45
|
-
'date',
|
|
46
|
-
'blob',
|
|
47
|
-
'enum',
|
|
48
|
-
'multiline',
|
|
49
|
-
'masked',
|
|
50
|
-
'password',
|
|
51
|
-
'dnsLabel',
|
|
52
|
-
'hostname',
|
|
53
|
-
];
|
|
54
|
-
const DNS_LIKE_TYPES = ['dnsLabel', 'dnsLabelRestricted', 'hostname'];
|
|
38
|
+
export const DNS_LIKE_TYPES = ['dnsLabel', 'dnsLabelRestricted', 'hostname'];
|
|
55
39
|
|
|
56
40
|
const REMAP_STATE = {
|
|
57
41
|
disabled: 'inactive',
|
|
@@ -1138,10 +1122,10 @@ export default class Resource {
|
|
|
1138
1122
|
*/
|
|
1139
1123
|
processSaveResponse(res) { }
|
|
1140
1124
|
|
|
1141
|
-
async _save(opt = {}) {
|
|
1125
|
+
async _save(opt = { }) {
|
|
1142
1126
|
const forNew = !this.id;
|
|
1143
1127
|
|
|
1144
|
-
const errors =
|
|
1128
|
+
const errors = this.validationErrors(this, opt);
|
|
1145
1129
|
|
|
1146
1130
|
if (!isEmpty(errors)) {
|
|
1147
1131
|
return Promise.reject(errors);
|
|
@@ -1260,11 +1244,11 @@ export default class Resource {
|
|
|
1260
1244
|
// ------------------------------------------------------------------
|
|
1261
1245
|
|
|
1262
1246
|
currentRoute() {
|
|
1263
|
-
return window.$
|
|
1247
|
+
return window.$globalApp.$route;
|
|
1264
1248
|
}
|
|
1265
1249
|
|
|
1266
1250
|
currentRouter() {
|
|
1267
|
-
return window.$
|
|
1251
|
+
return window.$globalApp.$router;
|
|
1268
1252
|
}
|
|
1269
1253
|
|
|
1270
1254
|
get listLocation() {
|
|
@@ -1674,93 +1658,14 @@ export default class Resource {
|
|
|
1674
1658
|
return errors;
|
|
1675
1659
|
}
|
|
1676
1660
|
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
if ( !originalType ) {
|
|
1686
|
-
// eslint-disable-next-line
|
|
1687
|
-
console.warn(this.t('validation.noType'), data);
|
|
1688
|
-
|
|
1689
|
-
return errors;
|
|
1690
|
-
}
|
|
1691
|
-
|
|
1692
|
-
if ( !schema ) {
|
|
1693
|
-
// eslint-disable-next-line
|
|
1694
|
-
// console.warn(this.t('validation.noSchema'), originalType, data);
|
|
1695
|
-
|
|
1696
|
-
return errors;
|
|
1697
|
-
}
|
|
1698
|
-
|
|
1699
|
-
const fields = schema.resourceFields || {};
|
|
1700
|
-
const keys = Object.keys(fields);
|
|
1701
|
-
let field, key, val, displayKey;
|
|
1702
|
-
|
|
1703
|
-
for ( let i = 0 ; i < keys.length ; i++ ) {
|
|
1704
|
-
const fieldErrors = [];
|
|
1705
|
-
|
|
1706
|
-
key = keys[i];
|
|
1707
|
-
field = fields[key];
|
|
1708
|
-
val = get(data, key);
|
|
1709
|
-
displayKey = displayKeyFor(type, key, this.$rootGetters);
|
|
1710
|
-
|
|
1711
|
-
const fieldType = field?.type ? normalizeType(field.type) : null;
|
|
1712
|
-
const valIsString = isString(val);
|
|
1713
|
-
|
|
1714
|
-
if ( ignoreFields && ignoreFields.includes(key) ) {
|
|
1715
|
-
continue;
|
|
1716
|
-
}
|
|
1717
|
-
|
|
1718
|
-
if ( val === undefined ) {
|
|
1719
|
-
val = null;
|
|
1720
|
-
}
|
|
1721
|
-
|
|
1722
|
-
if (valIsString) {
|
|
1723
|
-
if (fieldType) {
|
|
1724
|
-
Vue.set(data, key, coerceStringTypeToScalarType(val, fieldType));
|
|
1725
|
-
}
|
|
1726
|
-
|
|
1727
|
-
// Empty strings on nullable string fields -> null
|
|
1728
|
-
if ( field.nullable && val.length === 0 && STRING_LIKE_TYPES.includes(fieldType)) {
|
|
1729
|
-
val = null;
|
|
1730
|
-
|
|
1731
|
-
Vue.set(data, key, val);
|
|
1732
|
-
}
|
|
1733
|
-
}
|
|
1734
|
-
if (fieldType === 'boolean') {
|
|
1735
|
-
validateBoolean(val, field, displayKey, this.$rootGetters, fieldErrors);
|
|
1736
|
-
} else {
|
|
1737
|
-
validateLength(val, field, displayKey, this.$rootGetters, fieldErrors);
|
|
1738
|
-
validateChars(val, field, displayKey, this.$rootGetters, fieldErrors);
|
|
1739
|
-
}
|
|
1740
|
-
|
|
1741
|
-
if (fieldErrors.length > 0) {
|
|
1742
|
-
fieldErrors.push(this.t('validation.required', { key: displayKey }));
|
|
1743
|
-
errors.push(...fieldErrors);
|
|
1744
|
-
continue;
|
|
1745
|
-
}
|
|
1746
|
-
|
|
1747
|
-
// IDs claim to be these but are lies...
|
|
1748
|
-
if ( key !== 'id' && !isEmpty(val) && DNS_LIKE_TYPES.includes(fieldType) ) {
|
|
1749
|
-
// DNS types should be lowercase
|
|
1750
|
-
const tolower = (val || '').toLowerCase();
|
|
1751
|
-
|
|
1752
|
-
if ( tolower !== val ) {
|
|
1753
|
-
val = tolower;
|
|
1754
|
-
|
|
1755
|
-
Vue.set(data, key, val);
|
|
1756
|
-
}
|
|
1757
|
-
|
|
1758
|
-
fieldErrors.push(...validateDnsLikeTypes(val, fieldType, displayKey, this.$rootGetters, fieldErrors));
|
|
1759
|
-
}
|
|
1760
|
-
errors.push(...fieldErrors);
|
|
1761
|
-
}
|
|
1762
|
-
|
|
1763
|
-
return uniq([...errors, ...this.customValidationErrors(data)]);
|
|
1661
|
+
/**
|
|
1662
|
+
* Check this instance is valid against
|
|
1663
|
+
* - any custom dashboard validation
|
|
1664
|
+
*
|
|
1665
|
+
* Models can override this and call super.validationErrors
|
|
1666
|
+
*/
|
|
1667
|
+
validationErrors(data = this, opts = { }) {
|
|
1668
|
+
return this.customValidationErrors(data);
|
|
1764
1669
|
}
|
|
1765
1670
|
|
|
1766
1671
|
get ownersByType() {
|
package/plugins/directives.js
CHANGED
|
@@ -1,41 +1,8 @@
|
|
|
1
1
|
import Vue from 'vue';
|
|
2
|
+
import focusDirective from '@shell/plugins/directives.js';
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
element.focus();
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
const getElement = (vnode) => {
|
|
14
|
-
const { componentInstance, componentOptions: { tag } } = vnode;
|
|
15
|
-
|
|
16
|
-
if (tag === 'LabeledInput') {
|
|
17
|
-
return componentInstance.$refs.value;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
if (tag === 'LabeledSelect') {
|
|
21
|
-
componentInstance.shouldOpen = false;
|
|
22
|
-
|
|
23
|
-
return componentInstance.$refs['select-input'].$refs.search;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
if (tag === 'SelectPrincipal') {
|
|
27
|
-
const labeledSelect = componentInstance.$refs['labeled-select'];
|
|
28
|
-
|
|
29
|
-
labeledSelect.shouldOpen = false;
|
|
30
|
-
|
|
31
|
-
return labeledSelect.$refs['select-input'].$refs.search;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
if (tag === 'TextAreaAutoGrow') {
|
|
35
|
-
return componentInstance.$refs.ta;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (tag === 'Password') {
|
|
39
|
-
return componentInstance.$refs.input.$refs.value;
|
|
40
|
-
}
|
|
41
|
-
};
|
|
4
|
+
export default focusDirective;
|
|
5
|
+
/* eslint-disable-next-line no-console */
|
|
6
|
+
console.warn(`Importing focusDirective from plugins has been deprecated, use shell/directives/focus.js instead.
|
|
7
|
+
Make sure to invoke it using Vue.directive('focus', focusDirective ) to maintain compatibility.`);
|
|
8
|
+
Vue.directive('focus', focusDirective);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { REDIRECTED } from '@shell/config/cookies';
|
|
2
|
+
|
|
3
|
+
export default function({ $cookies }) {
|
|
4
|
+
// This tells Ember not to redirect back to us once you've already been to dashboard once.
|
|
5
|
+
// TODO: Remove this once the ember portion of the app is no longer needed
|
|
6
|
+
if ( !$cookies.get(REDIRECTED) ) {
|
|
7
|
+
$cookies.set(REDIRECTED, 'true', {
|
|
8
|
+
path: '/',
|
|
9
|
+
sameSite: true,
|
|
10
|
+
secure: true,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -1,10 +1,31 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
1
2
|
import Vue from 'vue';
|
|
2
3
|
|
|
3
4
|
const components = require.context('@shell/components/formatter', false, /[A-Z]\w+\.(vue)$/);
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
const globalFormatters = {
|
|
7
|
+
install: (Vue) => {
|
|
8
|
+
components.keys().forEach((fileName) => {
|
|
9
|
+
const componentConfig = components(fileName);
|
|
10
|
+
const componentName = fileName.split('/').pop().split('.')[0];
|
|
8
11
|
|
|
9
|
-
|
|
10
|
-
|
|
12
|
+
if (Vue.component(componentName)) {
|
|
13
|
+
// eslint-disable-next-line no-console
|
|
14
|
+
console.debug(`Skipping ${ componentName } install. Component already exists.`);
|
|
15
|
+
} else {
|
|
16
|
+
Vue.component(componentName, componentConfig.default || componentConfig);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export default globalFormatters;
|
|
23
|
+
|
|
24
|
+
// This is being done for backwards compatibility with our extensions that have written tests and didn't properly make use of Vue.use() when importing and mocking vue plugins
|
|
25
|
+
const isThisFileBeingExecutedInATest = process.env.NODE_ENV === 'test';
|
|
26
|
+
|
|
27
|
+
if (isThisFileBeingExecutedInATest) {
|
|
28
|
+
console.warn('The implicit addition of global formatters has been deprecated in Rancher Shell and will be removed in a future version. Make sure to invoke `Vue.use(globalFormatters)` to maintain compatibility.');
|
|
29
|
+
|
|
30
|
+
Vue.use(globalFormatters);
|
|
31
|
+
}
|