@rancher/shell 0.3.13 → 0.3.15

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 (396) hide show
  1. package/assets/images/providers/nutanix.svg +1 -0
  2. package/assets/translations/en-us.yaml +89 -2
  3. package/chart/gatekeeper.vue +2 -2
  4. package/chart/monitoring/alerting/index.vue +3 -3
  5. package/chart/monitoring/index.vue +2 -2
  6. package/chart/monitoring/prometheus/index.vue +1 -1
  7. package/chart/rancher-backup/index.vue +2 -2
  8. package/cloud-credential/harvester.vue +2 -2
  9. package/components/AssignTo.vue +1 -1
  10. package/components/AwsComplianceBanner.vue +1 -1
  11. package/components/BackLink.vue +7 -0
  12. package/components/BrandImage.vue +3 -3
  13. package/components/ClusterProviderIcon.vue +1 -1
  14. package/components/CommunityLinks.vue +2 -2
  15. package/components/ConsumptionGauge.vue +17 -2
  16. package/components/CruResource.vue +2 -1
  17. package/components/DashboardMetrics.vue +8 -0
  18. package/components/DetailTop.vue +1 -1
  19. package/components/ExplorerMembers.vue +8 -8
  20. package/components/ExplorerProjectsNamespaces.vue +9 -9
  21. package/components/FixedBanner.vue +1 -1
  22. package/components/GlobalRoleBindings.vue +11 -11
  23. package/components/GrafanaDashboard.vue +7 -1
  24. package/components/GrowlManager.vue +1 -1
  25. package/components/HarvesterServiceAddOnConfig.vue +117 -2
  26. package/components/IconOrSvg.vue +10 -3
  27. package/components/LandingPagePreference.vue +2 -2
  28. package/components/MoveModal.vue +1 -1
  29. package/components/PodSecurityAdmission.vue +3 -3
  30. package/components/ProgressBarMulti.vue +2 -2
  31. package/components/PromptRemove.vue +52 -28
  32. package/components/PromptRestore.vue +3 -3
  33. package/components/Questions/index.vue +5 -5
  34. package/components/RelatedWorkloadsTable.vue +1 -1
  35. package/components/ResourceList/Masthead.vue +1 -1
  36. package/components/ResourceTable.vue +3 -3
  37. package/components/ResourceYaml.vue +1 -1
  38. package/components/RoleBindings.vue +2 -2
  39. package/components/SingleClusterInfo.vue +1 -1
  40. package/components/SortableTable/actions.js +3 -3
  41. package/components/SortableTable/advanced-filtering.js +7 -7
  42. package/components/SortableTable/filtering.js +1 -1
  43. package/components/SortableTable/index.vue +9 -9
  44. package/components/SortableTable/selection.js +5 -5
  45. package/components/SortableTable/sorting.js +5 -5
  46. package/components/Tabbed/index.vue +7 -7
  47. package/components/TableSparkLine.vue +1 -1
  48. package/components/Wizard.vue +11 -23
  49. package/components/__tests__/Collapse.spec.ts +1 -1
  50. package/components/__tests__/CruResource.test.ts +74 -0
  51. package/components/__tests__/SimpleBox.spec.ts +1 -1
  52. package/components/auth/RoleDetailEdit.vue +7 -3
  53. package/components/auth/SelectPrincipal.vue +3 -3
  54. package/components/fleet/FleetResources.vue +1 -1
  55. package/components/fleet/FleetStatus.vue +4 -4
  56. package/components/fleet/FleetSummary.vue +1 -1
  57. package/components/fleet/ForceDirectedTreeChart/chartIcons.js +1 -1
  58. package/components/fleet/ForceDirectedTreeChart/index.vue +1 -1
  59. package/components/form/ArrayList.vue +11 -3
  60. package/components/form/ArrayListSelect.vue +2 -2
  61. package/components/form/FileSelector.vue +6 -0
  62. package/components/form/GitPicker.vue +528 -0
  63. package/components/form/KeyValue.vue +82 -41
  64. package/components/form/LabeledSelect.vue +2 -2
  65. package/components/form/MatchExpressions.vue +2 -2
  66. package/components/form/Members/ClusterMembershipEditor.vue +1 -2
  67. package/components/form/Members/ClusterPermissionsEditor.vue +6 -5
  68. package/components/form/Members/MembershipEditor.vue +4 -4
  69. package/components/form/Members/ProjectMembershipEditor.vue +1 -2
  70. package/components/form/NameNsDescription.vue +13 -6
  71. package/components/form/Networking.vue +2 -2
  72. package/components/form/NodeScheduling.vue +1 -1
  73. package/components/form/PodAffinity.vue +1 -1
  74. package/components/form/ProjectMemberEditor.vue +4 -4
  75. package/components/form/ResourceQuota/Namespace.vue +2 -2
  76. package/components/form/ResourceQuota/NamespaceRow.vue +2 -2
  77. package/components/form/ResourceQuota/Project.vue +1 -1
  78. package/components/form/ResourceQuota/shared.js +2 -2
  79. package/components/form/ResourceSelector.vue +1 -1
  80. package/components/form/ResourceTabs/index.vue +1 -1
  81. package/components/form/RuleSelector.vue +1 -1
  82. package/components/form/SecretSelector.vue +4 -4
  83. package/components/form/Select.vue +2 -2
  84. package/components/form/SelectOrCreateAuthSecret.vue +3 -3
  85. package/components/form/ServiceNameSelect.vue +1 -1
  86. package/components/form/ServicePorts.vue +1 -1
  87. package/components/form/ShellInput.vue +1 -1
  88. package/components/form/SimpleSecretSelector.vue +4 -4
  89. package/components/form/Taints.vue +1 -1
  90. package/components/form/ValueFromResource.vue +3 -3
  91. package/components/form/WorkloadPorts.vue +8 -7
  92. package/components/form/__tests__/Error.test.ts +1 -1
  93. package/components/form/__tests__/KeyValue.test.ts +21 -0
  94. package/components/formatter/ClusterLink.vue +1 -1
  95. package/components/formatter/ClusterProvider.vue +13 -2
  96. package/components/formatter/Endpoints.vue +1 -1
  97. package/components/formatter/FleetSummaryGraph.vue +2 -2
  98. package/components/formatter/IngressTarget.vue +2 -2
  99. package/components/formatter/PodImages.vue +1 -1
  100. package/components/formatter/PrincipalGroupBindings.vue +1 -1
  101. package/components/formatter/ReceiverIcons.vue +3 -3
  102. package/components/formatter/ServiceType.vue +1 -1
  103. package/components/formatter/WorkloadDetailEndpoints.vue +1 -1
  104. package/components/formatter/WorkloadHealthScale.vue +1 -1
  105. package/components/formatter/__tests__/LiveDate.test.ts +1 -1
  106. package/components/graph/Bar.vue +1 -1
  107. package/components/graph/LinePlot.vue +3 -3
  108. package/components/nav/Group.vue +2 -2
  109. package/components/nav/Header.vue +5 -5
  110. package/components/nav/NamespaceFilter.vue +14 -14
  111. package/components/nav/TopLevelMenu.vue +76 -11
  112. package/components/nav/WindowManager/ContainerLogs.vue +2 -2
  113. package/components/nav/WindowManager/ContainerShell.vue +1 -1
  114. package/components/nav/WorkspaceSwitcher.vue +1 -1
  115. package/config/home-links.js +4 -4
  116. package/config/labels-annotations.js +8 -8
  117. package/config/pod-security-admission.ts +1 -1
  118. package/config/product/auth.js +4 -4
  119. package/config/product/explorer.js +14 -0
  120. package/config/router.js +5 -0
  121. package/config/store.js +2 -0
  122. package/config/table-headers.js +13 -13
  123. package/config/uiplugins.js +8 -1
  124. package/core/plugin-routes.ts +3 -2
  125. package/core/plugin.ts +3 -3
  126. package/core/plugins.js +7 -7
  127. package/creators/app/files/.gitignore +0 -3
  128. package/creators/pkg/files/index.ts +1 -1
  129. package/detail/cis.cattle.io.clusterscan.vue +3 -3
  130. package/detail/fleet.cattle.io.bundle.vue +1 -1
  131. package/detail/helm.cattle.io.projecthelmchart.vue +16 -29
  132. package/detail/management.cattle.io.user.vue +12 -12
  133. package/detail/namespace.vue +4 -4
  134. package/detail/networking.k8s.io.ingress.vue +3 -3
  135. package/detail/node.vue +2 -2
  136. package/detail/provisioning.cattle.io.cluster.vue +9 -10
  137. package/detail/service.vue +1 -1
  138. package/detail/workload/index.vue +3 -3
  139. package/dialog/AddProjectMemberDialog.vue +2 -2
  140. package/dialog/DrainNode.vue +1 -1
  141. package/dialog/GenericPrompt.vue +9 -5
  142. package/dialog/RotateEncryptionKeyDialog.vue +2 -2
  143. package/dialog/ScaleMachineDownDialog.vue +2 -2
  144. package/edit/auth/azuread.vue +3 -3
  145. package/edit/autoscaling.horizontalpodautoscaler/index.vue +5 -5
  146. package/edit/cis.cattle.io.clusterscan.vue +5 -5
  147. package/edit/cloudcredential.vue +4 -4
  148. package/edit/constraints.gatekeeper.sh.constraint/NamespaceList.vue +1 -1
  149. package/edit/constraints.gatekeeper.sh.constraint/index.vue +4 -4
  150. package/edit/fleet.cattle.io.gitrepo.vue +6 -6
  151. package/edit/helm.cattle.io.projecthelmchart.vue +3 -3
  152. package/edit/logging-flow/index.vue +4 -4
  153. package/edit/logging.banzaicloud.io.output/index.vue +3 -3
  154. package/edit/logging.banzaicloud.io.output/providers/elasticsearch.vue +1 -1
  155. package/edit/logging.banzaicloud.io.output/providers/forward.vue +1 -1
  156. package/edit/logging.banzaicloud.io.output/providers/logz.vue +1 -1
  157. package/edit/logging.banzaicloud.io.output/providers/opensearch.vue +1 -1
  158. package/edit/logging.banzaicloud.io.output/providers/redis.vue +1 -1
  159. package/edit/logging.banzaicloud.io.output/providers/splunkHec.vue +1 -1
  160. package/edit/management.cattle.io.clusterroletemplatebinding.vue +1 -1
  161. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +1 -1
  162. package/edit/management.cattle.io.project.vue +3 -3
  163. package/edit/management.cattle.io.projectroletemplatebinding.vue +2 -2
  164. package/edit/management.cattle.io.setting.vue +1 -1
  165. package/edit/management.cattle.io.user.vue +2 -2
  166. package/edit/monitoring.coreos.com.alertmanagerconfig/auth.vue +2 -2
  167. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
  168. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +1 -1
  169. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +3 -3
  170. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +5 -5
  171. package/edit/monitoring.coreos.com.prometheusrule/duration.js +1 -1
  172. package/edit/monitoring.coreos.com.receiver/auth.vue +2 -2
  173. package/edit/monitoring.coreos.com.receiver/tls.vue +3 -4
  174. package/edit/monitoring.coreos.com.receiver/types/__tests__/email.test.ts +53 -0
  175. package/edit/monitoring.coreos.com.receiver/types/email.vue +2 -0
  176. package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +3 -3
  177. package/edit/monitoring.coreos.com.receiver/types/webhook.add.vue +1 -1
  178. package/edit/monitoring.coreos.com.route.vue +2 -2
  179. package/edit/namespace.vue +21 -13
  180. package/edit/networking.k8s.io.ingress/Certificate.vue +2 -2
  181. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +2 -2
  182. package/edit/networking.k8s.io.ingress/RulePath.vue +2 -2
  183. package/edit/networking.k8s.io.ingress/Rules.vue +2 -2
  184. package/edit/networking.k8s.io.ingress/index.vue +4 -4
  185. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +3 -3
  186. package/edit/networking.k8s.io.networkpolicy/index.vue +1 -1
  187. package/edit/persistentvolume/index.vue +4 -4
  188. package/edit/persistentvolumeclaim.vue +3 -3
  189. package/edit/provisioning.cattle.io.cluster/RegistryMirrors.vue +1 -1
  190. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +2 -2
  191. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  192. package/edit/provisioning.cattle.io.cluster/index.vue +7 -7
  193. package/edit/provisioning.cattle.io.cluster/rke2.vue +28 -29
  194. package/edit/resources.cattle.io.backup.vue +2 -2
  195. package/edit/resources.cattle.io.restore.vue +3 -3
  196. package/edit/secret/generic.vue +1 -1
  197. package/edit/secret/index.vue +3 -3
  198. package/edit/service.vue +3 -21
  199. package/edit/serviceaccount.vue +2 -2
  200. package/edit/storage.k8s.io.storageclass/index.vue +4 -4
  201. package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +1 -1
  202. package/edit/token.vue +5 -5
  203. package/edit/workload/index.vue +1 -1
  204. package/edit/workload/mixins/workload.js +8 -8
  205. package/edit/workload/storage/ContainerMountPaths.vue +9 -9
  206. package/edit/workload/storage/Mount.vue +2 -2
  207. package/edit/workload/storage/csi/index.vue +1 -1
  208. package/edit/workload/storage/ephemeralVolume/index.vue +1 -1
  209. package/edit/workload/storage/index.vue +6 -6
  210. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +2 -2
  211. package/initialize/client.js +8 -8
  212. package/initialize/index.js +1 -4
  213. package/layouts/default.vue +38 -11
  214. package/list/catalog.cattle.io.clusterrepo.vue +9 -1
  215. package/list/cis.cattle.io.clusterscan.vue +1 -1
  216. package/list/fleet.cattle.io.cluster.vue +2 -2
  217. package/list/group.principal.vue +1 -1
  218. package/list/helm.cattle.io.projecthelmchart.vue +2 -2
  219. package/list/management.cattle.io.cluster.vue +1 -1
  220. package/list/management.cattle.io.feature.vue +1 -1
  221. package/list/management.cattle.io.user.vue +2 -2
  222. package/list/node.vue +5 -5
  223. package/list/provisioning.cattle.io.cluster.vue +4 -5
  224. package/machine-config/amazonec2.vue +2 -2
  225. package/machine-config/digitalocean.vue +4 -4
  226. package/machine-config/linode.vue +4 -4
  227. package/machine-config/vmwarevsphere.vue +12 -12
  228. package/middleware/authenticated.js +7 -6
  229. package/mixins/brand.js +1 -1
  230. package/mixins/chart.js +6 -6
  231. package/mixins/fetch.client.js +2 -2
  232. package/mixins/form-validation.js +7 -7
  233. package/mixins/resource-fetch-namespaced.js +1 -1
  234. package/mixins/resource-fetch.js +2 -2
  235. package/models/apps.statefulset.js +2 -2
  236. package/models/batch.cronjob.js +1 -1
  237. package/models/catalog.cattle.io.app.js +4 -4
  238. package/models/cis.cattle.io.clusterscan.js +1 -1
  239. package/models/cis.cattle.io.clusterscanbenchmark.js +1 -1
  240. package/models/cis.cattle.io.clusterscanreport.js +1 -1
  241. package/models/cloudcredential.js +1 -1
  242. package/models/cluster/node.js +5 -5
  243. package/models/cluster.x-k8s.io.machinedeployment.js +2 -2
  244. package/models/fleet.cattle.io.gitrepo.js +3 -3
  245. package/models/group.principal.js +4 -4
  246. package/models/helm.cattle.io.projecthelmchart.js +2 -2
  247. package/models/logging.banzaicloud.io.clusterflow.js +2 -2
  248. package/models/logging.banzaicloud.io.flow.js +5 -5
  249. package/models/logging.banzaicloud.io.output.js +2 -2
  250. package/models/management.cattle.io.cluster.js +10 -14
  251. package/models/management.cattle.io.globalrole.js +4 -4
  252. package/models/management.cattle.io.node.js +2 -2
  253. package/models/management.cattle.io.nodepool.js +3 -3
  254. package/models/management.cattle.io.nodetemplate.js +4 -4
  255. package/models/management.cattle.io.project.js +2 -2
  256. package/models/management.cattle.io.roletemplate.js +1 -1
  257. package/models/management.cattle.io.setting.js +1 -1
  258. package/models/management.cattle.io.user.js +5 -5
  259. package/models/monitoring.coreos.com.receiver.js +9 -9
  260. package/models/namespace.js +1 -1
  261. package/models/networking.k8s.io.ingress.js +5 -5
  262. package/models/persistentvolume.js +3 -3
  263. package/models/pod.js +3 -3
  264. package/models/provisioning.cattle.io.cluster.js +39 -27
  265. package/models/rbac.authorization.k8s.io.clusterrole.js +2 -2
  266. package/models/rbac.authorization.k8s.io.role.js +3 -3
  267. package/models/secret.js +1 -1
  268. package/models/service.js +2 -2
  269. package/models/storage.k8s.io.storageclass.js +2 -2
  270. package/models/token.js +1 -1
  271. package/models/workload.js +6 -6
  272. package/models/workload.service.js +5 -21
  273. package/package.json +2 -1
  274. package/pages/about.vue +9 -9
  275. package/pages/account/index.vue +2 -2
  276. package/pages/auth/login.vue +15 -12
  277. package/pages/auth/verify.vue +6 -0
  278. package/pages/c/_cluster/apps/charts/index.vue +4 -4
  279. package/pages/c/_cluster/apps/charts/install.vue +28 -20
  280. package/pages/c/_cluster/auth/roles/index.vue +9 -9
  281. package/pages/c/_cluster/explorer/index.vue +41 -16
  282. package/pages/c/_cluster/explorer/tools/index.vue +8 -8
  283. package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +1 -1
  284. package/pages/c/_cluster/fleet/index.vue +11 -11
  285. package/pages/c/_cluster/monitoring/index.vue +1 -1
  286. package/pages/c/_cluster/settings/links.vue +3 -3
  287. package/pages/c/_cluster/settings/performance.vue +1 -1
  288. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +6 -6
  289. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +3 -3
  290. package/pages/c/_cluster/uiplugins/InstallDialog.vue +3 -3
  291. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +1 -1
  292. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +3 -3
  293. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +6 -6
  294. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +4 -4
  295. package/pages/c/_cluster/uiplugins/index.vue +22 -19
  296. package/pages/diagnostic.vue +6 -6
  297. package/pages/home.vue +3 -3
  298. package/pages/prefs.vue +2 -2
  299. package/pages/rio/mesh.vue +3 -3
  300. package/pages/support/index.vue +10 -1
  301. package/pkg/auto-import.js +1 -1
  302. package/pkg/tsconfig.json +1 -0
  303. package/pkg/vue.config.js +1 -1
  304. package/plugins/axios.js +1 -1
  305. package/plugins/clean-html-directive.js +1 -1
  306. package/plugins/dashboard-store/__tests__/mutations.spec.js +4 -4
  307. package/plugins/dashboard-store/actions.js +4 -4
  308. package/plugins/dashboard-store/getters.js +1 -1
  309. package/plugins/dashboard-store/index.js +1 -1
  310. package/plugins/dashboard-store/mutations.js +2 -2
  311. package/plugins/dashboard-store/resource-class.js +8 -8
  312. package/plugins/i18n.js +1 -1
  313. package/plugins/plugin.js +5 -1
  314. package/plugins/steve/actions.js +3 -3
  315. package/plugins/steve/getters.js +3 -3
  316. package/plugins/steve/hybrid-class.js +1 -1
  317. package/plugins/steve/mutations.js +1 -1
  318. package/plugins/steve/performanceTesting.js +1 -1
  319. package/plugins/steve/resourceWatcher.js +1 -1
  320. package/plugins/steve/subscribe.js +6 -6
  321. package/plugins/steve/worker/web-worker.basic.js +1 -1
  322. package/promptRemove/management.cattle.io.project.vue +3 -3
  323. package/promptRemove/mixin/roleDeletionCheck.js +4 -4
  324. package/promptRemove/pod.vue +1 -1
  325. package/rancher-components/StringList/StringList.test.ts +80 -0
  326. package/rancher-components/StringList/StringList.vue +577 -0
  327. package/rancher-components/StringList/index.ts +1 -0
  328. package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +2 -2
  329. package/rancher-components/components/Form/Checkbox/Checkbox.vue +1 -1
  330. package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -1
  331. package/rancher-components/components/Form/Radio/RadioButton.vue +2 -2
  332. package/rancher-components/components/Form/Radio/RadioGroup.vue +2 -2
  333. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +1 -0
  334. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +1 -1
  335. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -7
  336. package/rancher-components/components/StringList/StringList.test.ts +10 -9
  337. package/rancher-components/components/StringList/StringList.vue +5 -5
  338. package/scripts/extension/helm/charts/ui-plugin-server/Chart.yaml +1 -1
  339. package/store/action-menu.js +4 -4
  340. package/store/auth.js +40 -7
  341. package/store/aws.js +1 -1
  342. package/store/catalog.js +12 -11
  343. package/store/digitalocean.js +4 -4
  344. package/store/features.js +1 -0
  345. package/store/github.js +70 -213
  346. package/store/gitlab.js +159 -0
  347. package/store/growl.js +1 -1
  348. package/store/i18n.js +7 -7
  349. package/store/index.js +63 -22
  350. package/store/linode.js +1 -1
  351. package/store/plugins.js +5 -5
  352. package/store/pnap.js +1 -1
  353. package/store/prefs.js +6 -6
  354. package/store/resource-fetch.js +3 -3
  355. package/store/type-map.js +61 -42
  356. package/store/uiplugins.ts +2 -1
  357. package/store/wm.js +5 -4
  358. package/tsconfig.default.json +10 -0
  359. package/tsconfig.json +2 -9
  360. package/types/shell/index.d.ts +12 -4
  361. package/utils/__tests__/version.test.ts +28 -0
  362. package/utils/alertmanagerconfig.js +4 -4
  363. package/utils/array.ts +4 -4
  364. package/utils/async.ts +1 -1
  365. package/utils/auth.js +3 -3
  366. package/utils/axios.js +5 -5
  367. package/utils/cluster.js +4 -3
  368. package/utils/color.js +10 -0
  369. package/utils/create-yaml.js +4 -4
  370. package/utils/crypto/browserHashUtils.js +1 -1
  371. package/utils/crypto/browserMd5.js +1 -1
  372. package/utils/crypto/browserSha1.js +1 -1
  373. package/utils/crypto/browserSha256.js +1 -1
  374. package/utils/crypto/index.js +3 -3
  375. package/utils/favicon.js +2 -3
  376. package/utils/gatekeeper/util.js +3 -3
  377. package/utils/gc/gc.ts +2 -2
  378. package/utils/git.ts +92 -0
  379. package/utils/grafana.js +4 -4
  380. package/utils/monitoring.js +2 -2
  381. package/utils/nuxt.js +2 -2
  382. package/utils/object.js +5 -5
  383. package/utils/pod-security-admission.ts +1 -1
  384. package/utils/projectAndNamespaceFiltering.utils.ts +1 -1
  385. package/utils/select.js +2 -2
  386. package/utils/selector.js +2 -2
  387. package/utils/settings.ts +17 -2
  388. package/utils/socket.js +30 -6
  389. package/utils/sort.js +1 -1
  390. package/utils/string.js +1 -1
  391. package/utils/url.ts +1 -1
  392. package/utils/validators/formRules/index.ts +3 -3
  393. package/utils/validators/role-template.js +4 -4
  394. package/utils/version.js +14 -1
  395. package/vue.config.js +19 -13
  396. package/components/form/GithubPicker.vue +0 -390
