@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
|
@@ -8,11 +8,11 @@ import { normalizeType } from './normalize';
|
|
|
8
8
|
import garbageCollect from '@shell/utils/gc/gc';
|
|
9
9
|
import { addSchemaIndexFields } from '@shell/plugins/steve/schema.utils';
|
|
10
10
|
import { addParam } from '@shell/utils/url';
|
|
11
|
+
import { conditionalDepaginate } from '@shell/store/type-map.utils';
|
|
11
12
|
|
|
12
13
|
export const _ALL = 'all';
|
|
13
14
|
export const _MERGE = 'merge';
|
|
14
15
|
export const _MULTI = 'multi';
|
|
15
|
-
export const _ALL_IF_AUTHED = 'allIfAuthed';
|
|
16
16
|
export const _NONE = 'none';
|
|
17
17
|
|
|
18
18
|
const SCHEMA_CHECK_RETRIES = 15;
|
|
@@ -124,7 +124,7 @@ export default {
|
|
|
124
124
|
}
|
|
125
125
|
});
|
|
126
126
|
} else {
|
|
127
|
-
|
|
127
|
+
// We have everything!
|
|
128
128
|
if (opt.hasManualRefresh) {
|
|
129
129
|
dispatch('resource-fetch/updateManualRefreshIsLoading', false, { root: true });
|
|
130
130
|
}
|
|
@@ -143,6 +143,11 @@ export default {
|
|
|
143
143
|
}
|
|
144
144
|
},
|
|
145
145
|
|
|
146
|
+
/**
|
|
147
|
+
*
|
|
148
|
+
* @param {*} ctx
|
|
149
|
+
* @param { {type: string, opt: ActionFindPageArgs} } opt
|
|
150
|
+
*/
|
|
146
151
|
async findAll(ctx, { type, opt }) {
|
|
147
152
|
const {
|
|
148
153
|
getters, commit, dispatch, rootGetters
|
|
@@ -156,16 +161,22 @@ export default {
|
|
|
156
161
|
}
|
|
157
162
|
|
|
158
163
|
// No need to request the resources if we have them already
|
|
159
|
-
if (
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
};
|
|
167
|
-
|
|
164
|
+
if (
|
|
165
|
+
!opt.force &&
|
|
166
|
+
(
|
|
167
|
+
getters['haveAll'](type) ||
|
|
168
|
+
getters['haveAllNamespace'](type, opt.namespaced)
|
|
169
|
+
)
|
|
170
|
+
) {
|
|
168
171
|
if (opt.watch !== false ) {
|
|
172
|
+
const args = {
|
|
173
|
+
type,
|
|
174
|
+
revision: '',
|
|
175
|
+
// watchNamespace - used sometimes when we haven't fetched the results of a single namespace
|
|
176
|
+
// namespaced - used when we have fetched the result of a single namespace (see https://github.com/rancher/dashboard/pull/7329/files)
|
|
177
|
+
namespace: opt.watchNamespace || opt.namespaced
|
|
178
|
+
};
|
|
179
|
+
|
|
169
180
|
dispatch('watch', args);
|
|
170
181
|
}
|
|
171
182
|
|
|
@@ -176,14 +187,6 @@ export default {
|
|
|
176
187
|
|
|
177
188
|
if ( opt.load === false || opt.load === _NONE ) {
|
|
178
189
|
load = _NONE;
|
|
179
|
-
} else if ( opt.load === _ALL_IF_AUTHED ) {
|
|
180
|
-
const header = rootGetters['auth/fromHeader'];
|
|
181
|
-
|
|
182
|
-
if ( `${ header }` === 'true' || `${ header }` === 'none' ) {
|
|
183
|
-
load = _ALL;
|
|
184
|
-
} else {
|
|
185
|
-
load = _MULTI;
|
|
186
|
-
}
|
|
187
190
|
}
|
|
188
191
|
|
|
189
192
|
const typeOptions = rootGetters['type-map/optionsFor'](type);
|
|
@@ -192,7 +195,7 @@ export default {
|
|
|
192
195
|
opt = opt || {};
|
|
193
196
|
opt.url = getters.urlFor(type, null, opt);
|
|
194
197
|
opt.stream = opt.stream !== false && load !== _NONE;
|
|
195
|
-
opt.depaginate = typeOptions?.depaginate;
|
|
198
|
+
opt.depaginate = conditionalDepaginate(typeOptions?.depaginate, { ctx, args: { type, opt } });
|
|
196
199
|
|
|
197
200
|
let skipHaveAll = false;
|
|
198
201
|
|
|
@@ -200,6 +203,8 @@ export default {
|
|
|
200
203
|
// on for a limit of 100, to quickly show data
|
|
201
204
|
// another one with 1st page of the subset of the resource we are fetching
|
|
202
205
|
// the default is 4 pages, but it can be changed on mixin/resource-fetch.js
|
|
206
|
+
let pageFetchOpts;
|
|
207
|
+
|
|
203
208
|
if (opt.incremental) {
|
|
204
209
|
commit('incrementLoadCounter', type);
|
|
205
210
|
|
|
@@ -207,7 +212,7 @@ export default {
|
|
|
207
212
|
dispatch('resource-fetch/updateManualRefreshIsLoading', true, { root: true });
|
|
208
213
|
}
|
|
209
214
|
|
|
210
|
-
|
|
215
|
+
pageFetchOpts = {
|
|
211
216
|
...opt,
|
|
212
217
|
url: addParam(opt.url, 'limit', `${ opt.incremental }`),
|
|
213
218
|
};
|
|
@@ -223,8 +228,6 @@ export default {
|
|
|
223
228
|
if (opt.force) {
|
|
224
229
|
commit('forgetType', type);
|
|
225
230
|
}
|
|
226
|
-
|
|
227
|
-
dispatch('loadDataPage', { type, opt: pageFetchOpts });
|
|
228
231
|
}
|
|
229
232
|
|
|
230
233
|
let streamStarted = false;
|
|
@@ -313,12 +316,25 @@ export default {
|
|
|
313
316
|
commit('loadAll', {
|
|
314
317
|
ctx,
|
|
315
318
|
type,
|
|
316
|
-
data:
|
|
317
|
-
revision:
|
|
319
|
+
data: out.data,
|
|
320
|
+
revision: out.revision,
|
|
318
321
|
skipHaveAll,
|
|
319
|
-
namespace:
|
|
322
|
+
namespace: opt.namespaced,
|
|
323
|
+
pagination: opt.pagination ? {
|
|
324
|
+
request: opt.pagination,
|
|
325
|
+
result: {
|
|
326
|
+
count: out.count,
|
|
327
|
+
pages: out.pages,
|
|
328
|
+
timestamp: new Date().getTime()
|
|
329
|
+
}
|
|
330
|
+
} : undefined,
|
|
320
331
|
});
|
|
321
332
|
}
|
|
333
|
+
|
|
334
|
+
if (opt.incremental) {
|
|
335
|
+
// This needs to come after the loadAll (which resets state) so supplements via loadDataPage aren't lost
|
|
336
|
+
dispatch('loadDataPage', { type, opt: pageFetchOpts });
|
|
337
|
+
}
|
|
322
338
|
}
|
|
323
339
|
|
|
324
340
|
// ToDo: SM if we start a "bigger" watch (such as watch without a namespace vs a watch with a namespace), we should stop the stop the "smaller" watch so we don't have duplicate events coming back
|
|
@@ -345,6 +361,81 @@ export default {
|
|
|
345
361
|
return all;
|
|
346
362
|
},
|
|
347
363
|
|
|
364
|
+
/**
|
|
365
|
+
*
|
|
366
|
+
* @param {*} ctx
|
|
367
|
+
* @param { {type: string, opt: FindPageOpt} } opt
|
|
368
|
+
*/
|
|
369
|
+
async findPage(ctx, { type, opt }) {
|
|
370
|
+
const { getters, commit, dispatch } = ctx;
|
|
371
|
+
|
|
372
|
+
opt = opt || {};
|
|
373
|
+
|
|
374
|
+
if (!opt.pagination) {
|
|
375
|
+
console.error('Attempting to find a page for a resource but no pagination settings supplied', type); // eslint-disable-line no-console
|
|
376
|
+
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
type = getters.normalizeType(type);
|
|
381
|
+
|
|
382
|
+
if ( !getters.typeRegistered(type) ) {
|
|
383
|
+
commit('registerType', type);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// No need to request the resources if we have them already
|
|
387
|
+
if (!opt.force && getters['havePaginatedPage'](type, opt)) {
|
|
388
|
+
return findAllGetter(getters, type, opt);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
console.log(`Find Page: [${ ctx.state.config.namespace }] ${ type }. Page: ${ opt.pagination.page }. Size: ${ opt.pagination.pageSize }`); // eslint-disable-line no-console
|
|
392
|
+
opt = opt || {};
|
|
393
|
+
opt.url = getters.urlFor(type, null, opt);
|
|
394
|
+
|
|
395
|
+
let out;
|
|
396
|
+
|
|
397
|
+
try {
|
|
398
|
+
if (opt.hasManualRefresh) {
|
|
399
|
+
dispatch('resource-fetch/updateManualRefreshIsLoading', true, { root: true });
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
out = await dispatch('request', { opt, type });
|
|
403
|
+
} catch (e) {
|
|
404
|
+
if (opt.hasManualRefresh) {
|
|
405
|
+
dispatch('resource-fetch/updateManualRefreshIsLoading', false, { root: true });
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
return Promise.reject(e);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
commit('loadPage', {
|
|
412
|
+
ctx,
|
|
413
|
+
type,
|
|
414
|
+
data: out.data,
|
|
415
|
+
pagination: opt.pagination ? {
|
|
416
|
+
request: {
|
|
417
|
+
namespace: opt.namespaced,
|
|
418
|
+
pagination: opt.pagination
|
|
419
|
+
},
|
|
420
|
+
result: {
|
|
421
|
+
count: out.count,
|
|
422
|
+
pages: out.pages,
|
|
423
|
+
timestamp: new Date().getTime()
|
|
424
|
+
}
|
|
425
|
+
} : undefined,
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
const all = findAllGetter(getters, type, opt);
|
|
429
|
+
|
|
430
|
+
if (opt.hasManualRefresh) {
|
|
431
|
+
dispatch('resource-fetch/updateManualRefreshIsLoading', false, { root: true });
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
garbageCollect.gcUpdateLastAccessed(ctx, type);
|
|
435
|
+
|
|
436
|
+
return all;
|
|
437
|
+
},
|
|
438
|
+
|
|
348
439
|
async findMatching(ctx, {
|
|
349
440
|
type,
|
|
350
441
|
selector,
|
|
@@ -371,7 +462,7 @@ export default {
|
|
|
371
462
|
opt = opt || {};
|
|
372
463
|
opt.labelSelector = selector;
|
|
373
464
|
opt.url = getters.urlFor(type, null, opt);
|
|
374
|
-
opt.depaginate = typeOptions?.depaginate;
|
|
465
|
+
opt.depaginate = conditionalDepaginate(typeOptions?.depaginate, { ctx, args: { type, opt } });
|
|
375
466
|
|
|
376
467
|
const res = await dispatch('request', { opt, type });
|
|
377
468
|
|
|
@@ -443,8 +534,13 @@ export default {
|
|
|
443
534
|
const watchMsg = {
|
|
444
535
|
type,
|
|
445
536
|
id,
|
|
446
|
-
|
|
447
|
-
|
|
537
|
+
// Although not used by sockets, we need this for when resyncWatch calls find... which needs namespace to construct the url
|
|
538
|
+
namespace: opt.namespaced,
|
|
539
|
+
// Override the revision. Used in cases where we need to avoid using the resource's own revision which would be `too old`.
|
|
540
|
+
// For the above case opt.revision will be `null`. If left as `undefined` the subscribe mechanism will try to determine a revision
|
|
541
|
+
// from resources in store (which would be this one, with the too old revision)
|
|
542
|
+
revision: typeof opt.revision !== 'undefined' ? opt.revision : res?.metadata?.resourceVersion,
|
|
543
|
+
force: opt.forceWatch === true,
|
|
448
544
|
};
|
|
449
545
|
|
|
450
546
|
const idx = id.indexOf('/');
|
|
@@ -543,8 +639,18 @@ export default {
|
|
|
543
639
|
return data.map((d) => classify(ctx, d));
|
|
544
640
|
},
|
|
545
641
|
|
|
546
|
-
createPopulated(ctx, userData) {
|
|
547
|
-
|
|
642
|
+
async createPopulated(ctx, userData) {
|
|
643
|
+
let data = null;
|
|
644
|
+
|
|
645
|
+
const schema = ctx.getters['schemaFor'](userData.type);
|
|
646
|
+
|
|
647
|
+
if (schema) {
|
|
648
|
+
if (schema.fetchResourceFields) {
|
|
649
|
+
// fetch resourceFields for createYaml
|
|
650
|
+
await schema.fetchResourceFields();
|
|
651
|
+
}
|
|
652
|
+
data = ctx.getters['defaultFor'](userData.type, schema);
|
|
653
|
+
}
|
|
548
654
|
|
|
549
655
|
merge(data, userData);
|
|
550
656
|
|
|
@@ -613,7 +719,9 @@ export default {
|
|
|
613
719
|
let schema = null;
|
|
614
720
|
|
|
615
721
|
while (!schema && tries > 0) {
|
|
616
|
-
|
|
722
|
+
// Schemas may not have been loaded, so don't error out if they are not loaded yet
|
|
723
|
+
// the wait here will wait for schemas to load and then for the desired schema to be available
|
|
724
|
+
schema = getters['schemaFor'](type, false, false);
|
|
617
725
|
|
|
618
726
|
if (!schema) {
|
|
619
727
|
if (tries === RETRY_LOG) {
|
|
@@ -3,21 +3,22 @@ import { SCHEMA, COUNT } from '@shell/config/types';
|
|
|
3
3
|
|
|
4
4
|
import { matches } from '@shell/utils/selector';
|
|
5
5
|
import { typeMunge, typeRef, SIMPLE_TYPES } from '@shell/utils/create-yaml';
|
|
6
|
-
import { splitObjectPath } from '@shell/utils/string';
|
|
7
|
-
import { parseType } from '@shell/models/schema';
|
|
8
6
|
import Resource from '@shell/plugins/dashboard-store/resource-class';
|
|
9
7
|
import mutations from './mutations';
|
|
10
8
|
import { keyFieldFor, normalizeType } from './normalize';
|
|
11
9
|
import { lookup } from './model-loader';
|
|
12
10
|
import garbageCollect from '@shell/utils/gc/gc';
|
|
11
|
+
import paginationUtils from '@shell/utils/pagination-utils';
|
|
13
12
|
|
|
14
13
|
export const urlFor = (state, getters) => (type, id, opt) => {
|
|
15
14
|
opt = opt || {};
|
|
16
15
|
type = getters.normalizeType(type);
|
|
17
16
|
let url = opt.url;
|
|
18
17
|
|
|
18
|
+
let schema;
|
|
19
|
+
|
|
19
20
|
if ( !url ) {
|
|
20
|
-
|
|
21
|
+
schema = getters.schemaFor(type);
|
|
21
22
|
|
|
22
23
|
if ( !schema ) {
|
|
23
24
|
throw new Error(`Unknown schema for type: ${ type }`);
|
|
@@ -40,7 +41,7 @@ export const urlFor = (state, getters) => (type, id, opt) => {
|
|
|
40
41
|
url = `${ baseUrl }/${ url }`;
|
|
41
42
|
}
|
|
42
43
|
|
|
43
|
-
url = getters.urlOptions(url, opt);
|
|
44
|
+
url = getters.urlOptions(url, opt, schema);
|
|
44
45
|
|
|
45
46
|
return url;
|
|
46
47
|
};
|
|
@@ -70,6 +71,9 @@ function matchingCounts(typeObj, namespaces) {
|
|
|
70
71
|
|
|
71
72
|
export default {
|
|
72
73
|
|
|
74
|
+
/**
|
|
75
|
+
* Get all entries in the store. This might not mean all entries of this type
|
|
76
|
+
*/
|
|
73
77
|
all: (state, getters, rootState) => (type) => {
|
|
74
78
|
type = getters.normalizeType(type);
|
|
75
79
|
|
|
@@ -122,30 +126,13 @@ export default {
|
|
|
122
126
|
}
|
|
123
127
|
},
|
|
124
128
|
|
|
129
|
+
/**
|
|
130
|
+
* Checks a schema for the given path
|
|
131
|
+
*
|
|
132
|
+
* Given that schema are primarily a rancher thing most logic is in the `steve` store
|
|
133
|
+
*/
|
|
125
134
|
pathExistsInSchema: (state, getters) => (type, path) => {
|
|
126
|
-
|
|
127
|
-
const parts = splitObjectPath(path);
|
|
128
|
-
|
|
129
|
-
while ( parts.length ) {
|
|
130
|
-
const key = parts.shift();
|
|
131
|
-
|
|
132
|
-
type = schema.resourceFields?.[key]?.type;
|
|
133
|
-
|
|
134
|
-
if ( !type ) {
|
|
135
|
-
return false;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
if ( parts.length ) {
|
|
139
|
-
type = parseType(type).pop(); // Get the main part of array[map[something]] => something
|
|
140
|
-
schema = getters.schemaFor(type);
|
|
141
|
-
|
|
142
|
-
if ( !schema ) {
|
|
143
|
-
return false;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
return true;
|
|
135
|
+
return false;
|
|
149
136
|
},
|
|
150
137
|
|
|
151
138
|
// @TODO resolve difference between this and schemaFor and have only one of them.
|
|
@@ -216,17 +203,28 @@ export default {
|
|
|
216
203
|
return out;
|
|
217
204
|
},
|
|
218
205
|
|
|
219
|
-
defaultFor: (state, getters) => (type) => {
|
|
220
|
-
|
|
206
|
+
defaultFor: (state, getters) => (type, rootSchema, schemaDefinitions = null) => {
|
|
207
|
+
let resourceFields;
|
|
221
208
|
|
|
222
|
-
if (
|
|
223
|
-
|
|
209
|
+
if (!schemaDefinitions) {
|
|
210
|
+
// Depth 0. Get the schemaDefinitions that will contain the child schema resourceFields for recursive calls
|
|
211
|
+
|
|
212
|
+
schemaDefinitions = rootSchema.schemaDefinitions || {}; // norman...
|
|
213
|
+
resourceFields = rootSchema.resourceFields || {};
|
|
214
|
+
} else {
|
|
215
|
+
if (rootSchema.requiresResourceFields) {
|
|
216
|
+
resourceFields = schemaDefinitions[type]?.resourceFields || {};
|
|
217
|
+
} else {
|
|
218
|
+
const schema = getters['schemaFor'](type);
|
|
219
|
+
|
|
220
|
+
resourceFields = schema?.resourceFields || {};
|
|
221
|
+
}
|
|
224
222
|
}
|
|
225
223
|
|
|
226
224
|
const out = {};
|
|
227
225
|
|
|
228
|
-
for ( const key in
|
|
229
|
-
const field =
|
|
226
|
+
for ( const key in resourceFields ) {
|
|
227
|
+
const field = resourceFields[key];
|
|
230
228
|
|
|
231
229
|
if ( !field ) {
|
|
232
230
|
// Not much to do here...
|
|
@@ -234,12 +232,12 @@ export default {
|
|
|
234
232
|
}
|
|
235
233
|
|
|
236
234
|
const type = typeMunge(field.type);
|
|
237
|
-
const mapOf = typeRef('map', type);
|
|
238
|
-
const arrayOf = typeRef('array', type);
|
|
235
|
+
const mapOf = typeRef('map', type, field);
|
|
236
|
+
const arrayOf = typeRef('array', type, field);
|
|
239
237
|
const referenceTo = typeRef('reference', type);
|
|
240
238
|
|
|
241
239
|
if ( mapOf || type === 'map' || type === 'json' ) {
|
|
242
|
-
out[key] = getters.defaultFor(type);
|
|
240
|
+
out[key] = getters.defaultFor(type, rootSchema, schemaDefinitions);
|
|
243
241
|
} else if ( arrayOf || type === 'array' ) {
|
|
244
242
|
out[key] = [];
|
|
245
243
|
} else if ( referenceTo ) {
|
|
@@ -251,7 +249,7 @@ export default {
|
|
|
251
249
|
out[key] = field['default'];
|
|
252
250
|
}
|
|
253
251
|
} else {
|
|
254
|
-
out[key] = getters.defaultFor(type);
|
|
252
|
+
out[key] = getters.defaultFor(type, rootSchema, schemaDefinitions);
|
|
255
253
|
}
|
|
256
254
|
}
|
|
257
255
|
|
|
@@ -302,12 +300,39 @@ export default {
|
|
|
302
300
|
return false;
|
|
303
301
|
},
|
|
304
302
|
|
|
303
|
+
havePaginatedPage: (state, getters) => (type, opt) => {
|
|
304
|
+
if (!opt.pagination) {
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
type = getters.normalizeType(type);
|
|
309
|
+
const entry = state.types[type];
|
|
310
|
+
|
|
311
|
+
if ( entry?.havePage ) {
|
|
312
|
+
const { namespace: aNamespace = undefined, pagination: aPagination } = entry.havePage.request;
|
|
313
|
+
const { namespace: bNamespace = undefined, pagination: bPagination } = {
|
|
314
|
+
namespace: opt.namespaced,
|
|
315
|
+
pagination: opt.pagination
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
return entry.havePage && aNamespace === bNamespace && paginationUtils.paginationEqual(aPagination, bPagination);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
return false;
|
|
322
|
+
},
|
|
323
|
+
|
|
305
324
|
haveNamespace: (state, getters) => (type) => {
|
|
306
325
|
type = getters.normalizeType(type);
|
|
307
326
|
|
|
308
327
|
return state.types[type]?.haveNamespace || null;
|
|
309
328
|
},
|
|
310
329
|
|
|
330
|
+
havePage: (state, getters) => (type) => {
|
|
331
|
+
type = getters.normalizeType(type);
|
|
332
|
+
|
|
333
|
+
return state.types[type]?.havePage || null;
|
|
334
|
+
},
|
|
335
|
+
|
|
311
336
|
haveSelector: (state, getters) => (type, selector) => {
|
|
312
337
|
type = getters.normalizeType(type);
|
|
313
338
|
const entry = state.types[type];
|
|
@@ -329,7 +354,7 @@ export default {
|
|
|
329
354
|
|
|
330
355
|
urlFor,
|
|
331
356
|
|
|
332
|
-
urlOptions: () => (url, opt) => {
|
|
357
|
+
urlOptions: () => (url, opt, schema) => {
|
|
333
358
|
return url;
|
|
334
359
|
},
|
|
335
360
|
|
|
@@ -375,6 +400,10 @@ export default {
|
|
|
375
400
|
*
|
|
376
401
|
* This takes into account if the type is namespaced.
|
|
377
402
|
*
|
|
403
|
+
* Used in currently two places
|
|
404
|
+
* - Type
|
|
405
|
+
* - getTree
|
|
406
|
+
*
|
|
378
407
|
* @param typeObj see inners for properties. must have at least `name` (resource type)
|
|
379
408
|
*
|
|
380
409
|
*/
|
|
@@ -391,6 +420,7 @@ export default {
|
|
|
391
420
|
const counts = getters.all(COUNT)?.[0]?.counts || {};
|
|
392
421
|
const count = counts[type];
|
|
393
422
|
|
|
423
|
+
// This object aligns with `Type.vue` `type`
|
|
394
424
|
_typeObj = {
|
|
395
425
|
count: count ? count.summary.count || 0 : null,
|
|
396
426
|
byNamespace: count ? count.namespaces : {},
|
|
@@ -399,9 +429,26 @@ export default {
|
|
|
399
429
|
};
|
|
400
430
|
}
|
|
401
431
|
|
|
402
|
-
const namespaces = Object.keys(rootGetters.activeNamespaceCache || {});
|
|
432
|
+
const namespaces = _typeObj?.namespaced ? Object.keys(rootGetters.activeNamespaceCache || {}) : [];
|
|
403
433
|
|
|
404
434
|
return matchingCounts(_typeObj, namespaces.length ? namespaces : null);
|
|
405
435
|
},
|
|
406
436
|
|
|
437
|
+
generation: (state, getters) => (type) => {
|
|
438
|
+
type = getters.normalizeType(type);
|
|
439
|
+
const entry = state.types[type];
|
|
440
|
+
|
|
441
|
+
if ( entry ) {
|
|
442
|
+
return entry.generation;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
return undefined;
|
|
446
|
+
},
|
|
447
|
+
|
|
448
|
+
paginationEnabled: (state, getters, rootState, rootGetters) => (type = null) => {
|
|
449
|
+
const store = state.config.namespace;
|
|
450
|
+
const resource = type ? { id: type } : null;
|
|
451
|
+
|
|
452
|
+
return paginationUtils.isEnabled({ rootGetters }, { store, resource });
|
|
453
|
+
}
|
|
407
454
|
};
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import Vue from 'vue';
|
|
2
|
-
|
|
3
|
-
import { isArray } from '@shell/utils/array';
|
|
4
|
-
import { classify } from '@shell/plugins/dashboard-store/classify';
|
|
5
1
|
import actions from './actions';
|
|
6
2
|
import getters from './getters';
|
|
7
3
|
import mutations from './mutations';
|
|
@@ -37,7 +33,6 @@ export default (vuexModule, config, init) => {
|
|
|
37
33
|
store.commit(`${ namespace }/applyConfig`, config);
|
|
38
34
|
|
|
39
35
|
const module = store._modules.root._children[namespace];
|
|
40
|
-
const fromServer = window.__NUXT__;
|
|
41
36
|
|
|
42
37
|
const ctx = new Proxy(module.context, {
|
|
43
38
|
get(obj, key) {
|
|
@@ -52,99 +47,5 @@ export default (vuexModule, config, init) => {
|
|
|
52
47
|
if (init) {
|
|
53
48
|
init(store, ctx);
|
|
54
49
|
}
|
|
55
|
-
|
|
56
|
-
// Turn all the objects in the store from the server into proxies
|
|
57
|
-
const state = fromServer?.state?.[namespace];
|
|
58
|
-
|
|
59
|
-
if ( state ) {
|
|
60
|
-
Object.keys(state.types).forEach((type) => {
|
|
61
|
-
const keyField = store.getters[`${ namespace }/keyFieldForType`](type);
|
|
62
|
-
const cache = state.types[type];
|
|
63
|
-
const map = new Map();
|
|
64
|
-
|
|
65
|
-
for ( let i = 0 ; i < cache.list.length ; i++ ) {
|
|
66
|
-
const proxy = classify(ctx, cache.list[i]);
|
|
67
|
-
|
|
68
|
-
cache.list[i] = proxy;
|
|
69
|
-
map.set(proxy[keyField], proxy);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
Vue.set(cache, 'map', map);
|
|
73
|
-
Vue.set(state.types, type, state.types[type]);
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Turn all the objects in data from the server into the object from the store;
|
|
78
|
-
if ( state && fromServer?.data ) {
|
|
79
|
-
fromServer.data = recurse(fromServer.data);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
if ( state && fromServer?.fetch ) {
|
|
83
|
-
fromServer.fetch = recurse(fromServer.fetch);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
function recurse(obj, parent, key) {
|
|
87
|
-
if ( isArray(obj) ) {
|
|
88
|
-
const rehydrateKey = `__rehydrateAll__${ key }`;
|
|
89
|
-
|
|
90
|
-
if ( parent && key && parent[rehydrateKey] ) {
|
|
91
|
-
const [ns, type] = parent[rehydrateKey].split('/', 2);
|
|
92
|
-
|
|
93
|
-
if ( ns === namespace ) {
|
|
94
|
-
// Don't delete the key, so that all the stores go through this path,
|
|
95
|
-
// and then do nothing if they are not for this namespace,
|
|
96
|
-
// instead of doing the else obj.map()
|
|
97
|
-
// and breaking the "live" reference to the cache.list array
|
|
98
|
-
// delete parent[rehydrateKey];
|
|
99
|
-
|
|
100
|
-
const cache = state.types[type];
|
|
101
|
-
|
|
102
|
-
if ( cache ) {
|
|
103
|
-
return cache.list;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
} else {
|
|
107
|
-
return obj.map((x) => recurse(x));
|
|
108
|
-
}
|
|
109
|
-
} else if ( obj && typeof obj === 'object' ) {
|
|
110
|
-
if ( obj.__rehydrate ) {
|
|
111
|
-
if ( obj.__rehydrate !== namespace ) {
|
|
112
|
-
// Ignore types that are for another vuex namespace
|
|
113
|
-
return obj;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
const type = obj.type;
|
|
117
|
-
const cache = state.types[type];
|
|
118
|
-
|
|
119
|
-
if ( cache && !obj.__clone ) {
|
|
120
|
-
const map = cache.map;
|
|
121
|
-
const keyField = store.getters[`${ namespace }/keyFieldForType`](type);
|
|
122
|
-
const entry = map.get(obj[keyField]);
|
|
123
|
-
|
|
124
|
-
// Map the object to the same instance in the store if possible
|
|
125
|
-
if ( entry ) {
|
|
126
|
-
return entry;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// Or just return a proxied object
|
|
131
|
-
delete obj.__rehydrate;
|
|
132
|
-
|
|
133
|
-
return classify(ctx, obj);
|
|
134
|
-
} else {
|
|
135
|
-
for ( const k of Object.keys(obj) ) {
|
|
136
|
-
if ( k.startsWith('__rehydrateAll__') ) {
|
|
137
|
-
continue;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
if ( isArray(obj[k]) || typeof obj[k] === 'object' ) {
|
|
141
|
-
obj[k] = recurse(obj[k], obj, k);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
return obj;
|
|
148
|
-
}
|
|
149
50
|
};
|
|
150
51
|
};
|