@rancher/shell 0.3.0 → 0.3.2

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 (342) 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/_gauges.scss +1 -1
  4. package/assets/styles/global/_layout.scss +5 -2
  5. package/assets/styles/global/_select.scss +1 -4
  6. package/assets/styles/themes/_dark.scss +5 -4
  7. package/assets/styles/themes/_light.scss +4 -3
  8. package/assets/styles/themes/_suse.scss +1 -1
  9. package/assets/styles/vendor/vue-select.scss +4 -3
  10. package/assets/translations/en-us.yaml +673 -73
  11. package/assets/translations/zh-hans.yaml +720 -207
  12. package/chart/monitoring/steps/uninstall-v1.vue +2 -2
  13. package/cloud-credential/azure.vue +23 -0
  14. package/cloud-credential/harvester.vue +25 -62
  15. package/cloud-credential/pnap.vue +80 -0
  16. package/components/.DS_Store +0 -0
  17. package/components/ActionMenu.vue +28 -7
  18. package/components/AdvancedSection.vue +9 -2
  19. package/components/Alert.vue +2 -2
  20. package/components/ButtonDropdown.vue +0 -2
  21. package/components/ButtonGroup.vue +1 -0
  22. package/components/CollapsibleCard.vue +0 -1
  23. package/components/CruResource.vue +41 -4
  24. package/components/DetailTop.vue +72 -4
  25. package/components/DisableAuthProviderModal.vue +106 -0
  26. package/{rancher-components/components/Utils/DraggableZone → components}/DraggableZone.vue +0 -0
  27. package/components/ExplorerMembers.vue +253 -30
  28. package/components/ExplorerProjectsNamespaces.vue +77 -33
  29. package/components/ExtensionPanel.vue +42 -0
  30. package/components/GrowlManager.vue +3 -3
  31. package/components/IconOrSvg.vue +178 -0
  32. package/components/LogItem.vue +69 -0
  33. package/components/PodSecurityAdmission.vue +302 -0
  34. package/components/PromptModal.vue +1 -0
  35. package/components/ResourceDetail/Masthead.vue +69 -4
  36. package/components/ResourceDetail/index.vue +12 -5
  37. package/components/ResourceList/Masthead.vue +11 -1
  38. package/components/ResourceList/ResourceLoadingIndicator.vue +12 -2
  39. package/components/ResourceList/index.vue +66 -12
  40. package/components/ResourceList/resource-list.config.js +7 -0
  41. package/components/ResourceTable.vue +33 -6
  42. package/components/SimpleBox.vue +1 -1
  43. package/components/SortableTable/THead.vue +21 -14
  44. package/components/SortableTable/filtering.js +1 -1
  45. package/components/SortableTable/index.vue +21 -10
  46. package/components/SortableTable/selection.js +15 -3
  47. package/components/Tabbed/Tab.vue +1 -1
  48. package/components/Tabbed/index.vue +20 -15
  49. package/components/__tests__/.DS_Store +0 -0
  50. package/components/__tests__/AsyncButton.test.ts +140 -0
  51. package/components/__tests__/BackLink.test.ts +33 -0
  52. package/components/__tests__/ButtonGroup.test.ts +124 -0
  53. package/components/__tests__/ClusterBadge.test.ts +32 -0
  54. package/components/__tests__/CollapsibleCard.test.ts +64 -0
  55. package/components/__tests__/ConsumptionGauge.test.ts +88 -0
  56. package/components/__tests__/CruResource.test.ts +3 -2
  57. package/components/__tests__/FixedBanner.test.ts +129 -0
  58. package/components/__tests__/GrowlManager.test.ts +147 -0
  59. package/components/__tests__/NamespaceFilter.test.ts +33 -25
  60. package/components/__tests__/PercentageBar.test.ts +32 -0
  61. package/components/__tests__/PodSecurityAdmission.test.ts +398 -0
  62. package/components/auth/AuthBanner.vue +20 -10
  63. package/components/auth/RoleDetailEdit.vue +26 -17
  64. package/components/auth/SelectPrincipal.vue +36 -5
  65. package/components/form/ArrayList.vue +3 -35
  66. package/components/form/ArrayListGrouped.vue +13 -4
  67. package/components/form/ArrayListSelect.vue +5 -5
  68. package/components/form/Error.vue +8 -0
  69. package/components/form/KeyValue.vue +39 -7
  70. package/components/form/LabeledSelect.vue +5 -2
  71. package/components/form/Labels.vue +46 -16
  72. package/components/form/Members/ClusterPermissionsEditor.vue +17 -17
  73. package/components/form/Members/MembershipEditor.vue +12 -12
  74. package/components/form/NameNsDescription.vue +1 -1
  75. package/components/form/NodeScheduling.vue +1 -1
  76. package/components/form/Probe.vue +3 -3
  77. package/components/form/ResourceQuota/Project.vue +6 -6
  78. package/components/form/ResourceTabs/index.vue +24 -6
  79. package/components/form/Security.vue +7 -6
  80. package/components/form/Select.vue +3 -2
  81. package/components/form/SelectOrCreateAuthSecret.vue +22 -29
  82. package/components/form/ServicePorts.vue +8 -0
  83. package/components/form/WorkloadPorts.vue +7 -1
  84. package/components/form/__tests__/ArrayList.test.ts +74 -0
  85. package/components/form/__tests__/ArrayListGrouped.test.ts +6 -4
  86. package/components/formatter/Checked.vue +1 -1
  87. package/components/formatter/ClusterLink.vue +5 -0
  88. package/components/formatter/IconIsDefault.vue +2 -2
  89. package/components/formatter/InternalExternalIP.vue +11 -8
  90. package/components/formatter/LiveDuration.vue +78 -0
  91. package/components/formatter/WorkloadHealthScale.vue +5 -3
  92. package/components/nav/Header.vue +74 -7
  93. package/components/nav/NamespaceFilter.vue +146 -63
  94. package/components/nav/TopLevelMenu.vue +22 -19
  95. package/components/nav/WindowManager/ContainerLogs.vue +83 -126
  96. package/components/nav/WindowManager/ContainerShell.vue +9 -7
  97. package/components/nav/WindowManager/Window.vue +2 -0
  98. package/components/nav/WindowManager/index.vue +10 -0
  99. package/config/elemental-types.js +9 -0
  100. package/config/features.js +2 -0
  101. package/config/home-links.js +4 -1
  102. package/config/pod-security-admission.ts +82 -0
  103. package/config/product/apps.js +1 -1
  104. package/config/product/auth.js +6 -5
  105. package/config/product/backup.js +1 -1
  106. package/config/product/explorer.js +6 -6
  107. package/config/product/fleet.js +1 -1
  108. package/config/product/manager.js +6 -2
  109. package/config/query-params.js +1 -0
  110. package/config/secret.js +0 -1
  111. package/config/settings.ts +26 -9
  112. package/config/table-headers.js +22 -11
  113. package/config/types.js +4 -1
  114. package/config/uiplugins.js +3 -3
  115. package/content/docs/zh-hans/getting-started.md +113 -137
  116. package/content/docs/zh-hans/whats-new.md +8 -46
  117. package/core/plugin-helpers.js +171 -0
  118. package/core/plugin.ts +61 -1
  119. package/core/plugins.js +33 -0
  120. package/core/types.ts +128 -2
  121. package/creators/pkg/package-lock.json +37 -0
  122. package/creators/pkg/package.json +1 -1
  123. package/detail/catalog.cattle.io.app.vue +1 -1
  124. package/detail/pod.vue +1 -1
  125. package/detail/provisioning.cattle.io.cluster.vue +35 -9
  126. package/detail/service.vue +2 -9
  127. package/detail/workload/index.vue +0 -1
  128. package/dialog/AddClusterMemberDialog.vue +22 -28
  129. package/dialog/AddProjectMemberDialog.vue +53 -9
  130. package/dialog/DiagnosticTimingsDialog.vue +8 -7
  131. package/dialog/DrainNode.vue +44 -48
  132. package/dialog/ForceMachineRemoveDialog.vue +5 -7
  133. package/dialog/GenericPrompt.vue +15 -20
  134. package/dialog/RollbackWorkloadDialog.vue +15 -46
  135. package/dialog/RotateCertificatesDialog.vue +5 -7
  136. package/dialog/RotateEncryptionKeyDialog.vue +5 -9
  137. package/dialog/SaveAsRKETemplateDialog.vue +5 -13
  138. package/dialog/ScaleMachineDownDialog.vue +1 -1
  139. package/dialog/ScalePoolDownDialog.vue +121 -0
  140. package/edit/__tests__/management.cattle.io.setting.test.ts +3 -3
  141. package/edit/auth/azuread.vue +16 -16
  142. package/edit/auth/github.vue +8 -0
  143. package/edit/auth/googleoauth.vue +10 -1
  144. package/edit/auth/ldap/index.vue +10 -0
  145. package/edit/auth/oidc.vue +10 -0
  146. package/edit/auth/saml.vue +10 -0
  147. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -1
  148. package/edit/catalog.cattle.io.clusterrepo.vue +3 -0
  149. package/edit/cloudcredential.vue +3 -7
  150. package/edit/logging-flow/Match.vue +39 -8
  151. package/edit/logging-flow/index.vue +27 -4
  152. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +107 -0
  153. package/edit/management.cattle.io.project.vue +8 -1
  154. package/edit/management.cattle.io.setting.vue +5 -2
  155. package/edit/management.cattle.io.user.vue +7 -1
  156. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +36 -8
  157. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +2 -2
  158. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +14 -6
  159. package/edit/namespace.vue +18 -4
  160. package/edit/networking.k8s.io.ingress/Certificate.vue +1 -0
  161. package/edit/networking.k8s.io.ingress/IngressClass.vue +8 -6
  162. package/edit/networking.k8s.io.ingress/RulePath.vue +12 -6
  163. package/edit/networking.k8s.io.ingress/index.vue +8 -6
  164. package/edit/persistentvolume/index.vue +30 -27
  165. package/edit/persistentvolume/plugins/cephfs.vue +29 -29
  166. package/edit/persistentvolume/plugins/csi.vue +102 -62
  167. package/edit/persistentvolume/plugins/fc.vue +19 -19
  168. package/edit/persistentvolume/plugins/iscsi.vue +45 -45
  169. package/edit/persistentvolume/plugins/rbd.vue +39 -39
  170. package/edit/persistentvolumeclaim.vue +78 -75
  171. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +11 -7
  172. package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +10 -1
  173. package/edit/provisioning.cattle.io.cluster/RegistryMirrors.vue +87 -27
  174. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +3 -6
  175. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +96 -0
  176. package/edit/provisioning.cattle.io.cluster/import.vue +1 -1
  177. package/edit/provisioning.cattle.io.cluster/index.vue +29 -6
  178. package/edit/provisioning.cattle.io.cluster/rke2.vue +445 -154
  179. package/edit/secret/index.vue +3 -7
  180. package/edit/service.vue +3 -1
  181. package/edit/storage.k8s.io.storageclass/index.vue +100 -16
  182. package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +114 -0
  183. package/edit/workload/__tests__/index.test.ts +98 -0
  184. package/edit/workload/index.vue +58 -8
  185. package/edit/workload/mixins/workload.js +107 -70
  186. package/edit/workload/storage/ContainerMountPaths.vue +0 -10
  187. package/edit/workload/storage/emptyDir.vue +88 -0
  188. package/edit/workload/storage/ephemeralVolume/index.vue +1 -1
  189. package/edit/workload/storage/index.vue +8 -0
  190. package/edit/workload/storage/persistentVolumeClaim/index.vue +1 -1
  191. package/layouts/default.vue +57 -44
  192. package/list/__tests__/workload.test.ts +5 -2
  193. package/list/catalog.cattle.io.app.vue +1 -0
  194. package/list/cis.cattle.io.clusterscan.vue +1 -0
  195. package/list/fleet.cattle.io.bundle.vue +5 -6
  196. package/list/fleet.cattle.io.cluster.vue +6 -3
  197. package/list/fleet.cattle.io.clusterregistrationtoken.vue +5 -6
  198. package/list/fleet.cattle.io.gitrepo.vue +4 -9
  199. package/list/helm.cattle.io.projecthelmchart.vue +1 -5
  200. package/list/logging.banzaicloud.io.clusterflow.vue +4 -1
  201. package/list/logging.banzaicloud.io.flow.vue +6 -5
  202. package/list/management.cattle.io.cluster.vue +1 -0
  203. package/list/management.cattle.io.feature.vue +3 -4
  204. package/list/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +47 -0
  205. package/list/management.cattle.io.setting.vue +2 -2
  206. package/list/management.cattle.io.user.vue +4 -10
  207. package/list/monitoring.coreos.com.alertmanagerconfig.vue +2 -7
  208. package/list/node.vue +8 -5
  209. package/list/persistentvolume.vue +3 -3
  210. package/list/persistentvolumeclaim.vue +3 -4
  211. package/list/provisioning.cattle.io.cluster.vue +18 -19
  212. package/list/service.vue +6 -14
  213. package/list/workload.vue +43 -38
  214. package/machine-config/azure.vue +429 -60
  215. package/machine-config/pnap.vue +288 -0
  216. package/mixins/auth-config.js +1 -3
  217. package/mixins/browser-tab-visibility.js +8 -14
  218. package/mixins/chart.js +1 -1
  219. package/mixins/create-edit-view/impl.js +4 -0
  220. package/mixins/create-edit-view/index.js +4 -2
  221. package/mixins/resource-fetch-namespaced.js +98 -0
  222. package/mixins/resource-fetch.js +79 -45
  223. package/mixins/resource-manager.js +1 -23
  224. package/models/apps.controllerrevision.js +7 -0
  225. package/models/apps.daemonset.js +18 -0
  226. package/models/apps.deployment.js +44 -0
  227. package/models/apps.replicaset.js +7 -0
  228. package/models/apps.statefulset.js +18 -0
  229. package/models/batch.job.js +7 -14
  230. package/models/cluster/node.js +10 -2
  231. package/models/cluster.x-k8s.io.machine.js +26 -4
  232. package/models/cluster.x-k8s.io.machinedeployment.js +12 -2
  233. package/models/event.js +7 -0
  234. package/models/logging.banzaicloud.io.flow.js +4 -0
  235. package/models/management.cattle.io.cluster.js +1 -1
  236. package/models/management.cattle.io.clusterroletemplatebinding.js +1 -1
  237. package/models/management.cattle.io.globalrole.js +2 -2
  238. package/models/management.cattle.io.node.js +37 -2
  239. package/models/management.cattle.io.podsecurityadmissionconfigurationtemplate.ts +4 -0
  240. package/models/management.cattle.io.project.js +30 -11
  241. package/models/management.cattle.io.setting.js +1 -1
  242. package/models/management.cattle.io.user.js +37 -1
  243. package/models/namespace.js +42 -5
  244. package/models/persistentvolume.js +14 -2
  245. package/models/pod.js +15 -0
  246. package/models/projectroletemplatebinding.js +7 -0
  247. package/models/provisioning.cattle.io.cluster.js +61 -10
  248. package/models/rke-machine.cattle.io.pnapmachinetemplate.js +15 -0
  249. package/models/service.js +14 -13
  250. package/models/storage.k8s.io.storageclass.js +33 -18
  251. package/models/workload.js +38 -7
  252. package/nuxt.config.js +27 -17
  253. package/package.json +7 -7
  254. package/pages/about.vue +14 -2
  255. package/pages/c/_cluster/apps/charts/index.vue +21 -3
  256. package/pages/c/_cluster/apps/charts/install.vue +59 -22
  257. package/pages/c/_cluster/auth/config/_id.vue +6 -0
  258. package/pages/c/_cluster/auth/config/index.vue +8 -6
  259. package/pages/c/_cluster/auth/group.principal/assign-edit.vue +1 -1
  260. package/pages/c/_cluster/auth/roles/index.vue +1 -1
  261. package/pages/c/_cluster/explorer/index.vue +51 -6
  262. package/pages/c/_cluster/longhorn/index.vue +1 -1
  263. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +15 -4
  264. package/pages/c/_cluster/monitoring/index.vue +1 -1
  265. package/pages/c/_cluster/neuvector/index.vue +1 -1
  266. package/pages/c/_cluster/settings/performance.vue +48 -2
  267. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +2 -0
  268. package/pages/c/_cluster/uiplugins/InstallDialog.vue +3 -0
  269. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +42 -2
  270. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +2 -0
  271. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +1 -0
  272. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +2 -0
  273. package/pages/c/_cluster/uiplugins/index.vue +42 -3
  274. package/pages/diagnostic.vue +5 -4
  275. package/pages/home.vue +105 -30
  276. package/pages/prefs.vue +23 -12
  277. package/pages/rio/mesh.vue +1 -1
  278. package/pkg/dynamic-importer.lib.js +8 -0
  279. package/pkg/vue.config.js +4 -0
  280. package/plugins/dashboard-store/__tests__/mutations.spec.js +406 -0
  281. package/plugins/dashboard-store/actions.js +32 -25
  282. package/plugins/dashboard-store/getters.js +50 -33
  283. package/plugins/dashboard-store/mutations.js +134 -28
  284. package/plugins/dashboard-store/resource-class.js +37 -42
  285. package/plugins/steve/actions.js +30 -0
  286. package/plugins/steve/caches/resourceCache.js +60 -0
  287. package/plugins/steve/getters.js +44 -1
  288. package/plugins/steve/mutations.js +97 -36
  289. package/plugins/steve/resourceWatcher.js +277 -0
  290. package/plugins/steve/schema.utils.js +25 -0
  291. package/plugins/steve/subscribe.js +288 -115
  292. package/plugins/steve/worker/index.js +17 -0
  293. package/plugins/steve/worker/web-worker.advanced.js +302 -0
  294. package/plugins/steve/{web-worker.steve-sub-worker.js → worker/web-worker.basic.js} +3 -44
  295. package/rancher-components/Card/Card.vue +3 -3
  296. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +1 -0
  297. package/rancher-components/StringList/StringList.test.ts +45 -420
  298. package/rancher-components/StringList/StringList.vue +1 -10
  299. package/rancher-components/components/Banner/Banner.test.ts +44 -0
  300. package/rancher-components/components/Banner/Banner.vue +130 -61
  301. package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +13 -22
  302. package/rancher-components/components/Form/Checkbox/Checkbox.vue +8 -6
  303. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +9 -9
  304. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +0 -1
  305. package/rancher-components/components/StringList/StringList.test.ts +7 -7
  306. package/rancher-components/components/StringList/StringList.vue +21 -15
  307. package/scripts/test-plugins-build.sh +8 -0
  308. package/static/loading-indicator.html +1 -1
  309. package/store/action-menu.js +4 -3
  310. package/store/index.js +54 -3
  311. package/store/plugins.js +0 -17
  312. package/store/pnap.js +128 -0
  313. package/store/prefs.js +4 -2
  314. package/store/type-map.js +81 -13
  315. package/types/pod-security-admission.ts +36 -0
  316. package/types/shell/index.d.ts +497 -396
  317. package/utils/__tests__/object.test.ts +17 -1
  318. package/utils/__tests__/pod-security-admission.test.ts +61 -0
  319. package/utils/async.ts +36 -0
  320. package/utils/color.js +45 -0
  321. package/utils/crypto/browserHashUtils.js +18 -0
  322. package/utils/dynamic-importer.js +8 -0
  323. package/utils/install-redirect.js +1 -1
  324. package/utils/object.js +24 -0
  325. package/utils/pod-security-admission.ts +39 -0
  326. package/utils/socket.js +61 -24
  327. package/utils/string.js +2 -0
  328. package/utils/svg-filter.js +301 -0
  329. package/utils/time.js +49 -0
  330. package/utils/validators/cidr.js +4 -0
  331. package/utils/validators/formRules/__tests__/index.test.ts +23 -3
  332. package/utils/validators/formRules/index.ts +14 -0
  333. package/config/product/harvester-manager.js +0 -162
  334. package/edit/harvesterhci.io.management.cluster.vue +0 -153
  335. package/list/harvesterhci.io.management.cluster.vue +0 -241
  336. package/machine-config/harvester.vue +0 -693
  337. package/models/harvesterhci.io.management.cluster.js +0 -228
  338. package/pages/c/_cluster/harvesterManager/index.vue +0 -24
  339. package/rancher-components/Card/Card.test.ts +0 -39
  340. package/rancher-components/Utils/DraggableZone/DraggableZone.vue +0 -181
  341. package/rancher-components/Utils/DraggableZone/index.ts +0 -1
  342. package/rancher-components/components/Utils/DraggableZone/index.ts +0 -1
