@rancher/shell 3.0.12-rc.1 → 3.0.12-rc.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (376) 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/images/providers/entraid-black.svg +4 -0
  54. package/assets/images/providers/entraid.svg +9 -0
  55. package/assets/images/vendor/entraid.svg +9 -0
  56. package/assets/styles/app.scss +0 -1
  57. package/assets/styles/base/_variables.scss +2 -0
  58. package/assets/styles/fonts/_fontstack.scss +132 -8
  59. package/assets/translations/en-us.yaml +41 -22
  60. package/assets/translations/zh-hans.yaml +4 -8
  61. package/chart/__tests__/S3.test.ts +10 -3
  62. package/chart/monitoring/index.vue +10 -1
  63. package/components/ActionDropdownShell.vue +2 -1
  64. package/components/CountBox.vue +20 -0
  65. package/components/CreateDriver.vue +0 -12
  66. package/components/CruResourceFooter.vue +9 -5
  67. package/components/DetailText.vue +12 -3
  68. package/components/ExplorerProjectsNamespaces.vue +1 -1
  69. package/components/InstallHelmCharts.vue +2 -2
  70. package/components/LandingPagePreference.vue +14 -5
  71. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +15 -1
  72. package/components/Resource/Detail/Metadata/index.vue +6 -0
  73. package/components/Resource/Detail/ResourcePopover/index.vue +12 -1
  74. package/components/Resource/Detail/SpacedRow.vue +3 -1
  75. package/components/Resource/Detail/TitleBar/index.vue +10 -11
  76. package/components/ResourceList/Masthead.vue +12 -8
  77. package/components/SelectIconGrid.vue +5 -10
  78. package/components/SingleClusterInfo.vue +1 -0
  79. package/components/SortableTable/__tests__/sorting.test.ts +126 -0
  80. package/components/SortableTable/index.vue +6 -9
  81. package/components/SortableTable/selection.js +23 -5
  82. package/components/SortableTable/sorting.js +6 -3
  83. package/components/Wizard.vue +14 -13
  84. package/components/__tests__/CountBox.test.ts +72 -0
  85. package/components/__tests__/DetailText.test.ts +113 -0
  86. package/components/fleet/FleetBundles.vue +100 -12
  87. package/components/fleet/FleetClusterTargets/index.vue +54 -15
  88. package/components/fleet/__tests__/FleetClusterTargets.test.ts +149 -115
  89. package/components/fleet/__tests__/FleetClusters.test.ts +12 -12
  90. package/components/form/InputWithSelect.vue +18 -10
  91. package/components/form/KeyValue.vue +17 -1
  92. package/components/form/LabeledSelect.vue +101 -26
  93. package/components/form/NameNsDescription.vue +11 -0
  94. package/components/form/Security.vue +6 -2
  95. package/components/form/Select.vue +73 -56
  96. package/components/form/ServiceNameSelect.vue +13 -11
  97. package/components/form/WorkloadPorts.vue +2 -7
  98. package/components/form/__tests__/KeyValue.test.ts +66 -0
  99. package/components/form/__tests__/NodeScheduling.test.ts +9 -0
  100. package/components/form/__tests__/Security.test.ts +76 -0
  101. package/components/form/labeled-select-utils/useLabeledSelectPagination.ts +138 -0
  102. package/components/formatter/Autoscaler.vue +4 -4
  103. package/components/formatter/ClusterKubeVersion.vue +27 -0
  104. package/components/formatter/ClusterLink.vue +1 -7
  105. package/components/formatter/ClusterProvider.vue +6 -10
  106. package/components/formatter/FleetSummaryGraph.vue +0 -3
  107. package/components/formatter/MachineSummaryGraph.vue +1 -1
  108. package/components/formatter/PodsUsage.vue +2 -2
  109. package/components/formatter/__tests__/Autoscaler.test.ts +19 -22
  110. package/components/formatter/__tests__/FleetSummaryGraph.test.ts +216 -0
  111. package/components/formatter/__tests__/PodsUsage.test.ts +6 -10
  112. package/components/nav/Group.vue +7 -6
  113. package/components/nav/Header.vue +24 -3
  114. package/components/nav/NamespaceFilter.vue +2 -2
  115. package/components/nav/NotificationCenter/Notification.vue +4 -1
  116. package/components/nav/NotificationCenter/NotificationHeader.vue +20 -8
  117. package/components/nav/NotificationCenter/__tests__/NotificationHeader.test.ts +80 -0
  118. package/components/nav/TopLevelMenu.helper.ts +15 -3
  119. package/components/nav/TopLevelMenu.vue +16 -5
  120. package/components/nav/Type.vue +8 -7
  121. package/components/nav/WindowManager/index.vue +2 -1
  122. package/components/nav/WorkspaceSwitcher.vue +13 -0
  123. package/components/nav/__tests__/Group.test.ts +67 -0
  124. package/components/nav/__tests__/Header.test.ts +235 -0
  125. package/components/nav/__tests__/TopLevelMenu.test.ts +145 -21
  126. package/components/nav/__tests__/Type.test.ts +20 -3
  127. package/components/templates/default.vue +34 -4
  128. package/components/templates/home.vue +30 -25
  129. package/components/templates/plain.vue +31 -26
  130. package/components/templates/standalone.vue +17 -0
  131. package/composables/useFormValidation.ts +93 -0
  132. package/composables/useLabeledFormElement.ts +10 -2
  133. package/composables/useLabeledSelect.ts +60 -0
  134. package/composables/useUserRetentionValidation.ts +1 -49
  135. package/composables/useVeeValidateField.test.ts +159 -0
  136. package/composables/useVeeValidateField.ts +67 -0
  137. package/config/cookies.js +0 -1
  138. package/config/labels-annotations.js +1 -0
  139. package/config/pagination-table-headers.js +18 -1
  140. package/config/product/manager.js +82 -21
  141. package/config/query-params.js +1 -0
  142. package/config/router/routes.js +6 -8
  143. package/config/table-headers.js +20 -1
  144. package/config/types.js +2 -1
  145. package/core/__tests__/plugin-products.test.ts +1505 -30
  146. package/core/plugin-products-base.ts +137 -20
  147. package/core/plugin-products-helpers.ts +5 -4
  148. package/core/plugin-products.ts +4 -0
  149. package/core/plugin-types.ts +129 -4
  150. package/core/plugin.ts +15 -7
  151. package/core/productDebugger.js +9 -4
  152. package/core/types-provisioning.ts +43 -30
  153. package/core/types.ts +58 -19
  154. package/detail/__tests__/management.cattle.io.fleetworkspace.test.ts +128 -0
  155. package/detail/__tests__/pod.test.ts +41 -0
  156. package/detail/harvesterhci.io.management.cluster.vue +6 -2
  157. package/detail/management.cattle.io.fleetworkspace.vue +49 -0
  158. package/detail/pod.vue +1 -1
  159. package/detail/provisioning.cattle.io.cluster.vue +4 -10
  160. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +9 -0
  161. package/edit/__tests__/kontainerDriver.test.ts +0 -13
  162. package/edit/__tests__/nodeDriver.test.ts +5 -11
  163. package/edit/__tests__/resources.cattle.io.restore.test.ts +9 -0
  164. package/edit/auditlog.cattle.io.auditpolicy/__tests__/__snapshots__/General.test.ts.snap +6 -0
  165. package/edit/auth/__tests__/azuread.test.ts +217 -34
  166. package/edit/auth/__tests__/oidc.test.ts +54 -0
  167. package/edit/auth/azuread.vue +123 -15
  168. package/edit/auth/oidc.vue +10 -2
  169. package/edit/kontainerDriver.vue +1 -2
  170. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +13 -4
  171. package/edit/networking.k8s.io.ingress/RulePath.vue +8 -4
  172. package/edit/networking.k8s.io.ingress/index.vue +75 -20
  173. package/edit/nodeDriver.vue +0 -2
  174. package/edit/provisioning.cattle.io.cluster/AgentEnv.vue +1 -0
  175. package/edit/provisioning.cattle.io.cluster/__tests__/AgentEnv.test.ts +25 -0
  176. package/edit/provisioning.cattle.io.cluster/__tests__/MachinePool.test.ts +104 -0
  177. package/edit/provisioning.cattle.io.cluster/index.vue +81 -106
  178. package/edit/provisioning.cattle.io.cluster/rke2.vue +8 -4
  179. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +11 -0
  180. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +37 -4
  181. package/edit/provisioning.cattle.io.cluster/tabs/registries/__tests__/RegistryConfigs.test.ts +132 -7
  182. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +2 -1
  183. package/edit/secret/__tests__/ssh.test.ts +5 -6
  184. package/edit/secret/basic.vue +31 -0
  185. package/edit/secret/index.vue +68 -17
  186. package/edit/secret/registry.vue +38 -0
  187. package/edit/secret/ssh.vue +29 -0
  188. package/edit/secret/tls.vue +30 -0
  189. package/edit/service.vue +4 -4
  190. package/edit/workload/Upgrading.vue +3 -3
  191. package/edit/workload/__tests__/Upgrading.test.ts +6 -9
  192. package/edit/workload/mixins/workload.js +2 -1
  193. package/initialize/App.vue +29 -2
  194. package/initialize/install-plugins.js +0 -2
  195. package/list/__tests__/management.cattle.io.feature.test.ts +105 -0
  196. package/list/catalog.cattle.io.app.vue +25 -5
  197. package/list/fleet.cattle.io.bundle.vue +7 -104
  198. package/list/fleet.cattle.io.clusterregistrationtoken.vue +20 -0
  199. package/list/management.cattle.io.feature.vue +1 -1
  200. package/list/management.cattle.io.fleetworkspace.vue +8 -0
  201. package/list/provisioning.cattle.io.cluster.vue +262 -180
  202. package/list/utils/management.cattle.io.cluster.utils.ts +128 -0
  203. package/machine-config/amazonec2.vue +1 -0
  204. package/mixins/__tests__/chart.test.ts +112 -0
  205. package/mixins/brand.js +2 -1
  206. package/mixins/chart.js +50 -15
  207. package/mixins/resource-fetch-api-pagination.js +41 -5
  208. package/models/__tests__/catalog.cattle.io.app.test.ts +15 -1
  209. package/models/__tests__/catalog.cattle.io.clusterrepo.test.ts +84 -0
  210. package/models/__tests__/chart.test.ts +99 -6
  211. package/models/__tests__/ext.cattle.io.kubeconfig.test.ts +67 -67
  212. package/models/__tests__/management.cattle.io.cluster.test.ts +1 -1
  213. package/models/__tests__/management.cattle.io.feature.test.ts +131 -0
  214. package/models/__tests__/management.cattle.io.node.ts +6 -5
  215. package/models/__tests__/management.cattle.io.nodepool.ts +5 -4
  216. package/models/__tests__/monitoring.coreos.com.alertmanagerconfig.test.ts +98 -0
  217. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +32 -11
  218. package/models/base-cluster.x-k8s.io.js +26 -0
  219. package/models/catalog.cattle.io.app.js +21 -17
  220. package/models/catalog.cattle.io.clusterrepo.js +39 -11
  221. package/models/chart.js +33 -19
  222. package/models/cluster.js +1 -1
  223. package/models/cluster.x-k8s.io.machine.js +4 -22
  224. package/models/cluster.x-k8s.io.machinedeployment.js +2 -20
  225. package/models/cluster.x-k8s.io.machineset.js +2 -20
  226. package/models/compliance.cattle.io.clusterscan.js +130 -2
  227. package/models/ext.cattle.io.kubeconfig.ts +4 -7
  228. package/models/fleet-application.js +4 -2
  229. package/models/fleet.cattle.io.bundle.js +1 -1
  230. package/models/kontainerdriver.js +11 -0
  231. package/models/management.cattle.io.authconfig.js +5 -1
  232. package/models/management.cattle.io.cluster.js +402 -78
  233. package/models/management.cattle.io.feature.js +3 -3
  234. package/models/management.cattle.io.kontainerdriver.js +1 -26
  235. package/models/management.cattle.io.node.js +6 -4
  236. package/models/management.cattle.io.nodepool.js +1 -1
  237. package/models/monitoring.coreos.com.alertmanagerconfig.js +31 -17
  238. package/models/networking.k8s.io.ingress.js +12 -4
  239. package/models/nodedriver.js +7 -0
  240. package/models/provisioning.cattle.io.cluster.js +47 -330
  241. package/models/rke.cattle.io.etcdsnapshot.js +1 -2
  242. package/package.json +20 -37
  243. package/pages/__tests__/readme.test.ts +49 -0
  244. package/pages/auth/setup.vue +2 -3
  245. package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +265 -0
  246. package/pages/c/_cluster/apps/charts/__tests__/index.test.ts +55 -0
  247. package/pages/c/_cluster/apps/charts/__tests__/install.test.ts +53 -0
  248. package/pages/c/_cluster/apps/charts/chart.vue +275 -39
  249. package/pages/c/_cluster/apps/charts/index.vue +2 -2
  250. package/pages/c/_cluster/apps/charts/install.vue +18 -10
  251. package/pages/c/_cluster/auth/user.retention/index.vue +55 -22
  252. package/pages/c/_cluster/explorer/__tests__/index.test.ts +23 -25
  253. package/pages/c/_cluster/explorer/index.vue +5 -49
  254. package/pages/c/_cluster/istio/__tests__/istio.index.test.ts +194 -0
  255. package/pages/c/_cluster/istio/index.vue +21 -6
  256. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +5 -7
  257. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +40 -2
  258. package/pages/c/_cluster/uiplugins/__tests__/PluginInfoPanel.test.ts +61 -0
  259. package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +735 -13
  260. package/pages/c/_cluster/uiplugins/index.vue +226 -222
  261. package/pages/diagnostic.vue +13 -17
  262. package/pages/fail-whale.vue +18 -0
  263. package/pages/home.vue +77 -260
  264. package/pages/readme.vue +88 -0
  265. package/plugins/dashboard-store/__tests__/resource-class.test.ts +88 -0
  266. package/plugins/dashboard-store/actions.js +40 -18
  267. package/plugins/dashboard-store/resource-class.js +5 -2
  268. package/plugins/steve/__tests__/subscribe.spec.ts +6 -3
  269. package/plugins/steve/steve-pagination-utils.ts +11 -3
  270. package/plugins/steve/subscribe.js +35 -5
  271. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +211 -1
  272. package/rancher-components/Form/LabeledInput/LabeledInput.vue +37 -4
  273. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +1 -1
  274. package/rancher-components/RcButton/RcButton.test.ts +37 -1
  275. package/rancher-components/RcButton/RcButton.vue +38 -8
  276. package/rancher-components/RcDropdown/RcDropdownTrigger.vue +10 -8
  277. package/scripts/test-plugins-build.sh +5 -2
  278. package/server/server-middleware.js +2 -2
  279. package/static/humans.txt +1 -0
  280. package/static/robots.txt +34 -0
  281. package/static/welcome-cow.svg +18 -0
  282. package/store/__tests__/catalog.test.ts +276 -12
  283. package/store/__tests__/type-map.test.ts +556 -1
  284. package/store/action-menu.js +8 -3
  285. package/store/auth.js +1 -4
  286. package/store/aws.js +27 -16
  287. package/store/catalog.js +87 -11
  288. package/store/digitalocean.js +20 -38
  289. package/store/index.js +2 -0
  290. package/store/linode.js +25 -40
  291. package/store/pnap.js +1 -0
  292. package/store/type-map.js +111 -29
  293. package/tsconfig.paths.json +8 -8
  294. package/types/kube/kube-api.ts +14 -1
  295. package/types/rancher/steve.api.ts +12 -12
  296. package/types/resources/settings.d.ts +2 -1
  297. package/types/shell/index.d.ts +128 -24
  298. package/types/store/dashboard-store.types.ts +108 -11
  299. package/types/store/pagination.types.ts +6 -3
  300. package/utils/__tests__/alertmanagerconfig.test.ts +117 -0
  301. package/utils/__tests__/async.test.ts +87 -0
  302. package/utils/__tests__/aws.test.ts +140 -0
  303. package/utils/__tests__/banners.test.ts +176 -0
  304. package/utils/__tests__/chart.test.ts +64 -1
  305. package/utils/__tests__/color.test.ts +226 -0
  306. package/utils/__tests__/duration.test.ts +140 -0
  307. package/utils/__tests__/fleet.test.ts +340 -0
  308. package/utils/__tests__/git.test.ts +270 -0
  309. package/utils/__tests__/inactivity.test.ts +316 -0
  310. package/utils/__tests__/ingress.test.ts +553 -0
  311. package/utils/__tests__/kube.test.ts +68 -0
  312. package/utils/__tests__/namespace-filter.test.ts +109 -0
  313. package/utils/__tests__/object.test.ts +77 -0
  314. package/utils/__tests__/pagination-utils.test.ts +361 -0
  315. package/utils/__tests__/parse-externalid.test.ts +137 -0
  316. package/utils/__tests__/perf-setting.utils.test.ts +98 -0
  317. package/utils/__tests__/poller-sequential.test.ts +177 -0
  318. package/utils/__tests__/poller.test.ts +170 -0
  319. package/utils/__tests__/promise.test.ts +346 -0
  320. package/utils/__tests__/settings.test.ts +140 -0
  321. package/utils/__tests__/sort-utils.test.ts +301 -0
  322. package/utils/__tests__/string-utils.test.ts +798 -0
  323. package/utils/__tests__/string.test.ts +23 -1
  324. package/utils/__tests__/style.test.ts +154 -0
  325. package/utils/__tests__/svg-filter.test.ts +184 -0
  326. package/utils/__tests__/time.test.ts +14 -1
  327. package/utils/__tests__/units.test.ts +417 -0
  328. package/utils/__tests__/url.test.ts +246 -0
  329. package/utils/__tests__/versions.test.ts +128 -0
  330. package/utils/__tests__/xccdf.test.ts +391 -0
  331. package/utils/chart.js +36 -0
  332. package/utils/fleet.ts +13 -3
  333. package/utils/gatekeeper/__tests__/util.test.ts +174 -0
  334. package/utils/gc/__tests__/gc-interval.test.ts +119 -0
  335. package/utils/gc/__tests__/gc-root-store.test.ts +225 -0
  336. package/utils/gc/__tests__/gc-route-changed.test.ts +96 -0
  337. package/utils/gc/__tests__/gc.test.ts +487 -0
  338. package/utils/ingress.ts +9 -1
  339. package/utils/object.js +33 -2
  340. package/utils/pagination-utils.ts +2 -1
  341. package/utils/string.js +25 -2
  342. package/utils/time.ts +5 -0
  343. package/utils/uiplugins.ts +5 -5
  344. package/utils/validators/__tests__/cluster-name.test.ts +110 -0
  345. package/utils/validators/__tests__/cron-schedule.test.ts +79 -0
  346. package/utils/validators/__tests__/index.test.ts +481 -0
  347. package/utils/validators/__tests__/kubernetes-name.test.ts +163 -0
  348. package/utils/validators/__tests__/misc-validators.test.ts +246 -0
  349. package/utils/validators/__tests__/pod-affinity.test.ts +382 -0
  350. package/utils/validators/__tests__/prometheusrule.test.ts +211 -0
  351. package/utils/validators/__tests__/role-template.test.ts +149 -0
  352. package/utils/validators/__tests__/service.test.ts +283 -0
  353. package/utils/validators/__tests__/setting.test.js +32 -0
  354. package/utils/validators/formRules/__tests__/index.test.ts +50 -0
  355. package/utils/validators/formRules/index.ts +5 -5
  356. package/utils/validators/machine-pool.ts +1 -1
  357. package/utils/validators/setting.js +18 -3
  358. package/utils/xccdf.ts +418 -0
  359. package/vue.config.js +0 -9
  360. package/assets/fonts/lato/lato-v17-latin-700.woff +0 -0
  361. package/assets/fonts/lato/lato-v17-latin-700.woff2 +0 -0
  362. package/assets/fonts/lato/lato-v17-latin-regular.woff +0 -0
  363. package/assets/fonts/lato/lato-v17-latin-regular.woff2 +0 -0
  364. package/assets/images/providers/azuread-black.svg +0 -22
  365. package/assets/images/providers/azuread.svg +0 -25
  366. package/assets/images/vendor/azuread.svg +0 -18
  367. package/assets/styles/fonts/_dots.scss +0 -18
  368. package/components/EmberPage.vue +0 -622
  369. package/components/EmberPageView.vue +0 -39
  370. package/components/form/labeled-select-utils/labeled-select-pagination.ts +0 -116
  371. package/mixins/labeled-form-element.ts +0 -225
  372. package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -28
  373. package/pages/c/_cluster/manager/pages/_page.vue +0 -22
  374. package/pages/c/_cluster/mcapps/pages/_page.vue +0 -22
  375. package/plugins/ember-cookie.js +0 -17
  376. package/utils/ember-page.js +0 -30
