@rancher/shell 0.1.2 → 0.1.3

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 (258) hide show
  1. package/assets/translations/en-us.yaml +27 -769
  2. package/assets/translations/zh-hans.yaml +8 -769
  3. package/components/ActionMenu.vue +3 -3
  4. package/components/CodeMirror.vue +6 -8
  5. package/components/CommunityLinks.vue +1 -1
  6. package/components/ContainerResourceLimit.vue +14 -0
  7. package/components/ExplorerMembers.vue +123 -0
  8. package/components/ExplorerProjectsNamespaces.vue +405 -0
  9. package/components/GrafanaDashboard.vue +17 -2
  10. package/components/LocaleSelector.vue +81 -0
  11. package/components/PromptModal.vue +2 -3
  12. package/components/ResourceList/index.vue +1 -1
  13. package/components/ResourceTable.vue +3 -6
  14. package/components/SingleClusterInfo.vue +1 -1
  15. package/components/SortableTable/index.vue +23 -20
  16. package/components/SortableTable/selection.js +1 -0
  17. package/components/auth/AzureWarning.vue +5 -1
  18. package/components/auth/Principal.vue +1 -1
  19. package/components/auth/RoleDetailEdit.vue +18 -11
  20. package/components/fleet/FleetRepos.vue +0 -2
  21. package/components/form/NameNsDescription.vue +4 -6
  22. package/components/form/NodeScheduling.vue +1 -1
  23. package/components/form/WorkloadPorts.vue +1 -1
  24. package/components/formatter/WorkloadHealthScale.vue +1 -1
  25. package/components/nav/Header.vue +9 -9
  26. package/components/nav/NamespaceFilter.vue +7 -4
  27. package/components/nav/TopLevelMenu.vue +6 -43
  28. package/components/nav/WindowManager/ContainerLogs.vue +1 -1
  29. package/config/product/harvester-manager.js +64 -2
  30. package/config/product/manager.js +9 -0
  31. package/config/settings.js +17 -71
  32. package/config/table-headers.js +0 -1
  33. package/config/types.js +5 -25
  34. package/core/plugin-routes.ts +34 -22
  35. package/core/plugin.ts +15 -3
  36. package/core/plugins-loader.js +2 -0
  37. package/core/plugins.js +79 -36
  38. package/core/types.ts +7 -1
  39. package/detail/provisioning.cattle.io.cluster.vue +13 -0
  40. package/detail/workload/index.vue +11 -5
  41. package/{components/dialog → dialog}/AddClusterMemberDialog.vue +0 -0
  42. package/{components/dialog → dialog}/AddCustomBadgeDialog.vue +0 -0
  43. package/{components/dialog → dialog}/AddProjectMemberDialog.vue +0 -0
  44. package/{components/dialog → dialog}/AddonConfigConfirmationDialog.vue +0 -0
  45. package/{components/dialog → dialog}/DrainNode.vue +0 -0
  46. package/{components/dialog → dialog}/ForceMachineRemoveDialog.vue +0 -0
  47. package/{components/dialog → dialog}/GenericPrompt.vue +0 -0
  48. package/{components/dialog → dialog}/RollbackWorkloadDialog.vue +0 -0
  49. package/{components/dialog → dialog}/RotateCertificatesDialog.vue +0 -0
  50. package/{components/dialog → dialog}/RotateEncryptionKeyDialog.vue +0 -0
  51. package/{components/dialog → dialog}/SaveAsRKETemplateDialog.vue +0 -0
  52. package/{components/dialog → dialog}/ScaleMachineDownDialog.vue +0 -0
  53. package/edit/auth/azuread.vue +20 -1
  54. package/edit/management.cattle.io.project.vue +2 -2
  55. package/edit/namespace.vue +17 -10
  56. package/edit/persistentvolumeclaim.vue +1 -0
  57. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +1 -1
  58. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +33 -5
  59. package/edit/service.vue +1 -1
  60. package/edit/workload/index.vue +363 -15
  61. package/edit/workload/mixins/workload.js +62 -7
  62. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +1 -0
  63. package/layouts/default.vue +52 -27
  64. package/layouts/error.vue +5 -1
  65. package/layouts/home.vue +6 -2
  66. package/list/harvesterhci.io.management.cluster.vue +74 -33
  67. package/list/namespace.vue +3 -5
  68. package/machine-config/amazonec2.vue +2 -0
  69. package/machine-config/harvester.vue +96 -49
  70. package/middleware/authenticated.js +56 -52
  71. package/mixins/form-validation.js +1 -1
  72. package/mixins/resource-fetch.js +3 -1
  73. package/models/fleet.cattle.io.bundle.js +26 -19
  74. package/models/harvesterhci.io.management.cluster.js +194 -5
  75. package/models/management.cattle.io.cluster.js +1 -1
  76. package/models/management.cattle.io.clusterroletemplatebinding.js +9 -0
  77. package/models/management.cattle.io.project.js +23 -2
  78. package/models/namespace.js +19 -3
  79. package/models/pod.js +19 -2
  80. package/models/provisioning.cattle.io.cluster.js +4 -0
  81. package/models/workload.js +4 -243
  82. package/models/workload.service.js +314 -0
  83. package/nuxt.config.js +11 -9
  84. package/package.json +3 -3
  85. package/pages/auth/login.vue +11 -2
  86. package/pages/auth/setup.vue +1 -1
  87. package/pages/c/_cluster/_product/members/index.vue +3 -93
  88. package/pages/c/_cluster/_product/projectsnamespaces.vue +6 -403
  89. package/pages/c/_cluster/settings/performance.vue +19 -16
  90. package/pages/fail-whale.vue +1 -10
  91. package/pages/index.vue +18 -4
  92. package/pages/plugins.vue +2 -2
  93. package/pages/prefs.vue +8 -6
  94. package/pkg/auto-import.js +44 -7
  95. package/pkg/dynamic-plugin-loader.js +28 -0
  96. package/pkg/import.js +2 -2
  97. package/pkg/model-loader-require.lib.js +3 -0
  98. package/pkg/vue.config.js +9 -6
  99. package/plugins/dashboard-store/model-loader-require.js +12 -0
  100. package/plugins/dashboard-store/model-loader.js +4 -1
  101. package/plugins/dashboard-store/resource-class.js +10 -3
  102. package/plugins/steve/actions.js +1 -1
  103. package/plugins/steve/index.js +6 -4
  104. package/plugins/steve/subscribe.js +34 -23
  105. package/rancher-components/Form/Checkbox/Checkbox.test.ts +77 -0
  106. package/rancher-components/Form/Checkbox/Checkbox.vue +12 -2
  107. package/scripts/build-pkg.sh +48 -2
  108. package/scripts/drone-build-pkg.sh +31 -0
  109. package/scripts/publish-shell.sh +10 -11
  110. package/scripts/serve-pkgs +17 -10
  111. package/store/catalog.js +3 -1
  112. package/store/i18n.js +16 -11
  113. package/store/index.js +4 -181
  114. package/store/prefs.js +30 -2
  115. package/store/type-map.js +16 -29
  116. package/utils/cluster.js +1 -1
  117. package/utils/custom-validators.js +1 -12
  118. package/utils/dynamic-importer.js +1 -1
  119. package/utils/validators/setting.js +0 -35
  120. package/components/FilterLabel.vue +0 -254
  121. package/components/HarvesterUpgradeProgressBarList.vue +0 -109
  122. package/components/VMConsoleBar.vue +0 -87
  123. package/components/dialog/harvester/AddHotplugModal.vue +0 -159
  124. package/components/dialog/harvester/BackupModal.vue +0 -117
  125. package/components/dialog/harvester/CloneTemplate.vue +0 -125
  126. package/components/dialog/harvester/EjectCDROMDialog.vue +0 -157
  127. package/components/dialog/harvester/ExportImageDialog.vue +0 -152
  128. package/components/dialog/harvester/MaintenanceDialog.vue +0 -94
  129. package/components/dialog/harvester/MigrationDialog.vue +0 -154
  130. package/components/dialog/harvester/RestoreDialog.vue +0 -153
  131. package/components/dialog/harvester/SupportBundle.vue +0 -217
  132. package/components/dialog/harvester/UnplugVolume.vue +0 -108
  133. package/components/form/SerialConsole/index.vue +0 -267
  134. package/components/formatter/AttachVMWithName.vue +0 -46
  135. package/components/formatter/CloudInitType.vue +0 -27
  136. package/components/formatter/HarvesterBackupTargetValidation.vue +0 -43
  137. package/components/formatter/HarvesterCPUUsed.vue +0 -122
  138. package/components/formatter/HarvesterDiskState.vue +0 -66
  139. package/components/formatter/HarvesterHostName.vue +0 -66
  140. package/components/formatter/HarvesterIpAddress.vue +0 -90
  141. package/components/formatter/HarvesterMemoryUsed.vue +0 -140
  142. package/components/formatter/HarvesterMigrationState.vue +0 -85
  143. package/components/formatter/HarvesterNodeName.vue +0 -49
  144. package/components/formatter/HarvesterStorageUsed.vue +0 -194
  145. package/components/formatter/HarvesterVmState.vue +0 -123
  146. package/components/nav/HarvesterUpgrade.vue +0 -232
  147. package/components/novnc/NovncConsole.vue +0 -93
  148. package/components/novnc/NovncConsoleItem.vue +0 -89
  149. package/components/novnc/NovncConsoleWrapper.vue +0 -243
  150. package/config/harvester-map.js +0 -44
  151. package/config/harvester-table-headers.js +0 -27
  152. package/config/product/harvester.js +0 -305
  153. package/detail/harvesterhci.io.host/HarvesterHostBasic.vue +0 -364
  154. package/detail/harvesterhci.io.host/HarvesterHostDisk.vue +0 -200
  155. package/detail/harvesterhci.io.host/HarvesterHostNetwork.vue +0 -89
  156. package/detail/harvesterhci.io.host/VirtualMachineInstance.vue +0 -134
  157. package/detail/harvesterhci.io.host/index.vue +0 -243
  158. package/detail/harvesterhci.io.virtualmachinebackup/index.vue +0 -221
  159. package/detail/harvesterhci.io.virtualmachineimage.vue +0 -118
  160. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineBasics.vue +0 -279
  161. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineEvents.vue +0 -75
  162. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineKeypairs.vue +0 -114
  163. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineMigration.vue +0 -79
  164. package/detail/kubevirt.io.virtualmachine/index.vue +0 -213
  165. package/edit/harvesterhci.io.cloudtemplate.vue +0 -123
  166. package/edit/harvesterhci.io.host/HarvesterDisk.vue +0 -262
  167. package/edit/harvesterhci.io.host/index.vue +0 -533
  168. package/edit/harvesterhci.io.keypair.vue +0 -112
  169. package/edit/harvesterhci.io.managedchart/index.vue +0 -25
  170. package/edit/harvesterhci.io.managedchart/rancher-monitoring.vue +0 -172
  171. package/edit/harvesterhci.io.networkattachmentdefinition.vue +0 -210
  172. package/edit/harvesterhci.io.setting/additional-ca.vue +0 -36
  173. package/edit/harvesterhci.io.setting/backup-target.vue +0 -182
  174. package/edit/harvesterhci.io.setting/http-proxy.vue +0 -79
  175. package/edit/harvesterhci.io.setting/index.vue +0 -201
  176. package/edit/harvesterhci.io.setting/overcommit-config.vue +0 -94
  177. package/edit/harvesterhci.io.setting/ssl-certificates.vue +0 -117
  178. package/edit/harvesterhci.io.setting/ssl-parameters.vue +0 -161
  179. package/edit/harvesterhci.io.setting/support-bundle-image.vue +0 -134
  180. package/edit/harvesterhci.io.setting/support-bundle-namespaces.vue +0 -73
  181. package/edit/harvesterhci.io.setting/vip-pools.vue +0 -244
  182. package/edit/harvesterhci.io.setting/vm-force-reset-policy.vue +0 -81
  183. package/edit/harvesterhci.io.virtualmachinebackup.vue +0 -256
  184. package/edit/harvesterhci.io.virtualmachineimage.vue +0 -364
  185. package/edit/harvesterhci.io.virtualmachinetemplateversion.vue +0 -340
  186. package/edit/harvesterhci.io.volume.vue +0 -195
  187. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/AccessCredentialsUsers.vue +0 -190
  188. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/index.vue +0 -212
  189. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/basicAuth.vue +0 -94
  190. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/sshkey.vue +0 -85
  191. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/DataTemplate.vue +0 -153
  192. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/index.vue +0 -279
  193. package/edit/kubevirt.io.virtualmachine/VirtualMachineCpuMemory.vue +0 -113
  194. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/__tests__/HarvesterEditNetwork.test.ts +0 -41
  195. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue +0 -281
  196. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/index.vue +0 -142
  197. package/edit/kubevirt.io.virtualmachine/VirtualMachineReserved.vue +0 -54
  198. package/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue +0 -256
  199. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue +0 -391
  200. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditContainer.test.ts +0 -40
  201. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditExisting.test.ts +0 -102
  202. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVMImage.test.ts +0 -117
  203. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVolume.test.ts +0 -74
  204. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/container.vue +0 -132
  205. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue +0 -303
  206. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/vmImage.vue +0 -285
  207. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue +0 -188
  208. package/edit/kubevirt.io.virtualmachine/index.vue +0 -642
  209. package/edit/network.harvesterhci.io.clusternetwork/index.vue +0 -19
  210. package/edit/network.harvesterhci.io.clusternetwork/vlan.vue +0 -134
  211. package/edit/workload/types/Deployment.vue +0 -377
  212. package/edit/workload/types/Generic.vue +0 -295
  213. package/list/harvesterhci.io.cloudtemplate.vue +0 -78
  214. package/list/harvesterhci.io.dashboard/HarvesterUpgrade.vue +0 -211
  215. package/list/harvesterhci.io.dashboard/UpgradeInfo.vue +0 -40
  216. package/list/harvesterhci.io.dashboard/index.vue +0 -752
  217. package/list/harvesterhci.io.host/index.vue +0 -186
  218. package/list/harvesterhci.io.networkattachmentdefinition.vue +0 -167
  219. package/list/harvesterhci.io.setting.vue +0 -241
  220. package/list/harvesterhci.io.virtualmachinebackup.vue +0 -172
  221. package/list/harvesterhci.io.virtualmachineimage.vue +0 -80
  222. package/list/harvesterhci.io.virtualmachinetemplateversion.vue +0 -173
  223. package/list/harvesterhci.io.volume.vue +0 -122
  224. package/list/kubevirt.io.virtualmachine.vue +0 -193
  225. package/mixins/harvester-vm/impl.js +0 -267
  226. package/mixins/harvester-vm/index.js +0 -1357
  227. package/models/harvester/configmap.js +0 -32
  228. package/models/harvester/harvesterhci.io.blockdevice.js +0 -55
  229. package/models/harvester/harvesterhci.io.keypair.js +0 -12
  230. package/models/harvester/harvesterhci.io.setting.js +0 -127
  231. package/models/harvester/harvesterhci.io.supportbundle.js +0 -35
  232. package/models/harvester/harvesterhci.io.upgrade.js +0 -226
  233. package/models/harvester/harvesterhci.io.virtualmachinebackup.js +0 -116
  234. package/models/harvester/harvesterhci.io.virtualmachineimage.js +0 -255
  235. package/models/harvester/harvesterhci.io.virtualmachinerestore.js +0 -43
  236. package/models/harvester/harvesterhci.io.virtualmachinetemplate.js +0 -69
  237. package/models/harvester/harvesterhci.io.virtualmachinetemplateversion.js +0 -227
  238. package/models/harvester/k8s.cni.cncf.io.networkattachmentdefinition.js +0 -32
  239. package/models/harvester/kubevirt.io.virtualmachine.js +0 -850
  240. package/models/harvester/kubevirt.io.virtualmachineinstance.js +0 -142
  241. package/models/harvester/management.cattle.io.managedchart.js +0 -191
  242. package/models/harvester/management.cattle.io.setting.js +0 -40
  243. package/models/harvester/network.harvesterhci.io.clusternetwork.js +0 -100
  244. package/models/harvester/network.harvesterhci.io.nodenetwork.js +0 -34
  245. package/models/harvester/node.js +0 -255
  246. package/models/harvester/persistentvolumeclaim.js +0 -166
  247. package/models/harvester/pod.js +0 -185
  248. package/pages/c/_cluster/harvester/airgapupgrade/index.vue +0 -309
  249. package/pages/c/_cluster/harvester/console/_uid/serial.vue +0 -51
  250. package/pages/c/_cluster/harvester/console/_uid/vnc.vue +0 -52
  251. package/pages/c/_cluster/harvester/index.vue +0 -24
  252. package/pages/c/_cluster/harvester/support/index.vue +0 -154
  253. package/pkg/model-loader.lib.js +0 -3
  254. package/promptRemove/kubevirt.io.virtualmachine.vue +0 -164
  255. package/store/harvester-common.js +0 -126
  256. package/utils/validators/vm-datavolumes.js +0 -38
  257. package/utils/validators/vm-image.js +0 -32
  258. package/utils/validators/vm.js +0 -221