@@ -23,6 +23,12 @@ export default {
23
23
  type: String,
24
24
  default: null
25
25
  },
26
+ // change the grafana url prefix for local clusters in certain monitoring versions
27
+ // project monitoring (projectHelmCharts) supply a grafana url that never needs to be modified in this way
28
+ modifyPrefix: {
29
+ type: Boolean,
30
+ default: true
31
+ },
26
32
  backgroundColor: {
27
33
  type: String,
28
34
  default: '#1b1c21'
@@ -138,7 +144,7 @@ export default {
138
144
  const clusterId = this.$store.getters['currentCluster'].id;
139
145
  const params = this.computeParams();
140
146
 
141
- return computeDashboardUrl(this.monitoringVersion, embedUrl, clusterId, params);
147
+ return computeDashboardUrl(this.monitoringVersion, embedUrl, clusterId, params, this.modifyPrefix);
142
148
  },
143
149
  computeParams() {
144
150
  const params = {};
@@ -10,7 +10,7 @@ export default {
10
10
  ...mapState('growl', ['stack']),
11
11
 
12
12
  shouldRun() {
13
- return this.stack.length && this.stack.find(x => x.timeout > 0);
13
+ return this.stack.length && this.stack.find((x) => x.timeout > 0);
14
14
  }
15
15
  },
16
16
 
@@ -1,13 +1,22 @@
1
1
  <script>
2
+ import { mapGetters } from 'vuex';
3
+ import semver from 'semver';
4
+
2
5
  import LabeledSelect from '@shell/components/form/LabeledSelect';
3
6
  import { _CREATE } from '@shell/config/query-params';
4
7
  import { get } from '@shell/utils/object';
5
8
  import { HCI as HCI_LABELS_ANNOTATIONS } from '@shell/config/labels-annotations';
9
+ import { SERVICE } from '@shell/config/types';
10
+ import { allHash } from '@shell/utils/promise';
6
11
 
7
12
  const HARVESTER_ADD_ON_CONFIG = [{
8
13
  variableName: 'ipam',
9
14
  key: HCI_LABELS_ANNOTATIONS.CLOUD_PROVIDER_IPAM,
10
15
  default: 'dhcp'
16
+ }, {
17
+ variableName: 'sharedService',
18
+ key: HCI_LABELS_ANNOTATIONS.PRIMARY_SERVICE,
19
+ default: ''
11
20
  }];
12
21
 
13
22
  export default {
@@ -38,6 +47,19 @@ export default {
38
47
  }
39
48
  },
40
49
 
50
+ async fetch() {
51
+ const inStore = this.$store.getters['currentProduct'].inStore;
52
+
53
+ const hash = {
54
+ rke2Versions: this.$store.dispatch('management/request', { url: '/v1-rke2-release/releases' }),
55
+ services: this.$store.dispatch(`${ inStore }/findAll`, { type: SERVICE }),
56
+ };
57
+
58
+ const res = await allHash(hash);
59
+
60
+ this.rke2Versions = res.rke2Versions;
61
+ },
62
+
41
63
  data() {
42
64
  const harvesterAddOnConfig = {};
43
65
 
@@ -45,10 +67,24 @@ export default {
45
67
  harvesterAddOnConfig[c.variableName] = this.value.metadata.annotations[c.key] || c.default;
46
68
  });
47
69
 
48
- return { ...harvesterAddOnConfig };
70
+ let showShareIP;
71
+
72
+ if (this.value.metadata.annotations[HCI_LABELS_ANNOTATIONS.PRIMARY_SERVICE]) {
73
+ showShareIP = true;
74
+ } else {
75
+ showShareIP = false;
76
+ }
77
+
78
+ return {
79
+ ...harvesterAddOnConfig,
80
+ showShareIP,
81
+ rke2Versions: {},
82
+ };
49
83
  },
50
84
 
51
85
  computed: {
86
+ ...mapGetters(['allowedNamespaces', 'namespaces', 'currentCluster']),
87
+
52
88
  ipamOptions() {
53
89
  return [{
54
90
  label: 'DHCP',
@@ -62,15 +98,73 @@ export default {
62
98
  portOptions() {
63
99
  const ports = this.value?.spec?.ports || [];
64
100
 
65
- return ports.filter(p => p.port && p.protocol === 'TCP').map(p => p.port) || [];
101
+ return ports.filter((p) => p.port && p.protocol === 'TCP').map((p) => p.port) || [];
102
+ },
103
+
104
+ serviceOptions() {
105
+ const inStore = this.$store.getters['currentProduct'].inStore;
106
+ const services = this.$store.getters[`${ inStore }/all`](SERVICE);
107
+
108
+ const namespaces = this.namespaces();
109
+
110
+ const out = services.filter((s) => {
111
+ const ingress = s?.status?.loadBalancer?.ingress || [];
112
+
113
+ return ingress.length > 0 &&
114
+ !s?.metadata?.annotations?.['cloudprovider.harvesterhci.io/primary-service'] &&
115
+ s.spec?.type === 'LoadBalancer' &&
116
+ namespaces[s.metadata.namespace];
117
+ });
118
+
119
+ return out.map((s) => s.id);
120
+ },
121
+
122
+ shareIPEnabled() {
123
+ const kubernetesVersion = this.currentCluster.kubernetesVersion || '';
124
+ const kubernetesVersionExtension = this.currentCluster.kubernetesVersionExtension;
125
+
126
+ if (kubernetesVersionExtension.startsWith('+rke2')) {
127
+ const charts = ((this.rke2Versions?.data || []).find((v) => v.id === kubernetesVersion) || {}).charts;
128
+ let ccmVersion = charts?.['harvester-cloud-provider']?.version || '';
129
+
130
+ if (ccmVersion.endsWith('00')) {
131
+ ccmVersion = ccmVersion.slice(0, -2);
132
+ }
133
+
134
+ return semver.satisfies(ccmVersion, '>=0.2.0');
135
+ } else {
136
+ return true;
137
+ }
66
138
  },
67
139
  },
68
140
 
69
141
  methods: {
70
142
  willSave() {
143
+ const errors = [];
144
+
145
+ if (this.showShareIP) {
146
+ if (!this.sharedService) {
147
+ errors.push(this.t('validation.required', { key: this.t('servicesPage.harvester.shareIP.label') }, true));
148
+ }
149
+ }
150
+
151
+ if (errors.length > 0) {
152
+ return Promise.reject(errors);
153
+ }
154
+
71
155
  HARVESTER_ADD_ON_CONFIG.forEach((c) => {
72
156
  this.value.metadata.annotations[c.key] = String(get(this, c.variableName));
73
157
  });
158
+
159
+ if (this.showShareIP) {
160
+ delete this.value.metadata.annotations[HCI_LABELS_ANNOTATIONS.CLOUD_PROVIDER_IPAM];
161
+ } else {
162
+ delete this.value.metadata.annotations[HCI_LABELS_ANNOTATIONS.PRIMARY_SERVICE];
163
+ }
164
+ },
165
+
166
+ toggleShareIP() {
167
+ this.showShareIP = !this.showShareIP;
74
168
  },
75
169
  },
76
170
  };
@@ -81,11 +175,32 @@ export default {
81
175
  <div class="row mt-30">
82
176
  <div class="col span-6">
83
177
  <LabeledSelect
178
+ v-if="showShareIP"
179
+ v-model="sharedService"
180
+ :mode="mode"
181
+ :options="serviceOptions"
182
+ :label="t('servicesPage.harvester.shareIP.label')"
183
+ :disabled="mode === 'edit'"
184
+ />
185
+ <LabeledSelect
186
+ v-else
84
187
  v-model="ipam"
85
188
  :mode="mode"
86
189
  :options="ipamOptions"
87
190
  :label="t('servicesPage.harvester.ipam.label')"
191
+ :disabled="mode === 'edit'"
88
192
  />
193
+ <div
194
+ v-if="mode === 'create'"
195
+ class="mt-10"
196
+ >
197
+ <a
198
+ role="button"
199
+ @click="toggleShareIP"
200
+ >
201
+ {{ showShareIP ? t('servicesPage.harvester.useIpam.label') : t('servicesPage.harvester.useShareIP.label') }}
202
+ </a>
203
+ </div>
89
204
  </div>
90
205
  </div>
91
206
  </div>
@@ -18,7 +18,7 @@
18
18
  */
19
19
  import Vue from 'vue';
20
20
  import { Solver } from '@shell/utils/svg-filter';
21
- import { colorToRgb, mapStandardColors } from '@shell/utils/color';
21
+ import { colorToRgb, mapStandardColors, normalizeHex } from '@shell/utils/color';
22
22
 
23
23
  const filterCache = {};
24
24
  const cssCache = {};
@@ -75,11 +75,18 @@ export default {
75
75
  if (stylesheet && stylesheet.cssRules) {
76
76
  for (let x = 0; x < Object.keys(stylesheet.cssRules).length; x++) {
77
77
  const cssRules = stylesheet.cssRules[x];
78
- const selectorText = currTheme === 'light' ? 'body, .theme-light' : '.theme-dark';
79
78
 
80
- if (cssRules.selectorText && cssRules.selectorText === selectorText) {
79
+ if (cssRules.selectorText && ((currTheme === 'light' && cssRules.selectorText.includes('body') &&
80
+ cssRules.selectorText.includes('.theme-light') && cssRules.style.cssText.includes('--link:')) ||
81
+ (currTheme === 'dark' && cssRules.selectorText.includes('.theme-dark')))) {
82
+ // grab the colors to be used on the icon from the css rules
81
83
  uiColor = mapStandardColors(cssRules.style.getPropertyValue(colors[this.color].color).trim());
82
84
  hoverColor = mapStandardColors(cssRules.style.getPropertyValue(colors[this.color].hover).trim());
85
+
86
+ // normalize hex colors (#xxx to #xxxxxx)
87
+ uiColor = normalizeHex(uiColor);
88
+ hoverColor = normalizeHex(hoverColor);
89
+
83
90
  found = true;
84
91
  break;
85
92
  }
@@ -35,7 +35,7 @@ export default {
35
35
  routeFromDropdown: {
36
36
  get() {
37
37
  const route = this.customRoute || {};
38
- const out = this.routeDropdownOptions.find(opt => opt.value.name === route.name && opt.value.params?.cluster === route.params?.cluster);
38
+ const out = this.routeDropdownOptions.find((opt) => opt.value.name === route.name && opt.value.params?.cluster === route.params?.cluster);
39
39
 
40
40
  return out || this.routeDropdownOptions[0];
41
41
  },
@@ -72,7 +72,7 @@ export default {
72
72
  routeDropdownOptions() {
73
73
  // Drop-down shows list of clusters that can ber set as login landing page
74
74
  const out = [];
75
- const kubeClusters = filterHiddenLocalCluster(filterOnlyKubernetesClusters(this.clusters), this.$store);
75
+ const kubeClusters = filterHiddenLocalCluster(filterOnlyKubernetesClusters(this.clusters, this.$store), this.$store);
76
76
 
77
77
  kubeClusters.forEach((c) => {
78
78
  if (c.isReady) {
@@ -27,7 +27,7 @@ export default {
27
27
  ...mapGetters(['currentCluster']),
28
28
 
29
29
  excludedProjects() {
30
- return this.toMove.filter(namespace => !!namespace.project).map(namespace => namespace.project.shortId);
30
+ return this.toMove.filter((namespace) => !!namespace.project).map((namespace) => namespace.project.shortId);
31
31
  },
32
32
 
33
33
  projectOptions() {
@@ -83,7 +83,7 @@ export default Vue.extend({
83
83
  // Generate PSA form controls
84
84
  psaControls: toDictionary(PSAModes, getPsaControl) as Record<PSAMode, PSAControl>,
85
85
  psaExemptionsControls: toDictionary(PSADimensions, getExemptionControl) as Record<PSADimension, PSAExemptionControl>,
86
- options: PSALevels.map(level => ({
86
+ options: PSALevels.map((level) => ({
87
87
  value: level,
88
88
  label: this.t(`podSecurityAdmission.labels.${ level }`)
89
89
  })),
@@ -145,7 +145,7 @@ export default Vue.extend({
145
145
  */
146
146
  updateExemptions(): void {
147
147
  const exemptions = PSADimensions.reduce((acc, dimension) => {
148
- const value = this.psaExemptionsControls[dimension].value.split(',').map(value => value.trim());
148
+ const value = this.psaExemptionsControls[dimension].value.split(',').map((value) => value.trim());
149
149
  const active = this.psaExemptionsControls[dimension].active;
150
150
 
151
151
  return {
@@ -182,7 +182,7 @@ export default Vue.extend({
182
182
  */
183
183
  getPsaExemptions(): Record<PSADimension, PSAExemptionControl> {
184
184
  return PSADimensions.reduce((acc, dimension) => {
185
- const values = (this.exemptions[dimension] || []).map(value => value.trim()).join(',');
185
+ const values = (this.exemptions[dimension] || []).map((value) => value.trim()).join(',');
186
186
 
187
187
  return {
188
188
  ...acc,
@@ -68,7 +68,7 @@ export default {
68
68
  if ( !this.max ) {
69
69
  max = 100;
70
70
  if ( out.length ) {
71
- max = out.map(x => x.value).reduce((a, b) => a + b);
71
+ max = out.map((x) => x.value).reduce((a, b) => a + b);
72
72
  }
73
73
  }
74
74
 
@@ -88,7 +88,7 @@ export default {
88
88
  obj.style = `width: ${ obj.percent }%`;
89
89
  }
90
90
 
91
- return out.filter(obj => obj.percent);
91
+ return out.filter((obj) => obj.percent);
92
92
  },
93
93
  }
94
94
  };
@@ -9,11 +9,13 @@ import { uniq } from '@shell/utils/array';
9
9
  import AsyncButton from '@shell/components/AsyncButton';
10
10
  import { CATALOG as CATALOG_ANNOTATIONS } from '@shell/config/labels-annotations';
11
11
  import { CATALOG } from '@shell/config/types';
12
+ import { LabeledInput } from '@components/Form/LabeledInput';
13
+
12
14
  export default {
13
15
  name: 'PromptRemove',
14
16
 
15
17
  components: {
16
- Card, Checkbox, AsyncButton
18
+ Card, Checkbox, AsyncButton, LabeledInput
17
19
  },
18
20
  props: {
19
21
  /**
@@ -42,7 +44,7 @@ export default {
42
44
  },
43
45
  computed: {
44
46
  names() {
45
- return this.toRemove.map(obj => obj.nameDisplay).slice(0, 5);
47
+ return this.toRemove.map((obj) => obj.nameDisplay).slice(0, 5);
46
48
  },
47
49
 
48
50
  nameToMatchPosition() {
@@ -100,6 +102,11 @@ export default {
100
102
  if (this.toRemove.length > 1) {
101
103
  return null;
102
104
  }
105
+
106
+ if (this.toRemove[0].doneLocationRemove) {
107
+ return this.toRemove[0].doneLocationRemove;
108
+ }
109
+
103
110
  const currentRoute = this.toRemove[0].currentRoute();
104
111
  const out = {};
105
112
  const params = { ...currentRoute.params };
@@ -184,7 +191,7 @@ export default {
184
191
  // if none found (delete is allowed), then check for any resources with a warning message
185
192
  toRemove(neu) {
186
193
  let message;
187
- const preventDeletionMessages = neu.filter(item => item.preventDeletionMessage);
194
+ const preventDeletionMessages = neu.filter((item) => item.preventDeletionMessage);
188
195
 
189
196
  this.preventDelete = false;
190
197
 
@@ -192,7 +199,7 @@ export default {
192
199
  this.preventDelete = true;
193
200
  message = preventDeletionMessages[0].preventDeletionMessage;
194
201
  } else {
195
- const warnDeletionMessages = neu.filter(item => item.warnDeletionMessage);
202
+ const warnDeletionMessages = neu.filter((item) => item.warnDeletionMessage);
196
203
 
197
204
  if (!!warnDeletionMessages.length) {
198
205
  message = warnDeletionMessages[0].warnDeletionMessage;
@@ -224,6 +231,7 @@ export default {
224
231
  // doneLocation will recompute to undefined when delete request completes
225
232
  this.cachedDoneLocation = { ...this.doneLocation };
226
233
  }
234
+
227
235
  if (this.hasCustomRemove && this.$refs?.customPrompt?.remove) {
228
236
  let handled = this.$refs.customPrompt.remove(btnCB);
229
237
 
@@ -247,7 +255,7 @@ export default {
247
255
  return;
248
256
  }
249
257
  }
250
- const serialRemove = this.toRemove.some(resource => resource.removeSerially);
258
+ const serialRemove = this.toRemove.some((resource) => resource.removeSerially);
251
259
 
252
260
  if (serialRemove) {
253
261
  this.serialRemove(btnCB);
@@ -272,10 +280,16 @@ export default {
272
280
  },
273
281
  async parallelRemove(btnCB) {
274
282
  try {
283
+ if (typeof this.toRemove[0].bulkRemove !== 'undefined') {
284
+ await this.toRemove[0].bulkRemove(this.toRemove, {});
285
+ } else {
286
+ await Promise.all(this.toRemove.map((resource) => resource.remove()));
287
+ }
288
+
275
289
  const spoofedTypes = this.getSpoofedTypes(this.toRemove);
276
290
 
277
- await Promise.all(this.toRemove.map(resource => resource.remove()));
278
291
  await this.refreshSpoofedTypes(spoofedTypes);
292
+
279
293
  this.done();
280
294
  } catch (err) {
281
295
  this.error = err.message || err;
@@ -289,7 +303,7 @@ export default {
289
303
  this.close();
290
304
  },
291
305
  getSpoofedTypes(resources) {
292
- const uniqueResourceTypes = uniq(this.toRemove.map(resource => resource.type));
306
+ const uniqueResourceTypes = uniq(this.toRemove.map((resource) => resource.type));
293
307
 
294
308
  return uniqueResourceTypes.filter(this.$store.getters['type-map/isSpoofed']);
295
309
  },
@@ -297,7 +311,7 @@ export default {
297
311
  // If spoofed we need to reload the values as the server can't have watchers for them.
298
312
  refreshSpoofedTypes(types) {
299
313
  const inStore = this.$store.getters['currentProduct'].inStore;
300
- const promises = types.map(type => this.$store.dispatch(`${ inStore }/findAll`, { type, opt: { force: true } }, { root: true }));
314
+ const promises = types.map((type) => this.$store.dispatch(`${ inStore }/findAll`, { type, opt: { force: true } }, { root: true }));
301
315
 
302
316
  return Promise.all(promises);
303
317
  },
@@ -372,32 +386,42 @@ export default {
372
386
  </div>
373
387
  </template>
374
388
  </div>
375
- <input
389
+ <LabeledInput
376
390
  v-if="needsConfirm"
377
391
  id="confirm"
378
392
  v-model="confirmName"
393
+ v-focus
379
394
  :data-testid="componentTestid + '-input'"
380
395
  type="text"
381
396
  >
382
- <div class="text-warning mb-10 mt-10">
383
- {{ warning }}
384
- </div>
385
- <div class="text-error mb-10 mt-10">
386
- {{ error }}
387
- </div>
388
- <div
389
- v-if="!needsConfirm"
390
- class="text-info mt-20"
391
- >
392
- {{ protip }}
393
- </div>
394
- <Checkbox
395
- v-if="chartsToRemoveIsApp"
396
- v-model="chartsDeleteCrd"
397
- label-key="promptRemoveApp.removeCrd"
398
- class="mt-10 type"
399
- @input="chartAddCrdToRemove"
400
- />
397
+ <div class="text-warning mb-10 mt-10">
398
+ {{ warning }}
399
+ </div>
400
+ <div class="text-error mb-10 mt-10">
401
+ {{ error }}
402
+ </div>
403
+ <div
404
+ v-if="!needsConfirm"
405
+ class="text-info mt-20"
406
+ >
407
+ {{ protip }}
408
+ </div>
409
+ <Checkbox
410
+ v-if="chartsToRemoveIsApp"
411
+ v-model="chartsDeleteCrd"
412
+ label-key="promptRemoveApp.removeCrd"
413
+ class="mt-10 type"
414
+ @input="chartAddCrdToRemove"
415
+ />
416
+ </labeledinput>
417
+ <template v-else>
418
+ <div class="text-warning mb-10 mt-10">
419
+ {{ warning }}
420
+ </div>
421
+ <div class="text-error mb-10 mt-10">
422
+ {{ error }}
423
+ </div>
424
+ </template>
401
425
  </div>
402
426
  <template #actions>
403
427
  <button
@@ -70,7 +70,7 @@ export default {
70
70
 
71
71
  clusterSnapshots() {
72
72
  if (this.sortedSnapshots) {
73
- return this.sortedSnapshots.map(snapshot => ({ label: this.snapshotLabel(snapshot), value: snapshot.name }));
73
+ return this.sortedSnapshots.map((snapshot) => ({ label: this.snapshotLabel(snapshot), value: snapshot.name }));
74
74
  } else {
75
75
  return [];
76
76
  }
@@ -115,13 +115,13 @@ export default {
115
115
 
116
116
  if (!cluster.isRke2) {
117
117
  promise = this.$store.dispatch('rancher/findAll', { type: NORMAN.ETCD_BACKUP }).then((snapshots) => {
118
- return snapshots.filter(s => s.clusterId === cluster.metadata.name);
118
+ return snapshots.filter((s) => s.clusterId === cluster.metadata.name);
119
119
  });
120
120
  } else {
121
121
  promise = this.$store.dispatch('management/findAll', { type: SNAPSHOT }).then((snapshots) => {
122
122
  const toRestoreClusterName = cluster?.clusterName || cluster?.metadata?.name;
123
123
 
124
- return snapshots.filter(s => s.clusterName === toRestoreClusterName);
124
+ return snapshots.filter((s) => s.clusterName === toRestoreClusterName);
125
125
  });
126
126
  }
127
127
 
@@ -67,9 +67,9 @@ function migrate(expr) {
67
67
  let out;
68
68
 
69
69
  if ( expr.includes('||') ) {
70
- out = expr.split('||').map(x => migrate(x)).join(' || ');
70
+ out = expr.split('||').map((x) => migrate(x)).join(' || ');
71
71
  } else if ( expr.includes('&&') ) {
72
- out = expr.split('&&').map(x => migrate(x)).join(' && ');
72
+ out = expr.split('&&').map((x) => migrate(x)).join(' && ');
73
73
  } else {
74
74
  const parts = expr.match(/^(.*)(!?=)(.*)$/);
75
75
 
@@ -311,9 +311,9 @@ export default {
311
311
  let result;
312
312
 
313
313
  if ( get(or, 'length') > 1 ) {
314
- result = or.some(showIf => this.calExpression(showIf, allQuestions));
314
+ result = or.some((showIf) => this.calExpression(showIf, allQuestions));
315
315
  } else {
316
- result = and.every(showIf => this.calExpression(showIf, allQuestions));
316
+ result = and.every((showIf) => this.calExpression(showIf, allQuestions));
317
317
  }
318
318
 
319
319
  return result;
@@ -368,7 +368,7 @@ export default {
368
368
  return null;
369
369
  },
370
370
  getAnswer(variable, questions) {
371
- const found = questions.find(q => q.variable === variable);
371
+ const found = questions.find((q) => q.variable === variable);
372
372
 
373
373
  if ( found ) {
374
374
  // Equivalent to finding question.answer in Ember
@@ -22,7 +22,7 @@ export default {
22
22
  WORKLOAD_TYPES.JOB,
23
23
  WORKLOAD_TYPES.STATEFUL_SET
24
24
  ];
25
- const allWorkloadsNested = await Promise.all(types.map(type => this.$store.dispatch('cluster/findAll', { type })));
25
+ const allWorkloadsNested = await Promise.all(types.map((type) => this.$store.dispatch('cluster/findAll', { type })));
26
26
  const allWorkloads = allWorkloadsNested.flat();
27
27
 
28
28
  this.relatedWorkloadRows = allWorkloads.filter(this.filter);
@@ -139,7 +139,7 @@ export default {
139
139
  }
140
140
 
141
141
  // blocked-post means you can post through norman, but not through steve.
142
- if ( this.schema && !this.schema?.collectionMethods.find(x => ['blocked-post', 'post'].includes(x.toLowerCase())) ) {
142
+ if ( this.schema && !this.schema?.collectionMethods.find((x) => ['blocked-post', 'post'].includes(x.toLowerCase())) ) {
143
143
  return false;
144
144
  }
145
145
 
@@ -225,7 +225,7 @@ export default {
225
225
 
226
226
  // If only one namespace is selected, hide the namespace column
227
227
  if ( !showNamespace ) {
228
- const idx = headers.findIndex(header => header.name === NAMESPACE.name);
228
+ const idx = headers.findIndex((header) => header.name === NAMESPACE.name);
229
229
 
230
230
  if ( idx >= 0 ) {
231
231
  headers.splice(idx, 1);
@@ -236,7 +236,7 @@ export default {
236
236
  const custom = this.listGroupMapped[this.group];
237
237
 
238
238
  if (custom?.hideColumn) {
239
- const idx = headers.findIndex(header => header.name === custom.hideColumn);
239
+ const idx = headers.findIndex((header) => header.name === custom.hideColumn);
240
240
 
241
241
  if ( idx >= 0 ) {
242
242
  headers.splice(idx, 1);
@@ -291,7 +291,7 @@ export default {
291
291
  group: {
292
292
  get() {
293
293
  // Check group is valid
294
- const exists = this.groupOptions.find(g => g.value === this._group);
294
+ const exists = this.groupOptions.find((g) => g.value === this._group);
295
295
 
296
296
  if (!exists) {
297
297
  return DEFAULT_GROUP;
@@ -166,7 +166,7 @@ export default {
166
166
  try {
167
167
  const parsed = jsyaml.load(this.currentYaml);
168
168
  const annotations = Object.keys(parsed?.metadata?.annotations || {});
169
- const regexes = ANNOTATIONS_TO_FOLD.map(x => ensureRegex(x));
169
+ const regexes = ANNOTATIONS_TO_FOLD.map((x) => ensureRegex(x));
170
170
 
171
171
  let foldAnnotations = false;
172
172
 
@@ -179,7 +179,7 @@ export default {
179
179
  },
180
180
 
181
181
  existingBindings() {
182
- const roles = this.roles.map(x => x.name);
182
+ const roles = this.roles.map((x) => x.name);
183
183
 
184
184
  const out = this.allBindings.filter((binding) => {
185
185
  if ( binding.roleRef.kind !== this.roleScope || !binding.roleRef?.name) {
@@ -197,7 +197,7 @@ export default {
197
197
  },
198
198
 
199
199
  unremovedRows() {
200
- return this.rows.filter(x => x.remove !== true);
200
+ return this.rows.filter((x) => x.remove !== true);
201
201
  },
202
202
  },
203
203
 
@@ -37,7 +37,7 @@ export default {
37
37
  },
38
38
 
39
39
  accessibleResources() {
40
- return RESOURCES.filter(resource => this.$store.getters['cluster/schemaFor'](resource));
40
+ return RESOURCES.filter((resource) => this.$store.getters['cluster/schemaFor'](resource));
41
41
  },
42
42
 
43
43
  totalCountGaugeInput() {
@@ -38,11 +38,11 @@ export default {
38
38
 
39
39
  computed: {
40
40
  availableActions() {
41
- return this.bulkActionsForSelection.filter(act => !act.external);
41
+ return this.bulkActionsForSelection.filter((act) => !act.external);
42
42
  },
43
43
 
44
44
  keyedAvailableActions() {
45
- return this.availableActions.map(aa => aa.action);
45
+ return this.availableActions.map((aa) => aa.action);
46
46
  },
47
47
 
48
48
  selectedRowsText() {
@@ -139,7 +139,7 @@ export default {
139
139
  // Collate the actions in an array and hide in the normal row
140
140
  const id = ba.attributes.getNamedItem('id').value;
141
141
 
142
- this.hiddenActions.push(this.availableActions.find(aa => aa.action === id));
142
+ this.hiddenActions.push(this.availableActions.find((aa) => aa.action === id));
143
143
  ba.style.display = 'none';
144
144
  }
145
145
  }