@rancher/shell 3.0.8-rc.8 → 3.0.8

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 (260) hide show
  1. package/apis/impl/apis.ts +61 -0
  2. package/apis/index.ts +40 -0
  3. package/apis/intf/modal.ts +90 -0
  4. package/apis/intf/shell.ts +36 -0
  5. package/apis/intf/slide-in.ts +98 -0
  6. package/apis/intf/system.ts +41 -0
  7. package/apis/shell/__tests__/modal.test.ts +80 -0
  8. package/apis/shell/__tests__/notifications.test.ts +71 -0
  9. package/apis/shell/__tests__/slide-in.test.ts +54 -0
  10. package/apis/shell/__tests__/system.test.ts +129 -0
  11. package/apis/shell/index.ts +38 -0
  12. package/apis/shell/modal.ts +41 -0
  13. package/apis/shell/notifications.ts +65 -0
  14. package/apis/shell/slide-in.ts +33 -0
  15. package/apis/shell/system.ts +65 -0
  16. package/apis/vue-shim.d.ts +11 -0
  17. package/assets/brand/suse/dark/rancher-logo.svg +1 -64
  18. package/assets/styles/global/_tooltip.scss +6 -1
  19. package/assets/translations/en-us.yaml +14 -1
  20. package/components/ActionMenuShell.vue +3 -1
  21. package/components/BackLink.vue +8 -0
  22. package/components/BannerGraphic.vue +1 -5
  23. package/components/BrandImage.vue +17 -6
  24. package/components/Cron/CronExpressionEditor.vue +1 -1
  25. package/components/Cron/CronExpressionEditorModal.vue +1 -1
  26. package/components/CruResource.vue +8 -1
  27. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +1 -0
  28. package/components/Drawer/ResourceDetailDrawer/__tests__/composables.test.ts +50 -1
  29. package/components/Drawer/ResourceDetailDrawer/composables.ts +19 -0
  30. package/components/Drawer/ResourceDetailDrawer/index.vue +4 -1
  31. package/components/Drawer/ResourceDetailDrawer/types.ts +2 -1
  32. package/components/LocaleSelector.vue +2 -2
  33. package/components/ModalManager.vue +11 -1
  34. package/components/Questions/__tests__/Yaml.test.ts +1 -1
  35. package/components/Questions/__tests__/index.test.ts +159 -0
  36. package/components/RelatedResources.vue +5 -0
  37. package/components/Resource/Detail/Metadata/Annotations/index.vue +2 -2
  38. package/components/Resource/Detail/Metadata/Labels/index.vue +2 -2
  39. package/components/Resource/Detail/Metadata/index.vue +3 -3
  40. package/components/Resource/Detail/ResourcePopover/index.vue +5 -1
  41. package/components/Resource/Detail/composables.ts +2 -2
  42. package/components/ResourceDetail/Masthead/latest.vue +23 -21
  43. package/components/ResourceDetail/index.vue +3 -0
  44. package/components/ResourceTable.vue +54 -21
  45. package/components/SlideInPanelManager.vue +16 -11
  46. package/components/SortableTable/THead.vue +2 -1
  47. package/components/SortableTable/index.vue +20 -2
  48. package/components/Tabbed/__tests__/index.test.ts +86 -0
  49. package/components/Tabbed/index.vue +37 -2
  50. package/components/__tests__/NamespaceFilter.test.ts +49 -0
  51. package/components/auth/SelectPrincipal.vue +28 -6
  52. package/components/auth/__tests__/SelectPrincipal.test.ts +119 -0
  53. package/components/auth/login/ldap.vue +3 -3
  54. package/components/fleet/FleetSecretSelector.vue +1 -1
  55. package/components/form/KeyValue.vue +1 -1
  56. package/components/form/NameNsDescription.vue +1 -1
  57. package/components/form/NodeScheduling.vue +2 -2
  58. package/components/form/ResourceTabs/composable.ts +2 -2
  59. package/components/form/ResourceTabs/index.vue +0 -2
  60. package/components/form/__tests__/NameNsDescription.test.ts +42 -0
  61. package/components/formatter/InternalExternalIP.vue +4 -1
  62. package/components/formatter/LinkName.vue +5 -0
  63. package/components/formatter/__tests__/InternalExternalIP.test.ts +1 -1
  64. package/components/nav/Group.vue +25 -7
  65. package/components/nav/Header.vue +1 -1
  66. package/components/nav/NamespaceFilter.vue +1 -0
  67. package/components/nav/Type.vue +17 -6
  68. package/components/nav/WindowManager/panels/TabBodyContainer.vue +1 -1
  69. package/components/nav/__tests__/Type.test.ts +59 -0
  70. package/components/templates/standalone.vue +1 -1
  71. package/composables/cruResource.ts +27 -0
  72. package/composables/focusTrap.ts +3 -1
  73. package/composables/resourceDetail.ts +15 -0
  74. package/composables/useI18n.ts +10 -1
  75. package/composables/useLabeledFormElement.ts +3 -4
  76. package/config/__test__/uiplugins.test.ts +309 -0
  77. package/config/labels-annotations.js +1 -0
  78. package/config/product/explorer.js +3 -1
  79. package/config/product/fleet.js +1 -1
  80. package/config/router/navigation-guards/clusters.js +3 -3
  81. package/config/router/navigation-guards/products.js +1 -1
  82. package/config/router/routes.js +7 -7
  83. package/config/types.js +7 -0
  84. package/config/uiplugins.js +46 -2
  85. package/core/__tests__/extension-manager-impl.test.js +437 -0
  86. package/core/extension-manager-impl.js +21 -25
  87. package/core/plugin-helpers.ts +2 -2
  88. package/core/plugin.ts +9 -1
  89. package/core/plugins-loader.js +2 -2
  90. package/core/types-provisioning.ts +5 -1
  91. package/core/types.ts +35 -0
  92. package/detail/provisioning.cattle.io.cluster.vue +9 -6
  93. package/dialog/DeveloperLoadExtensionDialog.vue +13 -4
  94. package/dialog/MoveNamespaceDialog.vue +20 -4
  95. package/dialog/RollbackWorkloadDialog.vue +2 -5
  96. package/dialog/SearchDialog.vue +1 -0
  97. package/dialog/__tests__/MoveNamespaceDialog.test.ts +249 -0
  98. package/directives/__tests__/clean-tooltip.test.ts +298 -0
  99. package/directives/clean-tooltip.ts +234 -0
  100. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +2 -2
  101. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +100 -3
  102. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -0
  103. package/edit/configmap.vue +1 -0
  104. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  105. package/edit/fleet.cattle.io.helmop.vue +11 -6
  106. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  107. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  108. package/edit/logging-flow/index.vue +1 -0
  109. package/edit/logging.banzaicloud.io.output/index.vue +1 -0
  110. package/edit/management.cattle.io.fleetworkspace.vue +1 -1
  111. package/edit/management.cattle.io.project.vue +1 -0
  112. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +4 -1
  113. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +2 -1
  114. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  115. package/edit/monitoring.coreos.com.receiver/index.vue +2 -1
  116. package/edit/monitoring.coreos.com.route.vue +1 -1
  117. package/edit/namespace.vue +1 -0
  118. package/edit/networking.istio.io.destinationrule/index.vue +1 -0
  119. package/edit/networking.k8s.io.ingress/index.vue +1 -0
  120. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +1 -0
  121. package/edit/networking.k8s.io.networkpolicy/index.vue +1 -0
  122. package/edit/node.vue +1 -0
  123. package/edit/persistentvolume/index.vue +27 -22
  124. package/edit/persistentvolume/plugins/awsElasticBlockStore.vue +13 -14
  125. package/edit/persistentvolume/plugins/azureDisk.vue +49 -48
  126. package/edit/persistentvolume/plugins/azureFile.vue +15 -14
  127. package/edit/persistentvolume/plugins/cephfs.vue +15 -14
  128. package/edit/persistentvolume/plugins/cinder.vue +15 -14
  129. package/edit/persistentvolume/plugins/csi.vue +18 -16
  130. package/edit/persistentvolume/plugins/fc.vue +13 -14
  131. package/edit/persistentvolume/plugins/flexVolume.vue +15 -14
  132. package/edit/persistentvolume/plugins/flocker.vue +1 -3
  133. package/edit/persistentvolume/plugins/gcePersistentDisk.vue +13 -14
  134. package/edit/persistentvolume/plugins/glusterfs.vue +15 -14
  135. package/edit/persistentvolume/plugins/hostPath.vue +40 -39
  136. package/edit/persistentvolume/plugins/iscsi.vue +13 -14
  137. package/edit/persistentvolume/plugins/local.vue +1 -3
  138. package/edit/persistentvolume/plugins/longhorn.vue +23 -22
  139. package/edit/persistentvolume/plugins/nfs.vue +15 -14
  140. package/edit/persistentvolume/plugins/photonPersistentDisk.vue +1 -14
  141. package/edit/persistentvolume/plugins/portworxVolume.vue +15 -14
  142. package/edit/persistentvolume/plugins/quobyte.vue +15 -14
  143. package/edit/persistentvolume/plugins/rbd.vue +15 -14
  144. package/edit/persistentvolume/plugins/scaleIO.vue +15 -14
  145. package/edit/persistentvolume/plugins/storageos.vue +15 -14
  146. package/edit/persistentvolume/plugins/vsphereVolume.vue +1 -3
  147. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +21 -21
  148. package/edit/provisioning.cattle.io.cluster/index.vue +5 -5
  149. package/edit/provisioning.cattle.io.cluster/rke2.vue +9 -8
  150. package/edit/resources.cattle.io.restore.vue +1 -1
  151. package/edit/secret/index.vue +1 -1
  152. package/edit/service.vue +1 -0
  153. package/edit/serviceaccount.vue +1 -0
  154. package/edit/storage.k8s.io.storageclass/index.vue +1 -0
  155. package/edit/workload/Job.vue +2 -2
  156. package/edit/workload/index.vue +2 -1
  157. package/edit/workload/mixins/workload.js +1 -1
  158. package/initialize/App.vue +4 -4
  159. package/initialize/install-plugins.js +19 -5
  160. package/machine-config/azure.vue +1 -1
  161. package/machine-config/components/GCEImage.vue +1 -1
  162. package/mixins/__tests__/brand.spec.ts +2 -2
  163. package/mixins/brand.js +1 -7
  164. package/mixins/create-edit-view/index.js +5 -0
  165. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +128 -5
  166. package/models/chart.js +70 -74
  167. package/models/management.cattle.io.cluster.js +21 -3
  168. package/models/provisioning.cattle.io.cluster.js +31 -11
  169. package/package.json +11 -10
  170. package/pages/auth/login.vue +4 -6
  171. package/pages/auth/setup.vue +1 -1
  172. package/pages/auth/verify.vue +3 -3
  173. package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +135 -0
  174. package/pages/c/_cluster/apps/charts/chart.vue +33 -15
  175. package/pages/c/_cluster/apps/charts/index.vue +122 -24
  176. package/pages/c/_cluster/apps/charts/install.vue +33 -0
  177. package/pages/c/_cluster/explorer/__tests__/index.test.ts +1 -1
  178. package/pages/c/_cluster/explorer/index.vue +8 -6
  179. package/pages/c/_cluster/fleet/index.vue +4 -7
  180. package/pages/c/_cluster/manager/hostedprovider/index.vue +12 -6
  181. package/pages/c/_cluster/settings/brand.vue +1 -1
  182. package/pages/c/_cluster/settings/index.vue +5 -0
  183. package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +7 -0
  184. package/pages/c/_cluster/uiplugins/catalogs.vue +147 -0
  185. package/pages/c/_cluster/uiplugins/index.vue +126 -184
  186. package/pkg/auto-import.js +3 -3
  187. package/pkg/dynamic-importer.lib.js +1 -1
  188. package/pkg/import.js +1 -1
  189. package/plugins/__tests__/mutations.tests.ts +179 -0
  190. package/plugins/dashboard-client-init.js +3 -0
  191. package/plugins/dashboard-store/getters.js +19 -2
  192. package/plugins/dashboard-store/model-loader.js +1 -1
  193. package/plugins/dashboard-store/mutations.js +23 -2
  194. package/plugins/dashboard-store/resource-class.js +11 -5
  195. package/plugins/i18n.js +8 -0
  196. package/plugins/plugin.js +2 -2
  197. package/plugins/steve/__tests__/steve-pagination-utils.test.ts +506 -0
  198. package/plugins/steve/steve-class.js +1 -1
  199. package/plugins/steve/steve-pagination-utils.ts +131 -47
  200. package/rancher-components/Form/Checkbox/Checkbox.vue +1 -1
  201. package/rancher-components/Form/LabeledInput/LabeledInput.vue +1 -1
  202. package/rancher-components/Pill/RcStatusBadge/RcStatusBadge.vue +6 -42
  203. package/rancher-components/Pill/RcStatusBadge/index.ts +0 -1
  204. package/rancher-components/Pill/RcStatusBadge/types.ts +1 -1
  205. package/rancher-components/Pill/RcStatusIndicator/RcStatusIndicator.vue +5 -28
  206. package/rancher-components/Pill/RcStatusIndicator/types.ts +2 -1
  207. package/rancher-components/Pill/types.ts +0 -1
  208. package/rancher-components/RcDropdown/useDropdownContext.ts +2 -4
  209. package/rancher-components/RcIcon/RcIcon.test.ts +51 -0
  210. package/rancher-components/RcIcon/RcIcon.vue +46 -0
  211. package/rancher-components/RcIcon/index.ts +1 -0
  212. package/rancher-components/RcIcon/types.ts +160 -0
  213. package/rancher-components/RcItemCard/RcItemCard.vue +1 -1
  214. package/rancher-components/utils/status.test.ts +67 -0
  215. package/rancher-components/utils/status.ts +77 -0
  216. package/scripts/publish-shell.sh +25 -0
  217. package/scripts/typegen.sh +1 -0
  218. package/store/__tests__/catalog.test.ts +1 -1
  219. package/store/__tests__/type-map.test.ts +164 -2
  220. package/store/action-menu.js +8 -0
  221. package/store/auth.js +25 -13
  222. package/store/catalog.js +6 -0
  223. package/store/i18n.js +3 -3
  224. package/store/index.js +8 -6
  225. package/store/notifications.ts +2 -0
  226. package/store/prefs.js +6 -7
  227. package/store/type-map.js +17 -7
  228. package/store/wm.ts +4 -4
  229. package/types/internal-api/shell/modal.d.ts +6 -6
  230. package/types/notifications/index.ts +126 -15
  231. package/types/rancher/index.d.ts +9 -0
  232. package/types/shell/index.d.ts +54 -3
  233. package/types/store/__tests__/pagination.types.spec.ts +137 -0
  234. package/types/store/pagination.types.ts +157 -9
  235. package/types/vue-shim.d.ts +5 -4
  236. package/utils/__tests__/provider.test.ts +98 -0
  237. package/utils/__tests__/router.test.js +238 -0
  238. package/utils/__tests__/selector-typed.test.ts +263 -0
  239. package/utils/cluster.js +4 -1
  240. package/utils/color.js +1 -1
  241. package/utils/dynamic-content/__tests__/info.test.ts +6 -0
  242. package/utils/dynamic-content/info.ts +43 -0
  243. package/utils/favicon.js +4 -4
  244. package/utils/fleet.ts +8 -1
  245. package/utils/pagination-utils.ts +2 -2
  246. package/utils/pagination-wrapper.ts +1 -1
  247. package/utils/provider.ts +14 -0
  248. package/utils/router.js +50 -0
  249. package/utils/selector-typed.ts +6 -2
  250. package/utils/unit-tests/pagination-utils.spec.ts +8 -8
  251. package/vue.config.js +3 -3
  252. package/composables/useExtensionManager.ts +0 -17
  253. package/core/plugins.js +0 -38
  254. package/directives/clean-tooltip.js +0 -32
  255. package/plugins/internal-api/index.ts +0 -37
  256. package/plugins/internal-api/shared/base-api.ts +0 -13
  257. package/plugins/internal-api/shell/shell.api.ts +0 -108
  258. package/plugins/nuxt-client-init.js +0 -3
  259. package/types/internal-api/shell/growl.d.ts +0 -25
  260. package/types/internal-api/shell/slideIn.d.ts +0 -15
