@rancher/shell 0.1.0 → 0.1.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 (595) hide show
  1. package/assets/styles/base/_basic.scss +0 -1
  2. package/assets/styles/base/_variables.scss +2 -0
  3. package/assets/styles/global/_labeled-input.scss +6 -1
  4. package/assets/styles/global/_select.scss +9 -0
  5. package/assets/styles/vendor/vue-js-modal.scss +4 -0
  6. package/assets/translations/en-us.yaml +240 -16
  7. package/assets/translations/zh-hans.yaml +335 -111
  8. package/chart/example.vue +1 -1
  9. package/chart/istio.vue +2 -2
  10. package/chart/logging/index.vue +2 -2
  11. package/chart/monitoring/alerting/index.vue +2 -2
  12. package/chart/monitoring/grafana/index.vue +2 -2
  13. package/chart/monitoring/index.vue +2 -2
  14. package/chart/monitoring/prometheus/index.vue +4 -4
  15. package/chart/rancher-alerting-drivers.vue +17 -3
  16. package/chart/rancher-backup/S3.vue +37 -4
  17. package/chart/rancher-backup/index.vue +3 -3
  18. package/cloud-credential/aws.vue +1 -1
  19. package/cloud-credential/azure.vue +1 -1
  20. package/cloud-credential/digitalocean.vue +1 -1
  21. package/cloud-credential/gcp.vue +1 -1
  22. package/cloud-credential/generic.vue +1 -1
  23. package/cloud-credential/harvester.vue +2 -2
  24. package/cloud-credential/linode.vue +1 -1
  25. package/cloud-credential/s3.vue +2 -2
  26. package/cloud-credential/vmwarevsphere.vue +1 -1
  27. package/components/ActionMenu.vue +11 -1
  28. package/components/Alert.vue +1 -1
  29. package/components/AssignTo.vue +2 -2
  30. package/components/AsyncButton.vue +25 -12
  31. package/components/AwsComplianceBanner.vue +44 -0
  32. package/components/BannerGraphic.vue +11 -2
  33. package/components/ChartReadme.vue +10 -2
  34. package/components/CompoundStatusBadge.vue +50 -0
  35. package/components/CopyToClipboardText.vue +25 -4
  36. package/components/CruResource.vue +185 -16
  37. package/components/CruResourceFooter.vue +17 -1
  38. package/components/EtcdInfoBanner.vue +1 -1
  39. package/components/FilterLabel.vue +254 -0
  40. package/components/GlobalRoleBindings.vue +2 -2
  41. package/components/GrafanaDashboard.vue +1 -1
  42. package/components/GrowlManager.vue +20 -9
  43. package/components/HarvesterServiceAddOnConfig.vue +2 -2
  44. package/components/Import.vue +2 -2
  45. package/components/LandingPagePreference.vue +2 -2
  46. package/components/Markdown.vue +44 -12
  47. package/components/ModalWithCard.vue +2 -2
  48. package/components/MoveModal.vue +1 -1
  49. package/components/PercentageBar.vue +1 -1
  50. package/components/PromptChangePassword.vue +1 -1
  51. package/components/PromptModal.vue +13 -2
  52. package/components/PromptRemove.vue +64 -33
  53. package/components/PromptRestore.vue +3 -3
  54. package/components/Questions/Boolean.vue +1 -1
  55. package/components/Questions/Float.vue +1 -1
  56. package/components/Questions/Int.vue +1 -1
  57. package/components/Questions/Reference.vue +1 -1
  58. package/components/Questions/String.vue +1 -1
  59. package/components/RelatedResources.vue +1 -1
  60. package/components/RelatedWorkloadsTable.vue +3 -1
  61. package/components/ResourceDetail/Masthead.vue +27 -9
  62. package/components/ResourceDetail/index.vue +72 -7
  63. package/components/ResourceList/Masthead.vue +22 -0
  64. package/components/ResourceList/ResourceLoadingIndicator.vue +137 -0
  65. package/components/ResourceList/index.vue +42 -7
  66. package/components/ResourceTable.vue +11 -2
  67. package/components/ResourceYaml.vue +7 -1
  68. package/components/SelectIconGrid.vue +14 -1
  69. package/components/SortableTable/THead.vue +1 -1
  70. package/components/SortableTable/debug.js +117 -0
  71. package/components/SortableTable/index.vue +200 -43
  72. package/components/SortableTable/paging.js +2 -12
  73. package/components/SortableTable/selection.js +3 -0
  74. package/components/SortableTable/sorting.js +3 -1
  75. package/components/Tabbed/Tab.vue +25 -4
  76. package/components/Tabbed/index.vue +133 -119
  77. package/components/TypeDescription.vue +1 -1
  78. package/components/VMConsoleBar.vue +1 -1
  79. package/components/Wizard.vue +53 -14
  80. package/components/YamlEditor.vue +10 -0
  81. package/components/__tests__/CopyCode.test.ts +1 -7
  82. package/components/__tests__/CruResource.test.ts +1 -8
  83. package/components/auth/AllowedPrincipals.vue +1 -1
  84. package/components/auth/AuthBanner.vue +2 -1
  85. package/components/auth/AzureWarning.vue +69 -0
  86. package/components/auth/RoleDetailEdit.vue +4 -4
  87. package/components/auth/login/ldap.vue +1 -1
  88. package/components/cards/ApplicationCard.vue +140 -0
  89. package/components/dialog/AddClusterMemberDialog.vue +1 -1
  90. package/components/dialog/AddCustomBadgeDialog.vue +4 -4
  91. package/components/dialog/AddProjectMemberDialog.vue +2 -2
  92. package/components/dialog/AddonConfigConfirmationDialog.vue +1 -1
  93. package/components/dialog/DrainNode.vue +3 -3
  94. package/components/dialog/ForceMachineRemoveDialog.vue +2 -2
  95. package/components/dialog/GenericPrompt.vue +2 -2
  96. package/components/dialog/RollbackWorkloadDialog.vue +2 -2
  97. package/components/dialog/RotateCertificatesDialog.vue +3 -3
  98. package/components/dialog/RotateEncryptionKeyDialog.vue +11 -6
  99. package/components/dialog/SaveAsRKETemplateDialog.vue +3 -3
  100. package/components/dialog/harvester/AddHotplugModal.vue +3 -3
  101. package/components/dialog/harvester/BackupModal.vue +3 -3
  102. package/components/dialog/harvester/CloneTemplate.vue +3 -3
  103. package/components/dialog/harvester/EjectCDROMDialog.vue +3 -3
  104. package/components/dialog/harvester/ExportImageDialog.vue +3 -3
  105. package/components/dialog/harvester/MaintenanceDialog.vue +2 -2
  106. package/components/dialog/harvester/MigrationDialog.vue +2 -2
  107. package/components/dialog/harvester/RestoreDialog.vue +2 -2
  108. package/components/dialog/harvester/SupportBundle.vue +2 -2
  109. package/components/dialog/harvester/UnplugVolume.vue +2 -2
  110. package/components/fleet/FleetBundleResources.vue +1 -1
  111. package/components/fleet/FleetBundles.vue +1 -1
  112. package/components/fleet/FleetResources.vue +5 -3
  113. package/components/fleet/ForceDirectedTreeChart/chartIcons.js +17 -0
  114. package/components/fleet/ForceDirectedTreeChart/index.vue +553 -0
  115. package/components/form/ArrayList.vue +22 -3
  116. package/components/form/BannerSettings.vue +3 -3
  117. package/components/form/ChangePassword.vue +2 -2
  118. package/components/form/Command.vue +28 -9
  119. package/components/form/Error.vue +50 -0
  120. package/components/form/Footer.vue +2 -5
  121. package/components/form/HealthCheck.vue +2 -2
  122. package/components/form/HookOption.vue +2 -2
  123. package/components/form/InputWithSelect.vue +12 -2
  124. package/components/form/KeyValue.vue +5 -2
  125. package/components/form/LabeledSelect.vue +27 -14
  126. package/components/form/Labels.vue +12 -0
  127. package/components/form/MatchExpressions.vue +44 -10
  128. package/components/form/Members/ClusterPermissionsEditor.vue +3 -3
  129. package/components/form/Members/MembershipEditor.vue +10 -1
  130. package/components/form/Members/ProjectMembershipEditor.vue +1 -0
  131. package/components/form/NameNsDescription.vue +202 -79
  132. package/components/form/Networking.vue +1 -1
  133. package/components/form/NodeAffinity.vue +41 -26
  134. package/components/form/NodeScheduling.vue +29 -3
  135. package/components/form/NotificationSettings.vue +2 -2
  136. package/components/form/Password.vue +1 -1
  137. package/components/form/PodAffinity.vue +64 -6
  138. package/components/form/PodSecurity.vue +2 -2
  139. package/components/form/Ports.vue +1 -1
  140. package/components/form/Probe.vue +60 -17
  141. package/components/form/ProjectMemberEditor.vue +3 -3
  142. package/components/form/ResourceQuota/NamespaceRow.vue +46 -2
  143. package/components/form/ResourceQuota/Project.vue +4 -0
  144. package/components/form/ResourceTabs/index.vue +19 -7
  145. package/components/form/RuleSelector.vue +1 -1
  146. package/components/form/Security.vue +56 -14
  147. package/components/form/Select.vue +52 -10
  148. package/components/form/SelectOrCreateAuthSecret.vue +70 -31
  149. package/components/form/ServiceNameSelect.vue +1 -1
  150. package/components/form/ServicePorts.vue +10 -2
  151. package/components/form/ShellInput.vue +1 -1
  152. package/components/form/SimpleSecretSelector.vue +2 -2
  153. package/components/form/Tolerations.vue +1 -1
  154. package/components/form/UnitInput.vue +12 -3
  155. package/components/form/ValueFromResource.vue +1 -1
  156. package/components/form/WorkloadPorts.vue +1 -1
  157. package/components/form/__tests__/Command.test.ts +63 -0
  158. package/components/form/__tests__/Error.test.ts +56 -0
  159. package/components/form/__tests__/MatchExpressions.test.ts +79 -0
  160. package/components/form/__tests__/Probe.test.ts +62 -0
  161. package/components/form/__tests__/Security.test.ts +55 -0
  162. package/components/form/__tests__/UnitInput.test.ts +31 -23
  163. package/components/formatter/BadgeStateFormatter.vue +1 -1
  164. package/components/formatter/Capitalize.vue +7 -0
  165. package/components/formatter/ClusterLink.vue +6 -2
  166. package/components/formatter/ClusterProvider.vue +36 -0
  167. package/components/formatter/DelayedValue.vue +43 -0
  168. package/components/formatter/Endpoints.vue +2 -2
  169. package/components/formatter/HarvesterDiskState.vue +1 -1
  170. package/components/formatter/HarvesterIpAddress.vue +37 -18
  171. package/components/formatter/HarvesterMigrationState.vue +1 -1
  172. package/components/formatter/HarvesterVmState.vue +1 -1
  173. package/components/formatter/LinkDetail.vue +11 -2
  174. package/components/formatter/LinkName.vue +2 -2
  175. package/components/formatter/LiveExpiryBadgeState.vue +1 -1
  176. package/components/formatter/LivePodRestarts.vue +47 -0
  177. package/components/formatter/MachineSummaryGraph.vue +51 -5
  178. package/components/formatter/PodsUsage.vue +5 -3
  179. package/components/formatter/Weight.vue +1 -1
  180. package/components/formatter/WorkloadHealthScale.vue +17 -6
  181. package/components/nav/HarvesterUpgrade.vue +15 -5
  182. package/components/nav/Header.vue +15 -6
  183. package/components/nav/Jump.vue +1 -1
  184. package/components/nav/NamespaceFilter.vue +30 -10
  185. package/components/nav/TopLevelMenu.vue +52 -14
  186. package/components/nav/WindowManager/ContainerLogs.vue +14 -2
  187. package/components/nav/WorkspaceSwitcher.vue +1 -1
  188. package/components/{NovncConsole.vue → novnc/NovncConsole.vue} +0 -0
  189. package/components/novnc/NovncConsoleItem.vue +89 -0
  190. package/components/novnc/NovncConsoleWrapper.vue +243 -0
  191. package/config/labels-annotations.js +6 -2
  192. package/config/product/explorer.js +7 -3
  193. package/config/product/fleet.js +4 -1
  194. package/config/product/manager.js +5 -6
  195. package/config/product/settings.js +12 -1
  196. package/config/query-params.js +2 -0
  197. package/config/roles.ts +5 -0
  198. package/config/settings.js +60 -63
  199. package/config/table-headers.js +47 -18
  200. package/config/types.js +24 -8
  201. package/content/docs/en-us/whats-new.md +25 -0
  202. package/core/plugin.ts +12 -2
  203. package/creators/app/init +7 -1
  204. package/creators/pkg/tsconfig.json +2 -3
  205. package/detail/catalog.cattle.io.app.vue +1 -1
  206. package/detail/cis.cattle.io.clusterscan.vue +1 -1
  207. package/detail/fleet.cattle.io.bundle.vue +73 -21
  208. package/detail/fleet.cattle.io.gitrepo.vue +5 -4
  209. package/detail/harvesterhci.io.host/HarvesterHostBasic.vue +25 -4
  210. package/detail/harvesterhci.io.host/HarvesterHostDisk.vue +2 -2
  211. package/detail/harvesterhci.io.virtualmachinebackup/index.vue +1 -1
  212. package/detail/helm.cattle.io.projecthelmchart.vue +1 -1
  213. package/detail/networking.k8s.io.ingress.vue +10 -2
  214. package/detail/pod.vue +37 -1
  215. package/detail/provisioning.cattle.io.cluster.vue +102 -15
  216. package/detail/workload/index.vue +163 -15
  217. package/edit/auth/azuread.vue +146 -34
  218. package/edit/auth/github.vue +3 -3
  219. package/edit/auth/googleoauth.vue +3 -3
  220. package/edit/auth/ldap/config.vue +15 -7
  221. package/edit/auth/ldap/index.vue +2 -2
  222. package/edit/auth/oidc.vue +3 -3
  223. package/edit/auth/saml.vue +3 -3
  224. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -1
  225. package/edit/autoscaling.horizontalpodautoscaler/metric-identifier.vue +1 -1
  226. package/edit/autoscaling.horizontalpodautoscaler/metric-object-reference.vue +1 -1
  227. package/edit/autoscaling.horizontalpodautoscaler/metric-target.vue +1 -1
  228. package/edit/autoscaling.horizontalpodautoscaler/metrics-row.vue +1 -1
  229. package/edit/catalog.cattle.io.clusterrepo.vue +2 -2
  230. package/edit/cis.cattle.io.clusterscan.vue +4 -4
  231. package/edit/cis.cattle.io.clusterscanbenchmark.vue +1 -1
  232. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -1
  233. package/edit/fleet.cattle.io.cluster.vue +1 -0
  234. package/edit/fleet.cattle.io.clustergroup.vue +1 -1
  235. package/edit/fleet.cattle.io.gitrepo.vue +290 -157
  236. package/edit/harvesterhci.io.host/HarvesterDisk.vue +4 -5
  237. package/edit/harvesterhci.io.host/index.vue +28 -19
  238. package/edit/harvesterhci.io.keypair.vue +1 -1
  239. package/edit/harvesterhci.io.managedchart/rancher-monitoring.vue +1 -1
  240. package/edit/harvesterhci.io.management.cluster.vue +1 -1
  241. package/edit/harvesterhci.io.networkattachmentdefinition.vue +2 -2
  242. package/edit/harvesterhci.io.setting/additional-ca.vue +1 -1
  243. package/edit/harvesterhci.io.setting/backup-target.vue +1 -1
  244. package/edit/harvesterhci.io.setting/http-proxy.vue +1 -1
  245. package/edit/harvesterhci.io.setting/index.vue +3 -3
  246. package/edit/harvesterhci.io.setting/overcommit-config.vue +4 -1
  247. package/edit/harvesterhci.io.setting/ssl-parameters.vue +1 -1
  248. package/edit/harvesterhci.io.setting/support-bundle-image.vue +1 -1
  249. package/edit/harvesterhci.io.setting/vip-pools.vue +1 -1
  250. package/edit/harvesterhci.io.setting/vm-force-reset-policy.vue +2 -2
  251. package/edit/harvesterhci.io.virtualmachinebackup.vue +2 -2
  252. package/edit/harvesterhci.io.virtualmachineimage.vue +2 -2
  253. package/edit/harvesterhci.io.virtualmachinetemplateversion.vue +26 -18
  254. package/edit/helm.cattle.io.projecthelmchart.vue +3 -3
  255. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +2 -2
  256. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/AccessCredentialsUsers.vue +1 -1
  257. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/index.vue +1 -1
  258. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/DataTemplate.vue +1 -0
  259. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/index.vue +2 -1
  260. package/edit/kubevirt.io.virtualmachine/VirtualMachineCpuMemory.vue +3 -1
  261. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/__tests__/HarvesterEditNetwork.test.ts +41 -0
  262. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue +79 -36
  263. package/edit/kubevirt.io.virtualmachine/VirtualMachineReserved.vue +54 -0
  264. package/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue +1 -1
  265. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue +2 -3
  266. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditContainer.test.ts +40 -0
  267. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditExisting.test.ts +102 -0
  268. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVMImage.test.ts +117 -0
  269. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVolume.test.ts +74 -0
  270. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/container.vue +59 -13
  271. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue +72 -16
  272. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/vmImage.vue +74 -14
  273. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue +35 -9
  274. package/edit/kubevirt.io.virtualmachine/index.vue +33 -24
  275. package/edit/logging-flow/index.vue +1 -1
  276. package/edit/logging.banzaicloud.io.output/index.vue +1 -1
  277. package/edit/logging.banzaicloud.io.output/providers/awsElasticsearch.vue +1 -1
  278. package/edit/logging.banzaicloud.io.output/providers/azurestorage.vue +1 -1
  279. package/edit/logging.banzaicloud.io.output/providers/cloudwatch.vue +1 -1
  280. package/edit/logging.banzaicloud.io.output/providers/datadog.vue +2 -2
  281. package/edit/logging.banzaicloud.io.output/providers/elasticsearch.vue +2 -2
  282. package/edit/logging.banzaicloud.io.output/providers/file.vue +1 -1
  283. package/edit/logging.banzaicloud.io.output/providers/forward.vue +1 -1
  284. package/edit/logging.banzaicloud.io.output/providers/gcs.vue +2 -2
  285. package/edit/logging.banzaicloud.io.output/providers/gelf.vue +2 -2
  286. package/edit/logging.banzaicloud.io.output/providers/kafka.vue +2 -2
  287. package/edit/logging.banzaicloud.io.output/providers/kinesisStream.vue +1 -1
  288. package/edit/logging.banzaicloud.io.output/providers/logdna.vue +1 -1
  289. package/edit/logging.banzaicloud.io.output/providers/logz.vue +2 -2
  290. package/edit/logging.banzaicloud.io.output/providers/loki.vue +2 -2
  291. package/edit/logging.banzaicloud.io.output/providers/newrelic.vue +1 -1
  292. package/edit/logging.banzaicloud.io.output/providers/s3.vue +2 -2
  293. package/edit/logging.banzaicloud.io.output/providers/splunkHec.vue +2 -2
  294. package/edit/logging.banzaicloud.io.output/providers/sumologic.vue +1 -1
  295. package/edit/logging.banzaicloud.io.output/providers/syslog.vue +2 -2
  296. package/edit/management.cattle.io.clusterroletemplatebinding.vue +2 -0
  297. package/edit/management.cattle.io.node.vue +71 -0
  298. package/edit/management.cattle.io.project.vue +28 -23
  299. package/edit/management.cattle.io.setting.vue +14 -3
  300. package/edit/management.cattle.io.user.vue +1 -1
  301. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +4 -4
  302. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +13 -13
  303. package/edit/monitoring.coreos.com.alertmanagerconfig/routeConfig.vue +18 -10
  304. package/edit/monitoring.coreos.com.alertmanagerconfig/tls.vue +2 -2
  305. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +12 -7
  306. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +12 -7
  307. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +20 -11
  308. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +13 -8
  309. package/edit/monitoring.coreos.com.alertmanagerconfig/types/webhook.vue +25 -7
  310. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +2 -2
  311. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +20 -7
  312. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +1 -1
  313. package/edit/monitoring.coreos.com.prometheusrule/index.vue +19 -8
  314. package/edit/monitoring.coreos.com.receiver/auth.vue +1 -1
  315. package/edit/monitoring.coreos.com.receiver/index.vue +2 -2
  316. package/edit/monitoring.coreos.com.receiver/tls.vue +2 -2
  317. package/edit/monitoring.coreos.com.receiver/types/email.vue +2 -2
  318. package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +2 -2
  319. package/edit/monitoring.coreos.com.receiver/types/pagerduty.vue +2 -2
  320. package/edit/monitoring.coreos.com.receiver/types/slack.vue +2 -2
  321. package/edit/monitoring.coreos.com.receiver/types/webhook.banner.vue +1 -1
  322. package/edit/monitoring.coreos.com.receiver/types/webhook.vue +3 -3
  323. package/edit/monitoring.coreos.com.route.vue +2 -2
  324. package/edit/namespace.vue +0 -8
  325. package/edit/network.harvesterhci.io.clusternetwork/vlan.vue +1 -1
  326. package/edit/networking.istio.io.destinationrule/LoadBalancer.vue +2 -2
  327. package/edit/networking.istio.io.destinationrule/index.vue +1 -1
  328. package/edit/networking.k8s.io.ingress/Certificate.vue +5 -1
  329. package/edit/networking.k8s.io.ingress/Certificates.vue +5 -0
  330. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +17 -2
  331. package/edit/networking.k8s.io.ingress/IngressClass.vue +63 -0
  332. package/edit/networking.k8s.io.ingress/Rule.vue +42 -6
  333. package/edit/networking.k8s.io.ingress/RulePath.vue +29 -5
  334. package/edit/networking.k8s.io.ingress/Rules.vue +11 -0
  335. package/edit/networking.k8s.io.ingress/index.vue +104 -15
  336. package/edit/networking.k8s.io.networkpolicy/PolicyRulePort.vue +1 -1
  337. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +2 -2
  338. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -2
  339. package/edit/persistentvolume/index.vue +1 -1
  340. package/edit/persistentvolume/plugins/awsElasticBlockStore.vue +2 -2
  341. package/edit/persistentvolume/plugins/azureDisk.vue +2 -2
  342. package/edit/persistentvolume/plugins/azureFile.vue +2 -2
  343. package/edit/persistentvolume/plugins/cephfs.vue +4 -4
  344. package/edit/persistentvolume/plugins/cinder.vue +2 -2
  345. package/edit/persistentvolume/plugins/csi.vue +2 -2
  346. package/edit/persistentvolume/plugins/fc.vue +4 -4
  347. package/edit/persistentvolume/plugins/flexVolume.vue +2 -2
  348. package/edit/persistentvolume/plugins/flocker.vue +1 -1
  349. package/edit/persistentvolume/plugins/gcePersistentDisk.vue +2 -2
  350. package/edit/persistentvolume/plugins/glusterfs.vue +2 -2
  351. package/edit/persistentvolume/plugins/hostPath.vue +1 -1
  352. package/edit/persistentvolume/plugins/iscsi.vue +4 -4
  353. package/edit/persistentvolume/plugins/local.vue +1 -1
  354. package/edit/persistentvolume/plugins/longhorn.vue +2 -2
  355. package/edit/persistentvolume/plugins/nfs.vue +2 -2
  356. package/edit/persistentvolume/plugins/photonPersistentDisk.vue +1 -1
  357. package/edit/persistentvolume/plugins/portworxVolume.vue +2 -2
  358. package/edit/persistentvolume/plugins/quobyte.vue +2 -2
  359. package/edit/persistentvolume/plugins/rbd.vue +4 -4
  360. package/edit/persistentvolume/plugins/scaleIO.vue +2 -2
  361. package/edit/persistentvolume/plugins/storageos.vue +2 -2
  362. package/edit/persistentvolume/plugins/vsphereVolume.vue +1 -1
  363. package/edit/persistentvolumeclaim.vue +24 -8
  364. package/edit/provisioning.cattle.io.cluster/ACE.vue +2 -2
  365. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +8 -3
  366. package/edit/provisioning.cattle.io.cluster/DrainOptions.vue +2 -2
  367. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +15 -3
  368. package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +16 -3
  369. package/edit/provisioning.cattle.io.cluster/S3Config.vue +2 -2
  370. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +1 -1
  371. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.tests.ts +1 -7
  372. package/edit/provisioning.cattle.io.cluster/import.vue +2 -1
  373. package/edit/provisioning.cattle.io.cluster/index.vue +26 -7
  374. package/edit/provisioning.cattle.io.cluster/rke2.vue +136 -48
  375. package/edit/resources.cattle.io.backup.vue +26 -8
  376. package/edit/resources.cattle.io.restore.vue +3 -3
  377. package/edit/secret/basic.vue +1 -1
  378. package/edit/secret/index.vue +80 -2
  379. package/edit/secret/registry.vue +2 -2
  380. package/edit/secret/ssh.vue +1 -1
  381. package/edit/secret/tls.vue +1 -1
  382. package/edit/service.vue +47 -11
  383. package/edit/serviceaccount.vue +1 -1
  384. package/edit/storage.k8s.io.storageclass/index.vue +1 -1
  385. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/aws-ebs.vue +7 -3
  386. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/azure-disk.vue +1 -1
  387. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/azure-file.vue +1 -1
  388. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/cinder.vue +2 -2
  389. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/gce-pd.vue +2 -2
  390. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/glusterfs.vue +1 -1
  391. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/portworx-volume.vue +1 -1
  392. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/quobyte.vue +1 -1
  393. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/rbd.vue +1 -1
  394. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/scaleio.vue +1 -1
  395. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/storageos.vue +1 -1
  396. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/vsphere-volume.vue +1 -1
  397. package/edit/token.vue +3 -3
  398. package/edit/ui.cattle.io.navlink.vue +2 -2
  399. package/edit/workload/Job.vue +111 -23
  400. package/edit/workload/Upgrading.vue +77 -22
  401. package/edit/workload/__tests__/Job.test.ts +72 -0
  402. package/edit/workload/__tests__/Upgrading.test.ts +60 -0
  403. package/edit/workload/index.vue +13 -1085
  404. package/edit/workload/mixins/workload.js +900 -0
  405. package/edit/workload/storage/Mount.vue +2 -2
  406. package/edit/workload/storage/awsElasticBlockStore.vue +1 -1
  407. package/edit/workload/storage/azureDisk.vue +2 -2
  408. package/edit/workload/storage/azureFile.vue +1 -1
  409. package/edit/workload/storage/ephemeralVolume/index.vue +2 -2
  410. package/edit/workload/storage/gcePersistentDisk.vue +1 -1
  411. package/edit/workload/storage/hostPath.vue +1 -1
  412. package/edit/workload/storage/nfs.vue +2 -2
  413. package/edit/workload/storage/persistentVolumeClaim/index.vue +2 -2
  414. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +3 -3
  415. package/edit/workload/storage/secret.vue +2 -2
  416. package/edit/workload/storage/vsphereVolume.vue +1 -1
  417. package/edit/workload/types/Deployment.vue +377 -0
  418. package/edit/workload/types/Generic.vue +295 -0
  419. package/layouts/default.vue +26 -7
  420. package/layouts/error.vue +3 -2
  421. package/layouts/home.vue +12 -2
  422. package/layouts/plain.vue +18 -2
  423. package/layouts/unauthenticated.vue +2 -1
  424. package/list/catalog.cattle.io.clusterrepo.vue +1 -1
  425. package/list/fleet.cattle.io.bundle.vue +1 -1
  426. package/list/fleet.cattle.io.cluster.vue +1 -1
  427. package/list/fleet.cattle.io.clusterregistrationtoken.vue +1 -1
  428. package/list/harvesterhci.io.dashboard/HarvesterUpgrade.vue +9 -8
  429. package/list/harvesterhci.io.dashboard/UpgradeInfo.vue +40 -0
  430. package/list/harvesterhci.io.dashboard/index.vue +14 -36
  431. package/list/harvesterhci.io.host/index.vue +24 -12
  432. package/list/harvesterhci.io.networkattachmentdefinition.vue +1 -1
  433. package/list/harvesterhci.io.setting.vue +1 -1
  434. package/list/harvesterhci.io.virtualmachinebackup.vue +1 -1
  435. package/list/harvesterhci.io.virtualmachineimage.vue +36 -3
  436. package/list/harvesterhci.io.virtualmachinetemplateversion.vue +1 -5
  437. package/list/helm.cattle.io.projecthelmchart.vue +1 -1
  438. package/list/kubevirt.io.virtualmachine.vue +4 -2
  439. package/list/management.cattle.io.feature.vue +3 -3
  440. package/list/management.cattle.io.setting.vue +2 -2
  441. package/list/monitoring.coreos.com.alertmanagerconfig.vue +1 -1
  442. package/list/namespace.vue +3 -1
  443. package/list/node.vue +10 -3
  444. package/list/persistentvolumeclaim.vue +42 -0
  445. package/list/provisioning.cattle.io.cluster.vue +22 -20
  446. package/list/workload.vue +31 -6
  447. package/machine-config/amazonec2.vue +37 -12
  448. package/machine-config/azure.vue +3 -3
  449. package/machine-config/digitalocean.vue +2 -2
  450. package/machine-config/generic.vue +1 -1
  451. package/machine-config/harvester.vue +124 -25
  452. package/machine-config/linode.vue +2 -2
  453. package/machine-config/vmwarevsphere.vue +5 -5
  454. package/middleware/authenticated.js +36 -6
  455. package/middleware/unauthenticated.js +22 -0
  456. package/mixins/brand.js +50 -3
  457. package/mixins/browser-tab-visibility.js +37 -0
  458. package/mixins/chart.js +36 -4
  459. package/mixins/{compact-input.js → compact-input.ts} +5 -3
  460. package/mixins/form-validation.js +122 -0
  461. package/mixins/harvester-vm/index.js +134 -90
  462. package/mixins/labeled-form-element.ts +193 -0
  463. package/mixins/resource-fetch.js +173 -0
  464. package/models/cluster.x-k8s.io.machine.js +6 -2
  465. package/models/etcdbackup.js +4 -0
  466. package/models/event.js +4 -0
  467. package/models/fleet.cattle.io.bundle.js +1 -1
  468. package/models/fleet.cattle.io.gitrepo.js +10 -0
  469. package/models/harvester/harvesterhci.io.virtualmachinebackup.js +5 -2
  470. package/models/harvester/harvesterhci.io.virtualmachineimage.js +11 -8
  471. package/models/harvester/harvesterhci.io.virtualmachinetemplateversion.js +11 -2
  472. package/models/harvester/kubevirt.io.virtualmachine.js +2 -2
  473. package/models/harvester/kubevirt.io.virtualmachineinstance.js +1 -1
  474. package/models/harvester/node.js +27 -32
  475. package/models/harvester/persistentvolumeclaim.js +1 -1
  476. package/models/management.cattle.io.cluster.js +17 -11
  477. package/models/management.cattle.io.clusterroletemplatebinding.js +2 -2
  478. package/models/management.cattle.io.globalrole.js +19 -0
  479. package/models/management.cattle.io.node.js +10 -11
  480. package/models/management.cattle.io.project.js +60 -26
  481. package/models/management.cattle.io.roletemplate.js +19 -0
  482. package/models/monitoring.coreos.com.alertmanagerconfig.js +3 -2
  483. package/models/monitoring.coreos.com.prometheusrule.js +9 -0
  484. package/models/namespace.js +9 -1
  485. package/models/networking.k8s.io.ingress.js +17 -5
  486. package/models/persistentvolumeclaim.js +47 -1
  487. package/models/projectroletemplatebinding.js +2 -2
  488. package/models/provisioning.cattle.io.cluster.js +92 -13
  489. package/models/rke.cattle.io.etcdsnapshot.js +4 -0
  490. package/models/service.js +11 -5
  491. package/models/storage.k8s.io.storageclass.js +14 -1
  492. package/models/workload.js +7 -2
  493. package/nuxt.config.js +27 -7
  494. package/package.json +10 -14
  495. package/pages/about.vue +15 -1
  496. package/pages/account/index.vue +1 -1
  497. package/pages/auth/login.vue +17 -5
  498. package/pages/auth/setup.vue +47 -9
  499. package/pages/c/_cluster/_product/_resource/create.vue +1 -1
  500. package/pages/c/_cluster/_product/members/index.vue +6 -1
  501. package/pages/c/_cluster/_product/projectsnamespaces.vue +113 -11
  502. package/pages/c/_cluster/apps/charts/chart.vue +1 -1
  503. package/pages/c/_cluster/apps/charts/index.vue +2 -2
  504. package/pages/c/_cluster/apps/charts/install.vue +197 -19
  505. package/pages/c/_cluster/auth/config/index.vue +1 -1
  506. package/pages/c/_cluster/explorer/EventsTable.vue +1 -15
  507. package/pages/c/_cluster/explorer/index.vue +64 -35
  508. package/pages/c/_cluster/explorer/tools/index.vue +1 -1
  509. package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +249 -0
  510. package/pages/c/_cluster/fleet/index.vue +47 -65
  511. package/pages/c/_cluster/harvester/airgapupgrade/index.vue +7 -4
  512. package/pages/c/_cluster/harvester/console/_uid/vnc.vue +7 -1
  513. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +8 -14
  514. package/pages/c/_cluster/monitoring/index.vue +1 -1
  515. package/pages/c/_cluster/monitoring/route-receiver/index.vue +1 -1
  516. package/pages/c/_cluster/settings/banners.vue +2 -2
  517. package/pages/c/_cluster/settings/brand.vue +62 -7
  518. package/pages/c/_cluster/settings/performance.vue +167 -0
  519. package/pages/diagnostic.vue +468 -0
  520. package/pages/fail-whale.vue +17 -5
  521. package/pages/home.vue +36 -22
  522. package/pages/plugins.vue +1 -1
  523. package/pages/prefs.vue +20 -7
  524. package/pages/support/index.vue +51 -9
  525. package/pkg/auto-import.js +1 -1
  526. package/pkg/dynamic-importer.lib.js +8 -0
  527. package/pkg/tsconfig.json +26 -9
  528. package/pkg/vue.config.js +8 -0
  529. package/plugins/console.js +29 -0
  530. package/plugins/dashboard-store/actions.js +171 -28
  531. package/plugins/dashboard-store/getters.js +13 -1
  532. package/plugins/dashboard-store/index.js +5 -1
  533. package/plugins/dashboard-store/mutations.js +72 -22
  534. package/plugins/dashboard-store/resource-class.js +259 -184
  535. package/plugins/i18n.js +9 -3
  536. package/plugins/steve/actions.js +16 -1
  537. package/plugins/steve/getters.js +9 -1
  538. package/plugins/steve/index.js +6 -2
  539. package/plugins/steve/mutations.js +100 -5
  540. package/plugins/steve/norman-class.js +8 -0
  541. package/plugins/steve/performanceTesting.js +5 -0
  542. package/plugins/steve/subscribe.js +144 -12
  543. package/plugins/steve/web-worker.steve-sub-worker.js +129 -0
  544. package/promptRemove/kubevirt.io.virtualmachine.vue +3 -17
  545. package/promptRemove/management.cattle.io.project.vue +128 -0
  546. package/promptRemove/pod.vue +131 -0
  547. package/rancher-components/BadgeState/BadgeState.spec.ts +12 -0
  548. package/{components → rancher-components/BadgeState}/BadgeState.vue +18 -10
  549. package/rancher-components/BadgeState/index.ts +1 -0
  550. package/{components/__tests__ → rancher-components/Banner}/Banner.test.ts +1 -1
  551. package/{components → rancher-components/Banner}/Banner.vue +22 -7
  552. package/rancher-components/Banner/index.ts +1 -0
  553. package/{components → rancher-components/Card}/Card.vue +58 -12
  554. package/rancher-components/Card/index.ts +1 -0
  555. package/{components/form → rancher-components/Form/Checkbox}/Checkbox.vue +118 -25
  556. package/rancher-components/Form/Checkbox/index.ts +1 -0
  557. package/{components/form/__tests__ → rancher-components/Form/LabeledInput}/LabeledInput.test.ts +13 -2
  558. package/rancher-components/Form/LabeledInput/LabeledInput.vue +341 -0
  559. package/rancher-components/Form/LabeledInput/index.ts +1 -0
  560. package/{components/form → rancher-components/Form/Radio}/RadioButton.vue +50 -22
  561. package/{components/form → rancher-components/Form/Radio}/RadioGroup.vue +76 -28
  562. package/rancher-components/Form/Radio/index.ts +2 -0
  563. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +169 -0
  564. package/rancher-components/Form/TextArea/index.ts +1 -0
  565. package/rancher-components/Form/index.ts +4 -0
  566. package/{components/form → rancher-components/LabeledTooltip}/LabeledTooltip.vue +32 -11
  567. package/rancher-components/LabeledTooltip/index.ts +1 -0
  568. package/scripts/build-pkg.sh +4 -0
  569. package/scripts/publish-shell.sh +37 -18
  570. package/scripts/test-plugins-build.sh +115 -0
  571. package/store/catalog.js +4 -0
  572. package/store/growl.js +6 -0
  573. package/store/i18n.js +18 -9
  574. package/store/index.js +190 -107
  575. package/store/prefs.js +8 -2
  576. package/store/resource-fetch.js +44 -0
  577. package/store/type-map.js +43 -7
  578. package/store/uiplugins.ts +1 -1
  579. package/utils/favicon.js +40 -0
  580. package/utils/object.js +26 -9
  581. package/utils/promise.js +20 -0
  582. package/utils/socket.js +10 -1
  583. package/utils/string.js +16 -0
  584. package/utils/validators/formRules/__tests__/index.test.ts +928 -0
  585. package/utils/validators/formRules/index.ts +447 -0
  586. package/utils/validators/prometheusrule.js +1 -1
  587. package/utils/validators/vm.js +12 -5
  588. package/utils/width.js +39 -0
  589. package/yarn-error.log +196 -0
  590. package/components/NovncConsoleWrapper.vue +0 -150
  591. package/components/form/Container.vue +0 -143
  592. package/components/form/LabeledInput.vue +0 -245
  593. package/components/form/Scheduling.vue +0 -115
  594. package/components/form/TextAreaAutoGrow.vue +0 -127
  595. package/mixins/labeled-form-element.js +0 -137
