@rancher/shell 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (595) hide show
  1. package/assets/styles/base/_basic.scss +0 -1
  2. package/assets/styles/base/_variables.scss +2 -0
  3. package/assets/styles/global/_labeled-input.scss +6 -1
  4. package/assets/styles/global/_select.scss +9 -0
  5. package/assets/styles/vendor/vue-js-modal.scss +4 -0
  6. package/assets/translations/en-us.yaml +240 -16
  7. package/assets/translations/zh-hans.yaml +335 -111
  8. package/chart/example.vue +1 -1
  9. package/chart/istio.vue +2 -2
  10. package/chart/logging/index.vue +2 -2
  11. package/chart/monitoring/alerting/index.vue +2 -2
  12. package/chart/monitoring/grafana/index.vue +2 -2
  13. package/chart/monitoring/index.vue +2 -2
  14. package/chart/monitoring/prometheus/index.vue +4 -4
  15. package/chart/rancher-alerting-drivers.vue +17 -3
  16. package/chart/rancher-backup/S3.vue +37 -4
  17. package/chart/rancher-backup/index.vue +3 -3
  18. package/cloud-credential/aws.vue +1 -1
  19. package/cloud-credential/azure.vue +1 -1
  20. package/cloud-credential/digitalocean.vue +1 -1
  21. package/cloud-credential/gcp.vue +1 -1
  22. package/cloud-credential/generic.vue +1 -1
  23. package/cloud-credential/harvester.vue +2 -2
  24. package/cloud-credential/linode.vue +1 -1
  25. package/cloud-credential/s3.vue +2 -2
  26. package/cloud-credential/vmwarevsphere.vue +1 -1
  27. package/components/ActionMenu.vue +11 -1
  28. package/components/Alert.vue +1 -1
  29. package/components/AssignTo.vue +2 -2
  30. package/components/AsyncButton.vue +25 -12
  31. package/components/AwsComplianceBanner.vue +44 -0
  32. package/components/BannerGraphic.vue +11 -2
  33. package/components/ChartReadme.vue +10 -2
  34. package/components/CompoundStatusBadge.vue +50 -0
  35. package/components/CopyToClipboardText.vue +25 -4
  36. package/components/CruResource.vue +185 -16
  37. package/components/CruResourceFooter.vue +17 -1
  38. package/components/EtcdInfoBanner.vue +1 -1
  39. package/components/FilterLabel.vue +254 -0
  40. package/components/GlobalRoleBindings.vue +2 -2
  41. package/components/GrafanaDashboard.vue +1 -1
  42. package/components/GrowlManager.vue +20 -9
  43. package/components/HarvesterServiceAddOnConfig.vue +2 -2
  44. package/components/Import.vue +2 -2
  45. package/components/LandingPagePreference.vue +2 -2
  46. package/components/Markdown.vue +44 -12
  47. package/components/ModalWithCard.vue +2 -2
  48. package/components/MoveModal.vue +1 -1
  49. package/components/PercentageBar.vue +1 -1
  50. package/components/PromptChangePassword.vue +1 -1
  51. package/components/PromptModal.vue +13 -2
  52. package/components/PromptRemove.vue +64 -33
  53. package/components/PromptRestore.vue +3 -3
  54. package/components/Questions/Boolean.vue +1 -1
  55. package/components/Questions/Float.vue +1 -1
  56. package/components/Questions/Int.vue +1 -1
  57. package/components/Questions/Reference.vue +1 -1
  58. package/components/Questions/String.vue +1 -1
  59. package/components/RelatedResources.vue +1 -1
  60. package/components/RelatedWorkloadsTable.vue +3 -1
  61. package/components/ResourceDetail/Masthead.vue +27 -9
  62. package/components/ResourceDetail/index.vue +72 -7
  63. package/components/ResourceList/Masthead.vue +22 -0
  64. package/components/ResourceList/ResourceLoadingIndicator.vue +137 -0
  65. package/components/ResourceList/index.vue +42 -7
  66. package/components/ResourceTable.vue +11 -2
  67. package/components/ResourceYaml.vue +7 -1
  68. package/components/SelectIconGrid.vue +14 -1
  69. package/components/SortableTable/THead.vue +1 -1
  70. package/components/SortableTable/debug.js +117 -0
  71. package/components/SortableTable/index.vue +200 -43
  72. package/components/SortableTable/paging.js +2 -12
  73. package/components/SortableTable/selection.js +3 -0
  74. package/components/SortableTable/sorting.js +3 -1
  75. package/components/Tabbed/Tab.vue +25 -4
  76. package/components/Tabbed/index.vue +133 -119
  77. package/components/TypeDescription.vue +1 -1
  78. package/components/VMConsoleBar.vue +1 -1
  79. package/components/Wizard.vue +53 -14
  80. package/components/YamlEditor.vue +10 -0
  81. package/components/__tests__/CopyCode.test.ts +1 -7
  82. package/components/__tests__/CruResource.test.ts +1 -8
  83. package/components/auth/AllowedPrincipals.vue +1 -1
  84. package/components/auth/AuthBanner.vue +2 -1
  85. package/components/auth/AzureWarning.vue +69 -0
  86. package/components/auth/RoleDetailEdit.vue +4 -4
  87. package/components/auth/login/ldap.vue +1 -1
  88. package/components/cards/ApplicationCard.vue +140 -0
  89. package/components/dialog/AddClusterMemberDialog.vue +1 -1
  90. package/components/dialog/AddCustomBadgeDialog.vue +4 -4
  91. package/components/dialog/AddProjectMemberDialog.vue +2 -2
  92. package/components/dialog/AddonConfigConfirmationDialog.vue +1 -1
  93. package/components/dialog/DrainNode.vue +3 -3
  94. package/components/dialog/ForceMachineRemoveDialog.vue +2 -2
  95. package/components/dialog/GenericPrompt.vue +2 -2
  96. package/components/dialog/RollbackWorkloadDialog.vue +2 -2
  97. package/components/dialog/RotateCertificatesDialog.vue +3 -3
  98. package/components/dialog/RotateEncryptionKeyDialog.vue +11 -6
  99. package/components/dialog/SaveAsRKETemplateDialog.vue +3 -3
  100. package/components/dialog/harvester/AddHotplugModal.vue +3 -3
  101. package/components/dialog/harvester/BackupModal.vue +3 -3
  102. package/components/dialog/harvester/CloneTemplate.vue +3 -3
  103. package/components/dialog/harvester/EjectCDROMDialog.vue +3 -3
  104. package/components/dialog/harvester/ExportImageDialog.vue +3 -3
  105. package/components/dialog/harvester/MaintenanceDialog.vue +2 -2
  106. package/components/dialog/harvester/MigrationDialog.vue +2 -2
  107. package/components/dialog/harvester/RestoreDialog.vue +2 -2
  108. package/components/dialog/harvester/SupportBundle.vue +2 -2
  109. package/components/dialog/harvester/UnplugVolume.vue +2 -2
  110. package/components/fleet/FleetBundleResources.vue +1 -1
  111. package/components/fleet/FleetBundles.vue +1 -1
  112. package/components/fleet/FleetResources.vue +5 -3
  113. package/components/fleet/ForceDirectedTreeChart/chartIcons.js +17 -0
  114. package/components/fleet/ForceDirectedTreeChart/index.vue +553 -0
  115. package/components/form/ArrayList.vue +22 -3
  116. package/components/form/BannerSettings.vue +3 -3
  117. package/components/form/ChangePassword.vue +2 -2
  118. package/components/form/Command.vue +28 -9
  119. package/components/form/Error.vue +50 -0
  120. package/components/form/Footer.vue +2 -5
  121. package/components/form/HealthCheck.vue +2 -2
  122. package/components/form/HookOption.vue +2 -2
  123. package/components/form/InputWithSelect.vue +12 -2
  124. package/components/form/KeyValue.vue +5 -2
  125. package/components/form/LabeledSelect.vue +27 -14
  126. package/components/form/Labels.vue +12 -0
  127. package/components/form/MatchExpressions.vue +44 -10
  128. package/components/form/Members/ClusterPermissionsEditor.vue +3 -3
  129. package/components/form/Members/MembershipEditor.vue +10 -1
  130. package/components/form/Members/ProjectMembershipEditor.vue +1 -0
  131. package/components/form/NameNsDescription.vue +202 -79
  132. package/components/form/Networking.vue +1 -1
  133. package/components/form/NodeAffinity.vue +41 -26
  134. package/components/form/NodeScheduling.vue +29 -3
  135. package/components/form/NotificationSettings.vue +2 -2
  136. package/components/form/Password.vue +1 -1
  137. package/components/form/PodAffinity.vue +64 -6
  138. package/components/form/PodSecurity.vue +2 -2
  139. package/components/form/Ports.vue +1 -1
  140. package/components/form/Probe.vue +60 -17
  141. package/components/form/ProjectMemberEditor.vue +3 -3
  142. package/components/form/ResourceQuota/NamespaceRow.vue +46 -2
  143. package/components/form/ResourceQuota/Project.vue +4 -0
  144. package/components/form/ResourceTabs/index.vue +19 -7
  145. package/components/form/RuleSelector.vue +1 -1
  146. package/components/form/Security.vue +56 -14
  147. package/components/form/Select.vue +52 -10
  148. package/components/form/SelectOrCreateAuthSecret.vue +70 -31
  149. package/components/form/ServiceNameSelect.vue +1 -1
  150. package/components/form/ServicePorts.vue +10 -2
  151. package/components/form/ShellInput.vue +1 -1
  152. package/components/form/SimpleSecretSelector.vue +2 -2
  153. package/components/form/Tolerations.vue +1 -1
  154. package/components/form/UnitInput.vue +12 -3
  155. package/components/form/ValueFromResource.vue +1 -1
  156. package/components/form/WorkloadPorts.vue +1 -1
  157. package/components/form/__tests__/Command.test.ts +63 -0
  158. package/components/form/__tests__/Error.test.ts +56 -0
  159. package/components/form/__tests__/MatchExpressions.test.ts +79 -0
  160. package/components/form/__tests__/Probe.test.ts +62 -0
  161. package/components/form/__tests__/Security.test.ts +55 -0
  162. package/components/form/__tests__/UnitInput.test.ts +31 -23
  163. package/components/formatter/BadgeStateFormatter.vue +1 -1
  164. package/components/formatter/Capitalize.vue +7 -0
  165. package/components/formatter/ClusterLink.vue +6 -2
  166. package/components/formatter/ClusterProvider.vue +36 -0
  167. package/components/formatter/DelayedValue.vue +43 -0
  168. package/components/formatter/Endpoints.vue +2 -2
  169. package/components/formatter/HarvesterDiskState.vue +1 -1
  170. package/components/formatter/HarvesterIpAddress.vue +37 -18
  171. package/components/formatter/HarvesterMigrationState.vue +1 -1
  172. package/components/formatter/HarvesterVmState.vue +1 -1
  173. package/components/formatter/LinkDetail.vue +11 -2
  174. package/components/formatter/LinkName.vue +2 -2
  175. package/components/formatter/LiveExpiryBadgeState.vue +1 -1
  176. package/components/formatter/LivePodRestarts.vue +47 -0
  177. package/components/formatter/MachineSummaryGraph.vue +51 -5
  178. package/components/formatter/PodsUsage.vue +5 -3
  179. package/components/formatter/Weight.vue +1 -1
  180. package/components/formatter/WorkloadHealthScale.vue +17 -6
  181. package/components/nav/HarvesterUpgrade.vue +15 -5
  182. package/components/nav/Header.vue +15 -6
  183. package/components/nav/Jump.vue +1 -1
  184. package/components/nav/NamespaceFilter.vue +30 -10
  185. package/components/nav/TopLevelMenu.vue +52 -14
  186. package/components/nav/WindowManager/ContainerLogs.vue +14 -2
  187. package/components/nav/WorkspaceSwitcher.vue +1 -1
  188. package/components/{NovncConsole.vue → novnc/NovncConsole.vue} +0 -0
  189. package/components/novnc/NovncConsoleItem.vue +89 -0
  190. package/components/novnc/NovncConsoleWrapper.vue +243 -0
  191. package/config/labels-annotations.js +6 -2
  192. package/config/product/explorer.js +7 -3
  193. package/config/product/fleet.js +4 -1
  194. package/config/product/manager.js +5 -6
  195. package/config/product/settings.js +12 -1
  196. package/config/query-params.js +2 -0
  197. package/config/roles.ts +5 -0
  198. package/config/settings.js +60 -63
  199. package/config/table-headers.js +47 -18
  200. package/config/types.js +24 -8
  201. package/content/docs/en-us/whats-new.md +25 -0
  202. package/core/plugin.ts +12 -2
  203. package/creators/app/init +7 -1
  204. package/creators/pkg/tsconfig.json +2 -3
  205. package/detail/catalog.cattle.io.app.vue +1 -1
  206. package/detail/cis.cattle.io.clusterscan.vue +1 -1
  207. package/detail/fleet.cattle.io.bundle.vue +73 -21
  208. package/detail/fleet.cattle.io.gitrepo.vue +5 -4
  209. package/detail/harvesterhci.io.host/HarvesterHostBasic.vue +25 -4
  210. package/detail/harvesterhci.io.host/HarvesterHostDisk.vue +2 -2
  211. package/detail/harvesterhci.io.virtualmachinebackup/index.vue +1 -1
  212. package/detail/helm.cattle.io.projecthelmchart.vue +1 -1
  213. package/detail/networking.k8s.io.ingress.vue +10 -2
  214. package/detail/pod.vue +37 -1
  215. package/detail/provisioning.cattle.io.cluster.vue +102 -15
  216. package/detail/workload/index.vue +163 -15
  217. package/edit/auth/azuread.vue +146 -34
  218. package/edit/auth/github.vue +3 -3
  219. package/edit/auth/googleoauth.vue +3 -3
  220. package/edit/auth/ldap/config.vue +15 -7
  221. package/edit/auth/ldap/index.vue +2 -2
  222. package/edit/auth/oidc.vue +3 -3
  223. package/edit/auth/saml.vue +3 -3
  224. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -1
  225. package/edit/autoscaling.horizontalpodautoscaler/metric-identifier.vue +1 -1
  226. package/edit/autoscaling.horizontalpodautoscaler/metric-object-reference.vue +1 -1
  227. package/edit/autoscaling.horizontalpodautoscaler/metric-target.vue +1 -1
  228. package/edit/autoscaling.horizontalpodautoscaler/metrics-row.vue +1 -1
  229. package/edit/catalog.cattle.io.clusterrepo.vue +2 -2
  230. package/edit/cis.cattle.io.clusterscan.vue +4 -4
  231. package/edit/cis.cattle.io.clusterscanbenchmark.vue +1 -1
  232. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -1
  233. package/edit/fleet.cattle.io.cluster.vue +1 -0
  234. package/edit/fleet.cattle.io.clustergroup.vue +1 -1
  235. package/edit/fleet.cattle.io.gitrepo.vue +290 -157
  236. package/edit/harvesterhci.io.host/HarvesterDisk.vue +4 -5
  237. package/edit/harvesterhci.io.host/index.vue +28 -19
  238. package/edit/harvesterhci.io.keypair.vue +1 -1
  239. package/edit/harvesterhci.io.managedchart/rancher-monitoring.vue +1 -1
  240. package/edit/harvesterhci.io.management.cluster.vue +1 -1
  241. package/edit/harvesterhci.io.networkattachmentdefinition.vue +2 -2
  242. package/edit/harvesterhci.io.setting/additional-ca.vue +1 -1
  243. package/edit/harvesterhci.io.setting/backup-target.vue +1 -1
  244. package/edit/harvesterhci.io.setting/http-proxy.vue +1 -1
  245. package/edit/harvesterhci.io.setting/index.vue +3 -3
  246. package/edit/harvesterhci.io.setting/overcommit-config.vue +4 -1
  247. package/edit/harvesterhci.io.setting/ssl-parameters.vue +1 -1
  248. package/edit/harvesterhci.io.setting/support-bundle-image.vue +1 -1
  249. package/edit/harvesterhci.io.setting/vip-pools.vue +1 -1
  250. package/edit/harvesterhci.io.setting/vm-force-reset-policy.vue +2 -2
  251. package/edit/harvesterhci.io.virtualmachinebackup.vue +2 -2
  252. package/edit/harvesterhci.io.virtualmachineimage.vue +2 -2
  253. package/edit/harvesterhci.io.virtualmachinetemplateversion.vue +26 -18
  254. package/edit/helm.cattle.io.projecthelmchart.vue +3 -3
  255. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +2 -2
  256. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/AccessCredentialsUsers.vue +1 -1
  257. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/index.vue +1 -1
  258. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/DataTemplate.vue +1 -0
  259. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/index.vue +2 -1
  260. package/edit/kubevirt.io.virtualmachine/VirtualMachineCpuMemory.vue +3 -1
  261. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/__tests__/HarvesterEditNetwork.test.ts +41 -0
  262. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue +79 -36
  263. package/edit/kubevirt.io.virtualmachine/VirtualMachineReserved.vue +54 -0
  264. package/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue +1 -1
  265. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue +2 -3
  266. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditContainer.test.ts +40 -0
  267. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditExisting.test.ts +102 -0
  268. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVMImage.test.ts +117 -0
  269. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVolume.test.ts +74 -0
  270. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/container.vue +59 -13
  271. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue +72 -16
  272. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/vmImage.vue +74 -14
  273. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue +35 -9
  274. package/edit/kubevirt.io.virtualmachine/index.vue +33 -24
  275. package/edit/logging-flow/index.vue +1 -1
  276. package/edit/logging.banzaicloud.io.output/index.vue +1 -1
  277. package/edit/logging.banzaicloud.io.output/providers/awsElasticsearch.vue +1 -1
  278. package/edit/logging.banzaicloud.io.output/providers/azurestorage.vue +1 -1
  279. package/edit/logging.banzaicloud.io.output/providers/cloudwatch.vue +1 -1
  280. package/edit/logging.banzaicloud.io.output/providers/datadog.vue +2 -2
  281. package/edit/logging.banzaicloud.io.output/providers/elasticsearch.vue +2 -2
  282. package/edit/logging.banzaicloud.io.output/providers/file.vue +1 -1
  283. package/edit/logging.banzaicloud.io.output/providers/forward.vue +1 -1
  284. package/edit/logging.banzaicloud.io.output/providers/gcs.vue +2 -2
  285. package/edit/logging.banzaicloud.io.output/providers/gelf.vue +2 -2
  286. package/edit/logging.banzaicloud.io.output/providers/kafka.vue +2 -2
  287. package/edit/logging.banzaicloud.io.output/providers/kinesisStream.vue +1 -1
  288. package/edit/logging.banzaicloud.io.output/providers/logdna.vue +1 -1
  289. package/edit/logging.banzaicloud.io.output/providers/logz.vue +2 -2
  290. package/edit/logging.banzaicloud.io.output/providers/loki.vue +2 -2
  291. package/edit/logging.banzaicloud.io.output/providers/newrelic.vue +1 -1
  292. package/edit/logging.banzaicloud.io.output/providers/s3.vue +2 -2
  293. package/edit/logging.banzaicloud.io.output/providers/splunkHec.vue +2 -2
  294. package/edit/logging.banzaicloud.io.output/providers/sumologic.vue +1 -1
  295. package/edit/logging.banzaicloud.io.output/providers/syslog.vue +2 -2
  296. package/edit/management.cattle.io.clusterroletemplatebinding.vue +2 -0
  297. package/edit/management.cattle.io.node.vue +71 -0
  298. package/edit/management.cattle.io.project.vue +28 -23
  299. package/edit/management.cattle.io.setting.vue +14 -3
  300. package/edit/management.cattle.io.user.vue +1 -1
  301. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +4 -4
  302. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +13 -13
  303. package/edit/monitoring.coreos.com.alertmanagerconfig/routeConfig.vue +18 -10
  304. package/edit/monitoring.coreos.com.alertmanagerconfig/tls.vue +2 -2
  305. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +12 -7
  306. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +12 -7
  307. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +20 -11
  308. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +13 -8
  309. package/edit/monitoring.coreos.com.alertmanagerconfig/types/webhook.vue +25 -7
  310. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +2 -2
  311. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +20 -7
  312. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +1 -1
  313. package/edit/monitoring.coreos.com.prometheusrule/index.vue +19 -8
  314. package/edit/monitoring.coreos.com.receiver/auth.vue +1 -1
  315. package/edit/monitoring.coreos.com.receiver/index.vue +2 -2
  316. package/edit/monitoring.coreos.com.receiver/tls.vue +2 -2
  317. package/edit/monitoring.coreos.com.receiver/types/email.vue +2 -2
  318. package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +2 -2
  319. package/edit/monitoring.coreos.com.receiver/types/pagerduty.vue +2 -2
  320. package/edit/monitoring.coreos.com.receiver/types/slack.vue +2 -2
  321. package/edit/monitoring.coreos.com.receiver/types/webhook.banner.vue +1 -1
  322. package/edit/monitoring.coreos.com.receiver/types/webhook.vue +3 -3
  323. package/edit/monitoring.coreos.com.route.vue +2 -2
  324. package/edit/namespace.vue +0 -8
  325. package/edit/network.harvesterhci.io.clusternetwork/vlan.vue +1 -1
  326. package/edit/networking.istio.io.destinationrule/LoadBalancer.vue +2 -2
  327. package/edit/networking.istio.io.destinationrule/index.vue +1 -1
  328. package/edit/networking.k8s.io.ingress/Certificate.vue +5 -1
  329. package/edit/networking.k8s.io.ingress/Certificates.vue +5 -0
  330. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +17 -2
  331. package/edit/networking.k8s.io.ingress/IngressClass.vue +63 -0
  332. package/edit/networking.k8s.io.ingress/Rule.vue +42 -6
  333. package/edit/networking.k8s.io.ingress/RulePath.vue +29 -5
  334. package/edit/networking.k8s.io.ingress/Rules.vue +11 -0
  335. package/edit/networking.k8s.io.ingress/index.vue +104 -15
  336. package/edit/networking.k8s.io.networkpolicy/PolicyRulePort.vue +1 -1
  337. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +2 -2
  338. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -2
  339. package/edit/persistentvolume/index.vue +1 -1
  340. package/edit/persistentvolume/plugins/awsElasticBlockStore.vue +2 -2
  341. package/edit/persistentvolume/plugins/azureDisk.vue +2 -2
  342. package/edit/persistentvolume/plugins/azureFile.vue +2 -2
  343. package/edit/persistentvolume/plugins/cephfs.vue +4 -4
  344. package/edit/persistentvolume/plugins/cinder.vue +2 -2
  345. package/edit/persistentvolume/plugins/csi.vue +2 -2
  346. package/edit/persistentvolume/plugins/fc.vue +4 -4
  347. package/edit/persistentvolume/plugins/flexVolume.vue +2 -2
  348. package/edit/persistentvolume/plugins/flocker.vue +1 -1
  349. package/edit/persistentvolume/plugins/gcePersistentDisk.vue +2 -2
  350. package/edit/persistentvolume/plugins/glusterfs.vue +2 -2
  351. package/edit/persistentvolume/plugins/hostPath.vue +1 -1
  352. package/edit/persistentvolume/plugins/iscsi.vue +4 -4
  353. package/edit/persistentvolume/plugins/local.vue +1 -1
  354. package/edit/persistentvolume/plugins/longhorn.vue +2 -2
  355. package/edit/persistentvolume/plugins/nfs.vue +2 -2
  356. package/edit/persistentvolume/plugins/photonPersistentDisk.vue +1 -1
  357. package/edit/persistentvolume/plugins/portworxVolume.vue +2 -2
  358. package/edit/persistentvolume/plugins/quobyte.vue +2 -2
  359. package/edit/persistentvolume/plugins/rbd.vue +4 -4
  360. package/edit/persistentvolume/plugins/scaleIO.vue +2 -2
  361. package/edit/persistentvolume/plugins/storageos.vue +2 -2
  362. package/edit/persistentvolume/plugins/vsphereVolume.vue +1 -1
  363. package/edit/persistentvolumeclaim.vue +24 -8
  364. package/edit/provisioning.cattle.io.cluster/ACE.vue +2 -2
  365. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +8 -3
  366. package/edit/provisioning.cattle.io.cluster/DrainOptions.vue +2 -2
  367. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +15 -3
  368. package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +16 -3
  369. package/edit/provisioning.cattle.io.cluster/S3Config.vue +2 -2
  370. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +1 -1
  371. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.tests.ts +1 -7
  372. package/edit/provisioning.cattle.io.cluster/import.vue +2 -1
  373. package/edit/provisioning.cattle.io.cluster/index.vue +26 -7
  374. package/edit/provisioning.cattle.io.cluster/rke2.vue +136 -48
  375. package/edit/resources.cattle.io.backup.vue +26 -8
  376. package/edit/resources.cattle.io.restore.vue +3 -3
  377. package/edit/secret/basic.vue +1 -1
  378. package/edit/secret/index.vue +80 -2
  379. package/edit/secret/registry.vue +2 -2
  380. package/edit/secret/ssh.vue +1 -1
  381. package/edit/secret/tls.vue +1 -1
  382. package/edit/service.vue +47 -11
  383. package/edit/serviceaccount.vue +1 -1
  384. package/edit/storage.k8s.io.storageclass/index.vue +1 -1
  385. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/aws-ebs.vue +7 -3
  386. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/azure-disk.vue +1 -1
  387. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/azure-file.vue +1 -1
  388. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/cinder.vue +2 -2
  389. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/gce-pd.vue +2 -2
  390. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/glusterfs.vue +1 -1
  391. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/portworx-volume.vue +1 -1
  392. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/quobyte.vue +1 -1
  393. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/rbd.vue +1 -1
  394. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/scaleio.vue +1 -1
  395. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/storageos.vue +1 -1
  396. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/vsphere-volume.vue +1 -1
  397. package/edit/token.vue +3 -3
  398. package/edit/ui.cattle.io.navlink.vue +2 -2
  399. package/edit/workload/Job.vue +111 -23
  400. package/edit/workload/Upgrading.vue +77 -22
  401. package/edit/workload/__tests__/Job.test.ts +72 -0
  402. package/edit/workload/__tests__/Upgrading.test.ts +60 -0
  403. package/edit/workload/index.vue +13 -1085
  404. package/edit/workload/mixins/workload.js +900 -0
  405. package/edit/workload/storage/Mount.vue +2 -2
  406. package/edit/workload/storage/awsElasticBlockStore.vue +1 -1
  407. package/edit/workload/storage/azureDisk.vue +2 -2
  408. package/edit/workload/storage/azureFile.vue +1 -1
  409. package/edit/workload/storage/ephemeralVolume/index.vue +2 -2
  410. package/edit/workload/storage/gcePersistentDisk.vue +1 -1
  411. package/edit/workload/storage/hostPath.vue +1 -1
  412. package/edit/workload/storage/nfs.vue +2 -2
  413. package/edit/workload/storage/persistentVolumeClaim/index.vue +2 -2
  414. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +3 -3
  415. package/edit/workload/storage/secret.vue +2 -2
  416. package/edit/workload/storage/vsphereVolume.vue +1 -1
  417. package/edit/workload/types/Deployment.vue +377 -0
  418. package/edit/workload/types/Generic.vue +295 -0
  419. package/layouts/default.vue +26 -7
  420. package/layouts/error.vue +3 -2
  421. package/layouts/home.vue +12 -2
  422. package/layouts/plain.vue +18 -2
  423. package/layouts/unauthenticated.vue +2 -1
  424. package/list/catalog.cattle.io.clusterrepo.vue +1 -1
  425. package/list/fleet.cattle.io.bundle.vue +1 -1
  426. package/list/fleet.cattle.io.cluster.vue +1 -1
  427. package/list/fleet.cattle.io.clusterregistrationtoken.vue +1 -1
  428. package/list/harvesterhci.io.dashboard/HarvesterUpgrade.vue +9 -8
  429. package/list/harvesterhci.io.dashboard/UpgradeInfo.vue +40 -0
  430. package/list/harvesterhci.io.dashboard/index.vue +14 -36
  431. package/list/harvesterhci.io.host/index.vue +24 -12
  432. package/list/harvesterhci.io.networkattachmentdefinition.vue +1 -1
  433. package/list/harvesterhci.io.setting.vue +1 -1
  434. package/list/harvesterhci.io.virtualmachinebackup.vue +1 -1
  435. package/list/harvesterhci.io.virtualmachineimage.vue +36 -3
  436. package/list/harvesterhci.io.virtualmachinetemplateversion.vue +1 -5
  437. package/list/helm.cattle.io.projecthelmchart.vue +1 -1
  438. package/list/kubevirt.io.virtualmachine.vue +4 -2
  439. package/list/management.cattle.io.feature.vue +3 -3
  440. package/list/management.cattle.io.setting.vue +2 -2
  441. package/list/monitoring.coreos.com.alertmanagerconfig.vue +1 -1
  442. package/list/namespace.vue +3 -1
  443. package/list/node.vue +10 -3
  444. package/list/persistentvolumeclaim.vue +42 -0
  445. package/list/provisioning.cattle.io.cluster.vue +22 -20
  446. package/list/workload.vue +31 -6
  447. package/machine-config/amazonec2.vue +37 -12
  448. package/machine-config/azure.vue +3 -3
  449. package/machine-config/digitalocean.vue +2 -2
  450. package/machine-config/generic.vue +1 -1
  451. package/machine-config/harvester.vue +124 -25
  452. package/machine-config/linode.vue +2 -2
  453. package/machine-config/vmwarevsphere.vue +5 -5
  454. package/middleware/authenticated.js +36 -6
  455. package/middleware/unauthenticated.js +22 -0
  456. package/mixins/brand.js +50 -3
  457. package/mixins/browser-tab-visibility.js +37 -0
  458. package/mixins/chart.js +36 -4
  459. package/mixins/{compact-input.js → compact-input.ts} +5 -3
  460. package/mixins/form-validation.js +122 -0
  461. package/mixins/harvester-vm/index.js +134 -90
  462. package/mixins/labeled-form-element.ts +193 -0
  463. package/mixins/resource-fetch.js +173 -0
  464. package/models/cluster.x-k8s.io.machine.js +6 -2
  465. package/models/etcdbackup.js +4 -0
  466. package/models/event.js +4 -0
  467. package/models/fleet.cattle.io.bundle.js +1 -1
  468. package/models/fleet.cattle.io.gitrepo.js +10 -0
  469. package/models/harvester/harvesterhci.io.virtualmachinebackup.js +5 -2
  470. package/models/harvester/harvesterhci.io.virtualmachineimage.js +11 -8
  471. package/models/harvester/harvesterhci.io.virtualmachinetemplateversion.js +11 -2
  472. package/models/harvester/kubevirt.io.virtualmachine.js +2 -2
  473. package/models/harvester/kubevirt.io.virtualmachineinstance.js +1 -1
  474. package/models/harvester/node.js +27 -32
  475. package/models/harvester/persistentvolumeclaim.js +1 -1
  476. package/models/management.cattle.io.cluster.js +17 -11
  477. package/models/management.cattle.io.clusterroletemplatebinding.js +2 -2
  478. package/models/management.cattle.io.globalrole.js +19 -0
  479. package/models/management.cattle.io.node.js +10 -11
  480. package/models/management.cattle.io.project.js +60 -26
  481. package/models/management.cattle.io.roletemplate.js +19 -0
  482. package/models/monitoring.coreos.com.alertmanagerconfig.js +3 -2
  483. package/models/monitoring.coreos.com.prometheusrule.js +9 -0
  484. package/models/namespace.js +9 -1
  485. package/models/networking.k8s.io.ingress.js +17 -5
  486. package/models/persistentvolumeclaim.js +47 -1
  487. package/models/projectroletemplatebinding.js +2 -2
  488. package/models/provisioning.cattle.io.cluster.js +92 -13
  489. package/models/rke.cattle.io.etcdsnapshot.js +4 -0
  490. package/models/service.js +11 -5
  491. package/models/storage.k8s.io.storageclass.js +14 -1
  492. package/models/workload.js +7 -2
  493. package/nuxt.config.js +27 -7
  494. package/package.json +10 -14
  495. package/pages/about.vue +15 -1
  496. package/pages/account/index.vue +1 -1
  497. package/pages/auth/login.vue +17 -5
  498. package/pages/auth/setup.vue +47 -9
  499. package/pages/c/_cluster/_product/_resource/create.vue +1 -1
  500. package/pages/c/_cluster/_product/members/index.vue +6 -1
  501. package/pages/c/_cluster/_product/projectsnamespaces.vue +113 -11
  502. package/pages/c/_cluster/apps/charts/chart.vue +1 -1
  503. package/pages/c/_cluster/apps/charts/index.vue +2 -2
  504. package/pages/c/_cluster/apps/charts/install.vue +197 -19
  505. package/pages/c/_cluster/auth/config/index.vue +1 -1
  506. package/pages/c/_cluster/explorer/EventsTable.vue +1 -15
  507. package/pages/c/_cluster/explorer/index.vue +64 -35
  508. package/pages/c/_cluster/explorer/tools/index.vue +1 -1
  509. package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +249 -0
  510. package/pages/c/_cluster/fleet/index.vue +47 -65
  511. package/pages/c/_cluster/harvester/airgapupgrade/index.vue +7 -4
  512. package/pages/c/_cluster/harvester/console/_uid/vnc.vue +7 -1
  513. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +8 -14
  514. package/pages/c/_cluster/monitoring/index.vue +1 -1
  515. package/pages/c/_cluster/monitoring/route-receiver/index.vue +1 -1
  516. package/pages/c/_cluster/settings/banners.vue +2 -2
  517. package/pages/c/_cluster/settings/brand.vue +62 -7
  518. package/pages/c/_cluster/settings/performance.vue +167 -0
  519. package/pages/diagnostic.vue +468 -0
  520. package/pages/fail-whale.vue +17 -5
  521. package/pages/home.vue +36 -22
  522. package/pages/plugins.vue +1 -1
  523. package/pages/prefs.vue +20 -7
  524. package/pages/support/index.vue +51 -9
  525. package/pkg/auto-import.js +1 -1
  526. package/pkg/dynamic-importer.lib.js +8 -0
  527. package/pkg/tsconfig.json +26 -9
  528. package/pkg/vue.config.js +8 -0
  529. package/plugins/console.js +29 -0
  530. package/plugins/dashboard-store/actions.js +171 -28
  531. package/plugins/dashboard-store/getters.js +13 -1
  532. package/plugins/dashboard-store/index.js +5 -1
  533. package/plugins/dashboard-store/mutations.js +72 -22
  534. package/plugins/dashboard-store/resource-class.js +259 -184
  535. package/plugins/i18n.js +9 -3
  536. package/plugins/steve/actions.js +16 -1
  537. package/plugins/steve/getters.js +9 -1
  538. package/plugins/steve/index.js +6 -2
  539. package/plugins/steve/mutations.js +100 -5
  540. package/plugins/steve/norman-class.js +8 -0
  541. package/plugins/steve/performanceTesting.js +5 -0
  542. package/plugins/steve/subscribe.js +144 -12
  543. package/plugins/steve/web-worker.steve-sub-worker.js +129 -0
  544. package/promptRemove/kubevirt.io.virtualmachine.vue +3 -17
  545. package/promptRemove/management.cattle.io.project.vue +128 -0
  546. package/promptRemove/pod.vue +131 -0
  547. package/rancher-components/BadgeState/BadgeState.spec.ts +12 -0
  548. package/{components → rancher-components/BadgeState}/BadgeState.vue +18 -10
  549. package/rancher-components/BadgeState/index.ts +1 -0
  550. package/{components/__tests__ → rancher-components/Banner}/Banner.test.ts +1 -1
  551. package/{components → rancher-components/Banner}/Banner.vue +22 -7
  552. package/rancher-components/Banner/index.ts +1 -0
  553. package/{components → rancher-components/Card}/Card.vue +58 -12
  554. package/rancher-components/Card/index.ts +1 -0
  555. package/{components/form → rancher-components/Form/Checkbox}/Checkbox.vue +118 -25
  556. package/rancher-components/Form/Checkbox/index.ts +1 -0
  557. package/{components/form/__tests__ → rancher-components/Form/LabeledInput}/LabeledInput.test.ts +13 -2
  558. package/rancher-components/Form/LabeledInput/LabeledInput.vue +341 -0
  559. package/rancher-components/Form/LabeledInput/index.ts +1 -0
  560. package/{components/form → rancher-components/Form/Radio}/RadioButton.vue +50 -22
  561. package/{components/form → rancher-components/Form/Radio}/RadioGroup.vue +76 -28
  562. package/rancher-components/Form/Radio/index.ts +2 -0
  563. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +169 -0
  564. package/rancher-components/Form/TextArea/index.ts +1 -0
  565. package/rancher-components/Form/index.ts +4 -0
  566. package/{components/form → rancher-components/LabeledTooltip}/LabeledTooltip.vue +32 -11
  567. package/rancher-components/LabeledTooltip/index.ts +1 -0
  568. package/scripts/build-pkg.sh +4 -0
  569. package/scripts/publish-shell.sh +37 -18
  570. package/scripts/test-plugins-build.sh +115 -0
  571. package/store/catalog.js +4 -0
  572. package/store/growl.js +6 -0
  573. package/store/i18n.js +18 -9
  574. package/store/index.js +190 -107
  575. package/store/prefs.js +8 -2
  576. package/store/resource-fetch.js +44 -0
  577. package/store/type-map.js +43 -7
  578. package/store/uiplugins.ts +1 -1
  579. package/utils/favicon.js +40 -0
  580. package/utils/object.js +26 -9
  581. package/utils/promise.js +20 -0
  582. package/utils/socket.js +10 -1
  583. package/utils/string.js +16 -0
  584. package/utils/validators/formRules/__tests__/index.test.ts +928 -0
  585. package/utils/validators/formRules/index.ts +447 -0
  586. package/utils/validators/prometheusrule.js +1 -1
  587. package/utils/validators/vm.js +12 -5
  588. package/utils/width.js +39 -0
  589. package/yarn-error.log +196 -0
  590. package/components/NovncConsoleWrapper.vue +0 -150
  591. package/components/form/Container.vue +0 -143
  592. package/components/form/LabeledInput.vue +0 -245
  593. package/components/form/Scheduling.vue +0 -115
  594. package/components/form/TextAreaAutoGrow.vue +0 -127
  595. package/mixins/labeled-form-element.js +0 -137
