This is an automated email from the ASF dual-hosted git repository.
rusackas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new f168dd69a8 fix(sunburst): Fix sunburst chart cross-filter logic
(#31495)
f168dd69a8 is described below
commit f168dd69a8df5d2310ec899c571ed6deb0d088ca
Author: Michael Gerber <[email protected]>
AuthorDate: Thu Jul 31 03:47:02 2025 +0200
fix(sunburst): Fix sunburst chart cross-filter logic (#31495)
---
.../src/Sunburst/EchartsSunburst.tsx | 61 +++++++++++-----------
1 file changed, 31 insertions(+), 30 deletions(-)
diff --git
a/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/EchartsSunburst.tsx
b/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/EchartsSunburst.tsx
index eee7bc8426..4d2c13d943 100644
---
a/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/EchartsSunburst.tsx
+++
b/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/EchartsSunburst.tsx
@@ -39,7 +39,6 @@ export default function EchartsSunburst(props:
SunburstTransformedProps) {
width,
echartOptions,
setDataMask,
- labelMap,
selectedValues,
formData,
onContextMenu,
@@ -52,45 +51,47 @@ export default function EchartsSunburst(props:
SunburstTransformedProps) {
const getCrossFilterDataMask = useCallback(
(treePathInfo: TreePathInfo[]) => {
const treePath = extractTreePathInfo(treePathInfo);
- const name = treePath.join(',');
- const selected = Object.values(selectedValues);
- let values: string[];
- if (selected.includes(name)) {
- values = selected.filter(v => v !== name);
- } else {
- values = [name];
+ const joinedTreePath = treePath.join(',');
+ const value = treePath[treePath.length - 1];
+
+ const isCurrentValueSelected =
+ Object.values(selectedValues).includes(joinedTreePath);
+
+ if (!columns?.length || isCurrentValueSelected) {
+ return {
+ dataMask: {
+ extraFormData: {
+ filters: [],
+ },
+ filterState: {
+ value: null,
+ selectedValues: [],
+ },
+ },
+ isCurrentValueSelected,
+ };
}
- const labels = values.map(value => labelMap[value]);
return {
dataMask: {
extraFormData: {
- filters:
- values.length === 0 || !columns
- ? []
- : columns.slice(0, treePath.length).map((col, idx) => {
- const val = labels.map(v => v[idx]);
- if (val === null || val === undefined)
- return {
- col,
- op: 'IS NULL' as const,
- };
- return {
- col,
- op: 'IN' as const,
- val: val as (string | number | boolean)[],
- };
- }),
+ filters: [
+ {
+ col: columns[treePath.length - 1],
+ op: '==' as const,
+ val: value,
+ },
+ ],
},
filterState: {
- value: labels.length ? labels : null,
- selectedValues: values.length ? values : null,
+ value,
+ selectedValues: [joinedTreePath],
},
},
- isCurrentValueSelected: selected.includes(name),
+ isCurrentValueSelected,
};
},
- [columns, labelMap, selectedValues],
+ [columns, selectedValues],
);
const handleChange = useCallback(
@@ -101,7 +102,7 @@ export default function EchartsSunburst(props:
SunburstTransformedProps) {
setDataMask(getCrossFilterDataMask(treePathInfo).dataMask);
},
- [emitCrossFilters, setDataMask, getCrossFilterDataMask],
+ [emitCrossFilters, columns?.length, setDataMask, getCrossFilterDataMask],
);
const eventHandlers: EventHandlers = {