dashboard-shell-shell 3.0.2-test.20250913 → 3.0.5-test.2
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 +3 -0
- package/assets/icons/demo.css:Zone.Identifier +0 -0
- package/assets/icons/demo_index.html:Zone.Identifier +0 -0
- package/assets/icons/iconfont.css:Zone.Identifier +0 -0
- package/assets/icons/iconfont.js:Zone.Identifier +0 -0
- package/assets/icons/iconfont.json:Zone.Identifier +0 -0
- package/assets/icons/iconfont.ttf:Zone.Identifier +0 -0
- package/assets/icons/iconfont.woff2:Zone.Identifier +0 -0
- package/assets/icons/iconfont.woff:Zone.Identifier +0 -0
- package/assets/images/icons/document.svg +3 -0
- package/assets/images/key.svg +17 -0
- package/assets/images/providers/sks.svg +1 -0
- package/assets/images/vendor/cognito.svg +1 -0
- package/assets/styles/app.scss +3 -0
- package/assets/styles/base/_basic.scss +10 -0
- package/assets/styles/base/_spacing.scss +29 -0
- package/assets/styles/base/_variables.scss +16 -10
- package/assets/styles/global/_labeled-input.scss +1 -1
- package/assets/styles/global/_layout.scss +1 -1
- package/assets/styles/themes/_dark.scss +30 -0
- package/assets/styles/themes/_light.scss +80 -2
- package/assets/translations/en-us.yaml +822 -105
- package/assets/translations/zh-hans.yaml +13 -3
- package/chart/__tests__/S3.test.ts +2 -1
- package/chart/monitoring/index.vue +1 -1
- package/cloud-credential/gcp.vue +9 -1
- package/components/ActionMenuShell.vue +3 -7
- package/components/AppModal.vue +9 -28
- package/components/AsyncButton.vue +2 -0
- package/components/BrandImage.vue +0 -21
- package/components/Certificates.vue +5 -0
- package/components/CodeMirror.vue +3 -3
- package/components/CommunityLinks.vue +3 -58
- package/components/ConfigMapSettings/Settings.vue +377 -0
- package/components/ConfigMapSettings/index.vue +354 -0
- package/components/CruResource.vue +103 -16
- package/components/DetailText.vue +61 -11
- package/components/Drawer/Chrome.vue +115 -0
- package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +61 -0
- package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +48 -0
- package/components/Drawer/ResourceDetailDrawer/__tests__/ConfigTab.test.ts +54 -0
- package/components/Drawer/ResourceDetailDrawer/__tests__/YamlTab.test.ts +80 -0
- package/components/Drawer/ResourceDetailDrawer/__tests__/composables.test.ts +106 -0
- package/components/Drawer/ResourceDetailDrawer/__tests__/helpers.test.ts +42 -0
- package/components/Drawer/ResourceDetailDrawer/composables.ts +53 -0
- package/components/Drawer/ResourceDetailDrawer/helpers.ts +10 -0
- package/components/Drawer/ResourceDetailDrawer/index.vue +123 -0
- package/components/ExplorerProjectsNamespaces.vue +46 -29
- package/components/FilterPanel.vue +156 -0
- package/components/FixedBanner.vue +19 -5
- package/components/{fleet/ForceDirectedTreeChart/index.vue → ForceDirectedTreeChart.vue} +47 -41
- package/components/GrowlManager.vue +16 -15
- package/components/IconOrSvg.vue +19 -35
- package/components/KeyValueView.vue +1 -1
- package/components/LandingPagePreference.vue +2 -0
- package/components/Loading.vue +1 -1
- package/components/LocaleSelector.vue +10 -2
- package/components/PaginatedResourceTable.vue +53 -1
- package/components/ProgressBarMulti.vue +1 -0
- package/components/PromptModal.vue +38 -7
- package/components/PromptRemove.vue +5 -1
- package/components/PromptRestore.vue +22 -44
- package/components/RelatedResources.vue +4 -12
- package/components/Resource/Detail/Additional.vue +46 -0
- package/components/Resource/Detail/Card/PodsCard/Bubble.vue +13 -0
- package/components/Resource/Detail/Card/PodsCard/composable.ts +30 -0
- package/components/Resource/Detail/Card/PodsCard/index.vue +118 -0
- package/components/Resource/Detail/Card/ResourceUsageCard/composable.ts +51 -0
- package/components/Resource/Detail/Card/ResourceUsageCard/index.vue +79 -0
- package/components/Resource/Detail/Card/Scaler.vue +89 -0
- package/components/Resource/Detail/Card/StateCard/composables.ts +112 -0
- package/components/Resource/Detail/Card/StateCard/index.vue +39 -0
- package/components/Resource/Detail/Card/VerticalGap.vue +11 -0
- package/components/Resource/Detail/Card/__tests__/Card.test.ts +36 -0
- package/components/Resource/Detail/Card/__tests__/PodsCard.test.ts +84 -0
- package/components/Resource/Detail/Card/__tests__/ResourceUsageCard.test.ts +72 -0
- package/components/Resource/Detail/Card/__tests__/Scaler.test.ts +87 -0
- package/components/Resource/Detail/Card/__tests__/StateCard.test.ts +53 -0
- package/components/Resource/Detail/Card/__tests__/VerticalGap.test.ts +14 -0
- package/components/Resource/Detail/Card/__tests__/index.test.ts +36 -0
- package/components/Resource/Detail/Card/index.vue +56 -0
- package/components/Resource/Detail/Metadata/Annotations/__tests__/index.test.ts +19 -0
- package/components/Resource/Detail/Metadata/Annotations/composable.ts +12 -0
- package/components/Resource/Detail/Metadata/Annotations/index.vue +31 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +223 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/index.test.ts +103 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/composable.ts +72 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +317 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +140 -0
- package/components/Resource/Detail/Metadata/KeyValue.vue +140 -0
- package/components/Resource/Detail/Metadata/Labels/__tests__/index.test.ts +18 -0
- package/components/Resource/Detail/Metadata/Labels/composable.ts +12 -0
- package/components/Resource/Detail/Metadata/Labels/index.vue +31 -0
- package/components/Resource/Detail/Metadata/Rectangle.vue +34 -0
- package/components/Resource/Detail/Metadata/__tests__/KeyValue.test.ts +107 -0
- package/components/Resource/Detail/Metadata/__tests__/Rectangle.test.ts +24 -0
- package/components/Resource/Detail/Metadata/__tests__/composables.test.ts +75 -0
- package/components/Resource/Detail/Metadata/__tests__/index.test.ts +91 -0
- package/components/Resource/Detail/Metadata/composables.ts +81 -0
- package/components/Resource/Detail/Metadata/index.vue +88 -0
- package/components/Resource/Detail/Page.vue +37 -0
- package/components/Resource/Detail/PercentageBar.vue +40 -0
- package/components/Resource/Detail/ResourceRow.vue +138 -0
- package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/composables.test.ts +29 -0
- package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/index.test.ts +48 -0
- package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/composables.ts +31 -0
- package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/index.vue +50 -0
- package/components/Resource/Detail/ResourceTabs/KnownHostsTab/__tests__/composables.test.ts +66 -0
- package/components/Resource/Detail/ResourceTabs/KnownHostsTab/composables.ts +21 -0
- package/components/Resource/Detail/ResourceTabs/KnownHostsTab/index.vue +31 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/Basic.vue +45 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/BasicAuth.vue +31 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/Certificate.vue +31 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/Registry.vue +22 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/ServiceAccountToken.vue +31 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/Ssh.vue +32 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Basic.test.ts +40 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/BasicAuth.test.ts +33 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Certificate.test.ts +33 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Registry.test.ts +27 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/ServiceAccountToken.test.ts +33 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Ssh.test.ts +33 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/auth-types.test.ts +186 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/composables.test.ts +102 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types.ts +109 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/composeables.ts +52 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/index.vue +71 -0
- package/components/Resource/Detail/SpacedRow.vue +14 -0
- package/components/Resource/Detail/StatusBar.vue +59 -0
- package/components/Resource/Detail/StatusRow.vue +61 -0
- package/components/Resource/Detail/TitleBar/Title.vue +14 -0
- package/components/Resource/Detail/TitleBar/Top.vue +14 -0
- package/components/Resource/Detail/TitleBar/__tests__/Title.test.ts +17 -0
- package/components/Resource/Detail/TitleBar/__tests__/Top.test.ts +17 -0
- package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +63 -0
- package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +142 -0
- package/components/Resource/Detail/TitleBar/composables.ts +46 -0
- package/components/Resource/Detail/TitleBar/index.vue +204 -0
- package/components/Resource/Detail/Top/index.vue +34 -0
- package/components/Resource/Detail/__tests__/Page.test.ts +32 -0
- package/components/Resource/Detail/composables.ts +45 -0
- package/components/ResourceDetail/Masthead/__tests__/index.test.ts +70 -0
- package/components/ResourceDetail/{__tests__/Masthead.test.ts → Masthead/__tests__/legacy.test.ts} +3 -3
- package/components/ResourceDetail/Masthead/index.vue +65 -0
- package/components/ResourceDetail/Masthead/latest.vue +44 -0
- package/components/ResourceDetail/{Masthead.vue → Masthead/legacy.vue} +0 -1
- package/components/ResourceDetail/__tests__/index.test.ts +135 -0
- package/components/ResourceDetail/index.vue +75 -575
- package/components/ResourceDetail/legacy.vue +564 -0
- package/components/ResourceList/Masthead.vue +69 -20
- package/components/ResourceList/index.vue +3 -2
- package/components/ResourceTable.vue +59 -85
- package/components/ResourceYaml.vue +15 -2
- package/components/RichTranslation.vue +106 -0
- package/components/SlideInPanelManager.vue +116 -14
- package/components/SortableTable/index.vue +10 -2
- package/components/SortableTable/paging.js +15 -16
- package/components/SortableTable/selection.js +22 -10
- package/components/StateDot/index.vue +28 -0
- package/components/StatusBadge.vue +6 -4
- package/components/SubtleLink.vue +25 -0
- package/components/Tabbed/index.vue +38 -22
- package/components/Wizard.vue +16 -3
- package/components/YamlEditor.vue +1 -2
- package/components/__tests__/AsyncButton.test.ts +39 -0
- package/components/__tests__/ConfigMapSettings.test.ts +376 -0
- package/components/__tests__/CruResource.test.ts +63 -0
- package/components/__tests__/FilterPanel.test.ts +81 -0
- package/components/__tests__/GrowlManager.test.ts +0 -25
- package/components/__tests__/PromptModal.test.ts +146 -0
- package/components/__tests__/PromptRestore.test.ts +1 -65
- package/components/__tests__/RichTranslation.test.ts +115 -0
- package/components/auth/AuthBanner.vue +15 -14
- package/components/auth/Principal.vue +0 -1
- package/components/auth/RoleDetailEdit.vue +44 -4
- package/components/auth/login/ldap.vue +2 -2
- package/components/auth/login/oidc.vue +6 -1
- package/components/fleet/FleetApplications.vue +174 -0
- package/components/fleet/FleetClusterTargets/TargetsList.vue +66 -0
- package/components/fleet/FleetClusterTargets/index.vue +455 -0
- package/components/fleet/FleetClusters.vue +25 -6
- package/components/fleet/FleetGitRepoPaths.vue +476 -0
- package/components/fleet/FleetHelmOps.vue +123 -0
- package/components/fleet/FleetIntro.vue +58 -28
- package/components/fleet/FleetNoWorkspaces.vue +5 -1
- package/components/fleet/FleetOCIStorageSecret.vue +171 -0
- package/components/fleet/FleetRepos.vue +37 -80
- package/components/fleet/FleetResources.vue +69 -27
- package/components/fleet/FleetSummary.vue +26 -51
- package/components/fleet/FleetValuesFrom.vue +295 -0
- package/components/fleet/__tests__/FleetClusterTargets.test.ts +1224 -0
- package/components/fleet/__tests__/FleetGitRepoPaths.test.ts +265 -0
- package/components/fleet/__tests__/FleetOCIStorageSecret.test.ts +213 -0
- package/components/fleet/__tests__/FleetSummary.test.ts +39 -39
- package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
- package/components/fleet/dashboard/Empty.vue +73 -0
- package/components/fleet/dashboard/ResourceCard.vue +184 -0
- package/components/fleet/dashboard/ResourceCardSummary.vue +195 -0
- package/components/fleet/dashboard/ResourceDetails.vue +194 -0
- package/components/fleet/dashboard/ResourcePanel.vue +384 -0
- package/components/form/ArrayList.vue +144 -116
- package/components/form/BannerSettings.vue +117 -50
- package/components/form/ChangePassword.vue +3 -1
- package/components/form/ColorInput.vue +35 -6
- package/components/form/FileImageSelector.vue +1 -1
- package/components/form/Footer.vue +10 -4
- package/components/form/KeyValue.vue +92 -51
- package/components/form/LabeledSelect.vue +72 -54
- package/components/form/Labels.vue +91 -21
- package/components/form/MatchExpressions.vue +56 -9
- package/components/form/NameNsDescription.vue +12 -8
- package/components/form/Networking.vue +24 -19
- package/components/form/NotificationSettings.vue +15 -1
- package/components/form/ResourceLabeledSelect.vue +22 -8
- package/components/form/ResourceSelector.vue +27 -23
- package/components/form/ResourceTabs/index.vue +7 -1
- package/components/form/SSHKnownHosts/index.vue +14 -11
- package/components/form/SecretSelector.vue +18 -2
- package/components/form/Select.vue +57 -26
- package/components/form/SelectOrCreateAuthSecret.vue +6 -3
- package/components/form/SimpleSecretSelector.vue +17 -4
- package/components/form/Taints.vue +21 -2
- package/components/form/UnitInput.vue +21 -0
- package/components/form/ValueFromResource.vue +31 -19
- package/components/form/__tests__/ArrayList.test.ts +32 -0
- package/components/form/__tests__/ColorInput.test.ts +35 -0
- package/components/form/__tests__/KeyValue.test.ts +36 -0
- package/components/form/__tests__/LabeledSelect.test.ts +79 -2
- package/components/form/__tests__/Labels.test.ts +360 -0
- package/components/form/__tests__/MatchExpressions.test.ts +16 -13
- package/components/form/__tests__/Networking.test.ts +116 -0
- package/components/form/__tests__/SSHKnownHosts.test.ts +11 -2
- package/components/form/__tests__/Select.test.ts +37 -1
- package/components/form/__tests__/UnitInput.test.ts +23 -1
- package/components/form/labeled-select-utils/labeled-select-pagination.ts +3 -38
- package/components/formatter/ClusterLink.vue +5 -8
- package/components/formatter/Description.vue +30 -0
- package/components/formatter/FleetApplicationClustersReady.vue +77 -0
- package/components/formatter/FleetApplicationSource.vue +79 -0
- package/components/formatter/FleetSummaryGraph.vue +7 -0
- package/components/formatter/PodImages.vue +1 -1
- package/components/formatter/WorkloadHealthScale.vue +1 -1
- package/components/formatter/__tests__/ClusterLink.test.ts +2 -32
- package/components/formatter/__tests__/LiveDate.test.ts +10 -2
- package/components/google/AccountAccess.vue +209 -0
- package/components/google/types/gcp.d.ts +136 -0
- package/components/google/types/index.d.ts +101 -0
- package/components/google/util/__mocks__/gcp.ts +465 -0
- package/components/google/util/formatter.ts +82 -0
- package/components/google/util/gcp.ts +134 -0
- package/components/google/util/index.d.ts +11 -0
- package/components/nav/Favorite.vue +1 -1
- package/components/nav/Group.vue +5 -0
- package/components/nav/Header.vue +24 -38
- package/components/nav/NamespaceFilter.vue +141 -84
- package/components/nav/NotificationCenter/Notification.vue +484 -0
- package/components/nav/NotificationCenter/NotificationHeader.vue +112 -0
- package/components/nav/NotificationCenter/index.vue +148 -0
- package/components/nav/TopLevelMenu.helper.ts +55 -34
- package/components/nav/TopLevelMenu.vue +11 -0
- package/components/nav/Type.vue +4 -1
- package/components/nav/WindowManager/ContainerLogs.vue +87 -61
- package/components/nav/WindowManager/ContainerLogsActions.vue +76 -0
- package/components/nav/WindowManager/index.vue +3 -2
- package/components/templates/default.vue +0 -3
- package/components/templates/plain.vue +0 -3
- package/composables/drawer.ts +26 -0
- package/composables/focusTrap.ts +3 -3
- package/composables/resources.test.ts +63 -0
- package/composables/resources.ts +38 -0
- package/composables/useI18n.ts +12 -11
- package/composables/useIsNewDetailPageEnabled.ts +17 -0
- package/config/labels-annotations.js +22 -11
- package/config/pagination-table-headers.js +8 -1
- package/config/private-label.js +0 -1
- package/config/product/auth.js +20 -3
- package/config/product/{cis.js → compliance.js} +23 -26
- package/config/product/explorer.js +49 -17
- package/config/product/fleet.js +77 -17
- package/config/product/manager.js +1 -29
- package/config/product/settings.js +23 -11
- package/config/query-params.js +16 -1
- package/config/roles.ts +2 -1
- package/config/router/navigation-guards/authentication.js +51 -2
- package/config/router/navigation-guards/index.js +5 -67
- package/config/router/routes.js +65 -31
- package/config/secret.ts +15 -0
- package/config/settings.ts +33 -16
- package/config/store.js +2 -0
- package/config/system-namespaces.js +1 -1
- package/config/table-headers.js +91 -30
- package/config/types.js +18 -7
- package/config/version.js +1 -1
- package/core/plugin-helpers.ts +3 -2
- package/core/plugin.ts +32 -7
- package/core/types.ts +25 -7
- package/detail/catalog.cattle.io.app.vue +5 -1
- package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
- package/detail/fleet.cattle.io.bundle.vue +70 -6
- package/detail/fleet.cattle.io.cluster.vue +28 -15
- package/detail/fleet.cattle.io.gitrepo.vue +11 -2
- package/detail/fleet.cattle.io.helmop.vue +157 -0
- package/detail/management.cattle.io.fleetworkspace.vue +18 -27
- package/detail/management.cattle.io.oidcclient.vue +369 -0
- package/detail/namespace.vue +0 -3
- package/detail/node.vue +20 -16
- package/detail/pod.vue +2 -2
- package/detail/provisioning.cattle.io.cluster.vue +16 -50
- package/detail/service.vue +10 -2
- package/detail/workload/index.vue +48 -39
- package/dialog/AddCustomBadgeDialog.vue +0 -1
- package/{pages/c/_cluster/uiplugins/AddExtensionRepos.vue → dialog/AddExtensionReposDialog.vue} +72 -42
- package/dialog/AddonConfigConfirmationDialog.vue +1 -1
- package/dialog/AssignToDialog.vue +176 -0
- package/dialog/ChangePasswordDialog.vue +106 -0
- package/{pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue → dialog/DeveloperLoadExtensionDialog.vue} +74 -71
- package/dialog/DisableAuthProviderDialog.vue +101 -0
- package/dialog/DrainNode.vue +1 -1
- package/{pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue → dialog/ExtensionCatalogInstallDialog.vue} +100 -88
- package/{pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue → dialog/ExtensionCatalogUninstallDialog.vue} +87 -66
- package/dialog/FeatureFlagListDialog.vue +288 -0
- package/dialog/ForceMachineRemoveDialog.vue +1 -1
- package/dialog/GenericPrompt.vue +1 -1
- package/dialog/HelmOpForceUpdateDialog.vue +132 -0
- package/{components/Import.vue → dialog/ImportDialog.vue} +8 -13
- package/{pages/c/_cluster/uiplugins/InstallDialog.vue → dialog/InstallExtensionDialog.vue} +124 -106
- package/{components/form/SSHKnownHosts → dialog}/KnownHostsEditDialog.vue +52 -62
- package/dialog/MoveNamespaceDialog.vue +157 -0
- package/dialog/OidcClientSecretDialog.vue +117 -0
- package/dialog/RedeployWorkloadDialog.vue +164 -0
- package/dialog/RotateEncryptionKeyDialog.vue +10 -30
- package/dialog/ScalePoolDownDialog.vue +1 -1
- package/{components/nav/Jump.vue → dialog/SearchDialog.vue} +34 -14
- package/{pages/c/_cluster/uiplugins/UninstallDialog.vue → dialog/UninstallExtensionDialog.vue} +67 -58
- package/dialog/WechatDialog.vue +57 -0
- package/{components/form/SSHKnownHosts → dialog}/__tests__/KnownHostsEditDialog.test.ts +15 -34
- package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
- package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +60 -68
- package/edit/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
- package/edit/__tests__/service.test.ts +2 -1
- package/edit/auth/ldap/__tests__/config.test.ts +14 -0
- package/edit/auth/ldap/config.vue +24 -0
- package/edit/auth/oidc.vue +159 -93
- package/edit/autoscaling.horizontalpodautoscaler/index.vue +4 -1
- package/edit/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +30 -31
- package/edit/{cis.cattle.io.clusterscanbenchmark.vue → compliance.cattle.io.clusterscanbenchmark.vue} +4 -4
- package/edit/{cis.cattle.io.clusterscanprofile.vue → compliance.cattle.io.clusterscanprofile.vue} +5 -5
- package/edit/configmap.vue +8 -2
- package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
- package/edit/fleet.cattle.io.gitrepo.vue +70 -256
- package/edit/fleet.cattle.io.helmop.vue +786 -0
- package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
- package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
- package/edit/logging-flow/index.vue +1 -0
- package/edit/logging.banzaicloud.io.output/index.vue +2 -1
- package/edit/logging.banzaicloud.io.output/providers/awsElasticsearch.vue +5 -6
- package/edit/management.cattle.io.fleetworkspace.vue +44 -10
- package/edit/management.cattle.io.oidcclient.vue +162 -0
- package/edit/management.cattle.io.project.vue +4 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +5 -0
- package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
- package/edit/monitoring.coreos.com.receiver/auth.vue +3 -3
- package/edit/monitoring.coreos.com.receiver/index.vue +1 -0
- package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
- package/edit/monitoring.coreos.com.route.vue +1 -0
- package/edit/namespace.vue +2 -4
- package/edit/networking.istio.io.destinationrule/index.vue +4 -1
- package/edit/networking.k8s.io.ingress/Certificate.vue +11 -3
- package/edit/networking.k8s.io.ingress/__tests__/Certificate.test.ts +37 -0
- package/edit/networking.k8s.io.ingress/index.vue +4 -1
- package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +3 -14
- package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +57 -62
- package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +10 -16
- package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.test.ts +72 -41
- package/edit/networking.k8s.io.networkpolicy/__tests__/utils/mock.json +17 -1
- package/edit/networking.k8s.io.networkpolicy/index.vue +23 -31
- package/edit/node.vue +1 -0
- package/edit/persistentvolume/index.vue +4 -1
- package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +26 -12
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +69 -2
- package/edit/provisioning.cattle.io.cluster/__tests__/utils/rke2-test-data.ts +58 -0
- package/edit/provisioning.cattle.io.cluster/index.vue +21 -73
- package/edit/provisioning.cattle.io.cluster/rke2.vue +535 -428
- package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +48 -39
- package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +5 -3
- package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
- package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +2 -2
- package/edit/resources.cattle.io.restore.vue +1 -1
- package/edit/secret/basic.vue +1 -0
- package/edit/secret/index.vue +127 -15
- package/edit/service.vue +17 -29
- package/edit/serviceaccount.vue +4 -1
- package/edit/storage.k8s.io.storageclass/index.vue +4 -1
- package/edit/workload/index.vue +11 -15
- package/edit/workload/mixins/workload.js +0 -2
- package/list/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +2 -2
- package/list/fleet.cattle.io.gitrepo.vue +1 -1
- package/list/fleet.cattle.io.helmop.vue +108 -0
- package/list/harvesterhci.io.management.cluster.vue +0 -17
- package/list/management.cattle.io.feature.vue +4 -288
- package/list/management.cattle.io.oidcclient.vue +108 -0
- package/list/management.cattle.io.user.vue +13 -20
- package/list/namespace.vue +6 -2
- package/list/node.vue +2 -0
- package/list/projectsecret.vue +345 -0
- package/list/secret.vue +109 -0
- package/list/workload.vue +6 -2
- package/machine-config/__tests__/vmwarevsphere.test.ts +5 -7
- package/machine-config/amazonec2.vue +3 -24
- package/machine-config/components/GCEImage.vue +374 -0
- package/machine-config/google.vue +617 -0
- package/machine-config/vmwarevsphere.vue +7 -17
- package/mixins/__tests__/brand.spec.ts +170 -0
- package/mixins/auth-config.js +8 -1
- package/mixins/brand.js +16 -17
- package/mixins/create-edit-view/impl.js +10 -1
- package/mixins/create-edit-view/index.js +5 -0
- package/mixins/preset.js +100 -0
- package/mixins/resource-fetch-api-pagination.js +73 -44
- package/mixins/resource-fetch.js +18 -8
- package/mixins/resource-table-watch.js +45 -0
- package/mixins/vue-select-overrides.js +1 -4
- package/models/__tests__/chart.test.ts +296 -0
- package/models/__tests__/fleet.cattle.io.gitrepo.test.ts +1 -1
- package/models/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
- package/models/__tests__/node.test.ts +7 -63
- package/models/__tests__/workload.test.ts +1 -0
- package/models/chart.js +157 -2
- package/models/cluster/node.js +2 -1
- package/models/cluster.js +32 -2
- package/models/cluster.x-k8s.io.machinedeployment.js +11 -2
- package/models/{cis.cattle.io.clusterscan.js → compliance.cattle.io.clusterscan.js} +8 -8
- package/models/{cis.cattle.io.clusterscanbenchmark.js → compliance.cattle.io.clusterscanbenchmark.js} +1 -1
- package/models/{cis.cattle.io.clusterscanprofile.js → compliance.cattle.io.clusterscanprofile.js} +5 -5
- package/models/{cis.cattle.io.clusterscanreport.js → compliance.cattle.io.clusterscanreport.js} +1 -1
- package/models/fleet-application.js +297 -0
- package/models/fleet.cattle.io.bundle.js +9 -8
- package/models/fleet.cattle.io.cluster.js +21 -4
- package/models/fleet.cattle.io.gitrepo.js +46 -382
- package/models/fleet.cattle.io.helmop.js +202 -0
- package/models/management.cattle.io.authconfig.js +1 -0
- package/models/management.cattle.io.cluster.js +0 -20
- package/models/management.cattle.io.feature.js +7 -1
- package/models/management.cattle.io.fleetworkspace.js +14 -1
- package/models/management.cattle.io.node.js +7 -22
- package/models/management.cattle.io.nodepool.js +12 -0
- package/models/management.cattle.io.oidcclient.js +18 -0
- package/models/management.cattle.io.registration.js +3 -0
- package/models/management.cattle.io.setting.js +0 -1
- package/models/namespace.js +12 -1
- package/models/provisioning.cattle.io.cluster.js +60 -97
- package/models/secret.js +157 -2
- package/models/service.js +28 -9
- package/models/storage.k8s.io.storageclass.js +2 -2
- package/models/workload.js +91 -51
- package/package.json +6 -5
- package/pages/about.vue +17 -61
- package/pages/account/index.vue +9 -1
- package/pages/auth/login.vue +2 -3
- package/pages/auth/verify.vue +13 -1
- package/pages/c/_cluster/apps/charts/AddRepoLink.vue +36 -0
- package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +80 -0
- package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +57 -0
- package/pages/c/_cluster/apps/charts/StatusLabel.vue +33 -0
- package/pages/c/_cluster/apps/charts/index.vue +501 -468
- package/pages/c/_cluster/apps/charts/install.vue +0 -1
- package/pages/c/_cluster/auth/roles/index.vue +19 -48
- package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
- package/pages/c/_cluster/explorer/EventsTable.vue +1 -1
- package/pages/c/_cluster/explorer/index.vue +14 -3
- package/pages/c/_cluster/explorer/projectsecret.vue +34 -0
- package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
- package/pages/c/_cluster/fleet/__tests__/index.test.ts +720 -0
- package/pages/c/_cluster/fleet/application/_resource/_id.vue +14 -0
- package/pages/c/_cluster/fleet/application/_resource/create.vue +14 -0
- package/pages/c/_cluster/fleet/application/create.vue +341 -0
- package/pages/c/_cluster/fleet/application/index.vue +139 -0
- package/pages/c/_cluster/fleet/graph/config.js +277 -0
- package/pages/c/_cluster/fleet/index.vue +866 -328
- package/pages/c/_cluster/fleet/settings/index.vue +229 -0
- package/pages/c/_cluster/longhorn/index.vue +5 -2
- package/pages/c/_cluster/settings/banners.vue +56 -2
- package/pages/c/_cluster/settings/brand.vue +2 -1
- package/pages/c/_cluster/settings/performance.vue +7 -26
- package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
- package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
- package/pages/c/_cluster/uiplugins/__tests__/AddExtensionRepos.test.ts +4 -7
- package/pages/c/_cluster/uiplugins/index.vue +98 -55
- package/pages/explorer/resource/detail/configmap.vue +42 -0
- package/pages/explorer/resource/detail/projectsecret.vue +9 -0
- package/pages/explorer/resource/detail/secret.vue +63 -0
- package/pages/home.vue +8 -104
- package/pages/prefs.vue +0 -1
- package/pages/support/index.vue +4 -6
- package/plugins/clean-html.js +2 -0
- package/plugins/dashboard-store/__tests__/actions.test.ts +4 -1
- package/plugins/dashboard-store/__tests__/normalize.test.ts +223 -0
- package/plugins/dashboard-store/__tests__/resource-class.test.ts +191 -0
- package/plugins/dashboard-store/__tests__/utils/normalize-usecases.ts +1526 -0
- package/plugins/dashboard-store/actions.js +212 -55
- package/plugins/dashboard-store/getters.js +112 -24
- package/plugins/dashboard-store/mutations.js +61 -12
- package/plugins/dashboard-store/normalize.js +29 -19
- package/plugins/dashboard-store/resource-class.js +132 -49
- package/plugins/steve/__tests__/getters.test.ts +19 -12
- package/plugins/steve/__tests__/steve-class.test.ts +1 -0
- package/plugins/steve/__tests__/subscribe.spec.ts +324 -1
- package/plugins/steve/actions.js +37 -24
- package/plugins/steve/getters.js +47 -12
- package/plugins/steve/resourceWatcher.js +10 -3
- package/plugins/steve/steve-class.js +5 -0
- package/plugins/steve/steve-pagination-utils.ts +225 -43
- package/plugins/steve/subscribe.js +418 -53
- package/plugins/steve/worker/web-worker.advanced.js +5 -1
- package/rancher-components/Banner/Banner.test.ts +51 -3
- package/rancher-components/Banner/Banner.vue +37 -6
- package/rancher-components/Form/Checkbox/Checkbox.test.ts +59 -1
- package/rancher-components/Form/Checkbox/Checkbox.vue +27 -9
- package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +51 -0
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +21 -3
- package/rancher-components/Form/Radio/RadioButton.test.ts +36 -1
- package/rancher-components/Form/Radio/RadioButton.vue +21 -5
- package/rancher-components/Form/Radio/RadioGroup.test.ts +60 -0
- package/rancher-components/Form/Radio/RadioGroup.vue +81 -38
- package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +4 -0
- package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +22 -1
- package/rancher-components/LabeledTooltip/LabeledTooltip.vue +1 -0
- package/rancher-components/RcButton/RcButton.vue +1 -1
- package/rancher-components/RcDropdown/RcDropdown.test.ts +98 -0
- package/rancher-components/RcDropdown/RcDropdown.vue +6 -0
- package/rancher-components/RcDropdown/RcDropdownItem.vue +8 -55
- package/rancher-components/RcDropdown/RcDropdownItemCheckbox.vue +69 -0
- package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +93 -0
- package/rancher-components/RcDropdown/RcDropdownMenu.vue +7 -8
- package/rancher-components/RcDropdown/index.ts +2 -0
- package/rancher-components/RcDropdown/useDropdownContext.ts +21 -0
- package/rancher-components/RcDropdown/useDropdownItem.ts +92 -0
- package/rancher-components/RcItemCard/RcItemCard.test.ts +189 -0
- package/rancher-components/RcItemCard/RcItemCard.vue +430 -0
- package/rancher-components/RcItemCard/RcItemCardAction.vue +24 -0
- package/rancher-components/RcItemCard/index.ts +2 -0
- package/rancher-components/StringList/StringList.vue +1 -1
- package/scripts/extension/publish +1 -1
- package/static/loading-indicator.html +1 -1
- package/store/action-menu.js +26 -56
- package/store/auth.js +3 -0
- package/store/catalog.js +85 -25
- package/store/features.js +0 -1
- package/store/growl.js +97 -8
- package/store/i18n.js +1 -1
- package/store/index.js +44 -14
- package/store/notifications.ts +426 -0
- package/store/prefs.js +2 -8
- package/store/slideInPanel.ts +6 -0
- package/store/type-map.js +34 -17
- package/store/type-map.utils.ts +49 -6
- package/store/uiplugins.ts +15 -1
- package/types/fleet.d.ts +60 -1
- package/types/kube/kube-api.ts +34 -0
- package/types/notifications/index.ts +74 -0
- package/types/resources/fleet.d.ts +43 -0
- package/types/resources/pod-security-admission.ts +36 -0
- package/types/resources/settings.d.ts +107 -0
- package/types/resources/userPreferences.d.ts +13 -0
- package/types/shell/index.d.ts +971 -745
- package/types/store/dashboard-store.types.ts +57 -4
- package/types/store/pagination.types.ts +41 -9
- package/types/store/subscribe.types.ts +50 -0
- package/utils/__mocks__/tabbable.js +13 -0
- package/utils/__tests__/back-off.test.ts +354 -0
- package/utils/__tests__/create-yaml.test.ts +235 -0
- package/utils/__tests__/fleet.test.ts +148 -0
- package/utils/__tests__/kontainer.test.ts +19 -0
- package/utils/__tests__/object.test.ts +54 -1
- package/utils/__tests__/string.test.ts +273 -1
- package/utils/__tests__/time.test.ts +31 -0
- package/utils/auth.js +41 -6
- package/utils/back-off.ts +176 -0
- package/utils/cluster.js +24 -20
- package/utils/create-yaml.js +103 -9
- package/utils/crypto/encryption.ts +103 -0
- package/utils/cspAdaptor.ts +51 -0
- package/utils/error.js +0 -5
- package/utils/fleet-types.ts +0 -0
- package/utils/fleet.ts +204 -74
- package/utils/grafana.js +1 -0
- package/utils/kontainer.ts +3 -5
- package/utils/object.js +36 -12
- package/utils/pagination-utils.ts +50 -3
- package/utils/pagination-wrapper.ts +132 -50
- package/utils/perf-setting.utils.ts +28 -0
- package/utils/release-notes.ts +48 -0
- package/utils/selector-typed.ts +210 -0
- package/utils/selector.js +29 -6
- package/utils/settings.ts +4 -1
- package/utils/string.js +24 -0
- package/utils/style.ts +39 -0
- package/utils/{time.js → time.ts} +25 -6
- package/utils/uiplugins.ts +41 -8
- package/utils/v-sphere.ts +5 -1
- package/utils/validators/formRules/__tests__/index.test.ts +76 -6
- package/utils/validators/formRules/index.ts +99 -4
- package/utils/window.js +11 -7
- package/.DS_Store +0 -0
- package/components/AssignTo.vue +0 -199
- package/components/DisableAuthProviderModal.vue +0 -115
- package/components/MoveModal.vue +0 -167
- package/components/PromptChangePassword.vue +0 -123
- package/components/ResourceList/Masthead-btn.vue +0 -225
- package/components/__tests__/ApplicationCard.test.ts +0 -27
- package/components/cards/ApplicationCard.vue +0 -145
- package/components/fleet/FleetBundleResources.vue +0 -86
- package/components/fleet/ForceDirectedTreeChart/chartIcons.js +0 -17
- package/components/formatter/RKETemplateName.vue +0 -37
- package/config/product/legacy.js +0 -62
- package/config/secret.js +0 -14
- package/dialog/SaveAsRKETemplateDialog.vue +0 -139
- package/models/etcdbackup.js +0 -45
- package/pages/auth copy/login.vue +0 -595
- package/pages/auth copy/logout.vue +0 -47
- package/pages/auth copy/setup.vue +0 -523
- package/pages/auth copy/verify.vue +0 -203
- package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +0 -249
- package/pages/c/_cluster/legacy/pages/_page.vue +0 -29
- package/pages/c/_cluster/legacy/project/_page.vue +0 -57
- package/pages/c/_cluster/legacy/project/index.vue +0 -32
- package/pages/c/_cluster/legacy/project/pipelines.vue +0 -96
|
@@ -86,8 +86,16 @@ export function createLoadArgs(ctx, dataType) {
|
|
|
86
86
|
};
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
+
/**
|
|
90
|
+
* Add or update the given resource in the store
|
|
91
|
+
*
|
|
92
|
+
* invalidatePageCache
|
|
93
|
+
* - if something calls `load` then the cache no longer has a page so we invalidate it
|
|
94
|
+
* - however on resource create or remove this can lead to lists showing nothing... before the new page is fetched
|
|
95
|
+
* - for those cases avoid invaliding the page cache
|
|
96
|
+
*/
|
|
89
97
|
export function load(state, {
|
|
90
|
-
data, ctx, existing, cachedArgs
|
|
98
|
+
data, ctx, existing, cachedArgs, invalidatePageCache = true,
|
|
91
99
|
}) {
|
|
92
100
|
const { getters } = ctx;
|
|
93
101
|
// Optimisation. This can run once per resource loaded.., so pass in from parent
|
|
@@ -130,8 +138,12 @@ export function load(state, {
|
|
|
130
138
|
}
|
|
131
139
|
} else {
|
|
132
140
|
if (inMap) {
|
|
141
|
+
// In theory cached `entry` should match provided `existing`, so changes merged from `data` into `entry` should be reflected in `existing`.
|
|
142
|
+
// However.. there's a disconnect happening somewhere so merge data into `existing` before merging into `entry`
|
|
143
|
+
const latestEntry = existing && entry !== existing ? replaceResource(existing, data, getters) : data;
|
|
144
|
+
|
|
133
145
|
// There's already an entry in the store, so merge changes into it. The list entry is a reference to the map (and vice versa)
|
|
134
|
-
entry = replaceResource(entry,
|
|
146
|
+
entry = replaceResource(entry, latestEntry, getters);
|
|
135
147
|
} else {
|
|
136
148
|
// There's no entry, make a new proxy
|
|
137
149
|
entry = reactive(classify(ctx, data));
|
|
@@ -164,7 +176,8 @@ export function load(state, {
|
|
|
164
176
|
}
|
|
165
177
|
}
|
|
166
178
|
|
|
167
|
-
|
|
179
|
+
// see `invalidatePageCache` description above
|
|
180
|
+
cache.havePage = invalidatePageCache ? false : cache.havePage;
|
|
168
181
|
|
|
169
182
|
return entry;
|
|
170
183
|
}
|
|
@@ -413,13 +426,18 @@ export default {
|
|
|
413
426
|
loadSelector(state, {
|
|
414
427
|
type, entries, ctx, selector, revision
|
|
415
428
|
}) {
|
|
429
|
+
const keyField = ctx.getters.keyFieldForType(type);
|
|
416
430
|
const cache = registerType(state, type);
|
|
417
|
-
const
|
|
431
|
+
const proxies = reactive(entries.map((x) => classify(ctx, x)));
|
|
418
432
|
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
433
|
+
clear(cache.list);
|
|
434
|
+
cache.map.clear();
|
|
435
|
+
cache.generation++;
|
|
436
|
+
|
|
437
|
+
addObjects(cache.list, proxies);
|
|
438
|
+
|
|
439
|
+
for ( let i = 0 ; i < proxies.length ; i++ ) {
|
|
440
|
+
cache.map.set(proxies[i][keyField], proxies[i]);
|
|
423
441
|
}
|
|
424
442
|
|
|
425
443
|
cache.haveSelector[selector] = true;
|
|
@@ -471,29 +489,60 @@ export default {
|
|
|
471
489
|
data,
|
|
472
490
|
ctx,
|
|
473
491
|
pagination,
|
|
492
|
+
revision
|
|
474
493
|
}) {
|
|
475
494
|
if (!data) {
|
|
476
495
|
return;
|
|
477
496
|
}
|
|
497
|
+
// We loop over data three times in this mutator, which is bad
|
|
498
|
+
// However we're only dealing with pageSize worth of data and splitting out into three loops improves legibility
|
|
478
499
|
|
|
479
500
|
const keyField = ctx.getters.keyFieldForType(type);
|
|
480
|
-
|
|
501
|
+
|
|
502
|
+
// Why don't we just replace the map? Because we
|
|
503
|
+
// 1. nav to list, subscribe to changes
|
|
504
|
+
// 2. nav to resource in list
|
|
505
|
+
// 3. update to page comes over
|
|
506
|
+
// 4. need to update the reference the detail list uses
|
|
507
|
+
const proxiesMap = {};
|
|
508
|
+
const proxies = reactive(data.map((x) => {
|
|
509
|
+
proxiesMap[x[keyField]] = true;
|
|
510
|
+
|
|
511
|
+
return classify(ctx, x);
|
|
512
|
+
}));
|
|
481
513
|
const cache = registerType(state, type);
|
|
482
514
|
|
|
483
|
-
clear(cache.list);
|
|
484
|
-
cache.map.clear();
|
|
485
515
|
cache.generation++;
|
|
486
516
|
|
|
517
|
+
// Update list
|
|
518
|
+
clear(cache.list);
|
|
487
519
|
addObjects(cache.list, proxies);
|
|
488
520
|
|
|
521
|
+
// Update Map (remove stale)
|
|
522
|
+
cache.map.forEach((value, key) => {
|
|
523
|
+
if (!proxiesMap[value[keyField]]) {
|
|
524
|
+
cache.map.delete(key);
|
|
525
|
+
}
|
|
526
|
+
});
|
|
527
|
+
|
|
528
|
+
// Update Map (update existing / add latest)
|
|
489
529
|
for ( let i = 0 ; i < proxies.length ; i++ ) {
|
|
490
|
-
|
|
530
|
+
// This could probably be merged with the first loop above
|
|
531
|
+
const existing = cache.map.get(proxies[i][keyField]);
|
|
532
|
+
const latest = proxies[i];
|
|
533
|
+
|
|
534
|
+
if (existing) {
|
|
535
|
+
replaceResource(existing, latest, ctx.getters);
|
|
536
|
+
} else {
|
|
537
|
+
cache.map.set(latest[keyField], latest);
|
|
538
|
+
}
|
|
491
539
|
}
|
|
492
540
|
|
|
493
541
|
// havePage is of type `StorePagination`
|
|
494
542
|
cache.havePage = pagination;
|
|
495
543
|
cache.haveNamespace = undefined;
|
|
496
544
|
cache.haveAll = undefined;
|
|
545
|
+
cache.revision = revision;
|
|
497
546
|
|
|
498
547
|
return proxies;
|
|
499
548
|
},
|
|
@@ -2,8 +2,6 @@ import { SCHEMA } from '@shell/config/types';
|
|
|
2
2
|
|
|
3
3
|
import { applyChangeset, changeset, changesetConflicts } from '@shell/utils/object';
|
|
4
4
|
|
|
5
|
-
import { cloud2harvesterhci } from '@shell/utils/router'
|
|
6
|
-
|
|
7
5
|
export const KEY_FIELD_FOR = {
|
|
8
6
|
[SCHEMA]: '_id',
|
|
9
7
|
default: 'id',
|
|
@@ -19,28 +17,40 @@ export function normalizeType(type) {
|
|
|
19
17
|
return type;
|
|
20
18
|
}
|
|
21
19
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Detect and resolve conflicts from a 409 response.
|
|
22
|
+
*
|
|
23
|
+
* @param {*} initialValue the initial value before changes
|
|
24
|
+
* @param {*} userValue the value containing the local changes. this function will intentionally mutate this to contain changes made from the server
|
|
25
|
+
* @param {*} serverValue the very latest value from the server
|
|
26
|
+
* @returns If `value` has been successfully updated return a false-y value. Else they can't be resolved, return an array of errors to show the user.
|
|
27
|
+
*/
|
|
28
|
+
export async function handleConflict(initialValue, userValue, serverValue, store, storeNamespace, toJSON = (x) => x.toJSON()) {
|
|
29
|
+
// initial value
|
|
30
|
+
const initial = await store.dispatch(`${ storeNamespace }/cleanForDiff`, toJSON(initialValue), { root: true });
|
|
31
|
+
// changed value (user edits)
|
|
32
|
+
const user = await store.dispatch(`${ storeNamespace }/cleanForDiff`, toJSON(userValue), { root: true });
|
|
33
|
+
// server value
|
|
34
|
+
const server = await store.dispatch(`${ storeNamespace }/cleanForDiff`, toJSON(serverValue), { root: true });
|
|
35
|
+
|
|
36
|
+
// changes made to the server value
|
|
37
|
+
const serverChanges = changeset(initial, server);
|
|
38
|
+
// changes made locally
|
|
39
|
+
const userChanges = changeset(initial, user);
|
|
40
|
+
// Any incompatibilities between changes made locally and the server?
|
|
41
|
+
const actualConflicts = changesetConflicts(serverChanges, userChanges);
|
|
42
|
+
|
|
43
|
+
console.log('Background Change', serverChanges); // eslint-disable-line no-console
|
|
44
|
+
console.log('User Change', userChanges); // eslint-disable-line no-console
|
|
36
45
|
console.log('Conflicts', actualConflicts); // eslint-disable-line no-console
|
|
37
46
|
|
|
38
|
-
|
|
39
|
-
|
|
47
|
+
userValue.metadata.resourceVersion = serverValue.metadata.resourceVersion;
|
|
48
|
+
// Apply changes made on the server to the changed (user) value
|
|
49
|
+
applyChangeset(userValue, serverChanges);
|
|
40
50
|
|
|
41
51
|
if ( actualConflicts.length ) {
|
|
42
52
|
// Stop the save and let the user inspect and continue editing
|
|
43
|
-
const out = [
|
|
53
|
+
const out = [store.getters['i18n/t']('validation.conflict', { fields: actualConflicts.join(', '), fieldCount: actualConflicts.length })];
|
|
44
54
|
|
|
45
55
|
return out;
|
|
46
56
|
} else {
|
|
@@ -32,9 +32,10 @@ import isFunction from 'lodash/isFunction';
|
|
|
32
32
|
import isString from 'lodash/isString';
|
|
33
33
|
import { markRaw } from 'vue';
|
|
34
34
|
|
|
35
|
+
import { handleConflict } from '@shell/plugins/dashboard-store/normalize';
|
|
35
36
|
import { ExtensionPoint, ActionLocation } from '@shell/core/types';
|
|
36
37
|
import { getApplicableExtensionEnhancements } from '@shell/core/plugin-helpers';
|
|
37
|
-
import {
|
|
38
|
+
import { parse } from '@shell/utils/selector';
|
|
38
39
|
|
|
39
40
|
export const DNS_LIKE_TYPES = ['dnsLabel', 'dnsLabelRestricted', 'hostname'];
|
|
40
41
|
|
|
@@ -736,6 +737,17 @@ export default class Resource {
|
|
|
736
737
|
);
|
|
737
738
|
}
|
|
738
739
|
|
|
740
|
+
get stateColorPair() {
|
|
741
|
+
return {
|
|
742
|
+
state: this.stateDisplay,
|
|
743
|
+
color: this.stateSimpleColor
|
|
744
|
+
};
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
get stateSimpleColor() {
|
|
748
|
+
return this.stateColor.replace('text-', '');
|
|
749
|
+
}
|
|
750
|
+
|
|
739
751
|
get stateBackground() {
|
|
740
752
|
return this.stateColor.replace('text-', 'bg-');
|
|
741
753
|
}
|
|
@@ -886,6 +898,10 @@ export default class Resource {
|
|
|
886
898
|
return out;
|
|
887
899
|
}
|
|
888
900
|
|
|
901
|
+
get canEdit() {
|
|
902
|
+
return this.canUpdate && this.canCustomEdit;
|
|
903
|
+
}
|
|
904
|
+
|
|
889
905
|
// You can add custom actions by overriding your own availableActions (and probably reading super._availableActions)
|
|
890
906
|
get _availableActions() {
|
|
891
907
|
// get menu actions available by plugins configuration
|
|
@@ -897,42 +913,42 @@ export default class Resource {
|
|
|
897
913
|
{
|
|
898
914
|
action: this.canUpdate ? 'goToEdit' : 'goToViewConfig',
|
|
899
915
|
label: this.t(this.canUpdate ? 'action.edit' : 'action.view'),
|
|
900
|
-
|
|
916
|
+
icon: 'icon icon-edit',
|
|
901
917
|
enabled: this.canCustomEdit,
|
|
902
918
|
},
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
919
|
+
{
|
|
920
|
+
action: this.canEditYaml ? 'goToEditYaml' : 'goToViewYaml',
|
|
921
|
+
label: this.t(this.canEditYaml ? 'action.editYaml' : 'action.viewYaml'),
|
|
922
|
+
icon: 'icon icon-file',
|
|
923
|
+
enabled: this.canYaml,
|
|
924
|
+
},
|
|
909
925
|
{
|
|
910
926
|
action: (this.canCustomEdit ? 'goToClone' : 'cloneYaml'),
|
|
911
927
|
label: this.t('action.clone'),
|
|
912
|
-
|
|
913
|
-
enabled: this.canClone && this.canCreate && (this.canCustomEdit || this.canYaml)
|
|
928
|
+
icon: 'icon icon-copy',
|
|
929
|
+
enabled: this.canClone && this.canCreate && (this.canCustomEdit || this.canYaml),
|
|
930
|
+
},
|
|
931
|
+
{ divider: true },
|
|
932
|
+
{
|
|
933
|
+
action: 'download',
|
|
934
|
+
label: this.t('action.download'),
|
|
935
|
+
icon: 'icon icon-download',
|
|
936
|
+
bulkable: true,
|
|
937
|
+
bulkAction: 'downloadBulk',
|
|
938
|
+
enabled: this.canYaml,
|
|
939
|
+
weight: -9,
|
|
940
|
+
},
|
|
941
|
+
{
|
|
942
|
+
action: 'viewInApi',
|
|
943
|
+
label: this.t('action.viewInApi'),
|
|
944
|
+
icon: 'icon icon-external-link',
|
|
945
|
+
enabled: this.canViewInApi,
|
|
914
946
|
},
|
|
915
|
-
// { divider: true },
|
|
916
|
-
// {
|
|
917
|
-
// action: 'download',
|
|
918
|
-
// label: this.t('action.download'),
|
|
919
|
-
// icon: 'icon icon-download',
|
|
920
|
-
// bulkable: true,
|
|
921
|
-
// bulkAction: 'downloadBulk',
|
|
922
|
-
// enabled: this.canYaml,
|
|
923
|
-
// weight: -9,
|
|
924
|
-
// },
|
|
925
|
-
// {
|
|
926
|
-
// action: 'viewInApi',
|
|
927
|
-
// label: this.t('action.viewInApi'),
|
|
928
|
-
// icon: 'icon icon-external-link',
|
|
929
|
-
// enabled: this.canViewInApi,
|
|
930
|
-
// },
|
|
931
947
|
{
|
|
932
948
|
action: 'promptRemove',
|
|
933
949
|
altAction: 'remove',
|
|
934
950
|
label: this.t('action.remove'),
|
|
935
|
-
|
|
951
|
+
icon: 'icon icon-trash',
|
|
936
952
|
bulkable: true,
|
|
937
953
|
enabled: this.canDelete,
|
|
938
954
|
bulkAction: 'promptRemove',
|
|
@@ -1180,7 +1196,9 @@ export default class Resource {
|
|
|
1180
1196
|
}
|
|
1181
1197
|
|
|
1182
1198
|
// @TODO remove this once the API maps steve _type <-> k8s type in both directions
|
|
1183
|
-
|
|
1199
|
+
// `JSON.parse(JSON.stringify` - Completely disconnect the object we're going to send and `this`. This ensures that properties
|
|
1200
|
+
// removed from opt.data before sending (as part of cleanForSave) are not stripped from where they're still needed (`this`)
|
|
1201
|
+
opt.data = this.toSave() || JSON.parse(JSON.stringify(this));
|
|
1184
1202
|
|
|
1185
1203
|
if (opt.data._type) {
|
|
1186
1204
|
opt.data.type = opt.data._type;
|
|
@@ -1247,7 +1265,18 @@ export default class Resource {
|
|
|
1247
1265
|
|
|
1248
1266
|
const res = await this.$dispatch('request', { opt, type: this.type } );
|
|
1249
1267
|
|
|
1250
|
-
|
|
1268
|
+
// In theory...
|
|
1269
|
+
// 200 - resource could have finalizer (could hang around, keep resource to show deleting state)
|
|
1270
|
+
// 204 - resource should be gone gone (so remove immediately)
|
|
1271
|
+
// However...
|
|
1272
|
+
// 200 - this is the only status code returned
|
|
1273
|
+
if ( res?._status === 200 ) {
|
|
1274
|
+
// Show state (probably terminating) immediately, don't wait for resource.change or debounced resource.changes update
|
|
1275
|
+
// It would be neater to only do this in the debounced resource.changes world, but there's no neat / complete way to do this (paginationUtils will cause dep issues if imported)
|
|
1276
|
+
await this.$dispatch('load', {
|
|
1277
|
+
data: res, existing: this, invalidatePageCache: false
|
|
1278
|
+
});
|
|
1279
|
+
} else if ( res?._status === 204 ) {
|
|
1251
1280
|
// If there's no body, assume the resource was immediately deleted
|
|
1252
1281
|
// and drop it from the store as if a remove event happened.
|
|
1253
1282
|
await this.$dispatch('ws.resource.remove', { data: this });
|
|
@@ -1293,8 +1322,7 @@ export default class Resource {
|
|
|
1293
1322
|
}
|
|
1294
1323
|
|
|
1295
1324
|
get detailLocation() {
|
|
1296
|
-
|
|
1297
|
-
return location;
|
|
1325
|
+
return this._detailLocation;
|
|
1298
1326
|
}
|
|
1299
1327
|
|
|
1300
1328
|
goToDetail() {
|
|
@@ -1320,9 +1348,7 @@ export default class Resource {
|
|
|
1320
1348
|
this.currentRouter().push(location);
|
|
1321
1349
|
}
|
|
1322
1350
|
|
|
1323
|
-
goToEdit(moreQuery = {}) {
|
|
1324
|
-
const location = this.detailLocation;
|
|
1325
|
-
|
|
1351
|
+
goToEdit(moreQuery = {}, location = this.detailLocation) {
|
|
1326
1352
|
location.query = {
|
|
1327
1353
|
...location.query,
|
|
1328
1354
|
[MODE]: _EDIT,
|
|
@@ -1505,11 +1531,11 @@ export default class Resource {
|
|
|
1505
1531
|
}
|
|
1506
1532
|
}
|
|
1507
1533
|
|
|
1508
|
-
async saveYaml(yaml) {
|
|
1509
|
-
await this._saveYaml(yaml);
|
|
1534
|
+
async saveYaml(yaml, initialYaml) {
|
|
1535
|
+
await this._saveYaml(yaml, initialYaml);
|
|
1510
1536
|
}
|
|
1511
1537
|
|
|
1512
|
-
async _saveYaml(yaml) {
|
|
1538
|
+
async _saveYaml(yaml, initialYaml, depth = 0) {
|
|
1513
1539
|
/* Multipart support, but need to know the right cluster and work for management store
|
|
1514
1540
|
and "apply" seems to only work for create, not update.
|
|
1515
1541
|
|
|
@@ -1547,20 +1573,56 @@ export default class Resource {
|
|
|
1547
1573
|
data: yaml
|
|
1548
1574
|
});
|
|
1549
1575
|
} else {
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1576
|
+
try {
|
|
1577
|
+
res = await this.followLink('update', {
|
|
1578
|
+
method: 'PUT',
|
|
1579
|
+
headers,
|
|
1580
|
+
data: yaml
|
|
1581
|
+
});
|
|
1582
|
+
} catch (err) {
|
|
1583
|
+
const IS_ERR_409 = err.status === 409 || err._status === 409;
|
|
1584
|
+
|
|
1585
|
+
// Conflict, the resource being edited has changed since starting editing
|
|
1586
|
+
if (IS_ERR_409 && depth === 0 && initialYaml) {
|
|
1587
|
+
const inStore = this.$rootGetters['currentStore'](this.type);
|
|
1588
|
+
|
|
1589
|
+
const initialValue = jsyaml.load(initialYaml);
|
|
1590
|
+
const value = jsyaml.load(yaml);
|
|
1591
|
+
const liveValue = this.$rootGetters[`${ inStore }/byId`](this.type, this.id);
|
|
1592
|
+
|
|
1593
|
+
const handledConflictErr = await handleConflict(
|
|
1594
|
+
initialValue,
|
|
1595
|
+
value,
|
|
1596
|
+
liveValue,
|
|
1597
|
+
{
|
|
1598
|
+
dispatch: this.$dispatch,
|
|
1599
|
+
getters: this.$rootGetters
|
|
1600
|
+
},
|
|
1601
|
+
this.$rootGetters['currentStore'](this.type),
|
|
1602
|
+
(v) => v.toJSON ? v.toJSON() : v
|
|
1603
|
+
);
|
|
1604
|
+
|
|
1605
|
+
if (handledConflictErr === false) {
|
|
1606
|
+
// It was automatically figured out, save again
|
|
1607
|
+
await this._saveYaml(jsyaml.dump(value), null, depth + 1);
|
|
1608
|
+
} else {
|
|
1609
|
+
throw handledConflictErr;
|
|
1610
|
+
}
|
|
1611
|
+
} else {
|
|
1612
|
+
throw err;
|
|
1613
|
+
}
|
|
1614
|
+
}
|
|
1555
1615
|
}
|
|
1556
1616
|
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1617
|
+
if (res) {
|
|
1618
|
+
await this.$dispatch(`load`, {
|
|
1619
|
+
data: res,
|
|
1620
|
+
existing: (isCreate ? this : undefined)
|
|
1621
|
+
});
|
|
1561
1622
|
|
|
1562
|
-
|
|
1563
|
-
|
|
1623
|
+
if (this.isSpoofed) {
|
|
1624
|
+
await this.$dispatch('cluster/findAll', { type: this.type, opt: { force: true } }, { root: true });
|
|
1625
|
+
}
|
|
1564
1626
|
}
|
|
1565
1627
|
}
|
|
1566
1628
|
|
|
@@ -1793,6 +1855,7 @@ export default class Resource {
|
|
|
1793
1855
|
}
|
|
1794
1856
|
|
|
1795
1857
|
if ( r.selector ) {
|
|
1858
|
+
// A selector is a stringified version of a matchLabel (https://github.com/kubernetes/apimachinery/blob/master/pkg/labels/selector.go#L1010)
|
|
1796
1859
|
addObjects(out.selectors, {
|
|
1797
1860
|
type: r.toType,
|
|
1798
1861
|
namespace: r.toNamespace,
|
|
@@ -1836,15 +1899,35 @@ export default class Resource {
|
|
|
1836
1899
|
}
|
|
1837
1900
|
|
|
1838
1901
|
async _findRelationship(rel, direction) {
|
|
1902
|
+
// Find resources for this resource's metadata.relationships (steve prop)
|
|
1903
|
+
// These will either reference a selector (stringified matchLabels) OR specific resources (ids)
|
|
1839
1904
|
const { selectors, ids } = this._relationshipsFor(rel, direction);
|
|
1840
1905
|
const out = [];
|
|
1841
1906
|
|
|
1907
|
+
// Find all the resources that match the selector
|
|
1842
1908
|
for ( const sel of selectors ) {
|
|
1843
|
-
const
|
|
1909
|
+
const {
|
|
1910
|
+
type,
|
|
1911
|
+
selector,
|
|
1912
|
+
namespace,
|
|
1913
|
+
opt,
|
|
1914
|
+
} = sel;
|
|
1915
|
+
const matching = await this.$dispatch('findLabelSelector', {
|
|
1916
|
+
type,
|
|
1917
|
+
matching: {
|
|
1918
|
+
namespace,
|
|
1919
|
+
labelSelector: { matchExpressions: parse(selector) }
|
|
1920
|
+
},
|
|
1921
|
+
opts: {
|
|
1922
|
+
transient: true,
|
|
1923
|
+
...opt,
|
|
1924
|
+
},
|
|
1925
|
+
});
|
|
1844
1926
|
|
|
1845
1927
|
addObjects(out, matching.data);
|
|
1846
1928
|
}
|
|
1847
1929
|
|
|
1930
|
+
// Find all the resources that match the required id's
|
|
1848
1931
|
for ( const obj of ids ) {
|
|
1849
1932
|
const { type, id } = obj;
|
|
1850
1933
|
let matching = this.$getters['byId'](type, id);
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import _getters from '@shell/plugins/steve/getters';
|
|
2
2
|
|
|
3
|
-
const {
|
|
3
|
+
const {
|
|
4
|
+
urlFor, urlOptions, pathExistsInSchema, isSteveUrl
|
|
5
|
+
} = _getters;
|
|
4
6
|
|
|
5
7
|
describe('steve: getters:', () => {
|
|
6
8
|
describe('urlFor', () => {
|
|
@@ -66,18 +68,17 @@ describe('steve: getters:', () => {
|
|
|
66
68
|
});
|
|
67
69
|
|
|
68
70
|
describe('urlOptions', () => {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const urlOptionsGetter = urlOptions();
|
|
71
|
+
const urlOptionsGetter = urlOptions(undefined, {
|
|
72
|
+
isSteveUrl: isSteveUrl(),
|
|
73
|
+
isSteveCacheUrl: () => false,
|
|
74
|
+
});
|
|
75
|
+
const urlOptionsGetterVaiOn = urlOptions(undefined, {
|
|
76
|
+
isSteveUrl: isSteveUrl(),
|
|
77
|
+
isSteveCacheUrl: () => true,
|
|
78
|
+
});
|
|
78
79
|
|
|
79
80
|
it('expects urlOptions to return a function', () => {
|
|
80
|
-
expect(typeof urlOptions(
|
|
81
|
+
expect(typeof urlOptions()).toBe('function');
|
|
81
82
|
});
|
|
82
83
|
it('returns undefined when called without params', () => {
|
|
83
84
|
expect(urlOptionsGetter()).toBeUndefined();
|
|
@@ -103,6 +104,12 @@ describe('steve: getters:', () => {
|
|
|
103
104
|
it('returns a string with a multiple filter statements applied and formatted for steve if a single filter statement is applied and the url starts with "/v1"', () => {
|
|
104
105
|
expect(urlOptionsGetter('/v1/foo', { filter: { bar: 'baz', far: 'faz' } })).toBe('/v1/foo?filter=bar=baz&far=faz&exclude=metadata.managedFields');
|
|
105
106
|
});
|
|
107
|
+
it('returns a string with correct equality for vai off', () => {
|
|
108
|
+
expect(urlOptionsGetter('/v1/foo', { filter: { bar: 'baz', far: 'faz' } })).toBe('/v1/foo?filter=bar=baz&far=faz&exclude=metadata.managedFields');
|
|
109
|
+
});
|
|
110
|
+
it('returns a string with correct equality for vai on', () => {
|
|
111
|
+
expect(urlOptionsGetterVaiOn('/v1/foo', { filter: { bar: 'baz', far: 'faz' } })).toBe('/v1/foo?filter=bar~baz&far~faz&exclude=metadata.managedFields');
|
|
112
|
+
});
|
|
106
113
|
it('returns a string with a labelSelector and formatted for steve if the url starts with "/v1"', () => {
|
|
107
114
|
expect(urlOptionsGetter('/v1/foo', { labelSelector: 'a=b' })).toBe('/v1/foo?labelSelector=a=b&exclude=metadata.managedFields');
|
|
108
115
|
});
|
|
@@ -113,7 +120,7 @@ describe('steve: getters:', () => {
|
|
|
113
120
|
expect(urlOptionsGetter('/v1/foo', { excludeFields: ['bar'] })).toBe('/v1/foo?exclude=bar');
|
|
114
121
|
});
|
|
115
122
|
it('returns a string without an exclude statement for "managedFields" if omitExcludeFields includes it and the url starts with "/v1/"', () => {
|
|
116
|
-
expect(urlOptionsGetter('/v1/foo', { omitExcludeFields: ['metadata.managedFields'] })).toBe('/v1/foo
|
|
123
|
+
expect(urlOptionsGetter('/v1/foo', { omitExcludeFields: ['metadata.managedFields'] })).toBe('/v1/foo');
|
|
117
124
|
});
|
|
118
125
|
it('returns a string without an exclude statement if excludeFields is set but the url does not start with "/v1/"', () => {
|
|
119
126
|
expect(urlOptionsGetter('foo', { excludeFields: ['bar'] })).toBe('foo');
|