package/pages/home.vue CHANGED
@@ -12,7 +12,7 @@ import DynamicContentPanel from '@shell/components/DynamicContent/DynamicContent
12
12
  import { mapGetters, mapState } from 'vuex';
13
13
  import { MANAGEMENT, CAPI, COUNT, SAVED_COUNTS } from '@shell/config/types';
14
14
  import { NAME as MANAGER } from '@shell/config/product/manager';
15
- import { AGE, STATE } from '@shell/config/table-headers';
15
+ import { AGE, MGMT_CLUSTER_KUBE_VERSION, MGMT_CLUSTER_PROVIDER, STATE } from '@shell/config/table-headers';
16
16
  import { MODE, _IMPORT } from '@shell/config/query-params';
17
17
  import { createMemoryFormat, formatSi, parseSi, createMemoryValues } from '@shell/utils/units';
18
18
  import { markSeenReleaseNotes } from '@shell/utils/version';
@@ -20,22 +20,21 @@ import PageHeaderActions from '@shell/mixins/page-actions';
20
20
  import { getVendor } from '@shell/config/private-label';
21
21
  import { mapFeature, MULTI_CLUSTER } from '@shell/store/features';
22
22
  import { BLANK_CLUSTER } from '@shell/store/store-types.js';
23
- import { filterHiddenLocalCluster, filterOnlyKubernetesClusters, paginationFilterClusters } from '@shell/utils/cluster';
23
+ import { paginationFilterClusters } from '@shell/utils/cluster';
24
24
  import TabTitle from '@shell/components/TabTitle.vue';
