@rancher/shell 0.5.3 → 2.0.0

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