@rancher/shell 3.0.8-rc.1 → 3.0.8-rc.10

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 (323) hide show
  1. package/assets/brand/suse/banner.svg +1 -0
  2. package/assets/brand/suse/dark/banner.svg +1 -0
  3. package/assets/brand/suse/dark/login-landscape.svg +1 -0
  4. package/assets/brand/suse/dark/rancher-logo.svg +1 -1
  5. package/assets/brand/suse/favicon.png +0 -0
  6. package/assets/brand/suse/login-landscape.svg +1 -0
  7. package/assets/brand/suse/metadata.json +11 -1
  8. package/assets/brand/suse/rancher-logo.svg +1 -1
  9. package/assets/fonts/suse/suse-v2-latin-300.woff +0 -0
  10. package/assets/fonts/suse/suse-v2-latin-300.woff2 +0 -0
  11. package/assets/fonts/suse/suse-v2-latin-600.woff +0 -0
  12. package/assets/fonts/suse/suse-v2-latin-600.woff2 +0 -0
  13. package/assets/fonts/suse/suse-v2-latin-700.woff +0 -0
  14. package/assets/fonts/suse/suse-v2-latin-700.woff2 +0 -0
  15. package/assets/fonts/suse/suse-v2-latin-800.woff +0 -0
  16. package/assets/fonts/suse/suse-v2-latin-800.woff2 +0 -0
  17. package/assets/fonts/suse/suse-v2-latin-regular.woff +0 -0
  18. package/assets/fonts/suse/suse-v2-latin-regular.woff2 +0 -0
  19. package/assets/images/content/README.md +5 -0
  20. package/assets/images/content/cloud-native.svg +84 -0
  21. package/assets/images/content/dark/cloud-native.svg +21 -0
  22. package/assets/images/content/dark/shield.svg +59 -0
  23. package/assets/images/content/dark/suse.svg +10 -0
  24. package/assets/images/content/shield.svg +59 -0
  25. package/assets/images/content/suse.svg +10 -0
  26. package/assets/styles/base/_typography.scss +1 -0
  27. package/assets/styles/fonts/_fontstack.scss +53 -1
  28. package/assets/styles/global/_cards.scss +0 -3
  29. package/assets/styles/global/_layout.scss +21 -35
  30. package/assets/styles/themes/_dark.scss +1 -1
  31. package/assets/styles/themes/_light.scss +1 -1
  32. package/assets/styles/themes/_modern.scss +11 -3
  33. package/assets/styles/themes/_suse.scss +116 -24
  34. package/assets/translations/en-us.yaml +94 -10
  35. package/components/AutoscalerCard.vue +113 -0
  36. package/components/AutoscalerTab.vue +94 -0
  37. package/components/BackLink.vue +8 -0
  38. package/components/BannerGraphic.vue +36 -21
  39. package/components/BrandImage.vue +17 -6
  40. package/components/ClusterIconMenu.vue +1 -1
  41. package/components/ClusterProviderIcon.vue +1 -1
  42. package/components/Cron/CronExpressionEditor.vue +1 -1
  43. package/components/Cron/CronExpressionEditorModal.vue +1 -1
  44. package/components/Drawer/Chrome.vue +2 -6
  45. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +4 -9
  46. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +3 -8
  47. package/components/Drawer/ResourceDetailDrawer/composables.ts +3 -4
  48. package/components/Drawer/ResourceDetailDrawer/index.vue +4 -9
  49. package/components/Drawer/ResourceDetailDrawer/types.ts +17 -0
  50. package/components/Drawer/types.ts +3 -0
  51. package/components/DynamicContent/DynamicContentBanner.vue +102 -0
  52. package/components/DynamicContent/DynamicContentCloseButton.vue +42 -0
  53. package/components/DynamicContent/DynamicContentIcon.vue +132 -0
  54. package/components/DynamicContent/DynamicContentPanel.vue +112 -0
  55. package/components/DynamicContent/content.ts +78 -0
  56. package/components/EmberPage.vue +1 -1
  57. package/components/IconOrSvg.vue +2 -2
  58. package/components/PaginatedResourceTable.vue +2 -6
  59. package/components/PopoverCard.vue +192 -0
  60. package/components/Questions/__tests__/index.test.ts +159 -0
  61. package/components/Resource/Detail/CopyToClipboard.vue +4 -1
  62. package/components/Resource/Detail/FetchLoader/composables.ts +18 -4
  63. package/components/Resource/Detail/Metadata/Annotations/index.vue +2 -2
  64. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +1 -1
  65. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +4 -0
  66. package/components/Resource/Detail/Metadata/KeyValueRow.vue +1 -1
  67. package/components/Resource/Detail/Metadata/Labels/index.vue +2 -2
  68. package/components/Resource/Detail/Metadata/composables.ts +9 -9
  69. package/components/Resource/Detail/Metadata/index.vue +3 -3
  70. package/components/Resource/Detail/ResourcePopover/ResourcePopoverCard.vue +2 -19
  71. package/components/Resource/Detail/ResourcePopover/__tests__/ResourcePopoverCard.test.ts +0 -29
  72. package/components/Resource/Detail/ResourcePopover/__tests__/index.test.ts +132 -150
  73. package/components/Resource/Detail/ResourcePopover/index.vue +54 -159
  74. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +0 -2
  75. package/components/Resource/Detail/TitleBar/composables.ts +2 -1
  76. package/components/Resource/Detail/TitleBar/index.vue +10 -6
  77. package/components/Resource/Detail/composables.ts +12 -0
  78. package/components/ResourceDetail/Masthead/latest.vue +29 -0
  79. package/components/ResourceDetail/index.vue +4 -1
  80. package/components/ResourceList/Masthead.vue +1 -1
  81. package/components/SortableTable/index.vue +1 -0
  82. package/components/Tabbed/__tests__/index.test.ts +86 -0
  83. package/components/{nav/WindowManager → Window}/ContainerLogs.vue +1 -1
  84. package/components/{nav/WindowManager → Window}/ContainerLogsActions.vue +1 -0
  85. package/components/{nav/WindowManager → Window}/__tests__/ContainerLogs.test.ts +1 -1
  86. package/components/{nav/WindowManager → Window}/__tests__/ContainerShell.test.ts +2 -2
  87. package/components/__tests__/AutoscalerCard.test.ts +154 -0
  88. package/components/__tests__/AutoscalerTab.test.ts +125 -0
  89. package/components/__tests__/PopoverCard.test.ts +204 -0
  90. package/components/auth/SelectPrincipal.vue +24 -6
  91. package/components/auth/__tests__/SelectPrincipal.test.ts +119 -0
  92. package/components/formatter/Autoscaler.vue +97 -0
  93. package/components/formatter/InternalExternalIP.vue +198 -24
  94. package/components/formatter/__tests__/Autoscaler.test.ts +156 -0
  95. package/components/formatter/__tests__/InternalExternalIP.test.ts +133 -0
  96. package/components/google/util/__tests__/formatter.test.ts +47 -0
  97. package/components/google/util/formatter.ts +5 -2
  98. package/components/nav/Group.vue +12 -3
  99. package/components/nav/Header.vue +36 -16
  100. package/components/nav/NamespaceFilter.vue +13 -1
  101. package/components/nav/NotificationCenter/index.vue +2 -1
  102. package/components/nav/TopLevelMenu.helper.ts +16 -6
  103. package/components/nav/TopLevelMenu.vue +4 -2
  104. package/components/{DraggableZone.vue → nav/WindowManager/PinArea.vue} +47 -80
  105. package/components/nav/WindowManager/composables/useComponentsMount.ts +70 -0
  106. package/components/nav/WindowManager/composables/useDimensionsHandler.ts +105 -0
  107. package/components/nav/WindowManager/composables/useDragHandler.ts +99 -0
  108. package/components/nav/WindowManager/composables/usePanelHandler.ts +72 -0
  109. package/components/nav/WindowManager/composables/usePanelsHandler.ts +14 -0
  110. package/components/nav/WindowManager/composables/useResizeHandler.ts +167 -0
  111. package/components/nav/WindowManager/composables/useTabsHandler.ts +51 -0
  112. package/components/nav/WindowManager/constants.ts +23 -0
  113. package/components/nav/WindowManager/index.vue +61 -575
  114. package/components/nav/WindowManager/panels/HorizontalPanel.vue +265 -0
  115. package/components/nav/WindowManager/panels/TabBodyContainer.vue +39 -0
  116. package/components/nav/WindowManager/panels/VerticalPanel.vue +308 -0
  117. package/components/templates/default.vue +4 -40
  118. package/components/templates/home.vue +31 -5
  119. package/components/templates/plain.vue +30 -4
  120. package/components/templates/standalone.vue +1 -1
  121. package/composables/useI18n.ts +10 -1
  122. package/composables/useInterval.ts +15 -0
  123. package/config/__test__/uiplugins.test.ts +309 -0
  124. package/config/labels-annotations.js +9 -1
  125. package/config/product/explorer.js +3 -1
  126. package/config/product/manager.js +20 -9
  127. package/config/router/routes.js +10 -2
  128. package/config/settings.ts +2 -1
  129. package/config/store.js +4 -2
  130. package/config/table-headers.js +8 -0
  131. package/config/types.js +9 -0
  132. package/config/uiplugins.js +46 -2
  133. package/config/version.js +1 -1
  134. package/core/__test__/extension-manager-impl.test.js +236 -0
  135. package/core/extension-manager-impl.js +23 -6
  136. package/core/plugin-helpers.ts +2 -0
  137. package/core/types-provisioning.ts +4 -1
  138. package/detail/pod.vue +1 -0
  139. package/detail/provisioning.cattle.io.cluster.vue +13 -1
  140. package/dialog/DeveloperLoadExtensionDialog.vue +12 -3
  141. package/dialog/RollbackWorkloadDialog.vue +2 -5
  142. package/directives/ui-context.ts +103 -0
  143. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +2 -2
  144. package/edit/auth/__tests__/oidc.test.ts +26 -0
  145. package/edit/auth/github.vue +5 -0
  146. package/edit/auth/oidc.vue +5 -1
  147. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -0
  148. package/edit/cloudcredential.vue +1 -1
  149. package/edit/configmap.vue +1 -0
  150. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  151. package/edit/fleet.cattle.io.gitrepo.vue +0 -10
  152. package/edit/fleet.cattle.io.helmop.vue +6 -6
  153. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  154. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  155. package/edit/logging-flow/index.vue +1 -0
  156. package/edit/logging.banzaicloud.io.output/index.vue +1 -0
  157. package/edit/management.cattle.io.fleetworkspace.vue +1 -1
  158. package/edit/management.cattle.io.project.vue +1 -0
  159. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +4 -1
  160. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +2 -1
  161. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  162. package/edit/monitoring.coreos.com.receiver/index.vue +2 -1
  163. package/edit/monitoring.coreos.com.route.vue +1 -1
  164. package/edit/namespace.vue +1 -0
  165. package/edit/networking.istio.io.destinationrule/index.vue +1 -0
  166. package/edit/networking.k8s.io.ingress/index.vue +1 -0
  167. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +1 -0
  168. package/edit/networking.k8s.io.networkpolicy/index.vue +1 -0
  169. package/edit/node.vue +1 -0
  170. package/edit/persistentvolume/index.vue +27 -22
  171. package/edit/persistentvolume/plugins/awsElasticBlockStore.vue +13 -14
  172. package/edit/persistentvolume/plugins/azureDisk.vue +49 -48
  173. package/edit/persistentvolume/plugins/azureFile.vue +15 -14
  174. package/edit/persistentvolume/plugins/cephfs.vue +15 -14
  175. package/edit/persistentvolume/plugins/cinder.vue +15 -14
  176. package/edit/persistentvolume/plugins/csi.vue +18 -16
  177. package/edit/persistentvolume/plugins/fc.vue +13 -14
  178. package/edit/persistentvolume/plugins/flexVolume.vue +15 -14
  179. package/edit/persistentvolume/plugins/flocker.vue +1 -3
  180. package/edit/persistentvolume/plugins/gcePersistentDisk.vue +13 -14
  181. package/edit/persistentvolume/plugins/glusterfs.vue +15 -14
  182. package/edit/persistentvolume/plugins/hostPath.vue +40 -39
  183. package/edit/persistentvolume/plugins/iscsi.vue +13 -14
  184. package/edit/persistentvolume/plugins/local.vue +1 -3
  185. package/edit/persistentvolume/plugins/longhorn.vue +23 -22
  186. package/edit/persistentvolume/plugins/nfs.vue +15 -14
  187. package/edit/persistentvolume/plugins/photonPersistentDisk.vue +1 -14
  188. package/edit/persistentvolume/plugins/portworxVolume.vue +15 -14
  189. package/edit/persistentvolume/plugins/quobyte.vue +15 -14
  190. package/edit/persistentvolume/plugins/rbd.vue +15 -14
  191. package/edit/persistentvolume/plugins/scaleIO.vue +15 -14
  192. package/edit/persistentvolume/plugins/storageos.vue +15 -14
  193. package/edit/persistentvolume/plugins/vsphereVolume.vue +1 -3
  194. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +32 -5
  195. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +35 -0
  196. package/edit/provisioning.cattle.io.cluster/__tests__/Networking.test.ts +155 -0
  197. package/edit/provisioning.cattle.io.cluster/index.vue +25 -15
  198. package/edit/provisioning.cattle.io.cluster/rke2.vue +42 -8
  199. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +107 -5
  200. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +92 -4
  201. package/edit/secret/index.vue +1 -1
  202. package/edit/service.vue +9 -4
  203. package/edit/serviceaccount.vue +1 -0
  204. package/edit/storage.k8s.io.storageclass/index.vue +1 -0
  205. package/edit/workload/index.vue +2 -1
  206. package/edit/workload/mixins/workload.js +1 -1
  207. package/initialize/App.vue +4 -4
  208. package/initialize/install-directives.js +2 -0
  209. package/initialize/install-plugins.js +19 -2
  210. package/list/provisioning.cattle.io.cluster.vue +15 -2
  211. package/machine-config/amazonec2.vue +42 -135
  212. package/machine-config/components/EC2Networking.vue +490 -0
  213. package/machine-config/components/__tests__/EC2Networking.test.ts +148 -0
  214. package/machine-config/components/__tests__/utils/vpcSubnetMockData.js +294 -0
  215. package/machine-config/digitalocean.vue +11 -0
  216. package/machine-config/google.vue +1 -1
  217. package/mixins/__tests__/brand.spec.ts +2 -2
  218. package/mixins/__tests__/chart.test.ts +21 -0
  219. package/mixins/brand.js +1 -7
  220. package/mixins/chart.js +7 -1
  221. package/mixins/create-edit-view/index.js +5 -0
  222. package/models/__tests__/chart.test.ts +33 -4
  223. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +112 -5
  224. package/models/chart.js +25 -13
  225. package/models/cluster/node.js +13 -6
  226. package/models/cluster.x-k8s.io.machine.js +10 -20
  227. package/models/cluster.x-k8s.io.machinedeployment.js +5 -1
  228. package/models/management.cattle.io.cluster.js +21 -3
  229. package/models/management.cattle.io.kontainerdriver.js +1 -0
  230. package/models/provisioning.cattle.io.cluster.js +249 -33
  231. package/package.json +6 -5
  232. package/pages/auth/login.vue +38 -2
  233. package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +135 -0
  234. package/pages/c/_cluster/apps/charts/chart.vue +33 -15
  235. package/pages/c/_cluster/apps/charts/index.vue +11 -13
  236. package/pages/c/_cluster/apps/charts/install.vue +1 -1
  237. package/pages/c/_cluster/explorer/index.vue +8 -6
  238. package/pages/c/_cluster/manager/hostedprovider/index.vue +220 -0
  239. package/pages/c/_cluster/settings/brand.vue +1 -1
  240. package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +7 -0
  241. package/pages/c/_cluster/uiplugins/catalogs.vue +147 -0
  242. package/pages/c/_cluster/uiplugins/index.vue +126 -184
  243. package/pages/home.vue +14 -4
  244. package/pkg/dynamic-importer.lib.js +4 -0
  245. package/plugins/dashboard-client-init.js +3 -0
  246. package/plugins/dashboard-store/getters.js +18 -1
  247. package/plugins/dashboard-store/resource-class.js +4 -4
  248. package/plugins/dynamic-content.js +13 -0
  249. package/plugins/i18n.js +8 -0
  250. package/plugins/steve/__tests__/steve-pagination-utils.test.ts +333 -0
  251. package/plugins/steve/steve-pagination-utils.ts +39 -20
  252. package/plugins/steve/subscribe.js +17 -9
  253. package/plugins/subscribe-events.ts +4 -2
  254. package/rancher-components/Form/Checkbox/Checkbox.vue +1 -1
  255. package/rancher-components/Pill/RcStatusBadge/RcStatusBadge.vue +6 -34
  256. package/rancher-components/Pill/RcStatusBadge/index.ts +0 -1
  257. package/rancher-components/Pill/RcStatusBadge/types.ts +1 -1
  258. package/rancher-components/Pill/RcStatusIndicator/RcStatusIndicator.vue +5 -28
  259. package/rancher-components/Pill/RcStatusIndicator/types.ts +2 -1
  260. package/rancher-components/Pill/types.ts +0 -1
  261. package/rancher-components/RcDropdown/RcDropdownItem.vue +1 -0
  262. package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +5 -1
  263. package/rancher-components/RcIcon/RcIcon.test.ts +51 -0
  264. package/rancher-components/RcIcon/RcIcon.vue +46 -0
  265. package/rancher-components/RcIcon/index.ts +1 -0
  266. package/rancher-components/RcIcon/types.ts +160 -0
  267. package/rancher-components/utils/status.test.ts +67 -0
  268. package/rancher-components/utils/status.ts +77 -0
  269. package/scripts/typegen.sh +1 -0
  270. package/store/action-menu.js +8 -0
  271. package/store/auth.js +3 -3
  272. package/store/catalog.js +6 -0
  273. package/store/features.js +1 -0
  274. package/store/index.js +36 -17
  275. package/store/notifications.ts +51 -4
  276. package/store/plugins.js +7 -3
  277. package/store/prefs.js +6 -6
  278. package/store/type-map.js +3 -3
  279. package/store/ui-context.ts +86 -0
  280. package/store/wm.ts +244 -0
  281. package/types/notifications/index.ts +27 -3
  282. package/types/shell/index.d.ts +79 -4
  283. package/types/store/__tests__/pagination.types.spec.ts +137 -0
  284. package/types/store/pagination.types.ts +157 -9
  285. package/types/store/subscribe-events.types.ts +8 -1
  286. package/types/store/subscribe.types.ts +1 -0
  287. package/types/window-manager.ts +24 -0
  288. package/utils/__tests__/object.test.ts +19 -0
  289. package/utils/__tests__/provider.test.ts +98 -0
  290. package/utils/__tests__/selector-typed.test.ts +263 -0
  291. package/utils/__tests__/version.test.ts +19 -1
  292. package/utils/autoscaler-utils.ts +7 -0
  293. package/utils/back-off.ts +3 -3
  294. package/utils/brand.ts +29 -0
  295. package/utils/chart.js +18 -0
  296. package/utils/color.js +1 -1
  297. package/utils/dynamic-content/__tests__/announcement.test.ts +498 -0
  298. package/utils/dynamic-content/__tests__/info.test.ts +21 -9
  299. package/utils/dynamic-content/announcement.ts +142 -0
  300. package/utils/dynamic-content/example.json +40 -0
  301. package/utils/dynamic-content/index.ts +6 -2
  302. package/utils/dynamic-content/info.ts +44 -2
  303. package/utils/dynamic-content/new-release.ts +1 -1
  304. package/utils/dynamic-content/notification-handler.ts +48 -0
  305. package/utils/dynamic-content/types.d.ts +53 -1
  306. package/utils/dynamic-importer.js +2 -2
  307. package/utils/favicon.js +4 -4
  308. package/utils/object.js +20 -2
  309. package/utils/pagination-wrapper.ts +12 -8
  310. package/utils/provider.ts +14 -0
  311. package/utils/scroll.js +7 -0
  312. package/utils/selector-typed.ts +6 -2
  313. package/utils/settings.ts +15 -0
  314. package/utils/validators/machine-pool.ts +13 -3
  315. package/utils/version.js +15 -0
  316. package/assets/images/icons/document.svg +0 -3
  317. package/plugins/nuxt-client-init.js +0 -3
  318. package/store/wm.js +0 -95
  319. /package/components/{nav/WindowManager → Window}/ChartReadme.vue +0 -0
  320. /package/components/{nav/WindowManager → Window}/ContainerShell.vue +0 -0
  321. /package/components/{nav/WindowManager → Window}/KubectlShell.vue +0 -0
  322. /package/components/{nav/WindowManager → Window}/MachineSsh.vue +0 -0
  323. /package/components/{nav/WindowManager → Window}/Window.vue +0 -0
