From 22891894d4d4e97dd3e3fc58e1a5d7057c5f4d7c Mon Sep 17 00:00:00 2001 From: shaurya Date: Mon, 31 Aug 2026 00:53:37 +0530 Subject: [PATCH 1/3] docs: fix superset-core component source links after src/ui removal (#43690) --- docs/developer_docs/extensions/components/alert.mdx | 4 ++-- docs/developer_docs/extensions/components/index.mdx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/developer_docs/extensions/components/alert.mdx b/docs/developer_docs/extensions/components/alert.mdx index 296a6f120f14..5a48438b61ac 100644 --- a/docs/developer_docs/extensions/components/alert.mdx +++ b/docs/developer_docs/extensions/components/alert.mdx @@ -114,8 +114,8 @@ function MyExtension() { ## Source Links -- [Story file](https://github.com/apache/superset/blob/master/superset-frontend/packages/superset-core/src/ui/components/Alert/Alert.stories.tsx) -- [Component source](https://github.com/apache/superset/blob/master/superset-frontend/packages/superset-core/src/ui/components/Alert/index.tsx) +- [Story file](https://github.com/apache/superset/blob/master/superset-frontend/packages/superset-core/src/components/Alert/Alert.stories.tsx) +- [Component source](https://github.com/apache/superset/blob/master/superset-frontend/packages/superset-core/src/components/Alert/index.tsx) --- diff --git a/docs/developer_docs/extensions/components/index.mdx b/docs/developer_docs/extensions/components/index.mdx index 715e8dd4fbbe..78c076cc1963 100644 --- a/docs/developer_docs/extensions/components/index.mdx +++ b/docs/developer_docs/extensions/components/index.mdx @@ -47,8 +47,8 @@ export function MyExtensionPanel() { Components in `@apache-superset/core/components` are automatically documented here. To add a new extension component: -1. Add the component to `superset-frontend/packages/superset-core/src/ui/components/` -2. Export it from `superset-frontend/packages/superset-core/src/ui/components/index.ts` +1. Add the component to `superset-frontend/packages/superset-core/src/components/` +2. Export it from `superset-frontend/packages/superset-core/src/components/index.ts` 3. Create a Storybook story with an `Interactive` export: ```tsx From b310f469c208cb7f5885189f21558935b4b66687 Mon Sep 17 00:00:00 2001 From: SBIN2010 Date: Sun, 30 Aug 2026 22:25:37 +0300 Subject: [PATCH 2/3] feat(dashboard): add a tooltip displaying chart descriptions (#43271) --- .../SliceHeader/SliceHeader.test.tsx | 180 +++++++++++++++++- .../components/SliceHeader/SliceInfo.test.tsx | 64 +++++++ .../components/SliceHeader/SliceInfo.tsx | 45 +++++ .../components/SliceHeader/index.tsx | 32 +++- 4 files changed, 319 insertions(+), 2 deletions(-) create mode 100644 superset-frontend/src/dashboard/components/SliceHeader/SliceInfo.test.tsx create mode 100644 superset-frontend/src/dashboard/components/SliceHeader/SliceInfo.tsx diff --git a/superset-frontend/src/dashboard/components/SliceHeader/SliceHeader.test.tsx b/superset-frontend/src/dashboard/components/SliceHeader/SliceHeader.test.tsx index 5ccb7fc546d4..73bce191e29c 100644 --- a/superset-frontend/src/dashboard/components/SliceHeader/SliceHeader.test.tsx +++ b/superset-frontend/src/dashboard/components/SliceHeader/SliceHeader.test.tsx @@ -19,7 +19,12 @@ import { Router } from 'react-router-dom'; import { createMemoryHistory } from 'history'; import { getExtensionsRegistry, VizType } from '@superset-ui/core'; -import { render, screen, userEvent } from 'spec/helpers/testing-library'; +import { + fireEvent, + render, + screen, + userEvent, +} from 'spec/helpers/testing-library'; import { enableMobileConsumptionFlag, mockMobileMatchMedia, @@ -106,6 +111,13 @@ jest.mock('src/dashboard/components/FiltersBadge', () => ({ ), })); +jest.mock('./SliceInfo', () => ({ + __esModule: true, + default: ({ slice }: { slice: { description: string } }) => ( +
{slice.description}
+ ), +})); + jest.mock('src/dashboard/util/isEmbedded', () => ({ isEmbedded: jest.fn().mockReturnValue(false), })); @@ -571,6 +583,172 @@ test('Correct actions to "SliceHeaderControls"', () => { expect(props.handleToggleFullSize).toHaveBeenCalledTimes(1); }); +test('Should show chart description info icon when description exists and is collapsed', () => { + const props = createProps({ + slice: { + ...createProps().slice, + description: 'Test chart description', + }, + isExpanded: false, + }); + render(, { + useRedux: true, + useRouter: true, + initialState, + }); + expect(screen.getByTestId('chart-description-info-icon')).toBeInTheDocument(); +}); + +test('Should hide chart description info icon when description is expanded', () => { + const props = createProps({ + slice: { + ...createProps().slice, + description: 'Test chart description', + }, + isExpanded: true, + }); + render(, { + useRedux: true, + useRouter: true, + initialState, + }); + expect( + screen.queryByTestId('chart-description-info-icon'), + ).not.toBeInTheDocument(); +}); + +test('Should hide chart description info icon when chart has no description', () => { + const props = createProps({ + slice: { + ...createProps().slice, + description: '', + }, + isExpanded: false, + }); + render(, { + useRedux: true, + useRouter: true, + initialState, + }); + expect( + screen.queryByTestId('chart-description-info-icon'), + ).not.toBeInTheDocument(); +}); + +test('Chart description icon is a keyboard-focusable button', () => { + const props = createProps({ + slice: { + ...createProps().slice, + description: 'Test chart description', + }, + isExpanded: false, + }); + render(, { + useRedux: true, + useRouter: true, + initialState, + }); + const icon = screen.getByRole('button', { name: 'Chart description' }); + icon.focus(); + expect(icon).toHaveFocus(); +}); + +test('Should show chart description in popover on hover', async () => { + const props = createProps({ + slice: { + ...createProps().slice, + description: 'Test chart description', + }, + isExpanded: false, + }); + render(, { + useRedux: true, + useRouter: true, + initialState, + }); + + expect(screen.queryByTestId('slice-info')).not.toBeInTheDocument(); + + await userEvent.hover(screen.getByTestId('chart-description-info-icon')); + + expect(await screen.findByTestId('slice-info')).toHaveTextContent( + 'Test chart description', + ); +}); + +test('Should show chart description in popover on click', async () => { + const props = createProps({ + slice: { + ...createProps().slice, + description: 'Test chart description', + }, + isExpanded: false, + }); + render(, { + useRedux: true, + useRouter: true, + initialState, + }); + + expect(screen.queryByTestId('slice-info')).not.toBeInTheDocument(); + + await userEvent.click(screen.getByTestId('chart-description-info-icon')); + + expect(await screen.findByTestId('slice-info')).toHaveTextContent( + 'Test chart description', + ); +}); + +test('Should open chart description popover with Enter', async () => { + const props = createProps({ + slice: { + ...createProps().slice, + description: 'Test chart description', + }, + isExpanded: false, + }); + render(, { + useRedux: true, + useRouter: true, + initialState, + }); + + const icon = screen.getByRole('button', { name: 'Chart description' }); + expect(screen.queryByTestId('slice-info')).not.toBeInTheDocument(); + + // user-event v12 (pinned in this repo) doesn't expose .keyboard(); use + // fireEvent to dispatch keydown directly to the focused icon. + icon.focus(); + fireEvent.keyDown(icon, { key: 'Enter' }); + expect(await screen.findByTestId('slice-info')).toHaveTextContent( + 'Test chart description', + ); +}); + +test('Should open chart description popover with Space', async () => { + const props = createProps({ + slice: { + ...createProps().slice, + description: 'Test chart description', + }, + isExpanded: false, + }); + render(, { + useRedux: true, + useRouter: true, + initialState, + }); + + const icon = screen.getByRole('button', { name: 'Chart description' }); + expect(screen.queryByTestId('slice-info')).not.toBeInTheDocument(); + + icon.focus(); + fireEvent.keyDown(icon, { key: ' ' }); + expect(await screen.findByTestId('slice-info')).toHaveTextContent( + 'Test chart description', + ); +}); + test('Add extension to SliceHeader', () => { const extensionsRegistry = getExtensionsRegistry(); extensionsRegistry.set('dashboard.slice.header', () => ( diff --git a/superset-frontend/src/dashboard/components/SliceHeader/SliceInfo.test.tsx b/superset-frontend/src/dashboard/components/SliceHeader/SliceInfo.test.tsx new file mode 100644 index 000000000000..9306174a37a1 --- /dev/null +++ b/superset-frontend/src/dashboard/components/SliceHeader/SliceInfo.test.tsx @@ -0,0 +1,64 @@ +/** + * 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 { render, screen } from 'spec/helpers/testing-library'; +import SliceInfo from './SliceInfo'; + +jest.mock('@superset-ui/core/components/SafeMarkdown/SafeMarkdown', () => ({ + SafeMarkdown: ({ source }: { source: string }) => ( +
{source}
+ ), +})); + +const setup = (description = 'Default description') => + render(); + +test('Should render chart description', () => { + setup('Hello world'); + expect(screen.getByTestId('safe-markdown')).toHaveTextContent('Hello world'); +}); + +test('Should pass markdown source to SafeMarkdown', () => { + const markdown = [ + '# Chart overview', + '', + 'This chart shows **revenue** by region.', + '', + '- North', + '- South', + '', + '[Learn more](https://superset.apache.org)', + ].join('\n'); + + setup(markdown); + expect(screen.getByTestId('safe-markdown').textContent).toBe(markdown); +}); + +test('Should render long markdown description without crashing', () => { + const longMarkdown = `# Summary\n\n${'Long description paragraph. '.repeat(100)}`; + + setup(longMarkdown); + const content = screen.getByTestId('safe-markdown').textContent ?? ''; + expect(content).toContain('# Summary'); + expect(content.match(/Long description paragraph\./g)).toHaveLength(100); +}); + +test('Should render empty description without crashing', () => { + setup(''); + expect(screen.getByTestId('safe-markdown')).toBeEmptyDOMElement(); +}); diff --git a/superset-frontend/src/dashboard/components/SliceHeader/SliceInfo.tsx b/superset-frontend/src/dashboard/components/SliceHeader/SliceInfo.tsx new file mode 100644 index 000000000000..cd452280d0c9 --- /dev/null +++ b/superset-frontend/src/dashboard/components/SliceHeader/SliceInfo.tsx @@ -0,0 +1,45 @@ +/** + * 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 { FC } from 'react'; +import { css, styled } from '@apache-superset/core/theme'; +import { SafeMarkdown } from '@superset-ui/core/components'; + +const SliceInfoContainer = styled.div` + ${({ theme }) => css` + max-width: 350px; + max-height: 400px; + overflow-y: auto; + overflow-x: auto; + font-size: ${theme.fontSize}px; + `} +`; + +interface SliceInfoProps { + slice: { + description: string; + }; +} + +const SliceInfo: FC = ({ slice }) => ( + + + +); + +export default SliceInfo; diff --git a/superset-frontend/src/dashboard/components/SliceHeader/index.tsx b/superset-frontend/src/dashboard/components/SliceHeader/index.tsx index ba8e7b27617d..f674d91ee79a 100644 --- a/superset-frontend/src/dashboard/components/SliceHeader/index.tsx +++ b/superset-frontend/src/dashboard/components/SliceHeader/index.tsx @@ -28,6 +28,7 @@ import { import { t } from '@apache-superset/core/translation'; import { getExtensionsRegistry, + handleKeyboardActivation, JsonObject, QueryData, VizType, @@ -40,7 +41,12 @@ import { } from '@apache-superset/core/theme'; import { useUiConfig } from 'src/components/UiConfigContext'; import { isEmbedded } from 'src/dashboard/util/isEmbedded'; -import { Tooltip, EditableTitle, Icons } from '@superset-ui/core/components'; +import { + Tooltip, + EditableTitle, + Icons, + Popover, +} from '@superset-ui/core/components'; import { useSelector } from 'react-redux'; import SliceHeaderControls from 'src/dashboard/components/SliceHeaderControls'; import { useIsMobile } from 'src/hooks/useIsMobile'; @@ -52,6 +58,7 @@ import { getSliceHeaderTooltip } from 'src/dashboard/util/getSliceHeaderTooltip' import { DashboardPageIdContext } from 'src/dashboard/containers/DashboardPage'; import RowCountLabel from 'src/components/RowCountLabel'; import { Link } from 'react-router-dom'; +import SliceInfo from './SliceInfo'; const extensionsRegistry = getExtensionsRegistry(); @@ -210,6 +217,8 @@ const SliceHeader = forwardRef( state => state.charts[slice.slice_id].queriesResponse?.[1], ); + const [isDescriptionOpen, setIsDescriptionOpen] = useState(false); + const theme = useTheme(); const rowLimit = Number(formData.row_limit ?? 0); @@ -339,6 +348,27 @@ const SliceHeader = forwardRef( )} + {slice.description && !isExpanded && ( + } + placement="leftBottom" + open={isDescriptionOpen} + onOpenChange={setIsDescriptionOpen} + > + + setIsDescriptionOpen(open => !open), + )} + /> + + )} {!uiConfig.hideChartControls && ( )} From 6abab3c1cb6c51f36a4b3da4ee5355a2413f6a05 Mon Sep 17 00:00:00 2001 From: SBIN2010 Date: Sun, 30 Aug 2026 23:12:50 +0300 Subject: [PATCH 3/3] feat(butterfly): added cross-filtering and drill-to-detail for the butterfly chart (#43684) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../src/query/extractQueryFields.ts | 2 + .../test/query/extractQueryFields.test.ts | 10 + .../src/Butterfly/Butterfly.tsx | 36 ++- .../src/Butterfly/images/example-dark.png | Bin 0 -> 48940 bytes .../src/Butterfly/images/example.png | Bin 0 -> 48389 bytes .../src/Butterfly/images/thumbnail-dark.png | Bin 0 -> 48859 bytes .../src/Butterfly/images/thumbnail.png | Bin 0 -> 48351 bytes .../src/Butterfly/index.ts | 15 +- .../src/Butterfly/transformProps.ts | 113 ++++++--- .../src/Butterfly/types.ts | 9 +- .../test/Butterfly/Butterfly.test.tsx | 202 ++++++++++++++++ .../test/Butterfly/transformProps.test.ts | 215 ++++++++++++++---- 12 files changed, 528 insertions(+), 74 deletions(-) create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Butterfly/images/example-dark.png create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Butterfly/images/example.png create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Butterfly/images/thumbnail-dark.png create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Butterfly/images/thumbnail.png create mode 100644 superset-frontend/plugins/plugin-chart-echarts/test/Butterfly/Butterfly.test.tsx diff --git a/superset-frontend/packages/superset-ui-core/src/query/extractQueryFields.ts b/superset-frontend/packages/superset-ui-core/src/query/extractQueryFields.ts index 24c3303b2fd2..1eb0b15b93c9 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/extractQueryFields.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/extractQueryFields.ts @@ -47,6 +47,8 @@ export default function extractQueryFields( metric: 'metrics', metric_2: 'metrics', secondary_metric: 'metrics', + left_metric: 'metrics', + right_metric: 'metrics', x: 'metrics', y: 'metrics', size: 'metrics', diff --git a/superset-frontend/packages/superset-ui-core/test/query/extractQueryFields.test.ts b/superset-frontend/packages/superset-ui-core/test/query/extractQueryFields.test.ts index a55fb9e54086..8db7c63bb559 100644 --- a/superset-frontend/packages/superset-ui-core/test/query/extractQueryFields.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/query/extractQueryFields.test.ts @@ -59,6 +59,16 @@ describe('extractQueryFields', () => { ).toEqual(['metric_1', 'metric_2', 'my_custom_metric']); }); + test('should extract butterfly chart metrics', () => { + expect( + extractQueryFields({ + groupby: ['category'], + left_metric: 'left_sum', + right_metric: 'right_sum', + }).metrics, + ).toEqual(['left_sum', 'right_sum']); + }); + test('should extract columns', () => { expect(extractQueryFields({ columns: 'col_1' })).toEqual({ columns: ['col_1'], diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Butterfly/Butterfly.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Butterfly/Butterfly.tsx index 0b523313c906..04395bb5afed 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Butterfly/Butterfly.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Butterfly/Butterfly.tsx @@ -16,15 +16,44 @@ * specific language governing permissions and limitations * under the License. */ +import { allEventHandlers, type Event } from '../utils/eventHandlers'; import Echart from '../components/Echart'; -import { ButterflyTransformedProps } from './types'; import { EventHandlers } from '../types'; +import { ButterflyTransformedProps } from './types'; + +type ButterflyChartEvent = { + name?: string; + data?: { name?: string }; + event?: Event['event']; +}; + +function getCategoryKey(params: ButterflyChartEvent): string { + return params.data?.name ?? params.name ?? ''; +} export default function Butterfly(props: ButterflyTransformedProps) { - const { height, width, echartOptions, refs, onLegendStateChanged, formData } = - props; + const { + height, + width, + echartOptions, + selectedValues, + refs, + onLegendStateChanged, + formData, + } = props; + + const { click, contextmenu } = allEventHandlers(props); const eventHandlers: EventHandlers = { + click: (params: ButterflyChartEvent) => { + click({ name: getCategoryKey(params) }); + }, + contextmenu: (params: ButterflyChartEvent) => { + contextmenu({ + ...params, + name: getCategoryKey(params), + }); + }, legendselectchanged: payload => { onLegendStateChanged?.(payload.selected); }, @@ -43,6 +72,7 @@ export default function Butterfly(props: ButterflyTransformedProps) { width={width} echartOptions={echartOptions} eventHandlers={eventHandlers} + selectedValues={selectedValues} vizType={formData.vizType} /> ); diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Butterfly/images/example-dark.png b/superset-frontend/plugins/plugin-chart-echarts/src/Butterfly/images/example-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..7effea144dacc2bf46b7d2213ae5764eaa8586c1 GIT binary patch literal 48940 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 RD$Z8%jM@Knahl2Y{|111x=R26 literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Butterfly/images/example.png b/superset-frontend/plugins/plugin-chart-echarts/src/Butterfly/images/example.png new file mode 100644 index 0000000000000000000000000000000000000000..6a6e8a14f13e60943352794a5d8587522324f655 GIT binary patch literal 48389 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

BBVnkz2p%;e3U8VaVPZ<+ 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�AeEfVPZ1|G-P|P zco7NfeA_EG<7dXY>3zSh0&rpPBCjsrYNn=HhEmB{b5W#>fZZ z){V)wmc?n$ihx>_qV`tP=a}8%fGS4hQAf3j9}cSNS&Os{2-){C*x*iG9tf zX+a|Gs~Nf1%=_-#<%|RbDjbrRm#6RrbHQ4~YfZI(%!sb58RO!75k0-E=%A814`0r8r@nsMN| zs?G2>jHe%hY`wSekvtP5!Y59g$Uy-}#dZ;8^$bR(iFw@gh6+>#ZcMT*kMb&*f z<6~ROOcURJ&d^&q<^woaZ+Yt3!5mxtE{*d_Xz>n=ZL3qq>$ z7OfkNXup`VGxSRIF=I2ZE(~evXx(I1PgeRdt&?2PCs+A0AEz_rlLhm@;9i;Ohh>5_ zo=fY6GKfVV1jbl}f3C+5SAhsp8E^k%;@3yd9`oqczge@q??zt|%kI_(^6aaKzqu+u z8e7r6=lsMwG9>23eDa!20j7x>wva=B&79u%xyKf|I1^W}`h)7_#pb`cx*u^WLq}A4 zl4-kt^2bkJqn~p$vJ9Kk!wGBsDt6RQxLE!#7rl5{d;h7It0umrhv%7%AIEfJWYeFuuysauKhiMX51U@SZ_U(xc^F5z|3q+6zMC#T+k`QsyWz=>k)8epy^(BA%8NOS zMeW{U&LZ-hF%yJL&(cg+PUhRs)0KRVyMD&NS{wKkV{pwUFi7hu;_IQkAGJcqKe>9w zT3^CRVVI}#M&jQ=?vrgt1qJ*dcK?4qPFKzlT}H)5BjgNH{iVucC^|+RdvK#O1$mpS zn%2oZ$h#6;8u-}Hp)6$gI06!+K#5K?Qxla#Nw|?TYE7puB*{5Q?!}J({xfQ9{Cpj* z7VCTugyVdA@nT0HL@BaJ`jA!(s3l!C)x`*Z$%5q}-oc`XAFd!$jY#gd zWYp^h2Du6?aU6t(L&RH1sSxUqmpqDxqy^>W<$`20CQZA&9D#b4L4CRtRnmUDsJJUQ zcG?7>dTZJVtxEwo1iyuf+g9;38*P!X%~Zc<^&7r|GBtn*27fJUCeI^nSEd3i}G^VX$f5R|m@no6EW#E)H1-YVo z3uuK*_BEk$Fki<3JGPKSXDP%5l+5M%32)r|ErSs?NXZw;c_2;~Xd-?NnYT4k*|kg^ zK+!pX?MiavwlziM!acok8pB8F{9LDZ$iQ2O@}YvNpwwtbe7tRIv0zTO+h7`!F&bm0 zHQC2#7|jUfYS|-`Qftf@xL!=EZhVPAFHi;?7$4iP)LO4m#?b>IjKw`6n zRx1QY!!ORuChTG_WblPmI7CiyOioBhFaT2(fX*nV`rCX-Apz82ns)jmxs6J07j0i@ zjBmqpuwU_V5d=IfJa)CBk81?wm2|X~8VF@){Xo=2Ub78aM$H zv3ngw)8BnZA4EESvepsBiq;Yj>jd0Dn{>LhpeXJ79jlGc+t zhyEH~QS?0UiU^7; zp^kWC(teTsQ>x?s6P}ieR0S}sUKS)z#($=>*gpo7nu#P0n89~CS<@LFM=JHy2(PC1 z=58E*Jm2jyDZ|Mj3*%TX)F<0k@4J*=ooGg|%07!UUg=OGFj>Txl2^ONhIS@xIoRz5 zLFTBfRS5LKAgm#48~j`>uml^Y&6x9C34|0+m{ev;a;bPsgQNivdhX>_yL*AmiCKFN z18h9BBt~!|6cTrjIADZTrWnVOJxus5*LPz)R$dDLr+gg8;6$uWMlW!5BL5)#w8v@$ zZY636gYux)mB1ZH2A1xwnR6J^t1+*=%`9SUwnkYX&! z7D^BAGX(h-0NR%2*PQdq}hBFu*BHF395);LVdX|0n)BIaX zVY0j~8L*NFQ&psh$|_*Uw-XJA4W;!W4fUq_85uM6!B()}Rkk}<4+88H zsh`$DEY1paF<=r$mG#;I)M^dj_*Thec2$4>s5MO{iK}SY3W6PatQq>Smd8&O5kD0+ zQhJ*uNSou^>=h*g-CRqYJXJV^#n5y>FbDR_UhL0|r)f&$a9si7gitS)2N0LZZ{VC) zA+)}Xm+#e|SP8N~8IB1pB9#Q&lV!88D{3q>-QYKFA_o@PK9Vf_M^bs>Qs~00!Lv1! zhZX`h_PFGfM|)%85je@W_my@6==RLkl< zuYV(qy7d?Lj&2x+FgO&-J42j0JPQf-_#8foO=vCERf~Q|5)cp;ppHU{%{cV=|wYwMv}5RK&cFE-Ya3Rx@0RhHA@KCcJc>anteq9LGs<#*1q?kzYc%^g475A}hck`NiJ9uU#qK}c7c9Xn1TsO;&I*&}~ zLEXceLGY1H3Qjhvo!OvzVDUEjvqyX1_Scy*>J=6WDdtnKC+9vWUEUW!NQJr%Bp;Ft zs-ZlGH-%h=)VYNTKX#>{)SF*c^UO2G!6)}(*{M}Jzs`8=!p{TGrAOVzMQ?t}ZZ#_; z8wh`gwO3~t!!SRUyV;AA?xIlm@ZFW~#2AO7R$s~zjV;&NBt7H)73q_MHt|j^p?k7l zxn7$C0%Bdwj_PY_oBh;LSXl{s9@XK(*DswAlw9kOUc`TG9k@6JaA}3o?NK*wPQaB% zd-c7Amt{fhx|sj9f^TcDDnmk>(ESVe#vaaH&6xgy8k49JJ~Am!$qE6+`GjOJ755jN zdT7TaYxmC)G4WFq`9F`JDk$)aVk{~e0Rw(Y9@sE7BUKm-%fdmE9bx zF5l2+9J;n9&t4%c+Ib28w95U72{FRbQyGs&{miB!y=$wyeiztqQIy$IdDU0$u?Ieo3-d$Lh1Qnit8j5X6mm}GS8XQU0R#~7LWXaydcj5`cQ_$$*>phbtJ zd2HTu(@Bz*N8L<>H3n4%BI&CUa{KSZ9LAwplQHezZ_it{6E%;Cfc!sma3mZbZ-eQc zT2pqqandMpr{kWy0pFFGK%D*R|X61lfee|q>jdpod(InCez~vx8@T3-iy8yAmZL7)05f3uR7^;F3 z78VMugXru@0QK;LDX(N+9^cKK$uk3>s77*hrzbX0UszG6M@ps0h=mF%3}L;4?%Y8u z=XBHziEpuT>^jG1`5dYUF(joVe;}@=7^xT9Wi@KMDlrx{P*O#ZJqU!p{u*Ra3)us>OvbC47IlM6r&-C)RW&S&{>6{PGxkda9xQk5!? z)GxF*pvWcS?OTumm9Nw`b3ouQ0f+0~r;vMqIww-MBGP9Ngh#=bJ>UrIm3v787<#H1 zLmpsGgcD>ZyO*O>JuxeZls!K@*-$MbffN^%kr0#DY6(cR07i2^YH&eDm6~>HVL-fw z6fVdwmEbCN0$-8xQZfgiyer5gfqoMJdI37x1(L_b2^yOEfs85d26#nPl3z&xO(wgV zeTOrK%)}+V*20!J+p29Fc#+RTMRnboPf!Zxn*QX-TR(-CA z8rllS6p*=*{=7QjgcPiqHUN$-Xk?{;O-(Wq5-nw90y7cB4-_}EhTEta3*KtfX`&PupqL=) zM@tZk%t_$mw$M`kgfYq^n-hxZx8ZB*9MIwZ6aCVg`CoVpQX{)^2^-7wo@X@sSjyUI z6)x?XY+gTD&@^x6>MG)})hm&Jq>B0(5ys^;TOIb|4tY^PU{WWUHOv~BWyv6&XbD?n zvB9R$f*wxG8coAW?#*zY#<>5J#S7=n_F!_*z}0GW5Y_cyGAW_Kmpvq8^6c zf?yGu(ALZZK?17!VO^Og_KZBse$cpso#j3cjo)aAQey~mM{0p*mukJ`O(f~XW#7I* zTQL5A;DFMU^b<7-Nd9nc)II}TAgRWv)gl^n7$9gL#C$^X^Ku|?9zUnOfp`Hi{7xzt zY6(D1oT<}l)ejeh>j%UlRU^aAu1}GWAigF|)Q)<%kfaW5+-;DhiwB6FMpMzd7Bi+W znv{7(`$ua{A+^YbC)1jo#n6qIab62>R%NfSIam`NMB9#9%%Q?GSrY=O~!jEH64(p%q!VSC%7EQ3-0CTGM-B%{uCG1kO?!39lw*X2kbhgfbzV_fVuAeck8JYEwW z$U?|!XAEE4o;~Q5dF^NF>Pf5$mi2)|4U3xA4w8+6!^ApGBEFgWX|n_g8A z&n5YA|0x*=fA#}Ovl@q6!iw-e*Y{RJe;r1eR&sxn)ea;y`aPDu5}Nsldx4bHaN??` z+MXbZ4Nm+7?Za%Sd0-O^pR~(~!3Aw!qYVW7sJAJPmg^4q)`$DTxI}|Tpa?_S#u6N` zRCYjnJbOwPOcMi1&l~#HtXjOIl8gL2c4*#ltUafXs#TSENP+iPT}?1&ZI;2qzuSg@%#@HDIz(TYU+~ z85zN$UlK#+ghEoAaID@z7FlwU$(*QJDbBNILP%VdLf$DfMLi7AL}{clK<2si!v?RhGI z|Evf2e`Rovoxd^dg$~-_V^we~W=cCeUo~o}VmqhuR++M>^wdL_%gi)N?BaEXxu-1E zY!|INm|;2Z_jBbMx`UTuPiD^JaS*2WM$OO<$Ky+l3Js<61%ba|`7$1H^)8ftN|8Bs zmZ|+OtJVG|(G0Y>L1j&QZpXN@k4n=|YdLau-|tFavEYlI;#un! zY^{I8F!d?VpCxi;So*ispZ$9H3q7;!y)VC>Qhjz=qJsS1g=_whXow4V`O7bLiZi62 zX>PRNxpkptvHh3b)jRjC$^KEaEtoAZ7Nt1%j?nVsR*ik?k>v+EGt63~5)*XTeZhlu z426%xmV()dtzUV9&T^^UZ^{Ke3LYc={^|pXh*xh|jGjRZk6SL|AKT!(*g9Q5XCfpr5D-a( zhER$S94+^e!29Gr|GeYB#MGl3&?$()U=EM`+5F}N@z4|GGh^LZ;t#P-J&vr?bpI%> z3;eit|8n(#Ajhlk96hLxEz9cd-$(XZ`q^1RJotpZ6toLz`-qqfKa|Azb9E?uH*_MDvmWa{N!`G4La+`03RLevw{%dsj1aZXA22RNP!<@fV|#Xgb@5QTx8^ri+03U#rlMsvrrxP!ny zH=pzXV2Xi9DI(J!p0Pm+9VFx<&vjm%X6TWEC%|9l)OtM1fQejsw1;Ze$P%@vZ4Wi8Bmo6jv_2TG zT;IxYE4U-NgxN_(GNA9dcQtxLaJmrY7Dnm`_*CXi*9ZPgweJi(+3<|aee~5z zfH}u{{j+L2TIiVtE1>yzf_Eml4I8%dFgPw+?dB>ZJAff3lb$^>UWw{rUrLdy2z5iE zBDk`m)S7()uC_#b2nNl125m|A?(Pg=pi0k%ifFPb7Gh$S+0>U>ikOlO( z0fQ0&YQRnHEuI6RP>qxv4a5Tz- zhfnNC9VL=A)=RLy3V1SE(UIbaY&j%l52^3=lLyrO9#o(L36#t=Hk1C1dV?@oX!S!q z#q&vSLQTXG2!iSyV0EJB&h)jQnYz?)qj&O1JHviQNK$hFcaY0rw-Q@{mO=wfHQiPB zkMG75SHC`n{v`46brGP)o;8!>faqLHYC>;8>IF)Vcqnj7LOxF|^8tv%NFV_aiKhka z1nHEl9s}(bK^j8&C_sCY%96}Q#CGD@5sfH>AA~%_+x%30HLwgB>d5HB20&q%Z{UZP zr~dkXkdC58O$FL03S3}ZaFhY^ zZ+Lb!baW&wMY6pX4Wj){($zRiITnalB)C5x2jQr|(!!G!hH2lzZiQVa+d17pQ&SVB zh}b42?t3NDm3$XBO~738S!FUIfMGmZiJ=z9)|= zLj#yzA@^P(0mnKt2CtUA9UPF$bLXZNSIgPbE4n(6{vZ*mfa zfdZsnyTmhhRuHhHMciB%Qlqn(gGYKj2fataxTTBvE2o$zp6;O*L5Sqm;MwiBK|&jA zj0HeFlY5~=O_Fm-ijEexO7Gb_%E!^%@P@}Q(W*b+d3Y(>C6nKon%Kb%=S${3?NnPP z3*6s3*V!J_8>iEWBt!#pNr1z7kfSC(mCGcKmdH9-M}?SZ@j3WYk;)3tYxF=4C}(Le zQLi{ep25rtA!ee+_@ll@+#pEKcodXQ$A^2PoE$d2xH>s^uEr zg+dA05(W=n?^5@kr6j1Nx`>%q*1H81^2%mC zlN&FQ>%4FG3PgGw4l9zvrWGoV{g0$F#^;&P<^s*aqrJDSK8GZo!B6Fs-66DqGX0dXa4!bbFb z4P+k0I0d19UR(8kP7b+;aWK`t$=}F6q$_6p>)fGIO|@ zWWkUS=b;DKlL6lgl6AJqBmt#HUEsWVieK&ko1@9%I(D}aH%A&wGL+72{3-f}$i)|- z9is<@)nvIN*@=TJc))lOS<~o=bL_DKwn1lgA|1)Rcq!mm1Wv?Zh;#k?%3Kg_H5@Jl z1l|dRJcEuytb*=o$(vVz#)(h}^24vOcZn)J2&2D$K(B5Fz$tP za*`06x(-0Wyxqm)6)6oVUEF)~3jU+Bg(@FZFan3=d`yDzNcB*xX6EON4o6~tsg>I> zo}(8+{1E1>0AaWnfl!J`t=O81I2}dSupk=YNGw2krbccXcl3f5wF;xhu(3zVlY8;B zx|^3Prn=Yyj3jQge`RO~{)g&D#D;cYy!K=>k7T;<^pGn|irBboo#VFI0(X>-DBOrW|yuRd4_ z@oL}S&>@RAGatLdngl|n1-5+xo*mcM?fuhZhK(73WiHs_WkvuTyhoRAtG53Dx73e`et|u|czu8K}g}ooGT$8Pd@s6KD z;b*YwJ$8gxhTi*3oaeuoJYmnhHxGYQ^!(YA`4c|CqX+V_&1Bfad&3>p@Xt}OhWyQ! zCW}7mZ~kl+^~pM*+g)^#ENpmhh=d&fITcV|Y_j#Mk3PGk`TysKvhro+`~S$jYu>%zp?I2R&p1`=TeE1qx#n5rHTo6evVN5d}&`Hmj(bdtV{YeVjS- zN9N2-pK#2H>!aR#zxR9JcfY&z7%`>ChchI$%_YN9%iF#t)YEhQqp*rA^7{q-!TedV z-REa*3>Z2keM+dp-MsijQmqZa6H&^H4h`)87YO5De*5`}q%*u;eh(}zY4O0F=vQTe zUnatz_CqGH-LV4IKF4hM4PodCcDC1#&mwIF2u$N-;#u+|eP5_MKp0Snm<Q5mW-4z%b;nX+6x8^5|cZ=VTztYKqpM&Sss0>}G^+fspcW zK*27|QDYAJSZ!Y^sPzHnG{u9CJWN7@IYT7urx^zx1ZX(Q>p~0Z%}=w93fSndtl&V6 zwOwD${#Ro*rJsJcWmhce&73@gY+SnQ4p;_24_UBlo4j=G1CXn4s?GXcbnFy%1!&jJORIPh}r` za=Q1PlofQ7IA~lj)fixpHJo?Z+-e?LT5PO%JotxC2YlkNuiejx{rGxt!s%3fr?wQC zm=9o`{CKS=fGWzTNnCXBT0gcmS;9U#-8^%T^0)%3@e z6RM!_;c~E{V0D8Ft(9prL}lfe$420<`TD)F5TA|?IMHBF2uyGI^*+#>Rnd2gE(Q>1 zO<~lX@tWIbX;cfNS6`F!%^;BMr>qG6N)Jo|rr~;to@_6nBRIGpB#wt43V^?XF)DTN zvXU=8gfMCwI>K zR@_S?%7zPB?yB-0W1sRd=FT+LV(>IFl-KOApE@7PM)X0;2)f3}4NJ_dmXAvT7K;nV zsk!_+Sc}E)o~$r$%Ze({2Po76Y3hy@Z!{pOGzi*<(6sbP8RMpyg{Ta@yeMt(k__ zeI8J9!ViFp%%R=i%;bhZLQAyCA1n?ASaRPO(5VPc5xc4}-mT3ho zR^Br@$P6EfhSi7jfiMSFn5rxqk1rUeOxpGcryNdv0+50&!-?uDbeUKj_el}~RFJB8 z_sL5xK!_OOLF%mPQGJj~N{Aa>7#VzQbFt9XS;b$*7FiX~>K?9U7!Q57iQeD@)<3;8 za1}sxGBN08qanOx3=*bTFii#rOOXpES(z?~#wmc^bbAynI}}&IgDKXg_7-i{wKox2 zYCr7y0`CPBHr3j6?1cUh(GqCDRI193*R7ui2GWsZNpXCj~zP6$Q*kgHEaj5-wI$}WU$#NnL1S#US&~kWG&}0 zko1!?EX+ZU&1lWK^R`CvAKL5K;}}cg7tv;~DE8#tO6Dg`)Lasch_dxCacw>|-QYD*?O9FppG8?Isb@0B9~z|{{8r0~ zPLStt2XgcOu4DfL{CMS)JtC@c@FOC7o27$GZvkDfip0{G_wsV_&D;Tj;V7;=~29YHIBv~+nQIyH)rq) z;`j~05{cjwH&y;Kiea=N0yBHoTP%O+KLdh-XL4~jBU3hH{0$I>sYBQIf9TyFJ=uT> zN#MgYdcBNxYPI?*9=sZ~`1Z;h0kL{P3$hsVSyz*ei<-EudMLQ>EX+w=Ayb`h8WK7B z?T^5KzmgL4<`aXm2R$k|hQjb;8Xa~mm<|6*yuzYoIy-ebO`w{m5h_D_kmj0HHn>`k*UVM2*G-%y64l5^LB?)iln?O?M8wc#G$FZwG>U6<&{OBglTEcOywU0$UlA z(0po)IKpXV)8M@1JHK|%Re$)3FtjPaJG8HDigtB)!7WxfoWH`%z|EqGo*|;a*CGF^zO&~6NgX#ZXBpNV1-N}$5>uPqZ7~`m=F6>7h?2u@K&!% zaQ!L4H&6dg;Io7GVV|zun%|bmvJ;mq4W+3?0!d@A7C#f!yp(fvmiM`nESmL3e#vpV$%P8R&x~TlRQBu9klhH=(;H=Z`=@2GiiVRHa5q?TWuf(1ub$e+s@K1Meib#ku(AAbgnh@)xWv)No=%%*{HP(|$!^TQ|{x2a4E0V?8F zM5Ai2%cji+m>Rf9(`iBql;yUz(Nxx8YM;K~KSw6))1|-%>$X)uIuHTaWGoFi2y4)N z2R&;Z=6`$1L%@n7(7*|;H*g8gRTD9CW$v%Q0N8}qrUk~EALT@U_XIZ9q=9g5D8y+2 zvugcNlXu~kFJPu>x|uNQigpcj5?T*h6}E`xz~=K6d4QV^hp##3miP=d?ND%69)qa_ zL?-z-_IjFm(Ep0&R8{sET)Gy20uToX5M^iPLu9y}K85p4?;BXO%&bYd{5Nrp&0jbF zSFi&O-*|3Xd1cG-l|Q3TSCX{I(vD1+C_Z+G6_Kwp}Mb z@;=mRKHI<6&^?PE$Z?;dBF(vQ=|$Bv`^F4eD$r?ghw8zU;*BOnh9Ri(Di0^M9qmWK zb;IM19hX)z+*0Nv(x<5snAWw3Hf2NixatNUkiU4}x@(6Av zzh+jYDi_x?PKW_*dX)}9Q&{mh?v?Kx#QLiFCMEFlCKT7f#+&D@RL-^k(ZWQ12 z*fIe~-9W)v9fChef?K1Cjx|43%d6;Afvb6lMzS=)z@KD>rm@MBSWa0Wpm4S5q4)+0Ht);vUu)* z=aZI4wBL>gmO-sepRzZ*i)I*)3SCU{>~DRWoV2;J9J;~bpFV);$d@?x>sqZ_KkvW*{hko6ok`__eNK#XuM5u39 zQ;?#$(9Fz2YEZdGNg==qG-r+;6ygkEjyn=_xSCedmmcH-YLlqPNUNs-g$k}_eT#5kJR3q zv*)n;yR#3?8DApb8GLKR+$6twg+JPbd~5pN4{zLl`^Pe+y4fHk%uC_6W>HNA;)+As&t|-$N+oLf*!)zhSN~ zCDY#Om|Z8+zGnw4oPTJ`QkTbs~KG`Dh?D%9Hb|h3pO*0E_aaj z@on2lNh3O(ar@o6;b{`?vR!{fk@T$&(t>a!9pl4rBYB{2K!F%VdPNW0!JUMdPSceR zo8X0CSSKny_jWKV#&^VU;fzl1gR%nmn+JLmJdG1P|Nb^!o%SpLaKrVVYQ|S%@>~;_ zOWSvu71^DU-2Vd?@=$J{tOvL`VC*QzAKMp^d3w~Hb1iBNn-hW8KgT?`c95v{mjiB9 z_lupbZBaLmHt#7ipVIK*5%-PKnvhe6&V?Cntvl&X6^2ygQ9Nlv-8tPTb7&wvmwj|7 zb=)qE-&`z2(UHZ|H$At-Qy`GM7S4+sb4Xa*S@vM`=ucd@1y+JuaL@7NB7w4W+_96g z)a8QW0Rs7?{h2z^g$vbrU%KA?FUEuERLct*`fI7XK(eywLbAe&TlzV~HRkvrGlrqo zPXH%gWHYO%QvveI#l#y7)sOyxUhOqWkd~b2A}#5%s6=)^hORZsgphzdJJ@C=|(A}tIMzGnVV?tB` z25G2wlQc$X1O@97A&~%uK*_zw z5CU7tZ(~Bqa!<(MBsJMm#-rmPYreq{|~z4D8|=V?!!B0GHItMv_N> zj-+97+ptX5xJ<}ULW8cTo208@90}O_Oup_|7D8r+gqxJ|sNjP9iq1Di$?T;5S_Hq0{_GsqXc z-RJwp{YB+p5I~zc&3z}Wi{+NH=x9(`kHb(hm!loF1+$G_EMyB6=NO-nG0oC&gAL99 zs5yW}$N3FRi7DpDb2TR41dRC`^yR}~lo_W?Z1P-ph=dPx__u3I;ET#pp*V-c6u~eC zPzZZS^7IX>?_g-m@|P_Z#12RC4RfOVdzzN}t>mX?_>M$qI;e+&28p9AXB4`!5(BFm zk{@WT5I(IJ^O^E!84Oq0aV(oTki@Kgn1p-)es%!{g1myQ9cRvf7gEkPu>k?wBQtWG zFc{qY0s931h6l{4y7OoXNz?TBWA%^Gc`gIkNx{J=H|ePnNtF^B|3GOszI7%Y3~$@1FL($B;&e8NfG5w~*ijpeo>-7&U^7YTW1#^D)|Yx!d@3E*)+%yudJ+p6tJc@Y=(dAeW9 z#v)-j4O*ek5^9!9(JhtKrgM&o`J_Z{zb0)MJvGcSwcZ|DQkP&1aEg=_ zgn$QrL=Rm=_3Y=f0(|Gr2Ly2--z#0zf;Q4Z&|5L+o31Pby-158cJuAqA96wq8pLq& z253!7CtXq_XxM@)eZ2Bq_SS!kOGi|US~6#*4Z@n}Lf~AOIO|rtQ^X{XTa2ovrS`Ke zeFJ|pw1~BfYdXK_?4A?XS64xg;KB(kMM6Y88;D>!Az@o@<%$))o}xxDbtp5S<3z9= z{+4)52t$InP~^I8sz_8@t5xNrV9Qde=qC#QPO^B!IoRXPwXMY%`z9*q@8ps=h2xOl zer`w4W2LH@)pbwjX&-oNhm-rpejHtMh&w*VY~~p(77!3X&DuKH$|zbVtMM>XD!^9=0Ib7|&%>Le zq;`7A)8v$tXn-eN<@Asc3w10Bg9KIY92h@doi;Iw2EWJHxWsO^=F3G`U&_m*$VKSYiB>?T z#gNB$r}{l9E7vha3u2Fn^z$$GtNejN4OPp2C=q?9Zg&@ymYyc2<|)`i#o;ME;Kyr0 z(NGNTp|H(4|Qo7lY8mf%a`u)nqMK2<~?8Z^(A-sgKv`7vkkVK>&TgfB>DD-mT z6HlQUQTyBA8PQTCWn%_qj@0f_(87yJM2hKoi#{mF{pEpB1CkrYjm@a_iY5LHUwpVJ zxyWy;cxvDQ4iwLB?-={NV*Z5oUg(10Ym^o#vdau?bscuyoBn77+F3Zzs0~^cc&>+4 zv>G3M0h^g!g7!Gg$A#CIf;S35L&Q`9QwK<%lOzGDa)KEOOjtrZOHcWd+(~(mYvO)L z%FZRJh5Gcj1-Z~%3g-I&PQwi?Ku8fZSoGU<+*lLEsQ`FJIkde6N=*SJD;8Lo{J?Z~ zD&8c%Gi<#I$1Db2=NcbT-g$0F`fJ9Aog=Y=>k4vJPuz@eRi zb5lpjxf4+>DF1RfXd=xGs;Z4;{de+nb6y1rl>li0R3ay|qVYp#gK+@mG+2782o!UB zhW_nQOU86?QRrsv0{ZWATyWt<2(2JlmGYxX&uIJr?~n78^%xng!rk3=xL99ZdB=cC z1{b2s1IiAPt;HPz;Qm28;Q~O)PgiBCt1y%B`KI2BghqO1r>pO%%IlkFOiG?83-Hc9 zbOmoZimX}X0Tvr&K3_i1+99^-$o#9#krA3v#;#+=w0C5?HjRjVFMcmrE}~KQ3oV^O z=Z`7-YuljyHpv)bt=VnoQdd_;JumYamPR{#zWBINAGGxol2huF1bc!!8`QIIqw9fp zlA}oHcI6^{E3;zznZf}(x&D=JmoF~bdlv1~9?Y?YNAk!!CvF)jz0nu)>p$&!LYoQz ztc+OV5vv!LWN15tCHOaAj0fD&-p8$;*p7|Zc2TUnszGPd%1uGdtogN#wjK%7x4X1tq3rLr;-ghT zuiNB=4_;QC_d{%-D*>V*vU0?|QvvhJ)#af_x%BH#Wd24+;!>Ah8V4FhnNEK~RNtKFBGY*l zu5dC+>1mSNM|f4E@);z=)bsdV@B|*{bz)rtLAkLr%8$*d zCc)R~m7V$Pook;5dWR4dRXU@Nm3FFhx&UXL-^K0#z@*xj`C7pjI=PzAPwPTHH3fpzOLrcPqcbF+!nIsddL?Ix?o= zX0JV>>MN3c`)TgEiM|07yEm17m~$&TvSO%jO4H+n{8+2ty2iAOLbWt$h;6Pq`$eXr zZr6tL-~%fybM2+Uhpv;TykTB37Fq4{Tgi(37G;$Mg)!C@36X#9vGP6~R}wy~wJ9$; zZ>_C}vlz*}^T~ku+Q$PMjC5)n!daWYpZrzD+b)(P<^d$qLt2uqkk%h~lCXrk0=2&{ z`rWyFiPS;trw7aMcIw=#)`N%%@hObfG+R#s4 z#l$dMt5)dDN$BM)kWoNLz&4EE1UJsozX!AsWfSKx#uPhrT~J^114QLecLAFz55a_f zI;kieaD!^0X|W@*N12*QOnsx0!t- zBt!tSimxoe#4!ww^{L9oEE>s(K}|dvDusO3o4}qvBEf@n377$18(^j1{QiyURuf=l z2+VF>Vx<%EPMhGpEfct^F8G5U4`am~pDu(}WZ$;u_>g0DTIf_X%LItO3O| z24s?LUT_||AkHM^8gwVumLVd8O)xPV%PsrGC=j?&UO|KJoiZ|? zm__sDR4cGeB&USh62qJ$iAm;j1+$;YyJrhg4AdMJVw^TA`uwCbW&R= zkAb@9>mALAjh;zSe$@?hs4A=)`2$rqC_|xZam?F-1*udtgn9lY++( z*HYm+E%6RQAwWnJ#f@^bwJwRx>4=!Ncc@0PdM;|#X8`YpD{UO6;}iR%XAdKyNvj+B zWzb#{#H0ZB;X+aq9fAIPz!C%G1duh^W0}1)^9Ryj03-df)JcY`mH^`qdg@4+d$tO# zZyIWAIUf`*h8InB=auTiuwrF!G?gaw->q9CEJ{&H{Yy}3MKSA=s{mCR#v7vJB!q*`(RsB{(`BTQETmU?Aj?SnD0*7{Bb)wo~7L&@&Q#N%KHx>cEMN*WLSt95hn* z30wnZ+>kDizR16z%dVmB1}>*`$j~kLpC*$nE`@j4QY7*~&(5Ng3GJ(s7YA z4tE0yy(HL7gWE(OPkL|!H~ZGyxbGDoCI(BtfIZg&>~}TLlmXDrC>pbDdwWzHJcR1~ zT2>|0m_DQ(H$^ph`MRR`pip-G#2a9;Vs3SVW)uet(;B>|=Y#lHh21_6;zA$#mH^t# z1B`bA`lO2L%Ch6=Bi9QyCD>$xSJF!XF?wTNuxCu6B`tpUbNE}4ElD#7v7l(sd-fbV z`A}GpS<)16OEis6x(%EH06(3CSmgy1aCUU|p-Bt+-NJSC)W!gQnnuc`wTL1>9 z)5Xm{NO&~8*o;e$roV+1%t}}wl+=GFi zIUvJ~d4lwjUR)n}HKoRQP)HTd>>5pL`KRGt+YgATexYj@452g&xb+DJKDfZm0ZuB0 z%0uT1@f&l5Xzv7+XL>@B2Tt{4z!6S7c^{Js zr%U78FwCf;sXV3zH(-bj%-Qoy&k)}fdaZwPdc}@0u2j!ann($foYYc(335a)OvuXyM^SF&n2>6l^0(ZNqeJ8VlWQhTDP5gdAv65iJd?d@udgHB$7QJBh$X3Pz2+NW4xZFe=)S>;TJZu{=jGcb>{vyH!eST(T?S`!v&g85!d6;t1YJX zhoZrS8TK*glx>0uIDDaf=Araf1p(&~u$+a4cpTl7lHz<@uc?n5q`>Y}hqZqarHAGp zvb&MCL|`H1WW+8DOG;_!wMDciHaRNf>7PVFx%tZ*+KC^Eft^&LRUK@Q import('./Butterfly'), metadata: new ChartMetadata({ + behaviors: [ + Behavior.InteractiveChart, + Behavior.DrillToDetail, + Behavior.DrillBy, + ], credits: ['https://echarts.apache.org'], category: t('Comparison'), description: t( 'A butterfly chart compares two metrics across categories using horizontal bars ' + 'that extend left and right from a central axis.', ), + exampleGallery: [{ url: example, urlDark: exampleDark }], name: t('Butterfly Chart'), tags: [ t('Categorical'), @@ -46,7 +56,8 @@ export default class EchartsButterflyChartPlugin extends ChartPlugin< t('ECharts'), t('Multi-Variables'), ], - thumbnail: '', + thumbnail, + thumbnailDark, }), transformProps, }); diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Butterfly/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Butterfly/transformProps.ts index a6e20fa23eb4..6dc025b84506 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Butterfly/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Butterfly/transformProps.ts @@ -34,8 +34,13 @@ import { DEFAULT_FORM_DATA } from './constants'; import { defaultGrid } from '../defaults'; import { getDefaultTooltip } from '../utils/tooltip'; import { Refs } from '../types'; -import { NULL_STRING } from '../constants'; -import { getChartPadding, getLegendProps } from '../utils/series'; +import { OpacityEnum } from '../constants'; +import { + getChartPadding, + getLegendProps, + getColtypesMapping, + extractGroupbyLabel, +} from '../utils/series'; import { resolveLegendLayout } from '../utils/legendLayout'; import { convertInteger } from '../utils/convertInteger'; @@ -44,19 +49,11 @@ type EChartsOption = ComposeOption; const LABEL_LEFT = { position: 'left' as const }; const LABEL_RIGHT = { position: 'right' as const }; -function formatCategory(value: unknown): string { - if (value == null) { - return NULL_STRING; - } - if (typeof value === 'string' || typeof value === 'number') { - return String(value); - } - return String(value); -} - function formatTooltip( params: CallbackDataParams[], formatter: NumberFormatter | CurrencyFormatter, + categoryLabels: string[], + categoryByKey: Map, ) { const axisParams = params.filter( param => param.seriesName && typeof param.value === 'number', @@ -65,7 +62,13 @@ function formatTooltip( return ''; } - const title = axisParams[0].name; + const { dataIndex, name } = axisParams[0]; + const title = + (typeof dataIndex === 'number' + ? categoryLabels.at(dataIndex) + : undefined) ?? + (typeof name === 'string' ? categoryByKey.get(name) : undefined) ?? + name; const rows = axisParams.map(param => [ param.seriesName!, formatter(Math.abs(param.value as number)), @@ -86,6 +89,8 @@ export default function transformProps( hooks, theme, inContextMenu, + filterState, + emitCrossFilters, } = chartProps; const refs: Refs = {}; const { data = [] } = queriesData[0]; @@ -117,32 +122,75 @@ export default function transformProps( ...formData, }; - const groupbyColumn = ensureIsArray(groupby)[0]; - const categoryLabel = getColumnLabel(groupbyColumn); const leftMetricLabel = leftMetric ? getMetricLabel(leftMetric) : ''; const rightMetricLabel = rightMetric ? getMetricLabel(rightMetric) : ''; const leftSeriesName = leftLabel || leftMetricLabel; const rightSeriesName = rightLabel || rightMetricLabel; + const coltypeMapping = getColtypesMapping(queriesData[0]); + const groupbyColumns = ensureIsArray(groupby); + const groupbyLabels = groupbyColumns.map(getColumnLabel); + const defaultFormatter = currencyFormat?.symbol ? new CurrencyFormatter({ d3Format: xAxisFormat, currency: currencyFormat }) : getNumberFormatter(xAxisFormat); - const categories = data.map(row => formatCategory(row[categoryLabel])); - const leftData = data.map(row => { - const value = Number(row[leftMetricLabel] ?? 0); - return { - value: -Math.abs(value), - label: LABEL_LEFT, - }; - }); - const rightData = data.map(row => { - const value = Number(row[rightMetricLabel] ?? 0); - return { - value: Math.abs(value), - label: LABEL_RIGHT, - }; + const categories = data.map(datum => + extractGroupbyLabel({ datum, groupby: groupbyLabels, coltypeMapping }), + ); + const categoryKeys = data.map((datum, index) => { + const label = categories.at(index) ?? ''; + return `${label}__${JSON.stringify( + groupbyLabels.map(col => + Object.hasOwn(datum, col) ? datum[col] : undefined, + ), + )}`; }); + const categoryByKey = new Map( + categoryKeys.flatMap((key, index) => { + const label = categories.at(index); + return label === undefined ? [] : [[key, label] as const]; + }), + ); + + const labelMap = data.reduce>( + (acc, datum, index) => { + const uniqueKey = categoryKeys.at(index); + if (uniqueKey === undefined) { + return acc; + } + acc[uniqueKey] = groupbyLabels.map(col => + Object.hasOwn(datum, col) ? (datum[col] as string) : '', + ); + return acc; + }, + {}, + ); + const selectedValues = (filterState.selectedValues || []).reduce( + (acc: Record, value: string) => { + const index = categoryKeys.indexOf(value); + return index >= 0 ? { ...acc, [index]: value } : acc; + }, + {}, + ); + const getOpacity = (categoryKey: string) => + filterState.selectedValues?.length && + !filterState.selectedValues.includes(categoryKey) + ? OpacityEnum.SemiTransparent + : OpacityEnum.NonTransparent; + + const leftData = data.map((row, i) => ({ + name: categoryKeys[i], + value: -Math.abs(Number(row[leftMetricLabel] ?? 0)), + label: LABEL_LEFT, + itemStyle: { opacity: getOpacity(categoryKeys[i]) }, + })); + const rightData = data.map((row, i) => ({ + name: categoryKeys[i], + value: Math.abs(Number(row[rightMetricLabel] ?? 0)), + label: LABEL_RIGHT, + itemStyle: { opacity: getOpacity(categoryKeys[i]) }, + })); const labelFormatter = (params: CallbackDataParams) => { const value = Math.abs(params.value as number); @@ -280,6 +328,8 @@ export default function transformProps( formatTooltip( ensureIsArray(params) as CallbackDataParams[], defaultFormatter, + categories, + categoryByKey, ), }, series, @@ -294,5 +344,10 @@ export default function transformProps( setDataMask, onContextMenu, onLegendStateChanged, + groupby: groupbyColumns, + labelMap, + selectedValues, + emitCrossFilters, + coltypeMapping, }; } diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Butterfly/types.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Butterfly/types.ts index ac5daebd3942..060a042658af 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Butterfly/types.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Butterfly/types.ts @@ -24,7 +24,12 @@ import { QueryFormMetric, RgbaColor, } from '@superset-ui/core'; -import { BaseTransformedProps, LegendFormData, TitleFormData } from '../types'; +import { + BaseTransformedProps, + LegendFormData, + TitleFormData, + CrossFilterTransformedProps, +} from '../types'; export type EchartsButterflyFormData = QueryFormData & LegendFormData & @@ -49,4 +54,4 @@ export interface EchartsButterflyChartProps extends ChartProps { } export type ButterflyTransformedProps = - BaseTransformedProps; + BaseTransformedProps & CrossFilterTransformedProps; diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/Butterfly/Butterfly.test.tsx b/superset-frontend/plugins/plugin-chart-echarts/test/Butterfly/Butterfly.test.tsx new file mode 100644 index 000000000000..7b27d40b711b --- /dev/null +++ b/superset-frontend/plugins/plugin-chart-echarts/test/Butterfly/Butterfly.test.tsx @@ -0,0 +1,202 @@ +/** + * 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 { render } from '@testing-library/react'; +import { ChartProps } from '@superset-ui/core'; +import { supersetTheme } from '@apache-superset/core/theme'; +import Butterfly from '../../src/Butterfly/Butterfly'; +import transformProps from '../../src/Butterfly/transformProps'; +import { EchartsButterflyChartProps } from '../../src/Butterfly/types'; +import Echart from '../../src/components/Echart'; +import { EventHandlers } from '../../src/types'; + +jest.mock('../../src/components/Echart', () => ({ + __esModule: true, + default: jest.fn(() => null), +})); + +const mockedEchart = jest.mocked(Echart); + +const data = [ + { category: 'A', left_sum: 10, right_sum: 25 }, + { category: 'B', left_sum: 5, right_sum: 19 }, +]; + +const categoryKeyA = 'A__["A"]'; +const categoryKeyB = 'B__["B"]'; + +function setup( + overrides: { + filterState?: { selectedValues?: string[] }; + onLegendStateChanged?: jest.Mock; + } = {}, +) { + const onContextMenu = jest.fn(); + const setDataMask = jest.fn(); + const onLegendStateChanged = overrides.onLegendStateChanged ?? jest.fn(); + const chartProps = { + ...new ChartProps({ + formData: { + groupby: ['category'], + left_metric: 'left_sum', + right_metric: 'right_sum', + viz_type: 'butterfly', + }, + width: 800, + height: 600, + queriesData: [{ data }], + theme: supersetTheme, + hooks: { onContextMenu, setDataMask, onLegendStateChanged }, + }), + filterState: overrides.filterState ?? {}, + emitCrossFilters: true, + } as unknown as EchartsButterflyChartProps; + + const transformed = transformProps(chartProps); + render( + , + ); + + const lastCall = mockedEchart.mock.calls[mockedEchart.mock.calls.length - 1]; + const { eventHandlers, selectedValues } = lastCall[0] as { + eventHandlers: EventHandlers; + selectedValues: Record; + }; + return { + eventHandlers, + onContextMenu, + setDataMask, + onLegendStateChanged, + selectedValues, + }; +} + +beforeEach(() => { + mockedEchart.mockClear(); +}); + +test('context menu exposes drill to detail for the selected category', () => { + const { eventHandlers, onContextMenu } = setup(); + + eventHandlers.contextmenu({ + name: 'A', + data: { name: categoryKeyA }, + event: { stop: jest.fn(), event: { clientX: 10, clientY: 20 } }, + }); + + expect(onContextMenu).toHaveBeenCalledTimes(1); + const [x, y, payload] = onContextMenu.mock.calls[0]; + expect(x).toBe(10); + expect(y).toBe(20); + expect(payload.drillToDetail).toEqual([ + expect.objectContaining({ + col: 'category', + op: '==', + val: 'A', + formattedVal: 'A', + }), + ]); +}); + +test('context menu exposes drill by for the selected category', () => { + const { eventHandlers, onContextMenu } = setup(); + + eventHandlers.contextmenu({ + name: 'A', + data: { name: categoryKeyA }, + event: { stop: jest.fn(), event: { clientX: 10, clientY: 20 } }, + }); + + const payload = onContextMenu.mock.calls[0][2]; + expect(payload.drillBy).toEqual({ + filters: [ + expect.objectContaining({ + col: 'category', + op: '==', + val: 'A', + formattedVal: 'A', + }), + ], + groupbyFieldName: 'groupby', + }); +}); + +test('click emits cross-filter for the selected category', () => { + const { eventHandlers, setDataMask } = setup(); + + eventHandlers.click({ name: 'B', data: { name: categoryKeyB } }); + + expect(setDataMask).toHaveBeenCalledWith( + expect.objectContaining({ + extraFormData: { + filters: [{ col: 'category', op: 'IN', val: ['B'] }], + }, + filterState: { + value: [['B']], + selectedValues: [categoryKeyB], + }, + }), + ); +}); + +test('click clears cross-filter when the category is already selected', () => { + const { eventHandlers, setDataMask } = setup({ + filterState: { selectedValues: [categoryKeyB] }, + }); + + eventHandlers.click({ name: 'B', data: { name: categoryKeyB } }); + + expect(setDataMask).toHaveBeenCalledWith( + expect.objectContaining({ + extraFormData: { + filters: [], + }, + filterState: { + value: null, + selectedValues: null, + }, + }), + ); +}); + +test('legend selection forwards legend state to the chart hook', () => { + const onLegendStateChanged = jest.fn(); + const { eventHandlers } = setup({ onLegendStateChanged }); + const selected = { left_sum: true, right_sum: false }; + + eventHandlers.legendselectchanged({ selected }); + eventHandlers.legendselectall({ selected }); + eventHandlers.legendinverseselect({ selected }); + + expect(onLegendStateChanged).toHaveBeenCalledTimes(3); + expect(onLegendStateChanged).toHaveBeenCalledWith(selected); +}); + +test('passes selectedValues through to the chart component', () => { + const { selectedValues } = setup({ + filterState: { selectedValues: [categoryKeyA] }, + }); + + expect(selectedValues).toEqual({ 0: categoryKeyA }); +}); diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/Butterfly/transformProps.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/Butterfly/transformProps.test.ts index e80f04aed9b6..97ab29c70895 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/test/Butterfly/transformProps.test.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/test/Butterfly/transformProps.test.ts @@ -18,25 +18,40 @@ */ import { ChartProps } from '@superset-ui/core'; import { supersetTheme } from '@apache-superset/core/theme'; +import type { CallbackDataParams } from 'echarts/types/src/util/types'; import { EchartsButterflyChartProps, ButterflyTransformedProps, } from '../../src/Butterfly/types'; import transformProps from '../../src/Butterfly/transformProps'; -import { NULL_STRING } from '../../src/constants'; +import { NULL_STRING, OpacityEnum } from '../../src/constants'; -type SeriesDataPoint = { value?: number } | number; +const categoryKeyA = 'A__["A"]'; +const categoryKeyB = 'B__["B"]'; + +type SeriesDataPoint = { + name?: string; + value?: number; + itemStyle?: { opacity?: number }; +}; type ButterflyTestSeries = { name?: string; data?: SeriesDataPoint[]; itemStyle?: { color?: string }; - label?: { show?: boolean }; + label?: { + show?: boolean; + formatter?: (params: CallbackDataParams) => string; + }; }; type ButterflyTestEchartOptions = { series?: ButterflyTestSeries[]; - xAxis?: { name?: string; nameGap?: number }; + xAxis?: { + name?: string; + nameGap?: number; + axisLabel?: { formatter?: (value: number) => string }; + }; yAxis?: { name?: string; nameGap?: number; @@ -45,7 +60,10 @@ type ButterflyTestEchartOptions = { }; legend?: { orient?: string; data?: string[] }; grid?: { left?: number; top?: number }; - tooltip?: { show?: boolean }; + tooltip?: { + show?: boolean; + formatter?: (params: CallbackDataParams | CallbackDataParams[]) => string; + }; }; const getEchartOptions = ( @@ -55,13 +73,7 @@ const getEchartOptions = ( const extractSeriesValues = (props: ButterflyTransformedProps) => { const series = getEchartOptions(props).series ?? []; - return series.map(item => - (item.data ?? []).map(entry => - typeof entry === 'object' && entry !== null && 'value' in entry - ? entry.value - : entry, - ), - ); + return series.map(item => (item.data ?? []).map(entry => entry.value)); }; const extractSeriesNames = (props: ButterflyTransformedProps) => { @@ -88,19 +100,22 @@ const createChartProps = ( overrides: Record = {}, queryData: Record[] = data, ) => - new ChartProps({ - formData: { ...formData, ...overrides }, - width: 800, - height: 600, - queriesData: [{ data: queryData }], - theme: supersetTheme, - ...((overrides.hooks ? { hooks: overrides.hooks } : {}) as object), - }); + ({ + ...new ChartProps({ + formData: { ...formData, ...overrides }, + width: 800, + height: 600, + queriesData: [{ data: queryData }], + theme: supersetTheme, + ...((overrides.hooks ? { hooks: overrides.hooks } : {}) as object), + }), + filterState: overrides.filterState ?? {}, + emitCrossFilters: overrides.emitCrossFilters, + inContextMenu: overrides.inContextMenu, + }) as unknown as EchartsButterflyChartProps; test('transforms chart props into diverging bar series', () => { - const transformedProps = transformProps( - createChartProps() as unknown as EchartsButterflyChartProps, - ); + const transformedProps = transformProps(createChartProps()); expect(extractSeriesValues(transformedProps)).toEqual([ [-10, -5], @@ -108,11 +123,23 @@ test('transforms chart props into diverging bar series', () => { ]); }); +test('assigns composite category keys to each bar data point', () => { + const transformedProps = transformProps(createChartProps()); + const series = getEchartOptions(transformedProps).series ?? []; + + expect(series[0]?.data?.map(point => point.name)).toEqual([ + categoryKeyA, + categoryKeyB, + ]); + expect(series[1]?.data?.map(point => point.name)).toEqual([ + categoryKeyA, + categoryKeyB, + ]); +}); + test('uses absolute values for negative right-side metrics', () => { const transformedProps = transformProps( - createChartProps({}, [ - { category: 'A', left_sum: -8, right_sum: -15 }, - ]) as unknown as EchartsButterflyChartProps, + createChartProps({}, [{ category: 'A', left_sum: -8, right_sum: -15 }]), ); expect(extractSeriesValues(transformedProps)).toEqual([[-8], [15]]); @@ -122,7 +149,7 @@ test('formats null categories and missing metric values', () => { const transformedProps = transformProps( createChartProps({}, [ { category: null, left_sum: undefined, right_sum: 7 }, - ]) as unknown as EchartsButterflyChartProps, + ]), ); const { yAxis } = getEchartOptions(transformedProps); @@ -141,7 +168,7 @@ test('applies custom series labels, colors, and axis titles', () => { right_color: { r: 0, g: 255, b: 0 }, x_axis_label: 'Value axis', y_axis_label: 'Category axis', - }) as unknown as EchartsButterflyChartProps, + }), ); const { series, xAxis, yAxis } = getEchartOptions(transformedProps); @@ -163,7 +190,7 @@ test('applies legend orientation, sort, and axis margin settings', () => { xAxisLabelRotation: 45, x_axis_title_margin: 60, y_axis_title_margin: 80, - }) as unknown as EchartsButterflyChartProps, + }), ); const { legend, xAxis, yAxis, grid } = getEchartOptions(transformedProps); @@ -178,9 +205,7 @@ test('applies legend orientation, sort, and axis margin settings', () => { test('hides value labels when showValue is false', () => { const transformedProps = transformProps( - createChartProps({ - showValue: false, - }) as unknown as EchartsButterflyChartProps, + createChartProps({ showValue: false }), ); const { series } = getEchartOptions(transformedProps); @@ -188,15 +213,129 @@ test('hides value labels when showValue is false', () => { expect(series?.[1]?.label?.show).toBe(false); }); -test('hides tooltip while the context menu is open', () => { +test('hides zero value labels but keeps non-zero labels', () => { const transformedProps = transformProps( - createChartProps({}, data) as unknown as EchartsButterflyChartProps, + createChartProps({}, [{ category: 'A', left_sum: 0, right_sum: 12 }]), + ); + const formatter = + getEchartOptions(transformedProps).series?.[0]?.label?.formatter; + + expect(formatter?.({ value: 0 } as CallbackDataParams)).toBe(''); + expect(formatter?.({ value: -10 } as CallbackDataParams)).toBe('10'); +}); + +test('formats axis and tooltip values as absolute numbers', () => { + const transformedProps = transformProps(createChartProps()); + const { xAxis, tooltip } = getEchartOptions(transformedProps); + + expect(xAxis?.axisLabel?.formatter?.(-25)).toBe('25'); + + const tooltipHtml = tooltip?.formatter?.([ + { + name: categoryKeyA, + dataIndex: 0, + seriesName: 'left_sum', + value: -10, + } as CallbackDataParams, + { + name: categoryKeyA, + dataIndex: 0, + seriesName: 'right_sum', + value: 25, + } as CallbackDataParams, + ]); + + expect(tooltipHtml).toContain('A'); + expect(tooltipHtml).not.toContain(categoryKeyA); + expect(tooltipHtml).toContain('left_sum'); + expect(tooltipHtml).toContain('right_sum'); + expect(tooltipHtml).toContain('10'); + expect(tooltipHtml).toContain('25'); +}); + +test('shows the category label in the tooltip when ECharts reports a unique key', () => { + const transformedProps = transformProps(createChartProps()); + const tooltipHtml = getEchartOptions(transformedProps).tooltip?.formatter?.({ + name: categoryKeyA, + seriesName: 'left_sum', + value: -10, + } as CallbackDataParams); + + expect(tooltipHtml).toContain('A'); + expect(tooltipHtml).not.toContain(categoryKeyA); +}); + +test('hides tooltip while the context menu is open', () => { + const transformedProps = transformProps(createChartProps()); + const withContextMenu = transformProps( + createChartProps({ inContextMenu: true }), ); - const withContextMenu = transformProps({ - ...createChartProps(), - inContextMenu: true, - } as unknown as EchartsButterflyChartProps); expect(getEchartOptions(transformedProps).tooltip?.show).toBe(true); expect(getEchartOptions(withContextMenu).tooltip?.show).toBe(false); }); + +test('builds labelMap and groupby for drill and cross-filter handlers', () => { + const transformedProps = transformProps(createChartProps()); + + expect(transformedProps.groupby).toEqual(['category']); + expect(transformedProps.labelMap).toEqual({ + 'A__["A"]': ['A'], + 'B__["B"]': ['B'], + }); +}); + +test('uses unique keys for interactions and readable labels on the y-axis', () => { + const transformedProps = transformProps( + createChartProps({ groupby: ['country', 'state'] }, [ + { country: 'US', state: 'CA', left_sum: 4, right_sum: 6 }, + { country: 'US', state: 'NY', left_sum: 8, right_sum: 3 }, + ]), + ); + const series = getEchartOptions(transformedProps).series ?? []; + const firstKey = 'US, CA__["US","CA"]'; + const secondKey = 'US, NY__["US","NY"]'; + + expect(firstKey).not.toBe(secondKey); + expect(series[0]?.data?.map(point => point.name)).toEqual([ + firstKey, + secondKey, + ]); + expect(transformedProps.labelMap).toEqual({ + [firstKey]: ['US', 'CA'], + [secondKey]: ['US', 'NY'], + }); + expect(getEchartOptions(transformedProps).yAxis?.data).toEqual([ + 'US, CA', + 'US, NY', + ]); +}); + +test('dims unselected categories when a cross-filter is active', () => { + const transformedProps = transformProps( + createChartProps({ + filterState: { selectedValues: [categoryKeyA] }, + }), + ); + const series = getEchartOptions(transformedProps).series ?? []; + + expect(series[0]?.data?.[0]?.itemStyle?.opacity).toBe( + OpacityEnum.NonTransparent, + ); + expect(series[0]?.data?.[1]?.itemStyle?.opacity).toBe( + OpacityEnum.SemiTransparent, + ); + expect(series[1]?.data?.[1]?.itemStyle?.opacity).toBe( + OpacityEnum.SemiTransparent, + ); +}); + +test('maps selectedValues to category indexes', () => { + const transformedProps = transformProps( + createChartProps({ + filterState: { selectedValues: [categoryKeyB] }, + }), + ); + + expect(transformedProps.selectedValues).toEqual({ 1: categoryKeyB }); +});