@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
@@ -4,19 +4,23 @@ import ChartMixin from '@shell/mixins/chart';
4
4
  import { Banner } from '@components/Banner';
5
5
  import ChartReadme from '@shell/components/ChartReadme';
6
6
  import LazyImage from '@shell/components/LazyImage';
7
+ import LabeledSelect from '@shell/components/form/LabeledSelect';
7
8
  import isEqual from 'lodash/isEqual';
8
9
  import {
9
- CHART, REPO, REPO_TYPE, VERSION, SEARCH_QUERY, CATEGORY, TAG, DEPRECATED
10
+ CHART, REPO, REPO_TYPE, VERSION, SEARCH_QUERY, CATEGORY, TAG, DEPRECATED, NAMESPACE, NAME, NEW_APP_INSTANCE, _FLAGGED
10
11
  } from '@shell/config/query-params';
11
12
  import { DATE_FORMAT } from '@shell/store/prefs';
12
- import { ZERO_TIME } from '@shell/config/types';
13
+ import { isMissingDate } from '@shell/utils/time';
13
14
  import { escapeHtml } from '@shell/utils/string';
14
15
  import { mapGetters } from 'vuex';
15
- import { compatibleVersionsFor } from '@shell/store/catalog';
16
+ import { APP_UPGRADE_STATUS, compatibleVersionsFor } from '@shell/store/catalog';
17
+ import { compareChartVersions, getStandaloneReadmeUrl } from '@shell/utils/chart';
16
18
  import AppChartCardSubHeader from '@shell/pages/c/_cluster/apps/charts/AppChartCardSubHeader';
17
19
  import AppChartCardFooter from '@shell/pages/c/_cluster/apps/charts/AppChartCardFooter';
18
20
  import day from 'dayjs';
19
21
  import { RcButton } from '@components/RcButton';
22
+ import { RcButtonSplit } from '@components/RcButtonSplit';
23
+ import { RcDropdownItem } from '@components/RcDropdown';
20
24
 