@@ -1,6 +1,6 @@
1
1
  <script>
2
- import RadioGroup from '@shell/components/form/RadioGroup';
3
- import LabeledInput from '@shell/components/form/LabeledInput';
2
+ import { RadioGroup } from '@components/Form/Radio';
3
+ import { LabeledInput } from '@components/Form/LabeledInput';
4
4
  import { _VIEW } from '@shell/config/query-params';
5
5
  import { mapGetters } from 'vuex';
6
6
  import LabeledSelect from '@shell/components/form/LabeledSelect';
@@ -62,12 +62,27 @@ export default {
62
62
  'WAKE_ALARM'];
63
63
 
64
64
  const {
65
- capabilities = {}, runAsRoot = true, readOnlyRootFilesystem = false, privileged = false, allowPrivilegeEscalation = true, runAsUser
65
+ capabilities = {},
66
+ runAsRoot = true,
67
+ readOnlyRootFilesystem = false,
68
+ privileged = false,
69
+ allowPrivilegeEscalation = true,
70
+ runAsUser
66
71
  } = this.value;
67
- const { add = [], drop = [] } = capabilities;
72
+ const {
73
+ add = [],
74
+ drop = []
75
+ } = capabilities;
68
76
 
69
77
  return {
70
- privileged, allowPrivilegeEscalation, allCapabilities, runAsRoot, readOnlyRootFilesystem, add, drop, runAsUser
78
+ privileged,
79
+ allowPrivilegeEscalation,
80
+ allCapabilities,
81
+ runAsRoot,
82
+ readOnlyRootFilesystem,
83
+ add,
84
+ drop,
85
+ runAsUser
71
86
  };