@@ -16,19 +16,20 @@ import FixedBanner from '@shell/components/FixedBanner';
16
16
  import AwsComplianceBanner from '@shell/components/AwsComplianceBanner';
17
17
  import AzureWarning from '@shell/components/auth/AzureWarning';
18
18
  import {
19
- COUNT, SCHEMA, MANAGEMENT, UI, CATALOG, HCI
19
+ COUNT, SCHEMA, MANAGEMENT, UI, CATALOG
20
20
  } from '@shell/config/types';
21
21
  import { BASIC, FAVORITE, USED } from '@shell/store/type-map';
22
22
  import { addObjects, replaceWith, clear, addObject } from '@shell/utils/array';
23
23
  import { NAME as EXPLORER } from '@shell/config/product/explorer';
24
24
  import { NAME as NAVLINKS } from '@shell/config/product/navlinks';
25
- import { NAME as HARVESTER } from '@shell/config/product/harvester';
25
+ import { HARVESTER_NAME as HARVESTER } from '@shell/config/product/harvester-manager';
26
26
  import isEqual from 'lodash/isEqual';
27
27
  import { ucFirst } from '@shell/utils/string';
28
28
  import { getVersionInfo, markSeenReleaseNotes } from '@shell/utils/version';
29
29
  import { sortBy } from '@shell/utils/sort';