@@ -5,13 +5,11 @@ import { removeAt } from '@shell/utils/array';
5
5
  import { TextAreaAutoGrow } from '@components/Form/TextArea';
6
6
  import { clone } from '@shell/utils/object';
7
7
  import { LabeledInput } from '@components/Form/LabeledInput';
8
-
9
8
  const DEFAULT_PROTIP = 'Tip: Paste lines into any list field for easy bulk entry';
10
9
 
11
10
  export default {
12
11
  components: { TextAreaAutoGrow, LabeledInput },
13
-
14
- props: {
12
+ props: {
15
13
  value: {
16
14
  type: Array,
17
15
  default: null,
@@ -24,7 +22,6 @@ export default {
24
22
  type: Boolean,
25
23
  default: false,
26
24
  },
27
-
28
25
  title: {
29
26
  type: String,
30
27
  default: ''
@@ -37,7 +34,6 @@ export default {
37
34
  type: Boolean,
38
35
  default: false,
39
36
  },
40
-
41
37
  valueLabel: {
42
38
  type: String,
43
39
  default: 'Value',
@@ -50,7 +46,6 @@ export default {
50
46
  type: Boolean,
51
47
  default: false,
52
48
  },
53
-
54
49
  addLabel: {
55
50
  type: String,
56
51
  default() {
@@ -61,7 +56,6 @@ export default {
61
56
  type: Boolean,
62
57
  default: true,
63
58
  },
64
-
65
59
  removeLabel: {
66
60
  type: String,
67
61
  default() {
@@ -72,22 +66,18 @@ export default {
72
66
  type: Boolean,
73
67
  default: true,
74
68
  },
75
-
76
69
  defaultAddValue: {
77
70
  type: [String, Number, Object, Array],
78
71
  default: ''
79
72
  },
80
-
81
73
  loading: {
82
74
  type: Boolean,
83
75
  default: false
84
76
  },
85
-
86
77
  disabled: {
87
78
  type: Boolean,
88
79
  default: false,
89
80
  },
90
-
91
81
  rules: {
92
82
  default: () => [],
93
83
  type: Array,
@@ -95,7 +85,6 @@ export default {
95
85
  validator: rules => rules.every(rule => ['function'].includes(typeof rule))
96
86
  }
97
87
  },
98
-
99
88
  data() {
100
89
  const input = (this.value || []).slice();
101
90
  const rows = [];
@@ -103,7 +92,6 @@ export default {
103
92
  for ( const value of input ) {
104
93
  rows.push({ value });
105
94
  }
106
-
107
95
  if ( !rows.length && this.initialEmptyRow ) {
108
96
  const value = this.defaultAddValue ? clone(this.defaultAddValue) : '';
109
97
 
@@ -112,24 +100,19 @@ export default {
112
100
 
113
101
  return { rows, lastUpdateWasFromValue: false };
114
102
  },
115
-
116
103
  computed: {
117
104
  isView() {
118
105
  return this.mode === _VIEW;
119
106
  },
120
-
121
107
  showAdd() {
122
108
  return this.addAllowed;
123
109
  },
124
-
125
110
  showRemove() {
126
111
  return this.removeAllowed;
127
112
  },
128
-
129
113
  isDefaultProtip() {
130
114
  return this.protip === DEFAULT_PROTIP;
131
115
  },
132
-
133
116
  showProtip() {
134
117
  if (this.protip && !this.isDefaultProtip) {
135
118
  return true;
@@ -138,7 +121,6 @@ export default {
138
121
  return !this.valueMultiline && this.protip;
139
122
  }
140
123
  },
141
-
142
124
  watch: {
143
125
  value() {
144
126
  this.lastUpdateWasFromValue = true;
@@ -156,29 +138,24 @@ export default {
156
138
  }
157
139
  }
158
140
  },
159
-
160
141
  created() {
161
142
  this.queueUpdate = debounce(this.update, 50);
162
143
  },
163
-
164
144
  methods: {
165
145
  add() {
166
146
  this.rows.push({ value: clone(this.defaultAddValue) });
167
147
  if (this.defaultAddValue) {
168
148
  this.queueUpdate();
169
149
  }
170
-
171
150
  this.$nextTick(() => {
172
151
  const inputs = this.$refs.value;
173
152
 
174
153
  if ( inputs && inputs.length > 0 ) {
175
154
  inputs[inputs.length - 1].focus();
176
155
  }
177
-
178
156
  this.$emit('add');
179
157
  });
180
158
  },
181
-
182
159
  /**
183
160
  * Remove item and emits removed row and its own index value
184
161
  */
@@ -187,12 +164,10 @@ export default {
187
164
  removeAt(this.rows, index);
188
165
  this.queueUpdate();
189
166
  },
190
-
191
167
  update() {
192
168
  if ( this.isView ) {
193
169
  return;
194
170
  }
195
-
196
171
  const out = [];
197
172
 
198
173
  for ( const row of this.rows ) {
@@ -203,15 +178,12 @@ export default {
203
178
  out.push(value);
204
179
  }
205
180
  }
206
-
207
181
  this.$emit('input', out);
208
182
  },
209
-
210
183
  onPaste(index, event) {
211
184
  if (this.valueMultiline) {
212
185
  return;
213
186
  }
214
-
215
187
  event.preventDefault();
216
188
  const text = event.clipboardData.getData('text/plain');
217
189
  const split = text.split('\n').map(value => ({ value }));
@@ -252,6 +224,7 @@ export default {
252
224
  <div
253
225
  v-for="(row, idx) in rows"
254
226
  :key="idx"
227
+ data-testid="array-list-box"
255
228
  class="box"
256
229
  >
257
230
  <slot
@@ -349,7 +322,7 @@ export default {
349
322
  type="button"
350
323
  class="btn role-tertiary add"
351
324
  :disabled="loading"
352
- data-testid="add-item"
325
+ data-testid="array-list-button"
353
326
  @click="add()"
354
327
  >
355
328
  <i
@@ -366,14 +339,11 @@ export default {
366
339
  <style lang="scss" scoped>
367
340
  .title {
368
341
  margin-bottom: 10px;
369
-
370
342
  }
371
-
372
343
  .box {
373
344
  display: grid;
374
345
  grid-template-columns: auto $array-list-remove-margin;
375
346
  align-items: center;
376
-
377
347
  margin-bottom: 10px;
378
348
  .value {
379
349
  flex: 1;
@@ -382,11 +352,9 @@ export default {
382
352
  }
383
353
  }
384
354
  }
385
-
386
355
  .remove {
387
356
  text-align: right;
388
357
  }
389
-
390
358
  .footer {
391
359
  .protip {
392
360
  float: right;
@@ -4,6 +4,7 @@ import InfoBox from '@shell/components/InfoBox';
4
4
  import { _EDIT, _VIEW } from '@shell/config/query-params';
5
5
 
6
6
  export default {
7
+ name: 'ArrayListGrouped',
7
8
  components: { ArrayList, InfoBox },
8
9
  props: {
9
10
  /**
@@ -21,6 +22,13 @@ export default {
21
22
  type: Boolean,
22
23
  default: true,
23
24
  },
25
+ /**
26
+ * Start with empty row
27
+ */
28
+ initialEmptyRow: {
29
+ type: Boolean,
30
+ default: false,
31
+ },
24
32
 
25
33
  /**
26
34
  * Form mode for the component
@@ -51,7 +59,7 @@ export default {
51
59
  }
52
60
 
53
61
  return this.canRemove;
54
- }
62
+ },
55
63
  }
56
64
  };
57
65
  </script>
@@ -62,6 +70,7 @@ export default {
62
70
  v-bind="$attrs"
63
71
  :add-allowed="canAdd && !isView"
64
72
  :mode="mode"
73
+ :initial-empty-row="initialEmptyRow"
65
74
  @input="$emit('input', $event)"
66
75
  @add="$emit('add')"
67
76
  @remove="$emit('remove', $event)"
@@ -79,7 +88,7 @@ export default {
79
88
  :data-testid="`remove-item-${scope.i}`"
80
89
  @click="scope.remove"
81
90
  >
82
- <i class="icon icon-2x icon-x" />
91
+ <i class="icon icon-x" />
83
92
  </button>
84
93
  <span v-else />
85
94
  </template>
@@ -105,15 +114,15 @@ export default {
105
114
  & > .remove {
106
115
  position: absolute;
107
116
 
108
- padding: 0px;
109
-
110
117
  top: 0;
111
118
  right: 0;
112
119
  }
113
120
 
114
121
  & > .info-box {
115
122
  margin-bottom: 0;
123
+ padding-right: 25px;
116
124
  }
117
125
  }
118
126
  }
127
+
119
128
  </style>
@@ -65,11 +65,11 @@ export default {
65
65
  @input="$emit('input', $event)"
66
66
  >
67
67
  <template v-slot:columns="scope">
68
- <Select
69
- :value="scope.row.value"
70
- v-bind="selectProps"
71
- :options="calculateOptions(scope.row.value)"
72
- @input="updateRow(scope.i, $event)"
68
+ <Select
69
+ :value="scope.row.value"
70
+ v-bind="selectProps"
71
+ :options="calculateOptions(scope.row.value)"
72
+ @input="updateRow(scope.i, $event)"
73
73
  />
74
74
  </template>
75
75
  </ArrayList>
@@ -15,6 +15,13 @@ export default Vue.extend<any, any, any, any>({
15
15
  default: () => [],
16
16
  type: Array as PropType<Rule[]>,
17
17
  },
18
+ /**
19
+ * Add icon for the banner
20
+ */
21
+ icon: {
22
+ type: String,
23
+ default: null
24
+ },
18
25
  asBanner: {
19
26
  default: false,
20
27
  type: Boolean
@@ -49,6 +56,7 @@ export default Vue.extend<any, any, any, any>({
49
56
  v-if="!!asBanner && !!validationMessage"
50
57
  color="error"
51
58
  :label="validationMessage"
59
+ :icon="icon"
52
60
  />
53
61
  <span
54
62
  v-else-if="!!validationMessage"
@@ -96,6 +96,20 @@ export default {
96
96
  return this.$store.getters['i18n/t']('keyValue.keyPlaceholder');
97
97
  },
98
98
  },
99
+ /**
100
+ * List of keys which needs to be disabled and hidden based on toggler
101
+ */
102
+ protectedKeys: {
103
+ type: Array,
104
+ default: () => [],
105
+ },
106
+ /**
107
+ * Conditionally display protected keys, if any
108
+ */
109
+ toggleFilter: {
110
+ type: Boolean,
111
+ default: false,
112
+ },
99
113
  separatorLabel: {
100
114
  type: String,
101
115
  default: '',
@@ -235,7 +249,6 @@ export default {
235
249
  },
236
250
 
237
251
  computed: {
238
-
239
252
  isView() {
240
253
  return this.mode === _VIEW;
241
254
  },
@@ -261,6 +274,12 @@ export default {
261
274
  */
262
275
  canRemove() {
263
276
  return !this.isView && this.removeAllowed;
277
+ },
278
+ /**
279
+ * Filter rows based on toggler, keeping to still emit all the values
280
+ */
281
+ filteredRows() {
282
+ return this.rows.filter(row => !(this.isProtected(row.key) && !this.toggleFilter));
264
283
  }
265
284
  },
266
285
  created() {
@@ -275,6 +294,10 @@ export default {
275
294
  }
276
295
  },
277
296
  methods: {
297
+ isProtected(key) {
298
+ return this.protectedKeys && this.protectedKeys.includes(key);
299
+ },
300
+
278
301
  getRows(value) {
279
302
  const rows = [];
280
303
 
@@ -325,7 +348,7 @@ export default {
325
348
  rows.push(entry);
326
349
  }
327
350
  }
328
- if ( !rows.length && this.initialEmptyRow ) {
351
+ if ( rows && !rows.length && this.initialEmptyRow ) {
329
352
  rows.push({
330
353
  [this.keyName]: '',
331
354
  [this.valueName]: '',
@@ -389,6 +412,10 @@ export default {
389
412
  this.add(key, value);
390
413
  }
391
414
  });
415
+
416
+ if (lines.length > 0) {
417
+ this.removeEmptyRows();
418
+ }
392
419
  }
393
420
  },
394
421
  download(idx, ev) {
@@ -550,9 +577,10 @@ export default {
550
577
  </div>
551
578
  </template>
552
579
  <template
553
- v-for="(row,i) in rows"
580
+ v-for="(row,i) in filteredRows"
554
581
  v-else
555
582
  >
583
+ <!-- Key -->
556
584
  <div
557
585
  :key="i+'key'"
558
586
  class="kv-item key"
@@ -570,6 +598,7 @@ export default {
570
598
  ref="key"
571
599
  v-model="row[keyName]"
572
600
  :searchable="true"
601
+ :disabled="isProtected(row.key)"
573
602
  :clearable="false"
574
603
  :taggable="keyTaggable"
575
604
  :options="calculateOptions(row[keyName])"
@@ -579,13 +608,15 @@ export default {
579
608
  v-else
580
609
  ref="key"
581
610
  v-model="row[keyName]"
582
- :disabled="isView || !keyEditable"
611
+ :disabled="isView || !keyEditable || isProtected(row.key)"
583
612
  :placeholder="keyPlaceholder"
584
613
  @input="queueUpdate"
585
614
  @paste="onPaste(i, $event)"
586
615
  >
587
616
  </slot>
588
617
  </div>
618
+
619
+ <!-- Value -->
589
620
  <div
590
621
  :key="i+'value'"
591
622
  class="kv-item value"
@@ -608,6 +639,7 @@ export default {
608
639
  v-else-if="valueMultiline"
609
640
  v-model="row[valueName]"
610
641
  :class="{'conceal': valueConcealed}"
642
+ :disabled="isProtected(row.key)"
611
643
  :mode="mode"
612
644
  :placeholder="valuePlaceholder"
613
645
  :min-height="40"
@@ -617,7 +649,7 @@ export default {
617
649
  <input
618
650
  v-else
619
651
  v-model="row[valueName]"
620
- :disabled="isView"
652
+ :disabled="isView || isProtected(row.key)"
621
653
  :type="valueConcealed ? 'password' : 'text'"
622
654
  :placeholder="valuePlaceholder"
623
655
  autocorrect="off"
@@ -652,7 +684,7 @@ export default {
652
684
  >
653
685
  <button
654
686
  type="button"
655
- :disabled="isView"
687
+ :disabled="isView || isProtected(row.key)"
656
688
  class="btn role-link"
657
689
  @click="remove(i)"
658
690
  >
@@ -664,7 +696,7 @@ export default {
664
696
  </div>
665
697
  <div
666
698
  v-if="(addAllowed || readAllowed) && !isView"
667
- class="footer"
699
+ class="footer mt-20"
668
700
  >
669
701
  <slot
670
702
  name="add"
@@ -150,6 +150,10 @@ export default {
150
150
  this.resizeHandler();
151
151
  },
152
152
 
153
+ onClose() {
154
+ this.$emit('on-close');
155
+ },
156
+
153
157
  getOptionLabel(option) {
154
158
  if (!option) {
155
159
  return;
@@ -277,6 +281,7 @@ export default {
277
281
  @search:focus="onFocus"
278
282
  @search="onSearch"
279
283
  @open="onOpen"
284
+ @close="onClose"
280
285
  @option:selected="$emit('selecting', $event)"
281
286
  >
282
287
  <template #option="option">
@@ -456,9 +461,7 @@ export default {
456
461
 
457
462
  ::v-deep .vs__actions {
458
463
  &:after {
459
- line-height: 1.85rem;
460
464
  position: relative;
461
- right: 3px;
462
465
  top: -10px;
463
466
  }
464
467
  }
@@ -1,8 +1,12 @@
1
1
  <script>
2
2
  import KeyValue from '@shell/components/form/KeyValue';
3
+ import { ToggleSwitch } from '@components/Form/ToggleSwitch';
3
4
 
4
5
  export default {
5
- components: { KeyValue },
6
+ components: {
7
+ ToggleSwitch,
8
+ KeyValue
9
+ },
6
10
 
7
11
  props: {
8
12
  value: {
@@ -41,6 +45,10 @@ export default {
41
45
  }
42
46
  },
43
47
 
48
+ data() {
49
+ return { toggler: false };
50
+ },
51
+
44
52
  computed: {
45
53
  containerClass() {
46
54
  return `${ this.displaySideBySide ? 'row' : '' } ${ this.defaultContainerClass }`.trim();
@@ -48,24 +56,41 @@ export default {
48
56
 
49
57
  sectionClass() {
50
58
  return `${ this.displaySideBySide ? 'col span-6' : 'row' } ${ this.defaultSectionClass }`.trim();
51
- }
59
+ },
60
+
52
61
  }
53
62
  };
54
63
  </script>
55
64
  <template>
56
65
  <div :class="containerClass">
57
- <div :class="sectionClass">
58
- <KeyValue
59
- key="labels"
60
- :value="value.labels"
61
- :add-label="t('labels.addLabel')"
62
- :mode="mode"
63
- :title="t('labels.labels.title')"
64
- :title-protip="labelTitleTooltip"
65
- :read-allowed="false"
66
- :value-can-be-empty="true"
67
- @input="value.setLabels($event)"
68
- />
66
+ <div class="labels">
67
+ <div class="labels__header">
68
+ <h3>
69
+ <t k="labels.labels.title" />
70
+ </h3>
71
+ <ToggleSwitch
72
+ v-if="value.hasSystemLabels"
73
+ v-model="toggler"
74
+ name="label-system-toggle"
75
+ :on-label="t('labels.labels.show')"
76
+ />
77
+ </div>
78
+ <p class="mt-10 mb-10">
79
+ <t k="labels.labels.description" />
80
+ </p>
81
+ <div :class="sectionClass">
82
+ <KeyValue
83
+ key="labels"
84
+ :value="value.labels"
85
+ :protected-keys="value.systemLabels || []"
86
+ :toggle-filter="toggler"
87
+ :add-label="t('labels.addLabel')"
88
+ :mode="mode"
89
+ :read-allowed="false"
90
+ :value-can-be-empty="true"
91
+ @input="value.setLabels($event)"
92
+ />
93
+ </div>
69
94
  </div>
70
95
  <div class="spacer" />
71
96
  <div :class="sectionClass">
@@ -84,6 +109,11 @@ export default {
84
109
  </div>
85
110
  </template>
86
111
 
87
- <style scoped>
88
-
112
+ <style lang="scss" scoped>
113
+ .labels {
114
+ &__header {
115
+ display: flex;
116
+ justify-content: space-between;
117
+ }
118
+ }
89
119
  </style>
@@ -213,9 +213,9 @@ export default {
213
213
  </script>
214
214
  <template>
215
215
  <Loading v-if="$fetchState.pending" />
216
- <div
217
- v-else
218
- class="cluster-permissions-editor"
216
+ <div
217
+ v-else
218
+ class="cluster-permissions-editor"
219
219
  >
220
220
  <div class="row mt-10">
221
221
  <div class="col span-12">
@@ -229,10 +229,10 @@ export default {
229
229
  </div>
230
230
  </div>
231
231
 
232
- <Card
233
- class="m-0"
234
- :show-highlight-border="false"
235
- :show-actions="false"
232
+ <Card
233
+ class="m-0"
234
+ :show-highlight-border="false"
235
+ :show-actions="false"
236
236
  >
237
237
  <template v-slot:title>
238
238
  <div class="type-title">
@@ -248,17 +248,17 @@ export default {
248
248
  :options="options"
249
249
  name="permission-group"
250
250
  />
251
- <div
252
- v-if="permissionGroup === 'custom'"
253
- class="custom-permissions ml-20 mt-10"
254
- :class="{'two-column': useTwoColumnsForCustom}"
251
+ <div
252
+ v-if="permissionGroup === 'custom'"
253
+ class="custom-permissions ml-20 mt-10"
254
+ :class="{'two-column': useTwoColumnsForCustom}"
255
255
  >
256
- <Checkbox
257
- v-for="permission in customPermissions"
258
- :key="permission.key"
259
- v-model="permission.value"
260
- class="mb-5"
261
- :label="permission.label"
256
+ <Checkbox
257
+ v-for="permission in customPermissions"
258
+ :key="permission.key"
259
+ v-model="permission.value"
260
+ class="mb-5"
261
+ :label="permission.label"
262
262
  />
263
263
  </div>
264
264
  </template>
@@ -138,9 +138,9 @@ export default {
138
138
  methods: {
139
139
  addMember() {
140
140
  this.$store.dispatch('cluster/promptModal', {
141
- component: this.addMemberDialogName,
142
- resources: [this.onAddMember],
143
- modalSticky: this.modalSticky
141
+ component: this.addMemberDialogName,
142
+ componentProps: { onAdd: this.onAddMember },
143
+ modalSticky: this.modalSticky
144
144
  });
145
145
  },
146
146
 
@@ -173,9 +173,9 @@ export default {
173
173
  <template #columns="{row}">
174
174
  <div class="columns row">
175
175
  <div class="col span-6">
176
- <Principal
177
- :key="row.value.principalId"
178
- :value="row.value.principalId"
176
+ <Principal
177
+ :key="row.value.principalId"
178
+ :value="row.value.principalId"
179
179
  />
180
180
  </div>
181
181
  <div class="col span-6 role">
@@ -194,12 +194,12 @@ export default {
194
194
  </template>
195
195
  <template #remove-button="{remove, i}">
196
196
  <span v-if="(isCreate && i === 0) || isView" />
197
- <button
198
- v-else
199
- type="button"
200
- :disabled="isView"
201
- class="btn role-link"
202
- @click="remove"
197
+ <button
198
+ v-else
199
+ type="button"
200
+ :disabled="isView"
201
+ class="btn role-link"
202
+ @click="remove"
203
203
  >
204
204
  {{ t('generic.remove') }}
205
205
  </button>
@@ -405,7 +405,7 @@ export default {
405
405
  >
406
406
  <i
407
407
  v-tooltip="t('generic.cancel')"
408
- class="icon icon-lg icon-close align-value"
408
+ class="icon icon-close align-value"
409
409
  />
410
410
  </button>
411
411
  </div>