@rancher/shell 0.3.14 → 0.3.16

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 (400) hide show
  1. package/assets/images/providers/nutanix.svg +1 -0
  2. package/assets/translations/en-us.yaml +84 -3
  3. package/assets/translations/zh-hans.yaml +68 -26
  4. package/chart/gatekeeper.vue +2 -2
  5. package/chart/monitoring/alerting/index.vue +3 -3
  6. package/chart/monitoring/index.vue +2 -2
  7. package/chart/monitoring/prometheus/index.vue +1 -1
  8. package/chart/rancher-backup/index.vue +2 -2
  9. package/cloud-credential/generic.vue +1 -1
  10. package/cloud-credential/harvester.vue +2 -2
  11. package/components/AssignTo.vue +1 -1
  12. package/components/AwsComplianceBanner.vue +1 -1
  13. package/components/BackLink.vue +7 -0
  14. package/components/BannerGraphic.vue +1 -0
  15. package/components/BrandImage.vue +3 -3
  16. package/components/ClusterProviderIcon.vue +1 -1
  17. package/components/CommunityLinks.vue +2 -2
  18. package/components/ConsumptionGauge.vue +17 -2
  19. package/components/CruResource.vue +3 -2
  20. package/components/DashboardMetrics.vue +8 -0
  21. package/components/DetailTop.vue +1 -1
  22. package/components/EmberPage.vue +1 -0
  23. package/components/ExplorerMembers.vue +8 -8
  24. package/components/ExplorerProjectsNamespaces.vue +9 -9
  25. package/components/FixedBanner.vue +1 -1
  26. package/components/GlobalRoleBindings.vue +11 -11
  27. package/components/GrafanaDashboard.vue +14 -2
  28. package/components/GrowlManager.vue +1 -1
  29. package/components/HarvesterServiceAddOnConfig.vue +4 -3
  30. package/components/IconOrSvg.vue +10 -3
  31. package/components/LandingPagePreference.vue +2 -2
  32. package/components/MoveModal.vue +1 -1
  33. package/components/PodSecurityAdmission.vue +3 -3
  34. package/components/ProgressBarMulti.vue +2 -2
  35. package/components/PromptRemove.vue +52 -28
  36. package/components/PromptRestore.vue +3 -3
  37. package/components/Questions/index.vue +5 -5
  38. package/components/RelatedWorkloadsTable.vue +1 -1
  39. package/components/ResourceList/Masthead.vue +1 -1
  40. package/components/ResourceTable.vue +3 -3
  41. package/components/ResourceYaml.vue +1 -1
  42. package/components/RoleBindings.vue +2 -2
  43. package/components/SimpleBox.vue +1 -0
  44. package/components/SingleClusterInfo.vue +1 -1
  45. package/components/SortableTable/actions.js +3 -3
  46. package/components/SortableTable/advanced-filtering.js +7 -7
  47. package/components/SortableTable/filtering.js +1 -1
  48. package/components/SortableTable/index.vue +14 -10
  49. package/components/SortableTable/selection.js +5 -5
  50. package/components/SortableTable/sorting.js +5 -5
  51. package/components/Tabbed/index.vue +7 -7
  52. package/components/TableSparkLine.vue +1 -1
  53. package/components/Wizard.vue +11 -23
  54. package/components/__tests__/Collapse.spec.ts +1 -1
  55. package/components/__tests__/CruResource.test.ts +74 -0
  56. package/components/__tests__/SimpleBox.spec.ts +1 -1
  57. package/components/auth/RoleDetailEdit.vue +7 -3
  58. package/components/auth/SelectPrincipal.vue +3 -3
  59. package/components/fleet/FleetResources.vue +1 -1
  60. package/components/fleet/FleetStatus.vue +4 -4
  61. package/components/fleet/FleetSummary.vue +1 -1
  62. package/components/fleet/ForceDirectedTreeChart/chartIcons.js +1 -1
  63. package/components/fleet/ForceDirectedTreeChart/index.vue +1 -1
  64. package/components/form/ArrayList.vue +11 -3
  65. package/components/form/ArrayListSelect.vue +2 -2
  66. package/components/form/FileSelector.vue +6 -0
  67. package/components/form/GitPicker.vue +528 -0
  68. package/components/form/KeyValue.vue +82 -41
  69. package/components/form/LabeledSelect.vue +2 -2
  70. package/components/form/MatchExpressions.vue +2 -2
  71. package/components/form/Members/ClusterMembershipEditor.vue +1 -2
  72. package/components/form/Members/ClusterPermissionsEditor.vue +6 -5
  73. package/components/form/Members/MembershipEditor.vue +4 -4
  74. package/components/form/Members/ProjectMembershipEditor.vue +1 -2
  75. package/components/form/NameNsDescription.vue +13 -6
  76. package/components/form/Networking.vue +2 -2
  77. package/components/form/NodeScheduling.vue +1 -1
  78. package/components/form/PodAffinity.vue +7 -2
  79. package/components/form/ProjectMemberEditor.vue +4 -4
  80. package/components/form/ResourceQuota/Namespace.vue +2 -2
  81. package/components/form/ResourceQuota/NamespaceRow.vue +2 -2
  82. package/components/form/ResourceQuota/Project.vue +1 -1
  83. package/components/form/ResourceQuota/shared.js +2 -2
  84. package/components/form/ResourceSelector.vue +1 -1
  85. package/components/form/ResourceTabs/index.vue +1 -1
  86. package/components/form/RuleSelector.vue +1 -1
  87. package/components/form/SecretSelector.vue +4 -4
  88. package/components/form/Select.vue +2 -2
  89. package/components/form/SelectOrCreateAuthSecret.vue +3 -3
  90. package/components/form/ServiceNameSelect.vue +1 -1
  91. package/components/form/ServicePorts.vue +1 -1
  92. package/components/form/ShellInput.vue +1 -1
  93. package/components/form/SimpleSecretSelector.vue +4 -4
  94. package/components/form/Taints.vue +1 -1
  95. package/components/form/ValueFromResource.vue +3 -3
  96. package/components/form/WorkloadPorts.vue +8 -7
  97. package/components/form/__tests__/Error.test.ts +1 -1
  98. package/components/form/__tests__/KeyValue.test.ts +21 -0
  99. package/components/formatter/ClusterLink.vue +1 -1
  100. package/components/formatter/ClusterProvider.vue +13 -2
  101. package/components/formatter/Endpoints.vue +1 -1
  102. package/components/formatter/FleetSummaryGraph.vue +2 -2
  103. package/components/formatter/IngressTarget.vue +2 -2
  104. package/components/formatter/PodImages.vue +1 -1
  105. package/components/formatter/PrincipalGroupBindings.vue +1 -1
  106. package/components/formatter/ReceiverIcons.vue +3 -3
  107. package/components/formatter/ServiceType.vue +1 -1
  108. package/components/formatter/WorkloadDetailEndpoints.vue +1 -1
  109. package/components/formatter/WorkloadHealthScale.vue +1 -1
  110. package/components/formatter/__tests__/LiveDate.test.ts +1 -1
  111. package/components/graph/Bar.vue +1 -1
  112. package/components/graph/LinePlot.vue +3 -3
  113. package/components/nav/Group.vue +2 -2
  114. package/components/nav/Header.vue +5 -5
  115. package/components/nav/NamespaceFilter.vue +14 -14
  116. package/components/nav/TopLevelMenu.vue +76 -11
  117. package/components/nav/WindowManager/ContainerLogs.vue +2 -2
  118. package/components/nav/WindowManager/ContainerShell.vue +1 -1
  119. package/components/nav/WorkspaceSwitcher.vue +1 -1
  120. package/config/home-links.js +4 -4
  121. package/config/labels-annotations.js +8 -9
  122. package/config/pod-security-admission.ts +1 -1
  123. package/config/product/auth.js +5 -5
  124. package/config/product/explorer.js +14 -0
  125. package/config/store.js +2 -0
  126. package/config/table-headers.js +13 -13
  127. package/config/uiplugins.js +8 -1
  128. package/core/plugin-routes.ts +3 -2
  129. package/core/plugin.ts +3 -3
  130. package/core/plugins.js +7 -7
  131. package/creators/pkg/files/index.ts +1 -1
  132. package/detail/catalog.cattle.io.clusterrepo.vue +8 -1
  133. package/detail/cis.cattle.io.clusterscan.vue +3 -3
  134. package/detail/fleet.cattle.io.bundle.vue +1 -1
  135. package/detail/helm.cattle.io.projecthelmchart.vue +16 -29
  136. package/detail/management.cattle.io.user.vue +12 -12
  137. package/detail/namespace.vue +4 -4
  138. package/detail/networking.k8s.io.ingress.vue +3 -3
  139. package/detail/node.vue +2 -2
  140. package/detail/provisioning.cattle.io.cluster.vue +9 -10
  141. package/detail/service.vue +1 -1
  142. package/detail/workload/index.vue +3 -3
  143. package/dialog/AddProjectMemberDialog.vue +2 -2
  144. package/dialog/DrainNode.vue +1 -1
  145. package/dialog/GenericPrompt.vue +9 -5
  146. package/dialog/RotateEncryptionKeyDialog.vue +2 -2
  147. package/dialog/ScaleMachineDownDialog.vue +2 -2
  148. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +56 -0
  149. package/edit/auth/azuread.vue +3 -3
  150. package/edit/autoscaling.horizontalpodautoscaler/index.vue +5 -5
  151. package/edit/cis.cattle.io.clusterscan.vue +5 -5
  152. package/edit/cloudcredential.vue +4 -4
  153. package/edit/constraints.gatekeeper.sh.constraint/NamespaceList.vue +1 -1
  154. package/edit/constraints.gatekeeper.sh.constraint/index.vue +4 -4
  155. package/edit/fleet.cattle.io.gitrepo.vue +6 -6
  156. package/edit/helm.cattle.io.projecthelmchart.vue +3 -3
  157. package/edit/logging-flow/index.vue +4 -4
  158. package/edit/logging.banzaicloud.io.output/index.vue +3 -3
  159. package/edit/logging.banzaicloud.io.output/providers/elasticsearch.vue +1 -1
  160. package/edit/logging.banzaicloud.io.output/providers/forward.vue +1 -1
  161. package/edit/logging.banzaicloud.io.output/providers/logz.vue +1 -1
  162. package/edit/logging.banzaicloud.io.output/providers/opensearch.vue +1 -1
  163. package/edit/logging.banzaicloud.io.output/providers/redis.vue +1 -1
  164. package/edit/logging.banzaicloud.io.output/providers/splunkHec.vue +1 -1
  165. package/edit/management.cattle.io.clusterroletemplatebinding.vue +1 -1
  166. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +1 -1
  167. package/edit/management.cattle.io.project.vue +3 -3
  168. package/edit/management.cattle.io.projectroletemplatebinding.vue +2 -2
  169. package/edit/management.cattle.io.setting.vue +1 -1
  170. package/edit/management.cattle.io.user.vue +2 -2
  171. package/edit/monitoring.coreos.com.alertmanagerconfig/auth.vue +2 -2
  172. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
  173. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +1 -1
  174. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +3 -3
  175. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +5 -5
  176. package/edit/monitoring.coreos.com.prometheusrule/duration.js +1 -1
  177. package/edit/monitoring.coreos.com.prometheusrule/index.vue +8 -3
  178. package/edit/monitoring.coreos.com.receiver/auth.vue +2 -2
  179. package/edit/monitoring.coreos.com.receiver/tls.vue +3 -4
  180. package/edit/monitoring.coreos.com.receiver/types/__tests__/email.test.ts +53 -0
  181. package/edit/monitoring.coreos.com.receiver/types/email.vue +2 -0
  182. package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +3 -3
  183. package/edit/monitoring.coreos.com.receiver/types/webhook.add.vue +1 -1
  184. package/edit/monitoring.coreos.com.route.vue +2 -2
  185. package/edit/namespace.vue +21 -13
  186. package/edit/networking.k8s.io.ingress/Certificate.vue +2 -2
  187. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +2 -2
  188. package/edit/networking.k8s.io.ingress/RulePath.vue +2 -2
  189. package/edit/networking.k8s.io.ingress/Rules.vue +2 -2
  190. package/edit/networking.k8s.io.ingress/index.vue +4 -4
  191. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +3 -3
  192. package/edit/networking.k8s.io.networkpolicy/index.vue +1 -1
  193. package/edit/persistentvolume/index.vue +4 -4
  194. package/edit/persistentvolumeclaim.vue +3 -3
  195. package/edit/provisioning.cattle.io.cluster/RegistryMirrors.vue +1 -1
  196. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +2 -2
  197. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  198. package/edit/provisioning.cattle.io.cluster/index.vue +7 -7
  199. package/edit/provisioning.cattle.io.cluster/rke2.vue +28 -29
  200. package/edit/resources.cattle.io.backup.vue +2 -2
  201. package/edit/resources.cattle.io.restore.vue +3 -3
  202. package/edit/secret/generic.vue +1 -1
  203. package/edit/secret/index.vue +3 -3
  204. package/edit/service.vue +3 -21
  205. package/edit/serviceaccount.vue +2 -2
  206. package/edit/storage.k8s.io.storageclass/index.vue +4 -4
  207. package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +1 -1
  208. package/edit/token.vue +5 -5
  209. package/edit/workload/index.vue +1 -1
  210. package/edit/workload/mixins/workload.js +8 -8
  211. package/edit/workload/storage/ContainerMountPaths.vue +9 -9
  212. package/edit/workload/storage/Mount.vue +2 -2
  213. package/edit/workload/storage/csi/index.vue +1 -1
  214. package/edit/workload/storage/ephemeralVolume/index.vue +1 -1
  215. package/edit/workload/storage/index.vue +6 -6
  216. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +2 -2
  217. package/initialize/client.js +8 -8
  218. package/initialize/index.js +1 -4
  219. package/layouts/default.vue +38 -11
  220. package/list/catalog.cattle.io.clusterrepo.vue +9 -1
  221. package/list/cis.cattle.io.clusterscan.vue +1 -1
  222. package/list/fleet.cattle.io.cluster.vue +2 -2
  223. package/list/group.principal.vue +1 -1
  224. package/list/helm.cattle.io.projecthelmchart.vue +2 -2
  225. package/list/management.cattle.io.cluster.vue +1 -1
  226. package/list/management.cattle.io.feature.vue +1 -1
  227. package/list/management.cattle.io.user.vue +2 -2
  228. package/list/node.vue +5 -5
  229. package/list/provisioning.cattle.io.cluster.vue +4 -5
  230. package/machine-config/amazonec2.vue +2 -2
  231. package/machine-config/digitalocean.vue +4 -4
  232. package/machine-config/linode.vue +4 -4
  233. package/machine-config/vmwarevsphere.vue +12 -12
  234. package/middleware/authenticated.js +7 -6
  235. package/mixins/brand.js +1 -1
  236. package/mixins/chart.js +6 -6
  237. package/mixins/fetch.client.js +2 -2
  238. package/mixins/form-validation.js +7 -7
  239. package/mixins/resource-fetch-namespaced.js +1 -1
  240. package/mixins/resource-fetch.js +2 -2
  241. package/models/apps.statefulset.js +2 -2
  242. package/models/batch.cronjob.js +1 -1
  243. package/models/catalog.cattle.io.app.js +4 -4
  244. package/models/cis.cattle.io.clusterscan.js +1 -1
  245. package/models/cis.cattle.io.clusterscanbenchmark.js +1 -1
  246. package/models/cis.cattle.io.clusterscanreport.js +1 -1
  247. package/models/cloudcredential.js +1 -1
  248. package/models/cluster/node.js +5 -5
  249. package/models/cluster.x-k8s.io.machinedeployment.js +2 -2
  250. package/models/fleet.cattle.io.gitrepo.js +3 -3
  251. package/models/group.principal.js +4 -4
  252. package/models/helm.cattle.io.projecthelmchart.js +2 -2
  253. package/models/logging.banzaicloud.io.clusterflow.js +2 -2
  254. package/models/logging.banzaicloud.io.flow.js +5 -5
  255. package/models/logging.banzaicloud.io.output.js +2 -2
  256. package/models/management.cattle.io.cluster.js +10 -14
  257. package/models/management.cattle.io.globalrole.js +4 -4
  258. package/models/management.cattle.io.node.js +2 -2
  259. package/models/management.cattle.io.nodepool.js +3 -3
  260. package/models/management.cattle.io.nodetemplate.js +4 -4
  261. package/models/management.cattle.io.project.js +2 -2
  262. package/models/management.cattle.io.roletemplate.js +1 -1
  263. package/models/management.cattle.io.setting.js +1 -1
  264. package/models/management.cattle.io.user.js +5 -5
  265. package/models/monitoring.coreos.com.receiver.js +9 -9
  266. package/models/namespace.js +1 -1
  267. package/models/networking.k8s.io.ingress.js +5 -5
  268. package/models/persistentvolume.js +3 -3
  269. package/models/pod.js +3 -3
  270. package/models/provisioning.cattle.io.cluster.js +39 -27
  271. package/models/rbac.authorization.k8s.io.clusterrole.js +2 -2
  272. package/models/rbac.authorization.k8s.io.role.js +3 -3
  273. package/models/secret.js +1 -1
  274. package/models/service.js +2 -2
  275. package/models/storage.k8s.io.storageclass.js +2 -2
  276. package/models/token.js +1 -1
  277. package/models/workload.js +6 -6
  278. package/models/workload.service.js +5 -21
  279. package/package.json +3 -2
  280. package/pages/about.vue +9 -9
  281. package/pages/account/index.vue +2 -2
  282. package/pages/auth/login.vue +25 -12
  283. package/pages/auth/setup.vue +4 -0
  284. package/pages/auth/verify.vue +6 -0
  285. package/pages/c/_cluster/apps/charts/index.vue +4 -4
  286. package/pages/c/_cluster/apps/charts/install.vue +28 -20
  287. package/pages/c/_cluster/auth/roles/index.vue +10 -10
  288. package/pages/c/_cluster/explorer/index.vue +41 -16
  289. package/pages/c/_cluster/explorer/tools/index.vue +8 -8
  290. package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +1 -1
  291. package/pages/c/_cluster/fleet/index.vue +11 -11
  292. package/pages/c/_cluster/monitoring/index.vue +1 -1
  293. package/pages/c/_cluster/settings/links.vue +3 -3
  294. package/pages/c/_cluster/settings/performance.vue +1 -1
  295. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +6 -6
  296. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +3 -3
  297. package/pages/c/_cluster/uiplugins/InstallDialog.vue +3 -3
  298. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +1 -1
  299. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +3 -3
  300. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +6 -6
  301. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +4 -4
  302. package/pages/c/_cluster/uiplugins/index.vue +22 -19
  303. package/pages/diagnostic.vue +6 -6
  304. package/pages/home.vue +8 -3
  305. package/pages/prefs.vue +2 -2
  306. package/pages/rio/mesh.vue +3 -3
  307. package/pages/support/index.vue +10 -1
  308. package/pkg/auto-import.js +1 -1
  309. package/pkg/tsconfig.json +1 -0
  310. package/pkg/vue.config.js +1 -1
  311. package/plugins/axios.js +1 -1
  312. package/plugins/clean-html-directive.js +1 -1
  313. package/plugins/dashboard-store/__tests__/mutations.spec.js +4 -4
  314. package/plugins/dashboard-store/actions.js +4 -4
  315. package/plugins/dashboard-store/getters.js +1 -1
  316. package/plugins/dashboard-store/index.js +1 -1
  317. package/plugins/dashboard-store/mutations.js +2 -2
  318. package/plugins/dashboard-store/resource-class.js +8 -8
  319. package/plugins/i18n.js +1 -1
  320. package/plugins/plugin.js +5 -1
  321. package/plugins/steve/actions.js +25 -3
  322. package/plugins/steve/getters.js +3 -3
  323. package/plugins/steve/hybrid-class.js +1 -1
  324. package/plugins/steve/mutations.js +1 -1
  325. package/plugins/steve/performanceTesting.js +1 -1
  326. package/plugins/steve/resourceWatcher.js +1 -1
  327. package/plugins/steve/subscribe.js +6 -6
  328. package/plugins/steve/worker/web-worker.basic.js +1 -1
  329. package/promptRemove/management.cattle.io.project.vue +3 -3
  330. package/promptRemove/mixin/roleDeletionCheck.js +4 -4
  331. package/promptRemove/pod.vue +1 -1
  332. package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +2 -2
  333. package/rancher-components/components/Form/Checkbox/Checkbox.vue +1 -1
  334. package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -1
  335. package/rancher-components/components/Form/Radio/RadioButton.vue +2 -2
  336. package/rancher-components/components/Form/Radio/RadioGroup.vue +2 -2
  337. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +1 -0
  338. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +1 -1
  339. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -7
  340. package/rancher-components/components/StringList/StringList.test.ts +10 -9
  341. package/rancher-components/components/StringList/StringList.vue +5 -5
  342. package/scripts/extension/helm/charts/ui-plugin-server/Chart.yaml +1 -1
  343. package/store/action-menu.js +4 -4
  344. package/store/auth.js +40 -7
  345. package/store/aws.js +1 -1
  346. package/store/catalog.js +12 -11
  347. package/store/digitalocean.js +4 -4
  348. package/store/features.js +1 -0
  349. package/store/github.js +70 -213
  350. package/store/gitlab.js +159 -0
  351. package/store/growl.js +1 -1
  352. package/store/i18n.js +7 -7
  353. package/store/index.js +63 -22
  354. package/store/linode.js +1 -1
  355. package/store/plugins.js +5 -5
  356. package/store/pnap.js +1 -1
  357. package/store/prefs.js +6 -6
  358. package/store/resource-fetch.js +3 -3
  359. package/store/type-map.js +61 -42
  360. package/store/uiplugins.ts +2 -1
  361. package/store/wm.js +5 -4
  362. package/tsconfig.default.json +10 -0
  363. package/tsconfig.json +2 -9
  364. package/types/shell/index.d.ts +10 -2
  365. package/utils/__tests__/version.test.ts +28 -0
  366. package/utils/alertmanagerconfig.js +4 -4
  367. package/utils/array.ts +4 -4
  368. package/utils/async.ts +1 -1
  369. package/utils/auth.js +3 -3
  370. package/utils/axios.js +5 -5
  371. package/utils/cluster.js +4 -3
  372. package/utils/color.js +10 -0
  373. package/utils/create-yaml.js +4 -4
  374. package/utils/crypto/browserHashUtils.js +1 -1
  375. package/utils/crypto/browserMd5.js +1 -1
  376. package/utils/crypto/browserSha1.js +1 -1
  377. package/utils/crypto/browserSha256.js +1 -1
  378. package/utils/crypto/index.js +3 -3
  379. package/utils/favicon.js +2 -3
  380. package/utils/gatekeeper/util.js +3 -3
  381. package/utils/gc/gc.ts +2 -2
  382. package/utils/git.ts +92 -0
  383. package/utils/grafana.js +4 -4
  384. package/utils/monitoring.js +2 -2
  385. package/utils/nuxt.js +2 -2
  386. package/utils/object.js +5 -5
  387. package/utils/pod-security-admission.ts +1 -1
  388. package/utils/projectAndNamespaceFiltering.utils.ts +1 -1
  389. package/utils/select.js +2 -2
  390. package/utils/selector.js +2 -2
  391. package/utils/settings.ts +17 -2
  392. package/utils/socket.js +30 -6
  393. package/utils/sort.js +1 -1
  394. package/utils/string.js +1 -1
  395. package/utils/url.ts +1 -1
  396. package/utils/validators/formRules/index.ts +3 -3
  397. package/utils/validators/role-template.js +4 -4
  398. package/utils/version.js +14 -1
  399. package/vue.config.js +19 -13
  400. package/components/form/GithubPicker.vue +0 -390