package/store/index.js CHANGED
@@ -60,24 +60,120 @@ export const plugins = [
60
60
 
61
61
  ];
62
62
 
63
+ const getActiveNamespaces = (state, getters) => {
64
+ const out = {};
65
+ const product = getters['currentProduct'];
66
+ const workspace = state.workspace;
67
+
68
+ if ( !product ) {
69
+ return out;
70
+ }
71
+
72
+ if ( product.showWorkspaceSwitcher ) {
73
+ const fleetOut = { [workspace]: true };
74
+
75
+ updateActiveNamespaceCache(state, fleetOut);
76
+
77
+ return fleetOut;
78
+ }
79
+
80
+ const inStore = product?.inStore;
81
+ const clusterId = getters['currentCluster']?.id;
82
+
83
+ if ( !clusterId || !inStore ) {
84
+ updateActiveNamespaceCache(state, out);
85
+
86
+ return out;
87
+ }
88
+
89
+ const namespaces = getters[`${ inStore }/all`](NAMESPACE);
90
+
91
+ const filters = state.namespaceFilters.filter(x => !!x && !`${ x }`.startsWith(NAMESPACED_PREFIX));
92
+ const includeAll = getters.isAllNamespaces;
93
+ const includeSystem = filters.includes(ALL_SYSTEM);
94
+ const includeUser = filters.includes(ALL_USER);
95
+ const includeOrphans = filters.includes(ALL_ORPHANS);
96
+
97
+ // Special cases to pull in all the user, system, or orphaned namespaces
98
+ if ( includeAll || includeOrphans || includeSystem || includeUser ) {
99
+ for ( const ns of namespaces ) {
100
+ if (
101
+ includeAll ||
102
+ ( includeOrphans && !ns.projectId ) ||
103
+ ( includeUser && !ns.isSystem ) ||
104
+ ( includeSystem && ns.isSystem )
105
+ ) {
106
+ out[ns.id] = true;
107
+ }
108
+ }
109
+ }
110
+
111
+ // Individual requests for a specific project/namespace
112
+ if ( !includeAll ) {
113
+ for ( const filter of filters ) {
114
+ const [type, id] = filter.split('://', 2);
115
+
116
+ if ( !type ) {
117
+ continue;
118
+ }
119
+
120
+ if ( type === 'ns' ) {
121
+ out[id] = true;
122
+ } else if ( type === 'project' ) {
123
+ const project = getters['management/byId'](MANAGEMENT.PROJECT, `${ clusterId }/${ id }`);
124
+
125
+ if ( project ) {
126
+ for ( const ns of project.namespaces ) {
127
+ out[ns.id] = true;
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+ // Create map that can be used to efficiently check if a
134
+ // resource should be displayed
135
+ updateActiveNamespaceCache(state, out);
136
+
137
+ return out;
138
+ };
139
+
140
+ const updateActiveNamespaceCache = (state, activeNamespaceCache) => {
141
+ // This is going to run a lot, so keep it optimised
142
+ let cacheKey = '';
143
+
144
+ for (const key in activeNamespaceCache) {
145
+ // I though array.join would be faster than string concatenation, but in places like this where the array must first be constructed it's
146
+ // slower.
147
+ cacheKey += key + activeNamespaceCache[key];
148
+ }
149
+
150
+ // Only update `activeNamespaceCache` if there have been changes. This reduces a lot of churn
151
+ if (state.activeNamespaceCacheKey !== cacheKey) {
152
+ state.activeNamespaceCacheKey = cacheKey;
153
+ state.activeNamespaceCache = activeNamespaceCache;
154
+ }
155
+ };
156
+
63
157
  export const state = () => {
64
158
  return {
65
- managementReady: false,
66
- clusterReady: false,
67
- isMultiCluster: false,
68
- isRancher: false,
69
- namespaceFilters: [],
70
- allNamespaces: null,
71
- allWorkspaces: null,
72
- clusterId: null,
73
- productId: null,
74
- workspace: null,
75
- error: null,
76
- cameFromError: false,
77
- pageActions: [],
78
- serverVersion: null,
79
- systemNamespaces: [],
80
- isSingleProduct: undefined,
159
+ managementReady: false,
160
+ clusterReady: false,
161
+ isMultiCluster: false,
162
+ isRancher: false,
163
+ namespaceFilters: [],
164
+ activeNamespaceCache: {}, // Used to efficiently check if a resource should be displayed
165
+ activeNamespaceCacheKey: '', // Fingerprint of activeNamespaceCache
166
+ allNamespaces: null,
167
+ allWorkspaces: null,
168
+ clusterId: null,
169
+ productId: null,
170
+ workspace: null,
171
+ error: null,
172
+ cameFromError: false,
173
+ pageActions: [],
174
+ serverVersion: null,
175
+ systemNamespaces: [],
176
+ isSingleProduct: undefined,
81
177
  };
82
178
  };
83
179
 
@@ -253,73 +349,28 @@ export const getters = {
253
349
  return BOTH;
254
350
  },
255
351
 
256
- namespaces(state, getters) {
257
- return () => {
258
- const out = {};
259
- const product = getters['currentProduct'];
260
- const workspace = state.workspace;
261
-
262
- if ( !product ) {
263
- return out;
264
- }
265
-
266
- if ( product.showWorkspaceSwitcher ) {
267
- return { [workspace]: true };
268
- }
269
-
270
- const inStore = product?.inStore;
271
- const clusterId = getters['currentCluster']?.id;
272
-
273
- if ( !clusterId || !inStore ) {
274
- return out;
275
- }
276
-
277
- const namespaces = getters[`${ inStore }/all`](NAMESPACE);
278
- const filters = state.namespaceFilters.filter(x => !!x && !`${ x }`.startsWith(NAMESPACED_PREFIX));
279
- const includeAll = getters.isAllNamespaces;
280
- const includeSystem = filters.includes(ALL_SYSTEM);
281
- const includeUser = filters.includes(ALL_USER);
282
- const includeOrphans = filters.includes(ALL_ORPHANS);
283
-
284
- // Special cases to pull in all the user, system, or orphaned namespaces
285
- if ( includeAll || includeOrphans || includeSystem || includeUser ) {
286
- for ( const ns of namespaces ) {
287
- if (
288
- includeAll ||
289
- ( includeOrphans && !ns.projectId ) ||
290
- ( includeUser && !ns.isSystem ) ||
291
- ( includeSystem && ns.isSystem )
292
- ) {
293
- out[ns.id] = true;
294
- }
295
- }
296
- }
297
-
298
- // Individual requests for a specific project/namespace
299
- if ( !includeAll ) {
300
- for ( const filter of filters ) {
301
- const [type, id] = filter.split('://', 2);
302
-
303
- if ( !type ) {
304
- continue;
305
- }
352
+ activeNamespaceCache(state) {
353
+ // The activeNamespaceCache value is updated by the
354
+ // updateNamespaces mutation. We use this map to filter workloads
355
+ // as we don't want to recompute the active namespaces
356
+ // for each workload in a list.
357
+ return state.activeNamespaceCache;
358
+ },
306
359
 
307
- if ( type === 'ns' ) {
308
- out[id] = true;
309
- } else if ( type === 'project' ) {
310
- const project = getters['management/byId'](MANAGEMENT.PROJECT, `${ clusterId }/${ id }`);
360
+ activeNamespaceCacheKey(state) {
361
+ return state.activeNamespaceCacheKey;
362
+ },
311
363
 
312
- if ( project ) {
313
- for ( const ns of project.namespaces ) {
314
- out[ns.id] = true;
315
- }
316
- }
317
- }
318
- }
319
- }
364
+ activeNamespaceFilters(state) {
365
+ return state.namespaceFilters;
366
+ },
320
367
 
321
- return out;
322
- };
368
+ namespaces(state, getters) {
369
+ // Call this getter if you want to recompute the active namespaces
370
+ // by looping over all namespaces in a cluster. Otherwise call activeNamespaceCache,
371
+ // which returns the same object but is only recomputed when the updateNamespaces
372
+ // mutation is called.
373
+ return () => getActiveNamespaces(state, getters);
323
374
  },
324
375
 
325
376
  defaultNamespace(state, getters, rootState, rootGetters) {
@@ -330,7 +381,7 @@ export const getters = {
330
381
  }
331
382
 
332
383
  const inStore = product.inStore;
333
- const filteredMap = getters['namespaces']();
384
+ const filteredMap = getters['activeNamespaceCache'];
334
385
  const isAll = getters['isAllNamespaces'];
335
386
  const all = getters[`${ inStore }/all`](NAMESPACE).map(x => x.id);
336
387
  let out;
@@ -420,6 +471,7 @@ export const getters = {
420
471
  resource: HCI.DASHBOARD,
421
472
  }
422
473
  },
474
+ enableSessionCheck: true
423
475
  };
424
476
  }
425
477
 
@@ -453,23 +505,29 @@ export const mutations = {
453
505
  state.isRancher = isRancher;
454
506
  },
455
507
 
456
- clusterChanged(state, ready) {
508
+ clusterReady(state, ready) {
457
509
  state.clusterReady = ready;
458
510
  },
459
511
 
460
- updateNamespaces(state, { filters, all }) {
512
+ updateNamespaces(state, getters) {
513
+ const { filters, all } = getters;
514
+
461
515
  state.namespaceFilters = filters.filter(x => !!x);
462
516
 
463
517
  if ( all ) {
464
518
  state.allNamespaces = all;
465
519
  }
520
+
521
+ // Create map that can be used to efficiently check if a
522
+ // resource should be displayed
523
+ getActiveNamespaces(state, getters);
466
524
  },
467
525
 
468
526
  pageActions(state, pageActions) {
469
527
  state.pageActions = pageActions;
470
528
  },
471
529
 
472
- updateWorkspace(state, { value, all }) {
530
+ updateWorkspace(state, { value, all, getters }) {
473
531
  if ( all ) {
474
532
  state.allWorkspaces = all;
475
533
 
@@ -484,9 +542,11 @@ export const mutations = {
484
542
  }
485
543
 
486
544
  state.workspace = value;
545
+
546
+ getActiveNamespaces(state, getters);
487
547
  },
488
548
 
489
- setCluster(state, neu) {
549
+ clusterId(state, neu) {
490
550
  state.clusterId = neu;
491
551
  },
492
552
 
@@ -619,6 +679,7 @@ export const actions = {
619
679
  commit('updateWorkspace', {
620
680
  value: getters['prefs/get'](WORKSPACE),
621
681
  all: res.workspaces,
682
+ getters
622
683
  });
623
684
  }
624
685
 
@@ -628,13 +689,13 @@ export const actions = {
628
689
  async loadCluster({
629
690
  state, commit, dispatch, getters
630
691
  }, {
631
- id, oldProduct, oldPkg, newPkg
692
+ id, product, oldProduct, oldPkg, newPkg
632
693
  }) {
633
694
  const sameCluster = state.clusterId && state.clusterId === id;
634
695
  const samePackage = oldPkg?.name === newPkg?.name;
635
696
  const isMultiCluster = getters['isMultiCluster'];
636
697
 
637
- // Are we in the same package and cluster?
698
+ // Are we in the same cluster and package?
638
699
  if ( sameCluster && samePackage) {
639
700
  // Do nothing, we're already connected/connecting to this cluster
640
701
  return;
@@ -653,12 +714,18 @@ export const actions = {
653
714
  s => getters[`${ s.storeName }/isClusterStore`]
654
715
  )?.storeName;
655
716
 
656
- // Should we leave/forget the current cluster?
657
- if ( (state.clusterId && id) || !samePackage) {
717
+ const productConfig = state['type-map']?.products?.find(p => p.name === product);
718
+ const forgetCurrentCluster = ((state.clusterId && id) || !samePackage) && !productConfig?.inExplorer;
719
+
720
+ // 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
721
+ // (latter catches cases like nav from explorer cluster A to epinio cluster A)
722
+ // AND if the product not scoped to the explorer - a case for products that only exist within the explorer (i.e. Kubewarden)
723
+ if ( forgetCurrentCluster ) {
658
724
  // Clear the old cluster state out if switching to a new one.
659
725
  // If there is not an id then stay connected to the old one behind the scenes,
660
726
  // so that the nav and header stay the same when going to things like prefs
661
- commit('clusterChanged', false);
727
+ commit('clusterReady', false);
728
+ commit('clusterId', undefined);
662
729
 
663
730
  await dispatch('cluster/unsubscribe');
664
731
  commit('cluster/reset');
@@ -682,18 +749,16 @@ export const actions = {
682
749
  if ( id ) {
683
750
  // Remember the current cluster
684
751
  dispatch('prefs/set', { key: CLUSTER_PREF, value: id });
685
- commit('setCluster', id);
752
+ commit('clusterId', id);
686
753
 
687
754
  // Use a pseudo cluster ID to pretend we have a cluster... to ensure some screens that don't care about a cluster but 'require' one to show
688
755
  if (id === BLANK_CLUSTER) {
689
- commit('clusterChanged', true);
756
+ commit('clusterReady', true);
690
757
 
691
758
  return;
692
759
  }
693
760
  } else {
694
- // Forget the current cluster
695
- commit('setCluster', undefined);
696
-
761
+ // Switching to a global page with no cluster id, keep it the same.
697
762
  return;
698
763
  }
699
764
 
@@ -705,7 +770,7 @@ export const actions = {
705
770
  dispatch(`${ newPkgClusterStore }/loadSchemas`, true);
706
771
  await dispatch(`${ newPkgClusterStore }/loadCluster`, { id });
707
772
 
708
- commit('clusterChanged', true);
773
+ commit('clusterReady', true);
709
774
  console.log('Done loading pkg cluster:', newPkgClusterStore); // eslint-disable-line no-console
710
775
 
711
776
  // Everything below here is rancher/kube cluster specific
@@ -733,7 +798,7 @@ export const actions = {
733
798
  throw new Error('Unready cluster');
734
799
  }
735
800
  } catch {
736
- commit('setCluster', null);
801
+ commit('clusterId', null);
737
802
  commit('cluster/applyConfig', { baseUrl: null });
738
803
  throw new ClusterNotFoundError(id);
739
804
  }
@@ -785,10 +850,11 @@ export const actions = {
785
850
 
786
851
  commit('updateNamespaces', {
787
852
  filters: filters || [ALL_USER],
788
- all: res.namespaces
853
+ all: res.namespaces,
854
+ ...getters
789
855
  });
790
856
 
791
- commit('clusterChanged', true);
857
+ commit('clusterReady', true);
792
858
 
793
859
  console.log('Done loading cluster.'); // eslint-disable-line no-console
794
860
  },
@@ -803,7 +869,7 @@ export const actions = {
803
869
  [key]: ids
804
870
  }
805
871
  });
806
- commit('updateNamespaces', { filters: ids });
872
+ commit('updateNamespaces', { filters: ids, ...getters });
807
873
  },
808
874
 
809
875
  async loadVirtual({
@@ -826,7 +892,7 @@ export const actions = {
826
892
  }
827
893
 
828
894
  if ( state.clusterId && id ) {
829
- commit('clusterChanged', false);
895
+ commit('clusterReady', false);
830
896
 
831
897
  await dispatch('harvester/unsubscribe');
832
898
  commit('harvester/reset');
@@ -841,7 +907,7 @@ export const actions = {
841
907
  }
842
908
 
843
909
  if (id) {
844
- commit('setCluster', id);
910
+ commit('clusterId', id);
845
911
  }
846
912
 
847
913
  console.log(`Loading ${ isMultiCluster ? 'ECM ' : '' }cluster...`); // eslint-disable-line no-console
@@ -864,7 +930,7 @@ export const actions = {
864
930
  }
865
931
 
866
932
  if ( !cluster ) {
867
- commit('setCluster', null);
933
+ commit('clusterId', null);
868
934
  commit('harvester/applyConfig', { baseUrl: null });
869
935
  throw new ClusterNotFoundError(id);
870
936
  }
@@ -891,6 +957,22 @@ export const actions = {
891
957
  isRancher = true;
892
958
  }
893
959
 
960
+ if (id !== 'local' && getters['harvester/schemaFor'](MANAGEMENT.SETTING)) { // multi-cluster
961
+ const settings = await dispatch('harvester/findAll', {
962
+ type: MANAGEMENT.SETTING,
963
+ id: SETTING.SYSTEM_NAMESPACES,
964
+ opt: { url: `${ virtualBase }/${ MANAGEMENT.SETTING }s/`, force: true }
965
+ });
966
+
967
+ const systemNamespaces = settings?.find(x => x.id === SETTING.SYSTEM_NAMESPACES);
968
+
969
+ if (systemNamespaces) {
970
+ const namespace = (systemNamespaces.value || systemNamespaces.default)?.split(',');
971
+
972
+ commit('setSystemNamespaces', namespace);
973
+ }
974
+ }
975
+
894
976
  const hash = {
895
977
  projects: isRancher && dispatch('management/findAll', projectArgs),
896
978
  virtualCount: dispatch('harvester/findAll', { type: COUNT }),
@@ -910,10 +992,11 @@ export const actions = {
910
992
 
911
993
  commit('updateNamespaces', {
912
994
  filters: filters || [ALL_USER],
913
- all: res.virtualNamespaces
995
+ all: res.virtualNamespaces,
996
+ ...getters
914
997
  });
915
998
 
916
- commit('clusterChanged', true);
999
+ commit('clusterReady', true);
917
1000
 
918
1001
  console.log('Done loading virtual cluster.'); // eslint-disable-line no-console
919
1002
  },
@@ -967,8 +1050,8 @@ export const actions = {
967
1050
  commit('prefs/reset');
968
1051
 
969
1052
  await dispatch('cluster/unsubscribe');
970
- commit('clusterChanged', false);
971
- commit('setCluster', null);
1053
+ commit('clusterReady', false);
1054
+ commit('clusterId', null);
972
1055
  commit('cluster/reset');
973
1056
 
974
1057
  await dispatch('rancher/unsubscribe');
package/store/prefs.js CHANGED
@@ -59,7 +59,7 @@ export const THEME = create('theme', 'auto', {
59
59
  export const PREFERS_SCHEME = create('pcs', '', { asCookie, asUserPreference: false });
60
60
  export const LOCALE = create('locale', 'en-us', { asCookie });
61
61
  export const KEYMAP = create('keymap', 'sublime', { options: ['sublime', 'emacs', 'vim'] });
62
- export const ROWS_PER_PAGE = create('per-page', 100, { options: [10, 25, 50, 100, 250, 500, 1000], parseJSON });
62
+ export const ROWS_PER_PAGE = create('per-page', 100, { options: [10, 25, 50, 100], parseJSON });
63
63
  export const LOGS_WRAP = create('logs-wrap', true, { parseJSON });
64
64
  export const LOGS_TIME = create('logs-time', true, { parseJSON });
65
65
  export const LOGS_RANGE = create('logs-range', '30 minutes', { parseJSON });
@@ -163,7 +163,13 @@ export const getters = {
163
163
  return definition.options.slice();
164
164
  },
165
165
 
166
- theme: (state, getters) => {
166
+ theme: (state, getters, rootState, rootGetters) => {
167
+ const setting = rootGetters['management/byId'](MANAGEMENT.SETTING, SETTING.THEME);
168
+
169
+ if (setting?.value) {
170
+ return setting?.value;
171
+ }
172
+
167
173
  let theme = getters['get'](THEME);
168
174
  const pcs = getters['get'](PREFERS_SCHEME);
169
175
 
@@ -0,0 +1,44 @@
1
+ export const state = function() {
2
+ return {
3
+ refreshFlag: null,
4
+ isTooManyItemsToAutoUpdate: false,
5
+ manualRefreshIsLoading: false,
6
+ };
7
+ };
8
+
9
+ export const getters = {
10
+ isTooManyItemsToAutoUpdate: state => state.isTooManyItemsToAutoUpdate,
11
+ refreshFlag: state => state.refreshFlag,
12
+ manualRefreshIsLoading: state => state.manualRefreshIsLoading
13
+ };
14
+
15
+ export const mutations = {
16
+ updateIsTooManyItems(state, data) {
17
+ state.isTooManyItemsToAutoUpdate = data;
18
+ },
19
+ updateRefreshFlag(state, data) {
20
+ state.refreshFlag = data;
21
+ },
22
+ updateManualRefreshIsLoading(state, data) {
23
+ state.manualRefreshIsLoading = data;
24
+ },
25
+ };
26
+
27
+ export const actions = {
28
+ clearData({ commit, state }) {
29
+ commit('updateIsTooManyItems', false);
30
+ commit('updateRefreshFlag', null);
31
+ },
32
+ updateIsTooManyItems({ commit }, data) {
33
+ commit('updateIsTooManyItems', data);
34
+ },
35
+ updateManualRefreshIsLoading({ commit }, data) {
36
+ commit('updateManualRefreshIsLoading', data);
37
+ },
38
+ doManualRefresh({ commit, dispatch, state }) {
39
+ // simple change to trigger request on the resource-fetch mixin....
40
+ const finalData = new Date().getTime();
41
+
42
+ commit('updateRefreshFlag', finalData);
43
+ },
44
+ };
package/store/type-map.js CHANGED
@@ -37,6 +37,7 @@
37
37
  // ifHaveType, -- Show this product only if the given type exists in the store [inStore], This can also be specified as an object { type: TYPE, store: 'management' } if the type isn't in the current [inStore]
38
38
  // ifHaveVerb, -- In combination with ifHaveTYpe, show it only if the type also has this collectionMethod
39
39
  // inStore, -- Which store to look at for if* above and the left-nav, defaults to "cluster"
40
+ // inExplorer, -- Determines if the product is to be scoped to the explorer
40
41
  // public, -- If true, show to all users. If false, only show when the Developer Tools pref is on (default true)
41
42
  // category, -- Group to show the product in for the nav hamburger menu
42
43
  // typeStoreMap, -- An object mapping types to the store that should be used to retrieve information about the type
@@ -99,6 +100,8 @@
99
100
  // depaginate: undefined -- Use this to depaginate requests for this type
100
101
  // resourceEditMasthead: true -- Show the Masthead in the edit resource component
101
102
  // customRoute: undefined,
103
+ // hasGraph: undefined -- If true, render ForceDirectedTreeChart graph (ATTENTION: option graphConfig is needed also!!!)
104
+ // graphConfig: undefined -- Use this to pass along the graph configuration
102
105
  // }
103
106
  // )
104
107
  // ignoreGroup(group): Never show group or any types in it
@@ -127,7 +130,7 @@ import {
127
130
  ensureRegex, escapeHtml, escapeRegex, ucFirst, pluralize
128
131
  } from '@shell/utils/string';
129
132
  import {
130
- importList, importDetail, importEdit, listProducts, loadProduct, importCustomPromptRemove, resolveList, resolveEdit, resolveDetail, resolveWindowComponent, importWindowComponent
133
+ importList, importDetail, importEdit, listProducts, loadProduct, importCustomPromptRemove, resolveList, resolveEdit, resolveWindowComponent, importWindowComponent, resolveDetail
131
134
 
132
135
  } from '@shell/utils/dynamic-importer';
133
136
 
@@ -153,6 +156,7 @@ export const SPOOFED_PREFIX = '__[[spoofed]]__';
153
156
  export const SPOOFED_API_PREFIX = '__[[spoofedapi]]__';
154
157
 
155
158
  const instanceMethods = {};
159
+ const graphConfigMap = {};
156
160
 
157
161
  const FIELD_REGEX = /^\$\.metadata\.fields\[([0-9]*)\]/;
158
162
 
@@ -176,6 +180,7 @@ export function DSL(store, product, module = 'type-map') {
176
180
  name: product,
177
181
  weight: 1,
178
182
  inStore: 'cluster',
183
+ inExplorer: false,
179
184
  removable: true,
180
185
  showClusterSwitcher: true,
181
186
  showNamespaceFilter: false,
@@ -227,6 +232,10 @@ export function DSL(store, product, module = 'type-map') {
227
232
  },
228
233
 
229
234
  configureType(match, options) {
235
+ if (options.graphConfig) {
236
+ graphConfigMap[match] = options.graphConfig;
237
+ delete options.graphConfig;
238
+ }
230
239
  store.commit(`${ module }/configureType`, { ...options, match });
231
240
  },
232
241
 
@@ -367,12 +376,12 @@ export const getters = {
367
376
  // ----------------------------------------------------------------------------
368
377
  // Turns a type name into a display label (e.g. management.cattle.io.cluster -> Cluster)
369
378
  labelFor(state, getters, rootState, rootGetters) {
370
- return (schema, count = 1) => {
379
+ return (schema, count = 1, language = null) => {
371
380
  return _applyMapping(schema, state.typeMappings, 'id', false, () => {
372
381
  const key = `typeLabel."${ schema.id.toLowerCase() }"`;
373
382
 
374
- if ( rootGetters['i18n/exists'](key) ) {
375
- return rootGetters['i18n/t'](key, { count }).trim();
383
+ if ( rootGetters['i18n/exists'](key, language) ) {
384
+ return rootGetters['i18n/t'](key, { count }, language).trim();
376
385
  }
377
386
 
378
387
  const out = schema?.attributes?.kind || schema.id || '?';
@@ -532,6 +541,10 @@ export const getters = {
532
541
  // get added before children
533
542
  const keys = Object.keys(allTypes).sort((a, b) => a.length - b.length);
534
543
 
544
+ // Set these for later
545
+ const currentLocal = rootGetters['i18n/current']();
546
+ const defaultLocal = rootGetters['i18n/default']();
547
+
535
548
  for ( const type of keys ) {
536
549
  const typeObj = allTypes[type];
537
550
 
@@ -573,7 +586,7 @@ export const getters = {
573
586
  }
574
587
  }
575
588
 
576
- const labelDisplay = highlightLabel(label, icon);
589
+ const labelDisplay = highlightLabel(label, icon, typeObj.count, typeObj.schema);
577
590
 
578
591
  if ( !labelDisplay ) {
579
592
  // Search happens in highlight and returns null if not found
@@ -680,11 +693,22 @@ export const getters = {
680
693
  return group;
681
694
  }
682
695
 
683
- function highlightLabel(original, icon) {
696
+ function highlightLabel(original, icon, count, schema) {
684
697
  let label = escapeHtml(original);
685
698
 
686
699
  if ( searchRegex ) {
687
- const match = label.match(searchRegex);
700
+ let match = label.match(searchRegex);
701
+
702
+ if (!match) {
703
+ if ( currentLocal !== defaultLocal && schema ) {
704
+ const defaultLabel = getters.labelFor(schema, count, defaultLocal);
705
+
706
+ if (defaultLabel && defaultLabel !== label ) {
707
+ label += ` (${ defaultLabel })`;
708
+ match = label.match(searchRegex);
709
+ }
710
+ }
711
+ }
688
712
 
689
713
  if ( match ) {
690
714
  label = `${ escapeHtml(match[1]) }<span class="highlight">${ escapeHtml(match[2]) }</span>${ escapeHtml(match[3]) }`;
@@ -1040,6 +1064,18 @@ export const getters = {
1040
1064
  };
1041
1065
  },
1042
1066
 
1067
+ hasGraph(state, getters) {
1068
+ return (resource) => {
1069
+ const typeOptions = getters['optionsFor'](resource);
1070
+
1071
+ if (typeOptions && typeOptions.hasGraph) {
1072
+ return graphConfigMap[resource];
1073
+ }
1074
+
1075
+ return null;
1076
+ };
1077
+ },
1078
+
1043
1079
  hasCustomEdit(state, getters, rootState) {
1044
1080
  return (rawType, subType) => {
1045
1081
  const key = getters.componentFor(rawType, subType);
@@ -4,7 +4,7 @@
4
4
  // import { addObject, removeObject } from '@shell/utils/array';
5
5
 
6
6
  import { allHash } from '@shell/utils/promise';
7
- import { Plugin } from '~/shell/core/plugin';
7
+ import { Plugin } from '@shell/core/plugin';
8
8
 
9
9
  interface UIPluginState {
10
10
  plugins: Plugin[],