@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.
Files changed (322) hide show
  1. package/assets/styles/global/_button.scss +5 -1
  2. package/assets/styles/global/_columns.scss +4 -0
  3. package/assets/styles/global/_layout.scss +1 -2
  4. package/assets/styles/global/_select.scss +1 -4
  5. package/assets/styles/themes/_dark.scss +4 -4
  6. package/assets/styles/themes/_light.scss +4 -3
  7. package/assets/styles/themes/_suse.scss +1 -1
  8. package/assets/styles/vendor/vue-select.scss +4 -3
  9. package/assets/translations/en-us.yaml +669 -73
  10. package/assets/translations/zh-hans.yaml +547 -165
  11. package/chart/monitoring/steps/uninstall-v1.vue +2 -2
  12. package/cloud-credential/azure.vue +23 -0
  13. package/cloud-credential/harvester.vue +25 -62
  14. package/cloud-credential/pnap.vue +80 -0
  15. package/components/.DS_Store +0 -0
  16. package/components/AdvancedSection.vue +9 -2
  17. package/components/Alert.vue +2 -2
  18. package/components/ButtonDropdown.vue +0 -2
  19. package/components/ButtonGroup.vue +1 -0
  20. package/components/CollapsibleCard.vue +0 -1
  21. package/components/CruResource.vue +41 -4
  22. package/components/DetailTop.vue +58 -3
  23. package/components/DisableAuthProviderModal.vue +106 -0
  24. package/{rancher-components/components/Utils/DraggableZone → components}/DraggableZone.vue +0 -0
  25. package/components/ExplorerMembers.vue +253 -30
  26. package/components/ExplorerProjectsNamespaces.vue +77 -33
  27. package/components/GrowlManager.vue +3 -3
  28. package/components/IconOrSvg.vue +149 -0
  29. package/components/LogItem.vue +69 -0
  30. package/components/PodSecurityAdmission.vue +302 -0
  31. package/components/PromptModal.vue +1 -0
  32. package/components/ResourceDetail/Masthead.vue +54 -2
  33. package/components/ResourceDetail/index.vue +12 -5
  34. package/components/ResourceList/Masthead.vue +11 -1
  35. package/components/ResourceList/ResourceLoadingIndicator.vue +12 -2
  36. package/components/ResourceList/index.vue +53 -12
  37. package/components/ResourceList/resource-list.config.js +7 -0
  38. package/components/ResourceTable.vue +31 -6
  39. package/components/SimpleBox.vue +1 -1
  40. package/components/SortableTable/THead.vue +15 -5
  41. package/components/SortableTable/index.vue +21 -10
  42. package/components/Tabbed/index.vue +20 -15
  43. package/components/__tests__/.DS_Store +0 -0
  44. package/components/__tests__/AsyncButton.test.ts +140 -0
  45. package/components/__tests__/BackLink.test.ts +33 -0
  46. package/components/__tests__/ButtonGroup.test.ts +124 -0
  47. package/components/__tests__/ClusterBadge.test.ts +32 -0
  48. package/components/__tests__/CollapsibleCard.test.ts +64 -0
  49. package/components/__tests__/ConsumptionGauge.test.ts +88 -0
  50. package/components/__tests__/CruResource.test.ts +3 -2
  51. package/components/__tests__/FixedBanner.test.ts +129 -0
  52. package/components/__tests__/GrowlManager.test.ts +147 -0
  53. package/components/__tests__/NamespaceFilter.test.ts +33 -25
  54. package/components/__tests__/PercentageBar.test.ts +32 -0
  55. package/components/__tests__/PodSecurityAdmission.test.ts +398 -0
  56. package/components/auth/AuthBanner.vue +20 -10
  57. package/components/auth/RoleDetailEdit.vue +26 -17
  58. package/components/auth/SelectPrincipal.vue +36 -5
  59. package/components/form/ArrayList.vue +3 -35
  60. package/components/form/ArrayListGrouped.vue +13 -4
  61. package/components/form/ArrayListSelect.vue +5 -5
  62. package/components/form/Error.vue +8 -0
  63. package/components/form/KeyValue.vue +39 -7
  64. package/components/form/LabeledSelect.vue +5 -2
  65. package/components/form/Labels.vue +46 -16
  66. package/components/form/Members/ClusterPermissionsEditor.vue +17 -17
  67. package/components/form/Members/MembershipEditor.vue +12 -12
  68. package/components/form/NameNsDescription.vue +1 -1
  69. package/components/form/NodeScheduling.vue +1 -1
  70. package/components/form/Probe.vue +3 -3
  71. package/components/form/ResourceQuota/Project.vue +6 -6
  72. package/components/form/ResourceTabs/index.vue +1 -6
  73. package/components/form/Security.vue +7 -6
  74. package/components/form/Select.vue +3 -2
  75. package/components/form/SelectOrCreateAuthSecret.vue +22 -29
  76. package/components/form/ServicePorts.vue +8 -0
  77. package/components/form/WorkloadPorts.vue +7 -1
  78. package/components/form/__tests__/ArrayList.test.ts +74 -0
  79. package/components/form/__tests__/ArrayListGrouped.test.ts +6 -4
  80. package/components/formatter/Checked.vue +1 -1
  81. package/components/formatter/ClusterLink.vue +5 -0
  82. package/components/formatter/IconIsDefault.vue +2 -2
  83. package/components/formatter/InternalExternalIP.vue +11 -8
  84. package/components/formatter/LiveDuration.vue +78 -0
  85. package/components/formatter/WorkloadHealthScale.vue +5 -3
  86. package/components/nav/Header.vue +6 -3
  87. package/components/nav/NamespaceFilter.vue +146 -63
  88. package/components/nav/TopLevelMenu.vue +22 -19
  89. package/components/nav/WindowManager/ContainerLogs.vue +83 -126
  90. package/components/nav/WindowManager/ContainerShell.vue +9 -7
  91. package/components/nav/WindowManager/Window.vue +2 -0
  92. package/components/nav/WindowManager/index.vue +10 -0
  93. package/config/elemental-types.js +9 -0
  94. package/config/features.js +2 -0
  95. package/config/home-links.js +4 -1
  96. package/config/pod-security-admission.ts +82 -0
  97. package/config/product/apps.js +1 -1
  98. package/config/product/auth.js +6 -5
  99. package/config/product/explorer.js +6 -6
  100. package/config/product/fleet.js +1 -1
  101. package/config/product/manager.js +6 -2
  102. package/config/secret.js +0 -1
  103. package/config/settings.ts +26 -9
  104. package/config/table-headers.js +22 -11
  105. package/config/types.js +4 -1
  106. package/content/docs/zh-hans/getting-started.md +113 -137
  107. package/content/docs/zh-hans/whats-new.md +8 -46
  108. package/creators/pkg/package-lock.json +37 -0
  109. package/creators/pkg/package.json +1 -1
  110. package/detail/catalog.cattle.io.app.vue +1 -1
  111. package/detail/pod.vue +1 -1
  112. package/detail/provisioning.cattle.io.cluster.vue +35 -9
  113. package/detail/service.vue +2 -9
  114. package/detail/workload/index.vue +0 -1
  115. package/dialog/AddClusterMemberDialog.vue +22 -28
  116. package/dialog/AddProjectMemberDialog.vue +53 -9
  117. package/dialog/DiagnosticTimingsDialog.vue +8 -7
  118. package/dialog/DrainNode.vue +44 -48
  119. package/dialog/ForceMachineRemoveDialog.vue +5 -7
  120. package/dialog/GenericPrompt.vue +15 -20
  121. package/dialog/RollbackWorkloadDialog.vue +15 -46
  122. package/dialog/RotateCertificatesDialog.vue +5 -7
  123. package/dialog/RotateEncryptionKeyDialog.vue +5 -9
  124. package/dialog/SaveAsRKETemplateDialog.vue +5 -13
  125. package/dialog/ScaleMachineDownDialog.vue +1 -1
  126. package/dialog/ScalePoolDownDialog.vue +121 -0
  127. package/edit/__tests__/management.cattle.io.setting.test.ts +3 -3
  128. package/edit/auth/azuread.vue +16 -16
  129. package/edit/auth/github.vue +8 -0
  130. package/edit/auth/googleoauth.vue +10 -1
  131. package/edit/auth/ldap/index.vue +10 -0
  132. package/edit/auth/oidc.vue +10 -0
  133. package/edit/auth/saml.vue +10 -0
  134. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -1
  135. package/edit/cloudcredential.vue +3 -7
  136. package/edit/logging-flow/Match.vue +39 -8
  137. package/edit/logging-flow/index.vue +27 -4
  138. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +107 -0
  139. package/edit/management.cattle.io.project.vue +8 -1
  140. package/edit/management.cattle.io.setting.vue +5 -2
  141. package/edit/management.cattle.io.user.vue +7 -1
  142. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +23 -7
  143. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +2 -2
  144. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +14 -6
  145. package/edit/namespace.vue +18 -4
  146. package/edit/networking.k8s.io.ingress/Certificate.vue +1 -0
  147. package/edit/networking.k8s.io.ingress/IngressClass.vue +8 -6
  148. package/edit/networking.k8s.io.ingress/RulePath.vue +12 -6
  149. package/edit/networking.k8s.io.ingress/index.vue +8 -6
  150. package/edit/persistentvolume/index.vue +30 -27
  151. package/edit/persistentvolume/plugins/cephfs.vue +29 -29
  152. package/edit/persistentvolume/plugins/csi.vue +102 -62
  153. package/edit/persistentvolume/plugins/fc.vue +19 -19
  154. package/edit/persistentvolume/plugins/iscsi.vue +45 -45
  155. package/edit/persistentvolume/plugins/rbd.vue +39 -39
  156. package/edit/persistentvolumeclaim.vue +78 -75
  157. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +11 -7
  158. package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +10 -1
  159. package/edit/provisioning.cattle.io.cluster/RegistryMirrors.vue +87 -27
  160. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +3 -6
  161. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +93 -0
  162. package/edit/provisioning.cattle.io.cluster/import.vue +1 -1
  163. package/edit/provisioning.cattle.io.cluster/index.vue +29 -6
  164. package/edit/provisioning.cattle.io.cluster/rke2.vue +440 -152
  165. package/edit/secret/index.vue +3 -7
  166. package/edit/service.vue +3 -1
  167. package/edit/storage.k8s.io.storageclass/index.vue +100 -16
  168. package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +114 -0
  169. package/edit/workload/__tests__/index.test.ts +98 -0
  170. package/edit/workload/index.vue +58 -8
  171. package/edit/workload/mixins/workload.js +107 -70
  172. package/edit/workload/storage/ContainerMountPaths.vue +0 -10
  173. package/edit/workload/storage/emptyDir.vue +88 -0
  174. package/edit/workload/storage/ephemeralVolume/index.vue +1 -1
  175. package/edit/workload/storage/index.vue +8 -0
  176. package/edit/workload/storage/persistentVolumeClaim/index.vue +1 -1
  177. package/layouts/default.vue +57 -44
  178. package/list/__tests__/workload.test.ts +5 -2
  179. package/list/catalog.cattle.io.app.vue +1 -0
  180. package/list/cis.cattle.io.clusterscan.vue +1 -0
  181. package/list/fleet.cattle.io.bundle.vue +5 -6
  182. package/list/fleet.cattle.io.cluster.vue +6 -3
  183. package/list/fleet.cattle.io.clusterregistrationtoken.vue +5 -6
  184. package/list/fleet.cattle.io.gitrepo.vue +4 -9
  185. package/list/helm.cattle.io.projecthelmchart.vue +1 -5
  186. package/list/logging.banzaicloud.io.clusterflow.vue +4 -1
  187. package/list/logging.banzaicloud.io.flow.vue +6 -5
  188. package/list/management.cattle.io.cluster.vue +1 -0
  189. package/list/management.cattle.io.feature.vue +3 -4
  190. package/list/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +47 -0
  191. package/list/management.cattle.io.setting.vue +2 -2
  192. package/list/management.cattle.io.user.vue +4 -10
  193. package/list/monitoring.coreos.com.alertmanagerconfig.vue +2 -7
  194. package/list/node.vue +8 -5
  195. package/list/persistentvolume.vue +3 -3
  196. package/list/persistentvolumeclaim.vue +3 -4
  197. package/list/provisioning.cattle.io.cluster.vue +18 -19
  198. package/list/service.vue +6 -14
  199. package/list/workload.vue +43 -38
  200. package/machine-config/azure.vue +429 -60
  201. package/machine-config/pnap.vue +288 -0
  202. package/mixins/auth-config.js +1 -3
  203. package/mixins/browser-tab-visibility.js +8 -14
  204. package/mixins/chart.js +1 -1
  205. package/mixins/create-edit-view/impl.js +4 -0
  206. package/mixins/create-edit-view/index.js +4 -2
  207. package/mixins/resource-fetch-namespaced.js +98 -0
  208. package/mixins/resource-fetch.js +79 -45
  209. package/mixins/resource-manager.js +1 -23
  210. package/models/apps.controllerrevision.js +7 -0
  211. package/models/apps.daemonset.js +18 -0
  212. package/models/apps.deployment.js +44 -0
  213. package/models/apps.replicaset.js +7 -0
  214. package/models/apps.statefulset.js +18 -0
  215. package/models/batch.job.js +7 -14
  216. package/models/cluster/node.js +10 -2
  217. package/models/cluster.x-k8s.io.machine.js +26 -4
  218. package/models/cluster.x-k8s.io.machinedeployment.js +12 -2
  219. package/models/event.js +7 -0
  220. package/models/logging.banzaicloud.io.flow.js +4 -0
  221. package/models/management.cattle.io.cluster.js +1 -1
  222. package/models/management.cattle.io.clusterroletemplatebinding.js +1 -1
  223. package/models/management.cattle.io.globalrole.js +2 -2
  224. package/models/management.cattle.io.node.js +37 -2
  225. package/models/management.cattle.io.podsecurityadmissionconfigurationtemplate.ts +4 -0
  226. package/models/management.cattle.io.project.js +30 -11
  227. package/models/management.cattle.io.setting.js +1 -1
  228. package/models/management.cattle.io.user.js +37 -1
  229. package/models/namespace.js +42 -5
  230. package/models/persistentvolume.js +14 -2
  231. package/models/pod.js +15 -0
  232. package/models/projectroletemplatebinding.js +7 -0
  233. package/models/provisioning.cattle.io.cluster.js +61 -10
  234. package/models/rke-machine.cattle.io.pnapmachinetemplate.js +15 -0
  235. package/models/service.js +14 -13
  236. package/models/storage.k8s.io.storageclass.js +33 -18
  237. package/models/workload.js +38 -7
  238. package/nuxt.config.js +27 -17
  239. package/package.json +7 -7
  240. package/pages/about.vue +14 -2
  241. package/pages/c/_cluster/apps/charts/index.vue +4 -3
  242. package/pages/c/_cluster/apps/charts/install.vue +59 -22
  243. package/pages/c/_cluster/auth/config/_id.vue +6 -0
  244. package/pages/c/_cluster/auth/config/index.vue +8 -6
  245. package/pages/c/_cluster/auth/group.principal/assign-edit.vue +1 -1
  246. package/pages/c/_cluster/auth/roles/index.vue +1 -1
  247. package/pages/c/_cluster/explorer/index.vue +12 -6
  248. package/pages/c/_cluster/longhorn/index.vue +1 -1
  249. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +15 -4
  250. package/pages/c/_cluster/monitoring/index.vue +1 -1
  251. package/pages/c/_cluster/neuvector/index.vue +1 -1
  252. package/pages/c/_cluster/settings/performance.vue +48 -2
  253. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +34 -1
  254. package/pages/c/_cluster/uiplugins/index.vue +28 -2
  255. package/pages/diagnostic.vue +5 -4
  256. package/pages/home.vue +105 -30
  257. package/pages/prefs.vue +23 -12
  258. package/pages/rio/mesh.vue +1 -1
  259. package/pkg/dynamic-importer.lib.js +8 -0
  260. package/pkg/vue.config.js +4 -0
  261. package/plugins/dashboard-store/__tests__/mutations.spec.js +406 -0
  262. package/plugins/dashboard-store/actions.js +32 -25
  263. package/plugins/dashboard-store/getters.js +50 -33
  264. package/plugins/dashboard-store/mutations.js +134 -28
  265. package/plugins/dashboard-store/resource-class.js +21 -41
  266. package/plugins/steve/actions.js +30 -0
  267. package/plugins/steve/caches/resourceCache.js +60 -0
  268. package/plugins/steve/getters.js +44 -1
  269. package/plugins/steve/mutations.js +97 -36
  270. package/plugins/steve/resourceWatcher.js +277 -0
  271. package/plugins/steve/schema.utils.js +25 -0
  272. package/plugins/steve/subscribe.js +288 -115
  273. package/plugins/steve/worker/index.js +17 -0
  274. package/plugins/steve/worker/web-worker.advanced.js +302 -0
  275. package/plugins/steve/{web-worker.steve-sub-worker.js → worker/web-worker.basic.js} +3 -44
  276. package/rancher-components/Card/Card.vue +3 -3
  277. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +1 -0
  278. package/rancher-components/StringList/StringList.test.ts +45 -420
  279. package/rancher-components/StringList/StringList.vue +1 -10
  280. package/rancher-components/components/Banner/Banner.test.ts +44 -0
  281. package/rancher-components/components/Banner/Banner.vue +129 -61
  282. package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +13 -22
  283. package/rancher-components/components/Form/Checkbox/Checkbox.vue +8 -6
  284. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +9 -9
  285. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +0 -1
  286. package/rancher-components/components/StringList/StringList.test.ts +7 -7
  287. package/rancher-components/components/StringList/StringList.vue +21 -15
  288. package/scripts/test-plugins-build.sh +8 -0
  289. package/static/loading-indicator.html +1 -1
  290. package/store/index.js +54 -3
  291. package/store/plugins.js +0 -17
  292. package/store/pnap.js +128 -0
  293. package/store/prefs.js +4 -2
  294. package/store/type-map.js +55 -13
  295. package/types/pod-security-admission.ts +36 -0
  296. package/types/shell/index.d.ts +496 -396
  297. package/utils/__tests__/object.test.ts +17 -1
  298. package/utils/__tests__/pod-security-admission.test.ts +61 -0
  299. package/utils/async.ts +36 -0
  300. package/utils/color.js +45 -0
  301. package/utils/crypto/browserHashUtils.js +18 -0
  302. package/utils/dynamic-importer.js +8 -0
  303. package/utils/install-redirect.js +1 -1
  304. package/utils/object.js +24 -0
  305. package/utils/pod-security-admission.ts +39 -0
  306. package/utils/socket.js +61 -24
  307. package/utils/string.js +2 -0
  308. package/utils/svg-filter.js +301 -0
  309. package/utils/time.js +49 -0
  310. package/utils/validators/cidr.js +4 -0
  311. package/utils/validators/formRules/__tests__/index.test.ts +23 -3
  312. package/utils/validators/formRules/index.ts +14 -0
  313. package/config/product/harvester-manager.js +0 -162
  314. package/edit/harvesterhci.io.management.cluster.vue +0 -153
  315. package/list/harvesterhci.io.management.cluster.vue +0 -241
  316. package/machine-config/harvester.vue +0 -693
  317. package/models/harvesterhci.io.management.cluster.js +0 -228
  318. package/pages/c/_cluster/harvesterManager/index.vue +0 -24
  319. package/rancher-components/Card/Card.test.ts +0 -39
  320. package/rancher-components/Utils/DraggableZone/DraggableZone.vue +0 -181
  321. package/rancher-components/Utils/DraggableZone/index.ts +0 -1
  322. 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
