@rancher/shell 1.2.0 → 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 +1 -0
- package/assets/styles/global/_layout.scss +99 -0
- package/assets/styles/themes/_csp.scss +2 -2
- package/assets/styles/themes/_dark.scss +8 -2
- package/assets/styles/themes/_light.scss +2 -1
- package/assets/styles/themes/_suse.scss +1 -1
- package/assets/styles/vendor/vue-select.scss +5 -0
- package/assets/translations/en-us.yaml +299 -63
- package/assets/translations/zh-hans.yaml +7 -31
- package/babel.config.js +8 -2
- package/chart/__tests__/S3.test.ts +9 -2
- package/chart/gatekeeper.vue +2 -11
- package/chart/istio.vue +1 -10
- package/chart/logging/index.vue +2 -11
- package/chart/monitoring/alerting/index.vue +7 -21
- package/chart/monitoring/grafana/index.vue +61 -2
- package/chart/monitoring/index.vue +52 -26
- package/chart/monitoring/prometheus/index.vue +39 -45
- package/chart/rancher-backup/S3.vue +11 -9
- package/chart/rancher-backup/index.vue +18 -15
- package/cloud-credential/__tests__/harvester.test.ts +18 -0
- package/cloud-credential/azure.vue +4 -17
- package/cloud-credential/generic.vue +18 -9
- package/cloud-credential/harvester.vue +11 -3
- package/components/AppModal.vue +167 -0
- package/components/AssignTo.vue +7 -4
- package/components/AsyncButton.vue +27 -5
- package/components/BackLink.vue +4 -4
- package/components/BannerGraphic.vue +1 -0
- package/components/BrandImage.vue +47 -1
- package/components/Carousel.vue +15 -8
- package/components/Certificates.vue +161 -0
- package/components/ClusterBadge.vue +12 -3
- package/components/ClusterIconMenu.vue +55 -12
- package/components/ClusterProviderIcon.vue +14 -3
- package/components/CodeMirror.vue +111 -17
- package/components/CommunityLinks.vue +12 -8
- package/components/CopyCode.vue +6 -2
- package/components/CopyToClipboard.vue +2 -1
- package/components/CopyToClipboardText.vue +14 -9
- package/components/CreateDriver.vue +81 -0
- package/components/CruResource.vue +52 -27
- package/components/DetailTop.vue +2 -2
- package/components/Dialog.vue +6 -5
- package/components/DisableAuthProviderModal.vue +14 -8
- package/components/DraggableZone.vue +2 -2
- package/components/EtcdInfoBanner.vue +5 -5
- package/components/ExplorerMembers.vue +3 -3
- package/components/ExplorerProjectsNamespaces.vue +31 -7
- package/components/FixedBanner.vue +48 -36
- package/components/GlobalRoleBindings.vue +26 -0
- package/components/IconOrSvg.vue +1 -1
- package/components/Import.vue +10 -6
- package/components/Inactivity.vue +1 -5
- package/components/KeyValueView.vue +14 -10
- package/components/Markdown.vue +16 -12
- package/components/MessageLink.vue +2 -2
- package/components/ModalWithCard.vue +5 -8
- package/components/MoveModal.vue +35 -33
- package/components/PodSecurityAdmission.vue +3 -3
- package/components/PromptChangePassword.vue +33 -33
- package/components/PromptModal.vue +11 -21
- package/components/PromptRemove.vue +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 +19 -3
- package/components/ResourceCancelModal.vue +34 -29
- package/components/ResourceDetail/Masthead.vue +48 -16
- package/components/ResourceDetail/index.vue +6 -4
- package/components/ResourceList/Masthead.vue +10 -9
- package/components/ResourceList/index.vue +65 -14
- package/components/ResourceTable.vue +87 -21
- package/components/ResourceYaml.vue +35 -5
- package/components/SelectIconGrid.vue +3 -3
- package/components/SideNav.vue +50 -94
- package/components/SingleClusterInfo.vue +4 -4
- package/components/SortableTable/THead.vue +33 -21
- package/components/SortableTable/filtering.js +9 -1
- package/components/SortableTable/grouping.js +8 -1
- package/components/SortableTable/index.vue +143 -44
- package/components/SortableTable/paging.js +36 -7
- package/components/SortableTable/selection.js +2 -1
- package/components/SortableTable/sorting.js +24 -7
- package/components/StatusTable.vue +5 -1
- package/components/Tabbed/index.vue +18 -1
- package/components/TableDataUserIcon.vue +47 -0
- package/components/TypeDescription.vue +1 -0
- package/components/Wizard.vue +1 -0
- package/components/YamlEditor.vue +1 -0
- package/components/__tests__/AppModal.test.ts +98 -0
- package/components/__tests__/AsyncButton.test.ts +1 -3
- package/components/__tests__/BackLink.test.ts +1 -1
- package/components/__tests__/ButtonGroup.test.ts +3 -6
- package/components/__tests__/Carousel.test.ts +43 -0
- package/components/__tests__/Certificates.test.ts +29 -0
- package/components/__tests__/CodeMirror.test.ts +87 -0
- package/components/__tests__/CopyCode.test.ts +5 -4
- package/components/__tests__/CruResource.test.ts +10 -9
- package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
- package/components/__tests__/FixedBanner.test.ts +5 -20
- package/components/__tests__/NamespaceFilter.test.ts +9 -18
- package/components/__tests__/TabTitle.test.ts +129 -0
- package/components/auth/AzureWarning.vue +2 -2
- package/components/auth/RoleDetailEdit.vue +10 -0
- package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
- package/components/auth/login/oidc.vue +7 -1
- package/components/fleet/FleetBundles.vue +5 -11
- package/components/fleet/FleetClusters.vue +9 -9
- package/components/fleet/FleetIntro.vue +11 -17
- package/components/fleet/FleetNoWorkspaces.vue +2 -2
- package/components/fleet/FleetRepos.vue +63 -27
- package/components/fleet/FleetResources.vue +6 -1
- package/components/fleet/FleetStatus.vue +3 -3
- package/components/fleet/FleetSummary.vue +35 -30
- package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
- package/components/fleet/__tests__/FleetSummary.test.ts +316 -0
- package/components/form/ArrayList.vue +22 -18
- package/components/form/ArrayListSelect.vue +5 -0
- package/components/form/BannerSettings.vue +3 -0
- package/components/form/ClusterAppearance.vue +132 -0
- package/components/form/ColorInput.vue +1 -0
- package/components/form/Error.vue +3 -3
- package/components/form/FileSelector.vue +1 -0
- package/components/form/Footer.vue +2 -2
- package/components/form/GitPicker.vue +83 -38
- package/components/form/KeyValue.vue +69 -48
- package/components/form/LabeledSelect.vue +145 -41
- package/components/form/Labels.vue +3 -1
- package/components/form/NameNsDescription.vue +26 -9
- package/components/form/Password.vue +3 -1
- package/components/form/ResourceLabeledSelect.vue +187 -0
- package/components/form/ResourceTabs/index.vue +31 -15
- package/components/form/SecretSelector.vue +93 -18
- package/components/form/SelectOrCreateAuthSecret.vue +132 -59
- package/components/form/SimpleSecretSelector.vue +88 -28
- package/components/form/__tests__/BannerSettings.test.ts +53 -0
- package/components/form/__tests__/KeyValue.test.ts +120 -11
- package/components/form/__tests__/LabeledSelect.test.ts +0 -18
- package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +25 -15
- package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
- package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
- package/components/formatter/AppSummaryGraph.vue +2 -2
- package/components/formatter/Checked.vue +11 -3
- package/components/formatter/CloudCredPublicData.vue +30 -0
- package/components/formatter/ClusterLink.vue +2 -2
- package/components/formatter/ClusterProvider.vue +1 -18
- package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
- package/components/formatter/FleetSummaryGraph.vue +25 -12
- package/components/formatter/ImagePercentageBar.vue +0 -4
- package/components/formatter/IngressTarget.vue +18 -7
- package/components/formatter/Link.vue +2 -2
- package/components/formatter/LinkDetail.vue +2 -2
- package/components/formatter/LinkDetailImage.vue +2 -2
- package/components/formatter/LinkName.vue +2 -2
- package/components/formatter/LiveDuration.vue +1 -1
- package/components/formatter/PercentageBar.vue +1 -1
- package/components/formatter/PrincipalGroupBindings.vue +2 -2
- package/components/formatter/SecretType.vue +2 -2
- package/components/formatter/VirtualServiceGateways.vue +2 -2
- package/components/formatter/WorkloadDetailEndpoints.vue +12 -22
- package/components/formatter/__tests__/Checked.test.ts +19 -0
- package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
- package/components/formatter/__tests__/WorkloadDetailEndpoints.test.ts +81 -0
- package/components/nav/Group.vue +9 -7
- package/components/nav/Header.vue +84 -45
- package/components/nav/Jump.vue +19 -9
- package/components/nav/NamespaceFilter.vue +8 -1
- package/components/nav/TopLevelMenu.vue +391 -132
- package/components/nav/Type.vue +71 -106
- package/components/nav/WindowManager/ContainerLogs.vue +120 -19
- package/components/nav/WindowManager/ContainerShell.vue +6 -1
- package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
- package/components/nav/WindowManager/index.vue +11 -10
- package/components/nav/__tests__/TopLevelMenu.test.ts +400 -6
- package/components/nav/__tests__/Type.test.ts +322 -97
- package/components/nuxt/nuxt-child.js +9 -78
- package/components/nuxt/nuxt-error.vue +1 -1
- package/components/nuxt/nuxt-link.client.js +13 -95
- package/{layouts → components/templates}/blank.vue +1 -1
- package/{layouts → components/templates}/default.vue +11 -101
- package/{layouts → components/templates}/error.vue +13 -26
- package/{layouts → components/templates}/home.vue +4 -1
- package/{layouts → components/templates}/plain.vue +4 -1
- package/{layouts → components/templates}/standalone.vue +1 -5
- package/{layouts → components/templates}/unauthenticated.vue +2 -3
- package/composables/useCompactInput.test.ts +36 -0
- package/composables/useCompactInput.ts +20 -0
- package/composables/useLabeledFormElement.test.ts +135 -0
- package/composables/useLabeledFormElement.ts +138 -0
- package/config/harvester-manager-types.js +2 -0
- package/config/home-links.js +2 -1
- package/config/labels-annotations.js +2 -1
- package/config/middleware.js +0 -6
- package/config/pagination-table-headers.js +57 -0
- package/config/pod-security-admission.ts +1 -1
- package/config/private-label.js +21 -1
- package/config/product/auth.js +1 -0
- package/config/product/explorer.js +166 -45
- package/config/product/fleet.js +6 -1
- package/config/product/legacy.js +2 -11
- package/config/product/manager.js +51 -25
- package/config/query-params.js +2 -0
- package/config/roles.ts +23 -0
- package/config/router/index.js +23 -0
- package/config/router/navigation-guards/attempt-first-login.js +73 -0
- package/config/router/navigation-guards/authentication.js +63 -0
- package/config/router/navigation-guards/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 +31 -2
- package/config/store.js +8 -4
- package/config/system-namespaces.js +3 -0
- package/config/table-headers.js +66 -1
- package/config/types.js +35 -20
- package/config/uiplugins.js +10 -5
- package/core/plugin-helpers.js +4 -6
- package/core/plugin-routes.ts +56 -114
- package/core/plugin.ts +18 -11
- package/core/plugins-loader.js +7 -9
- package/core/plugins.js +289 -285
- package/core/types-provisioning.ts +7 -0
- package/creators/app/files/.eslintignore +0 -2
- package/creators/app/files/.gitlab-ci.yml +14 -0
- package/creators/app/files/.vscode/settings.json +0 -1
- package/creators/app/init +19 -0
- package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
- package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
- package/creators/pkg/init +32 -0
- package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +77 -0
- package/detail/__tests__/service.test.ts +62 -0
- package/detail/catalog.cattle.io.app.vue +1 -1
- package/detail/cis.cattle.io.clusterscan.vue +14 -3
- package/detail/fleet.cattle.io.bundle.vue +1 -1
- package/detail/fleet.cattle.io.cluster.vue +11 -1
- package/detail/fleet.cattle.io.gitrepo.vue +15 -9
- package/detail/namespace.vue +2 -2
- package/detail/networking.k8s.io.ingress.vue +52 -19
- package/detail/node.vue +22 -3
- package/detail/provisioning.cattle.io.cluster.vue +27 -9
- package/detail/service.vue +1 -1
- package/detail/workload/index.vue +1 -0
- 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/dialog/ScaleMachineDownDialog.vue +34 -17
- package/directives/clean-html.js +15 -0
- package/directives/clean-tooltip.js +32 -0
- package/directives/focus.js +41 -0
- package/directives/int-number.js +21 -0
- package/directives/positive-int-number.js +19 -0
- package/directives/trim-whitespace.js +19 -0
- package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
- package/edit/__tests__/kontainerDriver.test.ts +107 -0
- package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
- package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
- package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
- package/edit/__tests__/nodeDriver.test.ts +107 -0
- package/edit/__tests__/service.test.ts +85 -0
- package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
- package/edit/auth/AuthProviderWarningBanners.vue +34 -0
- package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
- package/edit/auth/__tests__/azuread.test.ts +241 -0
- package/edit/auth/__tests__/oidc.test.ts +137 -0
- package/edit/auth/azuread.vue +133 -31
- package/edit/auth/github.vue +5 -17
- package/edit/auth/googleoauth.vue +6 -23
- package/edit/auth/ldap/index.vue +5 -17
- package/edit/auth/oidc.vue +143 -42
- package/edit/auth/saml.vue +5 -14
- package/edit/catalog.cattle.io.clusterrepo.vue +177 -9
- package/edit/cis.cattle.io.clusterscan.vue +5 -2
- package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
- package/edit/cloudcredential.vue +28 -4
- package/edit/configmap.vue +10 -4
- package/edit/fleet.cattle.io.gitrepo.vue +3 -1
- package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
- package/edit/kontainerDriver.vue +65 -0
- package/edit/logging-flow/Match.vue +10 -9
- package/edit/logging-flow/index.vue +4 -19
- package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
- package/edit/logging.banzaicloud.io.output/index.vue +43 -26
- package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
- package/edit/management.cattle.io.project.vue +3 -53
- package/edit/management.cattle.io.setting.vue +52 -2
- package/edit/management.cattle.io.user.vue +2 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
- package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +1 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +2 -2
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +1 -1
- package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +15 -3
- package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +4 -1
- package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
- package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
- package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
- package/edit/networking.k8s.io.ingress/index.vue +64 -8
- package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
- package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
- package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +46 -7
- package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +1 -1
- package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
- package/edit/nodeDriver.vue +65 -0
- package/edit/persistentvolume/index.vue +2 -2
- package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +33 -16
- package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +276 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +3 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
- package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +77 -13
- package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +391 -0
- package/edit/provisioning.cattle.io.cluster/import.vue +4 -4
- package/edit/provisioning.cattle.io.cluster/index.vue +126 -51
- package/edit/provisioning.cattle.io.cluster/rke2.vue +325 -791
- package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
- package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +217 -0
- package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +123 -129
- package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
- package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
- package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +1 -0
- package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
- package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +190 -0
- package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +3 -0
- package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +148 -0
- package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
- package/edit/resources.cattle.io.backup.vue +139 -124
- package/edit/resources.cattle.io.restore.vue +146 -126
- package/edit/service.vue +13 -0
- package/edit/serviceaccount.vue +46 -4
- package/edit/token.vue +1 -0
- package/edit/workload/Upgrading.vue +3 -2
- package/edit/workload/__tests__/Job.test.ts +1 -3
- package/edit/workload/__tests__/Upgrading.test.ts +2 -2
- package/edit/workload/index.vue +2 -1
- package/edit/workload/mixins/workload.js +35 -2
- package/edit/workload/storage/emptyDir.vue +2 -2
- package/initialize/App.vue +75 -0
- package/initialize/app-extended.js +128 -0
- package/initialize/entry-helpers.js +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/catalog.cattle.io.app.vue +1 -0
- package/list/cis.cattle.io.clusterscan.vue +16 -10
- package/list/group.principal.vue +2 -2
- package/list/management.cattle.io.feature.vue +12 -14
- package/list/management.cattle.io.setting.vue +1 -0
- package/list/management.cattle.io.user.vue +13 -4
- package/list/networking.k8s.io.ingress.vue +36 -0
- package/list/node.vue +212 -73
- package/list/provisioning.cattle.io.cluster.vue +17 -4
- package/list/ui.cattle.io.navlink.vue +2 -2
- package/list/workload.vue +22 -0
- package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
- package/machine-config/__tests__/vmwarevsphere.test.ts +1 -3
- package/machine-config/amazonec2.vue +1 -1
- package/machine-config/azure.vue +2 -1
- package/machine-config/generic.vue +11 -15
- package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
- package/machine-config/vmwarevsphere.vue +31 -27
- package/middleware/authenticated.js +23 -380
- package/mixins/__tests__/chart.test.ts +48 -6
- package/mixins/__tests__/create-edit-view.test.ts +2 -3
- package/mixins/auth-config.js +5 -9
- package/mixins/brand.js +102 -96
- package/mixins/chart.js +27 -13
- package/mixins/create-edit-view/index.js +2 -2
- package/mixins/fetch.client.js +42 -48
- package/mixins/labeled-form-element.ts +27 -2
- package/mixins/page-actions.js +7 -5
- package/mixins/resource-fetch-api-pagination.js +304 -0
- package/mixins/resource-fetch-namespaced.js +1 -1
- package/mixins/resource-fetch.js +46 -5
- package/models/__tests__/cluster.test.ts +44 -0
- package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
- package/models/__tests__/management.cattle.io.cluster.test.ts +23 -0
- package/models/__tests__/management.cattle.io.node.ts +85 -0
- package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
- package/models/__tests__/namespace.test.ts +49 -9
- package/models/__tests__/provisioning.cattle.io.cluster.test.ts +241 -0
- package/models/__tests__/schema.tests.ts +24 -0
- package/models/__tests__/secret.test.ts +37 -0
- package/models/__tests__/steve-schema.test.ts +73 -0
- package/models/__tests__/storage.k8s.io.storageclass.test.ts +22 -0
- package/models/__tests__/workload.test.ts +91 -0
- package/models/catalog.cattle.io.app.js +8 -0
- package/models/catalog.cattle.io.clusterrepo.js +9 -1
- package/models/catalog.cattle.io.uiplugin.js +7 -8
- package/models/cis.cattle.io.clusterscan.js +29 -8
- package/models/cloudcredential.js +9 -1
- package/models/cluster/node.js +8 -4
- package/models/cluster/schema.js +6 -0
- package/models/cluster.js +33 -0
- package/models/cluster.x-k8s.io.machine.js +1 -1
- package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
- package/models/driver.js +62 -0
- package/models/fleet.cattle.io.cluster.js +27 -11
- package/models/fleet.cattle.io.gitrepo.js +66 -13
- package/models/helm.cattle.io.projecthelmchart.js +1 -1
- package/models/kontainerdriver.js +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 +16 -7
- package/models/management.cattle.io.globalrole.js +2 -0
- package/models/management.cattle.io.kontainerdriver.js +1 -0
- package/models/management.cattle.io.node.js +18 -14
- package/models/management.cattle.io.nodepool.js +17 -0
- package/models/management.cattle.io.project.js +0 -36
- package/models/management.cattle.io.setting.js +11 -7
- package/models/management.cattle.io.user.js +2 -2
- package/models/monitoring.coreos.com.receiver.js +3 -1
- package/models/monitoring.coreos.com.route.js +1 -1
- package/models/namespace.js +1 -1
- package/models/networking.k8s.io.ingress.js +2 -1
- package/models/nodedriver.js +68 -0
- package/models/pod.js +20 -0
- package/models/provisioning.cattle.io.cluster.js +125 -10
- package/models/schema.js +28 -7
- package/models/secret.js +126 -18
- package/models/service.js +2 -0
- package/models/steve-schema.ts +254 -0
- package/models/storage.k8s.io.storageclass.js +1 -1
- package/models/workload.js +17 -0
- package/models/workload.service.js +18 -0
- package/package.json +17 -14
- package/pages/about.vue +12 -6
- package/pages/account/create-key.vue +0 -1
- package/pages/account/index.vue +7 -3
- package/pages/auth/login.vue +106 -103
- package/pages/auth/logout.vue +2 -4
- package/pages/auth/setup.vue +92 -66
- package/pages/auth/verify.vue +30 -24
- package/pages/c/_cluster/apps/charts/__tests__/install.helper.test.ts +2 -17
- package/pages/c/_cluster/apps/charts/chart.vue +54 -9
- package/pages/c/_cluster/apps/charts/index.vue +99 -69
- package/pages/c/_cluster/apps/charts/install.helpers.js +2 -13
- package/pages/c/_cluster/apps/charts/install.vue +9 -9
- package/pages/c/_cluster/auth/config/_id.vue +0 -6
- package/pages/c/_cluster/auth/config/index.vue +15 -9
- package/pages/c/_cluster/auth/roles/index.vue +8 -10
- package/pages/c/_cluster/ecm/index.vue +0 -2
- package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
- package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
- package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
- package/pages/c/_cluster/explorer/index.vue +253 -91
- package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
- package/pages/c/_cluster/explorer/tools/index.vue +10 -6
- package/pages/c/_cluster/fleet/index.vue +89 -94
- package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
- package/pages/c/_cluster/longhorn/index.vue +52 -17
- package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
- package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
- package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
- package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +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/manager/pages/_page.vue +4 -5
- package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
- package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
- package/pages/c/_cluster/neuvector/index.vue +1 -0
- package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
- package/pages/c/_cluster/settings/banners.vue +86 -10
- package/pages/c/_cluster/settings/brand.vue +261 -38
- package/pages/c/_cluster/settings/index.vue +4 -6
- package/pages/c/_cluster/settings/links.vue +3 -2
- package/pages/c/_cluster/settings/performance.vue +71 -3
- package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
- package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +12 -8
- package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
- package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
- package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
- package/pages/c/_cluster/uiplugins/InstallDialog.vue +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 -54
- package/pages/diagnostic.vue +2 -2
- package/pages/fail-whale.vue +103 -42
- package/pages/home.vue +81 -24
- package/pages/prefs.vue +8 -4
- package/pages/support/index.vue +14 -10
- package/pkg/auto-import.js +1 -1
- package/plugins/axios.js +0 -36
- package/plugins/back-button.js +3 -5
- package/plugins/clean-html-directive.js +5 -30
- package/plugins/clean-html.js +53 -0
- package/plugins/clean-tooltip-directive.js +6 -31
- package/plugins/codemirror-loader.js +1 -1
- package/plugins/codemirror.js +41 -9
- package/plugins/dashboard-store/__tests__/mutations.test.ts +389 -0
- package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
- package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
- package/plugins/dashboard-store/actions.js +132 -25
- package/plugins/dashboard-store/classify.js +1 -18
- package/plugins/dashboard-store/getters.js +154 -44
- package/plugins/dashboard-store/index.js +0 -111
- package/plugins/dashboard-store/mutations.js +150 -52
- package/plugins/dashboard-store/resource-class.js +77 -127
- package/plugins/directives.js +6 -39
- package/plugins/ember-cookie.js +13 -0
- package/plugins/global-formatters.js +26 -5
- package/plugins/i18n.js +89 -55
- package/plugins/int-number.js +6 -20
- package/plugins/plugin.js +3 -3
- package/plugins/positive-int-number.js +6 -17
- package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +81 -10
- package/plugins/steve/__tests__/mutations.test.ts +49 -0
- package/plugins/steve/__tests__/resource-utils.test.ts +159 -0
- package/plugins/steve/__tests__/steve-class.test.ts +59 -0
- package/plugins/steve/__tests__/subscribe.spec.ts +4 -1
- package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
- package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
- package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
- package/plugins/steve/actions.js +3 -38
- package/plugins/steve/getters.js +164 -61
- package/plugins/steve/hybrid-class.js +5 -1
- package/plugins/steve/mutations.js +24 -3
- package/plugins/steve/norman-class.js +142 -2
- package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
- package/plugins/steve/resource-utils.ts +38 -0
- package/plugins/steve/schema.d.ts +22 -0
- package/plugins/steve/steve-class.js +22 -0
- package/plugins/steve/steve-pagination-utils.ts +368 -0
- package/plugins/steve/subscribe.js +17 -76
- package/plugins/trim-whitespace.js +6 -34
- package/plugins/vue-js-modal.js +1 -1
- package/public/index.html +1 -0
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +13 -8
- 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 +18 -1
- package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +57 -24
- 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 +6 -4
- 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.test.ts +270 -0
- package/rancher-components/components/StringList/StringList.vue +65 -26
- package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +69 -0
- package/scripts/clean +1 -1
- package/scripts/extension/bundle +19 -7
- package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
- package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
- package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
- package/scripts/extension/helm/package/Dockerfile +1 -1
- package/scripts/extension/helm/scripts/package +11 -3
- package/scripts/extension/helm/scripts/patch +27 -0
- package/scripts/extension/parse-tag-name +4 -4
- package/scripts/extension/publish +25 -14
- package/scripts/publish-shell.sh +11 -1
- package/scripts/serve-pkgs +0 -2
- package/scripts/test-plugins-build.sh +87 -11
- package/scripts/vue-migrate.js +683 -0
- package/server/har-file.js +183 -0
- package/store/__tests__/catalog.test.ts +224 -0
- package/store/__tests__/type-map.test.ts +1122 -0
- package/store/auth.js +23 -4
- package/store/aws.js +53 -6
- package/store/catalog.js +22 -6
- package/store/cru-resource.ts +26 -0
- package/store/customisation.js +35 -0
- package/store/features.js +7 -4
- package/store/i18n.js +11 -0
- package/store/index.js +139 -48
- package/store/plugins.js +8 -4
- package/store/prefs.js +33 -38
- package/store/type-map.js +288 -213
- package/store/type-map.utils.ts +226 -0
- package/tsconfig.json +34 -9
- package/tsconfig.paths.json +21 -0
- package/types/components/labeledSelect.ts +50 -0
- package/types/resources/settings.d.ts +32 -0
- package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
- package/types/shell/index.d.ts +1042 -767
- 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 -21
- package/utils/azure.js +24 -0
- package/utils/banners.js +103 -0
- package/utils/clipboard.js +5 -0
- package/utils/cluster.js +1 -1
- package/utils/config.js +4 -0
- package/utils/create-yaml.js +59 -28
- package/utils/custom-validators.js +0 -2
- package/utils/error.js +41 -1
- package/utils/formatter.js +5 -3
- package/utils/git.ts +1 -1
- package/utils/install-redirect.js +1 -1
- package/utils/kontainer.ts +186 -0
- package/utils/object.js +24 -0
- package/utils/pagination-utils.ts +154 -0
- package/utils/pod-security-admission.ts +1 -1
- package/utils/router.js +86 -0
- package/utils/settings.ts +46 -0
- package/utils/time.js +2 -1
- package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
- package/utils/url.ts +1 -1
- package/utils/validators/formRules/__tests__/index.test.ts +70 -4
- package/utils/validators/formRules/index.ts +15 -9
- package/utils/validators/index.js +1 -0
- package/utils/validators/setting.js +6 -10
- package/vue.config.js +377 -401
- package/.DS_Store +0 -0
- package/assets/images/providers/aks-black.svg +0 -28
- package/assets/images/providers/aks.svg +0 -31
- package/assets/styles/vendor/vue-js-modal.scss +0 -16
- package/components/ChartPsp.vue +0 -76
- package/components/EventsTable.vue +0 -67
- package/components/TabbedLinks/index.vue +0 -94
- package/components/__tests__/ChartPsp.test.ts +0 -75
- package/components/formatter/__tests__/ClusterProvider.test.ts +0 -28
- package/components/nuxt/nuxt-link.server.js +0 -16
- package/components/nuxt/nuxt.js +0 -101
- package/config/router.js +0 -408
- package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -237
- package/initialize/App.js +0 -198
- package/initialize/client.js +0 -875
- package/initialize/index.js +0 -364
- package/initialize/layouts.ts +0 -26
- package/middleware/i18n.js +0 -10
- package/middleware/unauthenticated.js +0 -22
- package/mixins/fetch.server.js +0 -73
- package/pages/c/_cluster/apps/index.vue +0 -17
- package/pages/c/_cluster/auth/index.vue +0 -19
- package/pages/c/_cluster/index.vue +0 -17
- package/pages/c/_cluster/legacy/index.vue +0 -22
- package/pages/c/_cluster/manager/index.vue +0 -22
- package/pages/c/_cluster/mcapps/index.vue +0 -21
- package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
- package/pages/c/index.vue +0 -9
- package/pages/rio/mesh.vue +0 -508
- package/plugins/dashboard-store/__tests__/mutations.spec.ts +0 -406
- package/plugins/dashboard-store/rehydrate-all.js +0 -44
- package/plugins/portal-vue.js +0 -4
- package/plugins/portal.js +0 -4
- package/plugins/resize.js +0 -5
- package/plugins/shortkey.js +0 -4
- package/plugins/tooltip.js +0 -4
- package/plugins/transitions.js +0 -4
- package/plugins/v-select.js +0 -4
- package/plugins/vue-clipboard2.js +0 -4
- package/rancher-components/components/BadgeState/BadgeState.spec.ts +0 -12
- package/tsconfig.default.json +0 -46
- package/utils/group.js +0 -70
- package/utils/nuxt.js +0 -659
- package/utils/router.scrollBehavior.js +0 -80
- /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
- /package/models/__tests__/{node.ts → node.test.ts} +0 -0
- /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
- /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
- /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
- /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
|
|
2
|
+
export interface SchemaAttributeColumn {
|
|
3
|
+
description: string,
|
|
4
|
+
field: string,
|
|
5
|
+
format: string,
|
|
6
|
+
name: string,
|
|
7
|
+
priority: number,
|
|
8
|
+
type: string,
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface SchemaAttribute {
|
|
12
|
+
columns: SchemaAttributeColumn[],
|
|
13
|
+
namespaced: boolean
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* At some point this will be properly typed, until then...
|
|
18
|
+
*/
|
|
19
|
+
export interface Schema {
|
|
20
|
+
id: string,
|
|
21
|
+
attributes: SchemaAttribute
|
|
22
|
+
}
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
import { DESCRIPTION } from '@shell/config/labels-annotations';
|
|
2
2
|
import HybridModel from './hybrid-class';
|
|
3
|
+
import { NEVER_ADD } from '@shell/utils/create-yaml';
|
|
4
|
+
import { deleteProperty } from '@shell/utils/object';
|
|
5
|
+
|
|
6
|
+
// Some fields that are removed for YAML (NEVER_ADD) are required via API
|
|
7
|
+
const STEVE_ADD = [
|
|
8
|
+
'metadata.resourceVersion',
|
|
9
|
+
'metadata.fields',
|
|
10
|
+
'metadata.clusterName',
|
|
11
|
+
'metadata.deletionGracePeriodSeconds',
|
|
12
|
+
'metadata.generateName',
|
|
13
|
+
];
|
|
14
|
+
const STEVE_NEVER_SAVE = NEVER_ADD.filter((na) => !STEVE_ADD.includes(na));
|
|
3
15
|
|
|
4
16
|
export default class SteveModel extends HybridModel {
|
|
5
17
|
get name() {
|
|
@@ -28,4 +40,14 @@ export default class SteveModel extends HybridModel {
|
|
|
28
40
|
|
|
29
41
|
this._description = value;
|
|
30
42
|
}
|
|
43
|
+
|
|
44
|
+
cleanForSave(data, forNew) {
|
|
45
|
+
const val = super.cleanForSave(data);
|
|
46
|
+
|
|
47
|
+
for (const field of STEVE_NEVER_SAVE) {
|
|
48
|
+
deleteProperty(val, field);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return val;
|
|
52
|
+
}
|
|
31
53
|
}
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
import { ActionFindPageArgs } from '@shell/types/store/dashboard-store.types';
|
|
2
|
+
import { PaginationParam, PaginationFilterField, PaginationParamProjectOrNamespace, PaginationParamFilter } from '@shell/types/store/pagination.types';
|
|
3
|
+
import { NAMESPACE_FILTER_ALL_SYSTEM, NAMESPACE_FILTER_ALL_USER, NAMESPACE_FILTER_P_FULL_PREFIX } from '@shell/utils/namespace-filter';
|
|
4
|
+
import Namespace from '@shell/models/namespace';
|
|
5
|
+
import { uniq } from '@shell/utils/array';
|
|
6
|
+
import {
|
|
7
|
+
CONFIG_MAP, MANAGEMENT, NAMESPACE, NODE, POD
|
|
8
|
+
} from '@shell/config/types';
|
|
9
|
+
import { Schema } from 'plugins/steve/schema';
|
|
10
|
+
|
|
11
|
+
class NamespaceProjectFilters {
|
|
12
|
+
/**
|
|
13
|
+
* User needs all resources.... except if there's some settings which should remove resources in specific circumstances
|
|
14
|
+
*/
|
|
15
|
+
protected handlePrefAndSettingFilter(allNamespaces: Namespace[], showDynamicRancherNamespaces: boolean, productHidesSystemNamespaces: boolean): PaginationParamFilter[] {
|
|
16
|
+
// These are AND'd together
|
|
17
|
+
// Not ns 1 AND ns 2
|
|
18
|
+
return allNamespaces.reduce((res, ns) => {
|
|
19
|
+
// Links to ns.isObscure and covers things like `c-`, `user-`, etc (see OBSCURE_NAMESPACE_PREFIX)
|
|
20
|
+
const hideObscure = showDynamicRancherNamespaces ? false : ns.isObscure;
|
|
21
|
+
// Links to ns.isSystem and covers things like ns with system annotation, hardcoded list, etc
|
|
22
|
+
const hideSystem = productHidesSystemNamespaces ? ns.isSystem : false;
|
|
23
|
+
|
|
24
|
+
if (hideObscure || hideSystem) {
|
|
25
|
+
res.push(PaginationParamFilter.createSingleField({
|
|
26
|
+
field: 'metadata.namespace', value: ns.name, equals: false
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return res;
|
|
31
|
+
}, [] as PaginationParamFilter[]);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* User needs either all user resources... or all system
|
|
36
|
+
*
|
|
37
|
+
* System resources revolve around the namespace's isSystem property
|
|
38
|
+
*
|
|
39
|
+
* Users resources are those not in system namespaces
|
|
40
|
+
*/
|
|
41
|
+
protected handleSystemOrUserFilter(allNamespaces: Namespace[], isAllSystem: boolean, isAllUser: boolean) {
|
|
42
|
+
const allSystem = allNamespaces.filter((ns) => ns.isSystem);
|
|
43
|
+
|
|
44
|
+
// > Neither of these use projectsOrNamespaces to avoid scenarios where the local cluster provides a namespace which has
|
|
45
|
+
// > a matching project... which could lead to results in the user project resource being included in the system filter
|
|
46
|
+
if (isAllSystem) {
|
|
47
|
+
// return resources in system ns 1 OR in system ns 2 ...
|
|
48
|
+
// &filter=metadata.namespace=system ns 1,metadata.namespace=system ns 2
|
|
49
|
+
return [PaginationParamFilter.createMultipleFields(
|
|
50
|
+
allSystem.map(
|
|
51
|
+
(ns) => new PaginationFilterField({ field: 'metadata.namespace', value: ns.name })
|
|
52
|
+
)
|
|
53
|
+
)];
|
|
54
|
+
} else { // if isAllUser
|
|
55
|
+
// return resources not in system ns 1 AND not in system ns 2 ...
|
|
56
|
+
// &filter=metadata.namespace!=system ns 1&filter=metadata.namespace!=system ns 2
|
|
57
|
+
return allSystem.map((ns) => PaginationParamFilter.createSingleField({
|
|
58
|
+
field: 'metadata.namespace', value: ns.name, equals: false
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* User needs resources in a set of projects or namespaces
|
|
65
|
+
*/
|
|
66
|
+
protected handleSelectionFilter(neu: string[], isLocalCluster: boolean) {
|
|
67
|
+
// User has one or more projects or namespaces. We can pass this straight through to projectsornamespaces
|
|
68
|
+
|
|
69
|
+
// return resources in project 1 OR namespace 2
|
|
70
|
+
// &projectsornamespaces=project 1,namespace 2
|
|
71
|
+
const projectsOrNamespaces = [
|
|
72
|
+
new PaginationParamProjectOrNamespace({ projectOrNamespace: neu })
|
|
73
|
+
];
|
|
74
|
+
|
|
75
|
+
if (isLocalCluster) {
|
|
76
|
+
// > As per `handleSystemOrUserFilter` above, we need to be careful of the local cluster where there's namespaces related to projects with the same id
|
|
77
|
+
// > In this case
|
|
78
|
+
// - We're including resources in the project and it's related namespace (via projectsornamespaces)
|
|
79
|
+
// - We're also then excluding resources in the related namespace (via below `filter`)
|
|
80
|
+
|
|
81
|
+
// Exclude resources NOT in projects namespace 1 AND not in projects namespace 2
|
|
82
|
+
// &filter=metadata.namespace!=pn1&filter=metadata.namespace!=pn2
|
|
83
|
+
return {
|
|
84
|
+
projectsOrNamespaces,
|
|
85
|
+
filters: neu
|
|
86
|
+
.filter((selection) => selection.startsWith(NAMESPACE_FILTER_P_FULL_PREFIX))
|
|
87
|
+
.map((projects) => PaginationParamFilter.createSingleField({
|
|
88
|
+
field: 'metadata.namespace', value: projects.replace(NAMESPACE_FILTER_P_FULL_PREFIX, ''), equals: false
|
|
89
|
+
}))
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return { projectsOrNamespaces, filters: [] };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Helper functions for steve pagination
|
|
99
|
+
*/
|
|
100
|
+
class StevePaginationUtils extends NamespaceProjectFilters {
|
|
101
|
+
/**
|
|
102
|
+
* Filtering with the vai cache supports specific fields
|
|
103
|
+
* 1) Those listed here
|
|
104
|
+
* 2) Those references in the schema's attributes.fields list (which is used by generic lists)
|
|
105
|
+
*/
|
|
106
|
+
static VALID_FIELDS: { [type: string]: { field: string, startsWith?: boolean }[]} = {
|
|
107
|
+
'': [// all types
|
|
108
|
+
{ field: 'metadata.name' },
|
|
109
|
+
{ field: 'metadata.namespace' },
|
|
110
|
+
// { field: 'id' }, // Pending API support
|
|
111
|
+
// { field: 'metadata.state.name' }, // Pending API support
|
|
112
|
+
{ field: 'metadata.creationTimestamp' },
|
|
113
|
+
],
|
|
114
|
+
[NODE]: [
|
|
115
|
+
{ field: 'status.nodeInfo.kubeletVersion' },
|
|
116
|
+
{ field: 'status.nodeInfo.operatingSystem' },
|
|
117
|
+
],
|
|
118
|
+
[POD]: [
|
|
119
|
+
{ field: 'spec.containers.image' },
|
|
120
|
+
{ field: 'spec.nodeName' },
|
|
121
|
+
],
|
|
122
|
+
[MANAGEMENT.NODE]: [
|
|
123
|
+
{ field: 'status.nodeName' },
|
|
124
|
+
],
|
|
125
|
+
[CONFIG_MAP]: [
|
|
126
|
+
{ field: 'metadata.labels[harvesterhci.io/cloud-init-template]' }
|
|
127
|
+
],
|
|
128
|
+
[NAMESPACE]: [
|
|
129
|
+
{ field: 'metadata.labels[field.cattle.io/projectId]' }
|
|
130
|
+
]
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
private convertArrayPath(path: string): string {
|
|
134
|
+
if (path.startsWith('metadata.fields.')) {
|
|
135
|
+
return `metadata.fields[${ path.substring(16) }]`;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return path;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
public createSortForPagination(sortByPath: string): string {
|
|
142
|
+
return this.convertArrayPath(sortByPath);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Given the selection of projects or namespaces come up with `filter` and `projectsornamespace` query params
|
|
147
|
+
*/
|
|
148
|
+
public createParamsFromNsFilter({
|
|
149
|
+
allNamespaces,
|
|
150
|
+
selection,
|
|
151
|
+
isAllNamespaces,
|
|
152
|
+
isLocalCluster,
|
|
153
|
+
showDynamicRancherNamespaces,
|
|
154
|
+
productHidesSystemNamespaces,
|
|
155
|
+
}: {
|
|
156
|
+
allNamespaces: Namespace[],
|
|
157
|
+
selection: string[],
|
|
158
|
+
/**
|
|
159
|
+
* There is no user provided filter
|
|
160
|
+
*/
|
|
161
|
+
isAllNamespaces: boolean,
|
|
162
|
+
/**
|
|
163
|
+
* Weird things be happening if the target cluster is local / upstream. Uses this to check what cluster we're in
|
|
164
|
+
*/
|
|
165
|
+
isLocalCluster: boolean,
|
|
166
|
+
/**
|
|
167
|
+
* Links to ns.isObscure and covers things like `c-`, `user-`, etc (see OBSCURE_NAMESPACE_PREFIX)
|
|
168
|
+
*/
|
|
169
|
+
showDynamicRancherNamespaces: boolean,
|
|
170
|
+
/**
|
|
171
|
+
* Links to ns.isSystem and covers things like ns with system annotation, hardcoded list, etc
|
|
172
|
+
*/
|
|
173
|
+
productHidesSystemNamespaces: boolean,
|
|
174
|
+
}): {
|
|
175
|
+
projectsOrNamespaces: PaginationParamProjectOrNamespace[],
|
|
176
|
+
filters: PaginationParamFilter[]
|
|
177
|
+
} {
|
|
178
|
+
// Hold up, why are we doing yet another way to convert the user's project / namespace filter to a set of something?
|
|
179
|
+
// - When doing this for local pagination `getActiveNamespaces` provides a full list of applicable namespaces.
|
|
180
|
+
// Lists then filter resource locally using those namespaces
|
|
181
|
+
// - Pagination cannot take this approach of 'gimme all resources in these namespaces' primarily for the 'Only User Namespaces' case
|
|
182
|
+
// - User could have 2k namespaces. This would result in 2k+ namespaces added to the url (namespace=1,namespace=2,namespace=3, etc)
|
|
183
|
+
// - Instead we do
|
|
184
|
+
// - All but not given settings - Gimme resources NOT in system or obscure namespaces
|
|
185
|
+
// - Only System Namespaces - Gimme resources in the system namespaces (which shouldn't be many namespaces)
|
|
186
|
+
// - Only User Namespaces - Gimme resources NOT in system namespaces
|
|
187
|
+
// - User selection - Gimme resources in specific Projects or Namespaces
|
|
188
|
+
if (isAllNamespaces && (showDynamicRancherNamespaces && !productHidesSystemNamespaces)) {
|
|
189
|
+
// No-op. Everything is returned
|
|
190
|
+
return {
|
|
191
|
+
projectsOrNamespaces: [],
|
|
192
|
+
filters: []
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// used to return resources in / not in projects/namespaces (entries are checked in both types)
|
|
197
|
+
// &projectsornamespaces=project 1,namespace 2
|
|
198
|
+
let projectsOrNamespaces: PaginationParamProjectOrNamespace[] = [];
|
|
199
|
+
// used to return resources in / not in namespaces
|
|
200
|
+
// &filter=metadata.namespace=abc
|
|
201
|
+
let filters: PaginationParamFilter[] = [];
|
|
202
|
+
|
|
203
|
+
if (!showDynamicRancherNamespaces || productHidesSystemNamespaces) {
|
|
204
|
+
// We need to hide dynamic namespaces ('c-', 'p-', etc) OR system namespaces
|
|
205
|
+
filters = this.handlePrefAndSettingFilter(allNamespaces, showDynamicRancherNamespaces, productHidesSystemNamespaces);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const isAllSystem = selection[0] === NAMESPACE_FILTER_ALL_SYSTEM;
|
|
209
|
+
const isAllUser = selection[0] === NAMESPACE_FILTER_ALL_USER;
|
|
210
|
+
|
|
211
|
+
if (selection.length === 1 && (isAllSystem || isAllUser)) {
|
|
212
|
+
// Filter by resources either in or not in system namespaces
|
|
213
|
+
filters.push(...this.handleSystemOrUserFilter(allNamespaces, isAllSystem, isAllUser ));
|
|
214
|
+
} else {
|
|
215
|
+
// User has one or more projects or namespaces
|
|
216
|
+
const res = this.handleSelectionFilter(selection, isLocalCluster);
|
|
217
|
+
|
|
218
|
+
projectsOrNamespaces = res.projectsOrNamespaces;
|
|
219
|
+
filters.push(...res.filters);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
return {
|
|
223
|
+
projectsOrNamespaces,
|
|
224
|
+
filters
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
public createParamsForPagination(schema: Schema, opt: ActionFindPageArgs): string | undefined {
|
|
229
|
+
if (!opt.pagination) {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
const params: string[] = [];
|
|
234
|
+
const namespaceParam = this.convertPaginationParams(schema, opt.pagination.projectsOrNamespaces);
|
|
235
|
+
|
|
236
|
+
if (namespaceParam) {
|
|
237
|
+
params.push(namespaceParam);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if (opt.pagination.page) {
|
|
241
|
+
params.push(`page=${ opt.pagination.page }`);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if (opt.pagination.pageSize) {
|
|
245
|
+
params.push(`pagesize=${ opt.pagination.pageSize }`);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if (opt.pagination.sort?.length) {
|
|
249
|
+
const validateFields = {
|
|
250
|
+
checked: new Array<string>(),
|
|
251
|
+
invalid: new Array<string>(),
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
const joined = opt.pagination.sort
|
|
255
|
+
.map((s) => {
|
|
256
|
+
this.validateField(validateFields, schema, s.field);
|
|
257
|
+
|
|
258
|
+
return `${ s.asc ? '' : '-' }${ this.convertArrayPath(s.field) }`;
|
|
259
|
+
})
|
|
260
|
+
.join(',');
|
|
261
|
+
|
|
262
|
+
params.push(`sort=${ joined }`);
|
|
263
|
+
|
|
264
|
+
if (validateFields.invalid.length) {
|
|
265
|
+
console.warn(`Pagination API does not support sorting '${ schema.id }' by the requested fields: ${ uniq(validateFields.invalid).join(', ') }`); // eslint-disable-line no-console
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
if (opt.pagination.filters?.length) {
|
|
270
|
+
const filters = this.convertPaginationParams(schema, opt.pagination.filters);
|
|
271
|
+
|
|
272
|
+
if (filters) {
|
|
273
|
+
params.push(filters);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Note - There is a `limit` property that is by default 100,000. This can be disabled by using `limit=-1`,
|
|
278
|
+
// but we shouldn't be fetching any pages big enough to exceed the default
|
|
279
|
+
|
|
280
|
+
return params.join('&');
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Check if the API supports filtering by this field
|
|
285
|
+
*/
|
|
286
|
+
private validateField(state: { checked: string[], invalid: string[]}, schema: Schema, field?: string) {
|
|
287
|
+
if (!field) {
|
|
288
|
+
return; // no field, so not invalid
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
if (state.checked.includes(field)) {
|
|
292
|
+
return; // already checked, exit early
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
state.checked.push(field);
|
|
296
|
+
|
|
297
|
+
// First check in our hardcoded list of supported filters
|
|
298
|
+
if ([
|
|
299
|
+
StevePaginationUtils.VALID_FIELDS[''], // Global
|
|
300
|
+
StevePaginationUtils.VALID_FIELDS[schema.id], // Type specific
|
|
301
|
+
].find((fields) => fields?.find((f) => {
|
|
302
|
+
if (f.startsWith) {
|
|
303
|
+
if (field.startsWith(f.field)) {
|
|
304
|
+
return true;
|
|
305
|
+
}
|
|
306
|
+
} else {
|
|
307
|
+
return field === f.field;
|
|
308
|
+
}
|
|
309
|
+
}))) {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// Then check in schema (the api automatically supports these)
|
|
314
|
+
if (!!schema?.attributes.columns.find(
|
|
315
|
+
// This isn't the most performant, but the string is tiny
|
|
316
|
+
(at) => at.field.replace('$.', '').replace('[', '.').replace(']', '') === field
|
|
317
|
+
)) {
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
state.invalid.push(field);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Convert our {@link PaginationParam} definition of params to a set of url params
|
|
326
|
+
*/
|
|
327
|
+
private convertPaginationParams(schema: Schema, filters: PaginationParam[] = []): string {
|
|
328
|
+
const validateFields = {
|
|
329
|
+
checked: new Array<string>(),
|
|
330
|
+
invalid: new Array<string>(),
|
|
331
|
+
};
|
|
332
|
+
const filterStrings = filters
|
|
333
|
+
.filter((filter) => !!filter.fields.length)
|
|
334
|
+
.map((filter) => {
|
|
335
|
+
const joined = filter.fields
|
|
336
|
+
.map((field) => {
|
|
337
|
+
if (field.field) {
|
|
338
|
+
// Check if the API supports filtering by this field
|
|
339
|
+
this.validateField(validateFields, schema, field.field);
|
|
340
|
+
|
|
341
|
+
const exactPartial = field.exact ? `'${ field.value }'` : field.value;
|
|
342
|
+
|
|
343
|
+
return `${ this.convertArrayPath(field.field) }${ field.equals ? '=' : '!=' }${ exactPartial }`;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
return field.value;
|
|
347
|
+
})
|
|
348
|
+
.join(','); // This means OR
|
|
349
|
+
|
|
350
|
+
return `${ filter.param }${ filter.equals ? '=' : '!=' }${ joined }`;
|
|
351
|
+
});
|
|
352
|
+
const unique = filterStrings.reduce((res, s) => {
|
|
353
|
+
res[s] = true;
|
|
354
|
+
|
|
355
|
+
return res;
|
|
356
|
+
}, { } as {[filterString: string] : boolean });
|
|
357
|
+
|
|
358
|
+
const res = Object.keys(unique).join('&'); // This means AND
|
|
359
|
+
|
|
360
|
+
if (validateFields.invalid.length) {
|
|
361
|
+
console.warn(`Pagination API does not support filtering '${ schema.id }' by the requested fields: ${ uniq(validateFields.invalid).join(', ') }`); // eslint-disable-line no-console
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
return res;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
export default new StevePaginationUtils();
|
|
@@ -32,8 +32,9 @@ import { escapeHtml } from '@shell/utils/string';
|
|
|
32
32
|
import { keyForSubscribe } from '@shell/plugins/steve/resourceWatcher';
|
|
33
33
|
import { waitFor } from '@shell/utils/async';
|
|
34
34
|
import { WORKER_MODES } from './worker';
|
|
35
|
-
import
|
|
35
|
+
import acceptOrRejectSocketMessage from './accept-or-reject-socket-message';
|
|
36
36
|
import { BLANK_CLUSTER, STORE } from '@shell/store/store-types.js';
|
|
37
|
+
import paginationUtils from '@shell/utils/pagination-utils';
|
|
37
38
|
|
|
38
39
|
// minimum length of time a disconnect notification is shown
|
|
39
40
|
const MINIMUM_TIME_NOTIFIED = 3000;
|
|
@@ -131,7 +132,7 @@ export async function createWorker(store, ctx) {
|
|
|
131
132
|
}
|
|
132
133
|
},
|
|
133
134
|
batchChanges: (batch) => {
|
|
134
|
-
dispatch('batchChanges',
|
|
135
|
+
dispatch('batchChanges', acceptOrRejectSocketMessage.validateBatchChange(ctx, batch));
|
|
135
136
|
},
|
|
136
137
|
dispatch: (msg) => {
|
|
137
138
|
dispatch(`ws.${ msg.name }`, msg);
|
|
@@ -205,66 +206,6 @@ export function equivalentWatch(a, b) {
|
|
|
205
206
|
return true;
|
|
206
207
|
}
|
|
207
208
|
|
|
208
|
-
/**
|
|
209
|
-
* Sockets will not be able to subscribe to more than one namespace. If this is requested we pretend to handle it
|
|
210
|
-
* - Changes to all resources are monitored (no namespace provided in sub)
|
|
211
|
-
* - We ignore any events not from a required namespace (we have the conversion of project --> namespaces already)
|
|
212
|
-
*/
|
|
213
|
-
const namespaceHandler = {
|
|
214
|
-
/**
|
|
215
|
-
* Note - namespace can be a list of projects or namespaces
|
|
216
|
-
*/
|
|
217
|
-
subscribeNamespace: (namespace) => {
|
|
218
|
-
if (pAndNFiltering.isApplicable({ namespaced: namespace }) && namespace.length) {
|
|
219
|
-
return undefined; // AKA sub to everything
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
return namespace;
|
|
223
|
-
},
|
|
224
|
-
|
|
225
|
-
validChange: ({ getters, rootGetters }, type, data) => {
|
|
226
|
-
const haveNamespace = getters.haveNamespace(type);
|
|
227
|
-
|
|
228
|
-
if (haveNamespace?.length) {
|
|
229
|
-
const namespaces = rootGetters.activeNamespaceCache;
|
|
230
|
-
|
|
231
|
-
if (!namespaces[data.metadata.namespace]) {
|
|
232
|
-
return false;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
return true;
|
|
237
|
-
},
|
|
238
|
-
|
|
239
|
-
validateBatchChange: ({ getters, rootGetters }, batch) => {
|
|
240
|
-
const namespaces = rootGetters.activeNamespaceCache;
|
|
241
|
-
|
|
242
|
-
Object.entries(batch).forEach(([type, entries]) => {
|
|
243
|
-
const haveNamespace = getters.haveNamespace(type);
|
|
244
|
-
|
|
245
|
-
if (!haveNamespace?.length) {
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
const schema = getters.schemaFor(type);
|
|
250
|
-
|
|
251
|
-
if (!schema?.attributes?.namespaced) {
|
|
252
|
-
return;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
Object.keys(entries).forEach((id) => {
|
|
256
|
-
const namespace = id.split('/')[0];
|
|
257
|
-
|
|
258
|
-
if (!namespace || !namespaces[namespace]) {
|
|
259
|
-
delete entries[id];
|
|
260
|
-
}
|
|
261
|
-
});
|
|
262
|
-
});
|
|
263
|
-
|
|
264
|
-
return batch;
|
|
265
|
-
}
|
|
266
|
-
};
|
|
267
|
-
|
|
268
209
|
function queueChange({ getters, state, rootGetters }, { data, revision }, load, label) {
|
|
269
210
|
const type = getters.normalizeType(data.type);
|
|
270
211
|
|
|
@@ -278,7 +219,7 @@ function queueChange({ getters, state, rootGetters }, { data, revision }, load,
|
|
|
278
219
|
|
|
279
220
|
// console.log(`${ label } Event [${ state.config.namespace }]`, data.type, data.id); // eslint-disable-line no-console
|
|
280
221
|
|
|
281
|
-
if (!
|
|
222
|
+
if (!acceptOrRejectSocketMessage.validChange({ getters, rootGetters }, type, data)) {
|
|
282
223
|
return;
|
|
283
224
|
}
|
|
284
225
|
|
|
@@ -333,10 +274,6 @@ const sharedActions = {
|
|
|
333
274
|
|
|
334
275
|
commit('setWantSocket', true);
|
|
335
276
|
|
|
336
|
-
if ( process.server ) {
|
|
337
|
-
return;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
277
|
state.debugSocket && console.info(`Subscribe [${ getters.storeName }]`); // eslint-disable-line no-console
|
|
341
278
|
|
|
342
279
|
const url = `${ state.config.baseUrl }/subscribe`;
|
|
@@ -426,7 +363,7 @@ const sharedActions = {
|
|
|
426
363
|
type, selector, id, revision, namespace, stop, force
|
|
427
364
|
} = params;
|
|
428
365
|
|
|
429
|
-
namespace =
|
|
366
|
+
namespace = acceptOrRejectSocketMessage.subscribeNamespace(namespace);
|
|
430
367
|
type = getters.normalizeType(type);
|
|
431
368
|
|
|
432
369
|
if (rootGetters['type-map/isSpoofed'](type)) {
|
|
@@ -466,7 +403,13 @@ const sharedActions = {
|
|
|
466
403
|
return;
|
|
467
404
|
}
|
|
468
405
|
|
|
469
|
-
|
|
406
|
+
// isSteveCacheEnabled check is temporary and will be removed once Part 3 of https://github.com/rancher/dashboard/pull/10349 is resolved by backend
|
|
407
|
+
// Steve cache backed api does not return a revision, so `revision` here is always undefined
|
|
408
|
+
// Which means we find a revision within a resource itself and use it in the watch
|
|
409
|
+
// That revision is probably too old and results in a watch error
|
|
410
|
+
// Watch errors mean we make a http request to get latest revision (which is still missing) and try to re-watch with it...
|
|
411
|
+
// etc
|
|
412
|
+
if (typeof revision === 'undefined' && !paginationUtils.isSteveCacheEnabled({ rootGetters })) {
|
|
470
413
|
revision = getters.nextResourceVersion(type, id);
|
|
471
414
|
}
|
|
472
415
|
|
|
@@ -513,7 +456,7 @@ const sharedActions = {
|
|
|
513
456
|
const { commit, getters, dispatch } = ctx;
|
|
514
457
|
|
|
515
458
|
if (getters['schemaFor'](type)) {
|
|
516
|
-
namespace =
|
|
459
|
+
namespace = acceptOrRejectSocketMessage.subscribeNamespace(namespace);
|
|
517
460
|
|
|
518
461
|
const obj = {
|
|
519
462
|
type,
|
|
@@ -610,7 +553,7 @@ const defaultActions = {
|
|
|
610
553
|
},
|
|
611
554
|
|
|
612
555
|
rehydrateSubscribe({ state, dispatch }) {
|
|
613
|
-
if (
|
|
556
|
+
if ( state.wantSocket && !state.socket ) {
|
|
614
557
|
dispatch('subscribe');
|
|
615
558
|
}
|
|
616
559
|
},
|
|
@@ -741,11 +684,9 @@ const defaultActions = {
|
|
|
741
684
|
}
|
|
742
685
|
|
|
743
686
|
// Try resending any frames that were attempted to be sent while the socket was down, once.
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
dispatch('sendImmediate', obj);
|
|
748
|
-
}
|
|
687
|
+
for ( const obj of state.pendingFrames.slice() ) {
|
|
688
|
+
commit('dequeuePendingFrame', obj);
|
|
689
|
+
dispatch('sendImmediate', obj);
|
|
749
690
|
}
|
|
750
691
|
},
|
|
751
692
|
|
|
@@ -1,37 +1,9 @@
|
|
|
1
1
|
import Vue from 'vue';
|
|
2
|
+
import trimWhitespaceDirective from '@shell/directives/trim-whitespace';
|
|
2
3
|
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
export default trimWhitespaceDirective;
|
|
5
|
+
/* eslint-disable-next-line no-console */
|
|
6
|
+
console.warn(`Importing trimWhitespaceDirective from plugins has been deprecated, use shell/directives/trim-whitespace.js instead.
|
|
7
|
+
Make sure to invoke it using Vue.directive('trim-whitespace', trimWhitespaceDirective ) to maintain compatibility.`);
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
node.remove();
|
|
10
|
-
} else if ( trimmed !== node.data ) {
|
|
11
|
-
node.data = trimmed;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export function trimWhitespaceSsr(el, dir) {
|
|
18
|
-
// This causes server<->client dom mismatches sometimes... gave up for now.
|
|
19
|
-
/*
|
|
20
|
-
for ( const node of (el.children || []) ) {
|
|
21
|
-
if ( node.text ) {
|
|
22
|
-
const trimmed = node.text.trim();
|
|
23
|
-
|
|
24
|
-
if ( trimmed !== node.text ) {
|
|
25
|
-
node.text = trimmed;
|
|
26
|
-
}
|
|
27
|
-
} else if ( node.children ) {
|
|
28
|
-
trimWhitespaceSsr(node);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
*/
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
Vue.directive('trim-whitespace', {
|
|
35
|
-
inserted: trimWhitespace,
|
|
36
|
-
componentUpdated: trimWhitespace
|
|
37
|
-
});
|
|
9
|
+
Vue.directive('trim-whitespace', trimWhitespaceDirective );
|
package/plugins/vue-js-modal.js
CHANGED
package/public/index.html
CHANGED
|
@@ -355,15 +355,20 @@ export default defineComponent({
|
|
|
355
355
|
:hover="hoverTooltip"
|
|
356
356
|
:value="validationMessage"
|
|
357
357
|
/>
|
|
358
|
-
<
|
|
359
|
-
v-if="cronHint"
|
|
360
|
-
class="cron-label"
|
|
361
|
-
>{{ cronHint }}</label>
|
|
362
|
-
<label
|
|
363
|
-
v-if="subLabel"
|
|
364
|
-
v-clean-html="subLabel"
|
|
358
|
+
<div
|
|
359
|
+
v-if="cronHint || subLabel"
|
|
365
360
|
class="sub-label"
|
|
366
|
-
|
|
361
|
+
>
|
|
362
|
+
<div
|
|
363
|
+
v-if="cronHint"
|
|
364
|
+
>
|
|
365
|
+
{{ cronHint }}
|
|
366
|
+
</div>
|
|
367
|
+
<div
|
|
368
|
+
v-if="subLabel"
|
|
369
|
+
v-clean-html="subLabel"
|
|
370
|
+
/>
|
|
371
|
+
</div>
|
|
367
372
|
</div>
|
|
368
373
|
</template>
|
|
369
374
|
<style scoped lang="scss">
|