@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
@@ -0,0 +1,88 @@
1
+ <script>
2
+ import Loading from '@shell/components/Loading';
3
+ import ChartReadme from '@shell/components/ChartReadme';
4
+ import ChartMixin from '@shell/mixins/chart';
5
+ import isEqual from 'lodash/isEqual';
6
+
7
+ const readQueryBool = (value, defaultValue) => {
8
+ if (value === undefined) {
9
+ return defaultValue;
10
+ }
11
+
12
+ return `${ value }` === 'true';
13
+ };
14
+
15
+ export default {
16
+ components: {
17
+ ChartReadme,
18
+ Loading,
19
+ },
20
+
21
+ mixins: [ChartMixin],
22
+
23
+ async fetch() {
24
+ await this.fetchChart();
25
+ },
26
+
27
+ computed: {
28
+ showAppReadme() {
29
+ return readQueryBool(this.$route.query.showAppReadme, false);
30
+ },
31
+
32
+ hideReadmeFirstTitle() {
33
+ return readQueryBool(this.$route.query.hideReadmeFirstTitle, false);
34
+ }
35
+ },
36
+
37
+ watch: {
38
+ '$route.query'(neu, old) {
39
+ if (!isEqual(neu, old) && Object.keys(neu).length > 0) {
40
+ this.$fetch();
41
+ }
42
+ }
43
+ }
44
+ };
45
+ </script>
46
+
47
+ <template>
48
+ <Loading v-if="$fetchState.pending" />
49
+ <main
50
+ v-else
51
+ class="readme-page"
52
+ >
53
+ <div
54
+ v-if="versionInfoError"
55
+ class="readme-page__content"
56
+ >
57
+ {{ versionInfoError }}
58
+ </div>
59
+ <ChartReadme
60
+ v-else-if="hasReadme"
61
+ :version-info="versionInfo"
62
+ :show-app-readme="showAppReadme"
63
+ :hide-readme-first-title="hideReadmeFirstTitle"
64
+ class="readme-page__content"
65
+ />
66
+ <div
67
+ v-else
68
+ class="readme-page__content"
69
+ >
70
+ {{ t('catalog.install.appReadmeMissing', {}, true) }}
71
+ </div>
72
+ </main>
73
+ </template>
74
+
75
+ <style lang="scss" scoped>
76
+ .readme-page {
77
+ box-sizing: border-box;
78
+ min-height: 100%;
79
+ padding: 24px;
80
+ background-color: var(--body-bg);
81
+ color: var(--body-text);
82
+
83
+ &__content {
84
+ max-width: 1100px;
85
+ margin: 0 auto;
86
+ }
87
+ }
88
+ </style>
@@ -0,0 +1,9 @@
1
+ import { Config } from 'dompurify';
2
+
3
+ export function purifyHTML(value: string, options?: Config): string;
4
+
5
+ export function addLinkInterceptor(fn: (link: string) => string | undefined | void, name?: string): void;
6
+
7
+ export function removeLinkInterceptor(fn: (link: string) => string | undefined | void): void;
8
+
9
+ export function processLink(link: string): string;
@@ -3,6 +3,10 @@ import Resource from '@shell/plugins/dashboard-store/resource-class.js';
3
3
  import { resourceClassJunkObject } from '@shell/plugins/dashboard-store/__tests__/utils/store-mocks';
4
4
  import { EVENT } from '@shell/config/types';
5
5
 
