@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
@@ -103,6 +103,15 @@ export default {
103
103
 
104
104
  ...mapGetters({ uiplugins: 'uiplugins/plugins' }),
105
105
  ...mapGetters({ uiErrors: 'uiplugins/errors' }),
106
+ ...mapGetters({ theme: 'prefs/theme' }),
107
+
108
+ applyDarkModeBg() {
109
+ if (this.theme === 'dark') {
110
+ return { 'dark-mode': true };
111
+ }
112
+
113
+ return {};
114
+ },
106
115
 
107
116
  menuActions() {
108
117
  const menuActions = [];
@@ -483,10 +492,13 @@ export default {
483
492
  <template>
484
493
  <div class="plugins">
485
494
  <div class="plugin-header">
486
- <h2>{{ t('plugins.title') }}</h2>
495
+ <h2 data-testid="extensions-page-title">
496
+ {{ t('plugins.title') }}
497
+ </h2>
487
498
  <div
488
499
  v-if="reloadRequired"
489
500
  class="plugin-reload-banner mr-20"
501
+ data-testid="extension-reload-banner"
490
502
  >
491
503
  <i class="icon icon-checkmark mr-10" />
492
504
  <span>
@@ -494,6 +506,7 @@ export default {
494
506
  </span>
495
507
  <button
496
508
  class="ml-10 btn btn-sm role-primary"
509
+ data-testid="extension-reload-banner-reload-btn"
497
510
  @click="reload()"
498
511
  >
499
512
  {{ t('generic.reload') }}
@@ -505,6 +518,7 @@ export default {
505
518
  aria-haspopup="true"
506
519
  type="button"
507
520
  class="btn actions role-secondary"
521
+ data-testid="extensions-page-menu"
508
522
  @click="setMenu"
509
523
  >
510
524
  <i class="icon icon-actions" />
@@ -546,15 +560,18 @@ export default {
546
560
  <Tabbed
547
561
  ref="tabs"
548
562
  :tabs-only="true"
563
+ data-testid="extension-tabs"
549
564
  @changed="filterChanged"
550
565
  >
551
566
  <Tab
552
567
  name="installed"
568
+ data-testid="extension-tab-installed"
553
569
  label-key="plugins.tabs.installed"
554
570
  :weight="20"
555
571
  />
556
572
  <Tab
557
573
  name="available"
574
+ data-testid="extension-tab-available"
558
575
  label-key="plugins.tabs.available"
559
576
  :weight="19"
560
577
  />
@@ -597,9 +614,13 @@ export default {
597
614
  v-for="plugin in list"
598
615
  :key="plugin.name"
599
616
  class="plugin"
617
+ :data-testid="`extension-card-${plugin.name}`"
600
618
  @click="showPluginDetail(plugin)"
601
619
  >
602
- <div class="plugin-icon">
620
+ <div
621
+ class="plugin-icon"
622
+ :class="applyDarkModeBg"
623
+ >
603
624
  <LazyImage
604
625
  v-if="plugin.icon"
605
626
  :initial-src="defaultIcon"
@@ -697,6 +718,7 @@ export default {
697
718
  <button
698
719
  v-if="!plugin.builtin"
699
720
  class="btn role-secondary"
721
+ :data-testid="`extension-card-uninstall-btn-${plugin.name}`"
700
722
  @click="showUninstallDialog(plugin, $event)"
701
723
  >
702
724
  {{ t('plugins.uninstall.label') }}
@@ -704,6 +726,7 @@ export default {
704
726
  <button
705
727
  v-if="plugin.upgrade"
706
728
  class="btn role-secondary"
729
+ :data-testid="`extension-card-update-btn-${plugin.name}`"
707
730
  @click="showInstallDialog(plugin, 'update', $event)"
708
731
  >
709
732
  {{ t('plugins.update.label') }}
@@ -711,6 +734,7 @@ export default {
711
734
  <button
712
735
  v-if="!plugin.upgrade && plugin.versions.length > 1"
713
736
  class="btn role-secondary"
737
+ :data-testid="`extension-card-rollback-btn-${plugin.name}`"
714
738
  @click="showInstallDialog(plugin, 'rollback', $event)"
715
739
  >
716
740
  {{ t('plugins.rollback.label') }}
@@ -722,6 +746,7 @@ export default {
722
746
  >
723
747
  <button
724
748
  class="btn role-secondary"
749
+ :data-testid="`extension-card-install-btn-${plugin.name}`"
725
750
  @click="showInstallDialog(plugin, 'install', $event)"
726
751
  >
727
752
  {{ t('plugins.install.label') }}
@@ -781,7 +806,7 @@ export default {
781
806
 
782
807
  > i {
783
808
  color: var(--success);
784
- font-size: 20px;
809
+ font-size: 14px;
785
810
  font-weight: bold;
786
811
  }
787
812
 
@@ -841,10 +866,23 @@ export default {
841
866
  font-size: 40px;
842
867
  margin-right:10px;
843
868
  color: #888;
869
+ width: 44px;
870
+ height: 44px;
871
+
872
+ &.dark-mode {
873
+ border-radius: calc(2 * var(--border-radius));
874
+ overflow: hidden;
875
+ background-color: white;
876
+ }
844
877
 
845
878
  .plugin-icon-img {
846
879
  height: 40px;
847
880
  width: 40px;
881
+ -o-object-fit: contain;
882
+ object-fit: contain;
883
+ position: relative;
884
+ top: 2px;
885
+ left: 2px;
848
886
  }
849
887
  }
850
888
 
@@ -875,6 +913,7 @@ export default {
875
913
  font-size: 16px;
876
914
  font-weight: bold;
877
915
  margin-bottom: 5px;
916
+ text-transform: capitalize;
878
917
  }
879
918
 
880
919
  .plugin-badges {
@@ -284,12 +284,13 @@ export default {
284
284
  },
285
285
 
286
286
  promptDownload(btnCb) {
287
- const resources = [{ downloadData: this.downloadData, gatherResponseTimes: this.gatherResponseTimes }];
288
-
289
287
  if ( !this.responseTimes ) {
290
288
  this.$store.dispatch('management/promptModal', {
291
- component: 'DiagnosticTimingsDialog',
292
- resources
289
+ component: 'DiagnosticTimingsDialog',
290
+ componentProps: {
291
+ downloadData: this.downloadData,
292
+ gatherResponseTimes: this.gatherResponseTimes
293
+ }
293
294
  })
294
295
  .then(() => btnCb(true))
295
296
  .catch(() => btnCb(false));
package/pages/home.vue CHANGED
@@ -40,6 +40,14 @@ export default {
40
40
  fetch() {
41
41
  this.$store.dispatch('management/findAll', { type: CAPI.RANCHER_CLUSTER });
42
42
  this.$store.dispatch('management/findAll', { type: MANAGEMENT.CLUSTER });
43
+
44
+ if ( this.$store.getters['management/canList'](CAPI.MACHINE) ) {
45
+ this.$store.dispatch('management/findAll', { type: CAPI.MACHINE });
46
+ }
47
+
48
+ if ( this.$store.getters['management/canList'](MANAGEMENT.NODE) ) {
49
+ this.$store.dispatch('management/findAll', { type: MANAGEMENT.NODE });
50
+ }
43
51
  },
44
52
 
45
53
  data() {
@@ -71,12 +79,30 @@ export default {
71
79
  return this.$store.getters['management/all'](CAPI.RANCHER_CLUSTER);
72
80
  },
73
81
 
82
+ // User can go to Cluster Management if they can see the cluster schema
83
+ canManageClusters() {
84
+ const schema = this.$store.getters['management/schemaFor'](CAPI.RANCHER_CLUSTER);
85
+
86
+ return !!schema;
87
+ },
88
+
74
89
  canCreateCluster() {
75
90
  const schema = this.$store.getters['management/schemaFor'](CAPI.RANCHER_CLUSTER);
76
91
 
77
92
  return !!schema?.collectionMethods.find(x => x.toLowerCase() === 'post');
78
93
  },
79
94
 
95
+ manageLocation() {
96
+ return {
97
+ name: 'c-cluster-product-resource',
98
+ params: {
99
+ product: MANAGER,
100
+ cluster: BLANK_CLUSTER,
101
+ resource: CAPI.RANCHER_CLUSTER
102
+ },
103
+ };
104
+ },
105
+
80
106
  createLocation() {
81
107
  return {
82
108
  name: 'c-cluster-product-resource-create',
@@ -176,6 +202,12 @@ export default {
176
202
  markSeenReleaseNotes(this.$store);
177
203
  },
178
204
 
205
+ // Forget the types when we leave the page
206
+ beforeDestroy() {
207
+ this.$store.dispatch('management/forgetType', CAPI.MACHINE);
208
+ this.$store.dispatch('management/forgetType', MANAGEMENT.NODE);
209
+ },
210
+
179
211
  methods: {
180
212
  /**
181
213
  * Define actions for each navigation link
@@ -269,7 +301,9 @@ export default {
269
301
  data-testid="changelog-banner"
270
302
  color="info whats-new"
271
303
  >
272
- <div>{{ t('landing.seeWhatsNew') }}</div>
304
+ <div>
305
+ {{ t('landing.seeWhatsNew') }}
306
+ </div>
273
307
  <a
274
308
  class="hand"
275
309
  @click.prevent.stop="showWhatsNew"
@@ -286,11 +320,13 @@ export default {
286
320
  >
287
321
  <div class="col span-12">
288
322
  <Banner
289
- color="set-login-page"
323
+ color="set-login-page mt-0"
290
324
  :closable="true"
291
325
  @close="closeSetLoginBanner()"
292
326
  >
293
- <div>{{ t('landing.landingPrefs.title') }}</div>
327
+ <div>
328
+ {{ t('landing.landingPrefs.title') }}
329
+ </div>
294
330
  <a
295
331
  class="hand mr-20"
296
332
  @click.prevent.stop="showUserPrefs"
@@ -324,19 +360,28 @@ export default {
324
360
  </div>
325
361
  </template>
326
362
  <template
327
- v-if="canCreateCluster"
363
+ v-if="canCreateCluster || canManageClusters"
328
364
  #header-middle
329
365
  >
330
366
  <div class="table-heading">
331
367
  <n-link
368
+ v-if="canManageClusters"
369
+ :to="manageLocation"
370
+ class="btn btn-sm role-secondary"
371
+ >
372
+ {{ t('cluster.manageAction') }}
373
+ </n-link>
374
+ <n-link
375
+ v-if="canCreateCluster"
332
376
  :to="importLocation"
333
- class="btn role-primary"
377
+ class="btn btn-sm role-primary"
334
378
  >
335
379
  {{ t('cluster.importAction') }}
336
380
  </n-link>
337
381
  <n-link
382
+ v-if="canCreateCluster"
338
383
  :to="createLocation"
339
- class="btn role-primary"
384
+ class="btn btn-sm role-primary"
340
385
  >
341
386
  {{ t('generic.create') }}
342
387
  </n-link>
@@ -344,15 +389,22 @@ export default {
344
389
  </template>
345
390
  <template #col:name="{row}">
346
391
  <td>
347
- <span v-if="row.mgmt">
348
- <n-link
349
- v-if="row.mgmt.isReady && !row.hasError"
350
- :to="{ name: 'c-cluster-explorer', params: { cluster: row.mgmt.id }}"
351
- >
352
- {{ row.nameDisplay }}
353
- </n-link>
354
- <span v-else>{{ row.nameDisplay }}</span>
355
- </span>
392
+ <div class="list-cluster-name">
393
+ <span v-if="row.mgmt">
394
+ <n-link
395
+ v-if="row.mgmt.isReady && !row.hasError"
396
+ :to="{ name: 'c-cluster-explorer', params: { cluster: row.mgmt.id }}"
397
+ >
398
+ {{ row.nameDisplay }}
399
+ </n-link>
400
+ <span v-else>{{ row.nameDisplay }}</span>
401
+ </span>
402
+ <i
403
+ v-if="row.unavailableMachines"
404
+ v-tooltip="row.unavailableMachines"
405
+ class="conditions-alert-icon icon-alert icon"
406
+ />
407
+ </div>
356
408
  </td>
357
409
  </template>
358
410
  <template #col:cpu="{row}">
@@ -410,19 +462,19 @@ export default {
410
462
  }
411
463
  }
412
464
 
413
- .banner.info.whats-new, .banner.set-login-page {
414
- border: 0;
415
- margin-top: 0;
416
- display: flex;
417
- align-items: center;
418
- flex-direction: row;
419
- > div {
420
- flex: 1;
421
- }
422
- > a {
423
- align-self: flex-end;
465
+ .set-login-page, .whats-new {
466
+ > ::v-deep .banner__content {
467
+ display: flex;
468
+
469
+ > div {
470
+ flex: 1;
471
+ }
472
+ > a {
473
+ align-self: flex-end;
474
+ }
424
475
  }
425
476
  }
477
+
426
478
  .banner.set-login-page {
427
479
  border: 1px solid var(--border);
428
480
  }
@@ -432,7 +484,7 @@ export default {
432
484
  height: 39px;
433
485
 
434
486
  & > a {
435
- margin-left: 5px;
487
+ margin-left: 10px;
436
488
  }
437
489
  }
438
490
  .panel:not(:first-child) {
@@ -451,12 +503,35 @@ export default {
451
503
  display: contents;
452
504
  white-space: nowrap;
453
505
  }
506
+
507
+ .list-cluster-name {
508
+ align-items: center;
509
+ display: flex;
510
+
511
+ .conditions-alert-icon {
512
+ color: var(--error);
513
+ margin-left: 4px;
514
+ }
515
+ }
516
+
517
+ // Hide the side-panel showing links when the screen is small
518
+ @media screen and (max-width: 996px) {
519
+ .side-panel {
520
+ display: none;
521
+ }
522
+ }
454
523
  </style>
455
524
  <style lang="scss">
456
525
  .home-page {
457
- .search > INPUT {
458
- background-color: transparent;
459
- padding: 8px;
526
+ .search {
527
+ align-items: center;
528
+ display: flex;
529
+
530
+ > INPUT {
531
+ background-color: transparent;
532
+ height: 30px;
533
+ padding: 8px;
534
+ }
460
535
  }
461
536
 
462
537
  h2 {
package/pages/prefs.vue CHANGED
@@ -9,7 +9,7 @@ import { Checkbox } from '@components/Form/Checkbox';
9
9
  import LandingPagePreference from '@shell/components/LandingPagePreference';
10
10
  import {
11
11
  mapPref, THEME, KEYMAP, DATE_FORMAT, TIME_FORMAT, ROWS_PER_PAGE, HIDE_DESC, SHOW_PRE_RELEASE, MENU_MAX_CLUSTERS,
12
- VIEW_IN_API, ALL_NAMESPACES, THEME_SHORTCUT, PLUGIN_DEVELOPER
12
+ VIEW_IN_API, ALL_NAMESPACES, THEME_SHORTCUT, PLUGIN_DEVELOPER, SCALE_POOL_PROMPT
13
13
  } from '@shell/store/prefs';
14
14
  import LabeledSelect from '@shell/components/form/LabeledSelect';
15
15
  import { addObject } from '@shell/utils/array';
@@ -25,17 +25,18 @@ export default {
25
25
  return { admin: isAdminUser(this.$store.getters) };
26
26
  },
27
27
  computed: {
28
- keymap: mapPref(KEYMAP),
29
- viewInApi: mapPref(VIEW_IN_API),
30
- allNamespaces: mapPref(ALL_NAMESPACES),
31
- themeShortcut: mapPref(THEME_SHORTCUT),
32
- dateFormat: mapPref(DATE_FORMAT),
33
- timeFormat: mapPref(TIME_FORMAT),
34
- perPage: mapPref(ROWS_PER_PAGE),
35
- hideDesc: mapPref(HIDE_DESC),
36
- showPreRelease: mapPref(SHOW_PRE_RELEASE),
37
- menuMaxClusters: mapPref(MENU_MAX_CLUSTERS),
38
- pluginDeveloper: mapPref(PLUGIN_DEVELOPER),
28
+ keymap: mapPref(KEYMAP),
29
+ viewInApi: mapPref(VIEW_IN_API),
30
+ allNamespaces: mapPref(ALL_NAMESPACES),
31
+ themeShortcut: mapPref(THEME_SHORTCUT),
32
+ dateFormat: mapPref(DATE_FORMAT),
33
+ timeFormat: mapPref(TIME_FORMAT),
34
+ perPage: mapPref(ROWS_PER_PAGE),
35
+ hideDesc: mapPref(HIDE_DESC),
36
+ showPreRelease: mapPref(SHOW_PRE_RELEASE),
37
+ menuMaxClusters: mapPref(MENU_MAX_CLUSTERS),
38
+ pluginDeveloper: mapPref(PLUGIN_DEVELOPER),
39
+ scalingDownPrompt: mapPref(SCALE_POOL_PROMPT),
39
40
 
40
41
  ...mapGetters(['isSingleProduct']),
41
42
 
@@ -238,6 +239,16 @@ export default {
238
239
  </div>
239
240
  </div>
240
241
  </div>
242
+ <!-- Confirmation setting -->
243
+ <div class="col adv-features mt-10 mb-10">
244
+ <hr>
245
+ <h4 v-t="'prefs.confirmationSetting.title'" />
246
+ <Checkbox
247
+ v-model="scalingDownPrompt"
248
+ :label="t('prefs.confirmationSetting.scalingDownPrompt')"
249
+ class="mt-10"
250
+ />
251
+ </div>
241
252
  <!-- Advanced Features -->
242
253
  <div class="col adv-features mt-10 mb-10">
243
254
  <hr>
@@ -408,7 +408,7 @@ export default {
408
408
  </script>
409
409
  <template>
410
410
  <div class="mesh">
411
- <header class="header-layout">
411
+ <header>
412
412
  <h1>App Mesh</h1>
413
413
  </header>
414
414
 
@@ -72,3 +72,11 @@ export function importWindowComponent(name) {
72
72
  export function resolveWindowComponent(key) {
73
73
  return undefined;
74
74
  }
75
+
76
+ export function resolveMachineConfigComponent(key) {
77
+ return undefined;
78
+ }
79
+
80
+ export function resolveCloudCredentialComponent(key) {
81
+ return undefined;
82
+ }
package/pkg/vue.config.js CHANGED
@@ -45,14 +45,18 @@ module.exports = function(dir) {
45
45
  },
46
46
 
47
47
  configureWebpack: (config) => {
48
+ const pkgName = dir.replace(`${ path.dirname(dir) }/`, '');
49
+
48
50
  // Alias updates
49
51
  config.resolve.alias['@shell'] = path.join(dir, '.shell');
50
52
  config.resolve.alias['~shell'] = path.join(dir, '.shell');
51
53
  // This should be udpated once we move to rancher-components as a dependency
52
54
  config.resolve.alias['@components'] = COMPONENTS_DIR;
53
55
  config.resolve.alias['./node_modules'] = path.join(maindir, 'node_modules');
56
+ config.resolve.alias[`@pkg/${ pkgName }`] = dir;
54
57
  config.resolve.alias['@pkg'] = dir;
55
58
  config.resolve.alias['~pkg'] = dir;
59
+ config.resolve.alias['~'] = maindir;
56
60
  delete config.resolve.alias['@'];
57
61
 
58
62
  // Prevent the dynamic importer and the model-loader-require from importing anything dynamically - we don't want all of the