@rancher/shell 1.2.3 → 2.0.1

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 (699) hide show
  1. package/assets/data/aws-regions.json +9 -0
  2. package/assets/images/vendor/openid.svg +18 -0
  3. package/assets/styles/app.scss +1 -2
  4. package/assets/styles/fonts/_icons.scss +3 -3
  5. package/assets/styles/global/_columns.scss +1 -1
  6. package/assets/styles/global/_labeled-input.scss +1 -0
  7. package/assets/styles/global/_layout.scss +99 -0
  8. package/assets/styles/themes/_csp.scss +2 -2
  9. package/assets/styles/themes/_dark.scss +8 -2
  10. package/assets/styles/themes/_light.scss +2 -1
  11. package/assets/styles/themes/_suse.scss +1 -1
  12. package/assets/styles/vendor/vue-select.scss +5 -0
  13. package/assets/translations/en-us.yaml +315 -64
  14. package/assets/translations/zh-hans.yaml +7 -31
  15. package/babel.config.js +8 -2
  16. package/chart/__tests__/S3.test.ts +9 -2
  17. package/chart/gatekeeper.vue +2 -11
  18. package/chart/istio.vue +1 -10
  19. package/chart/logging/index.vue +2 -11
  20. package/chart/monitoring/alerting/index.vue +7 -21
  21. package/chart/monitoring/grafana/index.vue +61 -2
  22. package/chart/monitoring/index.vue +52 -26
  23. package/chart/monitoring/prometheus/index.vue +39 -45
  24. package/chart/rancher-backup/S3.vue +11 -9
  25. package/chart/rancher-backup/index.vue +18 -15
  26. package/cloud-credential/__tests__/harvester.test.ts +18 -0
  27. package/cloud-credential/azure.vue +4 -17
  28. package/cloud-credential/generic.vue +18 -9
  29. package/cloud-credential/harvester.vue +11 -3
  30. package/components/AlertTable.vue +17 -7
  31. package/components/AppModal.vue +167 -0
  32. package/components/AssignTo.vue +7 -4
  33. package/components/AsyncButton.vue +27 -5
  34. package/components/BackLink.vue +4 -4
  35. package/components/BannerGraphic.vue +1 -0
  36. package/components/BrandImage.vue +47 -1
  37. package/components/Carousel.vue +15 -8
  38. package/components/Certificates.vue +161 -0
  39. package/components/ClusterBadge.vue +12 -3
  40. package/components/ClusterIconMenu.vue +55 -12
  41. package/components/ClusterProviderIcon.vue +14 -3
  42. package/components/CodeMirror.vue +111 -17
  43. package/components/CommunityLinks.vue +12 -8
  44. package/components/CopyCode.vue +6 -2
  45. package/components/CopyToClipboard.vue +2 -1
  46. package/components/CopyToClipboardText.vue +14 -9
  47. package/components/CreateDriver.vue +81 -0
  48. package/components/CruResource.vue +52 -27
  49. package/components/DetailTop.vue +2 -2
  50. package/components/Dialog.vue +6 -5
  51. package/components/DisableAuthProviderModal.vue +14 -8
  52. package/components/DraggableZone.vue +2 -2
  53. package/components/EtcdInfoBanner.vue +5 -5
  54. package/components/ExplorerMembers.vue +3 -3
  55. package/components/ExplorerProjectsNamespaces.vue +31 -7
  56. package/components/FixedBanner.vue +48 -36
  57. package/components/GlobalRoleBindings.vue +26 -0
  58. package/components/GrafanaDashboard.vue +6 -4
  59. package/components/IconOrSvg.vue +1 -1
  60. package/components/Import.vue +10 -6
  61. package/components/Inactivity.vue +1 -5
  62. package/components/KeyValueView.vue +14 -10
  63. package/components/Markdown.vue +16 -12
  64. package/components/MessageLink.vue +2 -2
  65. package/components/ModalWithCard.vue +5 -8
  66. package/components/MoveModal.vue +35 -33
  67. package/components/PodSecurityAdmission.vue +3 -3
  68. package/components/PromptChangePassword.vue +33 -33
  69. package/components/PromptModal.vue +11 -21
  70. package/components/PromptRemove.vue +12 -17
  71. package/components/PromptRestore.vue +18 -16
  72. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  73. package/components/Questions/__tests__/Float.test.ts +9 -19
  74. package/components/Questions/__tests__/Int.test.ts +9 -19
  75. package/components/Questions/__tests__/String.test.ts +9 -19
  76. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  77. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  78. package/components/Questions/index.vue +19 -3
  79. package/components/ResourceCancelModal.vue +34 -29
  80. package/components/ResourceDetail/Masthead.vue +48 -16
  81. package/components/ResourceDetail/index.vue +6 -4
  82. package/components/ResourceList/Masthead.vue +10 -9
  83. package/components/ResourceList/index.vue +65 -14
  84. package/components/ResourceTable.vue +87 -21
  85. package/components/ResourceYaml.vue +35 -5
  86. package/components/SelectIconGrid.vue +3 -3
  87. package/components/SideNav.vue +50 -94
  88. package/components/SingleClusterInfo.vue +4 -4
  89. package/components/SortableTable/THead.vue +33 -21
  90. package/components/SortableTable/filtering.js +9 -1
  91. package/components/SortableTable/grouping.js +8 -1
  92. package/components/SortableTable/index.vue +143 -44
  93. package/components/SortableTable/paging.js +36 -7
  94. package/components/SortableTable/selection.js +2 -1
  95. package/components/SortableTable/sorting.js +24 -7
  96. package/components/StatusTable.vue +5 -1
  97. package/components/Tabbed/index.vue +18 -1
  98. package/components/TableDataUserIcon.vue +47 -0
  99. package/components/TypeDescription.vue +1 -0
  100. package/components/Wizard.vue +1 -0
  101. package/components/YamlEditor.vue +1 -0
  102. package/components/__tests__/AppModal.test.ts +98 -0
  103. package/components/__tests__/AsyncButton.test.ts +1 -3
  104. package/components/__tests__/BackLink.test.ts +1 -1
  105. package/components/__tests__/ButtonGroup.test.ts +3 -6
  106. package/components/__tests__/Carousel.test.ts +43 -0
  107. package/components/__tests__/Certificates.test.ts +29 -0
  108. package/components/__tests__/CodeMirror.test.ts +87 -0
  109. package/components/__tests__/CopyCode.test.ts +5 -4
  110. package/components/__tests__/CruResource.test.ts +10 -9
  111. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  112. package/components/__tests__/FixedBanner.test.ts +5 -20
  113. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  114. package/components/__tests__/TabTitle.test.ts +129 -0
  115. package/components/auth/AzureWarning.vue +2 -2
  116. package/components/auth/RoleDetailEdit.vue +10 -0
  117. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  118. package/components/auth/login/oidc.vue +7 -1
  119. package/components/fleet/FleetBundles.vue +5 -11
  120. package/components/fleet/FleetClusters.vue +9 -9
  121. package/components/fleet/FleetIntro.vue +11 -17
  122. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  123. package/components/fleet/FleetRepos.vue +63 -27
  124. package/components/fleet/FleetResources.vue +6 -1
  125. package/components/fleet/FleetStatus.vue +3 -3
  126. package/components/fleet/FleetSummary.vue +35 -30
  127. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  128. package/components/fleet/__tests__/FleetSummary.test.ts +316 -0
  129. package/components/form/ArrayList.vue +22 -18
  130. package/components/form/ArrayListSelect.vue +5 -0
  131. package/components/form/BannerSettings.vue +3 -0
  132. package/components/form/ClusterAppearance.vue +132 -0
  133. package/components/form/ColorInput.vue +1 -0
  134. package/components/form/Error.vue +3 -3
  135. package/components/form/FileSelector.vue +1 -0
  136. package/components/form/Footer.vue +2 -2
  137. package/components/form/GitPicker.vue +83 -38
  138. package/components/form/KeyValue.vue +70 -48
  139. package/components/form/LabeledSelect.vue +145 -41
  140. package/components/form/Labels.vue +3 -1
  141. package/components/form/NameNsDescription.vue +26 -9
  142. package/components/form/Password.vue +3 -1
  143. package/components/form/ResourceLabeledSelect.vue +187 -0
  144. package/components/form/ResourceTabs/index.vue +31 -15
  145. package/components/form/SecretSelector.vue +93 -18
  146. package/components/form/SelectOrCreateAuthSecret.vue +132 -59
  147. package/components/form/SimpleSecretSelector.vue +88 -28
  148. package/components/form/Taints.vue +13 -7
  149. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  150. package/components/form/__tests__/KeyValue.test.ts +120 -11
  151. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  152. package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +25 -15
  153. package/components/form/__tests__/Taints.test.ts +70 -0
  154. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  155. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  156. package/components/formatter/AppSummaryGraph.vue +2 -2
  157. package/components/formatter/Checked.vue +11 -3
  158. package/components/formatter/CloudCredPublicData.vue +30 -0
  159. package/components/formatter/ClusterLink.vue +2 -2
  160. package/components/formatter/ClusterProvider.vue +1 -18
  161. package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
  162. package/components/formatter/FleetSummaryGraph.vue +25 -12
  163. package/components/formatter/ImagePercentageBar.vue +0 -4
  164. package/components/formatter/IngressTarget.vue +18 -7
  165. package/components/formatter/Link.vue +2 -2
  166. package/components/formatter/LinkDetail.vue +2 -2
  167. package/components/formatter/LinkDetailImage.vue +2 -2
  168. package/components/formatter/LinkName.vue +2 -2
  169. package/components/formatter/LiveDuration.vue +1 -1
  170. package/components/formatter/PercentageBar.vue +1 -1
  171. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  172. package/components/formatter/SecretType.vue +2 -2
  173. package/components/formatter/VirtualServiceGateways.vue +2 -2
  174. package/components/formatter/WorkloadDetailEndpoints.vue +12 -22
  175. package/components/formatter/__tests__/Checked.test.ts +19 -0
  176. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  177. package/components/formatter/__tests__/WorkloadDetailEndpoints.test.ts +81 -0
  178. package/components/nav/Group.vue +9 -7
  179. package/components/nav/Header.vue +85 -46
  180. package/components/nav/Jump.vue +19 -9
  181. package/components/nav/NamespaceFilter.vue +8 -1
  182. package/components/nav/TopLevelMenu.vue +392 -136
  183. package/components/nav/Type.vue +71 -106
  184. package/components/nav/WindowManager/ContainerLogs.vue +120 -19
  185. package/components/nav/WindowManager/ContainerShell.vue +6 -1
  186. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
  187. package/components/nav/WindowManager/index.vue +11 -10
  188. package/components/nav/__tests__/TopLevelMenu.test.ts +400 -6
  189. package/components/nav/__tests__/Type.test.ts +322 -97
  190. package/components/nuxt/nuxt-child.js +9 -78
  191. package/components/nuxt/nuxt-error.vue +1 -1
  192. package/components/nuxt/nuxt-link.client.js +13 -95
  193. package/{layouts → components/templates}/blank.vue +1 -1
  194. package/{layouts → components/templates}/default.vue +11 -101
  195. package/{layouts → components/templates}/error.vue +13 -26
  196. package/{layouts → components/templates}/home.vue +4 -1
  197. package/{layouts → components/templates}/plain.vue +4 -1
  198. package/{layouts → components/templates}/standalone.vue +1 -5
  199. package/{layouts → components/templates}/unauthenticated.vue +2 -3
  200. package/composables/useCompactInput.test.ts +36 -0
  201. package/composables/useCompactInput.ts +20 -0
  202. package/composables/useLabeledFormElement.test.ts +135 -0
  203. package/composables/useLabeledFormElement.ts +138 -0
  204. package/config/harvester-manager-types.js +2 -0
  205. package/config/home-links.js +2 -1
  206. package/config/labels-annotations.js +2 -1
  207. package/config/middleware.js +0 -6
  208. package/config/pagination-table-headers.js +57 -0
  209. package/config/pod-security-admission.ts +1 -1
  210. package/config/private-label.js +21 -1
  211. package/config/product/auth.js +1 -0
  212. package/config/product/explorer.js +166 -45
  213. package/config/product/fleet.js +6 -1
  214. package/config/product/legacy.js +2 -11
  215. package/config/product/manager.js +51 -25
  216. package/config/query-params.js +2 -0
  217. package/config/roles.ts +23 -0
  218. package/config/router/index.js +23 -0
  219. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  220. package/config/router/navigation-guards/authentication.js +63 -0
  221. package/config/router/navigation-guards/i18n.js +13 -0
  222. package/config/router/navigation-guards/index.js +16 -0
  223. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  224. package/config/router/routes.js +487 -0
  225. package/config/settings.ts +31 -2
  226. package/config/store.js +8 -4
  227. package/config/system-namespaces.js +3 -0
  228. package/config/table-headers.js +66 -1
  229. package/config/types.js +35 -20
  230. package/config/uiplugins.js +10 -5
  231. package/core/plugin-helpers.js +4 -6
  232. package/core/plugin-routes.ts +56 -114
  233. package/core/plugin.ts +18 -11
  234. package/core/plugins-loader.js +7 -9
  235. package/core/plugins.js +289 -285
  236. package/core/types-provisioning.ts +7 -0
  237. package/creators/app/app.package.json +2 -1
  238. package/creators/app/files/.eslintignore +0 -2
  239. package/creators/app/files/.gitlab-ci.yml +14 -0
  240. package/creators/app/files/.vscode/settings.json +0 -1
  241. package/creators/app/init +19 -0
  242. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  243. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  244. package/creators/pkg/init +32 -0
  245. package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +119 -0
  246. package/detail/__tests__/service.test.ts +62 -0
  247. package/detail/catalog.cattle.io.app.vue +1 -1
  248. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  249. package/detail/fleet.cattle.io.bundle.vue +1 -1
  250. package/detail/fleet.cattle.io.cluster.vue +11 -1
  251. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  252. package/detail/namespace.vue +2 -2
  253. package/detail/networking.k8s.io.ingress.vue +52 -19
  254. package/detail/node.vue +22 -3
  255. package/detail/provisioning.cattle.io.cluster.vue +31 -13
  256. package/detail/service.vue +1 -1
  257. package/detail/workload/index.vue +1 -0
  258. package/dialog/AddCustomBadgeDialog.vue +318 -161
  259. package/dialog/DeactivateDriverDialog.vue +137 -0
  260. package/dialog/RollbackWorkloadDialog.vue +2 -2
  261. package/dialog/RotateCertificatesDialog.vue +0 -21
  262. package/dialog/ScaleMachineDownDialog.vue +34 -17
  263. package/directives/clean-html.js +15 -0
  264. package/directives/clean-tooltip.js +32 -0
  265. package/directives/focus.js +41 -0
  266. package/directives/int-number.js +21 -0
  267. package/directives/positive-int-number.js +19 -0
  268. package/directives/trim-whitespace.js +19 -0
  269. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  270. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  271. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  272. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  273. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  274. package/edit/__tests__/nodeDriver.test.ts +107 -0
  275. package/edit/__tests__/service.test.ts +85 -0
  276. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  277. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  278. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  279. package/edit/auth/__tests__/azuread.test.ts +241 -0
  280. package/edit/auth/__tests__/oidc.test.ts +137 -0
  281. package/edit/auth/azuread.vue +133 -31
  282. package/edit/auth/github.vue +5 -17
  283. package/edit/auth/googleoauth.vue +6 -23
  284. package/edit/auth/ldap/index.vue +5 -17
  285. package/edit/auth/oidc.vue +143 -42
  286. package/edit/auth/saml.vue +5 -14
  287. package/edit/catalog.cattle.io.clusterrepo.vue +177 -9
  288. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  289. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  290. package/edit/cloudcredential.vue +28 -4
  291. package/edit/configmap.vue +10 -4
  292. package/edit/fleet.cattle.io.gitrepo.vue +3 -1
  293. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  294. package/edit/kontainerDriver.vue +65 -0
  295. package/edit/logging-flow/Match.vue +10 -9
  296. package/edit/logging-flow/index.vue +4 -19
  297. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  298. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  299. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  300. package/edit/management.cattle.io.project.vue +3 -53
  301. package/edit/management.cattle.io.setting.vue +52 -2
  302. package/edit/management.cattle.io.user.vue +2 -1
  303. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  304. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  305. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +1 -1
  306. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +2 -2
  307. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +1 -1
  308. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +15 -3
  309. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +4 -1
  310. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  311. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  312. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  313. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  314. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  315. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  316. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +46 -7
  317. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +1 -1
  318. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  319. package/edit/nodeDriver.vue +65 -0
  320. package/edit/persistentvolume/index.vue +2 -2
  321. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +33 -16
  322. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +276 -0
  323. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
  324. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +3 -0
  325. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  326. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  327. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
  328. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +77 -13
  329. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +391 -0
  330. package/edit/provisioning.cattle.io.cluster/import.vue +4 -4
  331. package/edit/provisioning.cattle.io.cluster/index.vue +126 -51
  332. package/edit/provisioning.cattle.io.cluster/rke2.vue +325 -791
  333. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
  334. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +217 -0
  335. package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +123 -129
  336. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  337. package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
  338. package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +1 -0
  339. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
  340. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +190 -0
  341. package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +3 -0
  342. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +148 -0
  343. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
  344. package/edit/resources.cattle.io.backup.vue +139 -124
  345. package/edit/resources.cattle.io.restore.vue +146 -126
  346. package/edit/service.vue +13 -0
  347. package/edit/serviceaccount.vue +46 -4
  348. package/edit/token.vue +3 -1
  349. package/edit/workload/Upgrading.vue +3 -2
  350. package/edit/workload/__tests__/Job.test.ts +1 -3
  351. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  352. package/edit/workload/index.vue +2 -1
  353. package/edit/workload/mixins/workload.js +35 -2
  354. package/edit/workload/storage/emptyDir.vue +2 -2
  355. package/initialize/App.vue +75 -0
  356. package/initialize/app-extended.js +128 -0
  357. package/initialize/entry-helpers.js +546 -0
  358. package/initialize/entry.js +32 -0
  359. package/initialize/install-components.js +23 -0
  360. package/initialize/install-directives.js +59 -0
  361. package/initialize/install-plugins.js +123 -0
  362. package/list/__tests__/workload.test.ts +1 -1
  363. package/list/catalog.cattle.io.app.vue +1 -0
  364. package/list/cis.cattle.io.clusterscan.vue +16 -10
  365. package/list/group.principal.vue +2 -2
  366. package/list/management.cattle.io.feature.vue +16 -16
  367. package/list/management.cattle.io.setting.vue +1 -0
  368. package/list/management.cattle.io.user.vue +13 -4
  369. package/list/networking.k8s.io.ingress.vue +36 -0
  370. package/list/node.vue +212 -73
  371. package/list/provisioning.cattle.io.cluster.vue +17 -4
  372. package/list/ui.cattle.io.navlink.vue +2 -2
  373. package/list/workload.vue +22 -0
  374. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  375. package/machine-config/__tests__/vmwarevsphere.test.ts +1 -3
  376. package/machine-config/amazonec2.vue +1 -1
  377. package/machine-config/azure.vue +2 -1
  378. package/machine-config/generic.vue +11 -15
  379. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  380. package/machine-config/vmwarevsphere.vue +31 -27
  381. package/middleware/authenticated.js +23 -399
  382. package/mixins/__tests__/chart.test.ts +48 -6
  383. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  384. package/mixins/auth-config.js +5 -9
  385. package/mixins/brand.js +102 -96
  386. package/mixins/chart.js +27 -13
  387. package/mixins/create-edit-view/index.js +2 -2
  388. package/mixins/fetch.client.js +42 -48
  389. package/mixins/labeled-form-element.ts +27 -2
  390. package/mixins/page-actions.js +7 -5
  391. package/mixins/resource-fetch-api-pagination.js +304 -0
  392. package/mixins/resource-fetch-namespaced.js +1 -1
  393. package/mixins/resource-fetch.js +46 -5
  394. package/models/__tests__/cluster.test.ts +44 -0
  395. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  396. package/models/__tests__/management.cattle.io.cluster.test.ts +23 -0
  397. package/models/__tests__/management.cattle.io.node.ts +85 -0
  398. package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
  399. package/models/__tests__/namespace.test.ts +49 -9
  400. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +241 -0
  401. package/models/__tests__/schema.tests.ts +24 -0
  402. package/models/__tests__/secret.test.ts +37 -0
  403. package/models/__tests__/steve-schema.test.ts +73 -0
  404. package/models/__tests__/storage.k8s.io.storageclass.test.ts +22 -0
  405. package/models/__tests__/workload.test.ts +91 -0
  406. package/models/catalog.cattle.io.app.js +8 -0
  407. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  408. package/models/catalog.cattle.io.uiplugin.js +7 -8
  409. package/models/cis.cattle.io.clusterscan.js +29 -8
  410. package/models/cloudcredential.js +9 -1
  411. package/models/cluster/node.js +8 -4
  412. package/models/cluster/schema.js +6 -0
  413. package/models/cluster.js +33 -0
  414. package/models/cluster.x-k8s.io.machine.js +1 -1
  415. package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
  416. package/models/driver.js +63 -0
  417. package/models/fleet.cattle.io.cluster.js +27 -11
  418. package/models/fleet.cattle.io.gitrepo.js +66 -13
  419. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  420. package/models/kontainerdriver.js +85 -0
  421. package/models/management/schema.js +6 -0
  422. package/models/management.cattle.io.authconfig.js +3 -2
  423. package/models/management.cattle.io.cluster.js +16 -7
  424. package/models/management.cattle.io.globalrole.js +2 -0
  425. package/models/management.cattle.io.kontainerdriver.js +1 -0
  426. package/models/management.cattle.io.node.js +18 -14
  427. package/models/management.cattle.io.nodepool.js +17 -0
  428. package/models/management.cattle.io.project.js +0 -36
  429. package/models/management.cattle.io.setting.js +11 -7
  430. package/models/management.cattle.io.user.js +2 -2
  431. package/models/monitoring.coreos.com.receiver.js +3 -1
  432. package/models/monitoring.coreos.com.route.js +1 -1
  433. package/models/namespace.js +1 -1
  434. package/models/networking.k8s.io.ingress.js +2 -1
  435. package/models/nodedriver.js +85 -0
  436. package/models/pod.js +20 -0
  437. package/models/provisioning.cattle.io.cluster.js +125 -10
  438. package/models/schema.js +28 -7
  439. package/models/secret.js +126 -18
  440. package/models/service.js +2 -0
  441. package/models/steve-schema.ts +254 -0
  442. package/models/storage.k8s.io.storageclass.js +1 -1
  443. package/models/workload.js +17 -0
  444. package/models/workload.service.js +18 -0
  445. package/package.json +18 -14
  446. package/pages/about.vue +12 -6
  447. package/pages/account/create-key.vue +0 -1
  448. package/pages/account/index.vue +7 -3
  449. package/pages/auth/login.vue +106 -103
  450. package/pages/auth/logout.vue +2 -4
  451. package/pages/auth/setup.vue +92 -66
  452. package/pages/auth/verify.vue +30 -24
  453. package/pages/c/_cluster/apps/charts/__tests__/install.helper.test.ts +2 -17
  454. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  455. package/pages/c/_cluster/apps/charts/index.vue +99 -69
  456. package/pages/c/_cluster/apps/charts/install.helpers.js +2 -13
  457. package/pages/c/_cluster/apps/charts/install.vue +12 -11
  458. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  459. package/pages/c/_cluster/auth/config/index.vue +15 -9
  460. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  461. package/pages/c/_cluster/ecm/index.vue +0 -2
  462. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  463. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  464. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  465. package/pages/c/_cluster/explorer/index.vue +253 -91
  466. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  467. package/pages/c/_cluster/explorer/tools/index.vue +10 -6
  468. package/pages/c/_cluster/fleet/index.vue +89 -94
  469. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  470. package/pages/c/_cluster/longhorn/index.vue +52 -17
  471. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  472. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  473. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  474. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +91 -0
  475. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  476. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  477. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +60 -0
  478. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  479. package/pages/c/_cluster/manager/pages/_page.vue +4 -5
  480. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  481. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  482. package/pages/c/_cluster/neuvector/index.vue +1 -0
  483. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  484. package/pages/c/_cluster/settings/banners.vue +86 -10
  485. package/pages/c/_cluster/settings/brand.vue +261 -38
  486. package/pages/c/_cluster/settings/index.vue +4 -6
  487. package/pages/c/_cluster/settings/links.vue +3 -2
  488. package/pages/c/_cluster/settings/performance.vue +71 -3
  489. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  490. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +12 -8
  491. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  492. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
  493. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  494. package/pages/c/_cluster/uiplugins/InstallDialog.vue +55 -19
  495. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  496. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  497. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  498. package/pages/c/_cluster/uiplugins/index.vue +38 -54
  499. package/pages/diagnostic.vue +2 -2
  500. package/pages/fail-whale.vue +103 -42
  501. package/pages/home.vue +81 -24
  502. package/pages/prefs.vue +8 -4
  503. package/pages/support/index.vue +14 -10
  504. package/pkg/auto-import.js +1 -1
  505. package/plugins/axios.js +0 -36
  506. package/plugins/back-button.js +3 -5
  507. package/plugins/clean-html-directive.js +5 -30
  508. package/plugins/clean-html.js +53 -0
  509. package/plugins/clean-tooltip-directive.js +6 -31
  510. package/plugins/codemirror-loader.js +1 -1
  511. package/plugins/codemirror.js +41 -9
  512. package/plugins/dashboard-store/__tests__/mutations.test.ts +389 -0
  513. package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
  514. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
  515. package/plugins/dashboard-store/actions.js +132 -25
  516. package/plugins/dashboard-store/classify.js +1 -18
  517. package/plugins/dashboard-store/getters.js +154 -44
  518. package/plugins/dashboard-store/index.js +0 -111
  519. package/plugins/dashboard-store/mutations.js +150 -52
  520. package/plugins/dashboard-store/resource-class.js +77 -127
  521. package/plugins/directives.js +6 -39
  522. package/plugins/ember-cookie.js +13 -0
  523. package/plugins/global-formatters.js +26 -5
  524. package/plugins/i18n.js +89 -55
  525. package/plugins/int-number.js +6 -20
  526. package/plugins/plugin.js +3 -3
  527. package/plugins/positive-int-number.js +6 -17
  528. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +81 -10
  529. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  530. package/plugins/steve/__tests__/resource-utils.test.ts +159 -0
  531. package/plugins/steve/__tests__/steve-class.test.ts +59 -0
  532. package/plugins/steve/__tests__/subscribe.spec.ts +4 -1
  533. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  534. package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
  535. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  536. package/plugins/steve/actions.js +3 -38
  537. package/plugins/steve/getters.js +164 -61
  538. package/plugins/steve/hybrid-class.js +5 -1
  539. package/plugins/steve/mutations.js +24 -3
  540. package/plugins/steve/norman-class.js +142 -2
  541. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  542. package/plugins/steve/resource-utils.ts +38 -0
  543. package/plugins/steve/schema.d.ts +22 -0
  544. package/plugins/steve/steve-class.js +22 -0
  545. package/plugins/steve/steve-pagination-utils.ts +368 -0
  546. package/plugins/steve/subscribe.js +17 -76
  547. package/plugins/trim-whitespace.js +6 -34
  548. package/plugins/vue-js-modal.js +1 -1
  549. package/promptRemove/pod.vue +15 -7
  550. package/public/index.html +1 -0
  551. package/rancher-components/Accordion/Accordion.test.ts +45 -0
  552. package/rancher-components/Accordion/Accordion.vue +86 -0
  553. package/rancher-components/Accordion/index.ts +1 -0
  554. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  555. package/rancher-components/Banner/Banner.test.ts +1 -5
  556. package/rancher-components/Banner/Banner.vue +2 -2
  557. package/rancher-components/Card/Card.vue +4 -4
  558. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
  559. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  560. package/rancher-components/Form/LabeledInput/LabeledInput.vue +57 -24
  561. package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
  562. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  563. package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
  564. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
  565. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  566. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  567. package/rancher-components/StringList/StringList.test.ts +270 -0
  568. package/rancher-components/StringList/StringList.vue +65 -26
  569. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +69 -0
  570. package/scripts/clean +1 -1
  571. package/scripts/extension/bundle +19 -7
  572. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  573. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  574. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  575. package/scripts/extension/helm/package/Dockerfile +1 -1
  576. package/scripts/extension/helm/scripts/package +11 -3
  577. package/scripts/extension/helm/scripts/patch +27 -0
  578. package/scripts/extension/parse-tag-name +4 -4
  579. package/scripts/extension/publish +25 -14
  580. package/scripts/publish-shell.sh +11 -1
  581. package/scripts/serve-pkgs +0 -2
  582. package/scripts/test-plugins-build.sh +87 -11
  583. package/scripts/vue-migrate.js +683 -0
  584. package/server/har-file.js +183 -0
  585. package/store/__tests__/catalog.test.ts +224 -0
  586. package/store/__tests__/type-map.test.ts +1122 -0
  587. package/store/auth.js +23 -4
  588. package/store/aws.js +53 -6
  589. package/store/catalog.js +22 -6
  590. package/store/cru-resource.ts +26 -0
  591. package/store/customisation.js +35 -0
  592. package/store/features.js +7 -4
  593. package/store/i18n.js +11 -0
  594. package/store/index.js +140 -49
  595. package/store/plugins.js +8 -4
  596. package/store/prefs.js +33 -38
  597. package/store/type-map.js +288 -213
  598. package/store/type-map.utils.ts +226 -0
  599. package/tsconfig.json +34 -9
  600. package/tsconfig.paths.json +21 -0
  601. package/types/components/labeledSelect.ts +50 -0
  602. package/types/resources/settings.d.ts +32 -0
  603. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  604. package/types/shell/index.d.ts +1045 -770
  605. package/types/store/dashboard-store.types.ts +42 -0
  606. package/types/store/pagination.types.ts +457 -0
  607. package/types/store/type-map.ts +30 -0
  608. package/types/store/vuex.d.ts +9 -0
  609. package/types/vue-shim.d.ts +51 -0
  610. package/utils/__tests__/cluster.test.ts +20 -18
  611. package/utils/__tests__/create-yaml.test.ts +359 -2
  612. package/utils/__tests__/kontainer.test.ts +180 -0
  613. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  614. package/utils/alertmanagerconfig.js +19 -0
  615. package/utils/array.ts +40 -1
  616. package/utils/async.ts +2 -0
  617. package/utils/auth.js +152 -4
  618. package/utils/axios.js +2 -21
  619. package/utils/azure.js +24 -0
  620. package/utils/banners.js +103 -0
  621. package/utils/clipboard.js +5 -0
  622. package/utils/cluster.js +1 -1
  623. package/utils/config.js +4 -0
  624. package/utils/create-yaml.js +59 -28
  625. package/utils/custom-validators.js +0 -2
  626. package/utils/error.js +41 -1
  627. package/utils/formatter.js +5 -3
  628. package/utils/git.ts +1 -1
  629. package/utils/install-redirect.js +1 -1
  630. package/utils/kontainer.ts +190 -0
  631. package/utils/object.js +24 -0
  632. package/utils/pagination-utils.ts +154 -0
  633. package/utils/pod-security-admission.ts +1 -1
  634. package/utils/router.js +86 -0
  635. package/utils/settings.ts +46 -0
  636. package/utils/time.js +2 -1
  637. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  638. package/utils/url.ts +1 -1
  639. package/utils/validators/formRules/__tests__/index.test.ts +70 -4
  640. package/utils/validators/formRules/index.ts +15 -9
  641. package/utils/validators/index.js +1 -0
  642. package/utils/validators/setting.js +6 -10
  643. package/utils/version.js +2 -1
  644. package/vue.config.js +377 -401
  645. package/.DS_Store +0 -0
  646. package/assets/images/providers/aks-black.svg +0 -28
  647. package/assets/images/providers/aks.svg +0 -31
  648. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  649. package/components/ChartPsp.vue +0 -76
  650. package/components/EventsTable.vue +0 -67
  651. package/components/TabbedLinks/index.vue +0 -94
  652. package/components/__tests__/ChartPsp.test.ts +0 -75
  653. package/components/formatter/__tests__/ClusterProvider.test.ts +0 -28
  654. package/components/nuxt/nuxt-link.server.js +0 -16
  655. package/components/nuxt/nuxt.js +0 -101
  656. package/config/router.js +0 -408
  657. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -237
  658. package/initialize/App.js +0 -198
  659. package/initialize/client.js +0 -875
  660. package/initialize/index.js +0 -364
  661. package/initialize/layouts.ts +0 -26
  662. package/middleware/i18n.js +0 -10
  663. package/middleware/unauthenticated.js +0 -22
  664. package/mixins/fetch.server.js +0 -73
  665. package/pages/c/_cluster/apps/index.vue +0 -17
  666. package/pages/c/_cluster/auth/index.vue +0 -19
  667. package/pages/c/_cluster/index.vue +0 -17
  668. package/pages/c/_cluster/legacy/index.vue +0 -22
  669. package/pages/c/_cluster/manager/index.vue +0 -22
  670. package/pages/c/_cluster/mcapps/index.vue +0 -21
  671. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  672. package/pages/c/index.vue +0 -9
  673. package/pages/rio/mesh.vue +0 -508
  674. package/plugins/dashboard-store/__tests__/mutations.spec.ts +0 -406
  675. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  676. package/plugins/portal-vue.js +0 -4
  677. package/plugins/portal.js +0 -4
  678. package/plugins/resize.js +0 -5
  679. package/plugins/shortkey.js +0 -4
  680. package/plugins/tooltip.js +0 -4
  681. package/plugins/transitions.js +0 -4
  682. package/plugins/v-select.js +0 -4
  683. package/plugins/vue-clipboard2.js +0 -4
  684. package/tsconfig.default.json +0 -46
  685. package/utils/group.js +0 -70
  686. package/utils/nuxt.js +0 -659
  687. package/utils/router.scrollBehavior.js +0 -80
  688. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  689. /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
  690. /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
  691. /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
  692. /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
  693. /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
  694. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  695. /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
  696. /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
  697. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  698. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  699. /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
