From 18d13318a20b9b6025edcaa9cde19d82bf2e3ffe Mon Sep 17 00:00:00 2001 From: Claude Code Date: Fri, 24 Jul 2026 03:16:39 -0700 Subject: [PATCH 1/3] chore(viz)!: rebuild the Nightingale Rose on ECharts and remove nvd3 entirely Replaces the d3/nvd3-fork rose renderer with an ECharts implementation: stacked bar series on polar coordinates reproduce the per-period sectors with radially stacked groups, in both radius- and area-proportional modes (area mode plots sqrt-normalized increments on a unit radius axis so wedge area encodes the value, matching the legacy proportion math). Rich and plain tooltips, the time-period axis labels, legend toggling and the theme-aware text all come along, and the legacy click-to-expand interaction survives as a drill: clicking a sector morphs that period into a full pie via universalTransition, and clicking again returns. Control names, buildQuery and the transformData reshape (with its tests) carry over unchanged, so saved charts keep working with no migration. The plugin-chart-rose package is deleted, which removes the last consumer of nvd3-fork: nvd3 is now entirely out of the dependency tree. Co-Authored-By: Claude Fable 5 --- superset-frontend/package-lock.json | 31 - superset-frontend/package.json | 1 - .../src/Rose/EchartsRose.tsx | 138 +++ .../src/Rose}/buildQuery.ts | 0 .../src/Rose}/controlPanel.tsx | 0 .../src/Rose}/images/example1-dark.jpg | Bin .../src/Rose}/images/example1.jpg | Bin .../src/Rose}/images/example2-dark.jpg | Bin .../src/Rose}/images/example2.jpg | Bin .../src/Rose/images/thumbnail-dark.png | Bin 0 -> 49918 bytes .../src/Rose/images/thumbnail.png | Bin 0 -> 48636 bytes .../src/Rose}/images/thumbnailLarge.png | Bin .../src/Rose}/index.ts | 64 +- .../src/Rose}/transformData.ts | 0 .../src/Rose/transformProps.ts | 212 ++++ .../plugin-chart-echarts/src/Rose/types.ts | 73 ++ .../plugins/plugin-chart-echarts/src/index.ts | 1 + .../test/Rose}/buildQuery.test.ts | 2 +- .../test/Rose}/controlPanel.test.ts | 2 +- .../test/Rose}/transformData.test.ts | 2 +- .../test/Rose/transformProps.test.ts | 151 +++ .../plugins/plugin-chart-rose/CHANGELOG.md | 61 -- .../plugins/plugin-chart-rose/README.md | 52 - .../plugins/plugin-chart-rose/package.json | 40 - .../plugin-chart-rose/src/ReactRose.tsx | 88 -- .../plugins/plugin-chart-rose/src/Rose.ts | 697 ------------- .../src/images/thumbnail-dark.png | Bin 83147 -> 0 bytes .../src/images/thumbnail.png | Bin 27928 -> 0 bytes .../src/stories/Rose.stories.tsx | 95 -- .../plugin-chart-rose/src/stories/data.ts | 950 ------------------ .../plugin-chart-rose/src/transformProps.ts | 66 -- .../plugins/plugin-chart-rose/tsconfig.json | 25 - .../plugin-chart-rose/types/external.d.ts | 28 - .../scripts/check-custom-rules.js | 2 +- .../src/visualizations/presets/MainPreset.ts | 4 +- superset-frontend/tsconfig.json | 1 - 36 files changed, 616 insertions(+), 2170 deletions(-) create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Rose/EchartsRose.tsx rename superset-frontend/plugins/{plugin-chart-rose/src => plugin-chart-echarts/src/Rose}/buildQuery.ts (100%) rename superset-frontend/plugins/{plugin-chart-rose/src => plugin-chart-echarts/src/Rose}/controlPanel.tsx (100%) rename superset-frontend/plugins/{plugin-chart-rose/src => plugin-chart-echarts/src/Rose}/images/example1-dark.jpg (100%) rename superset-frontend/plugins/{plugin-chart-rose/src => plugin-chart-echarts/src/Rose}/images/example1.jpg (100%) rename superset-frontend/plugins/{plugin-chart-rose/src => plugin-chart-echarts/src/Rose}/images/example2-dark.jpg (100%) rename superset-frontend/plugins/{plugin-chart-rose/src => plugin-chart-echarts/src/Rose}/images/example2.jpg (100%) create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Rose/images/thumbnail-dark.png create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Rose/images/thumbnail.png rename superset-frontend/plugins/{plugin-chart-rose/src => plugin-chart-echarts/src/Rose}/images/thumbnailLarge.png (100%) rename superset-frontend/plugins/{plugin-chart-rose/src => plugin-chart-echarts/src/Rose}/index.ts (52%) rename superset-frontend/plugins/{plugin-chart-rose/src => plugin-chart-echarts/src/Rose}/transformData.ts (100%) create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Rose/transformProps.ts create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Rose/types.ts rename superset-frontend/plugins/{plugin-chart-rose/test => plugin-chart-echarts/test/Rose}/buildQuery.test.ts (98%) rename superset-frontend/plugins/{plugin-chart-rose/test => plugin-chart-echarts/test/Rose}/controlPanel.test.ts (94%) rename superset-frontend/plugins/{plugin-chart-rose/test => plugin-chart-echarts/test/Rose}/transformData.test.ts (98%) create mode 100644 superset-frontend/plugins/plugin-chart-echarts/test/Rose/transformProps.test.ts delete mode 100644 superset-frontend/plugins/plugin-chart-rose/CHANGELOG.md delete mode 100644 superset-frontend/plugins/plugin-chart-rose/README.md delete mode 100644 superset-frontend/plugins/plugin-chart-rose/package.json delete mode 100644 superset-frontend/plugins/plugin-chart-rose/src/ReactRose.tsx delete mode 100644 superset-frontend/plugins/plugin-chart-rose/src/Rose.ts delete mode 100644 superset-frontend/plugins/plugin-chart-rose/src/images/thumbnail-dark.png delete mode 100644 superset-frontend/plugins/plugin-chart-rose/src/images/thumbnail.png delete mode 100644 superset-frontend/plugins/plugin-chart-rose/src/stories/Rose.stories.tsx delete mode 100644 superset-frontend/plugins/plugin-chart-rose/src/stories/data.ts delete mode 100644 superset-frontend/plugins/plugin-chart-rose/src/transformProps.ts delete mode 100644 superset-frontend/plugins/plugin-chart-rose/tsconfig.json delete mode 100644 superset-frontend/plugins/plugin-chart-rose/types/external.d.ts diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index 92c8b9919237..6e82301bbfa5 100644 --- a/superset-frontend/package-lock.json +++ b/superset-frontend/package-lock.json @@ -64,7 +64,6 @@ "@superset-ui/plugin-chart-partition": "file:./plugins/plugin-chart-partition", "@superset-ui/plugin-chart-pivot-table": "file:./plugins/plugin-chart-pivot-table", "@superset-ui/plugin-chart-point-cluster-map": "file:./plugins/plugin-chart-point-cluster-map", - "@superset-ui/plugin-chart-rose": "file:./plugins/plugin-chart-rose", "@superset-ui/plugin-chart-table": "file:./plugins/plugin-chart-table", "@superset-ui/plugin-chart-word-cloud": "file:./plugins/plugin-chart-word-cloud", "@superset-ui/plugin-chart-world-map": "file:./plugins/plugin-chart-world-map", @@ -10821,10 +10820,6 @@ "resolved": "plugins/plugin-chart-point-cluster-map", "link": true }, - "node_modules/@superset-ui/plugin-chart-rose": { - "resolved": "plugins/plugin-chart-rose", - "link": true - }, "node_modules/@superset-ui/plugin-chart-table": { "resolved": "plugins/plugin-chart-table", "link": true @@ -31479,15 +31474,6 @@ "fflate": "^0.8.0" } }, - "node_modules/nvd3-fork": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/nvd3-fork/-/nvd3-fork-2.0.5.tgz", - "integrity": "sha512-Sq3q2rvR/9FJ35LVmqdQJAnfmD15BaIHSBg5wZZL/WLcq/nthff8ukabwFdbW0zeE1c/yPq+DKl6MxnUTR45DA==", - "license": "Apache-2.0", - "peerDependencies": { - "d3": "^3.4.4" - } - }, "node_modules/nwsapi": { "version": "2.2.23", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", @@ -44513,23 +44499,6 @@ "react-dom": "^18.3.0" } }, - "plugins/plugin-chart-rose": { - "name": "@superset-ui/plugin-chart-rose", - "version": "0.20.3", - "license": "Apache-2.0", - "dependencies": { - "d3": "^3.5.17", - "nvd3-fork": "^2.0.5", - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "@apache-superset/core": "*", - "@emotion/react": "^11.4.1", - "@superset-ui/chart-controls": "*", - "@superset-ui/core": "*", - "react": "^18.3.0" - } - }, "plugins/plugin-chart-table": { "name": "@superset-ui/plugin-chart-table", "version": "0.20.3", diff --git a/superset-frontend/package.json b/superset-frontend/package.json index 6cf4063f50d4..3e2f34a89630 100644 --- a/superset-frontend/package.json +++ b/superset-frontend/package.json @@ -143,7 +143,6 @@ "@superset-ui/plugin-chart-paired-t-test": "file:./plugins/plugin-chart-paired-t-test", "@superset-ui/plugin-chart-parallel-coordinates": "file:./plugins/plugin-chart-parallel-coordinates", "@superset-ui/plugin-chart-partition": "file:./plugins/plugin-chart-partition", - "@superset-ui/plugin-chart-rose": "file:./plugins/plugin-chart-rose", "@superset-ui/plugin-chart-world-map": "file:./plugins/plugin-chart-world-map", "@superset-ui/plugin-chart-ag-grid-table": "file:./plugins/plugin-chart-ag-grid-table", "@superset-ui/plugin-chart-cartodiagram": "file:./plugins/plugin-chart-cartodiagram", diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Rose/EchartsRose.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/EchartsRose.tsx new file mode 100644 index 000000000000..d7c3dd8f4f47 --- /dev/null +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/EchartsRose.tsx @@ -0,0 +1,138 @@ +/** + * 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. + */ +import { useMemo, useState } from 'react'; +import { + CategoricalColorNamespace, + getNumberFormatter, + sanitizeHtml, +} from '@superset-ui/core'; +import { t } from '@apache-superset/core/translation'; +import { useTheme } from '@apache-superset/core/theme'; +import type { EChartsCoreOption } from 'echarts/core'; +import Echart from '../components/Echart'; +import { allEventHandlers } from '../utils/eventHandlers'; +import { RoseChartTransformedProps } from './types'; + +/** + * Renders the polar rose, and drills a clicked time period into a full + * pie of that period's series (morphing via universalTransition), like + * the legacy chart's click-to-expand interaction. Clicking again + * returns to the rose. + */ +export default function EchartsRose(props: RoseChartTransformedProps) { + const { + height, + width, + echartOptions, + refs, + formData, + periods, + seriesNames, + numberFormat, + sliceId, + colorScheme, + } = props; + const theme = useTheme(); + const [drillIndex, setDrillIndex] = useState(null); + + const activeOptions = useMemo((): EChartsCoreOption => { + const period = drillIndex !== null ? periods[drillIndex] : undefined; + if (!period) { + return echartOptions; + } + const colorFn = CategoricalColorNamespace.getScale(colorScheme); + // getScale returns a fresh scale whose colors assign in first-call + // order; prime it in series order so slice colors match the rose view. + seriesNames.forEach(name => colorFn(name, sliceId)); + const format = getNumberFormatter(numberFormat); + // The legacy pie ordered slices largest-first + const slices = [...period.entries].sort((a, b) => b.value - a.value); + return { + legend: echartOptions.legend, + title: { + text: t('%s — click the chart to return', period.label), + left: 'center', + bottom: 0, + textStyle: { + color: theme.colorTextSecondary, + fontSize: theme.fontSizeSM, + fontWeight: 'normal', + }, + }, + tooltip: { + confine: true, + formatter: (params: { name: string; value: number; percent: number }) => + `
${period.label}
${sanitizeHtml(params.name)}: ${format( + params.value, + )} (${params.percent}%)`, + }, + series: [ + { + id: 'rose-pie', + type: 'pie', + radius: ['7.5%', '72%'], + center: ['50%', '54%'], + // hide labels of slivers, like the legacy 5% label threshold + minShowLabelAngle: 18, + universalTransition: { enabled: true }, + label: { color: theme.colorText }, + itemStyle: { + borderColor: theme.colorBgContainer, + borderWidth: 1, + }, + data: slices.map(entry => ({ + name: entry.seriesName, + value: entry.value, + groupId: entry.seriesName, + itemStyle: { color: colorFn(entry.seriesName, sliceId) }, + })), + }, + ], + }; + }, [ + drillIndex, + periods, + seriesNames, + echartOptions, + colorScheme, + numberFormat, + sliceId, + theme, + ]); + + const eventHandlers = { + ...allEventHandlers(props), + click: (params: { dataIndex?: number }) => { + setDrillIndex(current => + current === null ? (params.dataIndex ?? null) : null, + ); + }, + }; + + return ( + + ); +} diff --git a/superset-frontend/plugins/plugin-chart-rose/src/buildQuery.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/buildQuery.ts similarity index 100% rename from superset-frontend/plugins/plugin-chart-rose/src/buildQuery.ts rename to superset-frontend/plugins/plugin-chart-echarts/src/Rose/buildQuery.ts diff --git a/superset-frontend/plugins/plugin-chart-rose/src/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/controlPanel.tsx similarity index 100% rename from superset-frontend/plugins/plugin-chart-rose/src/controlPanel.tsx rename to superset-frontend/plugins/plugin-chart-echarts/src/Rose/controlPanel.tsx diff --git a/superset-frontend/plugins/plugin-chart-rose/src/images/example1-dark.jpg b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/images/example1-dark.jpg similarity index 100% rename from superset-frontend/plugins/plugin-chart-rose/src/images/example1-dark.jpg rename to superset-frontend/plugins/plugin-chart-echarts/src/Rose/images/example1-dark.jpg diff --git a/superset-frontend/plugins/plugin-chart-rose/src/images/example1.jpg b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/images/example1.jpg similarity index 100% rename from superset-frontend/plugins/plugin-chart-rose/src/images/example1.jpg rename to superset-frontend/plugins/plugin-chart-echarts/src/Rose/images/example1.jpg diff --git a/superset-frontend/plugins/plugin-chart-rose/src/images/example2-dark.jpg b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/images/example2-dark.jpg similarity index 100% rename from superset-frontend/plugins/plugin-chart-rose/src/images/example2-dark.jpg rename to superset-frontend/plugins/plugin-chart-echarts/src/Rose/images/example2-dark.jpg diff --git a/superset-frontend/plugins/plugin-chart-rose/src/images/example2.jpg b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/images/example2.jpg similarity index 100% rename from superset-frontend/plugins/plugin-chart-rose/src/images/example2.jpg rename to superset-frontend/plugins/plugin-chart-echarts/src/Rose/images/example2.jpg diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Rose/images/thumbnail-dark.png b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/images/thumbnail-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..905d06eef383cc6c7e348e30bc8fac1b3fa5158e GIT binary patch literal 49918 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 WEDtF|u)+iXfshoH6R8x^3-~{kqq7kJ literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Rose/images/thumbnail.png b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/images/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..868736259a3411be5c3a2500caea4ff76ff3ca27 GIT binary patch literal 48636 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 N3bLvns-(?A{s%QZtM~u_ literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/plugin-chart-rose/src/images/thumbnailLarge.png b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/images/thumbnailLarge.png similarity index 100% rename from superset-frontend/plugins/plugin-chart-rose/src/images/thumbnailLarge.png rename to superset-frontend/plugins/plugin-chart-echarts/src/Rose/images/thumbnailLarge.png diff --git a/superset-frontend/plugins/plugin-chart-rose/src/index.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/index.ts similarity index 52% rename from superset-frontend/plugins/plugin-chart-rose/src/index.ts rename to superset-frontend/plugins/plugin-chart-echarts/src/Rose/index.ts index ad6bc2e7e689..c31f00a06be6 100644 --- a/superset-frontend/plugins/plugin-chart-rose/src/index.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/index.ts @@ -17,7 +17,9 @@ * under the License. */ import { t } from '@apache-superset/core/translation'; -import { ChartMetadata, ChartPlugin } from '@superset-ui/core'; +import { Behavior } from '@superset-ui/core'; +import buildQuery from './buildQuery'; +import controlPanel from './controlPanel'; import transformProps from './transformProps'; import thumbnail from './images/thumbnail.png'; import thumbnailDark from './images/thumbnail-dark.png'; @@ -25,38 +27,42 @@ import example1 from './images/example1.jpg'; import example1Dark from './images/example1-dark.jpg'; import example2 from './images/example2.jpg'; import example2Dark from './images/example2-dark.jpg'; -import controlPanel from './controlPanel'; - -const metadata = new ChartMetadata({ - category: t('Ranking'), - description: t( - 'A polar coordinate chart where the circle is broken into wedges of equal angle, and the value represented by any wedge is illustrated by its area, rather than its radius or sweep angle.', - ), - exampleGallery: [ - { url: example1, urlDark: example1Dark }, - { url: example2, urlDark: example2Dark }, - ], - name: t('Nightingale Rose Chart'), - tags: [ - t('Advanced-Analytics'), - t('Circular'), - t('Multi-Layers'), - t('Pattern'), - t('Time'), - t('Trend'), - ], - thumbnail, - thumbnailDark, -}); +import { EchartsRoseFormData, EchartsRoseChartProps } from './types'; +import { EchartsChartPlugin } from '../types'; -export default class RoseChartPlugin extends ChartPlugin { +export default class EchartsRoseChartPlugin extends EchartsChartPlugin< + EchartsRoseFormData, + EchartsRoseChartProps +> { constructor() { super({ - loadChart: () => import('./ReactRose'), - loadBuildQuery: () => import('./buildQuery'), - metadata, - transformProps, + buildQuery, controlPanel, + loadChart: () => import('./EchartsRose'), + metadata: { + behaviors: [Behavior.InteractiveChart], + category: t('Ranking'), + description: t( + 'A polar coordinate chart where the circle is broken into wedges of equal angle, and the value represented by any wedge is illustrated by its area, rather than its radius or sweep angle. Click a wedge to expand its time period into a full pie.', + ), + exampleGallery: [ + { url: example1, urlDark: example1Dark }, + { url: example2, urlDark: example2Dark }, + ], + name: t('Nightingale Rose Chart'), + tags: [ + t('Advanced-Analytics'), + t('Circular'), + t('Multi-Layers'), + t('Pattern'), + t('Time'), + t('Trend'), + t('ECharts'), + ], + thumbnail, + thumbnailDark, + }, + transformProps, }); } } diff --git a/superset-frontend/plugins/plugin-chart-rose/src/transformData.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/transformData.ts similarity index 100% rename from superset-frontend/plugins/plugin-chart-rose/src/transformData.ts rename to superset-frontend/plugins/plugin-chart-echarts/src/Rose/transformData.ts diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Rose/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/transformProps.ts new file mode 100644 index 000000000000..993bf18425bf --- /dev/null +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/transformProps.ts @@ -0,0 +1,212 @@ +/** + * 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. + */ +import { + CategoricalColorNamespace, + ensureIsArray, + getMetricLabel, + getNumberFormatter, + getTimeFormatter, + QueryFormMetric, + sanitizeHtml, +} from '@superset-ui/core'; +import type { EChartsCoreOption } from 'echarts/core'; +import { Refs } from '../types'; +import transformData, { RoseEntry } from './transformData'; +import { + EchartsRoseChartProps, + RoseChartTransformedProps, + RosePeriod, +} from './types'; + +const displayName = (name: RoseEntry['name']): string => + Array.isArray(name) ? name.join(', ') : String(name); + +export default function transformProps( + chartProps: EchartsRoseChartProps, +): RoseChartTransformedProps { + const { width, height, formData, queriesData, theme, hooks } = chartProps; + const { + colorScheme, + dateTimeFormat, + numberFormat, + richTooltip, + roseAreaProportion, + sliceId, + metrics, + timeCompare, + comparisonType, + } = formData; + const refs: Refs = {}; + const { onContextMenu, setDataMask = () => {} } = hooks; + + const records = (queriesData[0]?.data ?? []) as Record[]; + const datum = transformData(records, { + metricLabels: ensureIsArray(metrics as QueryFormMetric[]).map( + getMetricLabel, + ), + timeCompare: ensureIsArray(timeCompare), + comparisonType: + comparisonType === 'absolute' ? 'difference' : comparisonType, + }); + + const format = getNumberFormatter(numberFormat); + const timeFormat = getTimeFormatter(dateTimeFormat); + const colorFn = CategoricalColorNamespace.getScale(colorScheme); + + const times = Object.keys(datum) + .map(t => parseInt(t, 10)) + .sort((a, b) => a - b); + const seriesNames = (datum[times[0]] ?? []).map(entry => + displayName(entry.name), + ); + + // The largest per-period sum sets the full radius, like the legacy + // renderer's maxRadius/maxSum proportion. + const sums = times.map(time => + (datum[time] ?? []).reduce((acc, entry) => acc + entry.value, 0), + ); + const maxSum = Math.max(...sums, 0) || 1; + + // In area-proportional mode a wedge's AREA encodes its value, so the + // stacked outer radius is sqrt(cumsum/maxSum) on a [0, 1] radius axis; + // each series plots the increment between consecutive outer radii. In + // radius mode the raw values stack linearly and the axis normalizes. + const periods: RosePeriod[] = times.map(time => { + let cumulative = 0; + let previousOuter = 0; + const entries = (datum[time] ?? []).map(entry => { + cumulative += entry.value; + const outer = roseAreaProportion + ? Math.sqrt(cumulative / maxSum) + : cumulative; + const increment = outer - previousOuter; + previousOuter = outer; + return { + seriesName: displayName(entry.name), + value: entry.value, + increment, + }; + }); + return { time, label: String(timeFormat(time)), entries }; + }); + + const tooltipRows = (dataIndex: number, highlightSeries?: string): string => { + const period = periods[dataIndex]; + if (!period) return ''; + const rows = period.entries + .map(entry => { + const marker = ``; + const emphasis = + entry.seriesName === highlightSeries ? 'font-weight:bold' : ''; + return `

`; + }) + .join(''); + return `
${period.label}
${rows}`; + }; + + const echartOptions: EChartsCoreOption = { + legend: { + top: 0, + type: 'scroll', + data: seriesNames, + }, + polar: { radius: ['0%', '72%'], center: ['50%', '54%'] }, + angleAxis: { + type: 'category', + data: periods.map(period => period.label), + startAngle: 90, + axisLine: { show: false }, + axisTick: { show: false }, + axisLabel: { color: theme.colorText }, + splitLine: { show: false }, + z: 10, + }, + radiusAxis: { + type: 'value', + ...(roseAreaProportion && { max: 1 }), + axisLine: { show: false }, + axisTick: { show: false }, + axisLabel: { show: false }, + splitLine: { show: false }, + }, + tooltip: { + confine: true, + ...(richTooltip + ? { + formatter: (params: { dataIndex: number; seriesName: string }) => + tooltipRows(params.dataIndex, params.seriesName), + } + : { + formatter: (params: { dataIndex: number; seriesName: string }) => { + const period = periods[params.dataIndex]; + const entry = period?.entries.find( + e => e.seriesName === params.seriesName, + ); + if (!period || !entry) return ''; + return `
${period.label}
${sanitizeHtml(params.seriesName)}: ${format(entry.value)}`; + }, + }), + }, + series: seriesNames.map(name => ({ + id: `rose-${name}`, + name, + type: 'bar', + coordinateSystem: 'polar', + stack: 'rose', + // sectors span their full period angle, edge to edge + barCategoryGap: '0%', + // morphs into the period pie when a sector is drilled into + universalTransition: { enabled: true }, + dataGroupId: name, + itemStyle: { + color: colorFn(name, sliceId), + borderColor: theme.colorBgContainer, + borderWidth: 1, + }, + emphasis: { focus: 'none' }, + data: periods.map(period => { + const entry = period.entries.find(e => e.seriesName === name); + return { value: entry?.increment ?? 0, groupId: name }; + }), + })), + }; + + return { + width, + height, + echartOptions, + formData, + onContextMenu, + setDataMask, + selectedValues: {}, + groupby: [], + labelMap: {}, + refs, + periods, + seriesNames, + numberFormat, + sliceId, + colorScheme, + }; +} diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Rose/types.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/types.ts new file mode 100644 index 000000000000..94a9e6edae52 --- /dev/null +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/types.ts @@ -0,0 +1,73 @@ +/** + * 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. + */ +import { + QueryFormColumn, + QueryFormData, + QueryFormMetric, +} from '@superset-ui/core'; +import { + BaseChartProps, + BaseTransformedProps, + CrossFilterTransformedProps, +} from '../types'; + +export type EchartsRoseFormData = QueryFormData & { + metrics?: QueryFormMetric[]; + groupby?: QueryFormColumn[]; + colorScheme?: string; + dateTimeFormat?: string; + numberFormat?: string; + richTooltip?: boolean; + roseAreaProportion?: boolean; + timeCompare?: string[]; + comparisonType?: string; +}; + +export interface EchartsRoseChartProps extends BaseChartProps { + formData: EchartsRoseFormData; +} + +/** One series' slice of one time period, precomputed for both views. */ +export interface RosePeriodDatum { + /** display name of the series */ + seriesName: string; + /** raw metric value */ + value: number; + /** radius increment plotted in the rose view (see transformProps) */ + increment: number; +} + +/** A single angular sector of the rose: one time period. */ +export interface RosePeriod { + /** epoch timestamp of the period */ + time: number; + /** formatted axis/tooltip label for the period */ + label: string; + entries: RosePeriodDatum[]; +} + +export type RoseChartTransformedProps = + BaseTransformedProps & + CrossFilterTransformedProps & { + periods: RosePeriod[]; + seriesNames: string[]; + numberFormat?: string; + sliceId?: number; + colorScheme?: string; + }; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/index.ts b/superset-frontend/plugins/plugin-chart-echarts/src/index.ts index 2b712c042ddc..cada8312502f 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/index.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/index.ts @@ -17,6 +17,7 @@ * under the License. */ export { default as EchartsBoxPlotChartPlugin } from './BoxPlot'; +export { default as EchartsRoseChartPlugin } from './Rose'; export { default as EchartsTimePivotChartPlugin } from './TimePivot'; export { default as EchartsBulletChartPlugin } from './Bullet'; export { default as EchartsTimeseriesChartPlugin } from './Timeseries'; diff --git a/superset-frontend/plugins/plugin-chart-rose/test/buildQuery.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/Rose/buildQuery.test.ts similarity index 98% rename from superset-frontend/plugins/plugin-chart-rose/test/buildQuery.test.ts rename to superset-frontend/plugins/plugin-chart-echarts/test/Rose/buildQuery.test.ts index 7bdf21071ea5..e8ca387d594b 100644 --- a/superset-frontend/plugins/plugin-chart-rose/test/buildQuery.test.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/test/Rose/buildQuery.test.ts @@ -17,7 +17,7 @@ * under the License. */ import { QueryFormData } from '@superset-ui/core'; -import buildQuery from '../src/buildQuery'; +import buildQuery from '../../src/Rose/buildQuery'; const formData: QueryFormData = { datasource: '5__table', diff --git a/superset-frontend/plugins/plugin-chart-rose/test/controlPanel.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/Rose/controlPanel.test.ts similarity index 94% rename from superset-frontend/plugins/plugin-chart-rose/test/controlPanel.test.ts rename to superset-frontend/plugins/plugin-chart-echarts/test/Rose/controlPanel.test.ts index 48be0948bbf1..b2b17f368bef 100644 --- a/superset-frontend/plugins/plugin-chart-rose/test/controlPanel.test.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/test/Rose/controlPanel.test.ts @@ -17,7 +17,7 @@ * under the License. */ import { sections } from '@superset-ui/chart-controls'; -import controlPanel from '../src/controlPanel'; +import controlPanel from '../../src/Rose/controlPanel'; test('includes the legacy timeseries Time section (buildQuery can be is_timeseries)', () => { expect(controlPanel.controlPanelSections).toContain( diff --git a/superset-frontend/plugins/plugin-chart-rose/test/transformData.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/Rose/transformData.test.ts similarity index 98% rename from superset-frontend/plugins/plugin-chart-rose/test/transformData.test.ts rename to superset-frontend/plugins/plugin-chart-echarts/test/Rose/transformData.test.ts index 22ba3d78ffa1..c72c88c8d0e8 100644 --- a/superset-frontend/plugins/plugin-chart-rose/test/transformData.test.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/test/Rose/transformData.test.ts @@ -19,7 +19,7 @@ import transformData, { seriesKeyOf, splitFlatLabel, -} from '../src/transformData'; +} from '../../src/Rose/transformData'; const t1 = 1704067200000; const t2 = 1704153600000; diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/Rose/transformProps.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/Rose/transformProps.test.ts new file mode 100644 index 000000000000..fcfc2c93f545 --- /dev/null +++ b/superset-frontend/plugins/plugin-chart-echarts/test/Rose/transformProps.test.ts @@ -0,0 +1,151 @@ +/** + * 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. + */ +import { ChartProps, SqlaFormData, VizType } from '@superset-ui/core'; +import { supersetTheme } from '@apache-superset/core/theme'; +import transformProps from '../../src/Rose/transformProps'; +import { EchartsRoseChartProps } from '../../src/Rose/types'; + +const T1 = 1609459200000; // 2021-01-01 +const T2 = 1612137600000; // 2021-02-01 + +const formData: SqlaFormData = { + datasource: '1__table', + viz_type: VizType.Rose, + metrics: ['sum__num'], + groupby: ['region'], + numberFormat: 'SMART_NUMBER', + dateTimeFormat: 'smart_date', + richTooltip: true, + roseAreaProportion: false, +}; + +const records = [ + { __timestamp: T1, 'sum__num, East': 30, 'sum__num, West': 10 }, + { __timestamp: T2, 'sum__num, East': 10, 'sum__num, West': 10 }, +]; + +const chartProps = (overrides: Partial = {}) => + new ChartProps({ + width: 800, + height: 600, + formData: { ...formData, ...overrides }, + theme: supersetTheme, + queriesData: [{ data: records }], + hooks: {}, + }) as unknown as EchartsRoseChartProps; + +test('builds one stacked polar bar series per group', () => { + const { echartOptions, periods, seriesNames } = transformProps(chartProps()); + const { series, angleAxis } = echartOptions as any; + + // series keys drop the metric for grouped single-metric data + expect(seriesNames).toEqual(['East', 'West']); + expect(series).toHaveLength(2); + series.forEach((s: any) => { + expect(s.type).toBe('bar'); + expect(s.coordinateSystem).toBe('polar'); + expect(s.stack).toBe('rose'); + expect(s.universalTransition).toEqual({ enabled: true }); + }); + + // one angular sector per time period, in chronological order + expect(periods.map((p: any) => p.time)).toEqual([T1, T2]); + expect(angleAxis.data).toHaveLength(2); + + // radius mode stacks the raw values + expect(series[0].data.map((d: any) => d.value)).toEqual([30, 10]); + expect(series[1].data.map((d: any) => d.value)).toEqual([10, 10]); +}); + +test('area proportion plots sqrt-normalized increments on a unit axis', () => { + const { echartOptions, periods } = transformProps( + chartProps({ roseAreaProportion: true }), + ); + const { series, radiusAxis } = echartOptions as any; + + expect(radiusAxis.max).toBe(1); + // period 1: outer radii sqrt(30/40), sqrt(40/40); increments are their + // differences so the stacked outer edge encodes cumulative area + const sqrt30 = Math.sqrt(30 / 40); + expect(series[0].data[0].value).toBeCloseTo(sqrt30); + expect(series[1].data[0].value).toBeCloseTo(1 - sqrt30); + // the largest-sum period reaches the full unit radius + const outer = series[0].data[0].value + series[1].data[0].value; + expect(outer).toBeCloseTo(1); + expect(periods[0].entries.map((e: any) => e.value)).toEqual([30, 10]); +}); + +test('rich tooltip lists every series of the hovered period', () => { + const { echartOptions } = transformProps(chartProps()); + const html = (echartOptions as any).tooltip.formatter({ + dataIndex: 0, + seriesName: 'East', + }); + expect(html).toContain('East'); + expect(html).toContain('West'); + expect(html).toContain('30'); + expect(html).toContain('10'); +}); + +test('plain tooltip shows only the hovered series', () => { + const { echartOptions } = transformProps(chartProps({ richTooltip: false })); + const html = (echartOptions as any).tooltip.formatter({ + dataIndex: 0, + seriesName: 'West', + }); + expect(html).toContain('West'); + expect(html).not.toContain('East'); +}); + +test('sanitizes series names in tooltips', () => { + const evil = [ + { + __timestamp: T1, + 'sum__num, ': 5, + }, + ]; + const props = new ChartProps({ + width: 800, + height: 600, + formData, + theme: supersetTheme, + queriesData: [{ data: evil }], + hooks: {}, + }) as unknown as EchartsRoseChartProps; + const { echartOptions } = transformProps(props); + const html = (echartOptions as any).tooltip.formatter({ + dataIndex: 0, + seriesName: '', + }); + expect(html).not.toContain('onerror'); +}); + +test('handles empty results without crashing', () => { + const props = new ChartProps({ + width: 800, + height: 600, + formData, + theme: supersetTheme, + queriesData: [{ data: [] }], + hooks: {}, + }) as unknown as EchartsRoseChartProps; + const { echartOptions, periods } = transformProps(props); + expect(periods).toEqual([]); + expect((echartOptions as any).series).toEqual([]); +}); diff --git a/superset-frontend/plugins/plugin-chart-rose/CHANGELOG.md b/superset-frontend/plugins/plugin-chart-rose/CHANGELOG.md deleted file mode 100644 index 48f7ffb922d2..000000000000 --- a/superset-frontend/plugins/plugin-chart-rose/CHANGELOG.md +++ /dev/null @@ -1,61 +0,0 @@ - - -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -# [0.20.0](https://github.com/apache/superset/compare/v2021.41.0...v0.20.0) (2024-09-09) - -### Bug Fixes - -- **Dashboard:** Color inconsistency on refreshes and conflicts ([#27439](https://github.com/apache/superset/issues/27439)) ([313ee59](https://github.com/apache/superset/commit/313ee596f5435894f857d72be7269d5070c8c964)) -- **explore:** make SORT-Descending visible if Sort-by has value ([#17726](https://github.com/apache/superset/issues/17726)) ([d5768ab](https://github.com/apache/superset/commit/d5768ab649a70fd4f541ad4982498f622160b220)) - -### Features - -- apply standardized form data to tier 2 charts ([#20530](https://github.com/apache/superset/issues/20530)) ([de524bc](https://github.com/apache/superset/commit/de524bc59f011fd361dcdb7d35c2cb51f7eba442)) -- **explore:** improve UI in the control panel ([#19748](https://github.com/apache/superset/issues/19748)) ([e3a54aa](https://github.com/apache/superset/commit/e3a54aa3c15bdd0c970aa73f898288a408205c97)) -- improve color consistency (save all labels) ([#19038](https://github.com/apache/superset/issues/19038)) ([dc57508](https://github.com/apache/superset/commit/dc575080d7e43d40b1734bb8f44fdc291cb95b11)) -- update time comparison choices (again) ([#17968](https://github.com/apache/superset/issues/17968)) ([05d9cde](https://github.com/apache/superset/commit/05d9cde203b99f8c63106446f0be58668cc9f0c9)) -- update time comparison choices (again) ([#22458](https://github.com/apache/superset/issues/22458)) ([9e81c3a](https://github.com/apache/superset/commit/9e81c3a1192a18226d505178d16e1e395917a719)) - -# [0.19.0](https://github.com/apache/superset/compare/v2021.41.0...v0.19.0) (2024-09-07) - -### Bug Fixes - -- **Dashboard:** Color inconsistency on refreshes and conflicts ([#27439](https://github.com/apache/superset/issues/27439)) ([313ee59](https://github.com/apache/superset/commit/313ee596f5435894f857d72be7269d5070c8c964)) -- **explore:** make SORT-Descending visible if Sort-by has value ([#17726](https://github.com/apache/superset/issues/17726)) ([d5768ab](https://github.com/apache/superset/commit/d5768ab649a70fd4f541ad4982498f622160b220)) - -### Features - -- apply standardized form data to tier 2 charts ([#20530](https://github.com/apache/superset/issues/20530)) ([de524bc](https://github.com/apache/superset/commit/de524bc59f011fd361dcdb7d35c2cb51f7eba442)) -- **explore:** improve UI in the control panel ([#19748](https://github.com/apache/superset/issues/19748)) ([e3a54aa](https://github.com/apache/superset/commit/e3a54aa3c15bdd0c970aa73f898288a408205c97)) -- improve color consistency (save all labels) ([#19038](https://github.com/apache/superset/issues/19038)) ([dc57508](https://github.com/apache/superset/commit/dc575080d7e43d40b1734bb8f44fdc291cb95b11)) -- update time comparison choices (again) ([#17968](https://github.com/apache/superset/issues/17968)) ([05d9cde](https://github.com/apache/superset/commit/05d9cde203b99f8c63106446f0be58668cc9f0c9)) -- update time comparison choices (again) ([#22458](https://github.com/apache/superset/issues/22458)) ([9e81c3a](https://github.com/apache/superset/commit/9e81c3a1192a18226d505178d16e1e395917a719)) - -# [0.18.0](https://github.com/apache-superset/superset-ui/compare/v0.17.87...v0.18.0) (2021-08-30) - -**Note:** Version bump only for package @superset-ui/legacy-plugin-chart-rose - -## [0.17.61](https://github.com/apache-superset/superset-ui/compare/v0.17.60...v0.17.61) (2021-07-02) - -**Note:** Version bump only for package @superset-ui/legacy-plugin-chart-rose diff --git a/superset-frontend/plugins/plugin-chart-rose/README.md b/superset-frontend/plugins/plugin-chart-rose/README.md deleted file mode 100644 index 91cf643674ad..000000000000 --- a/superset-frontend/plugins/plugin-chart-rose/README.md +++ /dev/null @@ -1,52 +0,0 @@ - - -## @superset-ui/plugin-chart-rose - -[![Version](https://img.shields.io/npm/v/@superset-ui/plugin-chart-rose.svg?style=flat)](https://www.npmjs.com/package/@superset-ui/plugin-chart-rose) -[![Libraries.io](https://img.shields.io/librariesio/release/npm/%40superset-ui%2Fplugin-chart-rose?style=flat)](https://libraries.io/npm/@superset-ui%2Fplugin-chart-rose) - -This plugin provides Nightingale Rose Diagram for Superset. - -### Usage - -Configure `key`, which can be any `string`, and register the plugin. This `key` will be used to -lookup this chart throughout the app. - -```js -import RoseChartPlugin from '@superset-ui/plugin-chart-rose'; - -new RoseChartPlugin().configure({ key: 'rose' }).register(); -``` - -Then use it via `SuperChart`. See -[storybook](https://apache-superset.github.io/superset-ui-plugins/?selectedKind=plugin-chart-rose) -for more details. - -```js - -``` diff --git a/superset-frontend/plugins/plugin-chart-rose/package.json b/superset-frontend/plugins/plugin-chart-rose/package.json deleted file mode 100644 index 5c2c1819fe77..000000000000 --- a/superset-frontend/plugins/plugin-chart-rose/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "@superset-ui/plugin-chart-rose", - "version": "0.20.3", - "description": "Superset Chart - Nightingale Rose Diagram", - "keywords": [ - "superset" - ], - "homepage": "https://github.com/apache/superset/tree/master/superset-frontend/plugins/plugin-chart-rose#readme", - "bugs": { - "url": "https://github.com/apache/superset/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/apache/superset.git", - "directory": "superset-frontend/plugins/plugin-chart-rose" - }, - "license": "Apache-2.0", - "author": "Superset", - "main": "lib/index.js", - "module": "esm/index.js", - "files": [ - "esm", - "lib" - ], - "dependencies": { - "d3": "^3.5.17", - "nvd3-fork": "^2.0.5", - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "@emotion/react": "^11.4.1", - "@superset-ui/chart-controls": "*", - "@superset-ui/core": "*", - "@apache-superset/core": "*", - "react": "^18.3.0" - }, - "publishConfig": { - "access": "public" - } -} diff --git a/superset-frontend/plugins/plugin-chart-rose/src/ReactRose.tsx b/superset-frontend/plugins/plugin-chart-rose/src/ReactRose.tsx deleted file mode 100644 index da0df5926571..000000000000 --- a/superset-frontend/plugins/plugin-chart-rose/src/ReactRose.tsx +++ /dev/null @@ -1,88 +0,0 @@ -/** - * 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. - */ -import { reactify } from '@superset-ui/core'; -import { styled, css } from '@apache-superset/core/theme'; -import { Global } from '@emotion/react'; -import Component from './Rose'; - -// Type-erase the render function to allow flexible prop spreading in the wrapper. -// The Rose render function has typed props, but the wrapper passes props via spread -// which TypeScript cannot verify at compile time. Props are validated at runtime. -const ReactComponent = reactify( - Component as unknown as ( - container: HTMLDivElement, - props: Record, - ) => void, -); - -interface RoseWrapperProps { - className?: string; - [key: string]: unknown; -} - -const Rose = ({ className, ...otherProps }: RoseWrapperProps) => ( -
- css` - .tooltip { - line-height: 1; - padding: ${theme.sizeUnit * 3}px; - background: ${theme.colorBgElevated}; - color: ${theme.colorText}; - border-radius: 4px; - pointer-events: none; - z-index: 1000; - font-size: ${theme.fontSizeSM}px; - } - `} - /> - -
-); - -export default styled(Rose)` - ${({ theme }) => ` - .superset-legacy-chart-rose path { - transition: fill-opacity 180ms linear; - stroke: ${theme.colorBorder}; - stroke-width: 1px; - stroke-opacity: 1; - fill-opacity: 0.75; - } - - .superset-legacy-chart-rose text { - font-size: ${theme.fontSizeSM}px; - font-family: ${theme.fontFamily}; - fill: ${theme.colorText}; - pointer-events: none; - } - - .superset-legacy-chart-rose .clickable path { - cursor: pointer; - } - - .superset-legacy-chart-rose .hover path { - fill-opacity: 1; - } - - .nv-legend .nv-series { - cursor: pointer; - } - `} -`; diff --git a/superset-frontend/plugins/plugin-chart-rose/src/Rose.ts b/superset-frontend/plugins/plugin-chart-rose/src/Rose.ts deleted file mode 100644 index 974d58a29725..000000000000 --- a/superset-frontend/plugins/plugin-chart-rose/src/Rose.ts +++ /dev/null @@ -1,697 +0,0 @@ -/** - * 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. - */ -// @ts-nocheck -/* oxlint-disable no-use-before-define: ["error", { "functions": false }] */ -/* eslint-disable no-restricted-syntax */ -/* eslint-disable react/sort-prop-types */ -import d3 from 'd3'; -import PropTypes from 'prop-types'; -import nv from 'nvd3-fork'; -import { - getTimeFormatter, - getNumberFormatter, - CategoricalColorNamespace, - sanitizeHtml, -} from '@superset-ui/core'; - -interface RoseDataEntry { - key: string[]; - name: string; - time: number; - value: number; - id: number; -} - -interface RoseData { - [timestamp: string]: RoseDataEntry[]; -} - -interface ArcDatum { - startAngle: number; - endAngle: number; - innerRadius: number; - outerRadius: number; - name?: string; - arcId?: number; - val?: number; - time?: number; - percent?: number; -} - -interface RoseProps { - data: RoseData; - width: number; - height: number; - colorScheme: string; - dateTimeFormat: string; - numberFormat: string; - useRichTooltip: boolean; - useAreaProportions: boolean; - sliceId: number; -} - -const propTypes = { - // Data is an object hashed by numeric value, perhaps timestamp - data: PropTypes.objectOf( - PropTypes.arrayOf( - PropTypes.shape({ - key: PropTypes.arrayOf(PropTypes.string), - name: PropTypes.arrayOf(PropTypes.string), - time: PropTypes.number, - value: PropTypes.number, - }), - ), - ), - width: PropTypes.number, - height: PropTypes.number, - dateTimeFormat: PropTypes.string, - numberFormat: PropTypes.string, - useRichTooltip: PropTypes.bool, - useAreaProportions: PropTypes.bool, - colorScheme: PropTypes.string, -}; - -function copyArc(d: ArcDatum): ArcDatum { - return { - startAngle: d.startAngle, - endAngle: d.endAngle, - innerRadius: d.innerRadius, - outerRadius: d.outerRadius, - }; -} - -function sortValues(a: RoseDataEntry, b: RoseDataEntry): number { - if (a.value === b.value) { - return a.name > b.name ? 1 : -1; - } - - return b.value - a.value; -} - -function Rose(element: HTMLElement, props: RoseProps): void { - const { - data, - width, - height, - colorScheme, - dateTimeFormat, - numberFormat, - useRichTooltip, - useAreaProportions, - sliceId, - } = props; - - const div = d3.select(element); - div.classed('superset-legacy-chart-rose', true); - - const datum = data; - const times = Object.keys(datum) - .map(t => parseInt(t, 10)) - .sort((a, b) => a - b); - const numGrains = times.length; - const numGroups = datum[times[0]].length; - const format = getNumberFormatter(numberFormat); - const timeFormat = getTimeFormatter(dateTimeFormat); - const colorFn = CategoricalColorNamespace.getScale(colorScheme); - - d3.select('.nvtooltip').remove(); - div.selectAll('*').remove(); - - const arc = d3.svg.arc(); - const legend = nv.models.legend(); - const tooltip = nv.models.tooltip(); - const state = { disabled: datum[times[0]].map(() => false) }; - - const svg = div.append('svg').attr('width', width).attr('height', height); - - const g = svg.append('g').attr('class', 'rose').append('g'); - - const legendWrap = g.append('g').attr('class', 'legendWrap'); - - function legendData(adatum: RoseData) { - return adatum[times[0]].map((v: RoseDataEntry, i: number) => ({ - disabled: state.disabled[i], - // Keep the raw name as `key` so it matches the value used for arc - // fills (colorFn is called with d.name on arcs and d.key on the - // legend). nvd3-fork's legend renders `key` via .text(), so the - // raw value is escaped at the DOM sink. - key: v.name, - })); - } - - function tooltipData(d: ArcDatum, i: number, adatum: RoseData) { - const timeIndex = Math.floor(d.arcId / numGroups); - // nvd3-fork's nv.models.tooltip renders the `key` strings via .html(), - // so any HTML in user-controlled column values would execute. Pass the - // keys through sanitizeHtml to strip dangerous markup while preserving - // legitimate text content. - const series = useRichTooltip - ? adatum[times[timeIndex]] - .filter(v => !state.disabled[v.id % numGroups]) - .map(v => ({ - key: sanitizeHtml(v.name), - value: v.value, - color: colorFn(v.name, sliceId), - highlight: v.id === d.arcId, - })) - : [ - { - key: sanitizeHtml(d.name), - value: d.val, - color: colorFn(d.name, sliceId), - }, - ]; - - return { - key: 'Date', - value: d.time, - series, - }; - } - - legend.width(width).color(d => colorFn(d.key, sliceId)); - legendWrap.datum(legendData(datum)).call(legend); - - tooltip.headerFormatter(timeFormat).valueFormatter(format); - tooltip.classes('tooltip'); - - // Compute max radius, which the largest value will occupy - const roseHeight = height - legend.height(); - const margin = { top: legend.height() }; - const edgeMargin = 35; // space between outermost radius and slice edge - const maxRadius = Math.min(width, roseHeight) / 2 - edgeMargin; - const labelThreshold = 0.05; - const gro = 8; // mouseover radius growth in pixels - const mini = 0.075; - - const centerTranslate = `translate(${width / 2},${ - roseHeight / 2 + margin.top - })`; - const roseWrap = g - .append('g') - .attr('transform', centerTranslate) - .attr('class', 'roseWrap'); - - const labelsWrap = g - .append('g') - .attr('transform', centerTranslate) - .attr('class', 'labelsWrap'); - - const groupLabelsWrap = g - .append('g') - .attr('transform', centerTranslate) - .attr('class', 'groupLabelsWrap'); - - // Compute inner and outer angles for each data point - function computeArcStates(adatum: RoseData) { - // Find the max sum of values across all time - let maxSum = 0; - let grain = 0; - const sums = []; - for (const t of times) { - const sum = datum[t].reduce( - (a, v, i) => a + (state.disabled[i] ? 0 : v.value), - 0, - ); - maxSum = sum > maxSum ? sum : maxSum; - sums[grain] = sum; - grain += 1; - } - - // Compute angle occupied by each time grain - const dtheta = (Math.PI * 2) / numGrains; - const angles = []; - for (let i = 0; i <= numGrains; i += 1) { - angles.push(dtheta * i - Math.PI / 2); - } - - // Compute proportion - const P = maxRadius / maxSum; - const Q = P * maxRadius; - const computeOuterRadius = (value: number, innerRadius: number): number => - useAreaProportions - ? Math.sqrt(Q * value + innerRadius * innerRadius) - : P * value + innerRadius; - - const arcSt = { - data: [], - extend: {}, - push: {}, - pieStart: {}, - pie: {}, - pieOver: {}, - mini: {}, - labels: [], - groupLabels: [], - }; - let arcId = 0; - for (let i = 0; i < numGrains; i += 1) { - const t = times[i]; - const startAngle = angles[i]; - const endAngle = angles[i + 1]; - const G = (2 * Math.PI) / sums[i]; - let innerRadius = 0; - let outerRadius; - let pieStartAngle = 0; - let pieEndAngle; - for (const v of adatum[t]) { - const val = state.disabled[arcId % numGroups] ? 0 : v.value; - const { name, time } = v; - v.id = arcId; - outerRadius = computeOuterRadius(val, innerRadius); - arcSt.data.push({ - startAngle, - endAngle, - innerRadius, - outerRadius, - name, - arcId, - val, - time, - }); - arcSt.extend[arcId] = { - startAngle, - endAngle, - innerRadius, - name, - outerRadius: outerRadius + gro, - }; - arcSt.push[arcId] = { - startAngle, - endAngle, - innerRadius: innerRadius + gro, - outerRadius: outerRadius + gro, - }; - arcSt.pieStart[arcId] = { - startAngle, - endAngle, - innerRadius: mini * maxRadius, - outerRadius: maxRadius, - }; - arcSt.mini[arcId] = { - startAngle, - endAngle, - innerRadius: innerRadius * mini, - outerRadius: outerRadius * mini, - }; - arcId += 1; - innerRadius = outerRadius; - } - const labelArc = { ...arcSt.data[i * numGroups] }; - labelArc.outerRadius = maxRadius + 20; - labelArc.innerRadius = maxRadius + 15; - arcSt.labels.push(labelArc); - for (const v of adatum[t].concat().sort(sortValues)) { - const val = state.disabled[v.id % numGroups] ? 0 : v.value; - pieEndAngle = G * val + pieStartAngle; - arcSt.pie[v.id] = { - startAngle: pieStartAngle, - endAngle: pieEndAngle, - innerRadius: maxRadius * mini, - outerRadius: maxRadius, - percent: v.value / sums[i], - }; - arcSt.pieOver[v.id] = { - startAngle: pieStartAngle, - endAngle: pieEndAngle, - innerRadius: maxRadius * mini, - outerRadius: maxRadius + gro, - }; - pieStartAngle = pieEndAngle; - } - } - arcSt.groupLabels = arcSt.data.slice(0, numGroups); - - return arcSt; - } - - let arcSt = computeArcStates(datum); - - function tween(target: ArcDatum, resFunc: (d: ArcDatum) => string) { - return function doTween(d: ArcDatum) { - const interpolate = d3.interpolate(copyArc(d), copyArc(target)); - - return (t: number) => resFunc(Object.assign(d, interpolate(t))); - }; - } - - function arcTween(target: ArcDatum) { - return tween(target, (d: ArcDatum) => arc(d)); - } - - function translateTween(target: ArcDatum) { - return tween(target, (d: ArcDatum) => `translate(${arc.centroid(d)})`); - } - - // Grab the ID range of segments stand between - // this segment and the edge of the circle - const segmentsToEdgeCache: Record = {}; - function getSegmentsToEdge(arcId: number): [number, number] { - if (segmentsToEdgeCache[arcId]) { - return segmentsToEdgeCache[arcId]; - } - const timeIndex = Math.floor(arcId / numGroups); - segmentsToEdgeCache[arcId] = [arcId + 1, numGroups * (timeIndex + 1) - 1]; - - return segmentsToEdgeCache[arcId]; - } - - // Get the IDs of all segments in a timeIndex - const segmentsInTimeCache: Record = {}; - function getSegmentsInTime(arcId: number): [number, number] { - if (segmentsInTimeCache[arcId]) { - return segmentsInTimeCache[arcId]; - } - const timeIndex = Math.floor(arcId / numGroups); - segmentsInTimeCache[arcId] = [ - timeIndex * numGroups, - (timeIndex + 1) * numGroups - 1, - ]; - - return segmentsInTimeCache[arcId]; - } - - let clickId = -1; - let inTransition = false; - const ae = roseWrap - .selectAll('g') - .data(JSON.parse(JSON.stringify(arcSt.data))) // deep copy data state - .enter() - .append('g') - .attr('class', 'segment') - .classed('clickable', true); - - const labels = labelsWrap - .selectAll('g') - .data(JSON.parse(JSON.stringify(arcSt.labels))) - .enter() - .append('g') - .attr('class', 'roseLabel') - .attr('transform', d => `translate(${arc.centroid(d)})`); - - labels - .append('text') - .style('text-anchor', 'middle') - .style('fill', '#000') - .text(d => timeFormat(d.time)); - - const groupLabels = groupLabelsWrap - .selectAll('g') - .data(JSON.parse(JSON.stringify(arcSt.groupLabels))) - .enter() - .append('g'); - - groupLabels - .style('opacity', 0) - .attr('class', 'roseGroupLabels') - .append('text') - .style('text-anchor', 'middle') - .style('fill', '#000') - .text(d => d.name); - - const arcs = ae - .append('path') - .attr('class', 'arc') - .attr('fill', d => colorFn(d.name, sliceId)) - .attr('d', arc); - - function mousemove(): void { - tooltip(); - } - - function mouseover(this: Element, b: ArcDatum, i: number): void { - tooltip.data(tooltipData(b, i, datum)).hidden(false); - const $this = d3.select(this); - $this.classed('hover', true); - if (clickId < 0 && !inTransition) { - $this - .select('path') - .interrupt() - .transition() - .duration(180) - .attrTween('d', arcTween(arcSt.extend[i])); - const edge = getSegmentsToEdge(i); - arcs - .filter(d => edge[0] <= d.arcId && d.arcId <= edge[1]) - .interrupt() - .transition() - .duration(180) - .attrTween('d', d => arcTween(arcSt.push[d.arcId])(d)); - } else if (!inTransition) { - const segments = getSegmentsInTime(clickId); - if (segments[0] <= b.arcId && b.arcId <= segments[1]) { - $this - .select('path') - .interrupt() - .transition() - .duration(180) - .attrTween('d', arcTween(arcSt.pieOver[i])); - } - } - } - - function mouseout(this: Element, b: ArcDatum, i: number): void { - tooltip.hidden(true); - const $this = d3.select(this); - $this.classed('hover', false); - if (clickId < 0 && !inTransition) { - $this - .select('path') - .interrupt() - .transition() - .duration(180) - .attrTween('d', arcTween(arcSt.data[i])); - const edge = getSegmentsToEdge(i); - arcs - .filter(d => edge[0] <= d.arcId && d.arcId <= edge[1]) - .interrupt() - .transition() - .duration(180) - .attrTween('d', d => arcTween(arcSt.data[d.arcId])(d)); - } else if (!inTransition) { - const segments = getSegmentsInTime(clickId); - if (segments[0] <= b.arcId && b.arcId <= segments[1]) { - $this - .select('path') - .interrupt() - .transition() - .duration(180) - .attrTween('d', arcTween(arcSt.pie[i])); - } - } - } - - function click(b: ArcDatum, i: number): void { - if (inTransition) { - return; - } - const delay = d3.event.altKey ? 3750 : 375; - const segments = getSegmentsInTime(i); - if (clickId < 0) { - inTransition = true; - clickId = i; - labels - .interrupt() - .transition() - .duration(delay) - .attrTween('transform', d => - translateTween({ - outerRadius: 0, - innerRadius: 0, - startAngle: d.startAngle, - endAngle: d.endAngle, - })(d), - ) - .style('opacity', 0); - groupLabels - .attr( - 'transform', - `translate(${arc.centroid({ - outerRadius: maxRadius + 20, - innerRadius: maxRadius + 15, - startAngle: arcSt.data[i].startAngle, - endAngle: arcSt.data[i].endAngle, - })})`, - ) - .interrupt() - .transition() - .delay(delay) - .duration(delay) - .attrTween('transform', d => - translateTween({ - outerRadius: maxRadius + 20, - innerRadius: maxRadius + 15, - startAngle: arcSt.pie[segments[0] + d.arcId].startAngle, - endAngle: arcSt.pie[segments[0] + d.arcId].endAngle, - })(d), - ) - .style('opacity', d => - state.disabled[d.arcId] || - arcSt.pie[segments[0] + d.arcId].percent < labelThreshold - ? 0 - : 1, - ); - ae.classed( - 'clickable', - d => segments[0] > d.arcId || d.arcId > segments[1], - ); - arcs - .filter(d => segments[0] <= d.arcId && d.arcId <= segments[1]) - .interrupt() - .transition() - .duration(delay) - .attrTween('d', d => arcTween(arcSt.pieStart[d.arcId])(d)) - .transition() - .duration(delay) - .attrTween('d', d => arcTween(arcSt.pie[d.arcId])(d)) - .each('end', () => { - inTransition = false; - }); - arcs - .filter(d => segments[0] > d.arcId || d.arcId > segments[1]) - .interrupt() - .transition() - .duration(delay) - .attrTween('d', d => arcTween(arcSt.mini[d.arcId])(d)); - } else if (clickId < segments[0] || segments[1] < clickId) { - inTransition = true; - const clickSegments = getSegmentsInTime(clickId); - labels - .interrupt() - .transition() - .delay(delay) - .duration(delay) - .attrTween('transform', d => - translateTween(arcSt.labels[d.arcId / numGroups])(d), - ) - .style('opacity', 1); - groupLabels - .interrupt() - .transition() - .duration(delay) - .attrTween( - 'transform', - translateTween({ - outerRadius: maxRadius + 20, - innerRadius: maxRadius + 15, - startAngle: arcSt.data[clickId].startAngle, - endAngle: arcSt.data[clickId].endAngle, - }), - ) - .style('opacity', 0); - ae.classed('clickable', true); - arcs - .filter(d => clickSegments[0] <= d.arcId && d.arcId <= clickSegments[1]) - .interrupt() - .transition() - .duration(delay) - .attrTween('d', d => arcTween(arcSt.pieStart[d.arcId])(d)) - .transition() - .duration(delay) - .attrTween('d', d => arcTween(arcSt.data[d.arcId])(d)) - .each('end', () => { - clickId = -1; - inTransition = false; - }); - arcs - .filter(d => clickSegments[0] > d.arcId || d.arcId > clickSegments[1]) - .interrupt() - .transition() - .delay(delay) - .duration(delay) - .attrTween('d', d => arcTween(arcSt.data[d.arcId])(d)); - } - } - - ae.on('mouseover', mouseover) - .on('mouseout', mouseout) - .on('mousemove', mousemove) - .on('click', click); - - function updateActive(): void { - const delay = d3.event.altKey ? 3000 : 300; - legendWrap.datum(legendData(datum)).call(legend); - const nArcSt = computeArcStates(datum); - inTransition = true; - if (clickId < 0) { - arcs - .style('opacity', 1) - .interrupt() - .transition() - .duration(delay) - .attrTween('d', d => arcTween(nArcSt.data[d.arcId])(d)) - .each('end', () => { - inTransition = false; - arcSt = nArcSt; - }) - .transition() - .duration(0) - .style('opacity', d => (state.disabled[d.arcId % numGroups] ? 0 : 1)); - } else { - const segments = getSegmentsInTime(clickId); - arcs - .style('opacity', 1) - .interrupt() - .transition() - .duration(delay) - .attrTween('d', d => - segments[0] <= d.arcId && d.arcId <= segments[1] - ? arcTween(nArcSt.pie[d.arcId])(d) - : arcTween(nArcSt.mini[d.arcId])(d), - ) - .each('end', () => { - inTransition = false; - arcSt = nArcSt; - }) - .transition() - .duration(0) - .style('opacity', d => (state.disabled[d.arcId % numGroups] ? 0 : 1)); - groupLabels - .interrupt() - .transition() - .duration(delay) - .attrTween('transform', d => - translateTween({ - outerRadius: maxRadius + 20, - innerRadius: maxRadius + 15, - startAngle: nArcSt.pie[segments[0] + d.arcId].startAngle, - endAngle: nArcSt.pie[segments[0] + d.arcId].endAngle, - })(d), - ) - .style('opacity', d => - state.disabled[d.arcId] || - arcSt.pie[segments[0] + d.arcId].percent < labelThreshold - ? 0 - : 1, - ); - } - } - - legend.dispatch.on('stateChange', newState => { - if (state.disabled !== newState.disabled) { - state.disabled = newState.disabled; - updateActive(); - } - }); -} - -Rose.displayName = 'Rose'; -Rose.propTypes = propTypes; - -export default Rose; diff --git a/superset-frontend/plugins/plugin-chart-rose/src/images/thumbnail-dark.png b/superset-frontend/plugins/plugin-chart-rose/src/images/thumbnail-dark.png deleted file mode 100644 index 7e2f237ad3d8e5380f03ffa36e2de89861e459ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83147 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
w{G)^j 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 diff --git a/superset-frontend/plugins/plugin-chart-rose/src/images/thumbnail.png b/superset-frontend/plugins/plugin-chart-rose/src/images/thumbnail.png deleted file mode 100644 index 9e010369978064dec91a166460c715575b2889cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27928 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 TvR*kEbq0(LEcDBD2{Hc%wj{&$ diff --git a/superset-frontend/plugins/plugin-chart-rose/src/stories/Rose.stories.tsx b/superset-frontend/plugins/plugin-chart-rose/src/stories/Rose.stories.tsx deleted file mode 100644 index 3bec652a6189..000000000000 --- a/superset-frontend/plugins/plugin-chart-rose/src/stories/Rose.stories.tsx +++ /dev/null @@ -1,95 +0,0 @@ -/* - * 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. - */ - -/* eslint-disable no-magic-numbers, sort-keys */ -import { SuperChart, VizType } from '@superset-ui/core'; -import RoseChartPlugin from '@superset-ui/plugin-chart-rose'; -import data from './data'; -import { withResizableChartDemo } from '@storybook-shared'; - -new RoseChartPlugin().configure({ key: VizType.Rose }).register(); - -export default { - title: 'Chart Plugins/plugin-chart-rose', - decorators: [withResizableChartDemo], - args: { - colorScheme: 'd3Category10', - numberFormat: '.3s', - dateTimeFormat: '%Y-%m-%d', - richTooltip: true, - roseAreaProportion: false, - }, - argTypes: { - colorScheme: { - control: 'select', - options: [ - 'supersetColors', - 'd3Category10', - 'bnbColors', - 'googleCategory20c', - ], - }, - numberFormat: { - control: 'select', - options: ['SMART_NUMBER', '.2f', '.0%', '$,.2f', '.3s', ',d'], - }, - dateTimeFormat: { - control: 'select', - options: ['%Y-%m-%d', '%Y-%m-%d %H:%M', '%b %d, %Y', '%d/%m/%Y'], - }, - richTooltip: { control: 'boolean' }, - roseAreaProportion: { - control: 'boolean', - description: - 'When true, area is proportional to value; when false, radius is proportional', - }, - }, -}; - -export const Basic = ({ - width, - height, - colorScheme, - numberFormat, - dateTimeFormat, - richTooltip, - roseAreaProportion, -}: { - width: number; - height: number; - colorScheme: string; - numberFormat: string; - dateTimeFormat: string; - richTooltip: boolean; - roseAreaProportion: boolean; -}) => ( - -); diff --git a/superset-frontend/plugins/plugin-chart-rose/src/stories/data.ts b/superset-frontend/plugins/plugin-chart-rose/src/stories/data.ts deleted file mode 100644 index a155f0c66743..000000000000 --- a/superset-frontend/plugins/plugin-chart-rose/src/stories/data.ts +++ /dev/null @@ -1,950 +0,0 @@ -/* - * 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. - */ - -/* eslint-disable sort-keys, no-magic-numbers */ -export default { - '-157766400000000000': [ - { - key: ['Christopher'], - value: 0, - name: ['Christopher'], - time: -157766400000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: -157766400000.0, - }, - { - key: ['David'], - value: 6820.0, - name: ['David'], - time: -157766400000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: -157766400000.0, - }, - { - key: ['Michael'], - value: 7835.0, - name: ['Michael'], - time: -157766400000.0, - }, - ], - '-126230400000000000': [ - { - key: ['Christopher'], - value: 0, - name: ['Christopher'], - time: -126230400000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: -126230400000.0, - }, - { - key: ['David'], - value: 6757.0, - name: ['David'], - time: -126230400000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: -126230400000.0, - }, - { - key: ['Michael'], - value: 7678.0, - name: ['Michael'], - time: -126230400000.0, - }, - ], - '-94694400000000000': [ - { - key: ['Christopher'], - value: 0, - name: ['Christopher'], - time: -94694400000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: -94694400000.0, - }, - { - key: ['David'], - value: 6923.0, - name: ['David'], - time: -94694400000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: -94694400000.0, - }, - { - key: ['Michael'], - value: 8132.0, - name: ['Michael'], - time: -94694400000.0, - }, - ], - '-63158400000000000': [ - { - key: ['Christopher'], - value: 0, - name: ['Christopher'], - time: -63158400000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: -63158400000.0, - }, - { - key: ['David'], - value: 6490.0, - name: ['David'], - time: -63158400000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: -63158400000.0, - }, - { - key: ['Michael'], - value: 8079.0, - name: ['Michael'], - time: -63158400000.0, - }, - ], - '-31536000000000000': [ - { - key: ['Christopher'], - value: 0, - name: ['Christopher'], - time: -31536000000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: -31536000000.0, - }, - { - key: ['David'], - value: 6563.0, - name: ['David'], - time: -31536000000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: -31536000000.0, - }, - { - key: ['Michael'], - value: 8245.0, - name: ['Michael'], - time: -31536000000.0, - }, - ], - '0': [ - { - key: ['Christopher'], - value: 0, - name: ['Christopher'], - time: 0.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 0.0, - }, - { - key: ['David'], - value: 6367.0, - name: ['David'], - time: 0.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: 0.0, - }, - { - key: ['Michael'], - value: 8186.0, - name: ['Michael'], - time: 0.0, - }, - ], - '31536000000000000': [ - { - key: ['Christopher'], - value: 0, - name: ['Christopher'], - time: 31536000000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 31536000000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 31536000000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: 31536000000.0, - }, - { - key: ['Michael'], - value: 6825.0, - name: ['Michael'], - time: 31536000000.0, - }, - ], - '63072000000000000': [ - { - key: ['Christopher'], - value: 0, - name: ['Christopher'], - time: 63072000000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 63072000000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 63072000000.0, - }, - { - key: ['Jennifer'], - value: 6066.0, - name: ['Jennifer'], - time: 63072000000.0, - }, - { - key: ['Michael'], - value: 6337.0, - name: ['Michael'], - time: 63072000000.0, - }, - ], - '94694400000000000': [ - { - key: ['Christopher'], - value: 0, - name: ['Christopher'], - time: 94694400000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 94694400000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 94694400000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: 94694400000.0, - }, - { - key: ['Michael'], - value: 5877.0, - name: ['Michael'], - time: 94694400000.0, - }, - ], - '126230400000000000': [ - { - key: ['Christopher'], - value: 0, - name: ['Christopher'], - time: 126230400000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 126230400000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 126230400000.0, - }, - { - key: ['Jennifer'], - value: 5672.0, - name: ['Jennifer'], - time: 126230400000.0, - }, - { - key: ['Michael'], - value: 6058.0, - name: ['Michael'], - time: 126230400000.0, - }, - ], - '157766400000000000': [ - { - key: ['Christopher'], - value: 0, - name: ['Christopher'], - time: 157766400000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 157766400000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 157766400000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: 157766400000.0, - }, - { - key: ['Michael'], - value: 6206.0, - name: ['Michael'], - time: 157766400000.0, - }, - ], - '189302400000000000': [ - { - key: ['Christopher'], - value: 0, - name: ['Christopher'], - time: 189302400000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 189302400000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 189302400000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: 189302400000.0, - }, - { - key: ['Michael'], - value: 6178.0, - name: ['Michael'], - time: 189302400000.0, - }, - ], - '220924800000000000': [ - { - key: ['Christopher'], - value: 0, - name: ['Christopher'], - time: 220924800000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 220924800000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 220924800000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: 220924800000.0, - }, - { - key: ['Michael'], - value: 6313.0, - name: ['Michael'], - time: 220924800000.0, - }, - ], - '252460800000000000': [ - { - key: ['Christopher'], - value: 0, - name: ['Christopher'], - time: 252460800000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 252460800000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 252460800000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: 252460800000.0, - }, - { - key: ['Michael'], - value: 6489.0, - name: ['Michael'], - time: 252460800000.0, - }, - ], - '283996800000000000': [ - { - key: ['Christopher'], - value: 0, - name: ['Christopher'], - time: 283996800000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 283996800000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 283996800000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: 283996800000.0, - }, - { - key: ['Michael'], - value: 6580.0, - name: ['Michael'], - time: 283996800000.0, - }, - ], - '315532800000000000': [ - { - key: ['Christopher'], - value: 0, - name: ['Christopher'], - time: 315532800000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 315532800000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 315532800000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: 315532800000.0, - }, - { - key: ['Michael'], - value: 6896.0, - name: ['Michael'], - time: 315532800000.0, - }, - ], - '347155200000000000': [ - { - key: ['Christopher'], - value: 0, - name: ['Christopher'], - time: 347155200000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 347155200000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 347155200000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: 347155200000.0, - }, - { - key: ['Michael'], - value: 7142.0, - name: ['Michael'], - time: 347155200000.0, - }, - ], - '378691200000000000': [ - { - key: ['Christopher'], - value: 6093.0, - name: ['Christopher'], - time: 378691200000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 378691200000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 378691200000.0, - }, - { - key: ['Jennifer'], - value: 5811.0, - name: ['Jennifer'], - time: 378691200000.0, - }, - { - key: ['Michael'], - value: 7155.0, - name: ['Michael'], - time: 378691200000.0, - }, - ], - '410227200000000000': [ - { - key: ['Christopher'], - value: 6375.0, - name: ['Christopher'], - time: 410227200000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 410227200000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 410227200000.0, - }, - { - key: ['Jennifer'], - value: 5829.0, - name: ['Jennifer'], - time: 410227200000.0, - }, - { - key: ['Michael'], - value: 7386.0, - name: ['Michael'], - time: 410227200000.0, - }, - ], - '441763200000000000': [ - { - key: ['Christopher'], - value: 6509.0, - name: ['Christopher'], - time: 441763200000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 441763200000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 441763200000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: 441763200000.0, - }, - { - key: ['Michael'], - value: 7478.0, - name: ['Michael'], - time: 441763200000.0, - }, - ], - '473385600000000000': [ - { - key: ['Christopher'], - value: 6744.0, - name: ['Christopher'], - time: 473385600000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 473385600000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 473385600000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: 473385600000.0, - }, - { - key: ['Michael'], - value: 7210.0, - name: ['Michael'], - time: 473385600000.0, - }, - ], - '504921600000000000': [ - { - key: ['Christopher'], - value: 6497.0, - name: ['Christopher'], - time: 504921600000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 504921600000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 504921600000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: 504921600000.0, - }, - { - key: ['Michael'], - value: 7259.0, - name: ['Michael'], - time: 504921600000.0, - }, - ], - '536457600000000000': [ - { - key: ['Christopher'], - value: 6549.0, - name: ['Christopher'], - time: 536457600000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 536457600000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 536457600000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: 536457600000.0, - }, - { - key: ['Michael'], - value: 7448.0, - name: ['Michael'], - time: 536457600000.0, - }, - ], - '567993600000000000': [ - { - key: ['Christopher'], - value: 6496.0, - name: ['Christopher'], - time: 567993600000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 567993600000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 567993600000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: 567993600000.0, - }, - { - key: ['Michael'], - value: 7748.0, - name: ['Michael'], - time: 567993600000.0, - }, - ], - '599616000000000000': [ - { - key: ['Christopher'], - value: 6526.0, - name: ['Christopher'], - time: 599616000000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 599616000000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 599616000000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: 599616000000.0, - }, - { - key: ['Michael'], - value: 7851.0, - name: ['Michael'], - time: 599616000000.0, - }, - ], - '631152000000000000': [ - { - key: ['Christopher'], - value: 6641.0, - name: ['Christopher'], - time: 631152000000.0, - }, - { - key: ['Daniel'], - value: 5760.0, - name: ['Daniel'], - time: 631152000000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 631152000000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: 631152000000.0, - }, - { - key: ['Michael'], - value: 8233.0, - name: ['Michael'], - time: 631152000000.0, - }, - ], - '662688000000000000': [ - { - key: ['Christopher'], - value: 5784.0, - name: ['Christopher'], - time: 662688000000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 662688000000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 662688000000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: 662688000000.0, - }, - { - key: ['Michael'], - value: 7579.0, - name: ['Michael'], - time: 662688000000.0, - }, - ], - '694224000000000000': [ - { - key: ['Christopher'], - value: 0, - name: ['Christopher'], - time: 694224000000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 694224000000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 694224000000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: 694224000000.0, - }, - { - key: ['Michael'], - value: 6627.0, - name: ['Michael'], - time: 694224000000.0, - }, - ], - '725846400000000000': [ - { - key: ['Christopher'], - value: 0, - name: ['Christopher'], - time: 725846400000.0, - }, - { - key: ['Daniel'], - value: 0, - name: ['Daniel'], - time: 725846400000.0, - }, - { - key: ['David'], - value: 0, - name: ['David'], - time: 725846400000.0, - }, - { - key: ['Jennifer'], - value: 0, - name: ['Jennifer'], - time: 725846400000.0, - }, - { - key: ['Michael'], - value: 5839.0, - name: ['Michael'], - time: 725846400000.0, - }, - ], -}; diff --git a/superset-frontend/plugins/plugin-chart-rose/src/transformProps.ts b/superset-frontend/plugins/plugin-chart-rose/src/transformProps.ts deleted file mode 100644 index 1cf5aaf90d63..000000000000 --- a/superset-frontend/plugins/plugin-chart-rose/src/transformProps.ts +++ /dev/null @@ -1,66 +0,0 @@ -/** - * 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. - */ -import { - ChartProps, - ensureIsArray, - getMetricLabel, - QueryFormMetric, -} from '@superset-ui/core'; -import transformData from './transformData'; - -export default function transformProps(chartProps: ChartProps) { - const { width, height, formData, queriesData } = chartProps; - const { - colorScheme, - dateTimeFormat, - numberFormat, - richTooltip, - roseAreaProportion, - sliceId, - metrics, - timeCompare, - comparisonType, - } = formData; - - // v1 responses arrive as flattened pivot records; the legacy - // explore_json endpoint delivered the timestamp-keyed shape directly. - const rawData = queriesData[0].data; - const data = Array.isArray(rawData) - ? transformData(rawData, { - metricLabels: ensureIsArray(metrics as QueryFormMetric[]).map( - getMetricLabel, - ), - timeCompare: ensureIsArray(timeCompare), - comparisonType: - comparisonType === 'absolute' ? 'difference' : comparisonType, - }) - : rawData; - - return { - width, - height, - data, - colorScheme, - dateTimeFormat, - numberFormat, - useAreaProportions: roseAreaProportion, - useRichTooltip: richTooltip, - sliceId, - }; -} diff --git a/superset-frontend/plugins/plugin-chart-rose/tsconfig.json b/superset-frontend/plugins/plugin-chart-rose/tsconfig.json deleted file mode 100644 index 03190ec5bd4b..000000000000 --- a/superset-frontend/plugins/plugin-chart-rose/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - // Path Resolution: Override baseUrl to maintain correct path mappings from parent config - // (e.g., "@apache-superset/core" -> "./packages/superset-core/src") - "baseUrl": "../..", - - // Directory Overrides: Parent config paths are relative to frontend root, - // but packages need paths relative to their own directory - "outDir": "lib", - "rootDir": "src", - "declarationDir": "lib" - }, - "include": ["src/**/*.ts", "src/**/*.tsx", "types/**/*"], - "exclude": [ - "src/**/*.js", - "src/**/*.jsx", - "src/**/*.test.*", - "src/**/*.stories.*"], - "references": [ - { "path": "../../packages/superset-core" }, - { "path": "../../packages/superset-ui-core" }, - { "path": "../../packages/superset-ui-chart-controls" } - ] -} diff --git a/superset-frontend/plugins/plugin-chart-rose/types/external.d.ts b/superset-frontend/plugins/plugin-chart-rose/types/external.d.ts deleted file mode 100644 index 66677a600a60..000000000000 --- a/superset-frontend/plugins/plugin-chart-rose/types/external.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * 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. - */ - -declare module '*.png' { - const value: string; - export default value; -} - -declare module '*.jpg' { - const value: string; - export default value; -} diff --git a/superset-frontend/scripts/check-custom-rules.js b/superset-frontend/scripts/check-custom-rules.js index a49fd794f9aa..c8ab418336f9 100755 --- a/superset-frontend/scripts/check-custom-rules.js +++ b/superset-frontend/scripts/check-custom-rules.js @@ -687,7 +687,7 @@ function main() { /\/dist\//, // formerly the legacy-* plugins; they keep old color patterns and // eager t() calls pending modernization - /plugins\/plugin-chart-(calendar|chord|country-map|horizon|paired-t-test|parallel-coordinates|partition|rose|world-map)\//, + /plugins\/plugin-chart-(calendar|chord|country-map|horizon|paired-t-test|parallel-coordinates|partition|world-map)\//, /plugin-chart-point-cluster-map\/src\/controlPanel/, // Data visualization color choices /\/vendor\//, // Third-party vendor code /spec\/fixtures\//, // Test fixtures diff --git a/superset-frontend/src/visualizations/presets/MainPreset.ts b/superset-frontend/src/visualizations/presets/MainPreset.ts index 9970096dae18..b2938c1cfbc3 100644 --- a/superset-frontend/src/visualizations/presets/MainPreset.ts +++ b/superset-frontend/src/visualizations/presets/MainPreset.ts @@ -29,7 +29,6 @@ import HorizonChartPlugin from '@superset-ui/plugin-chart-horizon'; import PairedTTestChartPlugin from '@superset-ui/plugin-chart-paired-t-test'; import ParallelCoordinatesChartPlugin from '@superset-ui/plugin-chart-parallel-coordinates'; import PartitionChartPlugin from '@superset-ui/plugin-chart-partition'; -import RoseChartPlugin from '@superset-ui/plugin-chart-rose'; import TableChartPlugin from '@superset-ui/plugin-chart-table'; import { WordCloudChartPlugin } from '@superset-ui/plugin-chart-word-cloud'; import WorldMapChartPlugin from '@superset-ui/plugin-chart-world-map'; @@ -63,6 +62,7 @@ import { BigNumberPeriodOverPeriodChartPlugin, EchartsHeatmapChartPlugin, EchartsGanttChartPlugin, + EchartsRoseChartPlugin, EchartsTimePivotChartPlugin, EchartsBulletChartPlugin, } from '@superset-ui/plugin-chart-echarts'; @@ -133,7 +133,7 @@ export default class MainPreset extends Preset { new PartitionChartPlugin().configure({ key: VizType.Partition }), new EchartsPieChartPlugin().configure({ key: VizType.Pie }), new PivotTableChartPluginV2().configure({ key: VizType.PivotTable }), - new RoseChartPlugin().configure({ key: VizType.Rose }), + new EchartsRoseChartPlugin().configure({ key: VizType.Rose }), new TableChartPlugin().configure({ key: VizType.Table }), new EchartsTimePivotChartPlugin().configure({ key: VizType.TimePivot }), new TimeTableChartPlugin().configure({ key: VizType.TimeTable }), diff --git a/superset-frontend/tsconfig.json b/superset-frontend/tsconfig.json index 4422038e4b7b..16400707368b 100644 --- a/superset-frontend/tsconfig.json +++ b/superset-frontend/tsconfig.json @@ -86,7 +86,6 @@ { "path": "./plugins/plugin-chart-paired-t-test" }, { "path": "./plugins/plugin-chart-parallel-coordinates" }, { "path": "./plugins/plugin-chart-partition" }, - { "path": "./plugins/plugin-chart-rose" }, { "path": "./plugins/plugin-chart-world-map" }, { "path": "./plugins/plugin-chart-ag-grid-table" }, { "path": "./plugins/plugin-chart-cartodiagram" }, From 270e2231b35c903306e6e8fec40b041803121870 Mon Sep 17 00:00:00 2001 From: Claude Code Date: Fri, 24 Jul 2026 15:42:35 -0700 Subject: [PATCH 2/3] fix(rose): clamp the area-proportion radicand against negative cumulatives Difference-style comparisons can drive the running total negative, which turned the area-mode sqrt into a NaN radius. Clamp the radicand at 0 so a negative cumulative collapses to the center instead. Co-Authored-By: Claude Fable 5 --- .../src/Rose/transformProps.ts | 6 +++++- .../test/Rose/transformProps.test.ts | 20 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Rose/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/transformProps.ts index 993bf18425bf..09c0ec5a88c2 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Rose/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/transformProps.ts @@ -92,8 +92,12 @@ export default function transformProps( let previousOuter = 0; const entries = (datum[time] ?? []).map(entry => { cumulative += entry.value; + // Area encoding is undefined for a negative cumulative (possible + // with difference-style comparisons); clamp the radicand at 0 so a + // negative running total collapses to the center rather than + // producing a NaN radius. const outer = roseAreaProportion - ? Math.sqrt(cumulative / maxSum) + ? Math.sqrt(Math.max(0, cumulative / maxSum)) : cumulative; const increment = outer - previousOuter; previousOuter = outer; diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/Rose/transformProps.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/Rose/transformProps.test.ts index fcfc2c93f545..5058b0702370 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/test/Rose/transformProps.test.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/test/Rose/transformProps.test.ts @@ -149,3 +149,23 @@ test('handles empty results without crashing', () => { expect(periods).toEqual([]); expect((echartOptions as any).series).toEqual([]); }); + +test('area proportion clamps negative cumulatives instead of yielding NaN', () => { + // difference-style comparisons can produce negative values + const negatives = [ + { __timestamp: T1, 'sum__num, East': -30, 'sum__num, West': 10 }, + ]; + const props = new ChartProps({ + width: 800, + height: 600, + formData: { ...formData, roseAreaProportion: true }, + theme: supersetTheme, + queriesData: [{ data: negatives }], + hooks: {}, + }) as unknown as EchartsRoseChartProps; + const { echartOptions } = transformProps(props); + const { series } = echartOptions as any; + series.forEach((s: any) => + s.data.forEach((d: any) => expect(Number.isNaN(d.value)).toBe(false)), + ); +}); From 77d20d4f4bd4a1abb19296b39538738a9caaadf2 Mon Sep 17 00:00:00 2001 From: Claude Code Date: Fri, 24 Jul 2026 17:00:17 -0700 Subject: [PATCH 3/3] fix(rose): look periods up by original key, not a parseInt round-trip The transform sorted period keys with parseInt and then re-looked-up datum by the parsed number, which silently dropped every period when __timestamp was serialized as anything other than a plain epoch number (an ISO string, for instance), leaving a blank chart. Sort numerically where possible but index by the original key, and carry each period's raw timestamp on its entries for the axis label. Co-Authored-By: Claude Fable 5 --- .../src/Rose/transformProps.ts | 28 +++++++++++++------ .../test/Rose/transformProps.test.ts | 24 ++++++++++++++++ 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Rose/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/transformProps.ts index 09c0ec5a88c2..f85ebc8547f8 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Rose/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Rose/transformProps.ts @@ -69,17 +69,26 @@ export default function transformProps( const timeFormat = getTimeFormatter(dateTimeFormat); const colorFn = CategoricalColorNamespace.getScale(colorScheme); - const times = Object.keys(datum) - .map(t => parseInt(t, 10)) - .sort((a, b) => a - b); - const seriesNames = (datum[times[0]] ?? []).map(entry => + // Sort the period keys by their numeric timestamp when numeric, but look + // entries up by the ORIGINAL key: a parseInt round-trip would silently + // drop every period if `__timestamp` is ever serialized as anything but + // a plain epoch number (an ISO string, say), leaving a blank chart. + const periodKeys = Object.keys(datum).sort((a, b) => { + const na = Number(a); + const nb = Number(b); + if (Number.isNaN(na) || Number.isNaN(nb)) { + return a < b ? -1 : a > b ? 1 : 0; + } + return na - nb; + }); + const seriesNames = (datum[periodKeys[0]] ?? []).map(entry => displayName(entry.name), ); // The largest per-period sum sets the full radius, like the legacy // renderer's maxRadius/maxSum proportion. - const sums = times.map(time => - (datum[time] ?? []).reduce((acc, entry) => acc + entry.value, 0), + const sums = periodKeys.map(key => + (datum[key] ?? []).reduce((acc, entry) => acc + entry.value, 0), ); const maxSum = Math.max(...sums, 0) || 1; @@ -87,10 +96,13 @@ export default function transformProps( // stacked outer radius is sqrt(cumsum/maxSum) on a [0, 1] radius axis; // each series plots the increment between consecutive outer radii. In // radius mode the raw values stack linearly and the axis normalizes. - const periods: RosePeriod[] = times.map(time => { + const periods: RosePeriod[] = periodKeys.map(key => { + const periodEntries = datum[key] ?? []; + // the raw timestamp rides along on each entry; fall back to the key + const time = Number(periodEntries[0]?.time ?? key); let cumulative = 0; let previousOuter = 0; - const entries = (datum[time] ?? []).map(entry => { + const entries = periodEntries.map(entry => { cumulative += entry.value; // Area encoding is undefined for a negative cumulative (possible // with difference-style comparisons); clamp the radicand at 0 so a diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/Rose/transformProps.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/Rose/transformProps.test.ts index 5058b0702370..b64933e23cee 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/test/Rose/transformProps.test.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/test/Rose/transformProps.test.ts @@ -169,3 +169,27 @@ test('area proportion clamps negative cumulatives instead of yielding NaN', () = s.data.forEach((d: any) => expect(Number.isNaN(d.value)).toBe(false)), ); }); + +test('renders when __timestamp is serialized as a non-epoch string', () => { + // some backends/date formats return ISO-ish timestamps rather than epoch + // millis; a parseInt round-trip on the key would strand every period + const isoRecords = [ + { __timestamp: '2021-01-01', 'sum__num, East': 30, 'sum__num, West': 10 }, + { __timestamp: '2021-02-01', 'sum__num, East': 10, 'sum__num, West': 10 }, + ]; + const props = new ChartProps({ + width: 800, + height: 600, + formData, + theme: supersetTheme, + queriesData: [{ data: isoRecords }], + hooks: {}, + }) as unknown as EchartsRoseChartProps; + const { echartOptions, periods, seriesNames } = transformProps(props); + const { series } = echartOptions as any; + + // both periods survive and both series get their values + expect(periods).toHaveLength(2); + expect(seriesNames).toEqual(['East', 'West']); + expect(series[0].data.map((d: any) => d.value)).toEqual([30, 10]); +});