@@ -0,0 +1,103 @@
1
+ import { get, isEmpty } from '@shell/utils/object';
2
+ import { generateRandomAlphaString } from '@shell/utils/string';
3
+
4
+ interface Context {
5
+ tag: string;
6
+ path?: string;
7
+ value?: any;
8
+ hookable?: boolean;
9
+ description?: string;
10
+ icon?: string;
11
+ store?: any;
12
+ }
13
+
14
+ function isValid(context: Context ): context is Context {
15
+ return (
16
+ context !== null &&
17
+ typeof context === 'object' &&
18
+ (
19
+ (context.path === undefined && context.value === undefined) || // both undefined is allowed
20
+ (typeof context.path === 'string' && context.path?.length > 0 && context.value === undefined) || // path defined, value undefined
21
+ (context.value !== undefined && context.path === undefined) // value defined, path undefined
22
+ ) &&
23
+ typeof context.tag === 'string' && context.tag?.length > 0 &&
24
+ (typeof context.description === 'string' || context.description === undefined)
25
+ );
26
+ }
27
+
28
+ /** UI Context Directive
29
+ *
30
+ * Usage:
31
+ * <div v-ui-context="{ tag: 'example-tag', path: 'some.path.in.component', description: 'An example context' }"></div>
32
+ * or
33
+ * <div v-ui-context="{ tag: 'example-tag', value: 'Direct Value', description: 'An example context with direct value' }"></div>
34
+ * or
35
+ * <div v-ui-context="{ tag: 'example-tag', description: 'An example context with text content' }">Text Content Value</div>
36
+ *
37
+ * The directive will register the context on mount and unregister it before unmounting.
38
+ *
39
+ * The context object must have a 'tag' and either a 'path' or a 'value'.
40
+ * If both 'path' and 'value' are undefined, the element's textContent will be used as the value.
41
+ *
42
+ * !IMPORTANT:
43
+ * The value object will be reactive only when using 'path'.
44
+ * Using 'value' or textContent will not be reactive.
45
+ *
46
+ */
47
+ export default {
48
+ async mounted(el: any, binding: { value: Context, instance: any }) {
49
+ const context: Context = binding.value;
50
+
51
+ if (!context || isEmpty(context)) {
52
+ return;
53
+ }
54
+
55
+ if (!isValid(context)) {
56
+ // eslint-disable-next-line no-console
57
+ console.warn(`[ui-context] invalid value: ${ JSON.stringify({ tag: (context as Context).tag, description: (context as Context).description }) }`);
58
+
59
+ return;
60
+ }
61
+
62
+ if (context.path === undefined && context.value === undefined) {
63
+ // path and value undefined, use textContent as value
64
+ context.value = el.textContent;
65
+ } else if (context.value === undefined) {
66
+ // Use context.value directly if provided, otherwise resolve it from the component instance using context.path
67
+ const value = get(binding.instance, context.path);
68
+
69
+ if (value === undefined) {
70
+ // eslint-disable-next-line no-console
71
+ console.warn(`[ui-context] path "${ context.path }" is undefined on the component instance`);
72
+
73
+ return;
74
+ }
75
+
76
+ context.value = value;
77
+ }
78
+
79
+ delete context.path;
80
+
81
+ if (context.hookable) {
82
+ const hookId = generateRandomAlphaString(12);
83
+
84
+ el.setAttribute('ux-context-hook-id', hookId);
85
+ (context as any).hookId = hookId;
86
+ }
87
+
88
+ const store = context.store || binding.instance.$store || binding.instance.store;
89
+
90
+ if (store) {
91
+ delete context.store;
92
+ const id = await store.dispatch('ui-context/add', context);
93
+
94
+ el._uiContextRemove = async() => await store.dispatch('ui-context/remove', id);
95
+ }
96
+ },
97
+
98
+ async beforeUnmount(el: any) {
99
+ if (el._uiContextRemove) {
100
+ await el._uiContextRemove();
101
+ }
102
+ }
103
+ };
@@ -243,7 +243,7 @@ describe.each([
243
243
 
244
244
  await fleetSecretSelector.vm.$emit('update:value', ['secret2', 'secret3']);
245
245
 
246
- expect(wrapper.vm.value.spec.helm.downstreamResources).toStrictEqual([{ name: 'secret2', kind: 'Secret' }, { name: 'secret3', kind: 'Secret' }]);
246
+ expect(wrapper.vm.value.spec.downstreamResources).toStrictEqual([{ name: 'secret2', kind: 'Secret' }, { name: 'secret3', kind: 'Secret' }]);
247
247
  });
