@rancher/shell 0.3.16 → 0.3.18

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 (174) hide show
  1. package/assets/images/wechat-qr-code.jpg +0 -0
  2. package/assets/translations/en-us.yaml +75 -16
  3. package/assets/translations/zh-hans.yaml +151 -15
  4. package/chart/__tests__/S3.test.ts +50 -0
  5. package/chart/rancher-backup/S3.vue +21 -0
  6. package/chart/rancher-backup/index.vue +4 -0
  7. package/components/AsyncButton.vue +1 -1
  8. package/components/CommunityLinks.vue +1 -0
  9. package/components/FileDiff.vue +92 -85
  10. package/components/Inactivity.vue +10 -0
  11. package/components/LazyImage.vue +2 -2
  12. package/components/PromptRestore.vue +7 -5
  13. package/components/ResourceDetail/Masthead.vue +1 -1
  14. package/components/ResourceDetail/index.vue +8 -14
  15. package/components/ResourceList/index.vue +1 -1
  16. package/components/ResourceTable.vue +50 -2
  17. package/components/YamlEditor.vue +1 -0
  18. package/components/__tests__/PromptRestore.test.ts +72 -0
  19. package/components/auth/AzureWarning.vue +1 -1
  20. package/components/auth/RoleDetailEdit.vue +1 -0
  21. package/components/fleet/FleetResources.vue +3 -64
  22. package/components/form/FileImageSelector.vue +9 -0
  23. package/components/form/FileSelector.vue +2 -1
  24. package/components/form/MatchExpressions.vue +1 -3
  25. package/components/form/NameNsDescription.vue +28 -12
  26. package/components/form/NodeAffinity.vue +2 -2
  27. package/components/form/PodAffinity.vue +2 -2
  28. package/components/form/ResourceTabs/index.vue +8 -2
  29. package/components/form/Select.vue +16 -0
  30. package/components/form/__tests__/FileImageSelector.test.ts +42 -0
  31. package/components/form/__tests__/FileSelector.test.ts +76 -0
  32. package/components/form/__tests__/NodeAffinity.test.ts +38 -0
  33. package/components/form/__tests__/PodAffinity.test.ts +46 -0
  34. package/components/formatter/ClusterLink.vue +8 -4
  35. package/components/formatter/ClusterProvider.vue +3 -1
  36. package/components/formatter/ImageName.vue +23 -0
  37. package/components/formatter/PodImages.vue +7 -1
  38. package/components/formatter/__tests__/ClusterLink.test.ts +101 -0
  39. package/components/formatter/__tests__/ClusterProvider.test.ts +24 -0
  40. package/components/nav/Header.vue +2 -2
  41. package/components/nav/WindowManager/ContainerShell.vue +60 -36
  42. package/components/nav/WindowManager/__tests__/ContainerShell.test.ts +561 -0
  43. package/config/__test__/home-links.test.ts +62 -0
  44. package/config/home-links.js +15 -3
  45. package/config/labels-annotations.js +7 -2
  46. package/config/persistentVolume.ts +108 -0
  47. package/config/product/manager.js +5 -1
  48. package/config/router.js +0 -4
  49. package/config/settings.ts +4 -0
  50. package/config/table-headers.js +6 -5
  51. package/config/types.js +2 -0
  52. package/config/uiplugins.js +50 -5
  53. package/core/plugin-helpers.js +39 -15
  54. package/core/plugin.ts +9 -0
  55. package/core/plugins.js +1 -1
  56. package/core/types-provisioning.ts +253 -0
  57. package/core/types.ts +21 -3
  58. package/detail/autoscaling.horizontalpodautoscaler/index.vue +50 -1
  59. package/detail/fleet.cattle.io.gitrepo.vue +10 -2
  60. package/detail/node.vue +6 -6
  61. package/detail/pod.vue +38 -9
  62. package/detail/provisioning.cattle.io.cluster.vue +46 -7
  63. package/detail/workload/index.vue +49 -18
  64. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +62 -0
  65. package/edit/__tests__/ui.cattle.io.navlink.test.ts +110 -0
  66. package/edit/auth/github.vue +1 -0
  67. package/edit/autoscaling.horizontalpodautoscaler/hpa-scaling-rule.vue +130 -0
  68. package/edit/autoscaling.horizontalpodautoscaler/index.vue +79 -0
  69. package/edit/fleet.cattle.io.clustergroup.vue +14 -3
  70. package/edit/fleet.cattle.io.gitrepo.vue +18 -1
  71. package/edit/namespace.vue +9 -1
  72. package/edit/networking.k8s.io.ingress/RulePath.vue +0 -2
  73. package/edit/persistentvolume/__tests__/persistentvolume.test.ts +82 -0
  74. package/edit/persistentvolume/index.vue +2 -1
  75. package/edit/persistentvolume/plugins/csi.vue +3 -1
  76. package/edit/persistentvolume/plugins/longhorn.vue +12 -12
  77. package/edit/provisioning.cattle.io.cluster/AgentConfiguration.vue +1 -30
  78. package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +15 -11
  79. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +79 -1
  80. package/edit/provisioning.cattle.io.cluster/index.vue +53 -1
  81. package/edit/provisioning.cattle.io.cluster/rke2.vue +335 -151
  82. package/edit/storage.k8s.io.storageclass/index.vue +1 -2
  83. package/edit/ui.cattle.io.navlink.vue +213 -186
  84. package/initialize/App.js +3 -13
  85. package/initialize/layouts.ts +26 -0
  86. package/layouts/default.vue +1 -1
  87. package/list/group.principal.vue +1 -1
  88. package/list/provisioning.cattle.io.cluster.vue +8 -1
  89. package/middleware/authenticated.js +101 -5
  90. package/mixins/brand.js +39 -3
  91. package/mixins/child-hook.js +2 -2
  92. package/mixins/create-edit-view/impl.js +4 -4
  93. package/models/chart.js +1 -1
  94. package/models/fleet.cattle.io.cluster.js +33 -4
  95. package/models/fleet.cattle.io.gitrepo.js +113 -38
  96. package/models/management.cattle.io.kontainerdriver.js +14 -0
  97. package/models/persistentvolume.js +2 -111
  98. package/models/pod.js +30 -0
  99. package/models/provisioning.cattle.io.cluster.js +9 -1
  100. package/models/rke.cattle.io.etcdsnapshot.js +10 -7
  101. package/package.json +2 -2
  102. package/pages/about.vue +8 -2
  103. package/pages/auth/login.vue +1 -1
  104. package/pages/auth/logout.vue +11 -3
  105. package/pages/c/_cluster/apps/charts/index.vue +5 -2
  106. package/pages/c/_cluster/apps/charts/install.vue +5 -0
  107. package/pages/c/_cluster/auth/group.principal/assign-edit.vue +1 -1
  108. package/pages/c/_cluster/auth/roles/index.vue +1 -1
  109. package/pages/c/_cluster/explorer/index.vue +2 -11
  110. package/pages/c/_cluster/manager/cloudCredential/_id.vue +0 -1
  111. package/pages/c/_cluster/manager/cloudCredential/create.vue +0 -1
  112. package/pages/c/_cluster/settings/brand.vue +11 -8
  113. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +177 -0
  114. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +19 -3
  115. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +90 -21
  116. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +107 -37
  117. package/pages/c/_cluster/uiplugins/index.vue +160 -44
  118. package/pages/docs/_doc.vue +9 -3
  119. package/pages/home.vue +6 -6
  120. package/pages/support/index.vue +10 -4
  121. package/pkg/auto-import.js +1 -1
  122. package/plugins/clean-tooltip-directive.js +1 -1
  123. package/plugins/dashboard-store/__tests__/actions.spec.ts +165 -0
  124. package/plugins/dashboard-store/__tests__/getters.spec.ts +100 -0
  125. package/plugins/dashboard-store/__tests__/{mutations.spec.js → mutations.spec.ts} +2 -2
  126. package/plugins/dashboard-store/actions.js +1 -1
  127. package/plugins/dashboard-store/resource-class.js +39 -2
  128. package/plugins/plugin.js +9 -1
  129. package/plugins/steve/__tests__/getters.spec.ts +93 -0
  130. package/plugins/steve/getters.js +21 -1
  131. package/plugins/steve/subscribe.js +1 -3
  132. package/rancher-components/BadgeState/BadgeState.vue +5 -1
  133. package/rancher-components/Banner/Banner.test.ts +51 -1
  134. package/rancher-components/Banner/Banner.vue +134 -53
  135. package/rancher-components/Card/Card.test.ts +37 -0
  136. package/rancher-components/Card/Card.vue +24 -7
  137. package/rancher-components/Form/Checkbox/Checkbox.test.ts +20 -29
  138. package/rancher-components/Form/Checkbox/Checkbox.vue +45 -20
  139. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +2 -8
  140. package/rancher-components/Form/LabeledInput/LabeledInput.vue +22 -10
  141. package/rancher-components/Form/Radio/RadioButton.test.ts +31 -0
  142. package/rancher-components/Form/Radio/RadioButton.vue +30 -13
  143. package/rancher-components/Form/Radio/RadioGroup.vue +26 -7
  144. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +7 -6
  145. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.test.ts +25 -38
  146. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +23 -11
  147. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +19 -5
  148. package/rancher-components/StringList/StringList.test.ts +453 -49
  149. package/rancher-components/StringList/StringList.vue +44 -26
  150. package/scripts/extension/publish +2 -2
  151. package/scripts/typegen.sh +11 -2
  152. package/server/server-middleware.js +4 -12
  153. package/store/index.js +14 -3
  154. package/store/prefs.js +0 -3
  155. package/store/store-types.js +2 -0
  156. package/store/type-map.js +17 -29
  157. package/types/api.d.ts +1 -0
  158. package/types/fleet.d.ts +1 -0
  159. package/types/shell/index.d.ts +931 -85
  160. package/types/userPreferences.d.ts +1 -1
  161. package/utils/__mocks__/socket.js +21 -0
  162. package/utils/grafana.js +23 -11
  163. package/utils/kube.js +9 -0
  164. package/utils/object.js +27 -0
  165. package/utils/selector.js +2 -1
  166. package/utils/settings.ts +2 -2
  167. package/utils/validators/formRules/index.ts +3 -3
  168. package/vue.config.js +3 -2
  169. package/components/.DS_Store +0 -0
  170. package/components/__tests__/.DS_Store +0 -0
  171. package/creators/pkg/package-lock.json +0 -37
  172. package/pages/safeMode.vue +0 -17
  173. package/plugins/steve/urloptions.js +0 -47
  174. package/yarn-error.log +0 -196
