@rancher/shell 0.3.0 → 0.3.1
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/styles/global/_button.scss +5 -1
- package/assets/styles/global/_columns.scss +4 -0
- package/assets/styles/global/_layout.scss +1 -2
- package/assets/styles/global/_select.scss +1 -4
- package/assets/styles/themes/_dark.scss +4 -4
- package/assets/styles/themes/_light.scss +4 -3
- package/assets/styles/themes/_suse.scss +1 -1
- package/assets/styles/vendor/vue-select.scss +4 -3
- package/assets/translations/en-us.yaml +669 -73
- package/assets/translations/zh-hans.yaml +547 -165
- package/chart/monitoring/steps/uninstall-v1.vue +2 -2
- package/cloud-credential/azure.vue +23 -0
- package/cloud-credential/harvester.vue +25 -62
- package/cloud-credential/pnap.vue +80 -0
- package/components/.DS_Store +0 -0
- package/components/AdvancedSection.vue +9 -2
- package/components/Alert.vue +2 -2
- package/components/ButtonDropdown.vue +0 -2
- package/components/ButtonGroup.vue +1 -0
- package/components/CollapsibleCard.vue +0 -1
- package/components/CruResource.vue +41 -4
- package/components/DetailTop.vue +58 -3
- package/components/DisableAuthProviderModal.vue +106 -0
- package/{rancher-components/components/Utils/DraggableZone → components}/DraggableZone.vue +0 -0
- package/components/ExplorerMembers.vue +253 -30
- package/components/ExplorerProjectsNamespaces.vue +77 -33
- package/components/GrowlManager.vue +3 -3
- package/components/IconOrSvg.vue +149 -0
- package/components/LogItem.vue +69 -0
- package/components/PodSecurityAdmission.vue +302 -0
- package/components/PromptModal.vue +1 -0
- package/components/ResourceDetail/Masthead.vue +54 -2
- package/components/ResourceDetail/index.vue +12 -5
- package/components/ResourceList/Masthead.vue +11 -1
- package/components/ResourceList/ResourceLoadingIndicator.vue +12 -2
- package/components/ResourceList/index.vue +53 -12
- package/components/ResourceList/resource-list.config.js +7 -0
- package/components/ResourceTable.vue +31 -6
- package/components/SimpleBox.vue +1 -1
- package/components/SortableTable/THead.vue +15 -5
- package/components/SortableTable/index.vue +21 -10
- package/components/Tabbed/index.vue +20 -15
- package/components/__tests__/.DS_Store +0 -0
- package/components/__tests__/AsyncButton.test.ts +140 -0
- package/components/__tests__/BackLink.test.ts +33 -0
- package/components/__tests__/ButtonGroup.test.ts +124 -0
- package/components/__tests__/ClusterBadge.test.ts +32 -0
- package/components/__tests__/CollapsibleCard.test.ts +64 -0
- package/components/__tests__/ConsumptionGauge.test.ts +88 -0
- package/components/__tests__/CruResource.test.ts +3 -2
- package/components/__tests__/FixedBanner.test.ts +129 -0
- package/components/__tests__/GrowlManager.test.ts +147 -0
- package/components/__tests__/NamespaceFilter.test.ts +33 -25
- package/components/__tests__/PercentageBar.test.ts +32 -0
- package/components/__tests__/PodSecurityAdmission.test.ts +398 -0
- package/components/auth/AuthBanner.vue +20 -10
- package/components/auth/RoleDetailEdit.vue +26 -17
- package/components/auth/SelectPrincipal.vue +36 -5
- package/components/form/ArrayList.vue +3 -35
- package/components/form/ArrayListGrouped.vue +13 -4
- package/components/form/ArrayListSelect.vue +5 -5
- package/components/form/Error.vue +8 -0
- package/components/form/KeyValue.vue +39 -7
- package/components/form/LabeledSelect.vue +5 -2
- package/components/form/Labels.vue +46 -16
- package/components/form/Members/ClusterPermissionsEditor.vue +17 -17
- package/components/form/Members/MembershipEditor.vue +12 -12
- package/components/form/NameNsDescription.vue +1 -1
- package/components/form/NodeScheduling.vue +1 -1
- package/components/form/Probe.vue +3 -3
- package/components/form/ResourceQuota/Project.vue +6 -6
- package/components/form/ResourceTabs/index.vue +1 -6
- package/components/form/Security.vue +7 -6
- package/components/form/Select.vue +3 -2
- package/components/form/SelectOrCreateAuthSecret.vue +22 -29
- package/components/form/ServicePorts.vue +8 -0
- package/components/form/WorkloadPorts.vue +7 -1
- package/components/form/__tests__/ArrayList.test.ts +74 -0
- package/components/form/__tests__/ArrayListGrouped.test.ts +6 -4
- package/components/formatter/Checked.vue +1 -1
- package/components/formatter/ClusterLink.vue +5 -0
- package/components/formatter/IconIsDefault.vue +2 -2
- package/components/formatter/InternalExternalIP.vue +11 -8
- package/components/formatter/LiveDuration.vue +78 -0
- package/components/formatter/WorkloadHealthScale.vue +5 -3
- package/components/nav/Header.vue +6 -3
- package/components/nav/NamespaceFilter.vue +146 -63
- package/components/nav/TopLevelMenu.vue +22 -19
- package/components/nav/WindowManager/ContainerLogs.vue +83 -126
- package/components/nav/WindowManager/ContainerShell.vue +9 -7
- package/components/nav/WindowManager/Window.vue +2 -0
- package/components/nav/WindowManager/index.vue +10 -0
- package/config/elemental-types.js +9 -0
- package/config/features.js +2 -0
- package/config/home-links.js +4 -1
- package/config/pod-security-admission.ts +82 -0
- package/config/product/apps.js +1 -1
- package/config/product/auth.js +6 -5
- package/config/product/explorer.js +6 -6
- package/config/product/fleet.js +1 -1
- package/config/product/manager.js +6 -2
- package/config/secret.js +0 -1
- package/config/settings.ts +26 -9
- package/config/table-headers.js +22 -11
- package/config/types.js +4 -1
- package/content/docs/zh-hans/getting-started.md +113 -137
- package/content/docs/zh-hans/whats-new.md +8 -46
- package/creators/pkg/package-lock.json +37 -0
- package/creators/pkg/package.json +1 -1
- package/detail/catalog.cattle.io.app.vue +1 -1
- package/detail/pod.vue +1 -1
- package/detail/provisioning.cattle.io.cluster.vue +35 -9
- package/detail/service.vue +2 -9
- package/detail/workload/index.vue +0 -1
- package/dialog/AddClusterMemberDialog.vue +22 -28
- package/dialog/AddProjectMemberDialog.vue +53 -9
- package/dialog/DiagnosticTimingsDialog.vue +8 -7
- package/dialog/DrainNode.vue +44 -48
- package/dialog/ForceMachineRemoveDialog.vue +5 -7
- package/dialog/GenericPrompt.vue +15 -20
- package/dialog/RollbackWorkloadDialog.vue +15 -46
- package/dialog/RotateCertificatesDialog.vue +5 -7
- package/dialog/RotateEncryptionKeyDialog.vue +5 -9
- package/dialog/SaveAsRKETemplateDialog.vue +5 -13
- package/dialog/ScaleMachineDownDialog.vue +1 -1
- package/dialog/ScalePoolDownDialog.vue +121 -0
- package/edit/__tests__/management.cattle.io.setting.test.ts +3 -3
- package/edit/auth/azuread.vue +16 -16
- package/edit/auth/github.vue +8 -0
- package/edit/auth/googleoauth.vue +10 -1
- package/edit/auth/ldap/index.vue +10 -0
- package/edit/auth/oidc.vue +10 -0
- package/edit/auth/saml.vue +10 -0
- package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -1
- package/edit/cloudcredential.vue +3 -7
- package/edit/logging-flow/Match.vue +39 -8
- package/edit/logging-flow/index.vue +27 -4
- package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +107 -0
- package/edit/management.cattle.io.project.vue +8 -1
- package/edit/management.cattle.io.setting.vue +5 -2
- package/edit/management.cattle.io.user.vue +7 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +23 -7
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +2 -2
- package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +14 -6
- package/edit/namespace.vue +18 -4
- package/edit/networking.k8s.io.ingress/Certificate.vue +1 -0
- package/edit/networking.k8s.io.ingress/IngressClass.vue +8 -6
- package/edit/networking.k8s.io.ingress/RulePath.vue +12 -6
- package/edit/networking.k8s.io.ingress/index.vue +8 -6
- package/edit/persistentvolume/index.vue +30 -27
- package/edit/persistentvolume/plugins/cephfs.vue +29 -29
- package/edit/persistentvolume/plugins/csi.vue +102 -62
- package/edit/persistentvolume/plugins/fc.vue +19 -19
- package/edit/persistentvolume/plugins/iscsi.vue +45 -45
- package/edit/persistentvolume/plugins/rbd.vue +39 -39
- package/edit/persistentvolumeclaim.vue +78 -75
- package/edit/provisioning.cattle.io.cluster/MachinePool.vue +11 -7
- package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +10 -1
- package/edit/provisioning.cattle.io.cluster/RegistryMirrors.vue +87 -27
- package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +3 -6
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +93 -0
- package/edit/provisioning.cattle.io.cluster/import.vue +1 -1
- package/edit/provisioning.cattle.io.cluster/index.vue +29 -6
- package/edit/provisioning.cattle.io.cluster/rke2.vue +440 -152
- package/edit/secret/index.vue +3 -7
- package/edit/service.vue +3 -1
- package/edit/storage.k8s.io.storageclass/index.vue +100 -16
- package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +114 -0
- package/edit/workload/__tests__/index.test.ts +98 -0
- package/edit/workload/index.vue +58 -8
- package/edit/workload/mixins/workload.js +107 -70
- package/edit/workload/storage/ContainerMountPaths.vue +0 -10
- package/edit/workload/storage/emptyDir.vue +88 -0
- package/edit/workload/storage/ephemeralVolume/index.vue +1 -1
- package/edit/workload/storage/index.vue +8 -0
- package/edit/workload/storage/persistentVolumeClaim/index.vue +1 -1
- package/layouts/default.vue +57 -44
- package/list/__tests__/workload.test.ts +5 -2
- package/list/catalog.cattle.io.app.vue +1 -0
- package/list/cis.cattle.io.clusterscan.vue +1 -0
- package/list/fleet.cattle.io.bundle.vue +5 -6
- package/list/fleet.cattle.io.cluster.vue +6 -3
- package/list/fleet.cattle.io.clusterregistrationtoken.vue +5 -6
- package/list/fleet.cattle.io.gitrepo.vue +4 -9
- package/list/helm.cattle.io.projecthelmchart.vue +1 -5
- package/list/logging.banzaicloud.io.clusterflow.vue +4 -1
- package/list/logging.banzaicloud.io.flow.vue +6 -5
- package/list/management.cattle.io.cluster.vue +1 -0
- package/list/management.cattle.io.feature.vue +3 -4
- package/list/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +47 -0
- package/list/management.cattle.io.setting.vue +2 -2
- package/list/management.cattle.io.user.vue +4 -10
- package/list/monitoring.coreos.com.alertmanagerconfig.vue +2 -7
- package/list/node.vue +8 -5
- package/list/persistentvolume.vue +3 -3
- package/list/persistentvolumeclaim.vue +3 -4
- package/list/provisioning.cattle.io.cluster.vue +18 -19
- package/list/service.vue +6 -14
- package/list/workload.vue +43 -38
- package/machine-config/azure.vue +429 -60
- package/machine-config/pnap.vue +288 -0
- package/mixins/auth-config.js +1 -3
- package/mixins/browser-tab-visibility.js +8 -14
- package/mixins/chart.js +1 -1
- package/mixins/create-edit-view/impl.js +4 -0
- package/mixins/create-edit-view/index.js +4 -2
- package/mixins/resource-fetch-namespaced.js +98 -0
- package/mixins/resource-fetch.js +79 -45
- package/mixins/resource-manager.js +1 -23
- package/models/apps.controllerrevision.js +7 -0
- package/models/apps.daemonset.js +18 -0
- package/models/apps.deployment.js +44 -0
- package/models/apps.replicaset.js +7 -0
- package/models/apps.statefulset.js +18 -0
- package/models/batch.job.js +7 -14
- package/models/cluster/node.js +10 -2
- package/models/cluster.x-k8s.io.machine.js +26 -4
- package/models/cluster.x-k8s.io.machinedeployment.js +12 -2
- package/models/event.js +7 -0
- package/models/logging.banzaicloud.io.flow.js +4 -0
- package/models/management.cattle.io.cluster.js +1 -1
- package/models/management.cattle.io.clusterroletemplatebinding.js +1 -1
- package/models/management.cattle.io.globalrole.js +2 -2
- package/models/management.cattle.io.node.js +37 -2
- package/models/management.cattle.io.podsecurityadmissionconfigurationtemplate.ts +4 -0
- package/models/management.cattle.io.project.js +30 -11
- package/models/management.cattle.io.setting.js +1 -1
- package/models/management.cattle.io.user.js +37 -1
- package/models/namespace.js +42 -5
- package/models/persistentvolume.js +14 -2
- package/models/pod.js +15 -0
- package/models/projectroletemplatebinding.js +7 -0
- package/models/provisioning.cattle.io.cluster.js +61 -10
- package/models/rke-machine.cattle.io.pnapmachinetemplate.js +15 -0
- package/models/service.js +14 -13
- package/models/storage.k8s.io.storageclass.js +33 -18
- package/models/workload.js +38 -7
- package/nuxt.config.js +27 -17
- package/package.json +7 -7
- package/pages/about.vue +14 -2
- package/pages/c/_cluster/apps/charts/index.vue +4 -3
- package/pages/c/_cluster/apps/charts/install.vue +59 -22
- package/pages/c/_cluster/auth/config/_id.vue +6 -0
- package/pages/c/_cluster/auth/config/index.vue +8 -6
- package/pages/c/_cluster/auth/group.principal/assign-edit.vue +1 -1
- package/pages/c/_cluster/auth/roles/index.vue +1 -1
- package/pages/c/_cluster/explorer/index.vue +12 -6
- package/pages/c/_cluster/longhorn/index.vue +1 -1
- package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +15 -4
- package/pages/c/_cluster/monitoring/index.vue +1 -1
- package/pages/c/_cluster/neuvector/index.vue +1 -1
- package/pages/c/_cluster/settings/performance.vue +48 -2
- package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +34 -1
- package/pages/c/_cluster/uiplugins/index.vue +28 -2
- package/pages/diagnostic.vue +5 -4
- package/pages/home.vue +105 -30
- package/pages/prefs.vue +23 -12
- package/pages/rio/mesh.vue +1 -1
- package/pkg/dynamic-importer.lib.js +8 -0
- package/pkg/vue.config.js +4 -0
- package/plugins/dashboard-store/__tests__/mutations.spec.js +406 -0
- package/plugins/dashboard-store/actions.js +32 -25
- package/plugins/dashboard-store/getters.js +50 -33
- package/plugins/dashboard-store/mutations.js +134 -28
- package/plugins/dashboard-store/resource-class.js +21 -41
- package/plugins/steve/actions.js +30 -0
- package/plugins/steve/caches/resourceCache.js +60 -0
- package/plugins/steve/getters.js +44 -1
- package/plugins/steve/mutations.js +97 -36
- package/plugins/steve/resourceWatcher.js +277 -0
- package/plugins/steve/schema.utils.js +25 -0
- package/plugins/steve/subscribe.js +288 -115
- package/plugins/steve/worker/index.js +17 -0
- package/plugins/steve/worker/web-worker.advanced.js +302 -0
- package/plugins/steve/{web-worker.steve-sub-worker.js → worker/web-worker.basic.js} +3 -44
- package/rancher-components/Card/Card.vue +3 -3
- package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +1 -0
- package/rancher-components/StringList/StringList.test.ts +45 -420
- package/rancher-components/StringList/StringList.vue +1 -10
- package/rancher-components/components/Banner/Banner.test.ts +44 -0
- package/rancher-components/components/Banner/Banner.vue +129 -61
- package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +13 -22
- package/rancher-components/components/Form/Checkbox/Checkbox.vue +8 -6
- package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +9 -9
- package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +0 -1
- package/rancher-components/components/StringList/StringList.test.ts +7 -7
- package/rancher-components/components/StringList/StringList.vue +21 -15
- package/scripts/test-plugins-build.sh +8 -0
- package/static/loading-indicator.html +1 -1
- package/store/index.js +54 -3
- package/store/plugins.js +0 -17
- package/store/pnap.js +128 -0
- package/store/prefs.js +4 -2
- package/store/type-map.js +55 -13
- package/types/pod-security-admission.ts +36 -0
- package/types/shell/index.d.ts +496 -396
- package/utils/__tests__/object.test.ts +17 -1
- package/utils/__tests__/pod-security-admission.test.ts +61 -0
- package/utils/async.ts +36 -0
- package/utils/color.js +45 -0
- package/utils/crypto/browserHashUtils.js +18 -0
- package/utils/dynamic-importer.js +8 -0
- package/utils/install-redirect.js +1 -1
- package/utils/object.js +24 -0
- package/utils/pod-security-admission.ts +39 -0
- package/utils/socket.js +61 -24
- package/utils/string.js +2 -0
- package/utils/svg-filter.js +301 -0
- package/utils/time.js +49 -0
- package/utils/validators/cidr.js +4 -0
- package/utils/validators/formRules/__tests__/index.test.ts +23 -3
- package/utils/validators/formRules/index.ts +14 -0
- package/config/product/harvester-manager.js +0 -162
- package/edit/harvesterhci.io.management.cluster.vue +0 -153
- package/list/harvesterhci.io.management.cluster.vue +0 -241
- package/machine-config/harvester.vue +0 -693
- package/models/harvesterhci.io.management.cluster.js +0 -228
- package/pages/c/_cluster/harvesterManager/index.vue +0 -24
- package/rancher-components/Card/Card.test.ts +0 -39
- package/rancher-components/Utils/DraggableZone/DraggableZone.vue +0 -181
- package/rancher-components/Utils/DraggableZone/index.ts +0 -1
- package/rancher-components/components/Utils/DraggableZone/index.ts +0 -1
|
@@ -27,6 +27,13 @@ export default Vue.extend({
|
|
|
27
27
|
type: String,
|
|
28
28
|
default: null
|
|
29
29
|
},
|
|
30
|
+
/**
|
|
31
|
+
* Add icon for the banner
|
|
32
|
+
*/
|
|
33
|
+
icon: {
|
|
34
|
+
type: String,
|
|
35
|
+
default: null
|
|
36
|
+
},
|
|
30
37
|
/**
|
|
31
38
|
* Toggles the banner's close button.
|
|
32
39
|
*/
|
|
@@ -58,42 +65,135 @@ export default Vue.extend({
|
|
|
58
65
|
class="banner"
|
|
59
66
|
:class="{
|
|
60
67
|
[color]: true,
|
|
61
|
-
closable,
|
|
62
|
-
stacked
|
|
63
68
|
}"
|
|
64
69
|
>
|
|
65
|
-
<
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
v-else
|
|
74
|
-
v-html="nlToBr(label)"
|
|
70
|
+
<div
|
|
71
|
+
v-if="icon"
|
|
72
|
+
class="banner__icon"
|
|
73
|
+
data-testid="banner-icon"
|
|
74
|
+
>
|
|
75
|
+
<i
|
|
76
|
+
class="icon icon-2x"
|
|
77
|
+
:class="icon"
|
|
75
78
|
/>
|
|
76
|
-
</
|
|
79
|
+
</div>
|
|
77
80
|
<div
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
+
class="banner__content"
|
|
82
|
+
data-testid="banner-content"
|
|
83
|
+
:class="{
|
|
84
|
+
closable,
|
|
85
|
+
stacked,
|
|
86
|
+
icon
|
|
87
|
+
}"
|
|
81
88
|
>
|
|
82
|
-
<
|
|
89
|
+
<slot>
|
|
90
|
+
<t
|
|
91
|
+
v-if="labelKey"
|
|
92
|
+
:k="labelKey"
|
|
93
|
+
:raw="true"
|
|
94
|
+
/>
|
|
95
|
+
<span v-else-if="messageLabel">{{ messageLabel }}</span>
|
|
96
|
+
<span
|
|
97
|
+
v-else
|
|
98
|
+
v-html="nlToBr(label)"
|
|
99
|
+
/>
|
|
100
|
+
</slot>
|
|
101
|
+
<div
|
|
102
|
+
v-if="closable"
|
|
103
|
+
class="banner__content__closer"
|
|
104
|
+
@click="$emit('close')"
|
|
105
|
+
>
|
|
106
|
+
<i
|
|
107
|
+
data-testid="banner-close"
|
|
108
|
+
class="icon icon-close closer-icon"
|
|
109
|
+
/>
|
|
110
|
+
</div>
|
|
83
111
|
</div>
|
|
84
112
|
</div>
|
|
85
113
|
</template>
|
|
86
114
|
|
|
87
115
|
<style lang="scss" scoped>
|
|
88
|
-
|
|
116
|
+
$left-border-size: 4px;
|
|
117
|
+
$icon-size: 24px;
|
|
118
|
+
|
|
119
|
+
.banner {
|
|
120
|
+
display: flex;
|
|
121
|
+
margin: 15px 0;
|
|
122
|
+
position: relative;
|
|
123
|
+
width: 100%;
|
|
124
|
+
|
|
125
|
+
&__icon {
|
|
126
|
+
width: $icon-size * 2;
|
|
127
|
+
flex-grow: 1;
|
|
128
|
+
display: flex;
|
|
129
|
+
justify-content: center;
|
|
130
|
+
align-items: center;
|
|
131
|
+
box-sizing: content-box;
|
|
132
|
+
|
|
133
|
+
.primary & {
|
|
134
|
+
background: var(--primary);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.secondary & {
|
|
138
|
+
background: var(--default);
|
|
139
|
+
}
|
|
89
140
|
|
|
90
|
-
|
|
141
|
+
.success & {
|
|
142
|
+
background: var(--success);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.info & {
|
|
146
|
+
background: var(--info);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.warning & {
|
|
150
|
+
background: var(--warning);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.error & {
|
|
154
|
+
background: var(--error);
|
|
155
|
+
color: var(--primary-text);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
&__content {
|
|
91
160
|
padding: 10px;
|
|
92
|
-
margin: 15px 0;
|
|
93
|
-
width: 100%;
|
|
94
161
|
transition: all 0.2s ease;
|
|
95
|
-
position: relative;
|
|
96
162
|
line-height: 20px;
|
|
163
|
+
width: 100%;
|
|
164
|
+
border-left: solid $left-border-size transparent;
|
|
165
|
+
display: flex;
|
|
166
|
+
|
|
167
|
+
.primary & {
|
|
168
|
+
background: var(--primary);
|
|
169
|
+
border-color: var(--primary);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.secondary & {
|
|
173
|
+
background: var(--default-banner-bg);
|
|
174
|
+
border-color: var(--default);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.success & {
|
|
178
|
+
background: var(--success-banner-bg);
|
|
179
|
+
border-color: var(--success);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.info & {
|
|
183
|
+
background: var(--info-banner-bg);
|
|
184
|
+
border-color: var(--info);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.warning & {
|
|
188
|
+
background: var(--warning-banner-bg);
|
|
189
|
+
border-color: var(--warning);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.error & {
|
|
193
|
+
background: var(--error-banner-bg);
|
|
194
|
+
border-color: var(--error);
|
|
195
|
+
color: var(--error);
|
|
196
|
+
}
|
|
97
197
|
|
|
98
198
|
&.stacked {
|
|
99
199
|
padding: 0 10px;
|
|
@@ -108,10 +208,10 @@ export default Vue.extend({
|
|
|
108
208
|
}
|
|
109
209
|
|
|
110
210
|
&.closable {
|
|
111
|
-
padding-right:
|
|
211
|
+
padding-right: $icon-size * 2;
|
|
112
212
|
}
|
|
113
213
|
|
|
114
|
-
|
|
214
|
+
&__closer {
|
|
115
215
|
display: flex;
|
|
116
216
|
align-items: center;
|
|
117
217
|
|
|
@@ -120,12 +220,11 @@ export default Vue.extend({
|
|
|
120
220
|
top: 0;
|
|
121
221
|
right: 0;
|
|
122
222
|
bottom: 0;
|
|
123
|
-
width:
|
|
124
|
-
line-height:
|
|
223
|
+
width: $icon-size;
|
|
224
|
+
line-height: $icon-size;
|
|
125
225
|
text-align: center;
|
|
126
226
|
|
|
127
227
|
.closer-icon {
|
|
128
|
-
font-size: 22px;
|
|
129
228
|
opacity: 0.7;
|
|
130
229
|
|
|
131
230
|
&:hover {
|
|
@@ -135,40 +234,9 @@ export default Vue.extend({
|
|
|
135
234
|
}
|
|
136
235
|
}
|
|
137
236
|
|
|
138
|
-
&.
|
|
139
|
-
|
|
140
|
-
border-left: solid $left-border-size var(--primary);
|
|
141
|
-
color: var(--body-text);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
&.secondary {
|
|
145
|
-
background: var(--default-banner-bg);
|
|
146
|
-
border-left: solid $left-border-size var(--default);
|
|
147
|
-
color: var(--body-text);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
&.success {
|
|
151
|
-
background: var(--success-banner-bg);
|
|
152
|
-
border-left: solid $left-border-size var(--success);
|
|
153
|
-
color: var(--body-text);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
&.info {
|
|
157
|
-
background: var(--info-banner-bg);
|
|
158
|
-
border-left: solid $left-border-size var(--info);
|
|
159
|
-
color: var(--body-text);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
&.warning {
|
|
163
|
-
background: var(--warning-banner-bg);
|
|
164
|
-
border-left: solid $left-border-size var(--warning);
|
|
165
|
-
color: var(--body-text);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
&.error {
|
|
169
|
-
background: var(--error-banner-bg);
|
|
170
|
-
border-left: solid $left-border-size var(--error);
|
|
171
|
-
color: var(--error);
|
|
237
|
+
&.icon {
|
|
238
|
+
border-left: none;
|
|
172
239
|
}
|
|
173
240
|
}
|
|
241
|
+
}
|
|
174
242
|
</style>
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
import { shallowMount } from '@vue/test-utils';
|
|
1
|
+
import { shallowMount, Wrapper } from '@vue/test-utils';
|
|
2
2
|
import { Checkbox } from './index';
|
|
3
3
|
|
|
4
4
|
describe('Checkbox.vue', () => {
|
|
5
|
+
const event = {
|
|
6
|
+
target: { tagName: 'input', href: null },
|
|
7
|
+
stopPropagation: () => { },
|
|
8
|
+
preventDefault: () => { }
|
|
9
|
+
} as unknown as MouseEvent;
|
|
10
|
+
|
|
5
11
|
it('is unchecked by default', () => {
|
|
6
12
|
const wrapper = shallowMount(Checkbox);
|
|
7
13
|
const cbInput = wrapper.find('input[type="checkbox"]').element as HTMLInputElement;
|
|
@@ -28,14 +34,9 @@ describe('Checkbox.vue', () => {
|
|
|
28
34
|
});
|
|
29
35
|
|
|
30
36
|
it('emits an input event with a true value', async() => {
|
|
31
|
-
const wrapper = shallowMount(Checkbox);
|
|
32
|
-
const event = {
|
|
33
|
-
target: { tagName: 'input', href: null },
|
|
34
|
-
stopPropagation: () => { },
|
|
35
|
-
preventDefault: () => { }
|
|
36
|
-
};
|
|
37
|
+
const wrapper: Wrapper<InstanceType<typeof Checkbox>> = shallowMount(Checkbox);
|
|
37
38
|
|
|
38
|
-
|
|
39
|
+
wrapper.vm.clicked(event);
|
|
39
40
|
await wrapper.vm.$nextTick();
|
|
40
41
|
|
|
41
42
|
expect(wrapper.emitted().input?.length).toBe(1);
|
|
@@ -44,15 +45,10 @@ describe('Checkbox.vue', () => {
|
|
|
44
45
|
|
|
45
46
|
it('emits an input event with a custom valueWhenTrue', async() => {
|
|
46
47
|
const valueWhenTrue = 'BIG IF TRUE';
|
|
47
|
-
const event = {
|
|
48
|
-
target: { tagName: 'input', href: null },
|
|
49
|
-
stopPropagation: () => { },
|
|
50
|
-
preventDefault: () => { }
|
|
51
|
-
};
|
|
52
48
|
|
|
53
|
-
const wrapper = shallowMount(Checkbox, { propsData: { value: false, valueWhenTrue } });
|
|
49
|
+
const wrapper: Wrapper<InstanceType<typeof Checkbox>> = shallowMount(Checkbox, { propsData: { value: false, valueWhenTrue } });
|
|
54
50
|
|
|
55
|
-
|
|
51
|
+
wrapper.vm.clicked(event);
|
|
56
52
|
await wrapper.vm.$nextTick();
|
|
57
53
|
|
|
58
54
|
expect(wrapper.emitted().input?.length).toBe(1);
|
|
@@ -61,15 +57,10 @@ describe('Checkbox.vue', () => {
|
|
|
61
57
|
|
|
62
58
|
it('updates from valueWhenTrue to falsy', async() => {
|
|
63
59
|
const valueWhenTrue = 'REAL HUGE IF FALSE';
|
|
64
|
-
const event = {
|
|
65
|
-
target: { tagName: 'input', href: null },
|
|
66
|
-
stopPropagation: () => { },
|
|
67
|
-
preventDefault: () => { }
|
|
68
|
-
};
|
|
69
60
|
|
|
70
|
-
const wrapper = shallowMount(Checkbox, { propsData: { value: valueWhenTrue, valueWhenTrue } });
|
|
61
|
+
const wrapper: Wrapper<InstanceType<typeof Checkbox>> = shallowMount(Checkbox, { propsData: { value: valueWhenTrue, valueWhenTrue } });
|
|
71
62
|
|
|
72
|
-
|
|
63
|
+
wrapper.vm.clicked(event);
|
|
73
64
|
await wrapper.vm.$nextTick();
|
|
74
65
|
|
|
75
66
|
expect(wrapper.emitted().input?.[0][0]).toBe(null);
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import Vue, { PropType } from 'vue';
|
|
3
3
|
import { _EDIT, _VIEW } from '@shell/config/query-params';
|
|
4
4
|
import { addObject, removeObject } from '@shell/utils/array';
|
|
5
|
+
import cloneDeep from 'lodash/cloneDeep';
|
|
5
6
|
|
|
6
7
|
export default Vue.extend({
|
|
7
8
|
props: {
|
|
@@ -162,13 +163,15 @@ export default Vue.extend({
|
|
|
162
163
|
const click = new CustomEvent('click', customEvent);
|
|
163
164
|
|
|
164
165
|
// Flip the value
|
|
165
|
-
|
|
166
|
+
const value = cloneDeep(this.value);
|
|
167
|
+
|
|
168
|
+
if (this.isMulti(value)) {
|
|
166
169
|
if (this.isChecked) {
|
|
167
|
-
removeObject(
|
|
170
|
+
removeObject(value, this.valueWhenTrue);
|
|
168
171
|
} else {
|
|
169
|
-
addObject(
|
|
172
|
+
addObject(value, this.valueWhenTrue);
|
|
170
173
|
}
|
|
171
|
-
this.$emit('input',
|
|
174
|
+
this.$emit('input', value);
|
|
172
175
|
} else if (this.isString(this.valueWhenTrue)) {
|
|
173
176
|
if (this.isChecked) {
|
|
174
177
|
this.$emit('input', null);
|
|
@@ -176,7 +179,7 @@ export default Vue.extend({
|
|
|
176
179
|
this.$emit('input', this.valueWhenTrue);
|
|
177
180
|
}
|
|
178
181
|
} else {
|
|
179
|
-
this.$emit('input', !
|
|
182
|
+
this.$emit('input', !value);
|
|
180
183
|
this.$el.dispatchEvent(click);
|
|
181
184
|
}
|
|
182
185
|
},
|
|
@@ -217,7 +220,6 @@ export default Vue.extend({
|
|
|
217
220
|
@click="clicked($event)"
|
|
218
221
|
>
|
|
219
222
|
<input
|
|
220
|
-
v-model="value"
|
|
221
223
|
:checked="isChecked"
|
|
222
224
|
:value="valueWhenTrue"
|
|
223
225
|
type="checkbox"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { shallowMount } from '@vue/test-utils';
|
|
1
|
+
import { shallowMount, Wrapper } from '@vue/test-utils';
|
|
2
2
|
import { ToggleSwitch } from './index';
|
|
3
3
|
|
|
4
4
|
describe('ToggleSwitch.vue', () => {
|
|
@@ -33,9 +33,9 @@ describe('ToggleSwitch.vue', () => {
|
|
|
33
33
|
});
|
|
34
34
|
|
|
35
35
|
it('emits an input event with a true value', async() => {
|
|
36
|
-
const wrapper = shallowMount(ToggleSwitch);
|
|
36
|
+
const wrapper: Wrapper<InstanceType<typeof ToggleSwitch>> = shallowMount(ToggleSwitch);
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
wrapper.vm.toggle(true);
|
|
39
39
|
|
|
40
40
|
await wrapper.vm.$nextTick();
|
|
41
41
|
|
|
@@ -44,12 +44,12 @@ describe('ToggleSwitch.vue', () => {
|
|
|
44
44
|
});
|
|
45
45
|
|
|
46
46
|
it('emits an input event with a false value', async() => {
|
|
47
|
-
const wrapper = shallowMount(
|
|
47
|
+
const wrapper: Wrapper<InstanceType<typeof ToggleSwitch>> = shallowMount(
|
|
48
48
|
ToggleSwitch,
|
|
49
49
|
{ propsData: { value: true } }
|
|
50
50
|
);
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
wrapper.vm.toggle(false);
|
|
53
53
|
|
|
54
54
|
await wrapper.vm.$nextTick();
|
|
55
55
|
|
|
@@ -60,11 +60,11 @@ describe('ToggleSwitch.vue', () => {
|
|
|
60
60
|
it('emits an input event with a custom onValue', async() => {
|
|
61
61
|
const onValue = 'THE TRUTH';
|
|
62
62
|
|
|
63
|
-
const wrapper = shallowMount(
|
|
63
|
+
const wrapper: Wrapper<InstanceType<typeof ToggleSwitch>> = shallowMount(
|
|
64
64
|
ToggleSwitch,
|
|
65
65
|
{ propsData: { onValue } });
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
wrapper.vm.toggle(true);
|
|
68
68
|
|
|
69
69
|
await wrapper.vm.$nextTick();
|
|
70
70
|
|
|
@@ -75,7 +75,7 @@ describe('ToggleSwitch.vue', () => {
|
|
|
75
75
|
it('emits an input event with a custom offValue', async() => {
|
|
76
76
|
const offValue = 'NOT THE TRUTH';
|
|
77
77
|
|
|
78
|
-
const wrapper = shallowMount(
|
|
78
|
+
const wrapper: Wrapper<InstanceType<typeof ToggleSwitch>> = shallowMount(
|
|
79
79
|
ToggleSwitch,
|
|
80
80
|
{
|
|
81
81
|
propsData: {
|
|
@@ -84,7 +84,7 @@ describe('ToggleSwitch.vue', () => {
|
|
|
84
84
|
}
|
|
85
85
|
});
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
wrapper.vm.toggle(false);
|
|
88
88
|
|
|
89
89
|
await wrapper.vm.$nextTick();
|
|
90
90
|
|
|
@@ -2,7 +2,7 @@ import { mount, Wrapper } from '@vue/test-utils';
|
|
|
2
2
|
import { StringList } from './index';
|
|
3
3
|
|
|
4
4
|
describe('StringList.vue', () => {
|
|
5
|
-
let wrapper: Wrapper<
|
|
5
|
+
let wrapper: Wrapper<InstanceType<typeof StringList>>;
|
|
6
6
|
|
|
7
7
|
beforeEach(() => {
|
|
8
8
|
wrapper = mount(StringList, { propsData: { items: [] } });
|
|
@@ -124,7 +124,7 @@ describe('StringList.vue', () => {
|
|
|
124
124
|
await inputField.setValue('F');
|
|
125
125
|
await wrapper.vm.$nextTick();
|
|
126
126
|
|
|
127
|
-
const emitted = (wrapper.emitted('type:item')
|
|
127
|
+
const emitted = (wrapper.emitted('type:item') || [])[0][0][0];
|
|
128
128
|
|
|
129
129
|
expect(emitted).toBe('F');
|
|
130
130
|
});
|
|
@@ -240,7 +240,7 @@ describe('StringList.vue', () => {
|
|
|
240
240
|
|
|
241
241
|
await wrapper.vm.$nextTick();
|
|
242
242
|
|
|
243
|
-
const itemsCount = (wrapper.emitted('change')
|
|
243
|
+
const itemsCount = (wrapper.emitted('change') || [])[0][0].length;
|
|
244
244
|
|
|
245
245
|
expect(itemsCount).toBe(0);
|
|
246
246
|
});
|
|
@@ -296,7 +296,7 @@ describe('StringList.vue', () => {
|
|
|
296
296
|
await inputField.trigger('keydown.enter');
|
|
297
297
|
await wrapper.vm.$nextTick();
|
|
298
298
|
|
|
299
|
-
const emitted = (wrapper.emitted('change')
|
|
299
|
+
const emitted = (wrapper.emitted('change') || [])[0][0][0];
|
|
300
300
|
|
|
301
301
|
expect(emitted).toBe(validItem.trim());
|
|
302
302
|
});
|
|
@@ -317,7 +317,7 @@ describe('StringList.vue', () => {
|
|
|
317
317
|
await inputField.trigger('keydown.enter');
|
|
318
318
|
await wrapper.vm.$nextTick();
|
|
319
319
|
|
|
320
|
-
const emitted = (wrapper.emitted('change')
|
|
320
|
+
const emitted = (wrapper.emitted('change') || [])[0][0][0];
|
|
321
321
|
|
|
322
322
|
expect(emitted).toBe(validItem.trim());
|
|
323
323
|
});
|
|
@@ -453,7 +453,7 @@ describe('StringList.vue', () => {
|
|
|
453
453
|
|
|
454
454
|
await inputField.setValue('test');
|
|
455
455
|
|
|
456
|
-
const isDuplicate = (wrapper.emitted('errors')
|
|
456
|
+
const isDuplicate = (wrapper.emitted('errors') || [])[0][0].duplicate;
|
|
457
457
|
|
|
458
458
|
expect(isDuplicate).toBe(true);
|
|
459
459
|
});
|
|
@@ -475,7 +475,7 @@ describe('StringList.vue', () => {
|
|
|
475
475
|
// it is not duplicate, reset duplicate error -> emit false
|
|
476
476
|
await inputField.setValue('test-1');
|
|
477
477
|
|
|
478
|
-
const isDuplicate = (wrapper.emitted('errors')
|
|
478
|
+
const isDuplicate = (wrapper.emitted('errors') || [])[0][0].duplicate;
|
|
479
479
|
|
|
480
480
|
expect(isDuplicate).toBe(false);
|
|
481
481
|
});
|
|
@@ -189,37 +189,42 @@ export default Vue.extend({
|
|
|
189
189
|
return;
|
|
190
190
|
}
|
|
191
191
|
if (this.editedItem) {
|
|
192
|
+
this.deleteAndSelectNext(this.editedItem);
|
|
192
193
|
this.toggleEditMode(false);
|
|
193
194
|
|
|
194
195
|
return;
|
|
195
196
|
}
|
|
196
197
|
if (this.selected) {
|
|
197
|
-
|
|
198
|
+
this.deleteAndSelectNext(this.selected);
|
|
199
|
+
}
|
|
200
|
+
},
|
|
198
201
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
* Select the next item in the list when an item is to be deleted.
|
|
202
|
-
*/
|
|
203
|
-
const item = (this.items[index + 1] || this.items[index - 1]);
|
|
202
|
+
deleteAndSelectNext(currItem: string) {
|
|
203
|
+
const index = findStringIndex(this.items, currItem, false);
|
|
204
204
|
|
|
205
|
-
|
|
206
|
-
|
|
205
|
+
if (index !== -1) {
|
|
206
|
+
/**
|
|
207
|
+
* Select the next item in the list.
|
|
208
|
+
*/
|
|
209
|
+
const item = (this.items[index + 1] || this.items[index - 1]);
|
|
207
210
|
|
|
208
|
-
|
|
209
|
-
|
|
211
|
+
this.onSelect(item);
|
|
212
|
+
this.setFocus(item);
|
|
213
|
+
|
|
214
|
+
this.deleteItem(this.items[index]);
|
|
210
215
|
}
|
|
211
216
|
},
|
|
212
217
|
|
|
213
218
|
setFocus(refId: string) {
|
|
214
|
-
this.$nextTick(() => this.getElemByRef(refId)?.focus());
|
|
219
|
+
this.$nextTick(() => (this.getElemByRef(refId) as Vue & HTMLElement)?.focus());
|
|
215
220
|
},
|
|
216
221
|
|
|
217
222
|
/**
|
|
218
223
|
* Move scrollbar when the selected item is over the top or bottom side of the box
|
|
219
224
|
*/
|
|
220
225
|
moveScrollbar(arrow: Arrow, value?: number) {
|
|
221
|
-
const box = this.getElemByRef(BOX);
|
|
222
|
-
const item = this.getElemByRef(this.selected || '');
|
|
226
|
+
const box = this.getElemByRef(BOX) as HTMLElement;
|
|
227
|
+
const item = this.getElemByRef(this.selected || '') as HTMLElement;
|
|
223
228
|
|
|
224
229
|
if (box && item && item.className.includes(CLASS.item)) {
|
|
225
230
|
const boxRect = box.getClientRects()[0];
|
|
@@ -248,7 +253,7 @@ export default Vue.extend({
|
|
|
248
253
|
},
|
|
249
254
|
|
|
250
255
|
toggleErrorClass(refId: string, val: boolean) {
|
|
251
|
-
const input = this.getElemByRef(refId)?.$el;
|
|
256
|
+
const input = (this.getElemByRef(refId) as Vue)?.$el;
|
|
252
257
|
|
|
253
258
|
if (input) {
|
|
254
259
|
if (val) {
|
|
@@ -306,7 +311,7 @@ export default Vue.extend({
|
|
|
306
311
|
getElemByRef(id: string) {
|
|
307
312
|
const ref = this.$refs[id];
|
|
308
313
|
|
|
309
|
-
return
|
|
314
|
+
return Array.isArray(ref) ? ref[0] : ref;
|
|
310
315
|
},
|
|
311
316
|
|
|
312
317
|
/**
|
|
@@ -527,6 +532,7 @@ export default Vue.extend({
|
|
|
527
532
|
width: auto;
|
|
528
533
|
user-select: none;
|
|
529
534
|
overflow: hidden;
|
|
535
|
+
white-space: no-wrap;
|
|
530
536
|
text-overflow: ellipsis;
|
|
531
537
|
padding-top: 1px;
|
|
532
538
|
}
|
|
@@ -78,11 +78,19 @@ rm -rf ${BASE_DIR}/pkg/test-pkg
|
|
|
78
78
|
sed -i.bak -e "s/\"version\": \"[0-9]*.[0-9]*.[0-9]*\",/\"version\": \"7.7.7\",/g" ${SHELL_DIR}/package.json
|
|
79
79
|
rm ${SHELL_DIR}/package.json.bak
|
|
80
80
|
|
|
81
|
+
# Same as above for Rancher Components
|
|
82
|
+
# We might have bumped the version number but its not published yet, so this will fail
|
|
83
|
+
sed -i.bak -e "s/\"version\": \"[0-9]*.[0-9]*.[0-9]*\",/\"version\": \"7.7.7\",/g" ${BASE_DIR}/pkg/rancher-components/package.json
|
|
84
|
+
|
|
81
85
|
# Publish shell
|
|
82
86
|
echo "Publishing shell packages to local registry"
|
|
83
87
|
yarn install
|
|
84
88
|
${SHELL_DIR}/scripts/publish-shell.sh
|
|
85
89
|
|
|
90
|
+
# Publish rancher components
|
|
91
|
+
yarn build:lib
|
|
92
|
+
yarn publish:lib
|
|
93
|
+
|
|
86
94
|
if [ "${SKIP_STANDALONE}" == "false" ]; then
|
|
87
95
|
DIR=$(mktemp -d)
|
|
88
96
|
pushd $DIR > /dev/null
|