@rancher/shell 3.0.5-rc.3 → 3.0.5-rc.6
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 +1 -0
- package/assets/images/icons/document.svg +3 -0
- package/assets/images/key.svg +17 -0
- package/assets/images/vendor/cognito.svg +1 -0
- package/assets/styles/app.scss +1 -0
- package/assets/styles/base/_basic.scss +10 -0
- package/assets/styles/base/_spacing.scss +29 -0
- package/assets/styles/global/_form.scss +1 -1
- package/assets/styles/global/_labeled-input.scss +1 -1
- package/assets/styles/global/_layout.scss +1 -1
- package/assets/styles/themes/_dark.scss +28 -0
- package/assets/styles/themes/_light.scss +68 -0
- package/assets/styles/vendor/vue-select.scss +1 -1
- package/assets/translations/en-us.yaml +721 -83
- package/assets/translations/zh-hans.yaml +11 -9
- package/cloud-credential/gcp.vue +9 -1
- package/components/AppModal.vue +2 -0
- package/components/Certificates.vue +5 -0
- package/components/CodeMirror.vue +1 -1
- package/components/ConfigMapSettings/Settings.vue +377 -0
- package/components/ConfigMapSettings/index.vue +354 -0
- package/components/CruResource.vue +1 -2
- package/components/DetailText.vue +61 -11
- package/components/Drawer/Chrome.vue +116 -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 +82 -0
- package/components/Drawer/ResourceDetailDrawer/__tests__/helpers.test.ts +42 -0
- package/components/Drawer/ResourceDetailDrawer/composables.ts +50 -0
- package/components/Drawer/ResourceDetailDrawer/helpers.ts +10 -0
- package/components/Drawer/ResourceDetailDrawer/index.vue +110 -0
- package/components/FilterPanel.vue +156 -0
- 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/LocaleSelector.vue +9 -1
- package/components/ProgressBarMulti.vue +1 -0
- package/components/PromptModal.vue +6 -1
- package/components/PromptRemove.vue +5 -1
- 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 +64 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +298 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +133 -0
- package/components/Resource/Detail/Metadata/KeyValue.vue +138 -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 +32 -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 +78 -0
- package/components/Resource/Detail/Metadata/index.vue +73 -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 +44 -0
- package/components/Resource/Detail/TitleBar/index.vue +196 -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/__tests__/index.test.ts +135 -0
- package/components/ResourceDetail/index.vue +73 -557
- package/components/ResourceDetail/legacy.vue +562 -0
- package/components/ResourceList/Masthead.vue +6 -0
- package/components/ResourceTable.vue +41 -7
- package/components/ResourceYaml.vue +14 -1
- package/components/SlideInPanelManager.vue +117 -10
- package/components/SortableTable/index.vue +13 -2
- package/components/SortableTable/selection.js +21 -8
- package/components/StateDot/index.vue +28 -0
- package/components/StatusBadge.vue +6 -4
- package/components/SubtleLink.vue +25 -0
- package/components/Tabbed/index.vue +11 -15
- package/components/Wizard.vue +16 -3
- package/components/YamlEditor.vue +1 -1
- package/components/__tests__/ConfigMapSettings.test.ts +376 -0
- package/components/__tests__/FilterPanel.test.ts +81 -0
- package/components/__tests__/GrowlManager.test.ts +0 -25
- package/components/auth/AuthBanner.vue +2 -3
- package/components/auth/RoleDetailEdit.vue +45 -3
- package/components/auth/login/ldap.vue +1 -1
- 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 +53 -26
- 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 +383 -0
- package/components/form/ArrayList.vue +19 -2
- package/components/form/ChangePassword.vue +3 -1
- package/components/form/Footer.vue +10 -4
- package/components/form/KeyValue.vue +81 -43
- package/components/form/LabeledSelect.vue +56 -16
- package/components/form/Labels.vue +90 -17
- package/components/form/MatchExpressions.vue +46 -5
- package/components/form/NameNsDescription.vue +1 -1
- package/components/form/ResourceSelector.vue +1 -0
- package/components/form/ResourceTabs/index.vue +5 -0
- package/components/form/SecretSelector.vue +9 -2
- package/components/form/Select.vue +57 -19
- package/components/form/SimpleSecretSelector.vue +17 -4
- package/components/form/Taints.vue +21 -2
- package/components/form/UnitInput.vue +8 -0
- package/components/form/ValueFromResource.vue +31 -19
- package/components/form/__tests__/LabeledSelect.test.ts +8 -4
- package/components/form/__tests__/Labels.test.ts +360 -0
- package/components/form/__tests__/MatchExpressions.test.ts +16 -13
- package/components/form/__tests__/Select.test.ts +5 -2
- package/components/formatter/FleetApplicationClustersReady.vue +77 -0
- package/components/formatter/FleetApplicationSource.vue +71 -0
- package/components/formatter/FleetSummaryGraph.vue +7 -0
- package/components/formatter/WorkloadHealthScale.vue +1 -1
- package/components/google/AccountAccess.vue +211 -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 +70 -47
- package/components/nav/Header.vue +13 -8
- package/components/nav/NamespaceFilter.vue +13 -1
- package/components/nav/NotificationCenter/Notification.vue +510 -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/composables/drawer.ts +26 -0
- 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 +20 -11
- package/config/product/auth.js +17 -1
- package/config/product/{cis.js → compliance.js} +23 -26
- package/config/product/explorer.js +5 -1
- package/config/product/fleet.js +77 -17
- package/config/product/settings.js +22 -11
- package/config/query-params.js +6 -1
- package/config/roles.ts +2 -1
- package/config/router/navigation-guards/authentication.js +51 -2
- package/config/router/routes.js +45 -31
- package/config/secret.ts +15 -0
- package/config/settings.ts +24 -5
- package/config/store.js +2 -0
- package/config/system-namespaces.js +1 -1
- package/config/table-headers.js +53 -23
- package/config/types.js +17 -6
- package/core/plugin-helpers.ts +3 -2
- package/core/plugin.ts +32 -7
- package/core/types.ts +18 -1
- package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
- package/detail/fleet.cattle.io.cluster.vue +28 -15
- package/detail/fleet.cattle.io.gitrepo.vue +10 -1
- 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/node.vue +2 -2
- package/detail/pod.vue +2 -2
- package/detail/service.vue +10 -1
- package/detail/workload/index.vue +8 -2
- package/dialog/ExtensionCatalogUninstallDialog.vue +7 -4
- package/dialog/GenericPrompt.vue +1 -1
- package/dialog/HelmOpForceUpdateDialog.vue +132 -0
- package/dialog/ImportDialog.vue +8 -8
- package/dialog/OidcClientSecretDialog.vue +117 -0
- package/dialog/RedeployWorkloadDialog.vue +164 -0
- package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
- package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +60 -68
- 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 +4 -1
- package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
- package/edit/fleet.cattle.io.gitrepo.vue +70 -255
- package/edit/fleet.cattle.io.helmop.vue +772 -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 +1 -0
- 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 +30 -30
- 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 +1 -0
- package/edit/networking.istio.io.destinationrule/index.vue +4 -1
- package/edit/networking.k8s.io.ingress/index.vue +4 -1
- package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +7 -2
- package/edit/networking.k8s.io.networkpolicy/index.vue +6 -2
- package/edit/node.vue +1 -0
- package/edit/persistentvolume/index.vue +4 -1
- package/edit/provisioning.cattle.io.cluster/rke2.vue +418 -382
- package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +27 -27
- package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
- package/edit/resources.cattle.io.restore.vue +1 -1
- package/edit/secret/index.vue +1 -0
- package/edit/service.vue +4 -1
- package/edit/serviceaccount.vue +4 -1
- package/edit/storage.k8s.io.storageclass/index.vue +4 -1
- package/edit/workload/index.vue +5 -0
- 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/management.cattle.io.oidcclient.vue +108 -0
- package/list/namespace.vue +5 -2
- package/list/node.vue +2 -0
- package/machine-config/amazonec2.vue +3 -24
- package/machine-config/components/GCEImage.vue +374 -0
- package/machine-config/google.vue +617 -0
- 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/index.js +5 -0
- package/mixins/preset.js +100 -0
- package/mixins/resource-fetch-api-pagination.js +18 -0
- package/mixins/resource-fetch.js +1 -1
- package/mixins/resource-table-watch.js +45 -0
- package/mixins/vue-select-overrides.js +1 -0
- package/models/__tests__/chart.test.ts +273 -0
- package/models/__tests__/fleet.cattle.io.gitrepo.test.ts +1 -1
- package/models/chart.js +144 -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 +314 -0
- package/models/fleet.cattle.io.bundle.js +9 -8
- package/models/fleet.cattle.io.cluster.js +11 -0
- package/models/fleet.cattle.io.gitrepo.js +41 -365
- package/models/fleet.cattle.io.helmop.js +198 -0
- package/models/management.cattle.io.authconfig.js +1 -0
- package/models/management.cattle.io.fleetworkspace.js +14 -1
- package/models/management.cattle.io.oidcclient.js +18 -0
- package/models/management.cattle.io.registration.js +3 -0
- package/models/provisioning.cattle.io.cluster.js +5 -5
- package/models/service.js +4 -0
- package/models/workload.js +19 -18
- package/package.json +2 -1
- package/pages/about.vue +4 -58
- package/pages/auth/login.vue +1 -1
- 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 +54 -0
- package/pages/c/_cluster/apps/charts/StatusLabel.vue +33 -0
- package/pages/c/_cluster/apps/charts/index.vue +487 -465
- 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 +3 -3
- package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
- package/pages/c/_cluster/fleet/__tests__/index.test.ts +426 -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 +809 -329
- package/pages/c/_cluster/fleet/settings/index.vue +229 -0
- package/pages/c/_cluster/longhorn/index.vue +5 -2
- package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
- package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
- package/pages/explorer/resource/detail/configmap.vue +42 -0
- package/pages/explorer/resource/detail/secret.vue +50 -0
- package/pages/home.vue +9 -55
- package/pages/support/index.vue +4 -6
- package/plugins/dashboard-store/actions.js +50 -14
- package/plugins/dashboard-store/getters.js +38 -21
- package/plugins/dashboard-store/mutations.js +51 -7
- package/plugins/dashboard-store/resource-class.js +30 -4
- package/plugins/steve/__tests__/subscribe.spec.ts +66 -1
- package/plugins/steve/actions.js +3 -0
- package/plugins/steve/steve-pagination-utils.ts +17 -8
- package/plugins/steve/subscribe.js +235 -43
- package/rancher-components/BadgeState/BadgeState.vue +3 -1
- package/rancher-components/Banner/Banner.vue +13 -0
- package/rancher-components/Form/Checkbox/Checkbox.vue +11 -6
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +1 -1
- package/rancher-components/LabeledTooltip/LabeledTooltip.vue +1 -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/store/auth.js +3 -0
- package/store/catalog.js +85 -25
- package/store/growl.js +97 -8
- package/store/index.js +39 -14
- package/store/notifications.ts +426 -0
- package/store/prefs.js +0 -1
- package/store/slideInPanel.ts +6 -0
- package/store/type-map.js +19 -15
- package/store/uiplugins.ts +15 -1
- package/types/fleet.d.ts +59 -0
- package/types/notifications/index.ts +74 -0
- package/types/resources/settings.d.ts +19 -1
- package/types/shell/index.d.ts +388 -307
- package/types/store/dashboard-store.types.ts +33 -3
- package/types/store/pagination.types.ts +6 -1
- package/types/store/subscribe.types.ts +50 -0
- package/utils/__tests__/fleet.test.ts +148 -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 -5
- package/utils/crypto/encryption.ts +103 -0
- package/utils/cspAdaptor.ts +51 -0
- package/utils/fleet-types.ts +0 -0
- package/utils/fleet.ts +190 -2
- package/utils/object.js +36 -0
- package/utils/pagination-utils.ts +27 -2
- package/utils/pagination-wrapper.ts +132 -50
- package/utils/release-notes.ts +48 -0
- package/utils/selector-typed.ts +7 -2
- 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 +22 -0
- package/utils/validators/formRules/__tests__/index.test.ts +36 -3
- package/utils/validators/formRules/index.ts +13 -3
- package/utils/window.js +11 -7
- package/components/__tests__/ApplicationCard.test.ts +0 -27
- package/components/cards/ApplicationCard.vue +0 -145
- package/components/fleet/ForceDirectedTreeChart/chartIcons.js +0 -17
- package/config/product/legacy.js +0 -62
- package/config/secret.js +0 -14
- 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
- /package/components/ResourceDetail/{Masthead.vue → Masthead/legacy.vue} +0 -0
- /package/{components/form/SSHKnownHosts → dialog}/__tests__/KnownHostsEditDialog.test.ts +0 -0
package/utils/auth.js
CHANGED
|
@@ -8,6 +8,9 @@ import { allHash } from '@shell/utils/promise';
|
|
|
8
8
|
import { getProductFromRoute, getResourceFromRoute } from '@shell/utils/router';
|
|
9
9
|
import { NAME as EXPLORER } from '@shell/config/product/explorer';
|
|
10
10
|
import { findBy } from '@shell/utils/array';
|
|
11
|
+
import { onExtensionsReady } from '@shell/utils/uiplugins';
|
|
12
|
+
|
|
13
|
+
export const AUTH_BROADCAST_CHANNEL_NAME = 'rancher-auth-test-callback';
|
|
11
14
|
|
|
12
15
|
export function openAuthPopup(url, provider) {
|
|
13
16
|
const popup = new Popup(() => {
|
|
@@ -16,19 +19,46 @@ export function openAuthPopup(url, provider) {
|
|
|
16
19
|
popup.reject = reject;
|
|
17
20
|
});
|
|
18
21
|
|
|
22
|
+
const bc = new BroadcastChannel(AUTH_BROADCAST_CHANNEL_NAME);
|
|
23
|
+
|
|
19
24
|
window.onAuthTest = (error, code) => {
|
|
20
25
|
if (error) {
|
|
21
26
|
popup.reject(error);
|
|
22
27
|
}
|
|
23
28
|
|
|
29
|
+
bc.close();
|
|
24
30
|
delete window.onAuthTest;
|
|
25
31
|
popup.resolve(code);
|
|
26
32
|
};
|
|
27
|
-
|
|
28
|
-
|
|
33
|
+
|
|
34
|
+
// Broadcast message listener for when the window can not invoke a method on the opener
|
|
35
|
+
bc.onmessage = (msgEvent) => {
|
|
36
|
+
try {
|
|
37
|
+
const obj = JSON.parse(msgEvent.data);
|
|
38
|
+
const { error, code } = obj;
|
|
39
|
+
|
|
40
|
+
window.onAuthTest(error, code);
|
|
41
|
+
} catch (e) {
|
|
42
|
+
window.onAuthTest(new Error(`Access was not authorized (invalid callback metadata)`));
|
|
43
|
+
|
|
44
|
+
console.error('Unable to process message from auth broadcast channel', e); // eslint-disable-line no-console
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}, (e) => {
|
|
48
|
+
let detail = '';
|
|
49
|
+
|
|
50
|
+
// If there was an error and it has a message, add that to the message we send back via the promise
|
|
51
|
+
if (e?.type === 'error' && e?.message) {
|
|
52
|
+
detail = ` (${ e.message })`;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
popup.reject(new Error(`Access was not authorized${ detail }`));
|
|
29
56
|
});
|
|
30
57
|
|
|
31
|
-
|
|
58
|
+
// So far, only Amazon Cognito sets the origin policy that prevents us from detecting when the popup is closed
|
|
59
|
+
const doNotPollForClosure = provider === 'cognito';
|
|
60
|
+
|
|
61
|
+
popup.open(url, 'auth-test', popupWindowOptions(), doNotPollForClosure);
|
|
32
62
|
|
|
33
63
|
return popup.promise;
|
|
34
64
|
}
|
|
@@ -304,9 +334,15 @@ export async function tryInitialSetup(store, password = 'admin') {
|
|
|
304
334
|
/**
|
|
305
335
|
* Record in our state management that we're indeed logged in
|
|
306
336
|
*/
|
|
307
|
-
export function isLoggedIn(store,
|
|
337
|
+
export async function isLoggedIn(store, userData) {
|
|
308
338
|
store.commit('auth/hasAuth', true);
|
|
309
|
-
store.commit('auth/loggedInAs',
|
|
339
|
+
store.commit('auth/loggedInAs', userData.id);
|
|
340
|
+
|
|
341
|
+
// Init the notification center now that we know who the user is
|
|
342
|
+
await store.dispatch('notifications/init', userData);
|
|
343
|
+
|
|
344
|
+
// Let the extensions know that the user is logged in
|
|
345
|
+
await onExtensionsReady(store);
|
|
310
346
|
}
|
|
311
347
|
|
|
312
348
|
/**
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers for string encryption and decryption
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// We just use a static salt
|
|
6
|
+
const SALT = new TextEncoder().encode('rancher-dashboard');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Type for the result of encryption
|
|
10
|
+
*/
|
|
11
|
+
export type EncryptedString = {
|
|
12
|
+
cipher: string;
|
|
13
|
+
iv: string;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Generate an encryption key from a password
|
|
18
|
+
*
|
|
19
|
+
* @param password Password to use for the key
|
|
20
|
+
* @returns Encryption key
|
|
21
|
+
*/
|
|
22
|
+
export async function deriveKey(password: string): Promise<CryptoKey> {
|
|
23
|
+
const passwordBytes = stringToBytes(password);
|
|
24
|
+
|
|
25
|
+
const initialKey = await crypto.subtle.importKey(
|
|
26
|
+
'raw',
|
|
27
|
+
passwordBytes,
|
|
28
|
+
{ name: 'PBKDF2' },
|
|
29
|
+
false,
|
|
30
|
+
['deriveKey']
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
return await crypto.subtle.deriveKey(
|
|
34
|
+
{
|
|
35
|
+
name: 'PBKDF2',
|
|
36
|
+
salt: SALT,
|
|
37
|
+
iterations: 100000,
|
|
38
|
+
hash: 'SHA-256'
|
|
39
|
+
},
|
|
40
|
+
initialKey,
|
|
41
|
+
{
|
|
42
|
+
name: 'AES-GCM',
|
|
43
|
+
length: 256
|
|
44
|
+
},
|
|
45
|
+
false,
|
|
46
|
+
[
|
|
47
|
+
'encrypt',
|
|
48
|
+
'decrypt'
|
|
49
|
+
]
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Encrypt data
|
|
55
|
+
*
|
|
56
|
+
* @param content String to be encrypted
|
|
57
|
+
* @param key Encryption key
|
|
58
|
+
* @returns Encrypted data
|
|
59
|
+
*/
|
|
60
|
+
export async function encrypt(content: string, key: CryptoKey): Promise<EncryptedString> {
|
|
61
|
+
const iv = crypto.getRandomValues(new Uint8Array(12));
|
|
62
|
+
const contentBytes = stringToBytes(content);
|
|
63
|
+
const cipher = new Uint8Array(
|
|
64
|
+
await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, contentBytes)
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
iv: bytesToBase64(iv),
|
|
69
|
+
cipher: bytesToBase64(cipher),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Decrypt encrypted data
|
|
75
|
+
* @param encryptedData Encrypted data with `cipher` and `iv` field
|
|
76
|
+
* @param key Key to use for decryption
|
|
77
|
+
* @returns Decrypted value as a string
|
|
78
|
+
*/
|
|
79
|
+
export async function decrypt(encryptedData: EncryptedString, key: CryptoKey): Promise<string> {
|
|
80
|
+
const iv = base64ToBytes(encryptedData.iv);
|
|
81
|
+
const cipher = base64ToBytes(encryptedData.cipher);
|
|
82
|
+
const contentBytes = new Uint8Array(
|
|
83
|
+
await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, cipher)
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
return bytesToString(contentBytes);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function bytesToString(bytes: any): string {
|
|
90
|
+
return new TextDecoder().decode(bytes);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function stringToBytes(str: string): Uint8Array {
|
|
94
|
+
return new TextEncoder().encode(str);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function bytesToBase64(arr: Uint8Array) {
|
|
98
|
+
return btoa(Array.from(arr, (b: number) => String.fromCharCode(b)).join(''));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function base64ToBytes(base64: string): Uint8Array {
|
|
102
|
+
return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));
|
|
103
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// For testing these could be changed to something like...
|
|
2
|
+
|
|
3
|
+
import { CATALOG } from '@shell/config/types';
|
|
4
|
+
import { FilterArgs, PaginationFilterField, PaginationParamFilter } from '@shell/types/store/pagination.types';
|
|
5
|
+
import { VuexStore } from '@shell/types/store/vuex';
|
|
6
|
+
|
|
7
|
+
const CSP_ADAPTER_APPS = ['rancher-csp-adapter', 'rancher-csp-billing-adapter'];
|
|
8
|
+
// For testing above line could be replaced with below line...
|
|
9
|
+
// const cspAdaptorApp = ['rancher-webhooka', 'rancher-webhook'];
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Helpers in order to
|
|
13
|
+
*/
|
|
14
|
+
class CspAdapterUtils {
|
|
15
|
+
static canPagination($store: VuexStore): boolean {
|
|
16
|
+
return $store.getters[`management/paginationEnabled`]({ id: CATALOG.APP, context: 'branding' });
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
static fetchCspAdaptorApp($store: VuexStore): Promise<any> {
|
|
20
|
+
// For the login page, the schemas won't be loaded - we don't need the apps in this case
|
|
21
|
+
if ($store.getters['management/canList'](CATALOG.APP)) {
|
|
22
|
+
if (CspAdapterUtils.canPagination($store)) {
|
|
23
|
+
// Restrict the amount of apps we need to fetch
|
|
24
|
+
return $store.dispatch('management/findPage', {
|
|
25
|
+
type: CATALOG.APP,
|
|
26
|
+
opt: { // Of type ActionFindPageArgs
|
|
27
|
+
pagination: new FilterArgs({
|
|
28
|
+
filters: PaginationParamFilter.createMultipleFields(CSP_ADAPTER_APPS.map(
|
|
29
|
+
(t) => new PaginationFilterField({
|
|
30
|
+
field: 'metadata.name',
|
|
31
|
+
value: t,
|
|
32
|
+
})
|
|
33
|
+
)),
|
|
34
|
+
})
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return $store.dispatch('management/findAll', { type: CATALOG.APP });
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return Promise.resolve([]);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
static hasCspAdapter({ $store, apps }: { $store: VuexStore, apps: any[]}): Object {
|
|
46
|
+
// In theory this should contain the filtered apps when pagination is on, and all apps when off. Keep filtering though in both cases just in case
|
|
47
|
+
return apps?.find((a) => CSP_ADAPTER_APPS.includes(a.metadata?.name));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export default CspAdapterUtils;
|
|
File without changes
|
package/utils/fleet.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isEmpty, isEqual } from 'lodash';
|
|
1
2
|
import {
|
|
2
3
|
BundleDeploymentResource,
|
|
3
4
|
BundleResourceKey,
|
|
@@ -5,9 +6,11 @@ import {
|
|
|
5
6
|
BundleDeploymentStatus,
|
|
6
7
|
Condition,
|
|
7
8
|
} from '@shell/types/resources/fleet';
|
|
8
|
-
import { mapStateToEnum, STATES_ENUM } from '@shell/plugins/dashboard-store/resource-class';
|
|
9
|
-
import { FLEET as FLEET_LABELS } from '@shell/config/labels-annotations';
|
|
9
|
+
import { mapStateToEnum, STATES_ENUM, STATES } from '@shell/plugins/dashboard-store/resource-class';
|
|
10
|
+
import { FLEET as FLEET_LABELS, CAPI } from '@shell/config/labels-annotations';
|
|
10
11
|
import { NAME as EXPLORER_NAME } from '@shell/config/product/explorer';
|
|
12
|
+
import { FleetDashboardState, FleetResourceState, Target, TargetMode } from '@shell/types/fleet';
|
|
13
|
+
import { FLEET, VIRTUAL_HARVESTER_PROVIDER } from '@shell/config/types';
|
|
11
14
|
|
|
12
15
|
interface Resource extends BundleDeploymentResource {
|
|
13
16
|
state: string,
|
|
@@ -29,7 +32,139 @@ function conditionIsTrue(conditions: Condition[] | undefined, type: string): boo
|
|
|
29
32
|
return !!conditions.find((c) => c.type === type && c.status.toLowerCase() === 'true');
|
|
30
33
|
}
|
|
31
34
|
|
|
35
|
+
class Application {
|
|
36
|
+
excludeHarvesterRule = {
|
|
37
|
+
clusterSelector: {
|
|
38
|
+
matchExpressions: [{
|
|
39
|
+
key: CAPI.PROVIDER,
|
|
40
|
+
operator: 'NotIn',
|
|
41
|
+
values: [
|
|
42
|
+
VIRTUAL_HARVESTER_PROVIDER
|
|
43
|
+
],
|
|
44
|
+
}],
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
getTargetMode(targets: Target[], namespace: string): TargetMode {
|
|
49
|
+
if (namespace === 'fleet-local') {
|
|
50
|
+
return 'local';
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (!targets.length) {
|
|
54
|
+
return 'none';
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
let mode: TargetMode = 'all';
|
|
58
|
+
|
|
59
|
+
for (const target of targets) {
|
|
60
|
+
const {
|
|
61
|
+
clusterName,
|
|
62
|
+
clusterSelector,
|
|
63
|
+
clusterGroup,
|
|
64
|
+
clusterGroupSelector,
|
|
65
|
+
} = target;
|
|
66
|
+
|
|
67
|
+
if (clusterGroup || clusterGroupSelector) {
|
|
68
|
+
return 'advanced';
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (clusterName) {
|
|
72
|
+
mode = 'clusters';
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (!isEmpty(clusterSelector)) {
|
|
76
|
+
mode = 'clusters';
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const normalized = [...targets].map((target) => {
|
|
81
|
+
delete target.name;
|
|
82
|
+
|
|
83
|
+
return target;
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
// Check if targets contains only harvester rule after name normalizing
|
|
87
|
+
if (isEqual(normalized, [this.excludeHarvesterRule])) {
|
|
88
|
+
mode = 'all';
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return mode;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
32
95
|
class Fleet {
|
|
96
|
+
resourceIcons = {
|
|
97
|
+
[FLEET.GIT_REPO]: 'icon icon-github',
|
|
98
|
+
[FLEET.HELM_OP]: 'icon icon-helm',
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
dashboardIcons = {
|
|
102
|
+
[FLEET.GIT_REPO]: 'icon icon-git',
|
|
103
|
+
[FLEET.HELM_OP]: 'icon icon-helm',
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
dashboardStates: FleetDashboardState[] = [
|
|
107
|
+
{
|
|
108
|
+
index: 0,
|
|
109
|
+
id: 'error',
|
|
110
|
+
label: 'Error',
|
|
111
|
+
color: '#F64747',
|
|
112
|
+
icon: 'icon icon-error',
|
|
113
|
+
stateBackground: 'bg-error'
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
index: 1,
|
|
117
|
+
id: 'warning',
|
|
118
|
+
label: 'Warning',
|
|
119
|
+
color: '#DAC342',
|
|
120
|
+
icon: 'icon icon-warning',
|
|
121
|
+
stateBackground: 'bg-warning'
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
index: 2,
|
|
125
|
+
id: 'success',
|
|
126
|
+
label: 'Active',
|
|
127
|
+
color: '#5D995D',
|
|
128
|
+
icon: 'icon icon-checkmark',
|
|
129
|
+
stateBackground: 'bg-success'
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
index: 3,
|
|
133
|
+
id: 'info',
|
|
134
|
+
label: 'Pending',
|
|
135
|
+
color: '#3d98d3',
|
|
136
|
+
icon: 'icon icon-warning',
|
|
137
|
+
stateBackground: 'bg-info'
|
|
138
|
+
},
|
|
139
|
+
];
|
|
140
|
+
|
|
141
|
+
Application = new Application();
|
|
142
|
+
|
|
143
|
+
GIT_HTTPS_REGEX = /^https?:\/\/github\.com\/(.*?)(\.git)?\/*$/;
|
|
144
|
+
GIT_SSH_REGEX = /^git@github\.com:.*\.git$/;
|
|
145
|
+
HTTP_REGEX = /^(https?:\/\/[^\s]+)$/;
|
|
146
|
+
OCI_REGEX = /^oci:\/\//;
|
|
147
|
+
|
|
148
|
+
quacksLikeAHash(str: string) {
|
|
149
|
+
if (str.match(/^[a-f0-9]{40,}$/i)) {
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
parseSSHUrl(url: string) {
|
|
157
|
+
const parts = (url || '').split(':');
|
|
158
|
+
|
|
159
|
+
const sshUserAndHost = parts[0];
|
|
160
|
+
const repoPath = parts[1]?.replace('.git', '');
|
|
161
|
+
|
|
162
|
+
return {
|
|
163
|
+
sshUserAndHost,
|
|
164
|
+
repoPath
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
33
168
|
resourceId(r: BundleResourceKey): string {
|
|
34
169
|
return r.namespace ? `${ r.namespace }/${ r.name }` : r.name;
|
|
35
170
|
}
|
|
@@ -126,6 +261,59 @@ class Fleet {
|
|
|
126
261
|
return STATES_ENUM.READY;
|
|
127
262
|
}
|
|
128
263
|
}
|
|
264
|
+
|
|
265
|
+
getResourcesDefaultState(labelGetter: (key: string, args: any, fallback: any) => Record<string, any>, stateKey: string): Record<string, FleetResourceState> {
|
|
266
|
+
return [
|
|
267
|
+
STATES_ENUM.READY,
|
|
268
|
+
STATES_ENUM.NOT_READY,
|
|
269
|
+
STATES_ENUM.WAIT_APPLIED,
|
|
270
|
+
STATES_ENUM.MODIFIED,
|
|
271
|
+
STATES_ENUM.MISSING,
|
|
272
|
+
STATES_ENUM.ORPHANED,
|
|
273
|
+
STATES_ENUM.UNKNOWN,
|
|
274
|
+
].reduce((acc: Record<string, any>, state) => {
|
|
275
|
+
acc[state] = {
|
|
276
|
+
count: 0,
|
|
277
|
+
color: STATES[state].color,
|
|
278
|
+
label: labelGetter(`${ stateKey }.${ state }`, null, STATES[state].label ),
|
|
279
|
+
status: state
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
return acc;
|
|
283
|
+
}, {});
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
getBundlesDefaultState(labelGetter: (key: string, args: any, fallback: any) => Record<string, any>, stateKey: string): Record<string, FleetResourceState> {
|
|
287
|
+
return [
|
|
288
|
+
STATES_ENUM.READY,
|
|
289
|
+
STATES_ENUM.INFO,
|
|
290
|
+
STATES_ENUM.WARNING,
|
|
291
|
+
STATES_ENUM.NOT_READY,
|
|
292
|
+
STATES_ENUM.ERROR,
|
|
293
|
+
STATES_ENUM.ERR_APPLIED,
|
|
294
|
+
STATES_ENUM.WAIT_APPLIED,
|
|
295
|
+
STATES_ENUM.UNKNOWN,
|
|
296
|
+
].reduce((acc: Record<string, any>, state) => {
|
|
297
|
+
acc[state] = {
|
|
298
|
+
count: 0,
|
|
299
|
+
color: STATES[state].color,
|
|
300
|
+
label: labelGetter(`${ stateKey }.${ state }`, null, STATES[state].label ),
|
|
301
|
+
status: state
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
return acc;
|
|
305
|
+
}, {});
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
getDashboardStateId(resource: { stateColor: string }): string {
|
|
309
|
+
return resource?.stateColor?.replace('text-', '') || 'warning';
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
getDashboardState(resource: { stateColor: string }): FleetDashboardState | {} {
|
|
313
|
+
const stateId = this.getDashboardStateId(resource);
|
|
314
|
+
|
|
315
|
+
return this.dashboardStates.find(({ id }) => stateId === id) || {};
|
|
316
|
+
}
|
|
129
317
|
}
|
|
130
318
|
|
|
131
319
|
const instance = new Fleet();
|
package/utils/object.js
CHANGED
|
@@ -527,3 +527,39 @@ export function mergeWithReplace(
|
|
|
527
527
|
}
|
|
528
528
|
});
|
|
529
529
|
}
|
|
530
|
+
/**
|
|
531
|
+
* Converts Object into a string of a format "key1, val1, key2, val2"
|
|
532
|
+
* @param {Object} input - KV object to convert
|
|
533
|
+
* @returns string
|
|
534
|
+
*/
|
|
535
|
+
export const convertKVToString = (input) => {
|
|
536
|
+
if (!input || typeof input !== 'object') return '';
|
|
537
|
+
|
|
538
|
+
return Object.entries(input)
|
|
539
|
+
.flatMap(([key, value]) => [key, String(value)])
|
|
540
|
+
.join(',');
|
|
541
|
+
};
|
|
542
|
+
|
|
543
|
+
/**
|
|
544
|
+
* Converts kv string into object
|
|
545
|
+
* @param {string} input - a string of a format "key1, val1, key2, val2"
|
|
546
|
+
* @returns
|
|
547
|
+
*/
|
|
548
|
+
export const convertStringToKV = ( input ) => {
|
|
549
|
+
if (!input?.trim()) return {};
|
|
550
|
+
|
|
551
|
+
const parts = input.split(',').map((part) => part.trim());
|
|
552
|
+
const result = {};
|
|
553
|
+
|
|
554
|
+
for (let i = 0; i < parts.length - 1; i += 2) {
|
|
555
|
+
const key = parts[i];
|
|
556
|
+
const value = parts[i + 1];
|
|
557
|
+
|
|
558
|
+
// Accept empty keys but ignore undefined values
|
|
559
|
+
if (typeof key === 'string') {
|
|
560
|
+
result[key] = value ?? '';
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
return result;
|
|
565
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PaginationSettings, PaginationSettingsStore } from '@shell/types/resources/settings';
|
|
1
|
+
import { PaginationFeature, PaginationSettings, PaginationSettingsStore } from '@shell/types/resources/settings';
|
|
2
2
|
import {
|
|
3
3
|
NAMESPACE_FILTER_ALL_USER as ALL_USER,
|
|
4
4
|
NAMESPACE_FILTER_ALL as ALL,
|
|
@@ -23,7 +23,7 @@ class PaginationUtils {
|
|
|
23
23
|
/**
|
|
24
24
|
* In places where we're using paginated features but not in a page... this is what the max results should be
|
|
25
25
|
*/
|
|
26
|
-
readonly defaultPageSize =
|
|
26
|
+
readonly defaultPageSize = 100000;
|
|
27
27
|
/**
|
|
28
28
|
* When a ns filter isn't one or more projects/namespaces... what are the valid values?
|
|
29
29
|
*
|
|
@@ -128,6 +128,31 @@ class PaginationUtils {
|
|
|
128
128
|
return false;
|
|
129
129
|
}
|
|
130
130
|
|
|
131
|
+
listAutoRefreshToggleEnabled({ rootGetters }: any): boolean {
|
|
132
|
+
return this.isFeatureEnabled({ rootGetters }, 'listAutoRefreshToggle');
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
isListManualRefreshEnabled({ rootGetters }: any): boolean {
|
|
136
|
+
return this.isFeatureEnabled({ rootGetters }, 'listManualRefresh');
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
private isFeatureEnabled({ rootGetters }: any, featureName: PaginationFeature): boolean {
|
|
140
|
+
// Cache must be enabled to support pagination api
|
|
141
|
+
if (!this.isSteveCacheEnabled({ rootGetters })) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const settings = this.getSettings({ rootGetters });
|
|
146
|
+
|
|
147
|
+
return !!settings.features?.[featureName]?.enabled;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
resourceChangesDebounceMs({ rootGetters }: any): number | undefined {
|
|
151
|
+
const settings = this.getSettings({ rootGetters });
|
|
152
|
+
|
|
153
|
+
return settings.resourceChangesDebounceMs;
|
|
154
|
+
}
|
|
155
|
+
|
|
131
156
|
validateNsProjectFilters(nsProjectFilters: string[]) {
|
|
132
157
|
return nsProjectFilters?.every((f) => this.validateNsProjectFilter(f));
|
|
133
158
|
}
|