30
30
  import PageHeaderActions from '@shell/mixins/page-actions';
31
31
  import BrowserTabVisibility from '@shell/mixins/browser-tab-visibility';
32
+ import { getProductFromRoute } from '@shell/middleware/authenticated';
32
33
 
33
34
  const SET_LOGIN_ACTION = 'set-as-login';
34
35
 
@@ -51,15 +52,19 @@ export default {
51
52
 
52
53
  mixins: [PageHeaderActions, Brand, BrowserTabVisibility],
53
54
 
55
+ // Note - This will not run on route change
54
56
  data() {
55
57
  return {
56
- groups: [],
57
- gettingGroups: false,
58
- wantNavSync: false,
58
+ groups: [],
59
+ gettingGroups: false,
60
+ wantNavSync: false,
59
61
  };
60
62
  },
61
63
 
62
- middleware: ['authenticated'],
64
+ // Note - These will run on route change
65
+ middleware: [
66
+ 'authenticated'
67
+ ],
63
68
 
64
69
  computed: {
65
70
  ...mapState(['managementReady', 'clusterReady']),
@@ -98,7 +103,7 @@ export default {
98
103
  },
99
104
 
100
105
  allSchemas() {
101
- const managementReady = this.$store.getters['managementReady'];
106
+ const managementReady = this.managementReady;
102
107
  const product = this.$store.getters['currentProduct'];
103
108
 
104
109
  if ( !managementReady || !product ) {
@@ -117,7 +122,7 @@ export default {
117
122
  },
118
123
 
119
124
  counts() {
120
- const managementReady = this.$store.getters['managementReady'];
125
+ const managementReady = this.managementReady;
121
126
  const product = this.$store.getters['currentProduct'];
122
127
 
123
128
  if ( !managementReady || !product ) {
@@ -143,14 +148,12 @@ export default {
143
148
  },
144
149
 
145
150
  displayVersion() {
146
- let { displayVersion } = getVersionInfo(this.$store);
147
-
148
- if (this.isVirtualProduct && this.isSingleProduct) {
149
- const setting = this.$store.getters['harvester/byId'](HCI.SETTING, 'server-version');
150
-
151
- displayVersion = setting?.value || 'unknown';
151
+ if (this.isSingleProduct?.getVersionInfo) {
152
+ return this.isSingleProduct?.getVersionInfo(this.$store);
152
153
  }
153
154
 
155
+ const { displayVersion } = getVersionInfo(this.$store);
156
+
154
157
  return displayVersion;
155
158
  },
156
159
 
@@ -167,32 +170,54 @@ export default {
167
170
  },
168
171
 
169
172
  supportLink() {
170
- const product = this.$store.getters['currentProduct'].name;
173
+ const product = this.$store.getters['currentProduct'];
174
+
175
+ if (product?.supportRoute) {
176
+ return { ...product.supportRoute, params: { ...product.supportRoute.params, cluster: this.clusterId } };
177
+ }
171
178
 
172
- return { name: `c-cluster-${ product }-support` };
179
+ return { name: `c-cluster-${ product?.name }-support` };
173
180
  },
174
181
 
175
182
  unmatchedRoute() {
176
183
  return !this.$route?.matched?.length;
177
- }
184
+ },
185
+
186
+ /**
187
+ * When navigation involves unloading one cluster and loading another, clusterReady toggles from true->false->true in middleware (before new route content renders)
188
+ * Prevent rendering "outlet" until the route changes to avoid re-rendering old route content after its cluster is unloaded
189
+ */
190
+ clusterAndRouteReady() {
191
+ return this.clusterReady &&
192
+ this.clusterId === this.$route?.params?.cluster &&
193
+ this.currentProduct?.name === getProductFromRoute(this.$route);
194
+ },
178
195
 
179
196
  },
180
197
 
181
198
  watch: {
182
- counts() {
183
- this.queueUpdate();
199
+ counts(a, b) {
200
+ if ( a !== b ) {
201
+ this.queueUpdate();
202
+ }
184
203
  },
185
204
 
186
- allSchemas() {
187
- this.queueUpdate();
205
+ allSchemas(a, b) {
206
+ if ( a !== b ) {
207
+ this.queueUpdate();
208
+ }
188
209
  },
189
210
 
190
- allNavLinks() {
191
- this.queueUpdate();
211
+ allNavLinks(a, b) {
212
+ if ( a !== b ) {
213
+ this.queueUpdate();
214
+ }
192
215
  },
193
216
 
194
- favoriteTypes() {
195
- this.queueUpdate();
217
+ favoriteTypes(a, b) {
218
+ if ( !isEqual(a, b) ) {
219
+ this.queueUpdate();
220
+ }
196
221
  },
197
222
 
198
223
  locale(a, b) {
@@ -315,7 +340,6 @@ export default {
315
340
  if ( this.gettingGroups ) {
316
341
  return;
317
342
  }
318
-
319
343
  this.gettingGroups = true;
320
344
 
321
345
  if ( !this.clusterReady ) {
@@ -370,6 +394,7 @@ export default {
370
394
 
371
395
  for ( const mode of modes ) {
372
396
  const types = this.$store.getters['type-map/allTypes'](productId, mode) || {};
397
+
373
398
  const more = this.$store.getters['type-map/getTree'](productId, mode, types, clusterId, namespaceMode, namespaces, currentType);
374
399
 
375
400
  if ( productId === EXPLORER || !this.isExplorer ) {
@@ -615,7 +640,7 @@ export default {
615
640
  {{ displayVersion }}
616
641
  </div>
617
642
  </nav>
618
- <main v-if="clusterReady">
643
+ <main v-if="clusterAndRouteReady">
619
644
  <nuxt class="outlet" />
620
645
  <ActionMenu />
621
646
  <PromptRemove />
package/layouts/error.vue CHANGED
@@ -35,7 +35,11 @@ export default {
35
35
  return;
36
36
  }
37
37
 
38
- this.ready = true;
38
+ // Avoid scenarios where the 404 error will blip up whilst the authenticated middleware is determining if there's an alternative valid
39
+ // route
40
+ setTimeout(() => {
41
+ this.ready = true;
42
+ }, 1000);
39
43
  },
40
44
 
41
45
  head() {
package/layouts/home.vue CHANGED
@@ -7,6 +7,7 @@ import { mapPref, DEV } from '@shell/store/prefs';
7
7
  import AwsComplianceBanner from '@shell/components/AwsComplianceBanner';
8
8
  import AzureWarning from '@shell/components/auth/AzureWarning';
9
9
  import BrowserTabVisibility from '@shell/mixins/browser-tab-visibility';
10
+ import { mapState } from 'vuex';
10
11
 
11
12
  export default {
12
13
 
@@ -29,7 +30,10 @@ export default {
29
30
  };
30
31
  },
31
32
 
32
- computed: { dev: mapPref(DEV) },
33
+ computed: {
34
+ dev: mapPref(DEV),
35
+ ...mapState(['managementReady']),
36
+ },
33
37
 
34
38
  methods: {
35
39
  toggleTheme() {
@@ -47,7 +51,7 @@ export default {
47
51
  <AzureWarning />
48
52
 
49
53
  <div class="dashboard-content">
50
- <Header :simple="true" />
54
+ <Header v-if="managementReady" :simple="true" />
51
55
 
52
56
  <main>
53
57
  <nuxt class="outlet" />
@@ -3,16 +3,19 @@ import BrandImage from '@shell/components/BrandImage';
3
3
  import TypeDescription from '@shell/components/TypeDescription';
4
4
  import ResourceTable from '@shell/components/ResourceTable';
5
5
  import Masthead from '@shell/components/ResourceList/Masthead';
6
- import { NAME as VIRTUAL } from '@shell/config/product/harvester';
7
- import { CAPI, HCI, VIRTUAL_HARVESTER_PROVIDER, MANAGEMENT } from '@shell/config/types';
6
+ import Loading from '@shell/components/Loading';
7
+ import { HARVESTER_NAME as VIRTUAL } from '@shell/config/product/harvester-manager';
8
+ import { CAPI, HCI, MANAGEMENT } from '@shell/config/types';
8
9
  import { isHarvesterCluster } from '@shell/utils/cluster';
10
+ import { allHash } from '@shell/utils/promise';
9
11
 
10
12
  export default {
11
13
  components: {
12
14
  BrandImage,
13
15
  ResourceTable,
14
16
  Masthead,
15
- TypeDescription
17
+ TypeDescription,
18
+ Loading
16
19
  },
17
20
 
18
21
  props: {
@@ -22,14 +25,30 @@ export default {
22
25
  },
23
26
  },
24
27
 
28
+ async fetch() {
29
+ const inStore = this.$store.getters['currentProduct'].inStore;
30
+
31
+ const hash = await allHash({
32
+ hciClusters: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.CLUSTER }),
33
+ mgmtClusters: this.$store.dispatch(`${ inStore }/findAll`, { type: MANAGEMENT.CLUSTER })
34
+ });
35
+
36
+ this.hciClusters = hash.hciClusters;
37
+ this.mgmtClusters = hash.mgmtClusters;
38
+ },
39
+
25
40
  data() {
26
41
  const resource = CAPI.RANCHER_CLUSTER;
27
42
 
28
43
  return {
44
+ navigating: false,
29
45
  VIRTUAL,
46
+ hciDashboard: HCI.DASHBOARD,
30
47
  resource,
31
- hResource: HCI.CLUSTER,
32
- realSchema: this.$store.getters['management/schemaFor'](CAPI.RANCHER_CLUSTER),
48
+ hResource: HCI.CLUSTER,
49
+ realSchema: this.$store.getters['management/schemaFor'](CAPI.RANCHER_CLUSTER),
50
+ hciClusters: [],
51
+ mgmtClusters: []
33
52
  };
34
53
  },
35
54
 
@@ -51,16 +70,8 @@ export default {
51
70
  },
52
71
 
53
72
  rows() {
54
- const inStore = this.$store.getters['currentProduct'].inStore;
55
- const clusters = this.$store.getters[`${ inStore }/all`](HCI.CLUSTER);
56
- const manageClusters = this.$store.getters[`${ inStore }/all`](MANAGEMENT.CLUSTER);
57
-
58
- return clusters.filter((c) => {
59
- const cluster = manageClusters.find(cluster => cluster?.metadata?.name === c?.status?.clusterName);
60
-
61
- if (cluster?.status?.provider && cluster?.status?.provider !== VIRTUAL_HARVESTER_PROVIDER) {
62
- return false;
63
- }
73
+ return this.hciClusters.filter((c) => {
74
+ const cluster = this.mgmtClusters.find(cluster => cluster?.metadata?.name === c?.status?.clusterName);
64
75
 
65
76
  return isHarvesterCluster(cluster);
66
77
  });
@@ -69,12 +80,33 @@ export default {
69
80
  typeDisplay() {
70
81
  return this.t(`typeLabel."${ HCI.CLUSTER }"`, { count: this.row?.length || 0 });
71
82
  },
83
+ },
84
+
85
+ methods: {
86
+ async goToCluster(row) {
87
+ const timeout = setTimeout(() => {
88
+ // Don't show loading indicator for quickly fetched plugins
89
+ this.navigating = row.id;
90
+ }, 1000);
91
+
92
+ try {
93
+ await row.goToCluster();
94
+
95
+ clearTimeout(timeout);
96
+ this.navigating = false;
97
+ } catch {
98
+ // The error handling is carried out within goToCluster, but just in case something happens before the promise chain can catch it...
99
+ clearTimeout(timeout);
100
+ this.navigating = false;
101
+ }
102
+ }
72
103
  }
73
104
  };
74
105
  </script>
75
106
 
76
107
  <template>
77
- <div>
108
+ <Loading v-if="$fetchState.pending" />
109
+ <div v-else>
78
110
  <Masthead
79
111
  :schema="realSchema"
80
112
  :resource="resource"
@@ -99,27 +131,17 @@ export default {
99
131
  v-if="rows && rows.length"
100
132
  :schema="schema"
101
133
  :rows="rows"
102
- :sub-rows="true"
103
134
  :is-creatable="true"
104
135
  :namespaced="false"
105
136
  >
106
137
  <template #col:name="{row}">
107
138
  <td>
108
- <span>
109
- <n-link
110
- v-if="row.isReady"
111
- :to="{
112
- name: `c-cluster-${VIRTUAL}`,
113
- params: {
114
- cluster: row.status.clusterName,
115
- }
116
- }"
117
- >
118
- {{ row.nameDisplay }}
119
- </n-link>
139
+ <span class="cluster-link">
140
+ <a v-if="row.isReady" class="link" :disabled="navigating" @click="goToCluster(row)">{{ row.nameDisplay }}</a>
120
141
  <span v-else>
121
142
  {{ row.nameDisplay }}
122
143
  </span>
144
+ <i class="icon icon-spinner icon-spin ml-5" :class="{'navigating': navigating === row.id}" />
123
145
  </span>
124
146
  </td>
125
147
  </template>
@@ -129,29 +151,43 @@ export default {
129
151
  class="btn btn-sm role-primary"
130
152
  :to="row.detailLocation"
131
153
  >
132
- {{ t('harvester.virtualizationManagement.manage') }}
154
+ {{ t('harvesterManager.manage') }}
133
155
  </n-link>
134
156
  </template>
135
157
  </ResourceTable>
136
158
  <div v-else>
137
159
  <div class="no-clusters">
138
- {{ t('harvester.manager.cluster.none') }}
160
+ {{ t('harvesterManager.cluster.none') }}
139
161
  </div>
140
162
  <hr class="info-section" />
141
163
  <div class="logo">
142
164
  <BrandImage file-name="harvester.png" height="64" />
143
165
  </div>
144
166
  <div class="tagline">
145
- <div>{{ t('harvester.manager.cluster.description') }}</div>
167
+ <div>{{ t('harvesterManager.cluster.description') }}</div>
146
168
  </div>
147
169
  <div class="tagline sub-tagline">
148
- <div v-html="t('harvester.manager.cluster.learnMore', {}, true)"></div>
170
+ <div v-html="t('harvesterManager.cluster.learnMore', {}, true)"></div>
149
171
  </div>
150
172
  </div>
151
173
  </div>
152
174
  </template>
153
175
 
154
176
  <style lang="scss" scoped>
177
+ .cluster-link {
178
+ display: flex;
179
+ align-items: center;
180
+
181
+ .icon {
182
+ // Use visibility to avoid the columns re-adjusting when the icon is shown
183
+ visibility: hidden;
184
+
185
+ &.navigating {
186
+ visibility: visible;
187
+ }
188
+ }
189
+
190
+ }
155
191
  .no-clusters {
156
192
  text-align: center;
157
193
  }
@@ -178,4 +214,9 @@ export default {
178
214
  text-align: center;
179
215
  }
180
216
  }
217
+
218
+ .link {
219
+ cursor: pointer;
220
+ }
221
+
181
222
  </style>
@@ -17,14 +17,12 @@ export default {
17
17
  },
18
18
 
19
19
  computed: {
20
- ...mapGetters(['isVirtualCluster']),
20
+ ...mapGetters(['currentProduct']),
21
21
 
22
22
  filterRow() {
23
- if (this.isVirtualCluster) {
23
+ if (this.currentProduct.hideSystemResources) {
24
24
  return this.rows.filter( (N) => {
25
- const isSettingSystemNamespace = this.$store.getters['systemNamespaces'].includes(N.metadata.name);
26
-
27
- return !N.isSystem && !N.isFleetManaged && !isSettingSystemNamespace;
25
+ return !N.isSystem && !N.isFleetManaged;
28
26
  });
29
27
  } else {
30
28
  return this.rows;
@@ -632,6 +632,7 @@ export default {
632
632
  <div>
633
633
  <Checkbox
634
634
  v-model="value.httpEndpoint"
635
+ value-when-true="enabled"
635
636
  :mode="mode"
636
637
  :disabled="disabled"
637
638
  :label="t('cluster.machineConfig.amazonEc2.httpEndpoint')"
@@ -640,6 +641,7 @@ export default {
640
641
  <div>
641
642
  <Checkbox
642
643
  v-model="value.httpTokens"
644
+ value-when-true="required"
643
645
  :mode="mode"
644
646
  :disabled="!value.httpEndpoint || disabled"
645
647
  :label="t('cluster.machineConfig.amazonEc2.httpTokens')"