@rancher/shell 1.2.3 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +1 -0
- package/assets/styles/global/_layout.scss +99 -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 +315 -64
- package/assets/translations/zh-hans.yaml +7 -31
- package/babel.config.js +8 -2
- package/chart/__tests__/S3.test.ts +9 -2
- package/chart/gatekeeper.vue +2 -11
- package/chart/istio.vue +1 -10
- package/chart/logging/index.vue +2 -11
- package/chart/monitoring/alerting/index.vue +7 -21
- package/chart/monitoring/grafana/index.vue +61 -2
- package/chart/monitoring/index.vue +52 -26
- package/chart/monitoring/prometheus/index.vue +39 -45
- package/chart/rancher-backup/S3.vue +11 -9
- package/chart/rancher-backup/index.vue +18 -15
- package/cloud-credential/__tests__/harvester.test.ts +18 -0
- package/cloud-credential/azure.vue +4 -17
- package/cloud-credential/generic.vue +18 -9
- package/cloud-credential/harvester.vue +11 -3
- package/components/AlertTable.vue +17 -7
- package/components/AppModal.vue +167 -0
- package/components/AssignTo.vue +7 -4
- package/components/AsyncButton.vue +27 -5
- package/components/BackLink.vue +4 -4
- package/components/BannerGraphic.vue +1 -0
- package/components/BrandImage.vue +47 -1
- package/components/Carousel.vue +15 -8
- package/components/Certificates.vue +161 -0
- package/components/ClusterBadge.vue +12 -3
- package/components/ClusterIconMenu.vue +55 -12
- package/components/ClusterProviderIcon.vue +14 -3
- package/components/CodeMirror.vue +111 -17
- package/components/CommunityLinks.vue +12 -8
- package/components/CopyCode.vue +6 -2
- package/components/CopyToClipboard.vue +2 -1
- package/components/CopyToClipboardText.vue +14 -9
- package/components/CreateDriver.vue +81 -0
- package/components/CruResource.vue +52 -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/EtcdInfoBanner.vue +5 -5
- package/components/ExplorerMembers.vue +3 -3
- package/components/ExplorerProjectsNamespaces.vue +31 -7
- package/components/FixedBanner.vue +48 -36
- package/components/GlobalRoleBindings.vue +26 -0
- package/components/GrafanaDashboard.vue +6 -4
- package/components/IconOrSvg.vue +1 -1
- package/components/Import.vue +10 -6
- package/components/Inactivity.vue +1 -5
- package/components/KeyValueView.vue +14 -10
- package/components/Markdown.vue +16 -12
- 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 +12 -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 +19 -3
- package/components/ResourceCancelModal.vue +34 -29
- package/components/ResourceDetail/Masthead.vue +48 -16
- package/components/ResourceDetail/index.vue +6 -4
- package/components/ResourceList/Masthead.vue +10 -9
- package/components/ResourceList/index.vue +65 -14
- package/components/ResourceTable.vue +87 -21
- package/components/ResourceYaml.vue +35 -5
- package/components/SelectIconGrid.vue +3 -3
- package/components/SideNav.vue +50 -94
- package/components/SingleClusterInfo.vue +4 -4
- package/components/SortableTable/THead.vue +33 -21
- package/components/SortableTable/filtering.js +9 -1
- package/components/SortableTable/grouping.js +8 -1
- package/components/SortableTable/index.vue +143 -44
- package/components/SortableTable/paging.js +36 -7
- package/components/SortableTable/selection.js +2 -1
- package/components/SortableTable/sorting.js +24 -7
- package/components/StatusTable.vue +5 -1
- package/components/Tabbed/index.vue +18 -1
- package/components/TableDataUserIcon.vue +47 -0
- package/components/TypeDescription.vue +1 -0
- package/components/Wizard.vue +1 -0
- package/components/YamlEditor.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.test.ts +87 -0
- package/components/__tests__/CopyCode.test.ts +5 -4
- 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/FleetBundles.vue +5 -11
- 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 +63 -27
- package/components/fleet/FleetResources.vue +6 -1
- package/components/fleet/FleetStatus.vue +3 -3
- package/components/fleet/FleetSummary.vue +35 -30
- package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
- package/components/fleet/__tests__/FleetSummary.test.ts +316 -0
- package/components/form/ArrayList.vue +22 -18
- package/components/form/ArrayListSelect.vue +5 -0
- package/components/form/BannerSettings.vue +3 -0
- package/components/form/ClusterAppearance.vue +132 -0
- package/components/form/ColorInput.vue +1 -0
- package/components/form/Error.vue +3 -3
- package/components/form/FileSelector.vue +1 -0
- package/components/form/Footer.vue +2 -2
- package/components/form/GitPicker.vue +83 -38
- package/components/form/KeyValue.vue +70 -48
- package/components/form/LabeledSelect.vue +145 -41
- package/components/form/Labels.vue +3 -1
- package/components/form/NameNsDescription.vue +26 -9
- package/components/form/Password.vue +3 -1
- 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/SelectOrCreateAuthSecret.vue +132 -59
- package/components/form/SimpleSecretSelector.vue +88 -28
- package/components/form/Taints.vue +13 -7
- package/components/form/__tests__/BannerSettings.test.ts +53 -0
- package/components/form/__tests__/KeyValue.test.ts +120 -11
- package/components/form/__tests__/LabeledSelect.test.ts +0 -18
- package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +25 -15
- package/components/form/__tests__/Taints.test.ts +70 -0
- 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/Checked.vue +11 -3
- package/components/formatter/CloudCredPublicData.vue +30 -0
- package/components/formatter/ClusterLink.vue +2 -2
- package/components/formatter/ClusterProvider.vue +1 -18
- package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
- package/components/formatter/FleetSummaryGraph.vue +25 -12
- 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/LiveDuration.vue +1 -1
- package/components/formatter/PercentageBar.vue +1 -1
- package/components/formatter/PrincipalGroupBindings.vue +2 -2
- package/components/formatter/SecretType.vue +2 -2
- package/components/formatter/VirtualServiceGateways.vue +2 -2
- package/components/formatter/WorkloadDetailEndpoints.vue +12 -22
- package/components/formatter/__tests__/Checked.test.ts +19 -0
- package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
- package/components/formatter/__tests__/WorkloadDetailEndpoints.test.ts +81 -0
- package/components/nav/Group.vue +9 -7
- package/components/nav/Header.vue +85 -46
- package/components/nav/Jump.vue +19 -9
- package/components/nav/NamespaceFilter.vue +8 -1
- package/components/nav/TopLevelMenu.vue +392 -136
- package/components/nav/Type.vue +71 -106
- package/components/nav/WindowManager/ContainerLogs.vue +120 -19
- package/components/nav/WindowManager/ContainerShell.vue +6 -1
- package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
- package/components/nav/WindowManager/index.vue +11 -10
- package/components/nav/__tests__/TopLevelMenu.test.ts +400 -6
- package/components/nav/__tests__/Type.test.ts +322 -97
- package/components/nuxt/nuxt-child.js +9 -78
- package/components/nuxt/nuxt-error.vue +1 -1
- package/components/nuxt/nuxt-link.client.js +13 -95
- package/{layouts → components/templates}/blank.vue +1 -1
- package/{layouts → components/templates}/default.vue +11 -101
- package/{layouts → components/templates}/error.vue +13 -26
- package/{layouts → components/templates}/home.vue +4 -1
- package/{layouts → components/templates}/plain.vue +4 -1
- package/{layouts → components/templates}/standalone.vue +1 -5
- package/{layouts → components/templates}/unauthenticated.vue +2 -3
- package/composables/useCompactInput.test.ts +36 -0
- package/composables/useCompactInput.ts +20 -0
- package/composables/useLabeledFormElement.test.ts +135 -0
- package/composables/useLabeledFormElement.ts +138 -0
- package/config/harvester-manager-types.js +2 -0
- package/config/home-links.js +2 -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 +21 -1
- package/config/product/auth.js +1 -0
- package/config/product/explorer.js +166 -45
- package/config/product/fleet.js +6 -1
- package/config/product/legacy.js +2 -11
- package/config/product/manager.js +51 -25
- package/config/query-params.js +2 -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/i18n.js +13 -0
- package/config/router/navigation-guards/index.js +16 -0
- package/config/router/navigation-guards/load-initial-settings.js +15 -0
- package/config/router/routes.js +487 -0
- package/config/settings.ts +31 -2
- package/config/store.js +8 -4
- package/config/system-namespaces.js +3 -0
- package/config/table-headers.js +66 -1
- package/config/types.js +35 -20
- package/config/uiplugins.js +10 -5
- package/core/plugin-helpers.js +4 -6
- package/core/plugin-routes.ts +56 -114
- package/core/plugin.ts +18 -11
- package/core/plugins-loader.js +7 -9
- package/core/plugins.js +289 -285
- package/core/types-provisioning.ts +7 -0
- package/creators/app/app.package.json +2 -1
- package/creators/app/files/.eslintignore +0 -2
- package/creators/app/files/.gitlab-ci.yml +14 -0
- package/creators/app/files/.vscode/settings.json +0 -1
- package/creators/app/init +19 -0
- 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__/provisioning.cattle.io.cluster.test.ts +119 -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.bundle.vue +1 -1
- package/detail/fleet.cattle.io.cluster.vue +11 -1
- 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 +22 -3
- package/detail/provisioning.cattle.io.cluster.vue +31 -13
- package/detail/service.vue +1 -1
- package/detail/workload/index.vue +1 -0
- package/dialog/AddCustomBadgeDialog.vue +318 -161
- package/dialog/DeactivateDriverDialog.vue +137 -0
- package/dialog/RollbackWorkloadDialog.vue +2 -2
- package/dialog/RotateCertificatesDialog.vue +0 -21
- package/dialog/ScaleMachineDownDialog.vue +34 -17
- 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 +85 -0
- 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 +6 -23
- 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 +177 -9
- package/edit/cis.cattle.io.clusterscan.vue +5 -2
- package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
- package/edit/cloudcredential.vue +28 -4
- package/edit/configmap.vue +10 -4
- package/edit/fleet.cattle.io.gitrepo.vue +3 -1
- 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 +3 -53
- package/edit/management.cattle.io.setting.vue +52 -2
- 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/opsgenie.vue +1 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +2 -2
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +1 -1
- package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +15 -3
- package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +4 -1
- 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} +46 -7
- package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → 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 +33 -16
- package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +276 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +3 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
- package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +77 -13
- package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +391 -0
- package/edit/provisioning.cattle.io.cluster/import.vue +4 -4
- package/edit/provisioning.cattle.io.cluster/index.vue +126 -51
- package/edit/provisioning.cattle.io.cluster/rke2.vue +325 -791
- package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
- package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +217 -0
- package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +123 -129
- package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
- package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
- package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +1 -0
- package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
- package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +190 -0
- package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +3 -0
- package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +148 -0
- package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
- package/edit/resources.cattle.io.backup.vue +139 -124
- package/edit/resources.cattle.io.restore.vue +146 -126
- package/edit/service.vue +13 -0
- package/edit/serviceaccount.vue +46 -4
- package/edit/token.vue +3 -1
- package/edit/workload/Upgrading.vue +3 -2
- package/edit/workload/__tests__/Job.test.ts +1 -3
- package/edit/workload/__tests__/Upgrading.test.ts +2 -2
- package/edit/workload/index.vue +2 -1
- package/edit/workload/mixins/workload.js +35 -2
- 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 +546 -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/catalog.cattle.io.app.vue +1 -0
- package/list/cis.cattle.io.clusterscan.vue +16 -10
- package/list/group.principal.vue +2 -2
- package/list/management.cattle.io.feature.vue +16 -16
- package/list/management.cattle.io.setting.vue +1 -0
- package/list/management.cattle.io.user.vue +13 -4
- package/list/networking.k8s.io.ingress.vue +36 -0
- package/list/node.vue +212 -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 +1 -3
- package/machine-config/amazonec2.vue +1 -1
- package/machine-config/azure.vue +2 -1
- package/machine-config/generic.vue +11 -15
- package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
- package/machine-config/vmwarevsphere.vue +31 -27
- package/middleware/authenticated.js +23 -399
- package/mixins/__tests__/chart.test.ts +48 -6
- package/mixins/__tests__/create-edit-view.test.ts +2 -3
- package/mixins/auth-config.js +5 -9
- package/mixins/brand.js +102 -96
- 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 +27 -2
- 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__/management.cattle.io.cluster.test.ts +23 -0
- package/models/__tests__/management.cattle.io.node.ts +85 -0
- package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
- package/models/__tests__/namespace.test.ts +49 -9
- package/models/__tests__/provisioning.cattle.io.cluster.test.ts +241 -0
- package/models/__tests__/schema.tests.ts +24 -0
- package/models/__tests__/secret.test.ts +37 -0
- package/models/__tests__/steve-schema.test.ts +73 -0
- package/models/__tests__/storage.k8s.io.storageclass.test.ts +22 -0
- package/models/__tests__/workload.test.ts +91 -0
- 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 +8 -4
- package/models/cluster/schema.js +6 -0
- package/models/cluster.js +33 -0
- package/models/cluster.x-k8s.io.machine.js +1 -1
- package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
- package/models/driver.js +63 -0
- package/models/fleet.cattle.io.cluster.js +27 -11
- package/models/fleet.cattle.io.gitrepo.js +66 -13
- package/models/helm.cattle.io.projecthelmchart.js +1 -1
- package/models/kontainerdriver.js +85 -0
- package/models/management/schema.js +6 -0
- package/models/management.cattle.io.authconfig.js +3 -2
- package/models/management.cattle.io.cluster.js +16 -7
- package/models/management.cattle.io.globalrole.js +2 -0
- package/models/management.cattle.io.kontainerdriver.js +1 -0
- package/models/management.cattle.io.node.js +18 -14
- package/models/management.cattle.io.nodepool.js +17 -0
- package/models/management.cattle.io.project.js +0 -36
- package/models/management.cattle.io.setting.js +11 -7
- package/models/management.cattle.io.user.js +2 -2
- package/models/monitoring.coreos.com.receiver.js +3 -1
- package/models/monitoring.coreos.com.route.js +1 -1
- package/models/namespace.js +1 -1
- package/models/networking.k8s.io.ingress.js +2 -1
- package/models/nodedriver.js +85 -0
- package/models/pod.js +20 -0
- package/models/provisioning.cattle.io.cluster.js +125 -10
- package/models/schema.js +28 -7
- package/models/secret.js +126 -18
- package/models/service.js +2 -0
- package/models/steve-schema.ts +254 -0
- package/models/storage.k8s.io.storageclass.js +1 -1
- package/models/workload.js +17 -0
- package/models/workload.service.js +18 -0
- package/package.json +18 -14
- package/pages/about.vue +12 -6
- package/pages/account/create-key.vue +0 -1
- package/pages/account/index.vue +7 -3
- package/pages/auth/login.vue +106 -103
- package/pages/auth/logout.vue +2 -4
- package/pages/auth/setup.vue +92 -66
- package/pages/auth/verify.vue +30 -24
- package/pages/c/_cluster/apps/charts/__tests__/install.helper.test.ts +2 -17
- package/pages/c/_cluster/apps/charts/chart.vue +54 -9
- package/pages/c/_cluster/apps/charts/index.vue +99 -69
- package/pages/c/_cluster/apps/charts/install.helpers.js +2 -13
- package/pages/c/_cluster/apps/charts/install.vue +12 -11
- 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/ecm/index.vue +0 -2
- 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 +253 -91
- package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
- package/pages/c/_cluster/explorer/tools/index.vue +10 -6
- package/pages/c/_cluster/fleet/index.vue +89 -94
- 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 +91 -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 +60 -0
- package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
- package/pages/c/_cluster/manager/pages/_page.vue +4 -5
- package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
- 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 -10
- package/pages/c/_cluster/settings/brand.vue +261 -38
- package/pages/c/_cluster/settings/index.vue +4 -6
- package/pages/c/_cluster/settings/links.vue +3 -2
- package/pages/c/_cluster/settings/performance.vue +71 -3
- package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
- package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +12 -8
- package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
- package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
- package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
- package/pages/c/_cluster/uiplugins/InstallDialog.vue +55 -19
- 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 -54
- package/pages/diagnostic.vue +2 -2
- package/pages/fail-whale.vue +103 -42
- package/pages/home.vue +81 -24
- package/pages/prefs.vue +8 -4
- package/pages/support/index.vue +14 -10
- package/pkg/auto-import.js +1 -1
- package/plugins/axios.js +0 -36
- package/plugins/back-button.js +3 -5
- package/plugins/clean-html-directive.js +5 -30
- package/plugins/clean-html.js +53 -0
- package/plugins/clean-tooltip-directive.js +6 -31
- package/plugins/codemirror-loader.js +1 -1
- package/plugins/codemirror.js +41 -9
- package/plugins/dashboard-store/__tests__/mutations.test.ts +389 -0
- package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
- package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
- package/plugins/dashboard-store/actions.js +132 -25
- package/plugins/dashboard-store/classify.js +1 -18
- package/plugins/dashboard-store/getters.js +154 -44
- package/plugins/dashboard-store/index.js +0 -111
- package/plugins/dashboard-store/mutations.js +150 -52
- package/plugins/dashboard-store/resource-class.js +77 -127
- package/plugins/directives.js +6 -39
- package/plugins/ember-cookie.js +13 -0
- package/plugins/global-formatters.js +26 -5
- package/plugins/i18n.js +89 -55
- 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} +81 -10
- package/plugins/steve/__tests__/mutations.test.ts +49 -0
- package/plugins/steve/__tests__/resource-utils.test.ts +159 -0
- package/plugins/steve/__tests__/steve-class.test.ts +59 -0
- package/plugins/steve/__tests__/subscribe.spec.ts +4 -1
- package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
- package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
- package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
- package/plugins/steve/actions.js +3 -38
- package/plugins/steve/getters.js +164 -61
- package/plugins/steve/hybrid-class.js +5 -1
- package/plugins/steve/mutations.js +24 -3
- package/plugins/steve/norman-class.js +142 -2
- package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
- package/plugins/steve/resource-utils.ts +38 -0
- package/plugins/steve/schema.d.ts +22 -0
- package/plugins/steve/steve-class.js +22 -0
- package/plugins/steve/steve-pagination-utils.ts +368 -0
- package/plugins/steve/subscribe.js +17 -76
- package/plugins/trim-whitespace.js +6 -34
- package/plugins/vue-js-modal.js +1 -1
- package/promptRemove/pod.vue +15 -7
- package/public/index.html +1 -0
- package/rancher-components/Accordion/Accordion.test.ts +45 -0
- package/rancher-components/Accordion/Accordion.vue +86 -0
- package/rancher-components/Accordion/index.ts +1 -0
- 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 +18 -1
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +57 -24
- 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 +6 -4
- package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
- package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
- package/rancher-components/StringList/StringList.test.ts +270 -0
- package/rancher-components/StringList/StringList.vue +65 -26
- package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +69 -0
- package/scripts/clean +1 -1
- package/scripts/extension/bundle +19 -7
- 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/package +11 -3
- package/scripts/extension/helm/scripts/patch +27 -0
- package/scripts/extension/parse-tag-name +4 -4
- package/scripts/extension/publish +25 -14
- package/scripts/publish-shell.sh +11 -1
- package/scripts/serve-pkgs +0 -2
- package/scripts/test-plugins-build.sh +87 -11
- package/scripts/vue-migrate.js +683 -0
- package/server/har-file.js +183 -0
- package/store/__tests__/catalog.test.ts +224 -0
- package/store/__tests__/type-map.test.ts +1122 -0
- package/store/auth.js +23 -4
- package/store/aws.js +53 -6
- package/store/catalog.js +22 -6
- package/store/cru-resource.ts +26 -0
- package/store/customisation.js +35 -0
- package/store/features.js +7 -4
- package/store/i18n.js +11 -0
- package/store/index.js +140 -49
- package/store/plugins.js +8 -4
- package/store/prefs.js +33 -38
- package/store/type-map.js +288 -213
- package/store/type-map.utils.ts +226 -0
- package/tsconfig.json +34 -9
- package/tsconfig.paths.json +21 -0
- 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 +1045 -770
- 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 +180 -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 -21
- package/utils/azure.js +24 -0
- package/utils/banners.js +103 -0
- package/utils/clipboard.js +5 -0
- package/utils/cluster.js +1 -1
- package/utils/config.js +4 -0
- package/utils/create-yaml.js +59 -28
- package/utils/custom-validators.js +0 -2
- package/utils/error.js +41 -1
- package/utils/formatter.js +5 -3
- package/utils/git.ts +1 -1
- package/utils/install-redirect.js +1 -1
- package/utils/kontainer.ts +190 -0
- package/utils/object.js +24 -0
- 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/time.js +2 -1
- package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
- package/utils/url.ts +1 -1
- package/utils/validators/formRules/__tests__/index.test.ts +70 -4
- package/utils/validators/formRules/index.ts +15 -9
- package/utils/validators/index.js +1 -0
- package/utils/validators/setting.js +6 -10
- package/utils/version.js +2 -1
- package/vue.config.js +377 -401
- package/.DS_Store +0 -0
- package/assets/images/providers/aks-black.svg +0 -28
- package/assets/images/providers/aks.svg +0 -31
- package/assets/styles/vendor/vue-js-modal.scss +0 -16
- package/components/ChartPsp.vue +0 -76
- package/components/EventsTable.vue +0 -67
- package/components/TabbedLinks/index.vue +0 -94
- package/components/__tests__/ChartPsp.test.ts +0 -75
- package/components/formatter/__tests__/ClusterProvider.test.ts +0 -28
- package/components/nuxt/nuxt-link.server.js +0 -16
- package/components/nuxt/nuxt.js +0 -101
- package/config/router.js +0 -408
- package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -237
- package/initialize/App.js +0 -198
- package/initialize/client.js +0 -875
- package/initialize/index.js +0 -364
- package/initialize/layouts.ts +0 -26
- package/middleware/i18n.js +0 -10
- package/middleware/unauthenticated.js +0 -22
- package/mixins/fetch.server.js +0 -73
- package/pages/c/_cluster/apps/index.vue +0 -17
- package/pages/c/_cluster/auth/index.vue +0 -19
- package/pages/c/_cluster/index.vue +0 -17
- 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/pages/c/index.vue +0 -9
- package/pages/rio/mesh.vue +0 -508
- package/plugins/dashboard-store/__tests__/mutations.spec.ts +0 -406
- package/plugins/dashboard-store/rehydrate-all.js +0 -44
- 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/transitions.js +0 -4
- package/plugins/v-select.js +0 -4
- package/plugins/vue-clipboard2.js +0 -4
- package/tsconfig.default.json +0 -46
- package/utils/group.js +0 -70
- package/utils/nuxt.js +0 -659
- package/utils/router.scrollBehavior.js +0 -80
- /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
- /package/models/__tests__/{node.ts → node.test.ts} +0 -0
- /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
- /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
- /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
- /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
- /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
|
@@ -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',
|
|
@@ -105,6 +89,7 @@ export const STATES_ENUM = {
|
|
|
105
89
|
ERRORING: 'erroring',
|
|
106
90
|
ERRORS: 'errors',
|
|
107
91
|
EXPIRED: 'expired',
|
|
92
|
+
EXPIRING: 'expiring',
|
|
108
93
|
FAIL: 'fail',
|
|
109
94
|
FAILED: 'failed',
|
|
110
95
|
HEALTHY: 'healthy',
|
|
@@ -167,6 +152,13 @@ export const STATES_ENUM = {
|
|
|
167
152
|
WARNING: 'warning',
|
|
168
153
|
};
|
|
169
154
|
|
|
155
|
+
export function mapStateToEnum(statusString) {
|
|
156
|
+
// e.g. in fleet Status is Capitalized. This function will map it to the enum
|
|
157
|
+
return Object.values(STATES_ENUM).find((val) => {
|
|
158
|
+
return val.toLowerCase() === statusString.toLocaleLowerCase();
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
|
|
170
162
|
export const STATES = {
|
|
171
163
|
[STATES_ENUM.IN_USE]: {
|
|
172
164
|
color: 'success', icon: 'dot-open', label: 'In Use', compoundIcon: 'checkmark'
|
|
@@ -253,7 +245,10 @@ export const STATES = {
|
|
|
253
245
|
color: 'error', icon: 'error', label: 'Errors', compoundIcon: 'error'
|
|
254
246
|
},
|
|
255
247
|
[STATES_ENUM.EXPIRED]: {
|
|
256
|
-
color: '
|
|
248
|
+
color: 'error', icon: 'error', label: 'Expired', compoundIcon: 'warning'
|
|
249
|
+
},
|
|
250
|
+
[STATES_ENUM.EXPIRING]: {
|
|
251
|
+
color: 'warning', icon: 'error', label: 'Expiring', compoundIcon: 'error'
|
|
257
252
|
},
|
|
258
253
|
[STATES_ENUM.FAIL]: {
|
|
259
254
|
color: 'error', icon: 'error', label: 'Fail', compoundIcon: 'error'
|
|
@@ -512,6 +507,28 @@ export function stateDisplay(state) {
|
|
|
512
507
|
return key.split(/-/).map(ucFirst).join('-');
|
|
513
508
|
}
|
|
514
509
|
|
|
510
|
+
export function primaryDisplayStatusFromCount(status) {
|
|
511
|
+
const statusOrder = [
|
|
512
|
+
STATES_ENUM.ERROR,
|
|
513
|
+
STATES_ENUM.FAILED,
|
|
514
|
+
STATES_ENUM.WARNING,
|
|
515
|
+
STATES_ENUM.MODIFIED,
|
|
516
|
+
STATES_ENUM.WAIT_APPLIED,
|
|
517
|
+
STATES_ENUM.ORPHANED,
|
|
518
|
+
STATES_ENUM.MISSING,
|
|
519
|
+
STATES_ENUM.UNKNOWN,
|
|
520
|
+
STATES_ENUM.NOT_READY,
|
|
521
|
+
STATES_ENUM.READY,
|
|
522
|
+
];
|
|
523
|
+
|
|
524
|
+
// sort status by order of statusOrder
|
|
525
|
+
const existingStatuses = Object.keys(status).filter((key) => {
|
|
526
|
+
return status[key] > 0 && statusOrder.includes(key.toLowerCase());
|
|
527
|
+
}).sort((a, b) => statusOrder.indexOf(a.toLowerCase()) - statusOrder.indexOf(b.toLowerCase()));
|
|
528
|
+
|
|
529
|
+
return existingStatuses[0] ? existingStatuses[0] : STATES_ENUM.UNKNOWN;
|
|
530
|
+
}
|
|
531
|
+
|
|
515
532
|
export function stateSort(color, display) {
|
|
516
533
|
color = color.replace(/^(text|bg)-/, '');
|
|
517
534
|
|
|
@@ -1089,19 +1106,26 @@ export default class Resource {
|
|
|
1089
1106
|
return this._save(...arguments);
|
|
1090
1107
|
}
|
|
1091
1108
|
|
|
1109
|
+
/**
|
|
1110
|
+
* Remove any unwanted properties from the object that will be saved
|
|
1111
|
+
*/
|
|
1112
|
+
cleanForSave(data, forNew) {
|
|
1113
|
+
delete data.__rehydrate;
|
|
1114
|
+
delete data.__clone;
|
|
1115
|
+
|
|
1116
|
+
return data;
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1092
1119
|
/**
|
|
1093
1120
|
* Allow to handle the response of the save request
|
|
1094
1121
|
* @param {*} res Full request response
|
|
1095
1122
|
*/
|
|
1096
1123
|
processSaveResponse(res) { }
|
|
1097
1124
|
|
|
1098
|
-
async _save(opt = {}) {
|
|
1099
|
-
delete this.__rehydrate;
|
|
1100
|
-
delete this.__clone;
|
|
1101
|
-
|
|
1125
|
+
async _save(opt = { }) {
|
|
1102
1126
|
const forNew = !this.id;
|
|
1103
1127
|
|
|
1104
|
-
const errors =
|
|
1128
|
+
const errors = this.validationErrors(this, opt);
|
|
1105
1129
|
|
|
1106
1130
|
if (!isEmpty(errors)) {
|
|
1107
1131
|
return Promise.reject(errors);
|
|
@@ -1145,22 +1169,24 @@ export default class Resource {
|
|
|
1145
1169
|
// @TODO remove this once the API maps steve _type <-> k8s type in both directions
|
|
1146
1170
|
opt.data = this.toSave() || { ...this };
|
|
1147
1171
|
|
|
1148
|
-
if (opt
|
|
1172
|
+
if (opt.data._type) {
|
|
1149
1173
|
opt.data.type = opt.data._type;
|
|
1150
1174
|
}
|
|
1151
1175
|
|
|
1152
|
-
if (opt
|
|
1176
|
+
if (opt.data._name) {
|
|
1153
1177
|
opt.data.name = opt.data._name;
|
|
1154
1178
|
}
|
|
1155
1179
|
|
|
1156
|
-
if (opt
|
|
1180
|
+
if (opt.data._labels) {
|
|
1157
1181
|
opt.data.labels = opt.data._labels;
|
|
1158
1182
|
}
|
|
1159
1183
|
|
|
1160
|
-
if (opt
|
|
1184
|
+
if (opt.data._annotations) {
|
|
1161
1185
|
opt.data.annotations = opt.data._annotations;
|
|
1162
1186
|
}
|
|
1163
1187
|
|
|
1188
|
+
opt.data = this.cleanForSave(opt.data, forNew);
|
|
1189
|
+
|
|
1164
1190
|
// handle "replace" opt as a query param _replace=true for norman PUT requests
|
|
1165
1191
|
if (opt?.replace && opt.method === 'put') {
|
|
1166
1192
|
const argParam = opt.url.includes('?') ? '&' : '?';
|
|
@@ -1218,19 +1244,11 @@ export default class Resource {
|
|
|
1218
1244
|
// ------------------------------------------------------------------
|
|
1219
1245
|
|
|
1220
1246
|
currentRoute() {
|
|
1221
|
-
|
|
1222
|
-
return this.$rootState.$route;
|
|
1223
|
-
} else {
|
|
1224
|
-
return window.$nuxt.$route;
|
|
1225
|
-
}
|
|
1247
|
+
return window.$globalApp.$route;
|
|
1226
1248
|
}
|
|
1227
1249
|
|
|
1228
1250
|
currentRouter() {
|
|
1229
|
-
|
|
1230
|
-
return this.$rootState.$router;
|
|
1231
|
-
} else {
|
|
1232
|
-
return window.$nuxt.$router;
|
|
1233
|
-
}
|
|
1251
|
+
return window.$globalApp.$router;
|
|
1234
1252
|
}
|
|
1235
1253
|
|
|
1236
1254
|
get listLocation() {
|
|
@@ -1347,7 +1365,7 @@ export default class Resource {
|
|
|
1347
1365
|
|
|
1348
1366
|
async download() {
|
|
1349
1367
|
const value = await this.followLink('view', { headers: { accept: 'application/yaml' } });
|
|
1350
|
-
const data = await this
|
|
1368
|
+
const data = await this.cleanForDownload(value.data);
|
|
1351
1369
|
|
|
1352
1370
|
downloadFile(`${ this.nameDisplay }.yaml`, data, 'application/yaml');
|
|
1353
1371
|
}
|
|
@@ -1370,7 +1388,7 @@ export default class Resource {
|
|
|
1370
1388
|
await eachLimit(items, 10, (item, idx) => {
|
|
1371
1389
|
return item.followLink('view', { headers: { accept: 'application/yaml' } } ).then(async(data) => {
|
|
1372
1390
|
const yaml = data.data || data;
|
|
1373
|
-
const cleanedYaml = await this
|
|
1391
|
+
const cleanedYaml = await this.cleanForDownload(yaml);
|
|
1374
1392
|
|
|
1375
1393
|
files[`resources/${ names[idx] }`] = cleanedYaml;
|
|
1376
1394
|
});
|
|
@@ -1447,6 +1465,10 @@ export default class Resource {
|
|
|
1447
1465
|
this.$dispatch(`cleanForDiff`, this.toJSON());
|
|
1448
1466
|
}
|
|
1449
1467
|
|
|
1468
|
+
async cleanForDownload(yaml) {
|
|
1469
|
+
return this.$dispatch(`cleanForDownload`, yaml);
|
|
1470
|
+
}
|
|
1471
|
+
|
|
1450
1472
|
yamlForSave(yaml) {
|
|
1451
1473
|
try {
|
|
1452
1474
|
const obj = jsyaml.load(yaml);
|
|
@@ -1636,93 +1658,14 @@ export default class Resource {
|
|
|
1636
1658
|
return errors;
|
|
1637
1659
|
}
|
|
1638
1660
|
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
if ( !originalType ) {
|
|
1648
|
-
// eslint-disable-next-line
|
|
1649
|
-
console.warn(this.t('validation.noType'), data);
|
|
1650
|
-
|
|
1651
|
-
return errors;
|
|
1652
|
-
}
|
|
1653
|
-
|
|
1654
|
-
if ( !schema ) {
|
|
1655
|
-
// eslint-disable-next-line
|
|
1656
|
-
// console.warn(this.t('validation.noSchema'), originalType, data);
|
|
1657
|
-
|
|
1658
|
-
return errors;
|
|
1659
|
-
}
|
|
1660
|
-
|
|
1661
|
-
const fields = schema.resourceFields || {};
|
|
1662
|
-
const keys = Object.keys(fields);
|
|
1663
|
-
let field, key, val, displayKey;
|
|
1664
|
-
|
|
1665
|
-
for ( let i = 0 ; i < keys.length ; i++ ) {
|
|
1666
|
-
const fieldErrors = [];
|
|
1667
|
-
|
|
1668
|
-
key = keys[i];
|
|
1669
|
-
field = fields[key];
|
|
1670
|
-
val = get(data, key);
|
|
1671
|
-
displayKey = displayKeyFor(type, key, this.$rootGetters);
|
|
1672
|
-
|
|
1673
|
-
const fieldType = field?.type ? normalizeType(field.type) : null;
|
|
1674
|
-
const valIsString = isString(val);
|
|
1675
|
-
|
|
1676
|
-
if ( ignoreFields && ignoreFields.includes(key) ) {
|
|
1677
|
-
continue;
|
|
1678
|
-
}
|
|
1679
|
-
|
|
1680
|
-
if ( val === undefined ) {
|
|
1681
|
-
val = null;
|
|
1682
|
-
}
|
|
1683
|
-
|
|
1684
|
-
if (valIsString) {
|
|
1685
|
-
if (fieldType) {
|
|
1686
|
-
Vue.set(data, key, coerceStringTypeToScalarType(val, fieldType));
|
|
1687
|
-
}
|
|
1688
|
-
|
|
1689
|
-
// Empty strings on nullable string fields -> null
|
|
1690
|
-
if ( field.nullable && val.length === 0 && STRING_LIKE_TYPES.includes(fieldType)) {
|
|
1691
|
-
val = null;
|
|
1692
|
-
|
|
1693
|
-
Vue.set(data, key, val);
|
|
1694
|
-
}
|
|
1695
|
-
}
|
|
1696
|
-
if (fieldType === 'boolean') {
|
|
1697
|
-
validateBoolean(val, field, displayKey, this.$rootGetters, fieldErrors);
|
|
1698
|
-
} else {
|
|
1699
|
-
validateLength(val, field, displayKey, this.$rootGetters, fieldErrors);
|
|
1700
|
-
validateChars(val, field, displayKey, this.$rootGetters, fieldErrors);
|
|
1701
|
-
}
|
|
1702
|
-
|
|
1703
|
-
if (fieldErrors.length > 0) {
|
|
1704
|
-
fieldErrors.push(this.t('validation.required', { key: displayKey }));
|
|
1705
|
-
errors.push(...fieldErrors);
|
|
1706
|
-
continue;
|
|
1707
|
-
}
|
|
1708
|
-
|
|
1709
|
-
// IDs claim to be these but are lies...
|
|
1710
|
-
if ( key !== 'id' && !isEmpty(val) && DNS_LIKE_TYPES.includes(fieldType) ) {
|
|
1711
|
-
// DNS types should be lowercase
|
|
1712
|
-
const tolower = (val || '').toLowerCase();
|
|
1713
|
-
|
|
1714
|
-
if ( tolower !== val ) {
|
|
1715
|
-
val = tolower;
|
|
1716
|
-
|
|
1717
|
-
Vue.set(data, key, val);
|
|
1718
|
-
}
|
|
1719
|
-
|
|
1720
|
-
fieldErrors.push(...validateDnsLikeTypes(val, fieldType, displayKey, this.$rootGetters, fieldErrors));
|
|
1721
|
-
}
|
|
1722
|
-
errors.push(...fieldErrors);
|
|
1723
|
-
}
|
|
1724
|
-
|
|
1725
|
-
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);
|
|
1726
1669
|
}
|
|
1727
1670
|
|
|
1728
1671
|
get ownersByType() {
|
|
@@ -1931,4 +1874,11 @@ export default class Resource {
|
|
|
1931
1874
|
get creationTimestamp() {
|
|
1932
1875
|
return this.metadata?.creationTimestamp;
|
|
1933
1876
|
}
|
|
1877
|
+
|
|
1878
|
+
/**
|
|
1879
|
+
* Allows model to specify JSON Paths that should be folded in the YAML editor by default
|
|
1880
|
+
*/
|
|
1881
|
+
get yamlFolding() {
|
|
1882
|
+
return [];
|
|
1883
|
+
}
|
|
1934
1884
|
}
|
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
|
+
}
|
package/plugins/i18n.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
2
|
import { escapeHtml } from '../utils/string';
|
|
3
|
+
import Vue, { watchEffect, ref, h } from 'vue';
|
|
4
|
+
import { useStore } from '../composables/useStore';
|
|
3
5
|
|
|
4
6
|
export function stringFor(store, key, args, raw = false, escapehtml = true) {
|
|
5
7
|
const translation = store.getters['i18n/t'](key, args);
|
|
@@ -26,10 +28,6 @@ export function stringFor(store, key, args, raw = false, escapehtml = true) {
|
|
|
26
28
|
}
|
|
27
29
|
}
|
|
28
30
|
|
|
29
|
-
Vue.prototype.t = function(key, args, raw) {
|
|
30
|
-
return stringFor(this.$store, key, args, raw);
|
|
31
|
-
};
|
|
32
|
-
|
|
33
31
|
function directive(el, binding, vnode /*, oldVnode */) {
|
|
34
32
|
const { context } = vnode;
|
|
35
33
|
const raw = binding.modifiers && binding.modifiers.raw === true;
|
|
@@ -43,6 +41,9 @@ function directive(el, binding, vnode /*, oldVnode */) {
|
|
|
43
41
|
}
|
|
44
42
|
|
|
45
43
|
export function directiveSsr(vnode, binding) {
|
|
44
|
+
// eslint-disable-next-line no-console
|
|
45
|
+
console.warn('Function `directiveSsr` is deprecated. Please install i18n as a vue plugin: `Vue.use(i18n)`');
|
|
46
|
+
|
|
46
47
|
const { context } = vnode;
|
|
47
48
|
const raw = binding.modifiers && binding.modifiers.raw === true;
|
|
48
49
|
const str = stringFor(context.$store, binding.value, {}, raw);
|
|
@@ -54,54 +55,87 @@ export function directiveSsr(vnode, binding) {
|
|
|
54
55
|
}
|
|
55
56
|
}
|
|
56
57
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
Vue
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
update() {
|
|
65
|
-
directive(...arguments);
|
|
66
|
-
},
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
// Basic (but you might want the directive above): <t k="some.key" />
|
|
70
|
-
// With interpolation: <t k="some.key" count="1" :foo="bar" />
|
|
71
|
-
Vue.component('t', {
|
|
72
|
-
inheritAttrs: false,
|
|
73
|
-
props: {
|
|
74
|
-
k: {
|
|
75
|
-
type: String,
|
|
76
|
-
required: true,
|
|
77
|
-
},
|
|
78
|
-
raw: {
|
|
79
|
-
type: Boolean,
|
|
80
|
-
default: false,
|
|
81
|
-
},
|
|
82
|
-
tag: {
|
|
83
|
-
type: [String, Object],
|
|
84
|
-
default: 'span'
|
|
85
|
-
},
|
|
86
|
-
escapehtml: {
|
|
87
|
-
type: Boolean,
|
|
88
|
-
default: true,
|
|
89
|
-
}
|
|
90
|
-
},
|
|
91
|
-
|
|
92
|
-
render(h) {
|
|
93
|
-
const msg = stringFor(this.$store, this.k, this.$attrs, this.raw, this.escapehtml);
|
|
94
|
-
|
|
95
|
-
if ( this.raw ) {
|
|
96
|
-
return h(
|
|
97
|
-
this.tag,
|
|
98
|
-
{ domProps: { innerHTML: msg } }
|
|
99
|
-
);
|
|
100
|
-
} else {
|
|
101
|
-
return h(
|
|
102
|
-
this.tag,
|
|
103
|
-
[msg]
|
|
104
|
-
);
|
|
58
|
+
const i18n = {
|
|
59
|
+
name: 'i18n',
|
|
60
|
+
install: (Vue, _options) => {
|
|
61
|
+
if (Vue.prototype.t && Vue.directive('t') && Vue.component('t')) {
|
|
62
|
+
// eslint-disable-next-line no-console
|
|
63
|
+
console.debug('Skipping i18n install. Directive, component, and option already exist.');
|
|
105
64
|
}
|
|
106
|
-
|
|
107
|
-
|
|
65
|
+
|
|
66
|
+
Vue.prototype.t = function(key, args, raw) {
|
|
67
|
+
return stringFor(this.$store, key, args, raw);
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
// InnerHTML: <some-tag v-t="'some.key'" />
|
|
71
|
+
// As an attribute: <some-tag v-t:title="'some.key'" />
|
|
72
|
+
Vue.directive('t', {
|
|
73
|
+
bind() {
|
|
74
|
+
directive(...arguments);
|
|
75
|
+
},
|
|
76
|
+
update() {
|
|
77
|
+
directive(...arguments);
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// Basic (but you might want the directive above): <t k="some.key" />
|
|
82
|
+
// With interpolation: <t k="some.key" count="1" :foo="bar" />
|
|
83
|
+
Vue.component('t', {
|
|
84
|
+
inheritAttrs: false,
|
|
85
|
+
props: {
|
|
86
|
+
k: {
|
|
87
|
+
type: String,
|
|
88
|
+
required: true,
|
|
89
|
+
},
|
|
90
|
+
raw: {
|
|
91
|
+
type: Boolean,
|
|
92
|
+
default: false,
|
|
93
|
+
},
|
|
94
|
+
tag: {
|
|
95
|
+
type: [String, Object],
|
|
96
|
+
default: 'span'
|
|
97
|
+
},
|
|
98
|
+
escapehtml: {
|
|
99
|
+
type: Boolean,
|
|
100
|
+
default: true,
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
setup(props, ctx) {
|
|
104
|
+
const msg = ref('');
|
|
105
|
+
const store = useStore();
|
|
106
|
+
|
|
107
|
+
// Update msg whenever k, $attrs, raw, or escapehtml changes
|
|
108
|
+
watchEffect(() => {
|
|
109
|
+
msg.value = stringFor(store, props.k, ctx.attrs, props.raw, props.escapehtml);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
return { msg };
|
|
113
|
+
},
|
|
114
|
+
render() {
|
|
115
|
+
if (this.raw) {
|
|
116
|
+
return h(
|
|
117
|
+
this.tag,
|
|
118
|
+
{ domProps: { innerHTML: this.msg } }
|
|
119
|
+
);
|
|
120
|
+
} else {
|
|
121
|
+
return h(
|
|
122
|
+
this.tag,
|
|
123
|
+
[this.msg]
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
export default i18n;
|
|
132
|
+
|
|
133
|
+
// 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 translations
|
|
134
|
+
// Example failing test https://github.com/rancher/dashboard/actions/runs/8927503474/job/24521022320?pr=10923
|
|
135
|
+
const isThisFileBeingExecutedInATest = process.env.NODE_ENV === 'test';
|
|
136
|
+
|
|
137
|
+
if (isThisFileBeingExecutedInATest) {
|
|
138
|
+
// Go take a look at our jest.setup.js to see how we make use of Vue.use(i18n, ...)
|
|
139
|
+
console.warn('The implicit addition of i18n options has been deprecated in Rancher Shell and will be removed in a future version. Make sure to invoke `Vue.use(i18n)` to maintain compatibility.');
|
|
140
|
+
Vue.use(i18n);
|
|
141
|
+
}
|
package/plugins/int-number.js
CHANGED
|
@@ -1,22 +1,8 @@
|
|
|
1
1
|
import Vue from 'vue';
|
|
2
|
+
import intNumberDirective from '@shell/directives/int-number';
|
|
2
3
|
|
|
3
|
-
export default
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const inputChar = String.fromCharCode(charcode);
|
|
9
|
-
|
|
10
|
-
// Allow digits, minus sign at the beginning, and Ctrl key combinations
|
|
11
|
-
const re = /^-?\d*$/;
|
|
12
|
-
|
|
13
|
-
if (!re.test(inputChar) && charcode > 9 && !e.ctrlKey) {
|
|
14
|
-
if (e.preventDefault) {
|
|
15
|
-
e.preventDefault();
|
|
16
|
-
} else {
|
|
17
|
-
e.returnValue = false;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
});
|
|
4
|
+
export default intNumberDirective;
|
|
5
|
+
/* eslint-disable-next-line no-console */
|
|
6
|
+
console.warn(`Importing intNumberDirective from plugins has been deprecated, use shell/directives/int-number.js instead.
|
|
7
|
+
Make sure to invoke it using Vue.directive('intNumber', intNumberDirective) to maintain compatibility.`);
|
|
8
|
+
Vue.directive('intNumber', intNumberDirective);
|
package/plugins/plugin.js
CHANGED
|
@@ -32,7 +32,7 @@ export default async function(context) {
|
|
|
32
32
|
// Fetch list of installed plugins from endpoint
|
|
33
33
|
try {
|
|
34
34
|
const res = await context.store.dispatch('management/request', {
|
|
35
|
-
url: `${ UI_PLUGIN_BASE_URL }
|
|
35
|
+
url: `${ UI_PLUGIN_BASE_URL }`,
|
|
36
36
|
method: 'GET',
|
|
37
37
|
headers: { accept: 'application/json' },
|
|
38
38
|
redirectUnauthorized: false,
|
|
@@ -68,10 +68,10 @@ export default async function(context) {
|
|
|
68
68
|
const res = pluginLoads[name];
|
|
69
69
|
|
|
70
70
|
if (res?.status === 'rejected') {
|
|
71
|
-
console.error(`Failed to load plugin: ${ name }
|
|
71
|
+
console.error(`Failed to load plugin: ${ name }. `, res.reason || 'Unknown reason'); // eslint-disable-line no-console
|
|
72
72
|
|
|
73
73
|
// Record error in the uiplugins store, so that we can show this to the user
|
|
74
|
-
context.store.dispatch('uiplugins/setError', { name, error: 'plugins.error.load' });
|
|
74
|
+
context.store.dispatch('uiplugins/setError', { name, error: 'plugins.error.load' }); // i18n-uses plugins.error.load
|
|
75
75
|
}
|
|
76
76
|
});
|
|
77
77
|
}
|
|
@@ -1,19 +1,8 @@
|
|
|
1
1
|
import Vue from 'vue';
|
|
2
|
+
import positiveIntNumberDirective from '@shell/directives/positive-int-number';
|
|
2
3
|
|
|
3
|
-
export default
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const re = /^\d+$/; // Use regex to match positive numbers
|
|
9
|
-
|
|
10
|
-
if (!re.test(String.fromCharCode(charcode)) && charcode > 9 && !e.ctrlKey) {
|
|
11
|
-
if (e.preventDefault) {
|
|
12
|
-
e.preventDefault();
|
|
13
|
-
} else {
|
|
14
|
-
e.returnValue = false;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
});
|
|
4
|
+
export default positiveIntNumberDirective;
|
|
5
|
+
/* eslint-disable-next-line no-console */
|
|
6
|
+
console.warn(`Importing positiveIntNumberDirective from plugins has been deprecated, use shell/directives/positive-int-number.js instead.
|
|
7
|
+
Make sure to invoke it using Vue.directive('positiveIntNumber', positiveIntNumberDirective) to maintain compatibility.`);
|
|
8
|
+
Vue.directive('positiveIntNumber', positiveIntNumberDirective);
|