@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.
- package/assets/styles/base/_basic.scss +0 -1
- package/assets/styles/base/_variables.scss +2 -0
- package/assets/styles/global/_labeled-input.scss +6 -1
- package/assets/styles/global/_select.scss +9 -0
- package/assets/styles/vendor/vue-js-modal.scss +4 -0
- package/assets/translations/en-us.yaml +240 -16
- package/assets/translations/zh-hans.yaml +335 -111
- package/chart/example.vue +1 -1
- package/chart/istio.vue +2 -2
- package/chart/logging/index.vue +2 -2
- package/chart/monitoring/alerting/index.vue +2 -2
- package/chart/monitoring/grafana/index.vue +2 -2
- package/chart/monitoring/index.vue +2 -2
- package/chart/monitoring/prometheus/index.vue +4 -4
- package/chart/rancher-alerting-drivers.vue +17 -3
- package/chart/rancher-backup/S3.vue +37 -4
- package/chart/rancher-backup/index.vue +3 -3
- package/cloud-credential/aws.vue +1 -1
- package/cloud-credential/azure.vue +1 -1
- package/cloud-credential/digitalocean.vue +1 -1
- package/cloud-credential/gcp.vue +1 -1
- package/cloud-credential/generic.vue +1 -1
- package/cloud-credential/harvester.vue +2 -2
- package/cloud-credential/linode.vue +1 -1
- package/cloud-credential/s3.vue +2 -2
- package/cloud-credential/vmwarevsphere.vue +1 -1
- package/components/ActionMenu.vue +11 -1
- package/components/Alert.vue +1 -1
- package/components/AssignTo.vue +2 -2
- package/components/AsyncButton.vue +25 -12
- package/components/AwsComplianceBanner.vue +44 -0
- package/components/BannerGraphic.vue +11 -2
- package/components/ChartReadme.vue +10 -2
- package/components/CompoundStatusBadge.vue +50 -0
- package/components/CopyToClipboardText.vue +25 -4
- package/components/CruResource.vue +185 -16
- package/components/CruResourceFooter.vue +17 -1
- package/components/EtcdInfoBanner.vue +1 -1
- package/components/FilterLabel.vue +254 -0
- package/components/GlobalRoleBindings.vue +2 -2
- package/components/GrafanaDashboard.vue +1 -1
- package/components/GrowlManager.vue +20 -9
- package/components/HarvesterServiceAddOnConfig.vue +2 -2
- package/components/Import.vue +2 -2
- package/components/LandingPagePreference.vue +2 -2
- package/components/Markdown.vue +44 -12
- package/components/ModalWithCard.vue +2 -2
- package/components/MoveModal.vue +1 -1
- package/components/PercentageBar.vue +1 -1
- package/components/PromptChangePassword.vue +1 -1
- package/components/PromptModal.vue +13 -2
- package/components/PromptRemove.vue +64 -33
- package/components/PromptRestore.vue +3 -3
- package/components/Questions/Boolean.vue +1 -1
- package/components/Questions/Float.vue +1 -1
- package/components/Questions/Int.vue +1 -1
- package/components/Questions/Reference.vue +1 -1
- package/components/Questions/String.vue +1 -1
- package/components/RelatedResources.vue +1 -1
- package/components/RelatedWorkloadsTable.vue +3 -1
- package/components/ResourceDetail/Masthead.vue +27 -9
- package/components/ResourceDetail/index.vue +72 -7
- package/components/ResourceList/Masthead.vue +22 -0
- package/components/ResourceList/ResourceLoadingIndicator.vue +137 -0
- package/components/ResourceList/index.vue +42 -7
- package/components/ResourceTable.vue +11 -2
- package/components/ResourceYaml.vue +7 -1
- package/components/SelectIconGrid.vue +14 -1
- package/components/SortableTable/THead.vue +1 -1
- package/components/SortableTable/debug.js +117 -0
- package/components/SortableTable/index.vue +200 -43
- package/components/SortableTable/paging.js +2 -12
- package/components/SortableTable/selection.js +3 -0
- package/components/SortableTable/sorting.js +3 -1
- package/components/Tabbed/Tab.vue +25 -4
- package/components/Tabbed/index.vue +133 -119
- package/components/TypeDescription.vue +1 -1
- package/components/VMConsoleBar.vue +1 -1
- package/components/Wizard.vue +53 -14
- package/components/YamlEditor.vue +10 -0
- package/components/__tests__/CopyCode.test.ts +1 -7
- package/components/__tests__/CruResource.test.ts +1 -8
- package/components/auth/AllowedPrincipals.vue +1 -1
- package/components/auth/AuthBanner.vue +2 -1
- package/components/auth/AzureWarning.vue +69 -0
- package/components/auth/RoleDetailEdit.vue +4 -4
- package/components/auth/login/ldap.vue +1 -1
- package/components/cards/ApplicationCard.vue +140 -0
- package/components/dialog/AddClusterMemberDialog.vue +1 -1
- package/components/dialog/AddCustomBadgeDialog.vue +4 -4
- package/components/dialog/AddProjectMemberDialog.vue +2 -2
- package/components/dialog/AddonConfigConfirmationDialog.vue +1 -1
- package/components/dialog/DrainNode.vue +3 -3
- package/components/dialog/ForceMachineRemoveDialog.vue +2 -2
- package/components/dialog/GenericPrompt.vue +2 -2
- package/components/dialog/RollbackWorkloadDialog.vue +2 -2
- package/components/dialog/RotateCertificatesDialog.vue +3 -3
- package/components/dialog/RotateEncryptionKeyDialog.vue +11 -6
- package/components/dialog/SaveAsRKETemplateDialog.vue +3 -3
- package/components/dialog/harvester/AddHotplugModal.vue +3 -3
- package/components/dialog/harvester/BackupModal.vue +3 -3
- package/components/dialog/harvester/CloneTemplate.vue +3 -3
- package/components/dialog/harvester/EjectCDROMDialog.vue +3 -3
- package/components/dialog/harvester/ExportImageDialog.vue +3 -3
- package/components/dialog/harvester/MaintenanceDialog.vue +2 -2
- package/components/dialog/harvester/MigrationDialog.vue +2 -2
- package/components/dialog/harvester/RestoreDialog.vue +2 -2
- package/components/dialog/harvester/SupportBundle.vue +2 -2
- package/components/dialog/harvester/UnplugVolume.vue +2 -2
- package/components/fleet/FleetBundleResources.vue +1 -1
- package/components/fleet/FleetBundles.vue +1 -1
- package/components/fleet/FleetResources.vue +5 -3
- package/components/fleet/ForceDirectedTreeChart/chartIcons.js +17 -0
- package/components/fleet/ForceDirectedTreeChart/index.vue +553 -0
- package/components/form/ArrayList.vue +22 -3
- package/components/form/BannerSettings.vue +3 -3
- package/components/form/ChangePassword.vue +2 -2
- package/components/form/Command.vue +28 -9
- package/components/form/Error.vue +50 -0
- package/components/form/Footer.vue +2 -5
- package/components/form/HealthCheck.vue +2 -2
- package/components/form/HookOption.vue +2 -2
- package/components/form/InputWithSelect.vue +12 -2
- package/components/form/KeyValue.vue +5 -2
- package/components/form/LabeledSelect.vue +27 -14
- package/components/form/Labels.vue +12 -0
- package/components/form/MatchExpressions.vue +44 -10
- package/components/form/Members/ClusterPermissionsEditor.vue +3 -3
- package/components/form/Members/MembershipEditor.vue +10 -1
- package/components/form/Members/ProjectMembershipEditor.vue +1 -0
- package/components/form/NameNsDescription.vue +202 -79
- package/components/form/Networking.vue +1 -1
- package/components/form/NodeAffinity.vue +41 -26
- package/components/form/NodeScheduling.vue +29 -3
- package/components/form/NotificationSettings.vue +2 -2
- package/components/form/Password.vue +1 -1
- package/components/form/PodAffinity.vue +64 -6
- package/components/form/PodSecurity.vue +2 -2
- package/components/form/Ports.vue +1 -1
- package/components/form/Probe.vue +60 -17
- package/components/form/ProjectMemberEditor.vue +3 -3
- package/components/form/ResourceQuota/NamespaceRow.vue +46 -2
- package/components/form/ResourceQuota/Project.vue +4 -0
- package/components/form/ResourceTabs/index.vue +19 -7
- package/components/form/RuleSelector.vue +1 -1
- package/components/form/Security.vue +56 -14
- package/components/form/Select.vue +52 -10
- package/components/form/SelectOrCreateAuthSecret.vue +70 -31
- package/components/form/ServiceNameSelect.vue +1 -1
- package/components/form/ServicePorts.vue +10 -2
- package/components/form/ShellInput.vue +1 -1
- package/components/form/SimpleSecretSelector.vue +2 -2
- package/components/form/Tolerations.vue +1 -1
- package/components/form/UnitInput.vue +12 -3
- package/components/form/ValueFromResource.vue +1 -1
- package/components/form/WorkloadPorts.vue +1 -1
- package/components/form/__tests__/Command.test.ts +63 -0
- package/components/form/__tests__/Error.test.ts +56 -0
- package/components/form/__tests__/MatchExpressions.test.ts +79 -0
- package/components/form/__tests__/Probe.test.ts +62 -0
- package/components/form/__tests__/Security.test.ts +55 -0
- package/components/form/__tests__/UnitInput.test.ts +31 -23
- package/components/formatter/BadgeStateFormatter.vue +1 -1
- package/components/formatter/Capitalize.vue +7 -0
- package/components/formatter/ClusterLink.vue +6 -2
- package/components/formatter/ClusterProvider.vue +36 -0
- package/components/formatter/DelayedValue.vue +43 -0
- package/components/formatter/Endpoints.vue +2 -2
- package/components/formatter/HarvesterDiskState.vue +1 -1
- package/components/formatter/HarvesterIpAddress.vue +37 -18
- package/components/formatter/HarvesterMigrationState.vue +1 -1
- package/components/formatter/HarvesterVmState.vue +1 -1
- package/components/formatter/LinkDetail.vue +11 -2
- package/components/formatter/LinkName.vue +2 -2
- package/components/formatter/LiveExpiryBadgeState.vue +1 -1
- package/components/formatter/LivePodRestarts.vue +47 -0
- package/components/formatter/MachineSummaryGraph.vue +51 -5
- package/components/formatter/PodsUsage.vue +5 -3
- package/components/formatter/Weight.vue +1 -1
- package/components/formatter/WorkloadHealthScale.vue +17 -6
- package/components/nav/HarvesterUpgrade.vue +15 -5
- package/components/nav/Header.vue +15 -6
- package/components/nav/Jump.vue +1 -1
- package/components/nav/NamespaceFilter.vue +30 -10
- package/components/nav/TopLevelMenu.vue +52 -14
- package/components/nav/WindowManager/ContainerLogs.vue +14 -2
- package/components/nav/WorkspaceSwitcher.vue +1 -1
- package/components/{NovncConsole.vue → novnc/NovncConsole.vue} +0 -0
- package/components/novnc/NovncConsoleItem.vue +89 -0
- package/components/novnc/NovncConsoleWrapper.vue +243 -0
- package/config/labels-annotations.js +6 -2
- package/config/product/explorer.js +7 -3
- package/config/product/fleet.js +4 -1
- package/config/product/manager.js +5 -6
- package/config/product/settings.js +12 -1
- package/config/query-params.js +2 -0
- package/config/roles.ts +5 -0
- package/config/settings.js +60 -63
- package/config/table-headers.js +47 -18
- package/config/types.js +24 -8
- package/content/docs/en-us/whats-new.md +25 -0
- package/core/plugin.ts +12 -2
- package/creators/app/init +7 -1
- package/creators/pkg/tsconfig.json +2 -3
- package/detail/catalog.cattle.io.app.vue +1 -1
- package/detail/cis.cattle.io.clusterscan.vue +1 -1
- package/detail/fleet.cattle.io.bundle.vue +73 -21
- package/detail/fleet.cattle.io.gitrepo.vue +5 -4
- package/detail/harvesterhci.io.host/HarvesterHostBasic.vue +25 -4
- package/detail/harvesterhci.io.host/HarvesterHostDisk.vue +2 -2
- package/detail/harvesterhci.io.virtualmachinebackup/index.vue +1 -1
- package/detail/helm.cattle.io.projecthelmchart.vue +1 -1
- package/detail/networking.k8s.io.ingress.vue +10 -2
- package/detail/pod.vue +37 -1
- package/detail/provisioning.cattle.io.cluster.vue +102 -15
- package/detail/workload/index.vue +163 -15
- package/edit/auth/azuread.vue +146 -34
- package/edit/auth/github.vue +3 -3
- package/edit/auth/googleoauth.vue +3 -3
- package/edit/auth/ldap/config.vue +15 -7
- package/edit/auth/ldap/index.vue +2 -2
- package/edit/auth/oidc.vue +3 -3
- package/edit/auth/saml.vue +3 -3
- package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -1
- package/edit/autoscaling.horizontalpodautoscaler/metric-identifier.vue +1 -1
- package/edit/autoscaling.horizontalpodautoscaler/metric-object-reference.vue +1 -1
- package/edit/autoscaling.horizontalpodautoscaler/metric-target.vue +1 -1
- package/edit/autoscaling.horizontalpodautoscaler/metrics-row.vue +1 -1
- package/edit/catalog.cattle.io.clusterrepo.vue +2 -2
- package/edit/cis.cattle.io.clusterscan.vue +4 -4
- package/edit/cis.cattle.io.clusterscanbenchmark.vue +1 -1
- package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -1
- package/edit/fleet.cattle.io.cluster.vue +1 -0
- package/edit/fleet.cattle.io.clustergroup.vue +1 -1
- package/edit/fleet.cattle.io.gitrepo.vue +290 -157
- package/edit/harvesterhci.io.host/HarvesterDisk.vue +4 -5
- package/edit/harvesterhci.io.host/index.vue +28 -19
- package/edit/harvesterhci.io.keypair.vue +1 -1
- package/edit/harvesterhci.io.managedchart/rancher-monitoring.vue +1 -1
- package/edit/harvesterhci.io.management.cluster.vue +1 -1
- package/edit/harvesterhci.io.networkattachmentdefinition.vue +2 -2
- package/edit/harvesterhci.io.setting/additional-ca.vue +1 -1
- package/edit/harvesterhci.io.setting/backup-target.vue +1 -1
- package/edit/harvesterhci.io.setting/http-proxy.vue +1 -1
- package/edit/harvesterhci.io.setting/index.vue +3 -3
- package/edit/harvesterhci.io.setting/overcommit-config.vue +4 -1
- package/edit/harvesterhci.io.setting/ssl-parameters.vue +1 -1
- package/edit/harvesterhci.io.setting/support-bundle-image.vue +1 -1
- package/edit/harvesterhci.io.setting/vip-pools.vue +1 -1
- package/edit/harvesterhci.io.setting/vm-force-reset-policy.vue +2 -2
- package/edit/harvesterhci.io.virtualmachinebackup.vue +2 -2
- package/edit/harvesterhci.io.virtualmachineimage.vue +2 -2
- package/edit/harvesterhci.io.virtualmachinetemplateversion.vue +26 -18
- package/edit/helm.cattle.io.projecthelmchart.vue +3 -3
- package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +2 -2
- package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/AccessCredentialsUsers.vue +1 -1
- package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/index.vue +1 -1
- package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/DataTemplate.vue +1 -0
- package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/index.vue +2 -1
- package/edit/kubevirt.io.virtualmachine/VirtualMachineCpuMemory.vue +3 -1
- package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/__tests__/HarvesterEditNetwork.test.ts +41 -0
- package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue +79 -36
- package/edit/kubevirt.io.virtualmachine/VirtualMachineReserved.vue +54 -0
- package/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue +1 -1
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue +2 -3
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditContainer.test.ts +40 -0
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditExisting.test.ts +102 -0
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVMImage.test.ts +117 -0
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVolume.test.ts +74 -0
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/container.vue +59 -13
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue +72 -16
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/vmImage.vue +74 -14
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue +35 -9
- package/edit/kubevirt.io.virtualmachine/index.vue +33 -24
- package/edit/logging-flow/index.vue +1 -1
- package/edit/logging.banzaicloud.io.output/index.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/awsElasticsearch.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/azurestorage.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/cloudwatch.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/datadog.vue +2 -2
- package/edit/logging.banzaicloud.io.output/providers/elasticsearch.vue +2 -2
- package/edit/logging.banzaicloud.io.output/providers/file.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/forward.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/gcs.vue +2 -2
- package/edit/logging.banzaicloud.io.output/providers/gelf.vue +2 -2
- package/edit/logging.banzaicloud.io.output/providers/kafka.vue +2 -2
- package/edit/logging.banzaicloud.io.output/providers/kinesisStream.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/logdna.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/logz.vue +2 -2
- package/edit/logging.banzaicloud.io.output/providers/loki.vue +2 -2
- package/edit/logging.banzaicloud.io.output/providers/newrelic.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/s3.vue +2 -2
- package/edit/logging.banzaicloud.io.output/providers/splunkHec.vue +2 -2
- package/edit/logging.banzaicloud.io.output/providers/sumologic.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/syslog.vue +2 -2
- package/edit/management.cattle.io.clusterroletemplatebinding.vue +2 -0
- package/edit/management.cattle.io.node.vue +71 -0
- package/edit/management.cattle.io.project.vue +28 -23
- package/edit/management.cattle.io.setting.vue +14 -3
- package/edit/management.cattle.io.user.vue +1 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +4 -4
- package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +13 -13
- package/edit/monitoring.coreos.com.alertmanagerconfig/routeConfig.vue +18 -10
- package/edit/monitoring.coreos.com.alertmanagerconfig/tls.vue +2 -2
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +12 -7
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +12 -7
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +20 -11
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +13 -8
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/webhook.vue +25 -7
- package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +2 -2
- package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +20 -7
- package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +1 -1
- package/edit/monitoring.coreos.com.prometheusrule/index.vue +19 -8
- package/edit/monitoring.coreos.com.receiver/auth.vue +1 -1
- package/edit/monitoring.coreos.com.receiver/index.vue +2 -2
- package/edit/monitoring.coreos.com.receiver/tls.vue +2 -2
- package/edit/monitoring.coreos.com.receiver/types/email.vue +2 -2
- package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +2 -2
- package/edit/monitoring.coreos.com.receiver/types/pagerduty.vue +2 -2
- package/edit/monitoring.coreos.com.receiver/types/slack.vue +2 -2
- package/edit/monitoring.coreos.com.receiver/types/webhook.banner.vue +1 -1
- package/edit/monitoring.coreos.com.receiver/types/webhook.vue +3 -3
- package/edit/monitoring.coreos.com.route.vue +2 -2
- package/edit/namespace.vue +0 -8
- package/edit/network.harvesterhci.io.clusternetwork/vlan.vue +1 -1
- package/edit/networking.istio.io.destinationrule/LoadBalancer.vue +2 -2
- package/edit/networking.istio.io.destinationrule/index.vue +1 -1
- package/edit/networking.k8s.io.ingress/Certificate.vue +5 -1
- package/edit/networking.k8s.io.ingress/Certificates.vue +5 -0
- package/edit/networking.k8s.io.ingress/DefaultBackend.vue +17 -2
- package/edit/networking.k8s.io.ingress/IngressClass.vue +63 -0
- package/edit/networking.k8s.io.ingress/Rule.vue +42 -6
- package/edit/networking.k8s.io.ingress/RulePath.vue +29 -5
- package/edit/networking.k8s.io.ingress/Rules.vue +11 -0
- package/edit/networking.k8s.io.ingress/index.vue +104 -15
- package/edit/networking.k8s.io.networkpolicy/PolicyRulePort.vue +1 -1
- package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +2 -2
- package/edit/networking.k8s.io.networkpolicy/index.vue +2 -2
- package/edit/persistentvolume/index.vue +1 -1
- package/edit/persistentvolume/plugins/awsElasticBlockStore.vue +2 -2
- package/edit/persistentvolume/plugins/azureDisk.vue +2 -2
- package/edit/persistentvolume/plugins/azureFile.vue +2 -2
- package/edit/persistentvolume/plugins/cephfs.vue +4 -4
- package/edit/persistentvolume/plugins/cinder.vue +2 -2
- package/edit/persistentvolume/plugins/csi.vue +2 -2
- package/edit/persistentvolume/plugins/fc.vue +4 -4
- package/edit/persistentvolume/plugins/flexVolume.vue +2 -2
- package/edit/persistentvolume/plugins/flocker.vue +1 -1
- package/edit/persistentvolume/plugins/gcePersistentDisk.vue +2 -2
- package/edit/persistentvolume/plugins/glusterfs.vue +2 -2
- package/edit/persistentvolume/plugins/hostPath.vue +1 -1
- package/edit/persistentvolume/plugins/iscsi.vue +4 -4
- package/edit/persistentvolume/plugins/local.vue +1 -1
- package/edit/persistentvolume/plugins/longhorn.vue +2 -2
- package/edit/persistentvolume/plugins/nfs.vue +2 -2
- package/edit/persistentvolume/plugins/photonPersistentDisk.vue +1 -1
- package/edit/persistentvolume/plugins/portworxVolume.vue +2 -2
- package/edit/persistentvolume/plugins/quobyte.vue +2 -2
- package/edit/persistentvolume/plugins/rbd.vue +4 -4
- package/edit/persistentvolume/plugins/scaleIO.vue +2 -2
- package/edit/persistentvolume/plugins/storageos.vue +2 -2
- package/edit/persistentvolume/plugins/vsphereVolume.vue +1 -1
- package/edit/persistentvolumeclaim.vue +24 -8
- package/edit/provisioning.cattle.io.cluster/ACE.vue +2 -2
- package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +8 -3
- package/edit/provisioning.cattle.io.cluster/DrainOptions.vue +2 -2
- package/edit/provisioning.cattle.io.cluster/MachinePool.vue +15 -3
- package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +16 -3
- package/edit/provisioning.cattle.io.cluster/S3Config.vue +2 -2
- package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +1 -1
- package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.tests.ts +1 -7
- package/edit/provisioning.cattle.io.cluster/import.vue +2 -1
- package/edit/provisioning.cattle.io.cluster/index.vue +26 -7
- package/edit/provisioning.cattle.io.cluster/rke2.vue +136 -48
- package/edit/resources.cattle.io.backup.vue +26 -8
- package/edit/resources.cattle.io.restore.vue +3 -3
- package/edit/secret/basic.vue +1 -1
- package/edit/secret/index.vue +80 -2
- package/edit/secret/registry.vue +2 -2
- package/edit/secret/ssh.vue +1 -1
- package/edit/secret/tls.vue +1 -1
- package/edit/service.vue +47 -11
- package/edit/serviceaccount.vue +1 -1
- package/edit/storage.k8s.io.storageclass/index.vue +1 -1
- package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/aws-ebs.vue +7 -3
- package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/azure-disk.vue +1 -1
- package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/azure-file.vue +1 -1
- package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/cinder.vue +2 -2
- package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/gce-pd.vue +2 -2
- package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/glusterfs.vue +1 -1
- package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/portworx-volume.vue +1 -1
- package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/quobyte.vue +1 -1
- package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/rbd.vue +1 -1
- package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/scaleio.vue +1 -1
- package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/storageos.vue +1 -1
- package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/vsphere-volume.vue +1 -1
- package/edit/token.vue +3 -3
- package/edit/ui.cattle.io.navlink.vue +2 -2
- package/edit/workload/Job.vue +111 -23
- package/edit/workload/Upgrading.vue +77 -22
- package/edit/workload/__tests__/Job.test.ts +72 -0
- package/edit/workload/__tests__/Upgrading.test.ts +60 -0
- package/edit/workload/index.vue +13 -1085
- package/edit/workload/mixins/workload.js +900 -0
- package/edit/workload/storage/Mount.vue +2 -2
- package/edit/workload/storage/awsElasticBlockStore.vue +1 -1
- package/edit/workload/storage/azureDisk.vue +2 -2
- package/edit/workload/storage/azureFile.vue +1 -1
- package/edit/workload/storage/ephemeralVolume/index.vue +2 -2
- package/edit/workload/storage/gcePersistentDisk.vue +1 -1
- package/edit/workload/storage/hostPath.vue +1 -1
- package/edit/workload/storage/nfs.vue +2 -2
- package/edit/workload/storage/persistentVolumeClaim/index.vue +2 -2
- package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +3 -3
- package/edit/workload/storage/secret.vue +2 -2
- package/edit/workload/storage/vsphereVolume.vue +1 -1
- package/edit/workload/types/Deployment.vue +377 -0
- package/edit/workload/types/Generic.vue +295 -0
- package/layouts/default.vue +26 -7
- package/layouts/error.vue +3 -2
- package/layouts/home.vue +12 -2
- package/layouts/plain.vue +18 -2
- package/layouts/unauthenticated.vue +2 -1
- package/list/catalog.cattle.io.clusterrepo.vue +1 -1
- package/list/fleet.cattle.io.bundle.vue +1 -1
- package/list/fleet.cattle.io.cluster.vue +1 -1
- package/list/fleet.cattle.io.clusterregistrationtoken.vue +1 -1
- package/list/harvesterhci.io.dashboard/HarvesterUpgrade.vue +9 -8
- package/list/harvesterhci.io.dashboard/UpgradeInfo.vue +40 -0
- package/list/harvesterhci.io.dashboard/index.vue +14 -36
- package/list/harvesterhci.io.host/index.vue +24 -12
- package/list/harvesterhci.io.networkattachmentdefinition.vue +1 -1
- package/list/harvesterhci.io.setting.vue +1 -1
- package/list/harvesterhci.io.virtualmachinebackup.vue +1 -1
- package/list/harvesterhci.io.virtualmachineimage.vue +36 -3
- package/list/harvesterhci.io.virtualmachinetemplateversion.vue +1 -5
- package/list/helm.cattle.io.projecthelmchart.vue +1 -1
- package/list/kubevirt.io.virtualmachine.vue +4 -2
- package/list/management.cattle.io.feature.vue +3 -3
- package/list/management.cattle.io.setting.vue +2 -2
- package/list/monitoring.coreos.com.alertmanagerconfig.vue +1 -1
- package/list/namespace.vue +3 -1
- package/list/node.vue +10 -3
- package/list/persistentvolumeclaim.vue +42 -0
- package/list/provisioning.cattle.io.cluster.vue +22 -20
- package/list/workload.vue +31 -6
- package/machine-config/amazonec2.vue +37 -12
- package/machine-config/azure.vue +3 -3
- package/machine-config/digitalocean.vue +2 -2
- package/machine-config/generic.vue +1 -1
- package/machine-config/harvester.vue +124 -25
- package/machine-config/linode.vue +2 -2
- package/machine-config/vmwarevsphere.vue +5 -5
- package/middleware/authenticated.js +36 -6
- package/middleware/unauthenticated.js +22 -0
- package/mixins/brand.js +50 -3
- package/mixins/browser-tab-visibility.js +37 -0
- package/mixins/chart.js +36 -4
- package/mixins/{compact-input.js → compact-input.ts} +5 -3
- package/mixins/form-validation.js +122 -0
- package/mixins/harvester-vm/index.js +134 -90
- package/mixins/labeled-form-element.ts +193 -0
- package/mixins/resource-fetch.js +173 -0
- package/models/cluster.x-k8s.io.machine.js +6 -2
- package/models/etcdbackup.js +4 -0
- package/models/event.js +4 -0
- package/models/fleet.cattle.io.bundle.js +1 -1
- package/models/fleet.cattle.io.gitrepo.js +10 -0
- package/models/harvester/harvesterhci.io.virtualmachinebackup.js +5 -2
- package/models/harvester/harvesterhci.io.virtualmachineimage.js +11 -8
- package/models/harvester/harvesterhci.io.virtualmachinetemplateversion.js +11 -2
- package/models/harvester/kubevirt.io.virtualmachine.js +2 -2
- package/models/harvester/kubevirt.io.virtualmachineinstance.js +1 -1
- package/models/harvester/node.js +27 -32
- package/models/harvester/persistentvolumeclaim.js +1 -1
- package/models/management.cattle.io.cluster.js +17 -11
- package/models/management.cattle.io.clusterroletemplatebinding.js +2 -2
- package/models/management.cattle.io.globalrole.js +19 -0
- package/models/management.cattle.io.node.js +10 -11
- package/models/management.cattle.io.project.js +60 -26
- package/models/management.cattle.io.roletemplate.js +19 -0
- package/models/monitoring.coreos.com.alertmanagerconfig.js +3 -2
- package/models/monitoring.coreos.com.prometheusrule.js +9 -0
- package/models/namespace.js +9 -1
- package/models/networking.k8s.io.ingress.js +17 -5
- package/models/persistentvolumeclaim.js +47 -1
- package/models/projectroletemplatebinding.js +2 -2
- package/models/provisioning.cattle.io.cluster.js +92 -13
- package/models/rke.cattle.io.etcdsnapshot.js +4 -0
- package/models/service.js +11 -5
- package/models/storage.k8s.io.storageclass.js +14 -1
- package/models/workload.js +7 -2
- package/nuxt.config.js +27 -7
- package/package.json +10 -14
- package/pages/about.vue +15 -1
- package/pages/account/index.vue +1 -1
- package/pages/auth/login.vue +17 -5
- package/pages/auth/setup.vue +47 -9
- package/pages/c/_cluster/_product/_resource/create.vue +1 -1
- package/pages/c/_cluster/_product/members/index.vue +6 -1
- package/pages/c/_cluster/_product/projectsnamespaces.vue +113 -11
- package/pages/c/_cluster/apps/charts/chart.vue +1 -1
- package/pages/c/_cluster/apps/charts/index.vue +2 -2
- package/pages/c/_cluster/apps/charts/install.vue +197 -19
- package/pages/c/_cluster/auth/config/index.vue +1 -1
- package/pages/c/_cluster/explorer/EventsTable.vue +1 -15
- package/pages/c/_cluster/explorer/index.vue +64 -35
- package/pages/c/_cluster/explorer/tools/index.vue +1 -1
- package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +249 -0
- package/pages/c/_cluster/fleet/index.vue +47 -65
- package/pages/c/_cluster/harvester/airgapupgrade/index.vue +7 -4
- package/pages/c/_cluster/harvester/console/_uid/vnc.vue +7 -1
- package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +8 -14
- package/pages/c/_cluster/monitoring/index.vue +1 -1
- package/pages/c/_cluster/monitoring/route-receiver/index.vue +1 -1
- package/pages/c/_cluster/settings/banners.vue +2 -2
- package/pages/c/_cluster/settings/brand.vue +62 -7
- package/pages/c/_cluster/settings/performance.vue +167 -0
- package/pages/diagnostic.vue +468 -0
- package/pages/fail-whale.vue +17 -5
- package/pages/home.vue +36 -22
- package/pages/plugins.vue +1 -1
- package/pages/prefs.vue +20 -7
- package/pages/support/index.vue +51 -9
- package/pkg/auto-import.js +1 -1
- package/pkg/dynamic-importer.lib.js +8 -0
- package/pkg/tsconfig.json +26 -9
- package/pkg/vue.config.js +8 -0
- package/plugins/console.js +29 -0
- package/plugins/dashboard-store/actions.js +171 -28
- package/plugins/dashboard-store/getters.js +13 -1
- package/plugins/dashboard-store/index.js +5 -1
- package/plugins/dashboard-store/mutations.js +72 -22
- package/plugins/dashboard-store/resource-class.js +259 -184
- package/plugins/i18n.js +9 -3
- package/plugins/steve/actions.js +16 -1
- package/plugins/steve/getters.js +9 -1
- package/plugins/steve/index.js +6 -2
- package/plugins/steve/mutations.js +100 -5
- package/plugins/steve/norman-class.js +8 -0
- package/plugins/steve/performanceTesting.js +5 -0
- package/plugins/steve/subscribe.js +144 -12
- package/plugins/steve/web-worker.steve-sub-worker.js +129 -0
- package/promptRemove/kubevirt.io.virtualmachine.vue +3 -17
- package/promptRemove/management.cattle.io.project.vue +128 -0
- package/promptRemove/pod.vue +131 -0
- package/rancher-components/BadgeState/BadgeState.spec.ts +12 -0
- package/{components → rancher-components/BadgeState}/BadgeState.vue +18 -10
- package/rancher-components/BadgeState/index.ts +1 -0
- package/{components/__tests__ → rancher-components/Banner}/Banner.test.ts +1 -1
- package/{components → rancher-components/Banner}/Banner.vue +22 -7
- package/rancher-components/Banner/index.ts +1 -0
- package/{components → rancher-components/Card}/Card.vue +58 -12
- package/rancher-components/Card/index.ts +1 -0
- package/{components/form → rancher-components/Form/Checkbox}/Checkbox.vue +118 -25
- package/rancher-components/Form/Checkbox/index.ts +1 -0
- package/{components/form/__tests__ → rancher-components/Form/LabeledInput}/LabeledInput.test.ts +13 -2
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +341 -0
- package/rancher-components/Form/LabeledInput/index.ts +1 -0
- package/{components/form → rancher-components/Form/Radio}/RadioButton.vue +50 -22
- package/{components/form → rancher-components/Form/Radio}/RadioGroup.vue +76 -28
- package/rancher-components/Form/Radio/index.ts +2 -0
- package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +169 -0
- package/rancher-components/Form/TextArea/index.ts +1 -0
- package/rancher-components/Form/index.ts +4 -0
- package/{components/form → rancher-components/LabeledTooltip}/LabeledTooltip.vue +32 -11
- package/rancher-components/LabeledTooltip/index.ts +1 -0
- package/scripts/build-pkg.sh +4 -0
- package/scripts/publish-shell.sh +37 -18
- package/scripts/test-plugins-build.sh +115 -0
- package/store/catalog.js +4 -0
- package/store/growl.js +6 -0
- package/store/i18n.js +18 -9
- package/store/index.js +190 -107
- package/store/prefs.js +8 -2
- package/store/resource-fetch.js +44 -0
- package/store/type-map.js +43 -7
- package/store/uiplugins.ts +1 -1
- package/utils/favicon.js +40 -0
- package/utils/object.js +26 -9
- package/utils/promise.js +20 -0
- package/utils/socket.js +10 -1
- package/utils/string.js +16 -0
- package/utils/validators/formRules/__tests__/index.test.ts +928 -0
- package/utils/validators/formRules/index.ts +447 -0
- package/utils/validators/prometheusrule.js +1 -1
- package/utils/validators/vm.js +12 -5
- package/utils/width.js +39 -0
- package/yarn-error.log +196 -0
- package/components/NovncConsoleWrapper.vue +0 -150
- package/components/form/Container.vue +0 -143
- package/components/form/LabeledInput.vue +0 -245
- package/components/form/Scheduling.vue +0 -115
- package/components/form/TextAreaAutoGrow.vue +0 -127
- 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:
|
|
66
|
-
clusterReady:
|
|
67
|
-
isMultiCluster:
|
|
68
|
-
isRancher:
|
|
69
|
-
namespaceFilters:
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
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
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
const project = getters['management/byId'](MANAGEMENT.PROJECT, `${ clusterId }/${ id }`);
|
|
360
|
+
activeNamespaceCacheKey(state) {
|
|
361
|
+
return state.activeNamespaceCacheKey;
|
|
362
|
+
},
|
|
311
363
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
}
|
|
364
|
+
activeNamespaceFilters(state) {
|
|
365
|
+
return state.namespaceFilters;
|
|
366
|
+
},
|
|
320
367
|
|
|
321
|
-
|
|
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['
|
|
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
|
-
|
|
508
|
+
clusterReady(state, ready) {
|
|
457
509
|
state.clusterReady = ready;
|
|
458
510
|
},
|
|
459
511
|
|
|
460
|
-
updateNamespaces(state,
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
657
|
-
|
|
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('
|
|
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('
|
|
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('
|
|
756
|
+
commit('clusterReady', true);
|
|
690
757
|
|
|
691
758
|
return;
|
|
692
759
|
}
|
|
693
760
|
} else {
|
|
694
|
-
//
|
|
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('
|
|
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('
|
|
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('
|
|
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('
|
|
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('
|
|
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('
|
|
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('
|
|
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('
|
|
971
|
-
commit('
|
|
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
|
|
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,
|
|
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
|
-
|
|
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);
|
package/store/uiplugins.ts
CHANGED