@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
|
@@ -0,0 +1,549 @@
|
|
|
1
|
+
import Vue from 'vue';
|
|
2
|
+
import { updatePageTitle } from '@shell/utils/title';
|
|
3
|
+
import { getVendor } from '@shell/config/private-label';
|
|
4
|
+
import middleware from '@shell/config/middleware.js';
|
|
5
|
+
import { withQuery } from 'ufo';
|
|
6
|
+
|
|
7
|
+
// Global variable used on mount, updated on route change and used in the render function
|
|
8
|
+
let app;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Add error handler debugging capabilities
|
|
12
|
+
* @param {*} vueApp Vue instance
|
|
13
|
+
*/
|
|
14
|
+
export const loadDebugger = (vueApp) => {
|
|
15
|
+
const debug = process.env.dev;
|
|
16
|
+
|
|
17
|
+
if (debug) {
|
|
18
|
+
const defaultErrorHandler = vueApp.config.errorHandler;
|
|
19
|
+
|
|
20
|
+
vueApp.config.errorHandler = async(err, vm, info, ...rest) => {
|
|
21
|
+
// Call other handler if exist
|
|
22
|
+
let handled = null;
|
|
23
|
+
|
|
24
|
+
if (typeof defaultErrorHandler === 'function') {
|
|
25
|
+
handled = defaultErrorHandler(err, vm, info, ...rest);
|
|
26
|
+
}
|
|
27
|
+
if (handled === true) {
|
|
28
|
+
return handled;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (vm && vm.$root) {
|
|
32
|
+
const globalApp = Object.keys(window.$globalApp)
|
|
33
|
+
.find((instance) => vm.$root[instance]);
|
|
34
|
+
|
|
35
|
+
// Show Nuxt Error Page
|
|
36
|
+
if (globalApp && vm.$root[globalApp].error && info !== 'render function') {
|
|
37
|
+
const vueApp = vm.$root[globalApp];
|
|
38
|
+
|
|
39
|
+
vueApp.error(err);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (typeof defaultErrorHandler === 'function') {
|
|
44
|
+
return handled;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Log to console
|
|
48
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
49
|
+
console.error(err); // eslint-disable-line no-console
|
|
50
|
+
} else {
|
|
51
|
+
console.error(err.message || err); // eslint-disable-line no-console
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Handle errors with a redirect
|
|
59
|
+
* @param {*} context
|
|
60
|
+
* @param {*} message
|
|
61
|
+
*/
|
|
62
|
+
const errorRedirect = (context, message) => {
|
|
63
|
+
context.$store.commit('setError', { error: new Error(message) });
|
|
64
|
+
context.$router.replace('/fail-whale');
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* TODO: Define this logic use case
|
|
69
|
+
* @param {*} fn
|
|
70
|
+
* @param {*} context
|
|
71
|
+
* @returns
|
|
72
|
+
*/
|
|
73
|
+
export const promisify = (fn, context) => {
|
|
74
|
+
let promise;
|
|
75
|
+
|
|
76
|
+
if (fn.length === 2) {
|
|
77
|
+
console.warn('Callback-based fetch or middleware calls are deprecated. Please switch to promises or async/await syntax'); // eslint-disable-line no-console
|
|
78
|
+
|
|
79
|
+
// fn(context, callback)
|
|
80
|
+
promise = new Promise((resolve) => {
|
|
81
|
+
fn(context, (err, data) => {
|
|
82
|
+
if (err) {
|
|
83
|
+
context.error(err);
|
|
84
|
+
}
|
|
85
|
+
data = data || {};
|
|
86
|
+
resolve(data);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
} else {
|
|
90
|
+
promise = fn(context);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (promise && promise instanceof Promise && typeof promise.then === 'function') {
|
|
94
|
+
return promise;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return Promise.resolve(promise);
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* TODO: Define this logic use case
|
|
102
|
+
* @param {*} promises
|
|
103
|
+
* @param {*} appContext
|
|
104
|
+
* @returns
|
|
105
|
+
*/
|
|
106
|
+
export const middlewareSeries = (promises, appContext) => {
|
|
107
|
+
if (!promises.length || appContext._redirected || appContext._errored) {
|
|
108
|
+
return Promise.resolve();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return promisify(promises[0], appContext)
|
|
112
|
+
.then(() => {
|
|
113
|
+
return middlewareSeries(promises.slice(1), appContext);
|
|
114
|
+
});
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Add middleware to the Vue instance
|
|
119
|
+
* @param {*} Components List of Vue components
|
|
120
|
+
* @param {*} context App context
|
|
121
|
+
* @returns
|
|
122
|
+
*/
|
|
123
|
+
function callMiddleware(Components, context) {
|
|
124
|
+
let midd = [];
|
|
125
|
+
let unknownMiddleware = false;
|
|
126
|
+
|
|
127
|
+
Components.forEach((Component) => {
|
|
128
|
+
if (Component.options.middleware) {
|
|
129
|
+
midd = midd.concat(Component.options.middleware);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
midd = midd.map((name) => {
|
|
134
|
+
if (typeof name === 'function') {
|
|
135
|
+
return name;
|
|
136
|
+
}
|
|
137
|
+
if (typeof middleware[name] !== 'function') {
|
|
138
|
+
unknownMiddleware = true;
|
|
139
|
+
errorRedirect(this, new Error(`500: Unknown middleware ${ name }`));
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return middleware[name];
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
if (unknownMiddleware) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return middlewareSeries(midd, context);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export const globalHandleError = (error) => Vue.config.errorHandler && Vue.config.errorHandler(error);
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Render function used by the router guards
|
|
156
|
+
* @param {*} to Route
|
|
157
|
+
* @param {*} from Route
|
|
158
|
+
* @param {*} next callback
|
|
159
|
+
* @param {*} app
|
|
160
|
+
* @returns
|
|
161
|
+
*/
|
|
162
|
+
async function render(to, from, next) {
|
|
163
|
+
if (this._routeChanged === false && this._paramChanged === false && this._queryChanged === false) {
|
|
164
|
+
return next();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// nextCalled is true when redirected
|
|
168
|
+
let nextCalled = false;
|
|
169
|
+
const _next = (path) => {
|
|
170
|
+
if (from.path === path.path && this.$loading.finish) {
|
|
171
|
+
this.$loading.finish();
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if (from.path !== path.path && this.$loading.pause) {
|
|
175
|
+
this.$loading.pause();
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (nextCalled) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
nextCalled = true;
|
|
183
|
+
next(path);
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
// Update context
|
|
187
|
+
await setContext(app, {
|
|
188
|
+
route: to,
|
|
189
|
+
from,
|
|
190
|
+
next: _next.bind(this)
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
// Get route's matched components
|
|
194
|
+
const matches = [];
|
|
195
|
+
const Components = getMatchedComponents(to, matches);
|
|
196
|
+
|
|
197
|
+
// If no Components matched, generate 404
|
|
198
|
+
if (!Components.length) {
|
|
199
|
+
// Call the authenticated middleware. This used to attempt to load the error layout but because it was missing it would:
|
|
200
|
+
// 1. load the default layout instead
|
|
201
|
+
// 2. then call the authenticated middleware
|
|
202
|
+
// 3. Authenticated middleware would then load plugins and check to see if there was a valid route and navigate to that if it existed
|
|
203
|
+
// 4. This would allow harvester cluster pages to load on page reload
|
|
204
|
+
// We should really make authenticated middleware do less...
|
|
205
|
+
await callMiddleware.call(this, [{ options: { middleware: ['authenticated'] } }], app.context);
|
|
206
|
+
|
|
207
|
+
// We used to have i18n middleware which was called each time we called middleware. This is also needed to support harvester because of the way harvester loads as outlined in the comment above
|
|
208
|
+
await this.$store.dispatch('i18n/init');
|
|
209
|
+
|
|
210
|
+
if (nextCalled) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Show error page
|
|
215
|
+
// this.error({ statusCode: 404, message: 'This page could not be found' });
|
|
216
|
+
errorRedirect(this, new Error('404: This page could not be found'));
|
|
217
|
+
|
|
218
|
+
return next();
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
try {
|
|
222
|
+
// Call middleware
|
|
223
|
+
await callMiddleware.call(this, Components, app.context);
|
|
224
|
+
if (nextCalled) {
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
if (app.context._errored) {
|
|
228
|
+
return next();
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Call middleware for layout
|
|
232
|
+
await callMiddleware.call(this, Components, app.context);
|
|
233
|
+
if (nextCalled) {
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
if (app.context._errored) {
|
|
237
|
+
return next();
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Call .validate()
|
|
241
|
+
let isValid = true;
|
|
242
|
+
|
|
243
|
+
try {
|
|
244
|
+
for (const Component of Components) {
|
|
245
|
+
if (typeof Component.options.validate !== 'function') {
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
isValid = await Component.options.validate(app.context);
|
|
250
|
+
|
|
251
|
+
if (!isValid) {
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
} catch (validationError) {
|
|
256
|
+
// ...If .validate() threw an error
|
|
257
|
+
errorRedirect(this, new Error(`${ validationError.statusCode || '500' }: ${ validationError.message }`));
|
|
258
|
+
|
|
259
|
+
return next();
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// ...If .validate() returned false
|
|
263
|
+
if (!isValid) {
|
|
264
|
+
errorRedirect(this, new Error('404: This page could not be found'));
|
|
265
|
+
|
|
266
|
+
return next();
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// If not redirected
|
|
270
|
+
if (!nextCalled) {
|
|
271
|
+
if (this.$loading.finish && !this.$loading.manual) {
|
|
272
|
+
this.$loading.finish();
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
next();
|
|
276
|
+
}
|
|
277
|
+
} catch (err) {
|
|
278
|
+
const error = err || {};
|
|
279
|
+
|
|
280
|
+
globalHandleError(error);
|
|
281
|
+
|
|
282
|
+
next();
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Mounts the Vue app to the DOM element
|
|
288
|
+
* @param {Object} appPartials - App view partials
|
|
289
|
+
* @param {Object} VueClass - Vue instance
|
|
290
|
+
*/
|
|
291
|
+
export async function mountApp(appPartials, VueClass) {
|
|
292
|
+
// Set global variables
|
|
293
|
+
app = appPartials.app;
|
|
294
|
+
const router = appPartials.router;
|
|
295
|
+
|
|
296
|
+
// Create Vue instance
|
|
297
|
+
const vueApp = new VueClass(app);
|
|
298
|
+
|
|
299
|
+
// Mounts Vue app to DOM element
|
|
300
|
+
const mount = () => {
|
|
301
|
+
vueApp.$mount('#app');
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
// Initialize error handler
|
|
305
|
+
vueApp.$loading = {}; // To avoid error while vueApp.$nuxt does not exist
|
|
306
|
+
|
|
307
|
+
// Add beforeEach router hooks
|
|
308
|
+
router.beforeEach(render.bind(vueApp));
|
|
309
|
+
router.afterEach((from, to) => {
|
|
310
|
+
if (from?.name !== to?.name) {
|
|
311
|
+
updatePageTitle(getVendor());
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
// First render on client-side
|
|
316
|
+
const clientFirstMount = () => {
|
|
317
|
+
mount();
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
// fix: force next tick to avoid having same timestamp when an error happen on spa fallback
|
|
321
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
322
|
+
render.call(vueApp, router.currentRoute, router.currentRoute, (path) => {
|
|
323
|
+
// If not redirected
|
|
324
|
+
if (!path) {
|
|
325
|
+
clientFirstMount();
|
|
326
|
+
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// Add a one-time afterEach hook to
|
|
331
|
+
// mount the app wait for redirect and route gets resolved
|
|
332
|
+
const unregisterHook = router.afterEach((to, from) => {
|
|
333
|
+
unregisterHook();
|
|
334
|
+
clientFirstMount();
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
// Push the path and let route to be resolved
|
|
338
|
+
router.push(path, undefined, (err) => {
|
|
339
|
+
if (err) {
|
|
340
|
+
const errorHandler = vueApp?.config?.errorHandler || console.error; // eslint-disable-line no-console
|
|
341
|
+
|
|
342
|
+
errorHandler(err);
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* Extend component properties
|
|
350
|
+
* @param {*} Component
|
|
351
|
+
* @returns
|
|
352
|
+
*/
|
|
353
|
+
const patchComponent = (Component) => {
|
|
354
|
+
// If Component already sanitized
|
|
355
|
+
if (Component.options && Component._Ctor === Component) {
|
|
356
|
+
return Component;
|
|
357
|
+
}
|
|
358
|
+
if (!Component.options) {
|
|
359
|
+
Component = Vue.extend(Component); // fix issue #6
|
|
360
|
+
Component._Ctor = Component;
|
|
361
|
+
} else {
|
|
362
|
+
Component._Ctor = Component;
|
|
363
|
+
Component.extendOptions = Component.options;
|
|
364
|
+
}
|
|
365
|
+
// If no component name defined, set file path as name, (also fixes #5703)
|
|
366
|
+
if (!Component.options.name && Component.options.__file) {
|
|
367
|
+
Component.options.name = Component.options.__file;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
return Component;
|
|
371
|
+
};
|
|
372
|
+
|
|
373
|
+
export const getMatchedComponents = (route, matches = false, prop = 'components') => {
|
|
374
|
+
return Array.prototype.concat.apply([], route.matched.map((match, index) => {
|
|
375
|
+
return Object.keys(match[prop]).map((key) => {
|
|
376
|
+
matches && matches.push(index);
|
|
377
|
+
|
|
378
|
+
return match[prop][key];
|
|
379
|
+
});
|
|
380
|
+
}));
|
|
381
|
+
};
|
|
382
|
+
|
|
383
|
+
const getComponent = async(unknownComponent) => {
|
|
384
|
+
let componentView;
|
|
385
|
+
|
|
386
|
+
// If component is a function, resolve it
|
|
387
|
+
if (typeof unknownComponent === 'function' && !unknownComponent.options) {
|
|
388
|
+
try {
|
|
389
|
+
componentView = await unknownComponent();
|
|
390
|
+
} catch (error) {
|
|
391
|
+
// Handle webpack chunk loading errors
|
|
392
|
+
// This may be due to a new deployment or a network problem
|
|
393
|
+
if (
|
|
394
|
+
error &&
|
|
395
|
+
error.name === 'ChunkLoadError' &&
|
|
396
|
+
typeof window !== 'undefined' &&
|
|
397
|
+
window.sessionStorage
|
|
398
|
+
) {
|
|
399
|
+
const timeNow = Date.now();
|
|
400
|
+
const previousReloadTime = parseInt(window.sessionStorage.getItem('nuxt-reload'));
|
|
401
|
+
|
|
402
|
+
// check for previous reload time not to reload infinitely
|
|
403
|
+
if (!previousReloadTime || previousReloadTime + 60000 < timeNow) {
|
|
404
|
+
window.sessionStorage.setItem('nuxt-reload', timeNow);
|
|
405
|
+
window.location.reload(true /* skip cache */);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
throw error;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
return componentView || unknownComponent;
|
|
414
|
+
};
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
* Patch all the matched components of a given route
|
|
418
|
+
* @param {*} route
|
|
419
|
+
* @returns
|
|
420
|
+
*/
|
|
421
|
+
const patchMatchedComponents = (route) => Array.prototype.concat.apply(
|
|
422
|
+
[],
|
|
423
|
+
route.matched.map(
|
|
424
|
+
(match, index) => Object
|
|
425
|
+
.keys(match.components)
|
|
426
|
+
.reduce(async(acc, key) => {
|
|
427
|
+
if (match.components[key]) {
|
|
428
|
+
const component = await getComponent(match.components[key], match.instances[key], match, key, index);
|
|
429
|
+
const patchedComponent = patchComponent(component);
|
|
430
|
+
|
|
431
|
+
match.components[key] = patchedComponent;
|
|
432
|
+
acc.push(patchedComponent);
|
|
433
|
+
} else {
|
|
434
|
+
delete match.components[key];
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
return acc;
|
|
438
|
+
}, [])
|
|
439
|
+
)
|
|
440
|
+
);
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* Merge route meta with component meta and update matched components
|
|
444
|
+
* @param {*} route
|
|
445
|
+
* @returns
|
|
446
|
+
*/
|
|
447
|
+
export const getRouteData = async(route) => {
|
|
448
|
+
if (!route) {
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
// Make sure the components are resolved (code-splitting)
|
|
452
|
+
await Promise.all(patchMatchedComponents(route));
|
|
453
|
+
const meta = getMatchedComponents(route).map(
|
|
454
|
+
(matchedComponent, index) => ({ ...matchedComponent.options.meta, ...(route.matched[index] || {}).meta })
|
|
455
|
+
);
|
|
456
|
+
|
|
457
|
+
// Send back a copy of route with meta based on Component definition
|
|
458
|
+
return {
|
|
459
|
+
...route,
|
|
460
|
+
meta
|
|
461
|
+
};
|
|
462
|
+
};
|
|
463
|
+
|
|
464
|
+
/**
|
|
465
|
+
* Add missing context for the Vue instance
|
|
466
|
+
* @param {*} app
|
|
467
|
+
* @param {*} context
|
|
468
|
+
*/
|
|
469
|
+
export const setContext = async(app, context) => {
|
|
470
|
+
// If context not defined, create it
|
|
471
|
+
if (!app.context) {
|
|
472
|
+
app.context = {
|
|
473
|
+
isDev: true,
|
|
474
|
+
isHMR: false,
|
|
475
|
+
app,
|
|
476
|
+
store: app.store,
|
|
477
|
+
payload: context.payload,
|
|
478
|
+
error: context.error,
|
|
479
|
+
base: app.router.options.base,
|
|
480
|
+
env: {
|
|
481
|
+
commit: 'head', version: '0.1.2', dev: true, pl: 1, perfTest: false, rancherEnv: 'web', api: 'http://localhost:8989'
|
|
482
|
+
}
|
|
483
|
+
};
|
|
484
|
+
// Only set once
|
|
485
|
+
|
|
486
|
+
if (context.req) {
|
|
487
|
+
app.context.req = context.req;
|
|
488
|
+
}
|
|
489
|
+
if (context.res) {
|
|
490
|
+
app.context.res = context.res;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
app.context.redirect = (status, path, query) => {
|
|
494
|
+
if (!status) {
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
497
|
+
app.context._redirected = true;
|
|
498
|
+
// if only 1 or 2 arguments: redirect('/') or redirect('/', { foo: 'bar' })
|
|
499
|
+
let pathType = typeof path;
|
|
500
|
+
|
|
501
|
+
if (typeof status !== 'number' && (pathType === 'undefined' || pathType === 'object')) {
|
|
502
|
+
query = path || {};
|
|
503
|
+
path = status;
|
|
504
|
+
pathType = typeof path;
|
|
505
|
+
status = 302;
|
|
506
|
+
}
|
|
507
|
+
if (pathType === 'object') {
|
|
508
|
+
path = app.router.resolve(path).route.fullPath;
|
|
509
|
+
}
|
|
510
|
+
// "/absolute/route", "./relative/route" or "../relative/route"
|
|
511
|
+
if (/(^[.]{1,2}\/)|(^\/(?!\/))/.test(path)) {
|
|
512
|
+
app.context.next({
|
|
513
|
+
path,
|
|
514
|
+
query,
|
|
515
|
+
status
|
|
516
|
+
});
|
|
517
|
+
} else {
|
|
518
|
+
path = withQuery(path, query);
|
|
519
|
+
|
|
520
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/Location/replace
|
|
521
|
+
window.location.replace(path);
|
|
522
|
+
|
|
523
|
+
// Throw a redirect error
|
|
524
|
+
throw new Error('ERR_REDIRECT');
|
|
525
|
+
}
|
|
526
|
+
};
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
// Dynamic keys
|
|
530
|
+
const [currentRouteData, fromRouteData] = await Promise.all([
|
|
531
|
+
getRouteData(context.route),
|
|
532
|
+
getRouteData(context.from)
|
|
533
|
+
]);
|
|
534
|
+
|
|
535
|
+
if (context.route) {
|
|
536
|
+
app.context.route = currentRouteData;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
if (context.from) {
|
|
540
|
+
app.context.from = fromRouteData;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
app.context.next = context.next;
|
|
544
|
+
app.context._redirected = false;
|
|
545
|
+
app.context._errored = false;
|
|
546
|
+
app.context.isHMR = Boolean(context.isHMR);
|
|
547
|
+
app.context.params = app.context.route.params || {};
|
|
548
|
+
app.context.query = app.context.route.query || {};
|
|
549
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// Taken from @nuxt/vue-app/template/client.js
|
|
2
|
+
|
|
3
|
+
import Vue from 'vue';
|
|
4
|
+
import fetch from 'unfetch';
|
|
5
|
+
import { extendApp } from './app-extended.js';
|
|
6
|
+
import fetchMixin from '@shell/mixins/fetch.client.js';
|
|
7
|
+
import { loadDebugger, mountApp } from '@shell/initialize/entry-helpers';
|
|
8
|
+
import { installDirectives } from '@shell/initialize/install-directives.js';
|
|
9
|
+
import { installComponents } from '@shell/initialize/install-components.js';
|
|
10
|
+
import { installPlugins } from '@shell/initialize/install-plugins.js';
|
|
11
|
+
|
|
12
|
+
// Fetch mixin
|
|
13
|
+
Vue.mixin(fetchMixin);
|
|
14
|
+
|
|
15
|
+
// Bulk install components
|
|
16
|
+
installComponents(Vue);
|
|
17
|
+
|
|
18
|
+
// Bulk install directives
|
|
19
|
+
installDirectives(Vue);
|
|
20
|
+
|
|
21
|
+
// Bulk install Plugins. Note: Some are added within the App itself
|
|
22
|
+
installPlugins(Vue);
|
|
23
|
+
|
|
24
|
+
if (!global.fetch) {
|
|
25
|
+
global.fetch = fetch;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
loadDebugger(Vue);
|
|
29
|
+
const errorHandler = Vue.config.errorHandler || console.error; // eslint-disable-line no-console
|
|
30
|
+
|
|
31
|
+
// Create and mount App
|
|
32
|
+
extendApp(Vue).then((appPartials) => mountApp(appPartials, Vue)).catch(errorHandler); // eslint-disable-line no-undef
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
|
|
2
|
+
import NuxtChild from '@shell/components/nuxt/nuxt-child.js';
|
|
3
|
+
import { nuxtLinkAlias } from '@shell/components/nuxt/nuxt-link.client.js'; // should be included after ./index.js
|
|
4
|
+
import vSelect from 'vue-select';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Add components to the Vue instance
|
|
8
|
+
* @param {*} vueApp Vue instance
|
|
9
|
+
* TODO: #11070 - Remove Nuxt residuals
|
|
10
|
+
*/
|
|
11
|
+
export const installComponents = (vueApp) => {
|
|
12
|
+
// Component: <NuxtLink>
|
|
13
|
+
// TODO: #9541 Remove for Vue 3 migration
|
|
14
|
+
vueApp.component('NuxtLink', nuxtLinkAlias('NuxtLink'));
|
|
15
|
+
vueApp.component('NLink', nuxtLinkAlias('NLink'));
|
|
16
|
+
|
|
17
|
+
// Component: <NuxtChild>
|
|
18
|
+
vueApp.component(NuxtChild.name, NuxtChild);
|
|
19
|
+
vueApp.component('NChild', NuxtChild);
|
|
20
|
+
|
|
21
|
+
// Vendor components
|
|
22
|
+
vueApp.component('v-select', vSelect);
|
|
23
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Load the directives
|
|
3
|
+
*
|
|
4
|
+
* These are included in a function that can be explictly called, so that we can be sure
|
|
5
|
+
* of the execution order, rather than importing them at the top of a file.
|
|
6
|
+
*/
|
|
7
|
+
import focusDirective from '@shell/directives/focus';
|
|
8
|
+
import cleanHtmlDirective from '@shell/directives/clean-html';
|
|
9
|
+
import cleanTooltipDirective from '@shell/directives/clean-tooltip';
|
|
10
|
+
import positiveIntNumberDirective from '@shell/directives/positive-int-number.js';
|
|
11
|
+
import trimWhitespaceDirective from '@shell/directives/trim-whitespace';
|
|
12
|
+
import intNumberDirective from '@shell/directives/int-number';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Prevent extensions from overriding existing directives
|
|
16
|
+
* Hook into vueApp.directive and keep track of the directive names that have been added
|
|
17
|
+
* and prevent an existing directive from being overwritten
|
|
18
|
+
* @param {*} vueApp Vue instance
|
|
19
|
+
*/
|
|
20
|
+
const storeDirectives = (vueApp) => {
|
|
21
|
+
const directiveNames = {};
|
|
22
|
+
const vueDirective = vueApp.directive;
|
|
23
|
+
|
|
24
|
+
vueApp.directive = function(name) {
|
|
25
|
+
if (directiveNames[name]) {
|
|
26
|
+
console.log(`Can not override directive: ${ name }`); // eslint-disable-line no-console
|
|
27
|
+
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
directiveNames[name] = true;
|
|
32
|
+
|
|
33
|
+
vueDirective.apply(vueApp, arguments);
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Load the directives from the plugins - we do this with a function so we know
|
|
39
|
+
* these are initialized here, after the code above which keeps track of them and
|
|
40
|
+
* prevents over-writes
|
|
41
|
+
* @param {*} vueApp Vue instance
|
|
42
|
+
*/
|
|
43
|
+
function addDirectives(vueApp) {
|
|
44
|
+
vueApp.directive('trim-whitespace', trimWhitespaceDirective);
|
|
45
|
+
vueApp.directive('clean-html', cleanHtmlDirective);
|
|
46
|
+
vueApp.directive('clean-tooltip', cleanTooltipDirective);
|
|
47
|
+
vueApp.directive('focus', focusDirective);
|
|
48
|
+
vueApp.directive('intNumber', intNumberDirective);
|
|
49
|
+
vueApp.directive('positiveIntNumber', positiveIntNumberDirective);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Install directives in bulks. It will store existing ones
|
|
54
|
+
* @param {*} vueApp Vue instance
|
|
55
|
+
*/
|
|
56
|
+
export const installDirectives = (vueApp) => {
|
|
57
|
+
storeDirectives(vueApp);
|
|
58
|
+
addDirectives(vueApp);
|
|
59
|
+
};
|