248
248
 
249
249
  it('should update downstreamResources with new ConfigMaps when FleetConfigMapSelector emits update event', async() => {
@@ -260,6 +260,6 @@ describe.each([
260
260
 
261
261
  await fleetConfigMapSelector.vm.$emit('update:value', ['configMap2', 'configMap3']);
262
262
 
263
- expect(wrapper.vm.value.spec.helm.downstreamResources).toStrictEqual([{ name: 'configMap2', kind: 'ConfigMap' }, { name: 'configMap3', kind: 'ConfigMap' }]);
263
+ expect(wrapper.vm.value.spec.downstreamResources).toStrictEqual([{ name: 'configMap2', kind: 'ConfigMap' }, { name: 'configMap3', kind: 'ConfigMap' }]);
264
264
  });
265
265
  });
@@ -221,5 +221,31 @@ describe('oidc.vue', () => {
221
221
  expect(issuer).toBe('');
222
222
  expect(endpoint).toBe('');
223
223
  });
224
+
225
+ it('custom claims fields should not appear in UI if Amazon cognito', async() => {
226
+ wrapper.vm.model.id = 'cognito';
227
+
228
+ const nameClaim = wrapper.find('[data-testid="input-name-claim"]');
229
+ const groupsClaim = wrapper.find('[data-testid="input-groups-claim"]');
230
+ const emailClaim = wrapper.find('[data-testid="input-email-claim"]');
231
+
232
+ expect(nameClaim.exists()).toBe(false);
233
+ expect(groupsClaim.exists()).toBe(false);
234
+ expect(emailClaim.exists()).toBe(false);
235
+ });
236
+
237
+ it('custom claims fields should appear in UI if genericoidc', async() => {
238
+ wrapper.vm.model.id = 'genericoidc';
239
+ wrapper.vm.addCustomClaims = true;
240
+ await nextTick();
241
+
242
+ const nameClaim = wrapper.find('[data-testid="input-name-claim"]');
243
+ const groupsClaim = wrapper.find('[data-testid="input-groups-claim"]');
244
+ const emailClaim = wrapper.find('[data-testid="input-email-claim"]');
245
+
246
+ expect(nameClaim.exists()).toBe(true);
247
+ expect(groupsClaim.exists()).toBe(true);
248
+ expect(emailClaim.exists()).toBe(true);
249
+ });
224
250
  });
