@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
|
@@ -12,6 +12,9 @@ import {
|
|
|
12
12
|
} from '@shell/config/query-params';
|
|
13
13
|
import { ExtensionPoint, PanelLocation } from '@shell/core/types';
|
|
14
14
|
import ExtensionPanel from '@shell/components/ExtensionPanel';
|
|
15
|
+
import TabTitle from '@shell/components/TabTitle';
|
|
16
|
+
|
|
17
|
+
// i18n-uses resourceDetail.header.*
|
|
15
18
|
|
|
16
19
|
/**
|
|
17
20
|
* Resource Detail Masthead component.
|
|
@@ -23,7 +26,7 @@ export default {
|
|
|
23
26
|
name: 'MastheadResourceDetail',
|
|
24
27
|
|
|
25
28
|
components: {
|
|
26
|
-
BadgeState, Banner, ButtonGroup, ExtensionPanel
|
|
29
|
+
BadgeState, Banner, ButtonGroup, ExtensionPanel, TabTitle
|
|
27
30
|
},
|
|
28
31
|
props: {
|
|
29
32
|
value: {
|
|
@@ -412,12 +415,24 @@ export default {
|
|
|
412
415
|
<div class="title">
|
|
413
416
|
<div class="primaryheader">
|
|
414
417
|
<h1>
|
|
415
|
-
<
|
|
418
|
+
<TabTitle
|
|
419
|
+
v-if="isCreate"
|
|
420
|
+
:showChild="false"
|
|
421
|
+
>
|
|
422
|
+
{{ parent.displayName }}
|
|
423
|
+
</TabTitle>
|
|
424
|
+
<TabTitle
|
|
425
|
+
v-else
|
|
426
|
+
:showChild="false"
|
|
427
|
+
>
|
|
428
|
+
{{ displayName }}
|
|
429
|
+
</TabTitle>
|
|
430
|
+
<router-link
|
|
416
431
|
v-if="location"
|
|
417
432
|
:to="location"
|
|
418
433
|
>
|
|
419
434
|
{{ parent.displayName }}:
|
|
420
|
-
</
|
|
435
|
+
</router-link>
|
|
421
436
|
<span v-else>{{ parent.displayName }}:</span>
|
|
422
437
|
<span v-if="value.detailPageHeaderActionOverride && value.detailPageHeaderActionOverride(realMode)">{{ value.detailPageHeaderActionOverride(realMode) }}</span>
|
|
423
438
|
<t
|
|
@@ -448,16 +463,17 @@ export default {
|
|
|
448
463
|
v-if="!isCreate"
|
|
449
464
|
class="subheader"
|
|
450
465
|
>
|
|
451
|
-
<span v-if="isNamespace && project">{{ t("resourceDetail.masthead.project") }}: <
|
|
452
|
-
<span v-else-if="isWorkspace">{{ t("resourceDetail.masthead.workspace") }}: <
|
|
466
|
+
<span v-if="isNamespace && project">{{ t("resourceDetail.masthead.project") }}: <router-link :to="project.detailLocation">{{ project.nameDisplay }}</router-link></span>
|
|
467
|
+
<span v-else-if="isWorkspace">{{ t("resourceDetail.masthead.workspace") }}: <router-link :to="workspaceLocation">{{ namespace }}</router-link></span>
|
|
453
468
|
<span v-else-if="namespace && !hasMultipleNamespaces">
|
|
454
469
|
{{ t("resourceDetail.masthead.namespace") }}:
|
|
455
|
-
<
|
|
470
|
+
<router-link
|
|
456
471
|
v-if="!hideNamespaceLocation"
|
|
457
472
|
:to="namespaceLocation"
|
|
473
|
+
data-testid="masthead-subheader-namespace"
|
|
458
474
|
>
|
|
459
475
|
{{ namespace }}
|
|
460
|
-
</
|
|
476
|
+
</router-link>
|
|
461
477
|
<span v-else>
|
|
462
478
|
{{ namespace }}
|
|
463
479
|
</span>
|
|
@@ -155,6 +155,11 @@ export default {
|
|
|
155
155
|
}
|
|
156
156
|
|
|
157
157
|
if ( as === _YAML ) {
|
|
158
|
+
if (schema?.fetchResourceFields) {
|
|
159
|
+
// fetch resourceFields for createYaml
|
|
160
|
+
await schema.fetchResourceFields();
|
|
161
|
+
}
|
|
162
|
+
|
|
158
163
|
yaml = createYaml(schemas, resource, data);
|
|
159
164
|
}
|
|
160
165
|
} else {
|
|
@@ -5,6 +5,7 @@ import TypeDescription from '@shell/components/TypeDescription';
|
|
|
5
5
|
import { get } from '@shell/utils/object';
|
|
6
6
|
import { AS, _YAML } from '@shell/config/query-params';
|
|
7
7
|
import ResourceLoadingIndicator from './ResourceLoadingIndicator';
|
|
8
|
+
import TabTitle from '@shell/components/TabTitle';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* Resource List Masthead component.
|
|
@@ -17,6 +18,7 @@ export default {
|
|
|
17
18
|
Favorite,
|
|
18
19
|
TypeDescription,
|
|
19
20
|
ResourceLoadingIndicator,
|
|
21
|
+
TabTitle
|
|
20
22
|
},
|
|
21
23
|
props: {
|
|
22
24
|
resource: {
|
|
@@ -102,7 +104,7 @@ export default {
|
|
|
102
104
|
|
|
103
105
|
computed: {
|
|
104
106
|
get,
|
|
105
|
-
...mapGetters(['isExplorer']),
|
|
107
|
+
...mapGetters(['isExplorer', 'currentCluster']),
|
|
106
108
|
|
|
107
109
|
resourceName() {
|
|
108
110
|
if (this.schema) {
|
|
@@ -156,20 +158,19 @@ export default {
|
|
|
156
158
|
|
|
157
159
|
_createButtonlabel() {
|
|
158
160
|
return this.createButtonLabel || this.t('resourceList.head.create');
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
},
|
|
161
|
+
},
|
|
162
|
+
}
|
|
162
163
|
};
|
|
163
164
|
</script>
|
|
164
165
|
|
|
165
166
|
<template>
|
|
166
|
-
<header>
|
|
167
|
+
<header class="with-subheader">
|
|
167
168
|
<slot name="typeDescription">
|
|
168
169
|
<TypeDescription :resource="resource" />
|
|
169
170
|
</slot>
|
|
170
171
|
<div class="title">
|
|
171
172
|
<h1 class="m-0">
|
|
172
|
-
{{ _typeDisplay }} <Favorite
|
|
173
|
+
<TabTitle>{{ _typeDisplay }}</TabTitle> <Favorite
|
|
173
174
|
v-if="isExplorer"
|
|
174
175
|
:resource="favoriteResource || resource"
|
|
175
176
|
/>
|
|
@@ -180,28 +181,33 @@ export default {
|
|
|
180
181
|
:indeterminate="loadIndeterminate"
|
|
181
182
|
/>
|
|
182
183
|
</div>
|
|
184
|
+
<div class="sub-header">
|
|
185
|
+
<slot name="subHeader">
|
|
186
|
+
<!--Slot content-->
|
|
187
|
+
</slot>
|
|
188
|
+
</div>
|
|
183
189
|
<div class="actions-container">
|
|
184
190
|
<slot name="actions">
|
|
185
191
|
<div class="actions">
|
|
186
192
|
<slot name="extraActions" />
|
|
187
193
|
|
|
188
194
|
<slot name="createButton">
|
|
189
|
-
<
|
|
195
|
+
<router-link
|
|
190
196
|
v-if="hasEditComponent && _isCreatable"
|
|
191
197
|
:to="_createLocation"
|
|
192
198
|
class="btn role-primary"
|
|
193
199
|
:data-testid="componentTestid+'-create'"
|
|
194
200
|
>
|
|
195
201
|
{{ _createButtonlabel }}
|
|
196
|
-
</
|
|
197
|
-
<
|
|
202
|
+
</router-link>
|
|
203
|
+
<router-link
|
|
198
204
|
v-else-if="_isYamlCreatable"
|
|
199
205
|
:to="_yamlCreateLocation"
|
|
200
206
|
class="btn role-primary"
|
|
201
207
|
:data-testid="componentTestid+'-create-yaml'"
|
|
202
208
|
>
|
|
203
209
|
{{ t("resourceList.head.createFromYaml") }}
|
|
204
|
-
</
|
|
210
|
+
</router-link>
|
|
205
211
|
</slot>
|
|
206
212
|
</div>
|
|
207
213
|
</slot>
|
|
@@ -221,4 +227,16 @@ export default {
|
|
|
221
227
|
header {
|
|
222
228
|
margin-bottom: 20px;
|
|
223
229
|
}
|
|
230
|
+
|
|
231
|
+
header.with-subheader {
|
|
232
|
+
grid-template-areas:
|
|
233
|
+
'type-banner type-banner'
|
|
234
|
+
'title actions'
|
|
235
|
+
'sub-header sub-header'
|
|
236
|
+
'state-banner state-banner';
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.sub-header {
|
|
240
|
+
grid-area: sub-header;
|
|
241
|
+
}
|
|
224
242
|
</style>
|
|
@@ -45,7 +45,7 @@ export default {
|
|
|
45
45
|
const schema = this.schema;
|
|
46
46
|
|
|
47
47
|
if ( this.hasListComponent ) {
|
|
48
|
-
// If you provide your own list then call its
|
|
48
|
+
// If you provide your own list then call its fetch
|
|
49
49
|
const importer = this.listComponent;
|
|
50
50
|
const component = (await importer())?.default;
|
|
51
51
|
|
|
@@ -55,7 +55,7 @@ export default {
|
|
|
55
55
|
|
|
56
56
|
// If your list page has a fetch then it's responsible for populating rows itself
|
|
57
57
|
if ( component?.fetch ) {
|
|
58
|
-
this.
|
|
58
|
+
this.componentWillFetch = true;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
// If the custom component supports it, ask it what resources it loads, so we can
|
|
@@ -68,15 +68,15 @@ export default {
|
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
if ( !this.
|
|
71
|
+
if ( !this.componentWillFetch ) {
|
|
72
72
|
if ( !schema ) {
|
|
73
73
|
store.dispatch('loadingError', new Error(this.t('nav.failWhale.resourceListNotFound', { resource }, true)));
|
|
74
74
|
|
|
75
75
|
return;
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
-
// See comment for `
|
|
79
|
-
if (!this.namespaceFilterRequired) {
|
|
78
|
+
// See comment for `namespaceFilter` and `pagination` watchers, skip fetch if we're not ready yet... and something is going to call fetch later on
|
|
79
|
+
if (!this.namespaceFilterRequired && (!this.canPaginate || this.refreshFlag)) {
|
|
80
80
|
await this.$fetchType(resource);
|
|
81
81
|
}
|
|
82
82
|
}
|
|
@@ -103,7 +103,11 @@ export default {
|
|
|
103
103
|
extensionType: ExtensionPoint.PANEL,
|
|
104
104
|
extensionLocation: PanelLocation.RESOURCE_LIST,
|
|
105
105
|
loadResources: [resource], // List of resources that will be loaded, this could be many (`Workloads`)
|
|
106
|
-
|
|
106
|
+
/**
|
|
107
|
+
* Will the custom component handle the fetch of resources....
|
|
108
|
+
* or will this instance fetch resources
|
|
109
|
+
*/
|
|
110
|
+
componentWillFetch: false,
|
|
107
111
|
// manual refresh
|
|
108
112
|
manualRefreshInit: false,
|
|
109
113
|
watch: false,
|
|
@@ -113,7 +117,7 @@ export default {
|
|
|
113
117
|
// incremental loading
|
|
114
118
|
loadIndeterminate: false,
|
|
115
119
|
// query param for simple filtering
|
|
116
|
-
useQueryParamsForSimpleFiltering: true
|
|
120
|
+
useQueryParamsForSimpleFiltering: true,
|
|
117
121
|
};
|
|
118
122
|
},
|
|
119
123
|
|
|
@@ -124,7 +128,7 @@ export default {
|
|
|
124
128
|
return [];
|
|
125
129
|
}
|
|
126
130
|
|
|
127
|
-
return this.$store.getters['type-map/headersFor'](this.schema);
|
|
131
|
+
return this.$store.getters['type-map/headersFor'](this.schema, this.canPaginate);
|
|
128
132
|
},
|
|
129
133
|
|
|
130
134
|
groupBy() {
|
|
@@ -138,6 +142,7 @@ export default {
|
|
|
138
142
|
},
|
|
139
143
|
|
|
140
144
|
watch: {
|
|
145
|
+
|
|
141
146
|
/**
|
|
142
147
|
* When a NS filter is required and the user selects a different one, kick off a new set of API requests
|
|
143
148
|
*
|
|
@@ -148,14 +153,46 @@ export default {
|
|
|
148
153
|
* This covers case 1
|
|
149
154
|
*/
|
|
150
155
|
namespaceFilter(neu, old) {
|
|
151
|
-
if (
|
|
152
|
-
|
|
156
|
+
if (neu && !this.componentWillFetch) {
|
|
157
|
+
if (sameContents(neu, old)) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
this.$fetchType(this.resource);
|
|
153
162
|
}
|
|
163
|
+
},
|
|
154
164
|
|
|
155
|
-
|
|
165
|
+
/**
|
|
166
|
+
* When a pagination is required and the user changes page / sort / filter, kick off a new set of API requests
|
|
167
|
+
*
|
|
168
|
+
* ResourceList has two modes
|
|
169
|
+
* 1) ResourceList component handles API request to fetch resources
|
|
170
|
+
* 2) Custom list component handles API request to fetch resources
|
|
171
|
+
*
|
|
172
|
+
* This covers case 1
|
|
173
|
+
*/
|
|
174
|
+
pagination(neu, old) {
|
|
175
|
+
if (neu && !this.componentWillFetch && !this.paginationEqual(neu, old)) {
|
|
156
176
|
this.$fetchType(this.resource);
|
|
157
177
|
}
|
|
158
|
-
}
|
|
178
|
+
},
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Monitor the rows to ensure deleting the last entry in a server-side paginated page doesn't
|
|
182
|
+
* result in an empty page
|
|
183
|
+
*/
|
|
184
|
+
rows(neu) {
|
|
185
|
+
if (!this.pagination) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (this.pagination.page > 1 && neu.length === 0) {
|
|
190
|
+
this.setPagination({
|
|
191
|
+
...this.pagination,
|
|
192
|
+
page: this.pagination.page - 1
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
},
|
|
159
196
|
},
|
|
160
197
|
|
|
161
198
|
created() {
|
|
@@ -184,6 +221,16 @@ export default {
|
|
|
184
221
|
{{ t('resourceList.nsFiltering') }}
|
|
185
222
|
</template>
|
|
186
223
|
</IconMessage>
|
|
224
|
+
<IconMessage
|
|
225
|
+
v-else-if="paginationNsFilterRequired"
|
|
226
|
+
:vertical="true"
|
|
227
|
+
:subtle="false"
|
|
228
|
+
icon="icon-filter_alt"
|
|
229
|
+
>
|
|
230
|
+
<template #message>
|
|
231
|
+
{{ t('resourceList.nsFilteringGeneric') }}
|
|
232
|
+
</template>
|
|
233
|
+
</IconMessage>
|
|
187
234
|
<div v-else>
|
|
188
235
|
<Masthead
|
|
189
236
|
v-if="showMasthead"
|
|
@@ -217,6 +264,7 @@ export default {
|
|
|
217
264
|
v-else
|
|
218
265
|
:schema="schema"
|
|
219
266
|
:rows="rows"
|
|
267
|
+
:alt-loading="canPaginate"
|
|
220
268
|
:loading="loading"
|
|
221
269
|
:headers="headers"
|
|
222
270
|
:group-by="groupBy"
|
|
@@ -225,11 +273,14 @@ export default {
|
|
|
225
273
|
:adv-filter-prevent-filtering-labels="advFilterPreventFilteringLabels"
|
|
226
274
|
:use-query-params-for-simple-filtering="useQueryParamsForSimpleFiltering"
|
|
227
275
|
:force-update-live-and-delayed="forceUpdateLiveAndDelayed"
|
|
276
|
+
:external-pagination-enabled="canPaginate"
|
|
277
|
+
:external-pagination-result="paginationResult"
|
|
278
|
+
@pagination-changed="paginationChanged"
|
|
228
279
|
/>
|
|
229
280
|
</div>
|
|
230
281
|
</template>
|
|
231
282
|
|
|
232
|
-
|
|
283
|
+
<style lang="scss" scoped>
|
|
233
284
|
.header {
|
|
234
285
|
position: relative;
|
|
235
286
|
}
|
|
@@ -245,4 +296,4 @@ export default {
|
|
|
245
296
|
top: 10px;
|
|
246
297
|
right: 10px;
|
|
247
298
|
}
|
|
248
|
-
|
|
299
|
+
</style>
|
|
@@ -59,6 +59,11 @@ export default {
|
|
|
59
59
|
required: false
|
|
60
60
|
},
|
|
61
61
|
|
|
62
|
+
altLoading: {
|
|
63
|
+
type: Boolean,
|
|
64
|
+
required: false
|
|
65
|
+
},
|
|
66
|
+
|
|
62
67
|
keyField: {
|
|
63
68
|
// Field that is unique for each row.
|
|
64
69
|
type: String,
|
|
@@ -166,6 +171,16 @@ export default {
|
|
|
166
171
|
forceUpdateLiveAndDelayed: {
|
|
167
172
|
type: Number,
|
|
168
173
|
default: 0
|
|
174
|
+
},
|
|
175
|
+
|
|
176
|
+
externalPaginationEnabled: {
|
|
177
|
+
type: Boolean,
|
|
178
|
+
default: false
|
|
179
|
+
},
|
|
180
|
+
|
|
181
|
+
externalPaginationResult: {
|
|
182
|
+
type: Object,
|
|
183
|
+
default: null
|
|
169
184
|
}
|
|
170
185
|
},
|
|
171
186
|
|
|
@@ -184,24 +199,31 @@ export default {
|
|
|
184
199
|
},
|
|
185
200
|
|
|
186
201
|
data() {
|
|
187
|
-
const options = this.$store.getters[`type-map/optionsFor`](this.schema);
|
|
188
|
-
const listGroups = options?.listGroups || [];
|
|
189
|
-
const listGroupMapped = listGroups.reduce((acc, grp) => {
|
|
190
|
-
acc[grp.value] = grp;
|
|
191
|
-
|
|
192
|
-
return acc;
|
|
193
|
-
}, {});
|
|
194
|
-
|
|
195
202
|
// Confirm which store we're in, if schema isn't available we're probably showing a list with different types
|
|
196
203
|
const inStore = this.schema?.id ? this.$store.getters['currentStore'](this.schema.id) : undefined;
|
|
197
204
|
|
|
198
|
-
return {
|
|
199
|
-
listGroups, listGroupMapped, inStore
|
|
200
|
-
};
|
|
205
|
+
return { inStore };
|
|
201
206
|
},
|
|
202
207
|
|
|
203
208
|
computed: {
|
|
209
|
+
options() {
|
|
210
|
+
return this.$store.getters[`type-map/optionsFor`](this.schema, this.externalPaginationEnabled);
|
|
211
|
+
},
|
|
212
|
+
|
|
213
|
+
_listGroupMapped() {
|
|
214
|
+
return this.options?.listGroups?.reduce((acc, grp) => {
|
|
215
|
+
acc[grp.value] = grp;
|
|
216
|
+
|
|
217
|
+
return acc;
|
|
218
|
+
}, {});
|
|
219
|
+
},
|
|
220
|
+
|
|
221
|
+
_mandatorySort() {
|
|
222
|
+
return this.options?.listMandatorySort;
|
|
223
|
+
},
|
|
224
|
+
|
|
204
225
|
...mapGetters(['currentProduct']),
|
|
226
|
+
|
|
205
227
|
isNamespaced() {
|
|
206
228
|
if ( this.namespaced !== null ) {
|
|
207
229
|
return this.namespaced;
|
|
@@ -236,7 +258,7 @@ export default {
|
|
|
236
258
|
if ( this.headers ) {
|
|
237
259
|
headers = this.headers.slice();
|
|
238
260
|
} else {
|
|
239
|
-
headers = this.$store.getters['type-map/headersFor'](this.schema);
|
|
261
|
+
headers = this.$store.getters['type-map/headersFor'](this.schema, this.externalPaginationEnabled);
|
|
240
262
|
}
|
|
241
263
|
|
|
242
264
|
// add custom table columns provided by the extensions ExtensionPoint.TABLE_COL hook
|
|
@@ -283,7 +305,7 @@ export default {
|
|
|
283
305
|
}
|
|
284
306
|
|
|
285
307
|
// If we are grouping by a custom group, it may specify that we hide a specific column
|
|
286
|
-
const custom = this.
|
|
308
|
+
const custom = this._listGroupMapped?.[this.group];
|
|
287
309
|
|
|
288
310
|
if (custom?.hideColumn) {
|
|
289
311
|
const idx = headers.findIndex((header) => header.name === custom.hideColumn);
|
|
@@ -296,6 +318,9 @@ export default {
|
|
|
296
318
|
return headers;
|
|
297
319
|
},
|
|
298
320
|
|
|
321
|
+
/**
|
|
322
|
+
* Take rows and filter out entries given the namespace filter
|
|
323
|
+
*/
|
|
299
324
|
filteredRows() {
|
|
300
325
|
const isAll = this.$store.getters['isAllNamespaces'];
|
|
301
326
|
|
|
@@ -303,6 +328,7 @@ export default {
|
|
|
303
328
|
if (
|
|
304
329
|
!this.isNamespaced || // Resource type isn't namespaced
|
|
305
330
|
this.ignoreFilter || // Component owner strictly states no filtering
|
|
331
|
+
this.externalPaginationEnabled ||
|
|
306
332
|
(isAll && !this.currentProduct?.hideSystemResources) || // Need all
|
|
307
333
|
(this.inStore ? this.$store.getters[`${ this.inStore }/haveNamespace`](this.schema.id)?.length : false)// Store reports type has namespace filter, so rows already contain the correctly filtered resources
|
|
308
334
|
) {
|
|
@@ -344,7 +370,14 @@ export default {
|
|
|
344
370
|
const exists = this.groupOptions.find((g) => g.value === this._group);
|
|
345
371
|
|
|
346
372
|
if (!exists) {
|
|
347
|
-
|
|
373
|
+
// Attempt to find the default option in available options...
|
|
374
|
+
// if not use the first value in the options collection...
|
|
375
|
+
// and if not that just fall back to the default
|
|
376
|
+
if (this.groupOptions.find((g) => g.value === DEFAULT_GROUP)) {
|
|
377
|
+
return DEFAULT_GROUP;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
return this.groupOptions[0]?.value || DEFAULT_GROUP;
|
|
348
381
|
}
|
|
349
382
|
|
|
350
383
|
return this._group;
|
|
@@ -357,7 +390,7 @@ export default {
|
|
|
357
390
|
showGrouping() {
|
|
358
391
|
if ( this.groupable === null ) {
|
|
359
392
|
const namespaceGroupable = this.$store.getters['isMultipleNamespaces'] && this.isNamespaced;
|
|
360
|
-
const customGroupable = this.listGroups
|
|
393
|
+
const customGroupable = !!this.options?.listGroups?.length;
|
|
361
394
|
|
|
362
395
|
return namespaceGroupable || customGroupable;
|
|
363
396
|
}
|
|
@@ -367,16 +400,19 @@ export default {
|
|
|
367
400
|
|
|
368
401
|
computedGroupBy() {
|
|
369
402
|
if ( this.groupBy ) {
|
|
403
|
+
// This probably comes from the type-map config for the resource (see ResourceList)
|
|
370
404
|
return this.groupBy;
|
|
371
405
|
}
|
|
372
406
|
|
|
373
407
|
if ( this.group === 'namespace' && this.showGrouping ) {
|
|
408
|
+
// This switches to group rows by a key which is the label for the group (??)
|
|
374
409
|
return 'groupByLabel';
|
|
375
410
|
}
|
|
376
411
|
|
|
377
|
-
const custom = this.
|
|
412
|
+
const custom = this._listGroupMapped?.[this.group];
|
|
378
413
|
|
|
379
|
-
if (custom
|
|
414
|
+
if (custom?.field) {
|
|
415
|
+
// Override the normal filtering
|
|
380
416
|
return custom.field;
|
|
381
417
|
}
|
|
382
418
|
|
|
@@ -384,6 +420,12 @@ export default {
|
|
|
384
420
|
},
|
|
385
421
|
|
|
386
422
|
groupOptions() {
|
|
423
|
+
// Ignore the defaults below, we have an override set of groups
|
|
424
|
+
// REPLACE (instead of SUPPLEMENT) defaults with listGroups (given listGroupsWillOverride is true)
|
|
425
|
+
if (this.options?.listGroupsWillOverride && !!this.options?.listGroups?.length) {
|
|
426
|
+
return this.options?.listGroups;
|
|
427
|
+
}
|
|
428
|
+
|
|
387
429
|
const standard = [
|
|
388
430
|
{
|
|
389
431
|
tooltipKey: 'resourceTable.groupBy.none',
|
|
@@ -397,7 +439,12 @@ export default {
|
|
|
397
439
|
},
|
|
398
440
|
];
|
|
399
441
|
|
|
400
|
-
|
|
442
|
+
// SUPPLEMENT (instead of REPLACE) defaults with listGroups (given listGroupsWillOverride is false)
|
|
443
|
+
if (!!this.options?.listGroups?.length) {
|
|
444
|
+
return standard.concat(this.options.listGroups);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
return standard;
|
|
401
448
|
},
|
|
402
449
|
|
|
403
450
|
parsedPagingParams() {
|
|
@@ -417,6 +464,7 @@ export default {
|
|
|
417
464
|
pluralLabel: this.$store.getters['type-map/labelFor'](this.schema, 99),
|
|
418
465
|
};
|
|
419
466
|
},
|
|
467
|
+
|
|
420
468
|
},
|
|
421
469
|
|
|
422
470
|
methods: {
|
|
@@ -478,7 +526,7 @@ export default {
|
|
|
478
526
|
this.keyAction('detail');
|
|
479
527
|
}
|
|
480
528
|
}
|
|
481
|
-
}
|
|
529
|
+
},
|
|
482
530
|
};
|
|
483
531
|
</script>
|
|
484
532
|
|
|
@@ -489,6 +537,7 @@ export default {
|
|
|
489
537
|
:headers="_headers"
|
|
490
538
|
:rows="filteredRows"
|
|
491
539
|
:loading="loading"
|
|
540
|
+
:alt-loading="altLoading"
|
|
492
541
|
:group-by="computedGroupBy"
|
|
493
542
|
:group="group"
|
|
494
543
|
:group-options="groupOptions"
|
|
@@ -508,8 +557,12 @@ export default {
|
|
|
508
557
|
:sort-generation-fn="safeSortGenerationFn"
|
|
509
558
|
:use-query-params-for-simple-filtering="useQueryParamsForSimpleFiltering"
|
|
510
559
|
:force-update-live-and-delayed="forceUpdateLiveAndDelayed"
|
|
560
|
+
:external-pagination-enabled="externalPaginationEnabled"
|
|
561
|
+
:external-pagination-result="externalPaginationResult"
|
|
562
|
+
:mandatory-sort="_mandatorySort"
|
|
511
563
|
@clickedActionButton="handleActionButtonClick"
|
|
512
564
|
@group-value-change="group = $event"
|
|
565
|
+
|
|
513
566
|
v-on="$listeners"
|
|
514
567
|
>
|
|
515
568
|
<template
|
|
@@ -517,6 +570,7 @@ export default {
|
|
|
517
570
|
#header-middle
|
|
518
571
|
>
|
|
519
572
|
<slot name="more-header-middle" />
|
|
573
|
+
|
|
520
574
|
<ButtonGroup
|
|
521
575
|
v-model="group"
|
|
522
576
|
:options="groupOptions"
|
|
@@ -98,7 +98,7 @@ export default {
|
|
|
98
98
|
v-if="rows.length"
|
|
99
99
|
class="grid"
|
|
100
100
|
>
|
|
101
|
-
<
|
|
101
|
+
<component
|
|
102
102
|
:is="asLink ? 'a' : 'div'"
|
|
103
103
|
v-for="(r, idx) in rows"
|
|
104
104
|
:key="get(r, keyField)"
|
|
@@ -106,7 +106,7 @@ export default {
|
|
|
106
106
|
:target="get(r, targetField)"
|
|
107
107
|
:rel="rel"
|
|
108
108
|
class="item"
|
|
109
|
-
:data-testid="componentTestid + '-' +
|
|
109
|
+
:data-testid="componentTestid + '-' + get(r, nameField)"
|
|
110
110
|
:class="{
|
|
111
111
|
'has-description': !!get(r, descriptionField),
|
|
112
112
|
'has-side-label': !!get(r, sideLabelField), [colorFor(r, idx)]: true, disabled: get(r, disabledField) === true
|
|
@@ -154,7 +154,7 @@ export default {
|
|
|
154
154
|
>
|
|
155
155
|
{{ get(r, descriptionField) }}
|
|
156
156
|
</div>
|
|
157
|
-
</
|
|
157
|
+
</component>
|
|
158
158
|
</div>
|
|
159
159
|
<div
|
|
160
160
|
v-else
|