You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by vi...@apache.org on 2023/03/06 09:26:00 UTC

[superset] branch master updated: fix(plugin-chart-echarts): render horizontal categories from top (#23273)

This is an automated email from the ASF dual-hosted git repository.

villebro pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git


The following commit(s) were added to refs/heads/master by this push:
     new 71a9d0d403 fix(plugin-chart-echarts): render horizontal categories from top (#23273)
71a9d0d403 is described below

commit 71a9d0d403e122a0c8115f829883151fdcd1d4f1
Author: Ville Brofeldt <33...@users.noreply.github.com>
AuthorDate: Mon Mar 6 11:25:52 2023 +0200

    fix(plugin-chart-echarts): render horizontal categories from top (#23273)
---
 .../src/Timeseries/transformProps.ts               |   1 +
 .../test/Timeseries/transformProps.test.ts         |  38 +++++++
 ...ac08bb5b83_invert_horizontal_bar_chart_order.py | 126 +++++++++++++++++++++
 3 files changed, 165 insertions(+)

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 eadded44a9..8e198cc5f2 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts
@@ -370,6 +370,7 @@ export default function transformProps(
   if (isHorizontal) {
     [xAxis, yAxis] = [yAxis, xAxis];
     [padding.bottom, padding.left] = [padding.left, padding.bottom];
+    yAxis.inverse = true;
   }
 
   const echartOptions: EChartsCoreOption = {
diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/Timeseries/transformProps.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/Timeseries/transformProps.test.ts
index df48354a81..b185c3a767 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/test/Timeseries/transformProps.test.ts
+++ b/superset-frontend/plugins/plugin-chart-echarts/test/Timeseries/transformProps.test.ts
@@ -87,6 +87,44 @@ describe('EchartsTimeseries transformProps', () => {
     );
   });
 
+  it('should transform chart props for horizontal viz', () => {
+    const chartProps = new ChartProps({
+      ...chartPropsConfig,
+      formData: {
+        ...formData,
+        orientation: 'horizontal',
+      },
+    });
+    expect(transformProps(chartProps as EchartsTimeseriesChartProps)).toEqual(
+      expect.objectContaining({
+        width: 800,
+        height: 600,
+        echartOptions: expect.objectContaining({
+          legend: expect.objectContaining({
+            data: ['San Francisco', 'New York'],
+          }),
+          series: expect.arrayContaining([
+            expect.objectContaining({
+              data: [
+                [1, 599616000000],
+                [3, 599916000000],
+              ],
+              name: 'San Francisco',
+            }),
+            expect.objectContaining({
+              data: [
+                [2, 599616000000],
+                [4, 599916000000],
+              ],
+              name: 'New York',
+            }),
+          ]),
+          yAxis: expect.objectContaining({ inverse: true }),
+        }),
+      }),
+    );
+  });
+
   it('should add a formula annotation to viz', () => {
     const formula: FormulaAnnotationLayer = {
       name: 'My Formula',
diff --git a/superset/migrations/versions/2023-03-05_10-06_d0ac08bb5b83_invert_horizontal_bar_chart_order.py b/superset/migrations/versions/2023-03-05_10-06_d0ac08bb5b83_invert_horizontal_bar_chart_order.py
new file mode 100644
index 0000000000..6003c70d69
--- /dev/null
+++ b/superset/migrations/versions/2023-03-05_10-06_d0ac08bb5b83_invert_horizontal_bar_chart_order.py
@@ -0,0 +1,126 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+"""invert_horizontal_bar_chart_order
+
+Revision ID: d0ac08bb5b83
+Revises: c0a3ea245b61
+Create Date: 2023-03-05 10:06:23.250310
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = "d0ac08bb5b83"
+down_revision = "c0a3ea245b61"
+
+import json
+
+import sqlalchemy as sa
+from alembic import op
+from sqlalchemy import and_, Column, Integer, String, Text
+from sqlalchemy.ext.declarative import declarative_base
+
+from superset import db
+
+Base = declarative_base()
+
+ORIENTATION = "horizontal"
+CHART_TYPE = "echarts_timeseries_bar"
+
+
+class Slice(Base):
+    """Declarative class to do query in upgrade"""
+
+    __tablename__ = "slices"
+    id = Column(Integer, primary_key=True)
+    viz_type = Column(String(250))
+    params = Column(Text)
+
+
+def upgrade():
+    bind = op.get_bind()
+    session = db.Session(bind=bind)
+
+    slices = (
+        session.query(Slice)
+        .filter(
+            and_(
+                Slice.viz_type == CHART_TYPE,
+                Slice.params.like("%x_axis_sort%"),
+                Slice.params.like("%x_axis_sort_asc%"),
+                Slice.params.like(f"%{ORIENTATION}%"),
+            )
+        )
+        .all()
+    )
+    changes = 0
+    for slc in slices:
+        try:
+            params = json.loads(slc.params)
+            orientation = params.get("orientation")
+            x_axis_sort = params.get("x_axis_sort")
+            x_axis_sort_asc = params.get("x_axis_sort_asc", None)
+            if orientation == ORIENTATION and x_axis_sort:
+                changes += 1
+                params["x_axis_sort_asc"] = not x_axis_sort_asc
+                slc.params = json.dumps(params, sort_keys=True)
+        except Exception as e:
+            print(e)
+            print(f"Parsing params for slice {slc.id} failed.")
+            pass
+
+    session.commit()
+    session.close()
+    if changes:
+        print(f"Updated {changes} bar chart sort orders.")
+
+
+def downgrade():
+    bind = op.get_bind()
+    session = db.Session(bind=bind)
+
+    slices = (
+        session.query(Slice)
+        .filter(
+            and_(
+                Slice.viz_type == CHART_TYPE,
+                Slice.params.like("%x_axis_sort%"),
+                Slice.params.like("%x_axis_sort_asc%"),
+                Slice.params.like(f"%{ORIENTATION}%"),
+            )
+        )
+        .all()
+    )
+    changes = 0
+    for slc in slices:
+        try:
+            params = json.loads(slc.params)
+            orientation = params.get("orientation")
+            x_axis_sort = params.get("x_axis_sort")
+            x_axis_sort_asc = params.pop("x_axis_sort_asc", None)
+            if orientation == ORIENTATION and x_axis_sort:
+                changes += 1
+                params["x_axis_sort_asc"] = not x_axis_sort_asc
+                slc.params = json.dumps(params, sort_keys=True)
+        except Exception as e:
+            print(e)
+            print(f"Parsing params for slice {slc.id} failed.")
+            pass
+
+    session.commit()
+    session.close()
+    if changes:
+        print(f"Updated {changes} bar chart sort orders.")