@rancher/shell 1.2.0 → 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 (689) 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 +299 -63
  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/AppModal.vue +167 -0
  31. package/components/AssignTo.vue +7 -4
  32. package/components/AsyncButton.vue +27 -5
  33. package/components/BackLink.vue +4 -4
  34. package/components/BannerGraphic.vue +1 -0
  35. package/components/BrandImage.vue +47 -1
  36. package/components/Carousel.vue +15 -8
  37. package/components/Certificates.vue +161 -0
  38. package/components/ClusterBadge.vue +12 -3
  39. package/components/ClusterIconMenu.vue +55 -12
  40. package/components/ClusterProviderIcon.vue +14 -3
  41. package/components/CodeMirror.vue +111 -17
  42. package/components/CommunityLinks.vue +12 -8
  43. package/components/CopyCode.vue +6 -2
  44. package/components/CopyToClipboard.vue +2 -1
  45. package/components/CopyToClipboardText.vue +14 -9
  46. package/components/CreateDriver.vue +81 -0
  47. package/components/CruResource.vue +52 -27
  48. package/components/DetailTop.vue +2 -2
  49. package/components/Dialog.vue +6 -5
  50. package/components/DisableAuthProviderModal.vue +14 -8
  51. package/components/DraggableZone.vue +2 -2
  52. package/components/EtcdInfoBanner.vue +5 -5
  53. package/components/ExplorerMembers.vue +3 -3
  54. package/components/ExplorerProjectsNamespaces.vue +31 -7
  55. package/components/FixedBanner.vue +48 -36
  56. package/components/GlobalRoleBindings.vue +26 -0
  57. package/components/IconOrSvg.vue +1 -1
  58. package/components/Import.vue +10 -6
  59. package/components/Inactivity.vue +1 -5
  60. package/components/KeyValueView.vue +14 -10
  61. package/components/Markdown.vue +16 -12
  62. package/components/MessageLink.vue +2 -2
  63. package/components/ModalWithCard.vue +5 -8
  64. package/components/MoveModal.vue +35 -33
  65. package/components/PodSecurityAdmission.vue +3 -3
  66. package/components/PromptChangePassword.vue +33 -33
  67. package/components/PromptModal.vue +11 -21
  68. package/components/PromptRemove.vue +11 -17
  69. package/components/PromptRestore.vue +18 -16
  70. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  71. package/components/Questions/__tests__/Float.test.ts +9 -19
  72. package/components/Questions/__tests__/Int.test.ts +9 -19
  73. package/components/Questions/__tests__/String.test.ts +9 -19
  74. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  75. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  76. package/components/Questions/index.vue +19 -3
  77. package/components/ResourceCancelModal.vue +34 -29
  78. package/components/ResourceDetail/Masthead.vue +48 -16
  79. package/components/ResourceDetail/index.vue +6 -4
  80. package/components/ResourceList/Masthead.vue +10 -9
  81. package/components/ResourceList/index.vue +65 -14
  82. package/components/ResourceTable.vue +87 -21
  83. package/components/ResourceYaml.vue +35 -5
  84. package/components/SelectIconGrid.vue +3 -3
  85. package/components/SideNav.vue +50 -94
  86. package/components/SingleClusterInfo.vue +4 -4
  87. package/components/SortableTable/THead.vue +33 -21
  88. package/components/SortableTable/filtering.js +9 -1
  89. package/components/SortableTable/grouping.js +8 -1
  90. package/components/SortableTable/index.vue +143 -44
  91. package/components/SortableTable/paging.js +36 -7
  92. package/components/SortableTable/selection.js +2 -1
  93. package/components/SortableTable/sorting.js +24 -7
  94. package/components/StatusTable.vue +5 -1
  95. package/components/Tabbed/index.vue +18 -1
  96. package/components/TableDataUserIcon.vue +47 -0
  97. package/components/TypeDescription.vue +1 -0
  98. package/components/Wizard.vue +1 -0
  99. package/components/YamlEditor.vue +1 -0
  100. package/components/__tests__/AppModal.test.ts +98 -0
  101. package/components/__tests__/AsyncButton.test.ts +1 -3
  102. package/components/__tests__/BackLink.test.ts +1 -1
  103. package/components/__tests__/ButtonGroup.test.ts +3 -6
  104. package/components/__tests__/Carousel.test.ts +43 -0
  105. package/components/__tests__/Certificates.test.ts +29 -0
  106. package/components/__tests__/CodeMirror.test.ts +87 -0
  107. package/components/__tests__/CopyCode.test.ts +5 -4
  108. package/components/__tests__/CruResource.test.ts +10 -9
  109. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  110. package/components/__tests__/FixedBanner.test.ts +5 -20
  111. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  112. package/components/__tests__/TabTitle.test.ts +129 -0
  113. package/components/auth/AzureWarning.vue +2 -2
  114. package/components/auth/RoleDetailEdit.vue +10 -0
  115. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  116. package/components/auth/login/oidc.vue +7 -1
  117. package/components/fleet/FleetBundles.vue +5 -11
  118. package/components/fleet/FleetClusters.vue +9 -9
  119. package/components/fleet/FleetIntro.vue +11 -17
  120. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  121. package/components/fleet/FleetRepos.vue +63 -27
  122. package/components/fleet/FleetResources.vue +6 -1
  123. package/components/fleet/FleetStatus.vue +3 -3
  124. package/components/fleet/FleetSummary.vue +35 -30
  125. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  126. package/components/fleet/__tests__/FleetSummary.test.ts +316 -0
  127. package/components/form/ArrayList.vue +22 -18
  128. package/components/form/ArrayListSelect.vue +5 -0
  129. package/components/form/BannerSettings.vue +3 -0
  130. package/components/form/ClusterAppearance.vue +132 -0
  131. package/components/form/ColorInput.vue +1 -0
  132. package/components/form/Error.vue +3 -3
  133. package/components/form/FileSelector.vue +1 -0
  134. package/components/form/Footer.vue +2 -2
  135. package/components/form/GitPicker.vue +83 -38
  136. package/components/form/KeyValue.vue +69 -48
  137. package/components/form/LabeledSelect.vue +145 -41
  138. package/components/form/Labels.vue +3 -1
  139. package/components/form/NameNsDescription.vue +26 -9
  140. package/components/form/Password.vue +3 -1
  141. package/components/form/ResourceLabeledSelect.vue +187 -0
  142. package/components/form/ResourceTabs/index.vue +31 -15
  143. package/components/form/SecretSelector.vue +93 -18
  144. package/components/form/SelectOrCreateAuthSecret.vue +132 -59
  145. package/components/form/SimpleSecretSelector.vue +88 -28
  146. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  147. package/components/form/__tests__/KeyValue.test.ts +120 -11
  148. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  149. package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +25 -15
  150. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  151. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  152. package/components/formatter/AppSummaryGraph.vue +2 -2
  153. package/components/formatter/Checked.vue +11 -3
  154. package/components/formatter/CloudCredPublicData.vue +30 -0
  155. package/components/formatter/ClusterLink.vue +2 -2
  156. package/components/formatter/ClusterProvider.vue +1 -18
  157. package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
  158. package/components/formatter/FleetSummaryGraph.vue +25 -12
  159. package/components/formatter/ImagePercentageBar.vue +0 -4
  160. package/components/formatter/IngressTarget.vue +18 -7
  161. package/components/formatter/Link.vue +2 -2
  162. package/components/formatter/LinkDetail.vue +2 -2
  163. package/components/formatter/LinkDetailImage.vue +2 -2
  164. package/components/formatter/LinkName.vue +2 -2
  165. package/components/formatter/LiveDuration.vue +1 -1
  166. package/components/formatter/PercentageBar.vue +1 -1
  167. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  168. package/components/formatter/SecretType.vue +2 -2
  169. package/components/formatter/VirtualServiceGateways.vue +2 -2
  170. package/components/formatter/WorkloadDetailEndpoints.vue +12 -22
  171. package/components/formatter/__tests__/Checked.test.ts +19 -0
  172. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  173. package/components/formatter/__tests__/WorkloadDetailEndpoints.test.ts +81 -0
  174. package/components/nav/Group.vue +9 -7
  175. package/components/nav/Header.vue +84 -45
  176. package/components/nav/Jump.vue +19 -9
  177. package/components/nav/NamespaceFilter.vue +8 -1
  178. package/components/nav/TopLevelMenu.vue +391 -132
  179. package/components/nav/Type.vue +71 -106
  180. package/components/nav/WindowManager/ContainerLogs.vue +120 -19
  181. package/components/nav/WindowManager/ContainerShell.vue +6 -1
  182. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
  183. package/components/nav/WindowManager/index.vue +11 -10
  184. package/components/nav/__tests__/TopLevelMenu.test.ts +400 -6
  185. package/components/nav/__tests__/Type.test.ts +322 -97
  186. package/components/nuxt/nuxt-child.js +9 -78
  187. package/components/nuxt/nuxt-error.vue +1 -1
  188. package/components/nuxt/nuxt-link.client.js +13 -95
  189. package/{layouts → components/templates}/blank.vue +1 -1
  190. package/{layouts → components/templates}/default.vue +11 -101
  191. package/{layouts → components/templates}/error.vue +13 -26
  192. package/{layouts → components/templates}/home.vue +4 -1
  193. package/{layouts → components/templates}/plain.vue +4 -1
  194. package/{layouts → components/templates}/standalone.vue +1 -5
  195. package/{layouts → components/templates}/unauthenticated.vue +2 -3
  196. package/composables/useCompactInput.test.ts +36 -0
  197. package/composables/useCompactInput.ts +20 -0
  198. package/composables/useLabeledFormElement.test.ts +135 -0
  199. package/composables/useLabeledFormElement.ts +138 -0
  200. package/config/harvester-manager-types.js +2 -0
  201. package/config/home-links.js +2 -1
  202. package/config/labels-annotations.js +2 -1
  203. package/config/middleware.js +0 -6
  204. package/config/pagination-table-headers.js +57 -0
  205. package/config/pod-security-admission.ts +1 -1
  206. package/config/private-label.js +21 -1
  207. package/config/product/auth.js +1 -0
  208. package/config/product/explorer.js +166 -45
  209. package/config/product/fleet.js +6 -1
  210. package/config/product/legacy.js +2 -11
  211. package/config/product/manager.js +51 -25
  212. package/config/query-params.js +2 -0
  213. package/config/roles.ts +23 -0
  214. package/config/router/index.js +23 -0
  215. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  216. package/config/router/navigation-guards/authentication.js +63 -0
  217. package/config/router/navigation-guards/index.js +15 -0
  218. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  219. package/config/router/routes.js +487 -0
  220. package/config/settings.ts +31 -2
  221. package/config/store.js +8 -4
  222. package/config/system-namespaces.js +3 -0
  223. package/config/table-headers.js +66 -1
  224. package/config/types.js +35 -20
  225. package/config/uiplugins.js +10 -5
  226. package/core/plugin-helpers.js +4 -6
  227. package/core/plugin-routes.ts +56 -114
  228. package/core/plugin.ts +18 -11
  229. package/core/plugins-loader.js +7 -9
  230. package/core/plugins.js +289 -285
  231. package/core/types-provisioning.ts +7 -0
  232. package/creators/app/files/.eslintignore +0 -2
  233. package/creators/app/files/.gitlab-ci.yml +14 -0
  234. package/creators/app/files/.vscode/settings.json +0 -1
  235. package/creators/app/init +19 -0
  236. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  237. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  238. package/creators/pkg/init +32 -0
  239. package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +77 -0
  240. package/detail/__tests__/service.test.ts +62 -0
  241. package/detail/catalog.cattle.io.app.vue +1 -1
  242. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  243. package/detail/fleet.cattle.io.bundle.vue +1 -1
  244. package/detail/fleet.cattle.io.cluster.vue +11 -1
  245. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  246. package/detail/namespace.vue +2 -2
  247. package/detail/networking.k8s.io.ingress.vue +52 -19
  248. package/detail/node.vue +22 -3
  249. package/detail/provisioning.cattle.io.cluster.vue +27 -9
  250. package/detail/service.vue +1 -1
  251. package/detail/workload/index.vue +1 -0
  252. package/dialog/AddCustomBadgeDialog.vue +318 -161
  253. package/dialog/DeactivateDriverDialog.vue +118 -0
  254. package/dialog/RollbackWorkloadDialog.vue +2 -2
  255. package/dialog/RotateCertificatesDialog.vue +0 -21
  256. package/dialog/ScaleMachineDownDialog.vue +34 -17
  257. package/directives/clean-html.js +15 -0
  258. package/directives/clean-tooltip.js +32 -0
  259. package/directives/focus.js +41 -0
  260. package/directives/int-number.js +21 -0
  261. package/directives/positive-int-number.js +19 -0
  262. package/directives/trim-whitespace.js +19 -0
  263. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  264. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  265. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  266. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  267. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  268. package/edit/__tests__/nodeDriver.test.ts +107 -0
  269. package/edit/__tests__/service.test.ts +85 -0
  270. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  271. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  272. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  273. package/edit/auth/__tests__/azuread.test.ts +241 -0
  274. package/edit/auth/__tests__/oidc.test.ts +137 -0
  275. package/edit/auth/azuread.vue +133 -31
  276. package/edit/auth/github.vue +5 -17
  277. package/edit/auth/googleoauth.vue +6 -23
  278. package/edit/auth/ldap/index.vue +5 -17
  279. package/edit/auth/oidc.vue +143 -42
  280. package/edit/auth/saml.vue +5 -14
  281. package/edit/catalog.cattle.io.clusterrepo.vue +177 -9
  282. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  283. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  284. package/edit/cloudcredential.vue +28 -4
  285. package/edit/configmap.vue +10 -4
  286. package/edit/fleet.cattle.io.gitrepo.vue +3 -1
  287. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  288. package/edit/kontainerDriver.vue +65 -0
  289. package/edit/logging-flow/Match.vue +10 -9
  290. package/edit/logging-flow/index.vue +4 -19
  291. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  292. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  293. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  294. package/edit/management.cattle.io.project.vue +3 -53
  295. package/edit/management.cattle.io.setting.vue +52 -2
  296. package/edit/management.cattle.io.user.vue +2 -1
  297. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  298. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  299. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +1 -1
  300. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +2 -2
  301. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +1 -1
  302. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +15 -3
  303. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +4 -1
  304. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  305. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  306. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  307. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  308. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  309. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  310. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +46 -7
  311. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +1 -1
  312. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  313. package/edit/nodeDriver.vue +65 -0
  314. package/edit/persistentvolume/index.vue +2 -2
  315. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +33 -16
  316. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +276 -0
  317. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
  318. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +3 -0
  319. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  320. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  321. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
  322. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +77 -13
  323. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +391 -0
  324. package/edit/provisioning.cattle.io.cluster/import.vue +4 -4
  325. package/edit/provisioning.cattle.io.cluster/index.vue +126 -51
  326. package/edit/provisioning.cattle.io.cluster/rke2.vue +325 -791
  327. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
  328. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +217 -0
  329. package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +123 -129
  330. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  331. package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
  332. package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +1 -0
  333. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
  334. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +190 -0
  335. package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +3 -0
  336. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +148 -0
  337. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
  338. package/edit/resources.cattle.io.backup.vue +139 -124
  339. package/edit/resources.cattle.io.restore.vue +146 -126
  340. package/edit/service.vue +13 -0
  341. package/edit/serviceaccount.vue +46 -4
  342. package/edit/token.vue +1 -0
  343. package/edit/workload/Upgrading.vue +3 -2
  344. package/edit/workload/__tests__/Job.test.ts +1 -3
  345. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  346. package/edit/workload/index.vue +2 -1
  347. package/edit/workload/mixins/workload.js +35 -2
  348. package/edit/workload/storage/emptyDir.vue +2 -2
  349. package/initialize/App.vue +75 -0
  350. package/initialize/app-extended.js +128 -0
  351. package/initialize/entry-helpers.js +549 -0
  352. package/initialize/entry.js +32 -0
  353. package/initialize/install-components.js +23 -0
  354. package/initialize/install-directives.js +59 -0
  355. package/initialize/install-plugins.js +123 -0
  356. package/list/__tests__/workload.test.ts +1 -1
  357. package/list/catalog.cattle.io.app.vue +1 -0
  358. package/list/cis.cattle.io.clusterscan.vue +16 -10
  359. package/list/group.principal.vue +2 -2
  360. package/list/management.cattle.io.feature.vue +12 -14
  361. package/list/management.cattle.io.setting.vue +1 -0
  362. package/list/management.cattle.io.user.vue +13 -4
  363. package/list/networking.k8s.io.ingress.vue +36 -0
  364. package/list/node.vue +212 -73
  365. package/list/provisioning.cattle.io.cluster.vue +17 -4
  366. package/list/ui.cattle.io.navlink.vue +2 -2
  367. package/list/workload.vue +22 -0
  368. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  369. package/machine-config/__tests__/vmwarevsphere.test.ts +1 -3
  370. package/machine-config/amazonec2.vue +1 -1
  371. package/machine-config/azure.vue +2 -1
  372. package/machine-config/generic.vue +11 -15
  373. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  374. package/machine-config/vmwarevsphere.vue +31 -27
  375. package/middleware/authenticated.js +23 -380
  376. package/mixins/__tests__/chart.test.ts +48 -6
  377. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  378. package/mixins/auth-config.js +5 -9
  379. package/mixins/brand.js +102 -96
  380. package/mixins/chart.js +27 -13
  381. package/mixins/create-edit-view/index.js +2 -2
  382. package/mixins/fetch.client.js +42 -48
  383. package/mixins/labeled-form-element.ts +27 -2
  384. package/mixins/page-actions.js +7 -5
  385. package/mixins/resource-fetch-api-pagination.js +304 -0
  386. package/mixins/resource-fetch-namespaced.js +1 -1
  387. package/mixins/resource-fetch.js +46 -5
  388. package/models/__tests__/cluster.test.ts +44 -0
  389. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  390. package/models/__tests__/management.cattle.io.cluster.test.ts +23 -0
  391. package/models/__tests__/management.cattle.io.node.ts +85 -0
  392. package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
  393. package/models/__tests__/namespace.test.ts +49 -9
  394. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +241 -0
  395. package/models/__tests__/schema.tests.ts +24 -0
  396. package/models/__tests__/secret.test.ts +37 -0
  397. package/models/__tests__/steve-schema.test.ts +73 -0
  398. package/models/__tests__/storage.k8s.io.storageclass.test.ts +22 -0
  399. package/models/__tests__/workload.test.ts +91 -0
  400. package/models/catalog.cattle.io.app.js +8 -0
  401. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  402. package/models/catalog.cattle.io.uiplugin.js +7 -8
  403. package/models/cis.cattle.io.clusterscan.js +29 -8
  404. package/models/cloudcredential.js +9 -1
  405. package/models/cluster/node.js +8 -4
  406. package/models/cluster/schema.js +6 -0
  407. package/models/cluster.js +33 -0
  408. package/models/cluster.x-k8s.io.machine.js +1 -1
  409. package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
  410. package/models/driver.js +62 -0
  411. package/models/fleet.cattle.io.cluster.js +27 -11
  412. package/models/fleet.cattle.io.gitrepo.js +66 -13
  413. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  414. package/models/kontainerdriver.js +68 -0
  415. package/models/management/schema.js +6 -0
  416. package/models/management.cattle.io.authconfig.js +3 -2
  417. package/models/management.cattle.io.cluster.js +16 -7
  418. package/models/management.cattle.io.globalrole.js +2 -0
  419. package/models/management.cattle.io.kontainerdriver.js +1 -0
  420. package/models/management.cattle.io.node.js +18 -14
  421. package/models/management.cattle.io.nodepool.js +17 -0
  422. package/models/management.cattle.io.project.js +0 -36
  423. package/models/management.cattle.io.setting.js +11 -7
  424. package/models/management.cattle.io.user.js +2 -2
  425. package/models/monitoring.coreos.com.receiver.js +3 -1
  426. package/models/monitoring.coreos.com.route.js +1 -1
  427. package/models/namespace.js +1 -1
  428. package/models/networking.k8s.io.ingress.js +2 -1
  429. package/models/nodedriver.js +68 -0
  430. package/models/pod.js +20 -0
  431. package/models/provisioning.cattle.io.cluster.js +125 -10
  432. package/models/schema.js +28 -7
  433. package/models/secret.js +126 -18
  434. package/models/service.js +2 -0
  435. package/models/steve-schema.ts +254 -0
  436. package/models/storage.k8s.io.storageclass.js +1 -1
  437. package/models/workload.js +17 -0
  438. package/models/workload.service.js +18 -0
  439. package/package.json +17 -14
  440. package/pages/about.vue +12 -6
  441. package/pages/account/create-key.vue +0 -1
  442. package/pages/account/index.vue +7 -3
  443. package/pages/auth/login.vue +106 -103
  444. package/pages/auth/logout.vue +2 -4
  445. package/pages/auth/setup.vue +92 -66
  446. package/pages/auth/verify.vue +30 -24
  447. package/pages/c/_cluster/apps/charts/__tests__/install.helper.test.ts +2 -17
  448. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  449. package/pages/c/_cluster/apps/charts/index.vue +99 -69
  450. package/pages/c/_cluster/apps/charts/install.helpers.js +2 -13
  451. package/pages/c/_cluster/apps/charts/install.vue +9 -9
  452. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  453. package/pages/c/_cluster/auth/config/index.vue +15 -9
  454. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  455. package/pages/c/_cluster/ecm/index.vue +0 -2
  456. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  457. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  458. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  459. package/pages/c/_cluster/explorer/index.vue +253 -91
  460. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  461. package/pages/c/_cluster/explorer/tools/index.vue +10 -6
  462. package/pages/c/_cluster/fleet/index.vue +89 -94
  463. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  464. package/pages/c/_cluster/longhorn/index.vue +52 -17
  465. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  466. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  467. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  468. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +94 -0
  469. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  470. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  471. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +63 -0
  472. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  473. package/pages/c/_cluster/manager/pages/_page.vue +4 -5
  474. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  475. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  476. package/pages/c/_cluster/neuvector/index.vue +1 -0
  477. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  478. package/pages/c/_cluster/settings/banners.vue +86 -10
  479. package/pages/c/_cluster/settings/brand.vue +261 -38
  480. package/pages/c/_cluster/settings/index.vue +4 -6
  481. package/pages/c/_cluster/settings/links.vue +3 -2
  482. package/pages/c/_cluster/settings/performance.vue +71 -3
  483. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  484. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +12 -8
  485. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  486. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
  487. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  488. package/pages/c/_cluster/uiplugins/InstallDialog.vue +53 -18
  489. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  490. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  491. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  492. package/pages/c/_cluster/uiplugins/index.vue +38 -54
  493. package/pages/diagnostic.vue +2 -2
  494. package/pages/fail-whale.vue +103 -42
  495. package/pages/home.vue +81 -24
  496. package/pages/prefs.vue +8 -4
  497. package/pages/support/index.vue +14 -10
  498. package/pkg/auto-import.js +1 -1
  499. package/plugins/axios.js +0 -36
  500. package/plugins/back-button.js +3 -5
  501. package/plugins/clean-html-directive.js +5 -30
  502. package/plugins/clean-html.js +53 -0
  503. package/plugins/clean-tooltip-directive.js +6 -31
  504. package/plugins/codemirror-loader.js +1 -1
  505. package/plugins/codemirror.js +41 -9
  506. package/plugins/dashboard-store/__tests__/mutations.test.ts +389 -0
  507. package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
  508. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
  509. package/plugins/dashboard-store/actions.js +132 -25
  510. package/plugins/dashboard-store/classify.js +1 -18
  511. package/plugins/dashboard-store/getters.js +154 -44
  512. package/plugins/dashboard-store/index.js +0 -111
  513. package/plugins/dashboard-store/mutations.js +150 -52
  514. package/plugins/dashboard-store/resource-class.js +77 -127
  515. package/plugins/directives.js +6 -39
  516. package/plugins/ember-cookie.js +13 -0
  517. package/plugins/global-formatters.js +26 -5
  518. package/plugins/i18n.js +89 -55
  519. package/plugins/int-number.js +6 -20
  520. package/plugins/plugin.js +3 -3
  521. package/plugins/positive-int-number.js +6 -17
  522. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +81 -10
  523. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  524. package/plugins/steve/__tests__/resource-utils.test.ts +159 -0
  525. package/plugins/steve/__tests__/steve-class.test.ts +59 -0
  526. package/plugins/steve/__tests__/subscribe.spec.ts +4 -1
  527. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  528. package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
  529. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  530. package/plugins/steve/actions.js +3 -38
  531. package/plugins/steve/getters.js +164 -61
  532. package/plugins/steve/hybrid-class.js +5 -1
  533. package/plugins/steve/mutations.js +24 -3
  534. package/plugins/steve/norman-class.js +142 -2
  535. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  536. package/plugins/steve/resource-utils.ts +38 -0
  537. package/plugins/steve/schema.d.ts +22 -0
  538. package/plugins/steve/steve-class.js +22 -0
  539. package/plugins/steve/steve-pagination-utils.ts +368 -0
  540. package/plugins/steve/subscribe.js +17 -76
  541. package/plugins/trim-whitespace.js +6 -34
  542. package/plugins/vue-js-modal.js +1 -1
  543. package/public/index.html +1 -0
  544. package/rancher-components/Form/LabeledInput/LabeledInput.vue +13 -8
  545. package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
  546. package/rancher-components/components/Banner/Banner.test.ts +1 -5
  547. package/rancher-components/components/Banner/Banner.vue +2 -2
  548. package/rancher-components/components/Card/Card.vue +4 -4
  549. package/rancher-components/components/Form/Checkbox/Checkbox.vue +4 -3
  550. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  551. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +57 -24
  552. package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -3
  553. package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
  554. package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
  555. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
  556. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  557. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
  558. package/rancher-components/components/StringList/StringList.test.ts +270 -0
  559. package/rancher-components/components/StringList/StringList.vue +65 -26
  560. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +69 -0
  561. package/scripts/clean +1 -1
  562. package/scripts/extension/bundle +19 -7
  563. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  564. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  565. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  566. package/scripts/extension/helm/package/Dockerfile +1 -1
  567. package/scripts/extension/helm/scripts/package +11 -3
  568. package/scripts/extension/helm/scripts/patch +27 -0
  569. package/scripts/extension/parse-tag-name +4 -4
  570. package/scripts/extension/publish +25 -14
  571. package/scripts/publish-shell.sh +11 -1
  572. package/scripts/serve-pkgs +0 -2
  573. package/scripts/test-plugins-build.sh +87 -11
  574. package/scripts/vue-migrate.js +683 -0
  575. package/server/har-file.js +183 -0
  576. package/store/__tests__/catalog.test.ts +224 -0
  577. package/store/__tests__/type-map.test.ts +1122 -0
  578. package/store/auth.js +23 -4
  579. package/store/aws.js +53 -6
  580. package/store/catalog.js +22 -6
  581. package/store/cru-resource.ts +26 -0
  582. package/store/customisation.js +35 -0
  583. package/store/features.js +7 -4
  584. package/store/i18n.js +11 -0
  585. package/store/index.js +139 -48
  586. package/store/plugins.js +8 -4
  587. package/store/prefs.js +33 -38
  588. package/store/type-map.js +288 -213
  589. package/store/type-map.utils.ts +226 -0
  590. package/tsconfig.json +34 -9
  591. package/tsconfig.paths.json +21 -0
  592. package/types/components/labeledSelect.ts +50 -0
  593. package/types/resources/settings.d.ts +32 -0
  594. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  595. package/types/shell/index.d.ts +1042 -767
  596. package/types/store/dashboard-store.types.ts +42 -0
  597. package/types/store/pagination.types.ts +457 -0
  598. package/types/store/type-map.ts +30 -0
  599. package/types/store/vuex.d.ts +9 -0
  600. package/types/vue-shim.d.ts +51 -0
  601. package/utils/__tests__/cluster.test.ts +20 -18
  602. package/utils/__tests__/create-yaml.test.ts +359 -2
  603. package/utils/__tests__/kontainer.test.ts +92 -0
  604. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  605. package/utils/alertmanagerconfig.js +19 -0
  606. package/utils/array.ts +40 -1
  607. package/utils/async.ts +2 -0
  608. package/utils/auth.js +152 -4
  609. package/utils/axios.js +2 -21
  610. package/utils/azure.js +24 -0
  611. package/utils/banners.js +103 -0
  612. package/utils/clipboard.js +5 -0
  613. package/utils/cluster.js +1 -1
  614. package/utils/config.js +4 -0
  615. package/utils/create-yaml.js +59 -28
  616. package/utils/custom-validators.js +0 -2
  617. package/utils/error.js +41 -1
  618. package/utils/formatter.js +5 -3
  619. package/utils/git.ts +1 -1
  620. package/utils/install-redirect.js +1 -1
  621. package/utils/kontainer.ts +186 -0
  622. package/utils/object.js +24 -0
  623. package/utils/pagination-utils.ts +154 -0
  624. package/utils/pod-security-admission.ts +1 -1
  625. package/utils/router.js +86 -0
  626. package/utils/settings.ts +46 -0
  627. package/utils/time.js +2 -1
  628. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  629. package/utils/url.ts +1 -1
  630. package/utils/validators/formRules/__tests__/index.test.ts +70 -4
  631. package/utils/validators/formRules/index.ts +15 -9
  632. package/utils/validators/index.js +1 -0
  633. package/utils/validators/setting.js +6 -10
  634. package/vue.config.js +377 -401
  635. package/.DS_Store +0 -0
  636. package/assets/images/providers/aks-black.svg +0 -28
  637. package/assets/images/providers/aks.svg +0 -31
  638. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  639. package/components/ChartPsp.vue +0 -76
  640. package/components/EventsTable.vue +0 -67
  641. package/components/TabbedLinks/index.vue +0 -94
  642. package/components/__tests__/ChartPsp.test.ts +0 -75
  643. package/components/formatter/__tests__/ClusterProvider.test.ts +0 -28
  644. package/components/nuxt/nuxt-link.server.js +0 -16
  645. package/components/nuxt/nuxt.js +0 -101
  646. package/config/router.js +0 -408
  647. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -237
  648. package/initialize/App.js +0 -198
  649. package/initialize/client.js +0 -875
  650. package/initialize/index.js +0 -364
  651. package/initialize/layouts.ts +0 -26
  652. package/middleware/i18n.js +0 -10
  653. package/middleware/unauthenticated.js +0 -22
  654. package/mixins/fetch.server.js +0 -73
  655. package/pages/c/_cluster/apps/index.vue +0 -17
  656. package/pages/c/_cluster/auth/index.vue +0 -19
  657. package/pages/c/_cluster/index.vue +0 -17
  658. package/pages/c/_cluster/legacy/index.vue +0 -22
  659. package/pages/c/_cluster/manager/index.vue +0 -22
  660. package/pages/c/_cluster/mcapps/index.vue +0 -21
  661. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  662. package/pages/c/index.vue +0 -9
  663. package/pages/rio/mesh.vue +0 -508
  664. package/plugins/dashboard-store/__tests__/mutations.spec.ts +0 -406
  665. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  666. package/plugins/portal-vue.js +0 -4
  667. package/plugins/portal.js +0 -4
  668. package/plugins/resize.js +0 -5
  669. package/plugins/shortkey.js +0 -4
  670. package/plugins/tooltip.js +0 -4
  671. package/plugins/transitions.js +0 -4
  672. package/plugins/v-select.js +0 -4
  673. package/plugins/vue-clipboard2.js +0 -4
  674. package/rancher-components/components/BadgeState/BadgeState.spec.ts +0 -12
  675. package/tsconfig.default.json +0 -46
  676. package/utils/group.js +0 -70
  677. package/utils/nuxt.js +0 -659
  678. package/utils/router.scrollBehavior.js +0 -80
  679. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  680. /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
  681. /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
  682. /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
  683. /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
  684. /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
  685. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  686. /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
  687. /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
  688. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  689. /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
