@rancher/shell 3.0.5-rc.5 → 3.0.5-rc.7
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/base/_variables.scss +17 -11
- package/assets/styles/global/_form.scss +1 -1
- package/assets/styles/global/_labeled-input.scss +1 -1
- package/assets/styles/themes/_dark.scss +5 -0
- package/assets/styles/themes/_light.scss +11 -2
- package/assets/styles/vendor/vue-select.scss +1 -1
- package/assets/translations/en-us.yaml +426 -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 +2 -2
- 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 +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 +111 -0
- package/components/GrowlManager.vue +16 -15
- package/components/IconOrSvg.vue +5 -0
- package/components/KeyValueView.vue +1 -1
- package/components/Loading.vue +1 -1
- package/components/LocaleSelector.vue +9 -1
- package/components/PaginatedResourceTable.vue +46 -1
- package/components/ProgressBarMulti.vue +1 -0
- package/components/PromptModal.vue +6 -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/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 +47 -256
- package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +317 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +34 -5
- package/components/Resource/Detail/Metadata/KeyValue.vue +32 -22
- 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/Rectangle.vue +3 -1
- 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/SpacedRow.vue +1 -1
- 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 +45 -0
- package/components/Resource/Detail/TitleBar/index.vue +85 -13
- 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} +1 -1
- package/components/ResourceDetail/__tests__/index.test.ts +26 -5
- package/components/ResourceDetail/index.vue +33 -17
- package/components/ResourceDetail/legacy.vue +18 -1
- package/components/ResourceList/Masthead.vue +6 -0
- package/components/ResourceList/index.vue +1 -0
- package/components/ResourceTable.vue +6 -1
- package/components/ResourceYaml.vue +15 -2
- package/components/RichTranslation.vue +106 -0
- package/components/SlideInPanelManager.vue +46 -11
- package/components/SortableTable/index.vue +1 -1
- package/components/SortableTable/selection.js +0 -1
- package/components/StateDot/index.vue +28 -0
- package/components/Tabbed/index.vue +17 -16
- package/components/Wizard.vue +4 -2
- package/components/__tests__/ConfigMapSettings.test.ts +376 -0
- package/components/__tests__/GrowlManager.test.ts +0 -25
- package/components/__tests__/PromptRestore.test.ts +1 -65
- package/components/__tests__/RichTranslation.test.ts +115 -0
- 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 +17 -9
- package/components/form/ArrayList.vue +13 -2
- package/components/form/ChangePassword.vue +3 -1
- package/components/form/FileImageSelector.vue +1 -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 +2 -1
- package/components/form/Networking.vue +24 -19
- package/components/form/ResourceLabeledSelect.vue +4 -3
- 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/SelectOrCreateAuthSecret.vue +6 -3
- 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__/Networking.test.ts +116 -0
- package/components/form/__tests__/Select.test.ts +5 -2
- package/components/formatter/FleetApplicationSource.vue +1 -1
- package/components/formatter/PodImages.vue +1 -1
- package/components/formatter/WorkloadHealthScale.vue +1 -1
- 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 +71 -45
- 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 +8 -0
- package/config/pagination-table-headers.js +8 -1
- package/config/product/auth.js +16 -1
- package/config/product/{cis.js → compliance.js} +23 -26
- package/config/product/explorer.js +32 -3
- package/config/product/fleet.js +7 -0
- package/config/product/manager.js +0 -1
- package/config/product/settings.js +22 -11
- package/config/query-params.js +13 -0
- package/config/roles.ts +1 -1
- package/config/router/navigation-guards/authentication.js +51 -2
- package/config/router/routes.js +47 -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 +32 -3
- package/config/types.js +16 -7
- package/config/version.js +1 -1
- 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/provisioning.cattle.io.cluster.vue +3 -47
- 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/dialog/RotateEncryptionKeyDialog.vue +10 -30
- package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
- package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +5 -2
- package/edit/auth/ldap/__tests__/config.test.ts +14 -0
- package/edit/auth/ldap/config.vue +24 -0
- 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 +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/Certificate.vue +12 -12
- package/edit/networking.k8s.io.ingress/__tests__/Certificate.test.ts +165 -0
- 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/__tests__/rke2.test.ts +3 -2
- package/edit/provisioning.cattle.io.cluster/rke2.vue +516 -426
- package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +48 -39
- 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 +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/list/projectsecret.vue +345 -0
- package/list/secret.vue +109 -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/impl.js +10 -1
- package/mixins/create-edit-view/index.js +5 -0
- package/mixins/resource-fetch-api-pagination.js +24 -8
- package/mixins/resource-fetch.js +3 -1
- package/mixins/vue-select-overrides.js +1 -0
- 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 +8 -79
- package/models/fleet.cattle.io.cluster.js +13 -2
- 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 +29 -33
- package/models/secret.js +157 -2
- package/models/service.js +4 -0
- package/models/workload.js +5 -0
- package/package.json +2 -2
- 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 +296 -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/projectsecret.vue +34 -0
- 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 -57
- 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/projectsecret.vue +9 -0
- package/pages/explorer/resource/detail/secret.vue +63 -0
- package/pages/home.vue +9 -55
- package/pages/support/index.vue +4 -6
- 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 +19 -5
- package/plugins/dashboard-store/getters.js +4 -0
- package/plugins/dashboard-store/normalize.js +29 -17
- package/plugins/dashboard-store/resource-class.js +68 -19
- package/plugins/steve/steve-pagination-utils.ts +38 -19
- 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/kube/kube-api.ts +12 -0
- package/types/notifications/index.ts +74 -0
- package/types/shell/index.d.ts +661 -589
- package/types/store/dashboard-store.types.ts +16 -0
- package/types/store/pagination.types.ts +16 -6
- package/utils/__tests__/create-yaml.test.ts +235 -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/create-yaml.js +103 -9
- 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 +19 -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/models/etcdbackup.js +0 -45
- 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
|
@@ -157,6 +157,12 @@ export default {
|
|
|
157
157
|
},
|
|
158
158
|
|
|
159
159
|
_createButtonlabel() {
|
|
160
|
+
const overrideLabel = this.$store.getters['type-map/optionsFor'](this.resource).listCreateButtonLabelKey;
|
|
161
|
+
|
|
162
|
+
if (overrideLabel) {
|
|
163
|
+
return this.t(overrideLabel);
|
|
164
|
+
}
|
|
165
|
+
|
|
160
166
|
return this.createButtonLabel || this.t('resourceList.head.create');
|
|
161
167
|
},
|
|
162
168
|
}
|
|
@@ -217,11 +217,16 @@ export default {
|
|
|
217
217
|
default: null, // Default comes from the user preference
|
|
218
218
|
},
|
|
219
219
|
|
|
220
|
+
overrideInStore: {
|
|
221
|
+
type: String,
|
|
222
|
+
default: undefined,
|
|
223
|
+
},
|
|
224
|
+
|
|
220
225
|
},
|
|
221
226
|
|
|
222
227
|
data() {
|
|
223
228
|
// Confirm which store we're in, if schema isn't available we're probably showing a list with different types
|
|
224
|
-
const inStore = this.schema?.id ? this.$store.getters['currentStore'](this.schema.id) : undefined;
|
|
229
|
+
const inStore = this.overrideInStore || (this.schema?.id ? this.$store.getters['currentStore'](this.schema.id) : undefined);
|
|
225
230
|
|
|
226
231
|
return {
|
|
227
232
|
inStore,
|
|
@@ -73,6 +73,11 @@ export default {
|
|
|
73
73
|
default: true
|
|
74
74
|
},
|
|
75
75
|
|
|
76
|
+
showErrors: {
|
|
77
|
+
type: Boolean,
|
|
78
|
+
default: true
|
|
79
|
+
},
|
|
80
|
+
|
|
76
81
|
applyHooks: {
|
|
77
82
|
type: Function,
|
|
78
83
|
default: null,
|
|
@@ -229,7 +234,7 @@ export default {
|
|
|
229
234
|
}
|
|
230
235
|
|
|
231
236
|
try {
|
|
232
|
-
await this.value.saveYaml(yaml);
|
|
237
|
+
await this.value.saveYaml(yaml, this.initialYaml);
|
|
233
238
|
} catch (err) {
|
|
234
239
|
return onError.call(this, err);
|
|
235
240
|
}
|
|
@@ -289,6 +294,13 @@ export default {
|
|
|
289
294
|
}
|
|
290
295
|
},
|
|
291
296
|
|
|
297
|
+
refresh() {
|
|
298
|
+
this.$refs.yamleditor.refresh();
|
|
299
|
+
},
|
|
300
|
+
|
|
301
|
+
closeError(index) {
|
|
302
|
+
this.errors = (this.errors || []).filter((_, i) => i !== index);
|
|
303
|
+
},
|
|
292
304
|
}
|
|
293
305
|
};
|
|
294
306
|
</script>
|
|
@@ -318,7 +330,8 @@ export default {
|
|
|
318
330
|
class="footer"
|
|
319
331
|
:class="{ 'edit': !isView }"
|
|
320
332
|
:mode="mode"
|
|
321
|
-
:errors="errors"
|
|
333
|
+
:errors="showErrors ? errors : []"
|
|
334
|
+
@close-error="closeError"
|
|
322
335
|
@save="save"
|
|
323
336
|
@done="done"
|
|
324
337
|
>
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { defineComponent, h, VNode } from 'vue';
|
|
3
|
+
import { useStore } from 'vuex';
|
|
4
|
+
import { purifyHTML } from '@shell/plugins/clean-html';
|
|
5
|
+
|
|
6
|
+
const ALLOWED_TAGS = ['b', 'i', 'span', 'a']; // Add more as needed
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* A component for rendering translated strings with embedded HTML and custom Vue components.
|
|
10
|
+
*
|
|
11
|
+
* This component allows you to use a single translation key for a message that contains
|
|
12
|
+
* both standard HTML tags (like <b>, <i>, etc.) and custom Vue components (like <router-link>).
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // In your translation file (e.g., en-us.yaml):
|
|
16
|
+
* my:
|
|
17
|
+
* translation:
|
|
18
|
+
* key: 'This is a <b>bold</b> statement with a <customLink>link</customLink>.'
|
|
19
|
+
*
|
|
20
|
+
* // In your Vue component:
|
|
21
|
+
* <RichTranslation k="my.translation.key">
|
|
22
|
+
* <template #customLink="{ content }">
|
|
23
|
+
* <router-link to="{ name: 'some-path' }">{{ content }}</router-link>
|
|
24
|
+
* </template>
|
|
25
|
+
* </RichTranslation>
|
|
26
|
+
*/
|
|
27
|
+
export default defineComponent({
|
|
28
|
+
name: 'RichTranslation',
|
|
29
|
+
props: {
|
|
30
|
+
/**
|
|
31
|
+
* The translation key for the message.
|
|
32
|
+
*/
|
|
33
|
+
k: {
|
|
34
|
+
type: String,
|
|
35
|
+
required: true,
|
|
36
|
+
},
|
|
37
|
+
/**
|
|
38
|
+
* The HTML tag to use for the root element.
|
|
39
|
+
*/
|
|
40
|
+
tag: {
|
|
41
|
+
type: String,
|
|
42
|
+
default: 'span'
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
setup(props, { slots }) {
|
|
46
|
+
const store = useStore();
|
|
47
|
+
|
|
48
|
+
return () => {
|
|
49
|
+
// Get the raw translation string, without any processing.
|
|
50
|
+
const rawStr = store.getters['i18n/t'](props.k, {}, true);
|
|
51
|
+
|
|
52
|
+
if (!rawStr || typeof rawStr !== 'string') {
|
|
53
|
+
return h(props.tag, {}, [rawStr]);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// This regex splits the string by the custom tags, keeping the tags in the resulting array.
|
|
57
|
+
const regex = /<([a-zA-Z0-9]+)>(.*?)<\/\1>|<([a-zA-Z0-9]+)\/>/g;
|
|
58
|
+
const children: (VNode | string)[] = [];
|
|
59
|
+
let lastIndex = 0;
|
|
60
|
+
let match;
|
|
61
|
+
|
|
62
|
+
// Iterate over all matches of the regex.
|
|
63
|
+
while ((match = regex.exec(rawStr)) !== null) {
|
|
64
|
+
// Add the text before the current match as a plain text node.
|
|
65
|
+
if (match.index > lastIndex) {
|
|
66
|
+
children.push(h('span', { innerHTML: purifyHTML(rawStr.substring(lastIndex, match.index)) }));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const enclosingTagName = match[1]; // Captures the tag name for enclosing tags (e.g., 'customLink' from <customLink>...</customLink>)
|
|
70
|
+
const selfClosingTagName = match[3]; // Captures the tag name for self-closing tags (e.g., 'anotherTag' from <anotherTag/>)
|
|
71
|
+
const tagName = enclosingTagName || selfClosingTagName;
|
|
72
|
+
|
|
73
|
+
if (tagName) {
|
|
74
|
+
const content = enclosingTagName ? match[2] : '';
|
|
75
|
+
|
|
76
|
+
if (slots[tagName]) {
|
|
77
|
+
// If a slot is provided for this tag, render the slot with the content.
|
|
78
|
+
children.push(slots[tagName]({ content: purifyHTML(content) }));
|
|
79
|
+
} else if (ALLOWED_TAGS.includes(tagName.toLowerCase())) {
|
|
80
|
+
// If it's an allowed HTML tag, render it directly.
|
|
81
|
+
if (content) {
|
|
82
|
+
children.push(h(tagName, { innerHTML: purifyHTML(content, { ALLOWED_TAGS }) }));
|
|
83
|
+
} else {
|
|
84
|
+
children.push(h(tagName));
|
|
85
|
+
}
|
|
86
|
+
} else {
|
|
87
|
+
// Otherwise, render the tag and its content as plain HTML.
|
|
88
|
+
children.push(h('span', { innerHTML: purifyHTML(match[0]) }));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Update the last index to continue searching after the current match
|
|
93
|
+
lastIndex = regex.lastIndex;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Add any remaining text after the last match.
|
|
97
|
+
if (lastIndex < rawStr.length) {
|
|
98
|
+
children.push(h('span', { innerHTML: purifyHTML(rawStr.substring(lastIndex)) }));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Render the root element with the processed children.
|
|
102
|
+
return h(props.tag, {}, children);
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
</script>
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
<script lang="ts" setup>
|
|
2
|
-
import { computed, watch } from 'vue';
|
|
2
|
+
import { computed, onBeforeUnmount, watch } from 'vue';
|
|
3
3
|
import { useStore } from 'vuex';
|
|
4
4
|
import {
|
|
5
5
|
DEFAULT_FOCUS_TRAP_OPTS,
|
|
6
6
|
useWatcherBasedSetupFocusTrapWithDestroyIncluded
|
|
7
7
|
} from '@shell/composables/focusTrap';
|
|
8
|
+
import { isEqual } from 'lodash';
|
|
9
|
+
import { useRouter } from 'vue-router';
|
|
8
10
|
|
|
9
11
|
const HEADER_HEIGHT = 55;
|
|
10
12
|
|
|
@@ -15,6 +17,11 @@ const currentComponent = computed(() => store.getters['slideInPanel/component'])
|
|
|
15
17
|
const currentProps = computed(() => store.getters['slideInPanel/componentProps']);
|
|
16
18
|
|
|
17
19
|
const panelTop = computed(() => {
|
|
20
|
+
// Some components like the ResourceDetailDrawer are designed to take up the full height of the viewport so we want to be able to specify the top.
|
|
21
|
+
if (currentProps?.value?.top) {
|
|
22
|
+
return currentProps?.value?.top;
|
|
23
|
+
}
|
|
24
|
+
|
|
18
25
|
const banner = document.getElementById('banner-header');
|
|
19
26
|
let height = HEADER_HEIGHT;
|
|
20
27
|
|
|
@@ -25,13 +32,23 @@ const panelTop = computed(() => {
|
|
|
25
32
|
return `${ height }px`;
|
|
26
33
|
});
|
|
27
34
|
|
|
28
|
-
|
|
35
|
+
// Some components like the ResourceDetailDrawer are designed to take up the full height of the viewport so we want to be able to specify the height.
|
|
36
|
+
const panelHeight = computed(() => (currentProps?.value?.height) ? (currentProps?.value?.height) : `calc(100vh - ${ panelTop?.value })`);
|
|
29
37
|
const panelWidth = computed(() => currentProps?.value?.width || '33%');
|
|
30
38
|
const panelRight = computed(() => (isOpen?.value ? '0' : `-${ panelWidth?.value }`));
|
|
31
|
-
const panelZIndex = computed(() => `${ (isOpen?.value ? 1 : 2) * (currentProps?.value?.zIndex ?? 1000) }`);
|
|
32
39
|
|
|
33
40
|
const showHeader = computed(() => currentProps?.value?.showHeader ?? true);
|
|
34
41
|
const panelTitle = showHeader.value ? computed(() => currentProps?.value?.title || 'Details') : null;
|
|
42
|
+
const closeOnRouteChange = computed(() => {
|
|
43
|
+
const propsCloseOnRouteChange = currentProps?.value.closeOnRouteChange;
|
|
44
|
+
|
|
45
|
+
if (!propsCloseOnRouteChange) {
|
|
46
|
+
return ['name', 'params', 'hash', 'query'];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return propsCloseOnRouteChange;
|
|
50
|
+
});
|
|
51
|
+
const router = useRouter();
|
|
35
52
|
|
|
36
53
|
watch(
|
|
37
54
|
/**
|
|
@@ -75,15 +92,33 @@ watch(
|
|
|
75
92
|
);
|
|
76
93
|
|
|
77
94
|
watch(
|
|
78
|
-
() =>
|
|
79
|
-
() => {
|
|
80
|
-
if (isOpen?.value
|
|
95
|
+
() => router?.currentRoute?.value,
|
|
96
|
+
(newValue, oldValue) => {
|
|
97
|
+
if (!isOpen?.value) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (closeOnRouteChange.value.includes('name') && !isEqual(newValue?.name, oldValue?.name)) {
|
|
102
|
+
closePanel();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (closeOnRouteChange.value.includes('params') && !isEqual(newValue?.params, oldValue?.params)) {
|
|
106
|
+
closePanel();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (closeOnRouteChange.value.includes('hash') && !isEqual(newValue?.hash, oldValue?.hash)) {
|
|
110
|
+
closePanel();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (closeOnRouteChange.value.includes('query') && !isEqual(newValue?.query, oldValue?.query)) {
|
|
81
114
|
closePanel();
|
|
82
115
|
}
|
|
83
116
|
},
|
|
84
117
|
{ deep: true }
|
|
85
118
|
);
|
|
86
119
|
|
|
120
|
+
onBeforeUnmount(closePanel);
|
|
121
|
+
|
|
87
122
|
function closePanel() {
|
|
88
123
|
store.commit('slideInPanel/close');
|
|
89
124
|
}
|
|
@@ -102,7 +137,7 @@ function closePanel() {
|
|
|
102
137
|
:class="{ 'slide-in-glass-open': isOpen }"
|
|
103
138
|
@click="closePanel"
|
|
104
139
|
/>
|
|
105
|
-
<
|
|
140
|
+
<aside
|
|
106
141
|
class="slide-in"
|
|
107
142
|
:class="{ 'slide-in-open': isOpen }"
|
|
108
143
|
:style="{
|
|
@@ -110,7 +145,6 @@ function closePanel() {
|
|
|
110
145
|
right: panelRight,
|
|
111
146
|
top: panelTop,
|
|
112
147
|
height: panelHeight,
|
|
113
|
-
['z-index']: panelZIndex
|
|
114
148
|
}"
|
|
115
149
|
>
|
|
116
150
|
<div
|
|
@@ -136,7 +170,7 @@ function closePanel() {
|
|
|
136
170
|
class="dynamic-panel-content"
|
|
137
171
|
/>
|
|
138
172
|
</div>
|
|
139
|
-
</
|
|
173
|
+
</aside>
|
|
140
174
|
</div>
|
|
141
175
|
</Teleport>
|
|
142
176
|
</template>
|
|
@@ -149,11 +183,11 @@ function closePanel() {
|
|
|
149
183
|
left: 0;
|
|
150
184
|
height: 100vh;
|
|
151
185
|
width: 100vw;
|
|
186
|
+
z-index: z-index('slide-in');
|
|
152
187
|
}
|
|
153
188
|
.slide-in-glass-open {
|
|
154
|
-
background
|
|
189
|
+
background: var(--overlay-bg);
|
|
155
190
|
display: block;
|
|
156
|
-
opacity: 0.5;
|
|
157
191
|
}
|
|
158
192
|
|
|
159
193
|
.slide-in {
|
|
@@ -164,6 +198,7 @@ function closePanel() {
|
|
|
164
198
|
transition: right 0.5s ease;
|
|
165
199
|
border-left: 1px solid var(--border);
|
|
166
200
|
background-color: var(--body-bg);
|
|
201
|
+
z-index: calc(z-index('slide-in') + 1);
|
|
167
202
|
}
|
|
168
203
|
|
|
169
204
|
.slide-in-open {
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { StateColor, stateColorCssVar } from '@shell/utils/style';
|
|
3
|
+
import { computed } from 'vue';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
color: StateColor;
|
|
7
|
+
size?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const props = withDefaults(defineProps<Props>(), { size: '8px' });
|
|
11
|
+
const backgroundColor = computed(() => stateColorCssVar(props.color));
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<template>
|
|
15
|
+
<span class="state-dot" />
|
|
16
|
+
</template>
|
|
17
|
+
|
|
18
|
+
<style lang="scss" scoped>
|
|
19
|
+
.state-dot {
|
|
20
|
+
display: inline-block;
|
|
21
|
+
|
|
22
|
+
width: v-bind('props.size');
|
|
23
|
+
height: v-bind('props.size');
|
|
24
|
+
|
|
25
|
+
border-radius: 50%;
|
|
26
|
+
background-color: v-bind('backgroundColor');
|
|
27
|
+
}
|
|
28
|
+
</style>
|
|
@@ -66,6 +66,11 @@ export default {
|
|
|
66
66
|
resource: {
|
|
67
67
|
type: Object,
|
|
68
68
|
default: () => {}
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
showExtensionTabs: {
|
|
72
|
+
type: Boolean,
|
|
73
|
+
default: true,
|
|
69
74
|
}
|
|
70
75
|
},
|
|
71
76
|
|
|
@@ -92,7 +97,7 @@ export default {
|
|
|
92
97
|
},
|
|
93
98
|
|
|
94
99
|
data() {
|
|
95
|
-
const extensionTabs = getApplicableExtensionEnhancements(this, ExtensionPoint.TAB, TabLocation.RESOURCE_DETAIL, this.$route, this, this.extensionParams) || [];
|
|
100
|
+
const extensionTabs = this.showExtensionTabs ? getApplicableExtensionEnhancements(this, ExtensionPoint.TAB, TabLocation.RESOURCE_DETAIL, this.$route, this, this.extensionParams) || [] : [];
|
|
96
101
|
|
|
97
102
|
const parsedExtTabs = extensionTabs.map((item) => {
|
|
98
103
|
return {
|
|
@@ -145,17 +150,10 @@ export default {
|
|
|
145
150
|
this.select(activeTab.name);
|
|
146
151
|
}
|
|
147
152
|
},
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
window.addEventListener('hashchange', this.hashChange);
|
|
153
|
-
}
|
|
154
|
-
},
|
|
155
|
-
|
|
156
|
-
unmounted() {
|
|
157
|
-
if ( this.useHash ) {
|
|
158
|
-
window.removeEventListener('hashchange', this.hashChange);
|
|
153
|
+
'$route.hash'() {
|
|
154
|
+
if ( this.useHash ) {
|
|
155
|
+
this.hashChange();
|
|
156
|
+
}
|
|
159
157
|
}
|
|
160
158
|
},
|
|
161
159
|
|
|
@@ -164,7 +162,7 @@ export default {
|
|
|
164
162
|
return tab.displayAlertIcon || (tab.error && !tab.active);
|
|
165
163
|
},
|
|
166
164
|
hashChange() {
|
|
167
|
-
if (
|
|
165
|
+
if (this.scrollOnChange) {
|
|
168
166
|
const scrollable = document.getElementsByTagName('main')[0];
|
|
169
167
|
|
|
170
168
|
if (scrollable) {
|
|
@@ -182,8 +180,9 @@ export default {
|
|
|
182
180
|
select(name/* , event */) {
|
|
183
181
|
const { sortedTabs } = this;
|
|
184
182
|
|
|
185
|
-
const
|
|
186
|
-
const
|
|
183
|
+
const cleanName = name.replace('#', '');
|
|
184
|
+
const selected = this.find(cleanName);
|
|
185
|
+
const hashName = `#${ cleanName }`;
|
|
187
186
|
|
|
188
187
|
if ( !selected || selected.disabled) {
|
|
189
188
|
return;
|
|
@@ -281,7 +280,7 @@ export default {
|
|
|
281
280
|
>
|
|
282
281
|
<a
|
|
283
282
|
:data-testid="`btn-${tab.name}`"
|
|
284
|
-
:aria-controls="
|
|
283
|
+
:aria-controls="tab.name"
|
|
285
284
|
:aria-selected="tab.active"
|
|
286
285
|
:aria-label="tab.labelDisplay || ''"
|
|
287
286
|
role="tab"
|
|
@@ -318,6 +317,7 @@ export default {
|
|
|
318
317
|
type="button"
|
|
319
318
|
class="btn bg-transparent"
|
|
320
319
|
data-testid="tab-list-add"
|
|
320
|
+
:aria-label="t('tabs.addItem')"
|
|
321
321
|
@click="tabAddClicked"
|
|
322
322
|
>
|
|
323
323
|
<i class="icon icon-plus" />
|
|
@@ -327,6 +327,7 @@ export default {
|
|
|
327
327
|
class="btn bg-transparent"
|
|
328
328
|
:disabled="!sortedTabs.length"
|
|
329
329
|
data-testid="tab-list-remove"
|
|
330
|
+
:aria-label="t('tabs.removeItem')"
|
|
330
331
|
@click="tabRemoveClicked"
|
|
331
332
|
>
|
|
332
333
|
<i class="icon icon-minus" />
|
package/components/Wizard.vue
CHANGED
|
@@ -361,7 +361,7 @@ export default {
|
|
|
361
361
|
role="presentation"
|
|
362
362
|
>
|
|
363
363
|
<span
|
|
364
|
-
:aria-controls="'step' +
|
|
364
|
+
:aria-controls="'step-container-' + step.name"
|
|
365
365
|
:aria-selected="step.name === activeStep.name"
|
|
366
366
|
role="tab"
|
|
367
367
|
class="controls"
|
|
@@ -376,7 +376,7 @@ export default {
|
|
|
376
376
|
</span>
|
|
377
377
|
</span>
|
|
378
378
|
</li>
|
|
379
|
-
<
|
|
379
|
+
<li
|
|
380
380
|
v-if="idx!==visibleSteps.length-1"
|
|
381
381
|
:key="step.name"
|
|
382
382
|
class="divider"
|
|
@@ -397,7 +397,9 @@ export default {
|
|
|
397
397
|
>
|
|
398
398
|
<div
|
|
399
399
|
v-if="step.name === activeStep.name || step.hidden"
|
|
400
|
+
:id="'step-container-' + step.name"
|
|
400
401
|
:key="step.name"
|
|
402
|
+
role="tabpanel"
|
|
401
403
|
class="step-container__step"
|
|
402
404
|
:class="{'hide': step.name !== activeStep.name && step.hidden}"
|
|
403
405
|
>
|