package/store/index.js CHANGED
@@ -9,7 +9,7 @@ import {
9
9
  FLEET,
10
10
  MANAGEMENT,
11
11
  NAMESPACE, NORMAN,
12
- UI, VIRTUAL_HARVESTER_PROVIDER
12
+ UI, VIRTUAL_HARVESTER_PROVIDER, HCI
13
13
  } from '@shell/config/types';
14
14
  import { BY_TYPE } from '@shell/plugins/dashboard-store/classify';
15
15
  import Steve from '@shell/plugins/steve';
@@ -133,11 +133,11 @@ const getActiveSingleNamespaces = (getters, filters) => {
133
133
  const getReadOnlyActiveNamespaces = (namespaces, activeNamespaces) => {
134
134
  const readonlyNamespaces = Object
135
135
  .values(namespaces)
136
- .filter(ns => !!ns.links.update)
136
+ .filter((ns) => !!ns.links.update)
137
137
  .map(({ id }) => id);
138
138
 
139
139
  return Object.keys(activeNamespaces)
140
- .filter(ns => readonlyNamespaces.includes(ns))
140
+ .filter((ns) => readonlyNamespaces.includes(ns))
141
141
  .reduce((acc, ns) => ({
142
142
  ...acc,
143
143
  [ns]: true
@@ -179,12 +179,12 @@ const getActiveNamespaces = (state, getters, readonly = false) => {
179
179
  const allNamespaces = hasNamespaces ? state.allNamespaces : getters[`${ inStore }/all`](NAMESPACE);
180
180
 
181
181
  const allowedNamespaces = allNamespaces
182
- .filter(ns => state.prefs.data['all-namespaces'] ? true : !ns.isObscure) // Filter out Rancher system namespaces
183
- .filter(ns => product.hideSystemResources ? !ns.isSystem : true); // Filter out Fleet system namespaces
182
+ .filter((ns) => state.prefs.data['all-namespaces'] ? true : !ns.isObscure) // Filter out Rancher system namespaces
183
+ .filter((ns) => product.hideSystemResources ? !ns.isSystem : true); // Filter out Fleet system namespaces
184
184
 
185
185
  // Retrieve all the filters selected by the user
186
186
  const filters = state.namespaceFilters.filter(
187
- filters => !!filters && !`${ filters }`.startsWith(NAMESPACED_PREFIX)
187
+ (filters) => !!filters && !`${ filters }`.startsWith(NAMESPACED_PREFIX)
188
188
  );
189
189
 
190
190
  const activeNamespaces = {
@@ -211,7 +211,7 @@ const updateActiveNamespaceCache = (state, activeNamespaceCache) => {
211
211
  let cacheKey = '';
212
212
 
213
213
  for (const key in activeNamespaceCache) {
214
- // I though array.join would be faster than string concatenation, but in places like this where the array must first be constructed it's
214
+ // I thought array.join would be faster than string concatenation, but in places like this where the array must first be constructed it's
215
215
  // slower.
216
216
  cacheKey += key + activeNamespaceCache[key];
217
217
  }
@@ -242,6 +242,8 @@ export const state = () => {
242
242
  serverVersion: null,
243
243
  systemNamespaces: [],
244
244
  isSingleProduct: undefined,
245
+ isRancherInHarvester: false,
246
+ targetRoute: null
245
247
  };
246
248
  };
247
249
 
@@ -307,7 +309,7 @@ export const getters = {
307
309
  getStoreNameByProductId(state) {
308
310
  const products = state['type-map']?.products;
309
311
 
310
- return (products.find(p => p.name === state.productId) || {})?.inStore || 'cluster';
312
+ return (products.find((p) => p.name === state.productId) || {})?.inStore || 'cluster';
311
313
  },
312
314
 
313
315
  currentStore(state, getters) {
@@ -342,7 +344,7 @@ export const getters = {
342
344
 
343
345
  const desired = getters['prefs/get'](CLUSTER_PREF);
344
346
 
345
- if ( clusters.find(x => x.id === desired) ) {
347
+ if ( clusters.find((x) => x.id === desired) ) {
346
348
  return desired;
347
349
  } else if ( clusters.length ) {
348
350
  return clusters[0].id;
@@ -366,7 +368,7 @@ export const getters = {
366
368
  return true;
367
369
  }
368
370
 
369
- return state.namespaceFilters.filter(x => !`${ x }`.startsWith(NAMESPACED_PREFIX)).length === 0;
371
+ return state.namespaceFilters.filter((x) => !`${ x }`.startsWith(NAMESPACED_PREFIX)).length === 0;
370
372
  },
371
373
 
372
374
  isMultipleNamespaces(state, getters) {
@@ -394,7 +396,7 @@ export const getters = {
394
396
  },
395
397
 
396
398
  namespaceFilters(state) {
397
- const filters = state.namespaceFilters.filter(x => !!x && !`${ x }`.startsWith(NAMESPACED_PREFIX));
399
+ const filters = state.namespaceFilters.filter((x) => !!x && !`${ x }`.startsWith(NAMESPACED_PREFIX));
398
400
 
399
401
  return filters;
400
402
  },
@@ -475,7 +477,7 @@ export const getters = {
475
477
  const inStore = product.inStore;
476
478
  const filteredMap = getters['activeNamespaceCache'];
477
479
  const isAll = getters['isAllNamespaces'];
478
- const all = getters[`${ inStore }/all`](NAMESPACE).map(x => x.id);
480
+ const all = getters[`${ inStore }/all`](NAMESPACE).map((x) => x.id);
479
481
  let out;
480
482
 
481
483
  function isOk() {
@@ -550,12 +552,27 @@ export const getters = {
550
552
  return false;
551
553
  },
552
554
 
555
+ isRancherInHarvester(state) {
556
+ return state.isRancherInHarvester;
557
+ },
558
+
553
559
  isVirtualCluster(state, getters) {
554
560
  const cluster = getters['currentCluster'];
555
561
 
556
562
  return cluster?.status?.provider === VIRTUAL_HARVESTER_PROVIDER;
557
563
  },
558
564
 
565
+ isStandaloneHarvester(state, getters) {
566
+ const clusters = getters['management/all'](MANAGEMENT.CLUSTER);
567
+ const cluster = clusters.find((c) => c.id === 'local') || {};
568
+
569
+ return getters['isSingleProduct'] && cluster.isHarvester && !getters['isRancherInHarvester'];
570
+ },
571
+
572
+ targetRoute(state) {
573
+ return state.targetRoute;
574
+ },
575
+
559
576
  ...gcGetters
560
577
  };
561
578
 
@@ -568,13 +585,16 @@ export const mutations = {
568
585
  state.clusterReady = ready;
569
586
  },
570
587
 
588
+ isRancherInHarvester(state, neu) {
589
+ state.isRancherInHarvester = neu;
590
+ },
591
+
571
592
  updateNamespaces(state, { filters, all }) {
572
- state.namespaceFilters = filters.filter(x => !!x);
593
+ state.namespaceFilters = filters.filter((x) => !!x);
573
594
 
574
595
  if ( all ) {
575
596
  state.allNamespaces = all;
576
597
  }
577
-
578
598
  // Create map that can be used to efficiently check if a
579
599
  // resource should be displayed
580
600
  getActiveNamespaces(state, getters);
@@ -648,6 +668,9 @@ export const mutations = {
648
668
  state.isSingleProduct = isSingleProduct;
649
669
  },
650
670
 
671
+ targetRoute(state, route) {
672
+ state.targetRoute = route;
673
+ }
651
674
  };
652
675
 
653
676
  export const actions = {
@@ -713,9 +736,20 @@ export const actions = {
713
736
  dispatch('i18n/init');
714
737
  const isMultiCluster = getters['isMultiCluster'];
715
738
 
716
- const pl = res.settings?.find(x => x.id === 'ui-pl')?.value;
717
- const brand = res.settings?.find(x => x.id === SETTING.BRAND)?.value;
718
- const systemNamespaces = res.settings?.find(x => x.id === SETTING.SYSTEM_NAMESPACES);
739
+ // If the local cluster is a Harvester cluster and 'rancher-manager-support' is true, it means that the embedded Rancher is being used.
740
+ const localCluster = res.clusters?.find((c) => c.id === 'local');
741
+
742
+ if (localCluster?.isHarvester) {
743
+ const harvesterSetting = await dispatch('cluster/findAll', { type: HCI.SETTING, opt: { url: `/v1/harvester/${ HCI.SETTING }s` } });
744
+ const rancherManagerSupport = harvesterSetting.find((setting) => setting.id === 'rancher-manager-support');
745
+ const isRancherInHarvester = (rancherManagerSupport?.value || rancherManagerSupport?.default) === 'true';
746
+
747
+ commit('isRancherInHarvester', isRancherInHarvester);
748
+ }
749
+
750
+ const pl = res.settings?.find((x) => x.id === 'ui-pl')?.value;
751
+ const brand = res.settings?.find((x) => x.id === SETTING.BRAND)?.value;
752
+ const systemNamespaces = res.settings?.find((x) => x.id === SETTING.SYSTEM_NAMESPACES);
719
753
 
720
754
  if ( pl ) {
721
755
  setVendor(pl);
@@ -750,8 +784,9 @@ export const actions = {
750
784
  async loadCluster({
751
785
  state, commit, dispatch, getters
752
786
  }, {
753
- id, product, oldProduct, oldPkg, newPkg
787
+ id, product, oldProduct, oldPkg, newPkg, targetRoute
754
788
  }) {
789
+ commit('targetRoute', targetRoute);
755
790
  const sameCluster = state.clusterId && state.clusterId === id;
756
791
  const samePackage = oldPkg?.name === newPkg?.name;
757
792
  const isMultiCluster = getters['isMultiCluster'];
@@ -763,14 +798,14 @@ export const actions = {
763
798
  }
764
799
 
765
800
  const oldPkgClusterStore = oldPkg?.stores.find(
766
- s => getters[`${ s.storeName }/isClusterStore`]
801
+ (s) => getters[`${ s.storeName }/isClusterStore`]
767
802
  )?.storeName;
768
803
 
769
804
  const newPkgClusterStore = newPkg?.stores.find(
770
- s => getters[`${ s.storeName }/isClusterStore`]
805
+ (s) => getters[`${ s.storeName }/isClusterStore`]
771
806
  )?.storeName;
772
807
 
773
- const productConfig = state['type-map']?.products?.find(p => p.name === product);
808
+ const productConfig = state['type-map']?.products?.find((p) => p.name === product);
774
809
  const forgetCurrentCluster = ((state.clusterId && id) || !samePackage) && !productConfig?.inExplorer;
775
810
 
776
811
  // Should we leave/forget the current cluster? Only if we're going from an existing cluster to a new cluster, or the package has changed
@@ -902,12 +937,17 @@ export const actions = {
902
937
  await dispatch('cleanNamespaces');
903
938
 
904
939
  const filters = getters['prefs/get'](NAMESPACE_FILTERS)?.[id];
940
+ const allNamespaces = res.namespaces;
905
941
 
906
942
  commit('updateNamespaces', {
907
943
  filters: filters || [ALL_USER],
908
- all: res.namespaces,
944
+ all: allNamespaces,
909
945
  });
910
946
 
947
+ if (getters['currentCluster'] && getters['currentCluster'].isHarvester) {
948
+ await dispatch('cluster/findAll', { type: HCI.SETTING });
949
+ }
950
+
911
951
  commit('clusterReady', true);
912
952
 
913
953
  console.log('Done loading cluster.'); // eslint-disable-line no-console
@@ -923,6 +963,7 @@ export const actions = {
923
963
  [key]: ids
924
964
  }
925
965
  });
966
+
926
967
  commit('updateNamespaces', { filters: ids });
927
968
  },
928
969
 
package/store/linode.js CHANGED
@@ -21,7 +21,7 @@ export const mutations = {
21
21
  };
22
22
 
23
23
  export const getters = {
24
- fromCache: state => ({ credentialId, key }) => {
24
+ fromCache: (state) => ({ credentialId, key }) => {
25
25
  return state.cache[credentialId]?.[key];
26
26
  },
27
27
  };
package/store/plugins.js CHANGED
@@ -72,12 +72,12 @@ export const likelyFields = [
72
72
  'token', 'apikey',
73
73
  'secret',
74
74
  'clientid', 'clientsecret', 'subscriptionid', 'tenantid',
75
- ].map(x => simplify(x));
75
+ ].map((x) => simplify(x));
76
76
 
77
77
  // Machine driver fields that are maaaaybe a credential field
78
78
  export const iffyFields = [
79
79
  'location', 'region',
80
- ].map(x => simplify(x));
80
+ ].map((x) => simplify(x));
81
81
 
82
82
  // Machine driver fields that are safe to display the whole value
83
83
  export const fullFields = [
@@ -85,18 +85,18 @@ export const fullFields = [
85
85
  'accesskey',
86
86
  'accesskeyid',
87
87
  'clientid'
88
- ].map(x => simplify(x));
88
+ ].map((x) => simplify(x));
89
89
 
90
90
  // Machine driver fields that are safe to display the beginning of
91
91
  export const prefixFields = [
92
92
  'token',
93
93
  'apikey',
94
94
  'secret',
95
- ].map(x => simplify(x));
95
+ ].map((x) => simplify(x));
96
96
 
97
97
  // Machine driver fields that are safe to display the end of
98
98
  export const suffixFields = [
99
- ].map(x => simplify(x));
99
+ ].map((x) => simplify(x));
100
100
 
101
101
  // Machine driver to cloud provider mapping
102
102
  const driverToCloudProviderMap = {
package/store/pnap.js CHANGED
@@ -21,7 +21,7 @@ export const mutations = {
21
21
  };
22
22
 
23
23
  export const getters = {
24
- fromCache: state => ({ credentialId, key }) => {
24
+ fromCache: (state) => ({ credentialId, key }) => {
25
25
  return state.cache[credentialId]?.[key];
26
26
  },
27
27
  };
package/store/prefs.js CHANGED
@@ -60,8 +60,8 @@ export const THEME = create('theme', 'auto', {
60
60
  options: ['light', 'auto', 'dark'],
61
61
  asCookie,
62
62
  parseJSON,
63
- mangleRead: x => x.replace(/^ui-/, ''),
64
- mangleWrite: x => `ui-${ x }`,
63
+ mangleRead: (x) => x.replace(/^ui-/, ''),
64
+ mangleWrite: (x) => `ui-${ x }`,
65
65
  });
66
66
  export const PREFERS_SCHEME = create('pcs', '', { asCookie, asUserPreference: false });
67
67
  export const LOCALE = create('locale', 'en-us', { asCookie });
@@ -141,7 +141,7 @@ export const state = function() {
141
141
  };
142
142
 
143
143
  export const getters = {
144
- get: state => (key) => {
144
+ get: (state) => (key) => {
145
145
  const definition = state.definitions[key];
146
146
 
147
147
  if (!definition) {
@@ -159,7 +159,7 @@ export const getters = {
159
159
  return def;
160
160
  },
161
161
 
162
- defaultValue: state => (key) => {
162
+ defaultValue: (state) => (key) => {
163
163
  const definition = state.definitions[key];
164
164
 
165
165
  if (!definition) {
@@ -169,7 +169,7 @@ export const getters = {
169
169
  return clone(definition.def);
170
170
  },
171
171
 
172
- options: state => (key) => {
172
+ options: (state) => (key) => {
173
173
  const definition = state.definitions[key];
174
174
 
175
175
  if (!definition) {
@@ -531,7 +531,7 @@ function getLoginRoute(route) {
531
531
  const routeParams = route.params || {};
532
532
 
533
533
  // Find the 'resource' part of the route, if it is there
534
- const index = parts.findIndex(p => p === 'resource');
534
+ const index = parts.findIndex((p) => p === 'resource');
535
535
 
536
536
  if (index >= 0) {
537
537
  parts = parts.slice(0, index);
@@ -7,9 +7,9 @@ export const state = function() {
7
7
  };
8
8
 
9
9
  export const getters = {
10
- isTooManyItemsToAutoUpdate: state => state.isTooManyItemsToAutoUpdate,
11
- refreshFlag: state => state.refreshFlag,
12
- manualRefreshIsLoading: state => state.manualRefreshIsLoading
10
+ isTooManyItemsToAutoUpdate: (state) => state.isTooManyItemsToAutoUpdate,
11
+ refreshFlag: (state) => state.refreshFlag,
12
+ manualRefreshIsLoading: (state) => state.manualRefreshIsLoading
13
13
  };
14
14
 
15
15
  export const mutations = {
package/store/type-map.js CHANGED
@@ -140,13 +140,14 @@ import {
140
140
  ensureRegex, escapeHtml, escapeRegex, ucFirst, pluralize
141
141
  } from '@shell/utils/string';
142
142
  import {
143
- importChart, importList, importDetail, importEdit, listProducts, loadProduct, importCustomPromptRemove, resolveList, resolveEdit, resolveWindowComponent, importWindowComponent, resolveChart, resolveDetail, importDialog, importMachineConfig, resolveMachineConfigComponent, resolveCloudCredentialComponent, importCloudCredential
143
+ importChart, importList, importDetail, importEdit, listProducts, loadProduct, importCustomPromptRemove, resolveList, resolveEdit, resolveWindowComponent, importWindowComponent, importLogin, resolveChart, resolveDetail, importDialog, importMachineConfig, resolveMachineConfigComponent, resolveCloudCredentialComponent, importCloudCredential
144
144
  } from '@shell/utils/dynamic-importer';
145
145
 
146
146
  import { NAME as EXPLORER } from '@shell/config/product/explorer';
147
147
  import isObject from 'lodash/isObject';
148
148
  import { normalizeType } from '@shell/plugins/dashboard-store/normalize';
149
149
  import { sortBy } from '@shell/utils/sort';
150
+
150
151
  import { haveV1Monitoring, haveV2Monitoring } from '@shell/utils/monitoring';
151
152
  import { NEU_VECTOR_NAMESPACE } from '@shell/config/product/neuvector';
152
153
 
@@ -172,14 +173,16 @@ const graphConfigMap = {};
172
173
  const FIELD_REGEX = /^\$\.metadata\.fields\[([0-9]*)\]/;
173
174
 
174
175
  export const IF_HAVE = {
175
- V1_MONITORING: 'v1-monitoring',
176
- V2_MONITORING: 'v2-monitoring',
177
- PROJECT: 'project',
178
- NO_PROJECT: 'no-project',
179
- NOT_V1_ISTIO: 'not-v1-istio',
180
- MULTI_CLUSTER: 'multi-cluster',
181
- NEUVECTOR_NAMESPACE: 'neuvector-namespace',
182
- ADMIN: 'admin-user',
176
+ V1_MONITORING: 'v1-monitoring',
177
+ V2_MONITORING: 'v2-monitoring',
178
+ PROJECT: 'project',
179
+ NO_PROJECT: 'no-project',
180
+ NOT_V1_ISTIO: 'not-v1-istio',
181
+ MULTI_CLUSTER: 'multi-cluster',
182
+ NEUVECTOR_NAMESPACE: 'neuvector-namespace',
183
+ ADMIN: 'admin-user',
184
+ MCM_DISABLED: 'mcm-disabled',
185
+ NOT_STANDALONE_HARVESTER: 'not-standalone-harvester',
183
186
  };
184
187
 
185
188
  export function DSL(store, product, module = 'type-map') {
@@ -287,8 +290,8 @@ export function DSL(store, product, module = 'type-map') {
287
290
  store.commit(`${ module }/ignoreType`, regexOrString);
288
291
  },
289
292
 
290
- ignoreGroup(regexOrString) {
291
- store.commit(`${ module }/ignoreGroup`, regexOrString);
293
+ ignoreGroup(regexOrString, cb) {
294
+ store.commit(`${ module }/ignoreGroup`, { regexOrString, cb });
292
295
  },
293
296
 
294
297
  weightGroup(input, weight, forBasic) {
@@ -473,7 +476,7 @@ export const getters = {
473
476
  const match = group.match(/^(.*)\.k8s\.io$/);
474
477
 
475
478
  if ( match ) {
476
- return match[1].split(/\./).map(x => ucFirst(x)).join('.');
479
+ return match[1].split(/\./).map((x) => ucFirst(x)).join('.');
477
480
  }
478
481
 
479
482
  return group;
@@ -775,7 +778,7 @@ export const getters = {
775
778
  product = product || rootGetters['productId'];
776
779
  const productSpoofedTypes = state.spoofedTypes[product] || [];
777
780
 
778
- return productSpoofedTypes.some(st => st.type === type);
781
+ return productSpoofedTypes.some((st) => st.type === type);
779
782
  };
780
783
  },
781
784
 
@@ -808,7 +811,7 @@ export const getters = {
808
811
  return async(type, product, id) => {
809
812
  const productInstances = await getters.getSpoofedInstances(type, product);
810
813
 
811
- return productInstances.find( instance => instance.id === id);
814
+ return productInstances.find( (instance) => instance.id === id);
812
815
  };
813
816
  },
814
817
 
@@ -823,7 +826,7 @@ export const getters = {
823
826
  return types.flatMap((type) => {
824
827
  const schemas = type.schemas || [];
825
828
 
826
- return schemas.map(schema => ({
829
+ return schemas.map((schema) => ({
827
830
  ...schema,
828
831
  isSpoofed: true
829
832
  }));
@@ -835,7 +838,7 @@ export const getters = {
835
838
  return getters.allSpoofedTypes.flatMap((type) => {
836
839
  const schemas = type.schemas || [];
837
840
 
838
- return schemas.map(schema => ({
841
+ return schemas.map((schema) => ({
839
842
  ...schema,
840
843
  isSpoofed: true
841
844
  }));
@@ -918,7 +921,7 @@ export const getters = {
918
921
  const targetedSchemas = typeof item.ifHaveType === 'string' ? schemas : rootGetters[`${ item.ifHaveType.store }/all`](SCHEMA);
919
922
  const type = typeof item.ifHaveType === 'string' ? item.ifHaveType : item.ifHaveType?.type;
920
923
 
921
- const haveIds = filterBy(targetedSchemas, 'id', normalizeType(type)).map(s => s.id);
924
+ const haveIds = filterBy(targetedSchemas, 'id', normalizeType(type)).map((s) => s.id);
922
925
 
923
926
  if (!haveIds.length) {
924
927
  continue;
@@ -1001,7 +1004,7 @@ export const getters = {
1001
1004
  } else {
1002
1005
  return entry;
1003
1006
  }
1004
- }).filter(col => !!col);
1007
+ }).filter((col) => !!col);
1005
1008
  }
1006
1009
 
1007
1010
  // Otherwise make one up from schema
@@ -1055,7 +1058,7 @@ export const getters = {
1055
1058
  formatter = 'Number';
1056
1059
  }
1057
1060
 
1058
- const colName = col.name.includes(' ') ? col.name.split(' ').map(word => word.charAt(0).toUpperCase() + word.substring(1) ).join('') : col.name;
1061
+ const colName = col.name.includes(' ') ? col.name.split(' ').map((word) => word.charAt(0).toUpperCase() + word.substring(1) ).join('') : col.name;
1059
1062
 
1060
1063
  const exists = rootGetters['i18n/exists'];
1061
1064
  const t = rootGetters['i18n/t'];
@@ -1089,7 +1092,7 @@ export const getters = {
1089
1092
  return (rawType) => {
1090
1093
  const key = getters.componentFor(rawType);
1091
1094
 
1092
- return hasCustom(state, rootState, 'list', key, key => resolveList(key));
1095
+ return hasCustom(state, rootState, 'list', key, (key) => resolveList(key));
1093
1096
  };
1094
1097
  },
1095
1098
 
@@ -1097,7 +1100,7 @@ export const getters = {
1097
1100
  return (rawType) => {
1098
1101
  const key = getters.componentFor(rawType);
1099
1102
 
1100
- return hasCustom(state, rootState, 'chart', key, key => resolveChart(key));
1103
+ return hasCustom(state, rootState, 'chart', key, (key) => resolveChart(key));
1101
1104
  };
1102
1105
  },
1103
1106
 
@@ -1105,7 +1108,7 @@ export const getters = {
1105
1108
  return (rawType, subType) => {
1106
1109
  const key = getters.componentFor(rawType, subType);
1107
1110
 
1108
- return hasCustom(state, rootState, 'detail', key, key => resolveDetail(key));
1111
+ return hasCustom(state, rootState, 'detail', key, (key) => resolveDetail(key));
1109
1112
  };
1110
1113
  },
1111
1114
 
@@ -1125,13 +1128,13 @@ export const getters = {
1125
1128
  return (rawType, subType) => {
1126
1129
  const key = getters.componentFor(rawType, subType);
1127
1130
 
1128
- return hasCustom(state, rootState, 'edit', key, key => resolveEdit(key));
1131
+ return hasCustom(state, rootState, 'edit', key, (key) => resolveEdit(key));
1129
1132
  };
1130
1133
  },
1131
1134
 
1132
1135
  hasComponent(state, getters, rootState) {
1133
1136
  return (path) => {
1134
- return hasCustom(state, rootState, 'edit', path, path => resolveEdit(path));
1137
+ return hasCustom(state, rootState, 'edit', path, (path) => resolveEdit(path));
1135
1138
  };
1136
1139
  },
1137
1140
 
@@ -1147,7 +1150,7 @@ export const getters = {
1147
1150
  return (rawType, subType) => {
1148
1151
  const key = getters.componentFor(rawType, subType);
1149
1152
 
1150
- return hasCustom(state, rootState, 'windowComponents', key, key => resolveWindowComponent(key));
1153
+ return hasCustom(state, rootState, 'windowComponents', key, (key) => resolveWindowComponent(key));
1151
1154
  };
1152
1155
  },
1153
1156
 
@@ -1155,7 +1158,7 @@ export const getters = {
1155
1158
  return (rawType, subType) => {
1156
1159
  const key = getters.componentFor(rawType, subType);
1157
1160
 
1158
- return hasCustom(state, rootState, 'machine-config', key, key => resolveMachineConfigComponent(key));
1161
+ return hasCustom(state, rootState, 'machine-config', key, (key) => resolveMachineConfigComponent(key));
1159
1162
  };
1160
1163
  },
1161
1164
 
@@ -1163,7 +1166,7 @@ export const getters = {
1163
1166
  return (rawType, subType) => {
1164
1167
  const key = getters.componentFor(rawType, subType);
1165
1168
 
1166
- return hasCustom(state, rootState, 'cloud-credential', key, key => resolveCloudCredentialComponent(key));
1169
+ return hasCustom(state, rootState, 'cloud-credential', key, (key) => resolveCloudCredentialComponent(key));
1167
1170
  };
1168
1171
  },
1169
1172
 
@@ -1215,6 +1218,12 @@ export const getters = {
1215
1218
  };
1216
1219
  },
1217
1220
 
1221
+ importLogin(state, getters, rootState) {
1222
+ return (authType) => {
1223
+ return loadExtension(rootState, 'login', authType, importLogin);
1224
+ };
1225
+ },
1226
+
1218
1227
  importMachineConfig(state, getters, rootState) {
1219
1228
  return (rawType, subType) => {
1220
1229
  return loadExtension(rootState, 'machine-config', getters.componentFor(rawType, subType), importMachineConfig);
@@ -1260,18 +1269,19 @@ export const getters = {
1260
1269
  };
1261
1270
  },
1262
1271
 
1263
- isIgnored(state) {
1272
+ isIgnored(state, getters, rootState, rootGetters) {
1264
1273
  return (schema) => {
1265
- if ( state.cache.ignore[schema.id] !== undefined ) {
1266
- return state.cache.ignore[schema.id];
1267
- }
1268
-
1269
1274
  let out = false;
1270
1275
 
1271
1276
  for ( const rule of state.groupIgnore ) {
1272
1277
  const group = schema?.attributes?.group;
1273
1278
 
1274
- if ( group && group.match(stringToRegex(rule)) ) {
1279
+ if (group && group.match(stringToRegex(rule.type) && isObject(rule) && rule.type)) {
1280
+ out = rule.cb(rootGetters);
1281
+ break;
1282
+ }
1283
+
1284
+ if ( group && typeof rule === 'string' && group.match(stringToRegex(rule)) ) {
1275
1285
  out = true;
1276
1286
  break;
1277
1287
  }
@@ -1344,7 +1354,7 @@ export const getters = {
1344
1354
  }
1345
1355
 
1346
1356
  if ( p.ifHaveType ) {
1347
- const haveIds = knownTypes[module].filter(t => t.match(stringToRegex(p.ifHaveType)) );
1357
+ const haveIds = knownTypes[module].filter((t) => t.match(stringToRegex(p.ifHaveType)) );
1348
1358
 
1349
1359
  if ( !haveIds.length ) {
1350
1360
  return false;
@@ -1355,7 +1365,7 @@ export const getters = {
1355
1365
  }
1356
1366
  }
1357
1367
 
1358
- if ( p.ifHaveGroup && !knownGroups[module].find(t => t.match(stringToRegex(p.ifHaveGroup)) ) ) {
1368
+ if ( p.ifHaveGroup && !knownGroups[module].find((t) => t.match(stringToRegex(p.ifHaveGroup)) ) ) {
1359
1369
  return false;
1360
1370
  }
1361
1371
 
@@ -1389,7 +1399,7 @@ export const mutations = {
1389
1399
 
1390
1400
  // Remove the specified product
1391
1401
  remove(state, { product, plugin }) {
1392
- const existing = state.products.findIndex(p => p.name === product);
1402
+ const existing = state.products.findIndex((p) => p.name === product);
1393
1403
 
1394
1404
  // Remove the product
1395
1405
  if (existing !== -1) {
@@ -1518,10 +1528,13 @@ export const mutations = {
1518
1528
  }
1519
1529
  },
1520
1530
 
1521
- ignoreGroup(state, match) {
1531
+ ignoreGroup(state, { regexOrString: match, cb }) {
1522
1532
  match = ensureRegex(match);
1523
1533
  // State shouldn't contain actual RegExp objects, because they don't serialize
1524
- state.groupIgnore.push(regexToString(match));
1534
+ cb ? state.groupIgnore.push({
1535
+ type: regexToString(match),
1536
+ cb
1537
+ }) : state.groupIgnore.push(regexToString(match));
1525
1538
  },
1526
1539
 
1527
1540
  ignoreType(state, match) {
@@ -1628,7 +1641,7 @@ export const mutations = {
1628
1641
  configureType(state, options) {
1629
1642
  const match = regexToString(ensureRegex(options.match));
1630
1643
 
1631
- const idx = state.typeOptions.findIndex(obj => obj.match === match);
1644
+ const idx = state.typeOptions.findIndex((obj) => obj.match === match);
1632
1645
  let obj = { ...options, match };
1633
1646
 
1634
1647
  if ( idx >= 0 ) {
@@ -1818,11 +1831,17 @@ function ifHave(getters, option) {
1818
1831
  return getters.isMultiCluster;
1819
1832
  }
1820
1833
  case IF_HAVE.NEUVECTOR_NAMESPACE: {
1821
- return getters[`cluster/all`](NAMESPACE).find(n => n.metadata.name === NEU_VECTOR_NAMESPACE);
1834
+ return getters[`cluster/all`](NAMESPACE).find((n) => n.metadata.name === NEU_VECTOR_NAMESPACE);
1822
1835
  }
1823
1836
  case IF_HAVE.ADMIN: {
1824
1837
  return isAdminUser(getters);
1825
1838
  }
1839
+ case IF_HAVE.MCM_DISABLED: {
1840
+ return !getters['isRancherInHarvester'];
1841
+ }
1842
+ case IF_HAVE.NOT_STANDALONE_HARVESTER: {
1843
+ return !getters['isStandaloneHarvester'];
1844
+ }
1826
1845
  default:
1827
1846
  return false;
1828
1847
  }
@@ -1858,7 +1877,7 @@ function _rowValueGetter(col) {
1858
1877
  if (found && found.length === 2) {
1859
1878
  const fieldIndex = parseInt(found[1], 10);
1860
1879
 
1861
- return row => row.metadata?.fields?.[fieldIndex];
1880
+ return (row) => row.metadata?.fields?.[fieldIndex];
1862
1881
  }
1863
1882
  }
1864
1883
 
@@ -1878,7 +1897,7 @@ function ifHaveVerb(rootGetters, module, verb, haveIds) {
1878
1897
  const want = verb.toLowerCase();
1879
1898
  const collectionMethods = schema.collectionMethods || [];
1880
1899
  const resourceMethods = schema.resourceMethods || [];
1881
- const have = [...collectionMethods, ...resourceMethods].map(x => x.toLowerCase());
1900
+ const have = [...collectionMethods, ...resourceMethods].map((x) => x.toLowerCase());
1882
1901
 
1883
1902
  if ( !have.includes(want) && !have.includes(`blocked-${ want }`) ) {
1884
1903
  return false;
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
1
2
  // We already have a 'plugins' store, which is for cluster drivers
2
3
  // This store is for the instsall UI plugins
3
4
 
@@ -43,7 +44,7 @@ export const mutations = {
43
44
  },
44
45
 
45
46
  removePlugin(state: UIPluginState, pluginName: string) {
46
- const index = state.plugins.findIndex(p => p.name === pluginName);
47
+ const index = state.plugins.findIndex((p) => p.name === pluginName);
47
48
 
48
49
  if (index !== -1) {
49
50
  state.plugins.splice(index, 1);