@@ -112,8 +112,8 @@ describe('component: rke2', () => {
112
112
  global: {
113
113
  mocks: {
114
114
  ...defaultMocks,
115
- $store: { dispatch: () => jest.fn(), getters: defaultGetters },
116
- $plugin: { getDynamic: jest.fn(() => undefined ) }
115
+ $store: { dispatch: () => jest.fn(), getters: defaultGetters },
116
+ $extension: { getDynamic: jest.fn(() => undefined ) }
117
117
  },
118
118
 
119
119
  stubs: defaultStubs,
@@ -143,8 +143,8 @@ describe('component: rke2', () => {
143
143
  global: {
144
144
  mocks: {
145
145
  ...defaultMocks,
146
- $store: { dispatch: () => jest.fn(), getters: defaultGetters },
147
- $plugin: { getDynamic: jest.fn(() => undefined ) },
146
+ $store: { dispatch: () => jest.fn(), getters: defaultGetters },
147
+ $extension: { getDynamic: jest.fn(() => undefined ) },
148
148
  },
149
149
 
150
150
  stubs: defaultStubs,
@@ -174,8 +174,8 @@ describe('component: rke2', () => {
174
174
  global: {
175
175
  mocks: {
176
176
  ...defaultMocks,
177
- $store: { dispatch: () => jest.fn(), getters: defaultGetters },
178
- $plugin: { getDynamic: jest.fn(() => undefined ) },
177
+ $store: { dispatch: () => jest.fn(), getters: defaultGetters },
178
+ $extension: { getDynamic: jest.fn(() => undefined ) },
179
179
  },
180
180
 
181
181
  stubs: defaultStubs,
@@ -231,7 +231,7 @@ describe('component: rke2', () => {
231
231
  },
232
232
  getters: defaultGetters
233
233
  },
234
- $plugin: { getDynamic: jest.fn(() => undefined ) },
234
+ $extension: { getDynamic: jest.fn(() => undefined ) },
235
235
  },
236
236
 
237
237
  stubs: defaultStubs,
@@ -275,7 +275,7 @@ describe('component: rke2', () => {
275
275
  'management/findAll': () => ([]),
276
276
  }
277
277
  },
278
- $plugin: { getDynamic: jest.fn(() => undefined ) },
278
+ $extension: { getDynamic: jest.fn(() => undefined ) },
279
279
  },
280
280
 
281
281
  stubs: defaultStubs,
@@ -324,7 +324,7 @@ describe('component: rke2', () => {
324
324
  'management/findAll': () => ([]),
325
325
  }
326
326
  },
327
- $plugin: { getDynamic: jest.fn(() => undefined ) },
327
+ $extension: { getDynamic: jest.fn(() => undefined ) },
328
328
  },
329
329
 
330
330
  stubs: defaultStubs,
@@ -369,8 +369,8 @@ describe('component: rke2', () => {
369
369
  global: {
370
370
  mocks: {
371
371
  ...defaultMocks,
372
- $store: { dispatch: () => jest.fn(), getters: defaultGetters },
373
- $plugin: { getDynamic: jest.fn(() => undefined ) },
372
+ $store: { dispatch: () => jest.fn(), getters: defaultGetters },
373
+ $extension: { getDynamic: jest.fn(() => undefined ) },
374
374
  },
375
375
  stubs: defaultStubs
376
376
  }
@@ -409,8 +409,8 @@ describe('component: rke2', () => {
409
409
  global: {
410
410
  mocks: {
411
411
  ...defaultMocks,
412
- $store: { dispatch: () => jest.fn(), getters: defaultGetters },
413
- $plugin: { getDynamic: jest.fn(() => undefined ) },
412
+ $store: { dispatch: () => jest.fn(), getters: defaultGetters },
413
+ $extension: { getDynamic: jest.fn(() => undefined ) },
414
414
  },
415
415
  stubs: defaultStubs
416
416
  }
@@ -441,8 +441,8 @@ describe('component: rke2', () => {
441
441
  global: {
442
442
  mocks: {
443
443
  ...defaultMocks,
444
- $store: { dispatch: () => jest.fn(), getters: defaultGetters },
445
- $plugin: { getDynamic: jest.fn(() => undefined ) },
444
+ $store: { dispatch: () => jest.fn(), getters: defaultGetters },
445
+ $extension: { getDynamic: jest.fn(() => undefined ) },
446
446
  },
447
447
  stubs: defaultStubs
448
448
  }
@@ -489,8 +489,8 @@ describe('component: rke2', () => {
489
489
  global: {
490
490
  mocks: {
491
491
  ...defaultMocks,
492
- $store: { dispatch: () => jest.fn(), getters: defaultGetters },
493
- $plugin: { getDynamic: jest.fn(() => undefined ) },
492
+ $store: { dispatch: () => jest.fn(), getters: defaultGetters },
493
+ $extension: { getDynamic: jest.fn(() => undefined ) },
494
494
  },
495
495
  stubs: defaultStubs
496
496
  }
@@ -536,8 +536,8 @@ describe('component: rke2', () => {
536
536
  global: {
537
537
  mocks: {
538
538
  ...defaultMocks,
539
- $store: { dispatch: () => jest.fn(), getters: defaultGetters },
540
- $plugin: { getDynamic: jest.fn(() => undefined ) },
539
+ $store: { dispatch: () => jest.fn(), getters: defaultGetters },
540
+ $extension: { getDynamic: jest.fn(() => undefined ) },
541
541
  },
542
542
  stubs: defaultStubs
543
543
  }
@@ -600,8 +600,8 @@ describe('component: rke2', () => {
600
600
  global: {
601
601
  mocks: {
602
602
  ...defaultMocks,
603
- $store: { dispatch: () => jest.fn(), getters: defaultGetters },
604
- $plugin: { getDynamic: jest.fn(() => undefined ) },
603
+ $store: { dispatch: () => jest.fn(), getters: defaultGetters },
604
+ $extension: { getDynamic: jest.fn(() => undefined ) },
605
605
  },
606
606
 
607
607
  stubs: defaultStubs,
@@ -332,9 +332,9 @@ export default {
332
332
  // Keeping this for non Rancher-managed kontainer drivers
333
333
  this.kontainerDrivers.filter((x) => (isImport ? x.showImport : x.showCreate)).forEach((obj) => {
334
334
  if ( vueKontainerTypes.includes(obj.driverName) ) {
335
- addType(this.$plugin, obj.driverName, 'hosted', false);
335
+ addType(this.$extension, obj.driverName, 'hosted', false);
336
336
  } else {
337
- addType(this.$plugin, obj.driverName, 'hosted', false, (isImport ? obj.emberImportPath : obj.emberCreatePath));
337
+ addType(this.$extension, obj.driverName, 'hosted', false, (isImport ? obj.emberImportPath : obj.emberCreatePath));
338
338
  }
339
339
  });
340
340
  if (!isImport) {
@@ -351,7 +351,7 @@ export default {
351
351
 
352
352
  // If Elemental is installed, then add the elemental cluster provider
353
353
  if (isElementalActive) {
354
- addType(this.$plugin, ELEMENTAL_CLUSTER_PROVIDER, 'custom2', false);
354
+ addType(this.$extension, ELEMENTAL_CLUSTER_PROVIDER, 'custom2', false);
355
355
  }
356
356
 
357
357
  // Only add the RKE2 options if RKE2 is enabled
@@ -359,10 +359,10 @@ export default {
359
359
  machineTypes.forEach((type) => {
360
360
  const id = type.spec.displayName || type.id;
361
361
 
362
- addType(this.$plugin, id, _RKE2, false, null, undefined, type);
362
+ addType(this.$extension, id, _RKE2, false, null, undefined, type);
363
363
  });
364
364
 
365
- addType(this.$plugin, 'custom', 'custom2', false);
365
+ addType(this.$extension, 'custom', 'custom2', false);
366
366
  }
367
367
  }
368
368
  // Add from extensions
@@ -502,7 +502,7 @@ export default {
502
502
  * 2) Override via hardcoded setting
503
503
  */
504
504
  cloudCredentialsOverride() {
505
- const cloudCredential = this.$plugin.getDynamic('cloud-credential', this.provider);
505
+ const cloudCredential = this.$extension.getDynamic('cloud-credential', this.provider);
506
506
 
507
507
  if (cloudCredential === undefined) {
508
508
  return CLOUD_CREDENTIAL_OVERRIDE[this.provider];
@@ -527,16 +527,16 @@ export default {
527
527
  * Extension provider where being provisioned by an extension
528
528
  */
529
529
  extensionProvider() {
530
- const extClass = this.$plugin.getDynamic('provisioner', this.provider);
530
+ const extClass = this.$extension.getDynamic('provisioner', this.provider);
531
531
 
532
532
  if (extClass) {
533
533
  return new extClass({
534
- dispatch: this.$store.dispatch,
535
- getters: this.$store.getters,
536
- axios: this.$store.$axios,
537
- $plugin: this.$store.app.$plugin,
538
- $t: this.t,
539
- isCreate: this.isCreate
534
+ dispatch: this.$store.dispatch,
535
+ getters: this.$store.getters,
536
+ axios: this.$store.$axios,
537
+ $extension: this.$store.app.$extension,
538
+ $t: this.t,
539
+ isCreate: this.isCreate
540
540
  });
541
541
  }
542
542
 
@@ -2440,6 +2440,7 @@ export default {
2440
2440
  :side-tabs="true"
2441
2441
  class="min-height"
2442
2442
  :use-hash="useTabbedHash"
2443
+ :default-tab="defaultTab"
2443
2444
  @changed="handleTabChange"
2444
2445
  >
2445
2446
  <Tab
@@ -310,7 +310,7 @@ export default {
310
310
  <template #label>
311
311
  <label
312
312
  v-clean-tooltip="t('backupRestoreOperator.deleteTimeout.tip')"
313
- class="v-popper--has-tooltip"
313
+ class="has-clean-tooltip"
314
314
  >
315
315
  {{ t('backupRestoreOperator.deleteTimeout.label') }} <i class="icon icon-info" />
316
316
  </label>
@@ -485,7 +485,7 @@ export default {
485
485
  v-else
486
486
  :side-tabs="true"
487
487
  :use-hash="useTabbedHash"
488
- default-tab="data"
488
+ :default-tab="defaultTab || 'data'"
489
489
  >
490
490
  <Tab
491
491
  name="data"
package/edit/service.vue CHANGED
@@ -351,6 +351,7 @@ export default {
351
351
  <Tabbed
352
352
  :side-tabs="true"
353
353
  :use-hash="useTabbedHash"
354
+ :default-tab="defaultTab"
354
355
  >
355
356
  <Tab
356
357
  v-if="checkTypeIs('ExternalName')"
@@ -145,6 +145,7 @@ export default {
145
145
  <Tabbed
146
146
  :side-tabs="true"
147
147
  :use-hash="useTabbedHash"
148
+ :default-tab="defaultTab"
148
149
  >
149
150
  <Tab
150
151
  name="data"
@@ -240,6 +240,7 @@ export default {
240
240
  <Tabbed
241
241
  :side-tabs="true"
242
242
  :use-hash="useTabbedHash"
243
+ :default-tab="defaultTab"
243
244
  >
244
245
  <Tab
245
246
  name="parameters"
@@ -261,7 +261,7 @@ export default {
261
261
  >
262
262
  <template #label>
263
263
  <label
264
- class="v-popper--has-tooltip"
264
+ class="has-clean-tooltip"
265
265
  :style="{'color':'var(--input-label)'}"
266
266
  >
267
267
  {{ t('workload.upgrading.terminationGracePeriodSeconds.label') }}
@@ -322,7 +322,7 @@ export default {
322
322
  >
323
323
  <template #label>
324
324
  <label
325
- class="v-popper--has-tooltip"
325
+ class="has-clean-tooltip"
326
326
  :style="{'color':'var(--input-label)'}"
327
327
  >
328
328
  {{ t('workload.upgrading.terminationGracePeriodSeconds.label') }}
@@ -152,9 +152,10 @@ export default {
152
152
  ref="containersTabbed"
153
153
  class="deployment-tabs"
154
154
  :show-tabs-add-remove="true"
155
- :default-tab="defaultTab"
155
+ :default-tab="defaultTab || defaultWorkloadTab"
156
156
  :flat="true"
157
157
  :use-hash="useTabbedHash"
158
+ :showExtensionTabs="false"
158
159
  data-testid="workload-horizontal-tabs"
159
160
  @changed="changed"
160
161
  >
@@ -292,7 +292,7 @@ export default {
292
292
  return { general: this.fvGetPathErrors(['image'])?.length > 0 };
293
293
  },
294
294
 
295
- defaultTab() {
295
+ defaultWorkloadTab() {
296
296
  if (!!this.$route.query.sidecar || this.$route.query.init || this.mode === _CREATE) {
297
297
  const container = this.allContainers.find((c) => c.__active);
298
298
 
@@ -1,5 +1,5 @@
1
1
  <script>
2
- import NuxtLoading from '@shell/components/nav/GlobalLoading.vue';
2
+ import GlobalLoading from '@shell/components/nav/GlobalLoading.vue';
3
3
 
4
4
  import '@shell/assets/styles/app.scss';
5
5
 
@@ -55,12 +55,12 @@ export default {
55
55
  },
56
56
  },
57
57
 
58
- components: { NuxtLoading }
58
+ components: { GlobalLoading }
59
59
  };
60
60
  </script>
61
61
  <template>
62
- <div id="__nuxt">
63
- <NuxtLoading ref="loading" />
62
+ <div id="__root">
63
+ <GlobalLoading ref="loading" />
64
64
  <div
65
65
  id="__layout"
66
66
  >
@@ -17,15 +17,14 @@ import axiosShell from '@shell/plugins/axios';
17
17
  import codeMirror from '@shell/plugins/codemirror-loader';
18
18
  import { InstallCodeMirror } from 'codemirror-editor-vue3';
19
19
  import * as intNumber from '@shell/directives/int-number';
20
- import nuxtClientInit from '@shell/plugins/nuxt-client-init';
20
+ import dashboardClientInit from '@shell/plugins/dashboard-client-init';
21
21
  import plugin from '@shell/plugins/plugin';
22
- import plugins from '@shell/core/plugins.js';
23
22
  import pluginsLoader from '@shell/core/plugins-loader.js';
24
23
  import replaceAll from '@shell/plugins/replaceall';
25
24
  import steveCreateWorker from '@shell/plugins/steve-create-worker';
26
25
  import emberCookie from '@shell/plugins/ember-cookie';
27
26
  import ShortKey from '@shell/plugins/shortkey';
28
- import internalApiPlugin from '@shell/plugins/internal-api';
27
+ import { initUiApis } from '@shell/apis/impl/apis';
29
28
 
30
29
  import 'floating-vue/dist/style.css';
31
30
  import { floatingVueOptions } from '@shell/plugins/floating-vue';
@@ -48,13 +47,28 @@ export async function installPlugins(vueApp) {
48
47
  }
49
48
 
50
49
  export async function installInjectedPlugins(app, vueApp) {
51
- const pluginDefinitions = [config, axios, plugins, pluginsLoader, axiosShell, intNumber, codeMirror, nuxtClientInit, replaceAll, plugin, steveCreateWorker, emberCookie, internalApiPlugin, dynamicContent];
50
+ const pluginDefinitions = [
51
+ config,
52
+ axios,
53
+ initUiApis,
54
+ pluginsLoader,
55
+ axiosShell,
56
+ intNumber,
57
+ codeMirror,
58
+ dashboardClientInit,
59
+ replaceAll,
60
+ plugin,
61
+ steveCreateWorker,
62
+ emberCookie,
63
+ dynamicContent,
64
+ ];
52
65
 
53
66
  const installations = pluginDefinitions.map(async(pluginDefinition) => {
54
67
  if (typeof pluginDefinition === 'function') {
55
68
  await pluginDefinition(
56
69
  app.context,
57
- (key, value) => inject(key, value, app.context, vueApp)
70
+ (key, value) => inject(key, value, app.context, vueApp),
71
+ vueApp
58
72
  );
59
73
  }
60
74
  });
@@ -37,7 +37,7 @@ const defaultConfig = {
37
37
  faultDomainCount: '3',
38
38
  image: 'canonical:ubuntu-24_04-lts:server-gen1:latest',
39
39
  location: 'westus',
40
- managedDisks: false,
40
+ managedDisks: true,
41
41
  noPublicIp: false,
42
42
  nsg: null,
43
43
  privateIpAddress: null,
@@ -8,7 +8,7 @@ import { getGKEImageFamilies, getGKEFamiliesFromProject } from '@shell/component
8
8
  import debounce from 'lodash/debounce';
9
9
  import { mapGetters } from 'vuex';
10
10
 
11
- const DEFAULT_PROJECTS = 'suse-cloud, ubuntu-os-cloud, rhel-cloud';
11
+ const DEFAULT_PROJECTS = 'ubuntu-os-cloud';
12
12
  const DEFAULT_MIN_DISK = 10;
13
13
 
14
14
  export default {
@@ -99,9 +99,9 @@ describe('brandMixin', () => {
99
99
  filters: [{
100
100
  equals: true,
101
101
  fields: [{
102
- equals: true, exact: true, exists: false, field: 'metadata.name', value: 'rancher-csp-adapter'
102
+ equality: '=', equals: true, exact: true, exists: false, field: 'metadata.name', value: 'rancher-csp-adapter'
103
103
  }, {
104
- equals: true, exact: true, exists: false, field: 'metadata.name', value: 'rancher-csp-billing-adapter'
104
+ equality: '=', equals: true, exact: true, exists: false, field: 'metadata.name', value: 'rancher-csp-billing-adapter'
105
105
  }],
106
106
  param: 'filter'
107
107
  }],
package/mixins/brand.js CHANGED
@@ -36,7 +36,7 @@ export default {
36
36
  },
37
37
 
38
38
  computed: {
39
- ...mapGetters({ loggedIn: 'auth/loggedIn' }),
39
+ ...mapGetters({ loggedIn: 'auth/loggedIn', brand: 'management/brand' }),
40
40
 
41
41
  // added to fix https://github.com/rancher/dashboard/issues/10788
42
42
  // because on logout the brand mixin is mounted, but then a management store reset happens
@@ -46,12 +46,6 @@ export default {
46
46
  return this.$store.getters['management/all'](MANAGEMENT.SETTING);
47
47
  },
48
48
 
49
- brand() {
50
- const setting = this.globalSettings?.find((gs) => gs.id === SETTING.BRAND);
51
-
52
- return setting?.value;
53
- },
54
-
55
49
  color() {
56
50
  const setting = this.globalSettings?.find((gs) => gs.id === SETTING.PRIMARY_COLOR);
57
51
 
@@ -48,6 +48,11 @@ export default defineComponent({
48
48
  useTabbedHash: {
49
49
  type: Boolean,
50
50
  default: undefined
51
+ },
52
+
53
+ defaultTab: {
54
+ type: String,
55
+ default: undefined
51
56
  }
52
57
  },
53
58
  });
@@ -1,24 +1,28 @@
1
1
  import ProvCluster from '@shell/models/provisioning.cattle.io.cluster';
2
-
2
+ jest.mock('@shell/utils/provider', () => ({
3
+ isHostedProvider: jest.fn().mockImplementation((context, provider) => {
4
+ return ['GKE', 'EKS', 'AKS'].includes(provider);
5
+ })
6
+ }));
3
7
  describe('class ProvCluster', () => {
4
8
  const gkeClusterWithPrivateEndpoint = {
5
9
  clusterName: 'test',
6
10
  provisioner: 'GKE',
7
- spec: { rkeConfig: {} },
11
+ spec: { },
8
12
  mgmt: { spec: { gkeConfig: { privateClusterConfig: { enablePrivateEndpoint: true } } } }
9
13
  };
10
14
 
11
15
  const eksClusterWithPrivateEndpoint = {
12
16
  clusterName: 'test',
13
17
  provisioner: 'EKS',
14
- spec: { rkeConfig: {} },
18
+ spec: { },
15
19
  mgmt: { spec: { eksConfig: { privateAccess: true } } }
16
20
  };
17
21
 
18
22
  const aksClusterWithPrivateEndpoint = {
19
23
  clusterName: 'test',
20
24
  provisioner: 'AKS',
21
- spec: { rkeConfig: {} },
25
+ spec: { },
22
26
  mgmt: { spec: { aksConfig: { privateCluster: true } } }
23
27
  };
24
28
 
@@ -44,12 +48,131 @@ describe('class ProvCluster', () => {
44
48
  clusterData.provisioner
45
49
  );
46
50
 
47
- expect(cluster.isRke2).toBe(expected);
51
+ expect(cluster.isRke2).toBe(false);
48
52
  expect(cluster.isHostedKubernetesProvider).toBe(expected);
49
53
  expect(cluster.isPrivateHostedProvider).toBe(expected);
50
54
  resetMocks();
51
55
  });
52
56
  });
57
+ describe('isImported', () => {
58
+ const testCases = [
59
+ {
60
+ description: 'should return false for a local cluster',
61
+ clusterData: { isLocal: true },
62
+ expected: false
63
+ },
64
+ {
65
+ description: 'should return true for an imported k3s cluster',
66
+ clusterData: {
67
+ isLocal: false,
68
+ mgmt: { status: { provider: 'k3s', driver: 'k3s' } }
69
+ },
70
+ expected: true
71
+ },
72
+ {
73
+ description: 'should return true for an imported k3s cluster in waiting state',
74
+ clusterData: {
75
+ isLocal: false,
76
+ mgmt: { status: { provider: undefined, driver: 'k3s' } }
77
+ },
78
+ expected: true
79
+ },
80
+ {
81
+ description: 'should return true for an imported rke2 cluster in waiting state',
82
+ clusterData: {
83
+ isLocal: false,
84
+ mgmt: { status: { provider: undefined, driver: 'rke2' } }
85
+ },
86
+ expected: true
87
+ },
88
+ {
89
+ description: 'should return false for a provisioned k3s cluster',
90
+ clusterData: {
91
+ isLocal: false,
92
+ mgmt: { status: { provider: 'k3s', driver: 'imported' } }
93
+ },
94
+ expected: false
95
+ },
96
+ {
97
+ description: 'should return true for an imported rke2 cluster',
98
+ clusterData: {
99
+ isLocal: false,
100
+ mgmt: { status: { provider: 'rke2', driver: 'rke2' } }
101
+ },
102
+ expected: true
103
+ },
104
+ {
105
+ description: 'should return false for a provisioned rke2 cluster',
106
+ clusterData: {
107
+ isLocal: false,
108
+ mgmt: { status: { provider: 'rke2', driver: 'imported' } }
109
+ },
110
+ expected: false
111
+ },
112
+ {
113
+ description: 'should return true for an imported hosted cluster',
114
+ clusterData: {
115
+ isLocal: false,
116
+ isHostedKubernetesProvider: true,
117
+ providerConfig: { imported: true }
118
+ },
119
+ expected: true
120
+ },
121
+ {
122
+ description: 'should return false for a provisioned hosted cluster',
123
+ clusterData: {
124
+ isLocal: false,
125
+ isHostedKubernetesProvider: true,
126
+ providerConfig: { imported: false }
127
+ },
128
+ expected: false
129
+ },
130
+ {
131
+ description: 'should return true for a generic imported cluster',
132
+ clusterData: {
133
+ isLocal: false,
134
+ provisioner: 'imported'
135
+ },
136
+ expected: true
137
+ },
138
+ {
139
+ description: 'should return false for a generic provisioned cluster',
140
+ clusterData: {
141
+ isLocal: false,
142
+ provisioner: 'rke2'
143
+ },
144
+ expected: false
145
+ }
146
+ ];
147
+ const resetMocks = () => {
148
+ // Clear all mock function calls:
149
+ jest.clearAllMocks();
150
+ };
151
+
152
+ it.each(testCases)('$description', ({ clusterData, expected }) => {
153
+ const cluster = new ProvCluster({});
154
+
155
+ // Mock getters
156
+ jest.spyOn(cluster, 'mgmt', 'get').mockReturnValue(
157
+ clusterData.mgmt
158
+ );
159
+ if (clusterData.isLocal !== undefined) {
160
+ jest.spyOn(cluster, 'isLocal', 'get').mockReturnValue(clusterData.isLocal);
161
+ }
162
+ if (clusterData.isHostedKubernetesProvider !== undefined) {
163
+ jest.spyOn(cluster, 'isHostedKubernetesProvider', 'get').mockReturnValue(clusterData.isHostedKubernetesProvider);
164
+ }
165
+ if (clusterData.providerConfig !== undefined) {
166
+ jest.spyOn(cluster, 'providerConfig', 'get').mockReturnValue(clusterData.providerConfig);
167
+ }
168
+ if (clusterData.provisioner !== undefined) {
169
+ jest.spyOn(cluster, 'provisioner', 'get').mockReturnValue(clusterData.provisioner);
170
+ }
171
+
172
+ expect(cluster.isImported).toBe(expected);
173
+ resetMocks();
174
+ });
175
+ });
53
176
 
54
177
  describe('hasError', () => {
55
178
  const conditionsWithoutError = [