25
25
  import { ActionFindPageArgs } from '@shell/types/store/dashboard-store.types';
26
26
 
27
27
  import { SET_LOGIN_ACTION, SHOW_HIDE_BANNER_ACTION } from '@shell/config/page-actions';
28
- import { STEVE_NAME_COL, STEVE_STATE_COL } from '@shell/config/pagination-table-headers';
28
+ import { STEVE_MGMT_CLUSTER_KUBE_VERSION, STEVE_MGMT_CLUSTER_PROVIDER, STEVE_NAME_COL, STEVE_STATE_COL } from '@shell/config/pagination-table-headers';
29
29
  import { PaginationParamFilter, FilterArgs, PaginationFilterField, PaginationArgs } from '@shell/types/store/pagination.types';
30
- import ProvCluster from '@shell/models/provisioning.cattle.io.cluster';
31
- import { sameContents } from '@shell/utils/array';
32
30
  import { PagTableFetchPageSecondaryResourcesOpts, PagTableFetchSecondaryResourcesOpts, PagTableFetchSecondaryResourcesReturns } from '@shell/types/components/paginatedResourceTable';
33
31
  import { CURRENT_RANCHER_VERSION, getVersionData } from '@shell/config/version';
34
- import { CAPI as CAPI_LAB_AND_ANO } from '@shell/config/labels-annotations';
35
32
  import paginationUtils from '@shell/utils/pagination-utils';