21
25
  export default {
22
26
  components: {
@@ -24,9 +28,12 @@ export default {
24
28
  ChartReadme,
25
29
  LazyImage,
26
30
  Loading,
31
+ LabeledSelect,
27
32
  AppChartCardSubHeader,
28
33
  AppChartCardFooter,
29
- RcButton
34
+ RcButton,
35
+ RcButtonSplit,
36
+ RcDropdownItem
30
37
  },
31
38
 
32
39
  mixins: [
@@ -40,9 +47,9 @@ export default {
40
47
  data() {
41
48
  return {
42
49
  SEARCH_QUERY,
43
- ZERO_TIME,
44
- showLastVersions: 7,
45
- showMoreVersions: false,
50
+ showLastVersions: 7,
51
+ showMoreVersions: false,
52
+ selectedInstalledAppId: null,
46
53
  };
47
54
  },
48
55
 
@@ -50,9 +57,15 @@ export default {
50
57
  ...mapGetters(['currentCluster']),
51
58
 
52
59
  headerContent() {
60
+ const cardContent = this.chart.cardContent;
61
+
62
+ // Override statuses based on selected installed app for the detail page
63
+ const statuses = this.computeSelectedAppStatuses(cardContent.statuses);
64
+
53
65
  return {
54
- ...this.chart.cardContent,
55
- subHeaderItems: this.chart.cardContent.subHeaderItems.map((item, i) => i === 0 ? ({
66
+ ...cardContent,
67
+ statuses,
68
+ subHeaderItems: cardContent.subHeaderItems.map((item, i) => i === 0 ? ({
56
69
  icon: 'icon-version-alt',
57
70
  iconTooltip: { key: 'tableHeaders.version' },
58
71
  label: this.query.versionName
@@ -138,6 +151,57 @@ export default {
138
151
  }
139
152
 
140
153
  return '';
154
+ },
155
+
156
+ /**
157
+ * Returns the currently selected installed app.
158
+ * Falls back to this.existing (set by the mixin for targeted charts or URL query params).
159
+ */
160
+ selectedInstalledApp() {
161
+ if (this.selectedInstalledAppId) {
162
+ return this.installedInstances?.find((app) => app.id === this.selectedInstalledAppId) || null;
163
+ }
164
+
165
+ return this.existing || null;
166
+ },
167
+
168
+ /**
169
+ * Returns the action for the current state based on the selected app and target version.
170
+ */
171
+ currentAction() {
172
+ const app = this.selectedInstalledApp;
173
+
174
+ if (!app) {
175
+ return { tKey: 'install', icon: 'plus' };
176
+ }
177
+
178
+ const installedVersion = app.spec?.chart?.metadata?.version;
179
+
180
+ if (installedVersion === this.targetVersion) {
181
+ return { tKey: 'edit', icon: 'edit' };
182
+ }
183
+
184
+ if (compareChartVersions(installedVersion, this.targetVersion) < 0) {
185
+ return { tKey: 'upgrade', icon: 'upgrade-alt' };
186
+ }
187
+
188
+ return { tKey: 'downgrade', icon: 'downgrade-alt' };
189
+ },
190
+
191
+ /**
192
+ * Returns options for the installed apps selector dropdown.
193
+ * Adds "(Upgradeable)" suffix to apps that have an upgrade available.
194
+ */
195
+ installedAppOptions() {
196
+ return (this.installedInstances || []).map((app) => {
197
+ const isUpgradeable = app.upgradeAvailable === APP_UPGRADE_STATUS.SINGLE_UPGRADE;
198
+ const baseName = `${ app?.metadata?.namespace }/${ app?.metadata?.name }`;
199
+
200
+ return {
201
+ value: app.id,
202
+ label: isUpgradeable ? `${ baseName } (${ this.t('generic.upgradeable').toLowerCase() })` : baseName
203
+ };
204
+ });
141
205
  }
142
206
 
143
207
  },
@@ -153,7 +217,85 @@ export default {
153
217
  },
154
218
 
155
219
  methods: {
156
- install() {
220
+ isMissingDate,
221
+ /**
222
+ * Computes statuses for the chart detail page based on the selected installed app.
223
+ * When an app is selected, shows instance-specific installed/upgradeable status.
224
+ * When no app is selected (fresh install), returns only deprecated status if applicable.
225
+ *
226
+ * @param {Array} defaultStatuses - The default statuses from chart.cardContent
227
+ * @returns {Array} Statuses array for the selected app context
228
+ */
229
+ computeSelectedAppStatuses(defaultStatuses) {
230
+ const statuses = [];
231
+
232
+ // Always include deprecated status if present
233
+ const deprecatedStatus = defaultStatuses.find((s) => s.icon === 'icon-alert-alt');
234
+
235
+ if (deprecatedStatus) {
236
+ statuses.push(deprecatedStatus);
237
+ }
238
+
239
+ const selectedApp = this.selectedInstalledApp;
240
+
241
+ if (!selectedApp) {
242
+ // No app selected - fresh install, no installed/upgradeable status
243
+ return statuses;
244
+ }
245
+
246
+ // Check if the selected app is upgradeable
247
+ const isUpgradeable = selectedApp.upgradeAvailable === APP_UPGRADE_STATUS.SINGLE_UPGRADE;
248
+
249
+ if (isUpgradeable) {
250
+ statuses.push({
251
+ icon: 'icon-upgrade-alt', color: 'info', tooltip: { key: 'generic.upgradeable' }
252
+ });
253
+ }
254
+
255
+ // Add installed status with version for the selected app
256
+ const installedVersion = selectedApp.spec?.chart?.metadata?.version;
257
+
258
+ statuses.push({
259
+ icon: 'icon-confirmation-alt', color: 'success', tooltip: { text: `${ this.t('generic.installed') } (${ installedVersion })` }
260
+ });
261
+
262
+ return statuses;
263
+ },
264
+
265
+ /**
266
+ * Navigate to install page for the currently selected installed app (edit/upgrade/downgrade).
267
+ */
268
+ executeAction() {
269
+ const app = this.selectedInstalledApp;
270
+ const query = {
271
+ [REPO_TYPE]: this.query.repoType,
272
+ [REPO]: this.query.repoName,
273
+ [CHART]: this.query.chartName,
274
+ [VERSION]: this.query.versionName,
275
+ [DEPRECATED]: this.query.deprecated,
276
+ };
277
+
278
+ // If editing an existing app, include namespace and name in query
279
+ if (app) {
280
+ query[NAMESPACE] = app.metadata.namespace;
281
+ query[NAME] = app.metadata.name;
282
+ }
283
+
284
+ this.$router.push({
285
+ name: 'c-cluster-apps-charts-install',
286
+ params: {
287
+ cluster: this.$route.params.cluster,
288
+ product: this.$store.getters['productId'],
289
+ },
290
+ query
291
+ });
292
+ },
293
+
294
+ /**
295
+ * Navigate to install page to create a new instance of this chart.
296
+ * Uses NEW_APP_INSTANCE flag to enable version selection in the install wizard.
297
+ */
298
+ installNewInstance() {
157
299
  this.$router.push({
158
300
  name: 'c-cluster-apps-charts-install',
159
301
  params: {
@@ -161,14 +303,25 @@ export default {
161
303
  product: this.$store.getters['productId'],
162
304
  },
163
305
  query: {
164
- [REPO_TYPE]: this.query.repoType,
165
- [REPO]: this.query.repoName,
166
- [CHART]: this.query.chartName,
167
- [VERSION]: this.query.versionName,
168
- [DEPRECATED]: this.query.deprecated,
306
+ [REPO_TYPE]: this.query.repoType,
307
+ [REPO]: this.query.repoName,
308
+ [CHART]: this.query.chartName,
309
+ [VERSION]: this.query.versionName,
310
+ [DEPRECATED]: this.query.deprecated,
311
+ [NEW_APP_INSTANCE]: _FLAGGED,
169
312
  }
170
313
  });
171
314
  },
315
+
316
+ /**
317
+ * Handle installed app selection from the dropdown.
318
+ * Updates selectedInstalledAppId and this.existing so the page reflects the current installed app and displays the correct information for the selected instance.
319
+ */
320
+ handleInstalledAppSelect(id) {
321
+ this.selectedInstalledAppId = id;
322
+ this.existing = this.installedInstances?.find((app) => app.id === id) ?? null;
323
+ },
324
+
172
325
  handleHeaderItemClick(type, value) {
173
326
  const params = {
174
327
  cluster: this.$route.params.cluster,
@@ -194,17 +347,9 @@ export default {
194
347
  }
195
348
  },
196
349
  formatVersionDate(date) {
197
- if (date === ZERO_TIME) {
198
- return this.t('generic.na');
199
- }
200
-
201
350
  return day(date).format('MMM D, YYYY');
202
351
  },
203
352
  getVersionDateTooltip(date) {
204
- if (date === ZERO_TIME) {
205
- return this.t('catalog.chart.info.chartVersions.missingVersionDate');
206
- }
207
-
208
353
  const dateFormat = escapeHtml(this.$store.getters['prefs/get'](DATE_FORMAT));
209
354
 
210
355
  return day(date).format(dateFormat);
@@ -220,6 +365,20 @@ export default {
220
365
  [VERSION]: version,
221
366
  }
222
367
  };
368
+ },
369
+ openReadme() {
370
+ const url = getStandaloneReadmeUrl(this.$router, {
371
+ cluster: this.$route.params.cluster,
372
+ repoType: this.query.repoType,
373
+ repoName: this.query.repoName,
374
+ chartName: this.query.chartName,
375
+ versionName: this.query.versionName || this.targetVersion,
376
+ deprecated: this.query.deprecated,
377
+ showAppReadme: false,
378
+ hideReadmeFirstTitle: false,
379
+ });
380
+
381
+ window.open(url, '_blank');
223
382
  }
224
383
  },
225
384
  };
@@ -297,17 +456,49 @@ export default {
297
456
  />
298
457
  </div>
299
458
  </div>
300
- <RcButton
459
+ <div
301
460
  v-if="!requires.length"
302
- data-testid="btn-chart-install"
303
- class="btn role-primary"
304
- @click.prevent="install"
461
+ class="header-actions"
305
462
  >
306
- <i
307
- :class="['icon', action.icon, 'mmr-2']"
463
+ <LabeledSelect
464
+ v-if="installedInstances.length > 1 && canInstallNew"
465
+ :value="selectedInstalledApp?.id"
466
+ :options="installedAppOptions"
467
+ :clearable="false"
468
+ :aria-label="t('catalog.chart.installedAppsSelector.ariaLabel')"
469
+ class="installed-apps-selector"
470
+ data-testid="installed-apps-selector"
471
+ @update:value="handleInstalledAppSelect"
308
472
  />
309
- {{ t(`catalog.chart.chartButton.action.${action.tKey}` ) }}
310
- </RcButton>
473
+ <!-- Split button: shown when chart is installed AND can be re-installed -->
474
+ <RcButtonSplit
475
+ v-if="selectedInstalledApp && canInstallNew"
476
+ data-testid="btn-chart-install"
477
+ size="large"
478
+ :left-icon="currentAction.icon"
479
+ @click="executeAction"
480
+ >
481
+ {{ t(`catalog.chart.chartButton.action.${currentAction.tKey}` ) }}
482
+ <template #dropdownCollection>
483
+ <RcDropdownItem @click="installNewInstance">
484
+ <template #before>
485
+ <i class="icon icon-plus" />
486
+ </template>
487
+ {{ t('catalog.chart.chartButton.action.installNew') }}
488
+ </RcDropdownItem>
489
+ </template>
490
+ </RcButtonSplit>
491
+ <!-- Simple button: shown when chart is not installed OR cannot be re-installed -->
492
+ <RcButton
493
+ v-else
494
+ data-testid="btn-chart-install"
495
+ size="large"
496
+ :left-icon="currentAction.icon"
497
+ @click.prevent="executeAction"
498
+ >
499
+ {{ t(`catalog.chart.chartButton.action.${currentAction.tKey}` ) }}
500
+ </RcButton>
501
+ </div>
311
502
  </div>
312
503
 
313
504
  <div class="dashed-spacer" />
@@ -359,13 +550,27 @@ export default {
359
550
  </div>
360
551
 
361
552
  <div class="chart-body">
362
- <ChartReadme
553
+ <div
363
554
  v-if="hasReadme"
364
- :version-info="versionInfo"
365
- :show-app-readme="false"
366
- :hide-readme-first-title="false"
367
- class="chart-body__readme"
368
- />
555
+ class="readme-wrapper"
556
+ >
557
+ <RcButton
558
+ v-clean-tooltip="t('catalog.chart.viewReadmeSeparately.tooltip')"
559
+ class="open-readme-button"
560
+ secondary
561
+ rightIcon="external-link"
562
+ @click="openReadme()"
563
+ >
564
+ {{ t('catalog.chart.viewReadmeSeparately.label') }}
565
+ <span class="sr-only">{{ t('generic.opensInNewTab') }}</span>
566
+ </RcButton>
567
+ <ChartReadme
568
+ :version-info="versionInfo"
569
+ :show-app-readme="false"
570
+ :hide-readme-first-title="false"
571
+ class="chart-body__readme"
572
+ />
573
+ </div>
369
574
  <div
370
575
  v-else
371
576
  class="chart-body__readme"
@@ -418,6 +623,7 @@ export default {
418
623
  />
419
624
  </div>
420
625
  <p
626
+ v-if="!isMissingDate(vers.created)"
421
627
  v-clean-tooltip="{ content: getVersionDateTooltip(vers.created), placement: 'left'}"
422
628
  class="version-date"
423
629
  >
@@ -624,9 +830,16 @@ export default {
624
830
  }
625
831
  }
626
832
 
627
- .btn {
833
+ .header-actions {
628
834
  margin-left: auto;
629
- height: 40px;
835
+ display: flex;
836
+ align-items: flex-start;
837
+ flex-shrink: 0;
838
+ gap: 16px;
839
+
840
+ .installed-apps-selector {
841
+ width: 340px;
842
+ }
630
843
  }
631
844
 
632
845
  .description {
@@ -643,6 +856,29 @@ export default {
643
856
 
644
857
  .chart-body {
645
858
  display: flex;
859
+ .readme-wrapper {
860
+ position: relative;
861
+ flex: 1;
862
+
863
+ .open-readme-button {
864
+ display: flex;
865
+ opacity: 0;
866
+ pointer-events: none;
867
+ transition: opacity 100ms ease-in;
868
+ position: absolute;
869
+ top: 12px;
870
+ right: 24px;
871
+ }
872
+
873
+ &:hover,
874
+ &:focus-within {
875
+ .open-readme-button {
876
+ opacity: 1;
877
+ pointer-events: auto;
878
+ }
879
+ }
880
+ }
881
+
646
882
  &__readme {
647
883
  flex: 1;
648
884
  min-width: 400px;
@@ -200,7 +200,7 @@ export default {
200
200
  tagOptions() {
201
201
  const outSet = new Set();
202
202
 
203
- this.allCharts.forEach((chart) => {
203
+ this.enabledCharts.forEach((chart) => {
204
204
  if (Array.isArray(chart.tags)) {
205
205
  chart.tags.forEach((tag) => outSet.add(tag));
206
206
  }
@@ -270,7 +270,7 @@ export default {
270
270
  categoryOptions() {
271
271
  const map = {};
272
272
 
273
- for ( const chart of this.allCharts ) {
273
+ for ( const chart of this.enabledCharts ) {
274
274
  for ( const c of chart.categories ) {
275
275
  if ( !map[c] ) {
276
276
  const labelKey = `catalog.charts.categories.${ lcFirst(c) }`;
@@ -30,7 +30,7 @@ import {
30
30
  AUTH_TYPE, NAMESPACE as NAMESPACE_TYPE
31
31
  } from '@shell/config/types';
32
32
  import {
33
- CHART, FROM_CLUSTER, FROM_TOOLS, HIDE_SIDE_NAV, NAMESPACE, REPO, REPO_TYPE, VERSION, _FLAGGED
33
+ CHART, FROM_CLUSTER, FROM_TOOLS, HIDE_SIDE_NAV, NEW_APP_INSTANCE, NAMESPACE, REPO, REPO_TYPE, VERSION, _FLAGGED
34
34
  } from '@shell/config/query-params';
35
35
  import { CATALOG as CATALOG_ANNOTATIONS, PROJECT } from '@shell/config/labels-annotations';
36
36
 
@@ -41,7 +41,7 @@ import {
41
41
  import { ignoreVariables } from './install.helpers';
42
42
  import { findBy, insertAt } from '@shell/utils/array';
43
43
  import { saferDump } from '@shell/utils/create-yaml';
44
- import { LINUX, WINDOWS } from '@shell/store/catalog';
44
+ import { WINDOWS, isRancherRepo, getPermittedOSs } from '@shell/store/catalog';
45
45
  import { SETTING } from '@shell/config/settings';
46
46
  import SelectOrCreateAuthSecret from '@shell/components/form/SelectOrCreateAuthSecret.vue';
47
47
  import { generateRandomAlphaString } from '@shell/utils/string';
@@ -602,8 +602,11 @@ export default {
602
602
  },
603
603
 
604
604
  showSelectVersionOrChart() {
605
- // Allow the user to choose a version if the app exists OR they've come from tools
606
- return this.existing || (FROM_TOOLS in this.$route.query);
605
+ // Allow the user to choose a version if:
606
+ // - the app exists (editing/upgrading)
607
+ // - OR they've come from tools
608
+ // - OR they're installing a new instance of an already-installed chart
609
+ return this.existing || (FROM_TOOLS in this.$route.query) || (NEW_APP_INSTANCE in this.$route.query);
607
610
  },
608
611
 
609
612
  showNameEditor() {
@@ -763,14 +766,17 @@ export default {
763
766
  },
764
767
 
765
768
  windowsIncompatible() {
766
- if (this.chart?.windowsIncompatible) {
767
- return this.t('catalog.charts.windowsIncompatible');
768
- }
769
769
  if (this.versionInfo) {
770
- const incompatibleVersion = !(this.versionInfo?.chart?.annotations?.[CATALOG_ANNOTATIONS.PERMITTED_OS] || LINUX).includes('windows');
770
+ const isRancher = isRancherRepo(this.repo, this.chart);
771
+ const permittedSystems = getPermittedOSs(this.versionInfo?.chart?.annotations, isRancher);
772
+ const incompatibleVersion = permittedSystems.length > 0 && !permittedSystems.includes('windows');
773
+
774
+ if (incompatibleVersion) {
775
+ if (!this.chart?.windowsIncompatible) {
776
+ return this.t('catalog.charts.versionWindowsIncompatible');
777
+ }
771
778
 
772
- if (incompatibleVersion && !this.chart.windowsIncompatible) {
773
- return this.t('catalog.charts.versionWindowsIncompatible');
779
+ return this.t('catalog.charts.windowsIncompatible');
774
780
  }
775
781
  }
776
782
 
@@ -1110,6 +1116,8 @@ export default {
1110
1116
  this.$router.replace(this.clusterToolsLocation());
1111
1117
  } else if (this.$route.query[FROM_CLUSTER] === _FLAGGED) {
1112
1118
  this.$router.replace(this.clustersLocation());
1119
+ } else if (!this.chart) {
1120
+ this.$router.replace(this.appLocation());
1113
1121
  } else {
1114
1122
  this.$router.replace(this.chartLocation(false));
1115
1123
  }