@rancher/shell 0.5.3 → 2.0.0

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 (581) 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 +2 -0
  7. package/assets/styles/themes/_csp.scss +2 -2
  8. package/assets/styles/themes/_dark.scss +8 -2
  9. package/assets/styles/themes/_light.scss +2 -1
  10. package/assets/styles/themes/_suse.scss +1 -1
  11. package/assets/styles/vendor/vue-select.scss +5 -0
  12. package/assets/translations/en-us.yaml +296 -58
  13. package/assets/translations/zh-hans.yaml +5 -27
  14. package/babel.config.js +1 -1
  15. package/chart/__tests__/S3.test.ts +9 -2
  16. package/chart/monitoring/grafana/index.vue +6 -2
  17. package/chart/monitoring/prometheus/index.vue +2 -2
  18. package/chart/rancher-backup/S3.vue +11 -9
  19. package/chart/rancher-backup/index.vue +15 -5
  20. package/cloud-credential/__tests__/harvester.test.ts +18 -0
  21. package/cloud-credential/generic.vue +18 -9
  22. package/cloud-credential/harvester.vue +11 -3
  23. package/components/AppModal.vue +167 -0
  24. package/components/AssignTo.vue +7 -4
  25. package/components/AsyncButton.vue +18 -5
  26. package/components/BackLink.vue +4 -4
  27. package/components/BannerGraphic.vue +1 -0
  28. package/components/BrandImage.vue +47 -1
  29. package/components/Carousel.vue +14 -8
  30. package/components/Certificates.vue +8 -11
  31. package/components/ClusterBadge.vue +12 -3
  32. package/components/ClusterIconMenu.vue +44 -16
  33. package/components/ClusterProviderIcon.vue +14 -3
  34. package/components/CodeMirror.vue +73 -38
  35. package/components/CommunityLinks.vue +12 -8
  36. package/components/CreateDriver.vue +81 -0
  37. package/components/CruResource.vue +51 -27
  38. package/components/DetailTop.vue +2 -2
  39. package/components/Dialog.vue +6 -5
  40. package/components/DisableAuthProviderModal.vue +14 -8
  41. package/components/DraggableZone.vue +2 -2
  42. package/components/ExplorerMembers.vue +3 -3
  43. package/components/ExplorerProjectsNamespaces.vue +6 -6
  44. package/components/FixedBanner.vue +47 -36
  45. package/components/GlobalRoleBindings.vue +26 -0
  46. package/components/Import.vue +10 -6
  47. package/components/Inactivity.vue +1 -5
  48. package/components/KeyValueView.vue +14 -10
  49. package/components/MessageLink.vue +2 -2
  50. package/components/ModalWithCard.vue +5 -8
  51. package/components/MoveModal.vue +35 -33
  52. package/components/PodSecurityAdmission.vue +3 -3
  53. package/components/PromptChangePassword.vue +33 -33
  54. package/components/PromptModal.vue +11 -21
  55. package/components/PromptRemove.vue +11 -17
  56. package/components/PromptRestore.vue +18 -16
  57. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  58. package/components/Questions/__tests__/Float.test.ts +9 -19
  59. package/components/Questions/__tests__/Int.test.ts +9 -19
  60. package/components/Questions/__tests__/String.test.ts +9 -19
  61. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  62. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  63. package/components/Questions/index.vue +18 -2
  64. package/components/ResourceCancelModal.vue +34 -29
  65. package/components/ResourceDetail/Masthead.vue +23 -7
  66. package/components/ResourceDetail/index.vue +5 -0
  67. package/components/ResourceList/Masthead.vue +28 -10
  68. package/components/ResourceList/index.vue +65 -14
  69. package/components/ResourceTable.vue +73 -19
  70. package/components/ResourceYaml.vue +1 -0
  71. package/components/SelectIconGrid.vue +3 -3
  72. package/components/SideNav.vue +15 -37
  73. package/components/SingleClusterInfo.vue +4 -4
  74. package/components/SortableTable/THead.vue +26 -12
  75. package/components/SortableTable/filtering.js +9 -1
  76. package/components/SortableTable/grouping.js +8 -1
  77. package/components/SortableTable/index.vue +142 -42
  78. package/components/SortableTable/paging.js +36 -7
  79. package/components/SortableTable/selection.js +2 -1
  80. package/components/SortableTable/sorting.js +24 -7
  81. package/components/TabTitle.vue +84 -0
  82. package/components/Tabbed/index.vue +6 -1
  83. package/components/TableDataUserIcon.vue +47 -0
  84. package/components/TypeDescription.vue +1 -0
  85. package/components/Wizard.vue +1 -0
  86. package/components/__tests__/AppModal.test.ts +98 -0
  87. package/components/__tests__/AsyncButton.test.ts +1 -3
  88. package/components/__tests__/BackLink.test.ts +1 -1
  89. package/components/__tests__/ButtonGroup.test.ts +3 -6
  90. package/components/__tests__/Carousel.test.ts +43 -0
  91. package/components/__tests__/Certificates.test.ts +29 -0
  92. package/components/__tests__/{CodeMirror.spec.ts → CodeMirror.test.ts} +5 -17
  93. package/components/__tests__/CruResource.test.ts +10 -9
  94. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  95. package/components/__tests__/FixedBanner.test.ts +5 -20
  96. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  97. package/components/__tests__/TabTitle.test.ts +129 -0
  98. package/components/auth/AzureWarning.vue +2 -2
  99. package/components/auth/RoleDetailEdit.vue +10 -0
  100. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  101. package/components/auth/login/oidc.vue +7 -1
  102. package/components/fleet/FleetClusters.vue +9 -9
  103. package/components/fleet/FleetIntro.vue +11 -17
  104. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  105. package/components/fleet/FleetRepos.vue +1 -0
  106. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  107. package/components/form/ArrayList.vue +30 -19
  108. package/components/form/ArrayListSelect.vue +9 -4
  109. package/components/form/ClusterAppearance.vue +132 -0
  110. package/components/form/ColorInput.vue +1 -0
  111. package/components/form/Error.vue +3 -3
  112. package/components/form/Footer.vue +2 -2
  113. package/components/form/GitPicker.vue +83 -38
  114. package/components/form/KeyValue.vue +67 -48
  115. package/components/form/LabeledSelect.vue +143 -43
  116. package/components/form/Labels.vue +3 -1
  117. package/components/form/NameNsDescription.vue +26 -9
  118. package/components/form/ResourceLabeledSelect.vue +187 -0
  119. package/components/form/ResourceTabs/index.vue +31 -15
  120. package/components/form/SecretSelector.vue +93 -18
  121. package/components/form/Select.vue +1 -1
  122. package/components/form/SelectOrCreateAuthSecret.vue +135 -62
  123. package/components/form/SimpleSecretSelector.vue +88 -28
  124. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  125. package/components/form/__tests__/KeyValue.test.ts +121 -12
  126. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  127. package/components/form/__tests__/NameNsDescription.test.ts +25 -15
  128. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  129. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  130. package/components/formatter/AppSummaryGraph.vue +2 -2
  131. package/components/formatter/CloudCredPublicData.vue +30 -0
  132. package/components/formatter/ClusterLink.vue +2 -2
  133. package/components/formatter/FleetSummaryGraph.vue +2 -1
  134. package/components/formatter/ImagePercentageBar.vue +0 -4
  135. package/components/formatter/IngressTarget.vue +18 -7
  136. package/components/formatter/Link.vue +2 -2
  137. package/components/formatter/LinkDetail.vue +2 -2
  138. package/components/formatter/LinkDetailImage.vue +2 -2
  139. package/components/formatter/LinkName.vue +2 -2
  140. package/components/formatter/LiveDate.vue +16 -0
  141. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  142. package/components/formatter/SecretType.vue +2 -2
  143. package/components/formatter/VirtualServiceGateways.vue +2 -2
  144. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  145. package/components/nav/Group.vue +7 -5
  146. package/components/nav/Header.vue +82 -43
  147. package/components/nav/NamespaceFilter.vue +8 -1
  148. package/components/nav/TopLevelMenu.vue +336 -125
  149. package/components/nav/Type.vue +58 -102
  150. package/components/nav/__tests__/TopLevelMenu.test.ts +370 -9
  151. package/components/nav/__tests__/Type.test.ts +321 -126
  152. package/components/nuxt/nuxt-child.js +0 -5
  153. package/components/nuxt/nuxt-error.vue +1 -1
  154. package/components/nuxt/nuxt-link.client.js +13 -95
  155. package/components/templates/default.vue +3 -3
  156. package/components/templates/error.vue +6 -10
  157. package/components/templates/standalone.vue +0 -4
  158. package/components/templates/unauthenticated.vue +1 -2
  159. package/components/user.retention/user-retention-header.vue +34 -0
  160. package/composables/useCompactInput.test.ts +36 -0
  161. package/composables/useCompactInput.ts +2 -2
  162. package/composables/useI18n.ts +26 -0
  163. package/composables/useLabeledFormElement.test.ts +135 -0
  164. package/composables/useStore.ts +16 -0
  165. package/config/home-links.js +32 -1
  166. package/config/labels-annotations.js +2 -1
  167. package/config/middleware.js +0 -6
  168. package/config/pagination-table-headers.js +57 -0
  169. package/config/pod-security-admission.ts +1 -1
  170. package/config/private-label.js +1 -3
  171. package/config/product/auth.js +1 -0
  172. package/config/product/explorer.js +167 -46
  173. package/config/product/legacy.js +3 -95
  174. package/config/product/manager.js +44 -11
  175. package/config/query-params.js +1 -0
  176. package/config/roles.ts +23 -0
  177. package/config/router/index.js +23 -0
  178. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  179. package/config/router/navigation-guards/authentication.js +63 -0
  180. package/config/router/navigation-guards/index.js +15 -0
  181. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  182. package/config/router/routes.js +487 -0
  183. package/config/settings.ts +38 -2
  184. package/config/store.js +7 -3
  185. package/config/table-headers.js +46 -1
  186. package/config/types.js +36 -16
  187. package/config/uiplugins.js +10 -5
  188. package/core/plugin-helpers.js +1 -1
  189. package/core/plugin.ts +2 -1
  190. package/core/plugins.js +289 -282
  191. package/creators/app/files/.eslintignore +0 -2
  192. package/creators/app/files/.vscode/settings.json +0 -1
  193. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  194. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  195. package/creators/pkg/init +32 -0
  196. package/detail/__tests__/service.test.ts +62 -0
  197. package/detail/catalog.cattle.io.app.vue +1 -1
  198. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  199. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  200. package/detail/namespace.vue +2 -2
  201. package/detail/networking.k8s.io.ingress.vue +52 -19
  202. package/detail/node.vue +20 -43
  203. package/detail/pod.vue +1 -68
  204. package/detail/provisioning.cattle.io.cluster.vue +2 -1
  205. package/detail/service.vue +1 -1
  206. package/detail/workload/index.vue +2 -15
  207. package/dialog/AddCustomBadgeDialog.vue +318 -161
  208. package/dialog/DeactivateDriverDialog.vue +118 -0
  209. package/dialog/RollbackWorkloadDialog.vue +2 -2
  210. package/dialog/RotateCertificatesDialog.vue +0 -21
  211. package/directives/clean-html.js +15 -0
  212. package/directives/clean-tooltip.js +32 -0
  213. package/directives/focus.js +41 -0
  214. package/directives/int-number.js +21 -0
  215. package/directives/positive-int-number.js +19 -0
  216. package/directives/trim-whitespace.js +19 -0
  217. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  218. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  219. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  220. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  221. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  222. package/edit/__tests__/nodeDriver.test.ts +107 -0
  223. package/edit/__tests__/service.test.ts +1 -5
  224. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  225. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  226. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  227. package/edit/auth/__tests__/azuread.test.ts +241 -0
  228. package/edit/auth/__tests__/oidc.test.ts +137 -0
  229. package/edit/auth/azuread.vue +133 -31
  230. package/edit/auth/github.vue +5 -17
  231. package/edit/auth/googleoauth.vue +5 -18
  232. package/edit/auth/ldap/index.vue +5 -17
  233. package/edit/auth/oidc.vue +143 -42
  234. package/edit/auth/saml.vue +5 -14
  235. package/edit/catalog.cattle.io.clusterrepo.vue +175 -20
  236. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  237. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  238. package/edit/cloudcredential.vue +26 -4
  239. package/edit/configmap.vue +10 -4
  240. package/edit/fleet.cattle.io.gitrepo.vue +7 -4
  241. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  242. package/edit/kontainerDriver.vue +65 -0
  243. package/edit/logging-flow/Match.vue +10 -9
  244. package/edit/logging-flow/index.vue +4 -19
  245. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  246. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  247. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  248. package/edit/management.cattle.io.project.vue +2 -1
  249. package/edit/management.cattle.io.setting.vue +20 -0
  250. package/edit/management.cattle.io.user.vue +2 -1
  251. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  252. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  253. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +1 -0
  254. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +3 -0
  255. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +2 -0
  256. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  257. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  258. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  259. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  260. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  261. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  262. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +45 -6
  263. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/selectors.test.ts +1 -1
  264. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  265. package/edit/nodeDriver.vue +65 -0
  266. package/edit/persistentvolume/index.vue +2 -2
  267. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +18 -9
  268. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +165 -1
  269. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +1 -1
  270. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +0 -3
  271. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  272. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +70 -12
  273. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +5 -0
  274. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  275. package/edit/provisioning.cattle.io.cluster/index.vue +21 -15
  276. package/edit/provisioning.cattle.io.cluster/rke2.vue +185 -114
  277. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +67 -7
  278. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +19 -6
  279. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  280. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +7 -0
  281. package/edit/provisioning.cattle.io.cluster/tabs/etcd/S3Config.vue +1 -0
  282. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +1 -0
  283. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +3 -0
  284. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +1 -0
  285. package/edit/resources.cattle.io.backup.vue +139 -124
  286. package/edit/resources.cattle.io.restore.vue +146 -126
  287. package/edit/service.vue +1 -0
  288. package/edit/serviceaccount.vue +46 -4
  289. package/edit/workload/__tests__/Job.test.ts +1 -3
  290. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  291. package/edit/workload/mixins/workload.js +34 -1
  292. package/edit/workload/storage/emptyDir.vue +2 -2
  293. package/initialize/App.vue +75 -0
  294. package/initialize/app-extended.js +128 -0
  295. package/initialize/entry-helpers.js +549 -0
  296. package/initialize/entry.js +32 -0
  297. package/initialize/install-components.js +23 -0
  298. package/initialize/install-directives.js +59 -0
  299. package/initialize/install-plugins.js +123 -0
  300. package/list/__tests__/workload.test.ts +1 -1
  301. package/list/cis.cattle.io.clusterscan.vue +16 -10
  302. package/list/group.principal.vue +2 -2
  303. package/list/management.cattle.io.feature.vue +11 -7
  304. package/list/management.cattle.io.user.vue +36 -3
  305. package/list/networking.k8s.io.ingress.vue +36 -0
  306. package/list/node.vue +211 -73
  307. package/list/provisioning.cattle.io.cluster.vue +17 -4
  308. package/list/ui.cattle.io.navlink.vue +2 -2
  309. package/list/workload.vue +22 -0
  310. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  311. package/machine-config/__tests__/vmwarevsphere.test.ts +162 -59
  312. package/machine-config/amazonec2.vue +1 -1
  313. package/machine-config/azure.vue +38 -21
  314. package/machine-config/generic.vue +11 -15
  315. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  316. package/machine-config/vmwarevsphere.vue +20 -11
  317. package/middleware/authenticated.js +9 -361
  318. package/mixins/__tests__/chart.test.ts +48 -6
  319. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  320. package/mixins/auth-config.js +3 -2
  321. package/mixins/brand.js +75 -57
  322. package/mixins/chart.js +27 -13
  323. package/mixins/create-edit-view/index.js +2 -2
  324. package/mixins/fetch.client.js +42 -48
  325. package/mixins/labeled-form-element.ts +21 -1
  326. package/mixins/page-actions.js +7 -5
  327. package/mixins/resource-fetch-api-pagination.js +304 -0
  328. package/mixins/resource-fetch-namespaced.js +1 -1
  329. package/mixins/resource-fetch.js +46 -5
  330. package/models/__tests__/cluster.test.ts +44 -0
  331. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  332. package/models/__tests__/schema.tests.ts +24 -0
  333. package/models/__tests__/steve-schema.test.ts +73 -0
  334. package/models/__tests__/workload.test.ts +1 -1
  335. package/models/catalog.cattle.io.app.js +8 -0
  336. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  337. package/models/catalog.cattle.io.uiplugin.js +7 -8
  338. package/models/cis.cattle.io.clusterscan.js +29 -8
  339. package/models/cloudcredential.js +9 -1
  340. package/models/cluster/node.js +4 -0
  341. package/models/cluster/schema.js +6 -0
  342. package/models/cluster.js +33 -0
  343. package/models/driver.js +62 -0
  344. package/models/fleet.cattle.io.cluster.js +23 -11
  345. package/models/fleet.cattle.io.gitrepo.js +10 -0
  346. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  347. package/models/kontainerdriver.js +68 -0
  348. package/models/management/schema.js +6 -0
  349. package/models/management.cattle.io.authconfig.js +3 -2
  350. package/models/management.cattle.io.cluster.js +5 -4
  351. package/models/management.cattle.io.globalrole.js +2 -0
  352. package/models/management.cattle.io.user.js +67 -2
  353. package/models/monitoring.coreos.com.receiver.js +3 -1
  354. package/models/monitoring.coreos.com.route.js +1 -1
  355. package/models/networking.k8s.io.ingress.js +2 -1
  356. package/models/nodedriver.js +68 -0
  357. package/models/provisioning.cattle.io.cluster.js +34 -1
  358. package/models/schema.js +28 -7
  359. package/models/service.js +2 -0
  360. package/models/steve-schema.ts +254 -0
  361. package/models/workload.js +1 -0
  362. package/package.json +6 -5
  363. package/pages/about.vue +12 -5
  364. package/pages/account/index.vue +7 -2
  365. package/pages/auth/login.vue +106 -102
  366. package/pages/auth/logout.vue +2 -2
  367. package/pages/auth/setup.vue +57 -64
  368. package/pages/auth/verify.vue +17 -17
  369. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  370. package/pages/c/_cluster/apps/charts/index.vue +37 -13
  371. package/pages/c/_cluster/apps/charts/install.vue +4 -4
  372. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  373. package/pages/c/_cluster/auth/config/index.vue +15 -9
  374. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  375. package/pages/c/_cluster/auth/user.retention/index.vue +384 -0
  376. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  377. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  378. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  379. package/pages/c/_cluster/explorer/index.vue +231 -72
  380. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  381. package/pages/c/_cluster/explorer/tools/index.vue +12 -176
  382. package/pages/c/_cluster/fleet/index.vue +88 -93
  383. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  384. package/pages/c/_cluster/longhorn/index.vue +52 -17
  385. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  386. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  387. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  388. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +94 -0
  389. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  390. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  391. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +63 -0
  392. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  393. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  394. package/pages/c/_cluster/monitoring/index.vue +1 -17
  395. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  396. package/pages/c/_cluster/neuvector/index.vue +1 -0
  397. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  398. package/pages/c/_cluster/settings/banners.vue +86 -8
  399. package/pages/c/_cluster/settings/brand.vue +258 -36
  400. package/pages/c/_cluster/settings/index.vue +4 -4
  401. package/pages/c/_cluster/settings/links.vue +5 -3
  402. package/pages/c/_cluster/settings/performance.vue +71 -2
  403. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  404. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +10 -7
  405. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  406. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  407. package/pages/c/_cluster/uiplugins/InstallDialog.vue +53 -18
  408. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  409. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  410. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  411. package/pages/c/_cluster/uiplugins/index.vue +38 -52
  412. package/pages/diagnostic.vue +1 -0
  413. package/pages/fail-whale.vue +103 -41
  414. package/pages/home.vue +81 -24
  415. package/pages/prefs.vue +8 -3
  416. package/pages/support/index.vue +12 -2
  417. package/plugins/clean-html-directive.js +5 -12
  418. package/plugins/clean-tooltip-directive.js +6 -31
  419. package/plugins/codemirror.js +0 -9
  420. package/plugins/dashboard-store/__tests__/mutations.test.ts +296 -313
  421. package/plugins/dashboard-store/actions.js +140 -32
  422. package/plugins/dashboard-store/getters.js +86 -39
  423. package/plugins/dashboard-store/index.js +0 -99
  424. package/plugins/dashboard-store/mutations.js +150 -48
  425. package/plugins/dashboard-store/resource-class.js +14 -109
  426. package/plugins/directives.js +6 -39
  427. package/plugins/ember-cookie.js +13 -0
  428. package/plugins/global-formatters.js +26 -5
  429. package/plugins/i18n.js +90 -56
  430. package/plugins/int-number.js +6 -20
  431. package/plugins/plugin.js +3 -3
  432. package/plugins/positive-int-number.js +6 -17
  433. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +124 -31
  434. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  435. package/plugins/steve/__tests__/subscribe.spec.ts +109 -0
  436. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  437. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  438. package/plugins/steve/actions.js +0 -1
  439. package/plugins/steve/getters.js +183 -63
  440. package/plugins/steve/hybrid-class.js +5 -1
  441. package/plugins/steve/mutations.js +29 -5
  442. package/plugins/steve/norman-class.js +123 -2
  443. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  444. package/plugins/steve/schema.d.ts +22 -0
  445. package/plugins/steve/steve-pagination-utils.ts +368 -0
  446. package/plugins/steve/subscribe.js +37 -75
  447. package/plugins/trim-whitespace.js +6 -34
  448. package/plugins/vue-js-modal.js +1 -1
  449. package/public/index.html +1 -0
  450. package/rancher-components/Accordion/Accordion.vue +3 -2
  451. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  452. package/rancher-components/Banner/Banner.test.ts +1 -5
  453. package/rancher-components/Banner/Banner.vue +2 -2
  454. package/rancher-components/Card/Card.vue +4 -4
  455. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
  456. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  457. package/rancher-components/Form/LabeledInput/LabeledInput.vue +66 -30
  458. package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
  459. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  460. package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
  461. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  462. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  463. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  464. package/rancher-components/StringList/StringList.vue +8 -8
  465. package/rancher-components/components/Accordion/Accordion.vue +3 -2
  466. package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
  467. package/rancher-components/components/Banner/Banner.test.ts +1 -5
  468. package/rancher-components/components/Banner/Banner.vue +2 -2
  469. package/rancher-components/components/Card/Card.vue +4 -4
  470. package/rancher-components/components/Form/Checkbox/Checkbox.vue +4 -3
  471. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  472. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +66 -30
  473. package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -3
  474. package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
  475. package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
  476. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  477. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  478. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
  479. package/rancher-components/components/StringList/StringList.vue +8 -8
  480. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +27 -8
  481. package/scripts/clean +1 -1
  482. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  483. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  484. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  485. package/scripts/extension/helm/package/Dockerfile +1 -1
  486. package/scripts/extension/helm/scripts/patch +27 -0
  487. package/scripts/extension/publish +6 -6
  488. package/scripts/serve-pkgs +0 -2
  489. package/scripts/test-plugins-build.sh +6 -6
  490. package/scripts/vue-migrate.js +683 -0
  491. package/store/__tests__/catalog.test.ts +224 -0
  492. package/store/auth.js +23 -4
  493. package/store/aws.js +53 -6
  494. package/store/catalog.js +21 -5
  495. package/store/cru-resource.ts +26 -0
  496. package/store/customisation.js +35 -0
  497. package/store/features.js +6 -4
  498. package/store/index.js +132 -39
  499. package/store/plugins.js +8 -4
  500. package/store/type-map.js +143 -143
  501. package/store/type-map.utils.ts +226 -0
  502. package/tsconfig.json +0 -1
  503. package/tsconfig.paths.json +4 -1
  504. package/types/components/labeledSelect.ts +50 -0
  505. package/types/resources/settings.d.ts +32 -0
  506. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  507. package/types/shell/index.d.ts +996 -782
  508. package/types/store/dashboard-store.types.ts +42 -0
  509. package/types/store/pagination.types.ts +457 -0
  510. package/types/store/type-map.ts +30 -0
  511. package/types/store/vuex.d.ts +9 -0
  512. package/types/vue-shim.d.ts +51 -0
  513. package/utils/__tests__/cluster.test.ts +20 -18
  514. package/utils/__tests__/create-yaml.test.ts +359 -2
  515. package/utils/__tests__/kontainer.test.ts +92 -0
  516. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  517. package/utils/alertmanagerconfig.js +19 -0
  518. package/utils/array.ts +40 -1
  519. package/utils/async.ts +2 -0
  520. package/utils/auth.js +152 -4
  521. package/utils/axios.js +2 -2
  522. package/utils/banners.js +103 -0
  523. package/utils/cluster.js +1 -1
  524. package/utils/config.js +4 -0
  525. package/utils/create-yaml.js +54 -27
  526. package/utils/error.js +25 -0
  527. package/utils/formatter.js +5 -3
  528. package/utils/git.ts +1 -1
  529. package/utils/install-redirect.js +1 -1
  530. package/utils/kontainer.ts +186 -0
  531. package/utils/monitoring.js +2 -37
  532. package/utils/pagination-utils.ts +154 -0
  533. package/utils/pod-security-admission.ts +1 -1
  534. package/utils/router.js +86 -0
  535. package/utils/settings.ts +46 -0
  536. package/utils/socket.js +1 -0
  537. package/utils/time.js +1 -0
  538. package/utils/title.ts +3 -0
  539. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  540. package/utils/validators/formRules/__tests__/index.test.ts +21 -0
  541. package/utils/validators/formRules/index.ts +3 -0
  542. package/utils/validators/index.js +1 -0
  543. package/vue.config.js +376 -421
  544. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  545. package/chart/monitoring/steps/uninstall-v1.vue +0 -135
  546. package/components/EventsTable.vue +0 -67
  547. package/components/TabbedLinks/index.vue +0 -94
  548. package/components/nuxt/nuxt-link.server.js +0 -16
  549. package/components/nuxt/nuxt.js +0 -101
  550. package/config/router.js +0 -425
  551. package/initialize/App.js +0 -152
  552. package/initialize/client.js +0 -734
  553. package/initialize/index.js +0 -287
  554. package/middleware/i18n.js +0 -10
  555. package/middleware/unauthenticated.js +0 -22
  556. package/mixins/v1-workload-metrics.js +0 -43
  557. package/pages/c/_cluster/apps/index.vue +0 -15
  558. package/pages/c/_cluster/auth/index.vue +0 -17
  559. package/pages/c/_cluster/index.vue +0 -15
  560. package/pages/c/_cluster/legacy/index.vue +0 -22
  561. package/pages/c/_cluster/manager/index.vue +0 -22
  562. package/pages/c/_cluster/mcapps/index.vue +0 -21
  563. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  564. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  565. package/plugins/index.js +0 -11
  566. package/plugins/portal-vue.js +0 -4
  567. package/plugins/portal.js +0 -4
  568. package/plugins/resize.js +0 -5
  569. package/plugins/shortkey.js +0 -4
  570. package/plugins/tooltip.js +0 -4
  571. package/plugins/v-select.js +0 -4
  572. package/utils/group.js +0 -70
  573. package/utils/nuxt.js +0 -638
  574. package/utils/router.scrollBehavior.js +0 -78
  575. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  576. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  577. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  578. /package/plugins/steve/__tests__/{steve-class.spec.ts → steve-class.test.ts} +0 -0
  579. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  580. /package/rancher-components/components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  581. /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 !== 'genericoidc');
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
@@ -84,9 +84,9 @@ const setupProgress = (axios) => {
84
84
  };