36
33
  import ResourceTable from '@shell/components/ResourceTable.vue';
37
34
  import Preset from '@shell/mixins/preset';
38
35
  import { PaginationFeatureHomePageClusterConfig } from '@shell/types/resources/settings';
36
+ import MgmtCluster from '@shell/models/management.cattle.io.cluster';
37
+ import ManagementClusterUtils from '@shell/list/utils/management.cattle.io.cluster.utils';
39
38
 
40
39
  export default defineComponent({
41
40
  name: 'Home',
@@ -71,6 +70,30 @@ export default defineComponent({
71
70
  query: { [MODE]: _IMPORT }
72
71
  };
73
72
 
73
+ const cpuHeader = {
74
+ label: this.t('tableHeaders.cpu'),
75
+ value: '',
76
+ name: 'cpu',
77
+ sort: ['status.allocatable.cpuRaw'],
78
+ search: ['status.allocatable.cpuRaw'],
79
+ };
80
+ const memoryHeader = {
81
+ label: this.t('tableHeaders.memory'),
82
+ value: '',
83
+ name: 'memory',
84
+ sort: ['status.allocatable.memoryRaw'],
85
+ search: ['status.allocatable.memoryRaw'],
86
+ };
87
+ const podsHeader = {
88
+ label: this.t('tableHeaders.pods'),
89
+ name: 'pods',
90
+ value: '',
91
+ sort: ['status.allocatable.pods', 'status.requested.pods'],
92
+ search: ['status.allocatable.pods', 'status.requested.pods'],
93
+ formatter: 'PodsUsage',
94
+ delayLoading: true
95
+ };
96
+
74
97
  return {
75
98
  HIDE_HOME_PAGE_CARDS,
76
99
  // Page actions don't change on the Home Page
@@ -88,12 +111,9 @@ export default defineComponent({
88
111
  vendor: getVendor(),
89
112
 
90
113
  provClusterSchema: this.$store.getters['management/schemaFor'](CAPI.RANCHER_CLUSTER),
114
+ mgmtClusterSchema: this.$store.getters['management/schemaFor'](MANAGEMENT.CLUSTER),
91
115
 
92
- canViewMgmtClusters: !!this.$store.getters['management/schemaFor'](MANAGEMENT.CLUSTER),
93
- canViewMachine: !!this.$store.getters['management/canList'](CAPI.MACHINE),
94
- canViewMgmtNodes: !!this.$store.getters['management/canList'](MANAGEMENT.NODE),
95
- canViewMgmtPools: !!this.$store.getters['management/canList'](MANAGEMENT.NODE_POOL),
96
- canViewMgmtTemplates: !!this.$store.getters['management/canList'](MANAGEMENT.NODE_TEMPLATE),
116
+ canViewMgmtClusters: !!this.$store.getters['management/schemaFor'](MANAGEMENT.CLUSTER),
97
117
 
98
118
  manageLocation: {
99
119
  name: 'c-cluster-product-resource',
@@ -116,41 +136,20 @@ export default defineComponent({
116
136
  value: 'nameDisplay',
117
137
  sort: ['nameSort'],
118
138
  canBeVariable: true,
119
- getValue: (row: ProvCluster) => row.mgmt?.nameDisplay
120
139
  },
121
140
  {
122
- label: this.t('landing.clusters.provider'),
123
- subLabel: this.t('landing.clusters.distro'),
124
- value: 'mgmt.status.provider',
125
- name: 'Provider',
126
- sort: ['mgmt.status.provider'],
127
- formatter: 'ClusterProvider'
141
+ ...MGMT_CLUSTER_PROVIDER,
142
+ labelKey: 'landing.clusters.provider',
143
+ subLabel: this.t('landing.clusters.distro'),
128
144
  },
129
145
  {
130
- label: this.t('landing.clusters.kubernetesVersion'),
146
+ ...MGMT_CLUSTER_KUBE_VERSION,
147
+ labelKey: 'landing.clusters.kubernetesVersion',
131
148
  subLabel: this.t('landing.clusters.architecture'),
132
- name: 'kubernetesVersion',
133
- },
134
- {
135
- label: this.t('tableHeaders.cpu'),
136
- value: '',
137
- name: 'cpu',
138
- sort: ['status.allocatable.cpu', 'status.available.cpu']
139
- },
140
- {
141
- label: this.t('tableHeaders.memory'),
142
- value: '',
143
- name: 'memory',
144
- sort: ['status.allocatable.memory', 'status.available.memory']
145
- },
146
- {
147
- label: this.t('tableHeaders.pods'),
148
- name: 'pods',
149
- value: '',
150
- sort: ['status.allocatable.pods', 'status.requested.pods'],
151
- formatter: 'PodsUsage',
152
- delayLoading: true
153
149
  },
150
+ cpuHeader,
151
+ memoryHeader,
152
+ podsHeader,
154
153
  // {
155
154
  // name: 'explorer',
156
155
  // label: this.t('landing.clusters.explorer')
@@ -162,50 +161,25 @@ export default defineComponent({
162
161
  {
163
162
  ...STEVE_NAME_COL,
164
163
  canBeVariable: true,
165
- value: `metadata.annotations[${ CAPI_LAB_AND_ANO.HUMAN_NAME }]`,
166
- sort: [`metadata.annotations[${ CAPI_LAB_AND_ANO.HUMAN_NAME }]`],
167
- search: `metadata.annotations[${ CAPI_LAB_AND_ANO.HUMAN_NAME }]`,
164
+ value: `spec.displayName`,
165
+ sort: [`spec.displayName`],
166
+ search: `spec.displayName`,
168
167
  },
169
168
  {
170
- label: this.t('landing.clusters.provider'),
171
- subLabel: this.t('landing.clusters.distro'),
172
- value: 'mgmt.status.provider',
173
- name: 'Provider',
174
- sort: false,
175
- search: false,
176
- formatter: 'ClusterProvider'
169
+ ...STEVE_MGMT_CLUSTER_PROVIDER,
170
+ labelKey: 'landing.clusters.provider',
171
+ subLabel: this.t('landing.clusters.distro'),
177
172
  },
178
173
  {
179
- label: this.t('landing.clusters.kubernetesVersion'),
174
+ ...STEVE_MGMT_CLUSTER_KUBE_VERSION,
175
+ labelKey: 'landing.clusters.kubernetesVersion',
180
176
  subLabel: this.t('landing.clusters.architecture'),
181
- name: 'kubernetesVersion',
182
- sort: false,
183
- search: false,
184
- },
185
- {
186
- label: this.t('tableHeaders.cpu'),
187
- value: '',
188
- name: 'cpu',
189
- sort: false,
190
- search: false,
191
- },
192
- {
193
- label: this.t('tableHeaders.memory'),
194
- value: '',
195
- name: 'memory',
196
- sort: false,
197
- search: false,
198
- },
199
- {
200
- label: this.t('tableHeaders.pods'),
201
- name: 'pods',
202
- value: '',
203
- sort: false,
204
- search: false,
205
- formatter: 'PodsUsage',
206
- delayLoading: true
207
177
  },
178
+ cpuHeader,
179
+ memoryHeader,
180
+ podsHeader,
208
181
  ],
182
+ paginationContext: 'home',
209
183
 
210
184
  clusterCount: 0,
211
185
 
@@ -293,134 +267,27 @@ export default defineComponent({
293
267
 
294
268
  // Forget the types when we leave the page
295
269
  beforeUnmount() {
296
- this.$store.dispatch('management/forgetType', CAPI.MACHINE);
297
- this.$store.dispatch('management/forgetType', MANAGEMENT.NODE);
298
- this.$store.dispatch('management/forgetType', MANAGEMENT.NODE_POOL);
299
- this.$store.dispatch('management/forgetType', MANAGEMENT.NODE_TEMPLATE);
270
+ ManagementClusterUtils.forgetSecondaryResources({ context: this.paginationContext }, { $store: this.$store });
300
271
  },
301
272
 
302
273
  methods: {
303
274
  /**
304
- * Of type PagTableFetchSecondaryResources
275
+ * Of type #PagTableFetchSecondaryResources
305
276
  */
306
277
  fetchSecondaryResources(opts: PagTableFetchSecondaryResourcesOpts): PagTableFetchSecondaryResourcesReturns {
307
- if (opts.canPaginate) {
308
- return Promise.resolve({});
309
- }
310
-
311
- const promises = [];
312
-
313
- if ( this.canViewMgmtClusters ) {
314
- // This is the only one we need to block on (needed for the initial sort on mgmt name)
315
- promises.push(this.$store.dispatch('management/findAll', { type: MANAGEMENT.CLUSTER }));
316
- }
317
-
318
- if ( this.canViewMachine ) {
319
- this.$store.dispatch('management/findAll', { type: CAPI.MACHINE });
320
- }
321
-
322
- if ( this.canViewMgmtNodes ) {
323
- this.$store.dispatch('management/findAll', { type: MANAGEMENT.NODE });
324
- }
325
-
326
- // We need to fetch node pools and node templates in order to correctly show the provider for RKE1 clusters
327
- if ( this.canViewMgmtPools ) {
328
- this.$store.dispatch('management/findAll', { type: MANAGEMENT.NODE_POOL });
329
- }
330
-
331
- if ( this.canViewMgmtTemplates ) {
332
- this.$store.dispatch('management/findAll', { type: MANAGEMENT.NODE_TEMPLATE });
333
- }
334
-
335
- return Promise.all(promises);
278
+ return Promise.all(ManagementClusterUtils.fetchSecondaryResources(opts, { $store: this.$store }));
336
279
  },
337
280
 
338
281
  async fetchPageSecondaryResources({
339
282
  canPaginate, force, page, pagResult
340
283
  }: PagTableFetchPageSecondaryResourcesOpts) {
341
- if (!canPaginate || !page?.length) {
342
- this.clusterCount = 0;
343
-
344
- return;
345
- }
284
+ this.clusterCount = !canPaginate || !page?.length ? 0 : pagResult.count;
346
285
 
347
- this.clusterCount = pagResult.count;
286
+ const promises = await ManagementClusterUtils.fetchPageSecondaryResources({
287
+ canPaginate, force, page, pagResult
288
+ }, { $store: this.$store });
348
289
 
349
- if ( this.canViewMgmtClusters ) {
350
- const opt: ActionFindPageArgs = {
351
- force,
352
- pagination: new FilterArgs({
353
- filters: PaginationParamFilter.createMultipleFields(page.map((r: any) => new PaginationFilterField({
354
- field: 'id',
355
- value: r.mgmtClusterId
356
- }))),
357
- })
358
- };
359
-
360
- this.$store.dispatch(`management/findPage`, { type: MANAGEMENT.CLUSTER, opt });
361
- }
362
-
363
- if ( this.canViewMachine ) {
364
- const opt: ActionFindPageArgs = {
365
- force,
366
- pagination: new FilterArgs({
367
- filters: PaginationParamFilter.createMultipleFields(page.map((r: any) => new PaginationFilterField({
368
- field: 'spec.clusterName',
369
- value: r.metadata.name
370
- }))),
371
- })
372
- };
373
-
374
- await this.$store.dispatch(`management/findPage`, { type: CAPI.MACHINE, opt });
375
- }
376
-
377
- if ( this.canViewMgmtNodes ) {
378
- const opt: ActionFindPageArgs = {
379
- force,
380
- pagination: new FilterArgs({
381
- filters: PaginationParamFilter.createMultipleFields(page.map((r: any) => new PaginationFilterField({
382
- field: 'id',
383
- value: r.mgmtClusterId,
384
- exact: false,
385
- }))),
386
- })
387
- };
388
-
389
- this.$store.dispatch(`management/findPage`, { type: MANAGEMENT.NODE, opt });
390
- }
391
-
392
- // We need to fetch node pools and node templates in order to correctly show the provider for RKE1 clusters
393
- if ( this.canViewMgmtPools && this.canViewMgmtTemplates ) {
394
- const nodePoolFilters = PaginationParamFilter.createMultipleFields(page
395
- .filter((p: any) => p.status?.clusterName)
396
- .map((r: any) => new PaginationFilterField({
397
- field: 'spec.clusterName',
398
- value: r.status?.clusterName
399
- })));
400
- const nodePools = await this.$store.dispatch(`management/findPage`, {
401
- type: MANAGEMENT.NODE_POOL,
402
- opt: {
403
- force,
404
- pagination: new FilterArgs({ filters: nodePoolFilters })
405
- }
406
- });
407
-
408
- const templateOpt = PaginationParamFilter.createMultipleFields(nodePools
409
- .filter((np: any) => !!np.nodeTemplateId)
410
- .map((np: any) => new PaginationFilterField({
411
- field: 'id',
412
- value: np.nodeTemplateId,
413
- exact: true,
414
- })));
415
-
416
- this.$store.dispatch(`management/findPage`, {
417
- type: MANAGEMENT.NODE_TEMPLATE,
418
- opt: {
419
- force,
420
- pagination: new FilterArgs({ filters: templateOpt })
421
- }
422
- });
423
- }
290
+ await Promise.all(promises);
424
291
  },
425
292
 
426
293
  /**
@@ -482,47 +349,12 @@ export default defineComponent({
482
349
  await this.$store.dispatch('prefs/set', { key: HIDE_HOME_PAGE_CARDS, value });
483
350
  },
484
351
 
485
- /**
486
- * Filter out hidden clusters from list of all clusters
487
- */
488
- filterRowsLocal(rows: any[]) {
489
- return filterHiddenLocalCluster(filterOnlyKubernetesClusters(rows || [], this.$store), this.$store);
352
+ filterRowsLocal(rows: MgmtCluster[]) {
353
+ return ManagementClusterUtils.filterRowsLocal(rows, { $store: this.$store });
490
354
  },
491
355
 
492
- /**
493
- * Filter out hidden clusters via api
494
- */
495
356
  filterRowsApi(pagination: PaginationArgs): PaginationArgs {
496
- if (!pagination.filters) {
497
- pagination.filters = [];
498
- }
499
-
500
- const existingFilters = pagination.filters;
501
- const requiredFilters = paginationFilterClusters(this.$store, false);
502
-
503
- for (let i = 0; i < requiredFilters.length; i++) {
504
- let found = false;
505
- const required = requiredFilters[i];
506
-
507
- for (let j = 0; j < existingFilters.length; j++) {
508
- const existing = existingFilters[j];
509
-
510
- if (
511
- required.fields.length === existing.fields.length &&
512
- sameContents(required.fields.map((e) => e.field), existing.fields.map((e) => e.field))
513
- ) {
514
- Object.assign(existing, required);
515
- found = true;
516
- break;
517
- }
518
- }
519
-
520
- if (!found) {
521
- pagination.filters.push(required);
522
- }
523
- }
524
-
525
- return pagination;
357
+ return ManagementClusterUtils.filterRowsApi(pagination, { $store: this.$store });
526
358
  },
527
359
 
528
360
  async toggleAltClusterListDisabled(disabled: boolean) {
@@ -787,23 +619,25 @@ export default defineComponent({
787
619
  class="col span-12"
788
620
  >
789
621
  <PaginatedResourceTable
790
- v-if="provClusterSchema"
791
- :schema="provClusterSchema"
622
+ v-if="mgmtClusterSchema"
623
+ :schema="mgmtClusterSchema"
624
+ overrideInStore="management"
792
625
  :table-actions="false"
793
626
  :row-actions="false"
794
627
  key-field="id"
795
628
  :headers="headers"
796
629
  :pagination-headers="paginationHeaders"
797
- context="home"
630
+ :context="paginationContext"
798
631
 
799
632
  :local-filter="filterRowsLocal"
800
633
  :api-filter="filterRowsApi"
801
634
 
635
+ :fetch-secondary-resources="fetchSecondaryResources"
636
+ :fetch-page-secondary-resources="fetchPageSecondaryResources"
637
+
802
638
  :namespaced="false"
803
639
  :groupable="false"
804
640
  manualRefreshButtonSize="sm"
805
- :fetchSecondaryResources="fetchSecondaryResources"
806
- :fetchPageSecondaryResources="fetchPageSecondaryResources"
807
641
  >
808
642
  <template #header-left>
809
643
  <div class="row table-heading">
@@ -870,12 +704,13 @@ export default defineComponent({
870
704
  <td class="col-name">
871
705
  <div class="list-cluster-name">
872
706
  <p
873
- v-if="row.mgmt"
707
+ v-if="row"
874
708
  class="cluster-name"
875
709
  >
710
+ <!-- Align side nav cluster, home page name link and cluster management cluster explor buttons on canExplore -->
876
711
  <router-link
877
- v-if="row.mgmt.isReady && !row.hasError"
878
- :to="{ name: 'c-cluster-explorer', params: { cluster: row.mgmt.id }}"
712
+ v-if="row.canExplore"
713
+ :to="{ name: 'c-cluster-explorer', params: { cluster: row.id }}"
879
714
  role="link"
880
715
  :aria-label="row.nameDisplay"
881
716
  >
@@ -887,11 +722,6 @@ export default defineComponent({
887
722
  v-clean-tooltip="row.unavailableMachines"
888
723
  class="conditions-alert-icon icon-alert icon"
889
724
  />
890
- <i
891
- v-if="row.isRke1"
892
- v-clean-tooltip="t('cluster.rke1Unsupported')"
893
- class="rke1-unsupported-icon icon-warning icon"
894
- />
895
725
  </p>
896
726
  <p
897
727
  v-if="row.description"
@@ -902,30 +732,17 @@ export default defineComponent({
902
732
  </div>
903
733
  </td>
904
734
  </template>
905
- <template #col:kubernetesVersion="{row}">
906
- <td class="col-name">
907
- <span>
908
- {{ row.kubernetesVersion }}
909
- </span>
910
- <div
911
- v-clean-tooltip="{content: row.architecture.tooltip, placement: 'left'}"
912
- class="text-muted"
913
- >
914
- {{ row.architecture.label }}
915
- </div>
916
- </td>
917
- </template>
918
735
  <template #col:cpu="{row}">
919
- <td v-if="row.mgmt && cpuAllocatable(row.mgmt)">
920
- {{ `${cpuAllocatable(row.mgmt)} ${t('landing.clusters.cores', {count:cpuAllocatable(row.mgmt) })}` }}
736
+ <td v-if="cpuAllocatable(row)">
737
+ {{ `${cpuAllocatable(row)} ${t('landing.clusters.cores', {count:cpuAllocatable(row) })}` }}
921
738
  </td>
922
739
  <td v-else>
923
740
  &mdash;
924
741
  </td>
925
742
  </template>
926
743
  <template #col:memory="{row}">
927
- <td v-if="row.mgmt && memoryAllocatable(row.mgmt) && !memoryAllocatable(row.mgmt).match(/^0 [a-zA-z]/)">
928
- {{ memoryAllocatable(row.mgmt) }}
744
+ <td v-if="memoryAllocatable(row) && !memoryAllocatable(row).match(/^0 [a-zA-z]/)">
745
+ {{ memoryAllocatable(row) }}
929
746
  </td>
930
747
  <td v-else>
931
748
  &mdash;
@@ -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>
@@ -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;
@@ -497,4 +501,88 @@ describe('class: Resource', () => {
497
501
  expect(actions[1].variant).toBe('primary');
498
502
  });
499
503
  });
504
+
505
+ describe('getter: _availableActions', () => {
506
+ function createResource(links: Record<string, string>, overrides: Record<string, any> = {}) {
507
+ const resource = new Resource({
508
+ type: 'test-type',
509
+ links,
510
+ ...overrides,
511
+ }, {
512
+ getters: {
513
+ schemaFor: () => ({
514
+ linkFor: jest.fn(),
515
+ resourceMethods: [],
516
+ collectionMethods: [],
517
+ }),
518
+ },
519
+ dispatch: jest.fn(),
520
+ rootState: { $extension: { getPlugins: () => ({}) } },
521
+ rootGetters: {
522
+ 'i18n/t': (key: string) => key,
523
+ 'type-map/hasCustomEdit': () => false,
524
+ 'type-map/optionsFor': () => ({
525
+ isEditable: false, isRemovable: true, isCreatable: false
526
+ }),
527
+ 'prefs/get': () => false,
528
+ currentCluster: undefined,
529
+ currentProduct: undefined,
530
+ ...overrides.rootGetters,
531
+ },
532
+ });
533
+
534
+ jest.spyOn(resource, 'currentRouter').mockReturnValue({ currentRoute: { value: {} } } as any);
535
+
536
+ return resource;
537
+ }
538
+
539
+ function findAction(actions: any[], actionName: string) {
540
+ return actions.find((a: any) => a.action === actionName);
541
+ }
542
+
543
+ it('should hide "View YAML" when "Show Configuration" is enabled and resource cannot edit YAML', () => {
544
+ const resource = createResource({ view: '/api/v1/test' });
545
+
546
+ const actions = resource._availableActions;
547
+ const viewYaml = findAction(actions, 'goToViewYaml');
548
+ const showConfig = findAction(actions, 'showConfiguration');
549
+
550
+ expect(showConfig.enabled).toBe(true);
551
+ expect(viewYaml.enabled).toBe(false);
552
+ });
553
+
554
+ it('should show "Edit YAML" even when "Show Configuration" is enabled', () => {
555
+ const resource = createResource(
556
+ { view: '/api/v1/test', update: '/api/v1/test' },
557
+ {
558
+ rootGetters: {
559
+ 'type-map/optionsFor': () => ({
560
+ isEditable: true, isRemovable: true, isCreatable: false
561
+ })
562
+ }
563
+ },
564
+ );
565
+
566
+ const actions = resource._availableActions;
567
+ const editYaml = findAction(actions, 'goToEditYaml');
568
+ const showConfig = findAction(actions, 'showConfiguration');
569
+
570
+ expect(showConfig.enabled).toBe(true);
571
+ expect(editYaml.enabled).toBe(true);
572
+ });
573
+
574
+ it('should show "View YAML" when "Show Configuration" is not enabled', () => {
575
+ const resource = createResource(
576
+ { view: '/api/v1/test' },
577
+ { disableResourceDetailDrawer: true },
578
+ );
579
+
580
+ const actions = resource._availableActions;
581
+ const viewYaml = findAction(actions, 'goToViewYaml');
582
+ const showConfig = findAction(actions, 'showConfiguration');
583
+
584
+ expect(showConfig.enabled).toBe(false);
585
+ expect(viewYaml.enabled).toBe(true);
586
+ });
587
+ });
500
588
  });