72
87
  },
73
88
 
@@ -105,10 +120,13 @@ export default {
105
120
  </script>
106
121
 
107
122
  <template>
108
- <div @input="update">
123
+ <div>
109
124
  <div>
110
125
  <div class="row">
111
- <div class="col span-6">
126
+ <div
127
+ data-testid="input-security-privileged"
128
+ class="col span-6"
129
+ >
112
130
  <RadioGroup
113
131
  v-model="privileged"
114
132
  name="privileged"
@@ -119,7 +137,11 @@ export default {
119
137
  @input="update"
120
138
  />
121
139
  </div>
122
- <div v-if="!privileged" class="col span-6">
140
+ <div
141
+ v-if="!privileged"
142
+ data-testid="input-security-allowPrivilegeEscalation"
143
+ class="col span-6"
144
+ >
123
145
  <RadioGroup
124
146
  v-model="allowPrivilegeEscalation"
125
147
  name="allowPrivilegeEscalation"
@@ -137,7 +159,10 @@ export default {
137
159
 
138
160
  <div>
139
161
  <div class="row">
140
- <div class="col span-6">
162
+ <div
163
+ data-testid="input-security-runasNonRoot"
164
+ class="col span-6"
165
+ >
141
166
  <RadioGroup
142
167
  name="runasNonRoot"
143
168
  :label="t('workload.container.security.runAsNonRoot.label')"
@@ -148,7 +173,10 @@ export default {
148
173
  @input="e=>{runAsRoot = !e; update()}"
149
174
  />
150
175
  </div>
151
- <div class="col span-6">
176
+ <div
177
+ data-testid="input-security-readOnlyRootFilesystem"
178
+ class="col span-6"
179
+ >
152
180
  <RadioGroup
153
181
  v-model="readOnlyRootFilesystem"
154
182
  name="readOnlyRootFilesystem"
@@ -163,14 +191,25 @@ export default {
163
191
  </div>
164
192
  <div class="spacer"></div>
165
193
 
166
- <div class="row mb-10">
194
+ <div
195
+ data-testid="input-security-runAsUser"
196
+ class="row mb-10"
197
+ >
167
198
  <div class="col span-6">
168
- <LabeledInput v-model.number="runAsUser" :label="t('workload.container.security.runAsUser')" :mode="mode" />
199
+ <LabeledInput
200
+ v-model.number="runAsUser"
201
+ :label="t('workload.container.security.runAsUser')"
202
+ :mode="mode"
203
+ @input="update"
204
+ />
169
205
  </div>
170
206
  </div>
171
207
 
172
208
  <div class="row">
173
- <div class="col span-6">
209
+ <div
210
+ data-testid="input-security-add"
211
+ class="col span-6"
212
+ >
174
213
  <LabeledSelect
175
214
  v-model="add"
176
215
  :taggable="true"
@@ -183,7 +222,10 @@ export default {
183
222
  @input="update"
184
223
  />
185
224
  </div>
186
- <div class="col span-6">
225
+ <div
226
+ data-testid="input-security-drop"
227
+ class="col span-6"
228
+ >
187
229
  <LabeledSelect
188
230
  v-model="drop"
189
231
  :close-on-select="false"
@@ -2,7 +2,7 @@
2
2
  import { get } from '@shell/utils/object';
3
3
  import LabeledFormElement from '@shell/mixins/labeled-form-element';
4
4
  import VueSelectOverrides from '@shell/mixins/vue-select-overrides';
5
- import LabeledTooltip from '@shell/components/form/LabeledTooltip';
5
+ import { LabeledTooltip } from '@components/LabeledTooltip';
6
6
  import { onClickOption, calculatePosition } from '@shell/utils/select';
7
7
 
8
8
  export default {
@@ -33,10 +33,6 @@ export default {
33
33
  default: 'label',
34
34
  type: String,
35
35
  },
36
- options: {
37
- default: null,
38
- type: Array,
39
- },
40
36
  placement: {
41
37
  default: null,
42
38
  type: String,
@@ -69,10 +65,6 @@ export default {
69
65
  default: true,
70
66
  },
71
67
 
72
- searchable: {
73
- default: false,
74
- type: Boolean,
75
- },
76
68
  status: {
77
69
  type: String,
78
70
  default: null,
@@ -147,11 +139,51 @@ export default {
147
139
  return get(opt, opt.optionKey);
148
140
  }
149
141
 
150
- return this.getOptionLabel(opt);
142
+ const label = this.getOptionLabel(opt);
143
+
144
+ // label may be type of object
145
+ if (typeof label === 'string' || typeof label === 'number') {
146
+ return label;
147
+ } else {
148
+ return Math.random(100000);
149
+ }
151
150
  },
152
151
  report(e) {
153
152
  alert(e);
154
153
  }
154
+ },
155
+ computed: {
156
+ requiredField() {
157
+ // using "any" for a type on "rule" here is dirty but the use of the optional chaining operator makes it safe for what we're doing here.
158
+ return (this.required || this.rules.some(rule => rule?.name === 'required'));
159
+ },
160
+ validationMessage() {
161
+ // we want to grab the required rule passed in if we can but if it's not there then we can just grab it from the formRulesGenerator
162
+ const requiredRule = this.rules.find(rule => rule?.name === 'required');
163
+ const ruleMessages = [];
164
+ const value = this?.value;
165
+
166
+ if (requiredRule && this.blurred && !this.focused) {
167
+ const message = requiredRule(value);
168
+
169
+ if (!!message) {
170
+ return message;
171
+ }
172
+ }
173
+
174
+ for (const rule of this.rules) {
175
+ const message = rule(value);
176
+
177
+ if (!!message && rule.name !== 'required') { // we're catching 'required' above so we can ignore it here
178
+ ruleMessages.push(message);
179
+ }
180
+ }
181
+ if (ruleMessages.length > 0 && (this.blurred || this.focused)) {
182
+ return ruleMessages.join(', ');
183
+ } else {
184
+ return undefined;
185
+ }
186
+ }
155
187
  }
156
188
  };
157
189
  </script>
@@ -213,6 +245,11 @@ export default {
213
245
  :value="tooltip"
214
246
  :status="status"
215
247
  />
248
+ <LabeledTooltip
249
+ v-if="!!validationMessage"
250
+ :hover="hoverTooltip"
251
+ :value="validationMessage"
252
+ />
216
253
  </div>
217
254
  </template>
218
255
 
@@ -226,6 +263,11 @@ export default {
226
263
  }
227
264
  }
228
265
 
266
+ ::v-deep .labeled-tooltip.error .status-icon {
267
+ top: 7px;
268
+ right: 2px;
269
+ }
270
+
229
271
  ::v-deep .vs__selected-options {
230
272
  display: flex;
231
273
 
@@ -1,20 +1,17 @@
1
1
  <script>
2
2
  import { _EDIT } from '@shell/config/query-params';
3
3
  import Loading from '@shell/components/Loading';
4
- import LabeledInput from '@shell/components/form/LabeledInput';
4
+ import { LabeledInput } from '@components/Form/LabeledInput';
5
5
  import LabeledSelect from '@shell/components/form/LabeledSelect';
6
- import { NORMAN, SECRET } from '@shell/config/types';
6
+ import { AUTH_TYPE, NORMAN, SECRET } from '@shell/config/types';
7
7
  import { SECRET_TYPES } from '@shell/config/secret';
8
8
  import { base64Encode } from '@shell/utils/crypto';
9
9
  import { addObjects, insertAt } from '@shell/utils/array';
10
10
  import { sortBy } from '@shell/utils/sort';
11
11
 
12
- const _NONE = '_none';
13
- const _BASIC = '_basic';
14
- const _SSH = '_ssh';
15
- const _S3 = '_S3';
16
-
17
12
  export default {
13
+ name: 'SelectOrCreateAuthSecret',
14
+
18
15
  components: {
19
16
  Loading,
20
17
  LabeledInput,
@@ -27,6 +24,11 @@ export default {
27
24
  default: _EDIT,
28
25
  },
29
26
 
27
+ preSelect: {
28
+ type: Object,
29
+ default: null,
30
+ },
31
+
30
32
  value: {
31
33
  type: [String, Object],
32
34
  default: null,
@@ -106,6 +108,19 @@ export default {
106
108
  type: Boolean,
107
109
  default: false,
108
110
  },
111
+
112
+ /**
113
+ * This component is used in MultiStep Priocess
114
+ * So when user click through to final step and submit the form
115
+ * This component get recreated therefore register `doCreate` as a hook each time
116
+ * Also, the parent step component is not aware that credential is created
117
+ *
118
+ * This property is implement to prevent this issue and delegate it to parent component.
119
+ */
120
+ delegateCreateToParent: {
121
+ type: Boolean,
122
+ default: false
123
+ }
109
124
  },
110
125
 
111
126
  async fetch() {
@@ -131,7 +146,12 @@ export default {
131
146
  this.allCloudCreds = [];
132
147
  }
133
148
 
134
- let selected = _NONE;
149
+ let selected = this.preSelect?.selected || AUTH_TYPE._NONE;
150
+
151
+ if ( !this.value ) {
152
+ this.publicKey = this.preSelect?.publicKey || '';
153
+ this.privateKey = this.preSelect?.privateKey || '';
154
+ }
135
155
 
136
156
  if ( this.value ) {
137
157
  if ( typeof this.value === 'object' ) {
@@ -164,15 +184,15 @@ export default {
164
184
 
165
185
  computed: {
166
186
  _SSH() {
167
- return _SSH;
187
+ return AUTH_TYPE._SSH;
168
188
  },
169
189
 
170
190
  _BASIC() {
171
- return _BASIC;
191
+ return AUTH_TYPE._BASIC;
172
192
  },
173
193
 
174
194
  _S3() {
175
- return _S3;
195
+ return AUTH_TYPE._S3;
176
196
  },
177
197
 
178
198
  options() {
@@ -211,7 +231,7 @@ export default {
211
231
  return true;
212
232
  }).map((x) => {
213
233
  return {
214
- label: `${ x.metadata.name } (${ x.subTypeDisplay })`,
234
+ label: `${ x.metadata.name } (${ x.subTypeDisplay }: ${ x.dataPreview })`,
215
235
  group: x.metadata.namespace,
216
236
  value: x.id,
217
237
  };
@@ -263,28 +283,28 @@ export default {
263
283
  if ( this.allowSsh ) {
264
284
  out.unshift({
265
285
  label: this.t('selectOrCreateAuthSecret.createSsh'),
266
- value: _SSH,
286
+ value: AUTH_TYPE._SSH,
267
287
  });
268
288
  }
269
289
 
270
290
  if ( this.allowS3 ) {
271
291
  out.unshift({
272
292
  label: this.t('selectOrCreateAuthSecret.createS3'),
273
- value: _S3,
293
+ value: AUTH_TYPE._S3,
274
294
  });
275
295
  }
276
296
 
277
297
  if ( this.allowBasic ) {
278
298
  out.unshift({
279
299
  label: this.t('selectOrCreateAuthSecret.createBasic'),
280
- value: _BASIC,
300
+ value: AUTH_TYPE._BASIC,
281
301
  });
282
302
  }
283
303
 
284
304
  if ( this.allowNone ) {
285
305
  out.unshift({
286
306
  label: this.t('generic.none'),
287
- value: _NONE,
307
+ value: AUTH_TYPE._NONE,
288
308
  });
289
309
  }
290
310
 
@@ -296,7 +316,7 @@ export default {
296
316
  return '';
297
317
  }
298
318
 
299
- if ( this.selected === _SSH || this.selected === _BASIC || this.selected === _S3 ) {
319
+ if ( this.selected === AUTH_TYPE._SSH || this.selected === AUTH_TYPE._BASIC || this.selected === AUTH_TYPE._S3 ) {
300
320
  return 'col span-4';
301
321
  }
302
322
 
@@ -313,11 +333,13 @@ export default {
313
333
  },
314
334
 
315
335
  watch: {
316
- selected: 'update',
336
+ selected: 'update',
337
+ publicKey: 'updateKeyVal',
338
+ privateKey: 'updateKeyVal',
317
339
 
318
340
  namespace(ns) {
319
341
  if ( ns && !this.selected.startsWith(`${ ns }/`) ) {
320
- this.selected = _NONE;
342
+ this.selected = AUTH_TYPE._NONE;
321
343
  }
322
344
  }
323
345
  },
@@ -326,15 +348,30 @@ export default {
326
348
  if (this.registerBeforeHook) {
327
349
  const hookName = this.appendUniqueIdToHook ? this.hookName + this.uniqueId : this.hookName;
328
350
 
329
- this.registerBeforeHook(this.doCreate, hookName, this.hookPriority);
351
+ if (!this.delegateCreateToParent) {
352
+ this.registerBeforeHook(this.doCreate, hookName, this.hookPriority);
353
+ }
330
354
  } else {
331
355
  throw new Error('Before Hook is missing');
332
356
  }
333
357
  },
334
358
 
335
359
  methods: {
360
+ updateKeyVal() {
361
+ if ( ![AUTH_TYPE._SSH, AUTH_TYPE._BASIC, AUTH_TYPE._S3].includes(this.selected)) {
362
+ this.privateKey = '';
363
+ this.publicKey = '';
364
+ }
365
+
366
+ this.$emit('inputauthval', {
367
+ selected: this.selected,
368
+ privateKey: this.privateKey,
369
+ publicKey: this.publicKey
370
+ });
371
+ },
372
+
336
373
  update() {
337
- if ( !this.selected || [_SSH, _BASIC, _S3, _NONE].includes(this.selected) ) {
374
+ if ( (!this.selected || [AUTH_TYPE._SSH, AUTH_TYPE._BASIC, AUTH_TYPE._S3, AUTH_TYPE._NONE].includes(this.selected))) {
338
375
  this.$emit('input', null);
339
376
  } else if ( this.selected.includes(':') ) {
340
377
  // Cloud creds
@@ -353,16 +390,18 @@ export default {
353
390
  this.$emit('input', out);
354
391
  }
355
392
  }
393
+
394
+ this.updateKeyVal();
356
395
  },
357
396
 
358
397
  async doCreate() {
359
- if ( ![_SSH, _BASIC, _S3].includes(this.selected) ) {
398
+ if ( ![AUTH_TYPE._SSH, AUTH_TYPE._BASIC, AUTH_TYPE._S3].includes(this.selected) || this.delegateCreateToParent ) {
360
399
  return;
361
400
  }
362
401
 
363
402
  let secret;
364
403
 
365
- if ( this.selected === _S3 ) {
404
+ if ( this.selected === AUTH_TYPE._S3 ) {
366
405
  secret = await this.$store.dispatch(`rancher/create`, {
367
406
  type: NORMAN.CLOUD_CREDENTIAL,
368
407
  s3credentialConfig: {
@@ -382,12 +421,12 @@ export default {
382
421
  let type, publicField, privateField;
383
422
 
384
423
  switch ( this.selected ) {
385
- case _SSH:
424
+ case AUTH_TYPE._SSH:
386
425
  type = SECRET_TYPES.SSH;
387
426
  publicField = 'ssh-publickey';
388
427
  privateField = 'ssh-privatekey';
389
428
  break;
390
- case _BASIC:
429
+ case AUTH_TYPE._BASIC:
391
430
  type = SECRET_TYPES.BASIC;
392
431
  publicField = 'username';
393
432
  privateField = 'password';
@@ -442,26 +481,26 @@ export default {
442
481
  </div>
443
482
  <template v-if="selected === _SSH">
444
483
  <div :class="moreCols">
445
- <LabeledInput v-model="publicKey" type="multiline" label-key="selectOrCreateAuthSecret.ssh.publicKey" />
484
+ <LabeledInput v-model="publicKey" :mode="mode" type="multiline" label-key="selectOrCreateAuthSecret.ssh.publicKey" />
446
485
  </div>
447
486
  <div :class="moreCols">
448
- <LabeledInput v-model="privateKey" type="multiline" label-key="selectOrCreateAuthSecret.ssh.privateKey" />
487
+ <LabeledInput v-model="privateKey" :mode="mode" type="multiline" label-key="selectOrCreateAuthSecret.ssh.privateKey" />
449
488
  </div>
450
489
  </template>
451
490
  <template v-else-if="selected === _BASIC">
452
491
  <div :class="moreCols">
453
- <LabeledInput v-model="publicKey" label-key="selectOrCreateAuthSecret.basic.username" />
492
+ <LabeledInput v-model="publicKey" :mode="mode" label-key="selectOrCreateAuthSecret.basic.username" />
454
493
  </div>
455
494
  <div :class="moreCols">
456
- <LabeledInput v-model="privateKey" type="password" label-key="selectOrCreateAuthSecret.basic.password" />
495
+ <LabeledInput v-model="privateKey" :mode="mode" type="password" label-key="selectOrCreateAuthSecret.basic.password" />
457
496
  </div>
458
497
  </template>
459
498
  <template v-else-if="selected === _S3">
460
499
  <div :class="moreCols">
461
- <LabeledInput v-model="publicKey" label-key="selectOrCreateAuthSecret.s3.accessKey" />
500
+ <LabeledInput v-model="publicKey" :mode="mode" label-key="selectOrCreateAuthSecret.s3.accessKey" />
462
501
  </div>
463
502
  <div :class="moreCols">
464
- <LabeledInput v-model="privateKey" type="password" label-key="selectOrCreateAuthSecret.s3.secretKey" />
503
+ <LabeledInput v-model="privateKey" :mode="mode" type="password" label-key="selectOrCreateAuthSecret.s3.secretKey" />
465
504
  </div>
466
505
  </template>
467
506
  </div>
@@ -1,7 +1,7 @@
1
1
  <script>
2
2
  import labeledFormElement from '@shell/mixins/labeled-form-element';
3
3
  import LabeledSelect from '@shell/components/form/LabeledSelect';
4
- import Banner from '@shell/components/Banner';
4
+ import { Banner } from '@components/Banner';
5
5
  import { _VIEW } from '@shell/config/query-params';
6
6
 
7
7
  export default {
@@ -4,9 +4,10 @@ import { _EDIT, _VIEW } from '@shell/config/query-params';
4
4
  import { removeAt } from '@shell/utils/array';
5
5
  import { clone } from '@shell/utils/object';
6
6
  import Select from '@shell/components/form/Select';
7
+ import Error from '@shell/components/form/Error';
7
8
 
8
9
  export default {
9
- components: { Select },
10
+ components: { Select, Error },
10
11
  props: {
11
12
  value: {
12
13
  type: Array,
@@ -27,6 +28,12 @@ export default {
27
28
  autoAddIfEmpty: {
28
29
  type: Boolean,
29
30
  default: true,
31
+ },
32
+ rules: {
33
+ default: () => [],
34
+ type: Array,
35
+ // we only want functions in the rules array
36
+ validator: rules => rules.every(rule => ['function'].includes(typeof rule))
30
37
  }
31
38
  },
32
39
 
@@ -182,7 +189,7 @@ export default {
182
189
  <span v-if="isView">{{ row.targetPort }}</span>
183
190
  <input
184
191
  v-else
185
- v-model.number="row.targetPort"
192
+ v-model="row.targetPort"
186
193
  :placeholder="t('servicePorts.rules.target.placeholder')"
187
194
  @input="queueUpdate"
188
195
  />
@@ -204,6 +211,7 @@ export default {
204
211
  <t k="generic.remove" />
205
212
  </button>
206
213
  </div>
214
+ <Error :value="{...row, idx}" :rules="rules" />
207
215
  </div>
208
216
  </div>
209
217
  <div v-if="showAdd" class="footer">
@@ -1,5 +1,5 @@
1
1
  <script>
2
- import LabeledInput from '@shell/components/form/LabeledInput';
2
+ import { LabeledInput } from '@components/Form/LabeledInput';
3
3
 
4
4
  export default {
5
5
  components: { LabeledInput },
@@ -135,7 +135,7 @@ export default {
135
135
  :options="secretNames"
136
136
  :label="secretNameLabel"
137
137
  :mode="mode"
138
- @input="updateSecretName(name)"
138
+ @selecting="updateSecretName(name)"
139
139
  />
140
140
  <LabeledSelect
141
141
  v-model="key"
@@ -144,7 +144,7 @@ export default {
144
144
  :options="keys"
145
145
  :label="keyNameLabel"
146
146
  :mode="mode"
147
- @input="updateSecretKey(key)"
147
+ @selecting="updateSecretKey(key)"
148
148
  />
149
149
  </div>
150
150
  </div>
@@ -1,6 +1,6 @@
1
1
  <script>
2
2
  import { mapGetters } from 'vuex';
3
- import LabeledInput from '@shell/components/form/LabeledInput';
3
+ import { LabeledInput } from '@components/Form/LabeledInput';
4
4
  import Select from '@shell/components/form/Select';
5
5
  import UnitInput from '@shell/components/form/UnitInput';
6
6
  import { _VIEW } from '@shell/config/query-params';
@@ -1,6 +1,6 @@
1
1
  <script>
2
2
  import { parseSi, formatSi, UNITS, FRACTIONAL } from '@shell/utils/units';
3
- import LabeledInput from '@shell/components/form/LabeledInput';
3
+ import { LabeledInput } from '@components/Form/LabeledInput';
4
4
  import { _EDIT } from '@shell/config/query-params';
5
5
 
6
6
  export default {
@@ -125,7 +125,7 @@ export default {
125
125
  */
126
126
  delay: {
127
127
  type: Number,
128
- default: 500
128
+ default: 0
129
129
  }
130
130
  },
131
131
 
@@ -183,6 +183,14 @@ export default {
183
183
  },
184
184
 
185
185
  methods: {
186
+ focus() {
187
+ const comp = this.$refs.value;
188
+
189
+ if (comp) {
190
+ comp.focus();
191
+ }
192
+ },
193
+
186
194
  update(inputValue) {
187
195
  let out = inputValue === '' ? null : inputValue;
188
196
 
@@ -202,6 +210,7 @@ export default {
202
210
 
203
211
  <template>
204
212
  <LabeledInput
213
+ ref="value"
205
214
  :value="displayValue"
206
215
  v-bind="$attrs"
207
216
  type="number"
@@ -215,7 +224,7 @@ export default {
215
224
  :required="required"
216
225
  :placeholder="placeholder"
217
226
  :hide-arrows="hideArrows"
218
- @input="update($event)"
227
+ @blur="update($event.target.value)"
219
228
  >
220
229
  <template #suffix>
221
230
  <div
@@ -3,7 +3,7 @@ import { CONFIG_MAP, SECRET, NAMESPACE } from '@shell/config/types';
3
3
  import { get } from '@shell/utils/object';
4
4
  import { _VIEW } from '@shell/config/query-params';
5
5
  import LabeledSelect from '@shell/components/form/LabeledSelect';
6
- import LabeledInput from '@shell/components/form/LabeledInput';
6
+ import { LabeledInput } from '@components/Form/LabeledInput';
7
7
 
8
8
  export default {
9
9
  components: {
@@ -4,7 +4,7 @@ import debounce from 'lodash/debounce';
4
4
  import { _EDIT, _VIEW } from '@shell/config/query-params';
5
5
  import { removeAt, findBy } from '@shell/utils/array';
6
6
  import { clone } from '@shell/utils/object';
7
- import LabeledInput from '@shell/components/form/LabeledInput';
7
+ import { LabeledInput } from '@components/Form/LabeledInput';
8
8
  import LabeledSelect from '@shell/components/form/LabeledSelect';
9
9
  import { HCI as HCI_LABELS_ANNOTATIONS } from '@shell/config/labels-annotations';
10
10
  import { isHarvesterSatisfiesVersion } from '@shell/utils/cluster';