6
+ jest.mock('@shell/config/version', () => ({ getVersionData: () => ({ Version: 'v2.13.0' }) }));
7
+ jest.mock('@shell/config/uiplugins', () => ({ parseRancherVersion: (v: string) => v }));
8
+ jest.mock('@shell/core/plugin-helpers', () => ({ getApplicableExtensionEnhancements: () => [] }));
9
+
6
10
  describe('class: Resource', () => {
7
11
  describe('given custom resource keys', () => {
8
12
  const customResource = resourceClassJunkObject;
@@ -399,6 +403,99 @@ describe('class: Resource', () => {
399
403
 
400
404
  expect(cards).toHaveLength(0);
401
405
  });
406
+
407
+ it('should include the resources card when relationships exist', () => {
408
+ const resource = new Resource({
409
+ type: 'test',
410
+ metadata: {
411
+ relationships: [
412
+ {
413
+ rel: 'uses', toType: 'svc', toId: 'a'
414
+ },
415
+ {
416
+ rel: 'uses', fromType: 'pod', fromId: 'b'
417
+ },
418
+ ]
419
+ }
420
+ }, {
421
+ getters: { schemaFor: () => ({ linkFor: jest.fn() }) },
422
+ dispatch: jest.fn(),
423
+ rootGetters: {
424
+ 'i18n/t': (key: string) => key,
425
+ 'cluster/all': () => []
426
+ },
427
+ });
428
+
429
+ const cards = resource.cards;
430
+
431
+ expect(cards).toHaveLength(1);
432
+ expect(cards[0].props.title).toBe('component.resource.detail.card.resourcesCard.title');
433
+ });
434
+ });
435
+
436
+ describe('getter: resourcesCard', () => {
437
+ it('should return null when there are no relationships', () => {
438
+ const resource = new Resource({ type: 'test' }, {
439
+ getters: { schemaFor: () => ({ linkFor: jest.fn() }) },
440
+ dispatch: jest.fn(),
441
+ rootGetters: { 'i18n/t': (key: string) => key },
442
+ });
443
+
444
+ expect(resource.resourcesCard).toBeNull();
445
+ });
446
+
447
+ it('should return rows for both referredToBy and refersTo when relationships exist in both directions', () => {
448
+ const resource = new Resource({
449
+ type: 'test',
450
+ metadata: {
451
+ relationships: [
452
+ {
453
+ rel: 'owner', fromType: 'rs', fromId: 'r-1'
454
+ },
455
+ {
456
+ rel: 'uses', toType: 'svc', toId: 's-1'
457
+ },
458
+ {
459
+ rel: 'uses', toType: 'svc', toId: 's-2'
460
+ },
461
+ ]
462
+ }
463
+ }, {
464
+ getters: { schemaFor: () => ({ linkFor: jest.fn() }) },
465
+ dispatch: jest.fn(),
466
+ rootGetters: { 'i18n/t': (key: string) => key },
467
+ });
468
+
469
+ const rows = resource.resourcesCardRows;
470
+
471
+ expect(rows).toHaveLength(2);
472
+ expect(rows[0].label).toBe('component.resource.detail.card.resourcesCard.rows.referredToBy');
473
+ expect(rows[0].counts[0].count).toBe(1);
474
+ expect(rows[1].label).toBe('component.resource.detail.card.resourcesCard.rows.refersTo');
475
+ expect(rows[1].counts[0].count).toBe(2);
476
+ });
477
+
478
+ it('should omit a direction with no relationships', () => {
479
+ const resource = new Resource({
480
+ type: 'test',
481
+ metadata: {
482
+ relationships: [
483
+ {
484
+ rel: 'uses', toType: 'svc', toId: 's-1'
485
+ },
486
+ ]
487
+ }
488
+ }, {
489
+ getters: { schemaFor: () => ({ linkFor: jest.fn() }) },
490
+ dispatch: jest.fn(),
491
+ rootGetters: { 'i18n/t': (key: string) => key },
492
+ });
493
+
494
+ const rows = resource.resourcesCardRows;
495
+
496
+ expect(rows).toHaveLength(1);
497
+ expect(rows[0].label).toBe('component.resource.detail.card.resourcesCard.rows.refersTo');
498
+ });
402
499
  });
403
500
 
404
501
  describe('getter: insightCardProps', () => {
@@ -497,4 +594,88 @@ describe('class: Resource', () => {
497
594
  expect(actions[1].variant).toBe('primary');
498
595
  });
499
596
  });
597
+
598
+ describe('getter: _availableActions', () => {
599
+ function createResource(links: Record<string, string>, overrides: Record<string, any> = {}) {
600
+ const resource = new Resource({
601
+ type: 'test-type',
602
+ links,
603
+ ...overrides,
604
+ }, {
605
+ getters: {
606
+ schemaFor: () => ({
607
+ linkFor: jest.fn(),
608
+ resourceMethods: [],
609
+ collectionMethods: [],
610
+ }),
611
+ },
612
+ dispatch: jest.fn(),
613
+ rootState: { $extension: { getPlugins: () => ({}) } },
614
+ rootGetters: {
615
+ 'i18n/t': (key: string) => key,
616
+ 'type-map/hasCustomEdit': () => false,
617
+ 'type-map/optionsFor': () => ({
618
+ isEditable: false, isRemovable: true, isCreatable: false
619
+ }),
620
+ 'prefs/get': () => false,
621
+ currentCluster: undefined,
622
+ currentProduct: undefined,
623
+ ...overrides.rootGetters,
624
+ },
625
+ });
626
+
627
+ jest.spyOn(resource, 'currentRouter').mockReturnValue({ currentRoute: { value: {} } } as any);
628
+
629
+ return resource;
630
+ }
631
+
632
+ function findAction(actions: any[], actionName: string) {
633
+ return actions.find((a: any) => a.action === actionName);
634
+ }
635
+
636
+ it('should hide "View YAML" when "Show Configuration" is enabled and resource cannot edit YAML', () => {
637
+ const resource = createResource({ view: '/api/v1/test' });
638
+
639
+ const actions = resource._availableActions;
640
+ const viewYaml = findAction(actions, 'goToViewYaml');
641
+ const showConfig = findAction(actions, 'showConfiguration');
642
+
643
+ expect(showConfig.enabled).toBe(true);
644
+ expect(viewYaml.enabled).toBe(false);
645
+ });
646
+
647
+ it('should show "Edit YAML" even when "Show Configuration" is enabled', () => {
648
+ const resource = createResource(
649
+ { view: '/api/v1/test', update: '/api/v1/test' },
650
+ {
651
+ rootGetters: {
652
+ 'type-map/optionsFor': () => ({
653
+ isEditable: true, isRemovable: true, isCreatable: false
654
+ })
655
+ }
656
+ },
657
+ );
658
+
659
+ const actions = resource._availableActions;
660
+ const editYaml = findAction(actions, 'goToEditYaml');
661
+ const showConfig = findAction(actions, 'showConfiguration');
662
+
663
+ expect(showConfig.enabled).toBe(true);
664
+ expect(editYaml.enabled).toBe(true);
665
+ });
666
+
667
+ it('should show "View YAML" when "Show Configuration" is not enabled', () => {
668
+ const resource = createResource(
669
+ { view: '/api/v1/test' },
670
+ { disableResourceDetailDrawer: true },
671
+ );
672
+
673
+ const actions = resource._availableActions;
674
+ const viewYaml = findAction(actions, 'goToViewYaml');
675
+ const showConfig = findAction(actions, 'showConfiguration');
676
+
677
+ expect(showConfig.enabled).toBe(false);
678
+ expect(viewYaml.enabled).toBe(true);
679
+ });
680
+ });
500
681
  });