package/utils/auth.js CHANGED
@@ -1,8 +1,13 @@
1
1
  import { Popup, popupWindowOptions } from '@shell/utils/window';
2
2
  import { parse as parseUrl, addParam } from '@shell/utils/url';
3
- import { BACK_TO, SPA, _EDIT, _FLAGGED } from '@shell/config/query-params';
4
- import { MANAGEMENT } from '@shell/config/types';
3
+ import {
4
+ BACK_TO, SPA, _EDIT, _FLAGGED, TIMED_OUT
5
+ } from '@shell/config/query-params';
6
+ import { MANAGEMENT, NORMAN } from '@shell/config/types';
5
7
  import { allHash } from '@shell/utils/promise';
8
+ import { getProductFromRoute, getResourceFromRoute } from '@shell/utils/router';
9
+ import { NAME as EXPLORER } from '@shell/config/product/explorer';
10
+ import { findBy } from '@shell/utils/array';
6
11
 
7
12
  export function openAuthPopup(url, provider) {
8
13
  const popup = new Popup(() => {
@@ -64,10 +69,10 @@ export function returnTo(opt, vm) {
64
69
  export const authProvidersInfo = async(store) => {
65
70
  const rows = await store.dispatch(`management/findAll`, { type: MANAGEMENT.AUTH_CONFIG });
66
71
  const nonLocal = rows.filter((x) => x.name !== 'local');
67
- // Generic OIDC is returned via API but not supported (and will be removed or fixed in future)
68
- const supportedNonLocal = nonLocal.filter((x) => x.id !== 'oidc');
69
72
  const enabled = nonLocal.filter((x) => x.enabled === true );
70
73
 
74
+ const supportedNonLocal = nonLocal.filter((x) => x.id !== 'oidc');
75
+
71
76
  const enabledLocation = enabled.length === 1 ? {
72
77
  name: 'c-cluster-auth-config-id',
73
78
  params: { id: enabled[0].id },
@@ -161,3 +166,146 @@ export const canViewResource = (store, resource) => {
161
166
 
162
167
  return !!validResource;
163
168
  };
169
+
170
+ // ************************************************************
171
+ //
172
+ // BELOW ARE METHODS THAT ARE A PART OF THE AUTHENTICATED MIDDLEWARE REMOVAL. THIS IS A TEMPORARY HOME FOR THESE UTILS AND SHOULD BE REWRITTEN, MOVED OR DELETED.
173
+ //
174
+ // TODO: Remove and refactor everything below for more clarity and better organization. https://github.com/rancher/dashboard/issues/11111
175
+ //
176
+ // ************************************************************
177
+
178
+ /**
179
+ * Attempt to set the product in our datastore if the route matches a known product. Otherwise show an error page instead.
180
+ */
181
+ export function setProduct(store, to) {
182
+ let product = getProductFromRoute(to);
183
+
184
+ // since all products are hardcoded as routes (ex: c-local-explorer), if we match the wildcard route it means that the product does not exist
185
+ if ((product && (!to.matched.length || (to.matched.length && to.matched[0].path === '/c/:cluster/:product'))) ||
186
+ // if the product grabbed from the route is not registered, then we don't have it!
187
+ (product && !store.getters['type-map/isProductRegistered'](product))) {
188
+ const error = new Error(store.getters['i18n/t']('nav.failWhale.productNotFound', { productNotFound: product }, true));
189
+
190
+ store.dispatch('loadingError', error);
191
+
192
+ throw new Error('loadingError', new Error(store.getters['i18n/t']('nav.failWhale.productNotFound', { productNotFound: product }, true)));
193
+ }
194
+
195
+ if ( !product ) {
196
+ product = EXPLORER;
197
+ }
198
+
199
+ const oldProduct = store.getters['productId'];
200
+ const oldStore = store.getters['currentProduct']?.inStore;
201
+
202
+ if ( product !== oldProduct ) {
203
+ store.commit('setProduct', product);
204
+ }
205
+
206
+ const neuStore = store.getters['currentProduct']?.inStore;
207
+
208
+ if ( neuStore !== oldStore ) {
209
+ // If the product store changes, clear the catalog.
210
+ // There might be management catalog items in it vs cluster.
211
+ store.commit('catalog/reset');
212
+ }
213
+ }
214
+
215
+ /**
216
+ * Check that the resource is valid, if not redirect to fail whale
217
+ *
218
+ * This requires that
219
+ * - product is set
220
+ * - product's store is set and setup (so we can check schema's within it)
221
+ * - product's store has the schemaFor getter (extension stores might not have it)
222
+ * - there's a resource associated with route (meta or param)
223
+ */
224
+ export function validateResource(store, to) {
225
+ const product = store.getters['currentProduct'];
226
+ const resource = getResourceFromRoute(to);
227
+
228
+ // In order to check a resource is valid we need these
229
+ if (!product || !resource) {
230
+ return false;
231
+ }
232
+
233
+ if (canViewResource(store, resource)) {
234
+ return false;
235
+ }
236
+
237
+ // Unknown resource, redirect to fail whale
238
+
239
+ const error = new Error(store.getters['i18n/t']('nav.failWhale.resourceNotFound', { resource }, true));
240
+
241
+ store.dispatch('loadingError', error);
242
+
243
+ throw error;
244
+ }
245
+
246
+ /**
247
+ * Attempt to load the current user's principal
248
+ */
249
+ export async function findMe(store) {
250
+ // First thing we do in loadManagement is fetch principals anyway.... so don't ?me=true here
251
+ const principals = await store.dispatch('rancher/findAll', {
252
+ type: NORMAN.PRINCIPAL,
253
+ opt: {
254
+ url: '/v3/principals',
255
+ redirectUnauthorized: false,
256
+ }
257
+ });
258
+
259
+ const me = findBy(principals, 'me', true);
260
+
261
+ return me;
262
+ }
263
+
264
+ /**
265
+ * Attempt to login with default credentials. Note: I think that this may actually be outdated since we don't use these default credentials anymore on setup.
266
+ */
267
+ export async function tryInitialSetup(store, password = 'admin') {
268
+ try {
269
+ const res = await store.dispatch('auth/login', {
270
+ provider: 'local',
271
+ body: {
272
+ username: 'admin',
273
+ password
274
+ },
275
+ });
276
+
277
+ return res._status === 200;
278
+ } catch (e) {
279
+ console.error('Error trying initial setup', e); // eslint-disable-line no-console
280
+
281
+ return false;
282
+ }
283
+ }
284
+
285
+ /**
286
+ * Record in our state management that we're indeed logged in
287
+ */
288
+ export function isLoggedIn(store, me) {
289
+ store.commit('auth/hasAuth', true);
290
+ store.commit('auth/loggedInAs', me.id);
291
+ }
292
+
293
+ /**
294
+ * Record in our state management that we're not logged in and then redirect to the login page
295
+ */
296
+ export function notLoggedIn(store, redirect, route) {
297
+ store.commit('auth/hasAuth', true);
298
+
299
+ if ( route.name === 'index' ) {
300
+ return redirect('/auth/login');
301
+ } else {
302
+ return redirect(`/auth/login?${ TIMED_OUT }`);
303
+ }
304
+ }
305
+
306
+ /**
307
+ * Record in our state management that we don't have any auth providers
308
+ */
309
+ export function noAuth(store) {
310
+ store.commit('auth/hasAuth', false);
311
+ }
package/utils/axios.js CHANGED
@@ -75,10 +75,6 @@ const createAxiosInstance = (axiosOptions) => {
75
75
  };
76
76
 
77
77
  const setupProgress = (axios) => {
78
- if (process.server) {
79
- return;
80
- }
81
-
82
78
  // A noop loading inteterface for when $nuxt is not yet ready
83
79
  const noopLoading = {
84
80
  finish: () => { },
@@ -88,9 +84,9 @@ const setupProgress = (axios) => {
88
84
  };
89
85
 
90
86
  const $loading = () => {
91
- const $nuxt = typeof window !== 'undefined' && window['$nuxt'];
87
+ const $globalApp = window.$globalApp;
92
88
 
93
- return ($nuxt && $nuxt.$loading && $nuxt.$loading.set) ? $nuxt.$loading : noopLoading;
89
+ return ($globalApp && $globalApp.$loading && $globalApp.$loading.set) ? $globalApp.$loading : noopLoading;
94
90
  };
95
91
 
96
92
  let currentRequests = 0;
@@ -167,21 +163,6 @@ export default (ctx, inject) => {
167
163
  headers
168
164
  };
169
165
 
170
- // Proxy SSR request headers headers
171
- if (process.server && ctx.req && ctx.req.headers) {
172
- const reqHeaders = { ...ctx.req.headers };
173
-
174
- for (const h of ['accept', 'host', 'cf-ray', 'cf-connecting-ip', 'content-length', 'content-md5', 'content-type']) {
175
- delete reqHeaders[h];
176
- }
177
- axiosOptions.headers.common = { ...reqHeaders, ...axiosOptions.headers.common };
178
- }
179
-
180
- if (process.server) {
181
- // Don't accept brotli encoding because Node can't parse it
182
- axiosOptions.headers.common['accept-encoding'] = 'gzip, deflate';
183
- }
184
-
185
166
  const axios = createAxiosInstance(axiosOptions);
186
167
 
187
168
  // Inject axios to the context as $axios
package/utils/azure.js ADDED
@@ -0,0 +1,24 @@
1
+ const AZURE_ERROR_MSG_REGEX = /^.*Message=\"(.*)\"$/;
2
+ const AZURE_ERROR_JSON_REGEX = /^.*Response body: ({.*})/;
3
+
4
+ export const parseAzureError = (err) => {
5
+ // Try and parse the response from Azure a couple of ways
6
+ const msgMatch = err.match(AZURE_ERROR_MSG_REGEX);
7
+
8
+ if (msgMatch?.length === 2) {
9
+ return msgMatch[1];
10
+ } else {
11
+ const jsonMatch = err.match(AZURE_ERROR_JSON_REGEX);
12
+
13
+ if (jsonMatch?.length === 2) {
14
+ try {
15
+ const errorObj = JSON.parse(jsonMatch[1]);
16
+
17
+ return errorObj.error_description;
18
+ } catch (e) {}
19
+ }
20
+ }
21
+
22
+ // Can't parse error
23
+ return false;
24
+ };
@@ -0,0 +1,103 @@
1
+ /**
2
+ *
3
+ * Helper utilities for the fixed banners that can be configured to show on pages
4
+ *
5
+ */
6
+
7
+ import { MANAGEMENT } from '@shell/config/types';
8
+ import { SETTING } from '@shell/config/settings';
9
+
10
+ const BANNER_HEADER = 'bannerHeader';
11
+ const BANNER_FOOTER = 'bannerFooter';
12
+ const BANNER_LOGIN = 'bannerConsent';
13
+
14
+ const INDIVIDUAL_BANNERS = {
15
+ 'ui-banner-header': BANNER_HEADER,
16
+ 'ui-banner-footer': BANNER_FOOTER,
17
+ 'ui-banner-login-consent': BANNER_LOGIN,
18
+ };
19
+
20
+ const BANNER_SHOW_KEY_MAP = {
21
+ [BANNER_HEADER]: 'showHeader',
22
+ [BANNER_FOOTER]: 'showFooter',
23
+ [BANNER_LOGIN]: 'showConsent',
24
+ };
25
+
26
+ /**
27
+ * Get the individual banner settings
28
+ */
29
+ export function getIndividualBanners(store) {
30
+ const banners = {};
31
+
32
+ // Go through all settings looking for the individual settings
33
+ const allSettings = store.getters['management/all'](MANAGEMENT.SETTING);
34
+
35
+ allSettings.forEach((setting) => {
36
+ if (setting.value && !!INDIVIDUAL_BANNERS[setting.id]) {
37
+ const settingId = INDIVIDUAL_BANNERS[setting.id];
38
+
39
+ banners[settingId] = setting;
40
+ }
41
+ });
42
+
43
+ return banners;
44
+ }
45
+
46
+ /**
47
+ * Overlay settings from the individual banner settings onto the single banner setting
48
+ */
49
+ export function overlayIndividualBanners(parsedBanner, banners) {
50
+ Object.keys(banners).forEach((id) => {
51
+ try {
52
+ const parsedIndividualBanner = JSON.parse(banners[id].value);
53
+ const shownID = BANNER_SHOW_KEY_MAP[id];
54
+
55
+ parsedBanner[id] = parsedIndividualBanner;
56
+ parsedBanner[shownID] = 'true'; // If there is an individual banner setting, then banner is shown
57
+ } catch {}
58
+ });
59
+ }
60
+
61
+ /**
62
+ * Converts a pixel value to an em value based on the default font size.
63
+ * @param {number} elementFontSize - The font size of the element in pixels.
64
+ * @param {number} [defaultFontSize=14] - The default font size in pixels.
65
+ * @returns {string} The converted value in em units.
66
+ */
67
+ function pxToEm(elementFontSize, defaultFontSize = 14) {
68
+ const lineHeightInPx = 2 * parseInt(elementFontSize);
69
+ const lineHeightInEm = lineHeightInPx / defaultFontSize;
70
+
71
+ return `${ lineHeightInEm }em`;
72
+ }
73
+
74
+ /**
75
+ * Get banner font sizes - used to add margins when header and footer banners are present
76
+ **/
77
+ export function getGlobalBannerFontSizes(store) {
78
+ const settings = store.getters['management/all'](MANAGEMENT.SETTING);
79
+ const bannerSettings = settings?.find((s) => s.id === SETTING.BANNERS);
80
+ const individualBannerSettings = getIndividualBanners(store);
81
+
82
+ if (bannerSettings) {
83
+ const parsed = JSON.parse(bannerSettings.value);
84
+
85
+ overlayIndividualBanners(parsed, individualBannerSettings);
86
+
87
+ const {
88
+ showFooter, showHeader, bannerFooter, bannerHeader, banner
89
+ } = parsed;
90
+
91
+ // add defaults to accommodate older JSON structures for banner definitions without breaking the UI
92
+ // https://github.com/rancher/dashboard/issues/10140
93
+ const bannerHeaderFontSize = bannerHeader?.fontSize || banner?.fontSize || '14px';
94
+ const bannerFooterFontSize = bannerFooter?.fontSize || banner?.fontSize || '14px';
95
+
96
+ return {
97
+ headerFont: showHeader === 'true' ? pxToEm(bannerHeaderFontSize) : '0px',
98
+ footerFont: showFooter === 'true' ? pxToEm(bannerFooterFontSize) : '0px'
99
+ };
100
+ }
101
+
102
+ return undefined;
103
+ }
@@ -0,0 +1,5 @@
1
+ import * as Clipboard from 'clipboard-polyfill';
2
+
3
+ export async function copyTextToClipboard(text) {
4
+ await Clipboard.writeText(text);
5
+ }
package/utils/cluster.js CHANGED
@@ -85,7 +85,7 @@ export function abbreviateClusterName(input) {
85
85
  break;
86
86
  }
87
87
  default:
88
- result = segments.slice(0, 3).map((segment) => segment[0]).join('');
88
+ result = segments.slice(0, 2).map((segment) => segment[0]).join('') + segments.slice(-1)[0].slice(-1);
89
89
  }
90
90
 
91
91
  return result;
@@ -0,0 +1,4 @@
1
+ export default (context, inject) => {
2
+ // eslint-disable-next-line no-undef
3
+ inject('config', { rancherEnv: process.env.rancherEnv, dashboardVersion: process.env.version });
4
+ };
@@ -2,6 +2,7 @@ import { indent as _indent } from '@shell/utils/string';
2
2
  import { addObject, findBy, removeObject, removeObjects } from '@shell/utils/array';
3
3
  import jsyaml from 'js-yaml';
4
4
  import { cleanUp, isEmpty } from '@shell/utils/object';
5
+ import { parseType } from '@shell/models/schema';
5
6
 
6
7
  export const SIMPLE_TYPES = [
7
8
  'string',
@@ -32,7 +33,6 @@ const ALWAYS_ADD = [
32
33
  ];
33
34
 
34
35
  export const NEVER_ADD = [
35
- 'metadata.clusterName',
36
36
  'metadata.clusterName',
37
37
  'metadata.creationTimestamp',
38
38
  'metadata.deletionGracePeriodSeconds',
@@ -46,11 +46,16 @@ export const NEVER_ADD = [
46
46
  'metadata.resourceVersion',
47
47
  'metadata.relationships',
48
48
  'metadata.selfLink',
49
+ 'metadata.state',
49
50
  'metadata.uid',
50
51
  // CRD -> Schema describes the schema used for validation, pruning, and defaulting of this version of the custom resource. If we allow processing we fall into inf loop on openAPIV3Schema.allOf which contains a cyclical ref of allOf props.
51
52
  'spec.versions.schema',
52
53
  'status',
53
54
  'stringData',
55
+ 'links',
56
+ '_name',
57
+ '_labels',
58
+ '_annotations',
54
59
  ];
55
60
 
56
61
  export const ACTIVELY_REMOVE = [
@@ -83,26 +88,47 @@ export function createYaml(
83
88
  depth = 0,
84
89
  path = '',
85
90
  rootType = null,
86
- dataOptions = {}
91
+ dataOptions = {},
87
92
  ) {
88
- const schema = findBy(schemas, 'id', type);
93
+ data = data || {};
89
94
 
90
- if ( !rootType ) {
91
- rootType = type;
92
- }
95
+ let schema, rootSchema, schemaDefinitions, schemaResourceFields;
93
96
 
94
- if ( !schema ) {
95
- return `Error loading schema for ${ type }`;
96
- }
97
+ if (depth === 0) {
98
+ // `type` is a schema id
99
+ schema = findBy(schemas, 'id', type);
97
100
 
98
- data = data || {};
101
+ if ( !schema ) { // schema is only needed at the root level.
102
+ return `Error loading schema for ${ type }`;
103
+ }
104
+
105
+ rootSchema = schema;
106
+
107
+ schemaDefinitions = rootSchema.schemaDefinitions;
108
+ schemaResourceFields = rootSchema.resourceFields;
99
109
 
100
- if ( depth === 0 ) {
101
110
  const attr = schema.attributes || {};
102
111
 
103
112
  // Default to data.apiVersion/kind to accommodate spoofed types that aggregate multiple types
104
113
  data.apiVersion = (attr.group ? `${ attr.group }/${ attr.version }` : attr.version) || data.apiVersion;
105
114
  data.kind = attr.kind || data.kind;
115
+ } else {
116
+ rootSchema = findBy(schemas, 'id', rootType);
117
+
118
+ if (rootSchema.requiresResourceFields) { // See `requiresResourceFields` definition
119
+ schemaDefinitions = rootSchema.schemaDefinitions;
120
+ schemaResourceFields = schemaDefinitions[type]?.resourceFields;
121
+ } else {
122
+ schema = findBy(schemas, 'id', type);
123
+ if ( !schema ) { // schema is only needed at the root level.
124
+ return `Error loading schema for ${ type }`;
125
+ }
126
+ schemaResourceFields = schema.resourceFields;
127
+ }
128
+ }
129
+
130
+ if ( !rootType ) {
131
+ rootType = type;
106
132
  }
107
133
 
108
134
  const regularFields = [];
@@ -127,14 +153,14 @@ export function createYaml(
127
153
  const key = parts[parts.length - 1];
128
154
  const prefix = parts.slice(0, -1).join('.');
129
155
 
130
- if ( prefix === path && schema.resourceFields && schema.resourceFields[key] ) {
156
+ if ( prefix === path && schemaResourceFields && schemaResourceFields[key] ) {
131
157
  addObject(regularFields, key);
132
158
  }
133
159
  }
134
160
  }
135
161
 
136
162
  // Include all fields in schema's resourceFields as comments
137
- const commentFields = Object.keys(schema.resourceFields || {});
163
+ const commentFields = Object.keys(schemaResourceFields || {});
138
164
 
139
165
  commentFields.forEach((key) => {
140
166
  if ( typeof data[key] !== 'undefined' || (depth === 0 && key === '_type') ) {
@@ -166,7 +192,7 @@ export function createYaml(
166
192
  const key = parts[parts.length - 1];
167
193
  const prefix = parts.slice(0, -1).join('.');
168
194
 
169
- if ( prefix === path && schema.resourceFields && schema.resourceFields[key] ) {
195
+ if ( prefix === path && schemaResourceFields && schemaResourceFields[key] ) {
170
196
  removeObject(commentFields, key);
171
197
  }
172
198
  }
@@ -178,8 +204,6 @@ export function createYaml(
178
204
  const comments = commentFields.map((k) => {
179
205
  // Don't add a namespace comment for types that aren't namespaced.
180
206
  if ( path === 'metadata' && k === 'namespace' ) {
181
- const rootSchema = findBy(schemas, 'id', rootType);
182
-
183
207
  if ( rootSchema && !rootSchema.attributes?.namespaced ) {
184
208
  return null;
185
209
  }
@@ -198,7 +222,7 @@ export function createYaml(
198
222
  // ---------------
199
223
 
200
224
  function stringifyField(key) {
201
- const field = schema.resourceFields?.[key];
225
+ const field = schemaResourceFields?.[key];
202
226
  let out = `${ key }:`;
203
227
 
204
228
  // '_type' in steve maps to kubernetes 'type' field; show 'type' field in yaml
@@ -229,8 +253,8 @@ export function createYaml(
229
253
  }
230
254
 
231
255
  const type = typeMunge(field.type);
232
- const mapOf = typeRef('map', type);
233
- const arrayOf = typeRef('array', type);
256
+ const mapOf = typeRef('map', type, field);
257
+ const arrayOf = typeRef('array', type, field);
234
258
  const referenceTo = typeRef('reference', type);
235
259
 
236
260
  // type == map[mapOf]
@@ -250,7 +274,7 @@ export function createYaml(
250
274
  if ( SIMPLE_TYPES.includes(mapOf) ) {
251
275
  out += `# key: ${ mapOf }`;
252
276
  } else {
253
- // If not a simple type ie some sort of object/array, recusively build out commented fields (note data = null here) per the type's (mapOf's) schema
277
+ // If not a simple type ie some sort of object/array, recursively build out commented fields (note data = null here) per the type's (mapOf's) schema
254
278
  const chunk = createYaml(schemas, mapOf, null, processAlwaysAdd, depth + 1, (path ? `${ path }.${ key }` : key), rootType, dataOptions);
255
279
  let indented = indent(chunk);
256
280
 
@@ -275,7 +299,7 @@ export function createYaml(
275
299
  out += `\n${ indent(parsedData.trim()) }`;
276
300
  }
277
301
  } catch (e) {
278
- console.error(`Error: Unale to parse array data for yaml of type: ${ type }`, e); // eslint-disable-line no-console
302
+ console.error(`Error: Unable to parse array data for yaml of type: ${ type }`, e); // eslint-disable-line no-console
279
303
  }
280
304
  }
281
305
 
@@ -331,7 +355,7 @@ export function createYaml(
331
355
  }
332
356
  }
333
357
 
334
- const subDef = findBy(schemas, 'id', type);
358
+ const subDef = schemaDefinitions?.[type] || findBy(schemas, 'id', type);
335
359
 
336
360
  if ( subDef) {
337
361
  let chunk;
@@ -407,12 +431,19 @@ function getBlockIndentation(blockHeader) {
407
431
  return indentation?.[0] || '';
408
432
  }
409
433
 
410
- export function typeRef(type, str) {
411
- const re = new RegExp(`^${ type }\\[(.*)\\]$`);
412
- const match = str.match(re);
434
+ /**
435
+ * Check for a specific type and if valid return it's sub type or self
436
+ * @param {string} type required type
437
+ * @param {string} str actual type
438
+ * @param {ResourceField} field resourceField entry to the actual type
439
+ *
440
+ * @returns the sub type, or if not found the type
441
+ */
442
+ export function typeRef(type, str, field = null) {
443
+ const [foundType, foundSubType] = parseType(str, field);
413
444
 
414
- if ( match ) {
415
- return typeMunge(match[1]);
445
+ if (type === foundType) {
446
+ return typeMunge(foundSubType || foundType);
416
447
  }
417
448
  }
418
449
 
@@ -456,7 +487,7 @@ export function saferDump(obj) {
456
487
  *
457
488
  * @returns the result of jsyaml.dump with the addition of multiline indicators
458
489
  */
459
- export function dumpBlock(data, options = {}) {
490
+ export function dumpBlock(data, options = { lineWidth: -1 }) {
460
491
  const parsed = jsyaml.dump(data, options);
461
492
 
462
493
  let out = parsed;
@@ -8,7 +8,6 @@ import { cronSchedule } from '@shell/utils/validators/cron-schedule';
8
8
  import { podAffinity } from '@shell/utils/validators/pod-affinity';
9
9
  import { roleTemplateRules } from '@shell/utils/validators/role-template';
10
10
  import { clusterName } from '@shell/utils/validators/cluster-name';
11
- import { isHttps } from '@shell/utils/validators/setting';
12
11
 
13
12
  /**
14
13
  * Custom validation functions beyond normal scalr types
@@ -30,5 +29,4 @@ export default {
30
29
  cronSchedule,
31
30
  podAffinity,
32
31
  roleTemplateRules,
33
- isHttps,
34
32
  };
package/utils/error.js CHANGED
@@ -1,9 +1,24 @@
1
1
  import { isArray } from '@shell/utils/array';
2
2
 
3
3
  export class ClusterNotFoundError extends Error {
4
+ static name = 'ClusterNotFoundError'
5
+
4
6
  constructor(message) {
5
7
  super(message);
6
- this.name = 'ClusterNotFoundError';
8
+ this.name = ClusterNotFoundError.name;
9
+ }
10
+ }
11
+
12
+ /**
13
+ * An error occurred and the user should be redirected to a certain location (where this is handled)
14
+ */
15
+ export class RedirectToError extends Error {
16
+ static name = 'RedirectToError'
17
+
18
+ constructor(message, url) {
19
+ super(message);
20
+ this.url = url;
21
+ this.name = RedirectToError.name;
7
22
  }
8
23
  }
9
24
 
@@ -89,3 +104,28 @@ export function exceptionToErrorsArray(err) {
89
104
  return [err];
90
105
  }
91
106
  }
107
+
108
+ /**
109
+ * Imported from path-to-regexp
110
+ * @param {*} err
111
+ * @returns
112
+ */
113
+ export const normalizeError = (err) => {
114
+ let message;
115
+
116
+ if (!(err.message || typeof err === 'string')) {
117
+ try {
118
+ message = JSON.stringify(err, null, 2);
119
+ } catch (e) {
120
+ message = `[${ err.constructor.name }]`;
121
+ }
122
+ } else {
123
+ message = err.message || err;
124
+ }
125
+
126
+ return {
127
+ ...err,
128
+ message,
129
+ statusCode: (err.statusCode || err.status || (err.response && err.response.status) || 500)
130
+ };
131
+ };
@@ -2,10 +2,12 @@
2
2
  import { SECRET_TYPES } from '@shell/config/secret';
3
3
 
4
4
  export function formatEncryptionSecretNames(secrets, chartNamespace) {
5
- return secrets.filter(
6
- (secret) => (secret.data || {})['encryption-provider-config.yaml'] &&
5
+ return secrets
6
+ .filter((secret) => (secret.data || {})['encryption-provider-config.yaml'] &&
7
7
  secret.metadata.namespace === chartNamespace &&
8
8
  !secret.metadata?.state?.error &&
9
9
  secret._type === SECRET_TYPES.OPAQUE
10
- ).map((secret) => secret.metadata.name).sort();
10
+ )
11
+ .map((secret) => secret.metadata.name)
12
+ .sort();
11
13
  }
package/utils/git.ts CHANGED
@@ -9,7 +9,7 @@ interface Repo {
9
9
  name: string,
10
10
  }
11
11
 
12
- interface Commit {
12
+ export interface Commit {
13
13
  message: string,
14
14
  htmlUrl: string,
15
15
  sha?: string,
@@ -26,7 +26,7 @@ export default function(product, chartName, defaultResourceOrRoute, install = tr
26
26
  } else if (install) {
27
27
  // The product is not installed, redirect to the details chart
28
28
 
29
- await store.dispatch('catalog/load', { force: true });
29
+ await store.dispatch('catalog/load');
30
30
 
31
31
  const chart = store.getters['catalog/chart']({ chartName });
32
32