@carto/ps-react-ui 4.11.2 → 4.12.0
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.
- package/dist/chat.js +962 -733
- package/dist/chat.js.map +1 -1
- package/dist/csv-item-hH_Gt7ur.js +32 -0
- package/dist/csv-item-hH_Gt7ur.js.map +1 -0
- package/dist/png-item-9dNbB37T.js +57 -0
- package/dist/png-item-9dNbB37T.js.map +1 -0
- package/dist/table-B3ZWWhJt.js +383 -0
- package/dist/table-B3ZWWhJt.js.map +1 -0
- package/dist/types/chat/containers/chat-footer.d.ts +1 -1
- package/dist/types/chat/containers/styles.d.ts +79 -12
- package/dist/types/chat/index.d.ts +1 -1
- package/dist/types/chat/types.d.ts +21 -0
- package/dist/types/chat/use-typewriter.d.ts +5 -3
- package/dist/types/widgets-v2/actions/download/constants.d.ts +12 -0
- package/dist/types/widgets-v2/actions/download/csv-item.d.ts +38 -0
- package/dist/types/widgets-v2/actions/download/icons.d.ts +6 -0
- package/dist/types/widgets-v2/actions/download/index.d.ts +3 -1
- package/dist/types/widgets-v2/actions/index.d.ts +1 -1
- package/dist/types/widgets-v2/wrapper/style.d.ts +5 -12
- package/dist/widgets-v2/actions.js +40 -36
- package/dist/widgets-v2/actions.js.map +1 -1
- package/dist/widgets-v2/bar.js +77 -84
- package/dist/widgets-v2/bar.js.map +1 -1
- package/dist/widgets-v2/category.js +50 -55
- package/dist/widgets-v2/category.js.map +1 -1
- package/dist/widgets-v2/formula.js +37 -43
- package/dist/widgets-v2/formula.js.map +1 -1
- package/dist/widgets-v2/histogram.js +138 -144
- package/dist/widgets-v2/histogram.js.map +1 -1
- package/dist/widgets-v2/markdown.js +18 -17
- package/dist/widgets-v2/markdown.js.map +1 -1
- package/dist/widgets-v2/pie.js +67 -73
- package/dist/widgets-v2/pie.js.map +1 -1
- package/dist/widgets-v2/scatterplot.js +75 -81
- package/dist/widgets-v2/scatterplot.js.map +1 -1
- package/dist/widgets-v2/spread.js +36 -41
- package/dist/widgets-v2/spread.js.map +1 -1
- package/dist/widgets-v2/table.js +46 -55
- package/dist/widgets-v2/table.js.map +1 -1
- package/dist/widgets-v2/timeseries.js +81 -87
- package/dist/widgets-v2/timeseries.js.map +1 -1
- package/dist/widgets-v2.js +247 -243
- package/dist/widgets-v2.js.map +1 -1
- package/package.json +3 -3
- package/src/chat/bubbles/styles.ts +5 -1
- package/src/chat/containers/chat-content.tsx +4 -1
- package/src/chat/containers/chat-footer.test.tsx +59 -0
- package/src/chat/containers/chat-footer.tsx +124 -36
- package/src/chat/containers/styles.ts +107 -16
- package/src/chat/feedback/styles.ts +11 -4
- package/src/chat/index.ts +1 -0
- package/src/chat/types.ts +22 -0
- package/src/chat/use-typewriter.ts +32 -24
- package/src/widgets-v2/actions/download/constants.ts +14 -0
- package/src/widgets-v2/actions/download/csv-item.test.tsx +77 -0
- package/src/widgets-v2/actions/download/csv-item.tsx +71 -0
- package/src/widgets-v2/actions/download/icons.tsx +10 -1
- package/src/widgets-v2/actions/download/index.ts +3 -1
- package/src/widgets-v2/actions/download/png-item.tsx +2 -1
- package/src/widgets-v2/actions/index.ts +5 -0
- package/src/widgets-v2/bar/download.tsx +16 -22
- package/src/widgets-v2/category/download.test.ts +9 -0
- package/src/widgets-v2/category/download.ts +16 -20
- package/src/widgets-v2/formula/download.tsx +23 -29
- package/src/widgets-v2/histogram/download.ts +22 -26
- package/src/widgets-v2/markdown/{download.ts → download.tsx} +5 -2
- package/src/widgets-v2/pie/download.ts +16 -20
- package/src/widgets-v2/scatterplot/download.ts +16 -20
- package/src/widgets-v2/spread/download.ts +23 -27
- package/src/widgets-v2/table/download.test.ts +10 -0
- package/src/widgets-v2/table/download.ts +11 -15
- package/src/widgets-v2/table/helpers.test.ts +19 -0
- package/src/widgets-v2/table/helpers.ts +7 -12
- package/src/widgets-v2/timeseries/download.ts +36 -40
- package/src/widgets-v2/wrapper/style.ts +13 -18
- package/src/widgets-v2/wrapper/widget-wrapper.test.tsx +66 -0
- package/src/widgets-v2/wrapper/widget-wrapper.tsx +7 -4
- package/dist/png-item-BE9uEqlD.js +0 -45
- package/dist/png-item-BE9uEqlD.js.map +0 -1
- package/dist/table-C9IMbTr0.js +0 -385
- package/dist/table-C9IMbTr0.js.map +0 -1
- package/dist/types/chat/feedback/styles.d.ts +0 -211
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pie.js","sources":["../../src/widgets-v2/pie/options.ts","../../src/widgets-v2/pie/skeleton.tsx","../../src/widgets-v2/pie/download.ts"],"sourcesContent":["import type { Theme } from '@mui/material'\nimport type { EChartsOption } from 'echarts'\nimport * as echarts from 'echarts'\nimport type { CallbackDataParams } from 'echarts/types/dist/shared'\nimport {\n buildGridConfig,\n buildLegendConfig,\n buildSeriesLabelConfig,\n createTooltipFormatter,\n createTooltipPositioner,\n niceNum,\n} from '../../widgets/utils/chart-config'\nimport type { OptionFactory, OptionFactoryContext } from '../echart'\nimport { mergeOptions, resolveThemeColor } from '../utils'\nimport type { WidgetSeries } from '../types'\nimport type {\n PieEChartsOption,\n PieOptionFactoryInput,\n PieOptionsInput,\n PieWidgetData,\n} from './types'\n\nconst DEFAULT_RADIUS: readonly [string, string] = ['58%', '74%']\n\n/**\n * Builds the **structural** ECharts option for a pie / donut widget.\n * Mirrors v1's pie look-and-feel: themed legend (`buildLegendConfig`),\n * themed tooltip via `createTooltipPositioner` / `createTooltipFormatter`,\n * `qualitative.bold` color palette, slice borders against the paper\n * background, hover-emphasis disabled, and a centered rich-text label.\n *\n * Layered like Bar / Histogram:\n * - **Theme-aware bits** live here on a series template (slice border,\n * center-label rich style sizes, emphasis-disabled).\n * - **Reactive bits** (tooltip value formatter, center-label text,\n * selection-driven dim) are re-emitted by\n * {@link createPieOptionFactory} at fusion time so RelativeData's\n * percent override flows through.\n */\nexport function pieOptions({\n theme,\n formatter,\n labelFormatter,\n}: PieOptionsInput): PieEChartsOption {\n return {\n legend: {\n ...buildLegendConfig({ hasLegend: true, labelFormatter }),\n // Pie reads better with a centered legend (the donut is radially\n // symmetric — left-aligning the legend below it visually unbalances\n // the chart). Override `buildLegendConfig`'s `type: 'scroll'` with\n // `'plain'` so long category lists wrap to multiple rows instead\n // of clipping the last visible item against the chart container.\n // The wider `itemGap` gives chips breathing room in the typical\n // 3–6 category case.\n left: 'center',\n type: 'scroll',\n itemGap: 16,\n },\n tooltip: {\n // Pie uses item-trigger (no axis); the rest of the styling mirrors\n // bar/histogram so the dashboard reads consistently — dark\n // grey[900] bg, white caption-font text, padded, with the shared\n // overflow-aware positioner.\n trigger: 'item',\n backgroundColor: theme.palette.grey[900],\n borderWidth: 0,\n padding: [parseInt(theme.spacing(1)), parseInt(theme.spacing(1))],\n textStyle: {\n color: theme.palette.common.white,\n fontSize: 11,\n fontFamily: theme.typography.caption.fontFamily,\n },\n position: createTooltipPositioner(theme),\n formatter: buildPieTooltipFormatter(formatter, labelFormatter),\n },\n // V1 used `qualitative.bold` only (no `secondary.main` prefix) because\n // pie slices are categorical — each slice deserves a distinct palette\n // entry from the start, not a primary highlight.\n color: Object.values(\n (theme.palette as { qualitative?: { bold?: Record<string, string> } })\n .qualitative?.bold ?? {},\n ),\n // Pie template. The merger spreads this into each per-data series it\n // emits — borderColor / borderWidth / emphasis-disabled / label rich\n // sizes all survive through.\n series: [\n {\n type: 'pie',\n colorBy: 'data',\n avoidLabelOverlap: true,\n selectedOffset: 0,\n emphasis: { disabled: true },\n itemStyle: {\n borderColor: theme.palette.background.paper,\n borderWidth: 1,\n },\n label: {\n show: true,\n position: 'center',\n rich: {\n b: { fontSize: 16, fontWeight: 'normal', lineHeight: 20 },\n c: { fontSize: 28, fontWeight: 'bold', lineHeight: 27 },\n },\n },\n },\n ],\n }\n}\n\n/**\n * Returns the pie widget's {@link OptionFactory} — one closure that owns\n * BOTH phases of option construction:\n *\n * - **Structural phase** (`option == null`) — builds the theme-aware\n * structural option via {@link pieOptions}, optionally merging the\n * consumer-supplied `optionsOverride` on top. Called once by Provider\n * to seed `rawOptions` in the store.\n * - **Merge phase** (`option != null`) — fuses post-pipeline `state.data`\n * (`PieWidgetData`) into the option via the dataset API. Single-series\n * → donut (one dataset, `series[i].encode = { itemName: 'name', value: 'value' }`).\n * Multi-series → horizontal-bar fallback (mirrors v1 pie). Reactive\n * formatters from `ctx` drive the tooltip + center label at fusion\n * time so RelativeData's percent formatter flows through without a\n * structural rebuild.\n */\nexport function createPieOptionFactory(\n options: PieOptionFactoryInput,\n): OptionFactory {\n const { theme, formatter, labelFormatter, optionsOverride, series } = options\n const radius = options.radius ?? DEFAULT_RADIUS\n const selection = options.selection\n const selectionSet =\n selection && selection.length > 0\n ? new Set<string | number>(selection)\n : null\n return (option, data, ctx) => {\n if (option == null) {\n const structural = pieOptions({ theme, formatter, labelFormatter })\n return optionsOverride\n ? (mergeOptions(\n structural as unknown as Record<string, unknown>,\n optionsOverride as Partial<Record<string, unknown>>,\n ) as EChartsOption)\n : structural\n }\n\n const seriesArr = Array.isArray(data) ? (data as PieWidgetData) : []\n if (seriesArr.length === 0) {\n return { ...option, dataset: [], series: [] }\n }\n if (seriesArr.length > 1) {\n return buildMultiSeriesBarFusion(\n option,\n seriesArr,\n theme,\n series,\n ctx,\n selectionSet,\n )\n }\n return buildSingleSeriesPieFusion(\n option,\n seriesArr,\n radius,\n series,\n ctx,\n selectionSet,\n )\n }\n}\n\n/**\n * Single-series donut fusion. Spreads the structural pie series template\n * into per-data series with center/radius/encoding, wires the reactive\n * center-label / tooltip formatters and the per-data palette-aware\n * selection-dim callback.\n */\nfunction buildSingleSeriesPieFusion(\n option: EChartsOption,\n seriesArr: PieWidgetData,\n radius: readonly [string, string],\n series: readonly WidgetSeries[] | undefined,\n ctx: OptionFactoryContext | undefined,\n selectionSet: Set<string | number> | null,\n): EChartsOption {\n const seriesTemplates = Array.isArray(option.series) ? option.series : []\n const broadcastTemplate = seriesTemplates[0] ?? {}\n const baseTooltip =\n typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)\n ? option.tooltip\n : {}\n const baseLegend =\n typeof option.legend === 'object' && !Array.isArray(option.legend)\n ? option.legend\n : {}\n const formatter = ctx?.formatter\n const labelFormatter = ctx?.labelFormatter\n\n // Pie wants `colorBy: 'data'` — each slice draws from the option's\n // `color` palette by data index. But installing an `itemStyle.color`\n // callback disables ECharts' automatic per-data cycling, and\n // `params.color` collapses to the series color (so every slice goes\n // the same color). We re-implement the per-data palette resolution\n // here so the multicolor look survives selection-driven dimming.\n const palette = Array.isArray(option.color)\n ? (option.color as readonly (string | undefined)[])\n : []\n const resolvePaletteColor = (params: CallbackDataParams): string => {\n const swatch =\n palette.length > 0\n ? palette[params.dataIndex % palette.length]\n : undefined\n return swatch ?? (params.color as string)\n }\n\n // Always emit `itemStyle.color` (passthrough when nothing is selected),\n // not conditionally — same anti-stale-callback rationale as bar /\n // histogram. The slice border + width come from the structural\n // template's `itemStyle` and survive via the spread below.\n const colorFn = (params: CallbackDataParams): string => {\n const base = resolvePaletteColor(params)\n if (!selectionSet) return base\n const datum = params.value as { name?: string | number } | undefined\n const name = datum?.name ?? params.name\n return name != null && selectionSet.has(name)\n ? base\n : echarts.color.modifyAlpha(base, 0.15)\n }\n\n // Center label formatter — lives in the merger because it reads\n // reactive `formatter` / `labelFormatter` from ctx. The rich tags\n // `{c|…}` and `{b|…}` reference the rich styles baked into the\n // structural label template.\n const labelTextFormatter = (params: CallbackDataParams): string => {\n const { name } = params\n const encodeIndex = params.encode?.value?.[0]\n if (encodeIndex === undefined) return ''\n const value = (Object.values(params.data ?? {}) as unknown[]).at(\n encodeIndex,\n )\n // `value` here is the resolved dataset cell — for pie data it's a\n // `string | number` primitive. Anything else is a misuse we won't\n // dress up with `String(...)` (would render \"[object Object]\").\n const formattedValue =\n typeof value === 'number'\n ? formatter\n ? formatter(value)\n : String(value)\n : typeof value === 'string'\n ? value\n : ''\n const formattedName = labelFormatter\n ? String(labelFormatter(name ?? ''))\n : String(name ?? '')\n return `{c|${formattedValue}}\\n\\n{b|${formattedName}}`\n }\n\n return {\n ...option,\n dataset: seriesArr.map((s) => ({ source: s as readonly object[] })),\n series: seriesArr.map((_, i) => {\n const template =\n (seriesTemplates[i] as object | undefined) ??\n (broadcastTemplate as object)\n const templateObj = typeof template === 'object' ? template : {}\n const templateLabel = (templateObj as { label?: object }).label ?? {}\n const templateItemStyle =\n (templateObj as { itemStyle?: object }).itemStyle ?? {}\n return {\n ...templateObj,\n type: 'pie' as const,\n datasetIndex: i,\n name: series?.[i]?.name ?? `Series ${i + 1}`,\n radius: [...radius],\n // Lift the donut up so the bottom-anchored legend has the\n // vertical real estate to wrap to multiple rows for long\n // category lists — at exactly `50%` the bottom slices crowd\n // the chips and `type: 'plain'` legends can't expand upward\n // without overlapping the donut.\n center: ['50%', '38%'] as [string, string],\n encode: { itemName: 'name', value: 'value' },\n label: {\n ...templateLabel,\n formatter: labelTextFormatter,\n },\n itemStyle: {\n ...templateItemStyle,\n color: colorFn,\n },\n }\n }),\n // Legend always shows for pie (mirrors v1) — slice names drive the\n // entries, so even a single donut benefits from a category list.\n legend: { ...baseLegend, show: true },\n tooltip: {\n ...baseTooltip,\n formatter: buildPieTooltipFormatter(formatter, labelFormatter),\n },\n }\n}\n\n/**\n * Multi-series horizontal-bar fusion. Mirrors v1 pie's \"pie data with\n * >1 series collapses into a horizontal bar chart\" behavior — side-by-\n * side donuts don't read well when you're comparing the same categories\n * across cohorts, so swap to a value-on-x / category-on-y bar layout.\n *\n * Pie data shape is identical to bar's (`{ name, value }[][]`), so the\n * same dataset feeds either layout without transformation.\n */\nfunction buildMultiSeriesBarFusion(\n option: EChartsOption,\n seriesArr: PieWidgetData,\n theme: Theme,\n series: readonly WidgetSeries[] | undefined,\n ctx: OptionFactoryContext | undefined,\n selectionSet: Set<string | number> | null,\n): EChartsOption {\n const baseTooltip =\n typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)\n ? option.tooltip\n : {}\n const baseLegend =\n typeof option.legend === 'object' && !Array.isArray(option.legend)\n ? option.legend\n : {}\n const baseGrid =\n typeof option.grid === 'object' && !Array.isArray(option.grid)\n ? option.grid\n : {}\n const formatter = ctx?.formatter\n const labelFormatter = ctx?.labelFormatter\n\n const { niceMinVal, niceMaxVal } = computeNiceBounds(seriesArr)\n\n // Per-series palette — multi-series bars take one color per series\n // (not per-data, unlike donut slices). Same anti-stale-callback rule:\n // always emit the callback so a transition to/from a selection\n // replaces the previous closure cleanly.\n const palette = Array.isArray(option.color)\n ? (option.color as readonly (string | undefined)[])\n : []\n const barColorFn = (params: CallbackDataParams): string => {\n const seriesIdx = params.seriesIndex ?? 0\n const seriesSwatch =\n palette.length > 0 ? palette[seriesIdx % palette.length] : undefined\n const base = (seriesSwatch ?? params.color) as string\n if (!selectionSet) return base\n const datum = params.value as { name?: string | number } | undefined\n const name = datum?.name ?? params.name\n return name != null && selectionSet.has(name)\n ? base\n : echarts.color.modifyAlpha(base, 0.15)\n }\n\n return {\n ...option,\n dataset: seriesArr.map((s) => ({ source: s as readonly object[] })),\n grid: {\n ...baseGrid,\n ...buildGridConfig(true, theme),\n right: parseInt(theme.spacing(4)),\n containLabel: true,\n },\n // Drop pie-specific structural keys that shouldn't render in the\n // bar fallback. ECharts ignores undefined keys, so this is a clean\n // override.\n series: seriesArr.map((_, i) => {\n const overrideColor = resolveThemeColor(theme, series?.[i]?.color)\n return {\n datasetIndex: i,\n type: 'bar' as const,\n name: series?.[i]?.name ?? `Series ${i + 1}`,\n barMaxWidth: 100,\n emphasis: { focus: 'series' },\n ...buildSeriesLabelConfig(formatter, 'x'),\n itemStyle: { color: barColorFn },\n ...(overrideColor ? { color: overrideColor } : {}),\n }\n }),\n xAxis: {\n type: 'value',\n // Closures over the pre-computed nice bounds — ECharts calls them\n // once per render to resolve the axis extents.\n min: () => niceMinVal,\n max: () => niceMaxVal,\n axisLine: { show: false },\n axisTick: { show: false },\n splitLine: {\n show: true,\n lineStyle: { color: theme.palette.black?.[4] ?? theme.palette.divider },\n },\n // Value labels render BELOW the axis line (default placement),\n // NOT inside the plot. Bar/histogram use `inside: true` +\n // `verticalAlign: 'bottom'` for their *vertical* y-axis where the\n // axis is the left wall — labels inside read like grid annotations.\n // A horizontal bar chart's value axis is the x-axis, and `inside`\n // there pushes the max label *behind* the bar (it visually\n // disappears once a bar reaches the right edge). Use the default\n // below-the-axis placement so the rounded extents stay readable.\n axisLabel: {\n fontSize: theme.typography.overlineDelicate?.fontSize,\n fontFamily: theme.typography.overlineDelicate?.fontFamily,\n margin: parseInt(theme.spacing(1)),\n showMaxLabel: true,\n showMinLabel: true,\n formatter: (value: number) => {\n if (value !== niceMaxVal && value !== niceMinVal) return ''\n if (value === 0) return ''\n return formatter ? formatter(value) : String(value)\n },\n },\n },\n yAxis: {\n type: 'category',\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: {\n padding: [parseInt(theme.spacing(0.5)), 0, 0, 0],\n ...(labelFormatter && {\n formatter: (value: string | number) => String(labelFormatter(value)),\n }),\n },\n },\n legend: { ...baseLegend, show: true },\n tooltip: {\n ...baseTooltip,\n trigger: 'axis',\n formatter: buildHorizontalBarTooltipFormatter(formatter, labelFormatter),\n },\n } as EChartsOption\n}\n\n/**\n * Tooltip formatter for the horizontal-bar fallback. Reads the value by\n * `encode.x` dimension index (v1 parity) so it stays robust to\n * downstream changes that rename dataset columns.\n */\nfunction buildHorizontalBarTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n labelFormatter: ((value: string | number) => string | number) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const encodeIndex = item.encode?.x?.at(0)\n const dimName =\n encodeIndex !== undefined ? item.dimensionNames?.[encodeIndex] : undefined\n const row =\n item.value && typeof item.value === 'object' && !Array.isArray(item.value)\n ? (item.value as Record<string, string | number>)\n : undefined\n const raw = dimName && row ? row[dimName] : undefined\n const formattedValue =\n typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')\n const marker = typeof item.marker === 'string' ? item.marker : ''\n const seriesName = item.seriesName ? `${item.seriesName}: ` : ''\n const name = labelFormatter\n ? String(labelFormatter(item.name ?? ''))\n : String(item.name ?? '')\n return { name, seriesName, marker, value: formattedValue }\n })\n}\n\n/**\n * Min/max bounds over every datum's `.value` across all series. Used by\n * the horizontal-bar fallback's x-axis label formatter so we only render\n * labels at the rounded extents (matches v1 + bar / histogram).\n */\nfunction computeNiceBounds(seriesArr: PieWidgetData): {\n niceMinVal: number\n niceMaxVal: number\n} {\n let min = 0\n let max = -Infinity\n for (const series of seriesArr) {\n for (const d of series) {\n if (typeof d?.value !== 'number' || !Number.isFinite(d.value)) continue\n if (d.value < min) min = d.value\n if (d.value > max) max = d.value\n }\n }\n return {\n niceMinVal: min < 0 ? niceNum(min) : 0,\n niceMaxVal: max <= 0 ? 1 : niceNum(max),\n }\n}\n\n/**\n * Tooltip formatter for pie slices. `item.value` is the dataset row\n * object (e.g. `{ name: 'A', value: 10 }`); we pull the value by\n * `encode.value`'s dimension index, formatted via the reactive `formatter`\n * if present. Slice name passes through `labelFormatter`.\n */\nfunction buildPieTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n labelFormatter: ((value: string | number) => string | number) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const encodeIndex = item.encode?.value?.at(0) ?? 1\n const values =\n item.value && typeof item.value === 'object' && !Array.isArray(item.value)\n ? (Object.values(item.value) as (string | number)[])\n : []\n const raw = values[encodeIndex]\n const formattedValue =\n typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')\n const marker = typeof item.marker === 'string' ? item.marker : ''\n const seriesName = item.seriesName ? `${item.seriesName}: ` : ''\n const name = labelFormatter\n ? String(labelFormatter(item.name ?? ''))\n : String(item.name ?? '')\n return { name, seriesName, marker, value: formattedValue }\n })\n}\n","import { Box, Skeleton } from '@mui/material'\nimport type { SxProps, Theme } from '@mui/material'\n\nconst styles = {\n root: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 200,\n py: 1,\n gap: 2,\n },\n donut: {\n width: 160,\n height: 160,\n borderRadius: '50%',\n },\n} satisfies Record<string, SxProps<Theme>>\n\nexport interface PieSkeletonProps {\n count?: number\n}\n\nexport function PieSkeleton({ count = 1 }: PieSkeletonProps) {\n return (\n <Box sx={styles.root}>\n {Array.from({ length: count }).map((_, i) => (\n <Skeleton key={`donut-${i}`} variant='circular' sx={styles.donut} />\n ))}\n </Box>\n )\n}\n","import {\n buildPngDownloadItem,\n downloadToCSV,\n type DownloadItem,\n} from '../actions/download'\nimport type { PieWidgetData } from './types'\n\n/**\n * Download menu items for the Pie widget. Always includes a CSV item with\n * `series, name, value` columns (one row per slice; series labels come from\n * `seriesNames` if provided, else `series_<n>`). When `getCaptureEl` is\n * supplied, prepends a PNG item that rasterises the captured element via\n * `html2canvas`.\n */\nexport function createPieDownloadConfig(args: {\n filename: string\n getData: () => PieWidgetData\n seriesNames?: readonly string[]\n getCaptureEl?: () => HTMLElement | null\n pngPixelRatio?: number\n pngBackgroundColor?: string | null\n}): DownloadItem[] {\n const items: DownloadItem[] = []\n if (args.getCaptureEl) {\n items.push(\n buildPngDownloadItem({\n filename: args.filename,\n getCaptureEl: args.getCaptureEl,\n pixelRatio: args.pngPixelRatio,\n backgroundColor: args.pngBackgroundColor,\n }),\n )\n }\n items.push({\n id: 'csv',\n label: 'Download as CSV',\n resolve: () => {\n const data = args.getData()\n const rows: unknown[][] = [['series', 'name', 'value']]\n for (const [i, series] of data.entries()) {\n const seriesName = args.seriesNames?.[i] ?? `series_${i + 1}`\n for (const slice of series) {\n rows.push([seriesName, slice.name, slice.value])\n }\n }\n const handle = downloadToCSV(rows)\n return Promise.resolve({\n url: handle.url,\n filename: `${args.filename}.csv`,\n revoke: handle.revoke,\n })\n },\n })\n return items\n}\n"],"names":["DEFAULT_RADIUS","pieOptions","theme","formatter","labelFormatter","legend","buildLegendConfig","hasLegend","left","type","itemGap","tooltip","trigger","backgroundColor","palette","grey","borderWidth","padding","parseInt","spacing","textStyle","color","common","white","fontSize","fontFamily","typography","caption","position","createTooltipPositioner","buildPieTooltipFormatter","Object","values","qualitative","bold","series","colorBy","avoidLabelOverlap","selectedOffset","emphasis","disabled","itemStyle","borderColor","background","paper","label","show","rich","b","fontWeight","lineHeight","c","createPieOptionFactory","options","optionsOverride","radius","selection","selectionSet","length","Set","option","data","ctx","structural","mergeOptions","seriesArr","Array","isArray","dataset","buildMultiSeriesBarFusion","buildSingleSeriesPieFusion","seriesTemplates","broadcastTemplate","baseTooltip","baseLegend","resolvePaletteColor","params","dataIndex","undefined","colorFn","base","name","value","has","echarts","modifyAlpha","labelTextFormatter","encodeIndex","encode","at","formattedValue","String","formattedName","map","s","source","_","i","template","templateObj","templateLabel","templateItemStyle","datasetIndex","center","itemName","baseGrid","grid","niceMinVal","niceMaxVal","computeNiceBounds","barColorFn","seriesIdx","seriesIndex","buildGridConfig","right","containLabel","overrideColor","resolveThemeColor","barMaxWidth","focus","buildSeriesLabelConfig","xAxis","min","max","axisLine","axisTick","splitLine","lineStyle","black","divider","axisLabel","overlineDelicate","margin","showMaxLabel","showMinLabel","yAxis","buildHorizontalBarTooltipFormatter","createTooltipFormatter","item","x","dimName","dimensionNames","row","raw","marker","seriesName","d","Number","isFinite","niceNum","styles","root","display","alignItems","justifyContent","minHeight","py","gap","donut","width","height","borderRadius","PieSkeleton","t0","$","_c","count","t1","t2","Box","from","_temp","jsx","Skeleton","createPieDownloadConfig","args","items","getCaptureEl","push","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","pngBackgroundColor","id","resolve","getData","rows","entries","seriesNames","slice","handle","downloadToCSV","Promise","url","revoke"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pie.js","sources":["../../src/widgets-v2/pie/options.ts","../../src/widgets-v2/pie/skeleton.tsx","../../src/widgets-v2/pie/download.ts"],"sourcesContent":["import type { Theme } from '@mui/material'\nimport type { EChartsOption } from 'echarts'\nimport * as echarts from 'echarts'\nimport type { CallbackDataParams } from 'echarts/types/dist/shared'\nimport {\n buildGridConfig,\n buildLegendConfig,\n buildSeriesLabelConfig,\n createTooltipFormatter,\n createTooltipPositioner,\n niceNum,\n} from '../../widgets/utils/chart-config'\nimport type { OptionFactory, OptionFactoryContext } from '../echart'\nimport { mergeOptions, resolveThemeColor } from '../utils'\nimport type { WidgetSeries } from '../types'\nimport type {\n PieEChartsOption,\n PieOptionFactoryInput,\n PieOptionsInput,\n PieWidgetData,\n} from './types'\n\nconst DEFAULT_RADIUS: readonly [string, string] = ['58%', '74%']\n\n/**\n * Builds the **structural** ECharts option for a pie / donut widget.\n * Mirrors v1's pie look-and-feel: themed legend (`buildLegendConfig`),\n * themed tooltip via `createTooltipPositioner` / `createTooltipFormatter`,\n * `qualitative.bold` color palette, slice borders against the paper\n * background, hover-emphasis disabled, and a centered rich-text label.\n *\n * Layered like Bar / Histogram:\n * - **Theme-aware bits** live here on a series template (slice border,\n * center-label rich style sizes, emphasis-disabled).\n * - **Reactive bits** (tooltip value formatter, center-label text,\n * selection-driven dim) are re-emitted by\n * {@link createPieOptionFactory} at fusion time so RelativeData's\n * percent override flows through.\n */\nexport function pieOptions({\n theme,\n formatter,\n labelFormatter,\n}: PieOptionsInput): PieEChartsOption {\n return {\n legend: {\n ...buildLegendConfig({ hasLegend: true, labelFormatter }),\n // Pie reads better with a centered legend (the donut is radially\n // symmetric — left-aligning the legend below it visually unbalances\n // the chart). Override `buildLegendConfig`'s `type: 'scroll'` with\n // `'plain'` so long category lists wrap to multiple rows instead\n // of clipping the last visible item against the chart container.\n // The wider `itemGap` gives chips breathing room in the typical\n // 3–6 category case.\n left: 'center',\n type: 'scroll',\n itemGap: 16,\n },\n tooltip: {\n // Pie uses item-trigger (no axis); the rest of the styling mirrors\n // bar/histogram so the dashboard reads consistently — dark\n // grey[900] bg, white caption-font text, padded, with the shared\n // overflow-aware positioner.\n trigger: 'item',\n backgroundColor: theme.palette.grey[900],\n borderWidth: 0,\n padding: [parseInt(theme.spacing(1)), parseInt(theme.spacing(1))],\n textStyle: {\n color: theme.palette.common.white,\n fontSize: 11,\n fontFamily: theme.typography.caption.fontFamily,\n },\n position: createTooltipPositioner(theme),\n formatter: buildPieTooltipFormatter(formatter, labelFormatter),\n },\n // V1 used `qualitative.bold` only (no `secondary.main` prefix) because\n // pie slices are categorical — each slice deserves a distinct palette\n // entry from the start, not a primary highlight.\n color: Object.values(\n (theme.palette as { qualitative?: { bold?: Record<string, string> } })\n .qualitative?.bold ?? {},\n ),\n // Pie template. The merger spreads this into each per-data series it\n // emits — borderColor / borderWidth / emphasis-disabled / label rich\n // sizes all survive through.\n series: [\n {\n type: 'pie',\n colorBy: 'data',\n avoidLabelOverlap: true,\n selectedOffset: 0,\n emphasis: { disabled: true },\n itemStyle: {\n borderColor: theme.palette.background.paper,\n borderWidth: 1,\n },\n label: {\n show: true,\n position: 'center',\n rich: {\n b: { fontSize: 16, fontWeight: 'normal', lineHeight: 20 },\n c: { fontSize: 28, fontWeight: 'bold', lineHeight: 27 },\n },\n },\n },\n ],\n }\n}\n\n/**\n * Returns the pie widget's {@link OptionFactory} — one closure that owns\n * BOTH phases of option construction:\n *\n * - **Structural phase** (`option == null`) — builds the theme-aware\n * structural option via {@link pieOptions}, optionally merging the\n * consumer-supplied `optionsOverride` on top. Called once by Provider\n * to seed `rawOptions` in the store.\n * - **Merge phase** (`option != null`) — fuses post-pipeline `state.data`\n * (`PieWidgetData`) into the option via the dataset API. Single-series\n * → donut (one dataset, `series[i].encode = { itemName: 'name', value: 'value' }`).\n * Multi-series → horizontal-bar fallback (mirrors v1 pie). Reactive\n * formatters from `ctx` drive the tooltip + center label at fusion\n * time so RelativeData's percent formatter flows through without a\n * structural rebuild.\n */\nexport function createPieOptionFactory(\n options: PieOptionFactoryInput,\n): OptionFactory {\n const { theme, formatter, labelFormatter, optionsOverride, series } = options\n const radius = options.radius ?? DEFAULT_RADIUS\n const selection = options.selection\n const selectionSet =\n selection && selection.length > 0\n ? new Set<string | number>(selection)\n : null\n return (option, data, ctx) => {\n if (option == null) {\n const structural = pieOptions({ theme, formatter, labelFormatter })\n return optionsOverride\n ? (mergeOptions(\n structural as unknown as Record<string, unknown>,\n optionsOverride as Partial<Record<string, unknown>>,\n ) as EChartsOption)\n : structural\n }\n\n const seriesArr = Array.isArray(data) ? (data as PieWidgetData) : []\n if (seriesArr.length === 0) {\n return { ...option, dataset: [], series: [] }\n }\n if (seriesArr.length > 1) {\n return buildMultiSeriesBarFusion(\n option,\n seriesArr,\n theme,\n series,\n ctx,\n selectionSet,\n )\n }\n return buildSingleSeriesPieFusion(\n option,\n seriesArr,\n radius,\n series,\n ctx,\n selectionSet,\n )\n }\n}\n\n/**\n * Single-series donut fusion. Spreads the structural pie series template\n * into per-data series with center/radius/encoding, wires the reactive\n * center-label / tooltip formatters and the per-data palette-aware\n * selection-dim callback.\n */\nfunction buildSingleSeriesPieFusion(\n option: EChartsOption,\n seriesArr: PieWidgetData,\n radius: readonly [string, string],\n series: readonly WidgetSeries[] | undefined,\n ctx: OptionFactoryContext | undefined,\n selectionSet: Set<string | number> | null,\n): EChartsOption {\n const seriesTemplates = Array.isArray(option.series) ? option.series : []\n const broadcastTemplate = seriesTemplates[0] ?? {}\n const baseTooltip =\n typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)\n ? option.tooltip\n : {}\n const baseLegend =\n typeof option.legend === 'object' && !Array.isArray(option.legend)\n ? option.legend\n : {}\n const formatter = ctx?.formatter\n const labelFormatter = ctx?.labelFormatter\n\n // Pie wants `colorBy: 'data'` — each slice draws from the option's\n // `color` palette by data index. But installing an `itemStyle.color`\n // callback disables ECharts' automatic per-data cycling, and\n // `params.color` collapses to the series color (so every slice goes\n // the same color). We re-implement the per-data palette resolution\n // here so the multicolor look survives selection-driven dimming.\n const palette = Array.isArray(option.color)\n ? (option.color as readonly (string | undefined)[])\n : []\n const resolvePaletteColor = (params: CallbackDataParams): string => {\n const swatch =\n palette.length > 0\n ? palette[params.dataIndex % palette.length]\n : undefined\n return swatch ?? (params.color as string)\n }\n\n // Always emit `itemStyle.color` (passthrough when nothing is selected),\n // not conditionally — same anti-stale-callback rationale as bar /\n // histogram. The slice border + width come from the structural\n // template's `itemStyle` and survive via the spread below.\n const colorFn = (params: CallbackDataParams): string => {\n const base = resolvePaletteColor(params)\n if (!selectionSet) return base\n const datum = params.value as { name?: string | number } | undefined\n const name = datum?.name ?? params.name\n return name != null && selectionSet.has(name)\n ? base\n : echarts.color.modifyAlpha(base, 0.15)\n }\n\n // Center label formatter — lives in the merger because it reads\n // reactive `formatter` / `labelFormatter` from ctx. The rich tags\n // `{c|…}` and `{b|…}` reference the rich styles baked into the\n // structural label template.\n const labelTextFormatter = (params: CallbackDataParams): string => {\n const { name } = params\n const encodeIndex = params.encode?.value?.[0]\n if (encodeIndex === undefined) return ''\n const value = (Object.values(params.data ?? {}) as unknown[]).at(\n encodeIndex,\n )\n // `value` here is the resolved dataset cell — for pie data it's a\n // `string | number` primitive. Anything else is a misuse we won't\n // dress up with `String(...)` (would render \"[object Object]\").\n const formattedValue =\n typeof value === 'number'\n ? formatter\n ? formatter(value)\n : String(value)\n : typeof value === 'string'\n ? value\n : ''\n const formattedName = labelFormatter\n ? String(labelFormatter(name ?? ''))\n : String(name ?? '')\n return `{c|${formattedValue}}\\n\\n{b|${formattedName}}`\n }\n\n return {\n ...option,\n dataset: seriesArr.map((s) => ({ source: s as readonly object[] })),\n series: seriesArr.map((_, i) => {\n const template =\n (seriesTemplates[i] as object | undefined) ??\n (broadcastTemplate as object)\n const templateObj = typeof template === 'object' ? template : {}\n const templateLabel = (templateObj as { label?: object }).label ?? {}\n const templateItemStyle =\n (templateObj as { itemStyle?: object }).itemStyle ?? {}\n return {\n ...templateObj,\n type: 'pie' as const,\n datasetIndex: i,\n name: series?.[i]?.name ?? `Series ${i + 1}`,\n radius: [...radius],\n // Lift the donut up so the bottom-anchored legend has the\n // vertical real estate to wrap to multiple rows for long\n // category lists — at exactly `50%` the bottom slices crowd\n // the chips and `type: 'plain'` legends can't expand upward\n // without overlapping the donut.\n center: ['50%', '38%'] as [string, string],\n encode: { itemName: 'name', value: 'value' },\n label: {\n ...templateLabel,\n formatter: labelTextFormatter,\n },\n itemStyle: {\n ...templateItemStyle,\n color: colorFn,\n },\n }\n }),\n // Legend always shows for pie (mirrors v1) — slice names drive the\n // entries, so even a single donut benefits from a category list.\n legend: { ...baseLegend, show: true },\n tooltip: {\n ...baseTooltip,\n formatter: buildPieTooltipFormatter(formatter, labelFormatter),\n },\n }\n}\n\n/**\n * Multi-series horizontal-bar fusion. Mirrors v1 pie's \"pie data with\n * >1 series collapses into a horizontal bar chart\" behavior — side-by-\n * side donuts don't read well when you're comparing the same categories\n * across cohorts, so swap to a value-on-x / category-on-y bar layout.\n *\n * Pie data shape is identical to bar's (`{ name, value }[][]`), so the\n * same dataset feeds either layout without transformation.\n */\nfunction buildMultiSeriesBarFusion(\n option: EChartsOption,\n seriesArr: PieWidgetData,\n theme: Theme,\n series: readonly WidgetSeries[] | undefined,\n ctx: OptionFactoryContext | undefined,\n selectionSet: Set<string | number> | null,\n): EChartsOption {\n const baseTooltip =\n typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)\n ? option.tooltip\n : {}\n const baseLegend =\n typeof option.legend === 'object' && !Array.isArray(option.legend)\n ? option.legend\n : {}\n const baseGrid =\n typeof option.grid === 'object' && !Array.isArray(option.grid)\n ? option.grid\n : {}\n const formatter = ctx?.formatter\n const labelFormatter = ctx?.labelFormatter\n\n const { niceMinVal, niceMaxVal } = computeNiceBounds(seriesArr)\n\n // Per-series palette — multi-series bars take one color per series\n // (not per-data, unlike donut slices). Same anti-stale-callback rule:\n // always emit the callback so a transition to/from a selection\n // replaces the previous closure cleanly.\n const palette = Array.isArray(option.color)\n ? (option.color as readonly (string | undefined)[])\n : []\n const barColorFn = (params: CallbackDataParams): string => {\n const seriesIdx = params.seriesIndex ?? 0\n const seriesSwatch =\n palette.length > 0 ? palette[seriesIdx % palette.length] : undefined\n const base = (seriesSwatch ?? params.color) as string\n if (!selectionSet) return base\n const datum = params.value as { name?: string | number } | undefined\n const name = datum?.name ?? params.name\n return name != null && selectionSet.has(name)\n ? base\n : echarts.color.modifyAlpha(base, 0.15)\n }\n\n return {\n ...option,\n dataset: seriesArr.map((s) => ({ source: s as readonly object[] })),\n grid: {\n ...baseGrid,\n ...buildGridConfig(true, theme),\n right: parseInt(theme.spacing(4)),\n containLabel: true,\n },\n // Drop pie-specific structural keys that shouldn't render in the\n // bar fallback. ECharts ignores undefined keys, so this is a clean\n // override.\n series: seriesArr.map((_, i) => {\n const overrideColor = resolveThemeColor(theme, series?.[i]?.color)\n return {\n datasetIndex: i,\n type: 'bar' as const,\n name: series?.[i]?.name ?? `Series ${i + 1}`,\n barMaxWidth: 100,\n emphasis: { focus: 'series' },\n ...buildSeriesLabelConfig(formatter, 'x'),\n itemStyle: { color: barColorFn },\n ...(overrideColor ? { color: overrideColor } : {}),\n }\n }),\n xAxis: {\n type: 'value',\n // Closures over the pre-computed nice bounds — ECharts calls them\n // once per render to resolve the axis extents.\n min: () => niceMinVal,\n max: () => niceMaxVal,\n axisLine: { show: false },\n axisTick: { show: false },\n splitLine: {\n show: true,\n lineStyle: { color: theme.palette.black?.[4] ?? theme.palette.divider },\n },\n // Value labels render BELOW the axis line (default placement),\n // NOT inside the plot. Bar/histogram use `inside: true` +\n // `verticalAlign: 'bottom'` for their *vertical* y-axis where the\n // axis is the left wall — labels inside read like grid annotations.\n // A horizontal bar chart's value axis is the x-axis, and `inside`\n // there pushes the max label *behind* the bar (it visually\n // disappears once a bar reaches the right edge). Use the default\n // below-the-axis placement so the rounded extents stay readable.\n axisLabel: {\n fontSize: theme.typography.overlineDelicate?.fontSize,\n fontFamily: theme.typography.overlineDelicate?.fontFamily,\n margin: parseInt(theme.spacing(1)),\n showMaxLabel: true,\n showMinLabel: true,\n formatter: (value: number) => {\n if (value !== niceMaxVal && value !== niceMinVal) return ''\n if (value === 0) return ''\n return formatter ? formatter(value) : String(value)\n },\n },\n },\n yAxis: {\n type: 'category',\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: {\n padding: [parseInt(theme.spacing(0.5)), 0, 0, 0],\n ...(labelFormatter && {\n formatter: (value: string | number) => String(labelFormatter(value)),\n }),\n },\n },\n legend: { ...baseLegend, show: true },\n tooltip: {\n ...baseTooltip,\n trigger: 'axis',\n formatter: buildHorizontalBarTooltipFormatter(formatter, labelFormatter),\n },\n } as EChartsOption\n}\n\n/**\n * Tooltip formatter for the horizontal-bar fallback. Reads the value by\n * `encode.x` dimension index (v1 parity) so it stays robust to\n * downstream changes that rename dataset columns.\n */\nfunction buildHorizontalBarTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n labelFormatter: ((value: string | number) => string | number) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const encodeIndex = item.encode?.x?.at(0)\n const dimName =\n encodeIndex !== undefined ? item.dimensionNames?.[encodeIndex] : undefined\n const row =\n item.value && typeof item.value === 'object' && !Array.isArray(item.value)\n ? (item.value as Record<string, string | number>)\n : undefined\n const raw = dimName && row ? row[dimName] : undefined\n const formattedValue =\n typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')\n const marker = typeof item.marker === 'string' ? item.marker : ''\n const seriesName = item.seriesName ? `${item.seriesName}: ` : ''\n const name = labelFormatter\n ? String(labelFormatter(item.name ?? ''))\n : String(item.name ?? '')\n return { name, seriesName, marker, value: formattedValue }\n })\n}\n\n/**\n * Min/max bounds over every datum's `.value` across all series. Used by\n * the horizontal-bar fallback's x-axis label formatter so we only render\n * labels at the rounded extents (matches v1 + bar / histogram).\n */\nfunction computeNiceBounds(seriesArr: PieWidgetData): {\n niceMinVal: number\n niceMaxVal: number\n} {\n let min = 0\n let max = -Infinity\n for (const series of seriesArr) {\n for (const d of series) {\n if (typeof d?.value !== 'number' || !Number.isFinite(d.value)) continue\n if (d.value < min) min = d.value\n if (d.value > max) max = d.value\n }\n }\n return {\n niceMinVal: min < 0 ? niceNum(min) : 0,\n niceMaxVal: max <= 0 ? 1 : niceNum(max),\n }\n}\n\n/**\n * Tooltip formatter for pie slices. `item.value` is the dataset row\n * object (e.g. `{ name: 'A', value: 10 }`); we pull the value by\n * `encode.value`'s dimension index, formatted via the reactive `formatter`\n * if present. Slice name passes through `labelFormatter`.\n */\nfunction buildPieTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n labelFormatter: ((value: string | number) => string | number) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const encodeIndex = item.encode?.value?.at(0) ?? 1\n const values =\n item.value && typeof item.value === 'object' && !Array.isArray(item.value)\n ? (Object.values(item.value) as (string | number)[])\n : []\n const raw = values[encodeIndex]\n const formattedValue =\n typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')\n const marker = typeof item.marker === 'string' ? item.marker : ''\n const seriesName = item.seriesName ? `${item.seriesName}: ` : ''\n const name = labelFormatter\n ? String(labelFormatter(item.name ?? ''))\n : String(item.name ?? '')\n return { name, seriesName, marker, value: formattedValue }\n })\n}\n","import { Box, Skeleton } from '@mui/material'\nimport type { SxProps, Theme } from '@mui/material'\n\nconst styles = {\n root: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 200,\n py: 1,\n gap: 2,\n },\n donut: {\n width: 160,\n height: 160,\n borderRadius: '50%',\n },\n} satisfies Record<string, SxProps<Theme>>\n\nexport interface PieSkeletonProps {\n count?: number\n}\n\nexport function PieSkeleton({ count = 1 }: PieSkeletonProps) {\n return (\n <Box sx={styles.root}>\n {Array.from({ length: count }).map((_, i) => (\n <Skeleton key={`donut-${i}`} variant='circular' sx={styles.donut} />\n ))}\n </Box>\n )\n}\n","import {\n buildCsvDownloadItem,\n buildPngDownloadItem,\n type DownloadItem,\n} from '../actions/download'\nimport type { PieWidgetData } from './types'\n\n/**\n * Download menu items for the Pie widget. Always includes a CSV item with\n * `series, name, value` columns (one row per slice; series labels come from\n * `seriesNames` if provided, else `series_<n>`). When `getCaptureEl` is\n * supplied, prepends a PNG item that rasterises the captured element via\n * `html2canvas`.\n */\nexport function createPieDownloadConfig(args: {\n filename: string\n getData: () => PieWidgetData\n seriesNames?: readonly string[]\n getCaptureEl?: () => HTMLElement | null\n pngPixelRatio?: number\n pngBackgroundColor?: string | null\n}): DownloadItem[] {\n const items: DownloadItem[] = []\n if (args.getCaptureEl) {\n items.push(\n buildPngDownloadItem({\n filename: args.filename,\n getCaptureEl: args.getCaptureEl,\n pixelRatio: args.pngPixelRatio,\n backgroundColor: args.pngBackgroundColor,\n }),\n )\n }\n items.push(\n buildCsvDownloadItem({\n filename: args.filename,\n getRows: () => {\n const data = args.getData()\n const rows: unknown[][] = [['series', 'name', 'value']]\n for (const [i, series] of data.entries()) {\n const seriesName = args.seriesNames?.[i] ?? `series_${i + 1}`\n for (const slice of series) {\n rows.push([seriesName, slice.name, slice.value])\n }\n }\n return rows\n },\n }),\n )\n return items\n}\n"],"names":["DEFAULT_RADIUS","pieOptions","theme","formatter","labelFormatter","legend","buildLegendConfig","hasLegend","left","type","itemGap","tooltip","trigger","backgroundColor","palette","grey","borderWidth","padding","parseInt","spacing","textStyle","color","common","white","fontSize","fontFamily","typography","caption","position","createTooltipPositioner","buildPieTooltipFormatter","Object","values","qualitative","bold","series","colorBy","avoidLabelOverlap","selectedOffset","emphasis","disabled","itemStyle","borderColor","background","paper","label","show","rich","b","fontWeight","lineHeight","c","createPieOptionFactory","options","optionsOverride","radius","selection","selectionSet","length","Set","option","data","ctx","structural","mergeOptions","seriesArr","Array","isArray","dataset","buildMultiSeriesBarFusion","buildSingleSeriesPieFusion","seriesTemplates","broadcastTemplate","baseTooltip","baseLegend","resolvePaletteColor","params","dataIndex","undefined","colorFn","base","name","value","has","echarts","modifyAlpha","labelTextFormatter","encodeIndex","encode","at","formattedValue","String","formattedName","map","s","source","_","i","template","templateObj","templateLabel","templateItemStyle","datasetIndex","center","itemName","baseGrid","grid","niceMinVal","niceMaxVal","computeNiceBounds","barColorFn","seriesIdx","seriesIndex","buildGridConfig","right","containLabel","overrideColor","resolveThemeColor","barMaxWidth","focus","buildSeriesLabelConfig","xAxis","min","max","axisLine","axisTick","splitLine","lineStyle","black","divider","axisLabel","overlineDelicate","margin","showMaxLabel","showMinLabel","yAxis","buildHorizontalBarTooltipFormatter","createTooltipFormatter","item","x","dimName","dimensionNames","row","raw","marker","seriesName","d","Number","isFinite","niceNum","styles","root","display","alignItems","justifyContent","minHeight","py","gap","donut","width","height","borderRadius","PieSkeleton","t0","$","_c","count","t1","t2","Box","from","_temp","jsx","Skeleton","createPieDownloadConfig","args","items","getCaptureEl","push","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","pngBackgroundColor","buildCsvDownloadItem","getRows","getData","rows","entries","seriesNames","slice"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as E from "echarts";
|
|
2
|
-
import { d as H, g as
|
|
2
|
+
import { d as H, g as W, c as q, n as A, f as C } from "../option-builders-F-c9ELi1.js";
|
|
3
3
|
import { jsx as x, jsxs as M } from "react/jsx-runtime";
|
|
4
|
-
import { c as
|
|
5
|
-
import { Skeleton as I, Box as
|
|
4
|
+
import { c as U } from "react/compiler-runtime";
|
|
5
|
+
import { Skeleton as I, Box as S } from "@mui/material";
|
|
6
6
|
import "../widget-store-Bw5zRUGg.js";
|
|
7
7
|
import "zustand/shallow";
|
|
8
8
|
import "@mui/icons-material";
|
|
@@ -21,9 +21,9 @@ import "zustand/vanilla";
|
|
|
21
21
|
import "zustand/middleware";
|
|
22
22
|
import "zustand/react/shallow";
|
|
23
23
|
import { Z as b } from "../transforms-Cdx4fkU5.js";
|
|
24
|
-
import { m as
|
|
25
|
-
import {
|
|
26
|
-
import { b as
|
|
24
|
+
import { m as J, r as K } from "../resolve-theme-color-BdojIw0K.js";
|
|
25
|
+
import { b as Q } from "../png-item-9dNbB37T.js";
|
|
26
|
+
import { b as V } from "../csv-item-hH_Gt7ur.js";
|
|
27
27
|
function ee({
|
|
28
28
|
theme: e,
|
|
29
29
|
xFormatter: t,
|
|
@@ -35,7 +35,7 @@ function ee({
|
|
|
35
35
|
top: parseInt(e.spacing(3)),
|
|
36
36
|
right: parseInt(e.spacing(1)),
|
|
37
37
|
// Default: no legend. Merger bumps `bottom` when there are >1 series.
|
|
38
|
-
...
|
|
38
|
+
...q(!1, e),
|
|
39
39
|
containLabel: !0
|
|
40
40
|
},
|
|
41
41
|
tooltip: {
|
|
@@ -50,7 +50,7 @@ function ee({
|
|
|
50
50
|
fontSize: 11,
|
|
51
51
|
fontFamily: e.typography.caption.fontFamily
|
|
52
52
|
},
|
|
53
|
-
position:
|
|
53
|
+
position: W(e),
|
|
54
54
|
formatter: oe(t, r)
|
|
55
55
|
},
|
|
56
56
|
// Legend styling baked here; `show` is toggled by the merger based on
|
|
@@ -123,32 +123,32 @@ function ee({
|
|
|
123
123
|
}
|
|
124
124
|
};
|
|
125
125
|
}
|
|
126
|
-
function
|
|
126
|
+
function Te(e) {
|
|
127
127
|
const {
|
|
128
128
|
theme: t,
|
|
129
129
|
xFormatter: r,
|
|
130
|
-
yFormatter:
|
|
131
|
-
optionsOverride:
|
|
130
|
+
yFormatter: o,
|
|
131
|
+
optionsOverride: i
|
|
132
132
|
} = e, s = e.series, a = e.symbolSize ?? 8, l = e.selection, c = l && l.length > 0 ? new Set(l) : null;
|
|
133
|
-
return (
|
|
134
|
-
if (
|
|
133
|
+
return (n, u, p) => {
|
|
134
|
+
if (n == null) {
|
|
135
135
|
const d = ee({
|
|
136
136
|
theme: t,
|
|
137
137
|
xFormatter: r,
|
|
138
|
-
yFormatter:
|
|
138
|
+
yFormatter: o
|
|
139
139
|
});
|
|
140
|
-
return
|
|
140
|
+
return i ? J(d, i) : d;
|
|
141
141
|
}
|
|
142
142
|
const f = Array.isArray(u) ? u : [];
|
|
143
143
|
if (f.length === 0)
|
|
144
144
|
return {
|
|
145
|
-
...
|
|
145
|
+
...n,
|
|
146
146
|
dataset: [],
|
|
147
147
|
series: []
|
|
148
148
|
};
|
|
149
|
-
const
|
|
150
|
-
niceMinX:
|
|
151
|
-
niceMaxX:
|
|
149
|
+
const w = f.length > 1, Y = typeof n.legend == "object" && !Array.isArray(n.legend) ? n.legend : {}, g = typeof n.grid == "object" && !Array.isArray(n.grid) ? n.grid : {}, L = typeof n.tooltip == "object" && !Array.isArray(n.tooltip) ? n.tooltip : {}, X = typeof n.xAxis == "object" && !Array.isArray(n.xAxis) ? n.xAxis : {}, N = typeof n.yAxis == "object" && !Array.isArray(n.yAxis) ? n.yAxis : {}, k = p?.formatter, {
|
|
150
|
+
niceMinX: D,
|
|
151
|
+
niceMaxX: T,
|
|
152
152
|
niceMinY: j,
|
|
153
153
|
niceMaxY: O
|
|
154
154
|
} = ie(f), z = (d) => (m) => {
|
|
@@ -156,16 +156,16 @@ function De(e) {
|
|
|
156
156
|
if (!c) return y;
|
|
157
157
|
const Z = `${d}:${m.dataIndex}`;
|
|
158
158
|
return c.has(Z) ? y : E.color.modifyAlpha(y, 0.15);
|
|
159
|
-
}, h = te(
|
|
159
|
+
}, h = te(n.dataZoom, w), _ = h?.hasXSlider ?? !1, R = h?.hasYSlider ?? !1, B = typeof g.bottom == "number" ? g.bottom : 24, F = w ? 56 : B, G = _ ? F + b.sliderHeight + b.sliderGap : F, $ = typeof g.right == "number" ? g.right : 8, P = R ? $ + b.sliderHeight + b.sliderGap : $;
|
|
160
160
|
return {
|
|
161
|
-
...
|
|
161
|
+
...n,
|
|
162
162
|
// ECharts dataset.source wants a mutable [number, number][] shape; we
|
|
163
163
|
// hold readonly tuples internally, so cast at the boundary.
|
|
164
164
|
dataset: f.map((d) => ({
|
|
165
165
|
source: d
|
|
166
166
|
})),
|
|
167
167
|
series: f.map((d, m) => {
|
|
168
|
-
const y =
|
|
168
|
+
const y = K(t, s?.[m]?.color);
|
|
169
169
|
return {
|
|
170
170
|
type: "scatter",
|
|
171
171
|
datasetIndex: m,
|
|
@@ -188,20 +188,20 @@ function De(e) {
|
|
|
188
188
|
}),
|
|
189
189
|
legend: {
|
|
190
190
|
...Y,
|
|
191
|
-
show:
|
|
191
|
+
show: w
|
|
192
192
|
},
|
|
193
193
|
grid: {
|
|
194
194
|
...g,
|
|
195
|
-
bottom:
|
|
196
|
-
right:
|
|
195
|
+
bottom: G,
|
|
196
|
+
right: P
|
|
197
197
|
},
|
|
198
198
|
...h ? {
|
|
199
199
|
dataZoom: h.entries
|
|
200
200
|
} : {},
|
|
201
201
|
xAxis: {
|
|
202
|
-
...
|
|
203
|
-
min:
|
|
204
|
-
max:
|
|
202
|
+
...X,
|
|
203
|
+
min: D,
|
|
204
|
+
max: T
|
|
205
205
|
},
|
|
206
206
|
yAxis: {
|
|
207
207
|
...N,
|
|
@@ -214,8 +214,8 @@ function De(e) {
|
|
|
214
214
|
// without rebuilding the structural option. Falls back to the
|
|
215
215
|
// structural `yFormatter` already baked in `baseYAxis.axisLabel`
|
|
216
216
|
// (which `String(value)` if neither is set).
|
|
217
|
-
...
|
|
218
|
-
formatter:
|
|
217
|
+
...k ? {
|
|
218
|
+
formatter: k
|
|
219
219
|
} : {}
|
|
220
220
|
}
|
|
221
221
|
},
|
|
@@ -225,57 +225,57 @@ function De(e) {
|
|
|
225
225
|
// applied to the y-coordinate in the (x, y) label. xFormatter is
|
|
226
226
|
// structural — relative is a values-axis concept, so xFormatter
|
|
227
227
|
// doesn't change under RelativeData.
|
|
228
|
-
formatter: re(L.formatter,
|
|
228
|
+
formatter: re(L.formatter, k, r)
|
|
229
229
|
}
|
|
230
230
|
};
|
|
231
231
|
};
|
|
232
232
|
}
|
|
233
233
|
function te(e, t) {
|
|
234
234
|
if (!Array.isArray(e) || e.length === 0) return null;
|
|
235
|
-
let r = !1,
|
|
235
|
+
let r = !1, o = !1;
|
|
236
236
|
return {
|
|
237
237
|
entries: e.map((s) => {
|
|
238
238
|
if (s == null || typeof s != "object") return s;
|
|
239
239
|
const a = s;
|
|
240
|
-
return a.type !== "slider" ? a : a.yAxisIndex !== void 0 ? (
|
|
240
|
+
return a.type !== "slider" ? a : a.yAxisIndex !== void 0 ? (o = !0, a) : (r = !0, t ? {
|
|
241
241
|
...a,
|
|
242
242
|
bottom: b.sliderBottomWithLegend
|
|
243
243
|
} : a);
|
|
244
244
|
}),
|
|
245
245
|
hasXSlider: r,
|
|
246
|
-
hasYSlider:
|
|
246
|
+
hasYSlider: o
|
|
247
247
|
};
|
|
248
248
|
}
|
|
249
249
|
function re(e, t, r) {
|
|
250
|
-
return t ?
|
|
251
|
-
const
|
|
250
|
+
return t ? C((o) => {
|
|
251
|
+
const i = o.value, s = i?.[0], a = i?.[1], l = typeof s == "number" ? r ? r(s) : String(s) : "", c = typeof a == "number" ? t(a) : String(a ?? ""), n = typeof o.marker == "string" ? o.marker : "", u = o.seriesName ? `${o.seriesName}: ` : "";
|
|
252
252
|
return {
|
|
253
253
|
name: `(${l}, ${c})`,
|
|
254
254
|
seriesName: u,
|
|
255
|
-
marker:
|
|
255
|
+
marker: n,
|
|
256
256
|
value: ""
|
|
257
257
|
};
|
|
258
258
|
}) : e;
|
|
259
259
|
}
|
|
260
260
|
function oe(e, t) {
|
|
261
|
-
return
|
|
262
|
-
const
|
|
261
|
+
return C((r) => {
|
|
262
|
+
const o = r.value, i = o?.[0], s = o?.[1], a = typeof i == "number" ? e ? e(i) : String(i) : "", l = typeof s == "number" ? t ? t(s) : String(s) : "", c = typeof r.marker == "string" ? r.marker : "", n = r.seriesName ? `${r.seriesName}: ` : "";
|
|
263
263
|
return {
|
|
264
264
|
name: `(${a}, ${l})`,
|
|
265
|
-
seriesName:
|
|
265
|
+
seriesName: n,
|
|
266
266
|
marker: c,
|
|
267
267
|
value: ""
|
|
268
268
|
};
|
|
269
269
|
});
|
|
270
270
|
}
|
|
271
271
|
function ie(e) {
|
|
272
|
-
let t = 1 / 0, r = -1 / 0,
|
|
273
|
-
for (const
|
|
274
|
-
for (const u of
|
|
272
|
+
let t = 1 / 0, r = -1 / 0, o = 1 / 0, i = -1 / 0;
|
|
273
|
+
for (const n of e)
|
|
274
|
+
for (const u of n) {
|
|
275
275
|
const p = u?.[0], f = u?.[1];
|
|
276
|
-
typeof p == "number" && Number.isFinite(p) && (p < t && (t = p), p > r && (r = p)), typeof f == "number" && Number.isFinite(f) && (f <
|
|
276
|
+
typeof p == "number" && Number.isFinite(p) && (p < t && (t = p), p > r && (r = p)), typeof f == "number" && Number.isFinite(f) && (f < o && (o = f), f > i && (i = f));
|
|
277
277
|
}
|
|
278
|
-
const s = Number.isFinite(r) ? r <= 0 ? 1 :
|
|
278
|
+
const s = Number.isFinite(r) ? r <= 0 ? 1 : A(r) : 1, a = Number.isFinite(i) ? i <= 0 ? 1 : A(i) : 1, l = Number.isFinite(t) && t < 0 ? A(t) : 0, c = Number.isFinite(o) && o < 0 ? A(o) : 0;
|
|
279
279
|
return {
|
|
280
280
|
niceMinX: l,
|
|
281
281
|
niceMaxX: s,
|
|
@@ -327,29 +327,29 @@ const v = {
|
|
|
327
327
|
borderRadius: "50%"
|
|
328
328
|
});
|
|
329
329
|
function je(e) {
|
|
330
|
-
const t =
|
|
330
|
+
const t = U(15), {
|
|
331
331
|
count: r
|
|
332
|
-
} = e,
|
|
333
|
-
let
|
|
334
|
-
if (t[0] !==
|
|
332
|
+
} = e, o = r === void 0 ? 24 : r;
|
|
333
|
+
let i, s, a, l, c;
|
|
334
|
+
if (t[0] !== o) {
|
|
335
335
|
const f = Array.from({
|
|
336
|
-
length:
|
|
336
|
+
length: o
|
|
337
337
|
}, le);
|
|
338
|
-
s =
|
|
338
|
+
s = S, c = v.container, i = S, a = v.grid, l = f.map(ae), t[0] = o, t[1] = i, t[2] = s, t[3] = a, t[4] = l, t[5] = c;
|
|
339
339
|
} else
|
|
340
|
-
|
|
341
|
-
let
|
|
342
|
-
t[6] !==
|
|
340
|
+
i = t[1], s = t[2], a = t[3], l = t[4], c = t[5];
|
|
341
|
+
let n;
|
|
342
|
+
t[6] !== i || t[7] !== a || t[8] !== l ? (n = /* @__PURE__ */ x(i, { sx: a, children: l }), t[6] = i, t[7] = a, t[8] = l, t[9] = n) : n = t[9];
|
|
343
343
|
let u;
|
|
344
|
-
t[10] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (u = /* @__PURE__ */ x(
|
|
344
|
+
t[10] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (u = /* @__PURE__ */ x(S, { sx: v.legend, children: [0, 1].map(se) }), t[10] = u) : u = t[10];
|
|
345
345
|
let p;
|
|
346
|
-
return t[11] !== s || t[12] !== c || t[13] !==
|
|
347
|
-
|
|
346
|
+
return t[11] !== s || t[12] !== c || t[13] !== n ? (p = /* @__PURE__ */ M(s, { sx: c, children: [
|
|
347
|
+
n,
|
|
348
348
|
u
|
|
349
|
-
] }), t[11] = s, t[12] = c, t[13] =
|
|
349
|
+
] }), t[11] = s, t[12] = c, t[13] = n, t[14] = p) : p = t[14], p;
|
|
350
350
|
}
|
|
351
351
|
function se(e) {
|
|
352
|
-
return /* @__PURE__ */ M(
|
|
352
|
+
return /* @__PURE__ */ M(S, { sx: v.legendItem, children: [
|
|
353
353
|
/* @__PURE__ */ x(I, { variant: "circular", width: 8, height: 8 }),
|
|
354
354
|
/* @__PURE__ */ x(I, { width: 48, height: 8 })
|
|
355
355
|
] }, `legend-${e}`);
|
|
@@ -358,11 +358,11 @@ function ae(e, t) {
|
|
|
358
358
|
return /* @__PURE__ */ x(I, { variant: "circular", sx: ne(e.top, e.left, e.size) }, `dot-${t}`);
|
|
359
359
|
}
|
|
360
360
|
function le(e, t) {
|
|
361
|
-
const r = 10 + t * 37 % 80,
|
|
361
|
+
const r = 10 + t * 37 % 80, o = 5 + t * 53 % 90, i = 8 + t * 7 % 6;
|
|
362
362
|
return {
|
|
363
363
|
top: `${r}%`,
|
|
364
|
-
left: `${
|
|
365
|
-
size:
|
|
364
|
+
left: `${o}%`,
|
|
365
|
+
size: i
|
|
366
366
|
};
|
|
367
367
|
}
|
|
368
368
|
function Oe(e) {
|
|
@@ -372,29 +372,23 @@ function Oe(e) {
|
|
|
372
372
|
getCaptureEl: e.getCaptureEl,
|
|
373
373
|
pixelRatio: e.pngPixelRatio,
|
|
374
374
|
backgroundColor: e.pngBackgroundColor
|
|
375
|
-
})), t.push({
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
const
|
|
380
|
-
|
|
381
|
-
const l
|
|
382
|
-
|
|
383
|
-
i.push([l, c, o]);
|
|
375
|
+
})), t.push(V({
|
|
376
|
+
filename: e.filename,
|
|
377
|
+
getRows: () => {
|
|
378
|
+
const r = e.getData(), o = [["series", "x", "y"]];
|
|
379
|
+
for (const [i, s] of r.entries()) {
|
|
380
|
+
const a = e.seriesNames?.[i] ?? `series_${i + 1}`;
|
|
381
|
+
for (const [l, c] of s)
|
|
382
|
+
o.push([a, l, c]);
|
|
384
383
|
}
|
|
385
|
-
|
|
386
|
-
return Promise.resolve({
|
|
387
|
-
url: n.url,
|
|
388
|
-
filename: `${e.filename}.csv`,
|
|
389
|
-
revoke: n.revoke
|
|
390
|
-
});
|
|
384
|
+
return o;
|
|
391
385
|
}
|
|
392
|
-
}), t;
|
|
386
|
+
})), t;
|
|
393
387
|
}
|
|
394
388
|
const ze = (e) => Array.isArray(e) ? e.map((t) => {
|
|
395
389
|
if (!ce(t)) return t;
|
|
396
|
-
const r = t.reduce((
|
|
397
|
-
return r <= 0 ? t : t.map(([
|
|
390
|
+
const r = t.reduce((o, [, i]) => o + Math.abs(i), 0);
|
|
391
|
+
return r <= 0 ? t : t.map(([o, i]) => [o, i / r * 100]);
|
|
398
392
|
}) : e;
|
|
399
393
|
function ce(e) {
|
|
400
394
|
return Array.isArray(e) ? e.every((t) => Array.isArray(t) && t.length === 2 && typeof t[0] == "number" && Number.isFinite(t[0]) && typeof t[1] == "number" && Number.isFinite(t[1])) : !1;
|
|
@@ -402,7 +396,7 @@ function ce(e) {
|
|
|
402
396
|
export {
|
|
403
397
|
je as ScatterplotSkeleton,
|
|
404
398
|
Oe as createScatterplotDownloadConfig,
|
|
405
|
-
|
|
399
|
+
Te as createScatterplotOptionFactory,
|
|
406
400
|
ee as scatterplotOptions,
|
|
407
401
|
ze as toRelativeScatterplotData
|
|
408
402
|
};
|