@@ -660,12 +660,8 @@ export default {
660
660
  return getters.all(type);
661
661
  },
662
662
 
663
- // opt:
664
- // filter: Filter by fields, e.g. {field: value, anotherField: anotherValue} (default: none)
665
- // limit: Number of records to return per page (default: 1000)
666
- // sortBy: Sort by field
667
- // sortOrder: asc or desc
668
- // url: Use this specific URL instead of looking up the URL for the type/id. This should only be used for bootstrapping schemas on startup.
663
+ // opt: @ActionFindArgs
664
+ // @returns @ActionFindResponse
669
665
  // @TODO depaginate: If the response is paginated, retrieve all the pages. (default: true)
670
666
  async find(ctx, { type, id, opt }) {
671
667
  if (!id) {
@@ -697,11 +693,23 @@ export default {
697
693
  }
698
694
  }
699
695
 
696
+ const havePage = getters.havePage(type);
697
+
700
698
  opt = opt || {};
701
699
  opt.url = getters.urlFor(type, id, opt);
702
700
 
703
701
  const res = await dispatch('request', { opt, type });
704
702
 
703
+ if (!havePage && getters.havePage(type)) {
704
+ // There may be a super edge case where list --> detail (whilst loading) --> list navigation causes the list's rows to disappear
705
+ // Somehow the `findPage` from the list page returns before the `find`. The `find` then clears the page state in the cache.
706
+ // If this has happened silently return (we don't care about result)
707
+ // https://github.com/rancher/dashboard/issues/17524
708
+ console.warn(`Prevented \`find\` action from polluting cache for type "${ type }" (currently represents a page).`); // eslint-disable-line no-console
709
+
710
+ return;
711
+ }
712
+
705
713
  if (!opt.transient) {
706
714
  await dispatch('load', { data: res, invalidatePageCache: opt.invalidatePageCache });
707
715
  }
@@ -830,19 +838,33 @@ export default {
830
838
  /**
831
839
  * Remove all cached entries for a resource and stop watches
832
840
  */
833
- forgetType({ commit, dispatch, state }, type, compareWatches) {
834
- // Stop all known watches
835
- state.started
836
- .filter((entry) => compareWatches ? compareWatches(entry) : entry.type === type)
837
- .forEach((entry) => dispatch('unwatch', entry));
838
-
839
- // Stop all known back-off watch processes for this type
840
- dispatch('resetWatchBackOff', {
841
- type, compareWatches, resetStarted: false
842
- });
841
+ forgetType({ commit, dispatch, state }, payload) {
842
+ let type = payload;
843
+ let config = {};
844
+
845
+ if ( typeof payload === 'object' && payload !== null && payload.type ) {
846
+ type = payload.type;
847
+ config = payload;
848
+ }
849
+
850
+ const { compareWatches, unwatch = true, forget = true } = config;
843
851
 
844
- // Remove entries from store
845
- commit('forgetType', type);
852
+ if (unwatch) {
853
+ // Stop all known watches
854
+ state.started
855
+ .filter((entry) => compareWatches ? compareWatches(entry) : entry.type === type)
856
+ .forEach((entry) => dispatch('unwatch', entry));
857
+
858
+ // Stop all known back-off watch processes for this type
859
+ dispatch('resetWatchBackOff', {
860
+ type, compareWatches, resetStarted: false
861
+ });
862
+ }
863
+
864
+ if (forget) {
865
+ // Remove entries from store
866
+ commit('forgetType', type);
867
+ }
846
868
  },
847
869
 
848
870
  promptRemove({ commit, state }, resources ) {
@@ -12,6 +12,7 @@ import {
12
12
  AS,
13
13
  MODE
14
14
  } from '@shell/config/query-params';
15
+ import { EVENT } from '@shell/config/types';
15
16
  import { VIEW_IN_API, DEV } from '@shell/store/prefs';
16
17
  import { addObject, addObjects, findBy, removeAt } from '@shell/utils/array';
17
18
  import CustomValidators from '@shell/utils/custom-validators';
@@ -39,8 +40,7 @@ import { handleConflict } from '@shell/plugins/dashboard-store/normalize';
39
40
  import { ExtensionPoint, ActionLocation } from '@shell/core/types';
40
41
  import { getApplicableExtensionEnhancements } from '@shell/core/plugin-helpers';
41
42
  import { parse } from '@shell/utils/selector';
42
- import { EVENT } from '@shell/config/types';
43
- import { useResourceCardRow } from '@shell/components/Resource/Detail/Card/StateCard/composables';
43
+ import { useResourceCardRow, useResourceCardRowFromRelationships } from '@shell/components/Resource/Detail/Card/StateCard/composables';
44
44
 
45
45
  export const DNS_LIKE_TYPES = ['dnsLabel', 'dnsLabelRestricted', 'hostname'];
46
46
 
@@ -507,7 +507,11 @@ export function colorForState(state, isError, isTransitioning) {
507
507
  return `text-${ color }`;
508
508
  }
509
509
 
510
- export function stateDisplay(state) {
510
+ export function simpleColorForState(state, isError = false, isTransitioning = false) {
511
+ return colorForState(state, isError, isTransitioning).replace('text-', '') || 'disabled';
512
+ }
513
+
514
+ export function stateDisplay(state, preserveOriginal = false) {
511
515
  // @TODO use translations
512
516
  const key = (state || 'active').toLowerCase();
513
517
 
@@ -515,6 +519,11 @@ export function stateDisplay(state) {
515
519
  return REMAP_STATE[key];
516
520
  }
517
521
 
522
+ // Preserves the original state name returned by the
523
+ if ( preserveOriginal ) {
524
+ return ucFirst(state);
525
+ }
526
+
518
527
  return key.split(/-/).map(ucFirst).join('-');
519
528
  }
520
529
 
@@ -754,7 +763,7 @@ export default class Resource {
754
763
  }
755
764
 
756
765
  get stateSimpleColor() {
757
- return this.stateColor.replace('text-', '');
766
+ return simpleColorForState(this.state, this.stateObj?.error, this.stateObj?.transitioning);
758
767
  }
759
768
 
760
769
  get stateBackground() {
@@ -946,12 +955,15 @@ export default class Resource {
946
955
  // where mostly likely extension CRD model is extending from resource-class
947
956
  const isResourceDetailDrawerCompatibleWithRancherSystem = semver.satisfies(parsedRancherVersion, '>= 2.13.0');
948
957
 
958
+ // If the resource can't show an edit or a yaml we don't want to show the configuration drawer
959
+ const showConfigEnabled = isResourceDetailDrawerCompatibleWithRancherSystem && this.disableResourceDetailDrawer !== true && (this.canCustomEdit || this.canYaml);
960
+
949
961
  const all = [
950
962
  {
951
963
  action: 'showConfiguration',
952
964
  label: this.t('action.showConfiguration'),
953
965
  icon: 'icon icon-document',
954
- enabled: isResourceDetailDrawerCompatibleWithRancherSystem && this.disableResourceDetailDrawer !== true && (this.canCustomEdit || this.canYaml), // If the resource can't show an edit or a yaml we don't want to show the configuration drawer
966
+ enabled: showConfigEnabled,
955
967
  },
956
968
  { divider: true },
957
969
  {
@@ -964,7 +976,7 @@ export default class Resource {
964
976
  action: this.canEditYaml ? 'goToEditYaml' : 'goToViewYaml',
965
977
  label: this.t(this.canEditYaml ? 'action.editYaml' : 'action.viewYaml'),
966
978
  icon: 'icon icon-file',
967
- enabled: this.canYaml,
979
+ enabled: this.canYaml && (this.canEditYaml || !showConfigEnabled), // Hide "View YAML" when "Show Configuration" is available since it already includes YAML viewing
968
980
  },
969
981
  {
970
982
  action: (this.canCustomEdit ? 'goToClone' : 'cloneYaml'),
@@ -2070,7 +2082,7 @@ export default class Resource {
2070
2082
 
2071
2083
  if ( r.selector ) {
2072
2084
  // A selector is a stringified version of a matchLabel (https://github.com/kubernetes/apimachinery/blob/master/pkg/labels/selector.go#L1010)
2073
- addObjects(out.selectors, {
2085
+ addObject(out.selectors, {
2074
2086
  type: r.toType,
2075
2087
  namespace: r.toNamespace,
2076
2088
  selector: r.selector
@@ -2080,7 +2092,7 @@ export default class Resource {
2080
2092
  let namespace = r[`${ direction }Namespace`];
2081
2093
  let name = r[`${ direction }Id`];
2082
2094
 
2083
- if ( !namespace && name.includes('/') ) {
2095
+ if ( !namespace && name?.includes('/') ) {
2084
2096
  const idx = name.indexOf('/');
2085
2097
 
2086
2098
  namespace = name.substr(0, idx);
@@ -2242,12 +2254,58 @@ export default class Resource {
2242
2254
  };
2243
2255
  }
2244
2256
 
2257
+ get _resourcesCardRows() {
2258
+ const rows = [];
2259
+ const relationships = this.metadata?.relationships || [];
2260
+
2261
+ const referredToByRels = relationships.filter((r) => r.fromType && r.fromId && !r.selector);
2262
+ const refersToRels = relationships.filter((r) => r.toType && r.toId && !r.selector && !r.fromType);
2263
+
2264
+ if (referredToByRels.length) {
2265
+ rows.push(useResourceCardRowFromRelationships(
2266
+ this.t('component.resource.detail.card.resourcesCard.rows.referredToBy'),
2267
+ referredToByRels,
2268
+ { hash: '#related' }
2269
+ ));
2270
+ }
2271
+
2272
+ if (refersToRels.length) {
2273
+ rows.push(useResourceCardRowFromRelationships(
2274
+ this.t('component.resource.detail.card.resourcesCard.rows.refersTo'),
2275
+ refersToRels,
2276
+ { hash: '#related' }
2277
+ ));
2278
+ }
2279
+
2280
+ return rows;
2281
+ }
2282
+
2283
+ get resourcesCardRows() {
2284
+ return this._resourcesCardRows;
2285
+ }
2286
+
2287
+ get resourcesCard() {
2288
+ const rows = this.resourcesCardRows;
2289
+
2290
+ if (!rows.length) {
2291
+ return null;
2292
+ }
2293
+
2294
+ return {
2295
+ component: markRaw(defineAsyncComponent(() => import('@shell/components/Resource/Detail/Card/StateCard/index.vue'))),
2296
+ props: {
2297
+ title: this.t('component.resource.detail.card.resourcesCard.title'),
2298
+ rows
2299
+ }
2300
+ };
2301
+ }
2302
+
2245
2303
  get _cards() {
2246
2304
  // All cards are opt in, we're leaving the insights card as part of the base resource since it should proliferate to most resources
2247
2305
  return [];
2248
2306
  }
2249
2307
 
2250
2308
  get cards() {
2251
- return this._cards;
2309
+ return [this.resourcesCard, ...this._cards].filter((c) => c);
2252
2310
  }
2253
2311
  }