- <slot>
66
- <t
67
- v-if="labelKey"
68
- :k="labelKey"
69
- :raw="true"
70
- />
71
- <span v-else-if="messageLabel">{{ messageLabel }}</span>
72
- <span
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
- </slot>
79
+ </div>
77
80
  <div
78
- v-if="closable"
79
- class="closer"
80
- @click="$emit('close')"
81
+ class="banner__content"
82
+ data-testid="banner-content"
83
+ :class="{
84
+ closable,
85
+ stacked,
86
+ icon
87
+ }"
81
88
  >
82
- <i class="icon icon-2x icon-close closer-icon" />
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
- $left-border-size: 4px;
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
- .banner {
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: 40px;
211
+ padding-right: $icon-size * 2;
112
212
  }
113
213
 
114
- .closer {
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: 40px;
124
- line-height: 42px;
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
- &.primary {
139
- background: var(--primary);
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
- (wrapper.vm as any).clicked(event);
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
- (wrapper.vm as any).clicked(event);
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
- (wrapper.vm as any).clicked(event);
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
- if (this.isMulti(this.value)) {
166
+ const value = cloneDeep(this.value);
167
+
168
+ if (this.isMulti(value)) {
166
169
  if (this.isChecked) {
167
- removeObject(this.value, this.valueWhenTrue);
170
+ removeObject(value, this.valueWhenTrue);
168
171
  } else {
169
- addObject(this.value, this.valueWhenTrue);
172
+ addObject(value, this.valueWhenTrue);
170
173
  }
171
- this.$emit('input', this.value);
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', !this.value);
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
- (wrapper.vm as any).toggle(true);
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
- (wrapper.vm as any).toggle(false);
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
- (wrapper.vm as any).toggle(true);
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
- (wrapper.vm as any).toggle(false);
87
+ wrapper.vm.toggle(false);
88
88
 
89
89
  await wrapper.vm.$nextTick();
90
90
 
@@ -84,7 +84,6 @@ export default Vue.extend({
84
84
  position: absolute;
85
85
  right: 30px;
86
86
  top: $input-padding-lg;
87
- font-size: 20px;
88
87
  z-index: z-index(hoverOverContent);
89
88
  }
90
89
 
@@ -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<Vue>;
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') as any)[0][0][0];
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') as any)[0][0].length;
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') as any)[0][0][0];
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') as any)[0][0][0];
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') as any)[0][0].duplicate;
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') as any)[0][0].duplicate;
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
- const index = findStringIndex(this.items, this.selected, false);
198
+ this.deleteAndSelectNext(this.selected);
199
+ }
200
+ },
198
201
 
199
- if (index !== -1) {
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
- this.onSelect(item);
206
- this.setFocus(item);
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
- this.deleteItem(this.items[index]);
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 (Array.isArray(ref) ? ref[0] : ref) as any;
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
@@ -13,7 +13,7 @@
13
13
 
14
14
  .initial-load-spinner {
15
15
  animation: initial-load-animate 1s infinite linear;
16
- background-color: #fff;
16
+ background-color: transparent;
17
17
  box-sizing: border-box;
18
18
  border: 5px solid #008ACF;
19
19
  border-radius: 50%;