@@ -15,8 +15,10 @@ export const KONTAINER_TO_DRIVER = {
15
15
  huaweicontainercloudengine: 'huaweicce', // Does this actually exist?
16
16
  huaweiengine: 'huaweicce',
17
17
  linodekubernetesengine: 'linodelke', // Does this actually exist?
18
+ lke: 'linodelke',
18
19
  lkeengine: 'linodelke',
19
20
  okeengine: 'oracleoke',
21
+ oke: 'oracleoke',
20
22
  oraclecontainerengine: 'oracleoke', // Does this actually exist?
21
23
  rke2: 'rke2',
22
24
  tencentengine: 'tencenttke',
@@ -63,6 +65,18 @@ export default class KontainerDriver extends HybridModel {
63
65
  }
64
66
 
65
67
  get driverName() {
68
+ if (!this.spec.builtIn) {
69
+ // if the driver is not built in, there's a good change its a custom one
70
+ // custom drivers have a random id, so shouldn't be used as the type
71
+ // instead use the status.displayName. this will map to the name extracted from the binary
72
+ const driverName = this.status?.displayName?.toLowerCase();
73
+
74
+ if (driverName) {
75
+ // some drivers are built in but don't have the builtIn flag. ensure we pass these through K_TO_D
76
+ return KONTAINER_TO_DRIVER[driverName] || driverName;
77
+ }
78
+ }
79
+
66
80
  return KONTAINER_TO_DRIVER[this.id] || this.id;
67
81
  }
68
82
  }
