@platox/pivot-table 0.0.97 → 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
|
|
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 ((((
|
|
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
|
|
105
|
-
let ret = (_b = (
|
|
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
|
|
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
|
|
132
|
-
return ((
|
|
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 = ((
|
|
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
|
|
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 = ((
|
|
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
|
|
321
|
-
return formatValue(((
|
|
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";
|
|
@@ -443,23 +447,23 @@ const ChartModule = ({
|
|
|
443
447
|
tooltip: {
|
|
444
448
|
trigger: isPieType ? "item" : "axis",
|
|
445
449
|
enterable: isPieType,
|
|
446
|
-
confine:
|
|
450
|
+
confine: !isPieType,
|
|
447
451
|
axisPointer: { type: "shadow" },
|
|
448
452
|
backgroundColor: "rgba(255, 255, 255, 0.96)",
|
|
449
453
|
borderColor: "transparent",
|
|
450
454
|
borderRadius: 8,
|
|
451
455
|
textStyle: { color: "#1d2129", fontSize: 13 },
|
|
452
|
-
extraCssText: "max-width:30vw; white-space:pre-wrap; word-break:break-all; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);",
|
|
456
|
+
extraCssText: isPieType ? "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);" : "max-width:30vw; white-space:pre-wrap; word-break:break-all; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);",
|
|
453
457
|
appendTo: "body",
|
|
454
458
|
...isPieType ? {} : {
|
|
455
459
|
formatter: (params) => {
|
|
456
|
-
var
|
|
460
|
+
var _a3;
|
|
457
461
|
if (!Array.isArray(params)) return "";
|
|
458
|
-
const title = `<div style="margin-bottom:6px;font-weight:500;color:#1d2129">${((
|
|
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
|
|
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 = (
|
|
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
|
-
(
|
|
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: true,\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:\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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"}
|