@carto/ps-react-ui 4.7.0 → 4.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"actions.js","sources":["../../src/widgets/actions/fullscreen/styles.ts","../../src/widgets/actions/fullscreen/fullscreen.tsx","../../src/widgets/actions/download/download.tsx","../../src/widgets/actions/shared/styles.ts","../../src/widgets/actions/relative-data/utils.ts","../../src/widgets/actions/relative-data/relative-data.tsx","../../src/widgets/actions/zoom-toggle/style.ts","../../src/widgets/actions/zoom-toggle/zoom-toggle.tsx","../../src/widgets/actions/stack-toggle/grouped-bar-chart-icon.tsx","../../src/widgets/actions/stack-toggle/stack-toggle.tsx","../../src/widgets/actions/lock-selection/lock-selection.tsx","../../src/widgets/actions/searcher/searcher.tsx","../../src/widgets/actions/searcher/searcher-toggle.tsx","../../src/widgets/actions/change-column/change-column-icon.tsx","../../src/widgets/actions/change-column/sortable-column-item.tsx","../../src/widgets/actions/change-column/change-column.tsx","../../src/widgets/actions/brush-toggle/style.ts","../../src/widgets/actions/brush-toggle/hit-test.ts","../../src/widgets/actions/brush-toggle/brush-overlay.tsx","../../src/widgets/actions/brush-toggle/brush-toggle.tsx"],"sourcesContent":["import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n title: {\n container: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 1,\n },\n },\n content: {\n display: 'flex',\n flexDirection: 'column',\n gap: ({ spacing }) => spacing(1),\n },\n} satisfies Record<string, SxProps<Theme>>\n","import {\n Dialog,\n DialogContent,\n DialogTitle,\n IconButton,\n Typography,\n} from '@mui/material'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\nimport { Close, FullscreenOutlined } from '@mui/icons-material'\nimport type {\n FullScreenConfig,\n FullScreenProps,\n FullScreenState,\n} from './types'\nimport { styles } from './styles'\n\nconst EMPTY_DIALOG_CONTENT_PROPS: NonNullable<\n FullScreenProps['DialogContentProps']\n> = {}\n\n/**\n * Displays widget content in a fullscreen modal dialog.\n *\n * Manages fullscreen state via the widget store and renders a MUI Dialog\n * with the widget title and a close button.\n *\n * @example\n * ```tsx\n * <FullScreen id=\"my-widget\" labels={{ ariaLabel: 'Expand chart' }}>\n * <ChartContent id=\"my-widget\" />\n * </FullScreen>\n * ```\n */\nexport function FullScreen({\n id,\n labels,\n children,\n Icon,\n IconButtonProps,\n DialogContentProps: {\n sx,\n ...DialogContentProps\n } = EMPTY_DIALOG_CONTENT_PROPS,\n DialogProps,\n}: FullScreenProps) {\n const { isFullScreen, title } = useWidgetSelector(id, (w) => ({\n isFullScreen: (w as FullScreenState | undefined)?.isFullScreen,\n title: (w as FullScreenState | undefined)?.title,\n }))\n const updateFullScreenConfig = (updates: Partial<FullScreenConfig>) => {\n widgetStoreActions.setWidget<FullScreenState>(id, {\n isFullScreen: updates.isFullScreen,\n })\n }\n\n return (\n <>\n <IconButton\n {...IconButtonProps}\n onClick={() => updateFullScreenConfig({ isFullScreen: true })}\n >\n {Icon ?? <FullscreenOutlined />}\n </IconButton>\n <Dialog\n maxWidth={false}\n open={!!isFullScreen}\n keepMounted\n aria-labelledby={labels?.ariaLabel ?? `fullscreen-dialog-title-${id}`}\n {...DialogProps}\n onClose={() => updateFullScreenConfig({ isFullScreen: false })}\n >\n <DialogTitle\n id={`fullscreen-dialog-title-${id}`}\n sx={styles.title.container}\n >\n <Typography variant='subtitle1' component='span'>\n {title}\n </Typography>\n <IconButton\n onClick={() => updateFullScreenConfig({ isFullScreen: false })}\n >\n <Close />\n </IconButton>\n </DialogTitle>\n <DialogContent\n sx={{\n ...styles.content,\n ...sx,\n }}\n {...DialogContentProps}\n >\n {children}\n </DialogContent>\n </Dialog>\n </>\n )\n}\n","import {\n CircularProgress,\n IconButton,\n ListItemIcon,\n ListItemText,\n Menu,\n MenuItem,\n} from '@mui/material'\nimport type { DownloadItem, DownloadProps } from './types'\nimport { FileDownloadOutlined } from '@mui/icons-material'\nimport { useState, type MouseEvent } from 'react'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\nconst EMPTY_LABELS: NonNullable<DownloadProps['labels']> = {}\n\n/**\n * Dropdown menu action for exporting widget data in various formats (CSV, PNG, etc.).\n *\n * Reads widget data from the store and triggers downloads using the modifier\n * function defined in each `DownloadItem`.\n *\n * @example\n * ```tsx\n * <Download id={widgetId} items={barDownloadConfig({ refUI })} />\n * ```\n */\nexport function Download({\n id,\n items,\n labels = EMPTY_LABELS,\n Icon,\n IconButtonProps,\n}: DownloadProps) {\n const { data } = useWidgetSelector(id, (w) => ({\n data: w?.data,\n }))\n\n const [isDownloading, setIsDownloading] = useState(false)\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null)\n\n const handleToggle = (event: MouseEvent<HTMLElement>) => {\n event.stopPropagation()\n setAnchorEl(event.currentTarget)\n }\n\n const handleDownload = (data: string, option: DownloadItem) => {\n const link = document.createElement('a')\n link.href = data\n link.download = option.filename ?? id\n link.style.display = 'none'\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n option.callback?.(link.href)\n }\n\n const handleClick = async (\n event: MouseEvent<HTMLElement>,\n option: DownloadItem,\n ) => {\n event.stopPropagation()\n\n setIsDownloading(true)\n setAnchorEl(null)\n\n const result = await option.modifier(data)\n\n if (!result) {\n setIsDownloading(false)\n return\n }\n\n handleDownload(result, option)\n setIsDownloading(false)\n }\n\n return (\n <>\n <IconButton\n size='small'\n aria-label={labels.ariaLabel ?? 'download options'}\n aria-controls='options-menu'\n aria-haspopup='true'\n onClick={handleToggle}\n {...IconButtonProps}\n disabled={isDownloading || items.length === 0}\n className={isDownloading || anchorEl ? 'active' : ''}\n >\n {isDownloading ? (\n <CircularProgress size={18} color='inherit' />\n ) : (\n (Icon ?? <FileDownloadOutlined />)\n )}\n </IconButton>\n <Menu\n variant='menu'\n elevation={8}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'right',\n }}\n anchorEl={anchorEl}\n open={Boolean(anchorEl)}\n onClose={() => setAnchorEl(null)}\n MenuListProps={{\n sx: {\n paddingBottom: 0,\n },\n }}\n >\n {items.map((option) => (\n <MenuItem\n key={option.id}\n disabled={option.disabled}\n onClick={(e) => void handleClick(e, option)}\n >\n {option.icon && (\n <ListItemIcon sx={{ color: 'text.primary' }}>\n {option.icon}\n </ListItemIcon>\n )}\n <ListItemText>{option.label}</ListItemText>\n </MenuItem>\n ))}\n </Menu>\n </>\n )\n}\n","import type { SxProps, Theme } from '@mui/material'\n\n/**\n * Shared styles for widget action buttons\n */\nexport const actionButtonStyles = {\n trigger: {\n '&[data-active=\"true\"]': {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n },\n} satisfies Record<string, SxProps<Theme>>\n","import type { EchartWidgetData } from '../../echart/types'\n\n/**\n * Calculates the sum of all numeric values in the data\n */\nexport function calculateTotal(data: EchartWidgetData): number {\n return data.reduce((total, series) => {\n return series.reduce((seriesTotal, item) => {\n if (Array.isArray(item)) {\n const value = item.at(-1) as number\n return typeof value === 'number' ? seriesTotal + value : seriesTotal\n }\n\n return Object.entries(item).reduce((itemTotal: number, [key, value]) => {\n if (key === 'name') {\n return itemTotal\n }\n return typeof value === 'number' ? itemTotal + value : itemTotal\n }, seriesTotal)\n }, total)\n }, 0)\n}\n\n/**\n * Transforms data to relative (percentage) values\n */\nexport function toRelativeData(\n data: EchartWidgetData,\n total: number,\n): EchartWidgetData {\n if (total === 0) return data\n\n return data.map((series) =>\n series.map((item) => {\n if (Array.isArray(item)) {\n return item.map((value: number, index) => {\n if (index === item.length - 1 && typeof value === 'number') {\n return (value / total) * 100\n }\n return value\n }) as typeof item\n }\n\n const transformed: Record<string, string | number> = {}\n\n for (const [key, value] of Object.entries(item)) {\n if (key === 'name') {\n transformed[key] = value\n continue\n }\n transformed[key] =\n typeof value === 'number' ? (value / total) * 100 : value\n }\n\n return transformed\n }),\n )\n}\n","import { IconButton } from '@mui/material'\nimport { PercentOutlined } from '@mui/icons-material'\nimport { useCallback, useEffect, useRef } from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\nimport type { RelativeDataProps, RelativeDataState } from './types'\nimport { actionButtonStyles } from '../shared/styles'\nimport { Tooltip } from '../../../components'\nimport { calculateTotal, toRelativeData } from './utils'\nimport type { EchartWidgetData } from '../../../widgets/echart'\n\nexport const RELATIVE_DATA_TOOL_ID = 'relative-data'\nexport const RELATIVE_DATA_CONFIG_TOOL_ID = 'relative-data-config'\n\n/**\n * Widget action to toggle between relative (percentage) and absolute data display.\n *\n * Registers two transformation tools in the widget pipeline when mounted:\n * - A data tool that converts values to percentages (enabled/disabled via store)\n * - A config tool that is **always enabled** and reads `isRelative` from the store\n * to decide whether to apply the percentage formatter or restore the original one.\n * The config tool must always participate because the original formatter may have\n * been set via `setWidget` (not in the base config), so disabling the tool would\n * leave the percentage formatter stuck on the widget.\n *\n * @example\n * ```tsx\n * <RelativeData\n * id=\"my-widget\"\n * order={20}\n * defaultIsRelative={false}\n * />\n * ```\n */\nexport function RelativeData({\n id,\n order = 10,\n defaultIsRelative = false,\n labels,\n Icon,\n IconButtonProps,\n}: RelativeDataProps) {\n const percentFormatterRef = useRef<((value: number) => string) | undefined>(\n undefined,\n )\n\n // Read isRelative from widget store root — single source of truth\n const { isRelative } = useWidgetSelector(id, (w) => ({\n isRelative:\n (w as RelativeDataState | undefined)?.isRelative ?? defaultIsRelative,\n }))\n\n // Initialize store with default value on mount.\n // When defaultIsRelative=true, capture originals so toggling OFF can restore them.\n useEffect(() => {\n const current = widgetStoreActions.getWidget<RelativeDataState>(id)\n if (current?.isRelative === undefined) {\n if (defaultIsRelative) {\n widgetStoreActions.setWidget(id, {\n isRelative: true,\n originalFormatter: current?.formatter,\n originalMax: (current as unknown as Record<string, number>)?.max,\n })\n } else {\n widgetStoreActions.setWidget(id, { isRelative: defaultIsRelative })\n }\n }\n }, [id, defaultIsRelative])\n\n // Register data tool once — fn has no closure deps\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: RELATIVE_DATA_TOOL_ID,\n order,\n enabled: defaultIsRelative,\n fn: (data) => {\n const echartData = data as EchartWidgetData\n const total = calculateTotal(echartData)\n return toRelativeData(echartData, total)\n },\n })\n\n return () => widgetStoreActions.unregisterTool(id, RELATIVE_DATA_TOOL_ID)\n }, [id, order, defaultIsRelative])\n\n // Sync data tool enabled — lightweight, no re-registration\n useEffect(() => {\n widgetStoreActions.setToolEnabled(id, RELATIVE_DATA_TOOL_ID, isRelative)\n }, [id, isRelative])\n\n // Register config tool — ALWAYS enabled.\n // Reads isRelative, originalFormatter, originalMax from the store at execution time:\n // - isRelative=true → applies percentage formatter and max=100\n // - isRelative=false → restores original formatter/max from store\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: RELATIVE_DATA_CONFIG_TOOL_ID,\n type: 'config',\n order,\n enabled: true,\n fn: (currentConfig: unknown) => {\n const config = currentConfig as Record<string, unknown>\n const widget = widgetStoreActions.getWidget<RelativeDataState>(id)\n\n const hasSourceData =\n widget?.sourceData != null &&\n !(Array.isArray(widget.sourceData) && widget.sourceData.length === 0)\n\n if (widget?.isRelative) {\n // Don't apply percentage formatter when there's no source data\n if (!hasSourceData) return config\n\n if (!percentFormatterRef.current) {\n const locale = widget?.locale\n percentFormatterRef.current = (value: number) =>\n new Intl.NumberFormat(locale, {\n style: 'percent',\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n }).format(value / 100)\n }\n return { ...config, formatter: percentFormatterRef.current, max: 100 }\n }\n\n // Not in relative mode — restore originals from store if captured.\n // Use `in` because originalFormatter may have been captured as undefined\n // (widget had no formatter before toggling relative on).\n percentFormatterRef.current = undefined\n if (widget != null && 'originalFormatter' in widget) {\n return {\n ...config,\n formatter: widget.originalFormatter,\n max: widget.originalMax,\n }\n }\n return config\n },\n })\n return () => {\n // Restore original formatter/max if unmounting while in relative mode\n const widget = widgetStoreActions.getWidget<RelativeDataState>(id)\n if (widget?.isRelative && 'originalFormatter' in widget) {\n widgetStoreActions.setWidget(id, {\n formatter: widget.originalFormatter,\n max: widget.originalMax,\n })\n }\n percentFormatterRef.current = undefined\n widgetStoreActions.unregisterTool(id, RELATIVE_DATA_CONFIG_TOOL_ID)\n }\n }, [id, order, defaultIsRelative])\n\n const handleToggle = useCallback(() => {\n const newIsRelative = !isRelative\n percentFormatterRef.current = undefined\n\n if (newIsRelative) {\n // Capture current formatter/max in store before switching to relative\n const widget = widgetStoreActions.getWidget(id)\n widgetStoreActions.setWidget(id, {\n isRelative: true,\n originalFormatter: widget?.formatter,\n originalMax: (widget as unknown as Record<string, unknown>)?.max,\n })\n } else {\n widgetStoreActions.setWidget(id, { isRelative: false })\n }\n }, [isRelative, id])\n\n const tooltipLabel = isRelative\n ? (labels?.absolute ?? 'Show absolute values')\n : (labels?.relative ?? 'Show relative values')\n\n return (\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={labels?.ariaLabel ?? tooltipLabel}\n onClick={handleToggle}\n sx={actionButtonStyles.trigger}\n data-active={isRelative}\n {...IconButtonProps}\n >\n {Icon ?? <PercentOutlined />}\n </IconButton>\n </Tooltip>\n )\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(0.25),\n },\n trigger: {\n '&[data-active=\"true\"]': {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { Box, IconButton, useTheme } from '@mui/material'\nimport {\n SubdirectoryArrowLeftOutlined,\n ZoomInOutlined,\n} from '@mui/icons-material'\nimport { useEffect, useCallback } from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport type { ZoomToggleProps, ZoomState } from './types'\nimport { styles } from './style'\nimport { Tooltip } from '../../../components'\nimport { getEChartZoomConfig } from '../../echart/utils'\nimport type { EchartOptionsProps } from '../../echart/types'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\nexport const ZOOM_TOGGLE_TOOL_ID = 'zoom-toggle'\n\n/**\n * Widget action to toggle EChart zoom functionality.\n *\n * Registers as a config pipeline tool so that zoom configuration is automatically\n * re-applied when the base config is updated (e.g., by WidgetLoader).\n *\n * Zoom state (enabled, range) is stored in the widget store root, and the tool\n * derives its `enabled` flag from the store. This keeps state accessible across\n * component instances.\n *\n * When zoom is active, displays an inline reset button to disable zoom.\n * Only intended for use in fullscreen ToolbarActions for bar and histogram widgets.\n *\n * @example\n * ```tsx\n * <ZoomToggle\n * id=\"my-widget\"\n * defaultZoom={false}\n * zoomStart={0}\n * zoomEnd={100}\n * />\n * ```\n */\nexport function ZoomToggle({\n id,\n defaultZoom = false,\n defaultZoomStart = 0,\n defaultZoomEnd = 100,\n labels,\n Icon,\n ResetIcon,\n IconButtonProps,\n}: ZoomToggleProps) {\n const theme = useTheme()\n\n // Read zoom state from widget store root — single source of truth\n const { zoom, zoomStart, zoomEnd } = useWidgetSelector(id, (w) => ({\n zoom: (w as ZoomState | undefined)?.zoom ?? defaultZoom,\n zoomStart: (w as ZoomState | undefined)?.zoomStart ?? defaultZoomStart,\n zoomEnd: (w as ZoomState | undefined)?.zoomEnd ?? defaultZoomEnd,\n }))\n\n // Initialize store with default values on mount\n useEffect(() => {\n const current = widgetStoreActions.getWidget<ZoomState>(id)\n if (current?.zoom === undefined) {\n widgetStoreActions.setWidget(id, {\n zoom: defaultZoom,\n zoomStart: defaultZoomStart,\n zoomEnd: defaultZoomEnd,\n })\n }\n }, [id, defaultZoom, defaultZoomStart, defaultZoomEnd])\n\n // Handle dataZoom event — update store (source of truth)\n const handleDataZoom = useCallback(\n (event: unknown) => {\n const zoomEvent = event as {\n start?: number\n end?: number\n batch?: {\n start?: number\n end?: number\n }[]\n }\n\n const start = zoomEvent.start ?? zoomEvent.batch?.[0]?.start\n const end = zoomEvent.end ?? zoomEvent.batch?.[0]?.end\n\n if (start !== undefined && end !== undefined) {\n widgetStoreActions.setWidget(id, {\n zoom: true,\n zoomStart: start,\n zoomEnd: end,\n })\n }\n },\n [id],\n )\n\n // Register config tool once — fn reads zoom range from the store at execution time.\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: ZOOM_TOGGLE_TOOL_ID,\n type: 'config',\n order: 20,\n enabled: defaultZoom,\n fn: (currentConfig) => {\n const config = currentConfig as Record<string, unknown>\n const option = config.option as EchartOptionsProps | undefined\n const currentOnEvents =\n (config.onEvents as Record<string, unknown> | undefined) ?? {}\n\n const widget = widgetStoreActions.getWidget<ZoomState>(id)\n const start = widget?.zoomStart ?? 0\n const end = widget?.zoomEnd ?? 100\n\n const legend = option?.legend as { show?: boolean } | undefined\n const hasLegend = legend?.show !== false && legend !== undefined\n\n const sliderHeight = parseInt(theme?.spacing?.(4) ?? '32')\n const sliderGap = 8\n const legendBottomOffset = hasLegend ? 28 : 0\n\n const zoomConfig = getEChartZoomConfig(\n { start, end },\n {\n inside: true,\n xSlider: true,\n ySlider: false,\n bottomOffset: legendBottomOffset,\n },\n theme,\n )\n\n const grid = option?.grid as { bottom?: number | string } | undefined\n const currentGridBottom =\n typeof grid?.bottom === 'number'\n ? grid.bottom\n : parseInt(grid?.bottom ?? '24')\n\n const gridBottom = currentGridBottom + sliderHeight + sliderGap\n\n const onEvents = { ...currentOnEvents, dataZoom: handleDataZoom }\n\n return {\n ...config,\n option: {\n ...option,\n ...zoomConfig,\n grid: { ...grid, bottom: gridBottom },\n },\n onEvents,\n }\n },\n })\n return () => widgetStoreActions.unregisterTool(id, ZOOM_TOGGLE_TOOL_ID)\n }, [id, theme, handleDataZoom, defaultZoom, defaultZoomStart, defaultZoomEnd])\n\n // Sync enabled from store — lightweight, no re-registration\n useEffect(() => {\n widgetStoreActions.setToolEnabled(id, ZOOM_TOGGLE_TOOL_ID, zoom)\n }, [id, zoom])\n\n // Trigger pipeline when zoom range changes — fn reads from store at execution time,\n // but the pipeline only re-runs when registeredTools reference changes.\n // setToolEnabled handles the zoom on/off case, this handles range-only changes.\n useEffect(() => {\n widgetStoreActions.triggerToolPipeline(id)\n }, [id, zoomStart, zoomEnd])\n\n const handleToggle = () => {\n const newZoom = !zoom\n widgetStoreActions.setWidget(id, {\n zoom: newZoom,\n zoomStart: newZoom ? zoomStart : 0,\n zoomEnd: newZoom ? zoomEnd : 100,\n })\n }\n\n const handleReset = () => {\n widgetStoreActions.setWidget(id, {\n zoom: true,\n zoomStart: defaultZoomStart,\n zoomEnd: defaultZoomEnd,\n })\n }\n\n const enableLabel = labels?.enable ?? 'Enable zoom'\n const disableLabel = labels?.disable ?? 'Disable zoom'\n const resetLabel = labels?.reset ?? 'Reset zoom'\n const tooltipLabel = zoom ? disableLabel : enableLabel\n\n return (\n <Box sx={styles.container}>\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={labels?.ariaLabel ?? tooltipLabel}\n onClick={handleToggle}\n sx={styles.trigger}\n data-active={zoom}\n {...IconButtonProps}\n >\n {Icon ?? <ZoomInOutlined />}\n </IconButton>\n </Tooltip>\n {zoom && (\n <Tooltip title={resetLabel}>\n <IconButton\n size='small'\n aria-label={resetLabel}\n onClick={handleReset}\n {...IconButtonProps}\n >\n {ResetIcon ?? <SubdirectoryArrowLeftOutlined />}\n </IconButton>\n </Tooltip>\n )}\n </Box>\n )\n}\n","export const GroupedBarChartIcon = () => (\n <svg\n width='24'\n height='24'\n viewBox='0 0 24 24'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path\n d='M4 20V8H8V20H4ZM9 20V13H13V20H9ZM16 20V4H20V20H16Z'\n fill='currentColor'\n />\n </svg>\n)\n","import { IconButton } from '@mui/material'\nimport { useCallback, useEffect, useMemo } from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport type { StackToggleProps, StackToggleState } from './types'\nimport { actionButtonStyles } from '../shared/styles'\nimport { Tooltip } from '../../../components'\nimport { GroupedBarChartIcon } from './grouped-bar-chart-icon'\nimport { getEChartStackConfig } from '../../echart/utils'\nimport { DEFAULT_STACK_GROUP } from '../../echart/const'\nimport type { EchartWidgetState } from '../../echart/types'\nimport type { EchartOptionsProps } from '../../echart/types'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\nexport const STACK_TOGGLE_TOOL_ID = 'stack-toggle'\n\n/**\n * Widget action to toggle stacking behavior in ECharts bar and histogram widgets.\n *\n * Registers as a config pipeline tool so that stack configuration is automatically\n * re-applied when the base config is updated (e.g., by WidgetLoader).\n *\n * @example\n * ```tsx\n * <StackToggle\n * id=\"my-widget\"\n * defaultIsStacked={false}\n * />\n * ```\n */\nexport function StackToggle({\n id,\n defaultIsStacked = false,\n labels,\n Icon,\n IconButtonProps,\n}: StackToggleProps) {\n const { storeIsStacked, option } = useWidgetSelector(id, (w) => ({\n storeIsStacked: (w as StackToggleState | undefined)?.isStacked,\n option: (w as EchartWidgetState | undefined)?.option,\n }))\n\n const { hasMultiSeries, hasStackInSeries } = useMemo(() => {\n if (!option) return { hasMultiSeries: false, hasStackInSeries: false }\n const series = Array.isArray(option.series)\n ? option.series\n : [option.series]\n return {\n hasMultiSeries: series.length > 1,\n hasStackInSeries: series.some((s) => (s as { stack?: string })?.stack),\n }\n }, [option])\n\n // If series already has stack defined, default to stacked=true\n const effectiveDefaultIsStacked = hasStackInSeries || defaultIsStacked\n const isStacked = storeIsStacked ?? effectiveDefaultIsStacked\n\n // Register config tool once — fn has no closure deps\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: STACK_TOGGLE_TOOL_ID,\n type: 'config',\n order: 10,\n enabled: false,\n fn: (currentConfig: unknown) => {\n const config = currentConfig as Record<string, unknown>\n const option = config.option as EchartOptionsProps | undefined\n if (!option) return currentConfig\n\n const series = Array.isArray(option.series)\n ? option.series\n : [option.series]\n const updatedSeries = series.map((s) => {\n const existingStack = (s as { stack?: string })?.stack\n const stackGroup =\n typeof existingStack === 'string'\n ? existingStack\n : DEFAULT_STACK_GROUP\n return { ...s, ...getEChartStackConfig(stackGroup) }\n })\n\n return { ...config, option: { ...option, series: updatedSeries } }\n },\n })\n return () => widgetStoreActions.unregisterTool(id, STACK_TOGGLE_TOOL_ID)\n }, [id])\n\n // Sync enabled from store — lightweight, no re-registration\n useEffect(() => {\n widgetStoreActions.setToolEnabled(\n id,\n STACK_TOGGLE_TOOL_ID,\n isStacked && hasMultiSeries,\n )\n }, [id, isStacked, hasMultiSeries])\n\n // Initialize store with default value only if not already configured\n useEffect(() => {\n if (storeIsStacked !== undefined) return\n widgetStoreActions.setWidget(id, { isStacked: effectiveDefaultIsStacked })\n }, [effectiveDefaultIsStacked, id, storeIsStacked])\n\n const handleToggle = useCallback(() => {\n widgetStoreActions.setWidget(id, { isStacked: !isStacked })\n }, [isStacked, id])\n\n const tooltipLabel = isStacked\n ? (labels?.unstacked ?? 'Disable stacking')\n : (labels?.stacked ?? 'Enable stacking')\n\n // Early return if there's only one series - stacking doesn't apply\n if (!hasMultiSeries) {\n return null\n }\n\n return (\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={labels?.ariaLabel ?? tooltipLabel}\n onClick={handleToggle}\n sx={actionButtonStyles.trigger}\n data-active={isStacked}\n {...IconButtonProps}\n >\n {Icon ?? <GroupedBarChartIcon />}\n </IconButton>\n </Tooltip>\n )\n}\n","import { IconButton } from '@mui/material'\nimport { CheckBoxOutlined } from '@mui/icons-material'\nimport { useCallback, useEffect } from 'react'\nimport type { LockSelectionProps, LockSelectionState } from './types'\nimport { actionButtonStyles } from '../shared/styles'\nimport { Tooltip } from '../../../components'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\nimport type { EchartWidgetData } from '../../echart/types'\n\nexport const LOCK_SELECTION_TOOL_ID = 'lock-selection'\n\n/**\n * Widget action button to lock the current selection.\n *\n * When locked, the widget data is filtered to only show the selected items.\n * The button is only visible when there are selected items.\n * Registers a transformation tool in the widget pipeline when mounted.\n *\n * @example\n * ```tsx\n * <LockSelection\n * id=\"my-widget\"\n * order={30}\n * selectedItems={selectedItems}\n * />\n * ```\n */\nexport function LockSelection({\n id,\n selectedItems,\n order = 30,\n labels,\n Icon,\n IconButtonProps,\n}: LockSelectionProps) {\n const { storeIsLocked } = useWidgetSelector(id, (w) => ({\n storeIsLocked: (w as LockSelectionState | undefined)?.isLocked,\n }))\n\n const isLocked = storeIsLocked ?? false\n\n // Register tool once — fn reads lockedItems from the store at execution time\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: LOCK_SELECTION_TOOL_ID,\n order,\n enabled: false,\n fn: (data) => {\n const widget = widgetStoreActions.getWidget<LockSelectionState>(id)\n const items = widget?.lockedItems ?? []\n if (items.length === 0) return data\n\n return filterDataByLockedItems(data as EchartWidgetData, items)\n },\n })\n\n return () => widgetStoreActions.unregisterTool(id, LOCK_SELECTION_TOOL_ID)\n }, [id, order])\n\n // Sync enabled from store — lightweight, no re-registration.\n // When selectedItems is empty (e.g., remount with no active selection),\n // disable the tool and clear stale lock state.\n useEffect(() => {\n if (isLocked && selectedItems.length === 0) {\n widgetStoreActions.setWidget(id, { isLocked: false, lockedItems: [] })\n return\n }\n widgetStoreActions.setToolEnabled(id, LOCK_SELECTION_TOOL_ID, isLocked)\n }, [id, isLocked, selectedItems.length])\n\n const handleToggle = useCallback(() => {\n if (isLocked) {\n // Unlock: clear locked items and disable tool\n widgetStoreActions.setWidget(id, {\n isLocked: false,\n lockedItems: [],\n })\n } else {\n // Lock: save selected items and enable tool\n widgetStoreActions.setWidget(id, {\n isLocked: true,\n lockedItems: selectedItems,\n })\n }\n }, [id, isLocked, selectedItems])\n\n // Don't render if no selections\n if (selectedItems.length === 0) {\n return null\n }\n\n const tooltipLabel = isLocked\n ? (labels?.unlock ?? 'Unlock selection')\n : (labels?.lock ?? 'Lock selection')\n\n const ariaLabel = labels?.ariaLabel ?? tooltipLabel\n\n return (\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={ariaLabel}\n onClick={handleToggle}\n sx={actionButtonStyles.trigger}\n data-active={isLocked}\n {...IconButtonProps}\n >\n {Icon ?? <CheckBoxOutlined fontSize='small' />}\n </IconButton>\n </Tooltip>\n )\n}\n\n/**\n * Filters widget data to only include items with names matching the locked items.\n */\nfunction filterDataByLockedItems(\n data: EchartWidgetData,\n lockedItems: string[],\n): EchartWidgetData {\n return data.map((series) =>\n series.filter((item) => {\n const name = item.name\n return typeof name === 'string' && lockedItems.includes(name)\n }),\n )\n}\n","import { TextField, InputAdornment, IconButton } from '@mui/material'\nimport { ClearOutlined, SearchOutlined } from '@mui/icons-material'\nimport { useEffect, useRef, useCallback } from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\nimport type { SearcherProps, SearcherFilterFn, SearcherState } from './types'\nimport type { EchartWidgetData } from '../../echart/types'\nimport { LOCK_SELECTION_TOOL_ID } from '../lock-selection/lock-selection'\n\nexport const SEARCHER_TOOL_ID = 'searcher'\n\nconst DEBOUNCE_DELAY = 300\n\n/**\n * Search input component that works with SearcherToggle.\n *\n * Registers a transformation tool in the widget pipeline when mounted.\n * Reads the enabled state from the widget store using the provided id.\n * Uses a debounced search to filter data via the transformation pipeline.\n * Auto-focuses when enabled becomes true.\n *\n * @example\n * ```tsx\n * <SearcherToggle id=\"my-widget\" />\n * <Searcher\n * id=\"my-widget\"\n * order={10}\n * labels={{ placeholder: 'Search categories...' }}\n * />\n * ```\n */\nexport function Searcher({\n id,\n filterFn,\n order = 20,\n labels,\n TextFieldProps,\n ClearIcon,\n debounceDelay = DEBOUNCE_DELAY,\n}: SearcherProps) {\n const inputRef = useRef<HTMLInputElement>(null)\n const debounceTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // Read enabled state and search text from widget store\n const { enabled, searchText } = useWidgetSelector(id, (w) => ({\n enabled: (w as SearcherState | undefined)?.isSearchEnabled ?? false,\n searchText: (w as SearcherState | undefined)?.searchText ?? '',\n }))\n const prevEnabledRef = useRef(enabled)\n\n const filter = filterFn ?? defaultFilterFn\n\n const setSearchText = useCallback(\n (text: string) => {\n widgetStoreActions.setWidget(id, { searchText: text })\n },\n [id],\n )\n\n // Register tool once — fn reads searchText from the store at execution time.\n // Enabled is synced separately to avoid full re-registration on toggle.\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: SEARCHER_TOOL_ID,\n order,\n enabled: false,\n fn: async (data) => {\n const widget = widgetStoreActions.getWidget<SearcherState>(id)\n const currentSearchText = widget?.searchText ?? ''\n\n // Execute filter (can be sync or async)\n const result = filter(data as EchartWidgetData, currentSearchText)\n\n // Return result directly (pipeline will handle Promise)\n return result\n },\n disables: [LOCK_SELECTION_TOOL_ID],\n })\n\n return () => widgetStoreActions.unregisterTool(id, SEARCHER_TOOL_ID)\n }, [id, order, filter])\n\n // Sync enabled from store — lightweight, no re-registration\n useEffect(() => {\n widgetStoreActions.setToolEnabled(id, SEARCHER_TOOL_ID, enabled)\n }, [id, enabled])\n\n // Trigger pipeline re-execution when search text changes (debounced).\n // The fn reads searchText from the store, so we just need to trigger the pipeline.\n const debouncedTriggerPipeline = useCallback(() => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current)\n }\n debounceTimeoutRef.current = setTimeout(() => {\n widgetStoreActions.triggerToolPipeline(id)\n }, debounceDelay)\n }, [id, debounceDelay])\n\n // Auto-focus when enabled becomes true\n useEffect(() => {\n // Transition from disabled to enabled - focus input\n if (enabled && !prevEnabledRef.current && inputRef.current) {\n inputRef.current.focus()\n }\n\n prevEnabledRef.current = enabled\n }, [enabled])\n\n // Cleanup debounce timeout on unmount\n useEffect(() => {\n return () => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current)\n }\n }\n }, [])\n\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = event.target.value\n setSearchText(newValue)\n debouncedTriggerPipeline()\n },\n [debouncedTriggerPipeline, setSearchText],\n )\n\n const handleClear = useCallback(() => {\n setSearchText('')\n widgetStoreActions.triggerToolPipeline(id)\n if (inputRef.current) {\n inputRef.current.focus()\n }\n }, [id, setSearchText])\n\n if (!enabled) {\n return null\n }\n\n const placeholder = labels?.placeholder ?? 'Search...'\n const clearAriaLabel = labels?.clearAriaLabel ?? 'Clear search'\n\n return (\n <TextField\n inputRef={inputRef}\n size='small'\n fullWidth\n variant='filled'\n placeholder={placeholder}\n value={searchText}\n onChange={handleChange}\n InputProps={{\n startAdornment: (\n <InputAdornment position='start'>\n <SearchOutlined />\n </InputAdornment>\n ),\n endAdornment: searchText ? (\n <InputAdornment position='end'>\n <IconButton\n size='small'\n aria-label={clearAriaLabel}\n onClick={handleClear}\n edge='end'\n >\n {ClearIcon ?? <ClearOutlined fontSize='small' />}\n </IconButton>\n </InputAdornment>\n ) : null,\n }}\n {...TextFieldProps}\n />\n )\n}\n\n/**\n * Default filter function that searches all string fields case-insensitively.\n * Note: Should be synchronous for the new pipeline architecture.\n */\nconst defaultFilterFn: SearcherFilterFn = (\n data: EchartWidgetData,\n searchText: string,\n) => {\n if (!searchText.trim()) return Promise.resolve(data)\n\n const lowerSearch = searchText.toLowerCase()\n\n return Promise.resolve(\n data.map((series) =>\n series.filter((item) =>\n Object.values(item).some((value) =>\n String(value).toLowerCase().includes(lowerSearch),\n ),\n ),\n ),\n )\n}\n","import { IconButton } from '@mui/material'\nimport { SearchOutlined } from '@mui/icons-material'\nimport { useCallback, useEffect } from 'react'\nimport type { SearcherToggleProps, SearcherState } from './types'\nimport { actionButtonStyles } from '../shared/styles'\nimport { Tooltip } from '../../../components'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\n/**\n * Widget action button to toggle search functionality.\n *\n * Stores the enabled state in the widget store using the provided id.\n * When search is active, the button shows an active state with a light background.\n * Use in conjunction with the Searcher component to display the search input.\n *\n * @example\n * ```tsx\n * <SearcherToggle id=\"my-widget\" />\n * <Searcher\n * id=\"my-widget\"\n * data={widgetData}\n * />\n * ```\n */\nexport function SearcherToggle({\n id,\n defaultEnabled = false,\n labels,\n Icon,\n IconButtonProps,\n}: SearcherToggleProps) {\n const { storeIsEnabled } = useWidgetSelector(id, (w) => ({\n storeIsEnabled: (w as SearcherState | undefined)?.isSearchEnabled,\n }))\n\n const isEnabled = storeIsEnabled ?? defaultEnabled\n\n // Initialize store with default value on mount\n useEffect(() => {\n const currentValue =\n widgetStoreActions.getWidget<SearcherState>(id)?.isSearchEnabled\n if (currentValue === undefined) {\n widgetStoreActions.setWidget(id, { isSearchEnabled: defaultEnabled })\n }\n }, [defaultEnabled, id])\n\n const handleToggle = useCallback(() => {\n widgetStoreActions.setWidget(id, { isSearchEnabled: !isEnabled })\n }, [id, isEnabled])\n\n const tooltipLabel = isEnabled\n ? (labels?.disable ?? 'Disable search')\n : (labels?.enable ?? 'Enable search')\n\n const ariaLabel = labels?.ariaLabel ?? tooltipLabel\n\n return (\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={ariaLabel}\n onClick={handleToggle}\n sx={actionButtonStyles.trigger}\n data-active={isEnabled}\n {...IconButtonProps}\n >\n {Icon ?? <SearchOutlined fontSize='small' />}\n </IconButton>\n </Tooltip>\n )\n}\n","export const ChangeColumnIcon = () => (\n <svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 18 18'>\n <path\n fill='currentColor'\n fillRule='evenodd'\n d='M14.25 2.25H3.75c-.825 0-1.5.675-1.5 1.5v10.5c0 .825.675 1.5 1.5 1.5h10.5c.825 0 1.5-.675 1.5-1.5V3.75c0-.825-.675-1.5-1.5-1.5m-3.75 12h-3V3.75h3zM3.75 3.75H6v10.5H3.75zM12 14.25V3.75h2.25v10.5z'\n clipRule='evenodd'\n />\n </svg>\n)\n","import { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { ListItemText, MenuItem } from '@mui/material'\nimport type { TableColumn } from '../../table/types'\n\nexport interface SortableColumnItemProps {\n column: TableColumn\n}\n\n/**\n * A draggable menu item for column reordering.\n * Uses @dnd-kit/sortable for drag-and-drop functionality.\n */\nexport function SortableColumnItem({ column }: SortableColumnItemProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: column.id })\n\n const style = {\n transform: CSS.Transform.toString(\n transform ? { ...transform, x: 0 } : null,\n ),\n transition,\n opacity: isDragging ? 0.5 : 1,\n cursor: isDragging ? 'grabbing' : 'grab',\n }\n\n return (\n <MenuItem\n ref={setNodeRef}\n style={style}\n {...attributes}\n {...listeners}\n role='menuitem'\n tabIndex={0}\n sx={{\n '&:focus-visible': {\n outline: (theme) => `2px solid ${theme.palette.primary.main}`,\n outlineOffset: -2,\n },\n }}\n >\n <ListItemText>{column.label}</ListItemText>\n </MenuItem>\n )\n}\n","import {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n} from '@dnd-kit/core'\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { IconButton, Menu, SvgIcon } from '@mui/material'\nimport {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type MouseEvent,\n} from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport type { ChangeColumnProps } from './types'\nimport { actionButtonStyles } from '../shared/styles'\nimport { Tooltip } from '../../../components'\nimport type { TableColumn, TableWidgetState } from '../../table/types'\nimport { ChangeColumnIcon } from './change-column-icon'\nimport { SortableColumnItem } from './sortable-column-item'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\nexport const CHANGE_COLUMN_TOOL_ID = 'change-column'\n\n/**\n * Widget action to reorder columns in a table widget via drag-and-drop.\n *\n * This action reads the columns from the widget store and allows users to\n * drag and drop columns to reorder them. All columns are displayed and\n * can be reordered.\n *\n * Registers as a config pipeline tool so that column order is automatically\n * re-applied when the base config is updated (e.g., by WidgetLoader).\n *\n * Returns null if there are fewer than 2 columns.\n *\n * @example\n * ```tsx\n * <ChangeColumn id=\"my-table-widget\" />\n * ```\n */\nexport function ChangeColumn({\n id,\n labels,\n Icon,\n IconButtonProps,\n MenuProps,\n}: ChangeColumnProps) {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)\n const { columns } = useWidgetSelector(id, (w) => ({\n columns: (w as TableWidgetState | undefined)?.columns,\n }))\n\n /**\n * Config tool function that reorders columns to match the current widget state.\n * Reads desired order from the widget store (set by handleDragEnd via setWidget).\n * Preserves referential identity when the order already matches to prevent\n * re-render loops in the config pipeline.\n */\n const reorderFn = useCallback(\n (currentConfig: unknown): unknown => {\n const widgetState = widgetStoreActions.getWidget<TableWidgetState>(id)\n const currentColumns = widgetState?.columns\n if (!currentColumns || currentColumns.length === 0) return currentConfig\n\n const config = currentConfig as Record<string, unknown>\n const configColumns = config.columns as TableColumn[] | undefined\n if (!configColumns || configColumns.length === 0) return currentConfig\n\n // Check if config columns are already in the same order as widget columns\n const alreadyMatches =\n configColumns.length === currentColumns.length &&\n configColumns.every((col, i) => col.id === currentColumns[i]?.id)\n if (alreadyMatches) return currentConfig\n\n // Reorder config columns to match widget column order\n const columnMap = new Map(configColumns.map((col) => [col.id, col]))\n const reordered: TableColumn[] = []\n\n for (const widgetCol of currentColumns) {\n const col = columnMap.get(widgetCol.id)\n if (col) {\n reordered.push(col)\n columnMap.delete(widgetCol.id)\n }\n }\n\n // Append any new columns not in the widget order\n for (const col of columnMap.values()) {\n reordered.push(col)\n }\n\n // If result matches current widget columns, reuse the same array reference\n // to prevent downstream subscribers from detecting a change\n const matchesWidget =\n reordered.length === currentColumns.length &&\n reordered.every((col, i) => col.id === currentColumns[i]?.id)\n\n return { ...config, columns: matchesWidget ? currentColumns : reordered }\n },\n [id],\n )\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n )\n\n const columnIds = useMemo(\n () => columns?.map((col) => col.id) ?? [],\n [columns],\n )\n\n // Register config tool on mount\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: CHANGE_COLUMN_TOOL_ID,\n type: 'config',\n order: 100,\n enabled: true,\n fn: reorderFn,\n })\n return () => widgetStoreActions.unregisterTool(id, CHANGE_COLUMN_TOOL_ID)\n }, [id, reorderFn])\n\n const handleToggle = useCallback((event: MouseEvent<HTMLElement>) => {\n event.stopPropagation()\n setAnchorEl(event.currentTarget)\n }, [])\n\n const handleClose = useCallback(() => {\n setAnchorEl(null)\n }, [])\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n if (!over || active.id === over.id || !columns) return\n const oldIndex = columns.findIndex((col) => col.id === active.id)\n const newIndex = columns.findIndex((col) => col.id === over.id)\n if (oldIndex !== -1 && newIndex !== -1) {\n const newColumns = arrayMove(columns, oldIndex, newIndex)\n widgetStoreActions.setWidget(id, { columns: newColumns })\n }\n }\n\n // Return null if there are fewer than 2 columns\n if (!columns || columns.length < 2) {\n return null\n }\n\n const tooltipLabel = labels?.tooltip ?? 'Change column'\n const isOpen = Boolean(anchorEl)\n\n return (\n <>\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={labels?.ariaLabel ?? tooltipLabel}\n aria-controls={isOpen ? 'change-column-menu' : undefined}\n aria-haspopup='true'\n aria-expanded={isOpen ? 'true' : undefined}\n onClick={handleToggle}\n data-active={isOpen}\n sx={actionButtonStyles.trigger}\n {...IconButtonProps}\n >\n {Icon ?? (\n <SvgIcon>\n <ChangeColumnIcon />\n </SvgIcon>\n )}\n </IconButton>\n </Tooltip>\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={handleDragEnd}\n >\n <Menu\n id='change-column-menu'\n anchorEl={anchorEl}\n open={isOpen}\n onClose={handleClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n slotProps={{\n paper: {\n sx: { overflow: 'hidden' },\n },\n }}\n {...MenuProps}\n >\n <SortableContext\n items={columnIds}\n strategy={verticalListSortingStrategy}\n >\n {columns.map((column) => (\n <SortableColumnItem key={column.id} column={column} />\n ))}\n </SortableContext>\n </Menu>\n </DndContext>\n </>\n )\n}\n","import type { SxProps, Theme } from '@mui/material'\nimport type { CSSProperties } from 'react'\n\nexport const styles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(0.25),\n },\n trigger: {\n '&[data-active=\"true\"]': {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n },\n} satisfies Record<string, SxProps<Theme>>\n\n/**\n * Plain CSS objects for the brush overlay — we're outside MUI's sx pipeline\n * here because the rectangles are rendered via a React portal into the chart\n * div (not part of the MUI tree). Colors borrow from the base palette; if\n * theme-aware styling is needed later, move to styled components.\n */\nexport const overlayStyles: Record<string, CSSProperties> = {\n // `top` and `height` are filled in at render time from the chart's plot\n // rect so rectangles don't bleed over the legend / axis labels.\n //\n // Colors track ECharts 6's `backgroundTint` token (used by the default\n // brush) — a barely-visible pale blue-gray translucent fill that washes\n // bars underneath rather than masking them. Border is a hairline dark\n // alpha so the selection edges are just findable, not prominent.\n rect: {\n position: 'absolute',\n background: 'rgba(234, 237, 245, 0.2)',\n border: '1px dashed rgba(0, 0, 0, 0.15)',\n pointerEvents: 'none',\n },\n // Live drag preview — identical to committed rect (no \"in-progress\" vs\n // \"committed\" visual distinction; the preview just disappears on\n // `pointerup` as the rect takes its place).\n rectPreview: {\n position: 'absolute',\n background: 'rgba(234, 237, 245, 0.6)',\n border: '1px dashed rgba(0, 0, 0, 0.15)',\n pointerEvents: 'none',\n },\n}\n","import type { BrushRect } from './types'\n\n/**\n * Returns integer dataIndices covered by a brush rectangle on a category axis.\n *\n * `xStart` / `xEnd` come from `instance.convertFromPixel({ xAxisIndex: 0 }, …)`\n * which, for a category axis, returns fractional positions around integer\n * category indices (e.g. `1.3` lands between categories 1 and 2). We snap the\n * range outward (`floor` / `ceil`) so a drag that visually covers any part of\n * a category's bar includes that index.\n *\n * Results are clamped to `[0, dataLength - 1]` and returned in ascending order.\n */\nexport function hitTestCategoryRange(\n xStart: number,\n xEnd: number,\n dataLength: number,\n): number[] {\n if (dataLength <= 0) return []\n const [lo, hi] = xStart <= xEnd ? [xStart, xEnd] : [xEnd, xStart]\n\n const start = Math.max(0, Math.floor(lo))\n const end = Math.min(dataLength - 1, Math.ceil(hi))\n if (start > end) return []\n\n const indices: number[] = []\n for (let i = start; i <= end; i += 1) indices.push(i)\n return indices\n}\n\n/**\n * Union of `hitTestCategoryRange` across multiple rectangles. Used for\n * multi-brush selections where each drawn rectangle contributes to the\n * combined selection.\n */\nexport function hitTestRects(rects: BrushRect[], dataLength: number): number[] {\n if (rects.length === 0) return []\n const seen = new Set<number>()\n for (const rect of rects) {\n for (const i of hitTestCategoryRange(rect.xStart, rect.xEnd, dataLength)) {\n seen.add(i)\n }\n }\n return Array.from(seen).sort((a, b) => a - b)\n}\n","import {\n useCallback,\n useEffect,\n useRef,\n useState,\n useSyncExternalStore,\n} from 'react'\nimport type { CSSProperties, PointerEvent as ReactPointerEvent } from 'react'\nimport { createPortal } from 'react-dom'\nimport type { ECharts } from 'echarts'\nimport { useWidgetStore, widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\nimport type { EchartWidgetState } from '../../echart/types'\nimport { observeResize } from '../../echart/shared-resize-observer'\nimport { hitTestRects } from './hit-test'\nimport type { BrushRect, BrushState } from './types'\nimport { overlayStyles } from './style'\n\ninterface BrushOverlayProps {\n id: string\n multiBrush?: boolean\n}\n\ninterface PixelRect {\n left: number\n right: number\n}\n\ninterface PlotRect {\n x: number\n y: number\n width: number\n height: number\n}\n\n// Shape of the internal ECharts API we reach into to get the grid rectangle.\n// It's undocumented but stable across v5/v6; falling back gracefully if\n// ECharts ever changes the shape is handled by a try/catch at the call site.\ninterface EChartsGridInternals {\n getModel: () => {\n getComponent: (\n type: string,\n index?: number,\n ) => { coordinateSystem?: { getRect: () => PlotRect } } | null\n }\n}\n\n// Clicks (tiny drags) are ignored — distinguishes intent to select vs. misclick.\nconst MIN_DRAG_PX = 2\n\n// Stable empty-array references. Returning `[]` from the Zustand selector\n// on every call breaks shallow-equality memoization (each `[]` is a new\n// reference) — which ripples into `rects` being a fresh reference on every\n// render, which re-runs the re-projection effect, which `setProjectedRects`,\n// which re-renders, producing an infinite loop.\nconst EMPTY_RECTS: readonly BrushRect[] = Object.freeze([])\nconst EMPTY_PIXEL_RECTS: readonly PixelRect[] = Object.freeze([])\n\n/**\n * Reads the plot-area (grid) rectangle from an ECharts instance. Uses the\n * internal model API because ECharts doesn't expose this publicly; returns\n * `null` if the grid is missing or the API shape has drifted.\n */\nfunction readPlotRect(instance: ECharts): PlotRect | null {\n try {\n const model = (instance as unknown as EChartsGridInternals).getModel()\n const grid = model.getComponent('grid', 0)\n const rect = grid?.coordinateSystem?.getRect()\n if (!rect) return null\n if (\n !Number.isFinite(rect.x) ||\n !Number.isFinite(rect.y) ||\n !Number.isFinite(rect.width) ||\n !Number.isFinite(rect.height)\n ) {\n return null\n }\n return { x: rect.x, y: rect.y, width: rect.width, height: rect.height }\n } catch {\n return null\n }\n}\n\nfunction plotRectEquals(a: PlotRect | null, b: PlotRect | null): boolean {\n if (a === b) return true\n if (!a || !b) return false\n return (\n a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height\n )\n}\n\n/**\n * Portaled overlay rendered inside the ECharts chart `<div>`. Handles brush\n * drawing entirely in DOM, independent of ECharts' built-in brush.\n *\n * Rectangles are stored in x-axis data coords (category indices) in the\n * widget store. The overlay re-projects them to pixel coords on every chart\n * `finished` event and container resize, so `setOption({ notMerge: true })`\n * by the config pipeline is a non-event.\n *\n * Pointer capture and rectangle rendering are both clamped to the ECharts\n * grid (plot area), so the legend, axis labels, and other chart chrome\n * receive their usual events and aren't visually covered.\n *\n * Hit-testing happens on `pointerup` using `hitTestRects` against the widget's\n * data length (derived from `widget.data`). The result is written to\n * `brushSelection` in the store; `BrushToggle` subscribes to that and invokes\n * the consumer's `onBrushSelected` callback.\n */\nexport function BrushOverlay({ id, multiBrush }: BrushOverlayProps) {\n const { enabled, rects, dataLength } = useWidgetSelector(id, (w) => {\n const brushState = w as BrushState | undefined\n // Bar and histogram both expose data as a nested array of series;\n // all series share the same category count.\n const widgetData = w?.data as unknown[][] | undefined\n const firstSeries = widgetData?.[0]\n const length = Array.isArray(firstSeries) ? firstSeries.length : 0\n return {\n enabled: brushState?.brush ?? false,\n rects: brushState?.brushRects ?? (EMPTY_RECTS as BrushRect[]),\n dataLength: length,\n }\n })\n\n // Surface the chart DOM element and ECharts instance via `useSyncExternalStore`.\n // Reading `ref.current` inside a `getSnapshot` callback is idiomatic and\n // satisfies React Compiler's \"don't read refs during render\" guardrail.\n // The store notifies us when EchartUI registers the refs via `setWidget`;\n // `getSnapshot` then resolves the current values.\n const subscribe = useCallback(\n (notify: () => void) => useWidgetStore.subscribe(notify),\n [],\n )\n const chartEl = useSyncExternalStore(\n subscribe,\n useCallback((): HTMLElement | null => {\n return (\n widgetStoreActions.getWidget<EchartWidgetState>(id)?.refUI?.current ??\n null\n )\n }, [id]),\n () => null,\n )\n const instance = useSyncExternalStore(\n subscribe,\n useCallback((): ECharts | null => {\n return (\n widgetStoreActions.getWidget<EchartWidgetState>(id)?.instance\n ?.current ?? null\n )\n }, [id]),\n () => null,\n )\n\n const plotCaptureRef = useRef<HTMLDivElement | null>(null)\n const dragStartRef = useRef<number | null>(null)\n const pointerIdRef = useRef<number | null>(null)\n const [projectedRects, setProjectedRects] = useState<PixelRect[]>(\n EMPTY_PIXEL_RECTS as PixelRect[],\n )\n const [drawing, setDrawing] = useState<PixelRect | null>(null)\n const [plotRect, setPlotRect] = useState<PlotRect | null>(null)\n\n // Anchor the absolute-positioned overlay to the chart div. Look the element\n // up by id so React Compiler doesn't flag the style mutation; `chartEl` is\n // a normal state value here so using it as a trigger is safe.\n useEffect(() => {\n if (!chartEl) return\n const el = document.getElementById(id)\n if (!el) return\n const previous = el.style.position\n if (!previous) el.style.position = 'relative'\n return () => {\n if (!previous) el.style.position = ''\n }\n }, [id, chartEl])\n\n // Re-project stored rects to pixel coords and refresh the plot-area bounds\n // on every chart render (ECharts `finished` event) and on container\n // resize. This is what makes `setOption({ notMerge: true })` a non-event —\n // the store is untouched and the overlay just re-paints.\n useEffect(() => {\n if (!instance || !chartEl) return\n\n const project = () => {\n // Plot area bounds — if the grid isn't laid out yet we can't project\n // anything meaningfully, so skip this pass and wait for the next\n // `finished` event.\n const nextPlot = readPlotRect(instance)\n setPlotRect((prev) => (plotRectEquals(prev, nextPlot) ? prev : nextPlot))\n if (!nextPlot) return\n\n const next: PixelRect[] = []\n for (const r of rects) {\n const leftPx = instance.convertToPixel({ xAxisIndex: 0 }, r.xStart)\n const rightPx = instance.convertToPixel({ xAxisIndex: 0 }, r.xEnd)\n if (\n typeof leftPx !== 'number' ||\n typeof rightPx !== 'number' ||\n !Number.isFinite(leftPx) ||\n !Number.isFinite(rightPx)\n ) {\n continue\n }\n // Clamp to plot area horizontally so rectangles never bleed onto\n // adjacent padding/legend.\n const lo = Math.max(nextPlot.x, Math.min(leftPx, rightPx))\n const hi = Math.min(\n nextPlot.x + nextPlot.width,\n Math.max(leftPx, rightPx),\n )\n if (hi <= lo) continue\n next.push({ left: lo, right: hi })\n }\n // Reuse the frozen empty reference so successive \"no rectangles\"\n // updates hit React's `Object.is` bail-out instead of re-rendering.\n setProjectedRects(\n next.length === 0 ? (EMPTY_PIXEL_RECTS as PixelRect[]) : next,\n )\n }\n\n project()\n instance.on('finished', project)\n const unobserve = observeResize(chartEl, project)\n return () => {\n instance.off('finished', project)\n unobserve()\n }\n }, [instance, chartEl, rects])\n\n const handlePointerDown = useCallback(\n (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!enabled || !chartEl || !plotRect) return\n const capture = plotCaptureRef.current\n if (!capture) return\n e.preventDefault()\n capture.setPointerCapture(e.pointerId)\n pointerIdRef.current = e.pointerId\n // Work in chart-container pixel space so conversions via\n // `convertFromPixel` (which expects container-relative coords) stay\n // consistent with the rectangle positions we store.\n const chartBBox = chartEl.getBoundingClientRect()\n const x = clampX(e.clientX - chartBBox.left, plotRect)\n dragStartRef.current = x\n setDrawing({ left: x, right: x })\n },\n [enabled, chartEl, plotRect],\n )\n\n const handlePointerMove = useCallback(\n (e: ReactPointerEvent<HTMLDivElement>) => {\n if (pointerIdRef.current !== e.pointerId) return\n const start = dragStartRef.current\n if (start === null || !chartEl || !plotRect) return\n const chartBBox = chartEl.getBoundingClientRect()\n const x = clampX(e.clientX - chartBBox.left, plotRect)\n setDrawing({ left: Math.min(start, x), right: Math.max(start, x) })\n },\n [chartEl, plotRect],\n )\n\n const handlePointerUp = useCallback(\n (e: ReactPointerEvent<HTMLDivElement>) => {\n if (pointerIdRef.current !== e.pointerId) return\n const start = dragStartRef.current\n const capture = plotCaptureRef.current\n pointerIdRef.current = null\n dragStartRef.current = null\n setDrawing(null)\n\n if (start === null || !capture || !instance || !chartEl || !plotRect) {\n return\n }\n\n try {\n capture.releasePointerCapture(e.pointerId)\n } catch {\n // releasePointerCapture throws if the pointer is no longer captured;\n // ignore and continue.\n }\n\n const chartBBox = chartEl.getBoundingClientRect()\n const x = clampX(e.clientX - chartBBox.left, plotRect)\n const leftPx = Math.min(start, x)\n const rightPx = Math.max(start, x)\n if (rightPx - leftPx < MIN_DRAG_PX) return\n\n const xStart = instance.convertFromPixel({ xAxisIndex: 0 }, leftPx)\n const xEnd = instance.convertFromPixel({ xAxisIndex: 0 }, rightPx)\n if (\n typeof xStart !== 'number' ||\n typeof xEnd !== 'number' ||\n !Number.isFinite(xStart) ||\n !Number.isFinite(xEnd)\n ) {\n return\n }\n\n const newRect: BrushRect = { xStart, xEnd }\n const nextRects = multiBrush ? [...rects, newRect] : [newRect]\n const selection = {\n dataIndex: hitTestRects(nextRects, dataLength),\n seriesIndex: 0,\n }\n\n widgetStoreActions.setWidget(id, {\n brushRects: nextRects,\n brushSelection: selection,\n // Single-brush: auto-disable after selection (matches prior UX).\n ...(multiBrush ? {} : { brush: false }),\n })\n },\n [id, instance, multiBrush, rects, dataLength, chartEl, plotRect],\n )\n\n if (!chartEl) return null\n\n // Outer container spans the whole chart but never captures pointer events,\n // so the legend / axis labels / other chart chrome remain interactive.\n const containerStyle: CSSProperties = {\n position: 'absolute',\n inset: 0,\n pointerEvents: 'none',\n zIndex: 1,\n }\n\n // Inner capture layer sits over the plot area only. This is the element\n // that gets the pointer events when brush is active.\n const captureStyle: CSSProperties | undefined = plotRect\n ? {\n position: 'absolute',\n left: plotRect.x,\n top: plotRect.y,\n width: plotRect.width,\n height: plotRect.height,\n pointerEvents: enabled ? 'auto' : 'none',\n cursor: enabled ? 'crosshair' : 'default',\n userSelect: 'none',\n touchAction: 'none',\n }\n : undefined\n\n return createPortal(\n <div style={containerStyle}>\n {captureStyle && (\n <div\n ref={plotCaptureRef}\n style={captureStyle}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n />\n )}\n {plotRect &&\n projectedRects.map((r, i) => (\n <div\n key={`${r.left}-${r.right}-${i}`}\n style={{\n ...overlayStyles.rect,\n left: r.left,\n width: Math.max(0, r.right - r.left),\n top: plotRect.y,\n height: plotRect.height,\n }}\n />\n ))}\n {plotRect && drawing && (\n <div\n style={{\n ...overlayStyles.rectPreview,\n left: drawing.left,\n width: Math.max(0, drawing.right - drawing.left),\n top: plotRect.y,\n height: plotRect.height,\n }}\n />\n )}\n </div>,\n chartEl,\n )\n}\n\nfunction clampX(x: number, plot: PlotRect): number {\n return Math.max(plot.x, Math.min(plot.x + plot.width, x))\n}\n","import { Box, IconButton } from '@mui/material'\nimport { HighlightAltOutlined } from '@mui/icons-material'\nimport { useCallback, useEffect, useRef } from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport type { BrushSelectedItems, BrushState, BrushToggleProps } from './types'\nimport { styles } from './style'\nimport { Tooltip } from '../../../components'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\nimport { BrushOverlay } from './brush-overlay'\n\n/**\n * Kept for backwards compatibility. The tool is no longer registered with the\n * widget store — brush state is now owned directly by this component and the\n * associated DOM overlay instead of being driven through the config pipeline.\n * Existing code that looks this constant up in `registeredTools` will simply\n * find no match.\n */\nexport const BRUSH_TOGGLE_TOOL_ID = 'brush-toggle'\n\n/**\n * Widget action to toggle brush-style selection on bar and histogram widgets.\n *\n * Renders a toggle button and a portaled overlay rendered inside the chart's\n * `<div>`. The overlay handles all pointer interactions, draws selection\n * rectangles in DOM, and hit-tests against the widget data. All state lives\n * in the widget store — rectangles survive config-pipeline re-renders\n * (`setOption({ notMerge: true })`) automatically.\n *\n * Only intended for bar and histogram widgets (both use `xAxis.type === 'category'`).\n *\n * @example\n * ```tsx\n * <BrushToggle\n * id=\"my-widget\"\n * onBrushSelected={(items) => console.log(items)}\n * />\n * ```\n */\nexport function BrushToggle({\n id,\n onBrushSelected,\n multiBrush,\n selections,\n defaultEnabled = false,\n labels,\n Icon,\n IconButtonProps,\n}: BrushToggleProps) {\n // Single subscription for everything this component cares about.\n const { brush, selection } = useWidgetSelector(id, (w) => {\n const s = w as BrushState | undefined\n return {\n brush: s?.brush ?? defaultEnabled,\n selection: s?.brushSelection,\n }\n })\n\n // Seed the widget store with `defaultEnabled` on first mount. Guarded so\n // remounts don't stomp whatever the user has toggled to.\n useEffect(() => {\n const current = widgetStoreActions.getWidget<BrushState>(id)?.brush\n if (current === undefined) {\n widgetStoreActions.setWidget(id, { brush: defaultEnabled })\n }\n }, [id, defaultEnabled])\n\n const handleToggle = useCallback(() => {\n if (brush) {\n // Disabling: keep rectangles visible so the consumer's selection stays\n // in sync. Re-enabling clears them below (fresh slate each activation).\n widgetStoreActions.setWidget(id, { brush: false })\n } else {\n widgetStoreActions.setWidget(id, {\n brush: true,\n brushRects: [],\n brushSelection: { dataIndex: [], seriesIndex: 0 },\n })\n // Mirror the clear to the consumer so its selection drops with the\n // visual rectangles.\n onBrushSelected?.({ dataIndex: [], seriesIndex: 0 })\n }\n }, [brush, id, onBrushSelected])\n\n // Invoke the consumer's callback whenever the overlay writes a new\n // selection to the store. `selection` is a new object reference on each\n // pointerup so a simple reference check is enough.\n const lastSelectionRef = useRef<BrushSelectedItems | undefined>(undefined)\n useEffect(() => {\n if (!selection) return\n if (lastSelectionRef.current === selection) return\n lastSelectionRef.current = selection\n onBrushSelected?.(selection)\n }, [selection, onBrushSelected])\n\n // Consumer-driven clear: when `selections` transitions to 0 (e.g. the user\n // presses the clear button in `WidgetSelectionSummary`), drop all drawn\n // rectangles and any stored selection.\n useEffect(() => {\n if (selections !== 0) return\n const state = widgetStoreActions.getWidget<BrushState>(id)\n const hasRects = (state?.brushRects?.length ?? 0) > 0\n const hasSelection = (state?.brushSelection?.dataIndex?.length ?? 0) > 0\n if (!hasRects && !hasSelection) return\n widgetStoreActions.setWidget(id, {\n brushRects: [],\n brushSelection: { dataIndex: [], seriesIndex: 0 },\n })\n }, [selections, id])\n\n const enableLabel = labels?.enable ?? 'Enable brush selection'\n const disableLabel = labels?.disable ?? 'Disable brush selection'\n const tooltipLabel = brush ? disableLabel : enableLabel\n\n return (\n <>\n <Box sx={styles.container}>\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={labels?.ariaLabel ?? tooltipLabel}\n onClick={handleToggle}\n sx={styles.trigger}\n data-active={brush}\n {...IconButtonProps}\n >\n {Icon ?? <HighlightAltOutlined />}\n </IconButton>\n </Tooltip>\n </Box>\n <BrushOverlay id={id} multiBrush={multiBrush} />\n </>\n )\n}\n"],"names":["styles","title","container","display","alignItems","justifyContent","gap","content","flexDirection","spacing","EMPTY_DIALOG_CONTENT_PROPS","FullScreen","t0","$","_c","id","labels","children","Icon","IconButtonProps","DialogContentProps","t1","DialogProps","t2","undefined","sx","isFullScreen","useWidgetSelector","_temp","t3","updates","widgetStoreActions","setWidget","updateFullScreenConfig","t4","t5","FullscreenOutlined","t6","IconButton","t7","t8","ariaLabel","t9","t10","t11","Typography","t12","t13","Symbol","for","Close","t14","jsx","t15","DialogTitle","t16","t17","DialogContent","t18","Dialog","t19","w","EMPTY_LABELS","Download","items","data","isDownloading","setIsDownloading","useState","anchorEl","setAnchorEl","event","stopPropagation","currentTarget","handleToggle","data_0","option","link","document","createElement","href","download","filename","style","body","appendChild","click","removeChild","callback","handleDownload","event_0","option_0","result","modifier","handleClick","length","CircularProgress","FileDownloadOutlined","vertical","horizontal","Boolean","paddingBottom","option_1","jsxs","MenuItem","disabled","e","icon","ListItemIcon","color","ListItemText","label","map","Menu","actionButtonStyles","trigger","background","theme","palette","primary","relatedLight","calculateTotal","reduce","total","series","seriesTotal","item","Array","isArray","value","at","Object","entries","itemTotal","key","toRelativeData","index","transformed","RELATIVE_DATA_TOOL_ID","RELATIVE_DATA_CONFIG_TOOL_ID","RelativeData","order","defaultIsRelative","percentFormatterRef","useRef","isRelative","current","getWidget","originalFormatter","formatter","originalMax","max","useEffect","registerTool","enabled","fn","unregisterTool","setToolEnabled","type","currentConfig","config","widget","hasSourceData","sourceData","locale","Intl","NumberFormat","minimumFractionDigits","maximumFractionDigits","format","widget_0","newIsRelative","widget_1","tooltipLabel","absolute","relative","PercentOutlined","Tooltip","echartData","ZOOM_TOGGLE_TOOL_ID","ZoomToggle","defaultZoom","defaultZoomStart","defaultZoomEnd","ResetIcon","useTheme","zoom","zoomStart","zoomEnd","zoomEvent","start","batch","end","handleDataZoom","currentOnEvents","onEvents","start_0","end_0","legend","hasLegend","show","sliderHeight","parseInt","zoomConfig","getEChartZoomConfig","inside","xSlider","ySlider","bottomOffset","legendBottomOffset","grid","gridBottom","bottom","dataZoom","triggerToolPipeline","newZoom","handleReset","enableLabel","enable","disableLabel","disable","resetLabel","reset","ZoomInOutlined","t20","SubdirectoryArrowLeftOutlined","t21","Box","GroupedBarChartIcon","STACK_TOGGLE_TOOL_ID","StackToggle","defaultIsStacked","storeIsStacked","bb0","hasMultiSeries","hasStackInSeries","some","_temp2","effectiveDefaultIsStacked","isStacked","_temp4","unstacked","stacked","updatedSeries","_temp3","s_0","existingStack","s","stack","getEChartStackConfig","DEFAULT_STACK_GROUP","LOCK_SELECTION_TOOL_ID","LockSelection","selectedItems","storeIsLocked","isLocked","lockedItems","filterDataByLockedItems","unlock","lock","CheckBoxOutlined","filter","name","includes","SEARCHER_TOOL_ID","DEBOUNCE_DELAY","Searcher","filterFn","TextFieldProps","ClearIcon","debounceDelay","inputRef","debounceTimeoutRef","searchText","prevEnabledRef","defaultFilterFn","text","setSearchText","currentSearchText","disables","clearTimeout","setTimeout","debouncedTriggerPipeline","focus","newValue","target","handleChange","handleClear","placeholder","clearAriaLabel","InputAdornment","SearchOutlined","ClearOutlined","startAdornment","endAdornment","TextField","isSearchEnabled","trim","Promise","resolve","lowerSearch","toLowerCase","values","String","SearcherToggle","defaultEnabled","storeIsEnabled","isEnabled","ChangeColumnIcon","SortableColumnItem","column","attributes","listeners","setNodeRef","transform","transition","isDragging","useSortable","CSS","Transform","toString","x","opacity","cursor","outline","outlineOffset","main","CHANGE_COLUMN_TOOL_ID","ChangeColumn","MenuProps","columns","currentColumns","configColumns","every","col","i","columnMap","Map","reordered","widgetCol","col_1","get","push","delete","col_2","matchesWidget","col_3","i_0","reorderFn","coordinateGetter","sortableKeyboardCoordinates","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","columnIds","handleClose","active","over","oldIndex","findIndex","col_5","newIndex","col_6","newColumns","arrayMove","handleDragEnd","tooltip","isOpen","SvgIcon","paper","overflow","SortableContext","verticalListSortingStrategy","DndContext","closestCenter","t22","col_4","col_0","overlayStyles","rect","position","border","pointerEvents","rectPreview","hitTestCategoryRange","xStart","xEnd","dataLength","lo","hi","Math","floor","min","ceil","indices","hitTestRects","rects","seen","Set","add","from","sort","a","b","MIN_DRAG_PX","EMPTY_RECTS","freeze","EMPTY_PIXEL_RECTS","readPlotRect","instance","getModel","getComponent","coordinateSystem","getRect","Number","isFinite","y","width","height","plotRectEquals","BrushOverlay","multiBrush","subscribe","refUI","chartEl","useSyncExternalStore","plotCaptureRef","dragStartRef","pointerIdRef","projectedRects","setProjectedRects","drawing","setDrawing","plotRect","setPlotRect","el","getElementById","previous","project","nextPlot","prev","next","r","leftPx","convertToPixel","xAxisIndex","rightPx","left","right","on","unobserve","observeResize","off","capture","preventDefault","setPointerCapture","pointerId","chartBBox","getBoundingClientRect","clampX","clientX","handlePointerDown","e_0","chartBBox_0","x_0","handlePointerMove","e_1","capture_0","releasePointerCapture","chartBBox_1","x_1","leftPx_0","rightPx_0","convertFromPixel","newRect","nextRects","selection","dataIndex","seriesIndex","brushRects","brushSelection","brush","handlePointerUp","inset","zIndex","containerStyle","top","userSelect","touchAction","captureStyle","r_0","createPortal","notify","useWidgetStore","brushState","firstSeries","plot","BRUSH_TOGGLE_TOOL_ID","BrushToggle","onBrushSelected","selections","lastSelectionRef","state","hasRects","hasSelection","HighlightAltOutlined"],"mappings":"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"}
1
+ {"version":3,"file":"actions.js","sources":["../../src/widgets/actions/fullscreen/styles.ts","../../src/widgets/actions/fullscreen/fullscreen.tsx","../../src/widgets/actions/download/download.tsx","../../src/widgets/actions/shared/styles.ts","../../src/widgets/actions/relative-data/utils.ts","../../src/widgets/actions/relative-data/relative-data.tsx","../../src/widgets/actions/zoom-toggle/style.ts","../../src/widgets/actions/zoom-toggle/zoom-toggle.tsx","../../src/widgets/actions/stack-toggle/grouped-bar-chart-icon.tsx","../../src/widgets/actions/stack-toggle/stack-toggle.tsx","../../src/widgets/actions/lock-selection/lock-selection.tsx","../../src/widgets/actions/searcher/searcher.tsx","../../src/widgets/actions/searcher/searcher-toggle.tsx","../../src/widgets/actions/change-column/change-column-icon.tsx","../../src/widgets/actions/change-column/sortable-column-item.tsx","../../src/widgets/actions/change-column/change-column.tsx","../../src/widgets/actions/brush-toggle/style.ts","../../src/widgets/actions/brush-toggle/hit-test.ts","../../src/widgets/actions/brush-toggle/brush-overlay.tsx","../../src/widgets/actions/brush-toggle/brush-toggle.tsx"],"sourcesContent":["import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n title: {\n container: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 1,\n },\n },\n content: {\n display: 'flex',\n flexDirection: 'column',\n gap: ({ spacing }) => spacing(1),\n },\n} satisfies Record<string, SxProps<Theme>>\n","import {\n Dialog,\n DialogContent,\n DialogTitle,\n IconButton,\n Typography,\n} from '@mui/material'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\nimport { Close, FullscreenOutlined } from '@mui/icons-material'\nimport type {\n FullScreenConfig,\n FullScreenProps,\n FullScreenState,\n} from './types'\nimport { styles } from './styles'\n\nconst EMPTY_DIALOG_CONTENT_PROPS: NonNullable<\n FullScreenProps['DialogContentProps']\n> = {}\n\n/**\n * Displays widget content in a fullscreen modal dialog.\n *\n * Manages fullscreen state via the widget store and renders a MUI Dialog\n * with the widget title and a close button.\n *\n * @example\n * ```tsx\n * <FullScreen id=\"my-widget\" labels={{ ariaLabel: 'Expand chart' }}>\n * <ChartContent id=\"my-widget\" />\n * </FullScreen>\n * ```\n */\nexport function FullScreen({\n id,\n labels,\n children,\n Icon,\n IconButtonProps,\n DialogContentProps: {\n sx,\n ...DialogContentProps\n } = EMPTY_DIALOG_CONTENT_PROPS,\n DialogProps,\n}: FullScreenProps) {\n const { isFullScreen, title } = useWidgetSelector(id, (w) => ({\n isFullScreen: (w as FullScreenState | undefined)?.isFullScreen,\n title: (w as FullScreenState | undefined)?.title,\n }))\n const updateFullScreenConfig = (updates: Partial<FullScreenConfig>) => {\n widgetStoreActions.setWidget<FullScreenState>(id, {\n isFullScreen: updates.isFullScreen,\n })\n }\n\n return (\n <>\n <IconButton\n {...IconButtonProps}\n onClick={() => updateFullScreenConfig({ isFullScreen: true })}\n >\n {Icon ?? <FullscreenOutlined />}\n </IconButton>\n <Dialog\n maxWidth={false}\n open={!!isFullScreen}\n keepMounted\n aria-labelledby={labels?.ariaLabel ?? `fullscreen-dialog-title-${id}`}\n {...DialogProps}\n onClose={() => updateFullScreenConfig({ isFullScreen: false })}\n >\n <DialogTitle\n id={`fullscreen-dialog-title-${id}`}\n sx={styles.title.container}\n >\n <Typography variant='subtitle1' component='span'>\n {title}\n </Typography>\n <IconButton\n onClick={() => updateFullScreenConfig({ isFullScreen: false })}\n >\n <Close />\n </IconButton>\n </DialogTitle>\n <DialogContent\n sx={{\n ...styles.content,\n ...sx,\n }}\n {...DialogContentProps}\n >\n {children}\n </DialogContent>\n </Dialog>\n </>\n )\n}\n","import {\n CircularProgress,\n IconButton,\n ListItemIcon,\n ListItemText,\n Menu,\n MenuItem,\n} from '@mui/material'\nimport type { DownloadItem, DownloadProps } from './types'\nimport { FileDownloadOutlined } from '@mui/icons-material'\nimport { useState, type MouseEvent } from 'react'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\nconst EMPTY_LABELS: NonNullable<DownloadProps['labels']> = {}\n\n/**\n * Dropdown menu action for exporting widget data in various formats (CSV, PNG, etc.).\n *\n * Reads widget data from the store and triggers downloads using the modifier\n * function defined in each `DownloadItem`.\n *\n * @example\n * ```tsx\n * <Download id={widgetId} items={barDownloadConfig({ refUI })} />\n * ```\n */\nexport function Download({\n id,\n items,\n labels = EMPTY_LABELS,\n Icon,\n IconButtonProps,\n}: DownloadProps) {\n const { data } = useWidgetSelector(id, (w) => ({\n data: w?.data,\n }))\n\n const [isDownloading, setIsDownloading] = useState(false)\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null)\n\n const handleToggle = (event: MouseEvent<HTMLElement>) => {\n event.stopPropagation()\n setAnchorEl(event.currentTarget)\n }\n\n const handleDownload = (data: string, option: DownloadItem) => {\n const link = document.createElement('a')\n link.href = data\n link.download = option.filename ?? id\n link.style.display = 'none'\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n option.callback?.(link.href)\n }\n\n const handleClick = async (\n event: MouseEvent<HTMLElement>,\n option: DownloadItem,\n ) => {\n event.stopPropagation()\n\n setIsDownloading(true)\n setAnchorEl(null)\n\n const result = await option.modifier(data)\n\n if (!result) {\n setIsDownloading(false)\n return\n }\n\n handleDownload(result, option)\n setIsDownloading(false)\n }\n\n return (\n <>\n <IconButton\n size='small'\n aria-label={labels.ariaLabel ?? 'download options'}\n aria-controls='options-menu'\n aria-haspopup='true'\n onClick={handleToggle}\n {...IconButtonProps}\n disabled={isDownloading || items.length === 0}\n className={isDownloading || anchorEl ? 'active' : ''}\n >\n {isDownloading ? (\n <CircularProgress size={18} color='inherit' />\n ) : (\n (Icon ?? <FileDownloadOutlined />)\n )}\n </IconButton>\n <Menu\n variant='menu'\n elevation={8}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'right',\n }}\n anchorEl={anchorEl}\n open={Boolean(anchorEl)}\n onClose={() => setAnchorEl(null)}\n MenuListProps={{\n sx: {\n paddingBottom: 0,\n },\n }}\n >\n {items.map((option) => (\n <MenuItem\n key={option.id}\n disabled={option.disabled}\n onClick={(e) => void handleClick(e, option)}\n >\n {option.icon && (\n <ListItemIcon sx={{ color: 'text.primary' }}>\n {option.icon}\n </ListItemIcon>\n )}\n <ListItemText>{option.label}</ListItemText>\n </MenuItem>\n ))}\n </Menu>\n </>\n )\n}\n","import type { SxProps, Theme } from '@mui/material'\n\n/**\n * Shared styles for widget action buttons\n */\nexport const actionButtonStyles = {\n trigger: {\n '&[data-active=\"true\"]': {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n },\n} satisfies Record<string, SxProps<Theme>>\n","import type { EchartWidgetData } from '../../echart/types'\n\n/**\n * Calculates the sum of all numeric values in the data\n */\nexport function calculateTotal(data: EchartWidgetData): number {\n return data.reduce((total, series) => {\n return series.reduce((seriesTotal, item) => {\n if (Array.isArray(item)) {\n const value = item.at(-1) as number\n return typeof value === 'number' ? seriesTotal + value : seriesTotal\n }\n\n return Object.entries(item).reduce((itemTotal: number, [key, value]) => {\n if (key === 'name') {\n return itemTotal\n }\n return typeof value === 'number' ? itemTotal + value : itemTotal\n }, seriesTotal)\n }, total)\n }, 0)\n}\n\n/**\n * Transforms data to relative (percentage) values\n */\nexport function toRelativeData(\n data: EchartWidgetData,\n total: number,\n): EchartWidgetData {\n if (total === 0) return data\n\n return data.map((series) =>\n series.map((item) => {\n if (Array.isArray(item)) {\n return item.map((value: number, index) => {\n if (index === item.length - 1 && typeof value === 'number') {\n return (value / total) * 100\n }\n return value\n }) as typeof item\n }\n\n const transformed: Record<string, string | number> = {}\n\n for (const [key, value] of Object.entries(item)) {\n if (key === 'name') {\n transformed[key] = value\n continue\n }\n transformed[key] =\n typeof value === 'number' ? (value / total) * 100 : value\n }\n\n return transformed\n }),\n )\n}\n","import { IconButton } from '@mui/material'\nimport { PercentOutlined } from '@mui/icons-material'\nimport { useCallback, useEffect, useRef } from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\nimport type { RelativeDataProps, RelativeDataState } from './types'\nimport { actionButtonStyles } from '../shared/styles'\nimport { Tooltip } from '../../../components'\nimport { calculateTotal, toRelativeData } from './utils'\nimport type { EchartWidgetData } from '../../../widgets/echart'\n\nexport const RELATIVE_DATA_TOOL_ID = 'relative-data'\nexport const RELATIVE_DATA_CONFIG_TOOL_ID = 'relative-data-config'\n\n/**\n * Widget action to toggle between relative (percentage) and absolute data display.\n *\n * Registers two transformation tools in the widget pipeline when mounted:\n * - A data tool that converts values to percentages (enabled/disabled via store)\n * - A config tool that is **always enabled** and reads `isRelative` from the store\n * to decide whether to apply the percentage formatter or restore the original one.\n * The config tool must always participate because the original formatter may have\n * been set via `setWidget` (not in the base config), so disabling the tool would\n * leave the percentage formatter stuck on the widget.\n *\n * @example\n * ```tsx\n * <RelativeData\n * id=\"my-widget\"\n * order={20}\n * defaultIsRelative={false}\n * />\n * ```\n */\nexport function RelativeData({\n id,\n order = 10,\n defaultIsRelative = false,\n labels,\n Icon,\n IconButtonProps,\n}: RelativeDataProps) {\n const percentFormatterRef = useRef<((value: number) => string) | undefined>(\n undefined,\n )\n\n // Read isRelative from widget store root — single source of truth\n const { isRelative } = useWidgetSelector(id, (w) => ({\n isRelative:\n (w as RelativeDataState | undefined)?.isRelative ?? defaultIsRelative,\n }))\n\n // Initialize store with default value on mount.\n // When defaultIsRelative=true, capture originals so toggling OFF can restore them.\n useEffect(() => {\n const current = widgetStoreActions.getWidget<RelativeDataState>(id)\n if (current?.isRelative === undefined) {\n if (defaultIsRelative) {\n widgetStoreActions.setWidget(id, {\n isRelative: true,\n originalFormatter: current?.formatter,\n originalMax: (current as unknown as Record<string, number>)?.max,\n })\n } else {\n widgetStoreActions.setWidget(id, { isRelative: defaultIsRelative })\n }\n }\n }, [id, defaultIsRelative])\n\n // Register data tool once — fn has no closure deps\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: RELATIVE_DATA_TOOL_ID,\n order,\n enabled: defaultIsRelative,\n fn: (data) => {\n const echartData = data as EchartWidgetData\n const total = calculateTotal(echartData)\n return toRelativeData(echartData, total)\n },\n })\n\n return () => widgetStoreActions.unregisterTool(id, RELATIVE_DATA_TOOL_ID)\n }, [id, order, defaultIsRelative])\n\n // Sync data tool enabled — lightweight, no re-registration\n useEffect(() => {\n widgetStoreActions.setToolEnabled(id, RELATIVE_DATA_TOOL_ID, isRelative)\n }, [id, isRelative])\n\n // Register config tool — ALWAYS enabled.\n // Reads isRelative, originalFormatter, originalMax from the store at execution time:\n // - isRelative=true → applies percentage formatter and max=100\n // - isRelative=false → restores original formatter/max from store\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: RELATIVE_DATA_CONFIG_TOOL_ID,\n type: 'config',\n order,\n enabled: true,\n fn: (currentConfig: unknown) => {\n const config = currentConfig as Record<string, unknown>\n const widget = widgetStoreActions.getWidget<RelativeDataState>(id)\n\n const hasSourceData =\n widget?.sourceData != null &&\n !(Array.isArray(widget.sourceData) && widget.sourceData.length === 0)\n\n if (widget?.isRelative) {\n // Don't apply percentage formatter when there's no source data\n if (!hasSourceData) return config\n\n if (!percentFormatterRef.current) {\n const locale = widget?.locale\n percentFormatterRef.current = (value: number) =>\n new Intl.NumberFormat(locale, {\n style: 'percent',\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n }).format(value / 100)\n }\n return { ...config, formatter: percentFormatterRef.current, max: 100 }\n }\n\n // Not in relative mode — restore originals from store if captured.\n // Use `in` because originalFormatter may have been captured as undefined\n // (widget had no formatter before toggling relative on).\n percentFormatterRef.current = undefined\n if (widget != null && 'originalFormatter' in widget) {\n return {\n ...config,\n formatter: widget.originalFormatter,\n max: widget.originalMax,\n }\n }\n return config\n },\n })\n return () => {\n // Restore original formatter/max if unmounting while in relative mode\n const widget = widgetStoreActions.getWidget<RelativeDataState>(id)\n if (widget?.isRelative && 'originalFormatter' in widget) {\n widgetStoreActions.setWidget(id, {\n formatter: widget.originalFormatter,\n max: widget.originalMax,\n })\n }\n percentFormatterRef.current = undefined\n widgetStoreActions.unregisterTool(id, RELATIVE_DATA_CONFIG_TOOL_ID)\n }\n }, [id, order, defaultIsRelative])\n\n const handleToggle = useCallback(() => {\n const newIsRelative = !isRelative\n percentFormatterRef.current = undefined\n\n if (newIsRelative) {\n // Capture current formatter/max in store before switching to relative\n const widget = widgetStoreActions.getWidget(id)\n widgetStoreActions.setWidget(id, {\n isRelative: true,\n originalFormatter: widget?.formatter,\n originalMax: (widget as unknown as Record<string, unknown>)?.max,\n })\n } else {\n widgetStoreActions.setWidget(id, { isRelative: false })\n }\n }, [isRelative, id])\n\n const tooltipLabel = isRelative\n ? (labels?.absolute ?? 'Show absolute values')\n : (labels?.relative ?? 'Show relative values')\n\n return (\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={labels?.ariaLabel ?? tooltipLabel}\n onClick={handleToggle}\n sx={actionButtonStyles.trigger}\n data-active={isRelative}\n {...IconButtonProps}\n >\n {Icon ?? <PercentOutlined />}\n </IconButton>\n </Tooltip>\n )\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(0.25),\n },\n trigger: {\n '&[data-active=\"true\"]': {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { Box, IconButton, useTheme } from '@mui/material'\nimport {\n SubdirectoryArrowLeftOutlined,\n ZoomInOutlined,\n} from '@mui/icons-material'\nimport { useEffect, useCallback } from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport type { ZoomToggleProps, ZoomState } from './types'\nimport { styles } from './style'\nimport { Tooltip } from '../../../components'\nimport { getEChartZoomConfig } from '../../echart/utils'\nimport type { EchartOptionsProps } from '../../echart/types'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\nexport const ZOOM_TOGGLE_TOOL_ID = 'zoom-toggle'\n\n/**\n * Widget action to toggle EChart zoom functionality.\n *\n * Registers as a config pipeline tool so that zoom configuration is automatically\n * re-applied when the base config is updated (e.g., by WidgetLoader).\n *\n * Zoom state (enabled, range) is stored in the widget store root, and the tool\n * derives its `enabled` flag from the store. This keeps state accessible across\n * component instances.\n *\n * When zoom is active, displays an inline reset button to disable zoom.\n * Only intended for use in fullscreen ToolbarActions for bar and histogram widgets.\n *\n * @example\n * ```tsx\n * <ZoomToggle\n * id=\"my-widget\"\n * defaultZoom={false}\n * zoomStart={0}\n * zoomEnd={100}\n * />\n * ```\n */\nexport function ZoomToggle({\n id,\n defaultZoom = false,\n defaultZoomStart = 0,\n defaultZoomEnd = 100,\n labels,\n Icon,\n ResetIcon,\n IconButtonProps,\n}: ZoomToggleProps) {\n const theme = useTheme()\n\n // Read zoom state from widget store root — single source of truth\n const { zoom, zoomStart, zoomEnd } = useWidgetSelector(id, (w) => ({\n zoom: (w as ZoomState | undefined)?.zoom ?? defaultZoom,\n zoomStart: (w as ZoomState | undefined)?.zoomStart ?? defaultZoomStart,\n zoomEnd: (w as ZoomState | undefined)?.zoomEnd ?? defaultZoomEnd,\n }))\n\n // Initialize store with default values on mount\n useEffect(() => {\n const current = widgetStoreActions.getWidget<ZoomState>(id)\n if (current?.zoom === undefined) {\n widgetStoreActions.setWidget(id, {\n zoom: defaultZoom,\n zoomStart: defaultZoomStart,\n zoomEnd: defaultZoomEnd,\n })\n }\n }, [id, defaultZoom, defaultZoomStart, defaultZoomEnd])\n\n // Handle dataZoom event — update store (source of truth)\n const handleDataZoom = useCallback(\n (event: unknown) => {\n const zoomEvent = event as {\n start?: number\n end?: number\n batch?: {\n start?: number\n end?: number\n }[]\n }\n\n const start = zoomEvent.start ?? zoomEvent.batch?.[0]?.start\n const end = zoomEvent.end ?? zoomEvent.batch?.[0]?.end\n\n if (start !== undefined && end !== undefined) {\n widgetStoreActions.setWidget(id, {\n zoom: true,\n zoomStart: start,\n zoomEnd: end,\n })\n }\n },\n [id],\n )\n\n // Register config tool once — fn reads zoom range from the store at execution time.\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: ZOOM_TOGGLE_TOOL_ID,\n type: 'config',\n order: 20,\n enabled: defaultZoom,\n fn: (currentConfig) => {\n const config = currentConfig as Record<string, unknown>\n const option = config.option as EchartOptionsProps | undefined\n const currentOnEvents =\n (config.onEvents as Record<string, unknown> | undefined) ?? {}\n\n const widget = widgetStoreActions.getWidget<ZoomState>(id)\n const start = widget?.zoomStart ?? 0\n const end = widget?.zoomEnd ?? 100\n\n const legend = option?.legend as { show?: boolean } | undefined\n const hasLegend = legend?.show !== false && legend !== undefined\n\n const sliderHeight = parseInt(theme?.spacing?.(4) ?? '32')\n const sliderGap = 8\n const legendBottomOffset = hasLegend ? 28 : 0\n\n const zoomConfig = getEChartZoomConfig(\n { start, end },\n {\n inside: true,\n xSlider: true,\n ySlider: false,\n bottomOffset: legendBottomOffset,\n },\n theme,\n )\n\n const grid = option?.grid as { bottom?: number | string } | undefined\n const currentGridBottom =\n typeof grid?.bottom === 'number'\n ? grid.bottom\n : parseInt(grid?.bottom ?? '24')\n\n const gridBottom = currentGridBottom + sliderHeight + sliderGap\n\n const onEvents = { ...currentOnEvents, dataZoom: handleDataZoom }\n\n return {\n ...config,\n option: {\n ...option,\n ...zoomConfig,\n grid: { ...grid, bottom: gridBottom },\n },\n onEvents,\n }\n },\n })\n return () => widgetStoreActions.unregisterTool(id, ZOOM_TOGGLE_TOOL_ID)\n }, [id, theme, handleDataZoom, defaultZoom, defaultZoomStart, defaultZoomEnd])\n\n // Sync enabled from store — lightweight, no re-registration\n useEffect(() => {\n widgetStoreActions.setToolEnabled(id, ZOOM_TOGGLE_TOOL_ID, zoom)\n }, [id, zoom])\n\n // Trigger pipeline when zoom range changes — fn reads from store at execution time,\n // but the pipeline only re-runs when registeredTools reference changes.\n // setToolEnabled handles the zoom on/off case, this handles range-only changes.\n useEffect(() => {\n widgetStoreActions.triggerToolPipeline(id)\n }, [id, zoomStart, zoomEnd])\n\n const handleToggle = () => {\n const newZoom = !zoom\n widgetStoreActions.setWidget(id, {\n zoom: newZoom,\n zoomStart: newZoom ? zoomStart : 0,\n zoomEnd: newZoom ? zoomEnd : 100,\n })\n }\n\n const handleReset = () => {\n widgetStoreActions.setWidget(id, {\n zoom: true,\n zoomStart: defaultZoomStart,\n zoomEnd: defaultZoomEnd,\n })\n }\n\n const enableLabel = labels?.enable ?? 'Enable zoom'\n const disableLabel = labels?.disable ?? 'Disable zoom'\n const resetLabel = labels?.reset ?? 'Reset zoom'\n const tooltipLabel = zoom ? disableLabel : enableLabel\n\n return (\n <Box sx={styles.container}>\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={labels?.ariaLabel ?? tooltipLabel}\n onClick={handleToggle}\n sx={styles.trigger}\n data-active={zoom}\n {...IconButtonProps}\n >\n {Icon ?? <ZoomInOutlined />}\n </IconButton>\n </Tooltip>\n {zoom && (\n <Tooltip title={resetLabel}>\n <IconButton\n size='small'\n aria-label={resetLabel}\n onClick={handleReset}\n {...IconButtonProps}\n >\n {ResetIcon ?? <SubdirectoryArrowLeftOutlined />}\n </IconButton>\n </Tooltip>\n )}\n </Box>\n )\n}\n","export const GroupedBarChartIcon = () => (\n <svg\n width='24'\n height='24'\n viewBox='0 0 24 24'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path\n d='M4 20V8H8V20H4ZM9 20V13H13V20H9ZM16 20V4H20V20H16Z'\n fill='currentColor'\n />\n </svg>\n)\n","import { IconButton } from '@mui/material'\nimport { useCallback, useEffect, useMemo } from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport type { StackToggleProps, StackToggleState } from './types'\nimport { actionButtonStyles } from '../shared/styles'\nimport { Tooltip } from '../../../components'\nimport { GroupedBarChartIcon } from './grouped-bar-chart-icon'\nimport { getEChartStackConfig } from '../../echart/utils'\nimport { DEFAULT_STACK_GROUP } from '../../echart/const'\nimport type { EchartWidgetState } from '../../echart/types'\nimport type { EchartOptionsProps } from '../../echart/types'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\nexport const STACK_TOGGLE_TOOL_ID = 'stack-toggle'\n\n/**\n * Widget action to toggle stacking behavior in ECharts bar and histogram widgets.\n *\n * Registers as a config pipeline tool so that stack configuration is automatically\n * re-applied when the base config is updated (e.g., by WidgetLoader).\n *\n * @example\n * ```tsx\n * <StackToggle\n * id=\"my-widget\"\n * defaultIsStacked={false}\n * />\n * ```\n */\nexport function StackToggle({\n id,\n defaultIsStacked = false,\n labels,\n Icon,\n IconButtonProps,\n}: StackToggleProps) {\n const { storeIsStacked, option } = useWidgetSelector(id, (w) => ({\n storeIsStacked: (w as StackToggleState | undefined)?.isStacked,\n option: (w as EchartWidgetState | undefined)?.option,\n }))\n\n const { hasMultiSeries, hasStackInSeries } = useMemo(() => {\n if (!option) return { hasMultiSeries: false, hasStackInSeries: false }\n const series = Array.isArray(option.series)\n ? option.series\n : [option.series]\n return {\n hasMultiSeries: series.length > 1,\n hasStackInSeries: series.some((s) => (s as { stack?: string })?.stack),\n }\n }, [option])\n\n // If series already has stack defined, default to stacked=true\n const effectiveDefaultIsStacked = hasStackInSeries || defaultIsStacked\n const isStacked = storeIsStacked ?? effectiveDefaultIsStacked\n\n // Register config tool once — fn has no closure deps\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: STACK_TOGGLE_TOOL_ID,\n type: 'config',\n order: 10,\n enabled: false,\n fn: (currentConfig: unknown) => {\n const config = currentConfig as Record<string, unknown>\n const option = config.option as EchartOptionsProps | undefined\n if (!option) return currentConfig\n\n const series = Array.isArray(option.series)\n ? option.series\n : [option.series]\n const updatedSeries = series.map((s) => {\n const existingStack = (s as { stack?: string })?.stack\n const stackGroup =\n typeof existingStack === 'string'\n ? existingStack\n : DEFAULT_STACK_GROUP\n return { ...s, ...getEChartStackConfig(stackGroup) }\n })\n\n return { ...config, option: { ...option, series: updatedSeries } }\n },\n })\n return () => widgetStoreActions.unregisterTool(id, STACK_TOGGLE_TOOL_ID)\n }, [id])\n\n // Sync enabled from store — lightweight, no re-registration\n useEffect(() => {\n widgetStoreActions.setToolEnabled(\n id,\n STACK_TOGGLE_TOOL_ID,\n isStacked && hasMultiSeries,\n )\n }, [id, isStacked, hasMultiSeries])\n\n // Initialize store with default value only if not already configured\n useEffect(() => {\n if (storeIsStacked !== undefined) return\n widgetStoreActions.setWidget(id, { isStacked: effectiveDefaultIsStacked })\n }, [effectiveDefaultIsStacked, id, storeIsStacked])\n\n const handleToggle = useCallback(() => {\n widgetStoreActions.setWidget(id, { isStacked: !isStacked })\n }, [isStacked, id])\n\n const tooltipLabel = isStacked\n ? (labels?.unstacked ?? 'Disable stacking')\n : (labels?.stacked ?? 'Enable stacking')\n\n // Early return if there's only one series - stacking doesn't apply\n if (!hasMultiSeries) {\n return null\n }\n\n return (\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={labels?.ariaLabel ?? tooltipLabel}\n onClick={handleToggle}\n sx={actionButtonStyles.trigger}\n data-active={isStacked}\n {...IconButtonProps}\n >\n {Icon ?? <GroupedBarChartIcon />}\n </IconButton>\n </Tooltip>\n )\n}\n","import { IconButton } from '@mui/material'\nimport { CheckBoxOutlined } from '@mui/icons-material'\nimport { useCallback, useEffect } from 'react'\nimport type { LockSelectionProps, LockSelectionState } from './types'\nimport { actionButtonStyles } from '../shared/styles'\nimport { Tooltip } from '../../../components'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\nimport type { EchartWidgetData } from '../../echart/types'\n\nexport const LOCK_SELECTION_TOOL_ID = 'lock-selection'\n\n/**\n * Widget action button to lock the current selection.\n *\n * When locked, the widget data is filtered to only show the selected items.\n * The button is only visible when there are selected items.\n * Registers a transformation tool in the widget pipeline when mounted.\n *\n * @example\n * ```tsx\n * <LockSelection\n * id=\"my-widget\"\n * order={30}\n * selectedItems={selectedItems}\n * />\n * ```\n */\nexport function LockSelection({\n id,\n selectedItems,\n order = 30,\n labels,\n Icon,\n IconButtonProps,\n}: LockSelectionProps) {\n const { storeIsLocked } = useWidgetSelector(id, (w) => ({\n storeIsLocked: (w as LockSelectionState | undefined)?.isLocked,\n }))\n\n const isLocked = storeIsLocked ?? false\n\n // Register tool once — fn reads lockedItems from the store at execution time\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: LOCK_SELECTION_TOOL_ID,\n order,\n enabled: false,\n fn: (data) => {\n const widget = widgetStoreActions.getWidget<LockSelectionState>(id)\n const items = widget?.lockedItems ?? []\n if (items.length === 0) return data\n\n return filterDataByLockedItems(data as EchartWidgetData, items)\n },\n })\n\n return () => widgetStoreActions.unregisterTool(id, LOCK_SELECTION_TOOL_ID)\n }, [id, order])\n\n // Sync enabled from store — lightweight, no re-registration.\n // When selectedItems is empty (e.g., remount with no active selection),\n // disable the tool and clear stale lock state.\n useEffect(() => {\n if (isLocked && selectedItems.length === 0) {\n widgetStoreActions.setWidget(id, { isLocked: false, lockedItems: [] })\n return\n }\n widgetStoreActions.setToolEnabled(id, LOCK_SELECTION_TOOL_ID, isLocked)\n }, [id, isLocked, selectedItems.length])\n\n const handleToggle = useCallback(() => {\n if (isLocked) {\n // Unlock: clear locked items and disable tool\n widgetStoreActions.setWidget(id, {\n isLocked: false,\n lockedItems: [],\n })\n } else {\n // Lock: save selected items and enable tool\n widgetStoreActions.setWidget(id, {\n isLocked: true,\n lockedItems: selectedItems,\n })\n }\n }, [id, isLocked, selectedItems])\n\n // Don't render if no selections\n if (selectedItems.length === 0) {\n return null\n }\n\n const tooltipLabel = isLocked\n ? (labels?.unlock ?? 'Unlock selection')\n : (labels?.lock ?? 'Lock selection')\n\n const ariaLabel = labels?.ariaLabel ?? tooltipLabel\n\n return (\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={ariaLabel}\n onClick={handleToggle}\n sx={actionButtonStyles.trigger}\n data-active={isLocked}\n {...IconButtonProps}\n >\n {Icon ?? <CheckBoxOutlined fontSize='small' />}\n </IconButton>\n </Tooltip>\n )\n}\n\n/**\n * Filters widget data to only include items with names matching the locked items.\n */\nfunction filterDataByLockedItems(\n data: EchartWidgetData,\n lockedItems: string[],\n): EchartWidgetData {\n return data.map((series) =>\n series.filter((item) => {\n const name = item.name\n return typeof name === 'string' && lockedItems.includes(name)\n }),\n )\n}\n","import { TextField, InputAdornment, IconButton } from '@mui/material'\nimport { ClearOutlined, SearchOutlined } from '@mui/icons-material'\nimport { useEffect, useRef, useCallback } from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\nimport type { SearcherProps, SearcherFilterFn, SearcherState } from './types'\nimport type { EchartWidgetData } from '../../echart/types'\nimport { LOCK_SELECTION_TOOL_ID } from '../lock-selection/lock-selection'\n\nexport const SEARCHER_TOOL_ID = 'searcher'\n\nconst DEBOUNCE_DELAY = 300\n\n/**\n * Search input component that works with SearcherToggle.\n *\n * Registers a transformation tool in the widget pipeline when mounted.\n * Reads the enabled state from the widget store using the provided id.\n * Uses a debounced search to filter data via the transformation pipeline.\n * Auto-focuses when enabled becomes true.\n *\n * @example\n * ```tsx\n * <SearcherToggle id=\"my-widget\" />\n * <Searcher\n * id=\"my-widget\"\n * order={10}\n * labels={{ placeholder: 'Search categories...' }}\n * />\n * ```\n */\nexport function Searcher({\n id,\n filterFn,\n order = 20,\n labels,\n TextFieldProps,\n ClearIcon,\n debounceDelay = DEBOUNCE_DELAY,\n}: SearcherProps) {\n const inputRef = useRef<HTMLInputElement>(null)\n const debounceTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // Read enabled state and search text from widget store\n const { enabled, searchText } = useWidgetSelector(id, (w) => ({\n enabled: (w as SearcherState | undefined)?.isSearchEnabled ?? false,\n searchText: (w as SearcherState | undefined)?.searchText ?? '',\n }))\n const prevEnabledRef = useRef(enabled)\n\n const filter = filterFn ?? defaultFilterFn\n\n const setSearchText = useCallback(\n (text: string) => {\n widgetStoreActions.setWidget(id, { searchText: text })\n },\n [id],\n )\n\n // Register tool once — fn reads searchText from the store at execution time.\n // Enabled is synced separately to avoid full re-registration on toggle.\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: SEARCHER_TOOL_ID,\n order,\n enabled: false,\n fn: async (data) => {\n const widget = widgetStoreActions.getWidget<SearcherState>(id)\n const currentSearchText = widget?.searchText ?? ''\n\n // Execute filter (can be sync or async)\n const result = filter(data as EchartWidgetData, currentSearchText)\n\n // Return result directly (pipeline will handle Promise)\n return result\n },\n disables: [LOCK_SELECTION_TOOL_ID],\n })\n\n return () => widgetStoreActions.unregisterTool(id, SEARCHER_TOOL_ID)\n }, [id, order, filter])\n\n // Sync enabled from store — lightweight, no re-registration\n useEffect(() => {\n widgetStoreActions.setToolEnabled(id, SEARCHER_TOOL_ID, enabled)\n }, [id, enabled])\n\n // Trigger pipeline re-execution when search text changes (debounced).\n // The fn reads searchText from the store, so we just need to trigger the pipeline.\n const debouncedTriggerPipeline = useCallback(() => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current)\n }\n debounceTimeoutRef.current = setTimeout(() => {\n widgetStoreActions.triggerToolPipeline(id)\n }, debounceDelay)\n }, [id, debounceDelay])\n\n // Auto-focus when enabled becomes true\n useEffect(() => {\n // Transition from disabled to enabled - focus input\n if (enabled && !prevEnabledRef.current && inputRef.current) {\n inputRef.current.focus()\n }\n\n prevEnabledRef.current = enabled\n }, [enabled])\n\n // Cleanup debounce timeout on unmount\n useEffect(() => {\n return () => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current)\n }\n }\n }, [])\n\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = event.target.value\n setSearchText(newValue)\n debouncedTriggerPipeline()\n },\n [debouncedTriggerPipeline, setSearchText],\n )\n\n const handleClear = useCallback(() => {\n setSearchText('')\n widgetStoreActions.triggerToolPipeline(id)\n if (inputRef.current) {\n inputRef.current.focus()\n }\n }, [id, setSearchText])\n\n if (!enabled) {\n return null\n }\n\n const placeholder = labels?.placeholder ?? 'Search...'\n const clearAriaLabel = labels?.clearAriaLabel ?? 'Clear search'\n\n return (\n <TextField\n inputRef={inputRef}\n size='small'\n fullWidth\n variant='filled'\n placeholder={placeholder}\n value={searchText}\n onChange={handleChange}\n InputProps={{\n startAdornment: (\n <InputAdornment position='start'>\n <SearchOutlined />\n </InputAdornment>\n ),\n endAdornment: searchText ? (\n <InputAdornment position='end'>\n <IconButton\n size='small'\n aria-label={clearAriaLabel}\n onClick={handleClear}\n edge='end'\n >\n {ClearIcon ?? <ClearOutlined fontSize='small' />}\n </IconButton>\n </InputAdornment>\n ) : null,\n }}\n {...TextFieldProps}\n />\n )\n}\n\n/**\n * Default filter function that searches all string fields case-insensitively.\n * Note: Should be synchronous for the new pipeline architecture.\n */\nconst defaultFilterFn: SearcherFilterFn = (\n data: EchartWidgetData,\n searchText: string,\n) => {\n if (!searchText.trim()) return Promise.resolve(data)\n\n const lowerSearch = searchText.toLowerCase()\n\n return Promise.resolve(\n data.map((series) =>\n series.filter((item) =>\n Object.values(item).some((value) =>\n String(value).toLowerCase().includes(lowerSearch),\n ),\n ),\n ),\n )\n}\n","import { IconButton } from '@mui/material'\nimport { SearchOutlined } from '@mui/icons-material'\nimport { useCallback, useEffect } from 'react'\nimport type { SearcherToggleProps, SearcherState } from './types'\nimport { actionButtonStyles } from '../shared/styles'\nimport { Tooltip } from '../../../components'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\n/**\n * Widget action button to toggle search functionality.\n *\n * Stores the enabled state in the widget store using the provided id.\n * When search is active, the button shows an active state with a light background.\n * Use in conjunction with the Searcher component to display the search input.\n *\n * @example\n * ```tsx\n * <SearcherToggle id=\"my-widget\" />\n * <Searcher\n * id=\"my-widget\"\n * data={widgetData}\n * />\n * ```\n */\nexport function SearcherToggle({\n id,\n defaultEnabled = false,\n labels,\n Icon,\n IconButtonProps,\n}: SearcherToggleProps) {\n const { storeIsEnabled } = useWidgetSelector(id, (w) => ({\n storeIsEnabled: (w as SearcherState | undefined)?.isSearchEnabled,\n }))\n\n const isEnabled = storeIsEnabled ?? defaultEnabled\n\n // Initialize store with default value on mount\n useEffect(() => {\n const currentValue =\n widgetStoreActions.getWidget<SearcherState>(id)?.isSearchEnabled\n if (currentValue === undefined) {\n widgetStoreActions.setWidget(id, { isSearchEnabled: defaultEnabled })\n }\n }, [defaultEnabled, id])\n\n const handleToggle = useCallback(() => {\n widgetStoreActions.setWidget(id, { isSearchEnabled: !isEnabled })\n }, [id, isEnabled])\n\n const tooltipLabel = isEnabled\n ? (labels?.disable ?? 'Disable search')\n : (labels?.enable ?? 'Enable search')\n\n const ariaLabel = labels?.ariaLabel ?? tooltipLabel\n\n return (\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={ariaLabel}\n onClick={handleToggle}\n sx={actionButtonStyles.trigger}\n data-active={isEnabled}\n {...IconButtonProps}\n >\n {Icon ?? <SearchOutlined fontSize='small' />}\n </IconButton>\n </Tooltip>\n )\n}\n","export const ChangeColumnIcon = () => (\n <svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 18 18'>\n <path\n fill='currentColor'\n fillRule='evenodd'\n d='M14.25 2.25H3.75c-.825 0-1.5.675-1.5 1.5v10.5c0 .825.675 1.5 1.5 1.5h10.5c.825 0 1.5-.675 1.5-1.5V3.75c0-.825-.675-1.5-1.5-1.5m-3.75 12h-3V3.75h3zM3.75 3.75H6v10.5H3.75zM12 14.25V3.75h2.25v10.5z'\n clipRule='evenodd'\n />\n </svg>\n)\n","import { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { ListItemText, MenuItem } from '@mui/material'\nimport type { TableColumn } from '../../table/types'\n\nexport interface SortableColumnItemProps {\n column: TableColumn\n}\n\n/**\n * A draggable menu item for column reordering.\n * Uses @dnd-kit/sortable for drag-and-drop functionality.\n */\nexport function SortableColumnItem({ column }: SortableColumnItemProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: column.id })\n\n const style = {\n transform: CSS.Transform.toString(\n transform ? { ...transform, x: 0 } : null,\n ),\n transition,\n opacity: isDragging ? 0.5 : 1,\n cursor: isDragging ? 'grabbing' : 'grab',\n }\n\n return (\n <MenuItem\n ref={setNodeRef}\n style={style}\n {...attributes}\n {...listeners}\n role='menuitem'\n tabIndex={0}\n sx={{\n '&:focus-visible': {\n outline: (theme) => `2px solid ${theme.palette.primary.main}`,\n outlineOffset: -2,\n },\n }}\n >\n <ListItemText>{column.label}</ListItemText>\n </MenuItem>\n )\n}\n","import {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n} from '@dnd-kit/core'\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { IconButton, Menu, SvgIcon } from '@mui/material'\nimport {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type MouseEvent,\n} from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport type { ChangeColumnProps } from './types'\nimport { actionButtonStyles } from '../shared/styles'\nimport { Tooltip } from '../../../components'\nimport type { TableColumn, TableWidgetState } from '../../table/types'\nimport { ChangeColumnIcon } from './change-column-icon'\nimport { SortableColumnItem } from './sortable-column-item'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\nexport const CHANGE_COLUMN_TOOL_ID = 'change-column'\n\n/**\n * Widget action to reorder columns in a table widget via drag-and-drop.\n *\n * This action reads the columns from the widget store and allows users to\n * drag and drop columns to reorder them. All columns are displayed and\n * can be reordered.\n *\n * Registers as a config pipeline tool so that column order is automatically\n * re-applied when the base config is updated (e.g., by WidgetLoader).\n *\n * Returns null if there are fewer than 2 columns.\n *\n * @example\n * ```tsx\n * <ChangeColumn id=\"my-table-widget\" />\n * ```\n */\nexport function ChangeColumn({\n id,\n labels,\n Icon,\n IconButtonProps,\n MenuProps,\n}: ChangeColumnProps) {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)\n const { columns } = useWidgetSelector(id, (w) => ({\n columns: (w as TableWidgetState | undefined)?.columns,\n }))\n\n /**\n * Config tool function that reorders columns to match the current widget state.\n * Reads desired order from the widget store (set by handleDragEnd via setWidget).\n * Preserves referential identity when the order already matches to prevent\n * re-render loops in the config pipeline.\n */\n const reorderFn = useCallback(\n (currentConfig: unknown): unknown => {\n const widgetState = widgetStoreActions.getWidget<TableWidgetState>(id)\n const currentColumns = widgetState?.columns\n if (!currentColumns || currentColumns.length === 0) return currentConfig\n\n const config = currentConfig as Record<string, unknown>\n const configColumns = config.columns as TableColumn[] | undefined\n if (!configColumns || configColumns.length === 0) return currentConfig\n\n // Check if config columns are already in the same order as widget columns\n const alreadyMatches =\n configColumns.length === currentColumns.length &&\n configColumns.every((col, i) => col.id === currentColumns[i]?.id)\n if (alreadyMatches) return currentConfig\n\n // Reorder config columns to match widget column order\n const columnMap = new Map(configColumns.map((col) => [col.id, col]))\n const reordered: TableColumn[] = []\n\n for (const widgetCol of currentColumns) {\n const col = columnMap.get(widgetCol.id)\n if (col) {\n reordered.push(col)\n columnMap.delete(widgetCol.id)\n }\n }\n\n // Append any new columns not in the widget order\n for (const col of columnMap.values()) {\n reordered.push(col)\n }\n\n // If result matches current widget columns, reuse the same array reference\n // to prevent downstream subscribers from detecting a change\n const matchesWidget =\n reordered.length === currentColumns.length &&\n reordered.every((col, i) => col.id === currentColumns[i]?.id)\n\n return { ...config, columns: matchesWidget ? currentColumns : reordered }\n },\n [id],\n )\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n )\n\n const columnIds = useMemo(\n () => columns?.map((col) => col.id) ?? [],\n [columns],\n )\n\n // Register config tool on mount\n useEffect(() => {\n widgetStoreActions.registerTool(id, {\n id: CHANGE_COLUMN_TOOL_ID,\n type: 'config',\n order: 100,\n enabled: true,\n fn: reorderFn,\n })\n return () => widgetStoreActions.unregisterTool(id, CHANGE_COLUMN_TOOL_ID)\n }, [id, reorderFn])\n\n const handleToggle = useCallback((event: MouseEvent<HTMLElement>) => {\n event.stopPropagation()\n setAnchorEl(event.currentTarget)\n }, [])\n\n const handleClose = useCallback(() => {\n setAnchorEl(null)\n }, [])\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n if (!over || active.id === over.id || !columns) return\n const oldIndex = columns.findIndex((col) => col.id === active.id)\n const newIndex = columns.findIndex((col) => col.id === over.id)\n if (oldIndex !== -1 && newIndex !== -1) {\n const newColumns = arrayMove(columns, oldIndex, newIndex)\n widgetStoreActions.setWidget(id, { columns: newColumns })\n }\n }\n\n // Return null if there are fewer than 2 columns\n if (!columns || columns.length < 2) {\n return null\n }\n\n const tooltipLabel = labels?.tooltip ?? 'Change column'\n const isOpen = Boolean(anchorEl)\n\n return (\n <>\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={labels?.ariaLabel ?? tooltipLabel}\n aria-controls={isOpen ? 'change-column-menu' : undefined}\n aria-haspopup='true'\n aria-expanded={isOpen ? 'true' : undefined}\n onClick={handleToggle}\n data-active={isOpen}\n sx={actionButtonStyles.trigger}\n {...IconButtonProps}\n >\n {Icon ?? (\n <SvgIcon>\n <ChangeColumnIcon />\n </SvgIcon>\n )}\n </IconButton>\n </Tooltip>\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={handleDragEnd}\n >\n <Menu\n id='change-column-menu'\n anchorEl={anchorEl}\n open={isOpen}\n onClose={handleClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n slotProps={{\n paper: {\n sx: { overflow: 'hidden' },\n },\n }}\n {...MenuProps}\n >\n <SortableContext\n items={columnIds}\n strategy={verticalListSortingStrategy}\n >\n {columns.map((column) => (\n <SortableColumnItem key={column.id} column={column} />\n ))}\n </SortableContext>\n </Menu>\n </DndContext>\n </>\n )\n}\n","import type { SxProps, Theme } from '@mui/material'\nimport type { CSSProperties } from 'react'\n\nexport const styles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(0.25),\n },\n trigger: {\n '&[data-active=\"true\"]': {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n },\n} satisfies Record<string, SxProps<Theme>>\n\n/**\n * Plain CSS objects for the brush overlay — we're outside MUI's sx pipeline\n * here because the rectangles are rendered via a React portal into the chart\n * div (not part of the MUI tree). Colors borrow from the base palette; if\n * theme-aware styling is needed later, move to styled components.\n */\nexport const overlayStyles: Record<string, CSSProperties> = {\n // `top` and `height` are filled in at render time from the chart's plot\n // rect so rectangles don't bleed over the legend / axis labels.\n //\n // Colors track ECharts 6's `backgroundTint` token (used by the default\n // brush) — a barely-visible pale blue-gray translucent fill that washes\n // bars underneath rather than masking them. Border is a hairline dark\n // alpha so the selection edges are just findable, not prominent.\n rect: {\n position: 'absolute',\n background: 'rgba(234, 237, 245, 0.2)',\n border: '1px dashed rgba(0, 0, 0, 0.15)',\n pointerEvents: 'none',\n },\n // Live drag preview — identical to committed rect (no \"in-progress\" vs\n // \"committed\" visual distinction; the preview just disappears on\n // `pointerup` as the rect takes its place).\n rectPreview: {\n position: 'absolute',\n background: 'rgba(234, 237, 245, 0.6)',\n border: '1px dashed rgba(0, 0, 0, 0.15)',\n pointerEvents: 'none',\n },\n}\n","import type { BrushRect } from './types'\n\n/**\n * Returns integer dataIndices covered by a brush rectangle on a category axis.\n *\n * `xStart` / `xEnd` come from `instance.convertFromPixel({ xAxisIndex: 0 }, …)`\n * which, for a category axis, returns fractional positions around integer\n * category indices (e.g. `1.3` lands between categories 1 and 2). We snap the\n * range outward (`floor` / `ceil`) so a drag that visually covers any part of\n * a category's bar includes that index.\n *\n * Results are clamped to `[0, dataLength - 1]` and returned in ascending order.\n */\nexport function hitTestCategoryRange(\n xStart: number,\n xEnd: number,\n dataLength: number,\n): number[] {\n if (dataLength <= 0) return []\n const [lo, hi] = xStart <= xEnd ? [xStart, xEnd] : [xEnd, xStart]\n\n const start = Math.max(0, Math.floor(lo))\n const end = Math.min(dataLength - 1, Math.ceil(hi))\n if (start > end) return []\n\n const indices: number[] = []\n for (let i = start; i <= end; i += 1) indices.push(i)\n return indices\n}\n\n/**\n * Union of `hitTestCategoryRange` across multiple rectangles. Used for\n * multi-brush selections where each drawn rectangle contributes to the\n * combined selection.\n */\nexport function hitTestRects(rects: BrushRect[], dataLength: number): number[] {\n if (rects.length === 0) return []\n const seen = new Set<number>()\n for (const rect of rects) {\n for (const i of hitTestCategoryRange(rect.xStart, rect.xEnd, dataLength)) {\n seen.add(i)\n }\n }\n return Array.from(seen).sort((a, b) => a - b)\n}\n","import {\n useCallback,\n useEffect,\n useRef,\n useState,\n useSyncExternalStore,\n} from 'react'\nimport type { CSSProperties, PointerEvent as ReactPointerEvent } from 'react'\nimport { createPortal } from 'react-dom'\nimport type { ECharts } from 'echarts'\nimport { useWidgetStore, widgetStoreActions } from '../../stores/widget-store'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\nimport type { EchartWidgetState } from '../../echart/types'\nimport { observeResize } from '../../echart/shared-resize-observer'\nimport { hitTestRects } from './hit-test'\nimport type { BrushRect, BrushState } from './types'\nimport { overlayStyles } from './style'\n\ninterface BrushOverlayProps {\n id: string\n multiBrush?: boolean\n}\n\ninterface PixelRect {\n left: number\n right: number\n}\n\ninterface PlotRect {\n x: number\n y: number\n width: number\n height: number\n}\n\n// Shape of the internal ECharts API we reach into to get the grid rectangle.\n// It's undocumented but stable across v5/v6; falling back gracefully if\n// ECharts ever changes the shape is handled by a try/catch at the call site.\ninterface EChartsGridInternals {\n getModel: () => {\n getComponent: (\n type: string,\n index?: number,\n ) => { coordinateSystem?: { getRect: () => PlotRect } } | null\n }\n}\n\n// Clicks (tiny drags) are ignored — distinguishes intent to select vs. misclick.\nconst MIN_DRAG_PX = 2\n\n// Stable empty-array references. Returning `[]` from the Zustand selector\n// on every call breaks shallow-equality memoization (each `[]` is a new\n// reference) — which ripples into `rects` being a fresh reference on every\n// render, which re-runs the re-projection effect, which `setProjectedRects`,\n// which re-renders, producing an infinite loop.\nconst EMPTY_RECTS: readonly BrushRect[] = Object.freeze([])\nconst EMPTY_PIXEL_RECTS: readonly PixelRect[] = Object.freeze([])\n\n/**\n * Reads the plot-area (grid) rectangle from an ECharts instance. Uses the\n * internal model API because ECharts doesn't expose this publicly; returns\n * `null` if the grid is missing or the API shape has drifted.\n */\nfunction readPlotRect(instance: ECharts): PlotRect | null {\n try {\n const model = (instance as unknown as EChartsGridInternals).getModel()\n const grid = model.getComponent('grid', 0)\n const rect = grid?.coordinateSystem?.getRect()\n if (!rect) return null\n if (\n !Number.isFinite(rect.x) ||\n !Number.isFinite(rect.y) ||\n !Number.isFinite(rect.width) ||\n !Number.isFinite(rect.height)\n ) {\n return null\n }\n return { x: rect.x, y: rect.y, width: rect.width, height: rect.height }\n } catch {\n return null\n }\n}\n\nfunction plotRectEquals(a: PlotRect | null, b: PlotRect | null): boolean {\n if (a === b) return true\n if (!a || !b) return false\n return (\n a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height\n )\n}\n\n/**\n * Portaled overlay rendered inside the ECharts chart `<div>`. Handles brush\n * drawing entirely in DOM, independent of ECharts' built-in brush.\n *\n * Rectangles are stored in x-axis data coords (category indices) in the\n * widget store. The overlay re-projects them to pixel coords on every chart\n * `finished` event and container resize, so `setOption({ notMerge: true })`\n * by the config pipeline is a non-event.\n *\n * Pointer capture and rectangle rendering are both clamped to the ECharts\n * grid (plot area), so the legend, axis labels, and other chart chrome\n * receive their usual events and aren't visually covered.\n *\n * Hit-testing happens on `pointerup` using `hitTestRects` against the widget's\n * data length (derived from `widget.data`). The result is written to\n * `brushSelection` in the store; `BrushToggle` subscribes to that and invokes\n * the consumer's `onBrushSelected` callback.\n */\nexport function BrushOverlay({ id, multiBrush }: BrushOverlayProps) {\n const { enabled, rects, dataLength } = useWidgetSelector(id, (w) => {\n const brushState = w as BrushState | undefined\n // Bar and histogram both expose data as a nested array of series;\n // all series share the same category count.\n const widgetData = w?.data as unknown[][] | undefined\n const firstSeries = widgetData?.[0]\n const length = Array.isArray(firstSeries) ? firstSeries.length : 0\n return {\n enabled: brushState?.brush ?? false,\n rects: brushState?.brushRects ?? (EMPTY_RECTS as BrushRect[]),\n dataLength: length,\n }\n })\n\n // Surface the chart DOM element and ECharts instance via `useSyncExternalStore`.\n // Reading `ref.current` inside a `getSnapshot` callback is idiomatic and\n // satisfies React Compiler's \"don't read refs during render\" guardrail.\n // The store notifies us when EchartUI registers the refs via `setWidget`;\n // `getSnapshot` then resolves the current values.\n const subscribe = useCallback(\n (notify: () => void) => useWidgetStore.subscribe(notify),\n [],\n )\n const chartEl = useSyncExternalStore(\n subscribe,\n useCallback((): HTMLElement | null => {\n return (\n widgetStoreActions.getWidget<EchartWidgetState>(id)?.refUI?.current ??\n null\n )\n }, [id]),\n () => null,\n )\n const instance = useSyncExternalStore(\n subscribe,\n useCallback((): ECharts | null => {\n return (\n widgetStoreActions.getWidget<EchartWidgetState>(id)?.instance\n ?.current ?? null\n )\n }, [id]),\n () => null,\n )\n\n const plotCaptureRef = useRef<HTMLDivElement | null>(null)\n const dragStartRef = useRef<number | null>(null)\n const pointerIdRef = useRef<number | null>(null)\n const [projectedRects, setProjectedRects] = useState<PixelRect[]>(\n EMPTY_PIXEL_RECTS as PixelRect[],\n )\n const [drawing, setDrawing] = useState<PixelRect | null>(null)\n const [plotRect, setPlotRect] = useState<PlotRect | null>(null)\n\n // Anchor the absolute-positioned overlay to the chart div. Look the element\n // up by id so React Compiler doesn't flag the style mutation; `chartEl` is\n // a normal state value here so using it as a trigger is safe.\n useEffect(() => {\n if (!chartEl) return\n const el = document.getElementById(id)\n if (!el) return\n const previous = el.style.position\n if (!previous) el.style.position = 'relative'\n return () => {\n if (!previous) el.style.position = ''\n }\n }, [id, chartEl])\n\n // Re-project stored rects to pixel coords and refresh the plot-area bounds\n // on every chart render (ECharts `finished` event) and on container\n // resize. This is what makes `setOption({ notMerge: true })` a non-event —\n // the store is untouched and the overlay just re-paints.\n useEffect(() => {\n if (!instance || !chartEl) return\n\n const project = () => {\n // Plot area bounds — if the grid isn't laid out yet we can't project\n // anything meaningfully, so skip this pass and wait for the next\n // `finished` event.\n const nextPlot = readPlotRect(instance)\n setPlotRect((prev) => (plotRectEquals(prev, nextPlot) ? prev : nextPlot))\n if (!nextPlot) return\n\n const next: PixelRect[] = []\n for (const r of rects) {\n const leftPx = instance.convertToPixel({ xAxisIndex: 0 }, r.xStart)\n const rightPx = instance.convertToPixel({ xAxisIndex: 0 }, r.xEnd)\n if (\n typeof leftPx !== 'number' ||\n typeof rightPx !== 'number' ||\n !Number.isFinite(leftPx) ||\n !Number.isFinite(rightPx)\n ) {\n continue\n }\n // Clamp to plot area horizontally so rectangles never bleed onto\n // adjacent padding/legend.\n const lo = Math.max(nextPlot.x, Math.min(leftPx, rightPx))\n const hi = Math.min(\n nextPlot.x + nextPlot.width,\n Math.max(leftPx, rightPx),\n )\n if (hi <= lo) continue\n next.push({ left: lo, right: hi })\n }\n // Reuse the frozen empty reference so successive \"no rectangles\"\n // updates hit React's `Object.is` bail-out instead of re-rendering.\n setProjectedRects(\n next.length === 0 ? (EMPTY_PIXEL_RECTS as PixelRect[]) : next,\n )\n }\n\n project()\n instance.on('finished', project)\n const unobserve = observeResize(chartEl, project)\n return () => {\n instance.off('finished', project)\n unobserve()\n }\n }, [instance, chartEl, rects])\n\n const handlePointerDown = useCallback(\n (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!enabled || !chartEl || !plotRect) return\n const capture = plotCaptureRef.current\n if (!capture) return\n e.preventDefault()\n capture.setPointerCapture(e.pointerId)\n pointerIdRef.current = e.pointerId\n // Hide the tooltip so it doesn't overlap the brush selection.\n instance?.dispatchAction({ type: 'hideTip' })\n // Work in chart-container pixel space so conversions via\n // `convertFromPixel` (which expects container-relative coords) stay\n // consistent with the rectangle positions we store.\n const chartBBox = chartEl.getBoundingClientRect()\n const x = clampX(e.clientX - chartBBox.left, plotRect)\n dragStartRef.current = x\n setDrawing({ left: x, right: x })\n },\n [enabled, instance, chartEl, plotRect],\n )\n\n const handlePointerMove = useCallback(\n (e: ReactPointerEvent<HTMLDivElement>) => {\n // No active drag — forward the hover to ECharts so its tooltip works.\n if (pointerIdRef.current === null) {\n if (instance && chartEl) {\n const chartBBox = chartEl.getBoundingClientRect()\n instance.dispatchAction({\n type: 'showTip',\n x: e.clientX - chartBBox.left,\n y: e.clientY - chartBBox.top,\n })\n }\n return\n }\n if (pointerIdRef.current !== e.pointerId) return\n const start = dragStartRef.current\n if (start === null || !chartEl || !plotRect) return\n const chartBBox = chartEl.getBoundingClientRect()\n const x = clampX(e.clientX - chartBBox.left, plotRect)\n setDrawing({ left: Math.min(start, x), right: Math.max(start, x) })\n },\n [instance, chartEl, plotRect],\n )\n\n const handlePointerLeave = useCallback(() => {\n // Don't hide the tooltip during a drag — the pointer may leave the\n // element bounds while captured and we don't want flickering.\n if (pointerIdRef.current !== null) return\n instance?.dispatchAction({ type: 'hideTip' })\n }, [instance])\n\n const handlePointerUp = useCallback(\n (e: ReactPointerEvent<HTMLDivElement>) => {\n if (pointerIdRef.current !== e.pointerId) return\n const start = dragStartRef.current\n const capture = plotCaptureRef.current\n pointerIdRef.current = null\n dragStartRef.current = null\n setDrawing(null)\n\n if (start === null || !capture || !instance || !chartEl || !plotRect) {\n return\n }\n\n try {\n capture.releasePointerCapture(e.pointerId)\n } catch {\n // releasePointerCapture throws if the pointer is no longer captured;\n // ignore and continue.\n }\n\n const chartBBox = chartEl.getBoundingClientRect()\n const x = clampX(e.clientX - chartBBox.left, plotRect)\n const leftPx = Math.min(start, x)\n const rightPx = Math.max(start, x)\n if (rightPx - leftPx < MIN_DRAG_PX) return\n\n const xStart = instance.convertFromPixel({ xAxisIndex: 0 }, leftPx)\n const xEnd = instance.convertFromPixel({ xAxisIndex: 0 }, rightPx)\n if (\n typeof xStart !== 'number' ||\n typeof xEnd !== 'number' ||\n !Number.isFinite(xStart) ||\n !Number.isFinite(xEnd)\n ) {\n return\n }\n\n const newRect: BrushRect = { xStart, xEnd }\n const nextRects = multiBrush ? [...rects, newRect] : [newRect]\n const selection = {\n dataIndex: hitTestRects(nextRects, dataLength),\n seriesIndex: 0,\n }\n\n widgetStoreActions.setWidget(id, {\n brushRects: nextRects,\n brushSelection: selection,\n // Single-brush: auto-disable after selection (matches prior UX).\n ...(multiBrush ? {} : { brush: false }),\n })\n },\n [id, instance, multiBrush, rects, dataLength, chartEl, plotRect],\n )\n\n if (!chartEl) return null\n\n // Outer container spans the whole chart but never captures pointer events,\n // so the legend / axis labels / other chart chrome remain interactive.\n const containerStyle: CSSProperties = {\n position: 'absolute',\n inset: 0,\n pointerEvents: 'none',\n zIndex: 1,\n }\n\n // Inner capture layer sits over the plot area only. This is the element\n // that gets the pointer events when brush is active.\n const captureStyle: CSSProperties | undefined = plotRect\n ? {\n position: 'absolute',\n left: plotRect.x,\n top: plotRect.y,\n width: plotRect.width,\n height: plotRect.height,\n pointerEvents: enabled ? 'auto' : 'none',\n cursor: enabled ? 'crosshair' : 'default',\n userSelect: 'none',\n touchAction: 'none',\n }\n : undefined\n\n return createPortal(\n <div style={containerStyle}>\n {captureStyle && (\n <div\n ref={plotCaptureRef}\n style={captureStyle}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n onPointerLeave={handlePointerLeave}\n />\n )}\n {plotRect &&\n projectedRects.map((r, i) => (\n <div\n key={`${r.left}-${r.right}-${i}`}\n style={{\n ...overlayStyles.rect,\n left: r.left,\n width: Math.max(0, r.right - r.left),\n top: plotRect.y,\n height: plotRect.height,\n }}\n />\n ))}\n {plotRect && drawing && (\n <div\n style={{\n ...overlayStyles.rectPreview,\n left: drawing.left,\n width: Math.max(0, drawing.right - drawing.left),\n top: plotRect.y,\n height: plotRect.height,\n }}\n />\n )}\n </div>,\n chartEl,\n )\n}\n\nfunction clampX(x: number, plot: PlotRect): number {\n return Math.max(plot.x, Math.min(plot.x + plot.width, x))\n}\n","import { Box, IconButton } from '@mui/material'\nimport { HighlightAltOutlined } from '@mui/icons-material'\nimport { useCallback, useEffect, useRef } from 'react'\nimport { widgetStoreActions } from '../../stores/widget-store'\nimport type { BrushSelectedItems, BrushState, BrushToggleProps } from './types'\nimport { styles } from './style'\nimport { Tooltip } from '../../../components'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\nimport { BrushOverlay } from './brush-overlay'\n\n/**\n * Kept for backwards compatibility. The tool is no longer registered with the\n * widget store — brush state is now owned directly by this component and the\n * associated DOM overlay instead of being driven through the config pipeline.\n * Existing code that looks this constant up in `registeredTools` will simply\n * find no match.\n */\nexport const BRUSH_TOGGLE_TOOL_ID = 'brush-toggle'\n\n/**\n * Widget action to toggle brush-style selection on bar and histogram widgets.\n *\n * Renders a toggle button and a portaled overlay rendered inside the chart's\n * `<div>`. The overlay handles all pointer interactions, draws selection\n * rectangles in DOM, and hit-tests against the widget data. All state lives\n * in the widget store — rectangles survive config-pipeline re-renders\n * (`setOption({ notMerge: true })`) automatically.\n *\n * Only intended for bar and histogram widgets (both use `xAxis.type === 'category'`).\n *\n * @example\n * ```tsx\n * <BrushToggle\n * id=\"my-widget\"\n * onBrushSelected={(items) => console.log(items)}\n * />\n * ```\n */\nexport function BrushToggle({\n id,\n onBrushSelected,\n multiBrush,\n selections,\n defaultEnabled = false,\n labels,\n Icon,\n IconButtonProps,\n}: BrushToggleProps) {\n // Single subscription for everything this component cares about.\n const { brush, selection } = useWidgetSelector(id, (w) => {\n const s = w as BrushState | undefined\n return {\n brush: s?.brush ?? defaultEnabled,\n selection: s?.brushSelection,\n }\n })\n\n // Seed the widget store with `defaultEnabled` on first mount. Guarded so\n // remounts don't stomp whatever the user has toggled to.\n useEffect(() => {\n const current = widgetStoreActions.getWidget<BrushState>(id)?.brush\n if (current === undefined) {\n widgetStoreActions.setWidget(id, { brush: defaultEnabled })\n }\n }, [id, defaultEnabled])\n\n const handleToggle = useCallback(() => {\n if (brush) {\n // Disabling: keep rectangles visible so the consumer's selection stays\n // in sync. Re-enabling clears them below (fresh slate each activation).\n widgetStoreActions.setWidget(id, { brush: false })\n } else {\n widgetStoreActions.setWidget(id, {\n brush: true,\n brushRects: [],\n brushSelection: { dataIndex: [], seriesIndex: 0 },\n })\n // Mirror the clear to the consumer so its selection drops with the\n // visual rectangles.\n onBrushSelected?.({ dataIndex: [], seriesIndex: 0 })\n }\n }, [brush, id, onBrushSelected])\n\n // Invoke the consumer's callback whenever the overlay writes a new\n // selection to the store. `selection` is a new object reference on each\n // pointerup so a simple reference check is enough.\n const lastSelectionRef = useRef<BrushSelectedItems | undefined>(undefined)\n useEffect(() => {\n if (!selection) return\n if (lastSelectionRef.current === selection) return\n lastSelectionRef.current = selection\n onBrushSelected?.(selection)\n }, [selection, onBrushSelected])\n\n // Consumer-driven clear: when `selections` transitions to 0 (e.g. the user\n // presses the clear button in `WidgetSelectionSummary`), drop all drawn\n // rectangles and any stored selection.\n useEffect(() => {\n if (selections !== 0) return\n const state = widgetStoreActions.getWidget<BrushState>(id)\n const hasRects = (state?.brushRects?.length ?? 0) > 0\n const hasSelection = (state?.brushSelection?.dataIndex?.length ?? 0) > 0\n if (!hasRects && !hasSelection) return\n widgetStoreActions.setWidget(id, {\n brushRects: [],\n brushSelection: { dataIndex: [], seriesIndex: 0 },\n })\n }, [selections, id])\n\n const enableLabel = labels?.enable ?? 'Enable brush selection'\n const disableLabel = labels?.disable ?? 'Disable brush selection'\n const tooltipLabel = brush ? disableLabel : enableLabel\n\n return (\n <>\n <Box sx={styles.container}>\n <Tooltip title={tooltipLabel}>\n <IconButton\n size='small'\n aria-label={labels?.ariaLabel ?? tooltipLabel}\n onClick={handleToggle}\n sx={styles.trigger}\n data-active={brush}\n {...IconButtonProps}\n >\n {Icon ?? <HighlightAltOutlined />}\n </IconButton>\n </Tooltip>\n </Box>\n <BrushOverlay id={id} multiBrush={multiBrush} />\n </>\n )\n}\n"],"names":["styles","title","container","display","alignItems","justifyContent","gap","content","flexDirection","spacing","EMPTY_DIALOG_CONTENT_PROPS","FullScreen","t0","$","_c","id","labels","children","Icon","IconButtonProps","DialogContentProps","t1","DialogProps","t2","undefined","sx","isFullScreen","useWidgetSelector","_temp","t3","updates","widgetStoreActions","setWidget","updateFullScreenConfig","t4","t5","FullscreenOutlined","t6","IconButton","t7","t8","ariaLabel","t9","t10","t11","Typography","t12","t13","Symbol","for","Close","t14","jsx","t15","DialogTitle","t16","t17","DialogContent","t18","Dialog","t19","w","EMPTY_LABELS","Download","items","data","isDownloading","setIsDownloading","useState","anchorEl","setAnchorEl","event","stopPropagation","currentTarget","handleToggle","data_0","option","link","document","createElement","href","download","filename","style","body","appendChild","click","removeChild","callback","handleDownload","event_0","option_0","result","modifier","handleClick","length","CircularProgress","FileDownloadOutlined","vertical","horizontal","Boolean","paddingBottom","option_1","jsxs","MenuItem","disabled","e","icon","ListItemIcon","color","ListItemText","label","map","Menu","actionButtonStyles","trigger","background","theme","palette","primary","relatedLight","calculateTotal","reduce","total","series","seriesTotal","item","Array","isArray","value","at","Object","entries","itemTotal","key","toRelativeData","index","transformed","RELATIVE_DATA_TOOL_ID","RELATIVE_DATA_CONFIG_TOOL_ID","RelativeData","order","defaultIsRelative","percentFormatterRef","useRef","isRelative","current","getWidget","originalFormatter","formatter","originalMax","max","useEffect","registerTool","enabled","fn","unregisterTool","setToolEnabled","type","currentConfig","config","widget","hasSourceData","sourceData","locale","Intl","NumberFormat","minimumFractionDigits","maximumFractionDigits","format","widget_0","newIsRelative","widget_1","tooltipLabel","absolute","relative","PercentOutlined","Tooltip","echartData","ZOOM_TOGGLE_TOOL_ID","ZoomToggle","defaultZoom","defaultZoomStart","defaultZoomEnd","ResetIcon","useTheme","zoom","zoomStart","zoomEnd","zoomEvent","start","batch","end","handleDataZoom","currentOnEvents","onEvents","start_0","end_0","legend","hasLegend","show","sliderHeight","parseInt","zoomConfig","getEChartZoomConfig","inside","xSlider","ySlider","bottomOffset","legendBottomOffset","grid","gridBottom","bottom","dataZoom","triggerToolPipeline","newZoom","handleReset","enableLabel","enable","disableLabel","disable","resetLabel","reset","ZoomInOutlined","t20","SubdirectoryArrowLeftOutlined","t21","Box","GroupedBarChartIcon","STACK_TOGGLE_TOOL_ID","StackToggle","defaultIsStacked","storeIsStacked","bb0","hasMultiSeries","hasStackInSeries","some","_temp2","effectiveDefaultIsStacked","isStacked","_temp4","unstacked","stacked","updatedSeries","_temp3","s_0","existingStack","s","stack","getEChartStackConfig","DEFAULT_STACK_GROUP","LOCK_SELECTION_TOOL_ID","LockSelection","selectedItems","storeIsLocked","isLocked","lockedItems","filterDataByLockedItems","unlock","lock","CheckBoxOutlined","filter","name","includes","SEARCHER_TOOL_ID","DEBOUNCE_DELAY","Searcher","filterFn","TextFieldProps","ClearIcon","debounceDelay","inputRef","debounceTimeoutRef","searchText","prevEnabledRef","defaultFilterFn","text","setSearchText","currentSearchText","disables","clearTimeout","setTimeout","debouncedTriggerPipeline","focus","newValue","target","handleChange","handleClear","placeholder","clearAriaLabel","InputAdornment","SearchOutlined","ClearOutlined","startAdornment","endAdornment","TextField","isSearchEnabled","trim","Promise","resolve","lowerSearch","toLowerCase","values","String","SearcherToggle","defaultEnabled","storeIsEnabled","isEnabled","ChangeColumnIcon","SortableColumnItem","column","attributes","listeners","setNodeRef","transform","transition","isDragging","useSortable","CSS","Transform","toString","x","opacity","cursor","outline","outlineOffset","main","CHANGE_COLUMN_TOOL_ID","ChangeColumn","MenuProps","columns","currentColumns","configColumns","every","col","i","columnMap","Map","reordered","widgetCol","col_1","get","push","delete","col_2","matchesWidget","col_3","i_0","reorderFn","coordinateGetter","sortableKeyboardCoordinates","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","columnIds","handleClose","active","over","oldIndex","findIndex","col_5","newIndex","col_6","newColumns","arrayMove","handleDragEnd","tooltip","isOpen","SvgIcon","paper","overflow","SortableContext","verticalListSortingStrategy","DndContext","closestCenter","t22","col_4","col_0","overlayStyles","rect","position","border","pointerEvents","rectPreview","hitTestCategoryRange","xStart","xEnd","dataLength","lo","hi","Math","floor","min","ceil","indices","hitTestRects","rects","seen","Set","add","from","sort","a","b","MIN_DRAG_PX","EMPTY_RECTS","freeze","EMPTY_PIXEL_RECTS","readPlotRect","instance","getModel","getComponent","coordinateSystem","getRect","Number","isFinite","y","width","height","plotRectEquals","BrushOverlay","multiBrush","subscribe","refUI","chartEl","useSyncExternalStore","plotCaptureRef","dragStartRef","pointerIdRef","projectedRects","setProjectedRects","drawing","setDrawing","plotRect","setPlotRect","el","getElementById","previous","project","nextPlot","prev","next","r","leftPx","convertToPixel","xAxisIndex","rightPx","left","right","on","unobserve","observeResize","off","capture","preventDefault","setPointerCapture","pointerId","dispatchAction","chartBBox","getBoundingClientRect","clampX","clientX","handlePointerDown","e_0","chartBBox_0","clientY","top","chartBBox_1","x_0","handlePointerMove","handlePointerLeave","e_1","capture_0","releasePointerCapture","chartBBox_2","x_1","leftPx_0","rightPx_0","convertFromPixel","newRect","nextRects","selection","dataIndex","seriesIndex","brushRects","brushSelection","brush","handlePointerUp","inset","zIndex","containerStyle","userSelect","touchAction","captureStyle","r_0","createPortal","notify","useWidgetStore","brushState","firstSeries","plot","BRUSH_TOGGLE_TOOL_ID","BrushToggle","onBrushSelected","selections","lastSelectionRef","state","hasRects","hasSelection","HighlightAltOutlined"],"mappings":"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"}