85
85
 
86
86
  const $loading = () => {
87
- const $nuxt = typeof window !== 'undefined' && window['$nuxt'];
87
+ const $globalApp = window.$globalApp;
88
88
 
89
- return ($nuxt && $nuxt.$loading && $nuxt.$loading.set) ? $nuxt.$loading : noopLoading;
89
+ return ($globalApp && $globalApp.$loading && $globalApp.$loading.set) ? $globalApp.$loading : noopLoading;
90
90
  };
91
91
 
92
92
  let currentRequests = 0;
@@ -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
+ }
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',
@@ -87,26 +88,47 @@ export function createYaml(
87
88
  depth = 0,
88
89
  path = '',
89
90
  rootType = null,
90
- dataOptions = {}
91
+ dataOptions = {},
91
92
  ) {
92
- const schema = findBy(schemas, 'id', type);
93
+ data = data || {};
93
94
 
94
- if ( !rootType ) {
95
- rootType = type;
96
- }
95
+ let schema, rootSchema, schemaDefinitions, schemaResourceFields;
97
96
 
98
- if ( !schema ) {
99
- return `Error loading schema for ${ type }`;
100
- }
97
+ if (depth === 0) {
98
+ // `type` is a schema id
99
+ schema = findBy(schemas, 'id', type);
101
100
 
102
- 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;
103
109
 
104
- if ( depth === 0 ) {
105
110
  const attr = schema.attributes || {};
106
111
 
107
112
  // Default to data.apiVersion/kind to accommodate spoofed types that aggregate multiple types
108
113
  data.apiVersion = (attr.group ? `${ attr.group }/${ attr.version }` : attr.version) || data.apiVersion;
109
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;
110
132
  }
111
133
 
112
134
  const regularFields = [];
@@ -131,14 +153,14 @@ export function createYaml(
131
153
  const key = parts[parts.length - 1];
132
154
  const prefix = parts.slice(0, -1).join('.');
133
155
 
134
- if ( prefix === path && schema.resourceFields && schema.resourceFields[key] ) {
156
+ if ( prefix === path && schemaResourceFields && schemaResourceFields[key] ) {
135
157
  addObject(regularFields, key);
136
158
  }
137
159
  }
138
160
  }
139
161
 
140
162
  // Include all fields in schema's resourceFields as comments
141
- const commentFields = Object.keys(schema.resourceFields || {});
163
+ const commentFields = Object.keys(schemaResourceFields || {});
142
164
 
143
165
  commentFields.forEach((key) => {
144
166
  if ( typeof data[key] !== 'undefined' || (depth === 0 && key === '_type') ) {
@@ -170,7 +192,7 @@ export function createYaml(
170
192
  const key = parts[parts.length - 1];
171
193
  const prefix = parts.slice(0, -1).join('.');
172
194
 
173
- if ( prefix === path && schema.resourceFields && schema.resourceFields[key] ) {
195
+ if ( prefix === path && schemaResourceFields && schemaResourceFields[key] ) {
174
196
  removeObject(commentFields, key);
175
197
  }
176
198
  }
@@ -182,8 +204,6 @@ export function createYaml(
182
204
  const comments = commentFields.map((k) => {
183
205
  // Don't add a namespace comment for types that aren't namespaced.
184
206
  if ( path === 'metadata' && k === 'namespace' ) {
185
- const rootSchema = findBy(schemas, 'id', rootType);
186
-
187
207
  if ( rootSchema && !rootSchema.attributes?.namespaced ) {
188
208
  return null;
189
209
  }
@@ -202,7 +222,7 @@ export function createYaml(
202
222
  // ---------------
203
223
 
204
224
  function stringifyField(key) {
205
- const field = schema.resourceFields?.[key];
225
+ const field = schemaResourceFields?.[key];
206
226
  let out = `${ key }:`;
207
227
 
208
228
  // '_type' in steve maps to kubernetes 'type' field; show 'type' field in yaml
@@ -233,8 +253,8 @@ export function createYaml(
233
253
  }
234
254
 
235
255
  const type = typeMunge(field.type);
236
- const mapOf = typeRef('map', type);
237
- const arrayOf = typeRef('array', type);
256
+ const mapOf = typeRef('map', type, field);
257
+ const arrayOf = typeRef('array', type, field);
238
258
  const referenceTo = typeRef('reference', type);
239
259
 
240
260
  // type == map[mapOf]
@@ -254,7 +274,7 @@ export function createYaml(
254
274
  if ( SIMPLE_TYPES.includes(mapOf) ) {
255
275
  out += `# key: ${ mapOf }`;
256
276
  } else {
257
- // 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
258
278
  const chunk = createYaml(schemas, mapOf, null, processAlwaysAdd, depth + 1, (path ? `${ path }.${ key }` : key), rootType, dataOptions);
259
279
  let indented = indent(chunk);
260
280
 
@@ -279,7 +299,7 @@ export function createYaml(
279
299
  out += `\n${ indent(parsedData.trim()) }`;
280
300
  }
281
301
  } catch (e) {
282
- 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
283
303
  }
284
304
  }
285
305
 
@@ -335,7 +355,7 @@ export function createYaml(
335
355
  }
336
356
  }
337
357
 
338
- const subDef = findBy(schemas, 'id', type);
358
+ const subDef = schemaDefinitions?.[type] || findBy(schemas, 'id', type);
339
359
 
340
360
  if ( subDef) {
341
361
  let chunk;
@@ -411,12 +431,19 @@ function getBlockIndentation(blockHeader) {
411
431
  return indentation?.[0] || '';
412
432
  }
413
433
 
414
- export function typeRef(type, str) {
415
- const re = new RegExp(`^${ type }\\[(.*)\\]$`);
416
- 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);
417
444
 
418
- if ( match ) {
419
- return typeMunge(match[1]);
445
+ if (type === foundType) {
446
+ return typeMunge(foundSubType || foundType);
420
447
  }
421
448
  }
422
449
 
@@ -460,7 +487,7 @@ export function saferDump(obj) {
460
487
  *
461
488
  * @returns the result of jsyaml.dump with the addition of multiline indicators
462
489
  */
463
- export function dumpBlock(data, options = {}) {
490
+ export function dumpBlock(data, options = { lineWidth: -1 }) {
464
491
  const parsed = jsyaml.dump(data, options);
465
492
 
466
493
  let out = parsed;
package/utils/error.js CHANGED
@@ -104,3 +104,28 @@ export function exceptionToErrorsArray(err) {
104
104
  return [err];
105
105
  }
106
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