package/core/plugins.js CHANGED
@@ -7,12 +7,10 @@ import { ExtensionPoint } from './types';
7
7
 
8
8
  const MODEL_TYPE = 'models';
9
9
 
10
- export default function({
11
- app,
12
- store,
13
- $axios,
14
- redirect
15
- }, inject) {
10
+ export default function(context, inject, vueApp) {
11
+ const {
12
+ app, store, $axios, redirect
13
+ } = context;
16
14
  const dynamic = {};
17
15
  const validators = {};
18
16
  let _lastLoaded = 0;
@@ -28,381 +26,387 @@ export default function({
28
26
  uiConfig[ExtensionPoint[ep]] = {};
29
27
  }
30
28
 
31
- inject('plugin', {
29
+ inject(
30
+ 'plugin',
31
+ {
32
32
  // Plugins should not use these - but we will pass them in for now as a 2nd argument
33
33
  // in case there are use cases not covered that require direct access - we may remove access later
34
- internal() {
35
- const internal = {
36
- app,
37
- store,
38
- $axios,
39
- redirect,
40
- plugins: this
41
- };
42
-
43
- return internal;
44
- },
45
-
46
- // Load a plugin from a UI package
47
- loadPluginAsync(plugin) {
48
- const { name, version } = plugin;
49
- const id = `${ name }-${ version }`;
50
- let url;
51
-
52
- if (plugin?.metadata?.direct === 'true') {
53
- url = plugin.endpoint;
54
- } else {
34
+ internal() {
35
+ const internal = {
36
+ app,
37
+ store,
38
+ $axios,
39
+ redirect,
40
+ plugins: this
41
+ };
42
+
43
+ return internal;
44
+ },
45
+
46
+ // Load a plugin from a UI package
47
+ loadPluginAsync(plugin) {
48
+ const { name, version } = plugin;
49
+ const id = `${ name }-${ version }`;
50
+ let url;
51
+
52
+ if (plugin?.metadata?.direct === 'true') {
53
+ url = plugin.endpoint;
54
+ } else {
55
55
  // See if the plugin has a main metadata property set
56
- const main = plugin?.metadata?.main || `${ id }.umd.min.js`;
56
+ const main = plugin?.metadata?.main || `${ id }.umd.min.js`;
57
57
 
58
- url = `${ UI_PLUGIN_BASE_URL }/${ name }/${ version }/plugin/${ main }`;
59
- }
58
+ url = `${ UI_PLUGIN_BASE_URL }/${ name }/${ version }/plugin/${ main }`;
59
+ }
60
60
 
61
- return this.loadAsync(id, url);
62
- },
61
+ return this.loadAsync(id, url);
62
+ },
63
63
 
64
- // Load a plugin from a UI package
65
- loadAsync(id, mainFile) {
66
- return new Promise((resolve, reject) => {
67
- const moduleUrl = mainFile;
68
- const element = document.createElement('script');
64
+ // Load a plugin from a UI package
65
+ loadAsync(id, mainFile) {
66
+ return new Promise((resolve, reject) => {
67
+ // The plugin is already loaded so we should avoid loading it again.
68
+ // This will primarily affect plugins that load prior to authentication and we attempt to load again after authentication.
69
+ if (document.getElementById(id)) {
70
+ return resolve();
71
+ }
72
+ const moduleUrl = mainFile;
73
+ const element = document.createElement('script');
69
74
 
70
- element.src = moduleUrl;
71
- element.type = 'text/javascript';
72
- element.async = true;
75
+ element.src = moduleUrl;
76
+ element.type = 'text/javascript';
77
+ element.async = true;
78
+ element.id = id;
79
+ element.dataset.purpose = 'extension';
73
80
 
74
- // id is `<product>-<version>`.
75
- const oldPlugin = Object.values(plugins).find((p) => id.startsWith(p.name));
81
+ // id is `<product>-<version>`.
82
+ const oldPlugin = Object.values(plugins).find((p) => id.startsWith(p.name));
76
83
 
77
- let removed = Promise.resolve();
84
+ let removed = Promise.resolve();
78
85
 
79
- if (oldPlugin) {
86
+ if (oldPlugin) {
80
87
  // Uninstall existing plugin if there is one. This ensures that last loaded plugin is not always used
81
88
  // (nav harv1-->harv2-->harv1 and harv2 would be shown)
82
- removed = this.removePlugin(oldPlugin.name).then(() => {
83
- delete window[oldPlugin.id];
84
-
85
- delete plugins[oldPlugin.id];
86
- });
87
- }
89
+ removed = this.removePlugin(oldPlugin.name).then(() => {
90
+ delete window[oldPlugin.id];
88
91
 
89
- removed.then(() => {
90
- element.onload = () => {
91
- element.parentElement.removeChild(element);
92
+ delete plugins[oldPlugin.id];
93
+ });
94
+ }
92
95
 
93
- if (!window[id]) {
94
- return reject(new Error('Could not load plugin code'));
95
- }
96
+ removed.then(() => {
97
+ element.onload = () => {
98
+ if (!window[id]) {
99
+ return reject(new Error('Could not load plugin code'));
100
+ }
96
101
 
97
- // Update the timestamp that new plugins were loaded - may be needed
98
- // to update caches when new plugins are loaded
99
- _lastLoaded = new Date().getTime();
102
+ // Update the timestamp that new plugins were loaded - may be needed
103
+ // to update caches when new plugins are loaded
104
+ _lastLoaded = new Date().getTime();
100
105
 
101
- // name is the name of the plugin, including the version number
102
- const plugin = new Plugin(id);
106
+ // name is the name of the plugin, including the version number
107
+ const plugin = new Plugin(id);
103
108
 
104
- plugins[id] = plugin;
109
+ plugins[id] = plugin;
105
110
 
106
- // Initialize the plugin
107
- window[id].default(plugin, this.internal());
111
+ // Initialize the plugin
112
+ window[id].default(plugin, this.internal());
108
113
 
109
- // Uninstall existing plugin if there is one
110
- this.removePlugin(plugin.name); // Removing this causes the plugin to not load on refresh
114
+ // Uninstall existing plugin if there is one
115
+ this.removePlugin(plugin.name); // Removing this causes the plugin to not load on refresh
111
116
 
112
- // Load all of the types etc from the plugin
113
- this.applyPlugin(plugin);
117
+ // Load all of the types etc from the plugin
118
+ this.applyPlugin(plugin);
114
119
 
115
- // Add the plugin to the store
116
- store.dispatch('uiplugins/addPlugin', plugin);
120
+ // Add the plugin to the store
121
+ store.dispatch('uiplugins/addPlugin', plugin);
117
122
 
118
- resolve();
119
- };
123
+ resolve();
124
+ };
120
125
 
121
- element.onerror = (e) => {
122
- element.parentElement.removeChild(element);
126
+ element.onerror = (e) => {
123
127
  // Massage the error into something useful
124
- const errorMessage = `Failed to load script from '${ e.target.src }'`;
128
+ const errorMessage = `Failed to load script from '${ e.target.src }'`;
125
129
 
126
- console.error(errorMessage, e); // eslint-disable-line no-console
127
- reject(new Error(errorMessage)); // This is more useful where it's used
128
- };
130
+ console.error(errorMessage, e); // eslint-disable-line no-console
131
+ reject(new Error(errorMessage)); // This is more useful where it's used
132
+ };
129
133
 
130
- document.head.appendChild(element);
131
- }).catch((e) => {
132
- const errorMessage = `Failed to unload old plugin${ oldPlugin?.id }`;
134
+ document.head.appendChild(element);
135
+ }).catch((e) => {
136
+ const errorMessage = `Failed to unload old plugin${ oldPlugin?.id }`;
133
137
 
134
- console.error(errorMessage, e); // eslint-disable-line no-console
135
- reject(new Error(errorMessage)); // This is more useful where it's used
138
+ console.error(errorMessage, e); // eslint-disable-line no-console
139
+ reject(new Error(errorMessage)); // This is more useful where it's used
140
+ });
136
141
  });
137
- });
138
- },
142
+ },
143
+
144
+ // Used by the dynamic loader when a plugin is included in the build
145
+ initPlugin(id, module) {
146
+ const plugin = new Plugin(id);
139
147
 
140
- // Used by the dynamic loader when a plugin is included in the build
141
- initPlugin(id, module) {
142
- const plugin = new Plugin(id);
148
+ // Mark the plugin as being built-in
149
+ plugin.builtin = true;
143
150
 
144
- // Mark the plugin as being built-in
145
- plugin.builtin = true;
151
+ plugins[id] = plugin;
146
152
 
147
- plugins[id] = plugin;
153
+ // Initialize the plugin
154
+ const p = module;
148
155
 
149
- // Initialize the plugin
150
- const p = module;
156
+ try {
157
+ p.default(plugin, this.internal());
151
158
 
152
- try {
153
- p.default(plugin, this.internal());
159
+ // Uninstall existing product if there is one
160
+ this.removePlugin(plugin.name);
154
161
 
155
- // Uninstall existing product if there is one
156
- this.removePlugin(plugin.name);
162
+ // Load all of the types etc from the plugin
163
+ this.applyPlugin(plugin);
157
164
 
158
- // Load all of the types etc from the plugin
159
- this.applyPlugin(plugin);
165
+ // Add the plugin to the store
166
+ store.dispatch('uiplugins/addPlugin', plugin);
167
+ } catch (e) {
168
+ console.error(`Error loading plugin ${ plugin.name }`); // eslint-disable-line no-console
169
+ console.error(e); // eslint-disable-line no-console
170
+ }
171
+ },
160
172
 
161
- // Add the plugin to the store
162
- store.dispatch('uiplugins/addPlugin', plugin);
163
- } catch (e) {
164
- console.error(`Error loading plugin ${ plugin.name }`); // eslint-disable-line no-console
165
- console.error(e); // eslint-disable-line no-console
166
- }
167
- },
173
+ async logout() {
174
+ const all = Object.values(plugins);
168
175
 
169
- async logout() {
170
- const all = Object.values(plugins);
176
+ for (let i = 0; i < all.length; i++) {
177
+ const plugin = all[i];
171
178
 
172
- for (let i = 0; i < all.length; i++) {
173
- const plugin = all[i];
179
+ if (plugin.builtin) {
180
+ continue;
181
+ }
174
182
 
175
- if (plugin.builtin) {
176
- continue;
177
- }
183
+ try {
184
+ await this.removePlugin(plugin.name);
185
+ } catch (e) {
186
+ console.error('Error removing plugin', e); // eslint-disable-line no-console
187
+ }
178
188
 
179
- try {
180
- await this.removePlugin(plugin.name);
181
- } catch (e) {
182
- console.error('Error removing plugin', e); // eslint-disable-line no-console
189
+ delete plugins[plugin.id];
183
190
  }
191
+ },
184
192
 
185
- delete plugins[plugin.id];
186
- }
187
- },
188
-
189
- // Remove the plugin
190
- async removePlugin(name) {
191
- const plugin = Object.values(plugins).find((p) => p.name === name);
193
+ // Remove the plugin
194
+ async removePlugin(name) {
195
+ const plugin = Object.values(plugins).find((p) => p.name === name);
192
196
 
193
- if (!plugin) {
194
- return;
195
- }
197
+ if (!plugin) {
198
+ return;
199
+ }
196
200
 
197
- const promises = [];
201
+ const promises = [];
198
202
 
199
- plugin.productNames.forEach((product) => {
200
- promises.push(store.dispatch('type-map/removeProduct', { product, plugin }));
201
- });
203
+ plugin.productNames.forEach((product) => {
204
+ promises.push(store.dispatch('type-map/removeProduct', { product, plugin }));
205
+ });
202
206
 
203
- // Remove all of the types
204
- Object.keys(plugin.types).forEach((typ) => {
205
- Object.keys(plugin.types[typ]).forEach((name) => {
206
- this.unregister(typ, name);
207
+ // Remove all of the types
208
+ Object.keys(plugin.types).forEach((typ) => {
209
+ Object.keys(plugin.types[typ]).forEach((name) => {
210
+ this.unregister(typ, name);
207
211
 
208
- if (typ === MODEL_TYPE) {
209
- clearModelCache(name);
210
- }
212
+ if (typ === MODEL_TYPE) {
213
+ clearModelCache(name);
214
+ }
215
+ });
211
216
  });
212
- });
213
217
 
214
- // Remove locales
215
- plugin.locales.forEach((localeObj) => {
216
- promises.push(store.dispatch('i18n/removeLocale', localeObj));
217
- });
218
+ // Remove locales
219
+ plugin.locales.forEach((localeObj) => {
220
+ promises.push(store.dispatch('i18n/removeLocale', localeObj));
221
+ });
218
222
 
219
- if (plugin.types.models) {
223
+ if (plugin.types.models) {
220
224
  // Ask the Steve stores to forget any data it has for models that we are removing
221
- promises.push(...this.removeTypeFromStore(store, 'rancher', Object.keys(plugin.types.models)));
222
- promises.push(...this.removeTypeFromStore(store, 'management', Object.keys(plugin.types.models)));
223
- }
224
-
225
- // Uninstall routes
226
- pluginRoutes.uninstall(plugin);
225
+ promises.push(...this.removeTypeFromStore(store, 'rancher', Object.keys(plugin.types.models)));
226
+ promises.push(...this.removeTypeFromStore(store, 'management', Object.keys(plugin.types.models)));
227
+ }
227
228
 
228
- // Call plugin uninstall hooks
229
- plugin.uninstallHooks.forEach((fn) => fn(plugin, this.internal()));
229
+ // Call plugin uninstall hooks
230
+ plugin.uninstallHooks.forEach((fn) => fn(plugin, this.internal()));
230
231
 
231
- // Remove the plugin itself
232
- promises.push( store.dispatch('uiplugins/removePlugin', name));
232
+ // Remove the plugin itself
233
+ promises.push( store.dispatch('uiplugins/removePlugin', name));
233
234
 
234
- // Unregister vuex stores
235
- plugin.stores.forEach((pStore) => pStore.unregister(store));
235
+ // Unregister vuex stores
236
+ plugin.stores.forEach((pStore) => pStore.unregister(store));
236
237
 
237
- // Remove validators
238
- Object.keys(plugin.validators).forEach((key) => {
239
- delete validators[key];
240
- });
238
+ // Remove validators
239
+ Object.keys(plugin.validators).forEach((key) => {
240
+ delete validators[key];
241
+ });
241
242
 
242
- await Promise.all(promises);
243
+ await Promise.all(promises);
243
244
 
244
- // Update last load since we removed a plugin
245
- _lastLoaded = new Date().getTime();
246
- },
245
+ // Update last load since we removed a plugin
246
+ _lastLoaded = new Date().getTime();
247
+ },
247
248
 
248
- removeTypeFromStore(store, storeName, types) {
249
- return (types || []).map((type) => store.commit(`${ storeName }/forgetType`, type));
250
- },
249
+ removeTypeFromStore(store, storeName, types) {
250
+ return (types || []).map((type) => store.commit(`${ storeName }/forgetType`, type));
251
+ },
251
252
 
252
- // Apply the plugin based on its metadata
253
- applyPlugin(plugin) {
253
+ // Apply the plugin based on its metadata
254
+ applyPlugin(plugin) {
254
255
  // Types
255
- Object.keys(plugin.types).forEach((typ) => {
256
- Object.keys(plugin.types[typ]).forEach((name) => {
257
- this.register(typ, name, plugin.types[typ][name]);
256
+ Object.keys(plugin.types).forEach((typ) => {
257
+ Object.keys(plugin.types[typ]).forEach((name) => {
258
+ this.register(typ, name, plugin.types[typ][name]);
259
+ });
258
260
  });
259
- });
260
-
261
- // UI Configuration - copy UI config from a plugin into the global uiConfig object
262
- Object.keys(plugin.uiConfig).forEach((actionType) => {
263
- Object.keys(plugin.uiConfig[actionType]).forEach((actionLocation) => {
264
- plugin.uiConfig[actionType][actionLocation].forEach((action) => {
265
- if (!uiConfig[actionType][actionLocation]) {
266
- uiConfig[actionType][actionLocation] = [];
267
- }
268
- uiConfig[actionType][actionLocation].push(action);
261
+
262
+ // UI Configuration - copy UI config from a plugin into the global uiConfig object
263
+ Object.keys(plugin.uiConfig).forEach((actionType) => {
264
+ Object.keys(plugin.uiConfig[actionType]).forEach((actionLocation) => {
265
+ plugin.uiConfig[actionType][actionLocation].forEach((action) => {
266
+ if (!uiConfig[actionType][actionLocation]) {
267
+ uiConfig[actionType][actionLocation] = [];
268
+ }
269
+ uiConfig[actionType][actionLocation].push(action);
270
+ });
269
271
  });
270
272
  });
271
- });
272
273
 
273
- // l10n
274
- Object.keys(plugin.l10n).forEach((name) => {
275
- plugin.l10n[name].forEach((fn) => {
276
- this.register('l10n', name, fn);
274
+ // l10n
275
+ Object.keys(plugin.l10n).forEach((name) => {
276
+ plugin.l10n[name].forEach((fn) => {
277
+ this.register('l10n', name, fn);
278
+ });
277
279
  });
278
- });
279
280
 
280
- // Initialize the product if the store is ready
281
- if (productsLoaded()) {
282
- this.loadProducts([plugin]);
283
- }
281
+ // Initialize the product if the store is ready
282
+ if (productsLoaded()) {
283
+ this.loadProducts([plugin]);
284
+ }
284
285
 
285
- // Register vuex stores
286
- plugin.stores.forEach((pStore) => pStore.register()(store));
286
+ // Register vuex stores
287
+ plugin.stores.forEach((pStore) => pStore.register()(store));
287
288
 
288
- // Locales
289
- plugin.locales.forEach((localeObj) => {
290
- store.dispatch('i18n/addLocale', localeObj);
291
- });
289
+ // Locales
290
+ plugin.locales.forEach((localeObj) => {
291
+ store.dispatch('i18n/addLocale', localeObj);
292
+ });
292
293
 
293
- // Routes
294
- pluginRoutes.addRoutes(plugin, plugin.routes);
294
+ // Routes
295
+ pluginRoutes.addRoutes(plugin, plugin.routes);
295
296
 
296
- // Validators
297
- Object.keys(plugin.validators).forEach((key) => {
298
- validators[key] = plugin.validators[key];
299
- });
300
- },
297
+ // Validators
298
+ Object.keys(plugin.validators).forEach((key) => {
299
+ validators[key] = plugin.validators[key];
300
+ });
301
+ },
301
302
 
302
- /**
303
+ /**
303
304
  * Register 'something' that can be dynamically loaded - e.g. model, edit, create, list, i18n
304
305
  * @param {String} type type of thing to register, e.g. 'edit'
305
306
  * @param {String} name unique name of 'something'
306
307
  * @param {Function} fn function that dynamically loads the module for the thing being registered
307
308
  */
308
- register(type, name, fn) {
309
- if (!dynamic[type]) {
310
- dynamic[type] = {};
311
- }
312
-
313
- // Accumulate l10n resources rather than replace
314
- if (type === 'l10n') {
315
- if (!dynamic[type][name]) {
316
- dynamic[type][name] = [];
309
+ register(type, name, fn) {
310
+ if (!dynamic[type]) {
311
+ dynamic[type] = {};
317
312
  }
318
313
 
319
- dynamic[type][name].push(fn);
320
- } else {
321
- dynamic[type][name] = fn;
322
- }
323
- },
314
+ // Accumulate l10n resources rather than replace
315
+ if (type === 'l10n') {
316
+ if (!dynamic[type][name]) {
317
+ dynamic[type][name] = [];
318
+ }
324
319
 
325
- unregister(type, name, fn) {
326
- if (type === 'l10n') {
327
- if (dynamic[type]?.[name]) {
328
- const index = dynamic[type][name].find((func) => func === fn);
320
+ dynamic[type][name].push(fn);
321
+ } else {
322
+ dynamic[type][name] = fn;
323
+ }
324
+ },
325
+
326
+ unregister(type, name, fn) {
327
+ if (type === 'l10n') {
328
+ if (dynamic[type]?.[name]) {
329
+ const index = dynamic[type][name].find((func) => func === fn);
329
330
 
330
- if (index !== -1) {
331
- dynamic[type][name].splice(index, 1);
331
+ if (index !== -1) {
332
+ dynamic[type][name].splice(index, 1);
333
+ }
332
334
  }
335
+ } else if (dynamic[type]?.[name]) {
336
+ delete dynamic[type][name];
333
337
  }
334
- } else if (dynamic[type]?.[name]) {
335
- delete dynamic[type][name];
336
- }
337
- },
338
+ },
338
339
 
339
- // For debugging
340
- getAll() {
341
- return dynamic;
342
- },
340
+ // For debugging
341
+ getAll() {
342
+ return dynamic;
343
+ },
343
344
 
344
- getPlugins() {
345
- return plugins;
346
- },
345
+ getPlugins() {
346
+ return plugins;
347
+ },
347
348
 
348
- getDynamic(typeName, name) {
349
- return dynamic[typeName]?.[name];
350
- },
349
+ getDynamic(typeName, name) {
350
+ return dynamic[typeName]?.[name];
351
+ },
351
352
 
352
- getValidator(name) {
353
- return validators[name];
354
- },
353
+ getValidator(name) {
354
+ return validators[name];
355
+ },
355
356
 
356
- /**
357
+ /**
357
358
  * Return the UI configuration for the given type and location
358
359
  */
359
- getUIConfig(type, uiArea) {
360
- return uiConfig[type][uiArea] || [];
361
- },
360
+ getUIConfig(type, uiArea) {
361
+ return uiConfig[type][uiArea] || [];
362
+ },
362
363
 
363
- /**
364
+ /**
364
365
  * Returns all UI Configuration (useful for debugging)
365
366
  */
366
- getAllUIConfig() {
367
- return uiConfig;
368
- },
369
-
370
- // Timestamp that a UI package was last loaded
371
- // Typically used to invalidate caches (e.g. i18n) when new plugins are loaded
372
- get lastLoad() {
373
- return _lastLoaded;
374
- },
375
-
376
- listDynamic(typeName) {
377
- if (!dynamic[typeName]) {
378
- return [];
379
- }
367
+ getAllUIConfig() {
368
+ return uiConfig;
369
+ },
370
+
371
+ // Timestamp that a UI package was last loaded
372
+ // Typically used to invalidate caches (e.g. i18n) when new plugins are loaded
373
+ get lastLoad() {
374
+ return _lastLoaded;
375
+ },
376
+
377
+ listDynamic(typeName) {
378
+ if (!dynamic[typeName]) {
379
+ return [];
380
+ }
380
381
 
381
- return Object.keys(dynamic[typeName]);
382
- },
382
+ return Object.keys(dynamic[typeName]);
383
+ },
383
384
 
384
- // Get the products provided by plugins
385
- get products() {
386
- return dynamic.products || [];
387
- },
385
+ // Get the products provided by plugins
386
+ get products() {
387
+ return dynamic.products || [];
388
+ },
388
389
 
389
- // Load all of the products provided by plugins
390
- loadProducts(loadPlugins) {
391
- if (!loadPlugins) {
392
- loadPlugins = Object.values(plugins);
393
- }
390
+ // Load all of the products provided by plugins
391
+ loadProducts(loadPlugins) {
392
+ if (!loadPlugins) {
393
+ loadPlugins = Object.values(plugins);
394
+ }
394
395
 
395
- loadPlugins.forEach((plugin) => {
396
- if (plugin.products) {
397
- plugin.products.forEach(async(p) => {
398
- const impl = await p;
396
+ loadPlugins.forEach((plugin) => {
397
+ if (plugin.products) {
398
+ plugin.products.forEach(async(p) => {
399
+ const impl = await p;
399
400
 
400
- if (impl.init) {
401
- impl.init(plugin, store);
402
- }
403
- });
404
- }
405
- });
401
+ if (impl.init) {
402
+ impl.init(plugin, store);
403
+ }
404
+ });
405
+ }
406
+ });
407
+ },
406
408
  },
407
- });
409
+ context,
410
+ vueApp
411
+ );
408
412
  }