You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by mi...@apache.org on 2023/12/08 14:05:06 UTC
(superset) 08/08: fix(plugin-chart-echarts): support truncated numeric x-axis (#26215)
This is an automated email from the ASF dual-hosted git repository.
michaelsmolina pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/superset.git
commit b0905ce0bd7c46b8bdd8b5c4b820b885bc457a9c
Author: Ville Brofeldt <33...@users.noreply.github.com>
AuthorDate: Fri Dec 8 05:40:09 2023 -0800
fix(plugin-chart-echarts): support truncated numeric x-axis (#26215)
Co-authored-by: Michael S. Molina <mi...@gmail.com>
---
helm/superset/Chart.yaml | 2 +-
helm/superset/README.md | 474 ++++++++++-----------
.../src/MixedTimeseries/transformProps.ts | 6 +-
.../src/Timeseries/Area/controlPanel.tsx | 4 +
.../src/Timeseries/Regular/Bar/controlPanel.tsx | 4 +
.../src/Timeseries/Regular/Line/controlPanel.tsx | 4 +
.../Timeseries/Regular/Scatter/controlPanel.tsx | 4 +
.../Timeseries/Regular/SmoothLine/controlPanel.tsx | 4 +
.../src/Timeseries/Step/controlPanel.tsx | 4 +
.../src/Timeseries/constants.ts | 1 +
.../src/Timeseries/transformProps.ts | 28 +-
.../plugin-chart-echarts/src/Timeseries/types.ts | 2 +
.../plugins/plugin-chart-echarts/src/controls.tsx | 31 ++
.../plugin-chart-echarts/src/utils/controls.ts | 2 +-
.../plugin-chart-echarts/src/utils/series.ts | 14 +
.../test/utils/controls.test.ts | 22 +-
.../plugin-chart-echarts/test/utils/series.test.ts | 28 ++
superset/dashboards/schemas.py | 6 +-
18 files changed, 375 insertions(+), 265 deletions(-)
diff --git a/helm/superset/Chart.yaml b/helm/superset/Chart.yaml
index 23ab47dc6a..d6915090dd 100644
--- a/helm/superset/Chart.yaml
+++ b/helm/superset/Chart.yaml
@@ -15,7 +15,7 @@
# limitations under the License.
#
apiVersion: v2
-appVersion: "3.0.2"
+appVersion: "3.0.3"
description: Apache Superset is a modern, enterprise-ready business intelligence web application
name: superset
icon: https://artifacthub.io/image/68c1d717-0e97-491f-b046-754e46f46922@2x
diff --git a/helm/superset/README.md b/helm/superset/README.md
index 56f2323cd8..333f74d789 100644
--- a/helm/superset/README.md
+++ b/helm/superset/README.md
@@ -31,7 +31,7 @@ Apache Superset is a modern, enterprise-ready business intelligence web applicat
## Source Code
-- <https://github.com/apache/superset>
+* <https://github.com/apache/superset>
## TL;DR
@@ -48,242 +48,242 @@ On helm this can be set on `extraSecretEnv.SUPERSET_SECRET_KEY` or `configOverri
## Requirements
-| Repository | Name | Version |
-| ---------------------------------- | ---------- | ------- |
-| https://charts.bitnami.com/bitnami | postgresql | 12.1.6 |
-| https://charts.bitnami.com/bitnami | redis | 17.9.4 |
+| Repository | Name | Version |
+|------------|------|---------|
+| https://charts.bitnami.com/bitnami | postgresql | 12.1.6 |
+| https://charts.bitnami.com/bitnami | redis | 17.9.4 |
## Values
-| Key | Type | Default | Description |
-| ------------------------------------------------------- | ------ | -------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| affinity | object | `{}` | |
-| bootstrapScript | string | see `values.yaml` | Install additional packages and do any other bootstrap configuration in this script For production clusters it's recommended to build own image with this step done in CI |
-| configFromSecret | string | `"{{ template \"superset.fullname\" . }}-config"` | The name of the secret which we will use to generate a superset_config.py file Note: this secret must have the key superset_config.py in it and can include other files as well |
-| configMountPath | string | `"/app/pythonpath"` | |
-| configOverrides | object | `{}` | A dictionary of overrides to append at the end of superset_config.py - the name does not matter WARNING: the order is not guaranteed Files can be passed as helm --set-file configOverrides.my-override=my-file.py |
-| configOverridesFiles | object | `{}` | Same as above but the values are files |
-| envFromSecret | string | `"{{ template \"superset.fullname\" . }}-env"` | The name of the secret which we will use to populate env vars in deployed pods This can be useful for secret keys, etc. |
-| envFromSecrets | list | `[]` | This can be a list of templated strings |
-| extraConfigMountPath | string | `"/app/configs"` | |
-| extraConfigs | object | `{}` | Extra files to mount on `/app/pythonpath` |
-| extraEnv | object | `{}` | Extra environment variables that will be passed into pods |
-| extraEnvRaw | list | `[]` | Extra environment variables in RAW format that will be passed into pods |
-| extraSecretEnv | object | `{}` | Extra environment variables to pass as secrets |
-| extraSecrets | object | `{}` | Extra files to mount on `/app/pythonpath` as secrets |
-| extraVolumeMounts | list | `[]` | |
-| extraVolumes | list | `[]` | |
-| fullnameOverride | string | `nil` | Provide a name to override the full names of resources |
-| hostAliases | list | `[]` | Custom hostAliases for all superset pods # https://kubernetes.io/docs/tasks/network/customize-hosts-file-for-pods/ |
-| image.pullPolicy | string | `"IfNotPresent"` | |
-| image.repository | string | `"apachesuperset.docker.scarf.sh/apache/superset"` | |
-| image.tag | string | `""` | |
-| imagePullSecrets | list | `[]` | |
-| ingress.annotations | object | `{}` | |
-| ingress.enabled | bool | `false` | |
-| ingress.extraHostsRaw | list | `[]` | |
-| ingress.hosts[0] | string | `"chart-example.local"` | |
-| ingress.ingressClassName | string | `nil` | |
-| ingress.path | string | `"/"` | |
-| ingress.pathType | string | `"ImplementationSpecific"` | |
-| ingress.tls | list | `[]` | |
-| init.adminUser.email | string | `"admin@superset.com"` | |
-| init.adminUser.firstname | string | `"Superset"` | |
-| init.adminUser.lastname | string | `"Admin"` | |
-| init.adminUser.password | string | `"admin"` | |
-| init.adminUser.username | string | `"admin"` | |
-| init.affinity | object | `{}` | |
-| init.command | list | a `superset_init.sh` command | Command |
-| init.containerSecurityContext | object | `{}` | |
-| init.createAdmin | bool | `true` | |
-| init.enabled | bool | `true` | |
-| init.initContainers | list | a container waiting for postgres | List of initContainers |
-| init.initscript | string | a script to create admin user and initailize roles | A Superset init script |
-| init.jobAnnotations."helm.sh/hook" | string | `"post-install,post-upgrade"` | |
-| init.jobAnnotations."helm.sh/hook-delete-policy" | string | `"before-hook-creation"` | |
-| init.loadExamples | bool | `false` | |
-| init.podAnnotations | object | `{}` | |
-| init.podSecurityContext | object | `{}` | |
-| init.resources | object | `{}` | |
-| init.tolerations | list | `[]` | |
-| init.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to init job |
-| initImage.pullPolicy | string | `"IfNotPresent"` | |
-| initImage.repository | string | `"apache/superset"` | |
-| initImage.tag | string | `"dockerize"` | |
-| nameOverride | string | `nil` | Provide a name to override the name of the chart |
-| nodeSelector | object | `{}` | |
-| postgresql | object | see `values.yaml` | Configuration values for the postgresql dependency. ref: https://github.com/kubernetes/charts/blob/master/stable/postgresql/README.md |
-| redis | object | see `values.yaml` | Configuration values for the Redis dependency. ref: https://github.com/bitnami/charts/blob/master/bitnami/redis More documentation can be found here: https://artifacthub.io/packages/helm/bitnami/redis |
-| resources | object | `{}` | |
-| runAsUser | int | `0` | User ID directive. This user must have enough permissions to run the bootstrap script Running containers as root is not recommended in production. Change this to another UID - e.g. 1000 to be more secure |
-| service.annotations | object | `{}` | |
-| service.loadBalancerIP | string | `nil` | |
-| service.nodePort.http | int | `"nil"` | |
-| service.port | int | `8088` | |
-| service.type | string | `"ClusterIP"` | |
-| serviceAccount.annotations | object | `{}` | |
-| serviceAccount.create | bool | `false` | Create custom service account for Superset. If create: true and serviceAccountName is not provided, `superset.fullname` will be used. |
-| serviceAccountName | string | `nil` | Specify service account name to be used |
-| supersetCeleryBeat.affinity | object | `{}` | Affinity to be added to supersetCeleryBeat deployment |
-| supersetCeleryBeat.command | list | a `celery beat` command | Command |
-| supersetCeleryBeat.containerSecurityContext | object | `{}` | |
-| supersetCeleryBeat.deploymentAnnotations | object | `{}` | Annotations to be added to supersetCeleryBeat deployment |
-| supersetCeleryBeat.enabled | bool | `false` | This is only required if you intend to use alerts and reports |
-| supersetCeleryBeat.forceReload | bool | `false` | If true, forces deployment to reload on each upgrade |
-| supersetCeleryBeat.initContainers | list | a container waiting for postgres | List of init containers |
-| supersetCeleryBeat.podAnnotations | object | `{}` | Annotations to be added to supersetCeleryBeat pods |
-| supersetCeleryBeat.podLabels | object | `{}` | Labels to be added to supersetCeleryBeat pods |
-| supersetCeleryBeat.podSecurityContext | object | `{}` | |
-| supersetCeleryBeat.resources | object | `{}` | Resource settings for the CeleryBeat pods - these settings overwrite might existing values from the global resources object defined above. |
-| supersetCeleryBeat.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetCeleryBeat deployments |
-| supersetCeleryFlower.affinity | object | `{}` | Affinity to be added to supersetCeleryFlower deployment |
-| supersetCeleryFlower.command | list | a `celery flower` command | Command |
-| supersetCeleryFlower.containerSecurityContext | object | `{}` | |
-| supersetCeleryFlower.deploymentAnnotations | object | `{}` | Annotations to be added to supersetCeleryFlower deployment |
-| supersetCeleryFlower.enabled | bool | `false` | Enables a Celery flower deployment (management UI to monitor celery jobs) WARNING: on superset 1.x, this requires a Superset image that has `flower<1.0.0` installed (which is NOT the case of the default images) flower>=1.0.0 requires Celery 5+ which Superset 1.5 does not support |
-| supersetCeleryFlower.initContainers | list | a container waiting for postgres and redis | List of init containers |
-| supersetCeleryFlower.livenessProbe.failureThreshold | int | `3` | |
-| supersetCeleryFlower.livenessProbe.httpGet.path | string | `"/api/workers"` | |
-| supersetCeleryFlower.livenessProbe.httpGet.port | string | `"flower"` | |
-| supersetCeleryFlower.livenessProbe.initialDelaySeconds | int | `5` | |
-| supersetCeleryFlower.livenessProbe.periodSeconds | int | `5` | |
-| supersetCeleryFlower.livenessProbe.successThreshold | int | `1` | |
-| supersetCeleryFlower.livenessProbe.timeoutSeconds | int | `1` | |
-| supersetCeleryFlower.podAnnotations | object | `{}` | Annotations to be added to supersetCeleryFlower pods |
-| supersetCeleryFlower.podLabels | object | `{}` | Labels to be added to supersetCeleryFlower pods |
-| supersetCeleryFlower.podSecurityContext | object | `{}` | |
-| supersetCeleryFlower.readinessProbe.failureThreshold | int | `3` | |
-| supersetCeleryFlower.readinessProbe.httpGet.path | string | `"/api/workers"` | |
-| supersetCeleryFlower.readinessProbe.httpGet.port | string | `"flower"` | |
-| supersetCeleryFlower.readinessProbe.initialDelaySeconds | int | `5` | |
-| supersetCeleryFlower.readinessProbe.periodSeconds | int | `5` | |
-| supersetCeleryFlower.readinessProbe.successThreshold | int | `1` | |
-| supersetCeleryFlower.readinessProbe.timeoutSeconds | int | `1` | |
-| supersetCeleryFlower.replicaCount | int | `1` | |
-| supersetCeleryFlower.resources | object | `{}` | Resource settings for the CeleryBeat pods - these settings overwrite might existing values from the global resources object defined above. |
-| supersetCeleryFlower.service.annotations | object | `{}` | |
-| supersetCeleryFlower.service.loadBalancerIP | string | `nil` | |
-| supersetCeleryFlower.service.nodePort.http | int | `"nil"` | |
-| supersetCeleryFlower.service.port | int | `5555` | |
-| supersetCeleryFlower.service.type | string | `"ClusterIP"` | |
-| supersetCeleryFlower.startupProbe.failureThreshold | int | `60` | |
-| supersetCeleryFlower.startupProbe.httpGet.path | string | `"/api/workers"` | |
-| supersetCeleryFlower.startupProbe.httpGet.port | string | `"flower"` | |
-| supersetCeleryFlower.startupProbe.initialDelaySeconds | int | `5` | |
-| supersetCeleryFlower.startupProbe.periodSeconds | int | `5` | |
-| supersetCeleryFlower.startupProbe.successThreshold | int | `1` | |
-| supersetCeleryFlower.startupProbe.timeoutSeconds | int | `1` | |
-| supersetCeleryFlower.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetCeleryFlower deployments |
-| supersetNode.affinity | object | `{}` | Affinity to be added to supersetNode deployment |
-| supersetNode.command | list | See `values.yaml` | Startup command |
-| supersetNode.connections.db_host | string | `"{{ .Release.Name }}-postgresql"` | |
-| supersetNode.connections.db_name | string | `"superset"` | |
-| supersetNode.connections.db_pass | string | `"superset"` | |
-| supersetNode.connections.db_port | string | `"5432"` | |
-| supersetNode.connections.db_user | string | `"superset"` | |
-| supersetNode.connections.redis_host | string | `"{{ .Release.Name }}-redis-headless"` | Change in case of bringing your own redis and then also set redis.enabled:false |
-| supersetNode.connections.redis_port | string | `"6379"` | |
-| supersetNode.containerSecurityContext | object | `{}` | |
-| supersetNode.deploymentAnnotations | object | `{}` | Annotations to be added to supersetNode deployment |
-| supersetNode.deploymentLabels | object | `{}` | Labels to be added to supersetNode deployment |
-| supersetNode.env | object | `{}` | |
-| supersetNode.extraContainers | list | `[]` | Launch additional containers into supersetNode pod |
-| supersetNode.forceReload | bool | `false` | If true, forces deployment to reload on each upgrade |
-| supersetNode.initContainers | list | a container waiting for postgres | Init containers |
-| supersetNode.livenessProbe.failureThreshold | int | `3` | |
-| supersetNode.livenessProbe.httpGet.path | string | `"/health"` | |
-| supersetNode.livenessProbe.httpGet.port | string | `"http"` | |
-| supersetNode.livenessProbe.initialDelaySeconds | int | `15` | |
-| supersetNode.livenessProbe.periodSeconds | int | `15` | |
-| supersetNode.livenessProbe.successThreshold | int | `1` | |
-| supersetNode.livenessProbe.timeoutSeconds | int | `1` | |
-| supersetNode.podAnnotations | object | `{}` | Annotations to be added to supersetNode pods |
-| supersetNode.podLabels | object | `{}` | Labels to be added to supersetNode pods |
-| supersetNode.podSecurityContext | object | `{}` | |
-| supersetNode.readinessProbe.failureThreshold | int | `3` | |
-| supersetNode.readinessProbe.httpGet.path | string | `"/health"` | |
-| supersetNode.readinessProbe.httpGet.port | string | `"http"` | |
-| supersetNode.readinessProbe.initialDelaySeconds | int | `15` | |
-| supersetNode.readinessProbe.periodSeconds | int | `15` | |
-| supersetNode.readinessProbe.successThreshold | int | `1` | |
-| supersetNode.readinessProbe.timeoutSeconds | int | `1` | |
-| supersetNode.replicaCount | int | `1` | |
-| supersetNode.resources | object | `{}` | Resource settings for the supersetNode pods - these settings overwrite might existing values from the global resources object defined above. |
-| supersetNode.startupProbe.failureThreshold | int | `60` | |
-| supersetNode.startupProbe.httpGet.path | string | `"/health"` | |
-| supersetNode.startupProbe.httpGet.port | string | `"http"` | |
-| supersetNode.startupProbe.initialDelaySeconds | int | `15` | |
-| supersetNode.startupProbe.periodSeconds | int | `5` | |
-| supersetNode.startupProbe.successThreshold | int | `1` | |
-| supersetNode.startupProbe.timeoutSeconds | int | `1` | |
-| supersetNode.strategy | object | `{}` | |
-| supersetNode.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetNode deployments |
-| supersetWebsockets.affinity | object | `{}` | Affinity to be added to supersetWebsockets deployment |
-| supersetWebsockets.command | list | `[]` | |
-| supersetWebsockets.config | object | see `values.yaml` | The config.json to pass to the server, see https://github.com/apache/superset/tree/master/superset-websocket Note that the configuration can also read from environment variables (which will have priority), see https://github.com/apache/superset/blob/master/superset-websocket/src/config.ts for a list of supported variables |
-| supersetWebsockets.containerSecurityContext | object | `{}` | |
-| supersetWebsockets.deploymentAnnotations | object | `{}` | |
-| supersetWebsockets.enabled | bool | `false` | This is only required if you intend to use `GLOBAL_ASYNC_QUERIES` in `ws` mode see https://github.com/apache/superset/blob/master/CONTRIBUTING.md#async-chart-queries |
-| supersetWebsockets.image.pullPolicy | string | `"IfNotPresent"` | |
-| supersetWebsockets.image.repository | string | `"oneacrefund/superset-websocket"` | There is no official image (yet), this one is community-supported |
-| supersetWebsockets.image.tag | string | `"latest"` | |
-| supersetWebsockets.ingress.path | string | `"/ws"` | |
-| supersetWebsockets.ingress.pathType | string | `"Prefix"` | |
-| supersetWebsockets.livenessProbe.failureThreshold | int | `3` | |
-| supersetWebsockets.livenessProbe.httpGet.path | string | `"/health"` | |
-| supersetWebsockets.livenessProbe.httpGet.port | string | `"ws"` | |
-| supersetWebsockets.livenessProbe.initialDelaySeconds | int | `5` | |
-| supersetWebsockets.livenessProbe.periodSeconds | int | `5` | |
-| supersetWebsockets.livenessProbe.successThreshold | int | `1` | |
-| supersetWebsockets.livenessProbe.timeoutSeconds | int | `1` | |
-| supersetWebsockets.podAnnotations | object | `{}` | |
-| supersetWebsockets.podLabels | object | `{}` | |
-| supersetWebsockets.podSecurityContext | object | `{}` | |
-| supersetWebsockets.readinessProbe.failureThreshold | int | `3` | |
-| supersetWebsockets.readinessProbe.httpGet.path | string | `"/health"` | |
-| supersetWebsockets.readinessProbe.httpGet.port | string | `"ws"` | |
-| supersetWebsockets.readinessProbe.initialDelaySeconds | int | `5` | |
-| supersetWebsockets.readinessProbe.periodSeconds | int | `5` | |
-| supersetWebsockets.readinessProbe.successThreshold | int | `1` | |
-| supersetWebsockets.readinessProbe.timeoutSeconds | int | `1` | |
-| supersetWebsockets.replicaCount | int | `1` | |
-| supersetWebsockets.resources | object | `{}` | |
-| supersetWebsockets.service.annotations | object | `{}` | |
-| supersetWebsockets.service.loadBalancerIP | string | `nil` | |
-| supersetWebsockets.service.nodePort.http | int | `"nil"` | |
-| supersetWebsockets.service.port | int | `8080` | |
-| supersetWebsockets.service.type | string | `"ClusterIP"` | |
-| supersetWebsockets.startupProbe.failureThreshold | int | `60` | |
-| supersetWebsockets.startupProbe.httpGet.path | string | `"/health"` | |
-| supersetWebsockets.startupProbe.httpGet.port | string | `"ws"` | |
-| supersetWebsockets.startupProbe.initialDelaySeconds | int | `5` | |
-| supersetWebsockets.startupProbe.periodSeconds | int | `5` | |
-| supersetWebsockets.startupProbe.successThreshold | int | `1` | |
-| supersetWebsockets.startupProbe.timeoutSeconds | int | `1` | |
-| supersetWebsockets.strategy | object | `{}` | |
-| supersetWebsockets.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetWebsockets deployments |
-| supersetWorker.affinity | object | `{}` | Affinity to be added to supersetWorker deployment |
-| supersetWorker.command | list | a `celery worker` command | Worker startup command |
-| supersetWorker.containerSecurityContext | object | `{}` | |
-| supersetWorker.deploymentAnnotations | object | `{}` | Annotations to be added to supersetWorker deployment |
-| supersetWorker.deploymentLabels | object | `{}` | Labels to be added to supersetWorker deployment |
-| supersetWorker.extraContainers | list | `[]` | Launch additional containers into supersetWorker pod |
-| supersetWorker.forceReload | bool | `false` | If true, forces deployment to reload on each upgrade |
-| supersetWorker.initContainers | list | a container waiting for postgres and redis | Init container |
-| supersetWorker.livenessProbe.exec.command | list | a `celery inspect ping` command | Liveness probe command |
-| supersetWorker.livenessProbe.failureThreshold | int | `3` | |
-| supersetWorker.livenessProbe.initialDelaySeconds | int | `120` | |
-| supersetWorker.livenessProbe.periodSeconds | int | `60` | |
-| supersetWorker.livenessProbe.successThreshold | int | `1` | |
-| supersetWorker.livenessProbe.timeoutSeconds | int | `60` | |
-| supersetWorker.podAnnotations | object | `{}` | Annotations to be added to supersetWorker pods |
-| supersetWorker.podLabels | object | `{}` | Labels to be added to supersetWorker pods |
-| supersetWorker.podSecurityContext | object | `{}` | |
-| supersetWorker.readinessProbe | object | `{}` | No startup/readiness probes by default since we don't really care about its startup time (it doesn't serve traffic) |
-| supersetWorker.replicaCount | int | `1` | |
-| supersetWorker.resources | object | `{}` | Resource settings for the supersetWorker pods - these settings overwrite might existing values from the global resources object defined above. |
-| supersetWorker.startupProbe | object | `{}` | No startup/readiness probes by default since we don't really care about its startup time (it doesn't serve traffic) |
-| supersetWorker.strategy | object | `{}` | |
-| supersetWorker.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetWorker deployments |
-| tolerations | list | `[]` | |
-| topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to all deployments |
+| Key | Type | Default | Description |
+|-----|------|---------|-------------|
+| affinity | object | `{}` | |
+| bootstrapScript | string | see `values.yaml` | Install additional packages and do any other bootstrap configuration in this script For production clusters it's recommended to build own image with this step done in CI |
+| configFromSecret | string | `"{{ template \"superset.fullname\" . }}-config"` | The name of the secret which we will use to generate a superset_config.py file Note: this secret must have the key superset_config.py in it and can include other files as well |
+| configMountPath | string | `"/app/pythonpath"` | |
+| configOverrides | object | `{}` | A dictionary of overrides to append at the end of superset_config.py - the name does not matter WARNING: the order is not guaranteed Files can be passed as helm --set-file configOverrides.my-override=my-file.py |
+| configOverridesFiles | object | `{}` | Same as above but the values are files |
+| envFromSecret | string | `"{{ template \"superset.fullname\" . }}-env"` | The name of the secret which we will use to populate env vars in deployed pods This can be useful for secret keys, etc. |
+| envFromSecrets | list | `[]` | This can be a list of templated strings |
+| extraConfigMountPath | string | `"/app/configs"` | |
+| extraConfigs | object | `{}` | Extra files to mount on `/app/pythonpath` |
+| extraEnv | object | `{}` | Extra environment variables that will be passed into pods |
+| extraEnvRaw | list | `[]` | Extra environment variables in RAW format that will be passed into pods |
+| extraSecretEnv | object | `{}` | Extra environment variables to pass as secrets |
+| extraSecrets | object | `{}` | Extra files to mount on `/app/pythonpath` as secrets |
+| extraVolumeMounts | list | `[]` | |
+| extraVolumes | list | `[]` | |
+| fullnameOverride | string | `nil` | Provide a name to override the full names of resources |
+| hostAliases | list | `[]` | Custom hostAliases for all superset pods # https://kubernetes.io/docs/tasks/network/customize-hosts-file-for-pods/ |
+| image.pullPolicy | string | `"IfNotPresent"` | |
+| image.repository | string | `"apachesuperset.docker.scarf.sh/apache/superset"` | |
+| image.tag | string | `""` | |
+| imagePullSecrets | list | `[]` | |
+| ingress.annotations | object | `{}` | |
+| ingress.enabled | bool | `false` | |
+| ingress.extraHostsRaw | list | `[]` | |
+| ingress.hosts[0] | string | `"chart-example.local"` | |
+| ingress.ingressClassName | string | `nil` | |
+| ingress.path | string | `"/"` | |
+| ingress.pathType | string | `"ImplementationSpecific"` | |
+| ingress.tls | list | `[]` | |
+| init.adminUser.email | string | `"admin@superset.com"` | |
+| init.adminUser.firstname | string | `"Superset"` | |
+| init.adminUser.lastname | string | `"Admin"` | |
+| init.adminUser.password | string | `"admin"` | |
+| init.adminUser.username | string | `"admin"` | |
+| init.affinity | object | `{}` | |
+| init.command | list | a `superset_init.sh` command | Command |
+| init.containerSecurityContext | object | `{}` | |
+| init.createAdmin | bool | `true` | |
+| init.enabled | bool | `true` | |
+| init.initContainers | list | a container waiting for postgres | List of initContainers |
+| init.initscript | string | a script to create admin user and initailize roles | A Superset init script |
+| init.jobAnnotations."helm.sh/hook" | string | `"post-install,post-upgrade"` | |
+| init.jobAnnotations."helm.sh/hook-delete-policy" | string | `"before-hook-creation"` | |
+| init.loadExamples | bool | `false` | |
+| init.podAnnotations | object | `{}` | |
+| init.podSecurityContext | object | `{}` | |
+| init.resources | object | `{}` | |
+| init.tolerations | list | `[]` | |
+| init.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to init job |
+| initImage.pullPolicy | string | `"IfNotPresent"` | |
+| initImage.repository | string | `"apache/superset"` | |
+| initImage.tag | string | `"dockerize"` | |
+| nameOverride | string | `nil` | Provide a name to override the name of the chart |
+| nodeSelector | object | `{}` | |
+| postgresql | object | see `values.yaml` | Configuration values for the postgresql dependency. ref: https://github.com/kubernetes/charts/blob/master/stable/postgresql/README.md |
+| redis | object | see `values.yaml` | Configuration values for the Redis dependency. ref: https://github.com/bitnami/charts/blob/master/bitnami/redis More documentation can be found here: https://artifacthub.io/packages/helm/bitnami/redis |
+| resources | object | `{}` | |
+| runAsUser | int | `0` | User ID directive. This user must have enough permissions to run the bootstrap script Running containers as root is not recommended in production. Change this to another UID - e.g. 1000 to be more secure |
+| service.annotations | object | `{}` | |
+| service.loadBalancerIP | string | `nil` | |
+| service.nodePort.http | int | `"nil"` | |
+| service.port | int | `8088` | |
+| service.type | string | `"ClusterIP"` | |
+| serviceAccount.annotations | object | `{}` | |
+| serviceAccount.create | bool | `false` | Create custom service account for Superset. If create: true and serviceAccountName is not provided, `superset.fullname` will be used. |
+| serviceAccountName | string | `nil` | Specify service account name to be used |
+| supersetCeleryBeat.affinity | object | `{}` | Affinity to be added to supersetCeleryBeat deployment |
+| supersetCeleryBeat.command | list | a `celery beat` command | Command |
+| supersetCeleryBeat.containerSecurityContext | object | `{}` | |
+| supersetCeleryBeat.deploymentAnnotations | object | `{}` | Annotations to be added to supersetCeleryBeat deployment |
+| supersetCeleryBeat.enabled | bool | `false` | This is only required if you intend to use alerts and reports |
+| supersetCeleryBeat.forceReload | bool | `false` | If true, forces deployment to reload on each upgrade |
+| supersetCeleryBeat.initContainers | list | a container waiting for postgres | List of init containers |
+| supersetCeleryBeat.podAnnotations | object | `{}` | Annotations to be added to supersetCeleryBeat pods |
+| supersetCeleryBeat.podLabels | object | `{}` | Labels to be added to supersetCeleryBeat pods |
+| supersetCeleryBeat.podSecurityContext | object | `{}` | |
+| supersetCeleryBeat.resources | object | `{}` | Resource settings for the CeleryBeat pods - these settings overwrite might existing values from the global resources object defined above. |
+| supersetCeleryBeat.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetCeleryBeat deployments |
+| supersetCeleryFlower.affinity | object | `{}` | Affinity to be added to supersetCeleryFlower deployment |
+| supersetCeleryFlower.command | list | a `celery flower` command | Command |
+| supersetCeleryFlower.containerSecurityContext | object | `{}` | |
+| supersetCeleryFlower.deploymentAnnotations | object | `{}` | Annotations to be added to supersetCeleryFlower deployment |
+| supersetCeleryFlower.enabled | bool | `false` | Enables a Celery flower deployment (management UI to monitor celery jobs) WARNING: on superset 1.x, this requires a Superset image that has `flower<1.0.0` installed (which is NOT the case of the default images) flower>=1.0.0 requires Celery 5+ which Superset 1.5 does not support |
+| supersetCeleryFlower.initContainers | list | a container waiting for postgres and redis | List of init containers |
+| supersetCeleryFlower.livenessProbe.failureThreshold | int | `3` | |
+| supersetCeleryFlower.livenessProbe.httpGet.path | string | `"/api/workers"` | |
+| supersetCeleryFlower.livenessProbe.httpGet.port | string | `"flower"` | |
+| supersetCeleryFlower.livenessProbe.initialDelaySeconds | int | `5` | |
+| supersetCeleryFlower.livenessProbe.periodSeconds | int | `5` | |
+| supersetCeleryFlower.livenessProbe.successThreshold | int | `1` | |
+| supersetCeleryFlower.livenessProbe.timeoutSeconds | int | `1` | |
+| supersetCeleryFlower.podAnnotations | object | `{}` | Annotations to be added to supersetCeleryFlower pods |
+| supersetCeleryFlower.podLabels | object | `{}` | Labels to be added to supersetCeleryFlower pods |
+| supersetCeleryFlower.podSecurityContext | object | `{}` | |
+| supersetCeleryFlower.readinessProbe.failureThreshold | int | `3` | |
+| supersetCeleryFlower.readinessProbe.httpGet.path | string | `"/api/workers"` | |
+| supersetCeleryFlower.readinessProbe.httpGet.port | string | `"flower"` | |
+| supersetCeleryFlower.readinessProbe.initialDelaySeconds | int | `5` | |
+| supersetCeleryFlower.readinessProbe.periodSeconds | int | `5` | |
+| supersetCeleryFlower.readinessProbe.successThreshold | int | `1` | |
+| supersetCeleryFlower.readinessProbe.timeoutSeconds | int | `1` | |
+| supersetCeleryFlower.replicaCount | int | `1` | |
+| supersetCeleryFlower.resources | object | `{}` | Resource settings for the CeleryBeat pods - these settings overwrite might existing values from the global resources object defined above. |
+| supersetCeleryFlower.service.annotations | object | `{}` | |
+| supersetCeleryFlower.service.loadBalancerIP | string | `nil` | |
+| supersetCeleryFlower.service.nodePort.http | int | `"nil"` | |
+| supersetCeleryFlower.service.port | int | `5555` | |
+| supersetCeleryFlower.service.type | string | `"ClusterIP"` | |
+| supersetCeleryFlower.startupProbe.failureThreshold | int | `60` | |
+| supersetCeleryFlower.startupProbe.httpGet.path | string | `"/api/workers"` | |
+| supersetCeleryFlower.startupProbe.httpGet.port | string | `"flower"` | |
+| supersetCeleryFlower.startupProbe.initialDelaySeconds | int | `5` | |
+| supersetCeleryFlower.startupProbe.periodSeconds | int | `5` | |
+| supersetCeleryFlower.startupProbe.successThreshold | int | `1` | |
+| supersetCeleryFlower.startupProbe.timeoutSeconds | int | `1` | |
+| supersetCeleryFlower.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetCeleryFlower deployments |
+| supersetNode.affinity | object | `{}` | Affinity to be added to supersetNode deployment |
+| supersetNode.command | list | See `values.yaml` | Startup command |
+| supersetNode.connections.db_host | string | `"{{ .Release.Name }}-postgresql"` | |
+| supersetNode.connections.db_name | string | `"superset"` | |
+| supersetNode.connections.db_pass | string | `"superset"` | |
+| supersetNode.connections.db_port | string | `"5432"` | |
+| supersetNode.connections.db_user | string | `"superset"` | |
+| supersetNode.connections.redis_host | string | `"{{ .Release.Name }}-redis-headless"` | Change in case of bringing your own redis and then also set redis.enabled:false |
+| supersetNode.connections.redis_port | string | `"6379"` | |
+| supersetNode.containerSecurityContext | object | `{}` | |
+| supersetNode.deploymentAnnotations | object | `{}` | Annotations to be added to supersetNode deployment |
+| supersetNode.deploymentLabels | object | `{}` | Labels to be added to supersetNode deployment |
+| supersetNode.env | object | `{}` | |
+| supersetNode.extraContainers | list | `[]` | Launch additional containers into supersetNode pod |
+| supersetNode.forceReload | bool | `false` | If true, forces deployment to reload on each upgrade |
+| supersetNode.initContainers | list | a container waiting for postgres | Init containers |
+| supersetNode.livenessProbe.failureThreshold | int | `3` | |
+| supersetNode.livenessProbe.httpGet.path | string | `"/health"` | |
+| supersetNode.livenessProbe.httpGet.port | string | `"http"` | |
+| supersetNode.livenessProbe.initialDelaySeconds | int | `15` | |
+| supersetNode.livenessProbe.periodSeconds | int | `15` | |
+| supersetNode.livenessProbe.successThreshold | int | `1` | |
+| supersetNode.livenessProbe.timeoutSeconds | int | `1` | |
+| supersetNode.podAnnotations | object | `{}` | Annotations to be added to supersetNode pods |
+| supersetNode.podLabels | object | `{}` | Labels to be added to supersetNode pods |
+| supersetNode.podSecurityContext | object | `{}` | |
+| supersetNode.readinessProbe.failureThreshold | int | `3` | |
+| supersetNode.readinessProbe.httpGet.path | string | `"/health"` | |
+| supersetNode.readinessProbe.httpGet.port | string | `"http"` | |
+| supersetNode.readinessProbe.initialDelaySeconds | int | `15` | |
+| supersetNode.readinessProbe.periodSeconds | int | `15` | |
+| supersetNode.readinessProbe.successThreshold | int | `1` | |
+| supersetNode.readinessProbe.timeoutSeconds | int | `1` | |
+| supersetNode.replicaCount | int | `1` | |
+| supersetNode.resources | object | `{}` | Resource settings for the supersetNode pods - these settings overwrite might existing values from the global resources object defined above. |
+| supersetNode.startupProbe.failureThreshold | int | `60` | |
+| supersetNode.startupProbe.httpGet.path | string | `"/health"` | |
+| supersetNode.startupProbe.httpGet.port | string | `"http"` | |
+| supersetNode.startupProbe.initialDelaySeconds | int | `15` | |
+| supersetNode.startupProbe.periodSeconds | int | `5` | |
+| supersetNode.startupProbe.successThreshold | int | `1` | |
+| supersetNode.startupProbe.timeoutSeconds | int | `1` | |
+| supersetNode.strategy | object | `{}` | |
+| supersetNode.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetNode deployments |
+| supersetWebsockets.affinity | object | `{}` | Affinity to be added to supersetWebsockets deployment |
+| supersetWebsockets.command | list | `[]` | |
+| supersetWebsockets.config | object | see `values.yaml` | The config.json to pass to the server, see https://github.com/apache/superset/tree/master/superset-websocket Note that the configuration can also read from environment variables (which will have priority), see https://github.com/apache/superset/blob/master/superset-websocket/src/config.ts for a list of supported variables |
+| supersetWebsockets.containerSecurityContext | object | `{}` | |
+| supersetWebsockets.deploymentAnnotations | object | `{}` | |
+| supersetWebsockets.enabled | bool | `false` | This is only required if you intend to use `GLOBAL_ASYNC_QUERIES` in `ws` mode see https://github.com/apache/superset/blob/master/CONTRIBUTING.md#async-chart-queries |
+| supersetWebsockets.image.pullPolicy | string | `"IfNotPresent"` | |
+| supersetWebsockets.image.repository | string | `"oneacrefund/superset-websocket"` | There is no official image (yet), this one is community-supported |
+| supersetWebsockets.image.tag | string | `"latest"` | |
+| supersetWebsockets.ingress.path | string | `"/ws"` | |
+| supersetWebsockets.ingress.pathType | string | `"Prefix"` | |
+| supersetWebsockets.livenessProbe.failureThreshold | int | `3` | |
+| supersetWebsockets.livenessProbe.httpGet.path | string | `"/health"` | |
+| supersetWebsockets.livenessProbe.httpGet.port | string | `"ws"` | |
+| supersetWebsockets.livenessProbe.initialDelaySeconds | int | `5` | |
+| supersetWebsockets.livenessProbe.periodSeconds | int | `5` | |
+| supersetWebsockets.livenessProbe.successThreshold | int | `1` | |
+| supersetWebsockets.livenessProbe.timeoutSeconds | int | `1` | |
+| supersetWebsockets.podAnnotations | object | `{}` | |
+| supersetWebsockets.podLabels | object | `{}` | |
+| supersetWebsockets.podSecurityContext | object | `{}` | |
+| supersetWebsockets.readinessProbe.failureThreshold | int | `3` | |
+| supersetWebsockets.readinessProbe.httpGet.path | string | `"/health"` | |
+| supersetWebsockets.readinessProbe.httpGet.port | string | `"ws"` | |
+| supersetWebsockets.readinessProbe.initialDelaySeconds | int | `5` | |
+| supersetWebsockets.readinessProbe.periodSeconds | int | `5` | |
+| supersetWebsockets.readinessProbe.successThreshold | int | `1` | |
+| supersetWebsockets.readinessProbe.timeoutSeconds | int | `1` | |
+| supersetWebsockets.replicaCount | int | `1` | |
+| supersetWebsockets.resources | object | `{}` | |
+| supersetWebsockets.service.annotations | object | `{}` | |
+| supersetWebsockets.service.loadBalancerIP | string | `nil` | |
+| supersetWebsockets.service.nodePort.http | int | `"nil"` | |
+| supersetWebsockets.service.port | int | `8080` | |
+| supersetWebsockets.service.type | string | `"ClusterIP"` | |
+| supersetWebsockets.startupProbe.failureThreshold | int | `60` | |
+| supersetWebsockets.startupProbe.httpGet.path | string | `"/health"` | |
+| supersetWebsockets.startupProbe.httpGet.port | string | `"ws"` | |
+| supersetWebsockets.startupProbe.initialDelaySeconds | int | `5` | |
+| supersetWebsockets.startupProbe.periodSeconds | int | `5` | |
+| supersetWebsockets.startupProbe.successThreshold | int | `1` | |
+| supersetWebsockets.startupProbe.timeoutSeconds | int | `1` | |
+| supersetWebsockets.strategy | object | `{}` | |
+| supersetWebsockets.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetWebsockets deployments |
+| supersetWorker.affinity | object | `{}` | Affinity to be added to supersetWorker deployment |
+| supersetWorker.command | list | a `celery worker` command | Worker startup command |
+| supersetWorker.containerSecurityContext | object | `{}` | |
+| supersetWorker.deploymentAnnotations | object | `{}` | Annotations to be added to supersetWorker deployment |
+| supersetWorker.deploymentLabels | object | `{}` | Labels to be added to supersetWorker deployment |
+| supersetWorker.extraContainers | list | `[]` | Launch additional containers into supersetWorker pod |
+| supersetWorker.forceReload | bool | `false` | If true, forces deployment to reload on each upgrade |
+| supersetWorker.initContainers | list | a container waiting for postgres and redis | Init container |
+| supersetWorker.livenessProbe.exec.command | list | a `celery inspect ping` command | Liveness probe command |
+| supersetWorker.livenessProbe.failureThreshold | int | `3` | |
+| supersetWorker.livenessProbe.initialDelaySeconds | int | `120` | |
+| supersetWorker.livenessProbe.periodSeconds | int | `60` | |
+| supersetWorker.livenessProbe.successThreshold | int | `1` | |
+| supersetWorker.livenessProbe.timeoutSeconds | int | `60` | |
+| supersetWorker.podAnnotations | object | `{}` | Annotations to be added to supersetWorker pods |
+| supersetWorker.podLabels | object | `{}` | Labels to be added to supersetWorker pods |
+| supersetWorker.podSecurityContext | object | `{}` | |
+| supersetWorker.readinessProbe | object | `{}` | No startup/readiness probes by default since we don't really care about its startup time (it doesn't serve traffic) |
+| supersetWorker.replicaCount | int | `1` | |
+| supersetWorker.resources | object | `{}` | Resource settings for the supersetWorker pods - these settings overwrite might existing values from the global resources object defined above. |
+| supersetWorker.startupProbe | object | `{}` | No startup/readiness probes by default since we don't really care about its startup time (it doesn't serve traffic) |
+| supersetWorker.strategy | object | `{}` | |
+| supersetWorker.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetWorker deployments |
+| tolerations | list | `[]` | |
+| topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to all deployments |
diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/transformProps.ts
index 25b7e5364a..00466c607a 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/transformProps.ts
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/transformProps.ts
@@ -53,7 +53,7 @@ import {
ForecastSeriesEnum,
Refs,
} from '../types';
-import { parseYAxisBound } from '../utils/controls';
+import { parseAxisBound } from '../utils/controls';
import {
getOverMaxHiddenFormatter,
dedupSeries,
@@ -343,9 +343,9 @@ export default function transformProps(
});
// yAxisBounds need to be parsed to replace incompatible values with undefined
- let [min, max] = (yAxisBounds || []).map(parseYAxisBound);
+ let [min, max] = (yAxisBounds || []).map(parseAxisBound);
let [minSecondary, maxSecondary] = (yAxisBoundsSecondary || []).map(
- parseYAxisBound,
+ parseAxisBound,
);
const array = ensureIsArray(chartProps.rawFormData?.time_compare);
diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx
index 5a5975c66b..018038772c 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx
@@ -37,6 +37,8 @@ import {
richTooltipSection,
seriesOrderSection,
percentageThresholdControl,
+ truncateXAxis,
+ xAxisBounds,
} from '../../controls';
import { AreaChartStackControlOptions } from '../../constants';
@@ -241,6 +243,8 @@ const config: ControlPanelConfig = {
},
},
],
+ [truncateXAxis],
+ [xAxisBounds],
[
{
name: 'truncateYAxis',
diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx
index af482da1b4..c3002a2498 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx
@@ -35,6 +35,8 @@ import {
richTooltipSection,
seriesOrderSection,
showValueSection,
+ truncateXAxis,
+ xAxisBounds,
} from '../../../controls';
import { OrientationType } from '../../types';
@@ -224,6 +226,8 @@ function createAxisControl(axis: 'x' | 'y'): ControlSetRow[] {
},
},
],
+ [truncateXAxis],
+ [xAxisBounds],
[
{
name: 'truncateYAxis',
diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx
index 124ab1e935..5c5f7a0ab1 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx
@@ -38,6 +38,8 @@ import {
richTooltipSection,
seriesOrderSection,
showValueSection,
+ truncateXAxis,
+ xAxisBounds,
} from '../../../controls';
const {
@@ -229,6 +231,8 @@ const config: ControlPanelConfig = {
},
},
],
+ [truncateXAxis],
+ [xAxisBounds],
[
{
name: 'truncateYAxis',
diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx
index bc813127ca..6701647694 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx
@@ -37,6 +37,8 @@ import {
richTooltipSection,
seriesOrderSection,
showValueSection,
+ truncateXAxis,
+ xAxisBounds,
} from '../../../controls';
const {
@@ -173,6 +175,8 @@ const config: ControlPanelConfig = {
},
},
],
+ [truncateXAxis],
+ [xAxisBounds],
[
{
name: 'truncateYAxis',
diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx
index 2a8fbfb0af..0c6623f216 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx
@@ -37,6 +37,8 @@ import {
richTooltipSection,
seriesOrderSection,
showValueSectionWithoutStack,
+ truncateXAxis,
+ xAxisBounds,
} from '../../../controls';
const {
@@ -173,6 +175,8 @@ const config: ControlPanelConfig = {
},
},
],
+ [truncateXAxis],
+ [xAxisBounds],
[
{
name: 'truncateYAxis',
diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx
index 9333cb48a1..021c306d05 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx
@@ -35,6 +35,8 @@ import {
richTooltipSection,
seriesOrderSection,
showValueSection,
+ truncateXAxis,
+ xAxisBounds,
} from '../../controls';
const {
@@ -223,6 +225,8 @@ const config: ControlPanelConfig = {
},
},
],
+ [truncateXAxis],
+ [xAxisBounds],
[
{
name: 'truncateYAxis',
diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/constants.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/constants.ts
index 17629c0996..a95a14077d 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/constants.ts
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/constants.ts
@@ -57,6 +57,7 @@ export const DEFAULT_FORM_DATA: EchartsTimeseriesFormData = {
seriesType: EchartsTimeseriesSeriesType.Line,
stack: false,
tooltipTimeFormat: 'smart_date',
+ truncateXAxis: true,
truncateYAxis: false,
yAxisBounds: [null, null],
zoomable: false,
diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts
index d59da861a0..e81f13b784 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts
@@ -54,7 +54,7 @@ import {
} from './types';
import { DEFAULT_FORM_DATA } from './constants';
import { ForecastSeriesEnum, ForecastValue, Refs } from '../types';
-import { parseYAxisBound } from '../utils/controls';
+import { parseAxisBound } from '../utils/controls';
import {
calculateLowerLogTick,
dedupSeries,
@@ -64,6 +64,7 @@ import {
getAxisType,
getColtypesMapping,
getLegendProps,
+ getMinAndMaxFromBounds,
} from '../utils/series';
import {
extractAnnotationLabels,
@@ -159,8 +160,10 @@ export default function transformProps(
stack,
tooltipTimeFormat,
tooltipSortByMetric,
+ truncateXAxis,
truncateYAxis,
xAxis: xAxisOrig,
+ xAxisBounds,
xAxisLabelRotation,
xAxisSortSeries,
xAxisSortSeriesAscending,
@@ -386,15 +389,20 @@ export default function transformProps(
}
});
- // yAxisBounds need to be parsed to replace incompatible values with undefined
- let [min, max] = (yAxisBounds || []).map(parseYAxisBound);
+ // axis bounds need to be parsed to replace incompatible values with undefined
+ const [xAxisMin, xAxisMax] = (xAxisBounds || []).map(parseAxisBound);
+ let [yAxisMin, yAxisMax] = (yAxisBounds || []).map(parseAxisBound);
// default to 0-100% range when doing row-level contribution chart
if ((contributionMode === 'row' || isAreaExpand) && stack) {
- if (min === undefined) min = 0;
- if (max === undefined) max = 1;
- } else if (logAxis && min === undefined && minPositiveValue !== undefined) {
- min = calculateLowerLogTick(minPositiveValue);
+ if (yAxisMin === undefined) yAxisMin = 0;
+ if (yAxisMax === undefined) yAxisMax = 1;
+ } else if (
+ logAxis &&
+ yAxisMin === undefined &&
+ minPositiveValue !== undefined
+ ) {
+ yAxisMin = calculateLowerLogTick(minPositiveValue);
}
const tooltipFormatter =
@@ -450,12 +458,14 @@ export default function transformProps(
xAxisType === AxisType.time && timeGrainSqla
? TIMEGRAIN_TO_TIMESTAMP[timeGrainSqla]
: 0,
+ ...getMinAndMaxFromBounds(xAxisType, truncateXAxis, xAxisMin, xAxisMax),
};
+
let yAxis: any = {
...defaultYAxis,
type: logAxis ? AxisType.log : AxisType.value,
- min,
- max,
+ min: yAxisMin,
+ max: yAxisMax,
minorTick: { show: true },
minorSplitLine: { show: minorSplitLine },
axisLabel: {
diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/types.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/types.ts
index 1873086d99..65da981e49 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/types.ts
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/types.ts
@@ -75,10 +75,12 @@ export type EchartsTimeseriesFormData = QueryFormData & {
stack: StackType;
timeCompare?: string[];
tooltipTimeFormat?: string;
+ truncateXAxis: boolean;
truncateYAxis: boolean;
yAxisFormat?: string;
xAxisTimeFormat?: string;
timeGrainSqla?: TimeGranularity;
+ xAxisBounds: [number | undefined | null, number | undefined | null];
yAxisBounds: [number | undefined | null, number | undefined | null];
zoomable: boolean;
richTooltip: boolean;
diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx
index 8f311e47e5..093617446a 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx
@@ -248,3 +248,34 @@ export const seriesOrderSection: ControlSetRow[] = [
[sortSeriesType],
[sortSeriesAscending],
];
+
+export const truncateXAxis: ControlSetItem = {
+ name: 'truncateXAxis',
+ config: {
+ type: 'CheckboxControl',
+ label: t('Truncate X Axis'),
+ default: DEFAULT_FORM_DATA.truncateXAxis,
+ renderTrigger: true,
+ description: t(
+ 'Truncate X Axis. Can be overridden by specifying a min or max bound. Only applicable for numercal X axis.',
+ ),
+ },
+};
+
+export const xAxisBounds: ControlSetItem = {
+ name: 'xAxisBounds',
+ config: {
+ type: 'BoundsControl',
+ label: t('X Axis Bounds'),
+ renderTrigger: true,
+ default: DEFAULT_FORM_DATA.xAxisBounds,
+ description: t(
+ 'Bounds for numerical X axis. Not applicable for temporal or categorical axes. ' +
+ 'When left empty, the bounds are dynamically defined based on the min/max of the data. ' +
+ "Note that this feature will only expand the axis range. It won't " +
+ "narrow the data's extent.",
+ ),
+ visibility: ({ controls }: ControlPanelsContainerProps) =>
+ Boolean(controls?.truncateXAxis?.value),
+ },
+};
diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/utils/controls.ts b/superset-frontend/plugins/plugin-chart-echarts/src/utils/controls.ts
index af91596b5e..e5ba4c95d1 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/utils/controls.ts
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/utils/controls.ts
@@ -20,7 +20,7 @@
import { validateNumber } from '@superset-ui/core';
// eslint-disable-next-line import/prefer-default-export
-export function parseYAxisBound(
+export function parseAxisBound(
bound?: string | number | null,
): number | undefined {
if (bound === undefined || bound === null || Number.isNaN(Number(bound))) {
diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/utils/series.ts b/superset-frontend/plugins/plugin-chart-echarts/src/utils/series.ts
index bd4e329d0b..aa353f66d1 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/utils/series.ts
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/utils/series.ts
@@ -543,3 +543,17 @@ export function calculateLowerLogTick(minPositiveValue: number) {
const logBase10 = Math.floor(Math.log10(minPositiveValue));
return Math.pow(10, logBase10);
}
+
+export function getMinAndMaxFromBounds(
+ axisType: AxisType,
+ truncateAxis: boolean,
+ min?: number,
+ max?: number,
+): { min: number | 'dataMin'; max: number | 'dataMax' } | {} {
+ return truncateAxis && axisType === AxisType.value
+ ? {
+ min: min === undefined ? 'dataMin' : min,
+ max: max === undefined ? 'dataMax' : max,
+ }
+ : {};
+}
diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/utils/controls.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/utils/controls.test.ts
index 60ced57739..cb0faac595 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/test/utils/controls.test.ts
+++ b/superset-frontend/plugins/plugin-chart-echarts/test/utils/controls.test.ts
@@ -16,22 +16,22 @@
* specific language governing permissions and limitations
* under the License.
*/
-import { parseYAxisBound } from '../../src/utils/controls';
+import { parseAxisBound } from '../../src/utils/controls';
describe('parseYAxisBound', () => {
it('should return undefined for invalid values', () => {
- expect(parseYAxisBound(null)).toBeUndefined();
- expect(parseYAxisBound(undefined)).toBeUndefined();
- expect(parseYAxisBound(NaN)).toBeUndefined();
- expect(parseYAxisBound('abc')).toBeUndefined();
+ expect(parseAxisBound(null)).toBeUndefined();
+ expect(parseAxisBound(undefined)).toBeUndefined();
+ expect(parseAxisBound(NaN)).toBeUndefined();
+ expect(parseAxisBound('abc')).toBeUndefined();
});
it('should return numeric value for valid values', () => {
- expect(parseYAxisBound(0)).toEqual(0);
- expect(parseYAxisBound('0')).toEqual(0);
- expect(parseYAxisBound(1)).toEqual(1);
- expect(parseYAxisBound('1')).toEqual(1);
- expect(parseYAxisBound(10.1)).toEqual(10.1);
- expect(parseYAxisBound('10.1')).toEqual(10.1);
+ expect(parseAxisBound(0)).toEqual(0);
+ expect(parseAxisBound('0')).toEqual(0);
+ expect(parseAxisBound(1)).toEqual(1);
+ expect(parseAxisBound('1')).toEqual(1);
+ expect(parseAxisBound(10.1)).toEqual(10.1);
+ expect(parseAxisBound('10.1')).toEqual(10.1);
});
});
diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/utils/series.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/utils/series.test.ts
index 927ee49e8c..b445dceabb 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/test/utils/series.test.ts
+++ b/superset-frontend/plugins/plugin-chart-echarts/test/utils/series.test.ts
@@ -36,6 +36,7 @@ import {
getChartPadding,
getLegendProps,
getOverMaxHiddenFormatter,
+ getMinAndMaxFromBounds,
sanitizeHtml,
sortAndFilterSeries,
sortRows,
@@ -879,3 +880,30 @@ test('getAxisType', () => {
expect(getAxisType(GenericDataType.BOOLEAN)).toEqual(AxisType.category);
expect(getAxisType(GenericDataType.STRING)).toEqual(AxisType.category);
});
+
+test('getMinAndMaxFromBounds returns empty object when not truncating', () => {
+ expect(getMinAndMaxFromBounds(AxisType.value, false, 10, 100)).toEqual({});
+});
+
+test('getMinAndMaxFromBounds returns automatic bounds when truncating', () => {
+ expect(
+ getMinAndMaxFromBounds(AxisType.value, true, undefined, undefined),
+ ).toEqual({
+ min: 'dataMin',
+ max: 'dataMax',
+ });
+});
+
+test('getMinAndMaxFromBounds returns automatic upper bound when truncating', () => {
+ expect(getMinAndMaxFromBounds(AxisType.value, true, 10, undefined)).toEqual({
+ min: 10,
+ max: 'dataMax',
+ });
+});
+
+test('getMinAndMaxFromBounds returns automatic lower bound when truncating', () => {
+ expect(getMinAndMaxFromBounds(AxisType.value, true, undefined, 100)).toEqual({
+ min: 'dataMin',
+ max: 100,
+ });
+});
diff --git a/superset/dashboards/schemas.py b/superset/dashboards/schemas.py
index 9a6bcfb456..ab4ec819b4 100644
--- a/superset/dashboards/schemas.py
+++ b/superset/dashboards/schemas.py
@@ -203,7 +203,7 @@ class DashboardGetResponseSchema(Schema):
changed_on_humanized = fields.String(data_key="changed_on_delta_humanized")
is_managed_externally = fields.Boolean(allow_none=True, dump_default=False)
- # pylint: disable=unused-argument
+ # pylint: disable=unused-argument, no-self-use
@post_dump()
def post_dump(self, serialized: dict[str, Any], **kwargs: Any) -> dict[str, Any]:
if security_manager.is_guest_user():
@@ -260,7 +260,7 @@ class DashboardDatasetSchema(Schema):
granularity_sqla = fields.List(fields.List(fields.Str()))
normalize_columns = fields.Bool()
- # pylint: disable=unused-argument
+ # pylint: disable=unused-argument, no-self-use
@post_dump()
def post_dump(self, serialized: dict[str, Any], **kwargs: Any) -> dict[str, Any]:
if security_manager.is_guest_user():
@@ -270,7 +270,7 @@ class DashboardDatasetSchema(Schema):
class BaseDashboardSchema(Schema):
- # pylint: disable=no-self-use,unused-argument
+ # pylint: disable=no-self-use, unused-argument
@post_load
def post_load(self, data: dict[str, Any], **kwargs: Any) -> dict[str, Any]:
if data.get("slug"):