@@ -1,116 +1,7 @@
1
- import { PVC } from '@shell/config/types';
1
+ import { PVC, LONGHORN_DRIVER } from '@shell/config/types';
2
+ import { VOLUME_PLUGINS } from '@shell/config/persistentVolume';
2
3
  import SteveModel from '@shell/plugins/steve/steve-class';
3
4
 
4
- export const VOLUME_PLUGINS = [
5
- {
6
- labelKey: 'persistentVolume.awsElasticBlockStore.label',
7
- value: 'awsElasticBlockStore',
8
- supported: true
9
- },
10
- {
11
- labelKey: 'persistentVolume.azureDisk.label',
12
- value: 'azureDisk',
13
- supported: true
14
- },
15
- {
16
- labelKey: 'persistentVolume.azureFile.label',
17
- value: 'azureFile',
18
- supported: true
19
- },
20
- {
21
- labelKey: 'persistentVolume.cephfs.label',
22
- value: 'cephfs',
23
- },
24
- {
25
- labelKey: 'persistentVolume.rbd.label',
26
- value: 'rbd',
27
- },
28
- {
29
- labelKey: 'persistentVolume.csi.label',
30
- value: 'csi',
31
- },
32
- {
33
- labelKey: 'persistentVolume.fc.label',
34
- value: 'fc',
35
- },
36
- {
37
- labelKey: 'persistentVolume.flexVolume.label',
38
- value: 'flexVolume',
39
- },
40
- {
41
- labelKey: 'persistentVolume.flocker.label',
42
- value: 'flocker',
43
- },
44
- {
45
- labelKey: 'persistentVolume.glusterfs.label',
46
- value: 'glusterfs',
47
- },
48
- {
49
- labelKey: 'persistentVolume.gcePersistentDisk.label',
50
- value: 'gcePersistentDisk',
51
- supported: true
52
- },
53
- {
54
- labelKey: 'persistentVolume.hostPath.label',
55
- value: 'hostPath',
56
- supported: true
57
- },
58
- {
59
- labelKey: 'persistentVolume.iscsi.label',
60
- value: 'iscsi',
61
- },
62
- {
63
- labelKey: 'persistentVolume.local.label',
64
- value: 'local',
65
- supported: true
66
- },
67
- {
68
- labelKey: 'persistentVolume.longhorn.label',
69
- value: 'longhorn',
70
- supported: true
71
- },
72
- {
73
- labelKey: 'persistentVolume.nfs.label',
74
- value: 'nfs',
75
- supported: true
76
- },
77
- {
78
- labelKey: 'persistentVolume.cinder.label',
79
- value: 'cinder',
80
- },
81
- {
82
- labelKey: 'persistentVolume.photonPersistentDisk.label',
83
- value: 'photonPersistentDisk',
84
- },
85
- {
86
- labelKey: 'persistentVolume.portworxVolume.label',
87
- value: 'portworxVolume',
88
- },
89
-
90
- {
91
- labelKey: 'persistentVolume.quobyte.label',
92
- value: 'quobyte',
93
- },
94
-
95
- {
96
- labelKey: 'persistentVolume.scaleIO.label',
97
- value: 'scaleIO',
98
- },
99
- {
100
- labelKey: 'persistentVolume.storageos.label',
101
- value: 'storageos',
102
- },
103
- {
104
- labelKey: 'persistentVolume.vsphereVolume.label',
105
- value: 'vsphereVolume',
106
- supported: true
107
- },
108
- ];
109
-
110
- export const LONGHORN_DRIVER = 'driver.longhorn.io';
111
-
112
- export const LONGHORN_PLUGIN = VOLUME_PLUGINS.find((plugin) => plugin.value === 'longhorn');
113
-
114
5
  export default class PV extends SteveModel {
115
6
  // plugin display value table
116
7
  get source() {
package/models/pod.js CHANGED
@@ -15,6 +15,36 @@ export const WORKLOAD_PRIORITY = {
15
15
  };
16
16
 
17
17
  export default class Pod extends WorkloadService {
18
+ _os = undefined;
19
+
20
+ get inStore() {
21
+ return this.$rootGetters['currentProduct'].inStore;
22
+ }
23
+
24
+ set os(operatingSystem) {
25
+ this._os = operatingSystem;
26
+ }
27
+
28
+ get os() {
29
+ if (this._os) {
30
+ return this._os;
31
+ }
32
+
33
+ return this?.node?.status?.nodeInfo?.operatingSystem;
34
+ }
35
+
36
+ get node() {
37
+ try {
38
+ const schema = this.$store.getters[`cluster/schemaFor`](NODE);
39
+
40
+ if (schema) {
41
+ this.$dispatch(`find`, { type: NODE, id: this.spec.nodeName });
42
+ }
43
+ } catch {}
44
+
45
+ return this.$getters['byId'](NODE, this.spec.nodeName);
46
+ }
47
+
18
48
  get _availableActions() {
19
49
  const out = super._availableActions;
20
50
 
@@ -9,10 +9,11 @@ import { ucFirst } from '@shell/utils/string';
9
9
  import { compare } from '@shell/utils/version';
10
10
  import { AS, MODE, _VIEW, _YAML } from '@shell/config/query-params';
11
11
  import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
12
+ import { CAPI as CAPI_ANNOTATIONS } from '@shell/config/labels-annotations';
12
13
 
13
14
  /**
14
15
  * Class representing Cluster resource.
15
- * @extends SteveModal
16
+ * @extends SteveModel
16
17
  */
17
18
  export default class ProvCluster extends SteveModel {
18
19
  get details() {
@@ -381,6 +382,13 @@ export default class ProvCluster extends SteveModel {
381
382
  }
382
383
 
383
384
  get machineProvider() {
385
+ // First check annotation - useful for clusters created by extension providers
386
+ const fromAnnotation = this.annotations?.[CAPI_ANNOTATIONS.UI_CUSTOM_PROVIDER];
387
+
388
+ if (fromAnnotation) {
389
+ return fromAnnotation;
390
+ }
391
+
384
392
  if (this.isHarvester) {
385
393
  return HARVESTER;
386
394
  } else if ( this.isImported ) {
@@ -5,17 +5,20 @@ import { findBy } from '@shell/utils/array';
5
5
  import { get } from '@shell/utils/object';
6
6
  import { base64Decode } from '@shell/utils/crypto';
7
7
  import { ucFirst } from '@shell/utils/string';
8
+ import { STATES_ENUM } from '@shell/plugins/dashboard-store/resource-class';
8
9
 
9
10
  export default class EtcdBackup extends NormanModel {
10
11
  /**
11
12
  * Restrict actions for snapshots to restore only
12
13
  */
13
14
  get _availableActions() {
15
+ const enabled = this.snapshotFile?.status === STATES_ENUM.SUCCESSFUL;
16
+
14
17
  return [{
15
- action: 'promptRestore',
16
- enabled: true,
17
- icon: 'icon icon-fw icon-backup-restore',
18
- label: 'Restore'
18
+ action: 'promptRestore',
19
+ enabled,
20
+ icon: 'icon icon-fw icon-backup-restore',
21
+ label: 'Restore'
19
22
  }];
20
23
  }
21
24
 
@@ -48,7 +51,7 @@ export default class EtcdBackup extends NormanModel {
48
51
  }
49
52
 
50
53
  get errorMessage() {
51
- const inError = get(this, 'snapshotFile.status') === 'failed';
54
+ const inError = get(this, 'snapshotFile.status') === STATES_ENUM.FAILED;
52
55
 
53
56
  if (inError) {
54
57
  return base64Decode(this.snapshotFile?.message);
@@ -59,10 +62,10 @@ export default class EtcdBackup extends NormanModel {
59
62
 
60
63
  get stateDescription() {
61
64
  const trans = this.stateObj?.transitioning || false;
62
- const error = this.stateObj?.error || this.snapshotFile?.status === 'failed' || false;
65
+ const error = this.stateObj?.error || this.snapshotFile?.status === STATES_ENUM.FAILED || false;
63
66
  const message = this.stateObj?.message;
64
67
 
65
- const fileMessage = this.snapshotFile?.status === 'failed' ? base64Decode(this.snapshotFile?.message) : null;
68
+ const fileMessage = this.snapshotFile?.status === STATES_ENUM.FAILED ? base64Decode(this.snapshotFile?.message) : null;
66
69
 
67
70
  return trans || error ? fileMessage || ucFirst(message) : '';
68
71
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rancher/shell",
3
- "version": "0.3.16",
3
+ "version": "0.3.18",
4
4
  "description": "Rancher Dashboard Shell",
5
5
  "repository": "https://github.com/rancherlabs/dashboard",
6
6
  "license": "Apache-2.0",
@@ -69,7 +69,7 @@
69
69
  "d3-selection": "1.4.1",
70
70
  "dagre-d3": "0.6.4",
71
71
  "dayjs": "1.8.29",
72
- "diff2html": "2.11.2",
72
+ "diff2html": "3.4.24",
73
73
  "dompurify": "2.4.5",
74
74
  "eslint": "7.32.0",
75
75
  "eslint-config-standard": "16.0.3",
package/pages/about.vue CHANGED
@@ -6,6 +6,7 @@ import { MANAGEMENT } from '@shell/config/types';
6
6
  import { SETTING } from '@shell/config/settings';
7
7
  import { getVendor } from '@shell/config/private-label';
8
8
  import { downloadFile } from '@shell/utils/download';
9
+ import { mapGetters } from 'vuex';
9
10
 
10
11
  export default {
11
12
  layout: 'plain',
@@ -22,6 +23,7 @@ export default {
22
23
  };
23
24
  },
24
25
  computed: {
26
+ ...mapGetters(['releaseNotesUrl']),
25
27
  rancherVersion() {
26
28
  return this.settings.find((s) => s.id === SETTING.VERSION_RANCHER);
27
29
  },
@@ -168,9 +170,13 @@ export default {
168
170
  </tr>
169
171
  </table>
170
172
  <p class="pt-20">
171
- <nuxt-link :to="{ path: 'docs/whats-new'}">
173
+ <a
174
+ :href="releaseNotesUrl"
175
+ target="_blank"
176
+ rel="nofollow noopener noreferrer"
177
+ >
172
178
  {{ t('about.versions.releaseNotes') }}
173
- </nuxt-link>
179
+ </a>
174
180
  </p>
175
181
  <template v-if="downloadImageList.length">
176
182
  <h3 class="pt-40">
@@ -544,7 +544,7 @@ export default {
544
544
 
545
545
  .gutless {
546
546
  height: 100vh;
547
- .span-6 {
547
+ & > .span-6 {
548
548
  overflow-y: auto;
549
549
  display: flex;
550
550
  flex-direction: column;
@@ -11,8 +11,16 @@ export default {
11
11
 
12
12
  <template>
13
13
  <main class="main-layout">
14
- <h1 class="text-center mt-50">
15
- Logging Out&hellip;
16
- </h1>
14
+ <div>
15
+ <h1 v-t="'logout.message'" />
16
+ </div>
17
17
  </main>
18
18
  </template>
19
+ <style lang="scss" scoped>
20
+ main > div {
21
+ display: flex;
22
+ align-items: center;
23
+ justify-content: center;
24
+ height: 100vh;
25
+ }
26
+ </style>
@@ -242,7 +242,7 @@ export default {
242
242
  },
243
243
 
244
244
  created() {
245
- const release = this.currentCluster?.status?.version.gitVersion || '';
245
+ const release = this.currentCluster?.status?.version?.gitVersion || '';
246
246
  const isRKE2 = release.includes('rke2');
247
247
  const version = release.match(/\d+/g);
248
248
 
@@ -352,7 +352,10 @@ export default {
352
352
  <div v-else>
353
353
  <header>
354
354
  <div class="title">
355
- <h1 class="m-0">
355
+ <h1
356
+ data-testid="charts-header-title"
357
+ class="m-0"
358
+ >
356
359
  {{ t('catalog.charts.header') }}
357
360
  </h1>
358
361
  </div>
@@ -1251,6 +1251,10 @@ export default {
1251
1251
  this.steps[0].ready = okRequires && okChart;
1252
1252
  },
1253
1253
 
1254
+ updateStepTwoReady(update) {
1255
+ this.updateStep('helmValues', { ready: update });
1256
+ },
1257
+
1254
1258
  getOptionLabel(opt) {
1255
1259
  return opt?.chartNameDisplay;
1256
1260
  },
@@ -1567,6 +1571,7 @@ export default {
1567
1571
  @warn="e=>errors.push(e)"
1568
1572
  @register-before-hook="registerBeforeHook"
1569
1573
  @register-after-hook="registerAfterHook"
1574
+ @valid="updateStepTwoReady($event)"
1570
1575
  />
1571
1576
  </Tabbed>
1572
1577
  <template v-else>
@@ -6,7 +6,7 @@ import { NORMAN } from '@shell/config/types';
6
6
  import { _VIEW, _EDIT } from '@shell/config/query-params';
7
7
  import { exceptionToErrorsArray } from '@shell/utils/error';
8
8
  import { NAME } from '@shell/config/product/auth';
9
- import { BLANK_CLUSTER } from '@shell/store';
9
+ import { BLANK_CLUSTER } from '@shell/store/store-types.js';
10
10
 
11
11
  export default {
12
12
  components: {
@@ -6,7 +6,7 @@ import ResourceTable from '@shell/components/ResourceTable';
6
6
  import Loading from '@shell/components/Loading';
7
7
  import { SUBTYPE_MAPPING, CREATE_VERBS } from '@shell/models/management.cattle.io.roletemplate';
8
8
  import { NAME } from '@shell/config/product/auth';
9
- import { BLANK_CLUSTER } from '@shell/store';
9
+ import { BLANK_CLUSTER } from '@shell/store/store-types.js';
10
10
 
11
11
  const GLOBAL = SUBTYPE_MAPPING.GLOBAL.key;
12
12
  const CLUSTER = SUBTYPE_MAPPING.CLUSTER.key;
@@ -27,7 +27,7 @@ import {
27
27
  STATE,
28
28
  } from '@shell/config/table-headers';
29
29
 
30
- import { mapPref, CLUSTER_TOOLS_TIP, PSP_DEPRECATION_BANNER } from '@shell/store/prefs';
30
+ import { mapPref, PSP_DEPRECATION_BANNER } from '@shell/store/prefs';
31
31
  import { haveV1Monitoring, monitoringStatus } from '@shell/utils/monitoring';
32
32
  import Tabbed from '@shell/components/Tabbed';
33
33
  import Tab from '@shell/components/Tabbed/Tab';
@@ -103,7 +103,7 @@ export default {
103
103
  `Determine etcd metrics`
104
104
  );
105
105
 
106
- if (this.currentCluster.isLocal) {
106
+ if (this.currentCluster.isLocal && this.$store.getters['management/schemaFor'](MANAGEMENT.NODE)) {
107
107
  this.$store.dispatch('management/findAll', { type: MANAGEMENT.NODE });
108
108
  }
109
109
  }
@@ -173,7 +173,6 @@ export default {
173
173
  return this.$store.getters['management/all'](MANAGEMENT.CLUSTER);
174
174
  },
175
175
 
176
- hideClusterToolsTip: mapPref(CLUSTER_TOOLS_TIP),
177
176
  hidePspDeprecationBanner: mapPref(PSP_DEPRECATION_BANNER),
178
177
 
179
178
  hasV1Monitoring() {
@@ -441,14 +440,6 @@ export default {
441
440
  :raw="true"
442
441
  />
443
442
  </Banner>
444
- <Banner
445
- v-if="!hideClusterToolsTip"
446
- :closable="true"
447
- class="cluster-tools-tip"
448
- color="info"
449
- label-key="cluster.toolsTip"
450
- @close="hideClusterToolsTip = true"
451
- />
452
443
  <div
453
444
  class="cluster-dashboard-glance"
454
445
  >
@@ -9,7 +9,6 @@ export default {
9
9
 
10
10
  <template>
11
11
  <ResourceDetail
12
- store-override="rancher"
13
12
  resource-override="cloudcredential"
14
13
  parent-route-override="c-cluster-manager-cloudCredential"
15
14
  />
@@ -9,7 +9,6 @@ export default {
9
9
 
10
10
  <template>
11
11
  <ResourceDetail
12
- store-override="rancher"
13
12
  resource-override="cloudcredential"
14
13
  parent-route-override="c-cluster-manager-cloudCredential"
15
14
  />
@@ -4,7 +4,7 @@ import ColorInput from '@shell/components/form/ColorInput';
4
4
  import TypeDescription from '@shell/components/TypeDescription';
5
5
 
6
6
  import { Checkbox } from '@components/Form/Checkbox';
7
- import FileSelector from '@shell/components/form/FileSelector';
7
+ import FileImageSelector from '@shell/components/form/FileImageSelector';
8
8
  import SimpleBox from '@shell/components/SimpleBox';
9
9
  import Loading from '@shell/components/Loading';
10
10
  import AsyncButton from '@shell/components/AsyncButton';
@@ -23,7 +23,7 @@ export default {
23
23
  layout: 'authenticated',
24
24
 
25
25
  components: {
26
- LabeledInput, Checkbox, FileSelector, Loading, SimpleBox, AsyncButton, Banner, ColorInput, TypeDescription
26
+ LabeledInput, Checkbox, FileImageSelector, Loading, SimpleBox, AsyncButton, Banner, ColorInput, TypeDescription
27
27
  },
28
28
 
29
29
  async fetch() {
@@ -222,14 +222,15 @@ export default {
222
222
  >
223
223
  <div class="col logo-container span-6">
224
224
  <div class="mb-10">
225
- <FileSelector
225
+ <FileImageSelector
226
226
  :byte-limit="20000"
227
227
  :read-as-data-url="true"
228
228
  class="role-secondary"
229
229
  :label="t('branding.logos.uploadLight')"
230
230
  :mode="mode"
231
+ accept="image/jpeg,image/png,image/svg+xml"
231
232
  @error="setError"
232
- @selected="updateLogo($event, 'uiLogoLight')"
233
+ @input="updateLogo($event, 'uiLogoLight')"
233
234
  />
234
235
  </div>
235
236
  <SimpleBox
@@ -245,14 +246,15 @@ export default {
245
246
  </div>
246
247
  <div class="col logo-container span-6">
247
248
  <div class="mb-10">
248
- <FileSelector
249
+ <FileImageSelector
249
250
  :byte-limit="20000"
250
251
  :read-as-data-url="true"
251
252
  class="role-secondary"
252
253
  :label="t('branding.logos.uploadDark')"
253
254
  :mode="mode"
255
+ accept="image/jpeg,image/png,image/svg+xml"
254
256
  @error="setError"
255
- @selected="updateLogo($event, 'uiLogoDark')"
257
+ @input="updateLogo($event, 'uiLogoDark')"
256
258
  />
257
259
  </div>
258
260
  <SimpleBox
@@ -289,14 +291,15 @@ export default {
289
291
  >
290
292
  <div class="col logo-container span-12">
291
293
  <div class="mb-10">
292
- <FileSelector
294
+ <FileImageSelector
293
295
  :byte-limit="20000"
294
296
  :read-as-data-url="true"
295
297
  class="role-secondary"
296
298
  :label="t('branding.favicon.upload')"
297
299
  :mode="mode"
300
+ accept="image/jpeg,image/png,image/svg+xml"
298
301
  @error="setError"
299
- @selected="updateLogo($event, 'uiFavicon')"
302
+ @input="updateLogo($event, 'uiFavicon')"
300
303
  />
301
304
  </div>
302
305
  <SimpleBox v-if="uiFavicon">