225
251
  });
@@ -97,6 +97,11 @@ export default {
97
97
  },
98
98
 
99
99
  validationPassed() {
100
+ // Allows for configuring authorized users and groups
101
+ if ( this.model.enabled && !this.editConfig ) {
102
+ return true;
103
+ }
104
+
100
105
  if (!this.model.clientId || !this.model.clientSecret) {
101
106
  return false;
102
107
  }
@@ -442,12 +442,14 @@ export default {
442
442
  </div>
443
443
  </template>
444
444
 
445
- <template v-if="addCustomClaims">
445
+ <!-- Custom Claims -->
446
+ <template v-if="addCustomClaims && isGenericOidc">
446
447
  <h4>{{ t('authConfig.oidc.customClaims.label') }}</h4>
447
448
  <div class="row mb-20">
448
449
  <div class="col span-6">
449
450
  <LabeledInput
450
451
  v-model:value="model.nameClaim"
452
+ data-testid="input-name-claim"
451
453
  :label="t(`authConfig.oidc.customClaims.nameClaim.label`)"
452
454
  :mode="mode"
453
455
  />
@@ -455,6 +457,7 @@ export default {
455
457
  <div class="col span-6">
456
458
  <LabeledInput
457
459
  v-model:value="model.groupsClaim"
460
+ data-testid="input-groups-claim"
458
461
  :label="t(`authConfig.oidc.customClaims.groupsClaim.label`)"
459
462
  :mode="mode"
460
463
  />
@@ -464,6 +467,7 @@ export default {
464
467
  <div class="col span-6">
465
468
  <LabeledInput
466
469
  v-model:value="model.emailClaim"
470
+ data-testid="input-email-claim"
467
471
  :label="t(`authConfig.oidc.customClaims.emailClaim.label`)"
468
472
  :mode="mode"
469
473
  />
@@ -209,6 +209,7 @@ export default {
209
209
  <Tabbed
210
210
  :side-tabs="true"
211
211
  :use-hash="useTabbedHash"
212
+ :default-tab="defaultTab"
212
213
  >
213
214
  <Tab
214
215
  name="target"
@@ -139,8 +139,8 @@ export default {
139
139
  const fromDrivers = [...this.nodeDrivers, ...this.kontainerDrivers]
140
140
  .filter((x) => x.spec.active && x.id !== 'rancherkubernetesengine')
141
141
  .map((x) => x.spec.displayName || x.id);
142
+ const fromExtensions = this.extensions?.filter((x) => !x.hidden).map((x) => x.id) || [];
142
143
 
143
- const fromExtensions = this.extensions?.filter((x) => !!this.getCustomCloudCredentialComponent(x?.id)).map((x) => x?.id) || [];
144
144
  const providers = [...fromDrivers, ...fromExtensions];
145
145
 
146
146
  let types = uniq(providers.map((x) => this.$store.getters['plugins/credentialDriverFor'](x)));
@@ -111,6 +111,7 @@ export default {
111
111
  <Tabbed
112
112
  :side-tabs="true"
113
113
  :use-hash="useTabbedHash"
114
+ :default-tab="defaultTab"
114
115
  >
115
116
  <Tab
116
117
  name="data"
@@ -278,6 +278,7 @@ export default {
278
278
  <Tabbed
279
279
  :side-tabs="true"
280
280
  :use-hash="useTabbedHash"
281
+ :default-tab="defaultTab"
281
282
  @changed="onTabChanged"
282
283
  >
283
284
  <Tab
@@ -400,16 +400,6 @@ export default {
400
400
  }
401
401
  },
402
402
 
403
- scrollToBottom() {
404
- this.$nextTick(() => {
405
- const scrollable = document.getElementsByTagName('main')[0];
406
-
407
- if (scrollable) {
408
- scrollable.scrollTop = scrollable.scrollHeight;
409
- }
410
- });
411
- },
412
-
413
403
  updateBeforeSave() {
414
404
  this.value.spec['correctDrift'] = { enabled: this.correctDriftEnabled };
415
405
 
@@ -237,11 +237,11 @@ export default {
237
237
  },
238
238
 
239
239
  downstreamSecretsList() {
240
- return (this.value.spec.helm.downstreamResources || []).filter((r) => r.kind === 'Secret').map((r) => r.name);
240
+ return (this.value.spec.downstreamResources || []).filter((r) => r.kind === 'Secret').map((r) => r.name);
241
241
  },
242
242
 
243
243
  downstreamConfigMapsList() {
244
- return (this.value.spec.helm.downstreamResources || []).filter((r) => r.kind === 'ConfigMap').map((r) => r.name);
244
+ return (this.value.spec.downstreamResources || []).filter((r) => r.kind === 'ConfigMap').map((r) => r.name);
245
245
  },
246
246
  },
247
247
 
@@ -446,14 +446,14 @@ export default {
446
446
  updateDownstreamResources(kind, list) {
447
447
  switch (kind) {
448
448
  case 'Secret':
449
- this.value.spec.helm.downstreamResources = [
450
- ...(this.value.spec.helm.downstreamResources || []).filter((r) => r.kind !== 'Secret'),
449
+ this.value.spec.downstreamResources = [
450
+ ...(this.value.spec.downstreamResources || []).filter((r) => r.kind !== 'Secret'),
451
451
  ...(list || []).map((name) => ({ name, kind: 'Secret' })),
452
452
  ];
453
453
  break;
454
454
  case 'ConfigMap':
455
- this.value.spec.helm.downstreamResources = [
456
- ...(this.value.spec.helm.downstreamResources || []).filter((r) => r.kind !== 'ConfigMap'),
455
+ this.value.spec.downstreamResources = [
456
+ ...(this.value.spec.downstreamResources || []).filter((r) => r.kind !== 'ConfigMap'),
457
457
  ...(list || []).map((name) => ({ name, kind: 'ConfigMap' })),
458
458
  ];
459
459
  break;
@@ -143,6 +143,7 @@ export default {
143
143
  ref="tabs"
144
144
  :side-tabs="true"
145
145
  :use-hash="useTabbedHash"
146
+ :default-tab="defaultTab"
146
147
  >
147
148
  <Questions
148
149
  v-model:value="value.spec.values"
@@ -74,6 +74,7 @@ export default {
74
74
  class="mt-15"
75
75
  :side-tabs="true"
76
76
  :use-hash="useTabbedHash"
77
+ :default-tab="defaultTab"
77
78
  >
78
79
  <Tab
79
80
  name="basics"
@@ -405,6 +405,7 @@ export default {
405
405
  <Tabbed
406
406
  :side-tabs="true"
407
407
  :use-hash="useTabbedHash"
408
+ :default-tab="defaultTab"
408
409
  @changed="tabChanged($event)"
409
410
  >
410
411
  <Tab
@@ -212,6 +212,7 @@ export default {
212
212
  ref="tabbed"
213
213
  :side-tabs="true"
214
214
  :use-hash="useTabbedHash"
215
+ :default-tab="defaultTab"
215
216
  @changed="tabChanged($event)"
216
217
  >
217
218
  <Tab
@@ -199,7 +199,7 @@ export default {
199
199
 
200
200
  <Tabbed
201
201
  :side-tabs="true"
202
- default-tab="members"
202
+ :default-tab="defaultTab || 'members'"
203
203
  :use-hash="useTabbedHash"
204
204
  >
205
205
  <!-- <Tab name="members" label-key="generic.members" :weight="2">
@@ -198,6 +198,7 @@ export default {
198
198
  <Tabbed
199
199
  :side-tabs="true"
200
200
  :use-hash="useTabbedHash"
201
+ :default-tab="defaultTab"
201
202
  >
202
203
  <Tab
203
204
  v-if="canViewMembers"
@@ -204,7 +204,10 @@ export default {
204
204
  @input="$emit('input', $event)"
205
205
  />
206
206
 
207
- <Tabbed :use-hash="useTabbedHash">
207
+ <Tabbed
208
+ :use-hash="useTabbedHash"
209
+ :default-tab="defaultTab"
210
+ >
208
211
  <Tab
209
212
  :label="t('monitoring.route.label')"
210
213
  :weight="1"
@@ -313,8 +313,9 @@ export default {
313
313
  <Tabbed
314
314
  ref="tabbed"
315
315
  :side-tabs="true"
316
- default-tab="overview"
316
+ :default-tab="defaultTab || 'overview'"
317
317
  :use-hash="useTabbedHash"
318
+
318
319
  @changed="tabChanged"
319
320
  >
320
321
  <Tab
@@ -155,6 +155,7 @@ export default {
155
155
  :side-tabs="true"
156
156
  :show-tabs-add-remove="mode !== 'view'"
157
157
  :use-hash="useTabbedHash"
158
+ :default-tab="defaultTab"
158
159
  @addTab="addRuleGroup"
159
160
  @removeTab="removeGroupRule"
160
161
  >
@@ -218,8 +218,9 @@ export default {
218
218
  <Tabbed
219
219
  ref="tabbed"
220
220
  :side-tabs="true"
221
- default-tab="overview"
221
+ :default-tab="defaultTab || 'overview'"
222
222
  :use-hash="useTabbedHash"
223
+
223
224
  @changed="tabChanged"
224
225
  >
225
226
  <Tab
@@ -102,7 +102,7 @@ export default {
102
102
  <Tabbed
103
103
  ref="tabbed"
104
104
  :side-tabs="true"
105
- default-tab="overview"
105
+ :default-tab="defaultTab || 'overview'"
106
106
  :use-hash="useTabbedHash"
107
107
  >
108
108
  <Tab
@@ -203,6 +203,7 @@ export default {
203
203
  :mode="mode"
204
204
  :side-tabs="true"
205
205
  :use-hash="useTabbedHash"
206
+ :default-tab="defaultTab"
206
207
  @update:value="$emit('input', $event)"
207
208
  >
208
209
  <Tab
@@ -69,6 +69,7 @@ export default {
69
69
  <Tabbed
70
70
  :side-tabs="true"
71
71
  :use-hash="useTabbedHash"
72
+ :default-tab="defaultTab"
72
73
  >
73
74
  <Tab
74
75
  name="subsets"
@@ -229,6 +229,7 @@ export default {
229
229
  <Tabbed
230
230
  :side-tabs="true"
231
231
  :use-hash="useTabbedHash"
232
+ :default-tab="defaultTab"
232
233
  >
233
234
  <Tab
234
235
  :label="firstTabLabel"
@@ -59,6 +59,7 @@ export default {
59
59
  :side-tabs="true"
60
60
  :show-tabs-add-remove="mode !== 'view'"
61
61
  :use-hash="useTabbedHash"
62
+ :default-tab="defaultTab"
62
63
  @addTab="addPolicyRule"
63
64
  @removeTab="removePolicyRule"
64
65
  >
@@ -178,6 +178,7 @@ export default {
178
178
  <Tabbed
179
179
  :side-tabs="true"
180
180
  :use-hash="useTabbedHash"
181
+ :default-tab="defaultTab"
181
182
  >
182
183
  <Tab
183
184
  name="ingress"
package/edit/node.vue CHANGED
@@ -51,6 +51,7 @@ export default {
51
51
  :value="value"
52
52
  :mode="mode"
53
53
  :use-hash="useTabbedHash"
54
+ :default-tab="defaultTab"
54
55
  @update:value="$emit('input', $event)"
55
56
  >
56
57
  <Tab
@@ -22,6 +22,8 @@ import InfoBox from '@shell/components/InfoBox';
22
22
  import { mapFeature, UNSUPPORTED_STORAGE_DRIVERS } from '@shell/store/features';
23
23
  import ResourceManager from '@shell/mixins/resource-manager';
24
24
 
25
+ const DEFAULT_ACCESS_MODES = ['ReadWriteOnce'];
26
+
25
27
  export default {
26
28
  name: 'PersistentVolume',
27
29
  inheritAttrs: false,
@@ -64,36 +66,42 @@ export default {
64
66
  },
65
67
 
66
68
  data() {
67
- const NONE_OPTION = {
68
- label: this.t('generic.none'),
69
- value: ''
69
+ return {
70
+ secondaryResourceData: this.secondaryResourceDataConfig(),
71
+ storageClassOptions: [],
72
+ currentClaim: null,
73
+ plugin: '',
74
+ initialNodeAffinity: null,
75
+ NODE,
70
76
  };
71
- const defaultAccessModes = ['ReadWriteOnce'];
77
+ },
72
78
 
79
+ created() {
73
80
  this.value['spec'] = this.value.spec || {};
74
- this.value.spec['accessModes'] = this.value.spec.accessModes || defaultAccessModes;
81
+ this.value.spec['accessModes'] = this.value.spec.accessModes || DEFAULT_ACCESS_MODES;
75
82
  this.value.spec['capacity'] = this.value.spec.capacity || {};
76
83
  this.value.spec.capacity['storage'] = this.value.spec.capacity.storage || '10Gi';
77
- this.value.spec['storageClassName'] = this.value.spec.storageClassName || NONE_OPTION.value;
84
+ this.value.spec['storageClassName'] = this.value.spec.storageClassName || this.noneOption.value;
78
85
 
79
86
  const foundPlugin = this.value.isLonghorn ? LONGHORN_PLUGIN : VOLUME_PLUGINS.find((plugin) => this.value.spec[plugin.value]);
80
- const plugin = (foundPlugin || VOLUME_PLUGINS[0]).value;
81
87
 
82
- return {
83
- secondaryResourceData: this.secondaryResourceDataConfig(),
84
- storageClassOptions: [],
85
- currentClaim: null,
86
- plugin,
87
- NONE_OPTION,
88
- NODE,
89
- initialNodeAffinity: clone(this.value.spec.nodeAffinity),
90
- };
88
+ this.plugin = (foundPlugin || VOLUME_PLUGINS[0]).value;
89
+ this.initialNodeAffinity = clone(this.value.spec.nodeAffinity);
90
+
91
+ this.registerBeforeHook(this.willSave, 'willSave');
91
92
  },
92
93
 
93
94
  computed: {
94
95
  showUnsupportedStorage: mapFeature(UNSUPPORTED_STORAGE_DRIVERS),
95
96
  ...mapGetters(['currentProduct', 'currentCluster']),
96
97
 
98
+ noneOption() {
99
+ return {
100
+ label: this.t('generic.none'),
101
+ value: ''
102
+ };
103
+ },
104
+
97
105
  readWriteOnce: {
98
106
  get() {
99
107
  return this.value.spec.accessModes.includes('ReadWriteOnce');
@@ -149,10 +157,6 @@ export default {
149
157
  }
150
158
  },
151
159
 
152
- created() {
153
- this.registerBeforeHook(this.willSave, 'willSave');
154
- },
155
-
156
160
  methods: {
157
161
  secondaryResourceDataConfig() {
158
162
  return {
@@ -168,7 +172,7 @@ export default {
168
172
  value: s.metadata.name
169
173
  }));
170
174
 
171
- storageClassOptions.unshift(this.NONE_OPTION);
175
+ storageClassOptions.unshift(this.noneOption);
172
176
 
173
177
  return storageClassOptions;
174
178
  }
@@ -194,7 +198,7 @@ export default {
194
198
  return require(`./plugins/${ name }`).default;
195
199
  },
196
200
  willSave() {
197
- if (this.value.spec.storageClassName === this.NONE_OPTION.value) {
201
+ if (this.value.spec.storageClassName === this.noneOption.value) {
198
202
  this.value.spec['storageClassName'] = null;
199
203
  }
200
204
 
@@ -280,6 +284,7 @@ export default {
280
284
  <Tabbed
281
285
  :side-tabs="true"
282
286
  :use-hash="useTabbedHash"
287
+ :default-tab="defaultTab"
283
288
  >
284
289
  <Tab
285
290
  name="plugin-configuration"
@@ -14,25 +14,24 @@ export default {
14
14
  required: true,
15
15
  },
16
16
  },
17
- data() {
17
+ created() {
18
18
  this.value.spec['awsElasticBlockStore'] = this.value.spec.awsElasticBlockStore || {};
19
19
  this.value.spec.awsElasticBlockStore['readOnly'] = this.value.spec.awsElasticBlockStore.readOnly || false;
20
20
  this.value.spec.awsElasticBlockStore['partition'] = this.value.spec.awsElasticBlockStore.partition || 0;
21
-
22
- const readOnlyOptions = [
23
- {
24
- label: this.t('generic.yes'),
25
- value: true
26
- },
27
- {
28
- label: this.t('generic.no'),
29
- value: false
30
- }
31
- ];
32
-
33
- return { readOnlyOptions };
34
21
  },
35
22
  computed: {
23
+ readOnlyOptions() {
24
+ return [
25
+ {
26
+ label: this.t('generic.yes'),
27
+ value: true
28
+ },
29
+ {
30
+ label: this.t('generic.no'),
31
+ value: false
32
+ }
33
+ ];
34
+ },
36
35
  partition: {
37
36
  get() {
38
37
  return this.value.spec.awsElasticBlockStore.partition;