@rancher/shell 3.0.12-rc.2 → 3.0.12-rc.4

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 (473) hide show
  1. package/apis/impl/apis.ts +6 -0
  2. package/apis/index.ts +26 -0
  3. package/apis/intf/resources-api/cluster-api.ts +18 -0
  4. package/apis/intf/resources-api/mgmt-api.ts +15 -0
  5. package/apis/intf/resources-api/resource-base.ts +107 -0
  6. package/apis/intf/resources-api/resource-constants.ts +147 -0
  7. package/apis/intf/resources-api/resources-api.ts +143 -0
  8. package/apis/intf/resources.ts +49 -0
  9. package/apis/intf/{modal.ts → shell-api/modal.ts} +21 -26
  10. package/apis/intf/shell-api/proxy.ts +216 -0
  11. package/apis/intf/{slide-in.ts → shell-api/slide-in.ts} +4 -3
  12. package/apis/intf/{system.ts → shell-api/system.ts} +4 -1
  13. package/apis/intf/shell.ts +12 -6
  14. package/apis/resources/__tests__/resources-api-class.test.ts +550 -0
  15. package/apis/resources/index.ts +22 -0
  16. package/apis/resources/resources-api-class.ts +187 -0
  17. package/apis/shell/__tests__/proxy.test.ts +369 -0
  18. package/apis/shell/index.ts +8 -1
  19. package/apis/shell/modal.ts +4 -1
  20. package/apis/shell/notifications.ts +9 -6
  21. package/apis/shell/proxy.ts +256 -0
  22. package/apis/shell/slide-in.ts +4 -1
  23. package/apis/vue-shim.d.ts +2 -1
  24. package/assets/data/aws-regions.json +4 -0
  25. package/assets/fonts/lato/LatoLatin-Black.woff +0 -0
  26. package/assets/fonts/lato/LatoLatin-Black.woff2 +0 -0
  27. package/assets/fonts/lato/LatoLatin-BlackItalic.woff +0 -0
  28. package/assets/fonts/lato/LatoLatin-BlackItalic.woff2 +0 -0
  29. package/assets/fonts/lato/LatoLatin-Bold.woff +0 -0
  30. package/assets/fonts/lato/LatoLatin-Bold.woff2 +0 -0
  31. package/assets/fonts/lato/LatoLatin-BoldItalic.woff +0 -0
  32. package/assets/fonts/lato/LatoLatin-BoldItalic.woff2 +0 -0
  33. package/assets/fonts/lato/LatoLatin-Heavy.woff +0 -0
  34. package/assets/fonts/lato/LatoLatin-Heavy.woff2 +0 -0
  35. package/assets/fonts/lato/LatoLatin-HeavyItalic.woff +0 -0
  36. package/assets/fonts/lato/LatoLatin-HeavyItalic.woff2 +0 -0
  37. package/assets/fonts/lato/LatoLatin-Italic.woff +0 -0
  38. package/assets/fonts/lato/LatoLatin-Italic.woff2 +0 -0
  39. package/assets/fonts/lato/LatoLatin-Light.woff +0 -0
  40. package/assets/fonts/lato/LatoLatin-Light.woff2 +0 -0
  41. package/assets/fonts/lato/LatoLatin-LightItalic.woff +0 -0
  42. package/assets/fonts/lato/LatoLatin-LightItalic.woff2 +0 -0
  43. package/assets/fonts/lato/LatoLatin-Medium.woff +0 -0
  44. package/assets/fonts/lato/LatoLatin-Medium.woff2 +0 -0
  45. package/assets/fonts/lato/LatoLatin-MediumItalic.woff +0 -0
  46. package/assets/fonts/lato/LatoLatin-MediumItalic.woff2 +0 -0
  47. package/assets/fonts/lato/LatoLatin-Regular.woff +0 -0
  48. package/assets/fonts/lato/LatoLatin-Regular.woff2 +0 -0
  49. package/assets/fonts/lato/LatoLatin-Semibold.woff +0 -0
  50. package/assets/fonts/lato/LatoLatin-Semibold.woff2 +0 -0
  51. package/assets/fonts/lato/LatoLatin-SemiboldItalic.woff +0 -0
  52. package/assets/fonts/lato/LatoLatin-SemiboldItalic.woff2 +0 -0
  53. package/assets/styles/base/_variables.scss +2 -0
  54. package/assets/styles/fonts/_fontstack.scss +132 -8
  55. package/assets/styles/global/_layout.scss +4 -0
  56. package/assets/translations/en-us.yaml +165 -45
  57. package/assets/translations/zh-hans.yaml +1 -7
  58. package/chart/monitoring/ClusterSelector.vue +0 -21
  59. package/chart/monitoring/index.vue +10 -1
  60. package/chart/monitoring/prometheus/index.vue +6 -3
  61. package/components/ActionDropdownShell.vue +2 -1
  62. package/components/CruResource.vue +161 -14
  63. package/components/CruResourceFooter.vue +9 -5
  64. package/components/ExplorerMembers.vue +8 -4
  65. package/components/ExplorerProjectsNamespaces.vue +11 -7
  66. package/components/GrowlManager.vue +4 -0
  67. package/components/InstallHelmCharts.vue +2 -2
  68. package/components/LandingPagePreference.vue +14 -5
  69. package/components/MgmtNodeList.vue +184 -0
  70. package/components/Resource/Detail/Card/StateCard/__tests__/composables.test.ts +90 -1
  71. package/components/Resource/Detail/Card/StateCard/composables.ts +57 -87
  72. package/components/Resource/Detail/Card/StatusCard/__tests__/StatusCard.test.ts +61 -0
  73. package/components/Resource/Detail/Card/StatusCard/index.vue +61 -15
  74. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +17 -1
  75. package/components/Resource/Detail/Metadata/KeyValue.vue +5 -2
  76. package/components/Resource/Detail/Metadata/KeyValueRow.vue +2 -6
  77. package/components/Resource/Detail/Metadata/index.vue +6 -0
  78. package/components/Resource/Detail/ResourcePopover/index.vue +12 -1
  79. package/components/Resource/Detail/SpacedRow.vue +3 -1
  80. package/components/Resource/Detail/TitleBar/index.vue +10 -11
  81. package/components/ResourceDetail/index.vue +1 -1
  82. package/components/ResourceList/Masthead.vue +19 -9
  83. package/components/ResourceList/index.vue +82 -1
  84. package/components/RichTranslation.vue +5 -2
  85. package/components/SelectIconGrid.vue +0 -10
  86. package/components/Setting.vue +1 -0
  87. package/components/SingleClusterInfo.vue +1 -0
  88. package/components/SortableTable/__tests__/sorting.test.ts +126 -0
  89. package/components/SortableTable/index.vue +6 -9
  90. package/components/SortableTable/selection.js +23 -5
  91. package/components/SortableTable/sorting.js +6 -3
  92. package/components/SubtleLink.vue +31 -6
  93. package/components/Tabbed/Tab.vue +29 -3
  94. package/components/Tabbed/index.vue +25 -3
  95. package/components/TableOfContents/TableOfContents.vue +109 -0
  96. package/components/TableOfContents/composables.ts +258 -0
  97. package/components/Window/ContainerShell.vue +21 -11
  98. package/components/Window/__tests__/ContainerShell.test.ts +107 -37
  99. package/components/Wizard.vue +23 -17
  100. package/components/fleet/AppCoChartGrid.vue +401 -0
  101. package/components/fleet/AppCoEmptyState.vue +127 -0
  102. package/components/fleet/AppCoPageHeader.vue +119 -0
  103. package/components/fleet/AppCoVersionSelect.vue +70 -0
  104. package/components/fleet/FleetBundles.vue +100 -12
  105. package/components/fleet/FleetClusterTargets/ClusterSelectionFields.vue +217 -0
  106. package/components/fleet/FleetClusterTargets/TargetsList.vue +123 -35
  107. package/components/fleet/FleetClusterTargets/index.vue +226 -161
  108. package/components/fleet/FleetIntro.vue +7 -3
  109. package/components/fleet/FleetNoWorkspaces.vue +7 -3
  110. package/components/fleet/FleetSecretSelector.vue +5 -3
  111. package/components/fleet/FleetValuesFrom.vue +8 -2
  112. package/components/fleet/GitRepoTargetTab.vue +0 -2
  113. package/components/fleet/HelmOpAdvancedTab.vue +19 -53
  114. package/components/fleet/HelmOpAppCoConfigTab.vue +593 -0
  115. package/components/fleet/HelmOpAppCoResourcesSection.vue +162 -0
  116. package/components/fleet/HelmOpResourcesSection.vue +82 -0
  117. package/components/fleet/HelmOpTargetOptionsSection.vue +89 -0
  118. package/components/fleet/HelmOpTargetTab.vue +64 -60
  119. package/components/fleet/HelmOpValuesTab.vue +129 -105
  120. package/components/fleet/__tests__/AppCoEmptyState.test.ts +71 -0
  121. package/components/fleet/__tests__/AppCoVersionSelect.test.ts +36 -0
  122. package/components/fleet/__tests__/ClusterSelectionFields.test.ts +62 -0
  123. package/components/fleet/__tests__/FleetClusterTargets.test.ts +402 -115
  124. package/components/fleet/__tests__/FleetClusters.test.ts +12 -12
  125. package/components/fleet/__tests__/FleetSecretSelector.test.ts +16 -0
  126. package/components/fleet/__tests__/FleetValuesFrom.test.ts +44 -0
  127. package/components/fleet/__tests__/HelmOpAppCoConfigTab.test.ts +59 -0
  128. package/components/fleet/__tests__/HelmOpAppCoResourcesSection.test.ts +62 -0
  129. package/components/fleet/__tests__/HelmOpResourcesSection.test.ts +43 -0
  130. package/components/fleet/__tests__/HelmOpTargetOptionsSection.test.ts +34 -0
  131. package/components/fleet/__tests__/HelmOpValuesTab.test.ts +39 -0
  132. package/components/fleet/__tests__/__snapshots__/AppCoEmptyState.test.ts.snap +97 -0
  133. package/components/fleet/__tests__/__snapshots__/AppCoVersionSelect.test.ts.snap +30 -0
  134. package/components/fleet/__tests__/__snapshots__/ClusterSelectionFields.test.ts.snap +209 -0
  135. package/components/fleet/__tests__/__snapshots__/HelmOpTargetOptionsSection.test.ts.snap +140 -0
  136. package/components/fleet/dashboard/Empty.vue +8 -4
  137. package/components/fleet/dashboard/ResourceCard.vue +28 -0
  138. package/components/fleet/dashboard/ResourceDetails.vue +28 -0
  139. package/components/fleet/dashboard/__tests__/ResourceCard.test.ts +87 -0
  140. package/components/form/ArrayList.vue +61 -4
  141. package/components/form/KeyValue.vue +23 -2
  142. package/components/form/LabeledSelect.vue +59 -4
  143. package/components/form/Labels.vue +22 -3
  144. package/components/form/NameNsDescription.vue +24 -5
  145. package/components/form/ResourceTabs/index.vue +1 -0
  146. package/components/form/Security.vue +6 -2
  147. package/components/form/WorkloadPorts.vue +2 -7
  148. package/components/form/__tests__/NameNsDescription.test.ts +75 -0
  149. package/components/form/__tests__/Security.test.ts +76 -0
  150. package/components/formatter/Autoscaler.vue +4 -4
  151. package/components/formatter/ClusterKubeVersion.vue +27 -0
  152. package/components/formatter/ClusterLink.vue +1 -7
  153. package/components/formatter/ClusterProvider.vue +6 -10
  154. package/components/formatter/FleetSummaryGraph.vue +0 -3
  155. package/components/formatter/InternalExternalIP.vue +10 -4
  156. package/components/formatter/MachineSummaryGraph.vue +1 -1
  157. package/components/formatter/PodsUsage.vue +2 -2
  158. package/components/formatter/ServiceTargets.vue +26 -7
  159. package/components/formatter/__tests__/Autoscaler.test.ts +19 -22
  160. package/components/formatter/__tests__/FleetSummaryGraph.test.ts +216 -0
  161. package/components/formatter/__tests__/InternalExternalIP.test.ts +132 -0
  162. package/components/formatter/__tests__/PodsUsage.test.ts +6 -10
  163. package/components/formatter/__tests__/ServiceTargets.test.ts +412 -0
  164. package/components/nav/Header.vue +4 -0
  165. package/components/nav/NamespaceFilter.vue +2 -2
  166. package/components/nav/TopLevelMenu.helper.ts +15 -3
  167. package/components/nav/TopLevelMenu.vue +22 -6
  168. package/components/nav/__tests__/Header.test.ts +15 -0
  169. package/components/nav/__tests__/TopLevelMenu.test.ts +263 -21
  170. package/components/templates/default.vue +9 -4
  171. package/components/templates/home.vue +23 -0
  172. package/components/templates/plain.vue +23 -0
  173. package/components/templates/standalone.vue +17 -0
  174. package/composables/useFormValidation.ts +93 -0
  175. package/composables/useHelmOpResources.test.ts +56 -0
  176. package/composables/useHelmOpResources.ts +32 -0
  177. package/composables/useStateColor.test.ts +325 -0
  178. package/composables/useStateColor.ts +128 -0
  179. package/composables/useVeeValidateField.test.ts +159 -0
  180. package/composables/useVeeValidateField.ts +67 -0
  181. package/config/home-links.js +1 -1
  182. package/config/labels-annotations.js +1 -0
  183. package/config/pagination-table-headers.js +18 -1
  184. package/config/product/explorer.js +17 -4
  185. package/config/product/manager.js +84 -21
  186. package/config/router/index.js +16 -0
  187. package/config/router/navigation-guards/__tests__/authentication.test.ts +130 -0
  188. package/config/router/navigation-guards/authentication.js +10 -4
  189. package/config/router/routes.js +26 -6
  190. package/config/settings.ts +0 -2
  191. package/config/table-headers.js +23 -5
  192. package/config/types.js +11 -1
  193. package/core/__tests__/plugin-products.test.ts +904 -20
  194. package/core/plugin-products-base.ts +110 -10
  195. package/core/plugin-products.ts +4 -0
  196. package/core/plugin-types.ts +194 -31
  197. package/core/plugin.ts +18 -7
  198. package/core/productDebugger.js +9 -4
  199. package/core/types-provisioning.ts +77 -31
  200. package/core/types.ts +72 -22
  201. package/detail/__tests__/pod.test.ts +41 -0
  202. package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +114 -0
  203. package/detail/__tests__/workload.test.ts +3 -152
  204. package/detail/catalog.cattle.io.clusterrepo.vue +1 -1
  205. package/detail/harvesterhci.io.management.cluster.vue +6 -2
  206. package/detail/pod.vue +1 -1
  207. package/detail/provisioning.cattle.io.cluster.vue +34 -14
  208. package/detail/workload/index.vue +12 -55
  209. package/edit/__tests__/catalog.cattle.io.clusterrepo.test.ts +248 -0
  210. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +105 -0
  211. package/edit/auditlog.cattle.io.auditpolicy/__tests__/__snapshots__/General.test.ts.snap +6 -0
  212. package/edit/auditlog.cattle.io.auditpolicy/__tests__/__snapshots__/index.test.ts.snap +1 -0
  213. package/edit/auth/__tests__/azuread.test.ts +247 -39
  214. package/edit/auth/__tests__/github.test.ts +234 -0
  215. package/edit/auth/__tests__/oidc.test.ts +26 -6
  216. package/edit/auth/__tests__/saml.test.ts +196 -0
  217. package/edit/auth/azuread.vue +197 -56
  218. package/edit/auth/github.vue +72 -13
  219. package/edit/auth/ldap/__tests__/index.test.ts +206 -0
  220. package/edit/auth/ldap/config.vue +8 -0
  221. package/edit/auth/ldap/index.vue +75 -1
  222. package/edit/auth/oidc.vue +119 -73
  223. package/edit/auth/saml.vue +76 -12
  224. package/edit/catalog.cattle.io.clusterrepo.vue +140 -32
  225. package/edit/fleet.cattle.io.helmop.vue +491 -136
  226. package/edit/management.cattle.io.user.vue +5 -2
  227. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +13 -4
  228. package/edit/networking.k8s.io.ingress/RulePath.vue +8 -4
  229. package/edit/networking.k8s.io.ingress/index.vue +75 -20
  230. package/edit/provisioning.cattle.io.cluster/__tests__/MachinePool.test.ts +104 -0
  231. package/edit/provisioning.cattle.io.cluster/index.vue +11 -7
  232. package/edit/provisioning.cattle.io.cluster/rke2.vue +92 -14
  233. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +22 -0
  234. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +37 -4
  235. package/edit/provisioning.cattle.io.cluster/tabs/registries/__tests__/RegistryConfigs.test.ts +132 -7
  236. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +2 -1
  237. package/edit/secret/__tests__/ssh.test.ts +5 -6
  238. package/edit/secret/basic.vue +31 -0
  239. package/edit/secret/index.vue +68 -17
  240. package/edit/secret/registry.vue +38 -0
  241. package/edit/secret/ssh.vue +29 -0
  242. package/edit/secret/tls.vue +30 -0
  243. package/edit/service.vue +4 -4
  244. package/edit/workload/Upgrading.vue +3 -3
  245. package/edit/workload/__tests__/Upgrading.test.ts +6 -9
  246. package/edit/workload/mixins/workload.js +2 -1
  247. package/list/fleet.cattle.io.bundle.vue +7 -104
  248. package/list/fleet.cattle.io.clusterregistrationtoken.vue +20 -0
  249. package/list/group.principal.vue +5 -4
  250. package/list/harvesterhci.io.management.cluster.vue +8 -9
  251. package/list/management.cattle.io.user.vue +12 -9
  252. package/list/provisioning.cattle.io.cluster.vue +268 -180
  253. package/list/utils/management.cattle.io.cluster.utils.ts +128 -0
  254. package/mixins/__tests__/auth-config.test.ts +90 -0
  255. package/mixins/__tests__/chart.test.ts +206 -0
  256. package/mixins/__tests__/resource-fetch-api-pagination.test.ts +48 -0
  257. package/mixins/auth-config.js +7 -0
  258. package/mixins/brand.js +2 -1
  259. package/mixins/chart.js +22 -9
  260. package/mixins/child-hook.js +12 -6
  261. package/mixins/create-edit-view/impl.js +5 -3
  262. package/mixins/resource-fetch-api-pagination.js +62 -6
  263. package/models/__tests__/catalog.cattle.io.clusterrepo.test.ts +57 -0
  264. package/models/__tests__/compliance.cattle.io.clusterscan.test.ts +144 -0
  265. package/models/__tests__/ext.cattle.io.kubeconfig.test.ts +67 -67
  266. package/models/__tests__/fleet-application.test.ts +175 -0
  267. package/models/__tests__/fleet.cattle.io.bundle.test.ts +169 -0
  268. package/models/__tests__/fleet.cattle.io.helmop.test.ts +84 -0
  269. package/models/__tests__/management.cattle.io.cluster.test.ts +1 -1
  270. package/models/__tests__/management.cattle.io.node.ts +28 -5
  271. package/models/__tests__/management.cattle.io.nodepool.ts +5 -4
  272. package/models/__tests__/namespace.test.ts +36 -0
  273. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +81 -11
  274. package/models/__tests__/workload.test.ts +401 -26
  275. package/models/base-cluster.x-k8s.io.js +26 -0
  276. package/models/catalog.cattle.io.clusterrepo.js +28 -4
  277. package/models/cluster.js +1 -1
  278. package/models/cluster.x-k8s.io.machine.js +4 -22
  279. package/models/cluster.x-k8s.io.machinedeployment.js +2 -20
  280. package/models/cluster.x-k8s.io.machineset.js +2 -20
  281. package/models/compliance.cattle.io.clusterscan.js +165 -2
  282. package/models/ext.cattle.io.kubeconfig.ts +4 -7
  283. package/models/fleet-application.js +7 -1
  284. package/models/fleet.cattle.io.helmop.js +20 -1
  285. package/models/management.cattle.io.cluster.js +434 -41
  286. package/models/management.cattle.io.node.js +50 -7
  287. package/models/management.cattle.io.nodepool.js +1 -1
  288. package/models/namespace.js +1 -1
  289. package/models/networking.k8s.io.ingress.js +12 -4
  290. package/models/pod.js +33 -1
  291. package/models/provisioning.cattle.io.cluster.js +51 -334
  292. package/models/rke.cattle.io.etcdsnapshot.js +1 -2
  293. package/models/workload.js +108 -13
  294. package/models/workload.service.js +5 -0
  295. package/package.json +22 -39
  296. package/pages/__tests__/readme.test.ts +49 -0
  297. package/pages/about.vue +5 -6
  298. package/pages/auth/login.vue +0 -35
  299. package/pages/auth/setup.vue +13 -3
  300. package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +2 -2
  301. package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +10 -1
  302. package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +76 -0
  303. package/pages/c/_cluster/apps/charts/__tests__/index.test.ts +93 -0
  304. package/pages/c/_cluster/apps/charts/chart.vue +62 -9
  305. package/pages/c/_cluster/apps/charts/index.vue +48 -10
  306. package/pages/c/_cluster/apps/charts/install.vue +122 -113
  307. package/pages/c/_cluster/auth/roles/index.vue +5 -4
  308. package/pages/c/_cluster/explorer/__tests__/index.test.ts +23 -25
  309. package/pages/c/_cluster/explorer/index.vue +5 -49
  310. package/pages/c/_cluster/explorer/workload-dashboard/ByNamespaceSection.vue +31 -0
  311. package/pages/c/_cluster/explorer/workload-dashboard/ByStateSection.vue +138 -0
  312. package/pages/c/_cluster/explorer/workload-dashboard/ByTypeSection.vue +30 -0
  313. package/pages/c/_cluster/explorer/workload-dashboard/WorkloadCard.vue +155 -0
  314. package/pages/c/_cluster/explorer/workload-dashboard/WorkloadNamespaceCard.vue +142 -0
  315. package/pages/c/_cluster/explorer/workload-dashboard/WorkloadTypeCard.vue +159 -0
  316. package/pages/c/_cluster/explorer/workload-dashboard/__tests__/composable.test.ts +561 -0
  317. package/pages/c/_cluster/explorer/workload-dashboard/composable.ts +440 -0
  318. package/pages/c/_cluster/explorer/workload-dashboard/index.vue +187 -0
  319. package/pages/c/_cluster/explorer/workload-dashboard/types.ts +80 -0
  320. package/pages/c/_cluster/fleet/application/create.vue +187 -136
  321. package/pages/c/_cluster/fleet/application/index.vue +5 -3
  322. package/pages/c/_cluster/fleet/application/suse-app-collection/ChartDetailBody.vue +338 -0
  323. package/pages/c/_cluster/fleet/application/suse-app-collection/ChartDetailHeader.vue +121 -0
  324. package/pages/c/_cluster/fleet/application/suse-app-collection/chart.vue +369 -0
  325. package/pages/c/_cluster/fleet/application/suse-app-collection/charts.vue +248 -0
  326. package/pages/c/_cluster/fleet/application/suse-app-collection/credentials.vue +310 -0
  327. package/pages/c/_cluster/fleet/index.vue +2 -2
  328. package/pages/c/_cluster/istio/__tests__/istio.index.test.ts +194 -0
  329. package/pages/c/_cluster/istio/index.vue +21 -6
  330. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +1 -0
  331. package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +815 -2
  332. package/pages/c/_cluster/uiplugins/index.vue +218 -197
  333. package/pages/diagnostic.vue +13 -17
  334. package/pages/fail-whale.vue +30 -7
  335. package/pages/home.vue +93 -306
  336. package/pages/readme.vue +88 -0
  337. package/plugins/clean-html.d.ts +9 -0
  338. package/plugins/dashboard-store/__tests__/resource-class.test.ts +181 -0
  339. package/plugins/dashboard-store/actions.js +40 -18
  340. package/plugins/dashboard-store/resource-class.js +67 -9
  341. package/plugins/steve/__tests__/actions.test.ts +212 -0
  342. package/plugins/steve/__tests__/subscribe.spec.ts +6 -3
  343. package/plugins/steve/actions.js +96 -0
  344. package/plugins/steve/steve-pagination-utils.ts +12 -4
  345. package/plugins/steve/subscribe.js +35 -5
  346. package/rancher-components/Accordion/Accordion.vue +53 -9
  347. package/rancher-components/Form/Checkbox/Checkbox.vue +14 -0
  348. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +10 -4
  349. package/rancher-components/Form/LabeledInput/LabeledInput.vue +7 -52
  350. package/rancher-components/Form/Radio/RadioButton.vue +17 -1
  351. package/rancher-components/Form/Radio/RadioGroup.vue +10 -0
  352. package/rancher-components/Pill/RcTag/RcTag.vue +3 -2
  353. package/rancher-components/RcButton/RcButton.test.ts +140 -1
  354. package/rancher-components/RcButton/RcButton.vue +126 -17
  355. package/rancher-components/RcButton/types.ts +3 -0
  356. package/rancher-components/RcDropdown/RcDropdownTrigger.vue +10 -8
  357. package/rancher-components/RcItemCard/RcItemCard.test.ts +18 -0
  358. package/rancher-components/RcItemCard/RcItemCard.vue +2 -2
  359. package/rancher-components/RcSection/RcSection.vue +28 -3
  360. package/scripts/extension/helm/package/Dockerfile +1 -1
  361. package/scripts/test-plugins-build.sh +2 -1
  362. package/store/__tests__/catalog.test.ts +115 -1
  363. package/store/__tests__/notifications.test.ts +434 -0
  364. package/store/__tests__/type-map.test.ts +556 -1
  365. package/store/action-menu.js +8 -3
  366. package/store/auth.js +1 -1
  367. package/store/aws.js +27 -16
  368. package/store/catalog.js +84 -3
  369. package/store/digitalocean.js +20 -38
  370. package/store/index.js +2 -0
  371. package/store/linode.js +25 -40
  372. package/store/plugins.js +7 -4
  373. package/store/pnap.js +1 -0
  374. package/store/type-map.js +111 -29
  375. package/tsconfig.paths.json +8 -8
  376. package/types/components/buttonGroup.ts +5 -0
  377. package/types/kube/kube-api.ts +14 -1
  378. package/types/rancher/steve.api.ts +12 -12
  379. package/types/resources/settings.d.ts +2 -1
  380. package/types/shell/index.d.ts +206 -72
  381. package/types/store/dashboard-store.types.ts +108 -11
  382. package/types/store/pagination.types.ts +6 -3
  383. package/utils/__tests__/alertmanagerconfig.test.ts +117 -0
  384. package/utils/__tests__/async.test.ts +87 -0
  385. package/utils/__tests__/auth.test.ts +273 -0
  386. package/utils/__tests__/aws.test.ts +140 -0
  387. package/utils/__tests__/banners.test.ts +176 -0
  388. package/utils/__tests__/chart.test.ts +64 -1
  389. package/utils/__tests__/color.test.ts +226 -0
  390. package/utils/__tests__/computed.test.ts +193 -0
  391. package/utils/__tests__/cspAdaptor.test.ts +163 -0
  392. package/utils/__tests__/dom.test.ts +81 -0
  393. package/utils/__tests__/duration.test.ts +176 -0
  394. package/utils/__tests__/dynamic-importer.test.ts +102 -0
  395. package/utils/__tests__/fleet-appco.test.ts +312 -0
  396. package/utils/__tests__/fleet.test.ts +340 -0
  397. package/utils/__tests__/ingress.test.ts +553 -0
  398. package/utils/__tests__/kube.test.ts +68 -0
  399. package/utils/__tests__/monitoring.test.ts +130 -0
  400. package/utils/__tests__/namespace-filter.test.ts +109 -0
  401. package/utils/__tests__/object.test.ts +22 -0
  402. package/utils/__tests__/pagination-utils.test.ts +361 -0
  403. package/utils/__tests__/parse-externalid.test.ts +137 -0
  404. package/utils/__tests__/perf-setting.utils.test.ts +98 -0
  405. package/utils/__tests__/platform.test.ts +91 -0
  406. package/utils/__tests__/poller-sequential.test.ts +177 -0
  407. package/utils/__tests__/poller.test.ts +170 -0
  408. package/utils/__tests__/position.test.ts +237 -0
  409. package/utils/__tests__/promise.test.ts +346 -0
  410. package/utils/__tests__/provider.test.ts +51 -1
  411. package/utils/__tests__/queue.test.ts +232 -0
  412. package/utils/__tests__/release-notes.test.ts +221 -0
  413. package/utils/__tests__/router.test.js +254 -1
  414. package/utils/__tests__/select.test.ts +208 -0
  415. package/utils/__tests__/settings.test.ts +140 -0
  416. package/utils/__tests__/sort-utils.test.ts +301 -0
  417. package/utils/__tests__/string-utils.test.ts +798 -0
  418. package/utils/__tests__/string.test.ts +23 -1
  419. package/utils/__tests__/style.test.ts +154 -0
  420. package/utils/__tests__/svg-filter.test.ts +184 -0
  421. package/utils/__tests__/time.test.ts +265 -1
  422. package/utils/__tests__/title.test.ts +47 -0
  423. package/utils/__tests__/units.test.ts +417 -0
  424. package/utils/__tests__/versions.test.ts +128 -0
  425. package/utils/__tests__/width.test.ts +53 -0
  426. package/utils/__tests__/window.test.ts +158 -0
  427. package/utils/__tests__/xccdf.test.ts +511 -0
  428. package/utils/chart.js +36 -0
  429. package/utils/crypto/__tests__/browserHashUtils.test.ts +98 -0
  430. package/utils/crypto/__tests__/index.test.ts +144 -0
  431. package/utils/duration.ts +104 -0
  432. package/utils/dynamic-content/__tests__/notification-handler.test.ts +196 -0
  433. package/utils/dynamic-content/info.ts +2 -1
  434. package/utils/error.js +13 -0
  435. package/utils/fleet-appco.ts +323 -0
  436. package/utils/fleet.ts +13 -3
  437. package/utils/gatekeeper/__tests__/util.test.ts +174 -0
  438. package/utils/gc/__tests__/gc-interval.test.ts +119 -0
  439. package/utils/gc/__tests__/gc-root-store.test.ts +225 -0
  440. package/utils/gc/__tests__/gc-route-changed.test.ts +96 -0
  441. package/utils/gc/__tests__/gc.test.ts +487 -0
  442. package/utils/ingress.ts +9 -1
  443. package/utils/object.js +22 -2
  444. package/utils/pagination-utils.ts +2 -1
  445. package/utils/provider.ts +12 -0
  446. package/utils/string.js +25 -2
  447. package/utils/uiplugins.ts +5 -5
  448. package/utils/validators/__tests__/cluster-name.test.ts +110 -0
  449. package/utils/validators/__tests__/container-images.test.ts +104 -0
  450. package/utils/validators/__tests__/cron-schedule.test.ts +79 -0
  451. package/utils/validators/__tests__/flow-output.test.ts +91 -0
  452. package/utils/validators/__tests__/index.test.ts +481 -0
  453. package/utils/validators/__tests__/kubernetes-name.test.ts +163 -0
  454. package/utils/validators/__tests__/logging-outputs.test.ts +58 -0
  455. package/utils/validators/__tests__/misc-validators.test.ts +246 -0
  456. package/utils/validators/__tests__/monitoring-route.test.ts +119 -0
  457. package/utils/validators/__tests__/pod-affinity.test.ts +382 -0
  458. package/utils/validators/__tests__/prometheusrule.test.ts +211 -0
  459. package/utils/validators/__tests__/role-template.test.ts +149 -0
  460. package/utils/validators/__tests__/service.test.ts +283 -0
  461. package/utils/validators/__tests__/setting.test.js +32 -0
  462. package/utils/validators/formRules/__tests__/index.test.ts +50 -0
  463. package/utils/validators/formRules/index.ts +5 -5
  464. package/utils/validators/machine-pool.ts +1 -1
  465. package/utils/validators/setting.js +18 -3
  466. package/utils/xccdf.ts +415 -0
  467. package/vue.config.js +1 -1
  468. package/assets/fonts/lato/lato-v17-latin-700.woff +0 -0
  469. package/assets/fonts/lato/lato-v17-latin-700.woff2 +0 -0
  470. package/assets/fonts/lato/lato-v17-latin-regular.woff +0 -0
  471. package/assets/fonts/lato/lato-v17-latin-regular.woff2 +0 -0
  472. package/pages/support/index.vue +0 -264
  473. package/utils/duration.js +0 -43
