@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
@@ -95,9 +95,12 @@ export default {
95
95
  this.errors = [];
96
96
 
97
97
  // If the chart doesn't contain system `systemDefaultRegistry` properties there's no point applying them
98
- this.clusterRegistry = await this.getClusterRegistry();
99
- this.globalRegistry = await this.getGlobalRegistry();
100
- this.defaultRegistrySetting = this.clusterRegistry || this.globalRegistry;
98
+ if (this.showCustomRegistry) {
99
+ // Note: Cluster scoped registry is only supported for node driver clusters
100
+ this.clusterRegistry = await this.getClusterRegistry();
101
+ this.globalRegistry = await this.getGlobalRegistry();
102
+ this.defaultRegistrySetting = this.clusterRegistry || this.globalRegistry;
103
+ }
101
104
 
102
105
  this.serverUrlSetting = await this.$store.dispatch('management/find', {
103
106
  type: MANAGEMENT.SETTING,
@@ -282,13 +285,20 @@ export default {
282
285
  */
283
286
  this.chartValues = merge(merge({}, this.versionInfo?.values || {}), userValues);
284
287
 
285
- const existingRegistry = this.chartValues?.global?.systemDefaultRegistry || this.chartValues?.global?.cattle?.systemDefaultRegistry;
288
+ if (this.showCustomRegistry) {
289
+ /**
290
+ * The input to configure the registry should never be
291
+ * shown for third-party charts, which don't have Rancher
292
+ * global values.
293
+ */
294
+ const existingRegistry = this.chartValues?.global?.systemDefaultRegistry || this.chartValues?.global?.cattle?.systemDefaultRegistry;
286
295
 
287
- delete this.chartValues?.global?.systemDefaultRegistry;
288
- delete this.chartValues?.global?.cattle?.systemDefaultRegistry;
296
+ delete this.chartValues?.global?.systemDefaultRegistry;
297
+ delete this.chartValues?.global?.cattle?.systemDefaultRegistry;
289
298
 
290
- this.customRegistrySetting = existingRegistry || this.defaultRegistrySetting;
291
- this.showCustomRegistryInput = !!this.customRegistrySetting;
299
+ this.customRegistrySetting = existingRegistry || this.defaultRegistrySetting;
300
+ this.showCustomRegistryInput = !!this.customRegistrySetting;
301
+ }
292
302
 
293
303
  /* Serializes an object as a YAML document */
294
304
  this.valuesYaml = saferDump(this.chartValues);
@@ -522,6 +532,10 @@ export default {
522
532
  return this.formYamlOption === VALUES_STATE.YAML || ( !this.valuesComponent && !this.hasQuestions );
523
533
  },
524
534
 
535
+ showingYamlDiff() {
536
+ return this.formYamlOption === VALUES_STATE.DIFF;
537
+ },
538
+
525
539
  formYamlOptions() {
526
540
  const options = [];
527
541
 
@@ -660,6 +674,22 @@ export default {
660
674
  return null;
661
675
  },
662
676
 
677
+ /**
678
+ * Check if the chart contains `systemDefaultRegistry` properties.
679
+ * If not we shouldn't apply the setting, because if the option
680
+ * is exposed for third-party Helm charts, it confuses users because
681
+ * it shows a private registry setting that is never used
682
+ * by the chart they are installing. If not hidden, the setting
683
+ * does nothing, and if the user changes it, it will look like
684
+ * there is a bug in the UI when it doesn't work, because UI is
685
+ * exposing a feature that the chart does not have.
686
+ */
687
+ showCustomRegistry() {
688
+ const global = this.versionInfo?.values?.global || {};
689
+
690
+ return global.systemDefaultRegistry !== undefined || global.cattle?.systemDefaultRegistry !== undefined;
691
+ },
692
+
663
693
  },
664
694
 
665
695
  watch: {
@@ -763,7 +793,7 @@ export default {
763
793
 
764
794
  if (hasPermissionToSeeProvCluster) {
765
795
  const mgmCluster = this.$store.getters['currentCluster'];
766
- const provCluster = mgmCluster ? await this.$store.dispatch('management/find', {
796
+ const provCluster = mgmCluster?.provClusterId ? await this.$store.dispatch('management/find', {
767
797
  type: CAPI.RANCHER_CLUSTER,
768
798
  id: mgmCluster.provClusterId
769
799
  }) : {};
@@ -976,8 +1006,11 @@ export default {
976
1006
 
977
1007
  setIfNotSet(cattle, 'clusterId', cluster?.id);
978
1008
  setIfNotSet(cattle, 'clusterName', cluster?.nameDisplay);
979
- set(cattle, 'systemDefaultRegistry', this.customRegistrySetting);
980
- set(global, 'systemDefaultRegistry', this.customRegistrySetting);
1009
+
1010
+ if (this.showCustomRegistry) {
1011
+ set(cattle, 'systemDefaultRegistry', this.customRegistrySetting);
1012
+ set(global, 'systemDefaultRegistry', this.customRegistrySetting);
1013
+ }
981
1014
 
982
1015
  setIfNotSet(global, 'cattle.systemProjectId', systemProjectId);
983
1016
  setIfNotSet(cattle, 'url', serverUrl);
@@ -1062,7 +1095,7 @@ export default {
1062
1095
 
1063
1096
  const errors = [];
1064
1097
 
1065
- if ( this.showingYaml ) {
1098
+ if ( this.showingYaml || this.showingYamlDiff ) {
1066
1099
  const { errors: yamlErrors } = this.applyYamlToValues();
1067
1100
 
1068
1101
  errors.push(...yamlErrors);
@@ -1316,13 +1349,15 @@ export default {
1316
1349
  color="info"
1317
1350
  class="description"
1318
1351
  >
1319
- <span>{{ step1Description }}</span>
1320
- <span
1321
- v-if="namespaceNewAllowed"
1322
- class="mt-10"
1323
- >
1324
- {{ t('catalog.install.steps.basics.nsCreationDescription', {}, true) }}
1325
- </span>
1352
+ <div>
1353
+ <span>{{ step1Description }}</span>
1354
+ <span
1355
+ v-if="namespaceNewAllowed"
1356
+ class="mt-10"
1357
+ >
1358
+ {{ t('catalog.install.steps.basics.nsCreationDescription', {}, true) }}
1359
+ </span>
1360
+ </div>
1326
1361
  </Banner>
1327
1362
  <div
1328
1363
  v-if="requires.length || warnings.length"
@@ -1417,6 +1452,7 @@ export default {
1417
1452
  />
1418
1453
 
1419
1454
  <Checkbox
1455
+ v-if="showCustomRegistry"
1420
1456
  v-model="showCustomRegistryInput"
1421
1457
  class="mb-20"
1422
1458
  :label="t('catalog.chart.registry.custom.checkBoxLabel')"
@@ -1440,10 +1476,11 @@ export default {
1440
1476
  &nbsp;
1441
1477
  </div>
1442
1478
  <Banner
1443
- v-if="isNamespaceNew"
1479
+ v-if="isNamespaceNew && value.metadata.namespace.length"
1444
1480
  color="info"
1445
- v-html="t('catalog.install.steps.basics.createNamespace', {namespace: value.metadata.namespace}, true) "
1446
- />
1481
+ >
1482
+ <div v-html="t('catalog.install.steps.basics.createNamespace', {namespace: value.metadata.namespace}, true) " />
1483
+ </Banner>
1447
1484
  </div>
1448
1485
  </template>
1449
1486
  <template #clusterTplVersion>
@@ -19,6 +19,12 @@ export default {
19
19
  // Ensure we re-evaluate the redirect in case this auth provider has been disabled
20
20
  const authProvs = await authProvidersInfo(this.$store);
21
21
 
22
+ // Nuxt does not remove it's loading indicator - if we are not changing route, then hide it
23
+ // https://nuxtjs.org/docs/features/loading/
24
+ if (authProvs.enabledLocation) {
25
+ this.$nuxt.$loading.finish();
26
+ }
27
+
22
28
  next(!authProvs.enabledLocation);
23
29
  } else {
24
30
  next();
@@ -91,12 +91,14 @@ export default {
91
91
  :label="t('authConfig.noneEnabled')"
92
92
  color="info"
93
93
  >
94
- {{ t('authConfig.localEnabled') }}
95
- <nuxt-link :to="localUsersRoute">
96
- {{ t('authConfig.manageLocal') }}
97
- </nuxt-link>
98
- <br>
99
- {{ t('authConfig.noneEnabled') }}
94
+ <div>
95
+ {{ t('authConfig.localEnabled') }}
96
+ <nuxt-link :to="localUsersRoute">
97
+ {{ t('authConfig.manageLocal') }}
98
+ </nuxt-link>
99
+ <br>
100
+ {{ t('authConfig.noneEnabled') }}
101
+ </div>
100
102
  </Banner>
101
103
  <SelectIconGrid
102
104
  :rows="rows"
@@ -78,7 +78,7 @@ export default {
78
78
  <div>
79
79
  <div>
80
80
  <div class="masthead">
81
- <header class="header-layout">
81
+ <header>
82
82
  <div class="title">
83
83
  <h1 class="m-0">
84
84
  {{ t('authGroups.assignEdit.assignTitle') }}
@@ -156,7 +156,7 @@ export default {
156
156
  <template>
157
157
  <Loading v-if="!globalRoles || !roleTemplates" />
158
158
  <div v-else>
159
- <header class="header-layout">
159
+ <header>
160
160
  <div class="title">
161
161
  <h1 class="m-0">
162
162
  {{ t('rbac.roletemplate.label') }}
@@ -40,6 +40,9 @@ import { isEmpty } from '@shell/utils/object';
40
40
  import ConfigBadge from './ConfigBadge';
41
41
  import EventsTable from './EventsTable';
42
42
  import { fetchClusterResources } from './explorer-utils';
43
+ import SimpleBox from '@shell/components/SimpleBox';
44
+ import { ExtensionPoint, CardLocation } from '@shell/core/types';
45
+ import { getApplicableExtensionEnhancements } from '@shell/core/plugin-helpers';
43
46
 
44
47
  export const RESOURCES = [NAMESPACE, INGRESS, PV, WORKLOAD_TYPES.DEPLOYMENT, WORKLOAD_TYPES.STATEFUL_SET, WORKLOAD_TYPES.JOB, WORKLOAD_TYPES.DAEMON_SET, SERVICE];
45
48
 
@@ -71,6 +74,7 @@ export default {
71
74
  EmberPage,
72
75
  ConfigBadge,
73
76
  EventsTable,
77
+ SimpleBox,
74
78
  },
75
79
 
76
80
  mixins: [metricPoller],
@@ -126,6 +130,7 @@ export default {
126
130
  ETCD_METRICS_SUMMARY_URL,
127
131
  clusterCounts,
128
132
  selectedTab: 'cluster-events',
133
+ extensionCards: getApplicableExtensionEnhancements(this, ExtensionPoint.CARD, CardLocation.CLUSTER_DASHBOARD_CARD, this.$route),
129
134
  };
130
135
  },
131
136
 
@@ -247,9 +252,12 @@ export default {
247
252
  },
248
253
 
249
254
  cpuReserved() {
255
+ const total = parseSi(this.currentCluster?.status?.allocatable?.cpu);
256
+
250
257
  return {
251
- total: parseSi(this.currentCluster?.status?.allocatable?.cpu),
252
- useful: parseSi(this.currentCluster?.status?.requested?.cpu)
258
+ total,
259
+ useful: parseSi(this.currentCluster?.status?.requested?.cpu),
260
+ units: this.t('clusterIndexPage.hardwareResourceGauge.units.cores', { count: total })
253
261
  };
254
262
  },
255
263
 
@@ -308,9 +316,12 @@ export default {
308
316
  },
309
317
 
310
318
  cpuUsed() {
319
+ const total = parseSi(this.currentCluster?.status?.capacity?.cpu);
320
+
311
321
  return {
312
- total: parseSi(this.currentCluster?.status?.capacity?.cpu),
313
- useful: this.metricAggregations?.cpu
322
+ total,
323
+ useful: this.metricAggregations?.cpu,
324
+ units: this.t('clusterIndexPage.hardwareResourceGauge.units.cores', { count: total })
314
325
  };
315
326
  },
316
327
 
@@ -394,7 +405,7 @@ export default {
394
405
 
395
406
  <template>
396
407
  <section class="dashboard">
397
- <header class="header-layout">
408
+ <header>
398
409
  <div class="title">
399
410
  <h1>
400
411
  <t k="clusterIndexPage.header" />
@@ -486,6 +497,27 @@ export default {
486
497
  />
487
498
  </div>
488
499
 
500
+ <!-- extension cards -->
501
+ <div
502
+ v-if="extensionCards.length"
503
+ class="extension-card-container mt-20"
504
+ >
505
+ <SimpleBox
506
+ v-for="item, i in extensionCards"
507
+ :key="`extensionCards${i}`"
508
+ class="extension-card"
509
+ :style="item.style"
510
+ >
511
+ <h3>
512
+ {{ item.label }}
513
+ </h3>
514
+ <component
515
+ :is="item.component"
516
+ :resource="currentCluster"
517
+ />
518
+ </SimpleBox>
519
+ </div>
520
+
489
521
  <h3
490
522
  v-if="!hasV1Monitoring && hasStats"
491
523
  class="mt-40"
@@ -504,6 +536,7 @@ export default {
504
536
  :name="t('clusterIndexPage.hardwareResourceGauge.cores')"
505
537
  :reserved="cpuReserved"
506
538
  :used="cpuUsed"
539
+ :units="cpuReserved.units"
507
540
  />
508
541
  <HardwareResourceGauge
509
542
  :name="t('clusterIndexPage.hardwareResourceGauge.ram')"
@@ -624,6 +657,19 @@ export default {
624
657
  </template>
625
658
 
626
659
  <style lang="scss" scoped>
660
+ .extension-card-container {
661
+ display: grid;
662
+ grid-template-columns: repeat(auto-fit, minmax(calc((100%/3) - 40px), 1fr));
663
+ grid-column-gap: 15px;
664
+ grid-row-gap: 20px;
665
+ }
666
+
667
+ @media only screen and (max-width: map-get($breakpoints, "--viewport-9")) {
668
+ .extension-card-container {
669
+ grid-template-columns: 1fr !important;
670
+ }
671
+ }
672
+
627
673
  .cluster-dashboard-glance {
628
674
  border-top: 1px solid var(--border);
629
675
  border-bottom: 1px solid var(--border);
@@ -712,7 +758,6 @@ export default {
712
758
 
713
759
  > I {
714
760
  text-align: center;
715
- font-size: 20px;
716
761
  padding: 5px 10px;
717
762
  border-right: 1px solid var(--border);
718
763
  }
@@ -39,7 +39,7 @@ export default {
39
39
 
40
40
  <template>
41
41
  <section>
42
- <header class="header-layout row">
42
+ <header class="row">
43
43
  <div class="col span-12">
44
44
  <h1>
45
45
  <t k="longhorn.overview.title" />
@@ -156,7 +156,7 @@ export default {
156
156
  // being saved. Therefore we take the save from the
157
157
  // AlertmanagerConfig resource and pass it into the
158
158
  // receiver config form.
159
- saveOverride(buttonDone) {
159
+ async saveOverride(buttonDone) {
160
160
  if (this.alertmanagerConfigResource.yamlError) {
161
161
  this.alertmanagerConfigResource.errors = this.alertmanagerConfigResource.errors || [];
162
162
  this.alertmanagerConfigResource.errors.push(this.alertmanagerConfigResource.yamlError);
@@ -166,8 +166,18 @@ export default {
166
166
  return;
167
167
  }
168
168
 
169
- this.alertmanagerConfigResource.save(...arguments);
170
- this.redirectToAlertmanagerConfigDetail();
169
+ try {
170
+ await this.alertmanagerConfigResource.save(...arguments);
171
+
172
+ buttonDone(true);
173
+
174
+ this.redirectToAlertmanagerConfigDetail();
175
+ } catch (e) {
176
+ const msg = e?.message ? e.message : this.t('monitoring.alertmanagerConfig.error');
177
+
178
+ this.$refs.config.setError(msg);
179
+ buttonDone(false);
180
+ }
171
181
  },
172
182
  handleButtonGroupClick(event) {
173
183
  if (event === this.yaml) {
@@ -226,7 +236,7 @@ export default {
226
236
 
227
237
  <template>
228
238
  <div>
229
- <header class="header-layout header">
239
+ <header class="header">
230
240
  <div class="title">
231
241
  <div class="primaryheader">
232
242
  <h1>
@@ -271,6 +281,7 @@ export default {
271
281
  />
272
282
  <ReceiverConfig
273
283
  v-if="(currentView === config || currentView === detail) && alertmanagerConfigResource"
284
+ ref="config"
274
285
  :value="receiverValue"
275
286
  :mode="mode"
276
287
  :alertmanager-config-id="alertmanagerConfigId"
@@ -140,7 +140,7 @@ export default {
140
140
 
141
141
  <template>
142
142
  <section>
143
- <header class="header-layout row">
143
+ <header class="row">
144
144
  <div class="col span-12">
145
145
  <h1>
146
146
  <t k="monitoring.overview.title" />
@@ -37,7 +37,7 @@ export default {
37
37
 
38
38
  <template>
39
39
  <section>
40
- <header class="header-layout row">
40
+ <header class="row">
41
41
  <div class="col span-12">
42
42
  <h1>
43
43
  <t k="neuvector.overview.title" />
@@ -133,7 +133,7 @@ export default {
133
133
  <p>{{ t('performance.manualRefresh.description') }}</p>
134
134
  <Banner
135
135
  color="error"
136
- label-key="performance.manualRefresh.banner"
136
+ label-key="performance.experimental"
137
137
  />
138
138
  <Checkbox
139
139
  v-model="value.manualRefresh.enabled"
@@ -163,7 +163,7 @@ export default {
163
163
  <p>{{ t('performance.gc.description') }}</p>
164
164
  <Banner
165
165
  color="error"
166
- label-key="performance.gc.banner"
166
+ label-key="performance.experimental"
167
167
  />
168
168
  <Checkbox
169
169
  v-model="value.garbageCollection.enabled"
@@ -237,6 +237,52 @@ export default {
237
237
  </div>
238
238
  </div>
239
239
  </div>
240
+ <!-- Force NS filter -->
241
+ <div class="mt-40">
242
+ <h2>{{ t('performance.nsFiltering.label') }}</h2>
243
+ <p>{{ t('performance.nsFiltering.description') }}</p>
244
+ <Banner
245
+ color="error"
246
+ label-key="performance.experimental"
247
+ />
248
+ <Checkbox
249
+ v-model="value.forceNsFilter.enabled"
250
+ :mode="mode"
251
+ :label="t('performance.nsFiltering.checkboxLabel')"
252
+ class="mt-10 mb-20"
253
+ :primary="true"
254
+ />
255
+ <div class="ml-20">
256
+ <p :class="{ 'text-muted': !value.forceNsFilter.enabled }">
257
+ {{ t('performance.nsFiltering.count.description') }}
258
+ </p>
259
+ <LabeledInput
260
+ v-model="value.forceNsFilter.threshold"
261
+ :mode="mode"
262
+ :label="t('performance.nsFiltering.count.inputLabel')"
263
+ :disabled="!value.forceNsFilter.enabled"
264
+ class="input"
265
+ type="number"
266
+ min="0"
267
+ />
268
+ </div>
269
+ </div>
270
+ <!-- Advanced Websocket Worker -->
271
+ <div class="mt-40">
272
+ <h2>{{ t('performance.advancedWorker.label') }}</h2>
273
+ <p>{{ t('performance.advancedWorker.description') }}</p>
274
+ <Banner
275
+ color="error"
276
+ label-key="performance.experimental"
277
+ />
278
+ <Checkbox
279
+ v-model="value.advancedWorker.enabled"
280
+ :mode="mode"
281
+ :label="t('performance.advancedWorker.checkboxLabel')"
282
+ class="mt-10 mb-20"
283
+ :primary="true"
284
+ />
285
+ </div>
240
286
  </div>
241
287
  </div>
242
288
  <template v-for="err in errors">
@@ -181,12 +181,14 @@ export default {
181
181
  <div class="dialog-buttons mt-20">
182
182
  <button
183
183
  class="btn role-secondary"
184
+ data-testid="dev-install-ext-modal-cancel-btn"
184
185
  @click="closeDialog()"
185
186
  >
186
187
  {{ t('generic.cancel') }}
187
188
  </button>
188
189
  <AsyncButton
189
190
  mode="load"
191
+ data-testid="dev-install-ext-modal-install-btn"
190
192
  @click="loadPlugin"
191
193
  />
192
194
  </div>
@@ -243,6 +243,7 @@ export default {
243
243
  label-key="plugins.install.version"
244
244
  :options="versionOptions"
245
245
  class="version-selector mt-10"
246
+ data-testid="install-ext-modal-select-version"
246
247
  />
247
248
  <div v-else>
248
249
  {{ t('plugins.install.version') }} {{ version }}
@@ -252,12 +253,14 @@ export default {
252
253
  <button
253
254
  :disabled="busy"
254
255
  class="btn role-secondary"
256
+ data-testid="install-ext-modal-cancel-btn"
255
257
  @click="closeDialog(false)"
256
258
  >
257
259
  {{ t('generic.cancel') }}
258
260
  </button>
259
261
  <AsyncButton
260
262
  :mode="buttonMode"
263
+ data-testid="install-ext-modal-install-btn"
261
264
  @click="install"
262
265
  />
263
266
  </div>
@@ -1,4 +1,5 @@
1
1
  <script>
2
+ import { mapGetters } from 'vuex';
2
3
  import ChartReadme from '@shell/components/ChartReadme';
3
4
  import { Banner } from '@components/Banner';
4
5
  import LazyImage from '@shell/components/LazyImage';
@@ -34,6 +35,18 @@ export default {
34
35
  };
35
36
  },
36
37
 
38
+ computed: {
39
+ ...mapGetters({ theme: 'prefs/theme' }),
40
+
41
+ applyDarkModeBg() {
42
+ if (this.theme === 'dark') {
43
+ return { 'dark-mode': true };
44
+ }
45
+
46
+ return {};
47
+ },
48
+ },
49
+
37
50
  methods: {
38
51
  show(info) {
39
52
  this.info = info;
@@ -100,10 +113,12 @@ export default {
100
113
  <div
101
114
  v-if="showSlideIn"
102
115
  class="glass"
116
+ data-testid="extension-details-bg"
103
117
  @click="hide()"
104
118
  />
105
119
  <div
106
120
  class="slideIn"
121
+ data-testid="extension-details"
107
122
  :class="{'hide': false, 'slideIn__show': showSlideIn}"
108
123
  >
109
124
  <div
@@ -111,7 +126,10 @@ export default {
111
126
  class="plugin-info-content"
112
127
  >
113
128
  <div class="plugin-header">
114
- <div class="plugin-icon">
129
+ <div
130
+ class="plugin-icon"
131
+ :class="applyDarkModeBg"
132
+ >
115
133
  <LazyImage
116
134
  v-if="info.icon"
117
135
  :initial-src="defaultIcon"
@@ -126,7 +144,10 @@ export default {
126
144
  >
127
145
  </div>
128
146
  <div class="plugin-title">
129
- <h2 class="slideIn__header">
147
+ <h2
148
+ class="slideIn__header"
149
+ data-testid="extension-details-title"
150
+ >
130
151
  {{ info.name }}
131
152
  </h2>
132
153
  <p class="plugin-description">
@@ -137,6 +158,7 @@ export default {
137
158
  <div class="slideIn__header__buttons">
138
159
  <div
139
160
  class="slideIn__header__button"
161
+ data-testid="extension-details-close"
140
162
  @click="showSlideIn = false"
141
163
  >
142
164
  <i class="icon icon-close" />
@@ -220,6 +242,7 @@ export default {
220
242
  position: fixed;
221
243
  top: 0;
222
244
  left: 0;
245
+ z-index: 1;
223
246
 
224
247
  $slideout-width: 35%;
225
248
  $title-height: 50px;
@@ -254,6 +277,10 @@ export default {
254
277
 
255
278
  transition: right .5s ease;
256
279
 
280
+ &__header {
281
+ text-transform: capitalize;
282
+ }
283
+
257
284
  .plugin-info-content {
258
285
  display: flex;
259
286
  flex-direction: column;
@@ -285,10 +312,23 @@ export default {
285
312
  font-size: 40px;
286
313
  margin-right:10px;
287
314
  color: #888;
315
+ width: 44px;
316
+ height: 44px;
317
+
318
+ &.dark-mode {
319
+ border-radius: calc(2 * var(--border-radius));
320
+ overflow: hidden;
321
+ background-color: white;
322
+ }
288
323
 
289
324
  .plugin-icon-img {
290
325
  height: 40px;
291
326
  width: 40px;
327
+ -o-object-fit: contain;
328
+ object-fit: contain;
329
+ position: relative;
330
+ top: 2px;
331
+ left: 2px;
292
332
  }
293
333
  }
294
334
 
@@ -107,6 +107,7 @@ export default {
107
107
  name="confirm-uiplugins-remove"
108
108
  :title="t('plugins.setup.remove.title')"
109
109
  mode="disable"
110
+ data-testid="disable-ext-modal"
110
111
  @okay="doRemove"
111
112
  >
112
113
  <template>
@@ -121,6 +122,7 @@ export default {
121
122
  v-model="removeRepo"
122
123
  :primary="true"
123
124
  label-key="plugins.setup.remove.registry.title"
125
+ data-testid="disable-ext-modal-remove-repo"
124
126
  />
125
127
  <div class="checkbox-info">
126
128
  {{ t('plugins.setup.remove.registry.prompt') }}
@@ -214,6 +214,7 @@ export default {
214
214
  :manual="true"
215
215
  :current-phase="buttonState"
216
216
  class="enable-plugin-support"
217
+ data-testid="extension-enable-operator"
217
218
  @click="enable"
218
219
  />
219
220
  </div>
@@ -84,12 +84,14 @@ export default {
84
84
  <button
85
85
  :disabled="busy"
86
86
  class="btn role-secondary"
87
+ data-testid="uninstall-ext-modal-cancel-btn"
87
88
  @click="closeDialog(false)"
88
89
  >
89
90
  {{ t('generic.cancel') }}
90
91
  </button>
91
92
  <AsyncButton
92
93
  mode="uninstall"
94
+ data-testid="uninstall-ext-modal-uninstall-btn"
93
95
  @click="uninstall()"
94
96
  />
95
97
  </div>