@rancher/shell 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/images/providers/ovhcloudmks.svg +122 -0
- package/assets/images/providers/ovhcloudpubliccloud.svg +122 -0
- package/assets/styles/global/_layout.scss +99 -0
- package/assets/translations/en-us.yaml +30 -5
- package/assets/translations/zh-hans.yaml +1 -1
- package/babel.config.js +7 -1
- package/chart/monitoring/alerting/index.vue +7 -21
- package/chart/monitoring/grafana/index.vue +55 -0
- package/chart/monitoring/index.vue +51 -17
- package/chart/monitoring/prometheus/index.vue +37 -43
- package/chart/rancher-backup/index.vue +2 -1
- package/cloud-credential/azure.vue +4 -17
- package/components/AsyncButton.vue +17 -5
- package/components/Certificates.vue +164 -0
- package/components/CodeMirror.vue +19 -21
- package/components/CruResource.vue +1 -0
- package/components/DraggableZone.vue +2 -2
- package/components/EtcdInfoBanner.vue +1 -1
- package/components/ExplorerProjectsNamespaces.vue +25 -1
- package/components/IconOrSvg.vue +1 -1
- package/components/LandingPagePreference.vue +1 -4
- package/components/PodSecurityAdmission.vue +2 -2
- package/components/Questions/index.vue +1 -1
- package/components/ResourceDetail/Masthead.vue +16 -3
- package/components/ResourceTable.vue +14 -2
- package/components/ResourceYaml.vue +5 -0
- package/components/SideNav.vue +1 -1
- package/components/SingleClusterInfo.vue +1 -4
- package/components/Tabbed/index.vue +12 -0
- package/components/fleet/FleetRepos.vue +62 -27
- package/components/fleet/FleetResources.vue +6 -1
- package/components/form/ArrayListSelect.vue +10 -0
- package/components/form/Error.vue +3 -3
- package/components/form/Footer.vue +2 -2
- package/components/form/GitPicker.vue +83 -38
- package/components/form/KeyValue.vue +4 -0
- package/components/form/LabeledSelect.vue +4 -0
- package/components/formatter/Checked.vue +11 -3
- package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
- package/components/formatter/FleetSummaryGraph.vue +23 -11
- package/components/formatter/LiveDuration.vue +1 -1
- package/components/formatter/PercentageBar.vue +1 -1
- package/components/formatter/__tests__/Checked.test.ts +19 -0
- package/components/nav/Group.vue +2 -2
- package/components/nav/Header.vue +0 -1
- package/components/nav/TopLevelMenu.vue +36 -6
- package/components/nav/Type.vue +1 -3
- package/components/nav/WindowManager/ContainerLogs.vue +101 -3
- package/components/nav/WindowManager/ContainerShell.vue +6 -1
- package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
- package/components/nav/WindowManager/index.vue +11 -10
- package/components/nav/__tests__/TopLevelMenu.test.ts +33 -0
- package/components/nav/__tests__/Type.test.ts +1 -1
- package/components/nuxt/nuxt-child.js +14 -78
- package/components/nuxt/nuxt.js +1 -1
- package/{layouts → components/templates}/blank.vue +1 -1
- package/{layouts → components/templates}/default.vue +8 -98
- package/{layouts → components/templates}/error.vue +10 -19
- package/{layouts → components/templates}/home.vue +4 -1
- package/{layouts → components/templates}/plain.vue +4 -1
- package/{layouts → components/templates}/standalone.vue +1 -1
- package/{layouts → components/templates}/unauthenticated.vue +1 -1
- package/composables/useCompactInput.test.ts +36 -0
- package/composables/useCompactInput.ts +20 -0
- package/composables/useLabeledFormElement.test.ts +135 -0
- package/composables/useLabeledFormElement.ts +138 -0
- package/config/harvester-manager-types.js +2 -0
- package/config/private-label.js +22 -0
- package/config/product/explorer.js +3 -0
- package/config/product/fleet.js +6 -1
- package/config/product/manager.js +8 -2
- package/config/query-params.js +1 -0
- package/config/router.js +385 -364
- package/config/settings.ts +1 -0
- package/config/store.js +1 -1
- package/config/system-namespaces.js +3 -0
- package/config/table-headers.js +47 -0
- package/core/plugin-routes.ts +56 -114
- package/core/plugin.ts +16 -10
- package/core/plugins-loader.js +7 -9
- package/core/plugins.js +0 -3
- package/creators/app/files/.gitlab-ci.yml +1 -1
- package/detail/fleet.cattle.io.cluster.vue +11 -1
- package/detail/provisioning.cattle.io.cluster.vue +4 -3
- package/dialog/ScaleMachineDownDialog.vue +34 -17
- package/edit/__tests__/service.test.ts +89 -0
- package/edit/auth/googleoauth.vue +1 -5
- package/edit/cloudcredential.vue +2 -0
- package/edit/configmap.vue +2 -1
- package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +2 -2
- package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.spec.ts +1 -1
- package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +15 -7
- package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +112 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +4 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
- package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +7 -1
- package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +386 -0
- package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
- package/edit/provisioning.cattle.io.cluster/index.vue +92 -36
- package/edit/provisioning.cattle.io.cluster/rke2.vue +171 -583
- package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
- package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +157 -0
- package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +94 -19
- package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
- package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
- package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +189 -0
- package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +144 -0
- package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
- package/edit/service.vue +12 -0
- package/edit/workload/mixins/workload.js +1 -1
- package/initialize/App.js +25 -71
- package/initialize/client.js +21 -162
- package/initialize/index.js +27 -123
- package/list/management.cattle.io.feature.vue +1 -7
- package/list/node.vue +1 -0
- package/machine-config/__tests__/vmwarevsphere.test.ts +100 -21
- package/machine-config/vmwarevsphere.vue +73 -51
- package/middleware/authenticated.js +10 -17
- package/mixins/auth-config.js +2 -7
- package/mixins/brand.js +29 -41
- package/mixins/create-edit-view/index.js +2 -2
- package/mixins/labeled-form-element.ts +6 -1
- package/models/__tests__/management.cattle.io.node.ts +85 -0
- package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
- package/models/__tests__/namespace.test.ts +49 -9
- package/models/__tests__/workload.test.ts +91 -0
- package/models/cluster/node.js +4 -4
- package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
- package/models/fleet.cattle.io.cluster.js +4 -0
- package/models/fleet.cattle.io.gitrepo.js +56 -13
- package/models/management.cattle.io.kontainerdriver.js +1 -1
- package/models/management.cattle.io.node.js +18 -14
- package/models/management.cattle.io.nodepool.js +17 -0
- package/models/namespace.js +1 -1
- package/models/pod.js +20 -0
- package/models/provisioning.cattle.io.cluster.js +20 -3
- package/models/secret.js +117 -18
- package/models/workload.js +16 -0
- package/models/workload.service.js +18 -0
- package/package.json +10 -9
- package/pages/about.vue +0 -1
- package/pages/account/create-key.vue +0 -1
- package/pages/account/index.vue +0 -1
- package/pages/auth/login.vue +0 -1
- package/pages/auth/logout.vue +0 -2
- package/pages/auth/setup.vue +0 -4
- package/pages/auth/verify.vue +14 -8
- package/pages/c/_cluster/apps/charts/install.vue +4 -4
- package/pages/c/_cluster/apps/index.vue +0 -2
- package/pages/c/_cluster/auth/index.vue +0 -2
- package/pages/c/_cluster/ecm/index.vue +0 -2
- package/pages/c/_cluster/explorer/index.vue +28 -2
- package/pages/c/_cluster/fleet/index.vue +1 -1
- package/pages/c/_cluster/index.vue +0 -2
- package/pages/c/_cluster/settings/banners.vue +0 -2
- package/pages/c/_cluster/settings/brand.vue +0 -2
- package/pages/c/_cluster/settings/index.vue +0 -2
- package/pages/c/_cluster/settings/links.vue +0 -1
- package/pages/c/_cluster/settings/performance.vue +0 -1
- package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +2 -1
- package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
- package/pages/c/_cluster/uiplugins/index.vue +0 -2
- package/pages/diagnostic.vue +1 -2
- package/pages/fail-whale.vue +0 -1
- package/pages/prefs.vue +0 -1
- package/pages/support/index.vue +2 -8
- package/pkg/auto-import.js +1 -1
- package/plugins/axios.js +0 -36
- package/plugins/back-button.js +3 -5
- package/plugins/codemirror-loader.js +1 -1
- package/plugins/codemirror.js +41 -0
- package/plugins/dashboard-store/__tests__/{mutations.spec.ts → mutations.test.ts} +1 -1
- package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
- package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
- package/plugins/dashboard-store/actions.js +30 -4
- package/plugins/dashboard-store/classify.js +1 -18
- package/plugins/dashboard-store/getters.js +10 -5
- package/plugins/dashboard-store/index.js +0 -12
- package/plugins/dashboard-store/mutations.js +0 -4
- package/plugins/dashboard-store/resource-class.js +59 -18
- package/plugins/steve/__tests__/steve-class.spec.ts +59 -0
- package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
- package/plugins/steve/getters.js +4 -1
- package/plugins/steve/norman-class.js +19 -0
- package/plugins/steve/steve-class.js +22 -0
- package/plugins/steve/subscribe.js +4 -10
- package/rancher-components/Accordion/Accordion.test.ts +45 -0
- package/rancher-components/Accordion/Accordion.vue +86 -0
- package/rancher-components/Accordion/index.ts +1 -0
- package/rancher-components/BadgeState/BadgeState.vue +3 -3
- package/rancher-components/Banner/Banner.vue +2 -2
- package/rancher-components/Card/Card.vue +3 -3
- package/rancher-components/Form/Checkbox/Checkbox.vue +3 -3
- package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +18 -1
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +65 -24
- package/rancher-components/Form/Radio/RadioButton.test.ts +7 -3
- package/rancher-components/Form/Radio/RadioButton.vue +13 -7
- package/rancher-components/Form/Radio/RadioGroup.test.ts +30 -0
- package/rancher-components/Form/Radio/RadioGroup.vue +8 -3
- package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
- package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
- package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
- package/rancher-components/StringList/StringList.test.ts +270 -0
- package/rancher-components/StringList/StringList.vue +65 -26
- package/rancher-components/components/Accordion/Accordion.test.ts +45 -0
- package/rancher-components/components/Accordion/Accordion.vue +86 -0
- package/rancher-components/components/Accordion/index.ts +1 -0
- package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
- package/rancher-components/components/Banner/Banner.vue +2 -2
- package/rancher-components/components/Card/Card.vue +3 -3
- package/rancher-components/components/Form/Checkbox/Checkbox.vue +3 -3
- package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +18 -1
- package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +57 -24
- package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
- package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
- package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
- package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
- package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
- package/rancher-components/components/StringList/StringList.vue +8 -8
- package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +50 -0
- package/scripts/extension/parse-tag-name +2 -2
- package/scripts/publish-shell.sh +10 -0
- package/scripts/test-plugins-build.sh +85 -9
- package/server/har-file.js +183 -0
- package/store/catalog.js +1 -1
- package/store/features.js +1 -0
- package/store/i18n.js +11 -0
- package/store/index.js +10 -11
- package/store/prefs.js +33 -35
- package/store/type-map.js +8 -7
- package/tsconfig.json +35 -9
- package/tsconfig.paths.json +21 -0
- package/types/shell/index.d.ts +427 -234
- package/types/vue-shim.d.ts +42 -0
- package/utils/__tests__/create-yaml.test.ts +60 -0
- package/utils/axios.js +0 -19
- package/utils/azure.js +24 -0
- package/utils/create-yaml.js +17 -10
- package/utils/git.ts +1 -1
- package/utils/monitoring.js +1 -1
- package/utils/nuxt.js +18 -39
- package/utils/object.js +14 -0
- package/utils/router.scrollBehavior.js +12 -14
- package/utils/time.js +1 -1
- package/utils/url.ts +1 -1
- package/vue.config.js +23 -2
- package/.DS_Store +0 -0
- package/assets/images/providers/aks-black.svg +0 -28
- package/assets/images/providers/aks.svg +0 -31
- package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -234
- package/initialize/layouts.ts +0 -26
- package/mixins/fetch.server.js +0 -73
- package/pages/c/index.vue +0 -9
- package/pages/rio/mesh.vue +0 -508
- package/plugins/transitions.js +0 -4
- package/scripts/.DS_Store +0 -0
- package/scripts/verdaccio.log +0 -205
- package/tsconfig.default.json +0 -46
- package/yarn-error.log +0 -200
- /package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +0 -0
- /package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
- /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
- /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
- /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
- /package/rancher-components/components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
|
@@ -1,21 +1,27 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import
|
|
3
|
-
import CompactInput from '@shell/mixins/compact-input';
|
|
4
|
-
import LabeledFormElement from '@shell/mixins/labeled-form-element';
|
|
2
|
+
import { defineComponent } from 'vue';
|
|
5
3
|
import TextAreaAutoGrow from '@components/Form/TextArea/TextAreaAutoGrow.vue';
|
|
6
4
|
import LabeledTooltip from '@components/LabeledTooltip/LabeledTooltip.vue';
|
|
7
5
|
import { escapeHtml } from '@shell/utils/string';
|
|
8
6
|
import cronstrue from 'cronstrue';
|
|
9
7
|
import { isValidCron } from 'cron-validator';
|
|
10
8
|
import { debounce } from 'lodash';
|
|
9
|
+
import { useLabeledFormElement, labeledFormElementProps } from '@shell/composables/useLabeledFormElement';
|
|
10
|
+
import { useCompactInput } from '@shell/composables/useCompactInput';
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
)
|
|
12
|
+
declare module 'vue/types/vue' {
|
|
13
|
+
interface Vue {
|
|
14
|
+
onInput: (event: Event) => void | ((event: Event) => void);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default defineComponent({
|
|
15
19
|
components: { LabeledTooltip, TextAreaAutoGrow },
|
|
16
|
-
|
|
20
|
+
|
|
21
|
+
inheritAttrs: false,
|
|
17
22
|
|
|
18
23
|
props: {
|
|
24
|
+
...labeledFormElementProps,
|
|
19
25
|
/**
|
|
20
26
|
* The type of the Labeled Input.
|
|
21
27
|
* @values text, cron, multiline, multiline-password
|
|
@@ -90,24 +96,39 @@ export default (
|
|
|
90
96
|
delay: {
|
|
91
97
|
type: Number,
|
|
92
98
|
default: 0
|
|
93
|
-
}
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
|
|
102
|
+
setup(props, { emit }) {
|
|
103
|
+
const {
|
|
104
|
+
focused,
|
|
105
|
+
onFocusLabeled,
|
|
106
|
+
onBlurLabeled,
|
|
107
|
+
isDisabled,
|
|
108
|
+
validationMessage,
|
|
109
|
+
requiredField
|
|
110
|
+
} = useLabeledFormElement(props, emit);
|
|
111
|
+
const { isCompact } = useCompactInput(props);
|
|
112
|
+
|
|
113
|
+
return {
|
|
114
|
+
focused,
|
|
115
|
+
onFocusLabeled,
|
|
116
|
+
onBlurLabeled,
|
|
117
|
+
isDisabled,
|
|
118
|
+
validationMessage,
|
|
119
|
+
requiredField,
|
|
120
|
+
isCompact,
|
|
121
|
+
};
|
|
94
122
|
},
|
|
95
123
|
|
|
96
124
|
data() {
|
|
97
125
|
return {
|
|
98
126
|
updated: false,
|
|
99
|
-
validationErrors: ''
|
|
127
|
+
validationErrors: '',
|
|
100
128
|
};
|
|
101
129
|
},
|
|
102
130
|
|
|
103
131
|
computed: {
|
|
104
|
-
/**
|
|
105
|
-
* Determines if the Labeled Input @input event should be debounced.
|
|
106
|
-
*/
|
|
107
|
-
onInput(): ((value: string) => void) | void {
|
|
108
|
-
return this.delay ? debounce(this.delayInput, this.delay) : this.delayInput;
|
|
109
|
-
},
|
|
110
|
-
|
|
111
132
|
/**
|
|
112
133
|
* Determines if the Labeled Input should display a label.
|
|
113
134
|
*/
|
|
@@ -122,7 +143,7 @@ export default (
|
|
|
122
143
|
return !!this.tooltip || !!this.tooltipKey;
|
|
123
144
|
},
|
|
124
145
|
|
|
125
|
-
tooltipValue(): string | undefined {
|
|
146
|
+
tooltipValue(): string | Record<string, unknown> | undefined {
|
|
126
147
|
if (this.hasTooltip) {
|
|
127
148
|
return this.tooltipKey ? this.t(this.tooltipKey) : this.tooltip;
|
|
128
149
|
}
|
|
@@ -144,7 +165,7 @@ export default (
|
|
|
144
165
|
if (this.type !== 'cron' || !this.value) {
|
|
145
166
|
return;
|
|
146
167
|
}
|
|
147
|
-
if (!isValidCron(this.value)) {
|
|
168
|
+
if (typeof this.value === 'string' && !isValidCron(this.value)) {
|
|
148
169
|
return this.t('generic.invalidCron');
|
|
149
170
|
}
|
|
150
171
|
try {
|
|
@@ -173,15 +194,22 @@ export default (
|
|
|
173
194
|
/**
|
|
174
195
|
* The max length for the Labeled Input.
|
|
175
196
|
*/
|
|
176
|
-
_maxlength(): number |
|
|
197
|
+
_maxlength(): number | undefined {
|
|
177
198
|
if (this.type === 'text' && this.maxlength) {
|
|
178
199
|
return this.maxlength;
|
|
179
200
|
}
|
|
180
201
|
|
|
181
|
-
return
|
|
202
|
+
return undefined;
|
|
182
203
|
},
|
|
183
204
|
},
|
|
184
205
|
|
|
206
|
+
created() {
|
|
207
|
+
/**
|
|
208
|
+
* Determines if the Labeled Input @input event should be debounced.
|
|
209
|
+
*/
|
|
210
|
+
this.onInput = this.delay ? debounce(this.delayInput, this.delay) : this.delayInput;
|
|
211
|
+
},
|
|
212
|
+
|
|
185
213
|
methods: {
|
|
186
214
|
/**
|
|
187
215
|
* Attempts to give the Labeled Input focus.
|
|
@@ -206,11 +234,23 @@ export default (
|
|
|
206
234
|
}
|
|
207
235
|
},
|
|
208
236
|
|
|
237
|
+
/**
|
|
238
|
+
* Emit on input change
|
|
239
|
+
*/
|
|
240
|
+
onChange(event: Event): void {
|
|
241
|
+
this.$emit('change', event);
|
|
242
|
+
},
|
|
243
|
+
|
|
209
244
|
/**
|
|
210
245
|
* Emit on input with delay. Note: Arrow function is avoided due context
|
|
211
246
|
* binding.
|
|
247
|
+
*
|
|
248
|
+
* NOTE: In multiline, TextAreaAutoGrow emits a string with the value
|
|
249
|
+
* https://github.com/rancher/dashboard/issues/10249
|
|
212
250
|
*/
|
|
213
|
-
delayInput(
|
|
251
|
+
delayInput(val: string | Event): void {
|
|
252
|
+
const value = typeof val === 'string' ? val : (val?.target as HTMLInputElement)?.value;
|
|
253
|
+
|
|
214
254
|
this.$emit('input', value);
|
|
215
255
|
},
|
|
216
256
|
|
|
@@ -227,7 +267,7 @@ export default (
|
|
|
227
267
|
* event.
|
|
228
268
|
* @see labeled-form-element.ts mixin for onBlurLabeled()
|
|
229
269
|
*/
|
|
230
|
-
onBlur(event: string): void {
|
|
270
|
+
onBlur(event: string | FocusEvent): void {
|
|
231
271
|
this.$emit('blur', event);
|
|
232
272
|
this.onBlurLabeled();
|
|
233
273
|
},
|
|
@@ -279,7 +319,7 @@ export default (
|
|
|
279
319
|
:placeholder="_placeholder"
|
|
280
320
|
autocapitalize="off"
|
|
281
321
|
:class="{ conceal: type === 'multiline-password' }"
|
|
282
|
-
@input="onInput
|
|
322
|
+
@input="onInput"
|
|
283
323
|
@focus="onFocus"
|
|
284
324
|
@blur="onBlur"
|
|
285
325
|
/>
|
|
@@ -296,9 +336,10 @@ export default (
|
|
|
296
336
|
autocomplete="off"
|
|
297
337
|
autocapitalize="off"
|
|
298
338
|
:data-lpignore="ignorePasswordManagers"
|
|
299
|
-
@input="onInput
|
|
339
|
+
@input="onInput"
|
|
300
340
|
@focus="onFocus"
|
|
301
341
|
@blur="onBlur"
|
|
342
|
+
@change="onChange"
|
|
302
343
|
>
|
|
303
344
|
</slot>
|
|
304
345
|
|
|
@@ -4,7 +4,7 @@ import { cleanHtmlDirective } from '@shell/plugins/clean-html-directive';
|
|
|
4
4
|
|
|
5
5
|
describe('radioButton.vue', () => {
|
|
6
6
|
it('renders label slot contents', () => {
|
|
7
|
-
const wrapper = shallowMount(RadioButton, { slots: { label: 'Test Label' } });
|
|
7
|
+
const wrapper = shallowMount(RadioButton, { slots: { label: 'Test Label' }, propsData: { val: {}, value: {} } });
|
|
8
8
|
|
|
9
9
|
expect(wrapper.find('.radio-label').text()).toBe('Test Label');
|
|
10
10
|
});
|
|
@@ -14,7 +14,9 @@ describe('radioButton.vue', () => {
|
|
|
14
14
|
RadioButton,
|
|
15
15
|
{
|
|
16
16
|
directives: { cleanHtmlDirective },
|
|
17
|
-
propsData: {
|
|
17
|
+
propsData: {
|
|
18
|
+
label: 'Test Label', val: {}, value: {}
|
|
19
|
+
}
|
|
18
20
|
});
|
|
19
21
|
|
|
20
22
|
expect(wrapper.find('.radio-label').text()).toBe('Test Label');
|
|
@@ -23,7 +25,9 @@ describe('radioButton.vue', () => {
|
|
|
23
25
|
it('renders slot contents when both slot and label prop are provided', () => {
|
|
24
26
|
const wrapper = shallowMount(RadioButton, {
|
|
25
27
|
slots: { label: 'Test Label - Slot' },
|
|
26
|
-
propsData: {
|
|
28
|
+
propsData: {
|
|
29
|
+
label: 'Test Label - Props', val: {}, value: {}
|
|
30
|
+
},
|
|
27
31
|
});
|
|
28
32
|
|
|
29
33
|
expect(wrapper.find('.radio-label').text()).toBe('Test Label - Slot');
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import
|
|
2
|
+
import { defineComponent } from 'vue';
|
|
3
3
|
import { _VIEW } from '@shell/config/query-params';
|
|
4
|
+
import { randomStr } from '@shell/utils/string';
|
|
4
5
|
|
|
5
|
-
export default
|
|
6
|
+
export default defineComponent({
|
|
6
7
|
props: {
|
|
7
8
|
/**
|
|
8
9
|
* The name of the input, for grouping.
|
|
@@ -71,7 +72,10 @@ export default Vue.extend({
|
|
|
71
72
|
},
|
|
72
73
|
|
|
73
74
|
data() {
|
|
74
|
-
return {
|
|
75
|
+
return {
|
|
76
|
+
isChecked: this.value === this.val,
|
|
77
|
+
randomString: `${ randomStr() }-radio`,
|
|
78
|
+
};
|
|
75
79
|
},
|
|
76
80
|
|
|
77
81
|
computed: {
|
|
@@ -115,13 +119,15 @@ export default Vue.extend({
|
|
|
115
119
|
/**
|
|
116
120
|
* Emits the input event.
|
|
117
121
|
*/
|
|
118
|
-
clicked(
|
|
119
|
-
|
|
122
|
+
clicked(event: MouseEvent | KeyboardEvent) {
|
|
123
|
+
const target = event.target;
|
|
124
|
+
|
|
125
|
+
if (this.isDisabled || (target instanceof HTMLElement && target.tagName === 'A')) {
|
|
120
126
|
return;
|
|
121
127
|
}
|
|
122
128
|
|
|
123
129
|
this.$emit('input', this.val);
|
|
124
|
-
}
|
|
130
|
+
},
|
|
125
131
|
}
|
|
126
132
|
});
|
|
127
133
|
</script>
|
|
@@ -134,7 +140,7 @@ export default Vue.extend({
|
|
|
134
140
|
@click.stop="clicked($event)"
|
|
135
141
|
>
|
|
136
142
|
<input
|
|
137
|
-
:id="
|
|
143
|
+
:id="randomString"
|
|
138
144
|
:disabled="isDisabled"
|
|
139
145
|
:name="name"
|
|
140
146
|
:value="''+val"
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { mount } from '@vue/test-utils';
|
|
2
|
+
import { RadioGroup } from './index';
|
|
3
|
+
|
|
4
|
+
describe('component: RadioGroup', () => {
|
|
5
|
+
describe('when disabled', () => {
|
|
6
|
+
it.each([true, false])('should expose disabled slot prop for indexed slots for %p', (disabled) => {
|
|
7
|
+
const wrapper = mount(RadioGroup, {
|
|
8
|
+
propsData: {
|
|
9
|
+
name: 'whatever',
|
|
10
|
+
options: [{ label: 'whatever', value: 'whatever' }],
|
|
11
|
+
disabled
|
|
12
|
+
},
|
|
13
|
+
scopedSlots: {
|
|
14
|
+
0(props: {isDisabled: boolean}) {
|
|
15
|
+
return this.$createElement('input', {
|
|
16
|
+
attrs: {
|
|
17
|
+
id: 'test',
|
|
18
|
+
disabled: props.isDisabled
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const slot = wrapper.find('#test').element as HTMLInputElement;
|
|
26
|
+
|
|
27
|
+
expect(slot.disabled).toBe(disabled);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
});
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import
|
|
2
|
+
import { PropType, defineComponent } from 'vue';
|
|
3
3
|
import { _VIEW } from '@shell/config/query-params';
|
|
4
4
|
import RadioButton from '@components/Form/Radio/RadioButton.vue';
|
|
5
5
|
|
|
6
6
|
interface Option {
|
|
7
7
|
value: unknown,
|
|
8
|
-
label: string
|
|
8
|
+
label: string,
|
|
9
|
+
description?: string,
|
|
9
10
|
}
|
|
10
11
|
|
|
11
|
-
export default
|
|
12
|
+
export default defineComponent({
|
|
12
13
|
components: { RadioButton },
|
|
13
14
|
props: {
|
|
14
15
|
/**
|
|
@@ -169,6 +170,7 @@ export default Vue.extend({
|
|
|
169
170
|
|
|
170
171
|
<template>
|
|
171
172
|
<div>
|
|
173
|
+
<!-- Label -->
|
|
172
174
|
<div
|
|
173
175
|
v-if="label || labelKey || tooltip || tooltipKey || $slots.label"
|
|
174
176
|
class="radio-group label"
|
|
@@ -195,6 +197,8 @@ export default Vue.extend({
|
|
|
195
197
|
</h3>
|
|
196
198
|
</slot>
|
|
197
199
|
</div>
|
|
200
|
+
|
|
201
|
+
<!-- Group -->
|
|
198
202
|
<div
|
|
199
203
|
class="radio-group"
|
|
200
204
|
:class="{'row':row}"
|
|
@@ -212,6 +216,7 @@ export default Vue.extend({
|
|
|
212
216
|
:is-disabled="isDisabled"
|
|
213
217
|
:name="i"
|
|
214
218
|
>
|
|
219
|
+
<!-- Default input -->
|
|
215
220
|
<RadioButton
|
|
216
221
|
:key="name+'-'+i"
|
|
217
222
|
:name="name"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import
|
|
2
|
+
import { defineComponent } from 'vue';
|
|
3
3
|
import debounce from 'lodash/debounce';
|
|
4
4
|
import { _EDIT, _VIEW } from '@shell/config/query-params';
|
|
5
5
|
|
|
@@ -10,7 +10,7 @@ declare module 'vue/types/vue' {
|
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
export default
|
|
13
|
+
export default defineComponent({
|
|
14
14
|
inheritAttrs: false,
|
|
15
15
|
|
|
16
16
|
props: {
|
|
@@ -115,7 +115,9 @@ export default Vue.extend({
|
|
|
115
115
|
/**
|
|
116
116
|
* Emits the input event and resizes the Text Area.
|
|
117
117
|
*/
|
|
118
|
-
onInput(
|
|
118
|
+
onInput(event: Event): void {
|
|
119
|
+
const val = (event?.target as HTMLInputElement)?.value;
|
|
120
|
+
|
|
119
121
|
this.$emit('input', val);
|
|
120
122
|
this.queueResize();
|
|
121
123
|
},
|
|
@@ -163,7 +165,7 @@ export default Vue.extend({
|
|
|
163
165
|
v-bind="$attrs"
|
|
164
166
|
:spellcheck="spellcheck"
|
|
165
167
|
@paste="$emit('paste', $event)"
|
|
166
|
-
@input="onInput($event
|
|
168
|
+
@input="onInput($event)"
|
|
167
169
|
@focus="$emit('focus', $event)"
|
|
168
170
|
@blur="$emit('blur', $event)"
|
|
169
171
|
/>
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import
|
|
3
|
-
|
|
2
|
+
import { defineComponent } from 'vue';
|
|
3
|
+
|
|
4
|
+
type StateType = boolean | 'true' | 'false' | undefined;
|
|
5
|
+
|
|
6
|
+
export default defineComponent({
|
|
4
7
|
props: {
|
|
5
8
|
value: {
|
|
6
9
|
type: [Boolean, String, Number],
|
|
@@ -28,7 +31,7 @@ export default Vue.extend({
|
|
|
28
31
|
},
|
|
29
32
|
},
|
|
30
33
|
data() {
|
|
31
|
-
return { state: false as
|
|
34
|
+
return { state: false as StateType };
|
|
32
35
|
},
|
|
33
36
|
|
|
34
37
|
watch: {
|
|
@@ -41,7 +44,7 @@ export default Vue.extend({
|
|
|
41
44
|
},
|
|
42
45
|
|
|
43
46
|
methods: {
|
|
44
|
-
toggle(neu:
|
|
47
|
+
toggle(neu: StateType | null) {
|
|
45
48
|
this.state = neu === null ? !this.state : neu;
|
|
46
49
|
this.$emit('input', this.state ? this.onValue : this.offValue);
|
|
47
50
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import
|
|
2
|
+
import { defineComponent } from 'vue';
|
|
3
3
|
|
|
4
|
-
export default
|
|
4
|
+
export default defineComponent({
|
|
5
5
|
props: {
|
|
6
6
|
/**
|
|
7
7
|
* The Labeled Tooltip value.
|
|
@@ -29,9 +29,14 @@ export default Vue.extend({
|
|
|
29
29
|
}
|
|
30
30
|
},
|
|
31
31
|
computed: {
|
|
32
|
-
iconClass() {
|
|
32
|
+
iconClass(): string {
|
|
33
33
|
return this.status === 'error' ? 'icon-warning' : 'icon-info';
|
|
34
34
|
}
|
|
35
|
+
},
|
|
36
|
+
methods: {
|
|
37
|
+
isObject(value: string | Record<string, unknown>): value is Record<string, unknown> {
|
|
38
|
+
return typeof value === 'object' && value !== null && !!value.content;
|
|
39
|
+
}
|
|
35
40
|
}
|
|
36
41
|
});
|
|
37
42
|
</script>
|
|
@@ -44,7 +49,7 @@ export default Vue.extend({
|
|
|
44
49
|
>
|
|
45
50
|
<template v-if="hover">
|
|
46
51
|
<i
|
|
47
|
-
v-clean-tooltip="value
|
|
52
|
+
v-clean-tooltip="isObject(value) ? { ...{content: value.content, classes: [`tooltip-${status}`]}, ...value } : value"
|
|
48
53
|
:class="{'hover':!value, [iconClass]: true}"
|
|
49
54
|
class="icon status-icon"
|
|
50
55
|
/>
|