package/store/aws.js CHANGED
@@ -12,9 +12,10 @@ export const state = () => {
12
12
  };
13
13
 
14
14
  class Handler {
15
- constructor(cloudCredentialId, options) {
15
+ constructor(cloudCredentialId, options, proxyApi) {
16
16
  this.cloudCredentialId = (cloudCredentialId || '');
17
17
  this.fetchHandler = new FetchHttpHandler(options);
18
+ this.proxyApi = proxyApi;
18
19
  }
19
20
 
20
21
  async handle(httpRequest, options = {}) {
@@ -24,24 +25,34 @@ class Handler {
24
25
 
25
26
  httpRequest.headers['x-api-headers-restrict'] = 'Content-Length';
26
27
 
27
- if (this.cloudCredentialId) {
28
- httpRequest.headers['x-api-cattleauth-header'] = `awsv4 credID=${ this.cloudCredentialId }`;
29
- } else if (httpRequest?.headers['authorization']) {
30
- httpRequest.headers['x-api-auth-header'] = httpRequest.headers['authorization'];
31
- }
28
+ // Build proxy options: use awsv4 credential signing when a cloud credential
29
+ // is available, otherwise forward the SDK-generated Authorization header
30
+ // directly via x-api-auth-header.
31
+ const upstreamUrl = new URL(`https://${ httpRequest.hostname }${ httpRequest.path }`);
32
+ const proxyOptions = this.cloudCredentialId ? {
33
+ url: upstreamUrl,
34
+ authentication: {
35
+ id: this.cloudCredentialId,
36
+ authSigner: 'awsv4',
37
+ },
38
+ } : {
39
+ url: upstreamUrl,
40
+ headers: httpRequest?.headers['authorization'] ? { 'x-api-auth-header': httpRequest.headers['authorization'] } : {},
41
+ };
42
+
43
+ const { url: proxyPath, headers: proxyHeaders } = this.proxyApi.prepareRequest(proxyOptions);
32
44
 
45
+ // Merge proxy auth headers; remove the upstream Authorization and the
46
+ // Accept header added by prepareRequest (AWS SDK manages its own Accept).
47
+ Object.assign(httpRequest.headers, proxyHeaders);
33
48
  delete httpRequest.headers['authorization'];
49
+ delete httpRequest.headers['Accept'];
34
50
 
35
51
  const originalContentType = httpRequest.headers['content-type'] ?? '';
36
52
 
37
53
  httpRequest.headers['content-type'] = originalContentType ? `rancher:${ originalContentType }` : 'rancher:';
38
54
 
39
- const endpoint = `/meta/proxy/`;
40
-
41
- if (!httpRequest.path.startsWith(endpoint)) {
42
- httpRequest.path = endpoint + httpRequest.hostname + httpRequest.path;
43
- }
44
-
55
+ httpRequest.path = proxyPath;
45
56
  httpRequest.protocol = window.location.protocol;
46
57
  httpRequest.hostname = window.location.hostname;
47
58
  httpRequest.port = window.location.port;
@@ -114,7 +125,7 @@ export const actions = {
114
125
  const client = new lib.EC2({
115
126
  region,
116
127
  credentialDefaultProvider: credentialDefaultProvider(accessKey, secretKey),
117
- requestHandler: new Handler(cloudCredentialId),
128
+ requestHandler: new Handler(cloudCredentialId, undefined, this.$shell.proxy),
118
129
  useDualstackEndpoint: true,
119
130
  });
120
131
 
@@ -129,7 +140,7 @@ export const actions = {
129
140
  const client = new lib.EKS({
130
141
  region,
131
142
  credentialDefaultProvider: credentialDefaultProvider(accessKey, secretKey),
132
- requestHandler: new Handler(cloudCredentialId),
143
+ requestHandler: new Handler(cloudCredentialId, undefined, this.$shell.proxy),
133
144
  useDualstackEndpoint: true,
134
145
  });
135
146
 
@@ -144,7 +155,7 @@ export const actions = {
144
155
  const client = new lib.KMS({
145
156
  region,
146
157
  credentialDefaultProvider: credentialDefaultProvider(accessKey, secretKey),
147
- requestHandler: new Handler(cloudCredentialId),
158
+ requestHandler: new Handler(cloudCredentialId, undefined, this.$shell.proxy),
148
159
  useDualstackEndpoint: true,
149
160
  });
150
161
 
@@ -159,7 +170,7 @@ export const actions = {
159
170
  const client = new lib.IAM({
160
171
  region,
161
172
  credentialDefaultProvider: credentialDefaultProvider(accessKey, secretKey),
162
- requestHandler: new Handler(cloudCredentialId),
173
+ requestHandler: new Handler(cloudCredentialId, undefined, this.$shell.proxy),
163
174
  useDualstackEndpoint: true,
164
175
  });
165
176
 
package/store/catalog.js CHANGED
@@ -302,6 +302,16 @@ export const mutations = {
302
302
  state.namespacedRepos = namespaced;
303
303
  },
304
304
 
305
+ addClusterRepo(state, repo) {
306
+ if (!state.clusterRepos) {
307
+ state.clusterRepos = [];
308
+ }
309
+
310
+ if (!state.clusterRepos.find((r) => r.metadata?.name === repo.metadata?.name)) {
311
+ state.clusterRepos.push(repo);
312
+ }
313
+ },
314
+
305
315
  setCharts(state, { charts, errors = [], loaded = [] }) {
306
316
  state.charts = charts;
307
317
  state.errors = errors;
@@ -445,6 +455,53 @@ export const actions = {
445
455
  }
446
456
  },
447
457
 
458
+ async loadRepo(ctx, { repoName }) {
459
+ const {
460
+ state, getters, rootGetters, commit, dispatch
461
+ } = ctx;
462
+
463
+ const inStore = rootGetters['currentCluster'] ? rootGetters['currentProduct'].inStore : 'management';
464
+
465
+ let repo = rootGetters[`${ inStore }/byId`](CATALOG.CLUSTER_REPO, repoName);
466
+
467
+ if (!repo) {
468
+ try {
469
+ repo = await dispatch(`${ inStore }/find`, { type: CATALOG.CLUSTER_REPO, id: repoName }, { root: true });
470
+ } catch (e) {
471
+ return;
472
+ }
473
+ }
474
+
475
+ if (!repo) {
476
+ return;
477
+ }
478
+
479
+ commit('addClusterRepo', repo);
480
+
481
+ if (getters.isLoaded(repo)) {
482
+ return;
483
+ }
484
+
485
+ try {
486
+ const index = await repo.followLink('index');
487
+ const charts = { ...state.charts };
488
+
489
+ for (const k in index?.entries) {
490
+ for (const entry of index.entries[k]) {
491
+ addChart(ctx, charts, entry, repo);
492
+ }
493
+ }
494
+
495
+ commit('setCharts', {
496
+ charts,
497
+ errors: state.errors,
498
+ loaded: [repo],
499
+ });
500
+ } catch (e) {
501
+ console.error(`Failed to load repo ${ repoName }:`, e); // eslint-disable-line no-console
502
+ }
503
+ },
504
+
448
505
  /**
449
506
  * Globally refreshes all loaded repositories by triggering their refresh actions concurrently,
450
507
  * bypassing individual catalog loads, and then performs a single, global catalog/load.
@@ -559,7 +616,10 @@ function addChart(ctx, map, chart, repo) {
559
616
 
560
617
  const primeOnly = chart.annotations?.[CATALOG_ANNOTATIONS.PRIME_ONLY] === 'true';
561
618
  const experimental = !!chart.annotations?.[CATALOG_ANNOTATIONS.EXPERIMENTAL];
562
- const windowsIncompatible = !(chart.annotations?.[CATALOG_ANNOTATIONS.PERMITTED_OS] || '').includes('windows');
619
+
620
+ const isRancherRepoFlag = isRancherRepo(repo, chart);
621
+ const permittedSystems = getPermittedOSs(chart.annotations, isRancherRepoFlag);
622
+ const windowsIncompatible = permittedSystems.length > 0 && !permittedSystems.includes('windows');
563
623
  const deploysOnWindows = (chart.annotations?.[CATALOG_ANNOTATIONS.DEPLOYED_OS] || '').includes('windows');
564
624
  const tags = [];
565
625
 
@@ -608,6 +668,7 @@ function addChart(ctx, map, chart, repo) {
608
668
  provides: [],
609
669
  windowsIncompatible,
610
670
  deploysOnWindows,
671
+ isRancherRepo: isRancherRepoFlag,
611
672
  tags
612
673
  });
613
674
 
@@ -692,13 +753,13 @@ export function compatibleVersionsFor(chart, os, includePrerelease = true) {
692
753
  }
693
754
 
694
755
  return versions.filter((ver) => {
695
- const osPermitted = (ver?.annotations?.[CATALOG_ANNOTATIONS.PERMITTED_OS] || LINUX).split(',');
756
+ const osPermitted = getPermittedOSs(ver?.annotations, chart?.isRancherRepo);
696
757
 
697
758
  if ( !includePrerelease && isPrerelease(ver.version) ) {
698
759
  return false;
699
760
  }
700
761
 
701
- if ( !os || difference(os, osPermitted).length === 0) {
762
+ if ( !os || osPermitted.length === 0 || difference(os, osPermitted).length === 0) {
702
763
  return true;
703
764
  }
704
765
 
@@ -787,3 +848,23 @@ export function filterAndArrangeCharts(charts, {
787
848
 
788
849
  return sortBy(out, ['certifiedSort', 'repoName', 'chartNameDisplay']);
789
850
  }
851
+
852
+ /**
853
+ * Detects if a repository is a Rancher repository.
854
+ */
855
+ export function isRancherRepo(repo, chart) {
856
+ return !!(chart?.isRancherRepo || repo?.isRancherSource);
857
+ }
858
+
859
+ /**
860
+ * Returns an array of permitted operating systems for a given chart or version.
861
+ * If the chart explicitly defines permitted OSs via annotation, those are returned.
862
+ * Otherwise, if the chart is from a Rancher repository, it defaults to Linux.
863
+ * External charts with no annotations have no OS restrictions (returns empty array).
864
+ */
865
+ export function getPermittedOSs(annotations, isRancher) {
866
+ const permittedOs = annotations?.[CATALOG_ANNOTATIONS.PERMITTED_OS];
867
+ const fallbackOs = isRancher ? LINUX : '';
868
+
869
+ return (permittedOs || fallbackOs).split(',').filter(Boolean);
870
+ }
@@ -1,5 +1,5 @@
1
1
  import { sortBy } from '@shell/utils/sort';
2
- import { addParam, addParams } from '@shell/utils/url';
2
+ import { createDepaginator } from '@shell/apis/shell/proxy';
3
3
 
4
4
  const ENDPOINT = 'api.digitalocean.com/v2';
5
5
 
@@ -149,50 +149,32 @@ export const actions = {
149
149
  return out;
150
150
  },
151
151
 
152
- async request({ dispatch }, {
153
- token, credentialId, command, opt, out
152
+ async request(_, {
153
+ token, credentialId, command, opt
154
154
  }) {
155
155
  opt = opt || {};
156
156
 
157
- let url = '/meta/proxy/';
157
+ const url = new URL(opt.url || `https://${ ENDPOINT }/${ command }`);
158
158
 
159
- if ( opt.url ) {
160
- url += opt.url.replace(/^https?:\/\//, '');
161
- } else {
162
- url += `${ ENDPOINT }/${ command }`;
163
- url = addParam(url, 'per_page', opt.per_page || 1000);
164
- url = addParams(url, opt.params || {});
165
- }
166
-
167
- const headers = { Accept: 'application/json' };
168
-
169
- if ( credentialId ) {
170
- headers['x-api-cattleauth-header'] = `Bearer credID=${ credentialId } passwordField=accessToken`;
171
- } else if ( token ) {
172
- headers['x-api-auth-header'] = `Bearer ${ token }`;
173
- }
174
-
175
- const res = await dispatch('management/request', {
176
- url,
177
- headers,
178
- redirectUnauthorized: false,
179
- }, { root: true });
180
-
181
- if ( out ) {
182
- out[command] = out[command].concat(res[command]);
183
- } else {
184
- out = res;
159
+ url.searchParams.set('per_page', `${ opt.per_page || 1000 }`);
160
+ if (opt.params) {
161
+ for (const [key, value] of Object.entries(opt.params)) {
162
+ url.searchParams.set(key, value);
163
+ }
185
164
  }
186
165
 
187
- // De-pagination
188
- if ( res?.links?.pages?.next ) {
189
- opt.url = res.links.pages.next;
166
+ const authentication = credentialId ? {
167
+ id: credentialId,
168
+ authSigner: 'bearer',
169
+ passwordField: 'accessToken',
170
+ } : { token };
190
171
 
191
- return dispatch('request', {
192
- token, credentialId, command, opt, out
193
- });
194
- }
172
+ const proxy = this.$shell?.proxy;
173
+ const requestOptions = { url, authentication };
195
174
 
196
- return out;
175
+ return proxy.request({
176
+ ...requestOptions,
177
+ postProcess: createDepaginator(proxy, requestOptions, { mergeKey: command }),
178
+ });
197
179
  },
198
180
  };
package/store/index.js CHANGED
@@ -1041,6 +1041,8 @@ export const actions = {
1041
1041
  // This is a workaround for a timing issue where the mgmt cluster schema may not be available
1042
1042
  // Try and wait until the schema exists before proceeding
1043
1043
  await dispatch('management/waitForSchema', { type: MANAGEMENT.CLUSTER });
1044
+ // Similarly to above, we somehow get here without everything in management land being ready. FF needed to determine pagination state
1045
+ await dispatch('management/waitForHaveAll', { type: MANAGEMENT.FEATURE });
1044
1046
 
1045
1047
  // If SSP is on we won't have requested all clusters
1046
1048
  if (!paginateClusters({ rootGetters, state })) {
package/store/linode.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { sortBy } from '@shell/utils/sort';
2
- import { addParam, addParams } from '@shell/utils/url';
2
+ import { createDepaginator } from '@shell/apis/shell/proxy';
3
3
 
4
4
  const ENDPOINT = 'api.linode.com/v4';
5
5
 
@@ -93,50 +93,35 @@ export const actions = {
93
93
  return out;
94
94
  },
95
95
 
96
- async request({ dispatch }, {
97
- token, credentialId, command, opt, out
96
+ async request(_, {
97
+ token, credentialId, command, opt
98
98
  }) {
99
99
  opt = opt || {};
100
100
 
101
- let url = '/meta/proxy/';
101
+ const url = new URL(opt.url || `https://${ ENDPOINT }/${ command }`);
102
102
 
103
- if ( opt.url ) {
104
- url += opt.url.replace(/^https?:\/\//, '');
105
- } else {
106
- url += `${ ENDPOINT }/${ command }`;
107
- url = addParam(url, 'per_page', opt.per_page || 1000);
108
- url = addParams(url, opt.params || {});
103
+ url.searchParams.set('per_page', `${ opt.per_page || 1000 }`);
104
+ if (opt.params) {
105
+ for (const [key, value] of Object.entries(opt.params)) {
106
+ url.searchParams.set(key, value);
107
+ }
109
108
  }
110
109
 
111
- const headers = { Accept: 'application/json' };
112
-
113
- if ( credentialId ) {
114
- headers['X-API-CattleAuth-Header'] = `Bearer credID=${ credentialId } passwordField=token`;
115
- } else if ( token ) {
116
- headers['X-API-Auth-Header'] = `Bearer ${ token }`;
117
- }
118
-
119
- const res = await dispatch('management/request', {
120
- url,
121
- headers,
122
- redirectUnauthorized: false,
123
- }, { root: true });
124
-
125
- if ( out ) {
126
- out[command] = out[command].concat(res[command]);
127
- } else {
128
- out = res;
129
- }
130
-
131
- // De-pagination
132
- if ( res?.links?.pages?.next ) {
133
- opt.url = res.links.pages.next;
134
-
135
- return dispatch('request', {
136
- token, credentialId, command, opt, out
137
- });
138
- }
139
-
140
- return out;
110
+ const authentication = credentialId ? {
111
+ id: credentialId,
112
+ authSigner: 'bearer',
113
+ passwordField: 'token',
114
+ } : { token };
115
+
116
+ const proxy = this.$shell.proxy;
117
+ const requestOptions = { url, authentication };
118
+
119
+ return proxy.request({
120
+ ...requestOptions,
121
+ postProcess: createDepaginator(proxy, requestOptions, {
122
+ nextUrlPath: 'links.pages.next',
123
+ mergeKey: command,
124
+ }),
125
+ });
141
126
  }
142
127
  };
package/store/plugins.js CHANGED
@@ -172,14 +172,14 @@ export const getters = {
172
172
  return async(name) => {
173
173
  const schema = getters.schemaForDriver(name);
174
174
 
175
- await schema.fetchResourceFields();
176
-
177
175
  if ( !schema ) {
178
176
  // eslint-disable-next-line no-console
179
177
  console.error(`Machine Driver Config schema not found for ${ name }`);
180
178
 
181
179
  return [];
182
180
  }
181
+ await schema.fetchResourceFields();
182
+
183
183
  // This is used in places where `createPopulated` has been called, which has called fetchResourceFields to populate resourceFields
184
184
  const out = Object.keys(schema?.resourceFields || {});
185
185
 
@@ -191,13 +191,16 @@ export const getters = {
191
191
 
192
192
  fieldsForDriver(state, getters) {
193
193
  return async(name) => {
194
+ const out = {};
194
195
  const schema = getters.schemaForDriver(name);
195
196
 
197
+ if ( !schema ) {
198
+ return out;
199
+ }
200
+
196
201
  await schema.fetchResourceFields();
197
202
  const names = await getters.fieldNamesForDriver(name);
198
203
 
199
- const out = {};
200
-
201
204
  for ( const n of names ) {
202
205
  out[n] = schema.resourceFields[n];
203
206
  }
package/store/pnap.js CHANGED
@@ -68,6 +68,7 @@ export const actions = {
68
68
  return out;
69
69
  },
70
70
 
71
+ // DEPRECATED: accessing /meta/proxy directly is deprecated
71
72
  async request({ dispatch }, {
72
73
  clientId, clientSecret, credentialId, command, opt, out
73
74
  }) {
package/store/type-map.js CHANGED
@@ -20,7 +20,7 @@
20
20
  // importList(type) Returns a promise that resolves to the list component for type
21
21
  // importDetail(type[,subType]) Returns a promise that resolves to the detail component for type
22
22
  // importEdit(type[,subType]) Returns a promise that resolves to the edit component for type
23
- // optionsFor(schemaOrType) Return the configured options for a type (from configureType)
23
+ // optionsFor(schemaOrType, pagination(bool), product(string)) Return the configured options for a type (from configureType) - additional product param can be passed if "optionsFor" needed isn't the current product
24
24
  //
25
25
  // 3) Changing specialization info about a type
26
26
  // For all:
@@ -107,6 +107,7 @@
107
107
  // notFilterNamespace: undefined -- Define namespaces that do not need to be filtered
108
108
  // localOnly: False -- Hide this type from the nav/search bar on downstream clusters
109
109
  // custom: any - Custom options for a given type
110
+ // product: string - If set, this type's options will only apply when that product is active
110
111
  // }
111
112
  // )
112
113
  // ignoreGroup(group): Never show group or any types in it
@@ -269,20 +270,25 @@ export function DSL(store, product, module = 'type-map') {
269
270
  store.commit(`${ module }/groupBy`, { type, field });
270
271
  },
271
272
 
272
- headers(type, headers, paginationHeaders = []) {
273
- headers.forEach((header) => {
273
+ headers(type, headers = [], paginationHeaders = []) {
274
+ if (headers.length) {
275
+ headers.forEach((header) => {
274
276
  // If on the client, then use the value getter if there is one
275
- if (header.getValue) {
277
+ if (header.getValue) {
276
278
  // we need to store the .value prop for the advanced filtering
277
- header.valueProp = header.value;
278
- header.value = header.getValue;
279
- }
279
+ header.valueProp = header.value;
280
+ header.value = header.getValue;
281
+ }
280
282
 
281
- delete header.getValue;
282
- });
283
+ delete header.getValue;
284
+ });
283
285
 
284
- store.commit(`${ module }/headers`, { type, headers });
285
- store.commit(`${ module }/paginationHeaders`, { type, paginationHeaders });
286
+ store.commit(`${ module }/headers`, { type, headers });
287
+ }
288
+
289
+ if (paginationHeaders.length) {
290
+ store.commit(`${ module }/paginationHeaders`, { type, paginationHeaders });
291
+ }
286
292
  },
287
293
 
288
294
  hideBulkActions(type, field) {
@@ -290,7 +296,9 @@ export function DSL(store, product, module = 'type-map') {
290
296
  },
291
297
 
292
298
  configureType(match, options) {
293
- store.commit(`${ module }/configureType`, { ...options, match });
299
+ store.commit(`${ module }/configureType`, {
300
+ ...options, match, product
301
+ });
294
302
  },
295
303
 
296
304
  componentForType(match, replace) {
@@ -371,6 +379,18 @@ export function DSL(store, product, module = 'type-map') {
371
379
  };
372
380
  }
373
381
 
382
+ const LEGACY_COMPATIBILITY_BUCKET = 'legacyCompatibilityProdRegistration';
383
+
384
+ function validateProductName(product) {
385
+ if (!product || typeof product !== 'string' || product.trim() === '') {
386
+ throw new Error(`Product name must be a non-empty string, got: ${ JSON.stringify(product) }`);
387
+ }
388
+
389
+ if (product === LEGACY_COMPATIBILITY_BUCKET) {
390
+ throw new Error(`Product name cannot be "${ LEGACY_COMPATIBILITY_BUCKET }" as it is reserved for backward compatibility`);
391
+ }
392
+ }
393
+
374
394
  let called = false;
375
395
 
376
396
  export async function applyProducts(store, $extension) {
@@ -412,7 +432,7 @@ export const state = function() {
412
432
  typeMappings: [],
413
433
  typeMoveMappings: [],
414
434
  typeToComponentMappings: [],
415
- typeOptions: [],
435
+ typeOptions: {},
416
436
  groupBy: {},
417
437
  headers: {},
418
438
  paginationHeaders: {},
@@ -549,15 +569,37 @@ export const getters = {
549
569
  subTypes: [],
550
570
  };
551
571
 
552
- return (schemaOrType, pagination) => {
572
+ return (schemaOrType, pagination, product) => {
553
573
  // Note - This can run a LOT so needs to be performant
554
574
 
555
575
  if (!schemaOrType) {
556
576
  return {};
557
577
  }
558
578
 
579
+ if (product) {
580
+ validateProductName(product);
581
+ }
582
+
559
583
  const type = (typeof schemaOrType === 'object' ? schemaOrType.id : schemaOrType);
560
- const found = state.typeOptions.find((entry) => {
584
+ const productToUse = product || rootGetters['productId'];
585
+
586
+ // Handle both array (pre-2.15) and object (2.15+) state.typeOptions formats for backwards compatibility
587
+ let productTypeOptions = [];
588
+
589
+ if (Array.isArray(state.typeOptions)) {
590
+ // Legacy format: filter the flat array for entries matching the product or entries without a product field
591
+ productTypeOptions = state.typeOptions.filter((entry) => entry.product === productToUse || !entry.product
592
+ );
593
+ } else {
594
+ // New format: direct object lookup by product, with fallback to legacy compatibility bucket for unscoped entries
595
+ // (e.g., extensions compiled with pre-2.15 shell that don't send product parameter)
596
+ productTypeOptions = [
597
+ ...(state.typeOptions[productToUse] || []),
598
+ ...(state.typeOptions[LEGACY_COMPATIBILITY_BUCKET] || [])
599
+ ];
600
+ }
601
+
602
+ const found = productTypeOptions.find((entry) => {
561
603
  const re = stringToRegex(entry.match);
562
604
 
563
605
  return re.test(type);
@@ -944,7 +986,7 @@ export const getters = {
944
986
  });
945
987
 
946
988
  const attrs = schema.attributes || {};
947
- const typeOptions = getters['optionsFor'](schema);
989
+ const typeOptions = getters['optionsFor'](schema, undefined, product);
948
990
 
949
991
  schemaModes[TYPE_MODES.BASIC] = schemaModes[TYPE_MODES.BASIC] && getters.groupForBasicType(product, schema.id);
950
992
 
@@ -1522,6 +1564,10 @@ export const mutations = {
1522
1564
  delete state.virtualTypes[product];
1523
1565
  }
1524
1566
 
1567
+ if (state.typeOptions[product]) {
1568
+ delete state.typeOptions[product];
1569
+ }
1570
+
1525
1571
  if (state.basicTypes[product]) {
1526
1572
  // Remove table header configuration
1527
1573
  Object.keys(state.basicTypes[product]).forEach((type) => {
@@ -1784,20 +1830,54 @@ export const mutations = {
1784
1830
  },
1785
1831
 
1786
1832
  configureType(state, options) {
1787
- const match = regexToString(ensureRegex(options.match));
1833
+ const { product, ...typeOptions } = options;
1834
+ const match = regexToString(ensureRegex(typeOptions.match));
1835
+
1836
+ // Handle both old (array) and new (object) state.typeOptions formats for backwards compatibility
1837
+ // Old format (pre-2.15): state.typeOptions = []
1838
+ // New format (2.15+): state.typeOptions = { productName: [...] }
1839
+ if (Array.isArray(state.typeOptions)) {
1840
+ // Legacy path: old format for extensions compiled with pre-2.15 shell
1841
+ // In 2.14, product parameter is not validated/enforced
1842
+ const idx = state.typeOptions.findIndex((obj) => obj.match === match);
1843
+ let obj = { ...options, match };
1844
+
1845
+ if ( idx >= 0 ) {
1846
+ // Merge the custom data object - multiple configures will update existing rather than overwrite
1847
+ obj.custom = Object.assign(state.typeOptions[idx].custom || {}, obj.custom || {});
1848
+ obj = Object.assign(state.typeOptions[idx], obj);
1849
+ state.typeOptions.splice(idx, 1, obj);
1850
+ } else {
1851
+ state.typeOptions.push(obj);
1852
+ }
1853
+ } else {
1854
+ // New path: object format with product scoping (2.15+)
1855
+ // Product is required in new format
1856
+ if (!product) {
1857
+ throw new Error(`configureType: product parameter is required in Rancher 2.15+, not provided for type "${ match }"`);
1858
+ }
1788
1859
 
1789
- const idx = state.typeOptions.findIndex((obj) => obj.match === match);
1790
- let obj = { ...options, match };
1860
+ validateProductName(product);
1791
1861
 
1792
- if ( idx >= 0 ) {
1793
- // Merge the custom data object - multiple configures will update existing rather than overwrite
1794
- obj.custom = Object.assign(state.typeOptions[idx].custom || {}, obj.custom || {});
1795
- obj = Object.assign(state.typeOptions[idx], obj);
1796
- state.typeOptions.splice(idx, 1, obj);
1797
- } else {
1798
- const obj = Object.assign({}, options, { match });
1862
+ // Initialize product's typeOptions array if needed
1863
+ if (!state.typeOptions[product]) {
1864
+ state.typeOptions[product] = [];
1865
+ }
1866
+
1867
+ const productTypeOptions = state.typeOptions[product];
1868
+ const idx = productTypeOptions.findIndex((obj) => obj.match === match);
1869
+ let obj = { ...typeOptions, match };
1799
1870
 
1800
- state.typeOptions.push(obj);
1871
+ if ( idx >= 0 ) {
1872
+ // Merge the custom data object - multiple configures will update existing rather than overwrite
1873
+ obj.custom = Object.assign(productTypeOptions[idx].custom || {}, obj.custom || {});
1874
+ obj = Object.assign(productTypeOptions[idx], obj);
1875
+ productTypeOptions.splice(idx, 1, obj);
1876
+ } else {
1877
+ const obj = Object.assign({}, typeOptions, { match });
1878
+
1879
+ productTypeOptions.push(obj);
1880
+ }
1801
1881
  }
1802
1882
  },
1803
1883
 
@@ -1836,8 +1916,10 @@ export const actions = {
1836
1916
  dispatch('prefs/set', { key: EXPANDED_GROUPS, value: groups }, { root: true });
1837
1917
  },
1838
1918
 
1839
- configureType({ commit }, options) {
1840
- commit('configureType', options);
1919
+ configureType({ commit, rootGetters }, options) {
1920
+ const product = options.product || rootGetters['productId'];
1921
+
1922
+ commit('configureType', { ...options, product });
1841
1923
  }
1842
1924
  };
1843
1925