@rancher/shell 3.0.5-rc.5 → 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/key.svg +17 -0
- package/assets/styles/base/_spacing.scss +2 -2
- package/assets/styles/global/_form.scss +1 -1
- package/assets/styles/global/_labeled-input.scss +1 -1
- package/assets/styles/themes/_dark.scss +3 -0
- package/assets/styles/themes/_light.scss +3 -0
- package/assets/styles/vendor/vue-select.scss +1 -1
- package/assets/translations/en-us.yaml +404 -64
- package/assets/translations/zh-hans.yaml +3 -4
- package/cloud-credential/gcp.vue +9 -1
- package/components/AppModal.vue +2 -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/GrowlManager.vue +16 -15
- package/components/IconOrSvg.vue +5 -0
- 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/RelatedResources.vue +4 -12
- package/components/Resource/Detail/Additional.vue +46 -0
- package/components/Resource/Detail/Metadata/Annotations/__tests__/index.test.ts +1 -1
- package/components/Resource/Detail/Metadata/Annotations/index.vue +5 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +223 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/composable.ts +37 -254
- package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +298 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +27 -5
- package/components/Resource/Detail/Metadata/KeyValue.vue +25 -17
- package/components/Resource/Detail/Metadata/Labels/__tests__/index.test.ts +1 -1
- package/components/Resource/Detail/Metadata/Labels/index.vue +4 -0
- package/components/Resource/Detail/Metadata/__tests__/KeyValue.test.ts +1 -1
- package/components/Resource/Detail/Metadata/__tests__/Rectangle.test.ts +1 -1
- package/components/Resource/Detail/Metadata/__tests__/composables.test.ts +75 -0
- package/components/Resource/Detail/Metadata/composables.ts +60 -11
- package/components/Resource/Detail/Metadata/index.vue +12 -5
- package/components/Resource/Detail/Page.vue +15 -0
- package/components/Resource/Detail/ResourceRow.vue +37 -18
- 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/TitleBar/Title.vue +2 -1
- package/components/Resource/Detail/TitleBar/__tests__/Title.test.ts +1 -1
- package/components/Resource/Detail/TitleBar/__tests__/Top.test.ts +1 -1
- package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +63 -0
- package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +1 -1
- package/components/Resource/Detail/TitleBar/composables.ts +44 -0
- package/components/Resource/Detail/TitleBar/index.vue +83 -11
- 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 +26 -5
- package/components/ResourceDetail/index.vue +30 -16
- package/components/ResourceDetail/legacy.vue +18 -1
- package/components/ResourceList/Masthead.vue +6 -0
- package/components/ResourceYaml.vue +14 -1
- package/components/SlideInPanelManager.vue +46 -7
- package/components/StateDot/index.vue +28 -0
- package/components/Tabbed/index.vue +11 -15
- package/components/Wizard.vue +4 -2
- package/components/__tests__/ConfigMapSettings.test.ts +376 -0
- package/components/__tests__/GrowlManager.test.ts +0 -25
- package/components/auth/login/ldap.vue +1 -1
- package/components/fleet/FleetApplications.vue +0 -7
- 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 +8 -0
- package/components/fleet/FleetRepos.vue +1 -6
- package/components/fleet/FleetResources.vue +4 -5
- 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 +13 -13
- package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
- package/components/fleet/dashboard/ResourceCard.vue +1 -0
- package/components/fleet/dashboard/ResourceCardSummary.vue +1 -5
- package/components/fleet/dashboard/ResourceDetails.vue +8 -10
- package/components/fleet/dashboard/ResourcePanel.vue +15 -8
- package/components/form/ArrayList.vue +13 -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 +9 -2
- package/components/form/Taints.vue +21 -2
- package/components/form/UnitInput.vue +8 -0
- package/components/form/ValueFromResource.vue +1 -1
- 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/FleetApplicationSource.vue +1 -1
- 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 +5 -1
- 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/composables/drawer.ts +26 -0
- package/composables/resources.test.ts +63 -0
- package/composables/resources.ts +38 -0
- package/composables/useIsNewDetailPageEnabled.ts +17 -0
- package/config/labels-annotations.js +6 -0
- package/config/product/auth.js +16 -1
- package/config/product/{cis.js → compliance.js} +23 -26
- package/config/product/explorer.js +5 -1
- package/config/product/fleet.js +7 -0
- package/config/product/settings.js +22 -11
- package/config/query-params.js +3 -0
- package/config/roles.ts +1 -1
- package/config/router/navigation-guards/authentication.js +51 -2
- package/config/router/routes.js +27 -31
- package/config/settings.ts +21 -3
- package/config/store.js +2 -0
- package/config/system-namespaces.js +1 -1
- package/config/table-headers.js +2 -2
- package/config/types.js +15 -6
- 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/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/ImportDialog.vue +8 -8
- package/dialog/OidcClientSecretDialog.vue +117 -0
- package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
- package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +5 -2
- 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 +44 -222
- package/edit/fleet.cattle.io.helmop.vue +44 -269
- 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 +1 -0
- 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/management.cattle.io.oidcclient.vue +108 -0
- 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/brand.js +16 -17
- package/mixins/create-edit-view/index.js +5 -0
- package/mixins/resource-fetch-api-pagination.js +16 -0
- package/mixins/vue-select-overrides.js +1 -0
- 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 +8 -79
- package/models/fleet.cattle.io.cluster.js +11 -0
- package/models/fleet.cattle.io.gitrepo.js +2 -2
- package/models/fleet.cattle.io.helmop.js +9 -39
- package/models/management.cattle.io.fleetworkspace.js +2 -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 +5 -0
- package/package.json +1 -1
- package/pages/about.vue +4 -58
- package/pages/auth/login.vue +1 -1
- package/pages/c/_cluster/apps/charts/AddRepoLink.vue +0 -1
- package/pages/c/_cluster/apps/charts/index.vue +285 -81
- package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
- 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/application/create.vue +3 -2
- package/pages/c/_cluster/fleet/index.vue +94 -56
- 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 +30 -7
- 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 +19 -5
- package/plugins/dashboard-store/getters.js +4 -0
- package/plugins/dashboard-store/resource-class.js +16 -2
- package/plugins/steve/steve-pagination-utils.ts +26 -18
- package/plugins/steve/subscribe.js +6 -1
- package/rancher-components/Banner/Banner.vue +13 -0
- package/rancher-components/Form/Checkbox/Checkbox.vue +9 -4
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +1 -1
- package/rancher-components/LabeledTooltip/LabeledTooltip.vue +1 -0
- package/rancher-components/RcItemCard/RcItemCard.vue +8 -3
- package/store/auth.js +2 -0
- package/store/catalog.js +23 -1
- package/store/growl.js +97 -8
- package/store/index.js +6 -0
- package/store/notifications.ts +426 -0
- package/store/prefs.js +0 -1
- package/store/type-map.js +19 -16
- package/store/uiplugins.ts +15 -1
- package/types/fleet.d.ts +24 -0
- package/types/notifications/index.ts +74 -0
- package/types/shell/index.d.ts +46 -32
- package/types/store/dashboard-store.types.ts +16 -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 +9 -2
- package/utils/crypto/encryption.ts +103 -0
- package/utils/cspAdaptor.ts +51 -0
- package/utils/fleet.ts +54 -65
- package/utils/object.js +36 -0
- package/utils/pagination-utils.ts +1 -1
- package/utils/release-notes.ts +48 -0
- package/utils/selector-typed.ts +7 -2
- package/utils/string.js +24 -0
- package/utils/{time.js → time.ts} +25 -6
- package/utils/uiplugins.ts +22 -0
- package/utils/validators/formRules/index.ts +3 -0
- package/components/Resource/Detail/TitleBar/composable.ts +0 -31
- package/config/product/legacy.js +0 -62
- 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
|
@@ -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
|
*
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { getVersionData } from '@shell/config/version';
|
|
2
|
+
import { READ_WHATS_NEW } from '@shell/store/prefs';
|
|
3
|
+
import { NotificationLevel } from '@shell/types/notifications';
|
|
4
|
+
|
|
5
|
+
export async function addReleaseNotesNotification(dispatch: any, getters: any) {
|
|
6
|
+
const rancherVersion = getVersionData().Version.split('-')[0];
|
|
7
|
+
const prefix = 'release-notes-';
|
|
8
|
+
const id = `${ prefix }${ rancherVersion }`;
|
|
9
|
+
let found = false;
|
|
10
|
+
const all = getters['notifications/all'];
|
|
11
|
+
const lastReadVersion = getters['prefs/get'](READ_WHATS_NEW) || '';
|
|
12
|
+
const t = getters['i18n/t'];
|
|
13
|
+
const releaseNotesUrl = getters['releaseNotesUrl'];
|
|
14
|
+
|
|
15
|
+
// Delete notification(s) for old release notes
|
|
16
|
+
for (let i = 0; i < all.length; i++) {
|
|
17
|
+
const notification = all[i];
|
|
18
|
+
|
|
19
|
+
if (notification.id.startsWith(prefix)) {
|
|
20
|
+
if (notification.id === id) {
|
|
21
|
+
found = true;
|
|
22
|
+
} else {
|
|
23
|
+
await dispatch('notifications/delete', notification.id);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Also use pref, so if we expired it, we don't add it back
|
|
29
|
+
if (!found && lastReadVersion !== rancherVersion) {
|
|
30
|
+
// Register notification
|
|
31
|
+
const notification = {
|
|
32
|
+
id,
|
|
33
|
+
level: NotificationLevel.Info,
|
|
34
|
+
title: t('landing.whatsNew.title', { version: rancherVersion }),
|
|
35
|
+
message: t('landing.whatsNew.message'),
|
|
36
|
+
preference: {
|
|
37
|
+
key: READ_WHATS_NEW,
|
|
38
|
+
value: rancherVersion
|
|
39
|
+
},
|
|
40
|
+
primaryAction: {
|
|
41
|
+
label: t('landing.whatsNew.link'),
|
|
42
|
+
target: releaseNotesUrl
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
await dispatch('notifications/add', notification);
|
|
47
|
+
}
|
|
48
|
+
}
|
package/utils/selector-typed.ts
CHANGED
|
@@ -34,7 +34,7 @@ export async function matching({
|
|
|
34
34
|
$store,
|
|
35
35
|
inScopeCount = undefined,
|
|
36
36
|
namespace = undefined,
|
|
37
|
-
transient =
|
|
37
|
+
transient = true,
|
|
38
38
|
}: {
|
|
39
39
|
/**
|
|
40
40
|
* Standard kube label selector object.
|
|
@@ -101,7 +101,12 @@ export async function matching({
|
|
|
101
101
|
const filterByNamespaceButNoNamespace = isNamespaced && !!namespace && (!safeNamespaces || safeNamespaces.length === 0);
|
|
102
102
|
const explicityNullLabelSelector = labelSelector === null || (labelSelector?.matchLabels === null && !labelSelector.matchExpressions === null);
|
|
103
103
|
|
|
104
|
-
|
|
104
|
+
// If we have matchLabels or matchExpression entries they must have a key
|
|
105
|
+
const matchLabelKeys = Object.keys(labelSelector.matchLabels || {});
|
|
106
|
+
const invalidMatchLabelKeys = matchLabelKeys.length && matchLabelKeys.filter((k) => !k).length;
|
|
107
|
+
const invalidMatchExpressionKeys = labelSelector?.matchExpressions?.length && labelSelector.matchExpressions.filter((me) => !me.key).length;
|
|
108
|
+
|
|
109
|
+
if (noCandidates || filterByNamespaceButNoNamespace || explicityNullLabelSelector || invalidMatchLabelKeys || invalidMatchExpressionKeys) {
|
|
105
110
|
return generateMatchingResponse([], inScopeCount || 0);
|
|
106
111
|
}
|
|
107
112
|
|
package/utils/string.js
CHANGED
|
@@ -358,3 +358,27 @@ export function isBase64(value) {
|
|
|
358
358
|
export function generateRandomAlphaString(length) {
|
|
359
359
|
return Array.from({ length }, () => String.fromCharCode(97 + Math.random() * 26 | 0)).join('');
|
|
360
360
|
}
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* Generate a key-value nested object from a list of paths that represents a directory tree.
|
|
364
|
+
*
|
|
365
|
+
* Each key is a subpath
|
|
366
|
+
* Each value contains the children of the subpath
|
|
367
|
+
*/
|
|
368
|
+
export function pathArrayToTree(paths) {
|
|
369
|
+
const result = [];
|
|
370
|
+
const level = { result };
|
|
371
|
+
|
|
372
|
+
paths.forEach((path) => {
|
|
373
|
+
path?.split('/').reduce((r, name) => {
|
|
374
|
+
if (!r[name]) {
|
|
375
|
+
r[name] = { result: [] };
|
|
376
|
+
r.result.push({ name, children: r[name].result });
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
return r[name];
|
|
380
|
+
}, level);
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
return result;
|
|
384
|
+
}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import day from 'dayjs';
|
|
2
|
+
import { escapeHtml } from '@shell/utils/string';
|
|
3
|
+
import { DATE_FORMAT, TIME_FORMAT } from '@shell/store/prefs';
|
|
4
|
+
import { type Store } from 'vuex';
|
|
2
5
|
|
|
3
6
|
const FACTORS = [60, 60, 24];
|
|
4
7
|
const LABELS = ['sec', 'min', 'hour', 'day'];
|
|
@@ -6,7 +9,7 @@ const LABELS = ['sec', 'min', 'hour', 'day'];
|
|
|
6
9
|
// Diff two dates and return an object with values for presentation
|
|
7
10
|
// If 't' is also passed, 'string' property is set on the return object with the diff formatted as a string
|
|
8
11
|
// e.g. formats a date difference to return '1 day', '20 hours' etc
|
|
9
|
-
export function diffFrom(value, from, t) {
|
|
12
|
+
export function diffFrom(value: any, from: any, t: any) {
|
|
10
13
|
const now = day();
|
|
11
14
|
|
|
12
15
|
from = from || now;
|
|
@@ -15,7 +18,7 @@ export function diffFrom(value, from, t) {
|
|
|
15
18
|
let absDiff = Math.abs(diff);
|
|
16
19
|
|
|
17
20
|
let next = 1;
|
|
18
|
-
let label = '?';
|
|
21
|
+
let label: any = '?';
|
|
19
22
|
|
|
20
23
|
let i = 0;
|
|
21
24
|
|
|
@@ -30,7 +33,7 @@ export function diffFrom(value, from, t) {
|
|
|
30
33
|
} else {
|
|
31
34
|
label = Math.floor(absDiff);
|
|
32
35
|
}
|
|
33
|
-
const ret = {
|
|
36
|
+
const ret: any = {
|
|
34
37
|
diff,
|
|
35
38
|
absDiff,
|
|
36
39
|
label,
|
|
@@ -47,7 +50,7 @@ export function diffFrom(value, from, t) {
|
|
|
47
50
|
return ret;
|
|
48
51
|
}
|
|
49
52
|
|
|
50
|
-
export function safeSetTimeout(timeout, callback, that) {
|
|
53
|
+
export function safeSetTimeout(timeout: any, callback: any, that: any) {
|
|
51
54
|
if (timeout <= 2147483647) {
|
|
52
55
|
// Max value setTimeout can take is max 32 bit int (about 24.9 days)
|
|
53
56
|
return setTimeout(() => {
|
|
@@ -56,7 +59,7 @@ export function safeSetTimeout(timeout, callback, that) {
|
|
|
56
59
|
}
|
|
57
60
|
}
|
|
58
61
|
|
|
59
|
-
export function getSecondsDiff(startDate, endDate) {
|
|
62
|
+
export function getSecondsDiff(startDate: any, endDate: any) {
|
|
60
63
|
return Math.round(
|
|
61
64
|
Math.abs(Date.parse(endDate) - Date.parse(startDate)) / 1000
|
|
62
65
|
);
|
|
@@ -68,7 +71,7 @@ export function getSecondsDiff(startDate, endDate) {
|
|
|
68
71
|
* diff: update frequency in seconds
|
|
69
72
|
* label: content of the cell's column
|
|
70
73
|
*/
|
|
71
|
-
export function elapsedTime(seconds) {
|
|
74
|
+
export function elapsedTime(seconds: any) {
|
|
72
75
|
if (!seconds) {
|
|
73
76
|
return {};
|
|
74
77
|
}
|
|
@@ -119,3 +122,19 @@ export function elapsedTime(seconds) {
|
|
|
119
122
|
label: `${ hours }h${ minutes - (hours * 60) }m`,
|
|
120
123
|
};
|
|
121
124
|
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Format date and time using user preferences
|
|
128
|
+
* @param value Date string to format
|
|
129
|
+
* @returns Formatted date string
|
|
130
|
+
*/
|
|
131
|
+
export const dateTimeFormat = (value: string | undefined, store: Store<any>): string => {
|
|
132
|
+
if (!value) return '';
|
|
133
|
+
|
|
134
|
+
const dateFormat = escapeHtml( store.getters['prefs/get'](DATE_FORMAT));
|
|
135
|
+
const timeFormat = escapeHtml( store.getters['prefs/get'](TIME_FORMAT));
|
|
136
|
+
|
|
137
|
+
const format = `${ dateFormat } ${ timeFormat }`;
|
|
138
|
+
|
|
139
|
+
return day(value).format(format);
|
|
140
|
+
};
|
package/utils/uiplugins.ts
CHANGED
|
@@ -321,3 +321,25 @@ export async function getHelmChart(store: any, repository: any, chartName: strin
|
|
|
321
321
|
await new Promise((resolve) => setTimeout(resolve, RETRY_WAIT));
|
|
322
322
|
}
|
|
323
323
|
}
|
|
324
|
+
|
|
325
|
+
export async function onExtensionsReady(store: any) {
|
|
326
|
+
const alreadyReady = store.getters['uiplugins/ready'];
|
|
327
|
+
|
|
328
|
+
if (alreadyReady) {
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
const extensions = store.getters['uiplugins/plugins'] || [];
|
|
333
|
+
|
|
334
|
+
for (let i = 0; i < extensions.length; i++) {
|
|
335
|
+
const ext = extensions[i];
|
|
336
|
+
|
|
337
|
+
try {
|
|
338
|
+
await ext.onLogIn(store);
|
|
339
|
+
} catch (e) {
|
|
340
|
+
console.error(`Exception caught in onReady for extension ${ ext.name }`, e); // eslint-disable-line no-console
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
await store.dispatch('uiplugins/setReady', true);
|
|
345
|
+
}
|
|
@@ -170,6 +170,8 @@ export default function(
|
|
|
170
170
|
|
|
171
171
|
const url: Validator = (val: string) => val && !isUrl(val) ? t('validation.setting.serverUrl.url') : undefined;
|
|
172
172
|
|
|
173
|
+
const genericUrl: Validator = (val: string) => val && !isUrl(val) ? t('validation.genericUrl') : undefined;
|
|
174
|
+
|
|
173
175
|
const urlRepository: Validator = (url: string) => {
|
|
174
176
|
const regexPart1 = /^((http|git|ssh|http(s)|file|\/?)|(git@[\w\.]+))(:(\/\/)?)/gm;
|
|
175
177
|
const regexPart2 = /^([\w\.@\:\/\-]+)([\d\/\w.-]+?)(.git){0,1}(\/)?$/gm;
|
|
@@ -542,6 +544,7 @@ export default function(
|
|
|
542
544
|
localhost,
|
|
543
545
|
trailingForwardSlash,
|
|
544
546
|
url,
|
|
547
|
+
genericUrl,
|
|
545
548
|
matching,
|
|
546
549
|
maxLength,
|
|
547
550
|
maxValue,
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { TitleBarProps } from '@shell/components/Resource/Detail/TitleBar/index.vue';
|
|
2
|
-
import { computed, Ref, toValue } from 'vue';
|
|
3
|
-
import { useRoute } from 'vue-router';
|
|
4
|
-
import { useStore } from 'vuex';
|
|
5
|
-
|
|
6
|
-
export const useDefaultTitleBarData = (resource: any): Ref<TitleBarProps> => {
|
|
7
|
-
const route = useRoute();
|
|
8
|
-
const store = useStore();
|
|
9
|
-
|
|
10
|
-
const resourceValue = toValue(resource);
|
|
11
|
-
|
|
12
|
-
return computed(() => ({
|
|
13
|
-
resourceTypeLabel: store.getters['type-map/labelFor']({ id: resourceValue.type }),
|
|
14
|
-
resourceTo: {
|
|
15
|
-
name: 'c-cluster-product-resource',
|
|
16
|
-
params: {
|
|
17
|
-
product: 'explorer',
|
|
18
|
-
cluster: route.params.cluster,
|
|
19
|
-
namespace: resourceValue.namespace,
|
|
20
|
-
resource: resourceValue.type
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
|
-
resourceName: resourceValue.nameDisplay,
|
|
24
|
-
actionMenuResource: resourceValue,
|
|
25
|
-
badge: {
|
|
26
|
-
color: resourceValue.stateBackground,
|
|
27
|
-
label: resourceValue.stateDisplay
|
|
28
|
-
},
|
|
29
|
-
onShowConfiguration: () => resourceValue.goToEdit()
|
|
30
|
-
}));
|
|
31
|
-
};
|
package/config/product/legacy.js
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { LEGACY } from '@shell/store/features';
|
|
2
|
-
import { DSL, IF_HAVE } from '@shell/store/type-map';
|
|
3
|
-
|
|
4
|
-
export const NAME = 'legacy';
|
|
5
|
-
|
|
6
|
-
export function init(store) {
|
|
7
|
-
const {
|
|
8
|
-
product,
|
|
9
|
-
basicType,
|
|
10
|
-
virtualType,
|
|
11
|
-
setGroupDefaultType,
|
|
12
|
-
} = DSL(store, NAME);
|
|
13
|
-
|
|
14
|
-
product({
|
|
15
|
-
weight: 80,
|
|
16
|
-
ifFeature: LEGACY,
|
|
17
|
-
showNamespaceFilter: true,
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
virtualType({
|
|
21
|
-
ifHave: IF_HAVE.NO_PROJECT,
|
|
22
|
-
labelKey: 'legacy.project.label',
|
|
23
|
-
namespaced: true,
|
|
24
|
-
name: 'v1-project-overview',
|
|
25
|
-
weight: 105,
|
|
26
|
-
route: { name: 'c-cluster-legacy-project' },
|
|
27
|
-
exact: true,
|
|
28
|
-
overview: false,
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
basicType(['v1-project-overview']);
|
|
32
|
-
|
|
33
|
-
// Project Pages
|
|
34
|
-
|
|
35
|
-
virtualType({
|
|
36
|
-
ifHave: IF_HAVE.PROJECT,
|
|
37
|
-
labelKey: 'legacy.secrets',
|
|
38
|
-
namespaced: true,
|
|
39
|
-
name: 'project-secrets',
|
|
40
|
-
weight: 104,
|
|
41
|
-
route: { name: 'c-cluster-legacy-project-page', params: { page: 'secrets' } },
|
|
42
|
-
exact: true,
|
|
43
|
-
overview: false,
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
virtualType({
|
|
47
|
-
ifHave: IF_HAVE.PROJECT,
|
|
48
|
-
labelKey: 'legacy.configMaps',
|
|
49
|
-
namespaced: true,
|
|
50
|
-
name: 'project-config-maps',
|
|
51
|
-
weight: 104,
|
|
52
|
-
route: { name: 'c-cluster-legacy-project-page', params: { page: 'config-maps' } },
|
|
53
|
-
exact: true,
|
|
54
|
-
overview: false,
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
basicType([
|
|
58
|
-
'project-config-maps',
|
|
59
|
-
'project-secrets',
|
|
60
|
-
], 'Project');
|
|
61
|
-
setGroupDefaultType('project-config-maps', 'Project');
|
|
62
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import EmberPage from '@shell/components/EmberPage';
|
|
3
|
-
|
|
4
|
-
const PAGES = {
|
|
5
|
-
monitoring: 'monitoring/cluster-setting',
|
|
6
|
-
cis: 'cis/scan',
|
|
7
|
-
istio: 'istio/cluster-setting',
|
|
8
|
-
snapshots: 'backups',
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export default {
|
|
12
|
-
components: { EmberPage },
|
|
13
|
-
|
|
14
|
-
data() {
|
|
15
|
-
const cluster = this.$store.getters['currentCluster'];
|
|
16
|
-
const page = this.$route.params.page;
|
|
17
|
-
const p = PAGES[page] || page;
|
|
18
|
-
|
|
19
|
-
return { src: `/k/${ cluster.id }/${ p }` };
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
</script>
|
|
23
|
-
|
|
24
|
-
<template>
|
|
25
|
-
<EmberPage
|
|
26
|
-
v-if="src"
|
|
27
|
-
:src="src"
|
|
28
|
-
/>
|
|
29
|
-
</template>
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import EmberPage from '@shell/components/EmberPage';
|
|
3
|
-
import { project } from '@shell/store/type-map';
|
|
4
|
-
|
|
5
|
-
const PAGES = {
|
|
6
|
-
istio: 'istio/project-istio/metrics',
|
|
7
|
-
monitoring: 'monitoring/project-setting',
|
|
8
|
-
pipelineConfig: 'pipeline',
|
|
9
|
-
pipelines: 'pipeline/pipelines'
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
export default {
|
|
13
|
-
components: { EmberPage },
|
|
14
|
-
|
|
15
|
-
data() {
|
|
16
|
-
const page = this.$route.params.page;
|
|
17
|
-
const p = PAGES[page] || page;
|
|
18
|
-
|
|
19
|
-
return { page: p };
|
|
20
|
-
},
|
|
21
|
-
|
|
22
|
-
computed: {
|
|
23
|
-
project() {
|
|
24
|
-
return project(this.$store.getters);
|
|
25
|
-
},
|
|
26
|
-
|
|
27
|
-
src() {
|
|
28
|
-
const prj = project(this.$store.getters);
|
|
29
|
-
|
|
30
|
-
if (!!prj) {
|
|
31
|
-
const id = prj.id.replace('/', ':');
|
|
32
|
-
|
|
33
|
-
return `/p/${ id }/${ this.page }`;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
|
|
40
|
-
watch: {
|
|
41
|
-
// User changed project while on this page
|
|
42
|
-
project(a, b) {
|
|
43
|
-
// Changed to no project, so redirect
|
|
44
|
-
if (!a && b) {
|
|
45
|
-
this.$router.replace({ name: 'c-cluster-legacy-project' } );
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
</script>
|
|
51
|
-
|
|
52
|
-
<template>
|
|
53
|
-
<EmberPage
|
|
54
|
-
v-if="src"
|
|
55
|
-
:src="src"
|
|
56
|
-
/>
|
|
57
|
-
</template>
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import IconMessage from '@shell/components/IconMessage';
|
|
3
|
-
import { project } from '@shell/store/type-map';
|
|
4
|
-
|
|
5
|
-
export default {
|
|
6
|
-
components: { IconMessage },
|
|
7
|
-
|
|
8
|
-
computed: {
|
|
9
|
-
project() {
|
|
10
|
-
const prj = project(this.$store.getters);
|
|
11
|
-
|
|
12
|
-
return prj;
|
|
13
|
-
}
|
|
14
|
-
},
|
|
15
|
-
|
|
16
|
-
watch: {
|
|
17
|
-
project(nue, old) {
|
|
18
|
-
if (nue && !old) {
|
|
19
|
-
// User selected a project while on this page, so redirect to the projects view now that we have a project
|
|
20
|
-
this.$router.replace({ name: 'c-cluster-legacy-project-page', params: { page: 'config-maps' } });
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
</script>
|
|
26
|
-
|
|
27
|
-
<template>
|
|
28
|
-
<IconMessage
|
|
29
|
-
icon="icon-monitoring"
|
|
30
|
-
message-key="legacy.project.select"
|
|
31
|
-
/>
|
|
32
|
-
</template>
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import EmberPage from '@shell/components/EmberPage';
|
|
3
|
-
import Tabbed from '@shell/components/Tabbed';
|
|
4
|
-
import Tab from '@shell/components/Tabbed/Tab';
|
|
5
|
-
import { project } from '@shell/store/type-map';
|
|
6
|
-
|
|
7
|
-
const PAGES = {
|
|
8
|
-
pipelines: 'pipeline/pipelines',
|
|
9
|
-
configuration: 'pipeline',
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
export default {
|
|
13
|
-
components: {
|
|
14
|
-
EmberPage,
|
|
15
|
-
Tabbed,
|
|
16
|
-
Tab
|
|
17
|
-
},
|
|
18
|
-
|
|
19
|
-
data() {
|
|
20
|
-
return { activeTab: null };
|
|
21
|
-
},
|
|
22
|
-
|
|
23
|
-
computed: {
|
|
24
|
-
pipelinesPage() {
|
|
25
|
-
const prj = project(this.$store.getters);
|
|
26
|
-
|
|
27
|
-
if (!!prj && this.activeTab) {
|
|
28
|
-
const id = prj.id.replace('/', ':');
|
|
29
|
-
const suffix = PAGES[this.activeTab];
|
|
30
|
-
|
|
31
|
-
return `/p/${ id }/${ suffix }`;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
return '';
|
|
35
|
-
}
|
|
36
|
-
},
|
|
37
|
-
|
|
38
|
-
methods: {
|
|
39
|
-
tabChanged(tab) {
|
|
40
|
-
this.activeTab = tab.tab.name;
|
|
41
|
-
},
|
|
42
|
-
|
|
43
|
-
intercept(target) {
|
|
44
|
-
if (target === 'authenticated.project.pipeline.settings') {
|
|
45
|
-
// User went to the config page from the pipelines page, so change the active tab
|
|
46
|
-
this.$refs.tabs.select('configuration');
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
};
|
|
52
|
-
</script>
|
|
53
|
-
|
|
54
|
-
<template>
|
|
55
|
-
<div class="pipelines">
|
|
56
|
-
<Tabbed
|
|
57
|
-
ref="tabs"
|
|
58
|
-
:use-hash="false"
|
|
59
|
-
:no-content="true"
|
|
60
|
-
@changed="tabChanged"
|
|
61
|
-
>
|
|
62
|
-
<Tab
|
|
63
|
-
name="pipelines"
|
|
64
|
-
label-key="legacy.pipelines"
|
|
65
|
-
:weight="3"
|
|
66
|
-
/>
|
|
67
|
-
<Tab
|
|
68
|
-
name="configuration"
|
|
69
|
-
label-key="legacy.configuration"
|
|
70
|
-
:weight="2"
|
|
71
|
-
/>
|
|
72
|
-
</Tabbed>
|
|
73
|
-
<div
|
|
74
|
-
id="legacy-pipelines"
|
|
75
|
-
class="embed-pipelines"
|
|
76
|
-
>
|
|
77
|
-
<EmberPage
|
|
78
|
-
v-if="pipelinesPage"
|
|
79
|
-
inline="legacy-pipelines"
|
|
80
|
-
:src="pipelinesPage"
|
|
81
|
-
:force-inline-reuse="true"
|
|
82
|
-
@before-nav="intercept"
|
|
83
|
-
/>
|
|
84
|
-
</div>
|
|
85
|
-
</div>
|
|
86
|
-
</template>
|
|
87
|
-
|
|
88
|
-
<style scoped lang='scss'>
|
|
89
|
-
.pipelines {
|
|
90
|
-
display: flex;
|
|
91
|
-
|
|
92
|
-
.embed-pipelines {
|
|
93
|
-
flex: 1;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
</style>
|
|
File without changes
|