@platox/pivot-table 0.0.98 → 0.0.99

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.
@@ -11,6 +11,9 @@ import { mapConditionsToPostgrest } from "../utils.js";
11
11
  import Chart from "./base-chart/index.js";
12
12
  import { Empty } from "./Empty.js";
13
13
  import { getChartConfig, getSerie, getGrid } from "./utils.js";
14
+ const STRIP_BAR_SCROLL_THRESHOLD = 15;
15
+ const BAR_HEIGHT = 28;
16
+ const CHART_PADDING = 80;
14
17
  const ChartModule = ({
15
18
  moduleDataApi,
16
19
  customData,
@@ -18,6 +21,7 @@ const ChartModule = ({
18
21
  width = 2,
19
22
  height = 2
20
23
  }) => {
24
+ var _a;
21
25
  const { globalData, globalFilterCondition } = useAppContext();
22
26
  let matchGlobalFilterCondition = useMemo(() => {
23
27
  let matchGlobalFilterCondition2 = globalFilterCondition == null ? void 0 : globalFilterCondition.find(
@@ -28,7 +32,7 @@ const ChartModule = ({
28
32
  const [chartData, setChartData] = useState();
29
33
  const [loading, setloading] = useState();
30
34
  const fetchChartData = useMemoizedFn(async () => {
31
- var _a, _b, _c;
35
+ var _a2, _b, _c;
32
36
  setChartData([]);
33
37
  if (customData) {
34
38
  setloading(true);
@@ -51,7 +55,7 @@ const ChartModule = ({
51
55
  }
52
56
  }
53
57
  let conditionBlockList = [];
54
- if ((((_a = matchGlobalFilterCondition == null ? void 0 : matchGlobalFilterCondition.conditionList) == null ? void 0 : _a.length) ?? 0) > 0) {
58
+ if ((((_a2 = matchGlobalFilterCondition == null ? void 0 : matchGlobalFilterCondition.conditionList) == null ? void 0 : _a2.length) ?? 0) > 0) {
55
59
  conditionBlockList.push(matchGlobalFilterCondition);
56
60
  }
57
61
  if ((((_c = (_b = customData == null ? void 0 : customData.conditionData) == null ? void 0 : _b.conditionList) == null ? void 0 : _c.length) ?? 0) > 0) {
@@ -101,14 +105,14 @@ const ChartModule = ({
101
105
  { wait: 60 }
102
106
  );
103
107
  const fieldOptions = useMemo(() => {
104
- var _a, _b;
105
- let ret = (_b = (_a = globalData == null ? void 0 : globalData.sourceData) == null ? void 0 : _a.find((item) => item.value === (customData == null ? void 0 : customData.dataSourceId))) == null ? void 0 : _b.fields;
108
+ var _a2, _b;
109
+ let ret = (_b = (_a2 = globalData == null ? void 0 : globalData.sourceData) == null ? void 0 : _a2.find((item) => item.value === (customData == null ? void 0 : customData.dataSourceId))) == null ? void 0 : _b.fields;
106
110
  return ret;
107
111
  }, [globalData, customData == null ? void 0 : customData.dataSourceId]);
108
112
  const chartOptions = useMemo(() => {
109
113
  if (customData && chartData && customData.type && chartData.length > 0) {
110
114
  const getChartOptions = (_chartData) => {
111
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o;
115
+ var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o;
112
116
  const getFieldVal = ({
113
117
  item,
114
118
  field,
@@ -128,8 +132,8 @@ const ChartModule = ({
128
132
  return fieldData == null ? void 0 : fieldData.label;
129
133
  };
130
134
  const isTimeField = (fieldName) => {
131
- var _a2;
132
- return ((_a2 = fieldOptions == null ? void 0 : fieldOptions.find((item) => item.value === fieldName)) == null ? void 0 : _a2.type) === "timestamp";
135
+ var _a3;
136
+ return ((_a3 = fieldOptions == null ? void 0 : fieldOptions.find((item) => item.value === fieldName)) == null ? void 0 : _a3.type) === "timestamp";
133
137
  };
134
138
  const mapping = { tags: "tag" };
135
139
  const newXAxisField = mapping[customData == null ? void 0 : customData.xAxis] ?? (customData == null ? void 0 : customData.xAxis);
@@ -266,7 +270,7 @@ const ChartModule = ({
266
270
  });
267
271
  }
268
272
  const formatter = (data) => (customData == null ? void 0 : customData.isGroup) && (customData == null ? void 0 : customData.groupField) ? (data == null ? void 0 : data.value) == 0 ? "" : `${data == null ? void 0 : data.value}` : `${data == null ? void 0 : data.value}`;
269
- const isStripBar = ((_a = customData == null ? void 0 : customData.type) == null ? void 0 : _a.includes("strip-bar")) || (customData == null ? void 0 : customData.type) === "chart-bar-graph";
273
+ const isStripBar = ((_a2 = customData == null ? void 0 : customData.type) == null ? void 0 : _a2.includes("strip-bar")) || (customData == null ? void 0 : customData.type) === "chart-bar-graph";
270
274
  const label = {
271
275
  show: (_b = customData == null ? void 0 : customData.chartOptions) == null ? void 0 : _b.includes("label"),
272
276
  position: isStripBar ? "right" : "top",
@@ -282,7 +286,7 @@ const ChartModule = ({
282
286
  const formatValue = (v) => isNumber(v) ? Math.floor(v * 100) / 100 : v;
283
287
  if ((customData == null ? void 0 : customData.isGroup) && (customData == null ? void 0 : customData.groupField)) {
284
288
  stackLabels.forEach((stackCategory, idx) => {
285
- var _a2, _b2;
289
+ var _a3, _b2;
286
290
  const data = ["chart-bar-percentage", "chart-strip-bar-percentage"].includes(
287
291
  customData.type
288
292
  ) ? labels.map((label2) => formatValue(valueGroupPercentages[stackCategory][label2] || 0)) : labels.map((label2) => formatValue(valueGroups[stackCategory][label2] || 0));
@@ -297,7 +301,7 @@ const ChartModule = ({
297
301
  field: newGroupField
298
302
  }) == stackCategory
299
303
  );
300
- type = ((_a2 = matchCombinationChartConfig == null ? void 0 : matchCombinationChartConfig.config) == null ? void 0 : _a2.chartType) ?? ChartType["ChartBar"];
304
+ type = ((_a3 = matchCombinationChartConfig == null ? void 0 : matchCombinationChartConfig.config) == null ? void 0 : _a3.chartType) ?? ChartType["ChartBar"];
301
305
  yAxisPos = ((_b2 = matchCombinationChartConfig == null ? void 0 : matchCombinationChartConfig.config) == null ? void 0 : _b2.yAxisPos) ?? "left";
302
306
  }
303
307
  let seriesItem = getSerie({
@@ -317,8 +321,8 @@ const ChartModule = ({
317
321
  const data = ["chart-bar-percentage", "chart-strip-bar-percentage"].includes(
318
322
  customData.type
319
323
  ) ? labels.map((label2) => {
320
- var _a2;
321
- return formatValue(((_a2 = valuePercentages[label2]) == null ? void 0 : _a2.toFixed(2)) || 0);
324
+ var _a3;
325
+ return formatValue(((_a3 = valuePercentages[label2]) == null ? void 0 : _a3.toFixed(2)) || 0);
322
326
  }) : labels.map((label2) => formatValue(valueCounts[label2] || 0));
323
327
  let type = customData.type;
324
328
  let yAxisPos = "left";
@@ -453,13 +457,13 @@ const ChartModule = ({
453
457
  appendTo: "body",
454
458
  ...isPieType ? {} : {
455
459
  formatter: (params) => {
456
- var _a2;
460
+ var _a3;
457
461
  if (!Array.isArray(params)) return "";
458
- const title = `<div style="margin-bottom:6px;font-weight:500;color:#1d2129">${((_a2 = params[0]) == null ? void 0 : _a2.axisValueLabel) ?? ""}</div>`;
462
+ const title = `<div style="margin-bottom:6px;font-weight:500;color:#1d2129">${((_a3 = params[0]) == null ? void 0 : _a3.axisValueLabel) ?? ""}</div>`;
459
463
  const items = params.map(
460
464
  (p) => {
461
- var _a3, _b2, _c2;
462
- return `<div style="display:flex;align-items:center;justify-content:space-between;gap:12px;line-height:22px"><span style="display:inline-flex;align-items:center;gap:6px"><span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:${((_c2 = (_b2 = (_a3 = p.color) == null ? void 0 : _a3.colorStops) == null ? void 0 : _b2[0]) == null ? void 0 : _c2.color) ?? p.color}"></span>${p.seriesName}</span><span style="font-weight:500">${p.value}</span></div>`;
465
+ var _a4, _b2, _c2;
466
+ return `<div style="display:flex;align-items:center;justify-content:space-between;gap:12px;line-height:22px"><span style="display:inline-flex;align-items:center;gap:6px"><span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:${((_c2 = (_b2 = (_a4 = p.color) == null ? void 0 : _a4.colorStops) == null ? void 0 : _b2[0]) == null ? void 0 : _c2.color) ?? p.color}"></span>${p.seriesName}</span><span style="font-weight:500">${p.value}</span></div>`;
463
467
  }
464
468
  ).join("");
465
469
  return title + items;
@@ -495,11 +499,25 @@ const ChartModule = ({
495
499
  const containerRef = useRef(null);
496
500
  const size = useSize(containerRef);
497
501
  useEffect(() => {
498
- var _a;
499
502
  if (!!size) {
500
- (_a = echartRef == null ? void 0 : echartRef.current) == null ? void 0 : _a.resize();
503
+ setTimeout(() => {
504
+ var _a2;
505
+ return (_a2 = echartRef == null ? void 0 : echartRef.current) == null ? void 0 : _a2.resize();
506
+ }, 0);
501
507
  }
502
508
  }, [size]);
509
+ const isStripBarType = ((_a = customData == null ? void 0 : customData.type) == null ? void 0 : _a.includes("strip-bar")) || (customData == null ? void 0 : customData.type) === "chart-bar-graph";
510
+ const stripBarCategoryCount = useMemo(() => {
511
+ if (!isStripBarType || !chartOptions) return 0;
512
+ const yAxis = chartOptions == null ? void 0 : chartOptions.yAxis;
513
+ const yAxisConfig = Array.isArray(yAxis) ? yAxis[0] : yAxis;
514
+ if ((yAxisConfig == null ? void 0 : yAxisConfig.type) === "category" && Array.isArray(yAxisConfig == null ? void 0 : yAxisConfig.data)) {
515
+ return yAxisConfig.data.length;
516
+ }
517
+ return 0;
518
+ }, [isStripBarType, chartOptions]);
519
+ const needsContainerScroll = isStripBarType && stripBarCategoryCount > STRIP_BAR_SCROLL_THRESHOLD;
520
+ const chartInnerHeight = needsContainerScroll ? stripBarCategoryCount * BAR_HEIGHT + CHART_PADDING : void 0;
503
521
  const isLoading = loading;
504
522
  const isEmpyt = !loading && !chartOptions;
505
523
  const isOk = !isLoading && !!chartOptions;
@@ -518,7 +536,7 @@ const ChartModule = ({
518
536
  }
519
537
  ),
520
538
  isEmpyt && /* @__PURE__ */ jsx(Empty, {}),
521
- isOk && /* @__PURE__ */ jsx(Chart, { echartRef, options: chartOptions ?? {} })
539
+ isOk && needsContainerScroll ? /* @__PURE__ */ jsx("div", { className: "chart-scroll-container", style: { width: "100%", height: "100%", overflowY: "auto", overflowX: "hidden" }, children: /* @__PURE__ */ jsx("div", { style: { width: "100%", height: chartInnerHeight }, children: /* @__PURE__ */ jsx(Chart, { echartRef, options: chartOptions ?? {} }) }) }) : isOk ? /* @__PURE__ */ jsx(Chart, { echartRef, options: chartOptions ?? {} }) : null
522
540
  ] });
523
541
  };
524
542
  const ChartModule$1 = React.memo(ChartModule);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../packages/dashboard-workbench/components/module-content/chart-module/index.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { message, Spin } from 'antd'\nimport { useDebounceEffect, useMemoizedFn, useSize } from 'ahooks'\nimport { EChartsOption, LabelFormatterCallback } from 'echarts'\nimport { t } from 'i18next'\nimport { groupBy, isNumber } from 'lodash-es'\nimport {\n ChartCustomDataType,\n ChartCustomeStylesTypes,\n TimeGroupInterval,\n} from '@platox/pivot-table/components/add-module-modal/add-chart-modal/interface'\nimport { useAppContext } from '../../../context'\nimport { FieldItem, ModuleDataApi } from '../../../types'\nimport { getTransformValue } from '../../../utils'\nimport { ChartType } from '../../add-module-modal/add-chart-modal/interface'\nimport { ConditionBlock } from '../../add-module-modal/components/condition-modal/interface'\nimport { mapConditionsToPostgrest } from '../utils'\nimport BaseChart from './base-chart'\nimport Empty from './Empty'\nimport { getChartConfig, getGrid, getSerie } from './utils'\n\ninterface ChartModuleProps {\n customData?: ChartCustomDataType\n customeStyle?: ChartCustomeStylesTypes\n onChange?: (val: unknown) => void\n moduleDataApi?: ModuleDataApi\n width?: number\n height?: number\n}\n\nconst ChartModule: React.FC<ChartModuleProps> = ({\n moduleDataApi,\n customData,\n customeStyle,\n width = 2,\n height = 2,\n}) => {\n const { globalData, globalFilterCondition } = useAppContext()\n\n /* ============================== split =============================== */\n let matchGlobalFilterCondition = useMemo(() => {\n let matchGlobalFilterCondition = globalFilterCondition?.find(\n item => item?.dataSourceId === customData?.dataSourceId\n )\n return matchGlobalFilterCondition\n }, [globalFilterCondition, customData?.dataSourceId])\n\n const [chartData, setChartData] = useState<any>()\n const [loading, setloading] = useState<any>()\n\n const fetchChartData = useMemoizedFn(async () => {\n setChartData([])\n if (customData) {\n // 调用方法\n setloading(true)\n let queryString = ''\n const newXAxisField = customData?.xAxis === 'tags' ? 'tag' : customData?.xAxis\n const newGroupField = customData?.groupField === 'tags' ? 'tag' : customData?.groupField\n\n if (!customData.isGroup) {\n if (customData.yAxis === 'recordTotal') {\n queryString += `select=${newXAxisField},id.count()`\n }\n\n if (customData.yAxis === 'fieldValue' && customData?.yAxisField) {\n queryString += `select=${newXAxisField},${customData?.yAxisField}.${customData?.yAxisFieldType}()`\n }\n } else {\n if (customData.yAxis === 'recordTotal') {\n queryString += `select=${newXAxisField},${newGroupField},id.count()`\n }\n if (customData.yAxis === 'fieldValue' && customData?.yAxisField) {\n queryString += `select=${newXAxisField},${newGroupField},${customData?.yAxisField}.${customData?.yAxisFieldType}()`\n }\n }\n\n // 筛选\n let conditionBlockList = []\n if ((matchGlobalFilterCondition?.conditionList?.length ?? 0) > 0) {\n conditionBlockList.push(matchGlobalFilterCondition)\n }\n if ((customData?.conditionData?.conditionList?.length ?? 0) > 0) {\n conditionBlockList.push(customData?.conditionData)\n }\n if (conditionBlockList.length > 0) {\n let DSLStr = mapConditionsToPostgrest(conditionBlockList as ConditionBlock[])\n queryString += !!DSLStr ? `&${DSLStr}` : ''\n }\n\n if (customData?.dataSourceId) {\n moduleDataApi?.({\n id: customData?.dataSourceId,\n query: queryString,\n })\n .then((res: any) => {\n if (!res.success) {\n message.error(res.message)\n return\n }\n\n setChartData(res.data)\n })\n .finally(() => {\n setloading(false)\n })\n }\n } else {\n setChartData([])\n }\n })\n\n useDebounceEffect(\n () => {\n if (customData) {\n fetchChartData()\n }\n },\n [\n customData?.dataSourceId,\n customData?.conditionData,\n customData?.sortField,\n customData?.sortOrder,\n customData?.xAxis,\n customData?.yAxis,\n customData?.yAxisField,\n customData?.yAxisFieldType,\n customData?.isGroup,\n customData?.groupField,\n matchGlobalFilterCondition,\n ],\n { wait: 60 }\n )\n\n /* ============================== split =============================== */\n const fieldOptions = useMemo(() => {\n let ret = globalData?.sourceData?.find(item => item.value === customData?.dataSourceId)?.fields\n return ret\n }, [globalData, customData?.dataSourceId])\n\n /**\n * @description: 根据 customData 和 chartData 动态生成 ECharts 配置项\n * 主要逻辑:\n * 1. 根据字段配置和分组字段构造数据;\n * 2. 支持分组、百分比、排序、显示范围;\n * 3. 根据自定义配置生成 series、legend、xAxis/yAxis、grid、tooltip 等。\n */\n const chartOptions = useMemo(() => {\n if (customData && chartData && customData.type && chartData.length > 0) {\n /**\n * 根据 chartData 生成完整的 ECharts 配置\n */\n const getChartOptions = (_chartData: any) => {\n /**\n * @description 获取字段值(带字段映射与时间分组转换)\n */\n const getFieldVal = ({\n item,\n field,\n timeGroupInterval,\n }: {\n item: any\n field: any\n timeGroupInterval?: TimeGroupInterval\n }) => {\n return getTransformValue({\n fieldOptions,\n val: item[field],\n field: field,\n fieldMap: globalData?.fieldMap,\n timeGroupInterval,\n showNill: false,\n })\n }\n\n /** 获取字段对应的标签名(label) */\n const getFieldLabel = (field: string) => {\n const fieldData = fieldOptions?.find(item => item.value === field)\n return fieldData?.label\n }\n\n /** 判断是否为时间类型字段 */\n const isTimeField = (fieldName: string) => {\n return fieldOptions?.find(item => item.value === fieldName)?.type === 'timestamp'\n }\n\n // 后端字段映射修正\n const mapping = { tags: 'tag' }\n\n const newXAxisField =\n mapping[customData?.xAxis as keyof typeof mapping] ?? customData?.xAxis\n const newGroupField =\n mapping[customData?.groupField as keyof typeof mapping] ?? customData?.groupField\n\n console.log(\"newGroupField\", newGroupField)\n\n /**\n * Step 1. 分组整理数据(以 xAxis 为主键)\n */\n let groupData = groupBy(_chartData, item => {\n const category = getFieldVal({\n item,\n field: newXAxisField,\n timeGroupInterval: customData?.timeGroupInterval,\n })\n return category ?? 'Unknown'\n })\n\n /** 合并同名分组数据 */\n let chartData = Object.keys(groupData).map(key => {\n let groupList = groupData[key]\n let mergeObj = groupList.reduce((acc, item) => {\n Object.keys(item).forEach(k => {\n let value = item[k]\n if (isNumber(value)) {\n acc[k] = acc?.[k] ? acc[k] + value : value\n } else {\n acc[k] = value\n }\n })\n return acc\n }, {})\n return mergeObj\n })\n\n /**\n * Step 2. 初始化容器\n */\n const categories = new Set<string>() // x 轴标签集合\n const stackCategories = new Set<string>() // 分组类别\n const valueGroups: Record<string, Record<string, number>> = {} // 分组下的值\n const valueCounts: Record<string, number> = {} // 无分组的值\n\n /**\n * Step 3. 提取每一项的数据\n */\n chartData.forEach((item: any) => {\n const category = getFieldVal({\n item,\n field: newXAxisField,\n timeGroupInterval: customData?.timeGroupInterval,\n }) ?? 'Unknown'\n const val =\n customData.yAxis === 'recordTotal' ? item?.count : item[customData?.yAxisFieldType] || 0\n\n valueCounts[category] = val\n\n // 分组数据处理\n // if (customData?.isGroup && customData?.groupField) {\n // const stackCategory = getFieldVal({\n // item,\n // field: newGroupField,\n // })\n // const key = category ?? 'Unknown'\n // stackCategories.add(stackCategory)\n // if (!valueGroups[stackCategory]) valueGroups[stackCategory] = {}\n // valueGroups[stackCategory][key] = val\n // }\n })\n // 修bug先不影响其他的\n // https://applink.larksuite.com/client/todo/detail?guid=f7ad264e-bbea-4978-b908-c97ff55bb230&suite_entity_num=t107825\n if (customData?.isGroup && customData?.groupField) {\n _chartData.forEach((item: any) => {\n const category = getFieldVal({\n item,\n field: newXAxisField,\n timeGroupInterval: customData?.timeGroupInterval,\n }) ?? 'Unknown'\n const val =\n customData.yAxis === 'recordTotal' ? item?.count : item[customData?.yAxisFieldType] || 0\n\n const stackCategory = getFieldVal({\n item,\n field: newGroupField,\n }) ?? 'Unknown'\n stackCategories.add(stackCategory)\n if (!valueGroups[stackCategory]) valueGroups[stackCategory] = {}\n valueGroups[stackCategory][category] = val\n })\n }\n\n\n console.log(\"test\", { groupData, categories, stackCategories, valueGroups, valueCounts })\n\n /**\n * Step 4. 计算百分比(针对百分比图)\n */\n const valuePercentages: Record<string, number> = {}\n const valueGroupPercentages: Record<string, Record<string, number>> = {}\n\n if (customData?.isGroup && customData?.groupField) {\n const totalPerCategory: Record<string, number> = {}\n\n Object.keys(valueGroups).forEach(stackCategory => {\n Object.entries(valueGroups[stackCategory]).forEach(([key, val]) => {\n totalPerCategory[key] = (totalPerCategory[key] || 0) + val\n })\n })\n\n Object.keys(valueGroups).forEach(stackCategory => {\n valueGroupPercentages[stackCategory] = {}\n Object.entries(valueGroups[stackCategory]).forEach(([key, val]) => {\n const total = totalPerCategory[key] || 1\n valueGroupPercentages[stackCategory][key] = (val / total) * 100\n })\n })\n } else {\n Object.entries(valueCounts).forEach(([key, val]) => {\n const total = val || 1\n valuePercentages[key] = (val / total) * 100\n })\n }\n\n /**\n * Step 5. 排序\n */\n let sortField = customData?.sortField ?? 'xAxis'\n let sortOrder = customData?.sortOrder ?? 'asc'\n\n const sortedChartData = [...chartData].sort((a, b) => {\n let valA, valB\n switch (sortField) {\n case 'xAxis':\n valA = getFieldVal({\n item: a,\n field: newXAxisField,\n timeGroupInterval: customData?.timeGroupInterval,\n })\n valB = getFieldVal({\n item: b,\n field: newXAxisField,\n timeGroupInterval: customData?.timeGroupInterval,\n })\n break\n case 'yAxisField':\n valA =\n customData.yAxis === 'recordTotal' ? a?.count : a[customData?.yAxisFieldType] || 0\n valB =\n customData.yAxis === 'recordTotal' ? b?.count : b[customData?.yAxisFieldType] || 0\n break\n default:\n break\n }\n\n const orderMultiplier = sortOrder === 'asc' ? 1 : -1\n if (valA > valB) return 1 * orderMultiplier\n if (valA < valB) return -1 * orderMultiplier\n return 0\n })\n\n // 更新排序后的 categories\n const sortedCategories = sortedChartData.map(item =>\n getFieldVal({\n item,\n field: newXAxisField,\n timeGroupInterval: customData?.timeGroupInterval,\n }) ?? 'Unknown'\n )\n categories.clear()\n sortedCategories.forEach(cat => categories.add(cat))\n\n /**\n * Step 6. Display Range 限制(TOP / BOTTOM)\n */\n if (\n !isTimeField(customData?.xAxis) &&\n customData.displayRange !== 'ALL' &&\n !!customData.displayRange\n ) {\n let sortedByCountCategories = Array.from(categories).sort((a, b) => {\n return valueCounts[b] - valueCounts[a]\n })\n\n let ableCategories: string[] = []\n let [pos, count] = customData.displayRange.split('_')\n if (pos === 'TOP') {\n ableCategories = sortedByCountCategories.slice(0, Number(count))\n } else {\n ableCategories = sortedByCountCategories.slice(-Number(count))\n }\n\n Array.from(categories).forEach(item => {\n if (!ableCategories.includes(item)) {\n categories.delete(item)\n }\n return item\n })\n }\n\n /**\n * Step 7. 生成 series、xAxis/yAxis、legend 等图表配置\n */\n const formatter: LabelFormatterCallback = data =>\n customData?.isGroup && customData?.groupField\n ? data?.value == 0\n ? ''\n : `${data?.value}`\n : `${data?.value}`\n\n const isStripBar = customData?.type?.includes('strip-bar') || customData?.type === 'chart-bar-graph'\n const label = {\n show: customData?.chartOptions?.includes('label'),\n position: isStripBar ? 'right' : 'top',\n formatter,\n }\n\n const labels = Array.from(categories)\n const stackLabels = Array.from(stackCategories)\n\n const series = []\n const chartConfig = getChartConfig({\n type: customData?.type as ChartType,\n categories: labels,\n }) as any\n\n const formatValue = (v: any) => (isNumber(v) ? Math.floor(v * 100) / 100 : v)\n\n // === 分组图表 ===\n if (customData?.isGroup && customData?.groupField) {\n stackLabels.forEach((stackCategory, idx) => {\n const data = ['chart-bar-percentage', 'chart-strip-bar-percentage'].includes(\n customData.type\n )\n ? labels.map(label => formatValue(valueGroupPercentages[stackCategory][label] || 0))\n : labels.map(label => formatValue(valueGroups[stackCategory][label] || 0))\n\n // 组合图(左右双轴处理)\n let type = customData.type\n let yAxisPos = 'left'\n if (type == ChartType['chartCombination']) {\n let matchCombinationChartConfig = (customData?.groupFieldConfig ?? []).find(\n item =>\n getFieldVal({\n item: {\n [newGroupField]: item?.value,\n },\n field: newGroupField,\n }) == stackCategory\n )\n type = matchCombinationChartConfig?.config?.chartType ?? ChartType['ChartBar']\n yAxisPos = matchCombinationChartConfig?.config?.yAxisPos ?? 'left'\n }\n\n let seriesItem = getSerie({\n type,\n data,\n label,\n name: stackCategory,\n isGroup: customData?.isGroup,\n groupField: customData?.groupField,\n labels,\n colorIndex: idx,\n })\n seriesItem.yAxisIndex = yAxisPos == 'left' ? 0 : 1\n series.push(seriesItem)\n })\n } else {\n // === 非分组图表 ===\n const data = ['chart-bar-percentage', 'chart-strip-bar-percentage'].includes(\n customData.type\n )\n ? labels.map(label => formatValue(valuePercentages[label]?.toFixed(2) || 0))\n : labels.map(label => formatValue(valueCounts[label] || 0))\n\n let type = customData.type\n let yAxisPos = 'left'\n if (type == ChartType['chartCombination']) {\n type = customData?.yAxisFieldConfig?.chartType ?? ChartType['ChartBar']\n } else {\n yAxisPos = customData?.yAxisFieldConfig?.yAxisPos ?? 'left'\n }\n\n let seriesItem = getSerie({\n type,\n data,\n label,\n name:\n customData.yAxis === 'recordTotal'\n ? t('pb.statisticsText')\n : getFieldLabel(customData?.yAxisField),\n isGroup: customData?.isGroup,\n groupField: customData?.groupField,\n labels,\n colorIndex: 0,\n })\n seriesItem.yAxisIndex = yAxisPos == 'left' ? 0 : 1\n series.push(seriesItem)\n }\n\n console.log(\"series\", series, customData)\n\n /**\n * Step 8. 生成 grid / legend / tooltip 等通用配置\n */\n const grids = getGrid({ series, chartConfig, width, customeStyle })\n const isShowLegend = customData?.chartOptions?.includes('legend')\n const isPieType = customData?.type === 'chart-pie' || customData?.type === 'chart-pie-circular'\n\n const isLeftYAxisShow = series.some(item => item?.yAxisIndex == 0)\n const isRightYAxisShow = series.some(item => item?.yAxisIndex == 1)\n\n const yAxisConfig = {\n ...chartConfig?.yAxis,\n axisTick: {\n show: customData?.chartOptions?.includes('axis'),\n lineStyle: { color: '#e5e6eb' },\n },\n axisLine: {\n show: customData?.chartOptions?.includes('axis'),\n lineStyle: { color: '#e5e6eb' },\n },\n axisLabel: {\n show: customData?.chartOptions?.includes('label'),\n color: '#86909C',\n fontSize: 12,\n formatter: (value: string) =>\n value.length > 15 ? `${value.slice(0, 15)}...` : value,\n hideOverlap: true,\n ...chartConfig?.yAxis?.axisLabel,\n },\n splitLine: {\n show: customData?.chartOptions?.includes('splitLine'),\n lineStyle: { color: '#f2f3f5', type: 'dashed' },\n },\n }\n\n /** ✅ 最终返回 ECharts 配置项 */\n const options: EChartsOption = {\n legend: {\n type: 'scroll',\n left: 'center',\n right: 'center',\n top: '0',\n show: isShowLegend,\n itemWidth: 16,\n itemHeight: 8,\n itemGap: 16,\n icon: 'roundRect',\n textStyle: { color: '#86909C', fontSize: 12 },\n data: series?.map((item: any) => item?.name || '') || [],\n },\n grid: grids,\n graphic: {\n elements: [\n {\n type: 'text',\n left: 'center',\n bottom: '10px',\n style: {\n text: customeStyle?.xtitle || '',\n fill: '#86909C',\n fontSize: 12,\n fontWeight: 'normal',\n },\n },\n {\n type: 'text',\n left: '10px',\n top: 'center',\n style: {\n text: customeStyle?.ytitle || '',\n fill: '#86909C',\n fontSize: 12,\n fontWeight: 'normal',\n },\n rotation: Math.PI / 2,\n },\n ],\n },\n xAxis: {\n ...chartConfig?.xAxis,\n axisTick: {\n show: customData?.chartOptions?.includes('axis'),\n lineStyle: { color: '#e5e6eb' },\n },\n axisLine: {\n show: customData?.chartOptions?.includes('axis'),\n lineStyle: { color: '#e5e6eb' },\n },\n axisLabel: {\n show: customData?.chartOptions?.includes('label'),\n rotate: grids.axisLabelRotate,\n interval: 'auto',\n color: '#86909C',\n fontSize: 12,\n formatter: (value: string) =>\n value.length > 15 ? `${value.slice(0, 15)}...` : value,\n ...(chartConfig?.xAxis?.axisLabel ?? {}),\n },\n splitLine: {\n show: customData?.chartOptions?.includes('splitLine'),\n lineStyle: { color: '#f2f3f5', type: 'dashed' },\n },\n },\n yAxis: [\n { show: isLeftYAxisShow, ...yAxisConfig },\n { show: isRightYAxisShow, ...yAxisConfig },\n ],\n series,\n tooltip: {\n trigger: isPieType ? 'item' : 'axis',\n enterable: isPieType,\n confine: !isPieType,\n axisPointer: { type: 'shadow' },\n backgroundColor: 'rgba(255, 255, 255, 0.96)',\n borderColor: 'transparent',\n borderRadius: 8,\n textStyle: { color: '#1d2129', fontSize: 13 },\n extraCssText: isPieType\n ? 'max-width:30vw; max-height:280px; overflow-y:auto; white-space:pre-wrap; word-break:break-all; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);'\n : 'max-width:30vw; white-space:pre-wrap; word-break:break-all; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);',\n appendTo: 'body',\n ...(isPieType\n ? {}\n : {\n formatter: (params: any) => {\n if (!Array.isArray(params)) return ''\n const title = `<div style=\"margin-bottom:6px;font-weight:500;color:#1d2129\">${params[0]?.axisValueLabel ?? ''}</div>`\n const items = params\n .map(\n (p: any) =>\n `<div style=\"display:flex;align-items:center;justify-content:space-between;gap:12px;line-height:22px\"><span style=\"display:inline-flex;align-items:center;gap:6px\"><span style=\"display:inline-block;width:8px;height:8px;border-radius:50%;background:${p.color?.colorStops?.[0]?.color ?? p.color}\"></span>${p.seriesName}</span><span style=\"font-weight:500\">${p.value}</span></div>`\n )\n .join('')\n return title + items\n },\n }),\n },\n animation: true,\n animationDuration: 600,\n animationEasing: 'cubicOut',\n }\n\n return options\n }\n\n return getChartOptions(chartData)\n } else {\n return null\n }\n }, [\n customData?.sortField,\n customData?.sortOrder,\n customData?.type,\n customData?.chartOptions,\n customData?.timeGroupInterval,\n customData?.groupFieldConfig,\n customData?.yAxisFieldConfig,\n customData?.displayRange,\n customeStyle,\n chartData,\n width,\n height,\n fieldOptions,\n ])\n\n\n /* ============================== split =============================== */\n const echartRef = useRef<any>()\n const containerRef = useRef<HTMLDivElement>(null)\n const size = useSize(containerRef)\n\n useEffect(() => {\n if (!!size) {\n echartRef?.current?.resize()\n }\n }, [size])\n\n const isLoading = loading\n const isEmpyt = !loading && !chartOptions\n const isOk = !isLoading && !!chartOptions\n return (\n <div style={{ width: '100%', height: '100%' }} ref={containerRef}>\n {isLoading && (\n <Spin\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n }}\n spinning={loading}\n />\n )}\n {isEmpyt && <Empty />}\n {isOk && <BaseChart echartRef={echartRef} options={chartOptions ?? {}} />}\n </div>\n )\n}\n\nexport default React.memo(ChartModule)\n"],"names":["matchGlobalFilterCondition","_a","chartData","label","_b","_c","BaseChart"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../packages/dashboard-workbench/components/module-content/chart-module/index.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { message, Spin } from 'antd'\nimport { useDebounceEffect, useMemoizedFn, useSize } from 'ahooks'\nimport { EChartsOption, LabelFormatterCallback } from 'echarts'\nimport { t } from 'i18next'\nimport { groupBy, isNumber } from 'lodash-es'\nimport {\n ChartCustomDataType,\n ChartCustomeStylesTypes,\n TimeGroupInterval,\n} from '@platox/pivot-table/components/add-module-modal/add-chart-modal/interface'\nimport { useAppContext } from '../../../context'\nimport { FieldItem, ModuleDataApi } from '../../../types'\nimport { getTransformValue } from '../../../utils'\nimport { ChartType } from '../../add-module-modal/add-chart-modal/interface'\nimport { ConditionBlock } from '../../add-module-modal/components/condition-modal/interface'\nimport { mapConditionsToPostgrest } from '../utils'\nimport BaseChart from './base-chart'\nimport Empty from './Empty'\nimport { getChartConfig, getGrid, getSerie } from './utils'\n\n/** Max visible categories before enabling container scroll for strip bar charts */\nconst STRIP_BAR_SCROLL_THRESHOLD = 15\n/** Approximate height per bar in px */\nconst BAR_HEIGHT = 28\n/** Extra vertical padding (axis labels, grid margins, etc.) */\nconst CHART_PADDING = 80\n\ninterface ChartModuleProps {\n customData?: ChartCustomDataType\n customeStyle?: ChartCustomeStylesTypes\n onChange?: (val: unknown) => void\n moduleDataApi?: ModuleDataApi\n width?: number\n height?: number\n}\n\nconst ChartModule: React.FC<ChartModuleProps> = ({\n moduleDataApi,\n customData,\n customeStyle,\n width = 2,\n height = 2,\n}) => {\n const { globalData, globalFilterCondition } = useAppContext()\n\n /* ============================== split =============================== */\n let matchGlobalFilterCondition = useMemo(() => {\n let matchGlobalFilterCondition = globalFilterCondition?.find(\n item => item?.dataSourceId === customData?.dataSourceId\n )\n return matchGlobalFilterCondition\n }, [globalFilterCondition, customData?.dataSourceId])\n\n const [chartData, setChartData] = useState<any>()\n const [loading, setloading] = useState<any>()\n\n const fetchChartData = useMemoizedFn(async () => {\n setChartData([])\n if (customData) {\n // 调用方法\n setloading(true)\n let queryString = ''\n const newXAxisField = customData?.xAxis === 'tags' ? 'tag' : customData?.xAxis\n const newGroupField = customData?.groupField === 'tags' ? 'tag' : customData?.groupField\n\n if (!customData.isGroup) {\n if (customData.yAxis === 'recordTotal') {\n queryString += `select=${newXAxisField},id.count()`\n }\n\n if (customData.yAxis === 'fieldValue' && customData?.yAxisField) {\n queryString += `select=${newXAxisField},${customData?.yAxisField}.${customData?.yAxisFieldType}()`\n }\n } else {\n if (customData.yAxis === 'recordTotal') {\n queryString += `select=${newXAxisField},${newGroupField},id.count()`\n }\n if (customData.yAxis === 'fieldValue' && customData?.yAxisField) {\n queryString += `select=${newXAxisField},${newGroupField},${customData?.yAxisField}.${customData?.yAxisFieldType}()`\n }\n }\n\n // 筛选\n let conditionBlockList = []\n if ((matchGlobalFilterCondition?.conditionList?.length ?? 0) > 0) {\n conditionBlockList.push(matchGlobalFilterCondition)\n }\n if ((customData?.conditionData?.conditionList?.length ?? 0) > 0) {\n conditionBlockList.push(customData?.conditionData)\n }\n if (conditionBlockList.length > 0) {\n let DSLStr = mapConditionsToPostgrest(conditionBlockList as ConditionBlock[])\n queryString += !!DSLStr ? `&${DSLStr}` : ''\n }\n\n if (customData?.dataSourceId) {\n moduleDataApi?.({\n id: customData?.dataSourceId,\n query: queryString,\n })\n .then((res: any) => {\n if (!res.success) {\n message.error(res.message)\n return\n }\n\n setChartData(res.data)\n })\n .finally(() => {\n setloading(false)\n })\n }\n } else {\n setChartData([])\n }\n })\n\n useDebounceEffect(\n () => {\n if (customData) {\n fetchChartData()\n }\n },\n [\n customData?.dataSourceId,\n customData?.conditionData,\n customData?.sortField,\n customData?.sortOrder,\n customData?.xAxis,\n customData?.yAxis,\n customData?.yAxisField,\n customData?.yAxisFieldType,\n customData?.isGroup,\n customData?.groupField,\n matchGlobalFilterCondition,\n ],\n { wait: 60 }\n )\n\n /* ============================== split =============================== */\n const fieldOptions = useMemo(() => {\n let ret = globalData?.sourceData?.find(item => item.value === customData?.dataSourceId)?.fields\n return ret\n }, [globalData, customData?.dataSourceId])\n\n /**\n * @description: 根据 customData 和 chartData 动态生成 ECharts 配置项\n * 主要逻辑:\n * 1. 根据字段配置和分组字段构造数据;\n * 2. 支持分组、百分比、排序、显示范围;\n * 3. 根据自定义配置生成 series、legend、xAxis/yAxis、grid、tooltip 等。\n */\n const chartOptions = useMemo(() => {\n if (customData && chartData && customData.type && chartData.length > 0) {\n /**\n * 根据 chartData 生成完整的 ECharts 配置\n */\n const getChartOptions = (_chartData: any) => {\n /**\n * @description 获取字段值(带字段映射与时间分组转换)\n */\n const getFieldVal = ({\n item,\n field,\n timeGroupInterval,\n }: {\n item: any\n field: any\n timeGroupInterval?: TimeGroupInterval\n }) => {\n return getTransformValue({\n fieldOptions,\n val: item[field],\n field: field,\n fieldMap: globalData?.fieldMap,\n timeGroupInterval,\n showNill: false,\n })\n }\n\n /** 获取字段对应的标签名(label) */\n const getFieldLabel = (field: string) => {\n const fieldData = fieldOptions?.find(item => item.value === field)\n return fieldData?.label\n }\n\n /** 判断是否为时间类型字段 */\n const isTimeField = (fieldName: string) => {\n return fieldOptions?.find(item => item.value === fieldName)?.type === 'timestamp'\n }\n\n // 后端字段映射修正\n const mapping = { tags: 'tag' }\n\n const newXAxisField =\n mapping[customData?.xAxis as keyof typeof mapping] ?? customData?.xAxis\n const newGroupField =\n mapping[customData?.groupField as keyof typeof mapping] ?? customData?.groupField\n\n console.log(\"newGroupField\", newGroupField)\n\n /**\n * Step 1. 分组整理数据(以 xAxis 为主键)\n */\n let groupData = groupBy(_chartData, item => {\n const category = getFieldVal({\n item,\n field: newXAxisField,\n timeGroupInterval: customData?.timeGroupInterval,\n })\n return category ?? 'Unknown'\n })\n\n /** 合并同名分组数据 */\n let chartData = Object.keys(groupData).map(key => {\n let groupList = groupData[key]\n let mergeObj = groupList.reduce((acc, item) => {\n Object.keys(item).forEach(k => {\n let value = item[k]\n if (isNumber(value)) {\n acc[k] = acc?.[k] ? acc[k] + value : value\n } else {\n acc[k] = value\n }\n })\n return acc\n }, {})\n return mergeObj\n })\n\n /**\n * Step 2. 初始化容器\n */\n const categories = new Set<string>() // x 轴标签集合\n const stackCategories = new Set<string>() // 分组类别\n const valueGroups: Record<string, Record<string, number>> = {} // 分组下的值\n const valueCounts: Record<string, number> = {} // 无分组的值\n\n /**\n * Step 3. 提取每一项的数据\n */\n chartData.forEach((item: any) => {\n const category = getFieldVal({\n item,\n field: newXAxisField,\n timeGroupInterval: customData?.timeGroupInterval,\n }) ?? 'Unknown'\n const val =\n customData.yAxis === 'recordTotal' ? item?.count : item[customData?.yAxisFieldType] || 0\n\n valueCounts[category] = val\n\n // 分组数据处理\n // if (customData?.isGroup && customData?.groupField) {\n // const stackCategory = getFieldVal({\n // item,\n // field: newGroupField,\n // })\n // const key = category ?? 'Unknown'\n // stackCategories.add(stackCategory)\n // if (!valueGroups[stackCategory]) valueGroups[stackCategory] = {}\n // valueGroups[stackCategory][key] = val\n // }\n })\n // 修bug先不影响其他的\n // https://applink.larksuite.com/client/todo/detail?guid=f7ad264e-bbea-4978-b908-c97ff55bb230&suite_entity_num=t107825\n if (customData?.isGroup && customData?.groupField) {\n _chartData.forEach((item: any) => {\n const category = getFieldVal({\n item,\n field: newXAxisField,\n timeGroupInterval: customData?.timeGroupInterval,\n }) ?? 'Unknown'\n const val =\n customData.yAxis === 'recordTotal' ? item?.count : item[customData?.yAxisFieldType] || 0\n\n const stackCategory = getFieldVal({\n item,\n field: newGroupField,\n }) ?? 'Unknown'\n stackCategories.add(stackCategory)\n if (!valueGroups[stackCategory]) valueGroups[stackCategory] = {}\n valueGroups[stackCategory][category] = val\n })\n }\n\n\n console.log(\"test\", { groupData, categories, stackCategories, valueGroups, valueCounts })\n\n /**\n * Step 4. 计算百分比(针对百分比图)\n */\n const valuePercentages: Record<string, number> = {}\n const valueGroupPercentages: Record<string, Record<string, number>> = {}\n\n if (customData?.isGroup && customData?.groupField) {\n const totalPerCategory: Record<string, number> = {}\n\n Object.keys(valueGroups).forEach(stackCategory => {\n Object.entries(valueGroups[stackCategory]).forEach(([key, val]) => {\n totalPerCategory[key] = (totalPerCategory[key] || 0) + val\n })\n })\n\n Object.keys(valueGroups).forEach(stackCategory => {\n valueGroupPercentages[stackCategory] = {}\n Object.entries(valueGroups[stackCategory]).forEach(([key, val]) => {\n const total = totalPerCategory[key] || 1\n valueGroupPercentages[stackCategory][key] = (val / total) * 100\n })\n })\n } else {\n Object.entries(valueCounts).forEach(([key, val]) => {\n const total = val || 1\n valuePercentages[key] = (val / total) * 100\n })\n }\n\n /**\n * Step 5. 排序\n */\n let sortField = customData?.sortField ?? 'xAxis'\n let sortOrder = customData?.sortOrder ?? 'asc'\n\n const sortedChartData = [...chartData].sort((a, b) => {\n let valA, valB\n switch (sortField) {\n case 'xAxis':\n valA = getFieldVal({\n item: a,\n field: newXAxisField,\n timeGroupInterval: customData?.timeGroupInterval,\n })\n valB = getFieldVal({\n item: b,\n field: newXAxisField,\n timeGroupInterval: customData?.timeGroupInterval,\n })\n break\n case 'yAxisField':\n valA =\n customData.yAxis === 'recordTotal' ? a?.count : a[customData?.yAxisFieldType] || 0\n valB =\n customData.yAxis === 'recordTotal' ? b?.count : b[customData?.yAxisFieldType] || 0\n break\n default:\n break\n }\n\n const orderMultiplier = sortOrder === 'asc' ? 1 : -1\n if (valA > valB) return 1 * orderMultiplier\n if (valA < valB) return -1 * orderMultiplier\n return 0\n })\n\n // 更新排序后的 categories\n const sortedCategories = sortedChartData.map(item =>\n getFieldVal({\n item,\n field: newXAxisField,\n timeGroupInterval: customData?.timeGroupInterval,\n }) ?? 'Unknown'\n )\n categories.clear()\n sortedCategories.forEach(cat => categories.add(cat))\n\n /**\n * Step 6. Display Range 限制(TOP / BOTTOM)\n */\n if (\n !isTimeField(customData?.xAxis) &&\n customData.displayRange !== 'ALL' &&\n !!customData.displayRange\n ) {\n let sortedByCountCategories = Array.from(categories).sort((a, b) => {\n return valueCounts[b] - valueCounts[a]\n })\n\n let ableCategories: string[] = []\n let [pos, count] = customData.displayRange.split('_')\n if (pos === 'TOP') {\n ableCategories = sortedByCountCategories.slice(0, Number(count))\n } else {\n ableCategories = sortedByCountCategories.slice(-Number(count))\n }\n\n Array.from(categories).forEach(item => {\n if (!ableCategories.includes(item)) {\n categories.delete(item)\n }\n return item\n })\n }\n\n /**\n * Step 7. 生成 series、xAxis/yAxis、legend 等图表配置\n */\n const formatter: LabelFormatterCallback = data =>\n customData?.isGroup && customData?.groupField\n ? data?.value == 0\n ? ''\n : `${data?.value}`\n : `${data?.value}`\n\n const isStripBar = customData?.type?.includes('strip-bar') || customData?.type === 'chart-bar-graph'\n const label = {\n show: customData?.chartOptions?.includes('label'),\n position: isStripBar ? 'right' : 'top',\n formatter,\n }\n\n const labels = Array.from(categories)\n const stackLabels = Array.from(stackCategories)\n\n const series = []\n const chartConfig = getChartConfig({\n type: customData?.type as ChartType,\n categories: labels,\n }) as any\n\n const formatValue = (v: any) => (isNumber(v) ? Math.floor(v * 100) / 100 : v)\n\n // === 分组图表 ===\n if (customData?.isGroup && customData?.groupField) {\n stackLabels.forEach((stackCategory, idx) => {\n const data = ['chart-bar-percentage', 'chart-strip-bar-percentage'].includes(\n customData.type\n )\n ? labels.map(label => formatValue(valueGroupPercentages[stackCategory][label] || 0))\n : labels.map(label => formatValue(valueGroups[stackCategory][label] || 0))\n\n // 组合图(左右双轴处理)\n let type = customData.type\n let yAxisPos = 'left'\n if (type == ChartType['chartCombination']) {\n let matchCombinationChartConfig = (customData?.groupFieldConfig ?? []).find(\n item =>\n getFieldVal({\n item: {\n [newGroupField]: item?.value,\n },\n field: newGroupField,\n }) == stackCategory\n )\n type = matchCombinationChartConfig?.config?.chartType ?? ChartType['ChartBar']\n yAxisPos = matchCombinationChartConfig?.config?.yAxisPos ?? 'left'\n }\n\n let seriesItem = getSerie({\n type,\n data,\n label,\n name: stackCategory,\n isGroup: customData?.isGroup,\n groupField: customData?.groupField,\n labels,\n colorIndex: idx,\n })\n seriesItem.yAxisIndex = yAxisPos == 'left' ? 0 : 1\n series.push(seriesItem)\n })\n } else {\n // === 非分组图表 ===\n const data = ['chart-bar-percentage', 'chart-strip-bar-percentage'].includes(\n customData.type\n )\n ? labels.map(label => formatValue(valuePercentages[label]?.toFixed(2) || 0))\n : labels.map(label => formatValue(valueCounts[label] || 0))\n\n let type = customData.type\n let yAxisPos = 'left'\n if (type == ChartType['chartCombination']) {\n type = customData?.yAxisFieldConfig?.chartType ?? ChartType['ChartBar']\n } else {\n yAxisPos = customData?.yAxisFieldConfig?.yAxisPos ?? 'left'\n }\n\n let seriesItem = getSerie({\n type,\n data,\n label,\n name:\n customData.yAxis === 'recordTotal'\n ? t('pb.statisticsText')\n : getFieldLabel(customData?.yAxisField),\n isGroup: customData?.isGroup,\n groupField: customData?.groupField,\n labels,\n colorIndex: 0,\n })\n seriesItem.yAxisIndex = yAxisPos == 'left' ? 0 : 1\n series.push(seriesItem)\n }\n\n console.log(\"series\", series, customData)\n\n /**\n * Step 8. 生成 grid / legend / tooltip 等通用配置\n */\n const grids = getGrid({ series, chartConfig, width, customeStyle })\n const isShowLegend = customData?.chartOptions?.includes('legend')\n const isPieType = customData?.type === 'chart-pie' || customData?.type === 'chart-pie-circular'\n\n const isLeftYAxisShow = series.some(item => item?.yAxisIndex == 0)\n const isRightYAxisShow = series.some(item => item?.yAxisIndex == 1)\n\n const yAxisConfig = {\n ...chartConfig?.yAxis,\n axisTick: {\n show: customData?.chartOptions?.includes('axis'),\n lineStyle: { color: '#e5e6eb' },\n },\n axisLine: {\n show: customData?.chartOptions?.includes('axis'),\n lineStyle: { color: '#e5e6eb' },\n },\n axisLabel: {\n show: customData?.chartOptions?.includes('label'),\n color: '#86909C',\n fontSize: 12,\n formatter: (value: string) =>\n value.length > 15 ? `${value.slice(0, 15)}...` : value,\n hideOverlap: true,\n ...chartConfig?.yAxis?.axisLabel,\n },\n splitLine: {\n show: customData?.chartOptions?.includes('splitLine'),\n lineStyle: { color: '#f2f3f5', type: 'dashed' },\n },\n }\n\n /** ✅ 最终返回 ECharts 配置项 */\n const options: EChartsOption = {\n legend: {\n type: 'scroll',\n left: 'center',\n right: 'center',\n top: '0',\n show: isShowLegend,\n itemWidth: 16,\n itemHeight: 8,\n itemGap: 16,\n icon: 'roundRect',\n textStyle: { color: '#86909C', fontSize: 12 },\n data: series?.map((item: any) => item?.name || '') || [],\n },\n grid: grids,\n graphic: {\n elements: [\n {\n type: 'text',\n left: 'center',\n bottom: '10px',\n style: {\n text: customeStyle?.xtitle || '',\n fill: '#86909C',\n fontSize: 12,\n fontWeight: 'normal',\n },\n },\n {\n type: 'text',\n left: '10px',\n top: 'center',\n style: {\n text: customeStyle?.ytitle || '',\n fill: '#86909C',\n fontSize: 12,\n fontWeight: 'normal',\n },\n rotation: Math.PI / 2,\n },\n ],\n },\n xAxis: {\n ...chartConfig?.xAxis,\n axisTick: {\n show: customData?.chartOptions?.includes('axis'),\n lineStyle: { color: '#e5e6eb' },\n },\n axisLine: {\n show: customData?.chartOptions?.includes('axis'),\n lineStyle: { color: '#e5e6eb' },\n },\n axisLabel: {\n show: customData?.chartOptions?.includes('label'),\n rotate: grids.axisLabelRotate,\n interval: 'auto',\n color: '#86909C',\n fontSize: 12,\n formatter: (value: string) =>\n value.length > 15 ? `${value.slice(0, 15)}...` : value,\n ...(chartConfig?.xAxis?.axisLabel ?? {}),\n },\n splitLine: {\n show: customData?.chartOptions?.includes('splitLine'),\n lineStyle: { color: '#f2f3f5', type: 'dashed' },\n },\n },\n yAxis: [\n { show: isLeftYAxisShow, ...yAxisConfig },\n { show: isRightYAxisShow, ...yAxisConfig },\n ],\n series,\n tooltip: {\n trigger: isPieType ? 'item' : 'axis',\n enterable: isPieType,\n confine: !isPieType,\n axisPointer: { type: 'shadow' },\n backgroundColor: 'rgba(255, 255, 255, 0.96)',\n borderColor: 'transparent',\n borderRadius: 8,\n textStyle: { color: '#1d2129', fontSize: 13 },\n extraCssText: isPieType\n ? 'max-width:30vw; max-height:280px; overflow-y:auto; white-space:pre-wrap; word-break:break-all; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);'\n : 'max-width:30vw; white-space:pre-wrap; word-break:break-all; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);',\n appendTo: 'body',\n ...(isPieType\n ? {}\n : {\n formatter: (params: any) => {\n if (!Array.isArray(params)) return ''\n const title = `<div style=\"margin-bottom:6px;font-weight:500;color:#1d2129\">${params[0]?.axisValueLabel ?? ''}</div>`\n const items = params\n .map(\n (p: any) =>\n `<div style=\"display:flex;align-items:center;justify-content:space-between;gap:12px;line-height:22px\"><span style=\"display:inline-flex;align-items:center;gap:6px\"><span style=\"display:inline-block;width:8px;height:8px;border-radius:50%;background:${p.color?.colorStops?.[0]?.color ?? p.color}\"></span>${p.seriesName}</span><span style=\"font-weight:500\">${p.value}</span></div>`\n )\n .join('')\n return title + items\n },\n }),\n },\n animation: true,\n animationDuration: 600,\n animationEasing: 'cubicOut',\n }\n\n\n return options\n }\n\n return getChartOptions(chartData)\n } else {\n return null\n }\n }, [\n customData?.sortField,\n customData?.sortOrder,\n customData?.type,\n customData?.chartOptions,\n customData?.timeGroupInterval,\n customData?.groupFieldConfig,\n customData?.yAxisFieldConfig,\n customData?.displayRange,\n customeStyle,\n chartData,\n width,\n height,\n fieldOptions,\n ])\n\n\n /* ============================== split =============================== */\n const echartRef = useRef<any>()\n const containerRef = useRef<HTMLDivElement>(null)\n const size = useSize(containerRef)\n\n useEffect(() => {\n if (!!size) {\n // Use setTimeout to ensure the DOM has updated (e.g. after scroll container renders)\n setTimeout(() => echartRef?.current?.resize(), 0)\n }\n }, [size])\n\n const isStripBarType = customData?.type?.includes('strip-bar') || customData?.type === 'chart-bar-graph'\n const stripBarCategoryCount = useMemo(() => {\n if (!isStripBarType || !chartOptions) return 0\n const yAxis = (chartOptions as any)?.yAxis\n const yAxisConfig = Array.isArray(yAxis) ? yAxis[0] : yAxis\n if (yAxisConfig?.type === 'category' && Array.isArray(yAxisConfig?.data)) {\n return yAxisConfig.data.length\n }\n return 0\n }, [isStripBarType, chartOptions])\n\n const needsContainerScroll = isStripBarType && stripBarCategoryCount > STRIP_BAR_SCROLL_THRESHOLD\n const chartInnerHeight = needsContainerScroll\n ? stripBarCategoryCount * BAR_HEIGHT + CHART_PADDING\n : undefined\n\n const isLoading = loading\n const isEmpyt = !loading && !chartOptions\n const isOk = !isLoading && !!chartOptions\n return (\n <div style={{ width: '100%', height: '100%' }} ref={containerRef}>\n {isLoading && (\n <Spin\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n }}\n spinning={loading}\n />\n )}\n {isEmpyt && <Empty />}\n {isOk && needsContainerScroll ? (\n <div className=\"chart-scroll-container\" style={{ width: '100%', height: '100%', overflowY: 'auto', overflowX: 'hidden' }}>\n <div style={{ width: '100%', height: chartInnerHeight }}>\n <BaseChart echartRef={echartRef} options={chartOptions ?? {}} />\n </div>\n </div>\n ) : isOk ? (\n <BaseChart echartRef={echartRef} options={chartOptions ?? {}} />\n ) : null}\n </div>\n )\n}\n\nexport default React.memo(ChartModule)\n"],"names":["matchGlobalFilterCondition","_a","chartData","label","_b","_c","BaseChart"],"mappings":"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"}