@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
@@ -0,0 +1,546 @@
1
+ import Vue from 'vue';
2
+ import { updatePageTitle } from '@shell/utils/title';
3
+ import { getVendor } from '@shell/config/private-label';
4
+ import middleware from '@shell/config/middleware.js';
5
+ import { withQuery } from 'ufo';
6
+ import dynamicPluginLoader from '@shell/pkg/dynamic-plugin-loader';
7
+
8
+ // Global variable used on mount, updated on route change and used in the render function
9
+ let app;
10
+
11
+ /**
12
+ * Add error handler debugging capabilities
13
+ * @param {*} vueApp Vue instance
14
+ */
15
+ export const loadDebugger = (vueApp) => {
16
+ const debug = process.env.dev;
17
+
18
+ if (debug) {
19
+ const defaultErrorHandler = vueApp.config.errorHandler;
20
+
21
+ vueApp.config.errorHandler = async(err, vm, info, ...rest) => {
22
+ // Call other handler if exist
23
+ let handled = null;
24
+
25
+ if (typeof defaultErrorHandler === 'function') {
26
+ handled = defaultErrorHandler(err, vm, info, ...rest);
27
+ }
28
+ if (handled === true) {
29
+ return handled;
30
+ }
31
+
32
+ if (vm && vm.$root) {
33
+ const globalApp = Object.keys(window.$globalApp)
34
+ .find((instance) => vm.$root[instance]);
35
+
36
+ // Show Nuxt Error Page
37
+ if (globalApp && vm.$root[globalApp].error && info !== 'render function') {
38
+ const vueApp = vm.$root[globalApp];
39
+
40
+ vueApp.error(err);
41
+ }
42
+ }
43
+
44
+ if (typeof defaultErrorHandler === 'function') {
45
+ return handled;
46
+ }
47
+
48
+ // Log to console
49
+ if (process.env.NODE_ENV !== 'production') {
50
+ console.error(err); // eslint-disable-line no-console
51
+ } else {
52
+ console.error(err.message || err); // eslint-disable-line no-console
53
+ }
54
+ };
55
+ }
56
+ };
57
+
58
+ /**
59
+ * Handle errors with a redirect
60
+ * @param {*} context
61
+ * @param {*} message
62
+ */
63
+ const errorRedirect = (context, message) => {
64
+ context.$store.commit('setError', { error: new Error(message) });
65
+ context.$router.replace('/fail-whale');
66
+ };
67
+
68
+ /**
69
+ * TODO: Define this logic use case
70
+ * @param {*} fn
71
+ * @param {*} context
72
+ * @returns
73
+ */
74
+ export const promisify = (fn, context) => {
75
+ let promise;
76
+
77
+ if (fn.length === 2) {
78
+ console.warn('Callback-based fetch or middleware calls are deprecated. Please switch to promises or async/await syntax'); // eslint-disable-line no-console
79
+
80
+ // fn(context, callback)
81
+ promise = new Promise((resolve) => {
82
+ fn(context, (err, data) => {
83
+ if (err) {
84
+ context.error(err);
85
+ }
86
+ data = data || {};
87
+ resolve(data);
88
+ });
89
+ });
90
+ } else {
91
+ promise = fn(context);
92
+ }
93
+
94
+ if (promise && promise instanceof Promise && typeof promise.then === 'function') {
95
+ return promise;
96
+ }
97
+
98
+ return Promise.resolve(promise);
99
+ };
100
+
101
+ /**
102
+ * TODO: Define this logic use case
103
+ * @param {*} promises
104
+ * @param {*} appContext
105
+ * @returns
106
+ */
107
+ export const middlewareSeries = (promises, appContext) => {
108
+ if (!promises.length || appContext._redirected || appContext._errored) {
109
+ return Promise.resolve();
110
+ }
111
+
112
+ return promisify(promises[0], appContext)
113
+ .then(() => {
114
+ return middlewareSeries(promises.slice(1), appContext);
115
+ });
116
+ };
117
+
118
+ /**
119
+ * Add middleware to the Vue instance
120
+ * @param {*} Components List of Vue components
121
+ * @param {*} context App context
122
+ * @returns
123
+ */
124
+ function callMiddleware(Components, context) {
125
+ let midd = [];
126
+ let unknownMiddleware = false;
127
+
128
+ Components.forEach((Component) => {
129
+ if (Component.options.middleware) {
130
+ midd = midd.concat(Component.options.middleware);
131
+ }
132
+ });
133
+
134
+ midd = midd.map((name) => {
135
+ if (typeof name === 'function') {
136
+ return name;
137
+ }
138
+ if (typeof middleware[name] !== 'function') {
139
+ unknownMiddleware = true;
140
+ errorRedirect(this, new Error(`500: Unknown middleware ${ name }`));
141
+ }
142
+
143
+ return middleware[name];
144
+ });
145
+
146
+ if (unknownMiddleware) {
147
+ return;
148
+ }
149
+
150
+ return middlewareSeries(midd, context);
151
+ }
152
+
153
+ export const globalHandleError = (error) => Vue.config.errorHandler && Vue.config.errorHandler(error);
154
+
155
+ /**
156
+ * Render function used by the router guards
157
+ * @param {*} to Route
158
+ * @param {*} from Route
159
+ * @param {*} next callback
160
+ * @param {*} app
161
+ * @returns
162
+ */
163
+ async function render(to, from, next) {
164
+ if (this._routeChanged === false && this._paramChanged === false && this._queryChanged === false) {
165
+ return next();
166
+ }
167
+
168
+ // nextCalled is true when redirected
169
+ let nextCalled = false;
170
+ const _next = (path) => {
171
+ if (from.path === path.path && this.$loading.finish) {
172
+ this.$loading.finish();
173
+ }
174
+
175
+ if (from.path !== path.path && this.$loading.pause) {
176
+ this.$loading.pause();
177
+ }
178
+
179
+ if (nextCalled) {
180
+ return;
181
+ }
182
+
183
+ nextCalled = true;
184
+ next(path);
185
+ };
186
+
187
+ // Update context
188
+ await setContext(app, {
189
+ route: to,
190
+ from,
191
+ next: _next.bind(this)
192
+ });
193
+
194
+ // Get route's matched components
195
+ const matches = [];
196
+ const Components = getMatchedComponents(to, matches);
197
+
198
+ // If no Components matched, generate 404
199
+ if (!Components.length) {
200
+ // Handle the loading of dynamic plugins (Harvester) because we only want to attempt to load those plugins and routes if we first couldn't find a page.
201
+ // We should probably get rid of this concept entirely and just load plugins at the start.
202
+ await app.context.store.dispatch('loadManagement');
203
+ const newLocation = await dynamicPluginLoader.check({ route: { path: window.location.pathname }, store: app.context.store });
204
+
205
+ // If we have a new location, double check that it's actually valid
206
+ const resolvedRoute = newLocation?.path ? app.context.store.app.router.resolve({ path: newLocation.path.replace(/^\/{0,1}dashboard/, '') }) : null;
207
+
208
+ if (resolvedRoute?.route.matched.length) {
209
+ // Note - don't use `redirect` or `store.app.route` (breaks feature by failing to run middleware in default layout)
210
+ return next(resolvedRoute.resolved.path);
211
+ }
212
+
213
+ errorRedirect(this, new Error('404: This page could not be found'));
214
+
215
+ return next();
216
+ }
217
+
218
+ try {
219
+ // Call middleware
220
+ await callMiddleware.call(this, Components, app.context);
221
+ if (nextCalled) {
222
+ return;
223
+ }
224
+ if (app.context._errored) {
225
+ return next();
226
+ }
227
+
228
+ // Call middleware for layout
229
+ await callMiddleware.call(this, Components, app.context);
230
+ if (nextCalled) {
231
+ return;
232
+ }
233
+ if (app.context._errored) {
234
+ return next();
235
+ }
236
+
237
+ // Call .validate()
238
+ let isValid = true;
239
+
240
+ try {
241
+ for (const Component of Components) {
242
+ if (typeof Component.options.validate !== 'function') {
243
+ continue;
244
+ }
245
+
246
+ isValid = await Component.options.validate(app.context);
247
+
248
+ if (!isValid) {
249
+ break;
250
+ }
251
+ }
252
+ } catch (validationError) {
253
+ // ...If .validate() threw an error
254
+ errorRedirect(this, new Error(`${ validationError.statusCode || '500' }: ${ validationError.message }`));
255
+
256
+ return next();
257
+ }
258
+
259
+ // ...If .validate() returned false
260
+ if (!isValid) {
261
+ errorRedirect(this, new Error('404: This page could not be found'));
262
+
263
+ return next();
264
+ }
265
+
266
+ // If not redirected
267
+ if (!nextCalled) {
268
+ if (this.$loading.finish && !this.$loading.manual) {
269
+ this.$loading.finish();
270
+ }
271
+
272
+ next();
273
+ }
274
+ } catch (err) {
275
+ const error = err || {};
276
+
277
+ globalHandleError(error);
278
+
279
+ next();
280
+ }
281
+ }
282
+
283
+ /**
284
+ * Mounts the Vue app to the DOM element
285
+ * @param {Object} appPartials - App view partials
286
+ * @param {Object} VueClass - Vue instance
287
+ */
288
+ export async function mountApp(appPartials, VueClass) {
289
+ // Set global variables
290
+ app = appPartials.app;
291
+ const router = appPartials.router;
292
+
293
+ // Create Vue instance
294
+ const vueApp = new VueClass(app);
295
+
296
+ // Mounts Vue app to DOM element
297
+ const mount = () => {
298
+ vueApp.$mount('#app');
299
+ };
300
+
301
+ // Initialize error handler
302
+ vueApp.$loading = {}; // To avoid error while vueApp.$nuxt does not exist
303
+
304
+ // Add beforeEach router hooks
305
+ router.beforeEach(render.bind(vueApp));
306
+ router.afterEach((from, to) => {
307
+ if (from?.name !== to?.name) {
308
+ updatePageTitle(getVendor());
309
+ }
310
+ });
311
+
312
+ // First render on client-side
313
+ const clientFirstMount = () => {
314
+ mount();
315
+ };
316
+
317
+ // fix: force next tick to avoid having same timestamp when an error happen on spa fallback
318
+ await new Promise((resolve) => setTimeout(resolve, 0));
319
+ render.call(vueApp, router.currentRoute, router.currentRoute, (path) => {
320
+ // If not redirected
321
+ if (!path) {
322
+ clientFirstMount();
323
+
324
+ return;
325
+ }
326
+
327
+ // Add a one-time afterEach hook to
328
+ // mount the app wait for redirect and route gets resolved
329
+ const unregisterHook = router.afterEach((to, from) => {
330
+ unregisterHook();
331
+ clientFirstMount();
332
+ });
333
+
334
+ // Push the path and let route to be resolved
335
+ router.push(path, undefined, (err) => {
336
+ if (err) {
337
+ const errorHandler = vueApp?.config?.errorHandler || console.error; // eslint-disable-line no-console
338
+
339
+ errorHandler(err);
340
+ }
341
+ });
342
+ });
343
+ }
344
+
345
+ /**
346
+ * Extend component properties
347
+ * @param {*} Component
348
+ * @returns
349
+ */
350
+ const patchComponent = (Component) => {
351
+ // If Component already sanitized
352
+ if (Component.options && Component._Ctor === Component) {
353
+ return Component;
354
+ }
355
+ if (!Component.options) {
356
+ Component = Vue.extend(Component); // fix issue #6
357
+ Component._Ctor = Component;
358
+ } else {
359
+ Component._Ctor = Component;
360
+ Component.extendOptions = Component.options;
361
+ }
362
+ // If no component name defined, set file path as name, (also fixes #5703)
363
+ if (!Component.options.name && Component.options.__file) {
364
+ Component.options.name = Component.options.__file;
365
+ }
366
+
367
+ return Component;
368
+ };
369
+
370
+ export const getMatchedComponents = (route, matches = false, prop = 'components') => {
371
+ return Array.prototype.concat.apply([], route.matched.map((match, index) => {
372
+ return Object.keys(match[prop]).map((key) => {
373
+ matches && matches.push(index);
374
+
375
+ return match[prop][key];
376
+ });
377
+ }));
378
+ };
379
+
380
+ const getComponent = async(unknownComponent) => {
381
+ let componentView;
382
+
383
+ // If component is a function, resolve it
384
+ if (typeof unknownComponent === 'function' && !unknownComponent.options) {
385
+ try {
386
+ componentView = await unknownComponent();
387
+ } catch (error) {
388
+ // Handle webpack chunk loading errors
389
+ // This may be due to a new deployment or a network problem
390
+ if (
391
+ error &&
392
+ error.name === 'ChunkLoadError' &&
393
+ typeof window !== 'undefined' &&
394
+ window.sessionStorage
395
+ ) {
396
+ const timeNow = Date.now();
397
+ const previousReloadTime = parseInt(window.sessionStorage.getItem('nuxt-reload'));
398
+
399
+ // check for previous reload time not to reload infinitely
400
+ if (!previousReloadTime || previousReloadTime + 60000 < timeNow) {
401
+ window.sessionStorage.setItem('nuxt-reload', timeNow);
402
+ window.location.reload(true /* skip cache */);
403
+ }
404
+ }
405
+
406
+ throw error;
407
+ }
408
+ }
409
+
410
+ return componentView || unknownComponent;
411
+ };
412
+
413
+ /**
414
+ * Patch all the matched components of a given route
415
+ * @param {*} route
416
+ * @returns
417
+ */
418
+ const patchMatchedComponents = (route) => Array.prototype.concat.apply(
419
+ [],
420
+ route.matched.map(
421
+ (match, index) => Object
422
+ .keys(match.components)
423
+ .reduce(async(acc, key) => {
424
+ if (match.components[key]) {
425
+ const component = await getComponent(match.components[key], match.instances[key], match, key, index);
426
+ const patchedComponent = patchComponent(component);
427
+
428
+ match.components[key] = patchedComponent;
429
+ acc.push(patchedComponent);
430
+ } else {
431
+ delete match.components[key];
432
+ }
433
+
434
+ return acc;
435
+ }, [])
436
+ )
437
+ );
438
+
439
+ /**
440
+ * Merge route meta with component meta and update matched components
441
+ * @param {*} route
442
+ * @returns
443
+ */
444
+ export const getRouteData = async(route) => {
445
+ if (!route) {
446
+ return;
447
+ }
448
+ // Make sure the components are resolved (code-splitting)
449
+ await Promise.all(patchMatchedComponents(route));
450
+ const meta = getMatchedComponents(route).map(
451
+ (matchedComponent, index) => ({ ...matchedComponent.options.meta, ...(route.matched[index] || {}).meta })
452
+ );
453
+
454
+ // Send back a copy of route with meta based on Component definition
455
+ return {
456
+ ...route,
457
+ meta
458
+ };
459
+ };
460
+
461
+ /**
462
+ * Add missing context for the Vue instance
463
+ * @param {*} app
464
+ * @param {*} context
465
+ */
466
+ export const setContext = async(app, context) => {
467
+ // If context not defined, create it
468
+ if (!app.context) {
469
+ app.context = {
470
+ isDev: true,
471
+ isHMR: false,
472
+ app,
473
+ store: app.store,
474
+ payload: context.payload,
475
+ error: context.error,
476
+ base: app.router.options.base,
477
+ env: {
478
+ commit: 'head', version: '0.1.2', dev: true, pl: 1, perfTest: false, rancherEnv: 'web', api: 'http://localhost:8989'
479
+ }
480
+ };
481
+ // Only set once
482
+
483
+ if (context.req) {
484
+ app.context.req = context.req;
485
+ }
486
+ if (context.res) {
487
+ app.context.res = context.res;
488
+ }
489
+
490
+ app.context.redirect = (status, path, query) => {
491
+ if (!status) {
492
+ return;
493
+ }
494
+ app.context._redirected = true;
495
+ // if only 1 or 2 arguments: redirect('/') or redirect('/', { foo: 'bar' })
496
+ let pathType = typeof path;
497
+
498
+ if (typeof status !== 'number' && (pathType === 'undefined' || pathType === 'object')) {
499
+ query = path || {};
500
+ path = status;
501
+ pathType = typeof path;
502
+ status = 302;
503
+ }
504
+ if (pathType === 'object') {
505
+ path = app.router.resolve(path).route.fullPath;
506
+ }
507
+ // "/absolute/route", "./relative/route" or "../relative/route"
508
+ if (/(^[.]{1,2}\/)|(^\/(?!\/))/.test(path)) {
509
+ app.context.next({
510
+ path,
511
+ query,
512
+ status
513
+ });
514
+ } else {
515
+ path = withQuery(path, query);
516
+
517
+ // https://developer.mozilla.org/en-US/docs/Web/API/Location/replace
518
+ window.location.replace(path);
519
+
520
+ // Throw a redirect error
521
+ throw new Error('ERR_REDIRECT');
522
+ }
523
+ };
524
+ }
525
+
526
+ // Dynamic keys
527
+ const [currentRouteData, fromRouteData] = await Promise.all([
528
+ getRouteData(context.route),
529
+ getRouteData(context.from)
530
+ ]);
531
+
532
+ if (context.route) {
533
+ app.context.route = currentRouteData;
534
+ }
535
+
536
+ if (context.from) {
537
+ app.context.from = fromRouteData;
538
+ }
539
+
540
+ app.context.next = context.next;
541
+ app.context._redirected = false;
542
+ app.context._errored = false;
543
+ app.context.isHMR = Boolean(context.isHMR);
544
+ app.context.params = app.context.route.params || {};
545
+ app.context.query = app.context.route.query || {};
546
+ };
@@ -0,0 +1,32 @@
1
+ // Taken from @nuxt/vue-app/template/client.js
2
+
3
+ import Vue from 'vue';
4
+ import fetch from 'unfetch';
5
+ import { extendApp } from './app-extended.js';
6
+ import fetchMixin from '@shell/mixins/fetch.client.js';
7
+ import { loadDebugger, mountApp } from '@shell/initialize/entry-helpers';
8
+ import { installDirectives } from '@shell/initialize/install-directives.js';
9
+ import { installComponents } from '@shell/initialize/install-components.js';
10
+ import { installPlugins } from '@shell/initialize/install-plugins.js';
11
+
12
+ // Fetch mixin
13
+ Vue.mixin(fetchMixin);
14
+
15
+ // Bulk install components
16
+ installComponents(Vue);
17
+
18
+ // Bulk install directives
19
+ installDirectives(Vue);
20
+
21
+ // Bulk install Plugins. Note: Some are added within the App itself
22
+ installPlugins(Vue);
23
+
24
+ if (!global.fetch) {
25
+ global.fetch = fetch;
26
+ }
27
+
28
+ loadDebugger(Vue);
29
+ const errorHandler = Vue.config.errorHandler || console.error; // eslint-disable-line no-console
30
+
31
+ // Create and mount App
32
+ extendApp(Vue).then((appPartials) => mountApp(appPartials, Vue)).catch(errorHandler); // eslint-disable-line no-undef
@@ -0,0 +1,23 @@
1
+
2
+ import NuxtChild from '@shell/components/nuxt/nuxt-child.js';
3
+ import { nuxtLinkAlias } from '@shell/components/nuxt/nuxt-link.client.js'; // should be included after ./index.js
4
+ import vSelect from 'vue-select';
5
+
6
+ /**
7
+ * Add components to the Vue instance
8
+ * @param {*} vueApp Vue instance
9
+ * TODO: #11070 - Remove Nuxt residuals
10
+ */
11
+ export const installComponents = (vueApp) => {
12
+ // Component: <NuxtLink>
13
+ // TODO: #9541 Remove for Vue 3 migration
14
+ vueApp.component('NuxtLink', nuxtLinkAlias('NuxtLink'));
15
+ vueApp.component('NLink', nuxtLinkAlias('NLink'));
16
+
17
+ // Component: <NuxtChild>
18
+ vueApp.component(NuxtChild.name, NuxtChild);
19
+ vueApp.component('NChild', NuxtChild);
20
+
21
+ // Vendor components
22
+ vueApp.component('v-select', vSelect);
23
+ };
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Load the directives
3
+ *
4
+ * These are included in a function that can be explictly called, so that we can be sure
5
+ * of the execution order, rather than importing them at the top of a file.
6
+ */
7
+ import focusDirective from '@shell/directives/focus';
8
+ import cleanHtmlDirective from '@shell/directives/clean-html';
9
+ import cleanTooltipDirective from '@shell/directives/clean-tooltip';
10
+ import positiveIntNumberDirective from '@shell/directives/positive-int-number.js';
11
+ import trimWhitespaceDirective from '@shell/directives/trim-whitespace';
12
+ import intNumberDirective from '@shell/directives/int-number';
13
+
14
+ /**
15
+ * Prevent extensions from overriding existing directives
16
+ * Hook into vueApp.directive and keep track of the directive names that have been added
17
+ * and prevent an existing directive from being overwritten
18
+ * @param {*} vueApp Vue instance
19
+ */
20
+ const storeDirectives = (vueApp) => {
21
+ const directiveNames = {};
22
+ const vueDirective = vueApp.directive;
23
+
24
+ vueApp.directive = function(name) {
25
+ if (directiveNames[name]) {
26
+ console.log(`Can not override directive: ${ name }`); // eslint-disable-line no-console
27
+
28
+ return;
29
+ }
30
+
31
+ directiveNames[name] = true;
32
+
33
+ vueDirective.apply(vueApp, arguments);
34
+ };
35
+ };
36
+
37
+ /**
38
+ * Load the directives from the plugins - we do this with a function so we know
39
+ * these are initialized here, after the code above which keeps track of them and
40
+ * prevents over-writes
41
+ * @param {*} vueApp Vue instance
42
+ */
43
+ function addDirectives(vueApp) {
44
+ vueApp.directive('trim-whitespace', trimWhitespaceDirective);
45
+ vueApp.directive('clean-html', cleanHtmlDirective);
46
+ vueApp.directive('clean-tooltip', cleanTooltipDirective);
47
+ vueApp.directive('focus', focusDirective);
48
+ vueApp.directive('intNumber', intNumberDirective);
49
+ vueApp.directive('positiveIntNumber', positiveIntNumberDirective);
50
+ }
51
+
52
+ /**
53
+ * Install directives in bulks. It will store existing ones
54
+ * @param {*} vueApp Vue instance
55
+ */
56
+ export const installDirectives = (vueApp) => {
57
+ storeDirectives(vueApp);
58
+ addDirectives(vueApp);
59
+ };